@operato/data-grist 10.29.5 โ 10.29.7
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/CHANGELOG.md +18 -0
- package/coverage/lcov-report/index.html +40 -40
- package/coverage/lcov-report/webpack/bootstrap.html +1 -1
- package/coverage/lcov-report/webpack/index.html +1 -1
- package/coverage/lcov-report/webpack/runtime/define property getters.html +1 -1
- package/coverage/lcov-report/webpack/runtime/global.html +1 -1
- package/coverage/lcov-report/webpack/runtime/hasOwnProperty shorthand.html +1 -1
- package/coverage/lcov-report/webpack/runtime/index.html +1 -1
- package/coverage/lcov-report/webpack/runtime/make namespace object.html +1 -1
- package/coverage/lcov.info +30482 -30377
- package/dist/src/data-card/data-card-field.js +3 -0
- package/dist/src/data-card/data-card-field.js.map +1 -1
- package/dist/src/data-grid/data-grid-accum-field.js +4 -0
- package/dist/src/data-grid/data-grid-accum-field.js.map +1 -1
- package/dist/src/data-grid/data-grid-body-style.js +2 -10
- package/dist/src/data-grid/data-grid-body-style.js.map +1 -1
- package/dist/src/data-grid/data-grid-body.d.ts +1 -0
- package/dist/src/data-grid/data-grid-body.js +20 -9
- package/dist/src/data-grid/data-grid-body.js.map +1 -1
- package/dist/src/data-grid/data-grid-field.d.ts +1 -0
- package/dist/src/data-grid/data-grid-field.js +29 -1
- package/dist/src/data-grid/data-grid-field.js.map +1 -1
- package/dist/src/data-grid/data-grid-header.js +5 -10
- package/dist/src/data-grid/data-grid-header.js.map +1 -1
- package/dist/src/data-grid/data-grid.d.ts +2 -1
- package/dist/src/data-grid/data-grid.js +72 -20
- package/dist/src/data-grid/data-grid.js.map +1 -1
- package/dist/test/accessible-name.test.js +6 -4
- package/dist/test/accessible-name.test.js.map +1 -1
- package/dist/test/field-contains-content.test.d.ts +1 -0
- package/dist/test/field-contains-content.test.js +101 -0
- package/dist/test/field-contains-content.test.js.map +1 -0
- package/dist/test/grid-single-scroller.test.d.ts +1 -0
- package/dist/test/grid-single-scroller.test.js +107 -0
- package/dist/test/grid-single-scroller.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/test/accessible-name.test.ts +6 -4
- package/test/field-contains-content.test.ts +125 -0
- package/test/grid-single-scroller.test.ts +150 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-grid-body.js","sourceRoot":"","sources":["../../../src/data-grid/data-grid-body.ts"],"names":[],"mappings":"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","sourcesContent":["import './data-grid-field.js'\nimport './data-grid-accum-field.js'\n\nimport { css, html, LitElement, nothing, PropertyValues } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { ifDefined } from 'lit/directives/if-defined.js'\nimport debounce from 'lodash-es/debounce.js'\nimport isEmpty from 'lodash-es/isEmpty.js'\n\nimport { i18next } from '@operato/i18n'\nimport { sleep, parseToNumberOrNull, closestElement } from '@operato/utils'\n\nimport { ZERO_CONFIG, ZERO_DATA } from '../configure/zero-config.js'\nimport { RecordViewHandler } from '../record-view/record-view-handler.js'\nimport { ColumnConfig, GristConfig, GristData, GristRecord } from '../types.js'\nimport { columnText } from '../utils/column-text.js'\n// import { supportsPassive } from '../utils/index.js'\nimport { dataGridBodyStyle } from './data-grid-body-style.js'\nimport { DataGridField } from './data-grid-field.js'\nimport { dataGridBodyClickHandler } from './event-handlers/data-grid-body-click-handler.js'\nimport { dataGridBodyDblclickHandler } from './event-handlers/data-grid-body-dblclick-handler.js'\nimport { dataGridBodyFocusChangeHandler } from './event-handlers/data-grid-body-focus-change-handler.js'\nimport { dataGridBodyContextMenuHandler } from './event-handlers/data-grid-body-contextmenu-handler.js'\nimport { dataGridBodyKeydownHandler } from './event-handlers/data-grid-body-keydown-handler.js'\nimport { accumulate } from '../accumulator/accumulator.js'\n\nconst THRESHOLD = 300\nconst DATA_PADDING = 3\nconst ROW_HEIGHT = 40\nconst GAP_SIZE = 1\n\nfunction calcScrollPos(parent: DataGridBody, child: Element) {\n /* getBoundingClientRect๋ safari์์ ์คํฌ๋กค ์ํ์์ ๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ์๋ ๋ค๋ฅธ ๊ฐ์ ๋ฆฌํดํจ - ์ฌํ๋ฆฌ๋ ์ฝ๊ฐ ์ด์ ์๋ํจ. */\n var { top: ct, left: cl, right: cr, bottom: cb } = child.getBoundingClientRect()\n var { top: pt, left: pl, right: pr, bottom: pb } = parent.getBoundingClientRect()\n var { scrollLeft, scrollTop } = parent\n var scrollbarWidth = parent.clientWidth - parent.offsetWidth\n var scrollbarHeight = parent.clientHeight - parent.offsetHeight\n\n return {\n left: cl < pl ? scrollLeft - (pl - cl) : cr > pr ? scrollLeft - (pr - cr) - scrollbarWidth : undefined,\n top: ct < pt ? scrollTop - (pt - ct) : cb > pb ? scrollTop - (pb - cb) - scrollbarHeight : undefined\n }\n}\n\n/* select ํ์
๋ถ์ฌ๋ฃ๊ธฐ: display ๋๋ value ํ
์คํธ์ ๋งค์นญ๋๋ ์ต์
์ value๋ฅผ ๋ฐํ */\nfunction resolveSelectPasteValue(text: string, column: ColumnConfig, record: GristRecord): any {\n const rowOptionField = record[column.record?.rowOptionField || '']\n let { options = [] } = rowOptionField ? rowOptionField : column.record || {}\n\n /* options๊ฐ ํจ์์ธ ๊ฒฝ์ฐ ํธ์ถํ์ฌ ๋ฐฐ์ด์ ๊ฐ์ ธ์ด (arrow function์ด๋ฏ๋ก this๋ ์ ์ ์์ ์ ๋ฐ์ธ๋ฉ๋จ) */\n if (typeof options === 'function') {\n try {\n options = (options as Function)()\n } catch (e) {\n return undefined\n }\n }\n\n if (!Array.isArray(options)) {\n return undefined\n }\n\n const trimmed = String(text).trim()\n if (!trimmed) return undefined\n\n for (const opt of options) {\n if (typeof opt === 'string') {\n if (opt.trim() === trimmed) return opt\n } else if (opt && typeof opt === 'object') {\n const display = String((opt as any).display || (opt as any).name || '').trim()\n const val = String((opt as any).value ?? '').trim()\n if (display === trimmed || val === trimmed) return (opt as any).value\n }\n }\n\n return undefined\n}\n\nconst ZERO_FOCUS = {\n row: 0,\n column: 0\n}\n\n@customElement('ox-grid-body')\nexport class DataGridBody extends LitElement {\n debounce = debounce((scrollTop: number, clientHeight: number) => {\n const maxVisibleRows = Math.ceil(clientHeight / (ROW_HEIGHT + GAP_SIZE))\n const from = Math.max(0, Math.floor(scrollTop / (ROW_HEIGHT + GAP_SIZE)) - maxVisibleRows * DATA_PADDING)\n const to = Math.min(this.data.records?.length || 0, from + maxVisibleRows * (DATA_PADDING * 2 + 1))\n\n this.from = from\n this.to = to\n }, THRESHOLD)\n\n static styles = [\n dataGridBodyStyle,\n css`\n :host {\n font-variation-settings: 'FILL' 1;\n\n overscroll-behavior: none;\n user-select: none;\n }\n\n /*\n * ๋ณต์ฌ ๋ฒ์ ์์ โ ๋๋๊ทธ๋ก ์ก์ ๊ตฌ๊ฐ์ ๋๋ฅด๋ ์์.\n *\n * ์ ์๋ ์
์ด์ ํ์๊ณผ **๊ฐ์ ํ ํฐ**์ ์ผ๋ค. ๊ทธ๋์ ์กฐํ ์ ์ฉ ํ์์ ์
์ ์ ์ ์์ ๋ ค๊ณ ๊ทธ\n * ํ ํฐ์ none ์ผ๋ก ๋์์ ๋, **๋ฒ์๋ฅผ ์ก์๋ ์์๊ฐ ์ ๋ณด์๋ค** โ ํ์์ด ์๋๋ผ ๊ธฐ๋ฅ์ด ์ง์์ง\n * ๊ฒ์ด๋ค. ๋ฒ์๋ฅผ ์ก์๋ค๋ ๊ฒ์ ์๋ฆด ์ ์ผํ ํ์์๋ค.\n *\n * ๊ทธ๋์ ์๊ธฐ ํ ํฐ์ ์ค๋ค. ์ด๊ฒ์ ์กฐํ ํ์์๋ ์์ด์ผ ํ๋ค โ ๊ฐ์ ๋ณต์ฌํ๋ ์ผ์ ๊ณ ์น๋ ์ผ์ด\n * ์๋๋ค.\n */\n [select-block] {\n position: absolute;\n left: var(--select-box-left);\n top: var(--select-box-top);\n width: var(--select-box-width);\n height: var(--select-box-height);\n border: var(--grid-select-block-border, 1px solid var(--ui-accent, #00727e));\n background-image: var(--focused-background-image);\n pointer-events: none;\n\n z-index: 5;\n }\n\n [fixed] {\n position: sticky;\n background-color: var(--grid-record-background-color);\n z-index: 2; /* ๊ณ ์ ๋ ์ด์ ๋ค๋ฅธ ์ด ์์ ํ์. */\n }\n\n /*\n * โโ ๊ณ ์ ์ด์ ๋ถํฌ๋ช
์ **๋ค์ ์ธต์ ๊น์์ ์งํฌ ์ ์๋ค** โโโโโโโโโโโโโโ\n *\n * ์ด ์นธ์ ์คํฌ๋กค๋๋ ์ด ์์ ๋ ์์ด์(position: sticky) ํฌ๋ช
ํด์ง๋ฉด ๊ทธ ์๋๊ฐ ๋น์น๋ค.\n * ๊ทธ๋์ ํ๋ ์ฌ๊ธฐ์ ์ด๋ฐ ๊ฒ์ ๋์๋ค.\n *\n * [fixed]::before { position:absolute; inset:0; background-color: โฆ; z-index:-1 }\n *\n * **์ ๋๋ค.** ์์ z-index ์์์ ์๊ธฐ ์์์ **๋ฐฐ๊ฒฝ ์์** ๊ทธ๋ ค์ง๋ค(์นธ์ ๊ธ์ ์๋์ผ\n * ๋ฟ์ด๋ค). ๊ทธ๋์ ๊ทธ ์ธต์ด ์ค ์ํ์ ์์ ๋ฎ์๊ณ , ๋ง์ฐ์ค๋ฅผ ์ฌ๋ฆฐ ์ค์ ๋ ๊ฐ ๊ณ ์ ์ด์์๋ง\n * ์ฌ๋ผ์ก๋ค. ๊ทธ๋ ๋๋ ๊ณ์ฐ๋ background-color ๋ฅผ ์ฌ๊ณ ใ๊ฐ์ ์์ด๋คใ๋ผ๊ณ ํ๋๋ฐ, ์ฌ์ผ\n * ํ๋ ๊ฒ์ **์น ํด์ง ๊ฒ**์ด์๋ค.\n *\n * ๋ถํฌ๋ช
์ ๋ค๋ฅธ ๋ฐ์ ์งํจ๋ค โ **์ค ์ํ ์์ transparent ๋ก ๋์ง ์๋ ๊ฒ**์ด๋ค. ๊ทธ ๊ฐ์\n * ใ์น ํ์ง ์๋๋คใ๊ฐ ์๋๋ผ ใ์นธ์ ๋ฐํ์ ์ง์ด๋คใ์ด๊ณ , ์ง์์ง ์๋ฆฌ์๋ ๋ค๊ฐ ๋น์น๋ค.\n * ๊ณ ์น๋ ํ๊ฐ ๊ทธ๋ ๊ฒ ๋์๋ ๊ฒ์ ๊ฑท์๋ค(data-grid.ts).\n */\n\n :host([raised]) [fixed] {\n /* ๊ณ ์ ์ปฌ๋ผ์ด ์ด์ง ์ฌ๋ผ์ ์๋ ๋๋์ ํํ */\n box-shadow: 3px 0 3px rgba(0, 0, 0, 0.1);\n }\n\n ox-grid-accum-field {\n position: sticky;\n bottom: 0;\n z-index: 1;\n }\n\n ox-grid-accum-field[fixed] {\n background-color: var(--md-sys-color-primary-container);\n }\n\n @media (max-width: 768px) {\n /* ๋ชจ๋ฐ์ผ์์๋ ๊ทธ๋ฆฌ๋์์ ๊ณ ์ ๋ ์ด ํด์ */\n [fixed] {\n position: static;\n z-index: 0;\n box-shadow: none !important;\n }\n }\n\n @media (pointer: coarse) {\n /* ํฐ์น ๊ธฐ๊ธฐ์์๋ ๊ธธ๊ฒ ๋๋ฅด๋ฉด ํ
์คํธ๋ฅผ ์ ํํ ์ ์๊ฒ ๋๋ค */\n :host {\n user-select: auto;\n }\n }\n\n /* ํ๊ธ IME composition์ ์ํ ์จ๊ฒจ์ง input ๋ฒํผ โ ๊ธฐ์กด ์๋ํฐ ์
์คํ์ผ๊ณผ ์ผ์น */\n #ime-buffer {\n position: absolute;\n opacity: 0;\n z-index: 10;\n background-color: var(--grid-record-editing-background-color, var(--grid-record-background-color, #fff));\n color: var(--md-sys-color-on-background, inherit);\n font: inherit;\n font-size: var(--grid-record-wide-fontsize);\n border: 1px solid transparent;\n border-width: 1px 0;\n border-top: var(--grid-record-editing-border, none);\n border-bottom: var(--grid-record-editing-border, none);\n padding: var(--grid-record-padding);\n box-sizing: border-box;\n outline: none;\n overflow: hidden;\n pointer-events: none;\n }\n\n #ime-buffer.active {\n opacity: 1;\n pointer-events: auto;\n }\n `\n ]\n\n @property({ type: Object }) config: GristConfig = ZERO_CONFIG\n @property({ type: Array }) columns: ColumnConfig[] = []\n @property({ type: Object }) data: GristData = ZERO_DATA\n @property({ type: Object }) focused: { row: number; column: number } = ZERO_FOCUS\n /**\n * Where this body's first row sits in the whole table, counting from 1.\n *\n * It combines header row count and page offset, so ox-grid computes it and passes it down โ\n * working it out here would mean the body has to know whether the header is one row or two.\n */\n @property({ type: Number }) ariaRowIndexBase: number = 2\n @property({ type: Object }) editTarget: { row: number; column: number; valueWith: string | null } | null = null\n @property({ type: Number }) from = -1\n @property({ type: Number }) to = -1\n @property({ type: Array }) fixedLefts: number[] = []\n\n @state() _selectBlock?: {\n start: DataGridField\n end?: DataGridField\n }\n\n @query('[select-block]') selectBlock?: HTMLDivElement\n @query('ox-grid-field[focused]') focusedField?: DataGridField\n\n private _focusedListener?: (e: KeyboardEvent) => void\n private _recordView?: any\n private _recordViewRow?: number\n private _draggable?: boolean\n private _gridElement?: Element | null\n\n /* IME composition ์ง์์ ์ํ ์จ๊ฒจ์ง input ๋ฒํผ */\n private _imeBuffer?: HTMLInputElement\n _imeComposing: boolean = false\n _imeEditing: boolean = false\n _lastPointerTouch: boolean = false\n\n /* ํธ์ง ๊ฐ๋ฅํ ์
์ด ํ๋๋ผ๋ ์๋์ง โ ์์ผ๋ฉด(์ฝ๊ธฐ ์ ์ฉ ๊ทธ๋ฆฌ๋) IME ์
๋ ฅ ๋ฒํผ๋ก ํฌ์ปค์ค๋ฅผ ๋๊ธฐ์ง ์๋๋ค */\n private get _hasEditableColumn(): boolean {\n return this.columns.some(column => !column.hidden && !column.gutterName && !!column.record?.editable)\n }\n\n resetEdit() {\n this.editTarget = null\n }\n\n handleOnScroll(e: WheelEvent) {\n const { scrollTop, clientHeight } = e.target as HTMLElement\n this.debounce(scrollTop, clientHeight)\n }\n\n // issue #13\n // renderOptimisticRow() {\n // return\n // }\n\n render() {\n // block์ด ์ ํ๋์ด ์์ผ๋ฉด, focused row/column์ ํํํ์ง ์๋๋ค.\n var { row: focusedRow, column: focusedColumn } = (!this._selectBlock && this.focused) || {}\n var { row: editingRow, column: editingColumn, valueWith = null } = this.editTarget || {}\n\n var columns = this.columns.filter(column => !column.hidden)\n var data = this.data\n var { records } = data\n var { appendable, classifier, accumulator } = this.config.rows\n const { start, end } = this._selectBlock || {}\n\n /*\n * Only emit aria-selected where rows can actually be selected.\n *\n * The attribute means \"selectable, currently not selected\", so putting false on every row of a\n * grid without selection announces a control that is not there. Whether selection exists is\n * something the grid already knows: it has a row-selector gutter or it does not.\n */\n const selectable = columns.some(column => column.gutterName === 'row-selector')\n\n /*\n * ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ ์ ์๋ ๊ฒฝ์ฐ์๋ ํญ์ ์ถ๊ฐ ๋ ์ฝ๋๋ฅผ ๋ณด์ฌ์ค๋ค.\n * ๋ง์ฝ, ์ด์ ๋ฐฉ์์ฒ๋ผ, ์ปค์๋ฅผ ์ฎ๊ฒจ์ผ๋ง ์๋ก์ด ๋ ์ฝ๋๊ฐ ๋ณด์ด๊ฒ ํ๊ณ ์ถ๋ค๋ฉด, ์กฐ๊ฑด๋ถ๋ฅผ ๋ค์์ ์ฝ๋๋ก ๋์ฒดํ๋ค.\n * -- if (focusedRow == records.length)\n */\n if (appendable) {\n records = [...records, { __dirty__: '+' }]\n }\n\n if (accumulator) {\n var accumRecord = this.buildAccumulatorRecord()\n }\n\n /*\n * aria-rowindex is the position in the whole table, not within the page on screen. The first\n * row of page 2 is row 22, not row 1 again โ otherwise every page turn resets the count and\n * there is no way to tell how far through the data you are.\n *\n * Header rows count too, from 1. With a grouped header that is two rows, so the body starts\n * at 3.\n */\n const rowIndexBase = this.ariaRowIndexBase\n\n return html`\n ${records.map((record, idxRow) => {\n var attrFocusedRow = idxRow === focusedRow\n var attrSelected = record['__selected__']\n var attrOdd = idxRow % 2\n var dirtyFields = record['__dirtyfields__'] || {}\n var { emphasized } = classifier.call(null, record, idxRow) || {}\n\n return html`\n <div\n grid-row\n role=\"row\"\n aria-rowindex=${rowIndexBase + idxRow}\n aria-selected=${ifDefined(selectable ? !!attrSelected : undefined)}\n >\n ${columns.map(\n (column, idxColumn) => html`\n <ox-grid-field\n id=${'cell-' + idxRow + '-' + idxColumn}\n role=\"gridcell\"\n aria-colindex=${idxColumn + 1}\n .data=${data}\n .type=${column.type}\n .rowIndex=${idxRow}\n .columnIndex=${idxColumn}\n .column=${column}\n .record=${record}\n .checked=${record.__selected__ ? 'checked' : record.__check_in_tree__}\n .emphasized=${emphasized}\n ?multiline=${!!column.multiline}\n ?gutter=${column.type == 'gutter'}\n ?odd=${attrOdd}\n ?focused-row=${attrFocusedRow}\n ?selected-row=${attrSelected}\n ?focused=${idxRow === focusedRow && idxColumn === focusedColumn}\n ?editing=${idxRow === editingRow && idxColumn === editingColumn}\n .valueWith=${valueWith}\n .value=${record[column.name]}\n ?dirty=${!!dirtyFields[column.name]}\n fixed=${ifDefined(this.fixedLefts[idxColumn])}\n ></ox-grid-field>\n `\n )}\n <!--\n Width filler โ nothing to read. It stays inside the row so hover and selection colour it\n with the rest, but it is not counted as a cell.\n -->\n <ox-grid-field\n role=\"presentation\"\n .data=${data}\n .rowIndex=${idxRow}\n .columnIndex=${-1}\n .record=${record}\n .emphasized=${emphasized}\n ?odd=${attrOdd}\n ?focused-row=${attrFocusedRow}\n ?selected-row=${attrSelected}\n ></ox-grid-field>\n </div>\n `\n })}\n ${accumulator\n ? html`\n <div grid-row role=\"row\" aria-rowindex=${rowIndexBase + records.length}>\n ${columns.map(\n (column, idxColumn) => html`\n <ox-grid-accum-field\n role=\"gridcell\"\n aria-colindex=${idxColumn + 1}\n .data=${data}\n .columnIndex=${idxColumn}\n .rowIndex=${records.length}\n .column=${column}\n .record=${accumRecord!}\n .value=${accumRecord[column.name]}\n fixed=${ifDefined(this.fixedLefts[idxColumn])}\n ></ox-grid-accum-field>\n `\n )}\n <ox-grid-accum-field\n role=\"presentation\"\n .data=${data}\n .columnIndex=${-1}\n .rowIndex=${records.length}\n .record=${accumRecord!}\n ></ox-grid-accum-field>\n </div>\n `\n : nothing}\n ${start && end && start !== end ? html` <div select-block></div> ` : html``}\n <!--\n This input takes the grid's keystrokes. Focus rests here until a cell opens for editing, and\n IME composition builds up in it โ this is where focus actually lives.\n\n It had no name. opacity: 0 makes that look harmless, but invisible is not the same as absent:\n it receives focus and receives text, so a screen reader reads it. Unnamed, it reads as one\n \"edit text\" and never changes, no matter how far the arrow keys travel โ there is no way to\n tell which cell you are on.\n\n aria-hidden is not the fix. Hiding the thing that holds focus makes focus vanish into\n nothing. Instead of hiding it, name it after the cell it currently stands in for.\n -->\n <input\n id=\"ime-buffer\"\n type=\"text\"\n aria-label=${this._imeBufferLabel(columns[focusedColumn as number])}\n aria-activedescendant=${ifDefined(\n focusedRow! >= 0 && focusedColumn! >= 0 ? `cell-${focusedRow}-${focusedColumn}` : undefined\n )}\n />\n <slot></slot>\n `\n }\n\n firstUpdated() {\n // TODO issue #13\n // this.addEventListener('scroll', this.handleOnScroll.bind(this))\n\n /* ์นธ์ ํ์
ํ์์ ๋๋ฅด๋ฉด ๊ทธ ์นธ์ ํธ์ง์ ์ฐ๋ค(onStartEdit). */\n this.addEventListener('start-edit', this.onStartEdit.bind(this))\n\n /* focus() ๋ฅผ ๋ฐ์ ์ ์๋๋ก ํจ. */\n this.setAttribute('tabindex', '-1')\n\n /* ํ๊ธ IME composition์ ์ํ ์จ๊ฒจ์ง input ๋ฒํผ ์ค์ */\n const imeBuffer = this.renderRoot.querySelector('#ime-buffer') as HTMLInputElement\n this._imeBuffer = imeBuffer\n\n imeBuffer.addEventListener('compositionstart', () => {\n this._imeComposing = true\n this._imeEditing = true\n imeBuffer.classList.add('active')\n this._positionIMEBuffer()\n })\n\n imeBuffer.addEventListener('compositionend', () => {\n this._imeComposing = false\n })\n\n imeBuffer.addEventListener('input', () => {\n if (!this._imeComposing && !this._imeEditing && imeBuffer.value) {\n /* ์์ด/์ซ์: ์ค์ ๊ฐ์ด ์
๋ ฅ๋ ๊ฒฝ์ฐ์๋ง ํ์ฑํ */\n this._imeEditing = true\n imeBuffer.classList.add('active')\n this._positionIMEBuffer()\n }\n })\n\n /*\n * focusout ์ผ๋ก property๋ฅผ ๋ณ๊ฒฝ์ํค๋ ๊ฒฝ์ฐ, focusout์ ์ํด update๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ์๋,\n * ๊ทธ๋ฆฌ๋ ๋ด๋ถ์ ์ปดํฌ๋ํธ๊ฐ ๊ฐฑ์ ๋๋ ํ์์ ์ด๋ํ๊ฒ ๋๋ค.\n * ๋ฐ๋ผ์, focusout ํธ๋ค๋ฌ์์ update๋ฅผ ์ ๋ฐํ๋ ์ฝ๋๋ ๊ฐ๋ ฅํ๊ฒ ๊ธ์ง์ํจ๋ค.\n */\n this.addEventListener('focusout', e => {\n /* IME buffer๋ก ํฌ์ปค์ค๊ฐ ์ด๋ํ๋ ๊ฒฝ์ฐ keydown listener ์ ์ง */\n const related = (e as FocusEvent).relatedTarget as Node\n if (related && this.shadowRoot?.contains(related)) {\n return\n }\n\n /* ๊ทธ๋ฆฌ๋ ์ธ๋ถ๋ก ํฌ์ปค์ค ์ด๋ ์ IME buffer ์ปค๋ฐ */\n if (this._imeEditing) {\n const { row = 0, column = 0 } = this.focused || {}\n this._commitIMEBuffer(row, column)\n }\n\n if (this._focusedListener) {\n this.removeEventListener('keydown', this._focusedListener)\n delete this._focusedListener\n }\n })\n\n this.addEventListener('focusin', e => {\n if (!this._focusedListener) {\n this._focusedListener = dataGridBodyKeydownHandler.bind(this)\n this.addEventListener('keydown', this._focusedListener)\n }\n })\n\n this.addEventListener('set-select-block', async e => {\n e.stopPropagation()\n\n const { startRow = -1, startColumn = -1, endRow = -1, endColumn = -1 } = ((e as CustomEvent).detail as any) || {}\n\n const start = this.getFieldByIndex(startRow, startColumn) as DataGridField\n const end = this.getFieldByIndex(endRow, endColumn) as DataGridField\n\n this.setSelectBlock(start, end)\n })\n\n this.renderRoot.addEventListener('contextmenu', (event: Event) => {\n const e = event as MouseEvent\n this.setSelectBlock()\n\n this._draggable = false\n\n var target = (e.target as Element).closest('ox-grid-field') as DataGridField\n var { rowIndex, columnIndex } = target || {}\n\n this.dispatchEvent(\n new CustomEvent('focus-change', {\n bubbles: true,\n composed: true,\n detail: {\n row: rowIndex,\n column: columnIndex\n }\n })\n )\n })\n\n this.renderRoot.addEventListener('pointerdown', (e: Event) => {\n const pe = e as PointerEvent\n const isTouch = pe.pointerType === 'touch'\n\n /* ํฐ์น ์ด๋ฒคํธ ์ฌ๋ถ ๊ธฐ๋ก โ ํ๋ธ๋ฆฟ์์ input focus๋ก ๊ฐ์ ํค๋ณด๋๊ฐ ๋จ๋ ๊ฒ์ ๋ฐฉ์ง */\n this._lastPointerTouch = isTouch\n\n /* ํด๋ฆญ ์ IME buffer๊ฐ ํ์ฑ ์ํ๋ฉด ๋จผ์ ์ปค๋ฐ */\n if (this._imeEditing) {\n const { row = 0, column = 0 } = this.focused || {}\n this._commitIMEBuffer(row, column)\n }\n\n this.setSelectBlock()\n\n if (isTouch) {\n /* ํฐ์น: click ์ด๋ฒคํธ์์ ์ฒ๋ฆฌ (์คํฌ๋กค ์์๋ click์ด ๋ฐ์ํ์ง ์์) */\n return\n }\n\n if ('buttons' in e && pe.buttons !== 1) {\n return\n }\n\n e.preventDefault()\n e.stopPropagation()\n\n this._draggable = true\n\n var target = (e.target as Element).closest('ox-grid-field') as DataGridField\n var { rowIndex, columnIndex } = target || {}\n\n this.dispatchEvent(\n new CustomEvent('focus-change', {\n bubbles: true,\n composed: true,\n detail: {\n row: rowIndex,\n column: columnIndex\n }\n })\n )\n\n if (columnIndex >= 0 && target.editableOnClick && !isNaN(rowIndex) && !isNaN(columnIndex)) {\n this.startEditTarget(rowIndex, columnIndex)\n }\n })\n\n this.renderRoot.addEventListener('pointermove', (event: Event) => {\n const e = event as PointerEvent\n if (('buttons' in e && e.buttons !== 1) || !this._draggable) {\n return\n }\n\n e.preventDefault()\n e.stopPropagation()\n\n const field = e.target as DataGridField\n if (!this._selectBlock) {\n this.setSelectBlock(this.focusedField || field, this.focusedField || field)\n\n return\n }\n\n var { start, end } = this._selectBlock || {}\n\n if (start && end !== field) {\n end = field\n\n this.setSelectBlock(start, end)\n }\n })\n\n this.renderRoot.addEventListener('pointerup', (event: Event) => {\n if ((event as PointerEvent).pointerType !== 'touch') {\n event.preventDefault()\n event.stopPropagation()\n }\n\n this._draggable = false\n })\n\n /*\n * โโ ๋ง์ฐ์ค๊ฐ ์ง๋๋ ์ค์ ํ์ํ๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ฝ๊ธฐ ์ ์ฉ ํ์๋ ์ง๊ธ ์ด๋ ์ค์ ์๋์ง ์๋ ค ์ฃผ๋ ๊ฒ์ด ์๋ฌด๊ฒ๋ ์๋ค. ๊ณ ์น๋ ํ์๋ ์ ์ ์
\n * ํ
๋๋ฆฌ๊ฐ ๊ทธ ์ผ์ ํ์ง๋ง ์ฝ๊ธฐ ์ ์ฉ์๋ ๊ทธ๊ฒ๋ ์์ด์, ์นธ์ด ์ฌ๋์ด๋ฉด ๋์ด ๊ฐ๋ก๋ก ๊ฐ๋ค ์ค์ ๋์น๋ค.\n *\n * ์ค์๋ ๊ฐ์ธ๋ ์์๊ฐ ์๋ค โ ์
์ด ๊ฐ๊ฐ ๊ฒฉ์ ํญ๋ชฉ์ด๋ค. ๊ทธ๋์ CSS ๋ง์ผ๋ก๋ ใ๊ฐ์ ์คใ์ ๊ฐ๋ฆด ์\n * ์๊ณ , ์ด๋ฏธ ์๋ ๋ฐฉ์(selected-row)์ฒ๋ผ ๊ทธ ์ค์ ์
๋ง๋ค ํ์์ ๋ถ์ธ๋ค.\n *\n * ๋ค์ ๊ทธ๋ฆฌ์ง ์๊ณ ์์ฑ๋ง ๋ฐ๊พผ๋ค. ์ค์ด ๋ฐ๋ ๋๋ง๋ค ๋ชธ ์ ์ฒด๋ฅผ ๋ค์ ๊ทธ๋ฆฌ๋ฉด ํฐ ํ์์ ๋๋ฆฐ๋ค.\n */\n this.renderRoot.addEventListener('pointerover', (event: Event) => {\n if ((event as PointerEvent).pointerType === 'touch') {\n return\n }\n\n const field = (event.target as Element)?.closest?.('ox-grid-field') as DataGridField\n this.setHoveredRow(field ? field.rowIndex : -1)\n })\n\n /*\n * ํ๋ฅผ ๋ฒ์ด๋๋ฉด ์ง์ด๋ค โ ๋จ๊ฒจ ๋๋ฉด ๋ง์ง๋ง ์ค์ด ๊ณจ๋ผ์ง ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค.\n *\n * **์์์ ๋ถ์ธ๋ค.** renderRoot ๋ ShadowRoot ์ด๊ณ pointerleave ๋ ์์์ ๊ฐ๋ ์ฌ๊ฑด์ด๋ผ ๊ฑฐ๊ธฐ์๋\n * ์ ๋จน์๋ค. [ํ์ธํจ] ํ๋ฅผ ๋ฒ์ด๋ ๋ค์๋ ํ์ 8๊ฐ๊ฐ ๋จ์ ์์๋ค. 2026-09-02\n */\n this.addEventListener('pointerleave', () => this.setHoveredRow(-1))\n\n this.renderRoot.addEventListener('click', dataGridBodyClickHandler.bind(this))\n this.renderRoot.addEventListener('dblclick', dataGridBodyDblclickHandler.bind(this))\n this.renderRoot.addEventListener('contextmenu', dataGridBodyContextMenuHandler.bind(this))\n\n this.addEventListener('focus-change', dataGridBodyFocusChangeHandler.bind(this))\n\n requestAnimationFrame(() => {\n // 1. ๊ณต๋ฐฑ ์ฐ๊บผ๊ธฐ๊ฐ ๋ค์ด๊ฐ ์ ์์ผ๋ฏ๋ก .trim()์ผ๋ก ๊น๋ํ๊ฒ ์ฒ๋ฆฌ\n const primaryColor = getComputedStyle(this).getPropertyValue('--md-sys-color-primary').trim()\n // 2. ๊ฐ๋
์ฑ์ ์ํด svg ๋ฌธ์์ด ์กฐ๋ฆฝ ๋ถ๋ฆฌ\n const svgString = `<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10'><rect fill='${primaryColor}' fill-opacity='0.2' x='0' y='0' width='100%' height='100%'/></svg>`\n\n // 3. Hex ์ฝ๋์ '#' ๊ธฐํธ ๋ฐ '< >' ๊ดํธ๋ค์ด ํ์๋ฅผ ๊นจ๋จ๋ฆฌ๋ ๊ฒ์ ์๋ฒฝ ๋ฐฉ์งํ๊ธฐ ์ํด ์ ์ฒด ์ธ์ฝ๋ฉ\n const encodedSvg = encodeURIComponent(svgString)\n this.style.setProperty(\n '--focused-background-image',\n // 4. ๋นํ์ค์ธ ;utf8 ํ๊ทธ๋ฅผ ๋ผ์ด๋ด๊ณ , ์ธ์ฝ๋ฉ๋ SVG ๋ฐ์ดํฐ๋ฅผ ์ฃผ์
\n `url(\"data:image/svg+xml,${encodedSvg}\")`\n )\n })\n\n this.addEventListener('show-record-view', (e: Event) =>\n this.popupRecordView((e as CustomEvent).detail as { row: number; record: GristRecord })\n )\n\n this.addEventListener('scroll', function () {\n this.scrollLeft == 0 ? this.removeAttribute('raised') : this.setAttribute('raised', '')\n })\n }\n\n connectedCallback() {\n super.connectedCallback()\n // ํค๋๊ฐ ox-grist์ ๋์คํจ์นํ๋ fetch-params-change ์ด๋ฒคํธ ์์ \n this._gridElement = closestElement('ox-grist', this)\n this._gridElement?.addEventListener('fetch-params-change', this._onFetchParamsChange)\n }\n\n disconnectedCallback() {\n if (this._gridElement) {\n this._gridElement.removeEventListener('fetch-params-change', this._onFetchParamsChange)\n }\n super.disconnectedCallback()\n }\n\n // ๊ฒ์์ ์คํฌ๋กค ๋งจ ์๋ก\n _onFetchParamsChange: EventListener = () => {\n this.scrollTop = 0\n }\n\n private _hoveredRow = -1\n\n /** ์ง๋๋ ์ค์ ์ฎ๊ธด๋ค. ๊ฐ์ ์ค์ด๋ฉด ์๋ฌด๊ฒ๋ ํ์ง ์๋๋ค. */\n private setHoveredRow(rowIndex: number) {\n if (rowIndex === this._hoveredRow) {\n return\n }\n\n this.markRow(this._hoveredRow, false)\n this.markRow(rowIndex, true)\n\n this._hoveredRow = rowIndex\n }\n\n /**\n * One row โ the element holding that row's cells.\n *\n * This used to index `renderRoot.children` at `rowIndex * (columns + 1)`, where the +1 was the\n * width filler; the comment above it existed to explain why that arithmetic was necessary. The\n * code only worked while the count stayed correct.\n *\n * Rows are real elements now (role=row), so there is nothing to count.\n */\n private rowElementAt(rowIndex: number): HTMLElement | null {\n if (rowIndex < 0) {\n return null\n }\n\n return this.renderRoot?.querySelectorAll('div[grid-row]').item(rowIndex) as HTMLElement | null\n }\n\n private markRow(rowIndex: number, on: boolean) {\n const row = this.rowElementAt(rowIndex)\n\n if (!row) {\n return\n }\n\n /*\n * Mark every cell in the row, width filler included. It used to be left out, so on a grid\n * narrower than the viewport the right end of the row stayed uncoloured.\n */\n Array.from(row.children).forEach(cell => cell.toggleAttribute('hovered-row', on))\n }\n\n getFieldByIndex(rowIndex: number, columnIndex: number, residue: boolean = true) {\n const row = this.rowElementAt(rowIndex)\n\n if (!row) {\n return\n }\n\n var columns = this.columns.filter(column => !column.hidden).length\n if (!residue && columnIndex >= columns) {\n return\n }\n\n /* Column index wraps: moving right from the last column returns to the first (residue). */\n return row.children.item((columnIndex + columns) % columns) as DataGridField\n }\n\n /**\n * ์นธ์ **ํ์
ํ์**์ ๋๋ ๋ค โ ๊ทธ ์นธ์ ํธ์ง์ ์ฐ๋ค.\n *\n * ๋๋ธํด๋ฆญ๊ณผ ๊ฐ์ ์๋ฆฌ๋ก ๋ค์ด๊ฐ๋ค. ํ์์ ํ ๋ฒ ๋๋ฅด๋ 22px ํ์ ์ด๊ณ , 33px ์ค์์ ๋๋ธํด๋ฆญ์\n * ๊ฒจ๋๋ ๊ฒ๋ณด๋ค ์ฝ๋ค. ๋๋ธํด๋ฆญ๋ ๊ทธ๋๋ก ๋๋ค โ ์ด๋ฏธ ์๋ ์ฌ๋์ ๊ธธ์ ๋ง์ง ์๋๋ค.\n */\n private onStartEdit(e: Event) {\n const { row, column } = (e as CustomEvent).detail || {}\n\n if (isNaN(row) || isNaN(column)) {\n return\n }\n\n this.startEditTarget(row, column)\n }\n\n startEditTarget(row: number, column: number, valueWith: string | null = null) {\n var { editable } = this.columns.filter(column => !column.hidden)[column].record\n if (typeof editable === 'function') {\n const curRow = this.data.records[row] || {}\n const curCol = this.columns[column + 1]\n editable = editable.call(this, curRow[curCol.name], curCol, curRow, row, this)\n }\n\n if (!editable) {\n return\n }\n\n if (this.editTarget && this.editTarget.row == row && this.editTarget.column == column) {\n return\n }\n\n /* ์๋ํฐ ํธ์ง ์ ํ ์ IME buffer ์ ๋ฆฌ */\n this._resetIMEBuffer()\n\n this.editTarget = {\n row,\n column,\n valueWith\n }\n }\n\n shouldUpdate(changes: any) {\n if (!changes.has('editTarget')) {\n /*\n * ํฐ ๋ณํ์ ๋ํด์๋ ์ค์ update๊ฐ ๋ฐ์๋๊ธฐ ์ ์ editTarget์ ์ด๊ธฐํํ๋ค.\n */\n this.editTarget = null\n }\n\n return super.shouldUpdate(changes)\n }\n\n updated(changes: PropertyValues<this>) {\n if (changes.has('focused')) {\n let element = this.renderRoot?.querySelector('[focused]')\n if (!element) {\n return\n }\n\n let { top, left } = calcScrollPos(this, element)\n // TODO this.scroll()์ ์ฌ์ฉํ๋ฉด, ํจ๊ณผ๊ฐ ์ข์ผ๋ left ๊ณ์ฐ์ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ ๊ฐ์.\n // this.scroll({\n // top,\n // left,\n // behavior: 'smooth'\n // })\n if (top !== undefined) {\n this.scrollTop = top\n }\n if (left !== undefined) {\n this.scrollLeft = left\n }\n\n /* IME buffer ์์น ์
๋ฐ์ดํธ */\n this._positionIMEBuffer()\n if (!this.editTarget && this._imeBuffer && !this._lastPointerTouch && this._hasEditableColumn) {\n this._imeBuffer.focus()\n }\n }\n\n // ํ์ด์ง ๋ฐ๋๋ฉด ์คํฌ๋กค ๋งจ ์๋ก\n if (changes.has('data')) {\n const prevData = changes.get('data') as GristData | undefined\n const prevPage = prevData && (prevData as any).page\n const currPage = (this.data as any).page\n if (prevPage !== undefined && prevPage !== currPage) {\n this.scrollTop = 0\n }\n }\n\n if (this._recordView) {\n this._recordView.record = this.data.records[this._recordViewRow!]\n }\n }\n\n focus() {\n if (this.editTarget) {\n /* ์๋ํฐ ํธ์ง ๋ชจ๋์์๋ ์๋ํฐ๊ฐ ์์ฒด์ ์ผ๋ก ํฌ์ปค์ค๋ฅผ ๊ด๋ฆฌํ๋ฏ๋ก ๊ฐ์ญํ์ง ์๋๋ค */\n return\n }\n\n if (this._imeBuffer && !this._lastPointerTouch && this._hasEditableColumn) {\n /* ๋นํธ์ง ๋ชจ๋์์๋ IME buffer๋ก ํฌ์ปค์ค ๋ฆฌ๋ค์ด๋ ํธ (ํฐ์น ์/์ฝ๊ธฐ ์ ์ฉ ๊ทธ๋ฆฌ๋์์๋ ์ ์ธ) */\n this._positionIMEBuffer()\n this._imeBuffer.focus()\n } else {\n super.focus()\n }\n\n if (this.focused === ZERO_FOCUS) {\n let { records } = this.data\n let row = records.findIndex(record => record['__selected__'])\n\n this.focused = { row: row == -1 ? 0 : row, column: 0 }\n }\n }\n\n popupRecordView({ record, row }: { row: number; record: GristRecord }) {\n var titleField = this.config.list.fields[0] || 'name'\n var title = record[titleField]\n\n /* field๊ฐ ์ค๋ธ์ ํธํ์ธ ๊ฒฝ์ฐ์๋ ๋ ๋๋ฌ๋ฅผ ํ์ดํ๋ก ์ฌ์ฉํ๋ค. */\n if (typeof title == 'object') {\n var column = this.config.columns.find(column => column.name == titleField)\n title = column?.record.renderer(title, column, record, row, this /* cautious */)\n }\n\n this._recordViewRow = row\n this._recordView = RecordViewHandler(\n this.config.columns,\n record,\n row,\n this,\n {\n title\n },\n () => {\n delete this._recordView\n delete this._recordViewRow\n }\n )\n }\n\n /* ์ ํ๋ ์
๋ธ๋ก์ ๊ฐ์ HTML(table)๊ณผ plain text(TSV) ๋ ๊ฐ์ง ํฌ๋งท์ผ๋ก ๋ฐํ */\n getSelectedBlockValues(): { html: string; text: string } | undefined {\n var { start, end } = this._selectBlock || {}\n\n if (!(start && end)) {\n start = this.focusedField\n\n end = start\n }\n\n if (start && end) {\n const startRowIndex = start.rowIndex < end.rowIndex ? start.rowIndex : end.rowIndex\n const endRowIndex = start.rowIndex < end.rowIndex ? end.rowIndex : start.rowIndex\n const startColumnIndex = start.columnIndex < end.columnIndex ? start.columnIndex : end.columnIndex\n const endColumnIndex = start.columnIndex < end.columnIndex ? end.columnIndex : start.columnIndex\n\n const columnArray = new Array(endColumnIndex - startColumnIndex + 1).fill(startColumnIndex)\n const columns = this.columns.filter(column => !column.hidden)\n\n /*\n * ํด๋ฆฝ๋ณด๋์ ๋ ๊ฐ์ง ํฌ๋งท(text/html, text/plain)์ ๋์์ ์ ์ฅํ๋ค.\n * ๋ถ์ฌ๋ฃ๊ธฐํ๋ ์ฑ์ด ์์ ์ด ์ง์ํ๋ ํฌ๋งท์ ๊ณจ๋ผ ์ฝ๋๋ค.\n * ์์ฑ๋๋ HTML:\n * <td type=object data-value=\"{"id":...}\">ํ์ ์ ์๋ฐฐ์ถ</td>\n * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^\n * ๊ทธ๋ฆฌ๋๋ง ์ฝ๋ ์จ๊ฒจ์ง JSON Excel/๋ฉ๋ชจ์ฅ์ด ๋ณด๋ ํ
์คํธ\n */\n const rows = new Array(endRowIndex - startRowIndex + 1).fill(startRowIndex).map((start, index) => {\n const rowIndex = start + index\n const record = this.data.records[rowIndex]\n\n const cells = columnArray.map((start, index) => {\n const columnIndex = start + index\n const column = columns[columnIndex]\n const value = record?.[column.name]\n const type = typeof value\n\n /* select ํ์
: value โ display ํ
์คํธ ๋ฏธ๋ฆฌ ๊ณ์ฐ (htmlText/plainText ๊ณต์ฉ) */\n let selectDisplay: any = value\n if (column.type === 'select' && value !== undefined && value !== null) {\n const src = record[column.record?.rowOptionField || ''] ?? column.record\n const options: any[] = Array.isArray(src?.options) ? src.options : []\n const opt = options.find((o: any) => (typeof o === 'string' ? o : String(o?.value ?? '')).trim() === String(value).trim())\n selectDisplay = opt ? (typeof opt === 'string' ? opt : opt.display || opt.name || value) : value\n }\n\n /* htmlText: object๋ JSON ๋ฌธ์์ด๋ก ๋ณด์กด(data-value) โ ๊ทธ๋ฆฌ๋ ๋ถ์ฌ๋ฃ๊ธฐ ์ ๋ณต์๋จ. select๋ display ํ
์คํธ */\n const htmlText = value === undefined || value === null ? '' : type == 'object' ? JSON.stringify(value) : column.type === 'select' ? selectDisplay : value\n\n /* plainText: โ null/undefined โ renderer โก object โ name โ renderer โข select โ display โฃ ๊ธฐํ โ ๊ฐ ๊ทธ๋๋ก */\n let plainText: any = ''\n if (value === undefined || value === null) {\n /* ๊ฐ์ด ์์ง๋ง renderer๊ฐ record์ ๋ค๋ฅธ ๊ฒฝ๋ก๋ก ํ
์คํธ๋ฅผ ํ์ํ ์ ์์ */\n if (column.record?.renderer) {\n try {\n const r = column.record.renderer(value, column, record, rowIndex, null as any)\n if (typeof r === 'string') plainText = r\n } catch (e) {}\n }\n } else if (type == 'object') {\n /* object: name ํ๋๊ฐ ๋ฌธ์์ด์ธ ๊ฒฝ์ฐ ์ฐ์ , ์์ผ๋ฉด renderer */\n const rawName = (value as any)?.name\n plainText = typeof rawName === 'string' ? rawName : ''\n if (!plainText && column.record?.renderer) {\n try {\n const r = column.record.renderer(value, column, record, rowIndex, null as any)\n if (typeof r === 'string') plainText = r\n } catch (e) {}\n }\n } else if (column.type === 'select') {\n plainText = selectDisplay\n } else {\n plainText = value\n }\n\n /* ์์ ์ฅ์น: plainText๊ฐ object์ด๋ฉด ๋น ๋ฌธ์์ด๋ก ๋์ฒดํ์ฌ [object Object] ๋ฐฉ์ง */\n if (plainText !== null && plainText !== undefined && typeof plainText === 'object') {\n plainText = ''\n }\n\n return { type, htmlText, plainText }\n })\n\n return cells\n })\n\n const escapeHtml = (unsafe: any) => {\n if (unsafe == null) return ''\n return String(unsafe).replace(/[&<>\"']/g, function (m) {\n switch (m) {\n case '&':\n return '&'\n case '<':\n return '<'\n case '>':\n return '>'\n case '\"':\n return '"'\n case \"'\":\n return '''\n default:\n return m\n }\n })\n }\n\n const html =\n '<table>' +\n rows\n .map(\n cells =>\n '<tr>' +\n cells\n .map(c =>\n c.type == 'object' && c.htmlText\n ? `<td type=${c.type} data-value=\"${escapeHtml(c.htmlText)}\">${escapeHtml(c.plainText)}</td>`\n : `<td type=${c.type}>${escapeHtml(c.htmlText)}</td>`\n )\n .join('') +\n '</tr>'\n )\n .join('') +\n '</table>'\n\n /* ํ๊ทธ ์๋ TSV ํฌ๋งท (object๋ name๋ง) */\n const text = rows.map(cells => cells.map(c => String(c.plainText)).join('\\t')).join('\\n')\n\n return { html, text }\n }\n }\n\n async copy() {\n const copied = this.getSelectedBlockValues()\n if (!copied) return\n\n await navigator.clipboard.write([\n new ClipboardItem({\n 'text/html': new Blob([copied.html], { type: 'text/html' }),\n 'text/plain': new Blob([copied.text], { type: 'text/plain' })\n })\n ])\n\n const selectBlock = this.selectBlock || this.focusedField\n if (selectBlock) {\n const backgroundColor = selectBlock.style.backgroundColor\n const opacity = selectBlock.style.opacity\n\n selectBlock.setAttribute('data-tooltip', 'copied to clipboard!')\n const rect = selectBlock.getBoundingClientRect()\n selectBlock.style.setProperty('--tooltip-top', `${rect.top}px`)\n selectBlock.style.setProperty('--tooltip-left', `${rect.left}px`)\n\n selectBlock.style.backgroundColor = 'red'\n selectBlock.style.opacity = '0.5'\n await sleep(500)\n selectBlock.removeAttribute('data-tooltip')\n selectBlock.style.backgroundColor = backgroundColor\n selectBlock.style.opacity = opacity\n }\n }\n\n async paste() {\n try {\n const selection = window.getSelection()\n\n const clipboardItems = await navigator.clipboard.read()\n if (!clipboardItems) {\n return\n }\n\n var type: string | undefined\n var content: string | undefined\n\n for (const clipboardItem of clipboardItems) {\n try {\n var blob = await clipboardItem.getType('text/html')\n content = blob && (await blob.text())\n type = 'text/html'\n } catch (e) {\n try {\n blob = await clipboardItem.getType('text/plain')\n content = blob && (await blob.text())\n type = 'text/plain'\n } catch (e) {}\n }\n\n break\n }\n\n if (!content) {\n return\n }\n\n /* ๋ถ์ฌ๋ฃ๊ธฐ ์ต์ปค/ํ๊ฒ ์์ญ: ์ ํ ๋ธ๋ก์ด ์์ผ๋ฉด ์ข์๋จ + ํฌ๊ธฐ, ์์ผ๋ฉด ํฌ์ปค์ค ์
1ร1 (์์
์ ๋ฐ๋ณต ์ฑ์ฐ๊ธฐ์ฉ) */\n let { row, column } = this.focused\n let tgtRows = 1\n let tgtCols = 1\n const { start, end } = this._selectBlock || {}\n if (start && end) {\n row = Math.min(start.rowIndex, end.rowIndex)\n column = Math.min(start.columnIndex, end.columnIndex)\n tgtRows = Math.abs(end.rowIndex - start.rowIndex) + 1\n tgtCols = Math.abs(end.columnIndex - start.columnIndex) + 1\n }\n\n const { records } = this.data\n const columns = this.columns.filter(column => !column.hidden)\n\n if (type === 'text/html') {\n const div = document.createElement('div')\n div.innerHTML = content!.trim()\n const table = div.querySelector('table') as HTMLTableElement\n if (!table) {\n return\n }\n\n if (selection) {\n this.resetEdit()\n selection.removeAllRanges()\n\n // ํฌ์ปค์ค๊ฐ ๋น ์ง๊ธฐ ์ ์ isWorking์ผ๋ก focusout ์ด๋ฒคํธ์ ๋ํ ๊ฐ ๋ณ๊ฒฝ์ ๋ง์\n // (์ ํ ๋ธ๋ก์ด ์๋ ๋์์๋ focused ํ๋๊ฐ ๋ ๋๋ง๋์ง ์์ผ๋ฏ๋ก ์กด์ฌ ์ฌ๋ถ ํ์ธ)\n if (this.focusedField) {\n this.focusedField.isWorking = true\n await this.updateComplete\n this.focusedField.isWorking = false\n }\n }\n /* ์์
์ ํ์ผ๋ง: ํ๊ฒ ์ ํ ์์ญ์ด ์์ค ํฌ๊ธฐ์ ์ ์๋ฐฐ์ด๋ฉด ๊ทธ ์ฐจ์์ผ๋ก ๋ฐ๋ณตํ๊ณ , ์๋๋ฉด ํ ๋ฒ๋ง ๋ถ์ฌ ๋ฃ๋๋ค (์ฐจ์๋ง๋ค ๋ฐ๋ก ํ๋จ) */\n const trs = Array.from(table.querySelectorAll('tr')).filter(\n (r): r is HTMLTableRowElement => r instanceof HTMLTableRowElement\n )\n if (!trs.length) {\n return\n }\n const srcRows = trs.length\n const srcCols = Math.max(...trs.map(tr => tr.querySelectorAll('td').length))\n const repeatR = srcRows > 0 && tgtRows % srcRows === 0 ? tgtRows / srcRows : 1\n const repeatC = srcCols > 0 && tgtCols % srcCols === 0 ? tgtCols / srcCols : 1\n\n for (let rowIndex = 0; rowIndex < srcRows * repeatR; rowIndex++) {\n var targetRecord = records[row + rowIndex] || { __dirty__: '+' }\n if (row + rowIndex >= records.length) {\n records.push(targetRecord)\n }\n\n const cells = trs[rowIndex % srcRows].querySelectorAll('td')\n for (let columnIndex = 0; columnIndex < srcCols * repeatC; columnIndex++) {\n const item = cells[columnIndex % srcCols]\n if (!item) continue /* ragged row ๋ฐฉ์ด */\n const targetColumn = columns[column + columnIndex]\n if (!targetColumn || targetColumn.gutterName) continue /* ๊ทธ๋ฆฌ๋ ๋ฒ์ ๋ฐ ์ด ๋ฐฉ์ด / gutter ๋ฐฉ์ด */\n /* data-value ์์ฑ์ด ์์ผ๋ฉด ์ฐ์ ์ฌ์ฉ (๊ทธ๋ฆฌ๋์์ ๋ณต์ฌํ object ๋ฐ์ดํฐ ๋ณต์์ฉ) */\n let value = (item.dataset.value || item.textContent) as any\n const sourceType = item.getAttribute('type') || 'string'\n let type = targetColumn.type || sourceType\n type = type.includes('object') ? 'object' : type // ์ค๋ธ์ ํธ ํ์
์์ธ์ฒ๋ฆฌ\n let { editable } = targetColumn.record\n if (typeof editable === 'function') {\n editable = editable.call(this, value, targetColumn, targetRecord, row, this)\n }\n\n if (value) {\n switch (type) {\n case 'object':\n // ์ค๋ธ์ ํธ๊ฐ ์ ๋ถ ๋น๊ฐ์ด๋ฉด ''๋ก ์นํ\n try {\n value = JSON.parse(value || '{}')\n value = Object.values(value).every(v => (typeof v === 'string' ? v.trim() === '' : isEmpty(v)))\n ? null\n : value\n } catch (err) {\n value = null\n }\n break\n case 'parameters':\n try {\n value = JSON.parse(value || 'null')\n } catch (err) {\n value = null\n }\n break\n case 'boolean':\n case 'checkbox':\n value = !!value && !!String(value).match(/true/i)\n break\n case 'number':\n case 'float':\n case 'integer':\n case 'progress':\n value = parseToNumberOrNull(value)\n break\n case 'string':\n try {\n const parsed = JSON.parse(value)\n /* ์ค๋ธ์ ํธ๋ฅผ ๋ฌธ์์ด ์
์ ๋ถ์ฌ๋ฃ์ ๋ ์
์ ํ์ ํ
์คํธ(textContent) ์ฐ์ ์ฌ์ฉ */\n if (typeof parsed === 'object' && parsed !== null) {\n value = item.textContent?.trim() || (parsed as any).name || ''\n } else {\n value = String(parsed).trim()\n }\n } catch (err) {}\n break\n case 'select':\n /* select ํ์
: ๋ถ์ฌ๋ฃ์ ํ
์คํธ๋ฅผ ์ต์
์ display/value์ ๋งค์นญํ์ฌ value๋ก ๋ณํ */\n value = resolveSelectPasteValue(String(value), targetColumn, targetRecord)\n break\n default:\n /* ์๋ณธ์ด string ์ผ๋ก ๋ณต์ฌ๋ ๊ฐ(color-map ๋ฑ JSON ๋ฌธ์์ด ์ ์ฅ ํ์
)์\n ํ์ฑํ์ง ์๊ณ ๋ฌธ์์ด ๊ทธ๋๋ก ์ ์ง */\n if (sourceType === 'string' && !item.dataset.value) {\n value = value?.trim()\n } else {\n try {\n value = JSON.parse(value)\n } catch (err) {\n if (type === 'json' || type.includes('object')) value = null\n }\n }\n }\n } else {\n /* ๊ธฐ์กด ๋ ์ฝ๋(id ์์)๋ ๋ช
์์ ์ผ๋ก ๋น์ฐ๊ธฐ ์ํด null, ์ ๊ท ๋ ์ฝ๋๋ default value ์ ์ฉ์ ์ํด undefined */\n value = targetRecord.id ? null : undefined\n }\n\n if (targetColumn && !targetColumn.gutterName && editable) {\n this.dispatchEvent(\n new CustomEvent('field-change', {\n bubbles: true,\n composed: true,\n detail: {\n before: targetRecord[targetColumn.name],\n after: value,\n column: targetColumn,\n record: targetRecord,\n row: row + rowIndex\n }\n })\n )\n }\n }\n }\n\n return\n } else if (type === 'text/plain') {\n /* TSV ํฌ๋งท ํ์ฑ: ์ค๋ฐ๊ฟ์ผ๋ก ํ ๋ถ๋ฆฌ, ํญ์ผ๋ก ์ด ๋ถ๋ฆฌ (์์
๋ฑ ์ธ๋ถ ์์ค ๋ถ์ฌ๋ฃ๊ธฐ ์ง์) */\n /* CRLF ์ ๊ทํ + ๋ง์ง๋ง ๋น ์ค ์ ๊ฑฐ (์์
TSV ๋ ๊ฐํ์ผ๋ก ๋๋๋ค. ๋น ํ์ด ์์ค ํฌ๊ธฐ ํ๋จ์ ๊นจ๋จ๋ฆฐ๋ค) */\n const tsvRows = content\n .replace(/\\r\\n/g, '\\n')\n .replace(/\\n$/, '')\n .split('\\n')\n .map(line => line.split('\\t'))\n if (!tsvRows.length) {\n return\n }\n\n /* ์์
์ ํ์ผ๋ง: ํ๊ฒ ์ ํ ์์ญ์ด ์์ค ํฌ๊ธฐ์ ์ ์๋ฐฐ์ด๋ฉด ๊ทธ ์ฐจ์์ผ๋ก ๋ฐ๋ณตํ๊ณ , ์๋๋ฉด ํ ๋ฒ๋ง ๋ถ์ฌ ๋ฃ๋๋ค (์ฐจ์๋ง๋ค ๋ฐ๋ก ํ๋จ) */\n const srcRows = tsvRows.length\n const srcCols = Math.max(...tsvRows.map(r => r.length))\n const repeatR = srcRows > 0 && tgtRows % srcRows === 0 ? tgtRows / srcRows : 1\n const repeatC = srcCols > 0 && tgtCols % srcCols === 0 ? tgtCols / srcCols : 1\n\n for (let rowOffset = 0; rowOffset < srcRows * repeatR; rowOffset++) {\n const targetRowIndex = row + rowOffset\n var targetRecord = records[targetRowIndex] || { __dirty__: '+' }\n if (targetRowIndex >= records.length) {\n records.push(targetRecord)\n }\n\n const tsvCells = tsvRows[rowOffset % srcRows]\n for (let colOffset = 0; colOffset < srcCols * repeatC; colOffset++) {\n const cellValue = tsvCells[colOffset % srcCols] ?? '' /* ragged row ๋ฐฉ์ด */\n const targetColumn = columns[column + colOffset]\n if (!targetColumn || targetColumn.gutterName) continue\n\n let { editable } = targetColumn.record\n if (typeof editable === 'function') {\n editable = editable.call(this, cellValue, targetColumn, targetRecord, targetRowIndex, this)\n }\n\n if (editable) {\n /* select ํ์
: ๋ถ์ฌ๋ฃ์ ํ
์คํธ๋ฅผ ์ต์
์ display/value์ ๋งค์นญํ์ฌ value๋ก ๋ณํ */\n /* ๋น๊ฐ: ๊ธฐ์กด ๋ ์ฝ๋(id ์์)๋ ๋ช
์์ ์ผ๋ก ๋น์ฐ๊ธฐ ์ํด null, ์ ๊ท ๋ ์ฝ๋๋ default value ์ ์ฉ์ ์ํด undefined */\n let resolvedValue: any = cellValue || (targetRecord.id ? null : undefined)\n if (targetColumn.type === 'select' && cellValue) {\n resolvedValue = resolveSelectPasteValue(cellValue, targetColumn, targetRecord)\n }\n\n this.dispatchEvent(\n new CustomEvent('field-change', {\n bubbles: true,\n composed: true,\n detail: {\n before: targetRecord[targetColumn.name],\n after: resolvedValue,\n column: targetColumn,\n record: targetRecord,\n row: targetRowIndex\n }\n })\n )\n }\n }\n }\n }\n } catch (e) {\n console.log('e : ', e)\n } finally {\n /* paste ์๋ฃ ํ ํฌ์ปค์ค๋ฅผ ๊ทธ๋ฆฌ๋๋ก ๋ณต์ */\n this.focus()\n }\n }\n\n setSelectBlock(start?: DataGridField, end?: DataGridField) {\n if (start?.columnIndex == -1) {\n start = this.getFieldByIndex(start.rowIndex, this.columns.filter(column => !column.hidden).length - 1)\n }\n\n if (end?.columnIndex == -1) {\n end = this.getFieldByIndex(end.rowIndex, this.columns.filter(column => !column.hidden).length - 1)\n }\n\n this._selectBlock = start && { start, end }\n\n if (start && end) {\n window.getSelection()?.removeAllRanges()\n\n if (start !== end) {\n const left = start.columnIndex < end.columnIndex ? start : end\n const right = left === start ? end : start\n const top = start.rowIndex < end.rowIndex ? start : end\n const bottom = top === start ? end : start\n\n const { offsetLeft } = left\n const { offsetTop } = top\n const width = right.offsetLeft - offsetLeft + right.offsetWidth\n const height = bottom.offsetTop - offsetTop + bottom.offsetHeight\n\n this.style.setProperty('--select-box-left', offsetLeft - 1 + 'px')\n this.style.setProperty('--select-box-top', offsetTop - 1 + 'px')\n this.style.setProperty('--select-box-width', width + 'px')\n this.style.setProperty('--select-box-height', height + 'px')\n }\n\n this.focus()\n }\n }\n\n buildAccumulatorRecord(): GristRecord {\n var columns = this.columns.filter(column => !column.hidden)\n\n return columns.reduce((record, column) => {\n if (column.accumulator) {\n record[column.name] = accumulate(this.data, column, column.accumulator)\n }\n return record\n }, {} as GristRecord)\n }\n\n /**\n * Which cell the IME buffer currently stands in for โ the name a screen reader reads.\n *\n * The name comes from the column definition alone (columnText). When focus is on no cell, or the\n * column yields no name, it falls back to \"cell input\" โ no invented name, and no empty one.\n */\n private _imeBufferLabel(column?: ColumnConfig): string {\n const name = columnText(column)\n\n return name\n ? i18next.t('text.grid-cell-input', { name, defaultValue: name })\n : i18next.t('text.grid-cell-input-plain', { defaultValue: 'cell input' })\n }\n\n /** IME buffer๋ฅผ ํฌ์ปค์ค๋ ์
์์ ์์น์ํจ๋ค */\n private _positionIMEBuffer() {\n const focusedEl = this.renderRoot?.querySelector('[focused]') as HTMLElement\n if (focusedEl && this._imeBuffer) {\n this._imeBuffer.style.left = focusedEl.offsetLeft + 'px'\n this._imeBuffer.style.top = focusedEl.offsetTop + 'px'\n this._imeBuffer.style.width = focusedEl.offsetWidth + 'px'\n this._imeBuffer.style.height = focusedEl.offsetHeight + 'px'\n }\n }\n\n /** IME buffer ๊ฐ์ field-change ์ด๋ฒคํธ๋ก ์ปค๋ฐํ๋ค */\n _commitIMEBuffer(row: number, column: number) {\n const text = this._imeBuffer?.value\n this._resetIMEBuffer()\n\n if (!text) return\n\n const columns = this.columns.filter(c => !c.hidden)\n const col = columns[column]\n if (!col || col.gutterName) return\n\n const record = this.data.records[row] || { __dirty__: '+' }\n\n let { editable } = col.record\n if (typeof editable === 'function') {\n editable = editable.call(this, record[col.name], col, record, row, this)\n }\n if (!editable) return\n\n /* ํ์
์ ๋ฐ๋ฅธ ๊ฐ ๋ณํ */\n let value: any = text\n switch (col.type) {\n case 'number':\n case 'float':\n case 'integer':\n case 'progress':\n value = parseToNumberOrNull(text)\n if (value === null) return\n break\n case 'boolean':\n case 'checkbox':\n return /* boolean์ ํค๋ณด๋ ํ
์คํธ ์
๋ ฅ์ผ๋ก ํธ์ง ๋ถ๊ฐ */\n }\n\n this.dispatchEvent(\n new CustomEvent('field-change', {\n bubbles: true,\n composed: true,\n detail: {\n before: record[col.name],\n after: value,\n column: col,\n record,\n row\n }\n })\n )\n }\n\n /** IME buffer ์ทจ์ (๊ฐ ๋ฒ๋ฆฌ๊ธฐ) */\n _discardIMEBuffer() {\n this._resetIMEBuffer()\n }\n\n /** IME buffer ์ด๊ธฐํ */\n private _resetIMEBuffer() {\n if (this._imeBuffer) {\n this._imeBuffer.value = ''\n this._imeBuffer.classList.remove('active')\n }\n this._imeEditing = false\n this._imeComposing = false\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"data-grid-body.js","sourceRoot":"","sources":["../../../src/data-grid/data-grid-body.ts"],"names":[],"mappings":"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","sourcesContent":["import './data-grid-field.js'\nimport './data-grid-accum-field.js'\n\nimport { css, html, LitElement, nothing, PropertyValues } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { ifDefined } from 'lit/directives/if-defined.js'\nimport debounce from 'lodash-es/debounce.js'\nimport isEmpty from 'lodash-es/isEmpty.js'\n\nimport { i18next } from '@operato/i18n'\nimport { sleep, parseToNumberOrNull, closestElement } from '@operato/utils'\n\nimport { ZERO_CONFIG, ZERO_DATA } from '../configure/zero-config.js'\nimport { RecordViewHandler } from '../record-view/record-view-handler.js'\nimport { ColumnConfig, GristConfig, GristData, GristRecord } from '../types.js'\nimport { columnText } from '../utils/column-text.js'\n// import { supportsPassive } from '../utils/index.js'\nimport { dataGridBodyStyle } from './data-grid-body-style.js'\nimport { DataGridField } from './data-grid-field.js'\nimport { dataGridBodyClickHandler } from './event-handlers/data-grid-body-click-handler.js'\nimport { dataGridBodyDblclickHandler } from './event-handlers/data-grid-body-dblclick-handler.js'\nimport { dataGridBodyFocusChangeHandler } from './event-handlers/data-grid-body-focus-change-handler.js'\nimport { dataGridBodyContextMenuHandler } from './event-handlers/data-grid-body-contextmenu-handler.js'\nimport { dataGridBodyKeydownHandler } from './event-handlers/data-grid-body-keydown-handler.js'\nimport { accumulate } from '../accumulator/accumulator.js'\n\nconst THRESHOLD = 300\nconst DATA_PADDING = 3\nconst ROW_HEIGHT = 40\nconst GAP_SIZE = 1\n\n/*\n * parent ๋ ์คํฌ๋กค๋ฌ๋ค. stickyTop ์ ๊ทธ ์์ชฝ์ ๋ถ์ด ์นธ์ ๊ฐ๋ฆฌ๋ ๋จธ๋ฆฌ์ ๋์ด๋ค โ ๋จธ๋ฆฌ ๋ฐ์ผ๋ก ๋ค์ด๊ฐ\n * ์นธ์ ํ๋ฉด ์์ ์์ด๋ ๋ณด์ด์ง ์์ผ๋ฏ๋ก ๊ทธ๋งํผ ๋ด๋ ค์ ํ๋จํ๋ค.\n */\nfunction calcScrollPos(parent: HTMLElement, child: Element, stickyTop = 0) {\n /* getBoundingClientRect๋ safari์์ ์คํฌ๋กค ์ํ์์ ๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ์๋ ๋ค๋ฅธ ๊ฐ์ ๋ฆฌํดํจ - ์ฌํ๋ฆฌ๋ ์ฝ๊ฐ ์ด์ ์๋ํจ. */\n var { top: ct, left: cl, right: cr, bottom: cb } = child.getBoundingClientRect()\n var { top: pt, left: pl, right: pr, bottom: pb } = parent.getBoundingClientRect()\n pt += stickyTop\n var { scrollLeft, scrollTop } = parent\n var scrollbarWidth = parent.clientWidth - parent.offsetWidth\n var scrollbarHeight = parent.clientHeight - parent.offsetHeight\n\n return {\n left: cl < pl ? scrollLeft - (pl - cl) : cr > pr ? scrollLeft - (pr - cr) - scrollbarWidth : undefined,\n top: ct < pt ? scrollTop - (pt - ct) : cb > pb ? scrollTop - (pb - cb) - scrollbarHeight : undefined\n }\n}\n\n/* select ํ์
๋ถ์ฌ๋ฃ๊ธฐ: display ๋๋ value ํ
์คํธ์ ๋งค์นญ๋๋ ์ต์
์ value๋ฅผ ๋ฐํ */\nfunction resolveSelectPasteValue(text: string, column: ColumnConfig, record: GristRecord): any {\n const rowOptionField = record[column.record?.rowOptionField || '']\n let { options = [] } = rowOptionField ? rowOptionField : column.record || {}\n\n /* options๊ฐ ํจ์์ธ ๊ฒฝ์ฐ ํธ์ถํ์ฌ ๋ฐฐ์ด์ ๊ฐ์ ธ์ด (arrow function์ด๋ฏ๋ก this๋ ์ ์ ์์ ์ ๋ฐ์ธ๋ฉ๋จ) */\n if (typeof options === 'function') {\n try {\n options = (options as Function)()\n } catch (e) {\n return undefined\n }\n }\n\n if (!Array.isArray(options)) {\n return undefined\n }\n\n const trimmed = String(text).trim()\n if (!trimmed) return undefined\n\n for (const opt of options) {\n if (typeof opt === 'string') {\n if (opt.trim() === trimmed) return opt\n } else if (opt && typeof opt === 'object') {\n const display = String((opt as any).display || (opt as any).name || '').trim()\n const val = String((opt as any).value ?? '').trim()\n if (display === trimmed || val === trimmed) return (opt as any).value\n }\n }\n\n return undefined\n}\n\nconst ZERO_FOCUS = {\n row: 0,\n column: 0\n}\n\n@customElement('ox-grid-body')\nexport class DataGridBody extends LitElement {\n debounce = debounce((scrollTop: number, clientHeight: number) => {\n const maxVisibleRows = Math.ceil(clientHeight / (ROW_HEIGHT + GAP_SIZE))\n const from = Math.max(0, Math.floor(scrollTop / (ROW_HEIGHT + GAP_SIZE)) - maxVisibleRows * DATA_PADDING)\n const to = Math.min(this.data.records?.length || 0, from + maxVisibleRows * (DATA_PADDING * 2 + 1))\n\n this.from = from\n this.to = to\n }, THRESHOLD)\n\n static styles = [\n dataGridBodyStyle,\n css`\n :host {\n font-variation-settings: 'FILL' 1;\n\n overscroll-behavior: none;\n user-select: none;\n }\n\n /*\n * ๋ณต์ฌ ๋ฒ์ ์์ โ ๋๋๊ทธ๋ก ์ก์ ๊ตฌ๊ฐ์ ๋๋ฅด๋ ์์.\n *\n * ์ ์๋ ์
์ด์ ํ์๊ณผ **๊ฐ์ ํ ํฐ**์ ์ผ๋ค. ๊ทธ๋์ ์กฐํ ์ ์ฉ ํ์์ ์
์ ์ ์ ์์ ๋ ค๊ณ ๊ทธ\n * ํ ํฐ์ none ์ผ๋ก ๋์์ ๋, **๋ฒ์๋ฅผ ์ก์๋ ์์๊ฐ ์ ๋ณด์๋ค** โ ํ์์ด ์๋๋ผ ๊ธฐ๋ฅ์ด ์ง์์ง\n * ๊ฒ์ด๋ค. ๋ฒ์๋ฅผ ์ก์๋ค๋ ๊ฒ์ ์๋ฆด ์ ์ผํ ํ์์๋ค.\n *\n * ๊ทธ๋์ ์๊ธฐ ํ ํฐ์ ์ค๋ค. ์ด๊ฒ์ ์กฐํ ํ์์๋ ์์ด์ผ ํ๋ค โ ๊ฐ์ ๋ณต์ฌํ๋ ์ผ์ ๊ณ ์น๋ ์ผ์ด\n * ์๋๋ค.\n */\n [select-block] {\n position: absolute;\n left: var(--select-box-left);\n top: var(--select-box-top);\n width: var(--select-box-width);\n height: var(--select-box-height);\n border: var(--grid-select-block-border, 1px solid var(--ui-accent, #00727e));\n background-image: var(--focused-background-image);\n pointer-events: none;\n\n z-index: 5;\n }\n\n [fixed] {\n position: sticky;\n background-color: var(--grid-record-background-color);\n z-index: 2; /* ๊ณ ์ ๋ ์ด์ ๋ค๋ฅธ ์ด ์์ ํ์. */\n }\n\n /*\n * โโ ๊ณ ์ ์ด์ ๋ถํฌ๋ช
์ **๋ค์ ์ธต์ ๊น์์ ์งํฌ ์ ์๋ค** โโโโโโโโโโโโโโ\n *\n * ์ด ์นธ์ ์คํฌ๋กค๋๋ ์ด ์์ ๋ ์์ด์(position: sticky) ํฌ๋ช
ํด์ง๋ฉด ๊ทธ ์๋๊ฐ ๋น์น๋ค.\n * ๊ทธ๋์ ํ๋ ์ฌ๊ธฐ์ ์ด๋ฐ ๊ฒ์ ๋์๋ค.\n *\n * [fixed]::before { position:absolute; inset:0; background-color: โฆ; z-index:-1 }\n *\n * **์ ๋๋ค.** ์์ z-index ์์์ ์๊ธฐ ์์์ **๋ฐฐ๊ฒฝ ์์** ๊ทธ๋ ค์ง๋ค(์นธ์ ๊ธ์ ์๋์ผ\n * ๋ฟ์ด๋ค). ๊ทธ๋์ ๊ทธ ์ธต์ด ์ค ์ํ์ ์์ ๋ฎ์๊ณ , ๋ง์ฐ์ค๋ฅผ ์ฌ๋ฆฐ ์ค์ ๋ ๊ฐ ๊ณ ์ ์ด์์๋ง\n * ์ฌ๋ผ์ก๋ค. ๊ทธ๋ ๋๋ ๊ณ์ฐ๋ background-color ๋ฅผ ์ฌ๊ณ ใ๊ฐ์ ์์ด๋คใ๋ผ๊ณ ํ๋๋ฐ, ์ฌ์ผ\n * ํ๋ ๊ฒ์ **์น ํด์ง ๊ฒ**์ด์๋ค.\n *\n * ๋ถํฌ๋ช
์ ๋ค๋ฅธ ๋ฐ์ ์งํจ๋ค โ **์ค ์ํ ์์ transparent ๋ก ๋์ง ์๋ ๊ฒ**์ด๋ค. ๊ทธ ๊ฐ์\n * ใ์น ํ์ง ์๋๋คใ๊ฐ ์๋๋ผ ใ์นธ์ ๋ฐํ์ ์ง์ด๋คใ์ด๊ณ , ์ง์์ง ์๋ฆฌ์๋ ๋ค๊ฐ ๋น์น๋ค.\n * ๊ณ ์น๋ ํ๊ฐ ๊ทธ๋ ๊ฒ ๋์๋ ๊ฒ์ ๊ฑท์๋ค(data-grid.ts).\n */\n\n :host([raised]) [fixed] {\n /* ๊ณ ์ ์ปฌ๋ผ์ด ์ด์ง ์ฌ๋ผ์ ์๋ ๋๋์ ํํ */\n box-shadow: 3px 0 3px rgba(0, 0, 0, 0.1);\n }\n\n ox-grid-accum-field {\n position: sticky;\n bottom: 0;\n z-index: 1;\n }\n\n ox-grid-accum-field[fixed] {\n background-color: var(--md-sys-color-primary-container);\n }\n\n @media (max-width: 768px) {\n /* ๋ชจ๋ฐ์ผ์์๋ ๊ทธ๋ฆฌ๋์์ ๊ณ ์ ๋ ์ด ํด์ */\n [fixed] {\n position: static;\n z-index: 0;\n box-shadow: none !important;\n }\n }\n\n @media (pointer: coarse) {\n /* ํฐ์น ๊ธฐ๊ธฐ์์๋ ๊ธธ๊ฒ ๋๋ฅด๋ฉด ํ
์คํธ๋ฅผ ์ ํํ ์ ์๊ฒ ๋๋ค */\n :host {\n user-select: auto;\n }\n }\n\n /* ํ๊ธ IME composition์ ์ํ ์จ๊ฒจ์ง input ๋ฒํผ โ ๊ธฐ์กด ์๋ํฐ ์
์คํ์ผ๊ณผ ์ผ์น */\n #ime-buffer {\n position: absolute;\n opacity: 0;\n z-index: 10;\n background-color: var(--grid-record-editing-background-color, var(--grid-record-background-color, #fff));\n color: var(--md-sys-color-on-background, inherit);\n font: inherit;\n font-size: var(--grid-record-wide-fontsize);\n border: 1px solid transparent;\n border-width: 1px 0;\n border-top: var(--grid-record-editing-border, none);\n border-bottom: var(--grid-record-editing-border, none);\n padding: var(--grid-record-padding);\n box-sizing: border-box;\n outline: none;\n overflow: hidden;\n pointer-events: none;\n }\n\n #ime-buffer.active {\n opacity: 1;\n pointer-events: auto;\n }\n `\n ]\n\n @property({ type: Object }) config: GristConfig = ZERO_CONFIG\n @property({ type: Array }) columns: ColumnConfig[] = []\n @property({ type: Object }) data: GristData = ZERO_DATA\n @property({ type: Object }) focused: { row: number; column: number } = ZERO_FOCUS\n /**\n * Where this body's first row sits in the whole table, counting from 1.\n *\n * It combines header row count and page offset, so ox-grid computes it and passes it down โ\n * working it out here would mean the body has to know whether the header is one row or two.\n */\n @property({ type: Number }) ariaRowIndexBase: number = 2\n @property({ type: Object }) editTarget: { row: number; column: number; valueWith: string | null } | null = null\n @property({ type: Number }) from = -1\n @property({ type: Number }) to = -1\n @property({ type: Array }) fixedLefts: number[] = []\n\n @state() _selectBlock?: {\n start: DataGridField\n end?: DataGridField\n }\n\n @query('[select-block]') selectBlock?: HTMLDivElement\n @query('ox-grid-field[focused]') focusedField?: DataGridField\n\n private _focusedListener?: (e: KeyboardEvent) => void\n private _recordView?: any\n private _recordViewRow?: number\n private _draggable?: boolean\n private _gridElement?: Element | null\n\n /* IME composition ์ง์์ ์ํ ์จ๊ฒจ์ง input ๋ฒํผ */\n private _imeBuffer?: HTMLInputElement\n _imeComposing: boolean = false\n _imeEditing: boolean = false\n _lastPointerTouch: boolean = false\n\n /* ํธ์ง ๊ฐ๋ฅํ ์
์ด ํ๋๋ผ๋ ์๋์ง โ ์์ผ๋ฉด(์ฝ๊ธฐ ์ ์ฉ ๊ทธ๋ฆฌ๋) IME ์
๋ ฅ ๋ฒํผ๋ก ํฌ์ปค์ค๋ฅผ ๋๊ธฐ์ง ์๋๋ค */\n private get _hasEditableColumn(): boolean {\n return this.columns.some(column => !column.hidden && !column.gutterName && !!column.record?.editable)\n }\n\n resetEdit() {\n this.editTarget = null\n }\n\n handleOnScroll(e: WheelEvent) {\n const { scrollTop, clientHeight } = e.target as HTMLElement\n this.debounce(scrollTop, clientHeight)\n }\n\n // issue #13\n // renderOptimisticRow() {\n // return\n // }\n\n render() {\n // block์ด ์ ํ๋์ด ์์ผ๋ฉด, focused row/column์ ํํํ์ง ์๋๋ค.\n var { row: focusedRow, column: focusedColumn } = (!this._selectBlock && this.focused) || {}\n var { row: editingRow, column: editingColumn, valueWith = null } = this.editTarget || {}\n\n var columns = this.columns.filter(column => !column.hidden)\n var data = this.data\n var { records } = data\n var { appendable, classifier, accumulator } = this.config.rows\n const { start, end } = this._selectBlock || {}\n\n /*\n * Only emit aria-selected where rows can actually be selected.\n *\n * The attribute means \"selectable, currently not selected\", so putting false on every row of a\n * grid without selection announces a control that is not there. Whether selection exists is\n * something the grid already knows: it has a row-selector gutter or it does not.\n */\n const selectable = columns.some(column => column.gutterName === 'row-selector')\n\n /*\n * ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ ์ ์๋ ๊ฒฝ์ฐ์๋ ํญ์ ์ถ๊ฐ ๋ ์ฝ๋๋ฅผ ๋ณด์ฌ์ค๋ค.\n * ๋ง์ฝ, ์ด์ ๋ฐฉ์์ฒ๋ผ, ์ปค์๋ฅผ ์ฎ๊ฒจ์ผ๋ง ์๋ก์ด ๋ ์ฝ๋๊ฐ ๋ณด์ด๊ฒ ํ๊ณ ์ถ๋ค๋ฉด, ์กฐ๊ฑด๋ถ๋ฅผ ๋ค์์ ์ฝ๋๋ก ๋์ฒดํ๋ค.\n * -- if (focusedRow == records.length)\n */\n if (appendable) {\n records = [...records, { __dirty__: '+' }]\n }\n\n if (accumulator) {\n var accumRecord = this.buildAccumulatorRecord()\n }\n\n /*\n * aria-rowindex is the position in the whole table, not within the page on screen. The first\n * row of page 2 is row 22, not row 1 again โ otherwise every page turn resets the count and\n * there is no way to tell how far through the data you are.\n *\n * Header rows count too, from 1. With a grouped header that is two rows, so the body starts\n * at 3.\n */\n const rowIndexBase = this.ariaRowIndexBase\n\n return html`\n ${records.map((record, idxRow) => {\n var attrFocusedRow = idxRow === focusedRow\n var attrSelected = record['__selected__']\n var attrOdd = idxRow % 2\n var dirtyFields = record['__dirtyfields__'] || {}\n var { emphasized } = classifier.call(null, record, idxRow) || {}\n\n return html`\n <div\n grid-row\n role=\"row\"\n aria-rowindex=${rowIndexBase + idxRow}\n aria-selected=${ifDefined(selectable ? !!attrSelected : undefined)}\n >\n ${columns.map(\n (column, idxColumn) => html`\n <ox-grid-field\n id=${'cell-' + idxRow + '-' + idxColumn}\n role=\"gridcell\"\n aria-colindex=${idxColumn + 1}\n .data=${data}\n .type=${column.type}\n .rowIndex=${idxRow}\n .columnIndex=${idxColumn}\n .column=${column}\n .record=${record}\n .checked=${record.__selected__ ? 'checked' : record.__check_in_tree__}\n .emphasized=${emphasized}\n ?multiline=${!!column.multiline}\n ?gutter=${column.type == 'gutter'}\n ?odd=${attrOdd}\n ?focused-row=${attrFocusedRow}\n ?selected-row=${attrSelected}\n ?focused=${idxRow === focusedRow && idxColumn === focusedColumn}\n ?editing=${idxRow === editingRow && idxColumn === editingColumn}\n .valueWith=${valueWith}\n .value=${record[column.name]}\n ?dirty=${!!dirtyFields[column.name]}\n fixed=${ifDefined(this.fixedLefts[idxColumn])}\n ></ox-grid-field>\n `\n )}\n <!--\n Width filler โ nothing to read. It stays inside the row so hover and selection colour it\n with the rest, but it is not counted as a cell.\n -->\n <ox-grid-field\n role=\"presentation\"\n .data=${data}\n .rowIndex=${idxRow}\n .columnIndex=${-1}\n .record=${record}\n .emphasized=${emphasized}\n ?odd=${attrOdd}\n ?focused-row=${attrFocusedRow}\n ?selected-row=${attrSelected}\n ></ox-grid-field>\n </div>\n `\n })}\n ${accumulator\n ? html`\n <div grid-row role=\"row\" aria-rowindex=${rowIndexBase + records.length}>\n ${columns.map(\n (column, idxColumn) => html`\n <ox-grid-accum-field\n role=\"gridcell\"\n aria-colindex=${idxColumn + 1}\n .data=${data}\n .columnIndex=${idxColumn}\n .rowIndex=${records.length}\n .column=${column}\n .record=${accumRecord!}\n .value=${accumRecord[column.name]}\n fixed=${ifDefined(this.fixedLefts[idxColumn])}\n ></ox-grid-accum-field>\n `\n )}\n <ox-grid-accum-field\n role=\"presentation\"\n .data=${data}\n .columnIndex=${-1}\n .rowIndex=${records.length}\n .record=${accumRecord!}\n ></ox-grid-accum-field>\n </div>\n `\n : nothing}\n ${start && end && start !== end ? html` <div select-block></div> ` : html``}\n <!--\n This input takes the grid's keystrokes. Focus rests here until a cell opens for editing, and\n IME composition builds up in it โ this is where focus actually lives.\n\n It had no name. opacity: 0 makes that look harmless, but invisible is not the same as absent:\n it receives focus and receives text, so a screen reader reads it. Unnamed, it reads as one\n \"edit text\" and never changes, no matter how far the arrow keys travel โ there is no way to\n tell which cell you are on.\n\n aria-hidden is not the fix. Hiding the thing that holds focus makes focus vanish into\n nothing. Instead of hiding it, name it after the cell it currently stands in for.\n -->\n <input\n id=\"ime-buffer\"\n type=\"text\"\n aria-label=${this._imeBufferLabel(columns[focusedColumn as number])}\n aria-activedescendant=${ifDefined(\n focusedRow! >= 0 && focusedColumn! >= 0 ? `cell-${focusedRow}-${focusedColumn}` : undefined\n )}\n />\n <slot></slot>\n `\n }\n\n firstUpdated() {\n // TODO issue #13\n // this.addEventListener('scroll', this.handleOnScroll.bind(this))\n\n /* ์นธ์ ํ์
ํ์์ ๋๋ฅด๋ฉด ๊ทธ ์นธ์ ํธ์ง์ ์ฐ๋ค(onStartEdit). */\n this.addEventListener('start-edit', this.onStartEdit.bind(this))\n\n /* focus() ๋ฅผ ๋ฐ์ ์ ์๋๋ก ํจ. */\n this.setAttribute('tabindex', '-1')\n\n /* ํ๊ธ IME composition์ ์ํ ์จ๊ฒจ์ง input ๋ฒํผ ์ค์ */\n const imeBuffer = this.renderRoot.querySelector('#ime-buffer') as HTMLInputElement\n this._imeBuffer = imeBuffer\n\n imeBuffer.addEventListener('compositionstart', () => {\n this._imeComposing = true\n this._imeEditing = true\n imeBuffer.classList.add('active')\n this._positionIMEBuffer()\n })\n\n imeBuffer.addEventListener('compositionend', () => {\n this._imeComposing = false\n })\n\n imeBuffer.addEventListener('input', () => {\n if (!this._imeComposing && !this._imeEditing && imeBuffer.value) {\n /* ์์ด/์ซ์: ์ค์ ๊ฐ์ด ์
๋ ฅ๋ ๊ฒฝ์ฐ์๋ง ํ์ฑํ */\n this._imeEditing = true\n imeBuffer.classList.add('active')\n this._positionIMEBuffer()\n }\n })\n\n /*\n * focusout ์ผ๋ก property๋ฅผ ๋ณ๊ฒฝ์ํค๋ ๊ฒฝ์ฐ, focusout์ ์ํด update๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ์๋,\n * ๊ทธ๋ฆฌ๋ ๋ด๋ถ์ ์ปดํฌ๋ํธ๊ฐ ๊ฐฑ์ ๋๋ ํ์์ ์ด๋ํ๊ฒ ๋๋ค.\n * ๋ฐ๋ผ์, focusout ํธ๋ค๋ฌ์์ update๋ฅผ ์ ๋ฐํ๋ ์ฝ๋๋ ๊ฐ๋ ฅํ๊ฒ ๊ธ์ง์ํจ๋ค.\n */\n this.addEventListener('focusout', e => {\n /* IME buffer๋ก ํฌ์ปค์ค๊ฐ ์ด๋ํ๋ ๊ฒฝ์ฐ keydown listener ์ ์ง */\n const related = (e as FocusEvent).relatedTarget as Node\n if (related && this.shadowRoot?.contains(related)) {\n return\n }\n\n /* ๊ทธ๋ฆฌ๋ ์ธ๋ถ๋ก ํฌ์ปค์ค ์ด๋ ์ IME buffer ์ปค๋ฐ */\n if (this._imeEditing) {\n const { row = 0, column = 0 } = this.focused || {}\n this._commitIMEBuffer(row, column)\n }\n\n if (this._focusedListener) {\n this.removeEventListener('keydown', this._focusedListener)\n delete this._focusedListener\n }\n })\n\n this.addEventListener('focusin', e => {\n if (!this._focusedListener) {\n this._focusedListener = dataGridBodyKeydownHandler.bind(this)\n this.addEventListener('keydown', this._focusedListener)\n }\n })\n\n this.addEventListener('set-select-block', async e => {\n e.stopPropagation()\n\n const { startRow = -1, startColumn = -1, endRow = -1, endColumn = -1 } = ((e as CustomEvent).detail as any) || {}\n\n const start = this.getFieldByIndex(startRow, startColumn) as DataGridField\n const end = this.getFieldByIndex(endRow, endColumn) as DataGridField\n\n this.setSelectBlock(start, end)\n })\n\n this.renderRoot.addEventListener('contextmenu', (event: Event) => {\n const e = event as MouseEvent\n this.setSelectBlock()\n\n this._draggable = false\n\n var target = (e.target as Element).closest('ox-grid-field') as DataGridField\n var { rowIndex, columnIndex } = target || {}\n\n this.dispatchEvent(\n new CustomEvent('focus-change', {\n bubbles: true,\n composed: true,\n detail: {\n row: rowIndex,\n column: columnIndex\n }\n })\n )\n })\n\n this.renderRoot.addEventListener('pointerdown', (e: Event) => {\n const pe = e as PointerEvent\n const isTouch = pe.pointerType === 'touch'\n\n /* ํฐ์น ์ด๋ฒคํธ ์ฌ๋ถ ๊ธฐ๋ก โ ํ๋ธ๋ฆฟ์์ input focus๋ก ๊ฐ์ ํค๋ณด๋๊ฐ ๋จ๋ ๊ฒ์ ๋ฐฉ์ง */\n this._lastPointerTouch = isTouch\n\n /* ํด๋ฆญ ์ IME buffer๊ฐ ํ์ฑ ์ํ๋ฉด ๋จผ์ ์ปค๋ฐ */\n if (this._imeEditing) {\n const { row = 0, column = 0 } = this.focused || {}\n this._commitIMEBuffer(row, column)\n }\n\n this.setSelectBlock()\n\n if (isTouch) {\n /* ํฐ์น: click ์ด๋ฒคํธ์์ ์ฒ๋ฆฌ (์คํฌ๋กค ์์๋ click์ด ๋ฐ์ํ์ง ์์) */\n return\n }\n\n if ('buttons' in e && pe.buttons !== 1) {\n return\n }\n\n e.preventDefault()\n e.stopPropagation()\n\n this._draggable = true\n\n var target = (e.target as Element).closest('ox-grid-field') as DataGridField\n var { rowIndex, columnIndex } = target || {}\n\n this.dispatchEvent(\n new CustomEvent('focus-change', {\n bubbles: true,\n composed: true,\n detail: {\n row: rowIndex,\n column: columnIndex\n }\n })\n )\n\n if (columnIndex >= 0 && target.editableOnClick && !isNaN(rowIndex) && !isNaN(columnIndex)) {\n this.startEditTarget(rowIndex, columnIndex)\n }\n })\n\n this.renderRoot.addEventListener('pointermove', (event: Event) => {\n const e = event as PointerEvent\n if (('buttons' in e && e.buttons !== 1) || !this._draggable) {\n return\n }\n\n e.preventDefault()\n e.stopPropagation()\n\n const field = e.target as DataGridField\n if (!this._selectBlock) {\n this.setSelectBlock(this.focusedField || field, this.focusedField || field)\n\n return\n }\n\n var { start, end } = this._selectBlock || {}\n\n if (start && end !== field) {\n end = field\n\n this.setSelectBlock(start, end)\n }\n })\n\n this.renderRoot.addEventListener('pointerup', (event: Event) => {\n if ((event as PointerEvent).pointerType !== 'touch') {\n event.preventDefault()\n event.stopPropagation()\n }\n\n this._draggable = false\n })\n\n /*\n * โโ ๋ง์ฐ์ค๊ฐ ์ง๋๋ ์ค์ ํ์ํ๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ฝ๊ธฐ ์ ์ฉ ํ์๋ ์ง๊ธ ์ด๋ ์ค์ ์๋์ง ์๋ ค ์ฃผ๋ ๊ฒ์ด ์๋ฌด๊ฒ๋ ์๋ค. ๊ณ ์น๋ ํ์๋ ์ ์ ์
\n * ํ
๋๋ฆฌ๊ฐ ๊ทธ ์ผ์ ํ์ง๋ง ์ฝ๊ธฐ ์ ์ฉ์๋ ๊ทธ๊ฒ๋ ์์ด์, ์นธ์ด ์ฌ๋์ด๋ฉด ๋์ด ๊ฐ๋ก๋ก ๊ฐ๋ค ์ค์ ๋์น๋ค.\n *\n * ์ค์๋ ๊ฐ์ธ๋ ์์๊ฐ ์๋ค โ ์
์ด ๊ฐ๊ฐ ๊ฒฉ์ ํญ๋ชฉ์ด๋ค. ๊ทธ๋์ CSS ๋ง์ผ๋ก๋ ใ๊ฐ์ ์คใ์ ๊ฐ๋ฆด ์\n * ์๊ณ , ์ด๋ฏธ ์๋ ๋ฐฉ์(selected-row)์ฒ๋ผ ๊ทธ ์ค์ ์
๋ง๋ค ํ์์ ๋ถ์ธ๋ค.\n *\n * ๋ค์ ๊ทธ๋ฆฌ์ง ์๊ณ ์์ฑ๋ง ๋ฐ๊พผ๋ค. ์ค์ด ๋ฐ๋ ๋๋ง๋ค ๋ชธ ์ ์ฒด๋ฅผ ๋ค์ ๊ทธ๋ฆฌ๋ฉด ํฐ ํ์์ ๋๋ฆฐ๋ค.\n */\n this.renderRoot.addEventListener('pointerover', (event: Event) => {\n if ((event as PointerEvent).pointerType === 'touch') {\n return\n }\n\n const field = (event.target as Element)?.closest?.('ox-grid-field') as DataGridField\n this.setHoveredRow(field ? field.rowIndex : -1)\n })\n\n /*\n * ํ๋ฅผ ๋ฒ์ด๋๋ฉด ์ง์ด๋ค โ ๋จ๊ฒจ ๋๋ฉด ๋ง์ง๋ง ์ค์ด ๊ณจ๋ผ์ง ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค.\n *\n * **์์์ ๋ถ์ธ๋ค.** renderRoot ๋ ShadowRoot ์ด๊ณ pointerleave ๋ ์์์ ๊ฐ๋ ์ฌ๊ฑด์ด๋ผ ๊ฑฐ๊ธฐ์๋\n * ์ ๋จน์๋ค. [ํ์ธํจ] ํ๋ฅผ ๋ฒ์ด๋ ๋ค์๋ ํ์ 8๊ฐ๊ฐ ๋จ์ ์์๋ค. 2026-09-02\n */\n this.addEventListener('pointerleave', () => this.setHoveredRow(-1))\n\n this.renderRoot.addEventListener('click', dataGridBodyClickHandler.bind(this))\n this.renderRoot.addEventListener('dblclick', dataGridBodyDblclickHandler.bind(this))\n this.renderRoot.addEventListener('contextmenu', dataGridBodyContextMenuHandler.bind(this))\n\n this.addEventListener('focus-change', dataGridBodyFocusChangeHandler.bind(this))\n\n requestAnimationFrame(() => {\n // 1. ๊ณต๋ฐฑ ์ฐ๊บผ๊ธฐ๊ฐ ๋ค์ด๊ฐ ์ ์์ผ๋ฏ๋ก .trim()์ผ๋ก ๊น๋ํ๊ฒ ์ฒ๋ฆฌ\n const primaryColor = getComputedStyle(this).getPropertyValue('--md-sys-color-primary').trim()\n // 2. ๊ฐ๋
์ฑ์ ์ํด svg ๋ฌธ์์ด ์กฐ๋ฆฝ ๋ถ๋ฆฌ\n const svgString = `<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10'><rect fill='${primaryColor}' fill-opacity='0.2' x='0' y='0' width='100%' height='100%'/></svg>`\n\n // 3. Hex ์ฝ๋์ '#' ๊ธฐํธ ๋ฐ '< >' ๊ดํธ๋ค์ด ํ์๋ฅผ ๊นจ๋จ๋ฆฌ๋ ๊ฒ์ ์๋ฒฝ ๋ฐฉ์งํ๊ธฐ ์ํด ์ ์ฒด ์ธ์ฝ๋ฉ\n const encodedSvg = encodeURIComponent(svgString)\n this.style.setProperty(\n '--focused-background-image',\n // 4. ๋นํ์ค์ธ ;utf8 ํ๊ทธ๋ฅผ ๋ผ์ด๋ด๊ณ , ์ธ์ฝ๋ฉ๋ SVG ๋ฐ์ดํฐ๋ฅผ ์ฃผ์
\n `url(\"data:image/svg+xml,${encodedSvg}\")`\n )\n })\n\n this.addEventListener('show-record-view', (e: Event) =>\n this.popupRecordView((e as CustomEvent).detail as { row: number; record: GristRecord })\n )\n\n }\n\n /*\n * ๋ชธ์ ์ฎ๊ธฐ๋ ์คํฌ๋กค๋ฌ. ํ ์์์๋ ๋จธ๋ฆฌ์ ๋ชธ์ ํจ๊ป ๋ด์ div[grid] ์ด๊ณ (data-grid.ts), ๋ชธ๋ง ํ๋ก\n * ์ธ์ ์ ๋๋ ๋ชธ ์์ ์ด๋ค.\n */\n get scroller(): HTMLElement {\n return (this.closest('div[grid]') as HTMLElement | null) || this\n }\n\n connectedCallback() {\n super.connectedCallback()\n // ํค๋๊ฐ ox-grist์ ๋์คํจ์นํ๋ fetch-params-change ์ด๋ฒคํธ ์์ \n this._gridElement = closestElement('ox-grist', this)\n this._gridElement?.addEventListener('fetch-params-change', this._onFetchParamsChange)\n }\n\n disconnectedCallback() {\n if (this._gridElement) {\n this._gridElement.removeEventListener('fetch-params-change', this._onFetchParamsChange)\n }\n super.disconnectedCallback()\n }\n\n // ๊ฒ์์ ์คํฌ๋กค ๋งจ ์๋ก\n _onFetchParamsChange: EventListener = () => {\n this.scroller.scrollTop = 0\n }\n\n private _hoveredRow = -1\n\n /** ์ง๋๋ ์ค์ ์ฎ๊ธด๋ค. ๊ฐ์ ์ค์ด๋ฉด ์๋ฌด๊ฒ๋ ํ์ง ์๋๋ค. */\n private setHoveredRow(rowIndex: number) {\n if (rowIndex === this._hoveredRow) {\n return\n }\n\n this.markRow(this._hoveredRow, false)\n this.markRow(rowIndex, true)\n\n this._hoveredRow = rowIndex\n }\n\n /**\n * One row โ the element holding that row's cells.\n *\n * This used to index `renderRoot.children` at `rowIndex * (columns + 1)`, where the +1 was the\n * width filler; the comment above it existed to explain why that arithmetic was necessary. The\n * code only worked while the count stayed correct.\n *\n * Rows are real elements now (role=row), so there is nothing to count.\n */\n private rowElementAt(rowIndex: number): HTMLElement | null {\n if (rowIndex < 0) {\n return null\n }\n\n return this.renderRoot?.querySelectorAll('div[grid-row]').item(rowIndex) as HTMLElement | null\n }\n\n private markRow(rowIndex: number, on: boolean) {\n const row = this.rowElementAt(rowIndex)\n\n if (!row) {\n return\n }\n\n /*\n * Mark every cell in the row, width filler included. It used to be left out, so on a grid\n * narrower than the viewport the right end of the row stayed uncoloured.\n */\n Array.from(row.children).forEach(cell => cell.toggleAttribute('hovered-row', on))\n }\n\n getFieldByIndex(rowIndex: number, columnIndex: number, residue: boolean = true) {\n const row = this.rowElementAt(rowIndex)\n\n if (!row) {\n return\n }\n\n var columns = this.columns.filter(column => !column.hidden).length\n if (!residue && columnIndex >= columns) {\n return\n }\n\n /* Column index wraps: moving right from the last column returns to the first (residue). */\n return row.children.item((columnIndex + columns) % columns) as DataGridField\n }\n\n /**\n * ์นธ์ **ํ์
ํ์**์ ๋๋ ๋ค โ ๊ทธ ์นธ์ ํธ์ง์ ์ฐ๋ค.\n *\n * ๋๋ธํด๋ฆญ๊ณผ ๊ฐ์ ์๋ฆฌ๋ก ๋ค์ด๊ฐ๋ค. ํ์์ ํ ๋ฒ ๋๋ฅด๋ 22px ํ์ ์ด๊ณ , 33px ์ค์์ ๋๋ธํด๋ฆญ์\n * ๊ฒจ๋๋ ๊ฒ๋ณด๋ค ์ฝ๋ค. ๋๋ธํด๋ฆญ๋ ๊ทธ๋๋ก ๋๋ค โ ์ด๋ฏธ ์๋ ์ฌ๋์ ๊ธธ์ ๋ง์ง ์๋๋ค.\n */\n private onStartEdit(e: Event) {\n const { row, column } = (e as CustomEvent).detail || {}\n\n if (isNaN(row) || isNaN(column)) {\n return\n }\n\n this.startEditTarget(row, column)\n }\n\n startEditTarget(row: number, column: number, valueWith: string | null = null) {\n var { editable } = this.columns.filter(column => !column.hidden)[column].record\n if (typeof editable === 'function') {\n const curRow = this.data.records[row] || {}\n const curCol = this.columns[column + 1]\n editable = editable.call(this, curRow[curCol.name], curCol, curRow, row, this)\n }\n\n if (!editable) {\n return\n }\n\n if (this.editTarget && this.editTarget.row == row && this.editTarget.column == column) {\n return\n }\n\n /* ์๋ํฐ ํธ์ง ์ ํ ์ IME buffer ์ ๋ฆฌ */\n this._resetIMEBuffer()\n\n this.editTarget = {\n row,\n column,\n valueWith\n }\n }\n\n shouldUpdate(changes: any) {\n if (!changes.has('editTarget')) {\n /*\n * ํฐ ๋ณํ์ ๋ํด์๋ ์ค์ update๊ฐ ๋ฐ์๋๊ธฐ ์ ์ editTarget์ ์ด๊ธฐํํ๋ค.\n */\n this.editTarget = null\n }\n\n return super.shouldUpdate(changes)\n }\n\n updated(changes: PropertyValues<this>) {\n if (changes.has('focused')) {\n let element = this.renderRoot?.querySelector('[focused]')\n if (!element) {\n return\n }\n\n const scroller = this.scroller\n const header = scroller === this ? null : (scroller.querySelector('ox-grid-header') as HTMLElement | null)\n let { top, left } = calcScrollPos(scroller, element, header?.offsetHeight || 0)\n // TODO this.scroll()์ ์ฌ์ฉํ๋ฉด, ํจ๊ณผ๊ฐ ์ข์ผ๋ left ๊ณ์ฐ์ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ ๊ฐ์.\n // this.scroll({\n // top,\n // left,\n // behavior: 'smooth'\n // })\n if (top !== undefined) {\n scroller.scrollTop = top\n }\n if (left !== undefined) {\n scroller.scrollLeft = left\n }\n\n /* IME buffer ์์น ์
๋ฐ์ดํธ */\n this._positionIMEBuffer()\n if (!this.editTarget && this._imeBuffer && !this._lastPointerTouch && this._hasEditableColumn) {\n this._imeBuffer.focus()\n }\n }\n\n // ํ์ด์ง ๋ฐ๋๋ฉด ์คํฌ๋กค ๋งจ ์๋ก\n if (changes.has('data')) {\n const prevData = changes.get('data') as GristData | undefined\n const prevPage = prevData && (prevData as any).page\n const currPage = (this.data as any).page\n if (prevPage !== undefined && prevPage !== currPage) {\n this.scroller.scrollTop = 0\n }\n }\n\n if (this._recordView) {\n this._recordView.record = this.data.records[this._recordViewRow!]\n }\n }\n\n focus() {\n if (this.editTarget) {\n /* ์๋ํฐ ํธ์ง ๋ชจ๋์์๋ ์๋ํฐ๊ฐ ์์ฒด์ ์ผ๋ก ํฌ์ปค์ค๋ฅผ ๊ด๋ฆฌํ๋ฏ๋ก ๊ฐ์ญํ์ง ์๋๋ค */\n return\n }\n\n if (this._imeBuffer && !this._lastPointerTouch && this._hasEditableColumn) {\n /* ๋นํธ์ง ๋ชจ๋์์๋ IME buffer๋ก ํฌ์ปค์ค ๋ฆฌ๋ค์ด๋ ํธ (ํฐ์น ์/์ฝ๊ธฐ ์ ์ฉ ๊ทธ๋ฆฌ๋์์๋ ์ ์ธ) */\n this._positionIMEBuffer()\n this._imeBuffer.focus()\n } else {\n super.focus()\n }\n\n if (this.focused === ZERO_FOCUS) {\n let { records } = this.data\n let row = records.findIndex(record => record['__selected__'])\n\n this.focused = { row: row == -1 ? 0 : row, column: 0 }\n }\n }\n\n popupRecordView({ record, row }: { row: number; record: GristRecord }) {\n var titleField = this.config.list.fields[0] || 'name'\n var title = record[titleField]\n\n /* field๊ฐ ์ค๋ธ์ ํธํ์ธ ๊ฒฝ์ฐ์๋ ๋ ๋๋ฌ๋ฅผ ํ์ดํ๋ก ์ฌ์ฉํ๋ค. */\n if (typeof title == 'object') {\n var column = this.config.columns.find(column => column.name == titleField)\n title = column?.record.renderer(title, column, record, row, this /* cautious */)\n }\n\n this._recordViewRow = row\n this._recordView = RecordViewHandler(\n this.config.columns,\n record,\n row,\n this,\n {\n title\n },\n () => {\n delete this._recordView\n delete this._recordViewRow\n }\n )\n }\n\n /* ์ ํ๋ ์
๋ธ๋ก์ ๊ฐ์ HTML(table)๊ณผ plain text(TSV) ๋ ๊ฐ์ง ํฌ๋งท์ผ๋ก ๋ฐํ */\n getSelectedBlockValues(): { html: string; text: string } | undefined {\n var { start, end } = this._selectBlock || {}\n\n if (!(start && end)) {\n start = this.focusedField\n\n end = start\n }\n\n if (start && end) {\n const startRowIndex = start.rowIndex < end.rowIndex ? start.rowIndex : end.rowIndex\n const endRowIndex = start.rowIndex < end.rowIndex ? end.rowIndex : start.rowIndex\n const startColumnIndex = start.columnIndex < end.columnIndex ? start.columnIndex : end.columnIndex\n const endColumnIndex = start.columnIndex < end.columnIndex ? end.columnIndex : start.columnIndex\n\n const columnArray = new Array(endColumnIndex - startColumnIndex + 1).fill(startColumnIndex)\n const columns = this.columns.filter(column => !column.hidden)\n\n /*\n * ํด๋ฆฝ๋ณด๋์ ๋ ๊ฐ์ง ํฌ๋งท(text/html, text/plain)์ ๋์์ ์ ์ฅํ๋ค.\n * ๋ถ์ฌ๋ฃ๊ธฐํ๋ ์ฑ์ด ์์ ์ด ์ง์ํ๋ ํฌ๋งท์ ๊ณจ๋ผ ์ฝ๋๋ค.\n * ์์ฑ๋๋ HTML:\n * <td type=object data-value=\"{"id":...}\">ํ์ ์ ์๋ฐฐ์ถ</td>\n * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^\n * ๊ทธ๋ฆฌ๋๋ง ์ฝ๋ ์จ๊ฒจ์ง JSON Excel/๋ฉ๋ชจ์ฅ์ด ๋ณด๋ ํ
์คํธ\n */\n const rows = new Array(endRowIndex - startRowIndex + 1).fill(startRowIndex).map((start, index) => {\n const rowIndex = start + index\n const record = this.data.records[rowIndex]\n\n const cells = columnArray.map((start, index) => {\n const columnIndex = start + index\n const column = columns[columnIndex]\n const value = record?.[column.name]\n const type = typeof value\n\n /* select ํ์
: value โ display ํ
์คํธ ๋ฏธ๋ฆฌ ๊ณ์ฐ (htmlText/plainText ๊ณต์ฉ) */\n let selectDisplay: any = value\n if (column.type === 'select' && value !== undefined && value !== null) {\n const src = record[column.record?.rowOptionField || ''] ?? column.record\n const options: any[] = Array.isArray(src?.options) ? src.options : []\n const opt = options.find((o: any) => (typeof o === 'string' ? o : String(o?.value ?? '')).trim() === String(value).trim())\n selectDisplay = opt ? (typeof opt === 'string' ? opt : opt.display || opt.name || value) : value\n }\n\n /* htmlText: object๋ JSON ๋ฌธ์์ด๋ก ๋ณด์กด(data-value) โ ๊ทธ๋ฆฌ๋ ๋ถ์ฌ๋ฃ๊ธฐ ์ ๋ณต์๋จ. select๋ display ํ
์คํธ */\n const htmlText = value === undefined || value === null ? '' : type == 'object' ? JSON.stringify(value) : column.type === 'select' ? selectDisplay : value\n\n /* plainText: โ null/undefined โ renderer โก object โ name โ renderer โข select โ display โฃ ๊ธฐํ โ ๊ฐ ๊ทธ๋๋ก */\n let plainText: any = ''\n if (value === undefined || value === null) {\n /* ๊ฐ์ด ์์ง๋ง renderer๊ฐ record์ ๋ค๋ฅธ ๊ฒฝ๋ก๋ก ํ
์คํธ๋ฅผ ํ์ํ ์ ์์ */\n if (column.record?.renderer) {\n try {\n const r = column.record.renderer(value, column, record, rowIndex, null as any)\n if (typeof r === 'string') plainText = r\n } catch (e) {}\n }\n } else if (type == 'object') {\n /* object: name ํ๋๊ฐ ๋ฌธ์์ด์ธ ๊ฒฝ์ฐ ์ฐ์ , ์์ผ๋ฉด renderer */\n const rawName = (value as any)?.name\n plainText = typeof rawName === 'string' ? rawName : ''\n if (!plainText && column.record?.renderer) {\n try {\n const r = column.record.renderer(value, column, record, rowIndex, null as any)\n if (typeof r === 'string') plainText = r\n } catch (e) {}\n }\n } else if (column.type === 'select') {\n plainText = selectDisplay\n } else {\n plainText = value\n }\n\n /* ์์ ์ฅ์น: plainText๊ฐ object์ด๋ฉด ๋น ๋ฌธ์์ด๋ก ๋์ฒดํ์ฌ [object Object] ๋ฐฉ์ง */\n if (plainText !== null && plainText !== undefined && typeof plainText === 'object') {\n plainText = ''\n }\n\n return { type, htmlText, plainText }\n })\n\n return cells\n })\n\n const escapeHtml = (unsafe: any) => {\n if (unsafe == null) return ''\n return String(unsafe).replace(/[&<>\"']/g, function (m) {\n switch (m) {\n case '&':\n return '&'\n case '<':\n return '<'\n case '>':\n return '>'\n case '\"':\n return '"'\n case \"'\":\n return '''\n default:\n return m\n }\n })\n }\n\n const html =\n '<table>' +\n rows\n .map(\n cells =>\n '<tr>' +\n cells\n .map(c =>\n c.type == 'object' && c.htmlText\n ? `<td type=${c.type} data-value=\"${escapeHtml(c.htmlText)}\">${escapeHtml(c.plainText)}</td>`\n : `<td type=${c.type}>${escapeHtml(c.htmlText)}</td>`\n )\n .join('') +\n '</tr>'\n )\n .join('') +\n '</table>'\n\n /* ํ๊ทธ ์๋ TSV ํฌ๋งท (object๋ name๋ง) */\n const text = rows.map(cells => cells.map(c => String(c.plainText)).join('\\t')).join('\\n')\n\n return { html, text }\n }\n }\n\n async copy() {\n const copied = this.getSelectedBlockValues()\n if (!copied) return\n\n await navigator.clipboard.write([\n new ClipboardItem({\n 'text/html': new Blob([copied.html], { type: 'text/html' }),\n 'text/plain': new Blob([copied.text], { type: 'text/plain' })\n })\n ])\n\n const selectBlock = this.selectBlock || this.focusedField\n if (selectBlock) {\n const backgroundColor = selectBlock.style.backgroundColor\n const opacity = selectBlock.style.opacity\n\n selectBlock.setAttribute('data-tooltip', 'copied to clipboard!')\n const rect = selectBlock.getBoundingClientRect()\n selectBlock.style.setProperty('--tooltip-top', `${rect.top}px`)\n selectBlock.style.setProperty('--tooltip-left', `${rect.left}px`)\n\n selectBlock.style.backgroundColor = 'red'\n selectBlock.style.opacity = '0.5'\n await sleep(500)\n selectBlock.removeAttribute('data-tooltip')\n selectBlock.style.backgroundColor = backgroundColor\n selectBlock.style.opacity = opacity\n }\n }\n\n async paste() {\n try {\n const selection = window.getSelection()\n\n const clipboardItems = await navigator.clipboard.read()\n if (!clipboardItems) {\n return\n }\n\n var type: string | undefined\n var content: string | undefined\n\n for (const clipboardItem of clipboardItems) {\n try {\n var blob = await clipboardItem.getType('text/html')\n content = blob && (await blob.text())\n type = 'text/html'\n } catch (e) {\n try {\n blob = await clipboardItem.getType('text/plain')\n content = blob && (await blob.text())\n type = 'text/plain'\n } catch (e) {}\n }\n\n break\n }\n\n if (!content) {\n return\n }\n\n /* ๋ถ์ฌ๋ฃ๊ธฐ ์ต์ปค/ํ๊ฒ ์์ญ: ์ ํ ๋ธ๋ก์ด ์์ผ๋ฉด ์ข์๋จ + ํฌ๊ธฐ, ์์ผ๋ฉด ํฌ์ปค์ค ์
1ร1 (์์
์ ๋ฐ๋ณต ์ฑ์ฐ๊ธฐ์ฉ) */\n let { row, column } = this.focused\n let tgtRows = 1\n let tgtCols = 1\n const { start, end } = this._selectBlock || {}\n if (start && end) {\n row = Math.min(start.rowIndex, end.rowIndex)\n column = Math.min(start.columnIndex, end.columnIndex)\n tgtRows = Math.abs(end.rowIndex - start.rowIndex) + 1\n tgtCols = Math.abs(end.columnIndex - start.columnIndex) + 1\n }\n\n const { records } = this.data\n const columns = this.columns.filter(column => !column.hidden)\n\n if (type === 'text/html') {\n const div = document.createElement('div')\n div.innerHTML = content!.trim()\n const table = div.querySelector('table') as HTMLTableElement\n if (!table) {\n return\n }\n\n if (selection) {\n this.resetEdit()\n selection.removeAllRanges()\n\n // ํฌ์ปค์ค๊ฐ ๋น ์ง๊ธฐ ์ ์ isWorking์ผ๋ก focusout ์ด๋ฒคํธ์ ๋ํ ๊ฐ ๋ณ๊ฒฝ์ ๋ง์\n // (์ ํ ๋ธ๋ก์ด ์๋ ๋์์๋ focused ํ๋๊ฐ ๋ ๋๋ง๋์ง ์์ผ๋ฏ๋ก ์กด์ฌ ์ฌ๋ถ ํ์ธ)\n if (this.focusedField) {\n this.focusedField.isWorking = true\n await this.updateComplete\n this.focusedField.isWorking = false\n }\n }\n /* ์์
์ ํ์ผ๋ง: ํ๊ฒ ์ ํ ์์ญ์ด ์์ค ํฌ๊ธฐ์ ์ ์๋ฐฐ์ด๋ฉด ๊ทธ ์ฐจ์์ผ๋ก ๋ฐ๋ณตํ๊ณ , ์๋๋ฉด ํ ๋ฒ๋ง ๋ถ์ฌ ๋ฃ๋๋ค (์ฐจ์๋ง๋ค ๋ฐ๋ก ํ๋จ) */\n const trs = Array.from(table.querySelectorAll('tr')).filter(\n (r): r is HTMLTableRowElement => r instanceof HTMLTableRowElement\n )\n if (!trs.length) {\n return\n }\n const srcRows = trs.length\n const srcCols = Math.max(...trs.map(tr => tr.querySelectorAll('td').length))\n const repeatR = srcRows > 0 && tgtRows % srcRows === 0 ? tgtRows / srcRows : 1\n const repeatC = srcCols > 0 && tgtCols % srcCols === 0 ? tgtCols / srcCols : 1\n\n for (let rowIndex = 0; rowIndex < srcRows * repeatR; rowIndex++) {\n var targetRecord = records[row + rowIndex] || { __dirty__: '+' }\n if (row + rowIndex >= records.length) {\n records.push(targetRecord)\n }\n\n const cells = trs[rowIndex % srcRows].querySelectorAll('td')\n for (let columnIndex = 0; columnIndex < srcCols * repeatC; columnIndex++) {\n const item = cells[columnIndex % srcCols]\n if (!item) continue /* ragged row ๋ฐฉ์ด */\n const targetColumn = columns[column + columnIndex]\n if (!targetColumn || targetColumn.gutterName) continue /* ๊ทธ๋ฆฌ๋ ๋ฒ์ ๋ฐ ์ด ๋ฐฉ์ด / gutter ๋ฐฉ์ด */\n /* data-value ์์ฑ์ด ์์ผ๋ฉด ์ฐ์ ์ฌ์ฉ (๊ทธ๋ฆฌ๋์์ ๋ณต์ฌํ object ๋ฐ์ดํฐ ๋ณต์์ฉ) */\n let value = (item.dataset.value || item.textContent) as any\n const sourceType = item.getAttribute('type') || 'string'\n let type = targetColumn.type || sourceType\n type = type.includes('object') ? 'object' : type // ์ค๋ธ์ ํธ ํ์
์์ธ์ฒ๋ฆฌ\n let { editable } = targetColumn.record\n if (typeof editable === 'function') {\n editable = editable.call(this, value, targetColumn, targetRecord, row, this)\n }\n\n if (value) {\n switch (type) {\n case 'object':\n // ์ค๋ธ์ ํธ๊ฐ ์ ๋ถ ๋น๊ฐ์ด๋ฉด ''๋ก ์นํ\n try {\n value = JSON.parse(value || '{}')\n value = Object.values(value).every(v => (typeof v === 'string' ? v.trim() === '' : isEmpty(v)))\n ? null\n : value\n } catch (err) {\n value = null\n }\n break\n case 'parameters':\n try {\n value = JSON.parse(value || 'null')\n } catch (err) {\n value = null\n }\n break\n case 'boolean':\n case 'checkbox':\n value = !!value && !!String(value).match(/true/i)\n break\n case 'number':\n case 'float':\n case 'integer':\n case 'progress':\n value = parseToNumberOrNull(value)\n break\n case 'string':\n try {\n const parsed = JSON.parse(value)\n /* ์ค๋ธ์ ํธ๋ฅผ ๋ฌธ์์ด ์
์ ๋ถ์ฌ๋ฃ์ ๋ ์
์ ํ์ ํ
์คํธ(textContent) ์ฐ์ ์ฌ์ฉ */\n if (typeof parsed === 'object' && parsed !== null) {\n value = item.textContent?.trim() || (parsed as any).name || ''\n } else {\n value = String(parsed).trim()\n }\n } catch (err) {}\n break\n case 'select':\n /* select ํ์
: ๋ถ์ฌ๋ฃ์ ํ
์คํธ๋ฅผ ์ต์
์ display/value์ ๋งค์นญํ์ฌ value๋ก ๋ณํ */\n value = resolveSelectPasteValue(String(value), targetColumn, targetRecord)\n break\n default:\n /* ์๋ณธ์ด string ์ผ๋ก ๋ณต์ฌ๋ ๊ฐ(color-map ๋ฑ JSON ๋ฌธ์์ด ์ ์ฅ ํ์
)์\n ํ์ฑํ์ง ์๊ณ ๋ฌธ์์ด ๊ทธ๋๋ก ์ ์ง */\n if (sourceType === 'string' && !item.dataset.value) {\n value = value?.trim()\n } else {\n try {\n value = JSON.parse(value)\n } catch (err) {\n if (type === 'json' || type.includes('object')) value = null\n }\n }\n }\n } else {\n /* ๊ธฐ์กด ๋ ์ฝ๋(id ์์)๋ ๋ช
์์ ์ผ๋ก ๋น์ฐ๊ธฐ ์ํด null, ์ ๊ท ๋ ์ฝ๋๋ default value ์ ์ฉ์ ์ํด undefined */\n value = targetRecord.id ? null : undefined\n }\n\n if (targetColumn && !targetColumn.gutterName && editable) {\n this.dispatchEvent(\n new CustomEvent('field-change', {\n bubbles: true,\n composed: true,\n detail: {\n before: targetRecord[targetColumn.name],\n after: value,\n column: targetColumn,\n record: targetRecord,\n row: row + rowIndex\n }\n })\n )\n }\n }\n }\n\n return\n } else if (type === 'text/plain') {\n /* TSV ํฌ๋งท ํ์ฑ: ์ค๋ฐ๊ฟ์ผ๋ก ํ ๋ถ๋ฆฌ, ํญ์ผ๋ก ์ด ๋ถ๋ฆฌ (์์
๋ฑ ์ธ๋ถ ์์ค ๋ถ์ฌ๋ฃ๊ธฐ ์ง์) */\n /* CRLF ์ ๊ทํ + ๋ง์ง๋ง ๋น ์ค ์ ๊ฑฐ (์์
TSV ๋ ๊ฐํ์ผ๋ก ๋๋๋ค. ๋น ํ์ด ์์ค ํฌ๊ธฐ ํ๋จ์ ๊นจ๋จ๋ฆฐ๋ค) */\n const tsvRows = content\n .replace(/\\r\\n/g, '\\n')\n .replace(/\\n$/, '')\n .split('\\n')\n .map(line => line.split('\\t'))\n if (!tsvRows.length) {\n return\n }\n\n /* ์์
์ ํ์ผ๋ง: ํ๊ฒ ์ ํ ์์ญ์ด ์์ค ํฌ๊ธฐ์ ์ ์๋ฐฐ์ด๋ฉด ๊ทธ ์ฐจ์์ผ๋ก ๋ฐ๋ณตํ๊ณ , ์๋๋ฉด ํ ๋ฒ๋ง ๋ถ์ฌ ๋ฃ๋๋ค (์ฐจ์๋ง๋ค ๋ฐ๋ก ํ๋จ) */\n const srcRows = tsvRows.length\n const srcCols = Math.max(...tsvRows.map(r => r.length))\n const repeatR = srcRows > 0 && tgtRows % srcRows === 0 ? tgtRows / srcRows : 1\n const repeatC = srcCols > 0 && tgtCols % srcCols === 0 ? tgtCols / srcCols : 1\n\n for (let rowOffset = 0; rowOffset < srcRows * repeatR; rowOffset++) {\n const targetRowIndex = row + rowOffset\n var targetRecord = records[targetRowIndex] || { __dirty__: '+' }\n if (targetRowIndex >= records.length) {\n records.push(targetRecord)\n }\n\n const tsvCells = tsvRows[rowOffset % srcRows]\n for (let colOffset = 0; colOffset < srcCols * repeatC; colOffset++) {\n const cellValue = tsvCells[colOffset % srcCols] ?? '' /* ragged row ๋ฐฉ์ด */\n const targetColumn = columns[column + colOffset]\n if (!targetColumn || targetColumn.gutterName) continue\n\n let { editable } = targetColumn.record\n if (typeof editable === 'function') {\n editable = editable.call(this, cellValue, targetColumn, targetRecord, targetRowIndex, this)\n }\n\n if (editable) {\n /* select ํ์
: ๋ถ์ฌ๋ฃ์ ํ
์คํธ๋ฅผ ์ต์
์ display/value์ ๋งค์นญํ์ฌ value๋ก ๋ณํ */\n /* ๋น๊ฐ: ๊ธฐ์กด ๋ ์ฝ๋(id ์์)๋ ๋ช
์์ ์ผ๋ก ๋น์ฐ๊ธฐ ์ํด null, ์ ๊ท ๋ ์ฝ๋๋ default value ์ ์ฉ์ ์ํด undefined */\n let resolvedValue: any = cellValue || (targetRecord.id ? null : undefined)\n if (targetColumn.type === 'select' && cellValue) {\n resolvedValue = resolveSelectPasteValue(cellValue, targetColumn, targetRecord)\n }\n\n this.dispatchEvent(\n new CustomEvent('field-change', {\n bubbles: true,\n composed: true,\n detail: {\n before: targetRecord[targetColumn.name],\n after: resolvedValue,\n column: targetColumn,\n record: targetRecord,\n row: targetRowIndex\n }\n })\n )\n }\n }\n }\n }\n } catch (e) {\n console.log('e : ', e)\n } finally {\n /* paste ์๋ฃ ํ ํฌ์ปค์ค๋ฅผ ๊ทธ๋ฆฌ๋๋ก ๋ณต์ */\n this.focus()\n }\n }\n\n setSelectBlock(start?: DataGridField, end?: DataGridField) {\n if (start?.columnIndex == -1) {\n start = this.getFieldByIndex(start.rowIndex, this.columns.filter(column => !column.hidden).length - 1)\n }\n\n if (end?.columnIndex == -1) {\n end = this.getFieldByIndex(end.rowIndex, this.columns.filter(column => !column.hidden).length - 1)\n }\n\n this._selectBlock = start && { start, end }\n\n if (start && end) {\n window.getSelection()?.removeAllRanges()\n\n if (start !== end) {\n const left = start.columnIndex < end.columnIndex ? start : end\n const right = left === start ? end : start\n const top = start.rowIndex < end.rowIndex ? start : end\n const bottom = top === start ? end : start\n\n const { offsetLeft } = left\n const { offsetTop } = top\n const width = right.offsetLeft - offsetLeft + right.offsetWidth\n const height = bottom.offsetTop - offsetTop + bottom.offsetHeight\n\n this.style.setProperty('--select-box-left', offsetLeft - 1 + 'px')\n this.style.setProperty('--select-box-top', offsetTop - 1 + 'px')\n this.style.setProperty('--select-box-width', width + 'px')\n this.style.setProperty('--select-box-height', height + 'px')\n }\n\n this.focus()\n }\n }\n\n buildAccumulatorRecord(): GristRecord {\n var columns = this.columns.filter(column => !column.hidden)\n\n return columns.reduce((record, column) => {\n if (column.accumulator) {\n record[column.name] = accumulate(this.data, column, column.accumulator)\n }\n return record\n }, {} as GristRecord)\n }\n\n /**\n * Which cell the IME buffer currently stands in for โ the name a screen reader reads.\n *\n * The name comes from the column definition alone (columnText). When focus is on no cell, or the\n * column yields no name, it falls back to \"cell input\" โ no invented name, and no empty one.\n */\n private _imeBufferLabel(column?: ColumnConfig): string {\n const name = columnText(column)\n\n return name\n ? i18next.t('text.grid-cell-input', { name, defaultValue: name })\n : i18next.t('text.grid-cell-input-plain', { defaultValue: 'cell input' })\n }\n\n /** IME buffer๋ฅผ ํฌ์ปค์ค๋ ์
์์ ์์น์ํจ๋ค */\n private _positionIMEBuffer() {\n const focusedEl = this.renderRoot?.querySelector('[focused]') as HTMLElement\n if (focusedEl && this._imeBuffer) {\n this._imeBuffer.style.left = focusedEl.offsetLeft + 'px'\n this._imeBuffer.style.top = focusedEl.offsetTop + 'px'\n this._imeBuffer.style.width = focusedEl.offsetWidth + 'px'\n this._imeBuffer.style.height = focusedEl.offsetHeight + 'px'\n }\n }\n\n /** IME buffer ๊ฐ์ field-change ์ด๋ฒคํธ๋ก ์ปค๋ฐํ๋ค */\n _commitIMEBuffer(row: number, column: number) {\n const text = this._imeBuffer?.value\n this._resetIMEBuffer()\n\n if (!text) return\n\n const columns = this.columns.filter(c => !c.hidden)\n const col = columns[column]\n if (!col || col.gutterName) return\n\n const record = this.data.records[row] || { __dirty__: '+' }\n\n let { editable } = col.record\n if (typeof editable === 'function') {\n editable = editable.call(this, record[col.name], col, record, row, this)\n }\n if (!editable) return\n\n /* ํ์
์ ๋ฐ๋ฅธ ๊ฐ ๋ณํ */\n let value: any = text\n switch (col.type) {\n case 'number':\n case 'float':\n case 'integer':\n case 'progress':\n value = parseToNumberOrNull(text)\n if (value === null) return\n break\n case 'boolean':\n case 'checkbox':\n return /* boolean์ ํค๋ณด๋ ํ
์คํธ ์
๋ ฅ์ผ๋ก ํธ์ง ๋ถ๊ฐ */\n }\n\n this.dispatchEvent(\n new CustomEvent('field-change', {\n bubbles: true,\n composed: true,\n detail: {\n before: record[col.name],\n after: value,\n column: col,\n record,\n row\n }\n })\n )\n }\n\n /** IME buffer ์ทจ์ (๊ฐ ๋ฒ๋ฆฌ๊ธฐ) */\n _discardIMEBuffer() {\n this._resetIMEBuffer()\n }\n\n /** IME buffer ์ด๊ธฐํ */\n private _resetIMEBuffer() {\n if (this._imeBuffer) {\n this._imeBuffer.value = ''\n this._imeBuffer.classList.remove('active')\n }\n this._imeEditing = false\n this._imeComposing = false\n }\n}\n"]}
|
|
@@ -22,6 +22,7 @@ export declare class DataGridField extends LitElement {
|
|
|
22
22
|
private _onKeydownInEditingMode;
|
|
23
23
|
private tooltipController?;
|
|
24
24
|
render(): TemplateResult;
|
|
25
|
+
private renderValue;
|
|
25
26
|
updated(changes: PropertyValues<this>): void;
|
|
26
27
|
/**
|
|
27
28
|
* ์ด ์นธ์ **ํ์
ํ์**์ ๋ถ์ด๋ โ ํ์
์ผ๋ก ๊ณ ์ณ์ง๊ณ , ์ง๊ธ ๊ณ ์น ์ ์์ ๋๋ง.
|
|
@@ -36,7 +36,7 @@ let DataGridField = class DataGridField extends LitElement {
|
|
|
36
36
|
return html `
|
|
37
37
|
${this.editing
|
|
38
38
|
? editor === null || editor === void 0 ? void 0 : editor.call(this, value, column, record, rowIndex, this)
|
|
39
|
-
: renderer === null || renderer === void 0 ? void 0 : renderer.call(this, value, column, record, rowIndex, this)}
|
|
39
|
+
: this.renderValue(renderer === null || renderer === void 0 ? void 0 : renderer.call(this, value, column, record, rowIndex, this))}
|
|
40
40
|
<!--
|
|
41
41
|
**ํธ์ง ์ค์๋ ํ์์ ๋จ๊ธด๋ค.**
|
|
42
42
|
|
|
@@ -134,6 +134,15 @@ let DataGridField = class DataGridField extends LitElement {
|
|
|
134
134
|
: ''}
|
|
135
135
|
`;
|
|
136
136
|
}
|
|
137
|
+
/*
|
|
138
|
+
* ๊ธ์๋ก ๋์์จ ๊ฐ์ span ์ ๋ด๋๋ค.
|
|
139
|
+
*
|
|
140
|
+
* ๋งจ ํ
์คํธ ๋
ธ๋๋ ์ด ์์(flex)์ ์ต๋ช
ํญ๋ชฉ์ด ๋์ด text-overflow ๋ฅผ ๋ฐ์ ์๋ฆฌ๊ฐ ์๋ค โ ์๋ฆฌ๊ธฐ๋
|
|
141
|
+
* ํด๋ ใโฆใ ์์ด ๋ ๋๊ธด๋ค. ๊ธฐ๋ณธ ๋ ๋๋ฌ๋ค์ฒ๋ผ span ์ ๋ด์ผ๋ฉด ์์ span ๊ท์น์ด ๋ง์ค์์ ์ค๋ค.
|
|
142
|
+
*/
|
|
143
|
+
renderValue(rendered) {
|
|
144
|
+
return typeof rendered === 'string' || typeof rendered === 'number' ? html `<span>${rendered}</span>` : rendered;
|
|
145
|
+
}
|
|
137
146
|
updated(changes) {
|
|
138
147
|
var _a, _b;
|
|
139
148
|
if (changes.has('editing')) {
|
|
@@ -320,6 +329,24 @@ DataGridField.styles = [
|
|
|
320
329
|
justify-content: var(--data-grid-field-justify-content, flex-start);
|
|
321
330
|
position: relative;
|
|
322
331
|
|
|
332
|
+
/*
|
|
333
|
+
* โโ ์นธ์ ๋ด์ฉ์ **์นธ ์์ ๋จธ๋ฌธ๋ค** โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
334
|
+
* ๋ ๋๋ฌ๋ ๋ฌด์์ด๋ ๋๋ ค์ค ์ ์๋ค โ ๋ฌธ์์ด, ํ
์คํธ ๋
ธ๋, <a> ๊ฐ์ ์๋ฌด ์์(types.ts ์
|
|
335
|
+
* FieldRenderer). ์๋์ span ยท pre ๊ท์น๋ง ์๋ฅด๊ณ ์์ด์, ๊ทธ ๋ฐ์ ๊ฒ์ ์ด ๋๋น๋ฅผ ๋์ด
|
|
336
|
+
* ์ ์นธ ์๋ก, ๋ง์ง๋ง ์ด ๋๋จธ ๋น์๋ฆฌ๋ก ํ๋ ๋ค. ํ๋ฅธ ๋งํผ ๋ชธํต์ scrollWidth ๊ฐ ์ปค์ ธ
|
|
337
|
+
* ๋จธ๋ฆฌ๋ง(์ด ๋๋น์ ํฉ)๊ณผ ์ด๊ธ๋ฌ๊ณ , ์ค๋ฅธ์ชฝ ๋์์ ๋จธ๋ฆฌ๋ง์ ๋ฉ์ถ๋๋ฐ ๋ชธํต๋ง ๋ ๋ฐ๋ ธ๋ค.
|
|
338
|
+
*
|
|
339
|
+
* [ํ์ธํจ] operato-office ๊ณ์ฝ ๋์ฅ โ ๋ชธํต 5503 / ๋จธ๋ฆฌ๋ง 3830. ์นธ๋ง๋ค overflow: hidden
|
|
340
|
+
* ์ ๊ฑธ์ ๋ชธํต์ด 3830 ์ผ๋ก ๋จธ๋ฆฌ๋ง๊ณผ ๊ฐ์์ก๋ค(2026-10-04).
|
|
341
|
+
*
|
|
342
|
+
* 2022 ๋
์ ์ด ๊ฐ์ ๋บ ์ด์ ๋ ์นธ ์์ ๊ทธ๋ฆฌ๋ CSS ํดํ์ด์๋ค. ์ง๊ธ ํดํ์ document.body ์
|
|
343
|
+
* ๋ถ์ผ๋ฏ๋ก(TooltipReactiveController) ์๋ฆฌ์ง ์๋๋ค. ์ด์ ํ
(outline)๋ ์ด ์์ ์์ ์
|
|
344
|
+
* ๊ฒ์ด๋ผ ์๊ธฐ overflow ์ ์๋ฆฌ์ง ์๋๋ค.
|
|
345
|
+
*
|
|
346
|
+
* ํธ์ง ์ค์๋ ํ์ด ๋๋ค(:host([editing]) ์๋) โ ํธ์ง๊ธฐ๊ฐ ์นธ ๋ฐ์ผ๋ก ๊ทธ๋ฆฌ๋ ๊ฒ์ ๋ง์ง ์๋๋ค.
|
|
347
|
+
*/
|
|
348
|
+
overflow: hidden;
|
|
349
|
+
min-width: 0;
|
|
323
350
|
white-space: nowrap;
|
|
324
351
|
background-color: var(--grid-record-background-color);
|
|
325
352
|
padding: var(--grid-record-padding);
|
|
@@ -759,6 +786,7 @@ DataGridField.styles = [
|
|
|
759
786
|
}
|
|
760
787
|
|
|
761
788
|
:host([editing]) {
|
|
789
|
+
overflow: visible;
|
|
762
790
|
border-top: var(--grid-record-editing-border);
|
|
763
791
|
border-bottom: var(--grid-record-editing-border);
|
|
764
792
|
}
|