@operato/data-grist 10.4.0 → 10.6.0
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 +34 -0
- package/dist/src/configure/column-builder.js +16 -0
- package/dist/src/configure/column-builder.js.map +1 -1
- package/dist/src/data-card/data-card-field.js +14 -0
- package/dist/src/data-card/data-card-field.js.map +1 -1
- package/dist/src/data-card/record-card.js +12 -1
- package/dist/src/data-card/record-card.js.map +1 -1
- package/dist/src/data-grid/data-grid-field.js +160 -1
- package/dist/src/data-grid/data-grid-field.js.map +1 -1
- package/dist/src/data-grid/data-grid-footer.js +36 -9
- package/dist/src/data-grid/data-grid-footer.js.map +1 -1
- package/dist/src/data-grid/data-grid-header.js +62 -5
- package/dist/src/data-grid/data-grid-header.js.map +1 -1
- package/dist/src/data-grid/data-grid.js +109 -8
- package/dist/src/data-grid/data-grid.js.map +1 -1
- package/dist/src/data-grist.js +75 -10
- package/dist/src/data-grist.js.map +1 -1
- package/dist/src/renderers/ox-grist-renderer-date.js +22 -4
- package/dist/src/renderers/ox-grist-renderer-date.js.map +1 -1
- package/dist/src/types.d.ts +14 -0
- package/dist/src/types.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-grid.js","sourceRoot":"","sources":["../../../src/data-grid/data-grid.ts"],"names":[],"mappings":"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","sourcesContent":["import i18next from 'i18next'\nimport '../empty-note.js'\nimport './data-grid-header.js'\nimport './data-grid-body.js'\nimport './data-grid-footer.js'\n\nimport { css, html, LitElement, PropertyValues } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { styles as MDTypeScaleStyles } from '@material/web/typography/md-typescale-styles.js'\n\nimport { ScrollbarStyles } from '@operato/styles'\n\nimport { DataManipulator } from '../data-manipulator.js'\nimport { ColumnConfig, GristRecord, PaginationConfig } from '../types.js'\n// import { supportsPassive } from '../utils/index.js'\nimport { DataGridHeader } from './data-grid-header.js'\n\n/**\n * DataGrid\n */\n@customElement('ox-grid')\nexport class DataGrid extends DataManipulator {\n static styles = [\n MDTypeScaleStyles,\n ScrollbarStyles,\n css`\n /*\n * ── 고치는 표만 셀을 겨눈다 ─────────────────────────────────────────\n *\n * 셀 하나를 가리키는 점선과 열 폭 조절 손잡이는 **고칠 셀을 겨누는 장치**다. 기본 겉모습에서는\n * 둘을 두지 않는다(data-grist.ts 의 한 벌). 고칠 수 있는 열이 하나라도 있으면 여기서 되살린다.\n *\n * 화면이 고르는 모드가 아니다 — 표가 스스로 아는 사실이다(위 editableGrid 주석 참조).\n */\n :host([editable-grid]) {\n --grid-record-focused-cell-border: 1px dashed var(--ui-faint, #8a959c);\n --grid-header-splitter-display: flex;\n }\n\n :host {\n display: flex;\n flex-direction: column;\n\n overflow: hidden;\n\n border-width: var(--grid-container-border-width);\n }\n\n ox-grid-body {\n flex: 1;\n position: relative;\n\n font-variation-settings: 'FILL' 1;\n }\n\n ox-grid-header {\n font-variation-settings: 'FILL' 1;\n }\n\n ox-grid-footer {\n font-variation-settings: 'FILL' 1;\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 div[setting] {\n position: relative;\n z-index: 5;\n }\n\n @media print {\n :host {\n zoom: 80%;\n }\n }\n `\n ]\n\n @property({ type: Object }) focused?: { row: number; column: number }\n @property({ type: Boolean }) empty?: boolean\n\n /**\n * 이 표에 고칠 수 있는 열이 하나라도 있나 — **겉모습이 이것으로 갈린다.**\n *\n * 셀 하나를 가리키는 점선과 열 폭 조절 손잡이는 **고칠 셀을 겨누는 장치**다. 고치지 않는 목록에서는\n * 셀 하나가 뜻을 갖지 않아, 줄을 고르려고 누른 자리에 점선이 남고 세로 선이 줄 읽기를 방해한다.\n *\n * 그래서 모드를 따로 두지 않는다. 화면이 고를 일이 아니라 **표가 스스로 아는 사실**이다 —\n * 열에 `record.editable` 이 있으면 고치는 표다.\n */\n @property({ type: Boolean, reflect: true, attribute: 'editable-grid' }) editableGrid: boolean = false\n\n @query('ox-grid-body', true) body!: LitElement\n @query('ox-grid-header', true) header!: DataGridHeader\n @query('ox-grid-footer', true) footer!: LitElement\n\n @state() fixedLefts: number[] = []\n\n firstUpdated() {\n /* header and body scroll synchronization */\n this.header.addEventListener('scroll', e => {\n if (this.body.scrollLeft !== this.header.scrollLeft) {\n this.body.scrollLeft = this.header.scrollLeft\n }\n })\n\n this.body.addEventListener('scroll', e => {\n if (this.body.scrollLeft !== this.header.scrollLeft) {\n this.header.scrollLeft = this.body.scrollLeft\n }\n })\n\n this.header.addEventListener('wheel', this.onWheelEvent.bind(this))\n this.footer && this.footer.addEventListener('wheel', this.onWheelEvent.bind(this))\n\n /* record selection processing */\n this.addEventListener('select-all-change', e => {\n if (this.data.records.length == 0) {\n return\n }\n\n var { selected } = (e as CustomEvent).detail\n var { records } = this.data\n\n records.forEach(record => (record['__selected__'] = selected))\n\n this.header.requestUpdate()\n this.body.requestUpdate()\n })\n\n this.addEventListener('focus-change', e => {\n const { row, column } = (e as CustomEvent).detail || {}\n if (!this.focused || this.focused.row != row || this.focused.column != column) {\n this.focused = { row, column }\n this.focus()\n this.requestUpdate()\n }\n })\n }\n\n onWheelEvent(e: WheelEvent) {\n if (this.body.scrollWidth > this.body.clientWidth) {\n var delta = Math.max(-1, Math.min(1, e.deltaY || 0))\n this.body.scrollLeft = Math.max(0, this.body.scrollLeft - delta * 30)\n\n var maxScrollLeft = this.body.scrollWidth - this.body.clientWidth\n\n var atStart = this.body.scrollLeft === 0\n var atEnd = this.body.scrollLeft === maxScrollLeft\n\n // 스크롤이 맨 앞으로 와 있는 상태에서 휠을 올리는 경우 또는\n // 스크롤이 맨 끝으로 가 있는 상태에서 휠을 내리는 경우에만 디폴트 동작 허용\n if ((atStart && delta > 0) || (atEnd && delta < 0)) {\n return true\n }\n\n e.preventDefault()\n }\n }\n\n onSelectRecordChanged({\n selectedRecords,\n added,\n removed\n }: {\n selectedRecords: GristRecord[]\n added: GristRecord[]\n removed: GristRecord[]\n }): void {\n super.onSelectRecordChanged({ selectedRecords, added, removed })\n\n this.header.requestUpdate()\n this.body.requestUpdate()\n }\n\n onRecordChanged(\n recordData: GristRecord,\n row: number,\n column: ColumnConfig | null /* TODO column should be removed */\n ) {\n /* record-viewer 등 grid 외에서 변경되는 경우에도 header와 body를 refresh 하도록 한다. */\n super.onRecordChanged(recordData, row, column)\n\n this.header.requestUpdate()\n this.body.requestUpdate()\n }\n\n updated(changes: PropertyValues<this>) {\n if (changes.has('data')) {\n /*\n * 데이타 내용에 따라 동적으로 컬럼의 폭이 달라지는 경우(예를 들면, sequence field)가 있으므로,\n * data의 변동에 대해서도 다시 계산되어야 한다.\n */\n this.calculateWidths(this.config.columns)\n\n if (this.focused && 'row' in this.focused) {\n var { row = 0, column = 0 } = this.focused\n var { records: oldrecords = [] } = changes.get('data') || {}\n var { records: newrecords } = this.data\n\n var oldrecord = oldrecords[row]\n\n if (oldrecord && oldrecord !== newrecords[row]) {\n var newrecord = newrecords.find(\n record =>\n /* TODO keyfields를 정의하고, keyfields의 동일성으로 확정해야 한다. */\n oldrecord === record ||\n ('id' in oldrecord\n ? record.id == oldrecord.id\n : 'name' in oldrecord\n ? record.name == oldrecord.name\n : false)\n )\n\n this.focused = {\n row: newrecord ? newrecords.indexOf(newrecord) : row,\n column\n }\n }\n }\n } else if (changes.has('config')) {\n this.calculateWidths(this.config.columns)\n }\n\n /* grid fetch 후에 grid로 focus를 주어야 하는 지 검토가 필요하다. */\n // this.focus()\n }\n\n calculateWidths(columns: ColumnConfig[]) {\n /*\n * 컬럼 모델 마지막에 'auto' cell을 추가하여, 자투리 영역을 꽉 채워서 표시한다.\n *\n * 숫자로 준 폭은 **그 폭 그대로** 쓴다. 합이 보이는 폭보다 크면 표는 가로로 넘치고, 나머지는\n * 가로 스크롤로 본다 — 표의 정상 거동이다.\n *\n * 한때 minmax(0, Npx) 로 두어 넘칠 때 열들이 함께 줄게 했다가 되돌렸다. 그렇게 하면 어떤 표도\n * 가로로 넘치지 않으므로 **가로 스크롤이 아예 사라진다.** 열 열다섯 개를 700px 에 밀어 넣으면\n * 모든 열이 못 읽을 만큼 좁아지고, 화면은 그것을 알릴 방법이 없다.\n *\n * 열이 좁아 잘리는 것은 화면이 열 폭을 정해서 풀 일이다 — 부품이 대신 줄이면 화면의 뜻이 사라진다.\n */\n const widths = columns\n .filter(column => !column.hidden)\n .map(column => {\n switch (typeof column.width) {\n case 'number':\n return `${column.width}px`\n case 'string':\n return column.width\n case 'function':\n return column.width.call(this, column)\n default:\n return 'auto'\n }\n })\n .concat(['auto'])\n .join(' ')\n\n /* 겉모습이 이 사실로 갈린다(위 editableGrid 주석 참조). 열이 정해지는 이 시점이 그 자리다. */\n this.editableGrid = columns.some(column => !column.hidden && !column.gutterName && !!column.record?.editable)\n\n this.style.setProperty('--grid-template-columns', widths)\n /* 인쇄는 종이 폭에 맞춰 비율로 나눈다. `220px` → `220fr` 로 바뀐다. */\n this.style.setProperty('--grid-template-print-columns', widths.replace(/px/gi, 'fr'))\n }\n\n render() {\n var { pagination = {} as PaginationConfig, columns = [], filters } = this.config\n\n var paginatable = !pagination.infinite\n var data = this.data\n\n return html`\n <div setting>\n <slot name=\"setting\"></slot>\n </div>\n\n <ox-grid-header\n class=\"md-typescale-label-medium-prominent\"\n .columns=${columns}\n .sorters=${this.sorters}\n .filters=${this.filters}\n .data=${data}\n ?filtering-feature=${filters?.header}\n @column-width-change=${(e: CustomEvent) => {\n let { idx, width } = e.detail\n columns[idx].width = width\n this.calculateWidths(columns)\n }}\n @fixed-lefts-change=${(e: CustomEvent) => (this.fixedLefts = e.detail)}\n >\n </ox-grid-header>\n\n <ox-grid-body\n class=\"md-typescale-body-medium\"\n .config=${this.config}\n .columns=${columns}\n .data=${data}\n .focused=${this.focused!}\n .fixedLefts=${this.fixedLefts}\n >\n ${this.empty ? html` <ox-empty-note title=${i18next.t('text.grid-no-records', { defaultValue: 'NO RECORDS' })}></ox-empty-note> ` : html``}\n </ox-grid-body>\n ${paginatable\n ? html`\n <ox-grid-footer\n class=\"md-typescale-body-medium\"\n .data=${data}\n .pagination=${this.pagination}\n ></ox-grid-footer>\n `\n : html``}\n `\n }\n\n focus() {\n super.focus()\n\n this.body.focus()\n }\n\n get pullToRefreshTarget() {\n return this.body\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"data-grid.js","sourceRoot":"","sources":["../../../src/data-grid/data-grid.ts"],"names":[],"mappings":";AAAA,OAAO,OAAO,MAAM,SAAS,CAAA;AAC7B,OAAO,kBAAkB,CAAA;AACzB,OAAO,uBAAuB,CAAA;AAC9B,OAAO,qBAAqB,CAAA;AAC5B,OAAO,uBAAuB,CAAA;AAE9B,OAAO,EAAE,GAAG,EAAE,IAAI,EAA8B,OAAO,EAAC,MAAM,KAAK,CAAA;AACnE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,EAAE,MAAM,IAAI,iBAAiB,EAAE,MAAM,iDAAiD,CAAA;AAE7F,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEjD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAKxD;;GAEG;AAEI,IAAM,QAAQ,GAAd,MAAM,QAAS,SAAQ,eAAe;IAAtC;;QAmIL;;;;;;;;WAQG;QACqE,iBAAY,GAAY,KAAK,CAAA;QAM5F,eAAU,GAAa,EAAE,CAAA;IAuQpC,CAAC;IArQC,YAAY;QACV,4CAA4C;QAC5C,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE;YACzC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBACpD,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAA;YAC/C,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE;YACvC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBACpD,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAA;YAC/C,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACnE,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAElF,iCAAiC;QACjC,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,CAAC,CAAC,EAAE;YAC7C,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBAClC,OAAM;YACR,CAAC;YAED,IAAI,EAAE,QAAQ,EAAE,GAAI,CAAiB,CAAC,MAAM,CAAA;YAC5C,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,CAAA;YAE3B,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAA;YAE9D,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAA;YAC3B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAA;QAC3B,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE;YACxC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAI,CAAiB,CAAC,MAAM,IAAI,EAAE,CAAA;YACvD,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,MAAM,EAAE,CAAC;gBAC9E,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,CAAA;gBAC9B,IAAI,CAAC,KAAK,EAAE,CAAA;gBACZ,IAAI,CAAC,aAAa,EAAE,CAAA;YACtB,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,YAAY,CAAC,CAAa;QACxB,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YAClD,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAA;YACpD,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,KAAK,GAAG,EAAE,CAAC,CAAA;YAErE,IAAI,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAA;YAEjE,IAAI,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,CAAA;YACxC,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,aAAa,CAAA;YAElD,oCAAoC;YACpC,6CAA6C;YAC7C,IAAI,CAAC,OAAO,IAAI,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;gBACnD,OAAO,IAAI,CAAA;YACb,CAAC;YAED,CAAC,CAAC,cAAc,EAAE,CAAA;QACpB,CAAC;IACH,CAAC;IAED,qBAAqB,CAAC,EACpB,eAAe,EACf,KAAK,EACL,OAAO,EAKR;QACC,KAAK,CAAC,qBAAqB,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;QAEhE,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAA;QAC3B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAA;IAC3B,CAAC;IAED,eAAe,CACb,UAAuB,EACvB,GAAW,EACX,MAA2B,CAAC,mCAAmC;QAE/D,sEAAsE;QACtE,KAAK,CAAC,eAAe,CAAC,UAAU,EAAE,GAAG,EAAE,MAAM,CAAC,CAAA;QAE9C,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAA;QAC3B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAA;IAC3B,CAAC;IAED,OAAO,CAAC,OAA6B;QACnC,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACxB;;;eAGG;YACH,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YAEzC,IAAI,IAAI,CAAC,OAAO,IAAI,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC1C,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,CAAA;gBAC1C,IAAI,EAAE,OAAO,EAAE,UAAU,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;gBAC5D,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,IAAI,CAAA;gBAEvC,IAAI,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,CAAA;gBAE/B,IAAI,SAAS,IAAI,SAAS,KAAK,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC/C,IAAI,SAAS,GAAG,UAAU,CAAC,IAAI,CAC7B,MAAM,CAAC,EAAE;oBACP,qDAAqD;oBACrD,SAAS,KAAK,MAAM;wBACpB,CAAC,IAAI,IAAI,SAAS;4BAChB,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,SAAS,CAAC,EAAE;4BAC3B,CAAC,CAAC,MAAM,IAAI,SAAS;gCACnB,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI;gCAC/B,CAAC,CAAC,KAAK,CAAC,CACf,CAAA;oBAED,IAAI,CAAC,OAAO,GAAG;wBACb,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG;wBACpD,MAAM;qBACP,CAAA;gBACH,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAC3C,CAAC;QAED,mDAAmD;QACnD,eAAe;IACjB,CAAC;IAED,eAAe,CAAC,OAAuB;QACrC;;;;;;;;;;;WAWG;QACH,MAAM,MAAM,GAAG,OAAO;aACnB,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;aAChC,GAAG,CAAC,MAAM,CAAC,EAAE;YACZ,QAAQ,OAAO,MAAM,CAAC,KAAK,EAAE,CAAC;gBAC5B,KAAK,QAAQ;oBACX,OAAO,GAAG,MAAM,CAAC,KAAK,IAAI,CAAA;gBAC5B,KAAK,QAAQ;oBACX,OAAO,MAAM,CAAC,KAAK,CAAA;gBACrB,KAAK,UAAU;oBACb,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;gBACxC;oBACE,OAAO,MAAM,CAAA;YACjB,CAAC;QACH,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;aAChB,IAAI,CAAC,GAAG,CAAC,CAAA;QAEZ,gEAAgE;QAChE,IAAI,CAAC,YAAY,GAAG,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;QAE7G,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,yBAAyB,EAAE,MAAM,CAAC,CAAA;QACzD,oDAAoD;QACpD,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,+BAA+B,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAA;IACvF,CAAC;IAED,MAAM;;QACJ,IAAI,EAAE,UAAU,GAAG,EAAsB,EAAE,OAAO,GAAG,EAAE,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,CAAA;QAEhF,IAAI,WAAW,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAA;QACtC,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QAEpB,OAAO,IAAI,CAAA;;;mBAGI,OAAO;mBACP,IAAI,CAAC,OAAO;mBACZ,IAAI,CAAC,OAAO;gBACf,IAAI;6BACS,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM;+BACb,CAAC,CAAc,EAAE,EAAE;YACxC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,MAAM,CAAA;YAC7B,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,KAAK,CAAA;YAC1B,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;QAC/B,CAAC;8BACqB,CAAC,CAAc,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;kBAmB5D,IAAI,CAAC,MAAM;mBACV,OAAO;gBACV,IAAI;mBACD,IAAI,CAAC,OAAQ;sBACV,IAAI,CAAC,UAAU;;UAE3B,IAAI,CAAC,KAAK;YACV,CAAC,CAAC,IAAI,CAAA;;;;;;;;;;;uBAWO,MAAA,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,SAAS,0CAAE,IAAI,mCAAI,OAAO;wBACtC,MAAA,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,SAAS,0CAAE,KAAK,mCAAI,OAAO,CAAC,CAAC,CAAC,sBAAsB,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;8BAC5F,MAAA,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,SAAS,0CAAE,WAAW,mCAAI,OAAO;;aAE/D;YACH,CAAC,CAAC,IAAI,CAAA,EAAE;;QAEV,WAAW;YACX,CAAC,CAAC,IAAI,CAAA;;;;;;;;;;;;sBAYQ,IAAI;4BACE,IAAI,CAAC,UAAU;;WAEhC;YACH,CAAC,CAAC,IAAI,CAAA,EAAE;KACX,CAAA;IACH,CAAC;IAED,KAAK;QACH,KAAK,CAAC,KAAK,EAAE,CAAA;QAEb,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAA;IACnB,CAAC;IAED,IAAI,mBAAmB;QACrB,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;;AAvZM,eAAM,GAAG;IACd,iBAAiB;IACjB,eAAe;IACf,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAyHF;CACF,AA7HY,CA6HZ;AAE2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;yCAA0C;AACxC;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;uCAAgB;AAW4B;IAAvE,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;8CAA8B;AAExE;IAA5B,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC;sCAAkB;AACf;IAA9B,KAAK,CAAC,gBAAgB,EAAE,IAAI,CAAC;wCAAwB;AACvB;IAA9B,KAAK,CAAC,gBAAgB,EAAE,IAAI,CAAC;wCAAoB;AAEzC;IAAR,KAAK,EAAE;4CAA0B;AAlJvB,QAAQ;IADpB,aAAa,CAAC,SAAS,CAAC;GACZ,QAAQ,CAyZpB","sourcesContent":["import i18next from 'i18next'\nimport '../empty-note.js'\nimport './data-grid-header.js'\nimport './data-grid-body.js'\nimport './data-grid-footer.js'\n\nimport { css, html, LitElement, PropertyValues, nothing} from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { styles as MDTypeScaleStyles } from '@material/web/typography/md-typescale-styles.js'\n\nimport { ScrollbarStyles } from '@operato/styles'\n\nimport { DataManipulator } from '../data-manipulator.js'\nimport { ColumnConfig, GristRecord, PaginationConfig } from '../types.js'\n// import { supportsPassive } from '../utils/index.js'\nimport { DataGridHeader } from './data-grid-header.js'\n\n/**\n * DataGrid\n */\n@customElement('ox-grid')\nexport class DataGrid extends DataManipulator {\n static styles = [\n MDTypeScaleStyles,\n ScrollbarStyles,\n css`\n /*\n * ── 고치는 표만 셀을 겨눈다 ─────────────────────────────────────────\n *\n * 셀 하나를 가리키는 점선과 열 폭 조절 손잡이는 **고칠 셀을 겨누는 장치**다. 기본 겉모습에서는\n * 둘을 두지 않는다(data-grist.ts 의 한 벌). 고칠 수 있는 열이 하나라도 있으면 여기서 되살린다.\n *\n * 화면이 고르는 모드가 아니다 — 표가 스스로 아는 사실이다(위 editableGrid 주석 참조).\n */\n :host([editable-grid]) {\n --grid-record-focused-cell-border: 1px dashed var(--ui-faint, #8a959c);\n --grid-header-splitter-display: flex;\n /*\n * 열 이름이 칸을 다 차지하게 두어 정렬 표식을 칸 오른쪽 끝으로 민다. 거기에는 폭 조절 손잡이가\n * 서 있으므로 표식이 그 옆에 모인다.\n *\n * 읽기 전용 표에는 손잡이가 없어서, 표식이 칸 끝에 홀로 떠 이름과 멀어진다. 그래서 기본은\n * 이름에 붙는 쪽이다(data-grid-header.ts).\n */\n --grid-header-title-grow: 1;\n }\n\n :host {\n display: flex;\n flex-direction: column;\n\n /* div[setting] 의 절대 좌표 기준. */\n position: relative;\n overflow: hidden;\n\n border-width: var(--grid-container-border-width);\n }\n\n ox-grid-body {\n flex: 1;\n position: relative;\n\n font-variation-settings: 'FILL' 1;\n }\n\n ox-grid-header {\n font-variation-settings: 'FILL' 1;\n }\n\n ox-grid-footer {\n font-variation-settings: 'FILL' 1;\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 /*\n * 컬럼 설정 단추는 **헤더에 마우스를 올릴 때만** 보인다.\n *\n * 늘 보이면 목록 화면마다 오른쪽 위에 눈에 걸리는 것이 하나 생긴다. 자주 쓰는 것도 아니다.\n *\n * 감춰 있는 동안에는 pointer-events 도 끈다 — 안 보이는데 눌리는 자리가 있으면, 헤더의 마지막\n * 컬럼을 누르려던 사람이 엉뚱한 팝업을 만난다.\n *\n * 세 갈래로 켠다.\n * 헤더에 올렸을 때 :has(ox-grid-header:hover)\n * 단추 자체에 올렸을 때 단추가 헤더 위에 떠 있으므로, 커서가 단추로 옮겨오면 헤더는 더 이상\n * hover 가 아니다. 이 갈래가 없으면 커서 아래에서 사라진다\n * 키보드 초점 focus-within\n */\n div[setting] {\n /*\n * 크기 없이 호스트의 오른쪽 위에 붙는다. 안에 들어오는 단추가 [slot='setting'] 규칙으로\n * top: -3px · right: 0 을 스스로 잡으므로, 이 div 는 기준점 노릇만 한다.\n */\n position: absolute;\n top: 0;\n right: 0;\n width: 0;\n height: 0;\n z-index: 5;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.12s ease-out;\n }\n\n /*\n * 단추 자체에 올렸을 때도 켜 둔다 — 단추가 헤더 위에 떠 있어서, 커서가 단추로 옮겨오면 헤더는\n * 더 이상 hover 가 아니다. 이 갈래가 없으면 커서 아래에서 사라진다.\n */\n ox-grid-header:hover + div[setting],\n div[setting]:hover,\n div[setting]:focus-within {\n opacity: 1;\n pointer-events: auto;\n }\n\n /*\n * 손가락으로 쓰는 장치 — hover 가 없으므로 감추면 닿을 방법이 없다. 늘 두고 평소에는 흐리게,\n * 누르는 동안 선명하게 한다.\n *\n * 화면 폭이 아니라 입력 장치로 가른다. 창을 좁힌 데스크톱은 여기에 걸리지 않고, 큰 태블릿은\n * 폭이 넓어도 걸린다.\n */\n @media (pointer: coarse) {\n div[setting] {\n opacity: 0.35;\n pointer-events: auto;\n }\n\n div[setting]:active,\n div[setting]:focus-within {\n opacity: 1;\n }\n }\n\n @media print {\n :host {\n zoom: 80%;\n }\n }\n `\n ]\n\n @property({ type: Object }) focused?: { row: number; column: number }\n @property({ type: Boolean }) empty?: boolean\n\n /**\n * 이 표에 고칠 수 있는 열이 하나라도 있나 — **겉모습이 이것으로 갈린다.**\n *\n * 셀 하나를 가리키는 점선과 열 폭 조절 손잡이는 **고칠 셀을 겨누는 장치**다. 고치지 않는 목록에서는\n * 셀 하나가 뜻을 갖지 않아, 줄을 고르려고 누른 자리에 점선이 남고 세로 선이 줄 읽기를 방해한다.\n *\n * 그래서 모드를 따로 두지 않는다. 화면이 고를 일이 아니라 **표가 스스로 아는 사실**이다 —\n * 열에 `record.editable` 이 있으면 고치는 표다.\n */\n @property({ type: Boolean, reflect: true, attribute: 'editable-grid' }) editableGrid: boolean = false\n\n @query('ox-grid-body', true) body!: LitElement\n @query('ox-grid-header', true) header!: DataGridHeader\n @query('ox-grid-footer', true) footer!: LitElement\n\n @state() fixedLefts: number[] = []\n\n firstUpdated() {\n /* header and body scroll synchronization */\n this.header.addEventListener('scroll', e => {\n if (this.body.scrollLeft !== this.header.scrollLeft) {\n this.body.scrollLeft = this.header.scrollLeft\n }\n })\n\n this.body.addEventListener('scroll', e => {\n if (this.body.scrollLeft !== this.header.scrollLeft) {\n this.header.scrollLeft = this.body.scrollLeft\n }\n })\n\n this.header.addEventListener('wheel', this.onWheelEvent.bind(this))\n this.footer && this.footer.addEventListener('wheel', this.onWheelEvent.bind(this))\n\n /* record selection processing */\n this.addEventListener('select-all-change', e => {\n if (this.data.records.length == 0) {\n return\n }\n\n var { selected } = (e as CustomEvent).detail\n var { records } = this.data\n\n records.forEach(record => (record['__selected__'] = selected))\n\n this.header.requestUpdate()\n this.body.requestUpdate()\n })\n\n this.addEventListener('focus-change', e => {\n const { row, column } = (e as CustomEvent).detail || {}\n if (!this.focused || this.focused.row != row || this.focused.column != column) {\n this.focused = { row, column }\n this.focus()\n this.requestUpdate()\n }\n })\n }\n\n onWheelEvent(e: WheelEvent) {\n if (this.body.scrollWidth > this.body.clientWidth) {\n var delta = Math.max(-1, Math.min(1, e.deltaY || 0))\n this.body.scrollLeft = Math.max(0, this.body.scrollLeft - delta * 30)\n\n var maxScrollLeft = this.body.scrollWidth - this.body.clientWidth\n\n var atStart = this.body.scrollLeft === 0\n var atEnd = this.body.scrollLeft === maxScrollLeft\n\n // 스크롤이 맨 앞으로 와 있는 상태에서 휠을 올리는 경우 또는\n // 스크롤이 맨 끝으로 가 있는 상태에서 휠을 내리는 경우에만 디폴트 동작 허용\n if ((atStart && delta > 0) || (atEnd && delta < 0)) {\n return true\n }\n\n e.preventDefault()\n }\n }\n\n onSelectRecordChanged({\n selectedRecords,\n added,\n removed\n }: {\n selectedRecords: GristRecord[]\n added: GristRecord[]\n removed: GristRecord[]\n }): void {\n super.onSelectRecordChanged({ selectedRecords, added, removed })\n\n this.header.requestUpdate()\n this.body.requestUpdate()\n }\n\n onRecordChanged(\n recordData: GristRecord,\n row: number,\n column: ColumnConfig | null /* TODO column should be removed */\n ) {\n /* record-viewer 등 grid 외에서 변경되는 경우에도 header와 body를 refresh 하도록 한다. */\n super.onRecordChanged(recordData, row, column)\n\n this.header.requestUpdate()\n this.body.requestUpdate()\n }\n\n updated(changes: PropertyValues<this>) {\n if (changes.has('data')) {\n /*\n * 데이타 내용에 따라 동적으로 컬럼의 폭이 달라지는 경우(예를 들면, sequence field)가 있으므로,\n * data의 변동에 대해서도 다시 계산되어야 한다.\n */\n this.calculateWidths(this.config.columns)\n\n if (this.focused && 'row' in this.focused) {\n var { row = 0, column = 0 } = this.focused\n var { records: oldrecords = [] } = changes.get('data') || {}\n var { records: newrecords } = this.data\n\n var oldrecord = oldrecords[row]\n\n if (oldrecord && oldrecord !== newrecords[row]) {\n var newrecord = newrecords.find(\n record =>\n /* TODO keyfields를 정의하고, keyfields의 동일성으로 확정해야 한다. */\n oldrecord === record ||\n ('id' in oldrecord\n ? record.id == oldrecord.id\n : 'name' in oldrecord\n ? record.name == oldrecord.name\n : false)\n )\n\n this.focused = {\n row: newrecord ? newrecords.indexOf(newrecord) : row,\n column\n }\n }\n }\n } else if (changes.has('config')) {\n this.calculateWidths(this.config.columns)\n }\n\n /* grid fetch 후에 grid로 focus를 주어야 하는 지 검토가 필요하다. */\n // this.focus()\n }\n\n calculateWidths(columns: ColumnConfig[]) {\n /*\n * 컬럼 모델 마지막에 'auto' cell을 추가하여, 자투리 영역을 꽉 채워서 표시한다.\n *\n * 숫자로 준 폭은 **그 폭 그대로** 쓴다. 합이 보이는 폭보다 크면 표는 가로로 넘치고, 나머지는\n * 가로 스크롤로 본다 — 표의 정상 거동이다.\n *\n * 한때 minmax(0, Npx) 로 두어 넘칠 때 열들이 함께 줄게 했다가 되돌렸다. 그렇게 하면 어떤 표도\n * 가로로 넘치지 않으므로 **가로 스크롤이 아예 사라진다.** 열 열다섯 개를 700px 에 밀어 넣으면\n * 모든 열이 못 읽을 만큼 좁아지고, 화면은 그것을 알릴 방법이 없다.\n *\n * 열이 좁아 잘리는 것은 화면이 열 폭을 정해서 풀 일이다 — 부품이 대신 줄이면 화면의 뜻이 사라진다.\n */\n const widths = columns\n .filter(column => !column.hidden)\n .map(column => {\n switch (typeof column.width) {\n case 'number':\n return `${column.width}px`\n case 'string':\n return column.width\n case 'function':\n return column.width.call(this, column)\n default:\n return 'auto'\n }\n })\n .concat(['auto'])\n .join(' ')\n\n /* 겉모습이 이 사실로 갈린다(위 editableGrid 주석 참조). 열이 정해지는 이 시점이 그 자리다. */\n this.editableGrid = columns.some(column => !column.hidden && !column.gutterName && !!column.record?.editable)\n\n this.style.setProperty('--grid-template-columns', widths)\n /* 인쇄는 종이 폭에 맞춰 비율로 나눈다. `220px` → `220fr` 로 바뀐다. */\n this.style.setProperty('--grid-template-print-columns', widths.replace(/px/gi, 'fr'))\n }\n\n render() {\n var { pagination = {} as PaginationConfig, columns = [], filters } = this.config\n\n var paginatable = !pagination.infinite\n var data = this.data\n\n return html`\n <ox-grid-header\n class=\"md-typescale-label-medium-prominent\"\n .columns=${columns}\n .sorters=${this.sorters}\n .filters=${this.filters}\n .data=${data}\n ?filtering-feature=${filters?.header}\n @column-width-change=${(e: CustomEvent) => {\n let { idx, width } = e.detail\n columns[idx].width = width\n this.calculateWidths(columns)\n }}\n @fixed-lefts-change=${(e: CustomEvent) => (this.fixedLefts = e.detail)}\n >\n </ox-grid-header>\n\n <!--\n 헤더 **다음**에 둔다. CSS 로 「헤더에 올렸을 때만」을 표현하려면 형제 선택자가 필요하고, 형제\n 선택자는 뒤쪽 형제만 고를 수 있다.\n\n :host(:has(ox-grid-header:hover)) 로는 안 된다 — :host() 의 인수는 바깥 트리에서 평가되므로\n 섀도 트리 안의 ox-grid-header 를 보지 못한다. 실제로 그렇게 써 봤고 hover 에 반응하지 않았다.\n\n 순서를 바꿔도 보이는 자리는 같다 — 아래 스타일에서 호스트의 오른쪽 위에 절대 좌표로 붙인다.\n -->\n <div setting>\n <slot name=\"setting\"></slot>\n </div>\n\n <ox-grid-body\n class=\"md-typescale-body-medium\"\n .config=${this.config}\n .columns=${columns}\n .data=${data}\n .focused=${this.focused!}\n .fixedLefts=${this.fixedLefts}\n >\n ${this.empty\n ? html`\n <!--\n 아직 아무것도 없을 때 **화면이 자기 말을 넣을 수 있다.**\n\n 전에는 「NO RECORDS」가 박혀 있었다. 그 문장은 다음에 무엇을 할지 알려 주지 않는다 —\n 비어 있는 화면이야말로 「여기서 무엇을 만들 수 있고 그것이 무엇에 쓰이나」를 말해야 하는\n 자리다. 처음 오는 사람이 가장 먼저 보는 화면이기도 하다.\n\n 화면이 config.emptyNote 로 말하고, 말하지 않으면 예전 문장이 그대로 나온다.\n -->\n <ox-empty-note\n icon=${this.config?.emptyNote?.icon ?? nothing}\n title=${this.config?.emptyNote?.title ?? i18next.t('text.grid-no-records', { defaultValue: 'NO RECORDS' })}\n description=${this.config?.emptyNote?.description ?? nothing}\n ></ox-empty-note>\n `\n : html``}\n </ox-grid-body>\n ${paginatable\n ? html`\n <!--\n 푸터에는 본문 타이프스케일을 씌우지 않는다.\n\n 그 클래스는 font 축약형으로 0.875rem 를 넣는데, **바깥 트리의 규칙이라 푸터의\n :host { font-size } 를 이긴다**(그림자 캐스케이드에서 호스트 요소는 바깥 트리 규칙이\n 우선한다). 그래서 푸터가 자기 크기를 못 정하고 본문과 같은 14px 로 남아 있었다.\n [재봤음] 리터럴 :host { font-size: 7px } 도 안 먹었다. 2026-09-02\n\n 푸터는 본문이 아니다. 크기는 --grid-footer-font-size 가 정한다.\n -->\n <ox-grid-footer\n .data=${data}\n .pagination=${this.pagination}\n ></ox-grid-footer>\n `\n : html``}\n `\n }\n\n focus() {\n super.focus()\n\n this.body.focus()\n }\n\n get pullToRefreshTarget() {\n return this.body\n }\n}\n"]}
|
package/dist/src/data-grist.js
CHANGED
|
@@ -288,9 +288,22 @@ let DataGrist = class DataGrist extends LitElement {
|
|
|
288
288
|
this.headResizeObserver = new ResizeObserver(() => this.applyHeadOffset());
|
|
289
289
|
this.headResizeObserver.observe(this.head);
|
|
290
290
|
}
|
|
291
|
-
else if (this.
|
|
292
|
-
|
|
293
|
-
|
|
291
|
+
else if (this.grist) {
|
|
292
|
+
/*
|
|
293
|
+
* 머리를 감췄으면 **밀어 둔 값을 지운다.** 저장해 둔 「원래 값」을 되돌리지 않는다.
|
|
294
|
+
*
|
|
295
|
+
* 그 변수들은 믿을 수 없다 — 미는 쪽(onTop · onNotTop)이 같은 변수에 **밀어 놓은 값을** 다시
|
|
296
|
+
* 담는다. 그래서 감출 때 되돌릴 값이 이미 오염돼 있다.
|
|
297
|
+
*
|
|
298
|
+
* [재봤음] 머리를 감춰도 표가 그대로였다. 2026-09-02
|
|
299
|
+
*
|
|
300
|
+
* 전 머리 78px margin-top 78px 표 시작 191
|
|
301
|
+
* 감춘 뒤 머리 0px margin-top 78px 표 시작 191 ← 안 움직인다
|
|
302
|
+
*
|
|
303
|
+
* 인라인 값을 지우면 CSS 가 정한 값으로 돌아간다. 머리가 없을 때 옳은 값은 그것뿐이다.
|
|
304
|
+
*/
|
|
305
|
+
this.grist.style.removeProperty('margin-top');
|
|
306
|
+
this.grist.style.removeProperty('padding-top');
|
|
294
307
|
}
|
|
295
308
|
}
|
|
296
309
|
render() {
|
|
@@ -1046,13 +1059,45 @@ DataGrist.styles = [
|
|
|
1046
1059
|
*/
|
|
1047
1060
|
:host {
|
|
1048
1061
|
--grid-header-background-color: var(--ui-bg, #f6f7f9);
|
|
1049
|
-
|
|
1062
|
+
/*
|
|
1063
|
+
* 표의 윗변. 열 머리글 위에 선이 없으면 표가 어디서 시작하는지 안 보인다 — 카드 안에 있을
|
|
1064
|
+
* 때는 카드 테두리가 그 일을 했지만, 지금은 헤드룸 바로 아래에 놓인다.
|
|
1065
|
+
*
|
|
1066
|
+
* 아래 선과 같은 굵기·같은 색이다. 위를 굵게 하면 그 선이 제목처럼 읽혀서 표가 무거워진다.
|
|
1067
|
+
*/
|
|
1068
|
+
--grid-header-top-border: 1px solid var(--ui-line, #d5dce0);
|
|
1050
1069
|
--grid-header-bottom-border: 1px solid var(--ui-line, #d5dce0);
|
|
1051
|
-
|
|
1070
|
+
/*
|
|
1071
|
+
* 머리와 몸의 여백은 **같은 값이다.** 1px 이라도 다르면 머리글과 첫 줄의 리듬이 어긋난다.
|
|
1072
|
+
*
|
|
1073
|
+
* 9px 에서 7px 로 내렸다. 한 줄 표는 40 → 36px, 세 줄 표는 74 → 70px 이 되고, 줄과 줄 사이는
|
|
1074
|
+
* 안 변한다 — 그것은 셀 여백이 아니라 .sub 의 margin-top 이다. [재봤음] 2026-09-02
|
|
1075
|
+
*
|
|
1076
|
+
* 이 화면들이 하는 일은 훑고 고치는 것이라 한 화면에 줄이 많을수록 낫다.
|
|
1077
|
+
*/
|
|
1078
|
+
--grid-header-padding: 7px 10px;
|
|
1052
1079
|
--grid-header-color: var(--ui-muted, #57676f);
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1080
|
+
/*
|
|
1081
|
+
* ── 머리글은 라틴 전용 설정이었다 (2026-09-02) ──────────────────────
|
|
1082
|
+
* 전에는 600 11px/1 고정폭 · uppercase · 자간 0.07em 이었다. NAME · DESCRIPTION 같은 영문
|
|
1083
|
+
* 머리글에는 맞는 조합이지만 한글에는 셋 다 어긋난다.
|
|
1084
|
+
*
|
|
1085
|
+
* uppercase 한글에는 아무 일도 하지 않는다. 라틴 머리글만 대문자가 되어 규칙이 섞인다
|
|
1086
|
+
* 고정폭 한글 글자가 없어 대체 글꼴로 떨어진다 — 한 줄에 두 글꼴이 그려진다
|
|
1087
|
+
* 자간 0.07em 11px 에서 글자마다 0.77px. 「ISA-95 계층 단」이 140px 칸에서 잘렸다
|
|
1088
|
+
*
|
|
1089
|
+
* 그리고 11px 은 푸터(13px)보다 작았다. 머리는 값의 이름이고 푸터는 보조 정보인데 위계가
|
|
1090
|
+
* 뒤집혀 있었다. 이제 **본문 14 › 머리 13 = 푸터 13** 이고, 머리는 크기가 아니라 굵기와
|
|
1091
|
+
* 바탕색으로 구별된다.
|
|
1092
|
+
*/
|
|
1093
|
+
/*
|
|
1094
|
+
* 축약형은 글꼴 이름을 반드시 요구한다. 없이 두면 선언이 통째로 버려진다 — 실제로 그렇게 되어
|
|
1095
|
+
* 물려받은 12px/700 이 나왔다. 여기 적는 sans-serif 는 자리를 채우는 값이고, 바로 뒤의
|
|
1096
|
+
* font-family(기본 inherit)가 덮는다.
|
|
1097
|
+
*/
|
|
1098
|
+
--grid-header-font: 600 13px / 1.2 sans-serif;
|
|
1099
|
+
--grid-header-text-transform: none;
|
|
1100
|
+
--grid-header-letter-spacing: 0.01em;
|
|
1056
1101
|
--grid-header-sorter-size: 14px;
|
|
1057
1102
|
--grid-header-mark-size: 14px;
|
|
1058
1103
|
/* 세로 선을 그리는 것이 폭 조절 손잡이다 — 감추면 둘이 함께 사라진다. */
|
|
@@ -1060,16 +1105,36 @@ DataGrist.styles = [
|
|
|
1060
1105
|
|
|
1061
1106
|
--grid-record-background-color: var(--ui-panel, #ffffff);
|
|
1062
1107
|
--grid-record-odd-background-color: var(--ui-panel, #ffffff);
|
|
1063
|
-
--grid-record-padding:
|
|
1108
|
+
--grid-record-padding: 7px 10px;
|
|
1064
1109
|
--grid-record-color: var(--ui-ink, #17242c);
|
|
1065
1110
|
--grid-record-border-bottom: 1px solid var(--ui-line-soft, #e6eaed);
|
|
1066
1111
|
/* 초점 표식을 없앤다. outline 으로 그리므로 줄 선은 그대로 남는다. */
|
|
1067
1112
|
--grid-record-focused-cell-border: none;
|
|
1068
1113
|
--grid-record-focused-box-shadow: none;
|
|
1069
1114
|
|
|
1115
|
+
/*
|
|
1116
|
+
* ── 푸터는 표의 셋째 위계다 ────────────────────────────────────────
|
|
1117
|
+
* 머리글 11px · 본문 14px · 푸터 13px. 전에는 푸터가 본문과 같은 14px 이라 쪽 이동과 건수가
|
|
1118
|
+
* 값만큼 눈에 걸렸다. 푸터가 말하는 것은 「지금 어디를 보고 있나」이지 값이 아니다.
|
|
1119
|
+
*/
|
|
1070
1120
|
--grid-footer-background-color: var(--ui-bg, #f6f7f9);
|
|
1121
|
+
--grid-footer-font-size: 13px;
|
|
1122
|
+
/* 지금 고른 것 — 이 색에 굵기가 더해진다. */
|
|
1071
1123
|
--grid-footer-color: var(--ui-muted, #57676f);
|
|
1072
|
-
|
|
1124
|
+
/* 누를 수 있지만 지금 것이 아닌 것. 한 단 흐리다. */
|
|
1125
|
+
--grid-footer-limit-color: var(--ui-faint, #8a959c);
|
|
1126
|
+
/*
|
|
1127
|
+
* 쪽 번호 입력 상자의 테두리.
|
|
1128
|
+
*
|
|
1129
|
+
* 전에는 --grid-footer-color(본문 글자색)를 썼다. 그래서 40×21 짜리 상자 하나가 **표의 어떤
|
|
1130
|
+
* 경계선보다 진했다.** 행 아래선 #e6eaed · 머리 구분선 #d6dbe0 인데 상자만 #57676f 였다.
|
|
1131
|
+
*/
|
|
1132
|
+
--grid-footer-input-border: 1px solid var(--ui-line, #d6dbe0);
|
|
1133
|
+
/*
|
|
1134
|
+
* 푸터는 표에 **붙어 있어야 한다.** 8px 위아래로 띄웠더니 표와 따로 떠 있는 띠로 보였다.
|
|
1135
|
+
* 이 줄이 말하는 것(몇 쪽 · 몇 건)은 바로 위 표에 대한 것이라 표에 붙는 편이 읽힌다.
|
|
1136
|
+
*/
|
|
1137
|
+
--grid-footer-padding: 3px 6px;
|
|
1073
1138
|
}
|
|
1074
1139
|
|
|
1075
1140
|
:host {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-grist.js","sourceRoot":"","sources":["../../src/data-grist.ts"],"names":[],"mappings":"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","sourcesContent":["import './data-grid/data-grid.js'\nimport './data-list/data-list.js'\nimport './data-card/data-card.js'\n\nimport { css, html, LitElement, PropertyValues } from 'lit'\nimport { customElement, property, query, queryAsync, state } from 'lit/decorators.js'\nimport isEmpty from 'lodash-es/isEmpty.js'\nimport isEqual from 'lodash-es/isEqual.js'\n\nimport Headroom from '@operato/headroom'\nimport { pulltorefresh } from '@operato/pull-to-refresh'\nimport { HeadroomStyles, ScrollbarStyles, SpinnerStyles } from '@operato/styles'\nimport { PagePreferenceProvider } from '@operato/p13n'\nimport { SnapshotTaker, TimeCapsule } from '@operato/utils'\n\nimport { buildConfig } from './configure/config-builder.js'\nimport { ZERO_CONFIG, ZERO_DATA, ZERO_PAGES, ZERO_PAGINATION } from './configure/zero-config.js'\nimport { DataCard } from './data-card/data-card.js'\nimport { DataConsumer } from './data-consumer.js'\nimport { DataGrid } from './data-grid/data-grid.js'\nimport { DataList } from './data-list/data-list.js'\nimport { DataProvider } from './data-provider.js'\nimport {\n ColumnConfig,\n FetchHandler,\n FilterConfigObject,\n FilterValue,\n GristConfig,\n GristData,\n GristRecord,\n GristSelectFunction,\n PaginationConfig,\n PersonalGristPreference,\n SortersConfig,\n ValidationReason\n} from './types.js'\nimport { convertListParamToSearchString, convertSearchStringToListParam } from './utils/index.js'\n\n/**\n * A custom element for rendering data in a grid, list, or card format.\n *\n * @element ox-grist\n */\n@customElement('ox-grist')\nexport class DataGrist extends LitElement implements DataConsumer {\n static styles = [\n ScrollbarStyles,\n HeadroomStyles,\n SpinnerStyles,\n css`\n /*\n * ── 표의 겉모습 — 한 벌로 여기서 정한다 ──────────────────────────────\n *\n * 화면마다 --grid-* 토큰을 하나씩 덮어 모양을 바꾸지 않는다. 그 방식은 두 가지로 깨졌다.\n *\n * · 한 토큰이 두 뜻을 겸한다. --grid-record-focused-cell-border 는 「초점 표식」이면서\n * 「줄을 나누는 선」이었다. 표식을 감추려고 none 을 주면 줄 선이 사라졌다\n * · 스무 개를 짝 맞춰 덮어야 한 벌이 되고, 하나 빠지면 그 자리만 옛 모양으로 남는다\n *\n * 토큰은 shadow DOM 을 넘어 상속되므로 여기서 정하면 머리·칸·바닥까지 그대로 닿는다.\n *\n * 무엇을 바꾸는가 — 표가 자기 틀을 값보다 앞세우지 않게 한다.\n *\n * 머리 회색 바탕 + 2px 파란 윗선 + 파란 글자 → 면 색 + 아랫선 하나 + 작은 대문자 라벨\n * 줄 홀짝 회색 번갈이(zebra) → 선으로만 구분\n * 세로선 열마다 있었다 → 없음\n * 폭 조절 끌 수 있었다 → 없음 (세로선을 그리던 것이 이 손잡이다)\n * 셀 초점 점선 네모 → 없음 (줄 단위로 고르는 표에서는 뜻이 없다)\n * 바닥 회색 바탕 + 파란 글자 → 면 색 + 흐린 글자\n * 값 흐린 색 → 가장 진하게\n *\n * 줄무늬를 없앤 것은 취향이 아니다. 홀짝 회색이 깔려 있으면 **골라 놓은 줄과 마우스 올린 줄이\n * 그 무늬에 묻힌다.** 색은 「지금 무엇을 하고 있나」에만 쓴다.\n */\n :host {\n --grid-header-background-color: var(--ui-bg, #f6f7f9);\n --grid-header-top-border: none;\n --grid-header-bottom-border: 1px solid var(--ui-line, #d5dce0);\n --grid-header-padding: 8px 10px;\n --grid-header-color: var(--ui-muted, #57676f);\n --grid-header-font: 600 var(--ui-t-micro, 11px) / 1 var(--ui-mono, ui-monospace, Menlo, monospace);\n --grid-header-text-transform: uppercase;\n --grid-header-letter-spacing: 0.07em;\n --grid-header-sorter-size: 14px;\n --grid-header-mark-size: 14px;\n /* 세로 선을 그리는 것이 폭 조절 손잡이다 — 감추면 둘이 함께 사라진다. */\n --grid-header-splitter-display: none;\n\n --grid-record-background-color: var(--ui-panel, #ffffff);\n --grid-record-odd-background-color: var(--ui-panel, #ffffff);\n --grid-record-padding: 9px 10px;\n --grid-record-color: var(--ui-ink, #17242c);\n --grid-record-border-bottom: 1px solid var(--ui-line-soft, #e6eaed);\n /* 초점 표식을 없앤다. outline 으로 그리므로 줄 선은 그대로 남는다. */\n --grid-record-focused-cell-border: none;\n --grid-record-focused-box-shadow: none;\n\n --grid-footer-background-color: var(--ui-bg, #f6f7f9);\n --grid-footer-color: var(--ui-muted, #57676f);\n --grid-footer-padding: 8px 12px;\n }\n\n :host {\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n background-color: var(--grist-background-color);\n min-height: 120px;\n\n overflow: hidden;\n\n /* for pulltorefresh controller */\n position: relative;\n\n padding: var(--ox-grist-padding);\n\n --md-icon-size: var(--grid-record-wide-fontsize);\n }\n\n #wrap {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: auto;\n }\n\n ox-grid {\n flex: 1;\n border: var(--grid-wrap-container-border, 0px solid transparent);\n border-width: var(--grid-wrap-container-border-width, 0px);\n }\n\n slot[name='headroom'] {\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n\n width: 100%;\n box-sizing: border-box;\n background-color: var(--grist-background-color);\n\n z-index: 8;\n }\n `\n ]\n\n /**\n * The rendering mode of the component, which can be 'GRID', 'LIST', or 'CARD'.\n * Default is 'GRID'.\n *\n * @property {string}\n */\n @property() mode: 'GRID' | 'LIST' | 'CARD' = 'GRID'\n\n /**\n * The configuration object for the data grist.\n *\n * @property {Object}\n */\n @property() config: any\n\n /**\n * The data to be displayed in the data grist.\n *\n * @property {GristData}\n */\n @property({ type: Object }) data: GristData = ZERO_DATA\n\n /**\n * An array of selected records in the data grist.\n *\n * @property {GristRecord[]}\n */\n @property({ type: Array }) selectedRecords?: GristRecord[]\n\n /**\n * Indicates whether explicit fetching of data is enabled. If true, data will be fetched\n * only when `fetch` method is called. Default is false.\n *\n * @property {boolean}\n */\n @property({ type: Boolean, attribute: 'explicit-fetch' }) explicitFetch: boolean = false\n\n /**\n * The fetch handler function used to retrieve data from a remote source.\n *\n * @property {FetchHandler}\n */\n @property() fetchHandler?: FetchHandler\n\n /**\n * Additional fetch options to be passed to the fetch handler.\n *\n * @property {Object}\n */\n @property() fetchOptions: any\n\n /**\n * An array of filter values to be applied to the data grist.\n *\n * @property {FilterValue[]}\n */\n @property({ type: Array }) filters?: FilterValue[]\n\n /**\n * An array of sorters to determine the order of records in the data grist.\n *\n * @property {SortersConfig}\n */\n @property({ type: Array }) sorters?: SortersConfig\n\n /**\n * The pagination configuration for the data grist.\n *\n * @property {PaginationConfig}\n */\n @property({ type: Object }) pagination?: PaginationConfig\n\n /**\n * Indicates whether URL parameters are sensitive to changes. If true, changes in URL\n * parameters will trigger data fetching. Default is undefined.\n *\n * @property {boolean}\n */\n @property({ type: Boolean, attribute: 'url-params-sensitive' }) urlParamsSensitive?: boolean\n\n @property({ type: Object }) personalConfigProvider: PagePreferenceProvider = {\n load: () => {\n return {}\n },\n save: (preference: any) => preference,\n reset: () => {}\n }\n\n @state() personalConfig?: {\n columns?: Partial<ColumnConfig>[]\n [key: string]: any\n }\n\n @state() _data: GristData = ZERO_DATA // copy data, dirty data\n @state() _config: GristConfig = ZERO_CONFIG // compiled configuration\n @state() private _showSpinner: boolean = false\n\n @query('slot[name=headroom]') head!: HTMLElement\n @query('#grist') grist!: DataGrid | DataList | DataCard\n @queryAsync('#wrap') private wrap!: Promise<HTMLElement>\n\n private timeCapsule?: TimeCapsule\n private snapshotTaker?: SnapshotTaker\n\n private dataProvider?: DataProvider\n private pulltorefreshHandle?: any\n private headroom?: Headroom\n private orginPaddingTop?: string\n private originMarginTop?: string\n\n /*\n * 머리(headroom)의 높이는 **한 번만 재면 안 된다.**\n *\n * 머리는 position: absolute 라 본문이 그만큼 밀려 있어야 하는데, 그 값을 setHeadroom 시점의\n * clientHeight 로 한 번 정해 두었다. 그래서 머리 안의 내용이 나중에 커지면(글꼴이 늦게 오거나,\n * 버튼 높이가 바뀌거나, 제목이 두 줄이 되거나) 본문이 머리 아래로 파고들어 **글자가 겹친다.**\n *\n * 실제로 동작 버튼 높이를 32px 에서 36px 로 올렸을 때 제목 줄과 열 머리글이 겹쳤다.\n * 크기를 지켜보고 그때마다 다시 민다.\n */\n private headResizeObserver?: ResizeObserver\n private headroomAtTop: boolean = true\n private lastLocation: { origin?: string; pathname?: string; search?: string } = {}\n\n /* 그리드가 준비되기 전에 fetch 요청이 있었음을 나타내는 플래그임 */\n private pendingFetch?: boolean\n\n private popstateEventHandler: EventListener = ((e: Event) => {\n const { origin, pathname, search } = window.location\n if (\n this.lastLocation.origin &&\n (this.lastLocation.origin !== origin ||\n this.lastLocation.pathname !== pathname ||\n this.lastLocation.search === search)\n ) {\n return\n }\n\n this.lastLocation = {\n origin,\n pathname,\n search\n }\n\n var { filters = [], sorters = [] } = convertSearchStringToListParam(search)\n\n try {\n if (!isEqual(filters, this.filters) || !isEqual(sorters, this.sorters)) {\n this.dispatchEvent(\n new CustomEvent('fetch-params-change', {\n bubbles: true,\n composed: true,\n detail: {\n filters,\n sorters,\n from: 'url-parameter'\n }\n })\n )\n }\n } catch (e) {\n console.error(`invalid fetch params on URL query string : ${e}`)\n }\n }).bind(this)\n\n private fetchParamsChangeEventHandler: EventListener = ((e: Event) => {\n const { sorters, filters, from } = (e as CustomEvent).detail\n\n sorters && (this.sorters = sorters)\n filters && (this.filters = filters)\n\n if (!this.urlParamsSensitive || from === 'url-parameter') {\n return\n }\n\n const queryString = convertListParamToSearchString({ filters, sorters, base: window.location.search })\n this.lastLocation.search = queryString ? `?${queryString}` : ''\n const url = `${window.location.pathname}${this.lastLocation.search}`\n\n history.pushState({}, document.title, url)\n }).bind(this)\n\n async firstUpdated() {\n // Mutation Observer를 사용하여 슬롯의 크기 변경을 감지하고 다시 그린다.\n const observer = new ResizeObserver(mutationsList => {\n this.setHeadroom()\n })\n\n observer.observe(this.head)\n }\n\n async connectedCallback() {\n super.connectedCallback()\n\n this.dataProvider = new DataProvider(this)\n\n this.timeCapsule = new TimeCapsule(10)\n this.snapshotTaker = new SnapshotTaker(this, this.timeCapsule!)\n\n this.addEventListener('fetch-params-change', this.fetchParamsChangeEventHandler)\n document.addEventListener('keydown', this._onDocumentKeydown)\n\n await this.updateComplete\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n\n this.removeEventListener('fetch-params-change', this.fetchParamsChangeEventHandler)\n document.removeEventListener('keydown', this._onDocumentKeydown)\n\n this.headResizeObserver?.disconnect()\n delete this.headResizeObserver\n\n this.timeCapsule && this.timeCapsule.dispose()\n this.snapshotTaker && this.snapshotTaker.dispose()\n\n delete this.timeCapsule\n delete this.snapshotTaker\n\n this.dataProvider?.dispose()\n this.resetPullToRefresh()\n }\n\n private resetPullToRefresh() {\n if (this.pulltorefreshHandle) {\n this.pulltorefreshHandle()\n delete this.pulltorefreshHandle\n }\n }\n\n private async setPullToRefresh() {\n this.resetPullToRefresh()\n if (this.mode !== 'GRID' && this.fetchHandler) {\n this.pulltorefreshHandle = pulltorefresh({\n container: await this.wrap,\n scrollable: this.grist.pullToRefreshTarget,\n refresh: () => {\n return this.fetch(true)\n }\n })\n }\n }\n\n public applyUpdatedConfiguration() {\n if (!this.personalConfig || !this.config) {\n return\n }\n\n const config = { ...this.config }\n const columns: Partial<ColumnConfig>[] = config.columns\n\n const { columns: personalColumns, sorters, pagination, mode } = this.personalConfig\n\n if (personalColumns) {\n const xcolumns = columns.map((column: Partial<ColumnConfig>) => {\n const personalColumn = personalColumns.find(pcolumn => pcolumn.name == column.name)\n return personalColumn ? { ...column, ...personalColumn } : column\n })\n\n function reorderList(a: { name: string }[], b: { name: string }[]): { name: string }[] {\n // 결과 배열 초기화, a 배열 길이만큼 undefined로 채움\n const result = new Array(a.length)\n\n // b 배열에 없는 아이템은 원래 위치로 채움\n a.forEach((item, index) => {\n if (!item.name || !b.find(bi => bi.name == item.name)) {\n result[index] = item\n }\n })\n\n b.forEach(item => {\n const ai = a.find(ai => ai.name == item.name)\n if (ai) {\n result[result.findIndex(slot => slot === undefined)] = ai\n }\n })\n\n return result\n }\n\n // 배열 재정렬 실행\n config.columns = reorderList(xcolumns as any, personalColumns as any)\n }\n\n if (pagination) {\n config.pagination = pagination\n }\n\n if (sorters) {\n config.sorters = sorters\n }\n\n if (mode) {\n this.mode = mode\n }\n\n this._config = buildConfig({\n ...config\n })\n\n this.dispatchEvent(\n new CustomEvent('config-change', {\n bubbles: true,\n composed: true,\n detail: this.compiledConfig\n })\n )\n\n this.pagination = this.compiledConfig.pagination || {}\n\n if (!this.urlParamsSensitive) {\n const sorters = this.compiledConfig?.sorters\n const filters = this.compiledConfig?.columns\n .filter(\n column =>\n column.filter &&\n 'value' in (column.filter as FilterConfigObject) &&\n (typeof (column.filter as FilterConfigObject).value === 'boolean' ||\n (column.filter as FilterConfigObject).value)\n )\n .map(column => {\n const filter = column.filter as FilterConfigObject\n return { name: column.name, operator: filter.operator, value: filter.value } as FilterValue\n })\n\n this.dispatchEvent(\n new CustomEvent('fetch-params-change', {\n bubbles: true,\n composed: true,\n detail: {\n filters,\n sorters,\n from: 'config'\n }\n })\n )\n }\n\n if (this.dataProvider) {\n const { limit, pages = ZERO_PAGES } = this._config.pagination || ZERO_PAGINATION\n this.dataProvider.page = 1\n this.dataProvider.limit = limit || pages[0] || ZERO_PAGES[0]\n }\n\n if (this.pendingFetch || (!this.urlParamsSensitive && !this.explicitFetch)) {\n this.pendingFetch = false\n this.fetch()\n }\n }\n\n /** 머리 높이만큼 본문을 민다. 위에 있을 때는 margin, 스크롤 중일 때는 padding 이다. */\n private applyHeadOffset() {\n if (!this.grist || !this.head || this.head.style.display === 'none') {\n return\n }\n\n const offset = this.head.clientHeight + 'px'\n\n if (this.headroomAtTop) {\n this.grist.style.marginTop = offset\n } else {\n this.grist.style.paddingTop = offset\n }\n }\n\n private setHeadroom() {\n this.headroom?.destroy()\n\n if (this.grist && this.head && this.head.style.display !== 'none') {\n const style = getComputedStyle(this.grist)\n\n this.orginPaddingTop = style.paddingTop || '0'\n this.originMarginTop = style.marginTop || '0'\n\n this.headroom = new Headroom(this.head, {\n scroller: this.grist,\n onTop: () => {\n this.grist.style.paddingTop = this.orginPaddingTop!\n this.originMarginTop = this.grist.style.marginTop\n\n this.headroomAtTop = true\n this.applyHeadOffset()\n },\n onNotTop: () => {\n this.grist.style.marginTop = this.originMarginTop!\n this.orginPaddingTop = this.grist.style.paddingTop\n\n this.headroomAtTop = false\n this.applyHeadOffset()\n }\n })\n\n this.headroom.init()\n\n /* 머리가 커지거나 줄면 그때마다 다시 민다 — 한 번 잰 값으로 두면 내용이 겹친다. */\n this.headResizeObserver?.disconnect()\n this.headResizeObserver = new ResizeObserver(() => this.applyHeadOffset())\n this.headResizeObserver.observe(this.head)\n } else if (this.orginPaddingTop) {\n this.grist.style.paddingTop = this.orginPaddingTop\n this.grist.style.marginTop = this.originMarginTop!\n }\n }\n\n render() {\n const empty = !this._showSpinner && this._data.records.length == 0\n\n return html`\n <slot name=\"headroom\"> </slot>\n <div id=\"wrap\" @keydown=${(e: KeyboardEvent) => this.onKeydown(e)}>\n ${this.mode == 'GRID'\n ? html`\n <ox-grid\n id=\"grist\"\n .config=${this.compiledConfig}\n .data=${this._data}\n .sorters=${this.sorters || []}\n .filters=${this.filters || []}\n .pagination=${this.pagination || {}}\n ?empty=${empty}\n >\n <slot name=\"setting\" slot=\"setting\"> </slot>\n </ox-grid>\n `\n : this.mode == 'CARD'\n ? html`\n <ox-card\n id=\"grist\"\n .config=${this.compiledConfig}\n .data=${this._data}\n .sorters=${this.sorters || []}\n .filters=${this.filters || []}\n ?empty=${empty}\n >\n </ox-card>\n `\n : html`\n <ox-list\n id=\"grist\"\n .config=${this.compiledConfig}\n .data=${this._data}\n .sorters=${this.sorters || []}\n .filters=${this.filters || []}\n ?empty=${empty}\n >\n </ox-list>\n `}\n </div>\n\n <div id=\"spinner\" ?show=${this._showSpinner}></div>\n `\n }\n\n /* for timecapsule feature */\n private onKeydown(e: KeyboardEvent) {\n if (e.key === 'z' && (e.metaKey || e.ctrlKey)) {\n if (e.shiftKey) {\n this.redo()\n } else {\n this.undo()\n }\n }\n }\n\n /* 트리 그리드 단일 셀 복사 폴백: document 레벨에서 Ctrl+C를 수신.\n * 혼합 화면 등에서 행 클릭 후 scan input이 포커스를 빼앗아가므로\n * DataGrist 내부 이벤트 버블링에 의존할 수 없어 document 레벨에서 처리.\n * 이 DataGrist에 focused 셀이 있을 때만 동작한다. */\n private _onDocumentKeydown = (e: KeyboardEvent) => {\n if (e.key !== 'c' || !(e.metaKey || e.ctrlKey) || this.mode !== 'GRID') return\n if (e.defaultPrevented) return // 내부 DataGridBody 핸들러가 이미 처리함\n const grist = this.grist as any\n const focused = grist?.focused\n if (focused?.row === undefined) return\n const selection = window.getSelection()\n if (selection?.type === 'Range') return\n /* DataGridBody.copy()에 위임: 컬럼 조회·클립보드 쓰기·flash 애니메이션을 일괄 처리 */\n e.preventDefault()\n ;(grist.body as any).copy()\n }\n\n /**\n * Gets the current state of the component. The state includes information about the\n * dirty records and their changes.\n *\n * @getter\n * @public\n * @type {string}\n */\n get state() {\n return JSON.stringify(this.dirtyData)\n }\n\n /**\n * Undoes the previous change in the component's data by restoring it to the previous state.\n * This method is part of the TimeCapsule feature, allowing users to revert changes.\n */\n undo() {\n if (!this.timeCapsule?.backwardable) {\n return\n }\n\n this._data = JSON.parse(this.timeCapsule?.backward())\n }\n\n /**\n * Redoes the previously undone change in the component's data by restoring it to the next state.\n * This method is part of the TimeCapsule feature, allowing users to reapply changes.\n */\n redo() {\n if (!this.timeCapsule?.forwardable) {\n return\n }\n\n this._data = JSON.parse(this.timeCapsule?.forward())\n }\n\n /**\n * Fetches data from a data source and updates the component's data. This method is used to retrieve\n * new data or refresh the existing data in the component.\n *\n * @method\n * @param {boolean} reset - If true, the method resets the scroll position to the top.\n */\n async fetch(reset = true) {\n if (this.compiledConfig === ZERO_CONFIG) {\n /* avoid to be here */\n console.warn('grist is not configured yet.')\n this.pendingFetch = true\n return\n }\n\n if (reset && this.grist) {\n /*\n * scroll 의 현재위치에 의해서 scroll 이벤트가 발생할 수 있으므로, 이를 방지하기 위해서 스크롤의 위치를 TOP으로 옮긴다.\n * (scroll 이 첫페이지 크기 이상으로 내려가 있는 경우, 첫페이지부터 다시 표시하는 경우에, scroll 이벤트가 발생한다.)\n */\n this.grist.scrollTop = 0\n }\n\n if (this.dataProvider) {\n let { limit: initLimit, page: initPage, infinite } = this.compiledConfig.pagination || {}\n let { limit = initLimit || ZERO_PAGINATION.limit, page = initPage || ZERO_PAGINATION.page } = this.dataProvider\n\n if (infinite || this.mode !== 'GRID') {\n await this.dataProvider.attach(reset)\n } else {\n await this.dataProvider.fetch({\n limit,\n page,\n sorters: this.sorters || this.compiledConfig?.sorters,\n sortings: this.sorters || this.compiledConfig?.sorters,\n filters: this.filters\n })\n\n this.pagination && (this.pagination!.limit = limit)\n }\n }\n }\n\n async updated(changes: PropertyValues<this>) {\n var needToSetPullToRefresh = false\n\n if (changes.has('filters')) {\n await this.requestUpdate()\n }\n\n if (changes.has('sorters')) {\n await this.requestUpdate()\n }\n\n if (changes.has('personalConfigProvider')) {\n this.personalConfig = await this.personalConfigProvider.load()\n } else if (changes.has('config') || changes.has('personalConfig')) {\n this.applyUpdatedConfiguration()\n }\n\n if (changes.has('fetchHandler')) {\n this.dataProvider && (this.dataProvider.fetchHandler = this.fetchHandler)\n needToSetPullToRefresh = true\n }\n\n if (changes.has('fetchOptions')) {\n this.dataProvider && (this.dataProvider.fetchOptions = this.fetchOptions)\n }\n\n if (changes.has('data')) {\n this.reset()\n }\n\n if (changes.has('mode')) {\n if (this.mode === 'GRID') {\n this.style.removeProperty('--ox-grist-padding')\n } else {\n this.style.setProperty('--ox-grist-padding', '0')\n }\n\n needToSetPullToRefresh = true\n this.setHeadroom()\n }\n\n if (changes.has('selectedRecords')) {\n var { records } = this.data || []\n var selectedRecords = this.selectedRecords || []\n\n var _records = this.dirtyData.records\n\n /* 원본데이타에서 index를 찾아서, 복사본 데이타의 selected를 설정한다. */\n selectedRecords.forEach(selected => {\n var index = records.indexOf(selected)\n var record = _records[index]\n if (record) {\n record['__selected__'] = true\n }\n })\n\n /* update _data property intentionally */\n this.refresh()\n }\n\n if (changes.has('urlParamsSensitive')) {\n if (this.urlParamsSensitive) {\n //@ts-ignore\n this.popstateEventHandler() // call for the first time\n\n window.addEventListener('popstate', this.popstateEventHandler)\n } else {\n window.removeEventListener('popstate', this.popstateEventHandler)\n }\n }\n\n if (needToSetPullToRefresh) {\n await this.setPullToRefresh()\n }\n }\n\n /**\n * Represents the compiled configuration of the component, which includes various settings and\n * column configurations. You can access this property to get information about how the component\n * is configured.\n *\n * @getter\n * @public\n * @type {GristConfig}\n */\n get compiledConfig(): GristConfig {\n return this._config\n }\n\n /**\n * Returns the dirty data in the component, which includes the records that have been added,\n * modified, or deleted but have not been committed to the main data yet.\n *\n * @getter\n * @public\n * @type {GristData} - An object representing the dirty data.\n */\n get dirtyData(): GristData {\n return (this.grist as any)?.data || {}\n }\n\n /**\n * Returns an array of GristRecord objects representing the records in the dirty state. These are\n * the records that have been added, modified, or deleted but have not been committed to the main\n * data yet.\n *\n * @getter\n * @public\n * @type {GristRecord[]} - An array of GristRecord objects representing the dirty records.\n */\n get dirtyRecords() {\n var { records = [] } = this.dirtyData\n return records\n .filter(record => record['__dirty__'])\n .filter(record => {\n // cuFlag 제외하고 키가 모두 빈값이면 필터함 (오브젝트일때는 키가 있어도 모든 값이 빈값이면 제외)\n const keys = Object.keys(record).filter(k => !k.startsWith('__') && k !== 'cuFlag')\n return keys.some(k => {\n const value = record[k]\n if (value && typeof value === 'object' && !Array.isArray(value) && !(value instanceof Date)) {\n return !Object.values(value).every(v => v === '' || v === null || v === undefined)\n }\n return typeof value === 'string' ? value.trim().length > 0 : !isEmpty(value)\n })\n })\n }\n\n /**\n * Exports a list of patches representing the changes in the dirty state of records. Each patch\n * contains information about whether a record was added, modified, or deleted, along with the\n * record's unique identifier and the changed field values.\n *\n * @param {Object} options - Export options that control the format of the patch list.\n * @param {string} options.flagName - The name of the flag field in the patch indicating the change type (default: 'patchFlag').\n * @param {string} options.addedFlag - The flag value for added records (default: '+').\n * @param {string} options.deletedFlag - The flag value for deleted records (default: '-').\n * @param {string} options.modifiedFlag - The flag value for modified records (default: 'M').\n * @param {string} options.idField - The name of the unique identifier field (default: 'id').\n * @returns {Object[]} - An array of objects representing the patches.\n */\n exportPatchList({ flagName = 'patchFlag', addedFlag = '+', deletedFlag = '-', modifiedFlag = 'M', idField = 'id' }) {\n let dirtyRecords = this.dirtyRecords\n if (!dirtyRecords || dirtyRecords.length == 0) {\n return []\n }\n\n return dirtyRecords.map(record => {\n let flag = record.__dirty__\n\n let patch: any = {\n [flagName]: flag == 'M' ? modifiedFlag : flag == '+' ? addedFlag : deletedFlag\n }\n\n if (idField in record && record[idField]) {\n patch[idField] = record[idField]\n }\n\n for (let key in record.__dirtyfields__) {\n const value = record[key]\n\n // id를 가진 object면 id, name만 남긴다 (ObjectRef 규격)\n if (value && typeof value === 'object' && !Array.isArray(value) && !(value instanceof Date) && value.id) {\n patch[key] = { id: value.id, name: value.name }\n } else {\n // 그리드를 빈값으로 던지면\n patch[key] = value === '' || value === null || value === undefined ? null : value\n }\n }\n return patch\n })\n }\n\n /**\n * Exports the selected records or all records in the component, depending on the specified options.\n * You can use this method to export data from the component in various formats or for different purposes.\n *\n * @param {Object} options - Export options that control the behavior of the export.\n * @param {boolean} options.ifSelectedOnly - If true, exports only the selected records. If false, exports all records.\n * @param {boolean} options.includeHiddenField - If true, includes hidden fields in the exported data.\n * @returns {Object[]} - An array of objects representing the exported records.\n */\n exportRecords({ ifSelectedOnly = true, includeHiddenField = true } = {}) {\n let records = ifSelectedOnly ? this.selected : this.data.records\n\n if (ifSelectedOnly && (!records || records.length == 0)) {\n records = this.data.records\n }\n\n let columns = this.compiledConfig.columns.filter(column => column.type !== 'gutter')\n if (!includeHiddenField) {\n columns = columns.filter(column => !column.hidden)\n }\n let columnNames = columns.map(column => column.name)\n\n return records.map(item => {\n return columnNames.reduce((record, name) => {\n record[name] = item[name]\n return record\n }, {} as any)\n })\n }\n\n /**\n * Gets the currently selected records in the component. It returns an array of GristRecord objects\n * that are currently selected. You can access this getter to retrieve the selected records.\n *\n * @getter\n * @public\n * @type {GristRecord[]}\n */\n get selected() {\n var { records = [] } = this.grist?.data\n return records.filter(record => record['__selected__'])\n }\n\n /**\n * Sets the currently selected records in the component. You can use this setter to programmatically\n * select specific records by providing an array of GristRecord objects to be selected.\n *\n * @setter\n * @public\n * @type {GristRecord[]}\n */\n set selected(selected: GristRecord[]) {\n if (!this.grist) {\n console.warn('grist not ready')\n return\n }\n\n selected.forEach(record => (record.__selected__ = true))\n this.refresh()\n }\n\n /**\n * Selects records in the component based on the provided selector function. You can use this method\n * to programmatically select specific records in the component.\n *\n * @method\n * @param {GristSelectFunction} selector - A function that determines which records to select.\n * @param {boolean} reset - If true, clears the previous selection before applying the new one.\n * If false, adds to the existing selection.\n */\n select(selector: GristSelectFunction, reset: boolean = false) {\n var { records = [] } = this.grist?.data\n\n if (reset) {\n this.selected.forEach(record => (record.__selected__ = false))\n }\n\n records.filter(record => selector(record)).forEach(record => (record.__selected__ = true))\n this.refresh()\n }\n\n /**\n * Shows the loading spinner in the component's UI to indicate ongoing data loading or processing.\n * You can call this method to display the spinner when necessary.\n */\n showSpinner() {\n this._showSpinner = true\n }\n\n /**\n * Hides the loading spinner in the component's UI to indicate that data loading or processing has completed.\n * You can call this method to hide the spinner when loading or processing is finished.\n */\n hideSpinner() {\n this._showSpinner = false\n }\n\n /**\n * Focuses on the component, making it the active element in the document. This method is useful\n * when you want to programmatically set focus to the component.\n */\n focus() {\n super.focus()\n\n this.grist.focus()\n }\n\n /**\n * Commits the changes made in the dirty state to the component's data. This method updates the\n * component's data with the changes made in the dirty state and clears the dirty state.\n */\n commit() {\n var { page, total, limit, records } = this.grist.data\n\n this.data = {\n page,\n total,\n limit,\n records: records.map(record => {\n var copied = {\n ...record\n }\n\n delete copied.__seq__\n delete copied.__dirty__\n delete copied.__selected__\n delete copied.__changes__\n delete copied.__dirtyfields__\n delete copied.__origin__\n delete copied.__depth__\n delete copied.__expanded__\n delete copied.__check_in_tree__\n delete copied.__children__\n delete copied.__typename\n\n return copied\n })\n }\n }\n\n /**\n * Shows the headroom element in the component. The headroom element is typically used for\n * displaying additional information or controls at the top of the component.\n */\n showHeadroom() {\n if (this.head) {\n this.head.style.display = 'block'\n this.setHeadroom()\n }\n }\n\n /**\n * Hides the headroom element in the component. This method hides the additional information\n * or controls displayed at the top of the component.\n */\n hideHeadroom() {\n if (this.head) {\n this.head.style.display = 'none'\n this.setHeadroom()\n }\n }\n\n /**\n * Toggles the visibility of the headroom element in the component. If the headroom element is\n * currently visible, this method hides it. If it's hidden, this method shows it.\n */\n toggleHeadroom() {\n if (this.head) {\n const display = this.head.style.display\n this.head.style.display = display !== 'none' ? 'none' : 'block'\n\n this.setHeadroom()\n }\n }\n\n /**\n * Forced internal data to be reflected on the screen\n * Data changing through a normal method is automatically reflected on the screen, so it is a method that does not need to be used in general.\n * Therefore, it will be deprecated.\n * @method\n */\n refresh() {\n this.grist.refresh()\n }\n\n /**\n * Resets the component's data to its original state before any changes were made.\n * This method discards all unsaved changes and restores the data to its initial state.\n *\n * @method\n * @public\n */\n reset() {\n // TODO tree 형태의 데이타로 _data를 만들 때, children, collapsed 등을 감안한다.\n var {\n limit = ZERO_PAGINATION.limit,\n page = ZERO_PAGINATION.page,\n total = ZERO_PAGINATION.total,\n records = []\n } = this.data || ZERO_PAGINATION\n\n const { childrenProperty, expanded } = this.compiledConfig.tree\n\n /* 원본 데이타를 남기고, 복사본(_data)을 사용한다. */\n records = ([] as GristRecord[]).concat(\n ...records.map((record, idx) =>\n this.traverseReset(\n record,\n this.mode == 'GRID' ? (page - 1) * limit + idx + 1 : idx + 1,\n 0,\n childrenProperty,\n expanded as () => boolean\n )\n )\n )\n\n if (childrenProperty) {\n records = ([] as GristRecord[]).concat(...records.map(record => this.traverseExpanded(record)))\n }\n\n this._data = {\n limit,\n page,\n total,\n records\n }\n\n this.timeCapsule?.reset()\n this.snapshotTaker?.take(true)\n }\n\n private traverseReset(\n record: GristRecord,\n seq: number,\n __depth__: number,\n childrenProperty: string | undefined,\n expanded: () => boolean\n ): GristRecord {\n const copied = {\n ...record,\n __seq__: seq,\n __origin__: record\n }\n\n if (childrenProperty) {\n const children: GristRecord[] = record[childrenProperty!]\n\n const __expanded__ = (expanded as Function)(record)\n const __children__ = (children || []).map(child =>\n this.traverseReset(child, seq, __depth__ + 1, childrenProperty, expanded)\n )\n\n Object.assign(copied, { __depth__, __children__, __expanded__ })\n }\n\n return copied\n }\n\n private traverseExpanded(record: GristRecord): GristRecord[] {\n const { __expanded__, __children__ = [] } = record\n\n if (__expanded__ && __children__.length > 0) {\n return [record].concat(...__children__.map(child => this.traverseExpanded(child)))\n } else {\n return [record]\n }\n }\n\n /**\n * Checks for dirty records in the component's data and marks them as dirty.\n * Dirty records are those that have unsaved changes.\n */\n checkDirties() {\n const records = this.dirtyRecords\n const { columns = [] } = this.compiledConfig || {}\n\n for (var record of records || []) {\n var origin = record['__origin__'] || {}\n\n var dirtyFields = (record['__dirtyfields__'] = columns\n .filter(column => column.type !== 'gutter' && !isEqual(origin[column.name], record[column.name]))\n .reduce((sum, column) => {\n var name = column.name\n\n sum[name] = {\n before: origin[name],\n after: record[name]\n }\n\n return sum\n }, {} as any))\n\n if (record['__dirty__'] == 'M' && isEmpty(dirtyFields)) {\n delete record['__dirty__']\n }\n }\n\n this._data = { ...this.dirtyData }\n\n this.snapshotTaker?.touch()\n }\n\n /**\n * Clones the selected records in the component's data. It creates a copy of the selected records\n * and marks them as new (added) records.\n */\n cloneSelectedRecords() {\n const records = this.selected || ([] as GristRecord[])\n\n records.forEach(record => {\n var cloned = {\n __dirty__: '+'\n } as GristRecord\n\n this.compiledConfig.columns\n .filter(column => column.record.editable)\n .forEach(column => {\n cloned[column.name] = record[column.name]\n })\n const rowIndex = this.dirtyData.records.findIndex(rec => rec === record)\n\n this.dirtyData.records.splice(rowIndex + 1, 0, cloned)\n })\n\n this.checkDirties()\n }\n\n /**\n * Adds child nodes to selected records in the component's tree data. It allows users to add child nodes\n * to the selected parent records.\n */\n addChildNodes() {\n const records = this.selected || ([] as GristRecord[])\n\n records.forEach(record => {\n this.grist.addChildNode(record)\n })\n }\n\n /**\n * Adds sibling nodes to selected records in the component's tree data. It allows users to add sibling nodes\n * to the selected records.\n */\n addSiblingNodes() {\n const records = this.selected || ([] as GristRecord[])\n\n records.forEach(record => {\n this.grist.addSiblingNode(record)\n })\n }\n\n /**\n * Deletes the selected records in the component's data. It removes the selected records from the data,\n * optionally marking them as deleted.\n *\n * @method\n * @param {boolean} dirty - If true, the method marks the records as deleted.\n */\n deleteSelectedRecords(dirty = true) {\n const records = this.selected || ([] as GristRecord[])\n\n records.forEach(record => {\n if (dirty) {\n record.__dirty__ = '-'\n }\n\n const rowIndex = this.dirtyData.records.findIndex(rec => rec === record)\n this.dirtyData.records.splice(rowIndex, 1)\n })\n\n this.checkDirties()\n }\n\n /**\n * Adds a new record to the data grid. The added record is marked as newly created\n * by setting the `__dirty__` flag to '+'. This flag indicates that the record\n * is in a \"new\" state and hasn't been committed to the main data yet.\n *\n * @param {GristRecord} [record] - An optional record to add. If no record is provided,\n * an empty record with the `__dirty__` flag set to '+' will be added.\n */\n addRecord(record?: GristRecord) {\n this._data = {\n ...this._data,\n records: [\n ...this.dirtyData.records,\n {\n ...record,\n __dirty__: '+'\n }\n ]\n }\n }\n\n /**\n * Adds a new record to the top of the data grid. The added record is marked as newly created\n * by setting the `__dirty__` flag to '+'. This flag indicates that the record\n * is in a \"new\" state and hasn't been committed to the main data yet.\n *\n * This method is useful when you need to add new records at the top of the grid\n * without changing the default behavior of the appendable row.\n *\n * @param {GristRecord} [record] - An optional record to add. If no record is provided,\n * an empty record with the `__dirty__` flag set to '+' will be added.\n */\n addRecordToTop(record?: GristRecord) {\n const newRecord = {\n ...record,\n __dirty__: '+'\n }\n\n this._data = {\n ...this._data,\n records: [newRecord, ...this.dirtyData.records]\n }\n\n // 새 레코드에 포커스 및 스크롤 처리\n setTimeout(() => {\n // 그리드가 있는 경우 첫 번째 행에 포커스 설정\n if (this.grist) {\n // 포커스를 첫 번째 행으로 설정 (첫 번째 편집 가능한 셀로)\n const focusableColumns = this.compiledConfig.columns.filter(\n column => column.type !== 'gutter' && !column.hidden && column.record.editable\n )\n\n if (focusableColumns.length > 0) {\n const columnIndex = this.compiledConfig.columns.indexOf(focusableColumns[0])\n this.grist.dispatchEvent(\n new CustomEvent('focus-change', {\n bubbles: true,\n composed: true,\n detail: {\n row: 0,\n column: columnIndex\n }\n })\n )\n }\n\n // 스크롤을 맨 위로 이동\n this.grist.scrollTop = 0\n }\n }, 0)\n }\n\n /**\n * Retrieves the search text used for filtering records.\n *\n * @property {string}\n */\n get searchText() {\n return (this.filters?.find(filter => filter.operator === 'search')?.value as string)?.match(/^\\%(.*)\\%$/)?.[1] || ''\n }\n\n /**\n * Sets the search text for filtering records.\n *\n * @property {string}\n */\n set searchText(searchText: string) {\n var filters = (this.filters || []).filter((filter: FilterValue) => filter.operator !== 'search')\n\n if (searchText) {\n const filtersConfig = this.compiledConfig.columns.filter(columnConfig => !!columnConfig.filter)\n const searchColumns = filtersConfig.filter(columnConfig => {\n const filter = columnConfig.filter as FilterConfigObject\n return filter!.operator === 'search'\n })\n\n filters = [\n ...searchColumns.map((column: ColumnConfig) => {\n const { name } = column\n\n return {\n name,\n operator: 'search',\n value: `%${searchText}%`\n } as FilterValue\n }),\n ...filters\n ]\n }\n\n this.grist.dispatchEvent(\n new CustomEvent('fetch-params-change', {\n bubbles: true,\n composed: true,\n detail: {\n filters\n }\n })\n )\n }\n /**\n * Returns the current pagination limit.\n * @returns {number} The current pagination limit value\n */\n getCurrentLimit() {\n return this.dataProvider?.limit || ZERO_PAGINATION.limit\n }\n\n /**\n * Checks the validity of dirty records.\n * @returns {Array<{record: GristRecord, invalidFields: Array<{field: string, reason: ValidationReason}>}>} List of invalid records and their corresponding invalid fields\n */\n checkDirtyRecordsValidity(): { record: GristRecord; invalidFields: { field: string; reason: ValidationReason }[] }[] {\n const records = this.dirtyRecords\n const validationResults = []\n\n for (const record of records) {\n const invalidFields = []\n\n for (const column of this.compiledConfig.columns) {\n if (column.record?.mandatory && (record[column.name] === undefined || record[column.name] === null)) {\n invalidFields.push({\n field: column.name,\n reason: ValidationReason.MANDATORY\n })\n }\n // Additional validation rules can be implemented here.\n }\n\n if (invalidFields.length > 0) {\n validationResults.push({\n record,\n invalidFields\n })\n }\n }\n\n return validationResults\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"data-grist.js","sourceRoot":"","sources":["../../src/data-grist.ts"],"names":[],"mappings":"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","sourcesContent":["import './data-grid/data-grid.js'\nimport './data-list/data-list.js'\nimport './data-card/data-card.js'\n\nimport { css, html, LitElement, PropertyValues } from 'lit'\nimport { customElement, property, query, queryAsync, state } from 'lit/decorators.js'\nimport isEmpty from 'lodash-es/isEmpty.js'\nimport isEqual from 'lodash-es/isEqual.js'\n\nimport Headroom from '@operato/headroom'\nimport { pulltorefresh } from '@operato/pull-to-refresh'\nimport { HeadroomStyles, ScrollbarStyles, SpinnerStyles } from '@operato/styles'\nimport { PagePreferenceProvider } from '@operato/p13n'\nimport { SnapshotTaker, TimeCapsule } from '@operato/utils'\n\nimport { buildConfig } from './configure/config-builder.js'\nimport { ZERO_CONFIG, ZERO_DATA, ZERO_PAGES, ZERO_PAGINATION } from './configure/zero-config.js'\nimport { DataCard } from './data-card/data-card.js'\nimport { DataConsumer } from './data-consumer.js'\nimport { DataGrid } from './data-grid/data-grid.js'\nimport { DataList } from './data-list/data-list.js'\nimport { DataProvider } from './data-provider.js'\nimport {\n ColumnConfig,\n FetchHandler,\n FilterConfigObject,\n FilterValue,\n GristConfig,\n GristData,\n GristRecord,\n GristSelectFunction,\n PaginationConfig,\n PersonalGristPreference,\n SortersConfig,\n ValidationReason\n} from './types.js'\nimport { convertListParamToSearchString, convertSearchStringToListParam } from './utils/index.js'\n\n/**\n * A custom element for rendering data in a grid, list, or card format.\n *\n * @element ox-grist\n */\n@customElement('ox-grist')\nexport class DataGrist extends LitElement implements DataConsumer {\n static styles = [\n ScrollbarStyles,\n HeadroomStyles,\n SpinnerStyles,\n css`\n /*\n * ── 표의 겉모습 — 한 벌로 여기서 정한다 ──────────────────────────────\n *\n * 화면마다 --grid-* 토큰을 하나씩 덮어 모양을 바꾸지 않는다. 그 방식은 두 가지로 깨졌다.\n *\n * · 한 토큰이 두 뜻을 겸한다. --grid-record-focused-cell-border 는 「초점 표식」이면서\n * 「줄을 나누는 선」이었다. 표식을 감추려고 none 을 주면 줄 선이 사라졌다\n * · 스무 개를 짝 맞춰 덮어야 한 벌이 되고, 하나 빠지면 그 자리만 옛 모양으로 남는다\n *\n * 토큰은 shadow DOM 을 넘어 상속되므로 여기서 정하면 머리·칸·바닥까지 그대로 닿는다.\n *\n * 무엇을 바꾸는가 — 표가 자기 틀을 값보다 앞세우지 않게 한다.\n *\n * 머리 회색 바탕 + 2px 파란 윗선 + 파란 글자 → 면 색 + 아랫선 하나 + 작은 대문자 라벨\n * 줄 홀짝 회색 번갈이(zebra) → 선으로만 구분\n * 세로선 열마다 있었다 → 없음\n * 폭 조절 끌 수 있었다 → 없음 (세로선을 그리던 것이 이 손잡이다)\n * 셀 초점 점선 네모 → 없음 (줄 단위로 고르는 표에서는 뜻이 없다)\n * 바닥 회색 바탕 + 파란 글자 → 면 색 + 흐린 글자\n * 값 흐린 색 → 가장 진하게\n *\n * 줄무늬를 없앤 것은 취향이 아니다. 홀짝 회색이 깔려 있으면 **골라 놓은 줄과 마우스 올린 줄이\n * 그 무늬에 묻힌다.** 색은 「지금 무엇을 하고 있나」에만 쓴다.\n */\n :host {\n --grid-header-background-color: var(--ui-bg, #f6f7f9);\n /*\n * 표의 윗변. 열 머리글 위에 선이 없으면 표가 어디서 시작하는지 안 보인다 — 카드 안에 있을\n * 때는 카드 테두리가 그 일을 했지만, 지금은 헤드룸 바로 아래에 놓인다.\n *\n * 아래 선과 같은 굵기·같은 색이다. 위를 굵게 하면 그 선이 제목처럼 읽혀서 표가 무거워진다.\n */\n --grid-header-top-border: 1px solid var(--ui-line, #d5dce0);\n --grid-header-bottom-border: 1px solid var(--ui-line, #d5dce0);\n /*\n * 머리와 몸의 여백은 **같은 값이다.** 1px 이라도 다르면 머리글과 첫 줄의 리듬이 어긋난다.\n *\n * 9px 에서 7px 로 내렸다. 한 줄 표는 40 → 36px, 세 줄 표는 74 → 70px 이 되고, 줄과 줄 사이는\n * 안 변한다 — 그것은 셀 여백이 아니라 .sub 의 margin-top 이다. [재봤음] 2026-09-02\n *\n * 이 화면들이 하는 일은 훑고 고치는 것이라 한 화면에 줄이 많을수록 낫다.\n */\n --grid-header-padding: 7px 10px;\n --grid-header-color: var(--ui-muted, #57676f);\n /*\n * ── 머리글은 라틴 전용 설정이었다 (2026-09-02) ──────────────────────\n * 전에는 600 11px/1 고정폭 · uppercase · 자간 0.07em 이었다. NAME · DESCRIPTION 같은 영문\n * 머리글에는 맞는 조합이지만 한글에는 셋 다 어긋난다.\n *\n * uppercase 한글에는 아무 일도 하지 않는다. 라틴 머리글만 대문자가 되어 규칙이 섞인다\n * 고정폭 한글 글자가 없어 대체 글꼴로 떨어진다 — 한 줄에 두 글꼴이 그려진다\n * 자간 0.07em 11px 에서 글자마다 0.77px. 「ISA-95 계층 단」이 140px 칸에서 잘렸다\n *\n * 그리고 11px 은 푸터(13px)보다 작았다. 머리는 값의 이름이고 푸터는 보조 정보인데 위계가\n * 뒤집혀 있었다. 이제 **본문 14 › 머리 13 = 푸터 13** 이고, 머리는 크기가 아니라 굵기와\n * 바탕색으로 구별된다.\n */\n /*\n * 축약형은 글꼴 이름을 반드시 요구한다. 없이 두면 선언이 통째로 버려진다 — 실제로 그렇게 되어\n * 물려받은 12px/700 이 나왔다. 여기 적는 sans-serif 는 자리를 채우는 값이고, 바로 뒤의\n * font-family(기본 inherit)가 덮는다.\n */\n --grid-header-font: 600 13px / 1.2 sans-serif;\n --grid-header-text-transform: none;\n --grid-header-letter-spacing: 0.01em;\n --grid-header-sorter-size: 14px;\n --grid-header-mark-size: 14px;\n /* 세로 선을 그리는 것이 폭 조절 손잡이다 — 감추면 둘이 함께 사라진다. */\n --grid-header-splitter-display: none;\n\n --grid-record-background-color: var(--ui-panel, #ffffff);\n --grid-record-odd-background-color: var(--ui-panel, #ffffff);\n --grid-record-padding: 7px 10px;\n --grid-record-color: var(--ui-ink, #17242c);\n --grid-record-border-bottom: 1px solid var(--ui-line-soft, #e6eaed);\n /* 초점 표식을 없앤다. outline 으로 그리므로 줄 선은 그대로 남는다. */\n --grid-record-focused-cell-border: none;\n --grid-record-focused-box-shadow: none;\n\n /*\n * ── 푸터는 표의 셋째 위계다 ────────────────────────────────────────\n * 머리글 11px · 본문 14px · 푸터 13px. 전에는 푸터가 본문과 같은 14px 이라 쪽 이동과 건수가\n * 값만큼 눈에 걸렸다. 푸터가 말하는 것은 「지금 어디를 보고 있나」이지 값이 아니다.\n */\n --grid-footer-background-color: var(--ui-bg, #f6f7f9);\n --grid-footer-font-size: 13px;\n /* 지금 고른 것 — 이 색에 굵기가 더해진다. */\n --grid-footer-color: var(--ui-muted, #57676f);\n /* 누를 수 있지만 지금 것이 아닌 것. 한 단 흐리다. */\n --grid-footer-limit-color: var(--ui-faint, #8a959c);\n /*\n * 쪽 번호 입력 상자의 테두리.\n *\n * 전에는 --grid-footer-color(본문 글자색)를 썼다. 그래서 40×21 짜리 상자 하나가 **표의 어떤\n * 경계선보다 진했다.** 행 아래선 #e6eaed · 머리 구분선 #d6dbe0 인데 상자만 #57676f 였다.\n */\n --grid-footer-input-border: 1px solid var(--ui-line, #d6dbe0);\n /*\n * 푸터는 표에 **붙어 있어야 한다.** 8px 위아래로 띄웠더니 표와 따로 떠 있는 띠로 보였다.\n * 이 줄이 말하는 것(몇 쪽 · 몇 건)은 바로 위 표에 대한 것이라 표에 붙는 편이 읽힌다.\n */\n --grid-footer-padding: 3px 6px;\n }\n\n :host {\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n background-color: var(--grist-background-color);\n min-height: 120px;\n\n overflow: hidden;\n\n /* for pulltorefresh controller */\n position: relative;\n\n padding: var(--ox-grist-padding);\n\n --md-icon-size: var(--grid-record-wide-fontsize);\n }\n\n #wrap {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: auto;\n }\n\n ox-grid {\n flex: 1;\n border: var(--grid-wrap-container-border, 0px solid transparent);\n border-width: var(--grid-wrap-container-border-width, 0px);\n }\n\n slot[name='headroom'] {\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n\n width: 100%;\n box-sizing: border-box;\n background-color: var(--grist-background-color);\n\n z-index: 8;\n }\n `\n ]\n\n /**\n * The rendering mode of the component, which can be 'GRID', 'LIST', or 'CARD'.\n * Default is 'GRID'.\n *\n * @property {string}\n */\n @property() mode: 'GRID' | 'LIST' | 'CARD' = 'GRID'\n\n /**\n * The configuration object for the data grist.\n *\n * @property {Object}\n */\n @property() config: any\n\n /**\n * The data to be displayed in the data grist.\n *\n * @property {GristData}\n */\n @property({ type: Object }) data: GristData = ZERO_DATA\n\n /**\n * An array of selected records in the data grist.\n *\n * @property {GristRecord[]}\n */\n @property({ type: Array }) selectedRecords?: GristRecord[]\n\n /**\n * Indicates whether explicit fetching of data is enabled. If true, data will be fetched\n * only when `fetch` method is called. Default is false.\n *\n * @property {boolean}\n */\n @property({ type: Boolean, attribute: 'explicit-fetch' }) explicitFetch: boolean = false\n\n /**\n * The fetch handler function used to retrieve data from a remote source.\n *\n * @property {FetchHandler}\n */\n @property() fetchHandler?: FetchHandler\n\n /**\n * Additional fetch options to be passed to the fetch handler.\n *\n * @property {Object}\n */\n @property() fetchOptions: any\n\n /**\n * An array of filter values to be applied to the data grist.\n *\n * @property {FilterValue[]}\n */\n @property({ type: Array }) filters?: FilterValue[]\n\n /**\n * An array of sorters to determine the order of records in the data grist.\n *\n * @property {SortersConfig}\n */\n @property({ type: Array }) sorters?: SortersConfig\n\n /**\n * The pagination configuration for the data grist.\n *\n * @property {PaginationConfig}\n */\n @property({ type: Object }) pagination?: PaginationConfig\n\n /**\n * Indicates whether URL parameters are sensitive to changes. If true, changes in URL\n * parameters will trigger data fetching. Default is undefined.\n *\n * @property {boolean}\n */\n @property({ type: Boolean, attribute: 'url-params-sensitive' }) urlParamsSensitive?: boolean\n\n @property({ type: Object }) personalConfigProvider: PagePreferenceProvider = {\n load: () => {\n return {}\n },\n save: (preference: any) => preference,\n reset: () => {}\n }\n\n @state() personalConfig?: {\n columns?: Partial<ColumnConfig>[]\n [key: string]: any\n }\n\n @state() _data: GristData = ZERO_DATA // copy data, dirty data\n @state() _config: GristConfig = ZERO_CONFIG // compiled configuration\n @state() private _showSpinner: boolean = false\n\n @query('slot[name=headroom]') head!: HTMLElement\n @query('#grist') grist!: DataGrid | DataList | DataCard\n @queryAsync('#wrap') private wrap!: Promise<HTMLElement>\n\n private timeCapsule?: TimeCapsule\n private snapshotTaker?: SnapshotTaker\n\n private dataProvider?: DataProvider\n private pulltorefreshHandle?: any\n private headroom?: Headroom\n private orginPaddingTop?: string\n private originMarginTop?: string\n\n /*\n * 머리(headroom)의 높이는 **한 번만 재면 안 된다.**\n *\n * 머리는 position: absolute 라 본문이 그만큼 밀려 있어야 하는데, 그 값을 setHeadroom 시점의\n * clientHeight 로 한 번 정해 두었다. 그래서 머리 안의 내용이 나중에 커지면(글꼴이 늦게 오거나,\n * 버튼 높이가 바뀌거나, 제목이 두 줄이 되거나) 본문이 머리 아래로 파고들어 **글자가 겹친다.**\n *\n * 실제로 동작 버튼 높이를 32px 에서 36px 로 올렸을 때 제목 줄과 열 머리글이 겹쳤다.\n * 크기를 지켜보고 그때마다 다시 민다.\n */\n private headResizeObserver?: ResizeObserver\n private headroomAtTop: boolean = true\n private lastLocation: { origin?: string; pathname?: string; search?: string } = {}\n\n /* 그리드가 준비되기 전에 fetch 요청이 있었음을 나타내는 플래그임 */\n private pendingFetch?: boolean\n\n private popstateEventHandler: EventListener = ((e: Event) => {\n const { origin, pathname, search } = window.location\n if (\n this.lastLocation.origin &&\n (this.lastLocation.origin !== origin ||\n this.lastLocation.pathname !== pathname ||\n this.lastLocation.search === search)\n ) {\n return\n }\n\n this.lastLocation = {\n origin,\n pathname,\n search\n }\n\n var { filters = [], sorters = [] } = convertSearchStringToListParam(search)\n\n try {\n if (!isEqual(filters, this.filters) || !isEqual(sorters, this.sorters)) {\n this.dispatchEvent(\n new CustomEvent('fetch-params-change', {\n bubbles: true,\n composed: true,\n detail: {\n filters,\n sorters,\n from: 'url-parameter'\n }\n })\n )\n }\n } catch (e) {\n console.error(`invalid fetch params on URL query string : ${e}`)\n }\n }).bind(this)\n\n private fetchParamsChangeEventHandler: EventListener = ((e: Event) => {\n const { sorters, filters, from } = (e as CustomEvent).detail\n\n sorters && (this.sorters = sorters)\n filters && (this.filters = filters)\n\n if (!this.urlParamsSensitive || from === 'url-parameter') {\n return\n }\n\n const queryString = convertListParamToSearchString({ filters, sorters, base: window.location.search })\n this.lastLocation.search = queryString ? `?${queryString}` : ''\n const url = `${window.location.pathname}${this.lastLocation.search}`\n\n history.pushState({}, document.title, url)\n }).bind(this)\n\n async firstUpdated() {\n // Mutation Observer를 사용하여 슬롯의 크기 변경을 감지하고 다시 그린다.\n const observer = new ResizeObserver(mutationsList => {\n this.setHeadroom()\n })\n\n observer.observe(this.head)\n }\n\n async connectedCallback() {\n super.connectedCallback()\n\n this.dataProvider = new DataProvider(this)\n\n this.timeCapsule = new TimeCapsule(10)\n this.snapshotTaker = new SnapshotTaker(this, this.timeCapsule!)\n\n this.addEventListener('fetch-params-change', this.fetchParamsChangeEventHandler)\n document.addEventListener('keydown', this._onDocumentKeydown)\n\n await this.updateComplete\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n\n this.removeEventListener('fetch-params-change', this.fetchParamsChangeEventHandler)\n document.removeEventListener('keydown', this._onDocumentKeydown)\n\n this.headResizeObserver?.disconnect()\n delete this.headResizeObserver\n\n this.timeCapsule && this.timeCapsule.dispose()\n this.snapshotTaker && this.snapshotTaker.dispose()\n\n delete this.timeCapsule\n delete this.snapshotTaker\n\n this.dataProvider?.dispose()\n this.resetPullToRefresh()\n }\n\n private resetPullToRefresh() {\n if (this.pulltorefreshHandle) {\n this.pulltorefreshHandle()\n delete this.pulltorefreshHandle\n }\n }\n\n private async setPullToRefresh() {\n this.resetPullToRefresh()\n if (this.mode !== 'GRID' && this.fetchHandler) {\n this.pulltorefreshHandle = pulltorefresh({\n container: await this.wrap,\n scrollable: this.grist.pullToRefreshTarget,\n refresh: () => {\n return this.fetch(true)\n }\n })\n }\n }\n\n public applyUpdatedConfiguration() {\n if (!this.personalConfig || !this.config) {\n return\n }\n\n const config = { ...this.config }\n const columns: Partial<ColumnConfig>[] = config.columns\n\n const { columns: personalColumns, sorters, pagination, mode } = this.personalConfig\n\n if (personalColumns) {\n const xcolumns = columns.map((column: Partial<ColumnConfig>) => {\n const personalColumn = personalColumns.find(pcolumn => pcolumn.name == column.name)\n return personalColumn ? { ...column, ...personalColumn } : column\n })\n\n function reorderList(a: { name: string }[], b: { name: string }[]): { name: string }[] {\n // 결과 배열 초기화, a 배열 길이만큼 undefined로 채움\n const result = new Array(a.length)\n\n // b 배열에 없는 아이템은 원래 위치로 채움\n a.forEach((item, index) => {\n if (!item.name || !b.find(bi => bi.name == item.name)) {\n result[index] = item\n }\n })\n\n b.forEach(item => {\n const ai = a.find(ai => ai.name == item.name)\n if (ai) {\n result[result.findIndex(slot => slot === undefined)] = ai\n }\n })\n\n return result\n }\n\n // 배열 재정렬 실행\n config.columns = reorderList(xcolumns as any, personalColumns as any)\n }\n\n if (pagination) {\n config.pagination = pagination\n }\n\n if (sorters) {\n config.sorters = sorters\n }\n\n if (mode) {\n this.mode = mode\n }\n\n this._config = buildConfig({\n ...config\n })\n\n this.dispatchEvent(\n new CustomEvent('config-change', {\n bubbles: true,\n composed: true,\n detail: this.compiledConfig\n })\n )\n\n this.pagination = this.compiledConfig.pagination || {}\n\n if (!this.urlParamsSensitive) {\n const sorters = this.compiledConfig?.sorters\n const filters = this.compiledConfig?.columns\n .filter(\n column =>\n column.filter &&\n 'value' in (column.filter as FilterConfigObject) &&\n (typeof (column.filter as FilterConfigObject).value === 'boolean' ||\n (column.filter as FilterConfigObject).value)\n )\n .map(column => {\n const filter = column.filter as FilterConfigObject\n return { name: column.name, operator: filter.operator, value: filter.value } as FilterValue\n })\n\n this.dispatchEvent(\n new CustomEvent('fetch-params-change', {\n bubbles: true,\n composed: true,\n detail: {\n filters,\n sorters,\n from: 'config'\n }\n })\n )\n }\n\n if (this.dataProvider) {\n const { limit, pages = ZERO_PAGES } = this._config.pagination || ZERO_PAGINATION\n this.dataProvider.page = 1\n this.dataProvider.limit = limit || pages[0] || ZERO_PAGES[0]\n }\n\n if (this.pendingFetch || (!this.urlParamsSensitive && !this.explicitFetch)) {\n this.pendingFetch = false\n this.fetch()\n }\n }\n\n /** 머리 높이만큼 본문을 민다. 위에 있을 때는 margin, 스크롤 중일 때는 padding 이다. */\n private applyHeadOffset() {\n if (!this.grist || !this.head || this.head.style.display === 'none') {\n return\n }\n\n const offset = this.head.clientHeight + 'px'\n\n if (this.headroomAtTop) {\n this.grist.style.marginTop = offset\n } else {\n this.grist.style.paddingTop = offset\n }\n }\n\n private setHeadroom() {\n this.headroom?.destroy()\n\n if (this.grist && this.head && this.head.style.display !== 'none') {\n const style = getComputedStyle(this.grist)\n\n this.orginPaddingTop = style.paddingTop || '0'\n this.originMarginTop = style.marginTop || '0'\n\n this.headroom = new Headroom(this.head, {\n scroller: this.grist,\n onTop: () => {\n this.grist.style.paddingTop = this.orginPaddingTop!\n this.originMarginTop = this.grist.style.marginTop\n\n this.headroomAtTop = true\n this.applyHeadOffset()\n },\n onNotTop: () => {\n this.grist.style.marginTop = this.originMarginTop!\n this.orginPaddingTop = this.grist.style.paddingTop\n\n this.headroomAtTop = false\n this.applyHeadOffset()\n }\n })\n\n this.headroom.init()\n\n /* 머리가 커지거나 줄면 그때마다 다시 민다 — 한 번 잰 값으로 두면 내용이 겹친다. */\n this.headResizeObserver?.disconnect()\n this.headResizeObserver = new ResizeObserver(() => this.applyHeadOffset())\n this.headResizeObserver.observe(this.head)\n } else if (this.grist) {\n /*\n * 머리를 감췄으면 **밀어 둔 값을 지운다.** 저장해 둔 「원래 값」을 되돌리지 않는다.\n *\n * 그 변수들은 믿을 수 없다 — 미는 쪽(onTop · onNotTop)이 같은 변수에 **밀어 놓은 값을** 다시\n * 담는다. 그래서 감출 때 되돌릴 값이 이미 오염돼 있다.\n *\n * [재봤음] 머리를 감춰도 표가 그대로였다. 2026-09-02\n *\n * 전 머리 78px margin-top 78px 표 시작 191\n * 감춘 뒤 머리 0px margin-top 78px 표 시작 191 ← 안 움직인다\n *\n * 인라인 값을 지우면 CSS 가 정한 값으로 돌아간다. 머리가 없을 때 옳은 값은 그것뿐이다.\n */\n this.grist.style.removeProperty('margin-top')\n this.grist.style.removeProperty('padding-top')\n }\n }\n\n render() {\n const empty = !this._showSpinner && this._data.records.length == 0\n\n return html`\n <slot name=\"headroom\"> </slot>\n <div id=\"wrap\" @keydown=${(e: KeyboardEvent) => this.onKeydown(e)}>\n ${this.mode == 'GRID'\n ? html`\n <ox-grid\n id=\"grist\"\n .config=${this.compiledConfig}\n .data=${this._data}\n .sorters=${this.sorters || []}\n .filters=${this.filters || []}\n .pagination=${this.pagination || {}}\n ?empty=${empty}\n >\n <slot name=\"setting\" slot=\"setting\"> </slot>\n </ox-grid>\n `\n : this.mode == 'CARD'\n ? html`\n <ox-card\n id=\"grist\"\n .config=${this.compiledConfig}\n .data=${this._data}\n .sorters=${this.sorters || []}\n .filters=${this.filters || []}\n ?empty=${empty}\n >\n </ox-card>\n `\n : html`\n <ox-list\n id=\"grist\"\n .config=${this.compiledConfig}\n .data=${this._data}\n .sorters=${this.sorters || []}\n .filters=${this.filters || []}\n ?empty=${empty}\n >\n </ox-list>\n `}\n </div>\n\n <div id=\"spinner\" ?show=${this._showSpinner}></div>\n `\n }\n\n /* for timecapsule feature */\n private onKeydown(e: KeyboardEvent) {\n if (e.key === 'z' && (e.metaKey || e.ctrlKey)) {\n if (e.shiftKey) {\n this.redo()\n } else {\n this.undo()\n }\n }\n }\n\n /* 트리 그리드 단일 셀 복사 폴백: document 레벨에서 Ctrl+C를 수신.\n * 혼합 화면 등에서 행 클릭 후 scan input이 포커스를 빼앗아가므로\n * DataGrist 내부 이벤트 버블링에 의존할 수 없어 document 레벨에서 처리.\n * 이 DataGrist에 focused 셀이 있을 때만 동작한다. */\n private _onDocumentKeydown = (e: KeyboardEvent) => {\n if (e.key !== 'c' || !(e.metaKey || e.ctrlKey) || this.mode !== 'GRID') return\n if (e.defaultPrevented) return // 내부 DataGridBody 핸들러가 이미 처리함\n const grist = this.grist as any\n const focused = grist?.focused\n if (focused?.row === undefined) return\n const selection = window.getSelection()\n if (selection?.type === 'Range') return\n /* DataGridBody.copy()에 위임: 컬럼 조회·클립보드 쓰기·flash 애니메이션을 일괄 처리 */\n e.preventDefault()\n ;(grist.body as any).copy()\n }\n\n /**\n * Gets the current state of the component. The state includes information about the\n * dirty records and their changes.\n *\n * @getter\n * @public\n * @type {string}\n */\n get state() {\n return JSON.stringify(this.dirtyData)\n }\n\n /**\n * Undoes the previous change in the component's data by restoring it to the previous state.\n * This method is part of the TimeCapsule feature, allowing users to revert changes.\n */\n undo() {\n if (!this.timeCapsule?.backwardable) {\n return\n }\n\n this._data = JSON.parse(this.timeCapsule?.backward())\n }\n\n /**\n * Redoes the previously undone change in the component's data by restoring it to the next state.\n * This method is part of the TimeCapsule feature, allowing users to reapply changes.\n */\n redo() {\n if (!this.timeCapsule?.forwardable) {\n return\n }\n\n this._data = JSON.parse(this.timeCapsule?.forward())\n }\n\n /**\n * Fetches data from a data source and updates the component's data. This method is used to retrieve\n * new data or refresh the existing data in the component.\n *\n * @method\n * @param {boolean} reset - If true, the method resets the scroll position to the top.\n */\n async fetch(reset = true) {\n if (this.compiledConfig === ZERO_CONFIG) {\n /* avoid to be here */\n console.warn('grist is not configured yet.')\n this.pendingFetch = true\n return\n }\n\n if (reset && this.grist) {\n /*\n * scroll 의 현재위치에 의해서 scroll 이벤트가 발생할 수 있으므로, 이를 방지하기 위해서 스크롤의 위치를 TOP으로 옮긴다.\n * (scroll 이 첫페이지 크기 이상으로 내려가 있는 경우, 첫페이지부터 다시 표시하는 경우에, scroll 이벤트가 발생한다.)\n */\n this.grist.scrollTop = 0\n }\n\n if (this.dataProvider) {\n let { limit: initLimit, page: initPage, infinite } = this.compiledConfig.pagination || {}\n let { limit = initLimit || ZERO_PAGINATION.limit, page = initPage || ZERO_PAGINATION.page } = this.dataProvider\n\n if (infinite || this.mode !== 'GRID') {\n await this.dataProvider.attach(reset)\n } else {\n await this.dataProvider.fetch({\n limit,\n page,\n sorters: this.sorters || this.compiledConfig?.sorters,\n sortings: this.sorters || this.compiledConfig?.sorters,\n filters: this.filters\n })\n\n this.pagination && (this.pagination!.limit = limit)\n }\n }\n }\n\n async updated(changes: PropertyValues<this>) {\n var needToSetPullToRefresh = false\n\n if (changes.has('filters')) {\n await this.requestUpdate()\n }\n\n if (changes.has('sorters')) {\n await this.requestUpdate()\n }\n\n if (changes.has('personalConfigProvider')) {\n this.personalConfig = await this.personalConfigProvider.load()\n } else if (changes.has('config') || changes.has('personalConfig')) {\n this.applyUpdatedConfiguration()\n }\n\n if (changes.has('fetchHandler')) {\n this.dataProvider && (this.dataProvider.fetchHandler = this.fetchHandler)\n needToSetPullToRefresh = true\n }\n\n if (changes.has('fetchOptions')) {\n this.dataProvider && (this.dataProvider.fetchOptions = this.fetchOptions)\n }\n\n if (changes.has('data')) {\n this.reset()\n }\n\n if (changes.has('mode')) {\n if (this.mode === 'GRID') {\n this.style.removeProperty('--ox-grist-padding')\n } else {\n this.style.setProperty('--ox-grist-padding', '0')\n }\n\n needToSetPullToRefresh = true\n this.setHeadroom()\n }\n\n if (changes.has('selectedRecords')) {\n var { records } = this.data || []\n var selectedRecords = this.selectedRecords || []\n\n var _records = this.dirtyData.records\n\n /* 원본데이타에서 index를 찾아서, 복사본 데이타의 selected를 설정한다. */\n selectedRecords.forEach(selected => {\n var index = records.indexOf(selected)\n var record = _records[index]\n if (record) {\n record['__selected__'] = true\n }\n })\n\n /* update _data property intentionally */\n this.refresh()\n }\n\n if (changes.has('urlParamsSensitive')) {\n if (this.urlParamsSensitive) {\n //@ts-ignore\n this.popstateEventHandler() // call for the first time\n\n window.addEventListener('popstate', this.popstateEventHandler)\n } else {\n window.removeEventListener('popstate', this.popstateEventHandler)\n }\n }\n\n if (needToSetPullToRefresh) {\n await this.setPullToRefresh()\n }\n }\n\n /**\n * Represents the compiled configuration of the component, which includes various settings and\n * column configurations. You can access this property to get information about how the component\n * is configured.\n *\n * @getter\n * @public\n * @type {GristConfig}\n */\n get compiledConfig(): GristConfig {\n return this._config\n }\n\n /**\n * Returns the dirty data in the component, which includes the records that have been added,\n * modified, or deleted but have not been committed to the main data yet.\n *\n * @getter\n * @public\n * @type {GristData} - An object representing the dirty data.\n */\n get dirtyData(): GristData {\n return (this.grist as any)?.data || {}\n }\n\n /**\n * Returns an array of GristRecord objects representing the records in the dirty state. These are\n * the records that have been added, modified, or deleted but have not been committed to the main\n * data yet.\n *\n * @getter\n * @public\n * @type {GristRecord[]} - An array of GristRecord objects representing the dirty records.\n */\n get dirtyRecords() {\n var { records = [] } = this.dirtyData\n return records\n .filter(record => record['__dirty__'])\n .filter(record => {\n // cuFlag 제외하고 키가 모두 빈값이면 필터함 (오브젝트일때는 키가 있어도 모든 값이 빈값이면 제외)\n const keys = Object.keys(record).filter(k => !k.startsWith('__') && k !== 'cuFlag')\n return keys.some(k => {\n const value = record[k]\n if (value && typeof value === 'object' && !Array.isArray(value) && !(value instanceof Date)) {\n return !Object.values(value).every(v => v === '' || v === null || v === undefined)\n }\n return typeof value === 'string' ? value.trim().length > 0 : !isEmpty(value)\n })\n })\n }\n\n /**\n * Exports a list of patches representing the changes in the dirty state of records. Each patch\n * contains information about whether a record was added, modified, or deleted, along with the\n * record's unique identifier and the changed field values.\n *\n * @param {Object} options - Export options that control the format of the patch list.\n * @param {string} options.flagName - The name of the flag field in the patch indicating the change type (default: 'patchFlag').\n * @param {string} options.addedFlag - The flag value for added records (default: '+').\n * @param {string} options.deletedFlag - The flag value for deleted records (default: '-').\n * @param {string} options.modifiedFlag - The flag value for modified records (default: 'M').\n * @param {string} options.idField - The name of the unique identifier field (default: 'id').\n * @returns {Object[]} - An array of objects representing the patches.\n */\n exportPatchList({ flagName = 'patchFlag', addedFlag = '+', deletedFlag = '-', modifiedFlag = 'M', idField = 'id' }) {\n let dirtyRecords = this.dirtyRecords\n if (!dirtyRecords || dirtyRecords.length == 0) {\n return []\n }\n\n return dirtyRecords.map(record => {\n let flag = record.__dirty__\n\n let patch: any = {\n [flagName]: flag == 'M' ? modifiedFlag : flag == '+' ? addedFlag : deletedFlag\n }\n\n if (idField in record && record[idField]) {\n patch[idField] = record[idField]\n }\n\n for (let key in record.__dirtyfields__) {\n const value = record[key]\n\n // id를 가진 object면 id, name만 남긴다 (ObjectRef 규격)\n if (value && typeof value === 'object' && !Array.isArray(value) && !(value instanceof Date) && value.id) {\n patch[key] = { id: value.id, name: value.name }\n } else {\n // 그리드를 빈값으로 던지면\n patch[key] = value === '' || value === null || value === undefined ? null : value\n }\n }\n return patch\n })\n }\n\n /**\n * Exports the selected records or all records in the component, depending on the specified options.\n * You can use this method to export data from the component in various formats or for different purposes.\n *\n * @param {Object} options - Export options that control the behavior of the export.\n * @param {boolean} options.ifSelectedOnly - If true, exports only the selected records. If false, exports all records.\n * @param {boolean} options.includeHiddenField - If true, includes hidden fields in the exported data.\n * @returns {Object[]} - An array of objects representing the exported records.\n */\n exportRecords({ ifSelectedOnly = true, includeHiddenField = true } = {}) {\n let records = ifSelectedOnly ? this.selected : this.data.records\n\n if (ifSelectedOnly && (!records || records.length == 0)) {\n records = this.data.records\n }\n\n let columns = this.compiledConfig.columns.filter(column => column.type !== 'gutter')\n if (!includeHiddenField) {\n columns = columns.filter(column => !column.hidden)\n }\n let columnNames = columns.map(column => column.name)\n\n return records.map(item => {\n return columnNames.reduce((record, name) => {\n record[name] = item[name]\n return record\n }, {} as any)\n })\n }\n\n /**\n * Gets the currently selected records in the component. It returns an array of GristRecord objects\n * that are currently selected. You can access this getter to retrieve the selected records.\n *\n * @getter\n * @public\n * @type {GristRecord[]}\n */\n get selected() {\n var { records = [] } = this.grist?.data\n return records.filter(record => record['__selected__'])\n }\n\n /**\n * Sets the currently selected records in the component. You can use this setter to programmatically\n * select specific records by providing an array of GristRecord objects to be selected.\n *\n * @setter\n * @public\n * @type {GristRecord[]}\n */\n set selected(selected: GristRecord[]) {\n if (!this.grist) {\n console.warn('grist not ready')\n return\n }\n\n selected.forEach(record => (record.__selected__ = true))\n this.refresh()\n }\n\n /**\n * Selects records in the component based on the provided selector function. You can use this method\n * to programmatically select specific records in the component.\n *\n * @method\n * @param {GristSelectFunction} selector - A function that determines which records to select.\n * @param {boolean} reset - If true, clears the previous selection before applying the new one.\n * If false, adds to the existing selection.\n */\n select(selector: GristSelectFunction, reset: boolean = false) {\n var { records = [] } = this.grist?.data\n\n if (reset) {\n this.selected.forEach(record => (record.__selected__ = false))\n }\n\n records.filter(record => selector(record)).forEach(record => (record.__selected__ = true))\n this.refresh()\n }\n\n /**\n * Shows the loading spinner in the component's UI to indicate ongoing data loading or processing.\n * You can call this method to display the spinner when necessary.\n */\n showSpinner() {\n this._showSpinner = true\n }\n\n /**\n * Hides the loading spinner in the component's UI to indicate that data loading or processing has completed.\n * You can call this method to hide the spinner when loading or processing is finished.\n */\n hideSpinner() {\n this._showSpinner = false\n }\n\n /**\n * Focuses on the component, making it the active element in the document. This method is useful\n * when you want to programmatically set focus to the component.\n */\n focus() {\n super.focus()\n\n this.grist.focus()\n }\n\n /**\n * Commits the changes made in the dirty state to the component's data. This method updates the\n * component's data with the changes made in the dirty state and clears the dirty state.\n */\n commit() {\n var { page, total, limit, records } = this.grist.data\n\n this.data = {\n page,\n total,\n limit,\n records: records.map(record => {\n var copied = {\n ...record\n }\n\n delete copied.__seq__\n delete copied.__dirty__\n delete copied.__selected__\n delete copied.__changes__\n delete copied.__dirtyfields__\n delete copied.__origin__\n delete copied.__depth__\n delete copied.__expanded__\n delete copied.__check_in_tree__\n delete copied.__children__\n delete copied.__typename\n\n return copied\n })\n }\n }\n\n /**\n * Shows the headroom element in the component. The headroom element is typically used for\n * displaying additional information or controls at the top of the component.\n */\n showHeadroom() {\n if (this.head) {\n this.head.style.display = 'block'\n this.setHeadroom()\n }\n }\n\n /**\n * Hides the headroom element in the component. This method hides the additional information\n * or controls displayed at the top of the component.\n */\n hideHeadroom() {\n if (this.head) {\n this.head.style.display = 'none'\n this.setHeadroom()\n }\n }\n\n /**\n * Toggles the visibility of the headroom element in the component. If the headroom element is\n * currently visible, this method hides it. If it's hidden, this method shows it.\n */\n toggleHeadroom() {\n if (this.head) {\n const display = this.head.style.display\n this.head.style.display = display !== 'none' ? 'none' : 'block'\n\n this.setHeadroom()\n }\n }\n\n /**\n * Forced internal data to be reflected on the screen\n * Data changing through a normal method is automatically reflected on the screen, so it is a method that does not need to be used in general.\n * Therefore, it will be deprecated.\n * @method\n */\n refresh() {\n this.grist.refresh()\n }\n\n /**\n * Resets the component's data to its original state before any changes were made.\n * This method discards all unsaved changes and restores the data to its initial state.\n *\n * @method\n * @public\n */\n reset() {\n // TODO tree 형태의 데이타로 _data를 만들 때, children, collapsed 등을 감안한다.\n var {\n limit = ZERO_PAGINATION.limit,\n page = ZERO_PAGINATION.page,\n total = ZERO_PAGINATION.total,\n records = []\n } = this.data || ZERO_PAGINATION\n\n const { childrenProperty, expanded } = this.compiledConfig.tree\n\n /* 원본 데이타를 남기고, 복사본(_data)을 사용한다. */\n records = ([] as GristRecord[]).concat(\n ...records.map((record, idx) =>\n this.traverseReset(\n record,\n this.mode == 'GRID' ? (page - 1) * limit + idx + 1 : idx + 1,\n 0,\n childrenProperty,\n expanded as () => boolean\n )\n )\n )\n\n if (childrenProperty) {\n records = ([] as GristRecord[]).concat(...records.map(record => this.traverseExpanded(record)))\n }\n\n this._data = {\n limit,\n page,\n total,\n records\n }\n\n this.timeCapsule?.reset()\n this.snapshotTaker?.take(true)\n }\n\n private traverseReset(\n record: GristRecord,\n seq: number,\n __depth__: number,\n childrenProperty: string | undefined,\n expanded: () => boolean\n ): GristRecord {\n const copied = {\n ...record,\n __seq__: seq,\n __origin__: record\n }\n\n if (childrenProperty) {\n const children: GristRecord[] = record[childrenProperty!]\n\n const __expanded__ = (expanded as Function)(record)\n const __children__ = (children || []).map(child =>\n this.traverseReset(child, seq, __depth__ + 1, childrenProperty, expanded)\n )\n\n Object.assign(copied, { __depth__, __children__, __expanded__ })\n }\n\n return copied\n }\n\n private traverseExpanded(record: GristRecord): GristRecord[] {\n const { __expanded__, __children__ = [] } = record\n\n if (__expanded__ && __children__.length > 0) {\n return [record].concat(...__children__.map(child => this.traverseExpanded(child)))\n } else {\n return [record]\n }\n }\n\n /**\n * Checks for dirty records in the component's data and marks them as dirty.\n * Dirty records are those that have unsaved changes.\n */\n checkDirties() {\n const records = this.dirtyRecords\n const { columns = [] } = this.compiledConfig || {}\n\n for (var record of records || []) {\n var origin = record['__origin__'] || {}\n\n var dirtyFields = (record['__dirtyfields__'] = columns\n .filter(column => column.type !== 'gutter' && !isEqual(origin[column.name], record[column.name]))\n .reduce((sum, column) => {\n var name = column.name\n\n sum[name] = {\n before: origin[name],\n after: record[name]\n }\n\n return sum\n }, {} as any))\n\n if (record['__dirty__'] == 'M' && isEmpty(dirtyFields)) {\n delete record['__dirty__']\n }\n }\n\n this._data = { ...this.dirtyData }\n\n this.snapshotTaker?.touch()\n }\n\n /**\n * Clones the selected records in the component's data. It creates a copy of the selected records\n * and marks them as new (added) records.\n */\n cloneSelectedRecords() {\n const records = this.selected || ([] as GristRecord[])\n\n records.forEach(record => {\n var cloned = {\n __dirty__: '+'\n } as GristRecord\n\n this.compiledConfig.columns\n .filter(column => column.record.editable)\n .forEach(column => {\n cloned[column.name] = record[column.name]\n })\n const rowIndex = this.dirtyData.records.findIndex(rec => rec === record)\n\n this.dirtyData.records.splice(rowIndex + 1, 0, cloned)\n })\n\n this.checkDirties()\n }\n\n /**\n * Adds child nodes to selected records in the component's tree data. It allows users to add child nodes\n * to the selected parent records.\n */\n addChildNodes() {\n const records = this.selected || ([] as GristRecord[])\n\n records.forEach(record => {\n this.grist.addChildNode(record)\n })\n }\n\n /**\n * Adds sibling nodes to selected records in the component's tree data. It allows users to add sibling nodes\n * to the selected records.\n */\n addSiblingNodes() {\n const records = this.selected || ([] as GristRecord[])\n\n records.forEach(record => {\n this.grist.addSiblingNode(record)\n })\n }\n\n /**\n * Deletes the selected records in the component's data. It removes the selected records from the data,\n * optionally marking them as deleted.\n *\n * @method\n * @param {boolean} dirty - If true, the method marks the records as deleted.\n */\n deleteSelectedRecords(dirty = true) {\n const records = this.selected || ([] as GristRecord[])\n\n records.forEach(record => {\n if (dirty) {\n record.__dirty__ = '-'\n }\n\n const rowIndex = this.dirtyData.records.findIndex(rec => rec === record)\n this.dirtyData.records.splice(rowIndex, 1)\n })\n\n this.checkDirties()\n }\n\n /**\n * Adds a new record to the data grid. The added record is marked as newly created\n * by setting the `__dirty__` flag to '+'. This flag indicates that the record\n * is in a \"new\" state and hasn't been committed to the main data yet.\n *\n * @param {GristRecord} [record] - An optional record to add. If no record is provided,\n * an empty record with the `__dirty__` flag set to '+' will be added.\n */\n addRecord(record?: GristRecord) {\n this._data = {\n ...this._data,\n records: [\n ...this.dirtyData.records,\n {\n ...record,\n __dirty__: '+'\n }\n ]\n }\n }\n\n /**\n * Adds a new record to the top of the data grid. The added record is marked as newly created\n * by setting the `__dirty__` flag to '+'. This flag indicates that the record\n * is in a \"new\" state and hasn't been committed to the main data yet.\n *\n * This method is useful when you need to add new records at the top of the grid\n * without changing the default behavior of the appendable row.\n *\n * @param {GristRecord} [record] - An optional record to add. If no record is provided,\n * an empty record with the `__dirty__` flag set to '+' will be added.\n */\n addRecordToTop(record?: GristRecord) {\n const newRecord = {\n ...record,\n __dirty__: '+'\n }\n\n this._data = {\n ...this._data,\n records: [newRecord, ...this.dirtyData.records]\n }\n\n // 새 레코드에 포커스 및 스크롤 처리\n setTimeout(() => {\n // 그리드가 있는 경우 첫 번째 행에 포커스 설정\n if (this.grist) {\n // 포커스를 첫 번째 행으로 설정 (첫 번째 편집 가능한 셀로)\n const focusableColumns = this.compiledConfig.columns.filter(\n column => column.type !== 'gutter' && !column.hidden && column.record.editable\n )\n\n if (focusableColumns.length > 0) {\n const columnIndex = this.compiledConfig.columns.indexOf(focusableColumns[0])\n this.grist.dispatchEvent(\n new CustomEvent('focus-change', {\n bubbles: true,\n composed: true,\n detail: {\n row: 0,\n column: columnIndex\n }\n })\n )\n }\n\n // 스크롤을 맨 위로 이동\n this.grist.scrollTop = 0\n }\n }, 0)\n }\n\n /**\n * Retrieves the search text used for filtering records.\n *\n * @property {string}\n */\n get searchText() {\n return (this.filters?.find(filter => filter.operator === 'search')?.value as string)?.match(/^\\%(.*)\\%$/)?.[1] || ''\n }\n\n /**\n * Sets the search text for filtering records.\n *\n * @property {string}\n */\n set searchText(searchText: string) {\n var filters = (this.filters || []).filter((filter: FilterValue) => filter.operator !== 'search')\n\n if (searchText) {\n const filtersConfig = this.compiledConfig.columns.filter(columnConfig => !!columnConfig.filter)\n const searchColumns = filtersConfig.filter(columnConfig => {\n const filter = columnConfig.filter as FilterConfigObject\n return filter!.operator === 'search'\n })\n\n filters = [\n ...searchColumns.map((column: ColumnConfig) => {\n const { name } = column\n\n return {\n name,\n operator: 'search',\n value: `%${searchText}%`\n } as FilterValue\n }),\n ...filters\n ]\n }\n\n this.grist.dispatchEvent(\n new CustomEvent('fetch-params-change', {\n bubbles: true,\n composed: true,\n detail: {\n filters\n }\n })\n )\n }\n /**\n * Returns the current pagination limit.\n * @returns {number} The current pagination limit value\n */\n getCurrentLimit() {\n return this.dataProvider?.limit || ZERO_PAGINATION.limit\n }\n\n /**\n * Checks the validity of dirty records.\n * @returns {Array<{record: GristRecord, invalidFields: Array<{field: string, reason: ValidationReason}>}>} List of invalid records and their corresponding invalid fields\n */\n checkDirtyRecordsValidity(): { record: GristRecord; invalidFields: { field: string; reason: ValidationReason }[] }[] {\n const records = this.dirtyRecords\n const validationResults = []\n\n for (const record of records) {\n const invalidFields = []\n\n for (const column of this.compiledConfig.columns) {\n if (column.record?.mandatory && (record[column.name] === undefined || record[column.name] === null)) {\n invalidFields.push({\n field: column.name,\n reason: ValidationReason.MANDATORY\n })\n }\n // Additional validation rules can be implemented here.\n }\n\n if (invalidFields.length > 0) {\n validationResults.push({\n record,\n invalidFields\n })\n }\n }\n\n return validationResults\n }\n}\n"]}
|