open-grid 0.2.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 (70) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +366 -0
  3. package/dist/OpenGrid-CAodJLLm.cjs +90 -0
  4. package/dist/OpenGrid-CAodJLLm.cjs.map +1 -0
  5. package/dist/OpenGrid-CfZy3e7Q.js +4376 -0
  6. package/dist/OpenGrid-CfZy3e7Q.js.map +1 -0
  7. package/dist/open-grid-base.css +1595 -0
  8. package/dist/open-grid-react.cjs +2 -0
  9. package/dist/open-grid-react.cjs.map +1 -0
  10. package/dist/open-grid-react.js +91 -0
  11. package/dist/open-grid-react.js.map +1 -0
  12. package/dist/open-grid-themes.css +630 -0
  13. package/dist/open-grid-vue.cjs +2 -0
  14. package/dist/open-grid-vue.cjs.map +1 -0
  15. package/dist/open-grid-vue.js +84 -0
  16. package/dist/open-grid-vue.js.map +1 -0
  17. package/dist/open-grid.cjs +7 -0
  18. package/dist/open-grid.cjs.map +1 -0
  19. package/dist/open-grid.js +311 -0
  20. package/dist/open-grid.js.map +1 -0
  21. package/dist/types/bench/perf.d.ts +16 -0
  22. package/dist/types/core/CellEditManager.d.ts +46 -0
  23. package/dist/types/core/CellEventHandler.d.ts +28 -0
  24. package/dist/types/core/CellTypeRegistry.d.ts +5 -0
  25. package/dist/types/core/ColumnLayout.d.ts +41 -0
  26. package/dist/types/core/ContextMenu.d.ts +33 -0
  27. package/dist/types/core/DataLayer.d.ts +65 -0
  28. package/dist/types/core/EventEmitter.d.ts +11 -0
  29. package/dist/types/core/ExportManager.d.ts +28 -0
  30. package/dist/types/core/FilterPanel.d.ts +20 -0
  31. package/dist/types/core/FilterSelect.d.ts +96 -0
  32. package/dist/types/core/FindBarManager.d.ts +26 -0
  33. package/dist/types/core/FooterManager.d.ts +16 -0
  34. package/dist/types/core/FormulaEngine.d.ts +10 -0
  35. package/dist/types/core/GridRenderer.d.ts +42 -0
  36. package/dist/types/core/GroupEngine.d.ts +47 -0
  37. package/dist/types/core/GroupTreeManager.d.ts +43 -0
  38. package/dist/types/core/KeyboardManager.d.ts +26 -0
  39. package/dist/types/core/MaskingEngine.d.ts +25 -0
  40. package/dist/types/core/MathUtils.d.ts +26 -0
  41. package/dist/types/core/MergeEngine.d.ts +35 -0
  42. package/dist/types/core/OGDecimal.d.ts +49 -0
  43. package/dist/types/core/OpenGrid.d.ts +213 -0
  44. package/dist/types/core/OrgChart.d.ts +35 -0
  45. package/dist/types/core/Pagination.d.ts +34 -0
  46. package/dist/types/core/PivotEngine.d.ts +20 -0
  47. package/dist/types/core/RowDragDrop.d.ts +18 -0
  48. package/dist/types/core/RowManager.d.ts +30 -0
  49. package/dist/types/core/SortFilterManager.d.ts +36 -0
  50. package/dist/types/core/TreeEngine.d.ts +34 -0
  51. package/dist/types/core/TriggerManager.d.ts +10 -0
  52. package/dist/types/core/VirtualScroll.d.ts +31 -0
  53. package/dist/types/core/WorksheetManager.d.ts +24 -0
  54. package/dist/types/core/XmlConverter.d.ts +88 -0
  55. package/dist/types/core/editors/CellEditor.d.ts +55 -0
  56. package/dist/types/core/editors/DateEditor.d.ts +15 -0
  57. package/dist/types/core/editors/SelectEditor.d.ts +21 -0
  58. package/dist/types/core/renderers/CellRenderer.d.ts +138 -0
  59. package/dist/types/core/types.d.ts +497 -0
  60. package/dist/types/index.d.ts +9 -0
  61. package/dist/types/react/OpenGrid.d.ts +34 -0
  62. package/dist/types/react/index.d.ts +2 -0
  63. package/dist/types/vue/OpenGrid.vue.d.ts +80 -0
  64. package/dist/types/vue/index.d.ts +2 -0
  65. package/dist/types/vue/types.d.ts +28 -0
  66. package/dist/xlsx.min-Bx-LxWOf.cjs +138 -0
  67. package/dist/xlsx.min-Bx-LxWOf.cjs.map +1 -0
  68. package/dist/xlsx.min-Wavxcamn.js +11907 -0
  69. package/dist/xlsx.min-Wavxcamn.js.map +1 -0
  70. package/package.json +102 -0
@@ -0,0 +1,35 @@
1
+ /**
2
+ * 셀 병합 관리 엔진.
3
+ *
4
+ * 두 가지 병합 방식 지원:
5
+ * 1. 동적 병합: mergeCells([{row, col, rowSpan, colSpan}])
6
+ * 2. 자동 병합: 같은 필드에 같은 값이 연속되면 자동으로 rowSpan
7
+ */
8
+ export interface MergeCell {
9
+ row: number;
10
+ col: number;
11
+ rowSpan?: number;
12
+ colSpan?: number;
13
+ }
14
+ export interface MergeInfo {
15
+ rowSpan: number;
16
+ colSpan: number;
17
+ hidden: boolean;
18
+ }
19
+ export declare class MergeEngine {
20
+ private _map;
21
+ private static _key;
22
+ /** 수동 병합 정의 목록으로 맵 구성 */
23
+ applyMergeCells(cells: MergeCell[]): void;
24
+ /**
25
+ * 자동 병합: 지정 컬럼 인덱스 목록에 대해 연속 같은 값을 rowSpan으로 병합.
26
+ * data: 현재 표시 순서의 행 배열, colIndexes: 자동병합할 leaf 컬럼 인덱스
27
+ * fields: colIndexes[i] 에 대응하는 field 이름
28
+ */
29
+ applyAutoMerge(data: Record<string, any>[], colIndexes: number[], fields: string[]): void;
30
+ /** 셀 병합 정보 조회. 없으면 null */
31
+ getInfo(row: number, col: number): MergeInfo | null;
32
+ /** 병합 맵 초기화 */
33
+ clear(): void;
34
+ get isEmpty(): boolean;
35
+ }
@@ -0,0 +1,49 @@
1
+ export type OGDecimalLike = string | number | bigint | OGDecimal;
2
+ export declare class OGDecimal {
3
+ private readonly _c;
4
+ private readonly _s;
5
+ constructor(coefficient: bigint, scale: number);
6
+ static from(value: OGDecimalLike): OGDecimal;
7
+ static zero(): OGDecimal;
8
+ static one(): OGDecimal;
9
+ private static _align;
10
+ add(other: OGDecimalLike): OGDecimal;
11
+ sub(other: OGDecimalLike): OGDecimal;
12
+ mul(other: OGDecimalLike): OGDecimal;
13
+ /**
14
+ * 나눗셈. precision = 결과 소수점 자리수 (기본 20).
15
+ * 수익 배분처럼 소수 수백 자리가 필요하면 precision을 높인다.
16
+ */
17
+ div(other: OGDecimalLike, precision?: number): OGDecimal;
18
+ /** 나머지 (정수 나머지와 동일한 개념을 소수에 적용) */
19
+ mod(other: OGDecimalLike): OGDecimal;
20
+ /** 부호 반전 */
21
+ neg(): OGDecimal;
22
+ /** 절댓값 */
23
+ abs(): OGDecimal;
24
+ eq(other: OGDecimalLike): boolean;
25
+ gt(other: OGDecimalLike): boolean;
26
+ lt(other: OGDecimalLike): boolean;
27
+ gte(other: OGDecimalLike): boolean;
28
+ lte(other: OGDecimalLike): boolean;
29
+ isZero(): boolean;
30
+ isNeg(): boolean;
31
+ isPos(): boolean;
32
+ /**
33
+ * 지정 소수점 자리수로 반올림(Half-up) 후 문자열 반환.
34
+ * 음원 배분 등 정확한 자리수 표시에 사용.
35
+ */
36
+ toFixed(dp: number): string;
37
+ /** 정규화(후행 0 제거) 후 최소 표현 문자열 반환 */
38
+ toString(): string;
39
+ /** number로 변환 (정밀도 손실 주의 — 표시 전용) */
40
+ toNumber(): number;
41
+ /** 정확한 합산 (내부적으로 BigInt 정수 연산) */
42
+ static sum(arr: OGDecimalLike[]): OGDecimal;
43
+ /** 정확한 평균. precision = 나눗셈 소수점 자리수 */
44
+ static avg(arr: OGDecimalLike[], precision?: number): OGDecimal;
45
+ /** 배열 최솟값 */
46
+ static min(arr: OGDecimalLike[]): OGDecimal;
47
+ /** 배열 최댓값 */
48
+ static max(arr: OGDecimalLike[]): OGDecimal;
49
+ }
@@ -0,0 +1,213 @@
1
+ import { EventEmitter } from './EventEmitter.js';
2
+ import { FilterSelectConfig } from './FilterSelect.js';
3
+ import { MergeCell } from './MergeEngine.js';
4
+ import { GridOptions, OpenGridInstance, ColumnDef, SortItem, FilterItem, ExportOptions, Position, TriggerHandler, TriggerEvent } from './types.js';
5
+
6
+ export declare class OpenGrid<T extends Record<string, any> = any> extends EventEmitter implements OpenGridInstance<T> {
7
+ private _container;
8
+ private _options;
9
+ private _data;
10
+ private _colLayout;
11
+ private _vs;
12
+ private _ro;
13
+ private _renderer;
14
+ private _sfMgr;
15
+ private _rowMgr;
16
+ private _editMgr;
17
+ private _trigMgr;
18
+ private _destroyed;
19
+ private _colWidths;
20
+ private _filterPanel;
21
+ private _filterSelect;
22
+ private _pagination;
23
+ private _dnd;
24
+ private _mergeEngine;
25
+ private _liveRegion;
26
+ private _ctxMenu;
27
+ private _cmHandler;
28
+ private _cmKbdHandler;
29
+ private _wsManager;
30
+ private _exportMgr;
31
+ private _footerMgr;
32
+ private _kbdMgr;
33
+ private _findMgr;
34
+ private _grpMgr;
35
+ private _cellEvt;
36
+ constructor(container: string | HTMLElement, options: GridOptions<T>);
37
+ private _mount;
38
+ private _initContextMenu;
39
+ openContextMenu(e: MouseEvent, items?: import('./types').ContextMenuItem[]): void;
40
+ closeContextMenu(): void;
41
+ setFilterSelect(config: FilterSelectConfig | null): void;
42
+ setOptions(opts: Partial<GridOptions<T>>): void;
43
+ /**
44
+ * 컬럼 마스킹 ON/OFF 전환.
45
+ * enabled=true → 마스킹 적용 (기본 상태)
46
+ * enabled=false → 컬럼 전체 마스킹 해제 (원문 표시)
47
+ */
48
+ setMaskEnabled(field: string, enabled: boolean): void;
49
+ /** 현재 컬럼 마스킹 활성 여부 반환. true=마스킹 중, false=해제됨 */
50
+ getMaskEnabled(field: string): boolean;
51
+ private _initWorksheets;
52
+ addWorksheet(name: string, columns?: import('./types').ColumnDef<T>[], data?: T[]): void;
53
+ removeWorksheet(name: string): void;
54
+ switchWorksheet(name: string): void;
55
+ renameWorksheet(oldName: string, newName: string): void;
56
+ getWorksheet(name: string): import('./types').WorksheetState<T> | undefined;
57
+ getWorksheetNames(): string[];
58
+ exportSheetsExcel(filename?: string): void;
59
+ private _paginationHeight;
60
+ private _onResize;
61
+ private _recalcWidths;
62
+ private _renderHeader;
63
+ private _doRender;
64
+ private _handleGroupToggle;
65
+ private _visRange;
66
+ private _visCount;
67
+ private _handleSortClick;
68
+ private _isToggleCol;
69
+ private _handleCellClick;
70
+ private _handleCellDblClick;
71
+ private _handleCellMouseOver;
72
+ private _handleCellMouseOut;
73
+ private _handleCellMouseDown;
74
+ private _handleCellMouseUp;
75
+ private _handleCellMouseMove;
76
+ private _handleCellKeyEvt;
77
+ private _handleRowCheck;
78
+ private _handleFilterIconClick;
79
+ private _handleAllCheck;
80
+ private _handleRowDrop;
81
+ /** 행을 드롭으로 이동할 때 실행된다 */
82
+ /** ???꾩튂 ?대룞 */
83
+ reorderRow(fromIndex: number, toIndex: number): void;
84
+ private _handleColResize;
85
+ private _handleKeyDown;
86
+ private _setFocusCell;
87
+ private _announce;
88
+ private _bindOptionEvents;
89
+ setData(data: T[]): void;
90
+ getData(): T[];
91
+ getSourceRows(): T[];
92
+ pushData(data: T[]): void;
93
+ prefixData(data: T[]): void;
94
+ clearData(): void;
95
+ insertRow(item: Partial<T>, position?: Position): void;
96
+ pushRow(items: Partial<T> | Partial<T>[]): void;
97
+ /** @deprecated 하위호환 alias → pushRow */
98
+ appendRows(items: Partial<T> | Partial<T>[]): void;
99
+ unshiftRow(items: Partial<T> | Partial<T>[]): void;
100
+ /** @deprecated 하위호환 alias → unshiftRow */
101
+ prependRows(items: Partial<T> | Partial<T>[]): void;
102
+ deleteRow(rowIndex: number | number[]): void;
103
+ deleteById(_ids: string[]): void;
104
+ readCell(rowIndex: number, field: string): any;
105
+ getDisplayValue(rowIndex: number, field: string): string;
106
+ writeCell(rowIndex: number, field: string, value: any): void;
107
+ getRowAt(rowIndex: number): T;
108
+ getChanges(): {
109
+ added: T[];
110
+ edited: T[];
111
+ removed: T[];
112
+ };
113
+ getEditedRows(): T[];
114
+ getChangedRows(): T[];
115
+ getChangedColumns(): Array<{
116
+ row: T;
117
+ fields: string[];
118
+ diff: Array<{
119
+ field: string;
120
+ oldValue: any;
121
+ newValue: any;
122
+ }>;
123
+ }>;
124
+ getAddedRows(): T[];
125
+ getRemovedRows(): T[];
126
+ getOriginalRow(rowIndex: number): T | undefined;
127
+ getRowsWithState(stateField: string): T[];
128
+ undo(): void;
129
+ redo(): void;
130
+ clearHistory(): void;
131
+ getColumnDefs(): ColumnDef<T>[];
132
+ getAllColumnDefs(): ColumnDef<T>[];
133
+ getColumnCount(): number;
134
+ applyColumns(columns: ColumnDef<T>[]): void;
135
+ insertColumn(colDef: ColumnDef<T>, position?: Position): void;
136
+ deleteColumn(field: string): void;
137
+ private _reorderColumn;
138
+ hideColumn(field: string | string[]): void;
139
+ showColumn(field: string | string[]): void;
140
+ getColumnIndex(field: string): number;
141
+ getFieldAt(idx: number): string;
142
+ getColValues(field: string, _all?: boolean): any[];
143
+ getUniqueValues(field: string, all?: boolean): any[];
144
+ setColWidths(_widths: number[]): void;
145
+ calcColWidths(_fitToGrid?: boolean): number[];
146
+ getSelections(): T[];
147
+ getActiveRow(): number;
148
+ activate(index: number): void;
149
+ deselect(): void;
150
+ getChecked(): Array<{
151
+ row: T;
152
+ rowIndex: number;
153
+ }>;
154
+ getAllChecked(): T[];
155
+ checkById(_ids: string[]): void;
156
+ addCheckById(_ids: string[]): void;
157
+ checkByValue(field: string, values: any[]): void;
158
+ uncheckById(_ids: string[]): void;
159
+ uncheckAll(): void;
160
+ orderBy(fieldOrList: string | SortItem[], dir?: 'asc' | 'desc'): void;
161
+ resetOrder(): void;
162
+ setFilter(field: string, filterItems: FilterItem[]): void;
163
+ resetFilter(field?: string): void;
164
+ getFilterState(): Record<string, FilterItem[]>;
165
+ restoreFilter(state: Record<string, FilterItem[]>): void;
166
+ private _applyFilters;
167
+ freeze(n: number): void;
168
+ /** ?섎룞 蹂묓빀: [{row, col, rowSpan?, colSpan?}] */
169
+ mergeCells(cells: MergeCell[]): void;
170
+ /** 자동 병합: 지정 필드 컬럼에서 연속 같은 값을 rowSpan으로 묶는다 */
171
+ /** ?먮룞 蹂묓빀: 吏€??field 而щ읆?먯꽌 ?곗냽 媛숈? 媛믪쓣 rowSpan */
172
+ autoMerge(fields: string[]): void;
173
+ /** 蹂묓빀 ?댁젣 */
174
+ clearMerge(): void;
175
+ freezeRows(_n: number): void;
176
+ groupBy(fields: string[]): void;
177
+ clearGroup(): void;
178
+ expandAll(): void;
179
+ collapseAll(): void;
180
+ enableTree(): void;
181
+ disableTree(): void;
182
+ expandNodes(ids: any | any[], open?: boolean): void;
183
+ expandAllNodes(): void;
184
+ collapseAllNodes(): void;
185
+ addTreeRow(_item: Partial<T>, _pid: string, _pos?: Position): void;
186
+ exportExcel(options?: ExportOptions | string): void;
187
+ exportCsv(options?: ExportOptions | string): void;
188
+ exportJson(options?: ExportOptions | string): void;
189
+ print(options?: {
190
+ title?: string;
191
+ excludeFields?: string[];
192
+ }): void;
193
+ toArray(keyValue?: boolean): any[];
194
+ jumpToRow(rowIndex: number): void;
195
+ jumpToCol(_field: string): void;
196
+ getScrollPos(): {
197
+ x: number;
198
+ y: number;
199
+ };
200
+ setFooter(fd: any[]): void;
201
+ getFooterData(): any[];
202
+ getFooterValue(field: string): any;
203
+ private _renderFooterEl;
204
+ resize(w?: number, h?: number): void;
205
+ setTheme(theme: string): void;
206
+ setThemeVar(k: string, v: string): void;
207
+ addTrigger(event: TriggerEvent | string, handler: TriggerHandler): this;
208
+ removeTrigger(event: TriggerEvent | string, handler: TriggerHandler): this;
209
+ clearTriggers(event?: TriggerEvent | string): this;
210
+ private _mkCtx;
211
+ private _trig;
212
+ destroy(): void;
213
+ }
@@ -0,0 +1,35 @@
1
+ export interface OrgChartColumnDef {
2
+ field: string;
3
+ className?: string;
4
+ style?: string | ((value: any, row: Record<string, any>) => string);
5
+ renderer?: (value: any, row: Record<string, any>) => HTMLElement | string;
6
+ }
7
+ export interface OrgChartOptions {
8
+ idField: string;
9
+ parentIdField: string;
10
+ columns: OrgChartColumnDef[];
11
+ nodeWidth?: number;
12
+ nodeHeight?: number;
13
+ levelGap?: number;
14
+ siblingGap?: number;
15
+ expandOnLoad?: boolean;
16
+ onNodeClick?: (id: any, data: Record<string, any>) => void;
17
+ }
18
+ export declare class OrgChart {
19
+ private _container;
20
+ private _opts;
21
+ private _data;
22
+ private _roots;
23
+ private _expandedKeys;
24
+ private _selectedId;
25
+ constructor(selector: string | HTMLElement, opts: OrgChartOptions);
26
+ setData(data: Record<string, any>[]): void;
27
+ setTheme(theme: string): void;
28
+ expandAll(): void;
29
+ collapseAll(): void;
30
+ private _toggle;
31
+ private _rebuild;
32
+ private _calcLayout;
33
+ private _line;
34
+ private _render;
35
+ }
@@ -0,0 +1,34 @@
1
+ export interface PageChangeEvent {
2
+ page: number;
3
+ pageSize: number;
4
+ totalRows: number;
5
+ totalPages: number;
6
+ }
7
+ export type PageChangeFn = (e: PageChangeEvent) => void;
8
+ /**
9
+ * 그리드 하단 페이지네이션 UI + 상태 관리.
10
+ * DataLayer의 _displayIndexes 슬라이싱을 담당.
11
+ */
12
+ export declare class Pagination {
13
+ private _el;
14
+ private _page;
15
+ private _pageSize;
16
+ private _totalRows;
17
+ private _onChange;
18
+ constructor(container: HTMLElement, pageSize: number, onChange: PageChangeFn);
19
+ get page(): number;
20
+ get pageSize(): number;
21
+ get totalPages(): number;
22
+ /** 전체 행 수 갱신 → 현재 페이지 유효성 검사 후 재렌더 */
23
+ setTotalRows(n: number): void;
24
+ setPageSize(size: number): void;
25
+ goTo(page: number): void;
26
+ /** 현재 페이지의 [startIndex, endIndex] 반환 (DataLayer 인덱스 기준) */
27
+ getRange(): {
28
+ start: number;
29
+ end: number;
30
+ };
31
+ private _emit;
32
+ private _render;
33
+ destroy(): void;
34
+ }
@@ -0,0 +1,20 @@
1
+ import { ColumnDef } from './types.js';
2
+
3
+ export type PivotAgg = 'SUM' | 'COUNT' | 'AVG' | 'MIN' | 'MAX';
4
+ export interface PivotConfig {
5
+ rowFields: string[];
6
+ colFields: string[];
7
+ valueFields: string[];
8
+ agg?: PivotAgg;
9
+ format?: string;
10
+ }
11
+ export interface PivotResult {
12
+ columns: ColumnDef[];
13
+ data: any[];
14
+ colKeys: string[][];
15
+ }
16
+ export declare class PivotEngine {
17
+ compute(data: any[], config: PivotConfig): PivotResult;
18
+ private _cartesian;
19
+ private _aggregate;
20
+ }
@@ -0,0 +1,18 @@
1
+ export type RowDropCallback = (fromIndex: number, toIndex: number) => void;
2
+ /**
3
+ * 행 드래그앤드롭 관리자.
4
+ * 행 DOM에 드래그 핸들을 심고, 드롭 위치를 표시한 뒤 콜백으로 알림.
5
+ */
6
+ export declare class RowDragDrop {
7
+ private _drag;
8
+ private _onDrop;
9
+ private _bodyEl;
10
+ private _rowHeight;
11
+ constructor(bodyEl: HTMLElement, rowHeight: number, onDrop: RowDropCallback);
12
+ /** 행 엘리먼트에 드래그 핸들 삽입 */
13
+ attachHandle(rowEl: HTMLElement, rowIndex: number, totalRows: number): HTMLElement;
14
+ private _startDrag;
15
+ private _onMouseMove;
16
+ private _onMouseUp;
17
+ destroy(): void;
18
+ }
@@ -0,0 +1,30 @@
1
+ import { DataLayer } from './DataLayer.js';
2
+
3
+ export declare class RowManager<T extends Record<string, any> = any> {
4
+ private _selectedRows;
5
+ private _checkedRows;
6
+ private _data;
7
+ constructor(data: DataLayer<T>);
8
+ get selectedRows(): Set<number>;
9
+ get checkedRows(): Set<number>;
10
+ selectSingle(ri: number): void;
11
+ selectToggle(ri: number): void;
12
+ clearSelection(): void;
13
+ check(ri: number, checked: boolean): void;
14
+ checkAll(checked: boolean, totalRows: number): void;
15
+ checkByValue(field: string, values: any[]): void;
16
+ uncheckAll(): void;
17
+ checkById(_ids: string[]): void;
18
+ addCheckById(_ids: string[]): void;
19
+ uncheckById(_ids: string[]): void;
20
+ getSelections(): T[];
21
+ getChecked(): Array<{
22
+ row: T;
23
+ rowIndex: number;
24
+ }>;
25
+ getAllChecked(): T[];
26
+ getActiveRow(): number;
27
+ activate(index: number): void;
28
+ deselect(): void;
29
+ reset(): void;
30
+ }
@@ -0,0 +1,36 @@
1
+ import { DataLayer } from './DataLayer.js';
2
+ import { ColumnLayout } from './ColumnLayout.js';
3
+ import { VirtualScroll } from './VirtualScroll.js';
4
+ import { Pagination } from './Pagination.js';
5
+ import { SortItem, FilterItem } from './types.js';
6
+
7
+ export interface SortFilterDeps<T extends Record<string, any>> {
8
+ getData: () => DataLayer<T>;
9
+ getColLayout: () => ColumnLayout<T>;
10
+ getFindFilter: () => string;
11
+ getVs: () => VirtualScroll | null;
12
+ getPagination: () => Pagination | null;
13
+ getOptions: () => any;
14
+ renderHeader: () => void;
15
+ doRender: () => void;
16
+ announce: (msg: string) => void;
17
+ emit: (event: string, ...args: any[]) => void;
18
+ }
19
+ export declare class SortFilterManager<T extends Record<string, any> = any> {
20
+ private _sortList;
21
+ private _filters;
22
+ private _d;
23
+ constructor(deps: SortFilterDeps<T>);
24
+ get sortList(): SortItem[];
25
+ get filters(): Record<string, FilterItem[]>;
26
+ handleSortClick(field: string, shiftKey: boolean): void;
27
+ sort(fieldOrList: string | SortItem[], dir?: 'asc' | 'desc'): void;
28
+ resetSort(): void;
29
+ initSort(sortList: SortItem[]): void;
30
+ getSortState(): SortItem[];
31
+ setFilter(field: string, filterItems: FilterItem[]): void;
32
+ resetFilter(field?: string): void;
33
+ getFilterState(): Record<string, FilterItem[]>;
34
+ restoreFilter(state: Record<string, FilterItem[]>): void;
35
+ applyFilters(): void;
36
+ }
@@ -0,0 +1,34 @@
1
+ export interface TreeNode<T = any> {
2
+ _isTree: true;
3
+ _treeId: any;
4
+ _treeParentId: any;
5
+ _depth: number;
6
+ _expanded: boolean;
7
+ _hasChildren: boolean;
8
+ _childCount: number;
9
+ _isLastChild: boolean;
10
+ _ancestorHasMore: boolean[];
11
+ data: T;
12
+ children: TreeNode<T>[];
13
+ }
14
+ export type TreeItem<T> = TreeNode<T>;
15
+ export declare function isTreeNode<T>(item: any): item is TreeNode<T>;
16
+ export interface TreeBuildOptions {
17
+ idField: string;
18
+ parentIdField: string;
19
+ expandOnLoad?: boolean;
20
+ }
21
+ /**
22
+ * flat 데이터를 트리 구조로 변환.
23
+ * parentId가 null/undefined/''인 행이 루트 노드.
24
+ */
25
+ export declare function buildTree<T extends Record<string, any>>(data: T[], opts: TreeBuildOptions, expandedKeys?: Set<any>): TreeNode<T>[];
26
+ /**
27
+ * 트리를 화면에 표시할 flat 배열로 변환.
28
+ * 접힌 노드(_expanded=false)의 자식은 제외.
29
+ */
30
+ export declare function flattenTree<T>(nodes: TreeNode<T>[]): TreeNode<T>[];
31
+ /** 특정 id 노드의 펼침 상태 토글 */
32
+ export declare function toggleTreeNode<T>(expandedKeys: Set<any>, nodeId: any): void;
33
+ /** 모든 노드 id 수집 */
34
+ export declare function collectAllTreeIds<T>(nodes: TreeNode<T>[]): any[];
@@ -0,0 +1,10 @@
1
+ import { TriggerContext, TriggerHandler, TriggerEvent } from './types.js';
2
+
3
+ export declare class TriggerManager {
4
+ private _triggers;
5
+ add(event: TriggerEvent | string, handler: TriggerHandler): void;
6
+ remove(event: TriggerEvent | string, handler: TriggerHandler): void;
7
+ clear(event?: TriggerEvent | string): void;
8
+ mkCtx(operation: string, args: any[]): TriggerContext;
9
+ exec(event: string, ctx: TriggerContext): boolean;
10
+ }
@@ -0,0 +1,31 @@
1
+ export interface VirtualScrollOptions {
2
+ rowHeight: number;
3
+ overscan?: number;
4
+ onRender: (startIndex: number, endIndex: number) => void;
5
+ }
6
+ export interface VirtualScrollRange {
7
+ startIndex: number;
8
+ endIndex: number;
9
+ offsetY: number;
10
+ }
11
+ export declare class VirtualScroll {
12
+ private container;
13
+ private rowHeight;
14
+ private overscan;
15
+ private _totalRows;
16
+ private _scrollTop;
17
+ private _viewportHeight;
18
+ private _rafId;
19
+ private onRender;
20
+ constructor(container: HTMLElement, options: VirtualScrollOptions);
21
+ private _onScroll;
22
+ private _scheduleRender;
23
+ getVisibleRange(): VirtualScrollRange;
24
+ setTotalRows(count: number): void;
25
+ setViewportHeight(height: number): void;
26
+ setRowHeight(height: number): void;
27
+ scrollToRow(rowIndex: number): void;
28
+ getTotalHeight(): number;
29
+ private _updateSpacerHeight;
30
+ destroy(): void;
31
+ }
@@ -0,0 +1,24 @@
1
+ import { ColumnDef, WorksheetState } from './types.js';
2
+
3
+ export type SwitchCallback<T> = (name: string, state: WorksheetState<T>) => void;
4
+ export declare class WorksheetManager<T extends Record<string, any> = any> {
5
+ private _sheets;
6
+ private _active;
7
+ private _tabBar;
8
+ private _onSwitch;
9
+ constructor(container: HTMLElement, onSwitch: SwitchCallback<T>);
10
+ add(name: string, columns?: ColumnDef<T>[], data?: T[]): void;
11
+ remove(name: string): void;
12
+ rename(oldName: string, newName: string): void;
13
+ switch(name: string): void;
14
+ get(name: string): WorksheetState<T> | undefined;
15
+ getNames(): string[];
16
+ getActive(): string;
17
+ /** 현재 활성 시트의 data를 갱신 (그리드 편집 동기화용) */
18
+ syncData(name: string, data: T[]): void;
19
+ destroy(): void;
20
+ private _buildTabBar;
21
+ private _renderTabs;
22
+ /** 탭 더블클릭 → input으로 전환해 이름 변경 */
23
+ private _startRename;
24
+ }
@@ -0,0 +1,88 @@
1
+ /**
2
+ * XmlConverter — XML ↔ 그리드 데이터 양방향 변환 유틸리티.
3
+ *
4
+ * 지원 포맷:
5
+ * A. Element 방식 <row><name>홍길동</name></row>
6
+ * B. Attribute 방식 <row name="홍길동" />
7
+ * C. SAP BAPI XML 응답 <RETURN><TYPE>S</TYPE><BELNR>...</BELNR></RETURN>
8
+ * D. SAP IDoc XML <IDOC><E1HEADER SEGMENT="1"><BUKRS>1000</BUKRS></IDOC>
9
+ *
10
+ * 외부 의존성 없음 — 브라우저 내장 DOMParser 사용.
11
+ */
12
+ export interface XmlParseOptions {
13
+ /** 루트 엘리먼트 태그명 (생략 시 문서 루트 자동 사용) */
14
+ rootTag?: string;
15
+ /** 행 엘리먼트 태그명 (생략 시 루트의 첫 번째 자식 자동 감지) */
16
+ rowTag?: string;
17
+ /** 값 추출 방식: 'element' | 'attribute' | 'auto'(기본) */
18
+ mode?: 'element' | 'attribute' | 'auto';
19
+ /** XML 태그명 → 그리드 field명 매핑 (생략 시 태그명 그대로 사용) */
20
+ fieldMap?: Record<string, string>;
21
+ /** 텍스트 값 앞뒤 공백 제거 (기본 true) */
22
+ trim?: boolean;
23
+ }
24
+ export interface XmlStringifyOptions {
25
+ /** 루트 태그명 (기본 'rows') */
26
+ rootTag?: string;
27
+ /** 행 태그명 (기본 'row') */
28
+ rowTag?: string;
29
+ /** 출력 방식: 'element'(기본) | 'attribute' */
30
+ mode?: 'element' | 'attribute';
31
+ /** 그리드 field명 → XML 태그명 매핑 */
32
+ fieldMap?: Record<string, string>;
33
+ /** XML 선언부 포함 여부 (기본 true) */
34
+ declaration?: boolean;
35
+ /** 들여쓰기 공백 수 (기본 2) */
36
+ indent?: number;
37
+ /** null/undefined 처리 문자열 (기본 '') */
38
+ nullAs?: string;
39
+ /** 출력에서 제외할 필드 목록 */
40
+ excludeFields?: string[];
41
+ }
42
+ export interface SapParseResult {
43
+ header: Record<string, string>;
44
+ items: Record<string, string>[];
45
+ returns: Record<string, string>[];
46
+ raw?: Document;
47
+ }
48
+ export declare class XmlConverter {
49
+ /**
50
+ * XML 문자열을 파싱하여 그리드 데이터 배열로 변환.
51
+ * Element / Attribute 방식 자동 감지.
52
+ *
53
+ * @throws XML 파싱 오류 시 Error 발생
54
+ */
55
+ static parse(xml: string, options?: XmlParseOptions): Record<string, any>[];
56
+ /**
57
+ * 그리드 데이터 배열을 XML 문자열로 직렬화.
58
+ */
59
+ static stringify(data: Record<string, any>[], options?: XmlStringifyOptions): string;
60
+ /**
61
+ * SAP BAPI XML 응답을 파싱하여 { header, items, returns } 구조로 반환.
62
+ *
63
+ * 지원 패턴:
64
+ * <DOCUMENTHEADER>...</DOCUMENTHEADER>
65
+ * <ACCOUNTGL><ITEM>...</ITEM></ACCOUNTGL>
66
+ * <RETURN><TYPE>S</TYPE><MESSAGE>...</MESSAGE></RETURN>
67
+ */
68
+ static parseSap(xml: string): SapParseResult;
69
+ /**
70
+ * BAPI 페이로드 객체를 SAP XML 형식으로 직렬화.
71
+ * sapGenPayload()의 결과 또는 단일 document 객체를 받음.
72
+ */
73
+ static stringifySap(payload: {
74
+ BAPI_FUNCTION?: string;
75
+ DOCUMENTHEADER?: Record<string, any>;
76
+ ACCOUNTGL?: Record<string, any>[];
77
+ [key: string]: any;
78
+ }): string;
79
+ /**
80
+ * sapGenPayload()의 { totalDocuments, documents[] } 결과를
81
+ * 다건 BAPI XML로 직렬화.
82
+ */
83
+ static stringifySapBatch(payload: {
84
+ documents: any[];
85
+ }): string;
86
+ private static _escText;
87
+ private static _escAttr;
88
+ }