@operato/data-grist 10.29.7 → 10.29.8

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 CHANGED
@@ -3,6 +3,15 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ### [10.29.8](https://github.com/hatiolab/operato/compare/v10.29.7...v10.29.8) (2026-10-05)
7
+
8
+
9
+ ### :bug: Bug Fix
10
+
11
+ * **data-grist:** keep the grid still on the first cell click ([97348f1](https://github.com/hatiolab/operato/commit/97348f1f424dc66d4137201748071d6439fcb5f5))
12
+
13
+
14
+
6
15
  ### [10.29.7](https://github.com/hatiolab/operato/compare/v10.29.6...v10.29.7) (2026-10-05)
7
16
 
8
17
 
@@ -586,7 +586,7 @@ let DataGridBody = class DataGridBody extends LitElement {
586
586
  /* IME buffer 위치 업데이트 */
587
587
  this._positionIMEBuffer();
588
588
  if (!this.editTarget && this._imeBuffer && !this._lastPointerTouch && this._hasEditableColumn) {
589
- this._imeBuffer.focus();
589
+ this._imeBuffer.focus({ preventScroll: true });
590
590
  }
591
591
  }
592
592
  // 페이징 바뀌면 스크롤 맨 위로
@@ -602,6 +602,18 @@ let DataGridBody = class DataGridBody extends LitElement {
602
602
  this._recordView.record = this.data.records[this._recordViewRow];
603
603
  }
604
604
  }
605
+ /*
606
+ * ── 초점을 줄 때 **브라우저가 스크롤하지 않게 한다** (2026-10-05) ──────────────
607
+ *
608
+ * 초점 칸을 화면 안으로 들이는 일은 이 표가 직접 한다(updated 의 calcScrollPos). 그런데 초점을 받는
609
+ * 입력 버퍼는 그 전에 불린다 — 칸을 누르면 표가 새 초점을 정하고 곧바로 focus() 를 부르는데, 몸은
610
+ * 아직 새 초점으로 다시 그려지기 전이다. 버퍼는 이전 초점 칸 자리에, 처음이면 놓인 적 없는 기본
611
+ * 자리(왼쪽 위)에 있다. 브라우저는 그 버퍼를 보이게 하려고 표를 스크롤한다.
612
+ *
613
+ * [확인함] 1000px 오른쪽으로 민 표에서 처음 칸을 누르면 0 으로 갔다가, 다시 그려진 뒤 581 로 왔다.
614
+ * 가운데에서 누른 칸이 오른쪽 끝으로 밀려났다. 두 번째부터는 버퍼가 직전 칸 근처에 있어
615
+ * 안 보였다 — 「처음에만 그런다」(사용자, 2026-10-05).
616
+ */
605
617
  focus() {
606
618
  if (this.editTarget) {
607
619
  /* 에디터 편집 모드에서는 에디터가 자체적으로 포커스를 관리하므로 간섭하지 않는다 */
@@ -610,10 +622,10 @@ let DataGridBody = class DataGridBody extends LitElement {
610
622
  if (this._imeBuffer && !this._lastPointerTouch && this._hasEditableColumn) {
611
623
  /* 비편집 모드에서는 IME buffer로 포커스 리다이렉트 (터치 시/읽기 전용 그리드에서는 제외) */
612
624
  this._positionIMEBuffer();
613
- this._imeBuffer.focus();
625
+ this._imeBuffer.focus({ preventScroll: true });
614
626
  }
615
627
  else {
616
- super.focus();
628
+ super.focus({ preventScroll: true });
617
629
  }
618
630
  if (this.focused === ZERO_FOCUS) {
619
631
  let { records } = this.data;
@@ -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\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=\"{&quot;id&quot;:...}\">탈수 절임배추</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 '&amp;'\n case '<':\n return '&lt;'\n case '>':\n return '&gt;'\n case '\"':\n return '&quot;'\n case \"'\":\n return '&#039;'\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({ preventScroll: true })\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 /*\n * ── 초점을 줄 때 **브라우저가 스크롤하지 않게 한다** (2026-10-05) ──────────────\n *\n * 초점 칸을 화면 안으로 들이는 일은 이 표가 직접 한다(updated 의 calcScrollPos). 그런데 초점을 받는\n * 입력 버퍼는 그 전에 불린다 — 칸을 누르면 표가 새 초점을 정하고 곧바로 focus() 를 부르는데, 몸은\n * 아직 새 초점으로 다시 그려지기 전이다. 버퍼는 이전 초점 칸 자리에, 처음이면 놓인 적 없는 기본\n * 자리(왼쪽 위)에 있다. 브라우저는 그 버퍼를 보이게 하려고 표를 스크롤한다.\n *\n * [확인함] 1000px 오른쪽으로 민 표에서 처음 칸을 누르면 0 으로 갔다가, 다시 그려진 뒤 581 로 왔다.\n * 가운데에서 누른 칸이 오른쪽 끝으로 밀려났다. 두 번째부터는 버퍼가 직전 칸 근처에 있어\n * 안 보였다 — 「처음에만 그런다」(사용자, 2026-10-05).\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({ preventScroll: true })\n } else {\n super.focus({ preventScroll: true })\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=\"{&quot;id&quot;:...}\">탈수 절임배추</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 '&amp;'\n case '<':\n return '&lt;'\n case '>':\n return '&gt;'\n case '\"':\n return '&quot;'\n case \"'\":\n return '&#039;'\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"]}
@@ -276,7 +276,8 @@ let DataGrid = class DataGrid extends DataManipulator {
276
276
  `;
277
277
  }
278
278
  focus() {
279
- super.focus();
279
+ /* 초점 칸을 보이게 하는 스크롤은 몸이 직접 한다 — data-grid-body.ts focus() 주석. */
280
+ super.focus({ preventScroll: true });
280
281
  this.body.focus();
281
282
  }
282
283
  get pullToRefreshTarget() {