@operato/data-grist 10.8.1 → 10.9.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 +29 -0
- package/dist/src/data-card/data-card.d.ts +6 -0
- package/dist/src/data-card/data-card.js +12 -3
- package/dist/src/data-card/data-card.js.map +1 -1
- package/dist/src/data-grid/data-grid-body.d.ts +7 -0
- package/dist/src/data-grid/data-grid-body.js +15 -0
- package/dist/src/data-grid/data-grid-body.js.map +1 -1
- package/dist/src/data-grid/data-grid-field.d.ts +21 -0
- package/dist/src/data-grid/data-grid-field.js +311 -4
- package/dist/src/data-grid/data-grid-field.js.map +1 -1
- package/dist/src/data-grid/data-grid-header.js +16 -28
- package/dist/src/data-grid/data-grid-header.js.map +1 -1
- package/dist/src/data-grid/data-grid.d.ts +6 -0
- package/dist/src/data-grid/data-grid.js +9 -18
- package/dist/src/data-grid/data-grid.js.map +1 -1
- package/dist/src/data-grist.d.ts +25 -0
- package/dist/src/data-grist.js +74 -2
- package/dist/src/data-grist.js.map +1 -1
- package/dist/src/data-list/data-list.d.ts +6 -0
- package/dist/src/data-list/data-list.js +12 -3
- package/dist/src/data-list/data-list.js.map +1 -1
- package/dist/src/editors/ox-grist-editor-json5.d.ts +1 -0
- package/dist/src/editors/ox-grist-editor-json5.js +2 -0
- package/dist/src/editors/ox-grist-editor-json5.js.map +1 -1
- package/dist/src/editors/ox-grist-editor.d.ts +14 -0
- package/dist/src/editors/ox-grist-editor.js +36 -0
- package/dist/src/editors/ox-grist-editor.js.map +1 -1
- package/dist/src/editors/registry.d.ts +10 -0
- package/dist/src/editors/registry.js +16 -0
- package/dist/src/editors/registry.js.map +1 -1
- package/dist/test/row-hover-visible.test.js +26 -14
- package/dist/test/row-hover-visible.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
- package/test/row-hover-visible.test.ts +30 -14
- package/translations/en.json +12 -10
- package/translations/ja.json +11 -9
- package/translations/ko.json +12 -10
- package/translations/ms.json +11 -9
- package/translations/zh.json +11 -9
|
@@ -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 /*\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 /*\n * 마우스가 지나는 줄. **고른 줄보다 훨씬 옅다** — 지나는 것은 사실이 아니라 눈이 어디 있는지\n * 알려 주는 것뿐이다.\n *\n * 읽기 전용 표에만 쓴다. 고치는 표는 점선 셀 테두리가 그 일을 하고, 거기서는 이 값을 비운다\n * (data-grid.ts) — 둘이 함께 있으면 시끄럽다.\n *\n * ── 면의 단계에서 가져온다 ───────────────────────────────────────────\n * 줄은 흰 바탕이고 표 바깥은 회색이다. 그 사이에 자리를 잡아야 한다 — 흰 줄과 구별되면서 「줄이\n * 없는 자리」로도 안 읽혀야 한다.\n *\n * 흰 줄 255 255 255\n * surface-container-low 247 248 250 이것 — 줄보다 살짝 눌리고\n * 표 바깥(surface-container) 240 242 244 바깥보다는 밝다\n *\n * 잉크를 얹는 방식으로도 해 봤는데, 겹치지 않을 만큼 진하게 하면(10%) 232 233 234 로 **바깥보다\n * 어두워져** 무겁게 느껴졌다. 옅게 하면(6%) 바깥과 정확히 겹쳤다. [재봤음] 2026-09-02\n *\n * ── 면 단계로는 어두운 모드에서 띠가 사라졌다 ────────────────────────\n * 그때 「면 단계를 쓰면 어두운 모드에서 함께 뒤집힌다」고 적었다. **그게 안 됐다.**\n *\n * 뒤집히려면 앱의 면 사다리가 어두운 모드에서 밝기 순서를 지켜야 하는데, operato-plant 의\n * 어두운 팔레트는 lowest(30 34 40)가 low(26 30 35)보다 **밝다** — 밝은 모드의 순서를 그대로\n * 두었다. 줄은 lowest 를 쓰므로, low 를 얹으면 4단 어두워지는 것이 전부였다.\n *\n * [재봤음] 2026-09-04 · operato-plant 인원 화면(어두운 모드)\n * 줄 rgb(30 34 40) · 띠 rgb(26 30 35) → 대비 1.048 보이지 않는다\n *\n * 그래서 **줄 자신의 색에서 만든다.** 그 줄의 잉크를 5% 섞는다 — 밝은 줄에서는 눌리고 어두운\n * 줄에서는 들린다. 앱의 사다리 순서에 기대지 않으므로 어느 팔레트에서도 같은 방향이다.\n *\n * [재봤음] 5% 로 재 본 대비\n * 밝은 모드 255 → 243 1.11 바깥(240)보다는 여전히 밝다\n * 어두운 모드 30 → 40 1.14\n *\n * 2026-09-02의 판단(6%는 바깥과 겹친다)은 그대로 지킨다. 5%는 그 사이에 선다.\n */\n --grid-record-hover-background-color: color-mix(\n in srgb,\n var(--grid-record-color, #17242c) 5%,\n var(--grid-record-background-color, #ffffff)\n );\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 /*\n * **가로 여백은 줄과 같다.** 6px 이었다 — 쪽 이동 화살표가 위의 열 글자(10px)보다 4px 왼쪽에서\n * 시작해서, 표 아래 한 줄만 왼쪽으로 삐져 나와 보였다. 상자 안에서 왼쪽 끝은 하나여야 한다.\n */\n --grid-footer-padding: 3px 10px;\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 /**\n * 머리가 끝나는 자리까지 본문을 민다. 위에 있을 때는 margin, 스크롤 중일 때는 padding 이다.\n *\n * ── 머리 높이를 그대로 쓰면 안 된다 ─────────────────────────────────────────\n * 머리는 `position: absolute; top: 0` 이라 **host 의 padding 박스 맨 위**에 얹힌다. 즉 위쪽\n * padding 을 덮고 있다. 그런데 본문(`ox-grid`)은 그 padding **뒤에서** 시작한다.\n *\n * 그래서 머리 높이만큼 밀면 그 padding 이 **머리 아래로 나타난다.** 머리의 위쪽 여백은 0 이고\n * 아래쪽은 padding 만큼 넓어져, 머리 안의 내용(필터 칩 같은 것)이 위로 붙어 보인다.\n *\n * 실측(2026-09-03, 결재함 필터 줄): host padding-top 8px · 머리 34px · 밀린 값 34px\n *\n * 머리 151 ~ 185\n * 본문 193 ← 159(padding 뒤) + 34. 머리와 본문 사이에 8px 이 생긴다\n * 칩 위 4px · 아래 12px\n *\n * 덮은 만큼 빼면 머리 위아래가 **머리 자신의 여백**만 남아 저절로 대칭이 된다. 머리가 얼마나\n * 복잡하든, padding 을 얼마로 두든 따라간다 — 여백의 양은 머리가 정하고, 이 함수는 자리만 맞춘다.\n */\n private applyHeadOffset() {\n if (!this.grist || !this.head || this.head.style.display === 'none') {\n return\n }\n\n /* 머리가 덮고 있는 위쪽 padding. 머리의 기준 상자가 host 의 padding 박스이므로 이 값이다. */\n const overlaid = parseFloat(getComputedStyle(this).paddingTop || '0') || 0\n const offset = Math.max(0, this.head.clientHeight - overlaid) + '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 /*\n * **인라인 값이 아니라 실제로 보이는지를 본다.**\n *\n * 전에는 `style.display` 를 읽었다. 아무도 감춘 적이 없으면 그 값은 빈 문자열이고,\n * `'' !== 'none'` 이 참이라 **첫 번째 누름이 감추는 쪽으로** 갔다. 이 단추를 누르는 사람은\n * 「걸러 보고 싶다」는 뜻인데 아무 일도 안 일어난 것처럼 보였다 — 안 보이던 영역을 한 번 더\n * 감춘 것이다.\n */\n const shown = getComputedStyle(this.head).display !== 'none'\n\n this.head.style.display = shown ? '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 i18next from 'i18next'\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 /* 세로 선을 그리는 것이 폭 조절 손잡이다 — 감추면 둘이 함께 사라진다. */\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 /*\n * 마우스가 지나는 줄. **고른 줄보다 훨씬 옅다** — 지나는 것은 사실이 아니라 눈이 어디 있는지\n * 알려 주는 것뿐이다.\n *\n * 읽기 전용 표에만 쓴다. 고치는 표는 점선 셀 테두리가 그 일을 하고, 거기서는 이 값을 비운다\n * (data-grid.ts) — 둘이 함께 있으면 시끄럽다.\n *\n * ── 면의 단계에서 가져온다 ───────────────────────────────────────────\n * 줄은 흰 바탕이고 표 바깥은 회색이다. 그 사이에 자리를 잡아야 한다 — 흰 줄과 구별되면서 「줄이\n * 없는 자리」로도 안 읽혀야 한다.\n *\n * 흰 줄 255 255 255\n * surface-container-low 247 248 250 이것 — 줄보다 살짝 눌리고\n * 표 바깥(surface-container) 240 242 244 바깥보다는 밝다\n *\n * 잉크를 얹는 방식으로도 해 봤는데, 겹치지 않을 만큼 진하게 하면(10%) 232 233 234 로 **바깥보다\n * 어두워져** 무겁게 느껴졌다. 옅게 하면(6%) 바깥과 정확히 겹쳤다. [재봤음] 2026-09-02\n *\n * ── 면 단계로는 어두운 모드에서 띠가 사라졌다 ────────────────────────\n * 그때 「면 단계를 쓰면 어두운 모드에서 함께 뒤집힌다」고 적었다. **그게 안 됐다.**\n *\n * 뒤집히려면 앱의 면 사다리가 어두운 모드에서 밝기 순서를 지켜야 하는데, operato-plant 의\n * 어두운 팔레트는 lowest(30 34 40)가 low(26 30 35)보다 **밝다** — 밝은 모드의 순서를 그대로\n * 두었다. 줄은 lowest 를 쓰므로, low 를 얹으면 4단 어두워지는 것이 전부였다.\n *\n * [재봤음] 2026-09-04 · operato-plant 인원 화면(어두운 모드)\n * 줄 rgb(30 34 40) · 띠 rgb(26 30 35) → 대비 1.048 보이지 않는다\n *\n * 그래서 **줄 자신의 색에서 만든다.** 그 줄의 잉크를 5% 섞는다 — 밝은 줄에서는 눌리고 어두운\n * 줄에서는 들린다. 앱의 사다리 순서에 기대지 않으므로 어느 팔레트에서도 같은 방향이다.\n *\n * [재봤음] 5% 로 재 본 대비\n * 밝은 모드 255 → 243 1.11 바깥(240)보다는 여전히 밝다\n * 어두운 모드 30 → 40 1.14\n *\n * 2026-09-02의 판단(6%는 바깥과 겹친다)은 그대로 지킨다. 5%는 그 사이에 선다.\n */\n --grid-record-hover-background-color: color-mix(\n in srgb,\n var(--grid-record-color, #17242c) 5%,\n var(--grid-record-background-color, #ffffff)\n );\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 /*\n * **가로 여백은 줄과 같다.** 6px 이었다 — 쪽 이동 화살표가 위의 열 글자(10px)보다 4px 왼쪽에서\n * 시작해서, 표 아래 한 줄만 왼쪽으로 삐져 나와 보였다. 상자 안에서 왼쪽 끝은 하나여야 한다.\n */\n --grid-footer-padding: 3px 10px;\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 /**\n * 한 번이라도 조회했는가. 빈 목록에 대한 안내를 낼지 이 값이 정한다.\n *\n * 조회 전에도 records 는 비어 있다. 그러나 그것은 「없다」가 아니라 「아직 모른다」이다.\n * 둘을 같게 두면 확인하지 않은 사실을 화면이 단정하게 된다.\n */\n @state() private _fetched: 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 /**\n * 머리가 끝나는 자리까지 본문을 민다. 위에 있을 때는 margin, 스크롤 중일 때는 padding 이다.\n *\n * ── 머리 높이를 그대로 쓰면 안 된다 ─────────────────────────────────────────\n * 머리는 `position: absolute; top: 0` 이라 **host 의 padding 박스 맨 위**에 얹힌다. 즉 위쪽\n * padding 을 덮고 있다. 그런데 본문(`ox-grid`)은 그 padding **뒤에서** 시작한다.\n *\n * 그래서 머리 높이만큼 밀면 그 padding 이 **머리 아래로 나타난다.** 머리의 위쪽 여백은 0 이고\n * 아래쪽은 padding 만큼 넓어져, 머리 안의 내용(필터 칩 같은 것)이 위로 붙어 보인다.\n *\n * 실측(2026-09-03, 결재함 필터 줄): host padding-top 8px · 머리 34px · 밀린 값 34px\n *\n * 머리 151 ~ 185\n * 본문 193 ← 159(padding 뒤) + 34. 머리와 본문 사이에 8px 이 생긴다\n * 칩 위 4px · 아래 12px\n *\n * 덮은 만큼 빼면 머리 위아래가 **머리 자신의 여백**만 남아 저절로 대칭이 된다. 머리가 얼마나\n * 복잡하든, padding 을 얼마로 두든 따라간다 — 여백의 양은 머리가 정하고, 이 함수는 자리만 맞춘다.\n */\n private applyHeadOffset() {\n if (!this.grist || !this.head || this.head.style.display === 'none') {\n return\n }\n\n /* 머리가 덮고 있는 위쪽 padding. 머리의 기준 상자가 host 의 padding 박스이므로 이 값이다. */\n const overlaid = parseFloat(getComputedStyle(this).paddingTop || '0') || 0\n const offset = Math.max(0, this.head.clientHeight - overlaid) + '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 /*\n * ── 빈 목록에 대한 안내는 조회를 마친 뒤에만 낸다 ──────────────────────\n *\n * 조회 중에는 이미 내지 않는다(_showSpinner). 다만 **첫 조회가 시작되기 전**에도 records 는\n * 비어 있고 스피너는 아직 뜨지 않았다. 그 한 프레임 동안 「아직 아무것도 없습니다」가 스친다.\n * 확인하지 않은 사실을 화면이 단정하는 셈이다.\n *\n * [읽었음] _showSpinner 초기값 false · data-provider 는 조회를 시작할 때 showSpinner()\n *\n * 화면들이 저마다 같은 방어를 두고 있었다(lot-list 의 loaded 검사). 조회 여부는 이 부품이\n * 가진 사실이므로 여기서 판단한다.\n */\n const empty = this._fetched && !this._showSpinner && this._data.records.length == 0\n const emptyNote = empty ? this.noteWhenEmpty() : undefined\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 .emptyNote=${emptyNote}\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 .emptyNote=${emptyNote}\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 .emptyNote=${emptyNote}\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 /* 조회를 마쳤다. 이제 목록이 비었다는 것은 확인된 사실이다. */\n this._fetched = true\n\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 /*\n * **인라인 값이 아니라 실제로 보이는지를 본다.**\n *\n * 전에는 `style.display` 를 읽었다. 아무도 감춘 적이 없으면 그 값은 빈 문자열이고,\n * `'' !== 'none'` 이 참이라 **첫 번째 누름이 감추는 쪽으로** 갔다. 이 단추를 누르는 사람은\n * 「걸러 보고 싶다」는 뜻인데 아무 일도 안 일어난 것처럼 보였다 — 안 보이던 영역을 한 번 더\n * 감춘 것이다.\n */\n const shown = getComputedStyle(this.head).display !== 'none'\n\n this.head.style.display = shown ? '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 /**\n * 목록이 비었을 때 무슨 말을 하나. **판단은 여기서 한 번만** 한다.\n *\n * 모드가 셋이고(GRID · CARD · LIST) 셋 다 자기 자리에 안내를 그린다. 판단까지 각자 하면 세 벌이\n * 되고, 실제로 그랬다 — 셋이 같은 문장을 하드코딩하고 있었다. 여기서 정해 내려보낸다.\n *\n * ── 빈 목록은 두 가지 다른 사실을 말해야 한다 ──────────────────────────────\n *\n * 아직 아무것도 없다 이 표에 만들어진 것이 없다\n * 찾는 것이 없다 찾거나 걸러 본 결과가 없다\n *\n * 합치면 결함이 「고를 게 없다」로 보인다. 질의가 빈 배열을 내는데 화면이 「해당하는 것이\n * 없습니다」라고 말하면 아무도 그것이 결함인 줄 모른다.\n *\n * 조건이 걸렸을 때는 **화면이 준 emptyNote 를 쓰지 않는다.** 그 말은 「아직 없다」를 위해 쓴\n * 것이라 조건이 걸린 자리에서는 거짓이 된다.\n */\n private noteWhenEmpty(): { icon?: string; title: string; description?: string } {\n const conditioned = (this.filters || []).some(({ value }) => {\n if (value === undefined || value === null) return false\n if (typeof value === 'string') return value.length > 0\n if (Array.isArray(value)) return value.length > 0\n return true\n })\n\n if (conditioned) {\n return {\n icon: 'search_off',\n title: i18next.t('text.grid-nothing-found', { defaultValue: 'nothing found' }),\n description: i18next.t('text.grid-clear-search', {\n defaultValue: 'clear the search or filters to see everything'\n })\n }\n }\n\n const given = this.compiledConfig?.emptyNote\n\n return {\n icon: given?.icon,\n title: given?.title ?? i18next.t('text.grid-no-records', { defaultValue: 'nothing to show' }),\n description: given?.description\n }\n }\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"]}
|
|
@@ -5,6 +5,12 @@ import { DataManipulator } from '../data-manipulator.js';
|
|
|
5
5
|
export declare class DataList extends DataManipulator {
|
|
6
6
|
static styles: import("lit").CSSResult[];
|
|
7
7
|
empty?: boolean;
|
|
8
|
+
/** 비었을 때 무슨 말을 하나 — 판단은 data-grist 가 하고 여기서는 그리기만 한다. */
|
|
9
|
+
emptyNote?: {
|
|
10
|
+
icon?: string;
|
|
11
|
+
title: string;
|
|
12
|
+
description?: string;
|
|
13
|
+
};
|
|
8
14
|
private _records;
|
|
9
15
|
private isTop;
|
|
10
16
|
private _total;
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
|
-
import i18next from 'i18next';
|
|
3
2
|
import '@material/web/icon/icon.js';
|
|
4
3
|
import './record-partial.js';
|
|
5
|
-
import { css, html } from 'lit';
|
|
4
|
+
import { css, html, nothing } from 'lit';
|
|
6
5
|
import { customElement, property, state } from 'lit/decorators.js';
|
|
7
6
|
import { DataManipulator } from '../data-manipulator.js';
|
|
8
7
|
let DataList = class DataList extends DataManipulator {
|
|
@@ -44,6 +43,7 @@ let DataList = class DataList extends DataManipulator {
|
|
|
44
43
|
}
|
|
45
44
|
}
|
|
46
45
|
render() {
|
|
46
|
+
var _a, _b, _c, _d, _e, _f;
|
|
47
47
|
var { classifier } = this.config.rows;
|
|
48
48
|
var records = this._records || [];
|
|
49
49
|
if (this.config && this.config.rows.appendable) {
|
|
@@ -64,7 +64,13 @@ let DataList = class DataList extends DataManipulator {
|
|
|
64
64
|
></ox-record-partial>
|
|
65
65
|
`;
|
|
66
66
|
})}
|
|
67
|
-
${this.empty
|
|
67
|
+
${this.empty
|
|
68
|
+
? html `<ox-empty-note
|
|
69
|
+
icon=${(_b = (_a = this.emptyNote) === null || _a === void 0 ? void 0 : _a.icon) !== null && _b !== void 0 ? _b : nothing}
|
|
70
|
+
title=${(_d = (_c = this.emptyNote) === null || _c === void 0 ? void 0 : _c.title) !== null && _d !== void 0 ? _d : ''}
|
|
71
|
+
description=${(_f = (_e = this.emptyNote) === null || _e === void 0 ? void 0 : _e.description) !== null && _f !== void 0 ? _f : nothing}
|
|
72
|
+
></ox-empty-note>`
|
|
73
|
+
: html ``}
|
|
68
74
|
${this.isTop
|
|
69
75
|
? html ``
|
|
70
76
|
: html ` <md-icon id="upward" @click=${(e) => this.gotoTop(e)}>arrow_upward</md-icon> `}
|
|
@@ -127,6 +133,9 @@ DataList.styles = [
|
|
|
127
133
|
__decorate([
|
|
128
134
|
property({ type: Boolean })
|
|
129
135
|
], DataList.prototype, "empty", void 0);
|
|
136
|
+
__decorate([
|
|
137
|
+
property({ type: Object })
|
|
138
|
+
], DataList.prototype, "emptyNote", void 0);
|
|
130
139
|
__decorate([
|
|
131
140
|
state()
|
|
132
141
|
], DataList.prototype, "_records", void 0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-list.js","sourceRoot":"","sources":["../../../src/data-list/data-list.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"data-list.js","sourceRoot":"","sources":["../../../src/data-list/data-list.ts"],"names":[],"mappings":"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","sourcesContent":["import i18next from 'i18next'\nimport '@material/web/icon/icon.js'\nimport './record-partial.js'\n\nimport { css, html, PropertyValues , nothing} from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { DataManipulator } from '../data-manipulator.js'\nimport { GristRecord } from '../types.js'\n\n@customElement('ox-list')\nexport class DataList extends DataManipulator {\n static styles = [\n css`\n :host {\n background-color: var(--data-list-background-color);\n overflow-y: auto;\n }\n\n ox-record-partial:nth-child(even) {\n background-color: var(--grid-record-odd-background-color);\n }\n\n [selected-row] {\n background-color: var(--data-list-selected-background-color);\n }\n\n #upward {\n --md-icon-size: var(--icon-size-large);\n position: absolute;\n top: var(--data-list-fab-position-vertical);\n right: var(--data-list-fab-position-horizontal);\n background-color: rgba(255, 255, 255, 0.7);\n border-radius: var(--md-sys-shape-corner-large);\n color: var(--data-list-fab-color);\n box-shadow: var(--data-list-fab-shadow);\n padding: var(--spacing-small);\n }\n\n slot {\n width: 100%;\n }\n\n ox-empty-note {\n display: block;\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n }\n\n ox-record-partial[emphasized-row],\n ox-record-partial[emphasized-row][focused] {\n background-color: var(--grid-record-emphasized-background-color);\n color: var(--grid-record-emphasized-color);\n }\n `\n ]\n\n @property({ type: Boolean }) empty?: boolean\n\n /** 비었을 때 무슨 말을 하나 — 판단은 data-grist 가 하고 여기서는 그리기만 한다. */\n @property({ type: Object }) emptyNote?: { icon?: string; title: string; description?: string }\n\n @state() private _records: GristRecord[] = []\n @state() private isTop: boolean = false\n\n private _total: number = 0\n private _limit: number = 20\n private _page: number = 1\n\n firstUpdated(changes: PropertyValues<this>) {\n this.isTop = true\n\n /* infinite scrolling */\n this.addEventListener('scroll', e => {\n const totalScrollHeight = this.scrollHeight\n const screenHeight = this.offsetHeight\n const currentScrollTop = this.scrollTop\n\n if (totalScrollHeight <= screenHeight + currentScrollTop + 1) {\n /* 마지막 페이지까지 계속 페이지를 증가시킨다. */\n var lastPage = Math.ceil(this._total / this._limit)\n\n if (this._page < lastPage) {\n this.dispatchEvent(new CustomEvent('attach-page', { bubbles: true, composed: true }))\n }\n }\n\n this.isTop = this.scrollTop == 0\n })\n }\n\n updated(changes: PropertyValues<this>) {\n if (changes.has('config')) {\n this._records = []\n this._page = 1\n }\n\n if (changes.has('data')) {\n this._records = this.data.records\n this._total = this.data.total || 0\n this._limit = this.data.limit || 20\n this._page = this.data.page || 0\n }\n }\n\n render() {\n var { classifier } = this.config.rows\n\n var records = this._records || []\n\n if (this.config && this.config.rows.appendable) {\n records = [...records, { __dirty__: '+' }]\n }\n\n return html`\n ${records.map((record, rowIndex) => {\n var { emphasized } = classifier.call(null, record, rowIndex) || {}\n\n return html`\n <ox-record-partial\n .config=${this.config}\n .data=${this.data}\n .record=${record}\n .rowIndex=${rowIndex}\n .emphasized=${emphasized}\n ?selected-row=${record['__selected__']}\n ?dirty=${record['__dirty__']}\n ></ox-record-partial>\n `\n })}\n ${this.empty\n ? html`<ox-empty-note\n icon=${this.emptyNote?.icon ?? nothing}\n title=${this.emptyNote?.title ?? ''}\n description=${this.emptyNote?.description ?? nothing}\n ></ox-empty-note>`\n : html``}\n ${this.isTop\n ? html``\n : html` <md-icon id=\"upward\" @click=${(e: Event) => this.gotoTop(e)}>arrow_upward</md-icon> `}\n `\n }\n\n gotoTop(e: Event) {\n this.scrollTop = 0\n\n e.stopPropagation()\n }\n\n get pullToRefreshTarget() {\n return this\n }\n}\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import './ox-popup-code-input.js';
|
|
2
2
|
import { OxGristEditor } from './ox-grist-editor.js';
|
|
3
3
|
export declare class OxGristEditorJson5 extends OxGristEditor {
|
|
4
|
+
static opensPopup: boolean;
|
|
4
5
|
get editorTemplate(): import("lit-html").TemplateResult<1>;
|
|
5
6
|
_onclick(e: Event): void;
|
|
6
7
|
_onkeydown(e: KeyboardEvent): void;
|
|
@@ -59,6 +59,8 @@ let OxGristEditorJson5 = class OxGristEditorJson5 extends OxGristEditor {
|
|
|
59
59
|
});
|
|
60
60
|
}
|
|
61
61
|
};
|
|
62
|
+
/* 팝업으로 고친다 — 칸에 표식이 붙는다(OxGristEditor.opensPopup). */
|
|
63
|
+
OxGristEditorJson5.opensPopup = true;
|
|
62
64
|
OxGristEditorJson5 = __decorate([
|
|
63
65
|
customElement('ox-grist-editor-json5')
|
|
64
66
|
], OxGristEditorJson5);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ox-grist-editor-json5.js","sourceRoot":"","sources":["../../../src/editors/ox-grist-editor-json5.ts"],"names":[],"mappings":";AAAA,OAAO,0BAA0B,CAAA;AAEjC,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAGpC,IAAM,kBAAkB,GAAxB,MAAM,kBAAmB,SAAQ,aAAa;
|
|
1
|
+
{"version":3,"file":"ox-grist-editor-json5.js","sourceRoot":"","sources":["../../../src/editors/ox-grist-editor-json5.ts"],"names":[],"mappings":";AAAA,OAAO,0BAA0B,CAAA;AAEjC,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAGpC,IAAM,kBAAkB,GAAxB,MAAM,kBAAmB,SAAQ,aAAa;IAInD,IAAI,cAAc;QAChB,IAAI,MAAM,GAAQ,IAAI,CAAC,KAAK,CAAA;QAE5B,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAClC,CAAC;YAAC,WAAM,CAAC,CAAA,CAAC;QACZ,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;QAE1D,OAAO,IAAI,CAAA,sBAAsB,IAAI,SAAS,CAAA;IAChD,CAAC;IAED,QAAQ,CAAC,CAAQ;QACf,CAAC,CAAC,eAAe,EAAE,CAAA;QACnB,IAAI,CAAC,eAAe,EAAE,CAAA;IACxB,CAAC;IAED,UAAU,CAAC,CAAgB;QACzB,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAA;QACjB,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;YACnB,CAAC,CAAC,eAAe,EAAE,CAAA;YACnB,IAAI,CAAC,eAAe,EAAE,CAAA;QACxB,CAAC;IACH,CAAC;IAED,eAAe;;QACb,IAAI,EAAE,IAAI,EAAE,QAAQ,GAAG,YAAY,EAAE,GAAG,CAAA,MAAA,IAAI,CAAC,MAAM,CAAC,MAAM,0CAAE,OAAO,KAAI,EAAE,CAAA;QAEzE,IAAI,MAAM,GAAG,CAAC,KAAa,EAAE,EAAE;YAC7B,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,cAAc,EAAE;gBAC9B,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE;oBACN,MAAM,EAAE,IAAI,CAAC,KAAK;oBAClB,KAAK,EAAE,KAAK;oBACZ,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,GAAG,EAAE,IAAI,CAAC,GAAG;iBACd;aACF,CAAC,CACH,CAAA;QACH,CAAC,CAAA;QAED,IAAI,KAAK,GAAG,SAAS,CACnB,IAAI,CAAA;;mBAES,IAAI,CAAC,KAAK;iBACZ,IAAI;6BACQ,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;qBACzB,QAAQ;;OAEtB,EACD;YACE,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC;YACnC,IAAI,EAAE,8BAA8B;SACrC,CACF,CAAA;IACH,CAAC;;AAhED,sDAAsD;AAC/C,6BAAU,GAAG,IAAI,AAAP,CAAO;AAFb,kBAAkB;IAD9B,aAAa,CAAC,uBAAuB,CAAC;GAC1B,kBAAkB,CAkE9B","sourcesContent":["import './ox-popup-code-input.js'\n\nimport { html } from 'lit'\nimport { customElement } from 'lit/decorators.js'\nimport JSON5 from 'json5'\n\nimport { OxGristEditor } from './ox-grist-editor.js'\nimport { i18next } from '@operato/i18n'\nimport { openPopup } from '@operato/layout'\n\n@customElement('ox-grist-editor-json5')\nexport class OxGristEditorJson5 extends OxGristEditor {\n /* 팝업으로 고친다 — 칸에 표식이 붙는다(OxGristEditor.opensPopup). */\n static opensPopup = true\n\n get editorTemplate() {\n var parsed: any = this.value\n\n if (typeof this.value === 'string') {\n try {\n parsed = JSON5.parse(this.value)\n } catch {}\n }\n\n const text = parsed == null ? '' : JSON5.stringify(parsed)\n\n return html` <div tabindex=\"0\">${text}</div> `\n }\n\n _onclick(e: Event): void {\n e.stopPropagation()\n this.showEditorPopup()\n }\n\n _onkeydown(e: KeyboardEvent): void {\n const key = e.key\n if (key == 'Enter') {\n e.stopPropagation()\n this.showEditorPopup()\n }\n }\n\n showEditorPopup() {\n var { mode, language = 'javascript' } = this.column.record?.options || {}\n\n var change = (value: string) => {\n this.dispatchEvent(\n new CustomEvent('field-change', {\n bubbles: true,\n composed: true,\n detail: {\n before: this.value,\n after: value,\n column: this.column,\n record: this.record,\n row: this.row\n }\n })\n )\n }\n\n var popup = openPopup(\n html`\n <ox-popup-code-input\n .value=${this.value}\n mode=${mode}\n .confirmCallback=${change.bind(this)}\n language=${language}\n ></ox-popup-code-input>\n `,\n {\n backdrop: true,\n title: i18next.t('title.edit code'),\n help: 'data-grist/grist-editor/code'\n }\n )\n }\n}\n"]}
|
|
@@ -3,6 +3,20 @@ import { DataGridField } from '../data-grid/data-grid-field.js';
|
|
|
3
3
|
import { ColumnConfig, GristRecord } from '../types.js';
|
|
4
4
|
export declare class OxGristEditor extends LitElement {
|
|
5
5
|
static styles: import("lit").CSSResult[];
|
|
6
|
+
/**
|
|
7
|
+
* 이 편집기가 **팝업을 여나.**
|
|
8
|
+
*
|
|
9
|
+
* ── 왜 필요한가 (2026-09-05) ────────────────────────────────────────────
|
|
10
|
+
* 팝업으로 고치는 칸은 글자 칸과 똑같이 생겼다. 열어 보기 전에는 고칠 수 있는지도, 어떻게
|
|
11
|
+
* 고치는지도 모른다. 사용자의 말 그대로 — 「실제 더블클릭을 하기 전에는 모르는 막막함」.
|
|
12
|
+
*
|
|
13
|
+
* 그래서 그런 칸에는 표식을 둔다. 어느 칸이 그런지는 **편집기가 스스로 밝힌다** — 칸이
|
|
14
|
+
* 목록을 들고 판정하면 팝업 편집기가 새로 생길 때마다 그 목록을 고쳐야 하고, 그러면
|
|
15
|
+
* 반드시 빠뜨린다.
|
|
16
|
+
*
|
|
17
|
+
* 팝업을 여는 편집기가 이 값을 참으로 둔다.
|
|
18
|
+
*/
|
|
19
|
+
static opensPopup: boolean;
|
|
6
20
|
value?: any;
|
|
7
21
|
column: ColumnConfig;
|
|
8
22
|
record: GristRecord;
|