open-grid 1.2.0 → 1.2.1

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 (54) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +1 -1
  3. package/dist/OpenGrid-0r_543Kj.cjs +7192 -0
  4. package/dist/OpenGrid-HmhGVC2V.js +7203 -0
  5. package/dist/open-grid-react.cjs +27 -1
  6. package/dist/open-grid-react.js +22 -82
  7. package/dist/open-grid-vue.cjs +31 -1
  8. package/dist/open-grid-vue.js +29 -79
  9. package/dist/open-grid.cjs +272 -6
  10. package/dist/open-grid.js +177 -266
  11. package/dist/types/core/CellEditManager.d.ts +73 -0
  12. package/dist/types/core/CellEventHandler.d.ts +99 -2
  13. package/dist/types/core/ChartManager.d.ts +51 -3
  14. package/dist/types/core/ContextMenu.d.ts +43 -2
  15. package/dist/types/core/CrossGridController.d.ts +86 -15
  16. package/dist/types/core/CrossGridRegistry.d.ts +36 -2
  17. package/dist/types/core/DetailManager.d.ts +106 -15
  18. package/dist/types/core/ExportManager.d.ts +66 -1
  19. package/dist/types/core/ExtensionPointRegistry.d.ts +160 -14
  20. package/dist/types/core/FilterPanel.d.ts +17 -2
  21. package/dist/types/core/FilterSelect.d.ts +37 -13
  22. package/dist/types/core/FindBarManager.d.ts +26 -0
  23. package/dist/types/core/FlatRowModel.d.ts +54 -11
  24. package/dist/types/core/FooterManager.d.ts +53 -1
  25. package/dist/types/core/FormulaController.d.ts +139 -10
  26. package/dist/types/core/GridComposer.d.ts +54 -6
  27. package/dist/types/core/GridShuttle.d.ts +44 -4
  28. package/dist/types/core/GroupTreeManager.d.ts +86 -2
  29. package/dist/types/core/IconRegistry.d.ts +56 -9
  30. package/dist/types/core/KeyboardManager.d.ts +88 -4
  31. package/dist/types/core/MaskingEngine.d.ts +10 -9
  32. package/dist/types/core/MutationService.d.ts +113 -10
  33. package/dist/types/core/OrgChart.d.ts +56 -1
  34. package/dist/types/core/OverrideKernel.d.ts +59 -15
  35. package/dist/types/core/Pagination.d.ts +38 -4
  36. package/dist/types/core/RangeSelectionManager.d.ts +121 -7
  37. package/dist/types/core/RenderController.d.ts +56 -0
  38. package/dist/types/core/RowManager.d.ts +55 -0
  39. package/dist/types/core/SkinRegistry.d.ts +51 -15
  40. package/dist/types/core/SortFilterManager.d.ts +80 -1
  41. package/dist/types/core/TriggerManager.d.ts +46 -0
  42. package/dist/types/core/WorksheetManager.d.ts +61 -2
  43. package/dist/types/core/XmlConverter.d.ts +56 -23
  44. package/dist/types/core/chart/types.d.ts +107 -10
  45. package/dist/types/core/editors/CellEditor.d.ts +29 -2
  46. package/dist/types/core/formula/types.d.ts +71 -8
  47. package/dist/types/core/range/RangeQuery.d.ts +24 -2
  48. package/dist/types/core/renderers/CellRenderer.d.ts +100 -8
  49. package/dist/xlsx.min-BQ1o3sB6.cjs +11793 -0
  50. package/dist/{xlsx.min-Wavxcamn.js → xlsx.min-Bbz2ZypC.js} +453 -566
  51. package/package.json +2 -1
  52. package/dist/OpenGrid-B0Spm0rU.js +0 -10404
  53. package/dist/OpenGrid-CuXj0isp.cjs +0 -97
  54. package/dist/xlsx.min-Bx-LxWOf.cjs +0 -138
@@ -29,6 +29,14 @@ import { GridOptions } from './types.js';
29
29
  * 조립 중 대입·참조하는 대상이며, 잘못된 이름/타입의 대입은 이 인터페이스로 인해 컴파일
30
30
  * 타임에 잡힌다(순수 `any` host 보다 안전). `_mount` 본체(renderer/vs/pagination 등 DOM
31
31
  * 배선)는 여전히 OpenGrid 가 소유하며, 컴포저는 mount 단계에서 `_mount()` 를 호출만 한다.
32
+ * / The internal surface of `OpenGrid` that `GridComposer` accesses while assembling it
33
+ * (R8, §3.1 C2, §3.3).
34
+ *
35
+ * Structurally mirrors `OpenGrid`'s private fields/methods. Only the members enumerated here
36
+ * are ones the composer assigns to or reads during assembly; assigning a wrong name/type is
37
+ * caught at compile time thanks to this interface (safer than a plain `any` host). The body of
38
+ * `_mount` (renderer/vs/pagination DOM wiring, etc.) is still owned by `OpenGrid` — the
39
+ * composer only calls `_mount()` at the mount phase.
32
40
  */
33
41
  export interface ComposerHost<T extends Record<string, any> = any> {
34
42
  _container: HTMLElement;
@@ -51,7 +59,9 @@ export interface ComposerHost<T extends Record<string, any> = any> {
51
59
  _detailMgr: DetailManager<T>;
52
60
  _chartMgr: ChartManager;
53
61
  _ovk: OverrideKernel;
54
- /** i18n: per-instance 로케일 오버라이드 child(전역 localeRegistry 의 child). 미지정 시 null → 전역 직행. */
62
+ /** i18n: per-instance 로케일 오버라이드 child(전역 localeRegistry 의 child). 미지정 시 null → 전역 직행.
63
+ * / i18n: per-instance locale-override child (a child of the global localeRegistry).
64
+ * `null` when unspecified, in which case lookups go straight to the global registry. */
55
65
  _locales: LocaleRegistry | null;
56
66
  _renderer: GridRenderer | null;
57
67
  _vs: VirtualScroll | null;
@@ -62,8 +72,9 @@ export interface ComposerHost<T extends Record<string, any> = any> {
62
72
  emit(event: string, ...args: any[]): any;
63
73
  on(event: string, cb: (...args: any[]) => void): any;
64
74
  off(event: string, cb: (...args: any[]) => void): any;
75
+ /** aria-live announce. */
65
76
  _announce(msg: string): void;
66
- /** i18n: 메시지 해석(인스턴스 오버라이드 우선 → 활성 로케일 → ko → 키). / i18n: resolve a message. */
77
+ /** i18n: 메시지 해석(인스턴스 오버라이드 우선 → 활성 로케일 → ko → 키). / i18n: resolve a message (instance override first, then active locale, then ko, then the raw key). */
67
78
  t(key: string, params?: Record<string, string | number>): string;
68
79
  _doRender(startIndex: number, endIndex: number): void;
69
80
  _visRange(): [number, number];
@@ -83,30 +94,46 @@ export interface ComposerHost<T extends Record<string, any> = any> {
83
94
  getCellFormula(rowIndex: number, field: string): string | null;
84
95
  setCellFormula(rowIndex: number, field: string, formula: string): void;
85
96
  clearCellFormula(rowIndex: number, field: string): void;
86
- /** override 커널 배선 후 컴포저가 단 1회 호출(구조적 순서 관문). */
97
+ /** override 커널 배선 후 컴포저가 단 1회 호출(구조적 순서 관문). / Called exactly once by the composer after the override kernel is wired up (a structural ordering gate). */
87
98
  _mount(): void;
88
99
  }
89
- /** OpenGrid 만 알아야 하는 재귀/전역 배선을 컴포저에 주입(컴포저의 OpenGrid 역-import 회피). */
100
+ /** OpenGrid 만 알아야 하는 재귀/전역 배선을 컴포저에 주입(컴포저의 OpenGrid 역-import 회피).
101
+ * / Injects into the composer the recursive/global wiring that only `OpenGrid` needs to know
102
+ * about (avoids the composer having to reverse-import `OpenGrid`). */
90
103
  export interface ComposerHooks {
91
- /** F2 서브그리드 재귀 생성(DetailManager createSubgrid). `new OpenGrid(host, {..,_detailDepth})`. */
104
+ /** F2 서브그리드 재귀 생성(DetailManager createSubgrid). `new OpenGrid(host, {..,_detailDepth})`.
105
+ * / F2: recursively create a subgrid (DetailManager's createSubgrid) — `new OpenGrid(host, {..,_detailDepth})`.
106
+ *
107
+ * @param host - 서브그리드를 마운트할 컨테이너 엘리먼트 / Container element to mount the subgrid into
108
+ * @param subgridOptions - 서브그리드 생성 옵션 / Subgrid construction options
109
+ * @param depth - 중첩 깊이(재귀 가드) / Nesting depth (recursion guard)
110
+ * @returns 생성된 서브그리드 인스턴스 / The created subgrid instance
111
+ */
92
112
  createSubgrid: (host: HTMLElement, subgridOptions: any, depth: number) => any;
93
113
  }
114
+ /** Phase A(core) 완료 토큰. / Completion token for Phase A (core). */
94
115
  export interface CoreServicesToken {
95
116
  readonly _phase: 'core';
96
117
  }
118
+ /** Phase B(formula) 완료 토큰. / Completion token for Phase B (formula). */
97
119
  export interface FormulaServicesToken {
98
120
  readonly _phase: 'formula';
99
121
  }
122
+ /** Phase C(managers) 완료 토큰. / Completion token for Phase C (managers). */
100
123
  export interface ManagerRegistryToken {
101
124
  readonly _phase: 'managers';
102
125
  }
126
+ /** Phase D(override kernel) 완료 토큰. / Completion token for Phase D (override kernel). */
103
127
  export interface OverrideKernelToken {
104
128
  readonly _phase: 'ovk';
105
129
  }
130
+ /** Phase E(mount) 완료 토큰. / Completion token for Phase E (mount). */
106
131
  export interface MountedViewToken {
107
132
  readonly _phase: 'mounted';
108
133
  }
109
- /** compose() 산출물 핸들. 모든 협력자는 host 에 대입되며, 이 핸들은 완료 표식이다. */
134
+ /** compose() 산출물 핸들. 모든 협력자는 host 에 대입되며, 이 핸들은 완료 표식이다.
135
+ * / The handle produced by compose(). All collaborators are assigned onto the host; this
136
+ * handle is merely a completion marker. */
110
137
  export interface GridRuntime {
111
138
  readonly mounted: MountedViewToken;
112
139
  }
@@ -120,8 +147,29 @@ export interface GridRuntime {
120
147
  *
121
148
  * 협력자 생성 순서는 기존 생성자와 바이트 동일(회귀0): core → formula/recalc → 11 매니저
122
149
  * → override 커널 → mount. R2 런타임 가드는 belt-and-suspenders 로 유지된다.
150
+ * / The composition root / phased builder (R8, §6-R8, §3.1 C2, §3.3).
151
+ *
152
+ * Externalizes the object-graph assembly that used to be fused into the constructor. Each
153
+ * `build*` phase requires the previous phase's output token as a parameter, so construction
154
+ * order — in particular the invariant that `_ovk` (OverrideKernel) must be created before
155
+ * `_mount()` — is enforced by **topologically sorting the function signatures**: `mount(ovk)`
156
+ * simply does not compile without the token produced by `buildOverrideKernel()`.
157
+ *
158
+ * Collaborator creation order is byte-identical to the original constructor (zero regression):
159
+ * core → formula/recalc → 11 managers → override kernel → mount. The R2 runtime guard is kept
160
+ * as a belt-and-suspenders check.
123
161
  */
124
162
  export declare class GridComposer {
163
+ /**
164
+ * 그리드 객체그래프를 전 단계 순서대로 조립하고 mount 한다. / Assemble the grid's object
165
+ * graph through every phase, in order, and mount it.
166
+ *
167
+ * @param host - 조립 대상 OpenGrid 내부 표면 / The OpenGrid internal surface to assemble into
168
+ * @param container - 컨테이너 셀렉터 또는 엘리먼트 / Container selector or element
169
+ * @param rawOptions - 사용자 지정 그리드 옵션(정규화 전) / User-supplied grid options (pre-normalization)
170
+ * @param hooks - OpenGrid 전용 재귀/전역 배선 훅 / OpenGrid-only recursive/global wiring hooks
171
+ * @returns compose 완료 핸들 / The completion handle for compose
172
+ */
125
173
  static compose<T extends Record<string, any>>(host: ComposerHost<T>, container: string | HTMLElement, rawOptions: GridOptions<T>, hooks: ComposerHooks): GridRuntime;
126
174
  /** Phase A: 컨테이너 해석 + 옵션 정규화 + 코어 서비스(DataLayer/FlatRowModel/RowManager/ColumnLayout). */
127
175
  private static buildCoreServices;
@@ -1,10 +1,15 @@
1
1
  import { OpenGridInstance } from './types.js';
2
+ /**
3
+ * 그리드 셔틀 생성 옵션. / Grid shuttle construction options.
4
+ */
2
5
  export interface GridShuttleOptions {
3
- /** 버튼 배치 방향 (기본 'vertical') */
6
+ /** 버튼 배치 방향. 기본 'vertical'. / Button layout direction. Default 'vertical'.
7
+ * @defaultValue 'vertical' */
4
8
  layout?: 'vertical' | 'horizontal';
5
- /** 전체 이동(≫ ≪) 버튼도 표시 (기본 false) */
9
+ /** 전체 이동(≫ ≪) 버튼도 표시. 기본 false. / Also show move-all (≫ ≪) buttons. Default false.
10
+ * @defaultValue false */
6
11
  includeAll?: boolean;
7
- /** 버튼 라벨 커스터마이즈 */
12
+ /** 버튼 라벨 커스터마이즈. / Customize button labels. */
8
13
  labels?: {
9
14
  toRight?: string;
10
15
  toLeft?: string;
@@ -12,13 +17,48 @@ export interface GridShuttleOptions {
12
17
  allLeft?: string;
13
18
  };
14
19
  }
20
+ /**
21
+ * 두 그리드 사이의 셔틀 UI. / Shuttle UI between two grids.
22
+ *
23
+ * 두 그리드 사이에 화살표 버튼을 두고 "체크된 행"을 드래그 없이 버튼으로 이동(move)시킨다.
24
+ * 이동은 `grid.moveCheckedTo()` 를 호출하므로 crossGridMapping(필드 매핑)과 3단계 이벤트가
25
+ * 드래그 이동과 100% 동일하게 적용된다.
26
+ * / Places arrow buttons between two grids to move "checked rows" without dragging.
27
+ * The move delegates to `grid.moveCheckedTo()`, so crossGridMapping (field mapping) and the
28
+ * 3-stage events apply identically to drag-based moves.
29
+ *
30
+ * @example
31
+ * const shuttle = new GridShuttle(leftGrid, rightGrid, document.querySelector('#mid')!, {
32
+ * layout: 'vertical',
33
+ * includeAll: true,
34
+ * });
35
+ */
15
36
  export declare class GridShuttle {
16
37
  private _left;
17
38
  private _right;
18
39
  private _el;
40
+ /**
41
+ * @param _left - 왼쪽 그리드 인스턴스 / Left grid instance
42
+ * @param _right - 오른쪽 그리드 인스턴스 / Right grid instance
43
+ * @param mount - 셔틀 버튼을 붙일 마운트 엘리먼트 / Mount element to attach the shuttle buttons
44
+ * @param opts - 셔틀 옵션 / Shuttle options
45
+ */
19
46
  constructor(_left: OpenGridInstance, _right: OpenGridInstance, mount: HTMLElement, opts?: GridShuttleOptions);
20
47
  private _moveAll;
48
+ /** 셔틀 UI 를 DOM 에서 제거한다. / Remove the shuttle UI from the DOM. */
21
49
  destroy(): void;
22
50
  }
23
- /** 두 그리드 사이에 셔틀(화살표 이동) 버튼을 만든다 */
51
+ /**
52
+ * 두 그리드 사이에 셔틀(화살표 이동) 버튼을 만든다. / Create shuttle (arrow-move) buttons between two grids.
53
+ *
54
+ * `new GridShuttle(...)` 의 편의 팩토리. / Convenience factory for `new GridShuttle(...)`.
55
+ *
56
+ * @param left - 왼쪽 그리드 인스턴스 / Left grid instance
57
+ * @param right - 오른쪽 그리드 인스턴스 / Right grid instance
58
+ * @param mount - 셔틀 버튼을 붙일 마운트 엘리먼트 / Mount element to attach the shuttle buttons
59
+ * @param opts - 셔틀 옵션 / Shuttle options
60
+ * @returns 생성된 GridShuttle 인스턴스 / The created GridShuttle instance
61
+ * @example
62
+ * const shuttle = createGridShuttle(leftGrid, rightGrid, mountEl, { includeAll: true });
63
+ */
24
64
  export declare function createGridShuttle(left: OpenGridInstance, right: OpenGridInstance, mount: HTMLElement, opts?: GridShuttleOptions): GridShuttle;
@@ -2,18 +2,37 @@ import { DataLayer } from './DataLayer.js';
2
2
  import { VirtualScroll } from './VirtualScroll.js';
3
3
  import { GroupRow } from './GroupEngine.js';
4
4
  import { TreeNode } from './TreeEngine.js';
5
+ /**
6
+ * {@link GroupTreeManager} 의존성 주입 계약. / Dependency-injection contract for {@link GroupTreeManager}.
7
+ *
8
+ * 그룹/트리 재구성에 필요한 데이터·렌더·백킹 배선 훅을 호스트 그리드가 제공한다.
9
+ * / The host grid supplies the data/render/backing-wiring hooks needed to rebuild
10
+ * groups and trees.
11
+ */
5
12
  export interface GroupTreeDeps<T extends Record<string, any>> {
13
+ /** 현재 원본 행 배열 조회. / Look up the current raw row array. */
6
14
  getData: () => T[];
15
+ /** 현재 데이터 레이어 조회. / Look up the current data layer. */
7
16
  getDataLayer: () => DataLayer<T>;
17
+ /** 현재 그리드 옵션 조회. / Look up the current grid options. */
8
18
  getOptions: () => any;
19
+ /** 가상 스크롤 인스턴스 조회(없으면 `null`). / Look up the virtual-scroll instance (or `null`). */
9
20
  getVs: () => VirtualScroll | null;
21
+ /** 전체 재계산 렌더(총 행수 갱신 포함). / Full re-render including a total-row-count refresh. */
10
22
  doRenderFull: (totalRows: number) => void;
23
+ /** 바디를 다시 그린다. / Re-render the body. */
11
24
  doRender: () => void;
12
- /** Phase 2: OverrideKernel.getStrategy 주입(슬롯 groupKeyFn 도달용). */
25
+ /** Phase 2: OverrideKernel.getStrategy 주입(슬롯 groupKeyFn 도달용).
26
+ * / Phase 2: injected `OverrideKernel.getStrategy` (reaches the `groupKeyFn` slot). */
13
27
  getStrategy?: <F extends Function>(slot: string, fallback: F) => F;
14
28
  /**
15
29
  * Phase 0(C0.3): FlatRowModel 의 baseline backing 등록점. group/tree 진입 시 자기
16
30
  * flat 배열(`_groupFlatRows`/`_treeFlatRows`)로 교체하고, 해제 시 null(plain 복귀)로 되돌린다.
31
+ * / Phase 0 (C0.3): registration point for `FlatRowModel`'s baseline backing. Swapped
32
+ * to this manager's own flat array (`_groupFlatRows`/`_treeFlatRows`) on entering
33
+ * group/tree mode, and reset to `null` (plain mode) on exit.
34
+ *
35
+ * @param provider - flat 행 배열을 반환하는 함수, 해제 시 `null` / Function returning the flat row array, or `null` to detach
17
36
  */
18
37
  setFlatBacking: (provider: (() => Array<any>) | null) => void;
19
38
  /**
@@ -22,9 +41,27 @@ export interface GroupTreeDeps<T extends Record<string, any>> {
22
41
  * backing 위에 DetailManager 가 등록한 detail splice 까지 합성한 "최종" 총 행수이므로,
23
42
  * GroupTreeManager 는 자기 배열 길이(`_groupFlatRows.length` 등)를 직접 쓰지 않는다
24
43
  * (detail 활성 시 그 값은 실제보다 작아 스크롤/렌더 범위가 잘린다).
44
+ * / F2 (11_design_F2_v2.md §3.2 R3, resolving the "flat ownership contention" issue):
45
+ * queried right after `setFlatBacking` and passed to `VirtualScroll.setTotalRows`/
46
+ * `doRenderFull`. `FlatRowModel.count()` is the "final" total row count — it composites
47
+ * the backing just swapped in with any detail splices `DetailManager` has registered —
48
+ * so `GroupTreeManager` never uses its own array length (`_groupFlatRows.length`, etc.)
49
+ * directly (with detail active, that length is smaller than the real total and would
50
+ * truncate the scroll/render range).
51
+ *
52
+ * @returns 합성된 최종 총 행수 / The composited final total row count
25
53
  */
26
54
  getFlatCount: () => number;
27
55
  }
56
+ /**
57
+ * 그룹핑과 트리 모드를 함께 관리하는 매니저. / Manages both grouping and tree (parent/child) modes.
58
+ *
59
+ * 그룹/트리는 상호 배타적이며, 둘 다 원본 데이터를 하나의 "flat 배열"로 펼쳐
60
+ * {@link GroupTreeDeps.setFlatBacking} 을 통해 가상 스크롤의 백킹으로 등록한다.
61
+ * / Grouping and tree mode are mutually exclusive; both flatten the source data into
62
+ * a single "flat array" and register it as the virtual-scroll backing via
63
+ * {@link GroupTreeDeps.setFlatBacking}.
64
+ */
28
65
  export declare class GroupTreeManager<T extends Record<string, any> = any> {
29
66
  private _groupFields;
30
67
  private _groupExpandedKeys;
@@ -36,24 +73,71 @@ export declare class GroupTreeManager<T extends Record<string, any> = any> {
36
73
  private _isTreeMode;
37
74
  private _d;
38
75
  constructor(deps: GroupTreeDeps<T>);
76
+ /** 그룹 모드 활성 여부. / Whether group mode is active. */
39
77
  get isGroupMode(): boolean;
78
+ /** 트리 모드 활성 여부. / Whether tree mode is active. */
40
79
  get isTreeMode(): boolean;
80
+ /** 현재 펼쳐진 그룹 flat 행 배열(그룹 헤더/요약/데이터 행 혼합). / Current flattened group rows (mix of group header/summary/data rows). */
41
81
  get groupFlatRows(): Array<GroupRow<T> | T>;
82
+ /** 현재 펼쳐진 트리 flat 노드 배열(펼침 상태 반영). / Current flattened tree nodes (reflects expand/collapse state). */
42
83
  get treeFlatRows(): TreeNode<T>[];
84
+ /**
85
+ * 지정 필드로 그룹핑을 시작(또는 재설정)한다. / Start (or reset) grouping by the given fields.
86
+ *
87
+ * @param fields - 그룹 기준 필드명 배열(순서대로 중첩). 빈 배열이면 그룹 해제 / Fields to group by, in nesting order; an empty array disables grouping
88
+ */
43
89
  groupBy(fields: string[]): void;
90
+ /** 그룹핑을 해제하고 평면 모드로 복귀한다. / Disable grouping and return to flat mode. */
44
91
  clearGroup(): void;
92
+ /** 모든 그룹을 펼친다(그룹 모드가 아니면 무시). / Expand every group (no-op outside group mode). */
45
93
  expandAll(): void;
46
- /** Phase 2 슬롯 #5: groupKeyFn resolver. default = undefined(→ GroupEngine 가 row[field] 사용). */
94
+ /** Phase 2 슬롯 #5: groupKeyFn resolver. default = undefined(→ GroupEngine 가 row[field] 사용).
95
+ * / Phase 2 slot #5: groupKeyFn resolver. Default `undefined` (falls back to
96
+ * `GroupEngine` using `row[field]`).
97
+ * @internal */
47
98
  private _groupKeyFn;
99
+ /** 모든 그룹을 접는다. / Collapse every group. */
48
100
  collapseAll(): void;
101
+ /**
102
+ * 특정 그룹의 펼침/접힘을 토글한다. / Toggle a single group's expand/collapse state.
103
+ *
104
+ * @param groupKey - 대상 그룹의 키 / Key of the target group
105
+ */
49
106
  handleGroupToggle(groupKey: string): void;
107
+ /**
108
+ * 현재 그룹 필드/펼침 상태로 flat 행 배열을 재계산하고 렌더한다. / Recompute the flat row array from the current group fields/expand state and render.
109
+ */
50
110
  rebuildGroups(): void;
111
+ /**
112
+ * 트리 모드를 활성화한다(그룹 모드와 배타). / Enable tree mode (mutually exclusive with group mode).
113
+ *
114
+ * `expandOnLoad` 옵션이 켜져 있으면 전체 노드를 펼친 상태로 시작한다.
115
+ * / If the `expandOnLoad` option is on, starts with every node expanded.
116
+ */
51
117
  enableTree(): void;
118
+ /** 트리 모드를 해제하고 평면 모드로 복귀한다. / Disable tree mode and return to flat mode. */
52
119
  disableTree(): void;
120
+ /**
121
+ * 지정 노드(들)를 펼치거나 접는다. / Expand or collapse the given node(s).
122
+ *
123
+ * @param ids - 대상 노드 id, 또는 id 배열 / A single node id, or an array of node ids
124
+ * @param open - `true` 면 펼침, `false` 면 접힘(기본 `true`) / `true` to expand, `false` to collapse (default `true`)
125
+ */
53
126
  expandNodes(ids: any | any[], open?: boolean): void;
127
+ /** 모든 트리 노드를 펼친다(트리 모드가 아니면 무시). / Expand every tree node (no-op outside tree mode). */
54
128
  expandAllNodes(): void;
129
+ /** 모든 트리 노드를 접는다(트리 모드가 아니면 무시). / Collapse every tree node (no-op outside tree mode). */
55
130
  collapseAllNodes(): void;
131
+ /**
132
+ * 특정 트리 노드의 펼침/접힘을 토글한다. / Toggle a single tree node's expand/collapse state.
133
+ *
134
+ * @param nodeId - 대상 노드 id / Id of the target node
135
+ */
56
136
  handleTreeToggle(nodeId: any): void;
137
+ /**
138
+ * 현재 펼침 상태로 트리를 재구성하고 flat 행 배열을 갱신한다. / Rebuild the tree from the current expand state and refresh the flat row array.
139
+ */
57
140
  rebuildTree(): void;
141
+ /** @internal */
58
142
  private _getSummaryDefs;
59
143
  }
@@ -1,25 +1,40 @@
1
- /** render() 옵션. size 미지정 시 svg 는 viewBox/CSS 로 크기를 상속(width/height 속성 생략). */
1
+ /**
2
+ * render() 옵션. size 미지정 시 svg 는 viewBox/CSS 로 크기를 상속(width/height 속성 생략).
3
+ * / render() options. When size is omitted, the svg inherits its size from viewBox/CSS (width/height attrs skipped).
4
+ */
2
5
  export interface IconRenderOptions {
3
- /** px 정사각 크기(width=height). 미지정 시 속성 생략(CSS/컨테이너가 결정). */
6
+ /** px 정사각 크기(width=height). 미지정 시 속성 생략(CSS/컨테이너가 결정). / Square size in px (width=height); omitted when unset (CSS/container decides). */
4
7
  size?: number;
5
- /** 접근성 제목. 지정 시 <title> + role="img" 추가(스크린리더). 미지정 시 장식용(부모가 aria 담당). */
8
+ /** 접근성 제목. 지정 시 <title> + role="img" 추가(스크린리더). 미지정 시 장식용(부모가 aria 담당). / Accessible title; adds <title> + role="img" when set (screen readers). Decorative otherwise (parent owns aria). */
6
9
  title?: string;
7
- /** true → SVGElement(DOMParser) 반환. 기본 false → SVG 마크업 문자열. */
10
+ /** true → SVGElement(DOMParser) 반환. 기본 false → SVG 마크업 문자열. / true → return an SVGElement (DOMParser). Default false → SVG markup string. @defaultValue false */
8
11
  el?: boolean;
9
12
  }
10
13
  /**
11
14
  * 시맨틱 ROLE → 아이콘 key(`BOOTSTRAP_ICONS` 의 symbolId) 기본 매핑.
15
+ * / Default map of semantic ROLE → icon key (a `BOOTSTRAP_ICONS` symbolId).
16
+ *
12
17
  * 렌더 코드는 이 역할 이름만 참조한다. key 교체는 이 표(혹은 register/setIcon)만 고치면 된다.
13
18
  * 참고 스왑: `row.delete`→`trash3`(Bootstrap 의 표준 휴지통, task 의 'trash' 동족), `chart.line`→`graph-up`.
19
+ * / Render code references only these role names; swapping a glyph means editing this table (or register/setIcon).
14
20
  */
15
21
  export declare const DEFAULT_ICON_ROLES: Readonly<Record<string, string>>;
16
22
  /**
17
23
  * IconRegistry — role → 글리프 본문(inner SVG markup) 해석 + svg 래핑.
24
+ * / IconRegistry — resolves role → glyph body (inner SVG markup) and wraps it in an svg.
18
25
  *
19
26
  * 저장 단위는 **글리프 본문 문자열**(<path>/<g> 마크업). register(role, svgOrKey) 는
20
27
  * - svgOrKey 가 `BOOTSTRAP_ICONS` 의 알려진 key 면 그 본문으로,
21
28
  * - 아니면 **원시 SVG 본문**(사용자 커스텀 <path…>)으로 저장한다.
22
29
  * 부모 체인(_parent)으로 per-instance 오버라이드 레지스트리를 전역 위에 얹는다(멀티그리드 격리).
30
+ * / The storage unit is the glyph body string (<path>/<g> markup). register(role, svgOrKey) stores either
31
+ * the body of a known `BOOTSTRAP_ICONS` key, or the raw SVG body otherwise. A parent chain (_parent) layers
32
+ * a per-instance override registry on top of the global one (multi-grid isolation).
33
+ *
34
+ * @example
35
+ * const reg = iconRegistry.child();
36
+ * reg.register('sort.asc', 'arrow-up');
37
+ * const svg = reg.render('sort.asc', { size: 16 }) as string;
23
38
  */
24
39
  export declare class IconRegistry {
25
40
  private _roles;
@@ -28,28 +43,60 @@ export declare class IconRegistry {
28
43
  /**
29
44
  * role 에 글리프를 등록/교체. svgOrKey 가 알려진 아이콘 key 면 그 본문을, 아니면 원시 SVG
30
45
  * 본문 마크업으로 간주한다(코어 편집 없이 아이콘 교체 — OCP).
46
+ * / Register/replace a glyph for a role. A known icon key resolves to its body; otherwise svgOrKey is
47
+ * treated as raw SVG body markup (swap icons without editing core — OCP).
48
+ *
49
+ * @param role - 시맨틱 역할 키(예: 'sort.asc') / Semantic role key (e.g. 'sort.asc')
50
+ * @param svgOrKey - 알려진 아이콘 key 또는 원시 SVG 본문 / A known icon key or raw SVG body
51
+ * @returns 체이닝용 this / this for chaining
31
52
  */
32
53
  register(role: string, svgOrKey: string): this;
33
- /** role 이 (자신 또는 부모 체인에) 등록돼 있는가. */
54
+ /** role 이 (자신 또는 부모 체인에) 등록돼 있는가. / Whether a role is registered (self or parent chain). */
34
55
  has(role: string): boolean;
35
- /** role → 글리프 본문(inner markup). 미등록이면 null(부모 체인까지 조회). */
56
+ /**
57
+ * role → 글리프 본문(inner markup). 미등록이면 null(부모 체인까지 조회).
58
+ * / role → glyph body (inner markup); null if unregistered (searches up the parent chain).
59
+ *
60
+ * @param role - 조회할 역할 키 / Role key to resolve
61
+ * @returns 글리프 본문 또는 null / Glyph body or null
62
+ */
36
63
  resolveBody(role: string): string | null;
37
- /** 이 레지스트리를 부모로 하는 자식(per-instance 오버라이드용) 생성. */
64
+ /** 이 레지스트리를 부모로 하는 자식(per-instance 오버라이드용) 생성. / Create a child registry with this as parent (for per-instance overrides). */
38
65
  child(): IconRegistry;
39
66
  /**
40
67
  * role 을 `<svg viewBox=ICON_VIEWBOX>` 로 렌더. 기본 반환은 SVG 마크업 문자열(innerHTML 용);
41
68
  * opts.el 이면 SVGElement. 미지원 role 은 빈 svg 폴백(never throw).
42
69
  * 스킨 토큰: fill=currentColor(presentation attr) + stroke-linejoin=var(--og-icon-corner,miter).
70
+ * / Render a role as `<svg viewBox=ICON_VIEWBOX>`. Returns SVG markup string by default (for innerHTML);
71
+ * opts.el returns an SVGElement. Unknown roles fall back to an empty svg (never throws).
72
+ *
73
+ * @param role - 렌더할 역할 키 / Role key to render
74
+ * @param opts - 렌더 옵션 / Render options
75
+ * @returns SVG 마크업 문자열 또는 SVGElement(opts.el) / SVG markup string, or SVGElement when opts.el
43
76
  */
44
77
  render(role: string, opts?: IconRenderOptions): string | SVGElement;
45
- /** 등록된 role 목록(자신만, 디버깅/테스트용). */
78
+ /** 등록된 role 목록(자신만, 디버깅/테스트용). / List of registered roles (self only; for debugging/tests). */
46
79
  roles(): string[];
47
80
  }
48
81
  /**
49
82
  * 프로세스 공유 기본 아이콘 레지스트리(시맨틱 role 시드 완료).
83
+ * / Process-shared default icon registry (seeded with semantic roles).
84
+ *
50
85
  * CellRenderer 등 팩토리 생성 렌더러(인스턴스 컨텍스트 없음)가 이 초크포인트로 아이콘을 얻는다.
51
86
  * per-instance 교체는 `grid.setIcon()`(이 레지스트리의 child) 로, 전역 확장은 `defineIconSet()` 로.
87
+ * / Factory-created renderers (e.g. CellRenderer, without instance context) obtain icons through this
88
+ * chokepoint. Per-instance swaps go through `grid.setIcon()` (a child of this registry); global extension
89
+ * through `defineIconSet()`.
52
90
  */
53
91
  export declare const iconRegistry: IconRegistry;
54
- /** 편의 정적 render — 공유 기본 레지스트리로 위임(`IconRegistry.render(role, opts)`). */
92
+ /**
93
+ * 편의 정적 render — 공유 기본 레지스트리로 위임(`IconRegistry.render(role, opts)`).
94
+ * / Convenience static render — delegates to the shared default registry (`IconRegistry.render(role, opts)`).
95
+ *
96
+ * @param role - 렌더할 역할 키 / Role key to render
97
+ * @param opts - 렌더 옵션 / Render options
98
+ * @returns SVG 마크업 문자열 또는 SVGElement(opts.el) / SVG markup string, or SVGElement when opts.el
99
+ * @example
100
+ * el.innerHTML = renderIcon('filter') as string;
101
+ */
55
102
  export declare function renderIcon(role: string, opts?: IconRenderOptions): string | SVGElement;
@@ -2,45 +2,129 @@ import { DataLayer } from './DataLayer.js';
2
2
  import { ColumnLayout } from './ColumnLayout.js';
3
3
  import { CellEditManager } from './CellEditManager.js';
4
4
  import { RowManager } from './RowManager.js';
5
- /** F1 범위 선택 배선 훅(M-3/M-4/M-5) — RangeSelectionManager 가 그대로 구현한다. */
5
+ /**
6
+ * F1 범위 선택 배선 훅(M-3/M-4/M-5) — RangeSelectionManager 가 그대로 구현한다.
7
+ * / F1 range-selection wiring hooks (M-3/M-4/M-5) — implemented directly by
8
+ * `RangeSelectionManager`.
9
+ */
6
10
  export interface RangeKeyboardHooks {
11
+ /** 범위 선택 모드(`selection:'cells'`)가 활성인지. / Whether range-select mode (`selection:'cells'`) is active. */
7
12
  isEnabled(): boolean;
13
+ /** 현재 유효한 범위 선택이 있는지. / Whether there is a currently valid range selection. */
8
14
  hasSelection(): boolean;
15
+ /**
16
+ * 포커스를 지정 방향으로 확장한다(Shift+화살표). / Extend the focus range in the given direction (Shift+Arrow).
17
+ * @param dir - 확장 방향 / Direction to extend
18
+ */
9
19
  extendFocus(dir: 'up' | 'down' | 'left' | 'right'): void;
20
+ /**
21
+ * Ctrl+D/Ctrl+R 채우기를 축 방향으로 실행한다. / Run a Ctrl+D/Ctrl+R fill along the given axis.
22
+ * @param axis - 채우기 축(`'down'` = Ctrl+D, `'right'` = Ctrl+R) / Fill axis (`'down'` for Ctrl+D, `'right'` for Ctrl+R)
23
+ */
10
24
  ctrlFill(axis: 'down' | 'right'): void;
25
+ /** 범위 선택을 해제한다. / Clear the range selection. */
11
26
  clear(): void;
12
- /** 범위 없으면 null(호출측이 기존 focusCell/selectedRows 경로로 폴백) */
27
+ /**
28
+ * 범위 없으면 null(호출측이 기존 focusCell/selectedRows 경로로 폴백)
29
+ * / Returns `null` when there is no range (caller falls back to the
30
+ * focusCell/selectedRows path).
31
+ * @returns 범위의 TSV 텍스트, 또는 `null` / TSV text of the range, or `null`
32
+ */
13
33
  copyText(): string | null;
14
- /** true = 배치 경유로 처리함, false = 범위 없음(폴백) */
34
+ /**
35
+ * true = 배치 경유로 처리함, false = 범위 없음(폴백)
36
+ * / `true` if handled via the batch path, `false` if there is no range (caller falls back).
37
+ * @param text - 붙여넣을 TSV 텍스트 / TSV text to paste
38
+ * @returns 배치 경유로 처리되었는지 여부 / Whether this was handled via the batch path
39
+ */
15
40
  pasteText(text: string): boolean;
16
41
  }
42
+ /**
43
+ * {@link KeyboardManager} 의존성 주입 계약. / Dependency-injection contract for {@link KeyboardManager}.
44
+ */
17
45
  export interface KeyboardDeps<T extends Record<string, any>> {
46
+ /** 셀 편집 매니저 조회. / Look up the cell edit manager. */
18
47
  getEditMgr: () => CellEditManager<T>;
48
+ /** 행 선택/체크 매니저 조회. / Look up the row selection/check manager. */
19
49
  getRowMgr: () => RowManager<T>;
50
+ /** 현재 데이터 레이어 조회. / Look up the current data layer. */
20
51
  getData: () => DataLayer<T>;
52
+ /** 현재 컬럼 레이아웃 조회. / Look up the current column layout. */
21
53
  getColLayout: () => ColumnLayout<T>;
54
+ /** 현재 그리드 옵션 조회. / Look up the current grid options. */
22
55
  getOptions: () => any;
56
+ /** 키보드 포커스 셀을 설정한다. / Set the keyboard-focused cell. */
23
57
  setFocusCell: (ri: number, ci: number) => void;
58
+ /** 행 드래그(Ctrl+화살표) 이동을 처리한다. / Handle a row drag (Ctrl+Arrow) move. */
24
59
  handleRowDrop: (from: number, to: number) => void;
60
+ /** 바디를 다시 그린다. / Re-render the body. */
25
61
  doRender: () => void;
62
+ /** 스크린리더용 상태 안내. / Announce a status message for screen readers. */
26
63
  announce: (msg: string) => void;
27
64
  /** i18n: 행 이동 announce 해석. / i18n: resolve row-move announce. */
28
65
  t: (key: string, params?: Record<string, string | number>) => string;
66
+ /** 그리드 이벤트를 발행한다. / Emit a grid event. */
29
67
  emit: (event: string, ...args: any[]) => void;
68
+ /** 현재 렌더된 가시 행 범위(`[start, end]`)를 조회. / Look up the currently rendered visible row range (`[start, end]`). */
30
69
  visRange: () => [number, number];
70
+ /** 포커스 셀에 대한 공개 키 이벤트를 발행한다. / Emit a public key event for the focused cell. */
31
71
  handleCellKeyEvt: (eventName: 'cellKeyDown' | 'cellKeyUp' | 'cellKeyPress', e: KeyboardEvent) => void;
32
- /** M-4: 붙여넣기 쓰기 퍼널을 writeCell(배치)로 교체(CON-2, 의도적 동작 변경) */
72
+ /** M-4: 붙여넣기 쓰기 퍼널을 writeCell(배치)로 교체(CON-2, 의도적 동작 변경)
73
+ * / M-4: replaces the paste write funnel with batched `writeCell` (CON-2, an
74
+ * intentional behavior change). */
33
75
  writeCells?: (patches: Array<{
34
76
  rowIndex: number;
35
77
  field: string;
36
78
  value: any;
37
79
  }>) => number;
80
+ /** 범위 선택 배선 훅 조회(범위 선택 미사용 시 `null`). / Look up the range-selection wiring hooks (or `null` when range selection is unused). */
38
81
  getRangeHooks?: () => RangeKeyboardHooks | null;
39
82
  }
83
+ /**
84
+ * 키보드 내비게이션·단축키(복사/붙여넣기/행 이동/범위 선택)를 처리하는 매니저.
85
+ * / Handles keyboard navigation and shortcuts (copy/paste, row move, range selection).
86
+ *
87
+ * `handleKeyDown` 하나로 모든 키 입력을 받아, 클립보드·범위선택 훅·기본 셀 포커스
88
+ * 이동 순으로 우선순위를 매겨 위임한다.
89
+ * / A single `handleKeyDown` entry point receives all key input and dispatches by
90
+ * priority: clipboard shortcuts, range-selection hooks, then plain cell-focus movement.
91
+ */
40
92
  export declare class KeyboardManager<T extends Record<string, any> = any> {
41
93
  private _d;
42
94
  constructor(deps: KeyboardDeps<T>);
95
+ /**
96
+ * 그리드 컨테이너의 키다운 이벤트를 처리한다. / Handle a keydown event on the grid container.
97
+ *
98
+ * 편집 중이면 무시하고, 이후 순서대로 처리한다: 공개 `cellKeyDown` 발행 →
99
+ * 복사/붙여넣기(Ctrl+C/V) → 범위 채우기(Ctrl+D/R)·범위 확장(Shift+화살표) →
100
+ * 행 드래그(Ctrl+화살표) → 기본 셀 포커스 이동/Tab/Home/End/PageUp/PageDown →
101
+ * 체크·선택 토글(Space) → 편집 시작(F2/Enter) → 포커스/범위 해제(Escape).
102
+ * / While editing, this is a no-op. Otherwise, processing order is: emit the
103
+ * public `cellKeyDown` event → copy/paste (Ctrl+C/V) → range fill (Ctrl+D/R) /
104
+ * range extend (Shift+Arrow) → row drag (Ctrl+Arrow) → plain cell-focus movement
105
+ * (arrows/Tab/Home/End/PageUp/PageDown) → check/select toggle (Space) → start
106
+ * editing (F2/Enter) → clear focus/range (Escape).
107
+ *
108
+ * @param e - 원본 키보드 이벤트 / The originating keyboard event
109
+ */
43
110
  handleKeyDown(e: KeyboardEvent): void;
111
+ /**
112
+ * 현재 선택을 클립보드에 TSV 로 복사한다. / Copy the current selection to the clipboard as TSV.
113
+ *
114
+ * 우선순위: 범위 선택(있으면 그 TSV) → 단일 포커스 셀 값 → 다중 선택 행(TSV).
115
+ * / Priority: range selection (its TSV, if any) → single focused cell value →
116
+ * multi-row selection (TSV).
117
+ * @internal
118
+ */
44
119
  private _copyToClipboard;
120
+ /**
121
+ * 클립보드의 TSV 텍스트를 붙여넣는다. / Paste TSV text from the clipboard.
122
+ *
123
+ * 범위 선택이 있으면 범위 붙여넣기(타일 전개)가 우선하고, 그렇지 않으면 포커스
124
+ * 셀을 기준으로 배치 `writeCells` 를 호출한다.
125
+ * / Range paste (tiled expansion) takes priority when a range is selected;
126
+ * otherwise this calls batched `writeCells` anchored at the focus cell.
127
+ * @internal
128
+ */
45
129
  private _pasteFromClipboard;
46
130
  }
@@ -1,21 +1,22 @@
1
- /** 지원 마스킹 타입 */
1
+ /** 지원 마스킹 타입. / Supported masking types. */
2
2
  export type MaskType = 'ssn' | 'phone' | 'mobile' | 'email' | 'credit' | 'account' | 'password' | 'name' | 'ip' | 'partial';
3
- /** 마스킹 상세 옵션 */
3
+ /** 마스킹 상세 옵션. / Detailed masking options. */
4
4
  export interface MaskDef {
5
+ /** 마스킹 타입. / Masking type. */
5
6
  type: MaskType;
6
- /** 마스킹 치환 문자 (기본: '*') */
7
+ /** 마스킹 치환 문자. 기본 '*'. / Masking replacement character. Default '*'. @defaultValue '*' */
7
8
  char?: string;
8
- /** partial/account: 앞 N자리 표시 */
9
+ /** partial/account: 앞 N자리 표시. / partial/account: reveal the first N characters. */
9
10
  visiblePrefix?: number;
10
- /** partial/account: 뒤 N자리 표시 */
11
+ /** partial/account: 뒤 N자리 표시. / partial/account: reveal the last N characters. */
11
12
  visibleSuffix?: number;
12
13
  }
13
14
  /**
14
- * 원본 값에 마스킹을 적용해 표시용 문자열을 반환.
15
+ * 원본 값에 마스킹을 적용해 표시용 문자열을 반환. / Apply masking to a raw value and return a display string.
15
16
  *
16
- * @param value 원본 값 (null/undefined → 빈 문자열 그대로 반환)
17
- * @param maskDef 마스킹 타입 또는 상세 옵션
18
- * @returns 마스킹된 문자열
17
+ * @param value - 원본 값 (null/undefined → 빈 문자열 그대로 반환) / Raw value (null/undefined → empty string)
18
+ * @param maskDef - 마스킹 타입 또는 상세 옵션 / Masking type or detailed options
19
+ * @returns 마스킹된 문자열 / The masked string
19
20
  *
20
21
  * @example
21
22
  * applyMask('930101-1234567', 'ssn') // '930101-1******'