velox-grid 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/CHANGELOG.md +483 -0
  2. package/README.md +755 -0
  3. package/dist/react/index.esm.js +3757 -0
  4. package/dist/react/index.esm.js.map +1 -0
  5. package/dist/react/index.js +7 -0
  6. package/dist/react/index.js.map +1 -0
  7. package/dist/react/react/VeloxGridReact.d.ts +33 -0
  8. package/dist/react/react/VeloxGridReact.d.ts.map +1 -0
  9. package/dist/react/react/index.d.ts +9 -0
  10. package/dist/react/react/index.d.ts.map +1 -0
  11. package/dist/react/react/types.d.ts +52 -0
  12. package/dist/react/react/types.d.ts.map +1 -0
  13. package/dist/react/react/useVeloxGrid.d.ts +23 -0
  14. package/dist/react/react/useVeloxGrid.d.ts.map +1 -0
  15. package/dist/react/types/index.d.ts +878 -0
  16. package/dist/react/types/index.d.ts.map +1 -0
  17. package/dist/types/core/GridColumnMenu.d.ts +35 -0
  18. package/dist/types/core/GridColumnMenu.d.ts.map +1 -0
  19. package/dist/types/core/GridDragManager.d.ts +83 -0
  20. package/dist/types/core/GridDragManager.d.ts.map +1 -0
  21. package/dist/types/core/GridEditorFactory.d.ts +33 -0
  22. package/dist/types/core/GridEditorFactory.d.ts.map +1 -0
  23. package/dist/types/core/GridFilterPopup.d.ts +43 -0
  24. package/dist/types/core/GridFilterPopup.d.ts.map +1 -0
  25. package/dist/types/core/GridHistory.d.ts +84 -0
  26. package/dist/types/core/GridHistory.d.ts.map +1 -0
  27. package/dist/types/core/GridRenderer.d.ts +73 -0
  28. package/dist/types/core/GridRenderer.d.ts.map +1 -0
  29. package/dist/types/core/GridSummary.d.ts +98 -0
  30. package/dist/types/core/GridSummary.d.ts.map +1 -0
  31. package/dist/types/core/GridTooltip.d.ts +43 -0
  32. package/dist/types/core/GridTooltip.d.ts.map +1 -0
  33. package/dist/types/core/GridValidator.d.ts +63 -0
  34. package/dist/types/core/GridValidator.d.ts.map +1 -0
  35. package/dist/types/core/VeloxGrid.d.ts +437 -0
  36. package/dist/types/core/VeloxGrid.d.ts.map +1 -0
  37. package/dist/types/core/index.d.ts +15 -0
  38. package/dist/types/core/index.d.ts.map +1 -0
  39. package/dist/types/index.d.ts +16 -0
  40. package/dist/types/index.d.ts.map +1 -0
  41. package/dist/types/react/VeloxGridReact.d.ts +40 -0
  42. package/dist/types/react/VeloxGridReact.d.ts.map +1 -0
  43. package/dist/types/react/index.d.ts +9 -0
  44. package/dist/types/react/index.d.ts.map +1 -0
  45. package/dist/types/react/types.d.ts +55 -0
  46. package/dist/types/react/types.d.ts.map +1 -0
  47. package/dist/types/react/useVeloxGrid.d.ts +54 -0
  48. package/dist/types/react/useVeloxGrid.d.ts.map +1 -0
  49. package/dist/types/types/index.d.ts +878 -0
  50. package/dist/types/types/index.d.ts.map +1 -0
  51. package/dist/types/utils/data.d.ts +41 -0
  52. package/dist/types/utils/data.d.ts.map +1 -0
  53. package/dist/types/utils/dom.d.ts +13 -0
  54. package/dist/types/utils/dom.d.ts.map +1 -0
  55. package/dist/types/utils/export.d.ts +60 -0
  56. package/dist/types/utils/export.d.ts.map +1 -0
  57. package/dist/types/utils/index.d.ts +4 -0
  58. package/dist/types/utils/index.d.ts.map +1 -0
  59. package/dist/types/vue/index.d.ts +9 -0
  60. package/dist/types/vue/index.d.ts.map +1 -0
  61. package/dist/types/vue/types.d.ts +68 -0
  62. package/dist/types/vue/types.d.ts.map +1 -0
  63. package/dist/types/vue/useVeloxGrid.d.ts +49 -0
  64. package/dist/types/vue/useVeloxGrid.d.ts.map +1 -0
  65. package/dist/velox-grid.css +1 -0
  66. package/dist/velox-grid.esm.js +3387 -0
  67. package/dist/velox-grid.esm.js.map +1 -0
  68. package/dist/velox-grid.iife.js +14 -0
  69. package/dist/velox-grid.iife.js.map +1 -0
  70. package/dist/velox-grid.js +14 -0
  71. package/dist/velox-grid.js.map +1 -0
  72. package/dist/vue/index.esm.js +3754 -0
  73. package/dist/vue/index.esm.js.map +1 -0
  74. package/dist/vue/index.js +7 -0
  75. package/dist/vue/index.js.map +1 -0
  76. package/dist/vue/types/index.d.ts +878 -0
  77. package/dist/vue/types/index.d.ts.map +1 -0
  78. package/dist/vue/vue/index.d.ts +9 -0
  79. package/dist/vue/vue/index.d.ts.map +1 -0
  80. package/dist/vue/vue/types.d.ts +65 -0
  81. package/dist/vue/vue/types.d.ts.map +1 -0
  82. package/dist/vue/vue/useVeloxGrid.d.ts +21 -0
  83. package/dist/vue/vue/useVeloxGrid.d.ts.map +1 -0
  84. package/package.json +120 -0
@@ -0,0 +1,878 @@
1
+ /**
2
+ * VeloxGrid Type Definitions v6.0
3
+ * @description Core types for the VeloxGrid library
4
+ * Phase 7: Selection Enhancement
5
+ * Phase 8: Excel Export/Import
6
+ * Phase 9: Keyboard Enhancement & Undo/Redo
7
+ * Phase 13: Summary/Aggregation
8
+ */
9
+ export type ValueType = 'text' | 'number' | 'boolean' | 'date' | 'datetime';
10
+ export type CellValue = string | number | boolean | Date | string[] | null | undefined;
11
+ export type RowData = Record<string, CellValue>;
12
+ export interface ValidationRule {
13
+ type: 'required' | 'min' | 'max' | 'minLength' | 'maxLength' | 'pattern' | 'custom';
14
+ value?: number | string | RegExp;
15
+ message: string;
16
+ validator?: (value: CellValue, row: RowData) => boolean | string;
17
+ }
18
+ export interface ValidationResult {
19
+ valid: boolean;
20
+ errors: Array<{
21
+ field: string;
22
+ message: string;
23
+ }>;
24
+ }
25
+ export type EditorType = 'text' | 'number' | 'select' | 'date' | 'checkbox' | 'custom';
26
+ export interface SelectOption {
27
+ value: CellValue;
28
+ label: string;
29
+ }
30
+ export interface EditorOptions {
31
+ /** Editor type */
32
+ type: EditorType;
33
+ /** Options for select editor */
34
+ options?: SelectOption[];
35
+ /** Min value for number editor */
36
+ min?: number;
37
+ /** Max value for number editor */
38
+ max?: number;
39
+ /** Step for number editor */
40
+ step?: number;
41
+ /** Date format string (e.g., 'YYYY-MM-DD') */
42
+ format?: string;
43
+ /** Custom renderer function */
44
+ renderer?: (cell: HTMLElement, value: CellValue, save: (v: CellValue) => void, cancel: () => void) => void;
45
+ /** Allow multiple selection (for select editor) */
46
+ multiple?: boolean;
47
+ /** Placeholder text */
48
+ placeholder?: string;
49
+ }
50
+ export interface ColumnDefinition {
51
+ /** Unique identifier for the column */
52
+ field: string;
53
+ /** Display name in header */
54
+ header: string;
55
+ /** Data type */
56
+ type?: ValueType;
57
+ /** Column width in pixels */
58
+ width?: number;
59
+ /** Minimum width */
60
+ minWidth?: number;
61
+ /** Maximum width */
62
+ maxWidth?: number;
63
+ /** Allow resize */
64
+ resizable?: boolean;
65
+ /** Allow sorting */
66
+ sortable?: boolean;
67
+ /** Allow filtering */
68
+ filterable?: boolean;
69
+ /** Allow editing */
70
+ editable?: boolean;
71
+ /** Text alignment */
72
+ align?: 'left' | 'center' | 'right';
73
+ /** Header alignment */
74
+ headerAlign?: 'left' | 'center' | 'right';
75
+ /** Custom formatter */
76
+ formatter?: (value: CellValue, row: RowData, column: ColumnDefinition) => string;
77
+ /** Custom renderer (returns HTML string) */
78
+ renderer?: (value: CellValue, row: RowData, column: ColumnDefinition) => string;
79
+ /** CSS class for cells */
80
+ cellClass?: string | ((value: CellValue, row: RowData) => string);
81
+ /** CSS class for header */
82
+ headerClass?: string;
83
+ /** Visible state */
84
+ visible?: boolean;
85
+ /** Fixed position */
86
+ fixed?: 'left' | 'right' | false;
87
+ /** Validation rules (Phase 12.1) */
88
+ validation?: ValidationRule[];
89
+ /** Custom editor options (Phase 12.2) */
90
+ editor?: EditorOptions;
91
+ /** Cell tooltip (Phase 12.3) - boolean for auto tooltip, function for custom */
92
+ tooltip?: boolean | ((value: CellValue, row: RowData) => string);
93
+ /** Summary configuration (Phase 13) */
94
+ summary?: SummaryConfig;
95
+ }
96
+ export type SelectionMode = 'none' | 'single' | 'multiple' | 'extended';
97
+ export type SelectionStyle = 'row' | 'cell' | 'block' | 'none';
98
+ export interface CellIndex {
99
+ rowIndex: number;
100
+ field: string;
101
+ }
102
+ export interface Selection {
103
+ style: SelectionStyle;
104
+ startRow: number;
105
+ endRow: number;
106
+ startColumn?: string;
107
+ endColumn?: string;
108
+ }
109
+ export interface CheckBarOptions {
110
+ /** Show checkbar */
111
+ visible: boolean;
112
+ /** Radio button style (single check only) */
113
+ exclusive?: boolean;
114
+ /** Show select all checkbox in header */
115
+ showAll?: boolean;
116
+ /** Display order (lower number = more left) - Phase 14.1 */
117
+ displayOrder?: number;
118
+ /** Callback to determine if row is checkable */
119
+ checkableCallback?: (rowData: RowData, rowIndex: number) => boolean;
120
+ }
121
+ export interface ExportOptions {
122
+ /** Filename without extension */
123
+ filename?: string;
124
+ /** Include header row */
125
+ includeHeader?: boolean;
126
+ /** Export only selected rows */
127
+ selectedOnly?: boolean;
128
+ /** Export only filtered/visible rows */
129
+ filteredOnly?: boolean;
130
+ /** Specific columns to export */
131
+ columns?: string[];
132
+ /** Sheet name for Excel */
133
+ sheetName?: string;
134
+ }
135
+ export interface ImportResult {
136
+ /** Imported data */
137
+ data: RowData[];
138
+ /** Column headers from imported file */
139
+ headers: string[];
140
+ /** Any errors during import */
141
+ errors: string[];
142
+ }
143
+ export type UndoActionType = 'cell_edit' | 'row_add' | 'row_remove' | 'row_update' | 'paste' | 'cut' | 'delete' | 'bulk_edit';
144
+ export interface UndoAction {
145
+ type: UndoActionType;
146
+ timestamp: number;
147
+ data: unknown;
148
+ }
149
+ export interface CellEditUndoData {
150
+ rowIndex: number;
151
+ field: string;
152
+ oldValue: CellValue;
153
+ newValue: CellValue;
154
+ }
155
+ export interface RowAddUndoData {
156
+ row: RowData;
157
+ index: number;
158
+ }
159
+ export interface RowRemoveUndoData {
160
+ row: RowData;
161
+ index: number;
162
+ }
163
+ export interface BulkEditUndoData {
164
+ changes: Array<{
165
+ rowIndex: number;
166
+ field: string;
167
+ oldValue: CellValue;
168
+ newValue: CellValue;
169
+ }>;
170
+ }
171
+ /** Context menu item type */
172
+ export type ContextMenuItemType = 'item' | 'separator' | 'submenu';
173
+ /** Context menu target type */
174
+ export type ContextMenuTarget = 'cell' | 'row' | 'header' | 'column';
175
+ /** Context for menu item callbacks */
176
+ export interface ContextMenuContext {
177
+ /** Row index (for cell/row context) */
178
+ rowIndex?: number;
179
+ /** Column field (for cell/header context) */
180
+ field?: string;
181
+ /** Row data (for cell/row context) */
182
+ rowData?: RowData;
183
+ /** Column definition (for cell/header context) */
184
+ column?: ColumnDefinition;
185
+ /** Selected rows */
186
+ selectedRows: number[];
187
+ /** Selected cells */
188
+ selectedCells: CellIndex[];
189
+ /** Grid instance */
190
+ grid: VeloxGridInstance;
191
+ }
192
+ /** Context menu item definition */
193
+ export interface ContextMenuItem {
194
+ /** Item type */
195
+ type?: ContextMenuItemType;
196
+ /** Unique identifier */
197
+ id?: string;
198
+ /** Display label */
199
+ label?: string;
200
+ /** Icon (emoji, HTML, or class name) */
201
+ icon?: string;
202
+ /** Keyboard shortcut hint */
203
+ shortcut?: string;
204
+ /** Disabled state or callback */
205
+ disabled?: boolean | ((context: ContextMenuContext) => boolean);
206
+ /** Visible state or callback */
207
+ visible?: boolean | ((context: ContextMenuContext) => boolean);
208
+ /** Click handler */
209
+ action?: (context: ContextMenuContext) => void;
210
+ /** Sub-menu items (for type: 'submenu') */
211
+ items?: ContextMenuItem[];
212
+ /** CSS class for the item */
213
+ className?: string;
214
+ }
215
+ /** Context menu configuration */
216
+ export interface ContextMenuOptions {
217
+ /** Enable context menu */
218
+ enabled?: boolean;
219
+ /** Cell/Row context menu items */
220
+ items?: ContextMenuItem[];
221
+ /** Header/Column context menu items */
222
+ headerItems?: ContextMenuItem[];
223
+ /** Show default menu items */
224
+ showDefaultItems?: boolean;
225
+ /** Custom class for menu container */
226
+ className?: string;
227
+ }
228
+ /**
229
+ * Row numbers options
230
+ * @description Options for displaying row numbers
231
+ */
232
+ export interface RowNumbersOptions {
233
+ /** Show row numbers */
234
+ visible: boolean;
235
+ /** Display order (lower number = more left) - Phase 14.1 */
236
+ displayOrder?: number;
237
+ }
238
+ /**
239
+ * Row drag options
240
+ * @description Options for row drag and drop
241
+ */
242
+ export interface RowDragOptions {
243
+ /** Enable row drag and drop */
244
+ enabled: boolean;
245
+ /** Display order (lower number = more left) - Phase 14.1 */
246
+ displayOrder?: number;
247
+ }
248
+ /**
249
+ * Column fixed options (RealGrid style)
250
+ * @description Options for fixing columns to left or right
251
+ */
252
+ export interface FixedOptions {
253
+ /**
254
+ * Number of columns to fix from left
255
+ * CheckBar, RowNumbers, DragHandle are counted separately
256
+ * @default 0
257
+ * @example
258
+ * fixedOptions: { colCount: 2 } // Fix first 2 data columns to left
259
+ */
260
+ colCount?: number;
261
+ /**
262
+ * Number of columns to fix from right
263
+ * @default 0
264
+ * @example
265
+ * fixedOptions: { rightCount: 1 } // Fix last 1 column to right
266
+ */
267
+ rightCount?: number;
268
+ }
269
+ /**
270
+ * 서버 요청 시 전달되는 파라미터
271
+ */
272
+ export interface DataRequestParams {
273
+ /** 현재 페이지 (1-based) */
274
+ page: number;
275
+ /** 페이지당 행 수 */
276
+ pageSize: number;
277
+ /** 정렬 상태 */
278
+ sort?: SortState[];
279
+ /** 필터 상태 */
280
+ filter?: FilterState | null;
281
+ }
282
+ /**
283
+ * 서버 응답 결과
284
+ */
285
+ export interface DataResponseResult {
286
+ /** 행 데이터 */
287
+ data: RowData[];
288
+ /** 전체 행 수 (페이지네이션 계산용) */
289
+ totalCount: number;
290
+ }
291
+ /**
292
+ * 페이지네이션 상태
293
+ */
294
+ export interface PaginationState {
295
+ /** 현재 페이지 (1-based) */
296
+ currentPage: number;
297
+ /** 페이지당 행 수 */
298
+ pageSize: number;
299
+ /** 전체 행 수 */
300
+ totalCount: number;
301
+ /** 전체 페이지 수 */
302
+ totalPages: number;
303
+ /** 로딩 중 여부 */
304
+ loading: boolean;
305
+ }
306
+ /**
307
+ * 페이지네이션 옵션
308
+ */
309
+ export interface PaginationOptions {
310
+ /** 페이지네이션 활성화 */
311
+ enabled: boolean;
312
+ /**
313
+ * 페이지네이션 모드
314
+ * - 'page': 일반 페이지 네비게이션 (기본값)
315
+ * - 'infinite': 스크롤 끝에 도달하면 다음 페이지 자동 로드
316
+ */
317
+ mode?: 'page' | 'infinite';
318
+ /** 페이지당 행 수 (default: 20) */
319
+ pageSize?: number;
320
+ /** 페이지 크기 변경 옵션 목록 */
321
+ pageSizeOptions?: number[];
322
+ /** 표시할 페이지 버튼 수 (default: 5) */
323
+ maxPageButtons?: number;
324
+ /** 페이지 정보 표시 (default: true) */
325
+ showInfo?: boolean;
326
+ /** 페이지 크기 셀렉터 표시 (default: false) */
327
+ showSizeChanger?: boolean;
328
+ /** Infinite scroll: 다음 페이지 로드를 트리거하는 스크롤 바닥 여유 (px, default: 100) */
329
+ infiniteScrollThreshold?: number;
330
+ }
331
+ /**
332
+ * 데이터 소스 설정
333
+ */
334
+ export interface DataSourceOptions {
335
+ /**
336
+ * 데이터 소스 타입
337
+ * - 'local': 클라이언트 측 데이터 (기본값, 기존 동작)
338
+ * - 'remote': 서버에서 데이터를 가져옴
339
+ */
340
+ type: 'local' | 'remote';
341
+ /**
342
+ * 서버 데이터 요청 함수 (type: 'remote' 시 필수)
343
+ * 정렬/필터/페이지 변경 시 자동 호출
344
+ */
345
+ fetch?: (params: DataRequestParams) => Promise<DataResponseResult>;
346
+ /**
347
+ * 초기 전체 행 수 (서버 측 페이지네이션 시 사용)
348
+ * fetch 응답의 totalCount로 자동 업데이트됨
349
+ */
350
+ totalCount?: number;
351
+ }
352
+ export interface GridOptions {
353
+ /** Column definitions */
354
+ columns: ColumnDefinition[];
355
+ /** Initial data */
356
+ data?: RowData[];
357
+ /** Grid width */
358
+ width?: number | string;
359
+ /** Grid height */
360
+ height?: number | string;
361
+ /** Row height in pixels */
362
+ rowHeight?: number;
363
+ /** Header height in pixels */
364
+ headerHeight?: number;
365
+ /** Show row numbers (boolean for backward compatibility, or RowNumbersOptions for advanced control) */
366
+ showRowNumbers?: boolean | RowNumbersOptions;
367
+ /** Enable row drag and drop to reorder (boolean for backward compatibility, or RowDragOptions for advanced control) */
368
+ rowDraggable?: boolean | RowDragOptions;
369
+ /** Enable row selection */
370
+ selectable?: boolean;
371
+ /** Selection mode (Phase 7) */
372
+ selectionMode?: SelectionMode;
373
+ /** Selection style (Phase 7) */
374
+ selectionStyle?: SelectionStyle;
375
+ /** Show checkbox column (deprecated: use checkBar) */
376
+ showCheckbox?: boolean;
377
+ /** CheckBar options (Phase 7) */
378
+ checkBar?: CheckBarOptions;
379
+ /** Enable sorting */
380
+ sortable?: boolean;
381
+ /** Enable filtering */
382
+ filterable?: boolean;
383
+ /** Enable editing */
384
+ editable?: boolean;
385
+ /** Enable column resize */
386
+ resizable?: boolean;
387
+ /** Enable virtual scrolling */
388
+ virtualScroll?: boolean;
389
+ /** Virtual scroll buffer size */
390
+ bufferSize?: number;
391
+ /** Theme name */
392
+ theme?: 'default' | 'dark' | string;
393
+ /** Locale */
394
+ locale?: string;
395
+ /** Empty data message */
396
+ emptyMessage?: string;
397
+ /** Loading state */
398
+ loading?: boolean;
399
+ /** Loading message */
400
+ loadingMessage?: string;
401
+ /** Custom CSS class */
402
+ className?: string;
403
+ /** Enable Undo/Redo (Phase 9) */
404
+ undoable?: boolean;
405
+ /** Max undo stack size (Phase 9) */
406
+ undoStackSize?: number;
407
+ /** Context menu options (Phase 10) */
408
+ contextMenu?: ContextMenuOptions;
409
+ /** Footer summary options (Phase 13) */
410
+ footerSummary?: FooterSummaryOptions;
411
+ /** Group summary options (Phase 13) */
412
+ groupSummary?: GroupSummaryOptions;
413
+ /** Fixed columns options (Phase 14) */
414
+ fixedOptions?: FixedOptions;
415
+ /** Data source options (Phase 18) */
416
+ dataSource?: DataSourceOptions;
417
+ /** Pagination options (Phase 18) */
418
+ pagination?: PaginationOptions;
419
+ }
420
+ export type SortDirection = 'asc' | 'desc' | null;
421
+ export interface SortState {
422
+ field: string;
423
+ direction: SortDirection;
424
+ }
425
+ export type FilterOperator = 'equals' | 'notEquals' | 'contains' | 'notContains' | 'startsWith' | 'endsWith' | 'greaterThan' | 'lessThan' | 'greaterThanOrEqual' | 'lessThanOrEqual' | 'between' | 'isEmpty' | 'isNotEmpty';
426
+ export interface FilterCondition {
427
+ field: string;
428
+ operator: FilterOperator;
429
+ value: CellValue;
430
+ value2?: CellValue;
431
+ }
432
+ export interface FilterState {
433
+ conditions: FilterCondition[];
434
+ logic: 'and' | 'or';
435
+ }
436
+ export interface SelectionState {
437
+ selectedRows: Set<number>;
438
+ selectedCells: Set<string>;
439
+ focusedCell: CellIndex | null;
440
+ selections: Selection[];
441
+ lastSelectedRow: number | null;
442
+ }
443
+ export interface CheckBarState {
444
+ checkedRows: Set<number>;
445
+ checkableRows: Set<number>;
446
+ }
447
+ /**
448
+ * Row State Type - CRUD tracking for each row
449
+ * @description Tracks the modification state of each row
450
+ * - none: No changes (original data)
451
+ * - created: Newly added row
452
+ * - updated: Modified row
453
+ * - deleted: Deleted row (marked for deletion)
454
+ * - createAndDeleted: Created then deleted (no server action needed)
455
+ */
456
+ export type RowStateType = 'none' | 'created' | 'updated' | 'deleted' | 'createAndDeleted';
457
+ /**
458
+ * Row State Management Interface
459
+ * @description Manages the state map for all rows
460
+ */
461
+ export interface RowStateManager {
462
+ /** Map of row data to their state */
463
+ rowStates: Map<RowData, RowStateType>;
464
+ }
465
+ /**
466
+ * Changes Result Interface
467
+ * @description Structure for getting all changes
468
+ */
469
+ export interface ChangesResult {
470
+ /** Newly created rows */
471
+ created: RowData[];
472
+ /** Modified rows */
473
+ updated: RowData[];
474
+ /** Deleted rows */
475
+ deleted: RowData[];
476
+ }
477
+ /** Summary aggregation function type */
478
+ export type SummaryFunction = 'sum' | 'avg' | 'count' | 'min' | 'max' | 'custom';
479
+ /** Summary position */
480
+ export type SummaryPosition = 'footer' | 'group';
481
+ /** Summary configuration for a column */
482
+ export interface SummaryConfig {
483
+ /** Aggregation function */
484
+ function: SummaryFunction;
485
+ /** Custom aggregation function */
486
+ customFunction?: (values: CellValue[], data: RowData[]) => CellValue;
487
+ /** Label text (for footer summary) */
488
+ label?: string;
489
+ /** Number format (e.g., '0,0.00' for decimal) */
490
+ format?: string;
491
+ /** Custom formatter */
492
+ formatter?: (value: CellValue) => string;
493
+ /** CSS class */
494
+ className?: string;
495
+ /** Align (default: column align) */
496
+ align?: 'left' | 'center' | 'right';
497
+ }
498
+ /** Footer summary options */
499
+ export interface FooterSummaryOptions {
500
+ /** Show footer summary row */
501
+ visible: boolean;
502
+ /** Height of footer row (default: rowHeight) */
503
+ height?: number;
504
+ /** Summary configuration for each column (field -> config) */
505
+ columns?: Record<string, SummaryConfig>;
506
+ /** CSS class for footer row */
507
+ className?: string;
508
+ }
509
+ /** Group summary options */
510
+ export interface GroupSummaryOptions {
511
+ /** Enable group summary */
512
+ enabled: boolean;
513
+ /** Group by field */
514
+ groupBy: string;
515
+ /** Show group header */
516
+ showHeader?: boolean;
517
+ /** Show group footer (summary row) */
518
+ showFooter?: boolean;
519
+ /** Summary configuration for each column */
520
+ columns?: Record<string, SummaryConfig>;
521
+ /** Custom group header renderer */
522
+ headerRenderer?: (groupValue: CellValue, count: number) => string;
523
+ /** Collapsed groups (groupValue -> collapsed) */
524
+ collapsed?: Set<CellValue>;
525
+ }
526
+ /** Summary calculation result */
527
+ export interface SummaryResult {
528
+ field: string;
529
+ function: SummaryFunction;
530
+ value: CellValue;
531
+ formattedValue: string;
532
+ }
533
+ export interface EditState {
534
+ editing: boolean;
535
+ rowIndex: number | null;
536
+ field: string | null;
537
+ originalValue: CellValue;
538
+ }
539
+ export interface CellEditEvent {
540
+ rowIndex: number;
541
+ field: string;
542
+ oldValue: CellValue;
543
+ newValue: CellValue;
544
+ row: RowData;
545
+ }
546
+ export interface GridEvents {
547
+ onDataChange?: (data: RowData[]) => void;
548
+ onRowAdd?: (row: RowData, index: number) => void;
549
+ onRowRemove?: (row: RowData, index: number) => void;
550
+ onRowUpdate?: (row: RowData, index: number, changes: Partial<RowData>) => void;
551
+ onSelectionChange?: (selectedRows: number[]) => void;
552
+ onRowSelect?: (rowIndex: number, selected: boolean) => void;
553
+ onAllSelect?: (selected: boolean) => void;
554
+ onCellClick?: (rowIndex: number, field: string, value: CellValue) => void;
555
+ onCellDoubleClick?: (rowIndex: number, field: string, value: CellValue) => void;
556
+ onRowClick?: (rowIndex: number, row: RowData) => void;
557
+ onRowDoubleClick?: (rowIndex: number, row: RowData) => void;
558
+ onCellSelect?: (cell: CellIndex, selected: boolean) => void;
559
+ onCellSelectionChange?: (cells: CellIndex[]) => void;
560
+ onCheckChange?: (rowIndex: number, checked: boolean) => void;
561
+ onCheckAllChange?: (checked: boolean) => void;
562
+ onSort?: (sortState: SortState[]) => void;
563
+ onFilter?: (filterState: FilterState) => void;
564
+ onCellEditStart?: (rowIndex: number, field: string, value: CellValue) => void;
565
+ onCellEditEnd?: (event: CellEditEvent) => void;
566
+ onCellEditCancel?: (rowIndex: number, field: string) => void;
567
+ onValidationError?: (event: {
568
+ rowIndex: number;
569
+ field: string;
570
+ value: CellValue;
571
+ errors: string[];
572
+ }) => void;
573
+ onCopy?: (data: string[][]) => void;
574
+ onPaste?: (data: string[][], startCell: CellIndex) => void;
575
+ onCut?: (data: string[][]) => void;
576
+ onKeyDown?: (event: KeyboardEvent, cell: CellIndex | null) => void;
577
+ onUndo?: (action: UndoAction) => void;
578
+ onRedo?: (action: UndoAction) => void;
579
+ onScroll?: (scrollTop: number, scrollLeft: number) => void;
580
+ onColumnResize?: (field: string, width: number) => void;
581
+ onColumnReorder?: (field: string, fromIndex: number, toIndex: number) => void;
582
+ onReady?: (grid: VeloxGridInstance) => void;
583
+ onDestroy?: () => void;
584
+ onPageChange?: (page: number, pageSize: number) => void;
585
+ onPageSizeChange?: (pageSize: number) => void;
586
+ }
587
+ export interface VeloxGridInstance {
588
+ destroy(): void;
589
+ refresh(): void;
590
+ getData(): RowData[];
591
+ setData(data: RowData[]): void;
592
+ getRow(index: number): RowData | null;
593
+ addRow(row: RowData, index?: number): void;
594
+ updateRow(index: number, data: Partial<RowData>): void;
595
+ removeRow(index: number): void;
596
+ clearData(): void;
597
+ getSelectedRows(): number[];
598
+ getSelectedData(): RowData[];
599
+ selectRow(index: number, selected?: boolean): void;
600
+ selectAll(selected?: boolean): void;
601
+ clearSelection(): void;
602
+ isRowSelected(index: number): boolean;
603
+ selectCell(rowIndex: number, field: string, selected?: boolean): void;
604
+ getSelectedCells(): CellIndex[];
605
+ setFocusedCell(rowIndex: number, field: string): void;
606
+ getFocusedCell(): CellIndex | null;
607
+ setSelection(selection: Selection): void;
608
+ getSelection(): Selection | null;
609
+ getSelectionData(): CellValue[][];
610
+ checkItem(index: number, checked?: boolean): void;
611
+ checkItems(indices: number[], checked?: boolean): void;
612
+ checkAll(checked?: boolean): void;
613
+ uncheckAll(): void;
614
+ getCheckedItems(): number[];
615
+ getCheckedData(): RowData[];
616
+ isItemChecked(index: number): boolean;
617
+ isItemCheckable(index: number): boolean;
618
+ checkRow(index: number, checked?: boolean): void;
619
+ getCheckedRows(): number[];
620
+ sort(field: string, direction?: SortDirection): void;
621
+ clearSort(): void;
622
+ getSortState(): SortState[];
623
+ filter(conditions: FilterCondition | FilterCondition[]): void;
624
+ clearFilter(): void;
625
+ getFilterState(): FilterState | null;
626
+ startEdit(rowIndex: number, field: string): void;
627
+ endEdit(save?: boolean): void;
628
+ cancelEdit(): void;
629
+ isEditing(): boolean;
630
+ getColumn(field: string): ColumnDefinition | null;
631
+ setColumnWidth(field: string, width: number): void;
632
+ showColumn(field: string): void;
633
+ hideColumn(field: string): void;
634
+ setColumns(columns: ColumnDefinition[]): void;
635
+ autoFitColumn(field: string): void;
636
+ autoFitAllColumns(): void;
637
+ scrollToRow(index: number): void;
638
+ scrollToTop(): void;
639
+ scrollToBottom(): void;
640
+ scrollToCell(rowIndex: number, field: string): void;
641
+ copy(): void;
642
+ paste(): void;
643
+ cut(): void;
644
+ undo(): boolean;
645
+ redo(): boolean;
646
+ canUndo(): boolean;
647
+ canRedo(): boolean;
648
+ clearHistory(): void;
649
+ deleteSelectedCells(): void;
650
+ deleteSelectedRows(): void;
651
+ exportToExcel(options?: ExportOptions): void;
652
+ exportToCSV(options?: ExportOptions): string;
653
+ downloadCSV(options?: ExportOptions): void;
654
+ exportToJSON(options?: ExportOptions): string;
655
+ downloadJSON(options?: ExportOptions): void;
656
+ importFromCSV(csvString: string, hasHeader?: boolean): ImportResult;
657
+ importFromExcel(file: File, sheetIndex?: number): Promise<ImportResult>;
658
+ getRowCount(): number;
659
+ getVisibleRowCount(): number;
660
+ getCellValue(rowIndex: number, field: string): CellValue;
661
+ setCellValue(rowIndex: number, field: string, value: CellValue): void;
662
+ getSummaryValue(field: string): CellValue;
663
+ getSummaryValues(): Record<string, CellValue>;
664
+ refreshSummary(): void;
665
+ getRowState(index: number): RowStateType;
666
+ getRowStateByData(row: RowData): RowStateType;
667
+ setRowState(index: number, state: RowStateType): void;
668
+ getChanges(): ChangesResult;
669
+ getCreatedRows(): RowData[];
670
+ getUpdatedRows(): RowData[];
671
+ getDeletedRows(): RowData[];
672
+ clearRowStates(): void;
673
+ commit(): void;
674
+ setOptions(options: Partial<GridOptions>): void;
675
+ getOptions(): GridOptions;
676
+ goToPage(page: number): void;
677
+ setPageSize(pageSize: number): void;
678
+ getPaginationState(): PaginationState;
679
+ fetchData(): Promise<void>;
680
+ }
681
+ export interface GridState {
682
+ data: RowData[];
683
+ displayData: RowData[];
684
+ columns: ColumnDefinition[];
685
+ selection: SelectionState;
686
+ checkBar: CheckBarState;
687
+ rowStates: Map<RowData, RowStateType>;
688
+ sort: SortState[];
689
+ filter: FilterState | null;
690
+ edit: EditState;
691
+ pagination: PaginationState;
692
+ scroll: {
693
+ top: number;
694
+ left: number;
695
+ };
696
+ }
697
+ export interface RenderContext {
698
+ startIndex: number;
699
+ endIndex: number;
700
+ visibleColumns: ColumnDefinition[];
701
+ rowHeight: number;
702
+ headerHeight: number;
703
+ totalHeight: number;
704
+ totalWidth: number;
705
+ }
706
+ /**
707
+ * GridContext - VeloxGrid 내부 모듈들이 사용하는 컨텍스트 인터페이스
708
+ *
709
+ * 모듈들이 VeloxGrid 클래스에 직접 의존하지 않고 이 인터페이스를 통해 접근
710
+ * 순환 참조 방지 및 테스트 용이성 향상을 위한 설계
711
+ */
712
+ export interface GridContext {
713
+ readonly rootElement: HTMLElement;
714
+ readonly headerElement: HTMLElement;
715
+ readonly bodyElement: HTMLElement;
716
+ readonly bodyInner: HTMLElement;
717
+ readonly footerElement: HTMLElement | null;
718
+ readonly fixedLeftContainer: HTMLElement | null;
719
+ readonly fixedLeftHeader: HTMLElement | null;
720
+ readonly fixedLeftBody: HTMLElement | null;
721
+ readonly fixedLeftBodyInner: HTMLElement | null;
722
+ readonly fixedLeftFooter: HTMLElement | null;
723
+ readonly fixedRightContainer: HTMLElement | null;
724
+ readonly fixedRightHeader: HTMLElement | null;
725
+ readonly fixedRightBody: HTMLElement | null;
726
+ readonly fixedRightBodyInner: HTMLElement | null;
727
+ readonly fixedRightFooter: HTMLElement | null;
728
+ readonly loadingOverlay: HTMLElement | null;
729
+ /** 그리드 옵션 반환 */
730
+ getOptions(): GridOptions;
731
+ /** 그리드 상태 반환 */
732
+ getState(): GridState;
733
+ /** 이벤트 핸들러 반환 */
734
+ getEvents(): GridEvents;
735
+ /** 그리드 고유 ID 반환 */
736
+ getGridId(): string;
737
+ /** 페이지네이션 상태 반환 (Phase 18) */
738
+ getPaginationState(): PaginationState;
739
+ /** Remote 데이터 소스 여부 (Phase 18) */
740
+ isRemoteDataSource(): boolean;
741
+ /** 모든 visible 컬럼 반환 (cached) */
742
+ getVisibleColumns(): ColumnDefinition[];
743
+ /** 왼쪽 고정 컬럼 반환 (Special columns + fixedOptions.colCount data columns - cached) Phase 14 */
744
+ getFixedLeftColumns(): ColumnDefinition[];
745
+ /** 오른쪽 고정 컬럼 반환 (based on fixedOptions.rightCount - cached) Phase 14 */
746
+ getFixedRightColumns(): ColumnDefinition[];
747
+ /** 스크롤 가능 컬럼 반환 (cached) */
748
+ getScrollableColumns(): ColumnDefinition[];
749
+ /** 컬럼 캐시 무효화 */
750
+ invalidateColumnCache(): void;
751
+ /** 왼쪽 고정 영역 존재 여부 */
752
+ hasFixedLeft(): boolean;
753
+ /** 오른쪽 고정 영역 존재 여부 Phase 14 */
754
+ hasFixedRight(): boolean;
755
+ /** 표시 데이터 반환 (정렬/필터 적용 후) */
756
+ getDisplayData(): RowData[];
757
+ /** 원본 데이터 반환 */
758
+ getData(): RowData[];
759
+ /** 데이터 변환 적용 (정렬/필터) */
760
+ applyDataTransformations(): void;
761
+ /** 데이터 인덱스 맵 재구성 */
762
+ rebuildDataIndexMap(): void;
763
+ /** 체크 가능 행 초기화 */
764
+ initCheckableRows(): void;
765
+ /** 가상 스크롤 상태 */
766
+ getVirtualState(): {
767
+ startIndex: number;
768
+ endIndex: number;
769
+ visibleCount: number;
770
+ totalHeight: number;
771
+ };
772
+ /** 가상 스크롤 상태 계산 */
773
+ calculateVirtualState(): void;
774
+ /** 현재 표시되는 행 목록 반환 */
775
+ getVisibleRows(): {
776
+ data: RowData;
777
+ index: number;
778
+ }[];
779
+ /** 전체 렌더링 */
780
+ render(): void;
781
+ /** 바디만 렌더링 */
782
+ renderBody(): void;
783
+ /** 헤더만 렌더링 */
784
+ renderHeader(): void;
785
+ /** 로딩 상태 업데이트 */
786
+ updateLoadingState(): void;
787
+ /** 선택 상태 초기화 */
788
+ clearSelectionState(): void;
789
+ /** 선택된 셀 목록 반환 */
790
+ getSelectedCells(): CellIndex[];
791
+ /** 행 선택 */
792
+ selectRow(index: number, selected: boolean): void;
793
+ /** 셀 범위 선택 */
794
+ selectCellRange(startRow: number, startField: string, endRow: number, endField: string): void;
795
+ /** 체크 상태 변경 */
796
+ checkItem(index: number, checked: boolean): void;
797
+ /** 전체 체크/해제 */
798
+ checkAll(checked: boolean): void;
799
+ /** 편집 시작 */
800
+ startEdit(rowIndex: number, field: string): void;
801
+ /** 편집 종료 */
802
+ endEdit(save?: boolean): void;
803
+ /** 편집 취소 */
804
+ cancelEdit(): void;
805
+ /** 편집 셀 렌더링 */
806
+ renderEditCell(rowIndex: number, field: string, value: CellValue): void;
807
+ /** 정렬 처리 */
808
+ handleSort(field: string): void;
809
+ /** 컬럼 필터 적용 */
810
+ applyColumnFilter(field: string, operator: FilterOperator, value: CellValue): void;
811
+ /** 컬럼 필터 제거 */
812
+ removeColumnFilter(field: string): void;
813
+ /** 컬럼 고정 */
814
+ fixColumn(field: string, position: 'left' | 'right' | false): void;
815
+ /** 컬럼 순서 변경 */
816
+ reorderColumn(sourceField: string, targetField: string): void;
817
+ /** 컬럼 숨기기 */
818
+ hideColumn(field: string): void;
819
+ /** 컬럼 표시 */
820
+ showColumn(field: string): void;
821
+ /** 컬럼 너비 자동 조절 */
822
+ autoFitColumn(field: string): void;
823
+ /** 행 이동 */
824
+ moveRow(fromIndex: number, toIndex: number): void;
825
+ /** Undo 스택에 액션 추가 */
826
+ pushUndo(action: UndoAction): void;
827
+ /** Undo 가능 여부 */
828
+ canUndo(): boolean;
829
+ /** Redo 가능 여부 */
830
+ canRedo(): boolean;
831
+ /** 이벤트 발행 헬퍼 */
832
+ emitEvent<K extends keyof GridEvents>(event: K, ...args: Parameters<NonNullable<GridEvents[K]>>): void;
833
+ /** Filter 팝업 표시 */
834
+ showFilterPopup(column: ColumnDefinition, anchor: HTMLElement): void;
835
+ /** Column 메뉴 표시 */
836
+ showColumnMenu(column: ColumnDefinition, anchor: HTMLElement): void;
837
+ /** Column 드래그 시작 */
838
+ startColumnDrag(e: MouseEvent, column: ColumnDefinition): void;
839
+ /** Row 드래그 시작 */
840
+ startRowDrag(e: MouseEvent, rowIndex: number, rowElement: HTMLElement): void;
841
+ /** Resize 시작 */
842
+ startResize(e: MouseEvent, column: ColumnDefinition): void;
843
+ /** Block selection 시작 */
844
+ startBlockSelection(rowIndex: number, field: string): void;
845
+ /** Block selection 업데이트 */
846
+ updateBlockSelection(rowIndex: number, field: string): void;
847
+ /** Block selection 상태 확인 */
848
+ isBlockSelecting(): boolean;
849
+ /** Row 클릭 핸들러 */
850
+ handleRowClick(rowIndex: number, e: MouseEvent): void;
851
+ /** Row 더블클릭 핸들러 */
852
+ handleRowDoubleClick(rowIndex: number, e: MouseEvent): void;
853
+ /** Cell 클릭 핸들러 */
854
+ handleCellClick(rowIndex: number, field: string, value: CellValue, e: MouseEvent): void;
855
+ /** Tooltip 표시 */
856
+ showTooltip(cell: HTMLElement, value: CellValue, rowData: RowData, column: ColumnDefinition): void;
857
+ /** Tooltip 숨기기 */
858
+ hideTooltip(): void;
859
+ /** 텍스트 너비 측정 */
860
+ measureTextWidth(text: string, font?: string): number;
861
+ /** Summary 값 조회 */
862
+ getSummaryValue(field: string): CellValue;
863
+ /** 모든 Summary 값 조회 */
864
+ getSummaryValues(): Record<string, CellValue>;
865
+ /** Fixed options 설정 */
866
+ setFixedOptions(options: FixedOptions): void;
867
+ /** Fixed options 조회 */
868
+ getFixedOptions(): FixedOptions;
869
+ /** 특정 페이지로 이동 */
870
+ goToPage(page: number): void;
871
+ /** 페이지 크기 변경 */
872
+ setPageSize(pageSize: number): void;
873
+ /** 현재 페이지네이션 상태 조회 */
874
+ getPaginationState(): PaginationState;
875
+ /** 서버 데이터 수동 새로고침 */
876
+ fetchData(): Promise<void>;
877
+ }
878
+ //# sourceMappingURL=index.d.ts.map