@vmscloud/moz-ui-grid-vue 0.2.9 โ 0.2.11
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/dist/compat/MozGridVue.vue.d.ts +2 -0
- package/dist/compat/MozPivotVue.vue.d.ts +2 -0
- package/dist/composables/useGridPreset.d.ts +5 -5
- package/dist/contracts/UserLayoutInstance.d.ts +26 -3
- package/dist/index.cjs +12 -12
- package/dist/index.d.ts +2 -0
- package/dist/index.js +221 -87
- package/dist/style.css +1 -1
- package/docs/manual/reference.md +40 -17
- package/docs/manual/reference_vue.md +10 -3
- package/docs/manual/runtime-contracts.md +154 -0
- package/package.json +3 -3
package/docs/manual/reference.md
CHANGED
|
@@ -6,6 +6,12 @@
|
|
|
6
6
|
|
|
7
7
|
> ๐ **์ฌ์ฉ ์์ ์ฝ๋๋ ๋ณ๋ ํ์ผ**: [examples.md](examples.md) โ Sub-API๋ณ ์ฌ์ฉ, Reactive React ํตํฉ, ์ด๋ฒคํธ, ์ ํ ๋ชจ๋, Excel I/O ๋ฑ ์ฝ 30๊ฐ ์๋๋ฆฌ์ค
|
|
8
8
|
|
|
9
|
+
## ๋ฐํ์ ์ผ๋ฐ ์ต์
|
|
10
|
+
|
|
11
|
+
`await grid.setRuntimeOptions({ timeZone, preventKeyEdit, rowHeightChangeThreshold, migrateConfig })`๋ ์ง์ ํ ํค๋ง ๊ฐฑ์ ํฉ๋๋ค. ๋ช
์์ `undefined`๋ ๊ฐ๊ฐ ์๊ฐ๋ ๋ฏธ์ง์ , `true`, `2`, ์ฝ๋ฐฑ ์์์ผ๋ก ๋๋๋ฆฝ๋๋ค. React/Vue `coreConfig`์์๋ ์ด ํค์ ๋ณ๊ฒฝยท์ ๊ฑฐ๋ ๊ณตํต ์ค์ ํ์์ ๊ฐ์ ์ธ์คํด์ค์ ์ ์ฉํฉ๋๋ค. ์ด๋ฆฐ ํธ์ง์ ๊ธฐ์กด ์ค์ ์ผ๋ก ๋จผ์ ํ์ ํ๋ฉฐ ํ์ ๋ถ๊ฐ ์ ๋ณ๊ฒฝ์ ๊ฑฐ์ ํฉ๋๋ค. ๋์ด ์๊ณ๊ฐ ๋ณ๊ฒฝ์ ์ธก์ ๋ ๋์ด๋ฅผ ์ง์ฐ์ง ์๊ณ ๋ค์ ์ธก์ ๋ถํฐ ์ ์ฉํฉ๋๋ค. `preventKeyEdit`๋ ๊ธฐ์กด ์ต์
์๋ฏธ๋ง ๋ฐ๊พธ๋ฉฐ keyFields identity ์ด์ ์ ์ ๊ณตํ์ง ์์ต๋๋ค.
|
|
12
|
+
|
|
13
|
+
`keyFields`, `enableReferCache`, `engine`, `useWorker`, `workerFactory`, `undoStack` ๋ฑ ์์ฑ/์์ ๊ถ ๊ฒฝ๊ณ์ runtime ์ง์์ ๋ปํ์ง ์์ต๋๋ค. ์ค์ ์ธ์คํด์ค ๊ต์ฒด ์์๋ ์ด๋ํฐ๊ฐ `GridChrome.captureReinitStateAsync()`๋ฅผ ๊ธฐ๋ค๋ฆฐ ๋ค ์ด์ ์ธ์คํด์ค๋ฅผ ํ๊ธฐํฉ๋๋ค. ๋๊ธฐ `captureReinitState()`๋ ๊ธฐ์กด ์ง์ ํธ์ถ์์ฉ์ผ๋ก ๋จ์ต๋๋ค.
|
|
14
|
+
|
|
9
15
|
## ๋ ์ง ์๊ฐ๋ ๊ณ์ฝ (`timeZone`)
|
|
10
16
|
|
|
11
17
|
```ts
|
|
@@ -21,7 +27,7 @@ await grid.io.fromExcel(legacyFile, { timeZone: 'UTC' });
|
|
|
21
27
|
- ๋ ์ง๋ง ํ์ํ๋ mask๋ **์๊ฐ ๊ฐ์ ์๋ฅด์ง ์์ต๋๋ค**. XLSX ์์๋ถ์ ์ยท๋ถยท์ดยท๋ฐ๋ฆฌ์ด๊ฐ ์ ์ง๋ฉ๋๋ค. ์์์ ๋ ์ง ๋ฌธ์์ด์ ํธ์คํธ ์์กด ํ์ฑ์ ํ์ง ์๊ณ ์๋ฌธ์ผ๋ก ๋จ๊น๋๋ค.
|
|
22
28
|
- DST ํด์์ Temporal `compatible`: ์ค๋ณต ์๊ฐ์ **๋ ์ด๋ฅธ instant**, ์กด์ฌํ์ง ์๋ ์๊ฐ์ **gap ๊ธธ์ด๋งํผ ์์ผ๋ก** ์ด๋ํฉ๋๋ค. ๋ฐ๋ผ์ DST ์ค๋ณต ์๊ฐ์ ๋ instant๋ฅผ Excel serial๋ง์ผ๋ก ๊ตฌ๋ถํ ์ ์์ต๋๋ค. ํ์ํ๋ฉด UTC IO override๋ฅผ ์ฌ์ฉํ์ธ์.
|
|
23
29
|
- ์๋ชป๋ zone(๋น ๋ฌธ์์ด ํฌํจ)์ `RangeError`์
๋๋ค. UTC๋ ๋ธ๋ผ์ฐ์ zone์ผ๋ก ์กฐ์ฉํ ํด๋ฐฑํ์ง ์์ต๋๋ค.
|
|
24
|
-
-
|
|
30
|
+
- ์ฝ์ด์ `await grid.setRuntimeOptions({ timeZone })` ๋ฐ React/Vue provider/`coreConfig.timeZone` ๋ณ๊ฒฝ์ ๊ฐ์ ์ธ์คํด์ค์ ๋ฐ์๋ฉ๋๋ค. ๋ฐ์ดํฐ ์๋ณธยทdirtyยทundo ์์ ๊ถ์ ๊ต์ฒดํ์ง ์์ต๋๋ค. ๋ช
์์ `undefined`๋ ๊ธฐ์กด ์๊ฐ๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋๋๋ฆฝ๋๋ค.
|
|
25
31
|
|
|
26
32
|
## ๋ชฉ์ฐจ
|
|
27
33
|
|
|
@@ -202,6 +208,7 @@ grid.on('row:click', ({ rowIndex }) => {
|
|
|
202
208
|
| **์์ง** | | | |
|
|
203
209
|
| `engine` | `'native'` | `'native'` | ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์์ง. **`'aq'`(Arquero)๋ ์ ๊ฑฐ๋จ** โ ๋จ์ผ ์์ง(native)๋ง ๋จ์์ต๋๋ค(ITSM-2026-002190) |
|
|
204
210
|
| `useWorker` | `boolean` | `false` | Web Worker ์ฌ์ฉ ์ฌ๋ถ |
|
|
211
|
+
| `workerFactory` | `() => Worker` | โ | `useWorker: true`์์ ์ฑ์ด ๋น๋ํ ์ ๋ขฐ Worker entry ์์ฑ. `@vmscloud/moz-ui-grid-core/worker`์ `registerWorkerFunctions`์ `installProcessorWorker`๋ก ํจ์ยทloader๋ฅผ ์ ์ ์ผ๋ก ๋ฑ๋กํ๋ค. |
|
|
205
212
|
| **์ ์ฅ๋ณธ ํธํ** | | | |
|
|
206
213
|
| `migrateConfig` | `GridConfigMigrator` | โ | `applyConfig()` ๊ฐ ์ ๋ฒ์ ์ ์ฅ๋ณธ์ ๋ฐ์์ ๋ ํธ์ถํ ๋ณํ๊ธฐ. core ๋ **ํธ์ถ ์์ ยท์์๋ง** ์ฑ
์์ง๊ณ ๋ณํ ๋ด์ฉ์ ์๋น์ฒ(wrapper)๊ฐ ์์ (โ [์ ์ฅ ์คํค๋ง ๋ฒ์ ](#์ ์ฅ-์คํค๋ง-๋ฒ์ --gridconfigmigrator)) |
|
|
207
214
|
| **UI** | | | |
|
|
@@ -215,8 +222,8 @@ grid.on('row:click', ({ rowIndex }) => {
|
|
|
215
222
|
| `showStatusBar` | `boolean` | `true` | ์ํ ๋ฐ ํ์ |
|
|
216
223
|
| `summaryRow` | `'none' \| 'pinnedTop' \| 'pinnedBottom'` | `'none'` | ์ง๊ณ(์ดํฉ๊ณ) ํ ํ์ ์์น. `FieldDef.aggregate` ๊ฐ ์ง์ ๋ ์ปฌ๋ผ์ ๋ชจ์ core ๊ฐ ํ์ ์ง์ ์์ ํ๋ฉฐ, `getConfig()` ์ ์ค๋ ค ๋ ์ด์์ ํ๋ฆฌ์
์ผ๋ก ์ ์ฅยท๋ณต์๋๋ค |
|
|
217
224
|
| `alternatingRows` | `boolean` | `false` | ์ค๋ฌด๋ฌ ํ ์คํ์ผ |
|
|
218
|
-
| `rowStyle` | `string` | โ | ํ CSS
|
|
219
|
-
| `headerStyle` | `string` | โ | ํค๋ CSS
|
|
225
|
+
| `rowStyle` | `string` | โ | ํ ๋์ด alias: `height:Npx`๋ง ์ถ์ถ (์ผ๋ฐ CSS ์ ์ฉ ์๋). truthy `rowHeight`๊ฐ ์ฐ์ |
|
|
226
|
+
| `headerStyle` | `string` | โ | ํค๋ ๋์ด alias: `height:Npx`๋ง ์ถ์ถ (์ผ๋ฐ CSS ์ ์ฉ ์๋). truthy `headerHeight`๊ฐ ์ฐ์ |
|
|
220
227
|
| **์ปฌ๋ผ ๋์** | | | |
|
|
221
228
|
| `resizableColumns` | `boolean` | `true` | ์ปฌ๋ผ ๋ฆฌ์ฌ์ด์ฆ ํ์ฉ |
|
|
222
229
|
| `reorderableColumns` | `boolean` | `true` | ์ปฌ๋ผ ์ฌ์ ๋ ฌ ํ์ฉ |
|
|
@@ -251,6 +258,10 @@ grid.on('row:click', ({ rowIndex }) => {
|
|
|
251
258
|
|
|
252
259
|
#### ํ identity: ์
๋ฌด ํค์ ์๋ ID
|
|
253
260
|
|
|
261
|
+
- ๋ช
์ํ `keyFields`๋ ๋น์ด ์์ง ์์ ๋ฌธ์์ด ๋ฐฐ์ด์ด์ด์ผ ํฉ๋๋ค. `null`, ๋ฐฐ์ด ์๋ ๊ฐ, ๋น ๋ฌธ์์ด ์์, ๋น๋ฌธ์์ด ์์, sparse hole์ ์ด๊ธฐํ ์ค๋ฅ์
๋๋ค. ๋ฌธ์์ด์ trimํ์ง ์์ผ๋ฉฐ ๊ณต๋ฐฑ๋ ์ค์ ์๋ณธ ํ๋๋ช
์
๋๋ค. ํ๋ฉด `fields`์ ์๋ source-only ํค๋ ํ์ฉํฉ๋๋ค.
|
|
262
|
+
- ์๋ ID ์ ์ฒด ๊ต์ฒด ์ฑ๊ณต ์ ํยท์
ยท๊ทธ๋ฃน ์ ํ๊ณผ active/focus๋ฅผ ๋น์ฐ๋ฉฐ core `data:loaded` ๊ด์ฐฐ์๋ ์ด๊ธฐํ๋ ์ํ๋ฅผ ๋ด
๋๋ค. ์คํจํ๊ฑฐ๋ stale์ธ load ์๋ฃ๋ก ํ์ฌ ์ ํ์ ์ฌ์ด๊ธฐํํ์ง ์์ต๋๋ค. ๊ฐ์ ์ธ์
์ ์ ๋ ฌยทํํฐ์๋ ๋ค๋ฅธ ๊ฒฝ๊ณ์
๋๋ค.
|
|
263
|
+
- `captureDataSession()` / `restoreDataSession(token)`์ ์ผ๋ฐ loadData์ ๋ค๋ฅธ ์ธ์
์ด์ API์
๋๋ค. [์ง์ ๋ฒ์์ ์คํจ ์กฐ๊ฑด](runtime-contracts.md)์ ์ฐธ์กฐํ์ธ์.
|
|
264
|
+
|
|
254
265
|
- **์
๋ฌด ํค ๋ชจ๋**: `keyFields: ['id']`์ฒ๋ผ ๋น์ด ์์ง ์์ ๋ฐฐ์ด์ ๋ช
์ํฉ๋๋ค. `enableReferCache` ๊ธฐ๋ณธ๊ฐ์ `false`์ด๋ฉฐ, ์๋ ID ๋ชจ๋๊ฐ ๋๋ฝ๋ ์
๋ฌด ํค ๊ฐ์ ๋์ ์ฑ์์ฃผ์ง๋ ์์ต๋๋ค.
|
|
255
266
|
- **์๋ ID ๋ชจ๋**: `keyFields`๋ฅผ **์๋ต**ํ๊ณ `enableReferCache: true`๋ฅผ ์ง์ ํฉ๋๋ค. `keyFields: []`๋ ์บ์ ์ค์ ๊ณผ ๊ด๊ณ์์ด ์ด๊ธฐํ ์ค๋ฅ์ด๋ฉฐ, ํค ์๋ต + ์บ์ ๋ฏธ์ง์ /`false`๋ ๋น ๋ฐ์ดํฐ๋ถํฐ ์ด๊ธฐํ ์ค๋ฅ์
๋๋ค. ์์ฑ ํ `await grid.waitForReady()`๋ก ์ด๊ธฐํ ์ฑ๊ณต/์คํจ๋ฅผ ํ์ธํ์ธ์.
|
|
256
267
|
- ID๋ ๊ฐ์ด๋ ์๋ณธ ๊ฐ์ฒด๊ฐ ์๋๋ผ **ํ occurrence(๋ฐฐ์ด์ ๋ฑ์ฅํ ๊ฐ๊ฐ์ ํ)** ์ ์ํฉ๋๋ค. ๊ฐ์ด ๊ฐ๊ฑฐ๋ ๋์ผ ๊ฐ์ฒด๋ฅผ ๋ ๋ฒ ๋ฃ์ด๋ ์๋ก ๋ค๋ฅธ ID๊ฐ ๋ฐ๊ธ๋ฉ๋๋ค. frozen ์๋ณธ ๊ฐ์ฒด์๋ ID ํ๋๋ฅผ ์ฃผ์
ํ์ง ์์ต๋๋ค.
|
|
@@ -737,7 +748,7 @@ interface GridConfigExport {
|
|
|
737
748
|
|
|
738
749
|
`getConfig()` ๋ ์๋ ์ต์
์ **ํ์ฌ ๊ฐ**์ ์ฃ๊ณ `applyConfig()` ๋ ๋ฐํ์์ ์ค์ ๋ก ๋๋๋ฆฝ๋๋ค: `theme`, `rowHeight`(๊ฐ์ ์คํฌ๋กคยท๋์ ๋์ด ์บ์ยทMulti-Rowยท๊ณ ์ ํยท๋ณํฉ float ์ฌ๊ณ์ฐ), `headerHeight`, `rowSelection`/`cellSelection`/`cellSelectionImpliesRows`(๋ฐ๋ ๋๋ง ์ฌ์ค์ โ ํ์ฌ ์ ํ์ ๋น์), `rowHeader`(ํ ํค๋ ์ปฌ๋ผ ์ถ๊ฐ/์ ๊ฑฐ, ์ ํ ํธ๋ฆฌ๊ฑฐ๊ฐ ์๊ตฌํ๋ฉด ์๋ ํ์ฑ), `editable`(ํธ์ง๊ธฐยท๋ถ์ฌ๋ฃ๊ธฐยทDelete ๋จ์ถํค), `tooltipMode`, `alternatingRows`, `showHeader`, `resizableColumns`/`reorderableColumns`(ํค๋ ์ฌ๋น๋), `autoFitColumns`, `showStatusBar`, `summaryRow`, `locale`, `translations`.
|
|
739
750
|
|
|
740
|
-
|
|
751
|
+
`rowTemplate`์ `setRowTemplate(template | null)` ๋๋ `applyConfig`๋ก flat ๋ ์ด์์๋ง ๊ต์ฒดํ๊ณ ๋ฐ์ดํฐยท์๋ณธยท๋ณ๊ฒฝ ๊ธฐ๋กยทundo๋ฅผ ์ ์งํ๋ค. `reorderableRows`/`showDragHandleColumn`์ `dragDrop.setConfig` ๋๋ `applyConfig`๋ก ํ์ฌ ์ธ์คํด์ค์ ๋ฐ์ํ๋ค. ํ์ฌ ๊ฐ๋ง ๋ด๋ณด๋ด๊ณ ์ ์ฉํ์ง ์๋ ํค(๊ฐ์ด ๋ค๋ฅด๋ฉด ๊ฒฝ๊ณ `PS905`)๋ `keyFields`์ด๋ฉฐ, ํ ์๋ณ์ ๋ณ๊ฒฝ ์ ์ฑ
์ ๋ณ๋ ๊ฒํ ๋์์ด๋ค.
|
|
741
752
|
|
|
742
753
|
**ํผ๋ฒ ์๋ณต** (F01) โ flat โ pivot ์ง์
์ง์ ์ flat ๋ฐํ์ ์ํ(์ปฌ๋ผ ๋๋นยท๊ณ ์ ยท์จ๊นยท์์, ์ ๋ ฌ/ํํฐ, ํ ๊ทธ๋ฃน)๋ฅผ ์ ์ฅํด ๋์๋ค๊ฐ flat ๋ณต๊ท(`pivot.setMode('flat')`, pivotโflat `applyConfig`) ์ ๊ทธ๋๋ก ๋์ด๋ฆฌ๊ณ ์ปฌ๋ผ ๊ทธ๋ฃน ํค๋๋ ์ฌ๋น๋ํฉ๋๋ค. flat ์ ์ฅ๋ณธ์ ํจ๊ป ์ ์ฉํ๋ฉด ์ ์ฅ๋ณธ ๊ฐ์ด ์ด๊น๋๋ค.
|
|
743
754
|
|
|
@@ -961,6 +972,7 @@ PureSheet ์ธ์คํด์ค๋ ๊ธฐ๋ฅ๋ณ Sub-API ๋ค์์คํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋
|
|
|
961
972
|
| `getSelectedCellIds()` | `{rowId, columnId}[]` | ์ ํ๋ ์
๋ชฉ๋ก (์
API ์๋ `selected()` ๊ฐ ์๋ค โ ํ API `grid.rows.selected()` ์ ๋ค๋ฆ) |
|
|
962
973
|
| `getSelectedCells()` | `SelectedCell[]` | ์ ํ๋ ์
์์ธ (ํ ํธ๋คยท๊ฐ ํฌํจ) |
|
|
963
974
|
| `getActiveCell()` | `SelectedCell \| null` | ํ์ฌ ํ์ฑ ์
โ `selection.getActiveCell()`๊ณผ ๊ฐ์(ํ๋ฉด ์๋ฆฌ ๊ธฐ์ค, ์๋ ํ ์ฐธ๊ณ ) |
|
|
975
|
+
| `getFocusCell()` | `SelectedCell \| null` | ๋
ผ๋ฆฌ์ ์ ํ ๋์ โ `selection.getFocusCell()`๊ณผ ๊ฐ์. [๋์ ยท๋ฐ์ดํฐ ์ธ์
์์ธ](runtime-contracts.md) |
|
|
964
976
|
| `getSelectedCellRowIds()` | `string[]` | ์ ํ๋ ์
์ด ๊ฑธ์น ํ rowId ๋ชฉ๋ก(์ค๋ณต ์ ๊ฑฐ) |
|
|
965
977
|
| `getSelectedCellColumnIds()` | `string[]` | ์ ํ๋ ์
์ด ๊ฑธ์น ์ปฌ๋ผ columnId ๋ชฉ๋ก(์ค๋ณต ์ ๊ฑฐ) |
|
|
966
978
|
| `getSelectedCellIndices()` | `number[]` | ์ ํ๋ ์
์ด ๊ฑธ์น ํ sourceIndex ๋ชฉ๋ก(์ค๋ณต ์ ๊ฑฐ) |
|
|
@@ -977,6 +989,7 @@ rowSelection(์ ํ๋ ํ๋ค)ยทcellSelection(์ ํ๋ ์
range)์ ์๋ก ๋ค
|
|
|
977
989
|
| `selection.getActiveRow()` | `RowHandle \| null` | ๋ง์ง๋ง ์ํธ์์ฉ(ํ/์
ํด๋ฆญ) ํ. ์ต์ปค ์์ผ๋ฉด ์ ํ ํ ๋ง์ง๋ง ํด๋ฐฑ. traversal ์ต์ปค. **ํด๋ฆญํ ํ(rowId)์ ๊ณ์ ๊ฐ๋ฆฌํจ๋ค** โ ์ ๋ ฌยทํํฐยท์ ๊ธฐ ๋ค์๋ ๊ฐ์ ํ(`getActiveCell`๊ณผ ๋ค๋ฅผ ์ ์์) |
|
|
978
990
|
| `selection.getSelectedCells()` | `{ row: RowHandle; columnId }[]` | ํ์ฌ ์ ํ๋ ์
๋ค |
|
|
979
991
|
| `selection.getActiveCell()` | `{ row: RowHandle; columnId } \| null` | ๋ง์ง๋ง ์ํธ์์ฉ ์
. traversal ์ปฌ๋ผ ์ ์ง์ฉ. ํ์ **ํ๋ฉด ์๋ฆฌ ๊ธฐ์ค** โ ์
์ ํ(`getSelectedCellIds`)ยทํ๋ฉด ๊ฐ์กฐยทํค๋ณด๋ ์ด๋๊ณผ ๊ฐ์ ํ์ด๋ค. ์ ๋ ฌยทํํฐยท๊ทธ๋ฃน/ํธ๋ฆฌ ์ ๊ธฐยท๋ํ
์ผ ํผ์นจยท๋๋๊ทธ ์ฌ์ ๋ ฌ๋ก ๊ทธ ์๋ฆฌ์ ๋ค๋ฅธ ํ์ด ์ค๋ฉด ๊ทธ ํ, ์๋ฆฌ๊ฐ ๊ทธ๋ฃน ๋ฐฐ๋ยท๋ํ
์ผ ํ์ด๊ฑฐ๋ ์ฌ๋ผ์ง๋ฉด `null`. ํ ์ ํ ๋ชจ๋(์
์ ํ ์์)์ ์ต์ปค์ ๊ณ ์ (pinned) ํ์ ํด๋ฆญํ ํ ๊ทธ๋๋ก |
|
|
992
|
+
| `selection.getFocusCell()` | `SelectedCell \| null` | ํ์ฌ ์ ํจํ ๋
ผ๋ฆฌ์ ์ ํ ๋์ `{ row: RowHandle, columnId }`. traversal ์ต์ปค์ธ `getActiveCell()`๊ณผ ๋ณ๊ฐ. ์ ์ฒด ์ ํ ์ด๊ฑฐยท๋น๋๊ธฐ fetch ์์ด ์กฐํํ๋ฉฐ ํ์ธ ๋ถ๊ฐ๋ฅํ identity๋ null. [์์ธ ๊ณ์ฝ](runtime-contracts.md) |
|
|
980
993
|
| `selection.getSelectedGroups()` | `{ groupId: string; rowIds: RowId[] }[]` | ์ ํ๋ ๊ทธ๋ฃน (`rowGroupConfig.selectable` โ [๊ทธ๋ฃน ๋ฐฐ๋ ์ ํ](#๊ทธ๋ฃน-๋ฐฐ๋-์ ํ-selectable)). `rowIds`๋ ๋ฆฌํ ๋ฉค๋ฒ ์ ์ฒด(์ ํ ๋ฌด๊ด, ์ค์ฒฉ์ด๋ฉด ํ์ ๋ฆฌํ ์ ๋ถ). ์ต์
์ด ๊บผ์ ธ ์์ผ๋ฉด `[]`. ํ ์ ํ ๊ฒฐ๊ณผ์ ๋ณ๊ฐ |
|
|
981
994
|
| `selection.selectGroupsByIds(groupIds, { addToExisting? })` | `string[]` | ๊ทธ๋ฃน์ ์ฝ๋๋ก ์ ํ โ ๋ฐฐ๋ ๋ณธ๋ฌธ ํด๋ฆญ๊ณผ ๊ฐ์ ์๋ฏธ([๊ทธ๋ฃน ๋ฐฐ๋ ์ ํ](#๊ทธ๋ฃน-๋ฐฐ๋-์ ํ-selectable)). ์ ์ฉ๋ groupId(์
๋ ฅ ์์, ์ค๋ณต ์ ๊ฑฐ)๋ฅผ ๋ฐํ. ํ๋ฉด์ ์๋ ๊ทธ๋ฃนยท์ต์
๊บผ์ง์ ๋ฌด์ |
|
|
982
995
|
| `selection.selectGroupsByViewIndices(viewIndices, { addToExisting? })` | `string[]` | viewIndex๋ก ๊ทธ๋ฃน ์ ํ. ๊ทธ๋ฃนํ์ด ์๋ ์์น๋ ๋ฌด์. ๋๋จธ์ง๋ `selectGroupsByIds`์ ๊ฐ์ |
|
|
@@ -1173,7 +1186,7 @@ grid.columns.update('amount', { header: 'ํ๋งค๊ธ์ก' }, { updateSnapshot: true
|
|
|
1173
1186
|
|
|
1174
1187
|
| ๋ฉ์๋ | ๋ฐํ | ์ค๋ช
|
|
|
1175
1188
|
|--------|------|------|
|
|
1176
|
-
| `addRow(row, idx?)` | `Promise<string \| number>` | ํ ์ถ๊ฐ (dirty) |
|
|
1189
|
+
| `addRow(row, idx?)` | `Promise<string \| number>` | ํ ์ถ๊ฐ (dirty). idx๋ ๊ธฐ์กด dirty ์ถ๊ฐ/์ญ์ ๋ฅผ ๋ฐ์ํ ๋ฐ์ดํฐ ์์น์ด๋ฉฐ ์ ๋ ฌยท๊ทธ๋ฃนยท๊ณ ์ ยท๋ํ
์ผ์ ํฌํจํ ํ๋ฉด ๋ฒํธ๊ฐ ์๋๋๋ค. ์๋ต ์ ๋์ ์ถ๊ฐํฉ๋๋ค. |
|
|
1177
1190
|
| `updateCell(row, field, value)` | `Promise<void>` | ํ ๊ฐ์ฒด๋ก ์
์์ (`enableReferCache` ํ์) |
|
|
1178
1191
|
| `updateCellById(id, field, value, sourceIndex?)` | `Promise<void>` | ID๋ก ์
์์ . ํธ์ถ์๊ฐ sourceIndex๋ฅผ ์๊ณ ์์ผ๋ฉด 4๋ฒ์งธ ์ธ์๋ก ์ ๋ฌํ์ฌ idMap fallback์ ํํผํ ์ ์์ |
|
|
1179
1192
|
| `updateCellByIndex(idx, field, value)` | `Promise<void>` | sourceIndex๋ก ์
์์ O(1) |
|
|
@@ -1402,7 +1415,7 @@ interface AggregateContext {
|
|
|
1402
1415
|
- `ctx.sum('x')` ๋ฑ์ ์์ง์ด ๊ณ์ฐํ ๊ฐ์ ์ฝ์ผ๋ฏ๋ก **๊ทธ ์กฐํฉ์ด ์ ์ธ๋ผ ์์ด์ผ** ํฉ๋๋ค โ ์ปฌ๋ผ ์ ์ `aggregate: 'sum'`(์จ๊น ์ปฌ๋ผ ๊ฐ๋ฅ) ๋๋ `rowGroupConfig.aggregates`์ `{ column: 'x', func: 'sum' }`. ์ ์ธ๋์ง ์์ ์กฐํฉ์ ์ฝ์ผ๋ฉด `PS312` ์ค๋ฅ์
๋๋ค(๊ทธ๋ฃนํ: `refresh()`๊ฐ ๊ฑฐ์ , ๊ณ ์ ํฉ๊ณ ํ: `console.error` ํ ๋น ๊ฐ). ๊ณ ์ ํฉ๊ณ ํ์ ์ปฌ๋ผ ์ ์ `aggregate`๋ง ์ ์ธ์ผ๋ก ๋ด
๋๋ค.
|
|
1403
1416
|
- ๋ค๋จ ๊ทธ๋ฃน์ ๋จ๊ณ๋ง๋ค ๊ทธ ๋จ๊ณ ์ง๊ณ๋ก ๋ค์ ๊ณ์ฐํ๊ณ , ํํฐยทํธ์งยทํ ์ถ๊ฐ ํ์๋ ๋ค์ ๊ณ์ฐํฉ๋๋ค.
|
|
1404
1417
|
- ๊ฒฐ๊ณผ๊ฐ `null`/`undefined`/`NaN`์ด๋ฉด ๊ทธ๋ฃนํ ์นธ์ ๋น ์นธ(๊ณ ์ ํฉ๊ณ ํ์ ๊ธฐ์กด null ํ๊ธฐ `-`). 0 ๋๋๊ธฐ๋ ํจ์์์ ์ฒ๋ฆฌํฉ๋๋ค.
|
|
1405
|
-
-
|
|
1418
|
+
- ์ผ๋ฐ Main ๋ชจ๋๋ ๊ธฐ์กด inline ํจ์๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํฉ๋๋ค. Worker ๋ชจ๋๋ `{ workerFunction: 'app:aggregate', params: ... }` ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋ฉฐ, ์ฑ Worker entry์ ์ ์ ์ผ๋ก ๋ฑ๋ก๋ ํจ์๊ฐ ์ค์ ๋ฉค๋ฒ `values`์ `ctx`๋ฅผ Worker ์์์ ๋ฐ์ต๋๋ค. ๋ฉ์ธ ๊ณ์ฐ ์๋ณตยทfallback์ ์๊ณ inline ํจ์ยท๋ฏธ๋ฑ๋ก ID๋ ์ค๋ฅ์
๋๋ค. ํจ์์ ๋ง์ง๋ง ์ธ์๋ descriptor์ `params`์
๋๋ค.
|
|
1406
1419
|
- ํจ์ํ ์ปฌ๋ผ aggregate๊ฐ ํ๋๋ผ๋ ์์ผ๋ฉด ์ ์ธ๋ ๋ฌธ์์ด ์ปฌ๋ผ aggregate๋ฅผ ๋ชจ๋(์จ๊นยท๋ฐฐ๋ ์๋ ์ปฌ๋ผ ํฌํจ) ๊ณ์ฐ๋ง ํฉ๋๋ค. ์ด ๊ฐ๋ค์ ๋ฐฐ๋ ๊ธ์์ ๋์ค์ง ์์ต๋๋ค.
|
|
1407
1420
|
- ํจ์ํ aggregate๋ ํ๋ฆฌ์
(JSON)์ ์ ์ฅ๋์ง ์๊ณ ์ฝ๋๊ฐ ์์ ํฉ๋๋ค โ `applyConfig`๊ฐ ์ง์ฐ๊ฑฐ๋ ๋ฌธ์์ด๋ก ๋ฐ๊พธ์ง ์์ผ๋ฉฐ, wrapper ์ง๊ณ ํญ์ "์ฌ์ฉ์ ํจ์"๋ก ํ์ํ๊ณ ๋ณ๊ฒฝ์ ๋ง์ต๋๋ค.
|
|
1408
1421
|
- **์ ํ ์์ญ ์ง๊ณ**(`rows.selectionAggregates()`ยท`selection:changed`์ `aggregates`ยท์ปจํ
์คํธ ๋ฉ๋ด): ํจ์ํ ์ปฌ๋ผ์ ๊ทธ ์ปฌ๋ผ ์
์ด ์ ํ๋ ํ๋ค์ **ํ๋์ ๊ทธ๋ฃน์ฒ๋ผ** ๋ณด๊ณ ํจ์๋ฅผ ์ ์ฉํฉ๋๋ค. `columns[]` ํญ๋ชฉ์ `aggregate: 'custom'`, `value` = ํจ์ ๊ฐ(`formattedValue`๋ ๊ทธ ์ปฌ๋ผ mask ์ ์ฉ), `count` = ์ซ์ ์
์(๊ธฐ์กด ์๋ฏธ)์
๋๋ค. `ctx.sum('x')` ๋ฑ์ ์ ํ ๋ฒ์์ `x` ์
์ด ์์ด๋(์จ๊น ์ปฌ๋ผ ํฌํจ) ์ ํ๋ **ํ** ๊ธฐ์ค์ด๊ณ `ctx.group`์ ์์ต๋๋ค. ์ฝ์ ์ ์๋ ์กฐํฉ์ ๊ณ ์ ํฉ๊ณ ํ๊ณผ ๊ฐ์ด ์ปฌ๋ผ ์ ์์ ๋ฌธ์์ด `aggregate`์ด๋ฉฐ, ๋ฏธ์ ์ธ ์กฐํฉ์ `console.error`(PS312) ํ ๋น ๊ฐ์
๋๋ค. ํ๋ฉด ๋ฐ ์ ํ ํยท๊ทธ๋ฃน/ํธ๋ฆฌ ๋ชจ๋(๋ฐ์ดํฐ ํ๋ง)ยทWorker ๋ชจ๋ ๋ชจ๋ ๊ฐ์ ๊ฐ์ด๊ณ , ์ปฌ๋ผ ์ ์ฒด ์ ํ(Ctrl+Space/Ctrl+A)์ ํ์ ์ค์ธ ์ ์ฒด ๋ฐ์ดํฐ ํ์ผ๋ก ๊ณ์ฐํฉ๋๋ค(์ด๋๋ง ํ์ ํ ๋ฒ ๋ฐ์ ์ต๋๋ค). `total`(ํฉ๊ณยทํ๊ท ยท๊ฐ์ยท์ต์ยท์ต๋)์ ๊ธฐ์กด๋๋ก **์ ํ ์
๊ฐ** ๊ธฐ์ค์
๋๋ค. wrapper ์ปจํ
์คํธ ๋ฉ๋ด๋ `custom`์ ํจ์ ๋ผ๋ฒจ ์์ด `ํค๋ ๊ฐ`๋ง ํ์ํฉ๋๋ค.
|
|
@@ -2425,7 +2438,7 @@ const unsub = row.subscribe(() => {
|
|
|
2425
2438
|
| `visible` | `boolean` | ๊ฐ์์ฑ ์ฌ๋ถ |
|
|
2426
2439
|
| `pinned` | `'top' \| 'bottom' \| null` | ๊ณ ์ ์ํ |
|
|
2427
2440
|
| `cssClass` | `string \| null` | CSS ํด๋์ค |
|
|
2428
|
-
| `height` | `number \| null` |
|
|
2441
|
+
| `height` | `number \| null` | ํ๋ณ ๋์ด(px). ๋ณธ๋ฌธยท๋ฐ์ดํฐ ๊ณ ์ ํ ๋ฐ ๊ฐ์ ์คํฌ๋กค ์ขํ์ ์ ์ฉ. `null`์ ๊ธฐ๋ณธ/์๋ ์ธก์ ๋์ด๋ก ๋ณต์ |
|
|
2429
2442
|
| `changedFields` | `string[] \| null` | ๋ณ๊ฒฝ๋ ํ๋ ๋ชฉ๋ก |
|
|
2430
2443
|
|
|
2431
2444
|
#### ์ฐ๊ธฐ ๋ฉ์๋
|
|
@@ -2487,6 +2500,7 @@ grid.off('cell:click', handler);
|
|
|
2487
2500
|
|
|
2488
2501
|
| ์ด๋ฒคํธ | ํ์ด๋ก๋ | ์ค๋ช
|
|
|
2489
2502
|
|--------|---------|------|
|
|
2503
|
+
| `tree:stateChanged` | `{ collapsedNodes: string[], source: 'user' \| 'api' }` | ๋ค์ดํฐ๋ธ ํธ๋ฆฌ ์ ๊ธฐยทํผ์น๊ธฐ ์๋ฃ ํ ์ต์ข
์ ํ ์ํ. ๋จ์ผ/์ ์ฒด/๊น์ด/๊ฒฝ๋ก ๋ฐ setState ๋ณต์์ ํฌํจํ๋ฉฐ ๊ฐ์ ์ํ๋ ํต์งํ์ง ์์. ์ฌ์ฉ์ ํด๋ฆญยทํค๋ณด๋๋ user, ๊ณต๊ฐ API๋ api. ๊ตฌ๋
๋ฐํ ํจ์๋ก ํด์ . |
|
|
2490
2504
|
| `row:click` | `{ row, rowId, viewIndex, sourceIndex, rowIndex, event }` | ํ ํด๋ฆญ. ์ขํ๋ ์๋ **์
ยทํ ์ด๋ฒคํธ ์ขํ** ์ฐธ์กฐ (`rowIndex`๋ ํ์ํธํ ๊ฐ โ ์๋ณธ ์์น ์๋) |
|
|
2491
2505
|
| `row:dblclick` | `{ row, rowIndex, event }` | (์์ฝ) ํ์ฌ ์ฝ๋ ๊ฒฝ๋ก์์๋ ๋ฐํ๋์ง ์์ โ `cell:dblclick`์ ์ฌ์ฉํ์ธ์ |
|
|
2492
2506
|
| `row:pinned` | `{ row, position }` | ํ ๊ณ ์ |
|
|
@@ -2867,7 +2881,7 @@ interface MasterDetailConfig {
|
|
|
2867
2881
|
|
|
2868
2882
|
- ์ ์งํ ๋๋ ๋ํ
์ผ ๋ด์ฉ์ `renderer`๋ก **๋ค์ ๊ทธ๋ฆฝ๋๋ค**(์ด์ cleanup ์คํ ํ ํธ์ถ) โ ๋ฐ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ํ๊ธฐ ์ํด์์
๋๋ค. ๋ํ
์ผ ์์ ์
๋ ฅ๊ฐยท์คํฌ๋กค ๊ฐ์ DOM ์ํ๋ ๋จ์ง ์์ต๋๋ค.
|
|
2869
2883
|
- `keyFields` ์์ด ์๋ ํ ID(`enableReferCache: true`)๋ฅผ ์ฐ๋ฉด `loadData`๋ง๋ค ID๊ฐ ์๋ก ๋ถ์ผ๋ฏ๋ก ์ฌ์กฐํ ๋ค์๋ ์ ํ๋๋ค. ์ฌ์กฐํ ํ์๋ ํผ์นจ์ ์ ์งํ๋ ค๋ฉด `keyFields`๋ฅผ ์ง์ ํ์ธ์.
|
|
2870
|
-
-
|
|
2884
|
+
- `visible:false`ยทCtrl+Hยท๋ฐ์ดํฐ ํ ๊ณ ์ ยท๊ทธ๋ฃน/ํธ๋ฆฌ ์ ํ์ผ๋ก ์ ๋ณด์ด๋ ๋์ ๋ํ
์ผ์ ํ์ํ์ง ์์ต๋๋ค. ๊ธฐ๋ณธ(`true`)์ ํ ํค์ ํผ์นจ ์ํ๋ฅผ ๊ธฐ์ตํ์ฌ ๋ค์ ๋ณด์ผ ๋ ๋ณต์ํ๊ณ , `false`๋ ๊ธฐ์กด์ฒ๋ผ ์ ์ต๋๋ค.
|
|
2871
2885
|
- `singleExpand: true`์ ํจ๊ป ์ฐ๋ฉด ๋ง์ง๋ง์ผ๋ก ํผ์น ํ ํ๋ง ์ ์ง๋ฉ๋๋ค.
|
|
2872
2886
|
|
|
2873
2887
|
### GroupConfig
|
|
@@ -3700,11 +3714,13 @@ interface PerformanceTiming {
|
|
|
3700
3714
|
|
|
3701
3715
|
### ๋ฐ์ดํฐ ๋ก๋ โ LoaderConfig
|
|
3702
3716
|
|
|
3717
|
+
> ํ์ฌ Worker๋ ๋ฐํ์ ์์ URL import๊ฐ ์๋๋ผ **์ฑ Worker entry์ ์ ์ loader map**์ ์ฌ์ฉํฉ๋๋ค. `module`์ map์ ์ ํํ ํค์
๋๋ค. [Worker ๋ฑ๋กยท๋ฐ์ดํฐ ์ธ์
๊ณ์ฝ](runtime-contracts.md)์ ๋จผ์ ํ์ธํ์ธ์.
|
|
3718
|
+
|
|
3703
3719
|
Web Worker์์ ์ง์ ๋ฐ์ดํฐ๋ฅผ ํ์นญํ๋ ๋ชจ๋์ ์ง์ ํฉ๋๋ค. ๋ฉ์ธ์ค๋ ๋ ๋น๊ฒฝ์ ๋ก UI ๋ธ๋กํน ์์.
|
|
3704
3720
|
|
|
3705
3721
|
```typescript
|
|
3706
3722
|
interface LoaderConfig {
|
|
3707
|
-
/**
|
|
3723
|
+
/** ์ฑ Worker entry์ loaders map์ ๋ฑ๋กํ ํค (URL์ด๋ฉด ๋ฌธ์์ด ํํ๊ณผ ์ผ์นํด์ผ ํจ) */
|
|
3708
3724
|
module: URL | string;
|
|
3709
3725
|
/** ์ด๊ธฐ ํ๋ผ๋ฏธํฐ (์ง๋ ฌํ ๊ฐ๋ฅํ plain object). ๋ฐํ์์ grid.updateLoaderParams()๋ก ๊ฐฑ์ */
|
|
3710
3726
|
params?: Record<string, unknown>;
|
|
@@ -3724,8 +3740,10 @@ export default class MyLoader extends DataLoader {
|
|
|
3724
3740
|
// ๊ทธ๋ฆฌ๋ ์์ฑ
|
|
3725
3741
|
new PureSheet(container, {
|
|
3726
3742
|
enableReferCache: true,
|
|
3743
|
+
useWorker: true,
|
|
3744
|
+
workerFactory: () => new Worker(new URL('./app-grid.worker.ts', import.meta.url), { type: 'module' }),
|
|
3727
3745
|
loader: {
|
|
3728
|
-
module:
|
|
3746
|
+
module: 'app:data', // worker entry: installProcessorWorker({ loaders: { 'app:data': MyLoader } })
|
|
3729
3747
|
params: { authToken: 'abc' },
|
|
3730
3748
|
},
|
|
3731
3749
|
fields: [...],
|
|
@@ -3906,7 +3924,7 @@ interface MergeRangeResult {
|
|
|
3906
3924
|
> });
|
|
3907
3925
|
> ```
|
|
3908
3926
|
|
|
3909
|
-
> **Worker
|
|
3927
|
+
> **Worker custom ๋ณํฉ**: `getMergedRange` / `getMergedRanges`์ ์ฑ Worker entry์ ๋ฑ๋กํ `WorkerFunctionRef`๋ฅผ ์ ๋ฌํ๋ฉด Worker ๋ด๋ถ์์ ์คํํฉ๋๋ค. inline ํจ์ ๋ณธ๋ฌธ์ Worker๋ก ์ ๋ฌํ ์ ์์ต๋๋ค(Main inline ์ฝ๋ฐฑ์ ์ ์ง). ๋ฑ๋ก ๋ฐฉ๋ฒ๊ณผ pinned merge์ ๋น๋๊ธฐ ๊ฒฝ๊ณ๋ [Worker ์คํ ๊ณ์ฝ](runtime-contracts.md)์ ์ฐธ์กฐํ์ธ์.
|
|
3910
3928
|
|
|
3911
3929
|
---
|
|
3912
3930
|
|
|
@@ -4214,10 +4232,11 @@ type LifecycleCellRenderer = (
|
|
|
4214
4232
|
|
|
4215
4233
|
interface CellRendererInstance {
|
|
4216
4234
|
/**
|
|
4217
|
-
* ์
์ด ์ฌ์ฌ์ฉ๋๋ฉฐ ๋ฐ์ดํฐ๊ฐ
|
|
4235
|
+
* ์
์ด ์ฌ์ฌ์ฉ๋๋ฉฐ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋๊ฑฐ๋, ์ฑ๊ณตํ ๋ช
์ `loadData` ํ ๋ค์ ํ์๋ ๋ ํธ์ถ.
|
|
4236
|
+
* ๋์ผ ํ ๊ฐ์ฒด/ID/๊ฐ/renderer ์ฐธ์กฐ์ฌ๋ ๋ช
์ reload๋ custom renderer ํ์ ์บ์๋ฅผ ๋ฌดํจํํ๋ค.
|
|
4218
4237
|
* - ๋ฐํ `false`: instance๊ฐ ์ฒ๋ฆฌ ๋ชปํจ โ ๊ทธ๋ฆฌ๋๊ฐ destroy ํ re-mount
|
|
4219
4238
|
* - ๋ฐํ `void`/`true`: instance๊ฐ ์์ฒด ๊ฐฑ์ ํจ
|
|
4220
|
-
* ๋ฏธ์ ์ ์:
|
|
4239
|
+
* ๋ฏธ์ ์ ์: ๊ฐ/ํ ๋ณ๊ฒฝ ๋๋ ๋ช
์ reload์ด๋ฉด destroy ํ re-mount. ๊ทธ ์ธ์๋ ์ ์ง.
|
|
4221
4240
|
*/
|
|
4222
4241
|
update?: (params: CellRendererParams) => boolean | void;
|
|
4223
4242
|
/** ์
์ด ์ฌ๋ผ์ง ๋ ํธ์ถ โ pool release / ์ปฌ๋ผ ์ ๊ฑฐ / grid destroy ์ */
|
|
@@ -4225,6 +4244,8 @@ interface CellRendererInstance {
|
|
|
4225
4244
|
}
|
|
4226
4245
|
```
|
|
4227
4246
|
|
|
4247
|
+
๋ช
์ `loadData`์ ์ต์ ์์ฒญ์ด ๋ฐ์ดํฐ๋ฅผ ์ ์ ์ค์นํ๋ฉด, ํ์๋๋ custom renderer๋ ๊ฐ์ ํ ๊ฐ์ฒด/ID/๊ฐ์ด์ด๋ ๋ค์ ํ๊ฐ๋ฉ๋๋ค. ์ ์ง๋ lifecycle ์ธ์คํด์ค๋ `update`๋ฅผ ๋ฐ๊ณ , update๊ฐ ์๊ฑฐ๋ false์ด๋ฉด destroy ํ ์ฌ๋ง์ดํธ๋ฉ๋๋ค. ๋ณด์ด์ง ์๋ ์
์ ์ฆ์ mountํ์ง๋ ์์ผ๋ฉฐ ๋ค์ ํ์ ์ ์ต์ reload ์ํ๋ก ๊ทธ๋ฆฝ๋๋ค. ์ธ๋ถ closure ์์ฒด์ ์๋ ์ถ์ ์ ์ ๊ณตํ์ง ์์ต๋๋ค. ์ผ๋ฐ `refresh()`/์คํฌ๋กค์ ๊ธฐ์กด dirty-check ์ ์ฑ
์ ์ด ๊ณ์ฝ์ผ๋ก ํ๋ํ์ง ์์ต๋๋ค. ์ค์น ์ ์คํจํ๊ฑฐ๋ ๋ค๋ฆ๊ฒ ์๋ฃ๋ ์ค๋๋ load๋ ์ renderer invalidation ๊ฒฝ๊ณ๋ฅผ ๋ง๋ค์ง ์์ต๋๋ค.
|
|
4248
|
+
|
|
4228
4249
|
```typescript
|
|
4229
4250
|
// Simple ํํ โ ๋งค ๋ ๋๋ง๋ค ์ ์์ ๋ฐํ
|
|
4230
4251
|
{ id: 'status', cellRenderer: ({ value }) => `<span class="badge-${value}">${value}</span>` }
|
|
@@ -4347,7 +4368,7 @@ interface GridConfigSnapshot {
|
|
|
4347
4368
|
**ํ์ฌ ์ง๋ ฌํ ์ ๋๋ ์ต์
(ํฅํ ์ถ๊ฐ ์ฌ์ง)**:
|
|
4348
4369
|
- `engine`, `useWorker`, `dynamicRowHeights`, `rowHeightChangeThreshold`
|
|
4349
4370
|
- `enableReferCache`, `preventKeyEdit`
|
|
4350
|
-
- `rowStyle`, `headerStyle` (
|
|
4371
|
+
- `rowStyle`, `headerStyle` (`height:Npx` ์ถ์ถ alias โ ์ผ๋ฐ CSS ์ ์ฉ ์๋)
|
|
4351
4372
|
- `PivotConfig.sorts` / `PivotConfig.filters` (ํผ๋ฒ ์ ์ฉ โ `GridConfigSnapshot.sorts/filters` ์ ๋ณ๊ฐ)
|
|
4352
4373
|
|
|
4353
4374
|
---
|
|
@@ -5006,7 +5027,7 @@ interface CellAttributeParams {
|
|
|
5006
5027
|
|
|
5007
5028
|
### DataLoader ํด๋์ค โ ์์ปค ๊ธฐ๋ฐ ์ปค์คํ
๋ฐ์ดํฐ ๋ก๋ฉ
|
|
5008
5029
|
|
|
5009
|
-
`
|
|
5030
|
+
์ฑ Worker entry์ `installProcessorWorker({ loaders })` map์ ๋ฑ๋กํ๋ ํด๋์ค์ ๋ฒ ์ด์ค. ์์ปค ์์์ ์คํ๋๋ฏ๋ก DOM/localStorage ์ ๊ทผ์ ๋ถ๊ฐํ๊ณ , `fetch`/`WebSocket`/`XMLHttpRequest` ๋ฑ ๋คํธ์ํฌ API๋ ์ฌ์ฉ ๊ฐ๋ฅ.
|
|
5010
5031
|
|
|
5011
5032
|
```typescript
|
|
5012
5033
|
abstract class DataLoader {
|
|
@@ -5046,8 +5067,10 @@ export default class MyLoader extends DataLoader {
|
|
|
5046
5067
|
// ๊ทธ๋ฆฌ๋ ์์ฑ
|
|
5047
5068
|
new PureSheet(container, {
|
|
5048
5069
|
enableReferCache: true,
|
|
5070
|
+
useWorker: true,
|
|
5071
|
+
workerFactory: () => new Worker(new URL('./app-grid.worker.ts', import.meta.url), { type: 'module' }),
|
|
5049
5072
|
loader: {
|
|
5050
|
-
module:
|
|
5073
|
+
module: 'app:data', // worker entry: installProcessorWorker({ loaders: { 'app:data': MyLoader } })
|
|
5051
5074
|
params: { authToken: getToken() },
|
|
5052
5075
|
},
|
|
5053
5076
|
fields: [...],
|
|
@@ -5058,7 +5081,7 @@ await grid.updateLoaderParams({ authToken: newToken });
|
|
|
5058
5081
|
await grid.refreshLoaderData();
|
|
5059
5082
|
```
|
|
5060
5083
|
|
|
5061
|
-
>
|
|
5084
|
+
> **Worker loader ๊ฒฝ๊ณ**: `LoaderConfig.module`์ ํด๋์ค๋ ์์ URL์ ์ ๋ฌํด ๋์ ์คํ์ํค๋ ๋ฐฉ์์ ์ง์ํ์ง ์์ต๋๋ค. ์ฑ์์ loader ํด๋์ค๋ฅผ ์ ์ ์ผ๋ก importํ๊ณ ๋ฑ๋กํ์ธ์. `InlineDataLoader`๋ผ๋ export์ ์กด์ฌ๊ฐ ๋ฐํ์ ํด๋์ค ์ ๋ฌ ์ง์์ ๋ปํ์ง ์์ต๋๋ค.
|
|
5062
5085
|
|
|
5063
5086
|
---
|
|
5064
5087
|
|
|
@@ -251,6 +251,9 @@ type MozGridCoreProps =
|
|
|
251
251
|
|
|
252
252
|
### ์ด๊ธฐํยทํธ์งยทXLSX ์ค์ ์ ๋ฌ
|
|
253
253
|
|
|
254
|
+
- `sourceRevision?: unknown`์ wrapper prop์
๋๋ค. ์ธ๋ถ ๋ฐ์ดํฐ์
๊ต์ฒด ๋๋ง ๋ฐ๊พธ๋ฉฐ `coreConfig` ์์ ๋ฃ์ง ์์ต๋๋ค. `ready`์ ๋ ๋ฒ์งธ ์ธ์ `chrome.getReadyContext()`์์ `{ reason, dataRestored, sourceRevision }`๋ฅผ ํ์ธํ์ธ์. [์ธ์
๋ณด์กดยทWorkerยท๋์ API ์์ธ](runtime-contracts.md).
|
|
255
|
+
- ์ผ๋ฐ ๋ฐํ์ ์ค์ ์ ๊ณตํต coordinator๊ฐ ์ถ์ ๋ ์์
์ข
๋ฃ๋ฅผ ๊ธฐ๋ค๋ ค ๋์ผ ์ธ์คํด์ค์ ์ ์ฉํ๋ฉฐ `ready`๋ฅผ ๋ค์ ๋ฐ์์ํค์ง ์์ต๋๋ค. ์ค์ ๊ฐ์ ์์ค ์ธ์คํด์ค ๊ต์ฒด์์๋ ๋น๋๊ธฐ capture/restore๋ก baselineยทdirtyยท์ง์ undo/redo๋ฅผ ์ด์ ํ๋ฉฐ Worker ์ธ์
๊ณผ pivot ์ํ๋ ํฌํจํฉ๋๋ค. ๋ฏธ์ง์ custom history๋ ํธํ๋์ง ์๋ keyFields ๋ณ๊ฒฝ์ ๊ฑฐ๋ถํฉ๋๋ค. capture ์คํจ ์ ๊ธฐ์กด ์ธ์คํด์ค๋ฅผ ์ ์งํ๊ณ ์ค๋ฅ๋ฅผ ๋ณด๊ณ ํ๋ฉฐ, ์ค์ load/validation ์คํจ๋ฅผ ๋ฌดํ ์ฌ์๋ํ์ง ์์ต๋๋ค. ์ธ๋ถ ๊ฒฝ๊ณ๋ [์คํ ๊ณ์ฝ](runtime-contracts.md)์ ๋ฐ๋ฆ
๋๋ค.
|
|
256
|
+
|
|
254
257
|
- **ํ ์๋ณ ์ค์ ์ ํ์**์
๋๋ค. ์
๋ฌด ํค๊ฐ ์์ผ๋ฉด `coreConfig.keyFields`๋ฅผ ๋ช
์ํ๊ณ , ํค ์์ด ์์ํ๋ ค๋ฉด `coreConfig.enableReferCache: true`๋ฅผ ์ค์ ํ์ธ์(๊ธฐ๋ณธ `false`). ๋ ์ค์ ๋ชจ๋ ์๋ตํ๊ฑฐ๋ `keyFields: []`๋ฅผ ์ ๋ฌํ๋ฉด ์ด๊ธฐํํ ์ ์์ต๋๋ค. ์๋ณธ `id` ํ๋๋ฅผ ์๋์ผ๋ก ํค๋ก ์ ํํ์ง ์์ต๋๋ค. ์๋ ID ์๋ช
๊ณผ ํ ๊ฐ์ฒด ์ฐธ์กฐ ๊ณ์ฝ์ [์ฝ์ด Config](reference.md#config-์ค์ )๋ฅผ ์ฐธ์กฐํ์ธ์.
|
|
255
258
|
- ๋ด์ฅ ์ซ์/๋ ์ง์๊ฐ ํธ์ง๊ธฐ๋ ๋ณ๋ ๋ํผ prop์ด ์๋๋ผ `coreConfig.fields[].editor`๋ก ์ ๋ฌํฉ๋๋ค. ์๋ ์ค์ ์ ๊ธฐ์กด `coreConfig`์ ๋ณํฉํ์ธ์.
|
|
256
259
|
|
|
@@ -606,6 +609,9 @@ const xAxisLabelFormatter = (label: string) => (label.startsWith('#') ? label.sl
|
|
|
606
609
|
|
|
607
610
|
### ์ค๋น ์๋ฃยท์ฌ์์ฑยท์์ ์ฝ๋ฐฑ
|
|
608
611
|
|
|
612
|
+
- ๋์ด alias `rowStyle`/`headerStyle` ๋ณ๊ฒฝ๋ ๋์ผ ์ธ์คํด์ค์ ์ ์ฉํฉ๋๋ค. ์ผ๋ฐ CSS๊ฐ ์๋๋ผ ๊ธฐ์กด `height:Npx` ์ถ์ถ๋ง ์ง์ํฉ๋๋ค. wrapper์ ์ซ์ ๋์ด ๊ธฐ๋ณธ๊ฐ์ 32์ด๋ฏ๋ก ์๋ต/undefined์์๋ alias๊ฐ ๊ฐ๋ ค์ง๋๋ค. ๋ช
์์ ์ซ์ 0์ ๊ธฐ์กด PS007 ๊ฒฝ๊ณ ํ ์ ํจํ alias๋ฅผ ์ฌ์ฉํ์ง๋ง, 0์ ๋จ๊ธฐ๊ณ alias๋ง ์ ๊ฑฐํด ์ ํจ ๋์ด๊ฐ 0์ด๋ฉด ๊ธฐ์กด applyConfig ๊ฒ์ฆ(PS903)์ผ๋ก ๊ฑฐ์ ํฉ๋๋ค. ์ซ์ ๋์ด์ alias๋ฅผ ํจ๊ป ์๋ต/undefined๋ก ๋๋๋ฆฌ๋ฉด 32๋ก ๋ณต์ํฉ๋๋ค. ๊ฐ๋ ค์ง alias๋ง ๋ณ๊ฒฝํ๋ฉด imperative ๋์ด๋ฅผ ๋ฎ์ง ์์ต๋๋ค.
|
|
613
|
+
- ์ผ๋ฐ ๋ฐํ์ ์ค์ (`rowHeight`, `headerHeight`, `editable`, `rowTemplate`, ํ drag ๋ฑ)์ ๊ณตํต coordinator๊ฐ ์งํ ์์
์ข
๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์ต์ ์์ฒญ์ผ๋ก ๋ณํฉํด ๋์ผ ์ธ์คํด์ค์ ์ ์ฉํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ์๋ณธยทdirtyยทundo๋ฅผ ์ ์งํ๊ณ `ready`๋ฅผ ๋ค์ ๋ฐ์์ํค์ง ์์ต๋๋ค. ์ค์ ์ธ์คํด์ค ๊ต์ฒด์ capture/restore ๊ฒฝ๋ก๋ ๋ณ๊ฐ์
๋๋ค. `reconcileCoreConfig` ๊ฒฐ๊ณผ์ ์ ํ์ `completion: Promise<void>`๋ ์ค์ ์ ์ฉ ์๋ฃ/์คํจ๋ฅผ ๋ํ๋ด๋ฉฐ ์ด๋ํฐ๊ฐ ์ด๋ฅผ ๊ธฐ๋ค๋ฆฝ๋๋ค.
|
|
614
|
+
|
|
609
615
|
- `@ready(grid, chrome)`๋ ํ์ฌ ์ธ์คํด์ค์ ์ฝ์ด ์ด๊ธฐํ์ reinit ์ํ ๋ณต์ ๋ค์ ๋ฐ์ํฉ๋๋ค. unmount๋ ๋ค์ reinit์ผ๋ก ํ๊ธฐ๋ ์ธ์คํด์ค์ ๋๊ธฐ ์์
์ ๋ณต์ยทemit์ ์ด์ด์ ์คํํ์ง ์์ต๋๋ค. ํ์ฌ ์ธ์คํด์ค์ ์ด๊ธฐํ ์คํจ๋ ์ฝ์ ์ค๋ฅ๋ก ๋ณด๊ณ ํ๊ณ `ready`๋ฅผ ๋ฐ์์ํค์ง ์์ต๋๋ค.
|
|
610
616
|
- ์ค์ watch๋ mount ํ
์์์ **๋๊ธฐ ๋ฑ๋ก**๋ฉ๋๋ค. ์ฒซ `ready`๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋์์ prop ๋ณ๊ฒฝ๋ ๋ฐ์ํ๋ฉฐ, unmount ์ Vue์ ์ปดํฌ๋ํธ scope์ ํจ๊ป ํด์ ๋ฉ๋๋ค.
|
|
611
617
|
- `ready()`๋ `waitForReady()`์ ์ด๊ธฐํ ์๋ฃ๋ฅผ ๋ปํ๋ฉฐ `coreConfig.data`๋ก ์์๋ ๋ชจ๋ ๋น๋๊ธฐ ๋ฐ์ดํฐ ๋ก๋ฉ ์๋ฃ๋ฅผ ๋ณด์ฅํ์ง ์์ต๋๋ค. ๋ฐ์ดํฐ ์๋ฃ๋ `@data:loaded` ๋๋ ์ง์ ํธ์ถํ `await grid.loadData(rows)`๋ก ํ์ธํ์ธ์.
|
|
@@ -785,9 +791,10 @@ g.chrome // ์์ GridChrome | null (legacy ํธํ)
|
|
|
785
791
|
|--------|----------|------|
|
|
786
792
|
| `ready` | `async ready(): Promise<void>` | ์ฝ์ด `waitForReady` ๋๊ธฐ โ `isDataLoaded=true` โ ์นด์ดํธ/ํธํฐ/๋น ์ํ ๊ฐฑ์ . ์์ฑ ํ 1ํ ํธ์ถ |
|
|
787
793
|
| `on` | `on(event, handler): Unsubscribe` | ์ฝ์ด ์ด๋ฒคํธ ๊ตฌ๋
+ chrome ๊ตฌ๋
๋ชฉ๋ก์ ์ถ์ (destroy ์ ์๋ ์ ๋ฆฌ). `Unsubscribe` ๋ฐํ |
|
|
788
|
-
| `reconcileCoreConfig` | `reconcileCoreConfig(next: PureSheetConfig): { reinitRequired: boolean }` | ๋ณ๊ฒฝ๋ ์ฝ์ด ์ค์ ํค๋ง ํ๊ฒ setter๋ก ์ ์ฉ. ๋ฐํ์ setter ์๋ ํค(rowHeight/headerHeight/keyFields/selection/editable/mode/locale/...) ๋ณ๊ฒฝ ์ `{ reinitRequired: true }` ๋ฐํ โ ์ด๋ํฐ๊ฐ ์ํ ๋ณด์กด reinit. disposed ์ early-return |
|
|
789
|
-
| `
|
|
790
|
-
| `
|
|
794
|
+
| `reconcileCoreConfig` | `reconcileCoreConfig(next: PureSheetConfig, sourceRevision?: unknown): { reinitRequired: boolean }` | ๋ณ๊ฒฝ๋ ์ฝ์ด ์ค์ ํค๋ง ํ๊ฒ setter๋ก ์ ์ฉ. ๋ฐํ์ setter ์๋ ํค(rowHeight/headerHeight/keyFields/selection/editable/mode/locale/...) ๋ณ๊ฒฝ ์ `{ reinitRequired: true }` ๋ฐํ โ ์ด๋ํฐ๊ฐ ์ํ ๋ณด์กด reinit. disposed ์ early-return |
|
|
795
|
+
| `getReadyContext` | `getReadyContext(): Readonly<GridChromeReadyContext>` | `{ reason: 'initial' \| 'configuration' \| 'source-replacement', dataRestored: boolean, sourceRevision?: unknown }`. ๋ณต์ ์ฑ๊ณต ์ฌ๋ถ์ ๋ฐ์ดํฐ ๊ต์ฒด ๊ฒฝ๊ณ ํ์ธ |
|
|
796
|
+
| `captureReinitState` | `captureReinitState(next?: PureSheetConfig, sourceRevision?: unknown): GridChromeReinitState` | destroy ์ ์ core/layoutยทdataSessionยทwrapper ์ํ ์บก์ฒ. ๊ฐ์ ์์ค capture ์คํจ๋ throwํ์ฌ ๊ธฐ์กด ์ธ์คํด์ค๋ฅผ ๋ณด์กด. ์์ค ๊ต์ฒด๋ ์ด์ ์ธ์
capture ์๋ต |
|
|
797
|
+
| `restoreReinitState` | `async restoreReinitState(state): Promise<void>` | ์ ์ธ์คํด์ค์์ `applyConfig(core)` ํ `columnFormat`(base) โ `customCell`(override) ์ฌ์ ์ฉ. ์คํจ๋ rejectํ๋ฉฐ ์ฑ๊ณต ready๋ฅผ ๋ด๋ณด๋ด์ง ์์. dataSession์ ํฌํจํ GridChromeReinitState๋ฅผ ์ GridChrome ์์ฑ์์ ๋ค ๋ฒ์งธ ์ธ์๋ก๋ ์ ๋ฌ |
|
|
791
798
|
| `getCoreConfig` | `getCoreConfig(base?: PureSheetConfig): PureSheetConfig` | INPUT ํํ์ ํ์ฌ ์ฝ์ด ์ค์ ๋น๋(`update:coreConfig` ์ญ๋ฅ์ฉ). ๋ผ์ด๋ธ mode/group/pivot ํค๋ง ์ค๋ฒ๋ ์ด, `fields`/`data` ์ฐธ์กฐ ๋ณด์กด, sorts/filters ๋ทฐ ์ํ ๋ฏธํฌํจ |
|
|
792
799
|
| `onConfigChange` | `onConfigChange(cb: () => void): Unsubscribe` | ๋ด๋ถ ์ฝ์ด ๋ณ๊ฒฝ(pivotConfig + groupConfig.columns) ๊ตฌ๋
โ `update:coreConfig` ์ญ๋ฅ. UI ์ต์
/์ฐจํธ/์ปค์คํ
์
์ ๋ฏธํฌํจ. ๋ฐํ unsub๋ destroy ์ถ์ |
|
|
793
800
|
| `syncAppliedConfig` | `syncAppliedConfig(next: PureSheetConfig): void` | reconcile ๊ธฐ์ค์ (`appliedConfig`) ๊ฐ์ ๋๊ธฐํ โ ์งํ prop-back reconcile์ no-op์ผ๋ก(์ค๋ณต ํผ๋ฒ ์ฌ๊ณ์ฐ ํํผ) |
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
# ์ ํ ๋์ ยทWorker ํจ์ยท๋ฐ์ดํฐ ์ธ์
์คํ ๊ณ์ฝ
|
|
2
|
+
|
|
3
|
+
์ด ๋ฌธ์๋ ํ์ฌ ๊ณต๊ธ์ ์์ค์ ๊ตฌํ๋ ๊ณ์ฝ์
๋๋ค. npm ๋ฐฐํฌ ์๋ฃ๋ฅผ ์๋ฏธํ์ง ์์ต๋๋ค. ๊ธฐ๋ณธ API๋ [Core](reference.md), [Vue](reference_vue.md), [React](reference_react.md)๋ฅผ ์ฐธ์กฐํ์ธ์.
|
|
4
|
+
|
|
5
|
+
## ๋
ผ๋ฆฌ์ ์ ํ ๋์
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
const focus = grid.selection.getFocusCell(); // SelectedCell | null
|
|
9
|
+
const sameFocus = grid.cells.getFocusCell(); // ๋์ผํ ์กฐํ
|
|
10
|
+
if (focus) console.log(focus.columnId, focus.row.id);
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
- ๋ฐํ์ `{ row: RowHandle, columnId: string }`์
๋๋ค. ์ ๊ทํํ ๋ฒ์์ ์ฐํ๋จ์ด ์๋๋ผ ๋
ผ๋ฆฌ์ ์ ํ target์
๋๋ค. ์ญ๋ฐฉํฅ ๋๋๊ทธ์์๋ ๋์ ์ ๊ตฌ๋ถํฉ๋๋ค.
|
|
14
|
+
- `getActiveCell()`์ traversal ์ต์ปค ๊ณ์ฝ์ ๋ฐ๊พธ์ง ์์ต๋๋ค. ํ๋ก๊ทธ๋จ ๋ฒ์ ์ ํ์ ๋์ ๊ณผ ๋ค์ Shift ํ์ ๊ธฐ์ค๋ ๋ณ๊ฐ์
๋๋ค.
|
|
15
|
+
- ๋ง์ฐ์ค release๊ฐ ์ ํจํ ๋ฐ์ดํฐ ์
์ด๋ฉด ๋ง์ง๋ง mousemove๊ฐ ์์ด๋ ๋ฐ์ํฉ๋๋ค. viewport ๋ฐยทํค๋ยท๋น ๊ณต๊ฐยท๊ทธ๋ฃน ๋ฐฐ๋ยทdetail ๋ฑ ๋น๋ฐ์ดํฐ ์์ญ release์์๋ ๋ง์ง๋ง์ผ๋ก ์์ฉํ ๋ฐ์ดํฐ target์ ์ ์งํฉ๋๋ค.
|
|
16
|
+
- ์ ํ ํด์ , ๋์ ์ด ๋ ์ด์ ์ ํ๋ฒ์์ ์ํ์ง ์๋ ๊ฒฝ์ฐ, ์ ๊ฑฐ๋๊ฑฐ๋ ๋ค๋ฅธ ์์ญ์ผ๋ก ์ด๋ํ pinned ํ, ๋๊ธฐ์ ์ผ๋ก identity๋ฅผ ํ์ธํ ์ ์๋ lazy slot์ `null`์
๋๋ค. sparse ์ขํ ์ ํ ์์ฒด๋ฅผ ์ทจ์ํ๋ ๊ฒ์ ์๋๋๋ค.
|
|
17
|
+
- getter๋ ์ ์ฒด ์ ํ์ ์ด๊ฑฐํ๊ฑฐ๋ ๋น๋๊ธฐ fetchํ์ง ์์ต๋๋ค. `row.viewIndex`๋ ํ๋ฉด ์์น, `row.sourceIndex`๋ ํด์ ๊ฐ๋ฅํ ์๋ณธ ์์น์
๋๋ค. pinned์ ๋ด๋ถ ์์ ์ขํ๋ฅผ ์๋น์ฒ ์ขํ๋ก ๋ง๋ค์ด ๋ฐํํ์ง ์์ต๋๋ค.
|
|
18
|
+
- ํญ ์ ํ์ฒ๋ผ ๋์ **์ด**์ด ํ์ํ ์์
์ ์ฌ์ฉํ์ธ์. ์
๋ฌด ํยท์ญ์ payload๊น์ง ๋์ ํ์ผ๋ก ๊ต์ฒดํด์ผ ํ๋ค๋ ์๋ฏธ๋ ์๋๋๋ค.
|
|
19
|
+
|
|
20
|
+
## ์ ๋ขฐํ๋ ์ฑ Worker entry
|
|
21
|
+
|
|
22
|
+
์ผ๋ฐ Main ๋ชจ๋์ inline ํจ์๋ ๊ทธ๋๋ก Main์์ ์คํํฉ๋๋ค. ์ฌ์ฌ์ฉ์ ์ํด registry๋ก ๋ฐ๊ฟ ํ์๊ฐ ์์ต๋๋ค. Worker ๊ณ์ฐ์๋ ํจ์ ๋ณธ๋ฌธ ๋์ ๋ช
์์ ์ฐธ์กฐ๋ฅผ ๋ณด๋
๋๋ค.
|
|
23
|
+
|
|
24
|
+
```ts
|
|
25
|
+
import type { WorkerFunctionRef } from '@vmscloud/moz-ui-grid-core';
|
|
26
|
+
const sumRef: WorkerFunctionRef = { workerFunction: 'app:sum', params: { factor: 1 } };
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
`workerFunction`์ ์ ์ ๋ฑ๋ก ID์ด๋ฉฐ `params`๋ structured-clone ๊ฐ๋ฅํด์ผ ํฉ๋๋ค. ๋ฑ๋ก ํจ์๋ ๊ธฐ์กด callback ์ธ์ **๋ค์** params๋ฅผ ๋ฐ์ต๋๋ค. ๊ณ์ฐ ํจ์๋ ๋๊ธฐ ํจ์์ฌ์ผ ํ๋ฉฐ Promise ๋ฐํ์ ์ค๋ฅ์
๋๋ค. ์ค๋ณต ๋ฑ๋ก ID, ๋ฏธ๋ฑ๋ก ID, Worker ๊ณ์ฐ ๊ฒฝ๊ณ์ inline ํจ์๋ ์ค๋ฅ์
๋๋ค. Main ์ฝ๋ฐฑ ์๋ณต์ด๋ Main ๊ณ์ฐ fallback์ผ๋ก ์ฐํํ์ง ์์ต๋๋ค.
|
|
30
|
+
|
|
31
|
+
๋ค์์ ์ฑ์์ ๋น๋ํ ๋ ํ์ผ์ ์ต์ ์์
๋๋ค. `/worker` entry๋ import๋ง์ผ๋ก ์ค์น๋์ง ์์ผ๋ฏ๋ก ๋ฑ๋ก ๋ค `installProcessorWorker()`๋ฅผ ํธ์ถํฉ๋๋ค.
|
|
32
|
+
|
|
33
|
+
```ts
|
|
34
|
+
// app-grid.worker.ts
|
|
35
|
+
import { DataLoader } from '@vmscloud/moz-ui-grid-core';
|
|
36
|
+
import type { Row } from '@vmscloud/moz-ui-grid-core';
|
|
37
|
+
import { registerWorkerFunctions, installProcessorWorker } from '@vmscloud/moz-ui-grid-core/worker';
|
|
38
|
+
|
|
39
|
+
class AppLoader extends DataLoader {
|
|
40
|
+
async fetchData(): Promise<Row[]> {
|
|
41
|
+
const response = await fetch(String(this.params.url));
|
|
42
|
+
if (!response.ok) throw new Error(`HTTP ${response.status}`);
|
|
43
|
+
return response.json();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
registerWorkerFunctions({
|
|
47
|
+
'app:sum': (values: unknown[], _ctx: unknown, params: { factor: number }) =>
|
|
48
|
+
values.reduce<number>((sum, value) => sum + Number(value), 0) * params.factor,
|
|
49
|
+
});
|
|
50
|
+
installProcessorWorker({ loaders: { 'app:data': AppLoader } });
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
```ts
|
|
54
|
+
// ์ฑ Main โ container๋ ์ฑ์ด ํ๋ณดํ HTMLElement
|
|
55
|
+
import { PureSheet } from '@vmscloud/moz-ui-grid-core';
|
|
56
|
+
const grid = new PureSheet(container, {
|
|
57
|
+
keyFields: ['id'],
|
|
58
|
+
useWorker: true,
|
|
59
|
+
workerFactory: () => new Worker(new URL('./app-grid.worker.ts', import.meta.url), { type: 'module' }),
|
|
60
|
+
loader: { module: 'app:data', params: { url: '/api/inventory' } },
|
|
61
|
+
fields: [{ id: 'id' }, { id: 'qty', dataType: 'number' }],
|
|
62
|
+
});
|
|
63
|
+
await grid.waitForReady();
|
|
64
|
+
grid.rows.addPinnedBottom({
|
|
65
|
+
id: 'total', variant: 'grandtotal',
|
|
66
|
+
aggregates: [{ columnId: 'qty', func: { workerFunction: 'app:sum', params: { factor: 1 } } }],
|
|
67
|
+
});
|
|
68
|
+
await grid.refresh();
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
`LoaderConfig.module`์ ํ์
์ `URL | string`์ด์ง๋ง ํ์ฌ ์คํ ๊ฒฝ๋ก๋ ๊ทธ ๋ฌธ์์ด์ `loaders` map์์ ์ฐพ์ต๋๋ค. ์์ URL์ ๋์ ์ผ๋ก importํ์ง ์์ต๋๋ค. URL์ ์ด๋ค๋ฉด ๋ฑ๋ก ํค๊ฐ ๊ทธ ๋ฌธ์์ด ํํ๊ณผ ์ ํํ ๊ฐ์์ผ ํฉ๋๋ค. loader ์์ฑ์๋ `new () => DataLoader`์ด๋ฉฐ ์ ์ ์ผ๋ก importํ ํด๋์ค๋ฅผ map์ ๋ฃ์ต๋๋ค. `workerFactory`๋ PureSheet โ GridCore โ ProcessorFactory๋ก ์ ๋ฌ๋ฉ๋๋ค. Worker์์ ์ง์ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๋ ๊ฒฝ๊ณ๋ฅผ ์ ์งํ์ธ์.
|
|
72
|
+
|
|
73
|
+
### ์ง์ ๋ฒ์์ ๋ฏธ์ง์
|
|
74
|
+
|
|
75
|
+
| ๊ธฐ๋ฅ | ํ์ฌ ๊ณ์ฝ |
|
|
76
|
+
|---|---|
|
|
77
|
+
| custom filter `predicate`, sort `sortKey`, ๊ณ์ฐ ํ๋ `formula` | ํด๋น callback ์์น์ WorkerFunctionRef๋ฅผ ์ฌ์ฉํด Worker ๋ด๋ถ ์คํ |
|
|
78
|
+
| ์ปฌ๋ผ `aggregate`, `rowGroupConfig.aggregates[].func`, pinned `aggregates[].func` | Worker ๋ด๋ถ ์ง๊ณ. ๋ฑ๋ก ๊ทธ๋ฃน ํจ์๋ ์ค์ ๋ฉค๋ฒ values์ ctx๋ฅผ ๋ฐ์. pinned ๊ฒฐ๊ณผ๋ Main์์ ์ฌ๊ณ์ฐํ์ง ์์ |
|
|
79
|
+
| custom merge `getMergedRange` / `getMergedRanges` | ๋ฑ๋ก ์ฐธ์กฐ ์ง์. pinned merge๋ ๋น๋๊ธฐ Worker ๊ฒฐ๊ณผ๋ฅผ ๋ ๋/export ๊ฒฝ๋ก์์ ์ฌ์ฉ |
|
|
80
|
+
| pivot ๊ณ์ฐยท์ง๊ณยท์ ๋ ฌ | ๋์ callback ์์น์ ๋ฑ๋ก ์ฐธ์กฐ ์ง์. ๋ชจ๋ callback property ์ด๋ฆ์ด ๋์ผํ ๊ฒ์ ์๋๋ฏ๋ก ๊ฐ ํ์
์ ๋ฐ๋ฆ |
|
|
81
|
+
| Worker ๊ฒ์ยท์ปฌ๋ผ ๊ฐ ์์ง์ mask formatter | ๋ฑ๋ก ์ฐธ์กฐ ์คํ ์ง์. ๋ด์ฅ mask๋ recipe๋ก ์ ๋ฌ |
|
|
82
|
+
| UI ํ์ mask | ๋ฑ๋ก formatter๋ ๋น๋๊ธฐ ํ์ coordinator๋ฅผ ํตํด ํด์ํฉ๋๋ค. ํ์ ๊ฒฐ๊ณผ๋ฅผ ์๋ณธ ๋ฐ์ดํฐ์ ์ฐ์ง ์์ต๋๋ค. ํธ์ง parser์ ํ์ formatter์ ๊ณ์ฝ์ ๊ตฌ๋ถํฉ๋๋ค. |
|
|
83
|
+
| XLSX Worker formatter | processor XLSX session/transport๋ฅผ ํตํด ๋ฑ๋ก ํจ์๋ฅผ ์คํํฉ๋๋ค. Worker ์คํ ์คํจ๋ฅผ Main ๊ณ์ฐ์ผ๋ก ์จ๊ธฐ์ง ์์ต๋๋ค. |
|
|
84
|
+
|
|
85
|
+
DOM renderer์ ์ผ๋ฐ UI callback์ Worker ํจ์๋ก ๋ชจ๋ ์นํํ๋ API๊ฐ ์๋๋๋ค. ์ผ๋ฐ Main inline ์ฝ๋ฐฑ์ ์ ์ง๋ฉ๋๋ค.
|
|
86
|
+
|
|
87
|
+
## Inventory Main ๊ณ ์ ํฉ๊ณ callback
|
|
88
|
+
|
|
89
|
+
`grid.rows.addPinnedBottom({ variant: 'grandtotal', aggregates: [{ columnId, func }] })`์ Main ํจ์ํ ์ง๊ณ๋ **ํ์ฌ ํํฐ๋ฅผ ํต๊ณผํ ๋ฐ์ดํฐ**๋ฅผ ์
๋ ฅ์ผ๋ก ์ฌ์ฉํฉ๋๋ค. native ๋ฌธ์์ด ์ง๊ณ cache๊ฐ ์๋ ํผํฉ ๊ตฌ์ฑ๊ณผ custom-only ๊ตฌ์ฑ์ ๋ฒ์๊ฐ ๊ฐ์ต๋๋ค. `columnId`์ ์๋ณธ `field`๊ฐ ๋ฌ๋ผ๋ ์๋ณธ field๋ฅผ ์ฝ์ต๋๋ค.
|
|
90
|
+
|
|
91
|
+
```ts
|
|
92
|
+
// grid์ fields์๋ { id: 'qty', field: 'amount', dataType: 'number' }๊ฐ ์๋ค๊ณ ๊ฐ์
|
|
93
|
+
const mean = (values: unknown[]) => values.length
|
|
94
|
+
? values.reduce<number>((sum, value) => sum + Number(value), 0) / values.length
|
|
95
|
+
: 0;
|
|
96
|
+
grid.rows.addPinnedBottom({
|
|
97
|
+
id: 'mean', variant: 'grandtotal',
|
|
98
|
+
aggregates: [{ columnId: 'qty', func: mean }],
|
|
99
|
+
});
|
|
100
|
+
await grid.filter([{ id: 'qty', operator: 'gt', filterValue: 0 }]);
|
|
101
|
+
await grid.refresh();
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
null/undefined ์์๋ callback ์
๋ ฅ์์ ์ ์ธํ์ง๋ง 0์ ํฌํจํฉ๋๋ค. null-only/๋น ํํฐ ๊ฒฐ๊ณผ์ `values`๋ ๋น ๋ฐฐ์ด์ด๋ฉฐ ๋ฐํ๊ฐ์ callback์ด ๊ฒฐ์ ํฉ๋๋ค. callback์ด ๋ฐํํ null์ 0์ผ๋ก ๋ฐ๊พธ์ง ์์ผ๋ฉฐ ์์๋ฅผ ์์ ๋ฐ์ฌ๋ฆผํ์ง ์์ต๋๋ค. `func` ์๋ต ์ ์ปฌ๋ผ aggregate๋ฅผ ์์ํ๊ณ ๊ทธ๊ฒ๋ ์์ผ๋ฉด sum์
๋๋ค. CSV/XLSX์ ๊ณ ์ ํ์ ํฌํจํ๋ ค๋ฉด Core export์ `includePinnedRows: true`๋ฅผ ์ฌ์ฉํ์ธ์. ์ด ์ ์ ํํฐ ๋ฒ์ ๊ณ์ฝ์ grandtotal์ ๊ดํ ๊ฒ์ผ๋ก ๋ชจ๋ subtotal ๊ฒฝ๋ก์ ๋๋ฑ์ฑ๊น์ง ์ฃผ์ฅํ์ง ์์ต๋๋ค.
|
|
105
|
+
|
|
106
|
+
## ๋ฐ์ดํฐ ์ธ์
๊ณผ ์ค์ ์ฌ์์ฑ
|
|
107
|
+
|
|
108
|
+
```ts
|
|
109
|
+
// PureSheet์ ๊ณต๊ฐ API
|
|
110
|
+
const token = await oldGrid.captureDataSessionAsync(); // Worker ํฌํจ ๋น๋๊ธฐ capture
|
|
111
|
+
// ๊ฐ์ keyFields๋ฅผ ๊ฐ์ง ํธํ ์ sheet๊ฐ ์ค๋น๋ ๋ค:
|
|
112
|
+
if (token) await newGrid.restoreDataSession(token); // Promise<void>
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
ํ ํฐ์ ๊ฐ์ ๋ฐํ์์ ๋ถํฌ๋ช
๋ฉ๋ชจ๋ฆฌ ๊ฐ์ฒด์
๋๋ค. JSON/localStorage ํ๋ฆฌ์
์ด ์๋๋ฉฐ ๋ณต์ ยท์ง๋ ฌํํ๊ฑฐ๋ `{ version: 1 }`๋ก ๋ง๋ค์ด ๋ณต์ํ ์ ์์ต๋๋ค. ํ์ ๋ฐ์ดํฐ๋ง ๋ค์ loadํ๋ ๋์ **์๋ณธ baseline, dirty ์ถ๊ฐ/์์ /์ญ์ , ์ง์ undo/redo ๋ช
๋ น๊ณผ cursor, ์๋ ID, tree config/state**๋ฅผ ์ด์ ํฉ๋๋ค. `getConfig()`์ layout snapshot๊ณผ ๋ค๋ฆ
๋๋ค.
|
|
116
|
+
|
|
117
|
+
- live/ready ์ธ์คํด์ค์์๋ง captureํ ์ ์์ต๋๋ค. ํธ์ง ์ค์ด๋ฉด commit์ ๋จผ์ ์๋ํ๊ณ ์ทจ์/๊ฒ์ฆ ์คํจ๋ก ํธ์ง์ด ๋จ์ผ๋ฉด PS906์
๋๋ค.
|
|
118
|
+
- ์งํ ์ค load/refresh, undo ๋๊ธฐํ, ๋ฏธ์๋ฃ batch/transaction ๋ฑ์ capture๋ฅผ ๊ฑฐ๋ถํ ์ ์์ต๋๋ค. ํธ์ถํ ๋น๋๊ธฐ API๋ฅผ ์ง์ awaitํ๊ณ undo/redo ์๋ฃ ์ด๋ฒคํธ๋ฅผ ํ์ธํ์ธ์. `ready()`๋ ๋ชจ๋ ์์
์๋ฃ barrier๊ฐ ์๋๋๋ค.
|
|
119
|
+
- Worker ์ธ์
์ `captureDataSessionAsync()`๋ฅผ ์ฌ์ฉํฉ๋๋ค. pivot ์ํ๋ ์ธ์
์ ํฌํจ๋ฉ๋๋ค. custom ๋ช
๋ น์ ์ง์๋๋ capture/rebind ๊ณ์ฝ์ด ํ์ํ๋ฉฐ ๋ฏธ์ง์ history๋ ๊ฑฐ๋ถํฉ๋๋ค. ๊ณต์ UndoStack์ ๋ค๋ฅธ ๊ทธ๋ฆฌ๋ ๋ช
๋ น์ ์๋ ์์ ์ ๋ฐ์ธ๋ฉ์ ์ ์งํฉ๋๋ค.
|
|
120
|
+
- keyFields ๋ณ๊ฒฝ์ ๊ฐ์ ์ธ์
๋ณต์๊ณผ ํธํ๋์ง ์์ต๋๋ค. ์บก์ฒ ๋ค ๊ณต์ history๊ฐ ๋ฐ๋ stale ํ ํฐ๋ ๊ฑฐ๋ถํฉ๋๋ค. ํ์ ํ๋ง loadํด์ ์คํจ๋ฅผ ์จ๊ธฐ๋ฉด baseline/history๊ฐ ์ฌ๋ผ์ง๋ฏ๋ก ๊ทธ๋ฐ fallback์ ์ ๊ณตํ์ง ์์ต๋๋ค.
|
|
121
|
+
|
|
122
|
+
### Vue/React handshake
|
|
123
|
+
|
|
124
|
+
๋ ์ด๋ํฐ์ `sourceRevision?: unknown`์ **wrapper prop**์
๋๋ค(coreConfig ์์ ํค๊ฐ ์๋). ์ธ๋ถ loader ๋ฐ์ดํฐ์
์ด ์ค์ ๊ต์ฒด๋ ๋๋ง ๋ฐ๊พธ๊ณ , ํธ์ง์ด๋ ์ผ๋ฐ ํ๋ฉด ์ค์ ๋ณ๊ฒฝ์๋ ์ ์งํ์ธ์. ๋น๊ต๋ `Object.is`์ด๋ฉฐ ๊ฐ์ฒด๋ฅผ ๋งค๋ฒ ์๋ก ๋ง๋ค๋ฉด ๊ต์ฒด๋ก ์ธ์ํฉ๋๋ค.
|
|
125
|
+
|
|
126
|
+
`GridChrome.getReadyContext(): Readonly<GridChromeReadyContext>`:
|
|
127
|
+
|
|
128
|
+
```ts
|
|
129
|
+
interface GridChromeReadyContext {
|
|
130
|
+
reason: 'initial' | 'configuration' | 'source-replacement';
|
|
131
|
+
dataRestored: boolean;
|
|
132
|
+
sourceRevision?: unknown;
|
|
133
|
+
}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
- ์ผ๋ฐ ๋ฐํ์ ์ค์ ์ ๊ณตํต coordinator๊ฐ ๋์ผ ์ธ์คํด์ค์ ์ ์ฉํ๋ฉฐ ready๋ฅผ ๋ค์ ๋ฐ์์ํค์ง ์์ต๋๋ค. ์ค์ ์ธ์คํด์ค ๊ต์ฒด๊ฐ ํ์ํ ๊ฒฝ๋ก์์๋ง ์ sheet ๋ณต์ ํ `ready(grid, chrome)` / `onReady(grid, chrome)`๋ฅผ ํธ์ถํฉ๋๋ค. context๋ ๋ ๋ฒ์งธ ์ธ์์์ ์ฝ์ต๋๋ค.
|
|
137
|
+
- ์ฌ์์ฑ ์ `data`/`loader` ์ฐธ์กฐ ๋๋ sourceRevision์ด ๋ฐ๋๋ฉด source replacement๋ก ๊ฐ์ฃผํด ์ด์ ์ธ์
capture๋ฅผ ๊ฑด๋๋๋๋ค. ์ ๋ฐ์ดํฐ baseline์ด๋ฉฐ `dataRestored: false`์
๋๋ค. dirty๋ฅผ ์ง์ฐ๊ธฐ ์ํ ์ฐํ๋ก๋ก revision์ ์ฌ๋ฆฌ์ง ๋ง์ธ์.
|
|
138
|
+
- ์ค์ ๊ฐ์ ์์ค ์ธ์คํด์ค ๊ต์ฒด๋ destroy **์ ์** ๋น๋๊ธฐ captureํฉ๋๋ค. ์คํจํ๋ฉด ๊ธฐ์กด ์ธ์คํด์ค๋ฅผ ์ ์งํ๊ณ ์ค๋ฅ๋ฅผ ๋ณด๊ณ ํฉ๋๋ค. ๊ณตํต coordinator๋ ์ถ์ ๋ ์์
์ข
๋ฃ๋ฅผ ๊ธฐ๋ค๋ ค ์ต์ ์ค์ ์์ฒญ์ ์ ์ฉํ๋ฉฐ, ์ค์ load/validation ์คํจ๋ฅผ ๋ฌดํ ์ฌ์๋ํ์ง ์์ต๋๋ค.
|
|
139
|
+
- ๊ณต๊ฐ `waitForSettled(signal?)`์ ์ถ์ ๋ ์์
์ ์ข
๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆฝ๋๋ค. `ready()`์ ๊ตฌ๋ถํ๋ฉฐ ์ธ์
capture์ ์ ํจ์ฑ ๊ฒ์ฆ์ ๋์ ํ์ง ์์ต๋๋ค.
|
|
140
|
+
- `restoreReinitState()` ์ค๋ฅ๋ ํธ์ถ์์๊ฒ ์ ํํฉ๋๋ค. ์คํจ ๋ค ์ฑ๊ณต ready๋ฅผ ๋ด๋ณด๋ด์ง ์์ต๋๋ค. restore ์ ์ dataSession์ ํฌํจํ `GridChromeReinitState`๋ฅผ GridChrome ์์ฑ์ ๋ค ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌํด์ผ constructor data/loader bootstrap๊ณผ ๊ฒฝ์ํ์ง ์์ต๋๋ค. Vue/React ์ด๋ํฐ๊ฐ ์ด ์์๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
|
|
141
|
+
|
|
142
|
+
```ts
|
|
143
|
+
// ๋ ํ๋ ์์ํฌ์์ ์ฌ์ฉํ ready ํธ๋ค๋ฌ์ ํต์ฌ (bindEvents/loadOwnedSource๋ ์๋น์ฒ ํจ์)
|
|
144
|
+
function handleReady(grid: PureSheet, chrome: GridChrome) {
|
|
145
|
+
bindEvents(grid); // ์ ์ธ์คํด์ค์ด๋ฏ๋ก ๋งค ready๋ง๋ค ์ฐ๊ฒฐ
|
|
146
|
+
const context = chrome.getReadyContext();
|
|
147
|
+
if (context.dataRestored && Object.is(context.sourceRevision, currentSourceRevision)) return;
|
|
148
|
+
// ์ธ๋ถ ๋ก๋๋ฅผ ์๋น์ฒ๊ฐ ๋จ๋
์์ ํ ๋๋ง ์คํ.
|
|
149
|
+
// coreConfig.data/loader์ ์ค๋ณต์ผ๋ก ๋ก๋ํ์ง ๋ง ๊ฒ.
|
|
150
|
+
void loadOwnedSource(grid);
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
์๋น์ฒ๊ฐ ๋ณต์๋ ready๋ง๋ค ๋ค์ loadData/tree reload๋ฅผ ํธ์ถํ๋ฉด baseline/dirty๊ฐ ๋ฎ์ผ ์ ์์ต๋๋ค. Fab ๊ฐ์ ์ธ๋ถ ๋ก๋ ํ๋ฉด์ ๋ก๋ ์์ ์๋ฅผ ํ๋๋ก ์ ํ๊ณ revision๋ณ ์ด๊ธฐ ๋ก๋์ ๊ฐ์ revision์ ๋ณต์์ ๊ตฌ๋ถํด์ผ ํฉ๋๋ค. ์ผ๋ฐ ๋ฐํ์ ์ค์ ์ ๋์ผ ์ธ์คํด์ค ์ ์ฉ๊ณผ ์ค์ ์ธ์คํด์ค ๊ต์ฒด์ ์ธ์
์ด์ ์ ๊ตฌ๋ถํ์ธ์. ๋ฏธ์ง์ history๋ฅผ ์กฐ์ฉํ ๋ฒ๋ฆฌ๋ fallback์ ์ ๊ณตํ์ง ์์ต๋๋ค.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vmscloud/moz-ui-grid-vue",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.11",
|
|
4
4
|
"description": "MozGrid - Vue 3 wrapping library for @vmscloud/moz-ui-grid-core",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"type": "module",
|
|
@@ -80,8 +80,8 @@
|
|
|
80
80
|
"build-storybook": "storybook build"
|
|
81
81
|
},
|
|
82
82
|
"dependencies": {
|
|
83
|
-
"@vmscloud/moz-ui-grid-core": "^0.1.
|
|
84
|
-
"@vmscloud/moz-ui-grid-wrapper": "^0.1.
|
|
83
|
+
"@vmscloud/moz-ui-grid-core": "^0.1.51",
|
|
84
|
+
"@vmscloud/moz-ui-grid-wrapper": "^0.1.24",
|
|
85
85
|
"bytebuffer": "^5.0.1",
|
|
86
86
|
"crypto-js": "^4.2.0",
|
|
87
87
|
"echarts": "^5.5.0",
|