@operato/data-grist 10.3.2 → 10.3.4

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,25 @@
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.3.4](https://github.com/hatiolab/operato/compare/v10.3.3...v10.3.4) (2026-08-31)
7
+
8
+
9
+ ### :bug: Bug Fix
10
+
11
+ * **data-grist:** 목록의 영어 두 줄을 다섯 언어로 ([722e7af](https://github.com/hatiolab/operato/commit/722e7afe39d7d998ba7bc45e8c2749e172ec34f6))
12
+
13
+
14
+
15
+ ### [10.3.3](https://github.com/hatiolab/operato/compare/v10.3.2...v10.3.3) (2026-08-31)
16
+
17
+
18
+ ### :bug: Bug Fix
19
+
20
+ * **data-grist:** 머리 높이를 한 번만 재던 것 — 내용이 겹쳤다 ([1c0f5b7](https://github.com/hatiolab/operato/commit/1c0f5b70ccb627f372709da3a06e87c2465d02c8))
21
+ * 그리드 범위 선택 동작 수정 ([330215f](https://github.com/hatiolab/operato/commit/330215fcec04a6fb0a7dd6224d95cd398dd50c76))
22
+
23
+
24
+
6
25
  ### [10.3.2](https://github.com/hatiolab/operato/compare/v10.3.1...v10.3.2) (2026-08-06)
7
26
 
8
27
  **Note:** Version bump only for package @operato/data-grist
@@ -1,4 +1,5 @@
1
1
  import { __decorate } from "tslib";
2
+ import i18next from 'i18next';
2
3
  import '@material/web/icon/icon.js';
3
4
  import '../empty-note.js';
4
5
  import './record-card.js';
@@ -65,7 +66,7 @@ let DataCard = class DataCard extends DataManipulator {
65
66
  ></ox-record-card>
66
67
  `;
67
68
  })}
68
- ${this.empty ? html ` <ox-empty-note title="NO RECORDS"></ox-empty-note> ` : html ``}
69
+ ${this.empty ? html ` <ox-empty-note title=${i18next.t('text.grid-no-records', { defaultValue: 'NO RECORDS' })}></ox-empty-note> ` : html ``}
69
70
  ${this.isTop
70
71
  ? html ``
71
72
  : html ` <md-icon id="upward" @click=${(e) => this.gotoTop(e)}>arrow_upward</md-icon> `}
@@ -1 +1 @@
1
- {"version":3,"file":"data-card.js","sourceRoot":"","sources":["../../../src/data-card/data-card.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport '../empty-note.js'\nimport './record-card.js'\n\nimport { PropertyValues, css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { DataManipulator } from '../data-manipulator.js'\nimport { GristRecord } from '../types.js'\n\n@customElement('ox-card')\nexport class DataCard extends DataManipulator {\n static styles = [\n css`\n :host {\n overflow-y: auto;\n padding: var(--spacing-medium);\n\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n grid-template-rows: min-content;\n grid-gap: var(--spacing-large);\n }\n\n [selected-row] {\n background-color: var(--grid-record-selected-background-color);\n }\n\n #upward {\n --md-icon-size: var(--icon-size-large);\n position: absolute;\n top: var(--data-card-fab-position-vertical);\n right: var(--data-card-fab-position-horizontal);\n background-color: rgba(255, 255, 255, 0.7);\n border-radius: var(--md-sys-shape-corner-large);\n color: var(--data-card-fab-color);\n box-shadow: var(--data-card-fab-shadow);\n padding: var(--spacing-small);\n }\n\n slot {\n width: 100%;\n }\n\n ox-empty-note {\n display: block;\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n }\n\n [card][emphasized-row],\n [card][emphasized-row][focused] {\n background-color: var(--grid-record-emphasized-background-color);\n color: var(--grid-record-emphasized-color);\n }\n\n @media screen and (max-width: 460px) {\n #setting {\n grid-template-columns: 1fr;\n grid-template-rows: 1fr 1fr;\n }\n }\n `\n ]\n\n @property({ type: Boolean }) empty?: boolean\n\n @state() private _records: GristRecord[] = []\n @state() private isTop: boolean = false\n\n private _total: number = 0\n private _limit: number = 20\n private _page: number = 1\n\n firstUpdated(changes: PropertyValues<this>) {\n this.isTop = true\n\n /* infinite scrolling */\n this.addEventListener('scroll', e => {\n const totalScrollHeight = this.scrollHeight\n const screenHeight = this.offsetHeight\n const currentScrollTop = this.scrollTop\n\n if (totalScrollHeight <= screenHeight + currentScrollTop + 1) {\n /* 마지막 페이지까지 계속 페이지를 증가시킨다. */\n var lastPage = Math.ceil(this._total / this._limit)\n\n if (this._page < lastPage) {\n this.dispatchEvent(new CustomEvent('attach-page', { bubbles: true, composed: true }))\n }\n }\n\n this.isTop = this.scrollTop == 0\n })\n }\n\n updated(changes: PropertyValues<this>) {\n if (changes.has('config')) {\n this._records = []\n this._page = 1\n }\n\n if (changes.has('data')) {\n this._records = this.data.records\n this._total = this.data.total || 0\n this._limit = this.data.limit || 20\n this._page = this.data.page || 0\n }\n }\n\n render() {\n var { classifier } = this.config.rows\n var records = this._records || []\n\n if (this.config && this.config.rows.appendable) {\n records = [...records, { __dirty__: '+' }]\n }\n\n return html`\n ${records.map((record, rowIndex) => {\n var { emphasized } = classifier.call(null, record, rowIndex) || {}\n\n return html`\n <ox-record-card\n .config=${this.config}\n .data=${this.data}\n .record=${record}\n .rowIndex=${rowIndex}\n .emphasized=${emphasized}\n ?selected-row=${record['__selected__']}\n ?dirty=${record['__dirty__']}\n card\n ></ox-record-card>\n `\n })}\n ${this.empty ? html` <ox-empty-note title=\"NO RECORDS\"></ox-empty-note> ` : html``}\n ${this.isTop\n ? html``\n : html` <md-icon id=\"upward\" @click=${(e: Event) => this.gotoTop(e)}>arrow_upward</md-icon> `}\n `\n }\n\n gotoTop(e: Event) {\n this.scrollTop = 0\n\n e.stopPropagation()\n }\n\n get pullToRefreshTarget() {\n return this\n }\n}\n"]}
1
+ {"version":3,"file":"data-card.js","sourceRoot":"","sources":["../../../src/data-card/data-card.ts"],"names":[],"mappings":"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","sourcesContent":["import i18next from 'i18next'\nimport '@material/web/icon/icon.js'\nimport '../empty-note.js'\nimport './record-card.js'\n\nimport { PropertyValues, css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { DataManipulator } from '../data-manipulator.js'\nimport { GristRecord } from '../types.js'\n\n@customElement('ox-card')\nexport class DataCard extends DataManipulator {\n static styles = [\n css`\n :host {\n overflow-y: auto;\n padding: var(--spacing-medium);\n\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n grid-template-rows: min-content;\n grid-gap: var(--spacing-large);\n }\n\n [selected-row] {\n background-color: var(--grid-record-selected-background-color);\n }\n\n #upward {\n --md-icon-size: var(--icon-size-large);\n position: absolute;\n top: var(--data-card-fab-position-vertical);\n right: var(--data-card-fab-position-horizontal);\n background-color: rgba(255, 255, 255, 0.7);\n border-radius: var(--md-sys-shape-corner-large);\n color: var(--data-card-fab-color);\n box-shadow: var(--data-card-fab-shadow);\n padding: var(--spacing-small);\n }\n\n slot {\n width: 100%;\n }\n\n ox-empty-note {\n display: block;\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n }\n\n [card][emphasized-row],\n [card][emphasized-row][focused] {\n background-color: var(--grid-record-emphasized-background-color);\n color: var(--grid-record-emphasized-color);\n }\n\n @media screen and (max-width: 460px) {\n #setting {\n grid-template-columns: 1fr;\n grid-template-rows: 1fr 1fr;\n }\n }\n `\n ]\n\n @property({ type: Boolean }) empty?: boolean\n\n @state() private _records: GristRecord[] = []\n @state() private isTop: boolean = false\n\n private _total: number = 0\n private _limit: number = 20\n private _page: number = 1\n\n firstUpdated(changes: PropertyValues<this>) {\n this.isTop = true\n\n /* infinite scrolling */\n this.addEventListener('scroll', e => {\n const totalScrollHeight = this.scrollHeight\n const screenHeight = this.offsetHeight\n const currentScrollTop = this.scrollTop\n\n if (totalScrollHeight <= screenHeight + currentScrollTop + 1) {\n /* 마지막 페이지까지 계속 페이지를 증가시킨다. */\n var lastPage = Math.ceil(this._total / this._limit)\n\n if (this._page < lastPage) {\n this.dispatchEvent(new CustomEvent('attach-page', { bubbles: true, composed: true }))\n }\n }\n\n this.isTop = this.scrollTop == 0\n })\n }\n\n updated(changes: PropertyValues<this>) {\n if (changes.has('config')) {\n this._records = []\n this._page = 1\n }\n\n if (changes.has('data')) {\n this._records = this.data.records\n this._total = this.data.total || 0\n this._limit = this.data.limit || 20\n this._page = this.data.page || 0\n }\n }\n\n render() {\n var { classifier } = this.config.rows\n var records = this._records || []\n\n if (this.config && this.config.rows.appendable) {\n records = [...records, { __dirty__: '+' }]\n }\n\n return html`\n ${records.map((record, rowIndex) => {\n var { emphasized } = classifier.call(null, record, rowIndex) || {}\n\n return html`\n <ox-record-card\n .config=${this.config}\n .data=${this.data}\n .record=${record}\n .rowIndex=${rowIndex}\n .emphasized=${emphasized}\n ?selected-row=${record['__selected__']}\n ?dirty=${record['__dirty__']}\n card\n ></ox-record-card>\n `\n })}\n ${this.empty ? html` <ox-empty-note title=${i18next.t('text.grid-no-records', { defaultValue: 'NO RECORDS' })}></ox-empty-note> ` : html``}\n ${this.isTop\n ? html``\n : html` <md-icon id=\"upward\" @click=${(e: Event) => this.gotoTop(e)}>arrow_upward</md-icon> `}\n `\n }\n\n gotoTop(e: Event) {\n this.scrollTop = 0\n\n e.stopPropagation()\n }\n\n get pullToRefreshTarget() {\n return this\n }\n}\n"]}
@@ -628,6 +628,7 @@ let DataGridBody = class DataGridBody extends LitElement {
628
628
  }
629
629
  }
630
630
  async paste() {
631
+ var _a, _b;
631
632
  try {
632
633
  const selection = window.getSelection();
633
634
  const clipboardItems = await navigator.clipboard.read();
@@ -655,7 +656,17 @@ let DataGridBody = class DataGridBody extends LitElement {
655
656
  if (!content) {
656
657
  return;
657
658
  }
658
- const { row, column } = this.focused;
659
+ /* 붙여넣기 앵커/타겟 영역: 선택 블록이 있으면 좌상단 + 크기, 없으면 포커스 셀 1×1 (엑셀식 반복 채우기용) */
660
+ let { row, column } = this.focused;
661
+ let tgtRows = 1;
662
+ let tgtCols = 1;
663
+ const { start, end } = this._selectBlock || {};
664
+ if (start && end) {
665
+ row = Math.min(start.rowIndex, end.rowIndex);
666
+ column = Math.min(start.columnIndex, end.columnIndex);
667
+ tgtRows = Math.abs(end.rowIndex - start.rowIndex) + 1;
668
+ tgtCols = Math.abs(end.columnIndex - start.columnIndex) + 1;
669
+ }
659
670
  const { records } = this.data;
660
671
  const columns = this.columns.filter(column => !column.hidden);
661
672
  if (type === 'text/html') {
@@ -669,25 +680,35 @@ let DataGridBody = class DataGridBody extends LitElement {
669
680
  this.resetEdit();
670
681
  selection.removeAllRanges();
671
682
  // 포커스가 빠지기 전에 isWorking으로 focusout 이벤트에 대한 값 변경을 막음
672
- this.focusedField.isWorking = true;
673
- await this.updateComplete;
674
- this.focusedField.isWorking = false;
675
- }
676
- const rows = table.querySelectorAll('tr');
677
- rows.forEach((record, rowIndex) => {
678
- if (!(record instanceof HTMLTableRowElement)) {
679
- return;
683
+ // (선택 블록이 있는 동안에는 focused 필드가 렌더링되지 않으므로 존재 여부 확인)
684
+ if (this.focusedField) {
685
+ this.focusedField.isWorking = true;
686
+ await this.updateComplete;
687
+ this.focusedField.isWorking = false;
680
688
  }
689
+ }
690
+ /* 엑셀식 타일링: 타겟 선택 영역이 소스 크기의 정수배이면 그 차원으로 반복, 아니면 1회 (차원별 독립 판정) */
691
+ const trs = Array.from(table.querySelectorAll('tr')).filter((r) => r instanceof HTMLTableRowElement);
692
+ if (!trs.length) {
693
+ return;
694
+ }
695
+ const srcRows = trs.length;
696
+ const srcCols = Math.max(...trs.map(tr => tr.querySelectorAll('td').length));
697
+ const repeatR = srcRows > 0 && tgtRows % srcRows === 0 ? tgtRows / srcRows : 1;
698
+ const repeatC = srcCols > 0 && tgtCols % srcCols === 0 ? tgtCols / srcCols : 1;
699
+ for (let rowIndex = 0; rowIndex < srcRows * repeatR; rowIndex++) {
681
700
  var targetRecord = records[row + rowIndex] || { __dirty__: '+' };
682
701
  if (row + rowIndex >= records.length) {
683
702
  records.push(targetRecord);
684
703
  }
685
- const cells = record.querySelectorAll('td');
686
- cells.forEach((item, columnIndex) => {
687
- var _a;
704
+ const cells = trs[rowIndex % srcRows].querySelectorAll('td');
705
+ for (let columnIndex = 0; columnIndex < srcCols * repeatC; columnIndex++) {
706
+ const item = cells[columnIndex % srcCols];
707
+ if (!item)
708
+ continue; /* ragged row 방어 */
688
709
  const targetColumn = columns[column + columnIndex];
689
710
  if (!targetColumn || targetColumn.gutterName)
690
- return;
711
+ continue; /* 그리드 범위 밖 열 방어 / gutter 방어 */
691
712
  /* data-value 속성이 있으면 우선 사용 (그리드에서 복사한 object 데이터 복원용) */
692
713
  let value = (item.dataset.value || item.textContent);
693
714
  const sourceType = item.getAttribute('type') || 'string';
@@ -780,24 +801,38 @@ let DataGridBody = class DataGridBody extends LitElement {
780
801
  }
781
802
  }));
782
803
  }
783
- });
784
- });
804
+ }
805
+ }
785
806
  return;
786
807
  }
787
808
  else if (type === 'text/plain') {
788
809
  /* TSV 포맷 파싱: 줄바꿈으로 행 분리, 탭으로 열 분리 (엑셀 등 외부 소스 붙여넣기 지원) */
789
- const tsvRows = content.split('\n');
790
- tsvRows.forEach((line, rowOffset) => {
810
+ /* CRLF 정규화 + 마지막 빈 줄 제거 (엑셀 TSV는 개행으로 끝남 — 빈 행이 소스 크기 판정을 깨뜨림) */
811
+ const tsvRows = content
812
+ .replace(/\r\n/g, '\n')
813
+ .replace(/\n$/, '')
814
+ .split('\n')
815
+ .map(line => line.split('\t'));
816
+ if (!tsvRows.length) {
817
+ return;
818
+ }
819
+ /* 엑셀식 타일링: 타겟 선택 영역이 소스 크기의 정수배이면 그 차원으로 반복, 아니면 1회 (차원별 독립 판정) */
820
+ const srcRows = tsvRows.length;
821
+ const srcCols = Math.max(...tsvRows.map(r => r.length));
822
+ const repeatR = srcRows > 0 && tgtRows % srcRows === 0 ? tgtRows / srcRows : 1;
823
+ const repeatC = srcCols > 0 && tgtCols % srcCols === 0 ? tgtCols / srcCols : 1;
824
+ for (let rowOffset = 0; rowOffset < srcRows * repeatR; rowOffset++) {
791
825
  const targetRowIndex = row + rowOffset;
792
826
  var targetRecord = records[targetRowIndex] || { __dirty__: '+' };
793
827
  if (targetRowIndex >= records.length) {
794
828
  records.push(targetRecord);
795
829
  }
796
- const tsvCells = line.split('\t');
797
- tsvCells.forEach((cellValue, colOffset) => {
830
+ const tsvCells = tsvRows[rowOffset % srcRows];
831
+ for (let colOffset = 0; colOffset < srcCols * repeatC; colOffset++) {
832
+ const cellValue = (_b = tsvCells[colOffset % srcCols]) !== null && _b !== void 0 ? _b : ''; /* ragged row 방어 */
798
833
  const targetColumn = columns[column + colOffset];
799
834
  if (!targetColumn || targetColumn.gutterName)
800
- return;
835
+ continue;
801
836
  let { editable } = targetColumn.record;
802
837
  if (typeof editable === 'function') {
803
838
  editable = editable.call(this, cellValue, targetColumn, targetRecord, targetRowIndex, this);
@@ -821,8 +856,8 @@ let DataGridBody = class DataGridBody extends LitElement {
821
856
  }
822
857
  }));
823
858
  }
824
- });
825
- });
859
+ }
860
+ }
826
861
  }
827
862
  }
828
863
  catch (e) {
@@ -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 { 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'\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 [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-record-focused-cell-border);\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 :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 @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 * 레코드를 추가할 수 있는 경우에는 항상 추가 레코드를 보여준다.\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 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 ${columns.map(\n (column, idxColumn) => html`\n <ox-grid-field\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 <ox-grid-field\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 `\n })}\n ${accumulator\n ? html`\n ${columns.map(\n (column, idxColumn) => html`\n <ox-grid-accum-field\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 .data=${data}\n .columnIndex=${-1}\n .rowIndex=${records.length}\n .record=${accumRecord!}\n ></ox-grid-accum-field>\n `\n : nothing}\n ${start && end && start !== end ? html` <div select-block></div> ` : html``}\n <input id=\"ime-buffer\" type=\"text\" />\n <slot></slot>\n `\n }\n\n firstUpdated() {\n // TODO issue #13\n // this.addEventListener('scroll', this.handleOnScroll.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 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 getFieldByIndex(rowIndex: number, columnIndex: number, residue: boolean = true) {\n if (rowIndex < 0) {\n return\n }\n\n var columns = this.columns.filter(column => !column.hidden).length\n if (!residue && columnIndex >= columns) {\n return\n }\n\n return this.renderRoot.children.item(\n rowIndex * (columns + 1) /* 1 means last dummy column */ + ((columnIndex + columns) % columns)\n ) as DataGridField\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=\"{&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 const { row, column } = this.focused\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 this.focusedField!.isWorking = true\n await this.updateComplete\n this.focusedField!.isWorking = false\n }\n const rows = table.querySelectorAll('tr')\n\n rows.forEach((record, rowIndex) => {\n if (!(record instanceof HTMLTableRowElement)) {\n return\n }\n\n var targetRecord = records[row + rowIndex] || { __dirty__: '+' }\n if (row + rowIndex >= records.length) {\n records.push(targetRecord)\n }\n\n const cells = record.querySelectorAll('td')\n cells.forEach((item, columnIndex) => {\n const targetColumn = columns[column + columnIndex]\n if (!targetColumn || targetColumn.gutterName) return\n\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 const tsvRows = content.split('\\n')\n\n tsvRows.forEach((line, 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 = line.split('\\t')\n tsvCells.forEach((cellValue, colOffset) => {\n const targetColumn = columns[column + colOffset]\n if (!targetColumn || targetColumn.gutterName) return\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 /** 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":";AAAA,OAAO,sBAAsB,CAAA;AAC7B,OAAO,4BAA4B,CAAA;AAEnC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAkB,MAAM,KAAK,CAAA;AACpE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAA;AACxD,OAAO,QAAQ,MAAM,uBAAuB,CAAA;AAC5C,OAAO,OAAO,MAAM,sBAAsB,CAAA;AAE1C,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAE3E,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAA;AAEzE,sDAAsD;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAE7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,kDAAkD,CAAA;AAC3F,OAAO,EAAE,2BAA2B,EAAE,MAAM,qDAAqD,CAAA;AACjG,OAAO,EAAE,8BAA8B,EAAE,MAAM,yDAAyD,CAAA;AACxG,OAAO,EAAE,8BAA8B,EAAE,MAAM,wDAAwD,CAAA;AACvG,OAAO,EAAE,0BAA0B,EAAE,MAAM,oDAAoD,CAAA;AAC/F,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAA;AAE1D,MAAM,SAAS,GAAG,GAAG,CAAA;AACrB,MAAM,YAAY,GAAG,CAAC,CAAA;AACtB,MAAM,UAAU,GAAG,EAAE,CAAA;AACrB,MAAM,QAAQ,GAAG,CAAC,CAAA;AAElB,SAAS,aAAa,CAAC,MAAoB,EAAE,KAAc;IACzD,oFAAoF;IACpF,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,qBAAqB,EAAE,CAAA;IAChF,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,qBAAqB,EAAE,CAAA;IACjF,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,CAAA;IACtC,IAAI,cAAc,GAAG,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAA;IAC5D,IAAI,eAAe,GAAG,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAA;IAE/D,OAAO;QACL,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,SAAS;QACtG,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,SAAS;KACrG,CAAA;AACH,CAAC;AAED,8DAA8D;AAC9D,SAAS,uBAAuB,CAAC,IAAY,EAAE,MAAoB,EAAE,MAAmB;;IACtF,MAAM,cAAc,GAAG,MAAM,CAAC,CAAA,MAAA,MAAM,CAAC,MAAM,0CAAE,cAAc,KAAI,EAAE,CAAC,CAAA;IAClE,IAAI,EAAE,OAAO,GAAG,EAAE,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAA;IAE5E,wEAAwE;IACxE,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,OAAO,GAAI,OAAoB,EAAE,CAAA;QACnC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,SAAS,CAAA;QAClB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAA;IACnC,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAA;IAE9B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,OAAO;gBAAE,OAAO,GAAG,CAAA;QACxC,CAAC;aAAM,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC1C,MAAM,OAAO,GAAG,MAAM,CAAE,GAAW,CAAC,OAAO,IAAK,GAAW,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;YAC9E,MAAM,GAAG,GAAG,MAAM,CAAC,MAAC,GAAW,CAAC,KAAK,mCAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;YACnD,IAAI,OAAO,KAAK,OAAO,IAAI,GAAG,KAAK,OAAO;gBAAE,OAAQ,GAAW,CAAC,KAAK,CAAA;QACvE,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,GAAG;IACjB,GAAG,EAAE,CAAC;IACN,MAAM,EAAE,CAAC;CACV,CAAA;AAGM,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,UAAU;IAArC;;QACL,aAAQ,GAAG,QAAQ,CAAC,CAAC,SAAiB,EAAE,YAAoB,EAAE,EAAE;;YAC9D,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAA;YACxE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC,GAAG,cAAc,GAAG,YAAY,CAAC,CAAA;YACzG,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA,MAAA,IAAI,CAAC,IAAI,CAAC,OAAO,0CAAE,MAAM,KAAI,CAAC,EAAE,IAAI,GAAG,cAAc,GAAG,CAAC,YAAY,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YAEnG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;YAChB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;QACd,CAAC,EAAE,SAAS,CAAC,CAAA;QAyFe,WAAM,GAAgB,WAAW,CAAA;QAClC,YAAO,GAAmB,EAAE,CAAA;QAC3B,SAAI,GAAc,SAAS,CAAA;QAC3B,YAAO,GAAoC,UAAU,CAAA;QACrD,eAAU,GAAqE,IAAI,CAAA;QACnF,SAAI,GAAG,CAAC,CAAC,CAAA;QACT,OAAE,GAAG,CAAC,CAAC,CAAA;QACR,eAAU,GAAa,EAAE,CAAA;QAkBpD,kBAAa,GAAY,KAAK,CAAA;QAC9B,gBAAW,GAAY,KAAK,CAAA;QAC5B,sBAAiB,GAAY,KAAK,CAAA;QAoVlC,eAAe;QACf,yBAAoB,GAAkB,GAAG,EAAE;YACzC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAA;QACpB,CAAC,CAAA;IAsqBH,CAAC;IA3/BC,iEAAiE;IACjE,IAAY,kBAAkB;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAC,OAAA,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC,CAAA,MAAA,MAAM,CAAC,MAAM,0CAAE,QAAQ,CAAA,CAAA,EAAA,CAAC,CAAA;IACvG,CAAC;IAED,SAAS;QACP,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;IACxB,CAAC;IAED,cAAc,CAAC,CAAa;QAC1B,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC,MAAqB,CAAA;QAC3D,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;IACxC,CAAC;IAED,YAAY;IACZ,0BAA0B;IAC1B,WAAW;IACX,IAAI;IAEJ,MAAM;QACJ,iDAAiD;QACjD,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;QAC3F,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAA;QAExF,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAC3D,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QACpB,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;QACtB,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAA;QAC9D,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,IAAI,EAAE,CAAA;QAE9C;;;;WAIG;QACH,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,GAAG,CAAC,GAAG,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAA;QAC5C,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,WAAW,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAA;QACjD,CAAC;QAED,OAAO,IAAI,CAAA;QACP,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;YAC/B,IAAI,cAAc,GAAG,MAAM,KAAK,UAAU,CAAA;YAC1C,IAAI,YAAY,GAAG,MAAM,CAAC,cAAc,CAAC,CAAA;YACzC,IAAI,OAAO,GAAG,MAAM,GAAG,CAAC,CAAA;YACxB,IAAI,WAAW,GAAG,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAA;YACjD,IAAI,EAAE,UAAU,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CAAA;YAEhE,OAAO,IAAI,CAAA;YACP,OAAO,CAAC,GAAG,CACX,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,IAAI,CAAA;;wBAEf,IAAI;wBACJ,MAAM,CAAC,IAAI;4BACP,MAAM;+BACH,SAAS;0BACd,MAAM;0BACN,MAAM;2BACL,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB;8BACvD,UAAU;6BACX,CAAC,CAAC,MAAM,CAAC,SAAS;0BACrB,MAAM,CAAC,IAAI,IAAI,QAAQ;uBAC1B,OAAO;+BACC,cAAc;gCACb,YAAY;2BACjB,MAAM,KAAK,UAAU,IAAI,SAAS,KAAK,aAAa;2BACpD,MAAM,KAAK,UAAU,IAAI,SAAS,KAAK,aAAa;6BAClD,SAAS;yBACb,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;yBACnB,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;wBAC3B,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;;aAEhD,CACF;;oBAES,IAAI;wBACA,MAAM;2BACH,CAAC,CAAC;sBACP,MAAM;0BACF,UAAU;mBACjB,OAAO;2BACC,cAAc;4BACb,YAAY;;SAE/B,CAAA;QACH,CAAC,CAAC;QACA,WAAW;YACX,CAAC,CAAC,IAAI,CAAA;cACA,OAAO,CAAC,GAAG,CACX,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,IAAI,CAAA;;0BAEf,IAAI;iCACG,SAAS;8BACZ,OAAO,CAAC,MAAM;4BAChB,MAAM;4BACN,WAAY;2BACb,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;0BACzB,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;;eAEhD,CACF;;sBAES,IAAI;6BACG,CAAC,CAAC;0BACL,OAAO,CAAC,MAAM;wBAChB,WAAY;;WAEzB;YACH,CAAC,CAAC,OAAO;QACT,KAAK,IAAI,GAAG,IAAI,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAA,4BAA4B,CAAC,CAAC,CAAC,IAAI,CAAA,EAAE;;;KAG5E,CAAA;IACH,CAAC;IAED,YAAY;QACV,iBAAiB;QACjB,kEAAkE;QAElE,2BAA2B;QAC3B,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;QAEnC,4CAA4C;QAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,CAAqB,CAAA;QAClF,IAAI,CAAC,UAAU,GAAG,SAAS,CAAA;QAE3B,SAAS,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,GAAG,EAAE;YAClD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;YACzB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;YACvB,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YACjC,IAAI,CAAC,kBAAkB,EAAE,CAAA;QAC3B,CAAC,CAAC,CAAA;QAEF,SAAS,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,GAAG,EAAE;YAChD,IAAI,CAAC,aAAa,GAAG,KAAK,CAAA;QAC5B,CAAC,CAAC,CAAA;QAEF,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YACvC,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;gBAChE,+BAA+B;gBAC/B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;gBACvB,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;gBACjC,IAAI,CAAC,kBAAkB,EAAE,CAAA;YAC3B,CAAC;QACH,CAAC,CAAC,CAAA;QAEF;;;;WAIG;QACH,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE;;YACpC,kDAAkD;YAClD,MAAM,OAAO,GAAI,CAAgB,CAAC,aAAqB,CAAA;YACvD,IAAI,OAAO,KAAI,MAAA,IAAI,CAAC,UAAU,0CAAE,QAAQ,CAAC,OAAO,CAAC,CAAA,EAAE,CAAC;gBAClD,OAAM;YACR,CAAC;YAED,oCAAoC;YACpC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAA;gBAClD,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;YACpC,CAAC;YAED,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC1B,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAA;gBAC1D,OAAO,IAAI,CAAC,gBAAgB,CAAA;YAC9B,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE;YACnC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC3B,IAAI,CAAC,gBAAgB,GAAG,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBAC7D,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAA;YACzD,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;YAClD,CAAC,CAAC,eAAe,EAAE,CAAA;YAEnB,MAAM,EAAE,QAAQ,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,EAAE,GAAK,CAAiB,CAAC,MAAc,IAAI,EAAE,CAAA;YAEjH,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,WAAW,CAAkB,CAAA;YAC1E,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,SAAS,CAAkB,CAAA;YAEpE,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QACjC,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,aAAa,EAAE,CAAC,KAAY,EAAE,EAAE;YAC/D,MAAM,CAAC,GAAG,KAAmB,CAAA;YAC7B,IAAI,CAAC,cAAc,EAAE,CAAA;YAErB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAA;YAEvB,IAAI,MAAM,GAAI,CAAC,CAAC,MAAkB,CAAC,OAAO,CAAC,eAAe,CAAkB,CAAA;YAC5E,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,IAAI,EAAE,CAAA;YAE5C,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,cAAc,EAAE;gBAC9B,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE;oBACN,GAAG,EAAE,QAAQ;oBACb,MAAM,EAAE,WAAW;iBACpB;aACF,CAAC,CACH,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,aAAa,EAAE,CAAC,CAAQ,EAAE,EAAE;YAC3D,MAAM,EAAE,GAAG,CAAiB,CAAA;YAC5B,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,KAAK,OAAO,CAAA;YAE1C,wDAAwD;YACxD,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAA;YAEhC,mCAAmC;YACnC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAA;gBAClD,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;YACpC,CAAC;YAED,IAAI,CAAC,cAAc,EAAE,CAAA;YAErB,IAAI,OAAO,EAAE,CAAC;gBACZ,iDAAiD;gBACjD,OAAM;YACR,CAAC;YAED,IAAI,SAAS,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;gBACvC,OAAM;YACR,CAAC;YAED,CAAC,CAAC,cAAc,EAAE,CAAA;YAClB,CAAC,CAAC,eAAe,EAAE,CAAA;YAEnB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;YAEtB,IAAI,MAAM,GAAI,CAAC,CAAC,MAAkB,CAAC,OAAO,CAAC,eAAe,CAAkB,CAAA;YAC5E,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,IAAI,EAAE,CAAA;YAE5C,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,cAAc,EAAE;gBAC9B,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE;oBACN,GAAG,EAAE,QAAQ;oBACb,MAAM,EAAE,WAAW;iBACpB;aACF,CAAC,CACH,CAAA;YAED,IAAI,WAAW,IAAI,CAAC,IAAI,MAAM,CAAC,eAAe,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC1F,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;YAC7C,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,aAAa,EAAE,CAAC,KAAY,EAAE,EAAE;YAC/D,MAAM,CAAC,GAAG,KAAqB,CAAA;YAC/B,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBAC5D,OAAM;YACR,CAAC;YAED,CAAC,CAAC,cAAc,EAAE,CAAA;YAClB,CAAC,CAAC,eAAe,EAAE,CAAA;YAEnB,MAAM,KAAK,GAAG,CAAC,CAAC,MAAuB,CAAA;YACvC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;gBACvB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,IAAI,KAAK,EAAE,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,CAAA;gBAE3E,OAAM;YACR,CAAC;YAED,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,IAAI,EAAE,CAAA;YAE5C,IAAI,KAAK,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;gBAC3B,GAAG,GAAG,KAAK,CAAA;gBAEX,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;YACjC,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,KAAY,EAAE,EAAE;YAC7D,IAAK,KAAsB,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;gBACpD,KAAK,CAAC,cAAc,EAAE,CAAA;gBACtB,KAAK,CAAC,eAAe,EAAE,CAAA;YACzB,CAAC;YAED,IAAI,CAAC,UAAU,GAAG,KAAK,CAAA;QACzB,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAC9E,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,UAAU,EAAE,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACpF,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,aAAa,EAAE,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAE1F,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAEhF,qBAAqB,CAAC,GAAG,EAAE;YACzB,0CAA0C;YAC1C,MAAM,YAAY,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,CAAC,IAAI,EAAE,CAAA;YAC7F,2BAA2B;YAC3B,MAAM,SAAS,GAAG,8EAA8E,YAAY,qEAAqE,CAAA;YAEjL,+DAA+D;YAC/D,MAAM,UAAU,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAA;YAChD,IAAI,CAAC,KAAK,CAAC,WAAW,CACpB,4BAA4B;YAC5B,2CAA2C;YAC3C,2BAA2B,UAAU,IAAI,CAC1C,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,CAAC,CAAQ,EAAE,EAAE,CACrD,IAAI,CAAC,eAAe,CAAE,CAAiB,CAAC,MAA8C,CAAC,CACxF,CAAA;QAED,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE;YAC9B,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;QACzF,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,iBAAiB;;QACf,KAAK,CAAC,iBAAiB,EAAE,CAAA;QACzB,kDAAkD;QAClD,IAAI,CAAC,YAAY,GAAG,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;QACpD,MAAA,IAAI,CAAC,YAAY,0CAAE,gBAAgB,CAAC,qBAAqB,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAA;IACvF,CAAC;IAED,oBAAoB;QAClB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,qBAAqB,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAA;QACzF,CAAC;QACD,KAAK,CAAC,oBAAoB,EAAE,CAAA;IAC9B,CAAC;IAOD,eAAe,CAAC,QAAgB,EAAE,WAAmB,EAAE,UAAmB,IAAI;QAC5E,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YACjB,OAAM;QACR,CAAC;QAED,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAA;QAClE,IAAI,CAAC,OAAO,IAAI,WAAW,IAAI,OAAO,EAAE,CAAC;YACvC,OAAM;QACR,CAAC;QAED,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAClC,QAAQ,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,+BAA+B,GAAG,CAAC,CAAC,WAAW,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,CAC9E,CAAA;IACpB,CAAC;IAED,eAAe,CAAC,GAAW,EAAE,MAAc,EAAE,YAA2B,IAAI;QAC1E,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAA;QAC/E,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;YAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;YACvC,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;QAChF,CAAC;QAED,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAM;QACR,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,MAAM,EAAE,CAAC;YACtF,OAAM;QACR,CAAC;QAED,+BAA+B;QAC/B,IAAI,CAAC,eAAe,EAAE,CAAA;QAEtB,IAAI,CAAC,UAAU,GAAG;YAChB,GAAG;YACH,MAAM;YACN,SAAS;SACV,CAAA;IACH,CAAC;IAED,YAAY,CAAC,OAAY;QACvB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;YAC/B;;eAEG;YACH,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;QACxB,CAAC;QAED,OAAO,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAA;IACpC,CAAC;IAED,OAAO,CAAC,OAA6B;;QACnC,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,IAAI,OAAO,GAAG,MAAA,IAAI,CAAC,UAAU,0CAAE,aAAa,CAAC,WAAW,CAAC,CAAA;YACzD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAM;YACR,CAAC;YAED,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;YAChD,0DAA0D;YAC1D,gBAAgB;YAChB,SAAS;YACT,UAAU;YACV,uBAAuB;YACvB,KAAK;YACL,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBACtB,IAAI,CAAC,SAAS,GAAG,GAAG,CAAA;YACtB,CAAC;YACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;YACxB,CAAC;YAED,wBAAwB;YACxB,IAAI,CAAC,kBAAkB,EAAE,CAAA;YACzB,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC9F,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAA;YACzB,CAAC;QACH,CAAC;QAED,mBAAmB;QACnB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAA0B,CAAA;YAC7D,MAAM,QAAQ,GAAG,QAAQ,IAAK,QAAgB,CAAC,IAAI,CAAA;YACnD,MAAM,QAAQ,GAAI,IAAI,CAAC,IAAY,CAAC,IAAI,CAAA;YACxC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACpD,IAAI,CAAC,SAAS,GAAG,CAAC,CAAA;YACpB,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,cAAe,CAAC,CAAA;QACnE,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,iDAAiD;YACjD,OAAM;QACR,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1E,4DAA4D;YAC5D,IAAI,CAAC,kBAAkB,EAAE,CAAA;YACzB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAA;QACzB,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,KAAK,EAAE,CAAA;QACf,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YAChC,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,CAAA;YAC3B,IAAI,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAA;YAE7D,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,CAAA;QACxD,CAAC;IACH,CAAC;IAED,eAAe,CAAC,EAAE,MAAM,EAAE,GAAG,EAAwC;QACnE,IAAI,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAA;QACrD,IAAI,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,CAAA;QAE9B,wCAAwC;QACxC,IAAI,OAAO,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,UAAU,CAAC,CAAA;YAC1E,KAAK,GAAG,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,cAAc,CAAC,CAAA;QAClF,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,GAAG,CAAA;QACzB,IAAI,CAAC,WAAW,GAAG,iBAAiB,CAClC,IAAI,CAAC,MAAM,CAAC,OAAO,EACnB,MAAM,EACN,GAAG,EACH,IAAI,EACJ;YACE,KAAK;SACN,EACD,GAAG,EAAE;YACH,OAAO,IAAI,CAAC,WAAW,CAAA;YACvB,OAAO,IAAI,CAAC,cAAc,CAAA;QAC5B,CAAC,CACF,CAAA;IACH,CAAC;IAED,4DAA4D;IAC5D,sBAAsB;QACpB,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,IAAI,EAAE,CAAA;QAE5C,IAAI,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,EAAE,CAAC;YACpB,KAAK,GAAG,IAAI,CAAC,YAAY,CAAA;YAEzB,GAAG,GAAG,KAAK,CAAA;QACb,CAAC;QAED,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;YACjB,MAAM,aAAa,GAAG,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAA;YACnF,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAA;YACjF,MAAM,gBAAgB,GAAG,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAA;YAClG,MAAM,cAAc,GAAG,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAA;YAEhG,MAAM,WAAW,GAAG,IAAI,KAAK,CAAC,cAAc,GAAG,gBAAgB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;YAC3F,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YAE7D;;;;;;;eAOG;YACH,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,WAAW,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBAC/F,MAAM,QAAQ,GAAG,KAAK,GAAG,KAAK,CAAA;gBAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;gBAE1C,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;;oBAC7C,MAAM,WAAW,GAAG,KAAK,GAAG,KAAK,CAAA;oBACjC,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;oBACnC,MAAM,KAAK,GAAG,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAG,MAAM,CAAC,IAAI,CAAC,CAAA;oBACnC,MAAM,IAAI,GAAG,OAAO,KAAK,CAAA;oBAEzB,kEAAkE;oBAClE,IAAI,aAAa,GAAQ,KAAK,CAAA;oBAC9B,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;wBACtE,MAAM,GAAG,GAAG,MAAA,MAAM,CAAC,CAAA,MAAA,MAAM,CAAC,MAAM,0CAAE,cAAc,KAAI,EAAE,CAAC,mCAAI,MAAM,CAAC,MAAM,CAAA;wBACxE,MAAM,OAAO,GAAU,KAAK,CAAC,OAAO,CAAC,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAA;wBACrE,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,WAAC,OAAA,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAA,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,KAAK,mCAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAA,EAAA,CAAC,CAAA;wBAC1H,aAAa,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;oBAClG,CAAC;oBAED,sFAAsF;oBACtF,MAAM,QAAQ,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAA;oBAEzJ,uGAAuG;oBACvG,IAAI,SAAS,GAAQ,EAAE,CAAA;oBACvB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;wBAC1C,mDAAmD;wBACnD,IAAI,MAAA,MAAM,CAAC,MAAM,0CAAE,QAAQ,EAAE,CAAC;4BAC5B,IAAI,CAAC;gCACH,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAW,CAAC,CAAA;gCAC9E,IAAI,OAAO,CAAC,KAAK,QAAQ;oCAAE,SAAS,GAAG,CAAC,CAAA;4BAC1C,CAAC;4BAAC,OAAO,CAAC,EAAE,CAAC,CAAA,CAAC;wBAChB,CAAC;oBACH,CAAC;yBAAM,IAAI,IAAI,IAAI,QAAQ,EAAE,CAAC;wBAC5B,+CAA+C;wBAC/C,MAAM,OAAO,GAAI,KAAa,aAAb,KAAK,uBAAL,KAAK,CAAU,IAAI,CAAA;wBACpC,SAAS,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAA;wBACtD,IAAI,CAAC,SAAS,KAAI,MAAA,MAAM,CAAC,MAAM,0CAAE,QAAQ,CAAA,EAAE,CAAC;4BAC1C,IAAI,CAAC;gCACH,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAW,CAAC,CAAA;gCAC9E,IAAI,OAAO,CAAC,KAAK,QAAQ;oCAAE,SAAS,GAAG,CAAC,CAAA;4BAC1C,CAAC;4BAAC,OAAO,CAAC,EAAE,CAAC,CAAA,CAAC;wBAChB,CAAC;oBACH,CAAC;yBAAM,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wBACpC,SAAS,GAAG,aAAa,CAAA;oBAC3B,CAAC;yBAAM,CAAC;wBACN,SAAS,GAAG,KAAK,CAAA;oBACnB,CAAC;oBAED,8DAA8D;oBAC9D,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;wBACnF,SAAS,GAAG,EAAE,CAAA;oBAChB,CAAC;oBAED,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAA;gBACtC,CAAC,CAAC,CAAA;gBAEF,OAAO,KAAK,CAAA;YACd,CAAC,CAAC,CAAA;YAEF,MAAM,UAAU,GAAG,CAAC,MAAW,EAAE,EAAE;gBACjC,IAAI,MAAM,IAAI,IAAI;oBAAE,OAAO,EAAE,CAAA;gBAC7B,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC;oBACnD,QAAQ,CAAC,EAAE,CAAC;wBACV,KAAK,GAAG;4BACN,OAAO,OAAO,CAAA;wBAChB,KAAK,GAAG;4BACN,OAAO,MAAM,CAAA;wBACf,KAAK,GAAG;4BACN,OAAO,MAAM,CAAA;wBACf,KAAK,GAAG;4BACN,OAAO,QAAQ,CAAA;wBACjB,KAAK,GAAG;4BACN,OAAO,QAAQ,CAAA;wBACjB;4BACE,OAAO,CAAC,CAAA;oBACZ,CAAC;gBACH,CAAC,CAAC,CAAA;YACJ,CAAC,CAAA;YAED,MAAM,IAAI,GACR,SAAS;gBACT,IAAI;qBACD,GAAG,CACF,KAAK,CAAC,EAAE,CACN,MAAM;oBACN,KAAK;yBACF,GAAG,CAAC,CAAC,CAAC,EAAE,CACP,CAAC,CAAC,IAAI,IAAI,QAAQ,IAAI,CAAC,CAAC,QAAQ;wBAC9B,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,gBAAgB,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO;wBAC7F,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,IAAI,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CACxD;yBACA,IAAI,CAAC,EAAE,CAAC;oBACX,OAAO,CACV;qBACA,IAAI,CAAC,EAAE,CAAC;gBACX,UAAU,CAAA;YAEZ,kCAAkC;YAClC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAEzF,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;QACvB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAA;QAC5C,IAAI,CAAC,MAAM;YAAE,OAAM;QAEnB,MAAM,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC;YAC9B,IAAI,aAAa,CAAC;gBAChB,WAAW,EAAE,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;gBAC3D,YAAY,EAAE,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;aAC9D,CAAC;SACH,CAAC,CAAA;QAEF,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,YAAY,CAAA;QACzD,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,eAAe,GAAG,WAAW,CAAC,KAAK,CAAC,eAAe,CAAA;YACzD,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAA;YAEzC,WAAW,CAAC,YAAY,CAAC,cAAc,EAAE,sBAAsB,CAAC,CAAA;YAChE,MAAM,IAAI,GAAG,WAAW,CAAC,qBAAqB,EAAE,CAAA;YAChD,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,eAAe,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAA;YAC/D,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,gBAAgB,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,CAAA;YAEjE,WAAW,CAAC,KAAK,CAAC,eAAe,GAAG,KAAK,CAAA;YACzC,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAA;YACjC,MAAM,KAAK,CAAC,GAAG,CAAC,CAAA;YAChB,WAAW,CAAC,eAAe,CAAC,cAAc,CAAC,CAAA;YAC3C,WAAW,CAAC,KAAK,CAAC,eAAe,GAAG,eAAe,CAAA;YACnD,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAA;QACrC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;;QACT,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,EAAE,CAAA;YAEvC,MAAM,cAAc,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;YACvD,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,OAAM;YACR,CAAC;YAED,IAAI,IAAwB,CAAA;YAC5B,IAAI,OAA2B,CAAA;YAE/B,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE,CAAC;gBAC3C,IAAI,CAAC;oBACH,IAAI,IAAI,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;oBACnD,OAAO,GAAG,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;oBACrC,IAAI,GAAG,WAAW,CAAA;gBACpB,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,IAAI,CAAC;wBACH,IAAI,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;wBAChD,OAAO,GAAG,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;wBACrC,IAAI,GAAG,YAAY,CAAA;oBACrB,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC,CAAA,CAAC;gBAChB,CAAC;gBAED,MAAK;YACP,CAAC;YAED,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAM;YACR,CAAC;YAED,qEAAqE;YACrE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAA;YAClC,IAAI,OAAO,GAAG,CAAC,CAAA;YACf,IAAI,OAAO,GAAG,CAAC,CAAA;YACf,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,IAAI,EAAE,CAAA;YAC9C,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;gBACjB,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;gBAC5C,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,CAAA;gBACrD,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;gBACrD,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;YAC7D,CAAC;YAED,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,CAAA;YAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YAE7D,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;gBACzB,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;gBACzC,GAAG,CAAC,SAAS,GAAG,OAAQ,CAAC,IAAI,EAAE,CAAA;gBAC/B,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAC,OAAO,CAAqB,CAAA;gBAC5D,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,OAAM;gBACR,CAAC;gBAED,IAAI,SAAS,EAAE,CAAC;oBACd,IAAI,CAAC,SAAS,EAAE,CAAA;oBAChB,SAAS,CAAC,eAAe,EAAE,CAAA;oBAE3B,oDAAoD;oBACpD,mDAAmD;oBACnD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;wBACtB,IAAI,CAAC,YAAY,CAAC,SAAS,GAAG,IAAI,CAAA;wBAClC,MAAM,IAAI,CAAC,cAAc,CAAA;wBACzB,IAAI,CAAC,YAAY,CAAC,SAAS,GAAG,KAAK,CAAA;oBACrC,CAAC;gBACH,CAAC;gBACD,mEAAmE;gBACnE,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CACzD,CAAC,CAAC,EAA4B,EAAE,CAAC,CAAC,YAAY,mBAAmB,CAClE,CAAA;gBACD,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;oBAChB,OAAM;gBACR,CAAC;gBACD,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAA;gBAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;gBAC5E,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,IAAI,OAAO,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;gBAC9E,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,IAAI,OAAO,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;gBAE9E,KAAK,IAAI,QAAQ,GAAG,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC;oBAChE,IAAI,YAAY,GAAG,OAAO,CAAC,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAA;oBAChE,IAAI,GAAG,GAAG,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;wBACrC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;oBAC5B,CAAC;oBAED,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,GAAG,OAAO,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAA;oBAC5D,KAAK,IAAI,WAAW,GAAG,CAAC,EAAE,WAAW,GAAG,OAAO,GAAG,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC;wBACzE,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC,CAAA;wBACzC,IAAI,CAAC,IAAI;4BAAE,SAAQ,CAAC,mBAAmB;wBACvC,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,WAAW,CAAC,CAAA;wBAClD,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,UAAU;4BAAE,SAAQ,CAAC,+BAA+B;wBACtF,yDAAyD;wBACzD,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,WAAW,CAAQ,CAAA;wBAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAA;wBACxD,IAAI,IAAI,GAAG,YAAY,CAAC,IAAI,IAAI,UAAU,CAAA;wBAC1C,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAA,CAAC,eAAe;wBAChE,IAAI,EAAE,QAAQ,EAAE,GAAG,YAAY,CAAC,MAAM,CAAA;wBACtC,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;4BACnC,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;wBAC9E,CAAC;wBAED,IAAI,KAAK,EAAE,CAAC;4BACV,QAAQ,IAAI,EAAE,CAAC;gCACb,KAAK,QAAQ;oCACX,uBAAuB;oCACvB,IAAI,CAAC;wCACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,CAAA;wCACjC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;4CAC7F,CAAC,CAAC,IAAI;4CACN,CAAC,CAAC,KAAK,CAAA;oCACX,CAAC;oCAAC,OAAO,GAAG,EAAE,CAAC;wCACb,KAAK,GAAG,IAAI,CAAA;oCACd,CAAC;oCACD,MAAK;gCACP,KAAK,YAAY;oCACf,IAAI,CAAC;wCACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,CAAA;oCACrC,CAAC;oCAAC,OAAO,GAAG,EAAE,CAAC;wCACb,KAAK,GAAG,IAAI,CAAA;oCACd,CAAC;oCACD,MAAK;gCACP,KAAK,SAAS,CAAC;gCACf,KAAK,UAAU;oCACb,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;oCACjD,MAAK;gCACP,KAAK,QAAQ,CAAC;gCACd,KAAK,OAAO,CAAC;gCACb,KAAK,SAAS,CAAC;gCACf,KAAK,UAAU;oCACb,KAAK,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAA;oCAClC,MAAK;gCACP,KAAK,QAAQ;oCACX,IAAI,CAAC;wCACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;wCAChC,sDAAsD;wCACtD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;4CAClD,KAAK,GAAG,CAAA,MAAA,IAAI,CAAC,WAAW,0CAAE,IAAI,EAAE,KAAK,MAAc,CAAC,IAAI,IAAI,EAAE,CAAA;wCAChE,CAAC;6CAAM,CAAC;4CACN,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAA;wCAC/B,CAAC;oCACH,CAAC;oCAAC,OAAO,GAAG,EAAE,CAAC,CAAA,CAAC;oCAChB,MAAK;gCACP,KAAK,QAAQ;oCACX,4DAA4D;oCAC5D,KAAK,GAAG,uBAAuB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,YAAY,CAAC,CAAA;oCAC1E,MAAK;gCACP;oCACE;4DACwB;oCACxB,IAAI,UAAU,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;wCACnD,KAAK,GAAG,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,EAAE,CAAA;oCACvB,CAAC;yCAAM,CAAC;wCACN,IAAI,CAAC;4CACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;wCAC3B,CAAC;wCAAC,OAAO,GAAG,EAAE,CAAC;4CACb,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;gDAAE,KAAK,GAAG,IAAI,CAAA;wCAC9D,CAAC;oCACH,CAAC;4BACL,CAAC;wBACH,CAAC;6BAAM,CAAC;4BACN,8EAA8E;4BAC9E,KAAK,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;wBAC5C,CAAC;wBAED,IAAI,YAAY,IAAI,CAAC,YAAY,CAAC,UAAU,IAAI,QAAQ,EAAE,CAAC;4BACzD,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,cAAc,EAAE;gCAC9B,OAAO,EAAE,IAAI;gCACb,QAAQ,EAAE,IAAI;gCACd,MAAM,EAAE;oCACN,MAAM,EAAE,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC;oCACvC,KAAK,EAAE,KAAK;oCACZ,MAAM,EAAE,YAAY;oCACpB,MAAM,EAAE,YAAY;oCACpB,GAAG,EAAE,GAAG,GAAG,QAAQ;iCACpB;6BACF,CAAC,CACH,CAAA;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,OAAM;YACR,CAAC;iBAAM,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;gBACjC,0DAA0D;gBAC1D,kEAAkE;gBAClE,MAAM,OAAO,GAAG,OAAO;qBACpB,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;qBACtB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;qBAClB,KAAK,CAAC,IAAI,CAAC;qBACX,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;gBAChC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;oBACpB,OAAM;gBACR,CAAC;gBAED,mEAAmE;gBACnE,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAA;gBAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;gBACvD,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,IAAI,OAAO,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;gBAC9E,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,IAAI,OAAO,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;gBAE9E,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,OAAO,EAAE,SAAS,EAAE,EAAE,CAAC;oBACnE,MAAM,cAAc,GAAG,GAAG,GAAG,SAAS,CAAA;oBACtC,IAAI,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAA;oBAChE,IAAI,cAAc,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;wBACrC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;oBAC5B,CAAC;oBAED,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,CAAA;oBAC7C,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,OAAO,EAAE,SAAS,EAAE,EAAE,CAAC;wBACnE,MAAM,SAAS,GAAG,MAAA,QAAQ,CAAC,SAAS,GAAG,OAAO,CAAC,mCAAI,EAAE,CAAA,CAAC,mBAAmB;wBACzE,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;wBAChD,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,UAAU;4BAAE,SAAQ;wBAEtD,IAAI,EAAE,QAAQ,EAAE,GAAG,YAAY,CAAC,MAAM,CAAA;wBACtC,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;4BACnC,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,IAAI,CAAC,CAAA;wBAC7F,CAAC;wBAED,IAAI,QAAQ,EAAE,CAAC;4BACb,4DAA4D;4BAC5D,kFAAkF;4BAClF,IAAI,aAAa,GAAQ,SAAS,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;4BAC1E,IAAI,YAAY,CAAC,IAAI,KAAK,QAAQ,IAAI,SAAS,EAAE,CAAC;gCAChD,aAAa,GAAG,uBAAuB,CAAC,SAAS,EAAE,YAAY,EAAE,YAAY,CAAC,CAAA;4BAChF,CAAC;4BAED,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,cAAc,EAAE;gCAC9B,OAAO,EAAE,IAAI;gCACb,QAAQ,EAAE,IAAI;gCACd,MAAM,EAAE;oCACN,MAAM,EAAE,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC;oCACvC,KAAK,EAAE,aAAa;oCACpB,MAAM,EAAE,YAAY;oCACpB,MAAM,EAAE,YAAY;oCACpB,GAAG,EAAE,cAAc;iCACpB;6BACF,CAAC,CACH,CAAA;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;QACxB,CAAC;gBAAS,CAAC;YACT,6BAA6B;YAC7B,IAAI,CAAC,KAAK,EAAE,CAAA;QACd,CAAC;IACH,CAAC;IAED,cAAc,CAAC,KAAqB,EAAE,GAAmB;;QACvD,IAAI,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,WAAW,KAAI,CAAC,CAAC,EAAE,CAAC;YAC7B,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QACxG,CAAC;QAED,IAAI,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,WAAW,KAAI,CAAC,CAAC,EAAE,CAAC;YAC3B,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QACpG,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,KAAK,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAA;QAE3C,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;YACjB,MAAA,MAAM,CAAC,YAAY,EAAE,0CAAE,eAAe,EAAE,CAAA;YAExC,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;gBAClB,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAA;gBAC9D,MAAM,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAA;gBAC1C,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAA;gBACvD,MAAM,MAAM,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAA;gBAE1C,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAA;gBAC3B,MAAM,EAAE,SAAS,EAAE,GAAG,GAAG,CAAA;gBACzB,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,GAAG,UAAU,GAAG,KAAK,CAAC,WAAW,CAAA;gBAC/D,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC,YAAY,CAAA;gBAEjE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,mBAAmB,EAAE,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,CAAA;gBAClE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,kBAAkB,EAAE,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,CAAA;gBAChE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,oBAAoB,EAAE,KAAK,GAAG,IAAI,CAAC,CAAA;gBAC1D,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC,CAAA;YAC9D,CAAC;YAED,IAAI,CAAC,KAAK,EAAE,CAAA;QACd,CAAC;IACH,CAAC;IAED,sBAAsB;QACpB,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAE3D,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;YACvC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;gBACvB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,CAAA;YACzE,CAAC;YACD,OAAO,MAAM,CAAA;QACf,CAAC,EAAE,EAAiB,CAAC,CAAA;IACvB,CAAC;IAED,kCAAkC;IAC1B,kBAAkB;;QACxB,MAAM,SAAS,GAAG,MAAA,IAAI,CAAC,UAAU,0CAAE,aAAa,CAAC,WAAW,CAAgB,CAAA;QAC5E,IAAI,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACjC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC,UAAU,GAAG,IAAI,CAAA;YACxD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,GAAG,SAAS,CAAC,SAAS,GAAG,IAAI,CAAA;YACtD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,WAAW,GAAG,IAAI,CAAA;YAC1D,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,YAAY,GAAG,IAAI,CAAA;QAC9D,CAAC;IACH,CAAC;IAED,2CAA2C;IAC3C,gBAAgB,CAAC,GAAW,EAAE,MAAc;;QAC1C,MAAM,IAAI,GAAG,MAAA,IAAI,CAAC,UAAU,0CAAE,KAAK,CAAA;QACnC,IAAI,CAAC,eAAe,EAAE,CAAA;QAEtB,IAAI,CAAC,IAAI;YAAE,OAAM;QAEjB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;QACnD,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;QAC3B,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU;YAAE,OAAM;QAElC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAA;QAE3D,IAAI,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,MAAM,CAAA;QAC7B,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;YACnC,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;QAC1E,CAAC;QACD,IAAI,CAAC,QAAQ;YAAE,OAAM;QAErB,iBAAiB;QACjB,IAAI,KAAK,GAAQ,IAAI,CAAA;QACrB,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;YACjB,KAAK,QAAQ,CAAC;YACd,KAAK,OAAO,CAAC;YACb,KAAK,SAAS,CAAC;YACf,KAAK,UAAU;gBACb,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAA;gBACjC,IAAI,KAAK,KAAK,IAAI;oBAAE,OAAM;gBAC1B,MAAK;YACP,KAAK,SAAS,CAAC;YACf,KAAK,UAAU;gBACb,OAAM,CAAC,iCAAiC;QAC5C,CAAC;QAED,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,cAAc,EAAE;YAC9B,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE;gBACN,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;gBACxB,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,GAAG;gBACX,MAAM;gBACN,GAAG;aACJ;SACF,CAAC,CACH,CAAA;IACH,CAAC;IAED,4BAA4B;IAC5B,iBAAiB;QACf,IAAI,CAAC,eAAe,EAAE,CAAA;IACxB,CAAC;IAED,qBAAqB;IACb,eAAe;QACrB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,CAAA;YAC1B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QAC5C,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,KAAK,CAAA;QACxB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAA;IAC5B,CAAC;;AA9mCM,mBAAM,GAAG;IACd,iBAAiB;IACjB,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAkFF;CACF,AArFY,CAqFZ;AAE2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;4CAAkC;AAClC;IAA1B,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;6CAA6B;AAC3B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;0CAA4B;AAC3B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;6CAAsD;AACrD;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gDAAoF;AACnF;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;0CAAU;AACT;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;wCAAQ;AACR;IAA1B,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;gDAA0B;AAE3C;IAAR,KAAK,EAAE;kDAGP;AAEwB;IAAxB,KAAK,CAAC,gBAAgB,CAAC;iDAA6B;AACpB;IAAhC,KAAK,CAAC,wBAAwB,CAAC;kDAA6B;AAhHlD,YAAY;IADxB,aAAa,CAAC,cAAc,CAAC;GACjB,YAAY,CAynCxB","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 { 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'\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 [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-record-focused-cell-border);\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 :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 @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 * 레코드를 추가할 수 있는 경우에는 항상 추가 레코드를 보여준다.\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 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 ${columns.map(\n (column, idxColumn) => html`\n <ox-grid-field\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 <ox-grid-field\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 `\n })}\n ${accumulator\n ? html`\n ${columns.map(\n (column, idxColumn) => html`\n <ox-grid-accum-field\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 .data=${data}\n .columnIndex=${-1}\n .rowIndex=${records.length}\n .record=${accumRecord!}\n ></ox-grid-accum-field>\n `\n : nothing}\n ${start && end && start !== end ? html` <div select-block></div> ` : html``}\n <input id=\"ime-buffer\" type=\"text\" />\n <slot></slot>\n `\n }\n\n firstUpdated() {\n // TODO issue #13\n // this.addEventListener('scroll', this.handleOnScroll.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 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 getFieldByIndex(rowIndex: number, columnIndex: number, residue: boolean = true) {\n if (rowIndex < 0) {\n return\n }\n\n var columns = this.columns.filter(column => !column.hidden).length\n if (!residue && columnIndex >= columns) {\n return\n }\n\n return this.renderRoot.children.item(\n rowIndex * (columns + 1) /* 1 means last dummy column */ + ((columnIndex + columns) % columns)\n ) as DataGridField\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=\"{&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 /* 엑셀식 타일링: 타겟 선택 영역이 소스 크기의 정수배이면 그 차원으로 반복, 아니면 1회 (차원별 독립 판정) */\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 /* 엑셀식 타일링: 타겟 선택 영역이 소스 크기의 정수배이면 그 차원으로 반복, 아니면 1회 (차원별 독립 판정) */\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 /** 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"]}