@vmscloud/moz-ui-grid-vue 0.2.6 โ†’ 0.2.7

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,23 @@
6
6
 
7
7
  > ๐Ÿ“‹ **์‚ฌ์šฉ ์˜ˆ์ œ ์ฝ”๋“œ๋Š” ๋ณ„๋„ ํŒŒ์ผ**: [examples.md](examples.md) โ€” Sub-API๋ณ„ ์‚ฌ์šฉ, Reactive React ํ†ตํ•ฉ, ์ด๋ฒคํŠธ, ์„ ํƒ ๋ชจ๋“œ, Excel I/O ๋“ฑ ์•ฝ 30๊ฐœ ์‹œ๋‚˜๋ฆฌ์˜ค
8
8
 
9
+ ## ๋‚ ์งœ ์‹œ๊ฐ„๋Œ€ ๊ณ„์•ฝ (`timeZone`)
10
+
11
+ ```ts
12
+ const grid = new PureSheet(container, { fields, data, timeZone: 'Asia/Seoul' });
13
+ await grid.io.saveExcelToFile({ suggestedName: 'seoul.xlsx' });
14
+ await grid.io.fromExcel(legacyFile, { timeZone: 'UTC' });
15
+ ```
16
+
17
+ - ๋ฏธ์ง€์ •: ๊ธฐ์กด ๋ธŒ๋ผ์šฐ์ € ๋กœ์ปฌ ๋‚ ์งœ ํ‘œ์‹œ์™€ UTC Excel serial IO๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. `locale`๋กœ ์‹œ๊ฐ„๋Œ€๋ฅผ ์ถ”๋ก ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
18
+ - ๋ช…์‹œ: ๋‚ด์žฅ ๋‚ ์งœ mask์™€ ๋‚ ์งœ ๊ธฐ๋ณธ ํ‘œ์‹œ, XLSX serial export/import/preview๊ฐ€ ๊ฐ™์€ IANA ์‹œ๊ฐ„๋Œ€๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €/OS ์‹œ๊ฐ„๋Œ€์™€ ๋ฌด๊ด€ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ํ•จ์ˆ˜ mask/์ปค์Šคํ…€ ๋ Œ๋”๋Ÿฌ์˜ ์ถœ๋ ฅ์€ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
19
+ - `Date`, ์ˆซ์ž timestamp, `Z` ๋˜๋Š” offset์ด ์žˆ๋Š” ISO ๋ฌธ์ž์—ด์€ **์ ˆ๋Œ€ ์‹œ๊ฐ**์ž…๋‹ˆ๋‹ค. Offset ์—†๋Š” ISO ๋‚ ์งœ/์‹œ๊ฐ(`2026-09-01 00:00:00`, `2026-09-01T00:00:00`), ๋‚ ์งœ๋งŒ(`2026-09-01`), compact ๋ฌธ์ž์—ด(`20260901`, `20260901000000`)์€ **์„ค์ • ์‹œ๊ฐ„๋Œ€์˜ ๋ฒฝ์‹œ๊ณ„ ๊ฐ’**์ž…๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ ๋กœ์ปฌ `new Date(string)`๋กœ ๋จผ์ € ํ•ด์„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
20
+ - Excel์€ ์‹œ๊ฐ„๋Œ€ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ™์€ ํŒŒ์ผ์„ ์™•๋ณตํ•˜๋ ค๋ฉด ๊ฐ™์€ zone์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. `2026-08-31T15:00:00Z`๋Š” Seoul์—์„œ `2026-09-01 00:00:00`, serial `46266`์ž…๋‹ˆ๋‹ค. ๋ฏธ์ง€์ •/UTC export๋Š” ๊ธฐ์กด `46265.625`์ž…๋‹ˆ๋‹ค.
21
+ - ๋‚ ์งœ๋งŒ ํ‘œ์‹œํ•˜๋Š” mask๋Š” **์‹œ๊ฐ„ ๊ฐ’์„ ์ž๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค**. XLSX ์†Œ์ˆ˜๋ถ€์— ์‹œยท๋ถ„ยท์ดˆยท๋ฐ€๋ฆฌ์ดˆ๊ฐ€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ž„์˜์˜ ๋‚ ์งœ ๋ฌธ์ž์—ด์€ ํ˜ธ์ŠคํŠธ ์˜์กด ํŒŒ์‹ฑ์„ ํ•˜์ง€ ์•Š๊ณ  ์›๋ฌธ์œผ๋กœ ๋‚จ๊น๋‹ˆ๋‹ค.
22
+ - DST ํ•ด์„์€ Temporal `compatible`: ์ค‘๋ณต ์‹œ๊ฐ์€ **๋” ์ด๋ฅธ instant**, ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์‹œ๊ฐ์€ **gap ๊ธธ์ด๋งŒํผ ์•ž์œผ๋กœ** ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ DST ์ค‘๋ณต ์‹œ๊ฐ์˜ ๋‘ instant๋ฅผ Excel serial๋งŒ์œผ๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•˜๋ฉด UTC IO override๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
23
+ - ์ž˜๋ชป๋œ zone(๋นˆ ๋ฌธ์ž์—ด ํฌํ•จ)์€ `RangeError`์ž…๋‹ˆ๋‹ค. UTC๋‚˜ ๋ธŒ๋ผ์šฐ์ € zone์œผ๋กœ ์กฐ์šฉํžˆ ํด๋ฐฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
24
+ - ์ฝ”์–ด์—์„œ๋Š” ์ƒ์„ฑ ์„ค์ •์ž…๋‹ˆ๋‹ค. React/Vue provider ๋ฐ `coreConfig.timeZone` ๋ณ€๊ฒฝ์€ ๊ธฐ์กด ์ƒํƒœ๋ณด์กด ์žฌ์ƒ์„ฑ ๊ฒฝ๋กœ๋กœ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.
25
+
9
26
  ## ๋ชฉ์ฐจ
10
27
 
11
28
  - [๊ฐœ์š”](#๊ฐœ์š”)
@@ -221,6 +238,7 @@ grid.on('row:click', ({ rowIndex }) => {
221
238
  | `undoStack` | `UndoStack` | โ€” | ์™ธ๋ถ€ UndoStack ์ฃผ์ž… |
222
239
  | **๊ตญ์ œํ™”** | | | |
223
240
  | `locale` | `string` | ์ž๋™ ๊ฐ์ง€ | ๋กœ์ผ€์ผ (์˜ˆ: `'ko-KR'`) |
241
+ | `timeZone` | `string` | ๋ฏธ์ง€์ • | IANA ์‹œ๊ฐ„๋Œ€(์˜ˆ: `'Asia/Seoul'`). ๋‚ ์งœ ํ‘œ์‹œ์™€ XLSX import/export์— ๊ณตํ†ต ์ ์šฉ. ๋ฏธ์ง€์ •์€ ๊ธฐ์กด ๋กœ์ปฌ ํ‘œ์‹œยทUTC IO ์œ ์ง€ |
224
242
  | `translations` | `PartialTranslationMap` | โ€” | ๋ฒˆ์—ญ ์˜ค๋ฒ„๋ผ์ด๋“œ |
225
243
  | **ํฌ๋งทํŒ…** | | | |
226
244
  | `formatRow` | `FormatRowCallback` | โ€” | ํ–‰ ํฌ๋งทํŒ… ์ฝœ๋ฐฑ (config์—์„œ ์„ค์ • ์‹œ `_config` ํ‚ค๋กœ ์ž๋™ ๋“ฑ๋ก) |
@@ -858,7 +876,7 @@ PureSheet ์ธ์Šคํ„ด์Šค๋Š” ๊ธฐ๋Šฅ๋ณ„ Sub-API ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ
858
876
 
859
877
  ### grid.cells โ€” ์…€ ์„ ํƒ API
860
878
 
861
- ์…€ = ํ–‰(rowId/viewIndex) + ์—ด(columnId)์˜ ๊ต์ฐจ์ . ์“ฐ๊ธฐ(select)์™€ ์กฐํšŒ(selected)๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
879
+ ์…€ = ํ–‰(rowId/viewIndex) + ์—ด(columnId)์˜ ๊ต์ฐจ์ . ์“ฐ๊ธฐ(select*)์™€ ์กฐํšŒ(getSelected*)๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
862
880
 
863
881
  #### ์„ ํƒ (์…€ โ€” ์“ฐ๊ธฐ)
864
882
 
@@ -874,7 +892,9 @@ PureSheet ์ธ์Šคํ„ด์Šค๋Š” ๊ธฐ๋Šฅ๋ณ„ Sub-API ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ
874
892
 
875
893
  | ๋ฉ”์„œ๋“œ | ๋ฐ˜ํ™˜ | ์„ค๋ช… |
876
894
  |--------|------|------|
877
- | `selected()` | `{rowId, columnId}[]` | ์„ ํƒ๋œ ์…€ ๋ชฉ๋ก |
895
+ | `getSelectedCellIds()` | `{rowId, columnId}[]` | ์„ ํƒ๋œ ์…€ ๋ชฉ๋ก (์…€ API ์—๋Š” `selected()` ๊ฐ€ ์—†๋‹ค โ€” ํ–‰ API `grid.rows.selected()` ์™€ ๋‹ค๋ฆ„) |
896
+ | `getSelectedCells()` | `SelectedCell[]` | ์„ ํƒ๋œ ์…€ ์ƒ์„ธ (ํ–‰ ํ•ธ๋“คยท๊ฐ’ ํฌํ•จ) |
897
+ | `getActiveCell()` | `SelectedCell \| null` | ํ˜„์žฌ ํ™œ์„ฑ ์…€ |
878
898
  | `getSelectedCellRowIds()` | `string[]` | ์„ ํƒ๋œ ์…€์ด ๊ฑธ์นœ ํ–‰ rowId ๋ชฉ๋ก(์ค‘๋ณต ์ œ๊ฑฐ) |
879
899
  | `getSelectedCellColumnIds()` | `string[]` | ์„ ํƒ๋œ ์…€์ด ๊ฑธ์นœ ์ปฌ๋Ÿผ columnId ๋ชฉ๋ก(์ค‘๋ณต ์ œ๊ฑฐ) |
880
900
  | `getSelectedCellIndices()` | `number[]` | ์„ ํƒ๋œ ์…€์ด ๊ฑธ์นœ ํ–‰ sourceIndex ๋ชฉ๋ก(์ค‘๋ณต ์ œ๊ฑฐ) |
@@ -1274,8 +1294,13 @@ await grid.rowGroup.setConfig({
1274
1294
  ์ €์žฅ๋ณธ 0.4 โ†’ 0.5 ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ์˜› ๊ทธ๋ฃน ์ •๋ ฌ `column`/๊ฐ์ฒด `by`๋ฅผ ์ƒˆ ๋ชจ๋ธ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ ,
1275
1295
  ํ”ผ๋ฒ— `SortState.byValue`๋Š” ๋™์ผํ•œ scalar ๊ฐ’ ๊ทธ๋Œ€๋กœ `by`๋กœ ๊ฐœ๋ช…ํ•ฉ๋‹ˆ๋‹ค. ํ”ผ๋ฒ— ์ง‘๊ณ„/์ •๋ ฌ ์˜๋ฏธ๋Š” ๋ณ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
1276
1296
 
1277
- ๊ทธ๋ฃน ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ ํ–‰์˜ ์ผ๋ฐ˜ ์ •๋ ฌ์€ ๋ณ„๋„๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. null/undefined๋Š” ๊ธฐ์กด ์ •๋ ฌ ๊ทœ์•ฝ๋Œ€๋กœ
1278
- ์˜ค๋ฆ„์ฐจ์ˆœ์—์„œ๋Š” ๋’ค, ๋‚ด๋ฆผ์ฐจ์ˆœ์—์„œ๋Š” ์•ž์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค. wrapper ์ •๋ ฌ ํŒจ๋„์˜ **๊ทธ๋ฃน ์ •๋ ฌ โ†’ ์ •๋ ฌ ๊ธฐ์ค€**์—์„œ๋„
1297
+ ๊ทธ๋ฃน ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ ํ–‰์˜ ์ผ๋ฐ˜ ์ •๋ ฌ์€ ๋ณ„๋„๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ยท๊ณ„์‚ฐ ํ•„๋“œยท๊ทธ๋ฃนยทํŠธ๋ฆฌยทํ”ผ๋ฒ— ์ •๋ ฌ์—์„œ
1298
+ null/undefined๋Š” **์˜ค๋ฆ„์ฐจ์ˆœ(ASC)์—์„œ๋Š” ์•ž, ๋‚ด๋ฆผ์ฐจ์ˆœ(DESC)์—์„œ๋Š” ๋’ค**์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.
1299
+ ๋‘ ๊ฐ’์ด ๋ชจ๋‘ null/undefined์ด๋ฉด ๋™๋ฅ ์ด๋ฉฐ, ๋‹ค์Œ ์ •๋ ฌ ํ‚ค๋ฅผ ๋น„๊ตํ•˜๊ณ  ๋ชจ๋“  ํ‚ค๊ฐ€ ๊ฐ™์œผ๋ฉด ๊ธฐ์กด ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
1300
+ ๋นˆ ๋ฌธ์ž์—ด(`''`), ๊ณต๋ฐฑ ๋ฌธ์ž์—ด, `0`, `false`๋Š” null/undefined๋กœ ์ทจ๊ธ‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
1301
+ `sortKey`๊ฐ€ ์žˆ์œผ๋ฉด ์›๋ณธ ๊ฐ’์ด ์•„๋‹Œ ๋ณ€ํ™˜๋œ ํ‚ค๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
1302
+ ์ด๋Š” ์ด์ „ ASC ๋’ค/DESC ์•ž ๊ธฐ๋ณธ์ •์ฑ…์˜ ๋ณ€๊ฒฝ์ด๋ฉฐ, ์ €์žฅ๋œ ์ •๋ ฌ ๋ฐฉํ–ฅ์—๋„ ์ƒˆ ๊ธฐ๋ณธ์ •์ฑ…์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
1303
+ wrapper ์ •๋ ฌ ํŒจ๋„์˜ **๊ทธ๋ฃน ์ •๋ ฌ โ†’ ์ •๋ ฌ ๊ธฐ์ค€**์—์„œ๋„
1279
1304
  โ€˜๊ทธ๋ฃน ์ด๋ฆ„โ€™์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ •๋ ฌ ๊ทœ์น™์ด ์—†์„ ๋•Œ์™€ ์ƒˆ ๊ทœ์น™์„ ์ถ”๊ฐ€ํ•  ๋•Œ ๋ชจ๋‘
1280
1305
  **๊ทธ๋ฃน ์ด๋ฆ„ ์˜ค๋ฆ„์ฐจ์ˆœ**์ด ๊ธฐ๋ณธ์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด์— ์ €์žฅํ•œ ํ•˜์œ„ ํ–‰ ๊ฐœ์ˆ˜ยท์ง‘๊ณ„ ์ •๋ ฌ์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
1281
1306
 
@@ -1626,6 +1651,8 @@ interface InvalidCell {
1626
1651
 
1627
1652
  #### Export ์˜ต์…˜ โ€” `ExcelExportOptions`
1628
1653
 
1654
+ `timeZone?: string`์€ ํ•ด๋‹น ์ž‘์—…๋งŒ ์ฝ”์–ด ์‹œ๊ฐ„๋Œ€๋ณด๋‹ค ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค. `saveExcelToFile`๊ณผ Worker ๊ฒฝ๋กœ์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
1655
+
1629
1656
  | ํ•„๋“œ | ํƒ€์ž… | ๊ธฐ๋ณธ๊ฐ’ | ์„ค๋ช… |
1630
1657
  |------|------|--------|------|
1631
1658
  | `scope` | `'all' \| 'visible' \| 'selected'` | `'all'` | ๋ฐ์ดํ„ฐ ๋ฒ”์œ„ |
@@ -1699,6 +1726,8 @@ interface InvalidCell {
1699
1726
 
1700
1727
  #### Import ์˜ต์…˜ โ€” `ExcelImportOptions`
1701
1728
 
1729
+ `timeZone?: string`์€ ํ•ด๋‹น ํŒŒ์ผ์˜ ๋‚ ์งœ serial ํ•ด์„ ์‹œ๊ฐ„๋Œ€๋ฅผ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ „ UTC ํŒŒ์ผ์€ `{ timeZone: 'UTC' }`๋กœ ๊ฐ€์ ธ์˜ค์„ธ์š”. `previewExcel(file, { timeZone })`๋„ ๊ฐ™์€ ์˜ต์…˜์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
1730
+
1702
1731
  ##### ๊ธฐ๋ณธ ์˜ต์…˜
1703
1732
 
1704
1733
  | ํ•„๋“œ | ํƒ€์ž… | ๊ธฐ๋ณธ๊ฐ’ | ์„ค๋ช… |
@@ -2244,12 +2273,37 @@ grid.off('cell:click', handler);
2244
2273
  |--------|---------|------|
2245
2274
  | `cell:click` | `{ row, columnId, value, event }` | ์…€ ํด๋ฆญ |
2246
2275
  | `cell:dblclick` | `{ row, columnId, value, event }` | ์…€ ๋”๋ธ”ํด๋ฆญ |
2247
- | `cell:change` | `{ rowIndex, rowId, columnId, oldValue, newValue }` | ์…€ ๊ฐ’ ๋ณ€๊ฒฝ. `rowId`๋Š” ์ •๋ ฌ/ํ•„ํ„ฐ ๋ฌด๊ด€ ์•ˆ์ • ์‹๋ณ„์ž(์ •๊ทœํ™”๋œ ๋ฌธ์ž์—ด) โ€” cascade ๋“ฑ rowId ๊ธฐ๋ฐ˜ ๋กœ์ง์˜ ํŠธ๋ฆฌ๊ฑฐ๋กœ ์‚ฌ์šฉ |
2276
+ | `cell:change` | `{ rowIndex, rowId, columnId, oldValue, newValue }` | ์—๋””ํ„ฐ ํŽธ์ง‘์— ๋”ฐ๋ฅธ ์…€ ๊ฐ’ ๋ณ€๊ฒฝ. APIยท๋ถ™์—ฌ๋„ฃ๊ธฐยทundo/redo๋ฅผ ๋ชจ๋‘ ๊ด€์ฐฐํ•˜๋Š” ์ด๋ฒคํŠธ๊ฐ€ ์•„๋‹˜. `rowId`๋Š” ์ •๋ ฌ/ํ•„ํ„ฐ ๋ฌด๊ด€ ์•ˆ์ • ์‹๋ณ„์ž |
2277
+ | `data:changed` | `DataMutationEvent` | ChangeTracker์— ๋ฐ˜์˜๋œ ์…€ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ. ์—๋””ํ„ฐ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ๋…๋ฆฝ์ ์ธ ์ถ”๊ฐ€ ์ด๋ฒคํŠธ (์•„๋ž˜ ๊ณ„์•ฝ ์ฐธ์กฐ) |
2278
+ | `changes:changed` | `{ hasChanges, addedCount, deletedCount }` | ๊ธฐ์กด dirty ์ƒํƒœ ์š”์•ฝ. ์‹ ๊ทœ ํ–‰ ์…€ ์ˆ˜์ •๋„ ๋ฐœํ–‰ํ•˜๋ฉฐ ์ƒ์„ธ ๊ฐ’์€ `data:changed`๋กœ ๊ตฌ๋… |
2248
2279
  | `cell:beforeEdit` | `{ ..., cancel() }` | ํŽธ์ง‘ ์‹œ์ž‘ ์ „ (์ทจ์†Œ ๊ฐ€๋Šฅ) |
2249
2280
  | `cell:editCommitting` | `{ ..., cancel() }` | ํŽธ์ง‘ ์ปค๋ฐ‹ ์ „ (์ทจ์†Œ ๊ฐ€๋Šฅ) |
2250
2281
  | `cell:editCommitted` | `{ rowIndex, rowId, dataIndex, columnId, oldValue, newValue }` | ํŽธ์ง‘ ์ปค๋ฐ‹ ์™„๋ฃŒ. `rowId` ํฌํ•จ (์œ„์™€ ๋™์ผ) โ€” boolean ์…€ ์ฆ‰์‹œ ํ† ๊ธ€๋„ ์ด ์ด๋ฒคํŠธ๋กœ ๋ฐœํ™”๋˜์–ด ์ฒดํฌ๋ฐ•์Šค cascade ํŠธ๋ฆฌ๊ฑฐ๋กœ ์“ฐ์ธ๋‹ค |
2251
2282
  | `cell:tooltip` | `CellTooltipPayload` (์•„๋ž˜ ์ฐธ์กฐ) | ์…€ยท์ปฌ๋Ÿผ ํ—ค๋” ํ˜ธ๋ฒ„ ์‹œ ํˆดํŒ ํ‘œ์‹œ ์š”์ฒญ (`tooltipMode` ๋กœ ๋ฐœํ–‰ ์ œ์–ด) |
2252
2283
 
2284
+ **`DataMutationEvent` โ€” ์…€ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ๊ณ„์•ฝ**
2285
+
2286
+ ```ts
2287
+ interface DataMutationEvent {
2288
+ source: 'api' | 'edit' | 'paste' | 'undo' | 'redo' | 'import';
2289
+ changes: Array<{
2290
+ rowId: string | number;
2291
+ field: string;
2292
+ oldValue: CellValue;
2293
+ newValue: CellValue;
2294
+ sourceIndex?: number;
2295
+ }>;
2296
+ }
2297
+ ```
2298
+
2299
+ - `oldValue`๋Š” ์ตœ์ดˆ ์›๋ณธ์ด ์•„๋‹ˆ๋ผ **๋ฐ”๋กœ ์ด์ „ ์œ ํšจ ๊ฐ’**, `newValue`๋Š” ์ด๋ฒˆ ์ž‘์—…์ด ๋ฐ˜์˜ํ•œ ๊ฐ’์ž…๋‹ˆ๋‹ค. Undo๋Š” ์ด์ „ ๊ฐ’์œผ๋กœ ๋˜๋Œ์•„๊ฐ€๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
2300
+ - `field`๋Š” ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ํ•„๋“œ์ž…๋‹ˆ๋‹ค. ํ‘œ์‹œ ์ปฌ๋Ÿผ IDยทํ–‰ view index์™€ ํ˜ผ๋™ํ•˜์ง€ ๋งˆ์„ธ์š”. `sourceIndex`๋Š” ํ˜ธ์ถœ์ž๊ฐ€ ์•„๋Š” ๊ฒฝ์šฐ๋งŒ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
2301
+ - ์ผ๋ฐ˜ ์…€ ๋ช…๋ น์€ ๋ณ€๊ฒฝ 1๊ฐœ๋ฅผ ๋ฐœํ–‰ํ•ฉ๋‹ˆ๋‹ค. Undo batch๋Š” ํ•˜๋‚˜์˜ undo ๋‹จ์œ„์ด์ง€๋งŒ ์…€ ์ด๋ฒคํŠธ๋ฅผ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. `beginBulkImport`/`endBulkImport` ๊ตฌ๊ฐ„์€ ์‹ค์ œ ๋ณ€๊ฒฝ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•œ `source: 'import'` ๋ณ€๊ฒฝ ๋ฌถ์Œ์„ ์ข…๋ฃŒ ์‹œ ํ•œ ๋ฒˆ ๋ฐœํ–‰ํ•ฉ๋‹ˆ๋‹ค.
2302
+ - ํ˜„์žฌ ๊ฐ’๊ณผ `Object.is`๋กœ ๊ฐ™์€ ์“ฐ๊ธฐ๋Š” ์ด๋ฒคํŠธยทdirty ๋ฒ„์ „ยทundo ๊ธฐ๋ก์„ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ญ์ œ ์˜ˆ์ • ํ–‰์— ๋Œ€ํ•œ ์“ฐ๊ธฐ๋„ ๋ฐ์ดํ„ฐ ์ด๋ฒคํŠธ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
2303
+ - ์ด ์ด๋ฒคํŠธ๋Š” **์…€ ๊ฐ’ ์“ฐ๊ธฐ** ๊ณ„์•ฝ์ด๋ฉฐ ํ–‰ ์ถ”๊ฐ€/์‚ญ์ œ/์žฌ์ •๋ ฌ, commit/discard, ๋ฐ์ดํ„ฐ ์ „์ฒด ๊ต์ฒด๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์ด๋ฒคํŠธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํ•ด๋‹น ์ƒํƒœ๋Š” ๊ธฐ์กด ํ–‰ ์ด๋ฒคํŠธยท`changes:changed`ยทundo/redo ์ด๋ฒคํŠธ๋กœ ๊ตฌ๋…ํ•ฉ๋‹ˆ๋‹ค.
2304
+ - ์‹ ๊ทœ ํ–‰์˜ ์ž„์‹œ ์‹๋ณ„์ž๋Š” key ํ•„๋“œ๋ฅผ ์ˆ˜์ •ํ•ด๋„ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ํ–‰ ๊ฒ€์ฆ์€ ์„ค์ •๋œ ๋‹จ์ผ/๋ณตํ•ฉ key resolver๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋‹ค๋ฅธ ํ–‰ ๋ฐ์ดํ„ฐยท์ž˜๋ชป๋œ originalDataยทpartial seed๋Š” ์—ฌ์ „ํžˆ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.
2305
+ - ์•Œ๋ฆผ์€ ChangeTracker ๋ฐ˜์˜ ์‹œ์ ์ž…๋‹ˆ๋‹ค. **processor ๋™๊ธฐํ™”๋ณด๋‹ค ๋จผ์ € ๋™๊ธฐ์ ์œผ๋กœ ๋ฐœํ–‰๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ**, ํ•ธ๋“ค๋Ÿฌ์—์„œ๋Š” payload์˜ `oldValue`/`newValue`๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. API ํ˜ธ์ถœ์˜ ์™„๋ฃŒ ํ›„ ์ƒํƒœ๊ฐ€ ํ•„์š”ํ•˜๋ฉด ํ•ด๋‹น mutation API์˜ Promise๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์„ธ์š”. ์—”์ง„ ์žฌ์กฐํšŒยท๋น„๋™๊ธฐ ๋ Œ๋” ์™„๋ฃŒ ์‹ ํ˜ธ๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์ทจ์†Œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. `cell:beforeEdit`/`cell:editCommitting`/`cell:editCommitted`์˜ ์˜๋ฏธ๋Š” ๋ฐ”๋€Œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
2306
+
2253
2307
  **`CellTooltipPayload`** (26cd68a ์ปค๋ฐ‹์—์„œ validation ์ •๋ณด ํ†ตํ•ฉ)
2254
2308
 
2255
2309
  | ํ•„๋“œ | ํƒ€์ž… | ์„ค๋ช… |
@@ -4011,7 +4065,7 @@ const grid = new PureSheet(el, {
4011
4065
 
4012
4066
  | ์š”์†Œ | ํ‘œ๊ธฐ |
4013
4067
  |---|---|
4014
- | ์ปฌ๋Ÿผ ์ฐธ์กฐ | `[์ปฌ๋Ÿผํ—ค๋”]`(ํ‘œ์‹œ) / `$id`(์ €์žฅ) โ€” ๊ณต๋ฐฑยทํ•œ๊ธ€ ํ—ค๋” ์ง€์› |
4068
+ | ์ปฌ๋Ÿผ ์ฐธ์กฐ | `[์ปฌ๋Ÿผํ—ค๋”]`(ํ‘œ์‹œ) / `$id` ๋˜๋Š” `$["๋ณ€๋™ ์ƒํƒœ"]`(์ €์žฅ) โ€” ๊ณต๋ฐฑยทํŠน์ˆ˜๋ฌธ์ž ID ์ง€์› |
4015
4069
  | ๋…ผ๋ฆฌ | `AND` / `OR` / `NOT` ๋˜๋Š” `&&` / `\|\|` / `!` |
4016
4070
  | ๋น„๊ต | `==` `!=` `>` `>=` `<` `<=` |
4017
4071
  | ๋ฌธ์ž์—ด | `CONTAINS` `NOT_CONTAINS` `STARTS_WITH` `ENDS_WITH` `LIKE` `IS_EMPTY` `IS_NOT_EMPTY` |
@@ -4043,6 +4097,16 @@ const grid = new PureSheet(el, {
4043
4097
 
4044
4098
  > ๋ผ๋ฒจ์ด ๋ฐ”๋€Œ์–ด๋„(๋‹ค๊ตญ์–ดยทํ—ค๋” ํŽธ์ง‘) **๊ฐ™์€ ์ €์žฅ๋ณธ์ด ๋Š˜ ํ˜„์žฌ ๋ผ๋ฒจ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.** ํ•„ํ„ฐ ํ‰๊ฐ€๋Š” ์ €์žฅ ํ‘œ๊ธฐ(`$id`)๋ฅผ ๊ทธ๋Œ€๋กœ ์“ฐ๋ฏ€๋กœ ๋ผ๋ฒจ ๋ณ€๊ฒฝ์ด ์กฐ๊ฑด์„ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
4045
4099
 
4100
+ **๊ณต๋ฐฑยทํŠน์ˆ˜๋ฌธ์ž ID (ITSM-2026-002900)**
4101
+
4102
+ - ๊ธฐ์กด ์˜๋ฌธยท์ˆซ์žยทํ•œ๊ธ€ยท๋ฐ‘์ค„ ID๋Š” `$simple_id`๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์™ธ ID๋Š” `$[JSON ๋ฌธ์ž์—ด]`๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ID ์ž์ฒด๋ฅผ trim/์น˜ํ™˜/์ •๊ทœํ™”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
4103
+ - ์˜ˆ: ID๊ฐ€ `๋ณ€๋™ ์ƒํƒœ`๋ฉด `$["๋ณ€๋™ ์ƒํƒœ"] CONTAINS "์ฆ๊ฐ€"`, ID๊ฐ€ `a"b]c`๋ฉด `$["a\"b]c"] IS_NOT_EMPTY`์ž…๋‹ˆ๋‹ค. JSON ํฐ๋”ฐ์˜ดํ‘œ์™€ ์ด์Šค์ผ€์ดํ”„ ๊ทœ์น™์„ ์“ฐ๋ฉฐ ๋นˆ ID๋Š” ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
4104
+ - Lexer/๊ฒ€์ฆ/ํ‰๊ฐ€์™€ `astToFormula`๋Š” ๊ฐ™์€ ๋ฐ”์ธ๋”ฉ AST๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด ์•ˆ์˜ `$`๋‚˜ `[]`๋Š” ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. `$a-$b`๋Š” ๊ณ„์† ๋‘ ์ปฌ๋Ÿผ์˜ ๋บ„์…ˆ์ž…๋‹ˆ๋‹ค.
4105
+ - ํ˜„์žฌ ๋ผ๋ฒจ์ด ์ค‘๋ณต์ด๊ฑฐ๋‚˜ `]`/์•ž๋’ค ๊ณต๋ฐฑ/๋นˆ ๋ฌธ์ž์—ด ๋•Œ๋ฌธ์— ๋ผ๋ฒจ ํ‘œ๊ธฐ๋กœ ์™•๋ณตํ•  ์ˆ˜ ์—†์œผ๋ฉด ํ™”๋ฉด์—๋„ ๋ช…์‹œ์  ID ํ‘œ๊ธฐ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
4106
+ - `FormulaRefIssue.reason`์€ `unknown`, `ambiguous`, `syntax`์ž…๋‹ˆ๋‹ค. ํ† ํฐํ™” ์‹คํŒจ๋Š” ์›๋ฌธ๊ณผ `syntax` ์ด์Šˆ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€ํ™˜ ์„ฑ๊ณต ์—ฌ๋ถ€๋งŒ์œผ๋กœ ์ˆ˜์‹ ์œ ํšจ์„ฑ์„ ํŒ๋‹จํ•˜์ง€ ๋ง๊ณ  **๋ณ€ํ™˜ ํ›„ `validateFormula`**๋„ ํ™•์ธํ•˜์„ธ์š”.
4107
+ - ๊ธฐ์กด์˜ ์ž˜๋ชป๋œ ์ €์žฅ๋ณธ `$๋ณ€๋™ ์ƒํƒœ โ€ฆ`๋Š” ์ž๋™์œผ๋กœ ์ถ”์ธก ๋ณต๊ตฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์›๋ฌธ์„ ๋ณด์กดํ•˜๊ณ  ํŽธ์ง‘๊ธฐ์—์„œ ์˜ค๋ฅ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ปฌ๋Ÿผ์„ ๋‹ค์‹œ ์„ ํƒํ•˜๊ฑฐ๋‚˜ `$["๋ณ€๋™ ์ƒํƒœ"]`๋กœ ๋ช…์‹œ์ ์œผ๋กœ ๊ณ ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์กฐ๊ฑด๋ถ€ ์„œ์‹์—์„œ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์œผ๋ฉด ๊ทœ์น™ ์ „์ฒด ์ ์šฉ์„ ๋ง‰๊ณ  ์ด์ „ ์ ์šฉ๋ณธ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
4108
+ - ์ƒˆ ํ‘œ๊ธฐ๋ฅผ ์ฝ์ง€ ๋ชปํ•˜๋Š” ๊ตฌ๋ฒ„์ „ Core๋กœ ๋˜๋Œ๋ฆฌ๋ฉด ํ•ด๋‹น ์ˆ˜์‹์€ ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Core์™€ ๊ณต์šฉ wrapper๋ฅผ ํ•จ๊ป˜ ๋ฐฐํฌํ•˜๊ณ , ์†Œ๋น„์ฒ˜ ์—…๊ทธ๋ ˆ์ด๋“œ ์ „์—๋Š” ์ƒˆ ์ €์žฅ๋ณธ์„ ๊ณต์œ ํ•˜์ง€ ๋งˆ์„ธ์š”.
4109
+
4046
4110
  ---
4047
4111
 
4048
4112
  ### ๊ฐ’ ๋ชฉ๋ก ์œ„์ ฏ โ€” ValueCheckList
@@ -6,6 +6,30 @@
6
6
  > ๐Ÿ“‹ **์ด ๋ฌธ์„œ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ ๋ž˜ํผ ํ‘œ๋ฉด๋งŒ ๋‹ค๋ฃน๋‹ˆ๋‹ค.** ์ฝ”์–ด ๊ทธ๋ฆฌ๋“œ ์„ค์ •(`PureSheetConfig` ํ•„๋“œ), ์ฝ”์–ด ํƒ€์ž…, ์ด๋ฒคํŠธ ํŽ˜์ด๋กœ๋“œ ํ˜•ํƒœ๋Š” ์ฝ”์–ด ๋ ˆํผ๋Ÿฐ์Šค์— ์žˆ์Šต๋‹ˆ๋‹ค โ†’ [reference.md](reference.md)
7
7
  > ๐Ÿ“‹ ์‚ฌ์šฉ ์˜ˆ์ œ ์ฝ”๋“œ๋Š” [examples.md](examples.md) ์ฐธ์กฐ
8
8
 
9
+ ## ๊ณตํ†ต ์„ค์ • Provider
10
+
11
+ ```vue
12
+ <script setup lang="ts">
13
+ import { reactive } from 'vue';
14
+ import { MozGrid, MozGridConfigProvider, type MozGridConfig } from '@vmscloud/moz-ui-grid-vue';
15
+ const gridConfig = reactive<MozGridConfig>({ locale: 'ko', timeZone: 'Asia/Seoul' });
16
+ </script>
17
+ <template>
18
+ <MozGridConfigProvider :config="gridConfig">
19
+ <MozGrid :core-config="{ fields, data }" />
20
+ <MozGrid :core-config="{ fields, data, timeZone: 'UTC' }" locale="en" />
21
+ </MozGridConfigProvider>
22
+ </template>
23
+ ```
24
+
25
+ `MozGridConfig`๋Š” `{ locale?: string; timeZone?: string }`์ž…๋‹ˆ๋‹ค. `useMozGridConfig()`๋Š” ๋ณ‘ํ•ฉ ์„ค์ •์˜ reactive `Ref<MozGridConfig>`๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. `MOZ_GRID_CONFIG_KEY`๋„ ๊ณต๊ฐœ export์ž…๋‹ˆ๋‹ค.
26
+
27
+ ์‹œ๊ฐ„๋Œ€๋Š” **๊ฐœ๋ณ„ `coreConfig.timeZone` > provider > ๋ฏธ์ง€์ • ๊ธฐ๋ณธ๊ฐ’**, ์–ธ์–ด๋Š” **๊ฐœ๋ณ„ `locale` prop > `coreConfig.locale` > provider > ๊ธฐ์กด ๊ธฐ๋ณธ๊ฐ’**์ž…๋‹ˆ๋‹ค. ์ค‘์ฒฉ provider์˜ undefined ํ•„๋“œ๋Š” ์ƒ์œ„์—์„œ ์ƒ์†ํ•ฉ๋‹ˆ๋‹ค. Config ๊ฐ์ฒด ๊ต์ฒด์™€ reactive ํ•„๋“œ ๋ณ€๊ฒฝ ๋ชจ๋‘ ๋ฐ˜์˜๋˜๋ฉฐ, ๋ช…์‹œ๋œ ๊ฐœ๋ณ„ ์„ค์ •์€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
28
+
29
+ `MozGridLocaleProvider`๋Š” deprecated ํ˜ธํ™˜ API์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด `locale` prop ๋ฐ `useMozGridLocale`/`MOZ_GRID_LOCALE_KEY`๋Š” ์œ ์ง€๋˜๋ฉฐ ์ƒˆ provider์™€ ํ˜ผ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ ๊ทœ ์ฝ”๋“œ๋Š” `MozGridConfigProvider :config="{ locale, timeZone }"`๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
30
+
31
+ ๋ฏธ์ง€์ •์€ ๊ธฐ์กด ๋กœ์ปฌ ํ‘œ์‹œ/UTC IO์ด๋ฉฐ, ๋ช…์‹œ๋Š” ๊ฐ™์€ zone์œผ๋กœ ๋‚ ์งœ ํ‘œ์‹œ์™€ XLSX IO๋ฅผ ๋งž์ถฅ๋‹ˆ๋‹ค. Offsetless ๋ฌธ์ž์—ดยทDSTยทIO override ๊ณ„์•ฝ์€ [์ฝ”์–ด ๋‚ ์งœ ์‹œ๊ฐ„๋Œ€ ๊ณ„์•ฝ](reference.md#๋‚ ์งœ-์‹œ๊ฐ„๋Œ€-๊ณ„์•ฝ-timezone)์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
32
+
9
33
  ## ๋ชฉ์ฐจ
10
34
 
11
35
  - [๊ฐœ์š”](#๊ฐœ์š”)
@@ -372,6 +396,16 @@ type PivotSourceField = PivotRowField & PivotColumnField & PivotValueField;
372
396
 
373
397
  ## Emits
374
398
 
399
+ ### ์ค€๋น„ ์™„๋ฃŒยท์žฌ์ƒ์„ฑยท์„œ์‹ ์ฝœ๋ฐฑ
400
+
401
+ - `@ready(grid, chrome)`๋Š” ํ˜„์žฌ ์ธ์Šคํ„ด์Šค์˜ ์ฝ”์–ด ์ดˆ๊ธฐํ™”์™€ reinit ์ƒํƒœ ๋ณต์› ๋’ค์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. unmount๋‚˜ ๋‹ค์Œ reinit์œผ๋กœ ํ๊ธฐ๋œ ์ธ์Šคํ„ด์Šค์˜ ๋Œ€๊ธฐ ์ž‘์—…์€ ๋ณต์›ยทemit์„ ์ด์–ด์„œ ์‹คํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ธ์Šคํ„ด์Šค์˜ ์ดˆ๊ธฐํ™” ์‹คํŒจ๋Š” ์ฝ˜์†” ์˜ค๋ฅ˜๋กœ ๋ณด๊ณ ํ•˜๊ณ  `ready`๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
402
+ - ์„ค์ • watch๋Š” mount ํ›… ์•ˆ์—์„œ **๋™๊ธฐ ๋“ฑ๋ก**๋ฉ๋‹ˆ๋‹ค. ์ฒซ `ready`๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ์˜ prop ๋ณ€๊ฒฝ๋„ ๋ฐ˜์˜ํ•˜๋ฉฐ, unmount ์‹œ Vue์˜ ์ปดํฌ๋„ŒํŠธ scope์™€ ํ•จ๊ป˜ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.
403
+ - `ready()`๋Š” `waitForReady()`์˜ ์ดˆ๊ธฐํ™” ์™„๋ฃŒ๋ฅผ ๋œปํ•˜๋ฉฐ `coreConfig.data`๋กœ ์‹œ์ž‘๋œ ๋ชจ๋“  ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ์™„๋ฃŒ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์™„๋ฃŒ๋Š” `@data:loaded` ๋˜๋Š” ์ง์ ‘ ํ˜ธ์ถœํ•œ `await grid.loadData(rows)`๋กœ ํ™•์ธํ•˜์„ธ์š”.
404
+ - `coreConfig.formatRow` / `formatHeader`๋Š” ์ฒซ ๋ Œ๋” ์ „์— ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์ฐธ์กฐ ๊ต์ฒดยท์ถ”๊ฐ€ยท์ œ๊ฑฐ๋Š” ์žฌ์ƒ์„ฑ ์—†์ด `_config` ํ•ธ๋“ค๋Ÿฌ๋งŒ ๊ฐฑ์‹ ํ•˜๊ณ  `grid.refresh()`๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋„ค์ž„๋“œ ํ•ธ๋“ค๋Ÿฌ๋Š” ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
405
+ - `@ready`์—์„œ `grid.formatRow.addHandler('my-format', handler)`๋กœ ์ง์ ‘ ๋“ฑ๋กํ•˜๋ฉด ๋‹ค์Œ ๋ Œ๋”๋ถ€ํ„ฐ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ํ–‰์—๋„ ๋ฐ”๋กœ ์ ์šฉํ•˜๋ ค๋ฉด ๋“ฑ๋ก ๋’ค `await grid.refresh()`๋ฅผ ํ˜ธ์ถœํ•˜์„ธ์š”. ๋“ฑ๋ก ์ž์ฒด๋Š” ์ž๋™ repaint๋ฅผ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. `formatHeader`๋„ ๋™์ผํ•˜๋ฉฐ ์Šคํฌ๋กค๋งŒ์œผ๋กœ ํ—ค๋”๊ฐ€ ๋‹ค์‹œ ๊ทธ๋ ค์ง€์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
406
+ - ํ•ธ๋“ค๋Ÿฌ๋Š” ์ธ์Šคํ„ด์Šค๋ณ„์ด๋ฏ€๋กœ ์ง์ ‘ ๋“ฑ๋ก์€ ๊ฐ `@ready`์—์„œ ๋ฐ˜๋ณตํ•˜์„ธ์š”. ์ œ๊ฑฐ๋Š” ์ดํ›„ ํ˜ธ์ถœ๋งŒ ๋ฉˆ์ถ”๋ฉฐ ์ž„์˜ DOM ๋ณ€๊ฒฝ์„ ์—ญ์œผ๋กœ ๋ณต์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒํƒœ์— ๋”ฐ๋ผ ์Šคํƒ€์ผ์„ ์ ์šฉ/ํ•ด์ œํ•˜๋Š” ๋Œ€์นญ์ ์ธ ์ฝœ๋ฐฑ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
407
+
408
+
375
409
  `MozGrid`๋Š” ์ด **32๊ฐœ** ์ด๋ฒคํŠธ๋ฅผ emitํ•ฉ๋‹ˆ๋‹ค: `defineEmits`๊ฐ€ ์„ ์–ธํ•˜๋Š” **31๊ฐœ**(๊ณ ์œ  emit 2๊ฐœ `ready`ยท`data:loaded` + ์ฝ”์–ด ์ธํ„ฐ๋ž™์…˜ ์ด๋ฒคํŠธ 29๊ฐœ) + `defineModel`์ด ๋งŒ๋“œ๋Š” ์•”์‹œ์  `update:coreConfig` 1๊ฐœ. ์ธํ„ฐ๋ž™์…˜ ์ด๋ฒคํŠธ 29๊ฐœ(`row:click` โ€ฆ `contextmenu`)๋Š” `defineEmits`์— ์„ ์–ธ๋จ๊ณผ ๋™์‹œ์— `FORWARD_EVENTS` ๋ฐฐ์—ด๋กœ ์ฝ”์–ด์—์„œ ์ผ๊ด„ ํฌ์›Œ๋”ฉ๋ฉ๋‹ˆ๋‹ค(`header:click`/`header:sortClick`/`header:filterClick` ํฌํ•จ โ€” ๋ณ„๋„ ๋ฐฐ์„ ์ด ์•„๋‹ˆ๋ผ ๊ฐ™์€ 29๊ฐœ). `ready`/`data:loaded`๋Š” ์–ด๋Œ‘ํ„ฐ๊ฐ€ ์ง์ ‘ ๋ฐฐ์„ (`ready`๋Š” `mountChrome`/`reinitChrome`์—์„œ, `data:loaded`๋Š” ์ „์šฉ ๊ตฌ๋…).
376
410
 
377
411
  > **ํŽ˜์ด๋กœ๋“œ ํ˜•ํƒœ** โ€” ์ธํ„ฐ๋ž™์…˜ ์ด๋ฒคํŠธ ํŽ˜์ด๋กœ๋“œ๋Š” Vue ์„ ์–ธ์ƒ `[payload: unknown]`์ด์ง€๋งŒ ๋Ÿฐํƒ€์ž„์—๋Š” **์ฝ”์–ด ์ด๋ฒคํŠธ ํŽ˜์ด๋กœ๋“œ**๋ฅผ ๊ทธ๋Œ€๋กœ ์šด๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ํ˜•ํƒœ๋Š” [reference.md ์ด๋ฒคํŠธ](reference.md#์ด๋ฒคํŠธ) ์ฐธ์กฐ.
@@ -387,7 +421,8 @@ type PivotSourceField = PivotRowField & PivotColumnField & PivotValueField;
387
421
  | `row:reordered` | `[payload: unknown]` | ์ฝ”์–ด ์ด๋ฒคํŠธ ํฌ์›Œ๋”ฉ |
388
422
  | `cell:click` | `[payload: unknown]` | ์ฝ”์–ด ์ด๋ฒคํŠธ ํฌ์›Œ๋”ฉ |
389
423
  | `cell:dblclick` | `[payload: unknown]` | ์ฝ”์–ด ์ด๋ฒคํŠธ ํฌ์›Œ๋”ฉ |
390
- | `cell:change` | `[payload: unknown]` | ์ฝ”์–ด ์ด๋ฒคํŠธ ํฌ์›Œ๋”ฉ |
424
+ | `cell:change` | `[payload: unknown]` | ์—๋””ํ„ฐ ์…€ ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ ํฌ์›Œ๋”ฉ |
425
+ | `data:changed` | `[payload: DataMutationEvent]` | APIยทํŽธ์ง‘ยท๋ถ™์—ฌ๋„ฃ๊ธฐยทundo/redo์˜ ์‹ค์ œ ์…€ ๋ณ€๊ฒฝ. ChangeTracker ๋ฐ˜์˜ ์‹œ์ ์ด๋ฉฐ processor ๋™๊ธฐํ™”/๋ Œ๋” ์™„๋ฃŒ ์‹ ํ˜ธ๊ฐ€ ์•„๋‹˜ |
391
426
  | `cell:beforeEdit` | `[payload: unknown]` | ์ฝ”์–ด ์ด๋ฒคํŠธ ํฌ์›Œ๋”ฉ |
392
427
  | `cell:editCommitting` | `[payload: unknown]` | ์ฝ”์–ด ์ด๋ฒคํŠธ ํฌ์›Œ๋”ฉ |
393
428
  | `cell:editCommitted` | `[payload: unknown]` | ์ฝ”์–ด ์ด๋ฒคํŠธ ํฌ์›Œ๋”ฉ |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vmscloud/moz-ui-grid-vue",
3
- "version": "0.2.6",
3
+ "version": "0.2.7",
4
4
  "description": "MozGrid - Vue 3 wrapping library for @vmscloud/moz-ui-grid-core",
5
5
  "license": "ISC",
6
6
  "type": "module",
@@ -80,7 +80,7 @@
80
80
  },
81
81
  "dependencies": {
82
82
  "@vmscloud/moz-ui-grid-core": "^0.1.46",
83
- "@vmscloud/moz-ui-grid-wrapper": "^0.1.18",
83
+ "@vmscloud/moz-ui-grid-wrapper": "^0.1.20",
84
84
  "bytebuffer": "^5.0.1",
85
85
  "crypto-js": "^4.2.0",
86
86
  "echarts": "^5.5.0",