@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.
@@ -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
- - ์ฝ”์–ด์—์„œ๋Š” ์ƒ์„ฑ ์„ค์ •์ž…๋‹ˆ๋‹ค. React/Vue provider ๋ฐ `coreConfig.timeZone` ๋ณ€๊ฒฝ์€ ๊ธฐ์กด ์ƒํƒœ๋ณด์กด ์žฌ์ƒ์„ฑ ๊ฒฝ๋กœ๋กœ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.
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
- ํ˜„์žฌ ๊ฐ’๋งŒ ๋‚ด๋ณด๋‚ด๊ณ  **์ ์šฉํ•˜์ง€ ์•Š๋Š”** ํ‚ค(๊ฐ’์ด ๋‹ค๋ฅด๋ฉด ๊ฒฝ๊ณ  `PS905`): `reorderableRows`/`showDragHandleColumn`(๋“œ๋ž˜๊ทธ ์žฌ์ •๋ ฌ ๋ฐฐ์„ ์ด ์ƒ์„ฑ ์‹œ์  ์ „์šฉ โ€” `dragDropConfig` ์†Œ์œ ), `keyFields`(ํ–‰ ์‹๋ณ„์ž โ€” ๋ฐ”๊พธ๋ ค๋ฉด ๋ฐ์ดํ„ฐ ์žฌ์ ์žฌ ํ•„์š”), `rowTemplate`(Multi-Row ๋Ÿฐํƒ€์ž„ ์ „ํ™˜ API ์—†์Œ).
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
- - ํ•จ์ˆ˜๋Š” Worker๋กœ ๋ณด๋‚ผ ์ˆ˜ ์—†์–ด ์—”์ง„(Main/Worker)์€ ๋ฌธ์ž์—ด ์ง‘๊ณ„๋งŒ ๊ณ„์‚ฐํ•˜๊ณ  ํ•จ์ˆ˜๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ๊ทธ ๊ฒฐ๊ณผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. **`values`๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์— ๋ฉค๋ฒ„ ํ–‰์ด ์žˆ์„ ๋•Œ๋งŒ ์ฑ„์›Œ์ง€๊ณ  Worker ๋ชจ๋“œ์—์„œ๋Š” ๋นˆ ๋ฐฐ์—ด**์ž…๋‹ˆ๋‹ค โ€” ๋‘ ๋ชจ๋“œ ๋ชจ๋‘์—์„œ ๋งž์œผ๋ ค๋ฉด `ctx`๋ฅผ ์“ฐ์„ธ์š”.
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` | ํ–‰ ๋†’์ด (px) |
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
- /** DataLoader๋ฅผ default exportํ•˜๋Š” ES ๋ชจ๋“ˆ URL */
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: new URL('./my-loader.ts', import.meta.url),
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 ๋ชจ๋“œ ์ œ์•ฝ**: `type: 'custom'`์€ ํ•จ์ˆ˜ ์ง๋ ฌํ™” ๋ถˆ๊ฐ€๋กœ worker์—์„œ ์‚ฌ์šฉ ๋ถˆ๊ฐ€. content/hierarchical๋งŒ 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
- * ๋ฏธ์ •์˜ ์‹œ: ๊ฐ’/ํ–‰์ด ๋ฐ”๋€Œ๋ฉด(๊ฐ’ ๋ณ€๊ฒฝ, ์Šคํฌ๋กค ์žฌํ™œ์šฉ) destroy ํ›„ re-mount. ๊ทธ๋Œ€๋กœ๋ฉด ์œ ์ง€.
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` (CSS ๋ฌธ์ž์—ด โ€” `rowHeight`/`headerHeight` ์™€ ์ผ๋ถ€ ์ค‘๋ณต)
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
- `LoaderConfig.module`์ด default exportํ•˜๋Š” ํด๋ž˜์Šค์˜ ๋ฒ ์ด์Šค. ์›Œ์ปค ์•ˆ์—์„œ ์‹คํ–‰๋˜๋ฏ€๋กœ DOM/localStorage ์ ‘๊ทผ์€ ๋ถˆ๊ฐ€ํ•˜๊ณ , `fetch`/`WebSocket`/`XMLHttpRequest` ๋“ฑ ๋„คํŠธ์›Œํฌ API๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅ.
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: new URL('./my-loader.ts', import.meta.url),
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
- > **`InlineDataLoader`**: ๋™์ผ ๋ชจ๋“ˆ ๋‚ด ์ธ๋ผ์ธ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ(URL์ด ์•„๋‹Œ ํด๋ž˜์Šค ์ž์ฒด ์ „๋‹ฌ) ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ณ€ํ˜•. ์ผ๋ฐ˜ ์‚ฌ์šฉ ์‹œ์—๋Š” `LoaderConfig.module` URL ํŒจํ„ด ๊ถŒ์žฅ.
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
- | `captureReinitState` | `captureReinitState(): GridChromeReinitState` | ์†Œ๋ฉธ ์ง์ „ ์ธ์Šคํ„ด์Šค์—์„œ `{ core: getConfig(), customCell, columnFormat }` ์Šค๋ƒ…์ƒท(๋ž˜ํผ ์ „์šฉ ์ƒํƒœ ํฌํ•จ) |
790
- | `restoreReinitState` | `async restoreReinitState(state): Promise<void>` | ์ƒˆ ์ธ์Šคํ„ด์Šค์—์„œ `applyConfig(core)` ํ›„ `columnFormat`(base) โ†’ `customCell`(override) ์žฌ์ ์šฉ. ์ ˆ๋Œ€ reject ์•ˆ ํ•จ(๋ถ€๋ถ„ ๋ณต์› ํ—ˆ์šฉ) |
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.9",
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.47",
84
- "@vmscloud/moz-ui-grid-wrapper": "^0.1.21",
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",