open-grid 1.1.1 → 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.
- package/CHANGELOG.md +32 -0
- package/README.md +30 -1
- package/dist/OpenGrid-0r_543Kj.cjs +7192 -0
- package/dist/OpenGrid-HmhGVC2V.js +7203 -0
- package/dist/open-grid-react.cjs +27 -1
- package/dist/open-grid-react.js +22 -82
- package/dist/open-grid-vue.cjs +31 -1
- package/dist/open-grid-vue.js +29 -79
- package/dist/open-grid.cjs +272 -6
- package/dist/open-grid.js +174 -260
- package/dist/types/core/CellEditManager.d.ts +75 -0
- package/dist/types/core/CellEventHandler.d.ts +99 -2
- package/dist/types/core/ChartManager.d.ts +53 -3
- package/dist/types/core/ContextMenu.d.ts +48 -3
- package/dist/types/core/CrossGridController.d.ts +86 -15
- package/dist/types/core/CrossGridRegistry.d.ts +36 -2
- package/dist/types/core/DetailManager.d.ts +108 -15
- package/dist/types/core/ExportManager.d.ts +73 -1
- package/dist/types/core/ExtensionPointRegistry.d.ts +160 -14
- package/dist/types/core/FilterPanel.d.ts +21 -3
- package/dist/types/core/FilterSelect.d.ts +41 -14
- package/dist/types/core/FindBarManager.d.ts +32 -0
- package/dist/types/core/FlatRowModel.d.ts +54 -11
- package/dist/types/core/FooterManager.d.ts +53 -1
- package/dist/types/core/FormulaController.d.ts +141 -10
- package/dist/types/core/GridComposer.d.ts +57 -4
- package/dist/types/core/GridRenderer.d.ts +3 -0
- package/dist/types/core/GridShuttle.d.ts +44 -4
- package/dist/types/core/GroupTreeManager.d.ts +86 -2
- package/dist/types/core/IconRegistry.d.ts +56 -9
- package/dist/types/core/KeyboardManager.d.ts +90 -4
- package/dist/types/core/MaskingEngine.d.ts +10 -9
- package/dist/types/core/MutationService.d.ts +115 -10
- package/dist/types/core/OpenGrid.d.ts +393 -34
- package/dist/types/core/OrgChart.d.ts +56 -1
- package/dist/types/core/OverrideKernel.d.ts +59 -15
- package/dist/types/core/Pagination.d.ts +44 -5
- package/dist/types/core/RangeSelectionManager.d.ts +123 -7
- package/dist/types/core/RenderController.d.ts +56 -0
- package/dist/types/core/RowManager.d.ts +55 -0
- package/dist/types/core/SkinRegistry.d.ts +51 -15
- package/dist/types/core/SortFilterManager.d.ts +82 -1
- package/dist/types/core/TriggerManager.d.ts +46 -0
- package/dist/types/core/WorksheetManager.d.ts +65 -3
- package/dist/types/core/XmlConverter.d.ts +56 -23
- package/dist/types/core/chart/types.d.ts +107 -10
- package/dist/types/core/detail/DetailGlyph.d.ts +3 -1
- package/dist/types/core/editors/CellEditor.d.ts +29 -2
- package/dist/types/core/formula/types.d.ts +71 -8
- package/dist/types/core/i18n/LocaleRegistry.d.ts +0 -0
- package/dist/types/core/i18n/interpolate.d.ts +5 -0
- package/dist/types/core/i18n/locales/en.d.ts +166 -0
- package/dist/types/core/i18n/locales/ko.d.ts +166 -0
- package/dist/types/core/i18n/types.d.ts +249 -0
- package/dist/types/core/range/RangeQuery.d.ts +24 -2
- package/dist/types/core/renderers/CellRenderer.d.ts +105 -8
- package/dist/types/core/types.d.ts +352 -96
- package/dist/types/index.d.ts +22 -0
- package/dist/xlsx.min-BQ1o3sB6.cjs +11793 -0
- package/dist/{xlsx.min-Wavxcamn.js → xlsx.min-Bbz2ZypC.js} +453 -566
- package/package.json +4 -1
- package/dist/OpenGrid-LcZ5iixx.cjs +0 -97
- package/dist/OpenGrid-yg4mw6Ge.js +0 -9505
- package/dist/xlsx.min-Bx-LxWOf.cjs +0 -138
|
@@ -1,20 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 조직도 노드 카드의 컬럼(필드) 정의. / Column (field) definition for an org-chart node card.
|
|
3
|
+
*/
|
|
1
4
|
export interface OrgChartColumnDef {
|
|
5
|
+
/** 표시할 데이터 필드명. / Data field name to display. */
|
|
2
6
|
field: string;
|
|
7
|
+
/** 셀 래퍼에 추가할 CSS 클래스명. / Extra CSS class name for the cell wrapper. */
|
|
3
8
|
className?: string;
|
|
9
|
+
/** 인라인 스타일 문자열 또는 (값, 행)→스타일 함수. / Inline style string or (value, row)→style function. */
|
|
4
10
|
style?: string | ((value: any, row: Record<string, any>) => string);
|
|
11
|
+
/** 커스텀 렌더러. 문자열 반환 시 innerHTML, 엘리먼트 반환 시 append. / Custom renderer; a string is set as innerHTML, an element is appended. */
|
|
5
12
|
renderer?: (value: any, row: Record<string, any>) => HTMLElement | string;
|
|
6
13
|
}
|
|
14
|
+
/**
|
|
15
|
+
* 조직도 생성 옵션. / Org-chart construction options.
|
|
16
|
+
*/
|
|
7
17
|
export interface OrgChartOptions {
|
|
18
|
+
/** 각 행의 고유 id 필드명. / Field name holding each row's unique id. */
|
|
8
19
|
idField: string;
|
|
20
|
+
/** 부모 id 를 담은 필드명(트리 구성 기준). / Field name holding the parent id (tree structure key). */
|
|
9
21
|
parentIdField: string;
|
|
22
|
+
/** 노드 카드에 렌더할 컬럼 정의 배열. / Column definitions rendered inside each node card. */
|
|
10
23
|
columns: OrgChartColumnDef[];
|
|
24
|
+
/** 노드 카드 너비(px). 기본 160. / Node card width in px. Default 160. @defaultValue 160 */
|
|
11
25
|
nodeWidth?: number;
|
|
26
|
+
/** 노드 카드 높이(px). 기본 72. / Node card height in px. Default 72. @defaultValue 72 */
|
|
12
27
|
nodeHeight?: number;
|
|
28
|
+
/** 레벨(세대) 간 세로 간격(px). 기본 52. / Vertical gap between levels in px. Default 52. @defaultValue 52 */
|
|
13
29
|
levelGap?: number;
|
|
30
|
+
/** 형제 노드 간 가로 간격(px). 기본 20. / Horizontal gap between siblings in px. Default 20. @defaultValue 20 */
|
|
14
31
|
siblingGap?: number;
|
|
32
|
+
/** 최초 로드 시 전체 펼침 여부. 기본 true. / Whether to expand all on first load. Default true. @defaultValue true */
|
|
15
33
|
expandOnLoad?: boolean;
|
|
34
|
+
/** 노드 클릭 콜백 (id, 행데이터). / Node click callback (id, row data). */
|
|
16
35
|
onNodeClick?: (id: any, data: Record<string, any>) => void;
|
|
17
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* 조직도 컴포넌트. / Org-chart component.
|
|
39
|
+
*
|
|
40
|
+
* 부모/자식 관계(idField/parentIdField)를 가진 평면 데이터를 트리로 구성해
|
|
41
|
+
* SVG 연결선 + 노드 카드로 렌더한다. 그리드와 독립된 standalone 컴포넌트다.
|
|
42
|
+
* / Builds a tree from flat parent/child data (idField/parentIdField) and renders it as
|
|
43
|
+
* SVG connectors plus node cards. A standalone component independent of the grid.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* const chart = new OrgChart('#org', {
|
|
47
|
+
* idField: 'id', parentIdField: 'managerId',
|
|
48
|
+
* columns: [{ field: 'name' }, { field: 'title' }],
|
|
49
|
+
* });
|
|
50
|
+
* chart.setData([{ id: 1, managerId: null, name: 'CEO', title: '대표' }]);
|
|
51
|
+
*/
|
|
18
52
|
export declare class OrgChart {
|
|
19
53
|
private _container;
|
|
20
54
|
private _opts;
|
|
@@ -22,12 +56,33 @@ export declare class OrgChart {
|
|
|
22
56
|
private _roots;
|
|
23
57
|
private _expandedKeys;
|
|
24
58
|
private _selectedId;
|
|
59
|
+
/**
|
|
60
|
+
* @param selector - 마운트할 컨테이너 셀렉터 문자열 또는 엘리먼트 / Container selector string or element to mount into
|
|
61
|
+
* @param opts - 조직도 옵션 / Org-chart options
|
|
62
|
+
*/
|
|
25
63
|
constructor(selector: string | HTMLElement, opts: OrgChartOptions);
|
|
64
|
+
/**
|
|
65
|
+
* 조직도 데이터를 설정하고 렌더한다. / Set org-chart data and render.
|
|
66
|
+
*
|
|
67
|
+
* @param data - 부모/자식 관계를 가진 평면 행 배열 / Flat array of rows with parent/child relations
|
|
68
|
+
*/
|
|
26
69
|
setData(data: Record<string, any>[]): void;
|
|
70
|
+
/**
|
|
71
|
+
* COLOR 축 테마를 컨테이너에 설정한다. / Set the COLOR-axis theme on the container.
|
|
72
|
+
*
|
|
73
|
+
* @param theme - data-og-theme 값 / data-og-theme value
|
|
74
|
+
*/
|
|
27
75
|
setTheme(theme: string): void;
|
|
28
|
-
/**
|
|
76
|
+
/**
|
|
77
|
+
* R12b: FORM(스킨) 축 — data-og-skin 을 자기 컨테이너에 설정(setTheme 과 동형, 색과 직교).
|
|
78
|
+
* / R12b: FORM (skin) axis — set data-og-skin on the container (symmetric to setTheme, orthogonal to color).
|
|
79
|
+
*
|
|
80
|
+
* @param skin - data-og-skin 값 / data-og-skin value
|
|
81
|
+
*/
|
|
29
82
|
setSkin(skin: string): void;
|
|
83
|
+
/** 모든 노드를 펼친다. / Expand all nodes. */
|
|
30
84
|
expandAll(): void;
|
|
85
|
+
/** 모든 노드를 접는다(루트만 표시). / Collapse all nodes (roots only). */
|
|
31
86
|
collapseAll(): void;
|
|
32
87
|
private _toggle;
|
|
33
88
|
private _rebuild;
|
|
@@ -12,17 +12,34 @@
|
|
|
12
12
|
* 본 커널은 단독 클래스로, OpenGrid 인스턴스를 host 로 받아 프로토타입 메서드를
|
|
13
13
|
* 인스턴스 프로퍼티로 shadowing(순수 런타임 래핑, C1-clean) 한다. 소스 본문 0줄 수정.
|
|
14
14
|
*/
|
|
15
|
+
/** override 커널의 호스트(임의 메서드를 가진 객체, 보통 OpenGrid 인스턴스). / Host of the override kernel (an object with arbitrary methods, usually an OpenGrid instance). */
|
|
15
16
|
export interface OverrideKernelHost {
|
|
16
17
|
[name: string]: any;
|
|
17
18
|
}
|
|
18
|
-
/**
|
|
19
|
+
/**
|
|
20
|
+
* override() 호출 시 레이어가 받는 함수 시그니처: 첫 인자는 안쪽(원본 근접) 함수.
|
|
21
|
+
* / Layer function signature received by override(): the first argument is the inner (closest-to-original) function.
|
|
22
|
+
*/
|
|
19
23
|
export type OverrideLayer = (orig: (...args: any[]) => any, ...args: any[]) => any;
|
|
24
|
+
/** override 옵션. / Override options. */
|
|
20
25
|
export interface OverrideOptions {
|
|
21
|
-
/** 동일 name 재진입을 허용(정당한 재귀). 기본 false. */
|
|
26
|
+
/** 동일 name 재진입을 허용(정당한 재귀). 기본 false. / Allow re-entry for the same name (legitimate recursion). Default false. @defaultValue false */
|
|
22
27
|
reentrant?: boolean;
|
|
23
|
-
/** 'fallback' → 레이어 예외 시 경고 후 orig 실행(멱등 가정). 미지정 시 strict(전파). */
|
|
28
|
+
/** 'fallback' → 레이어 예외 시 경고 후 orig 실행(멱등 가정). 미지정 시 strict(전파). / 'fallback' → on layer exception, warn then run orig (idempotent assumption); otherwise strict (propagate). */
|
|
24
29
|
onError?: 'fallback';
|
|
25
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* `grid.override()` 확장 커널. / The `grid.override()` extension kernel.
|
|
33
|
+
*
|
|
34
|
+
* OpenGrid 인스턴스를 host 로 받아 프로토타입 메서드를 인스턴스 프로퍼티로 shadowing 한다
|
|
35
|
+
* (순수 런타임 래핑, 소스 본문 0줄 수정). FIFO 합성 + 재진입 가드 + 에러 격리를 제공한다.
|
|
36
|
+
* / Takes an OpenGrid instance as host and shadows prototype methods with instance properties
|
|
37
|
+
* (pure runtime wrapping, zero source edits). Provides FIFO composition, re-entry guarding, and error isolation.
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* const k = new OverrideKernel(grid);
|
|
41
|
+
* k.override('setData', (orig, rows) => orig(rows.filter(r => r.active)));
|
|
42
|
+
*/
|
|
26
43
|
export declare class OverrideKernel {
|
|
27
44
|
private _host;
|
|
28
45
|
/** name → this-bound 원본 함수 (최초 1회 보존) */
|
|
@@ -39,32 +56,59 @@ export declare class OverrideKernel {
|
|
|
39
56
|
private _strict;
|
|
40
57
|
/** F3: 재귀 깊이 제한 */
|
|
41
58
|
private _maxDepth;
|
|
59
|
+
/**
|
|
60
|
+
* @param host - override 대상 호스트 객체 / Host object to override
|
|
61
|
+
* @param opts - strict(기본 true, 예외 전파) / maxDepth(기본 32, 재귀 깊이 제한) / strict (default true, propagate) / maxDepth (default 32, recursion depth limit)
|
|
62
|
+
*/
|
|
42
63
|
constructor(host: OverrideKernelHost, opts?: {
|
|
43
64
|
strict?: boolean;
|
|
44
65
|
maxDepth?: number;
|
|
45
66
|
});
|
|
46
67
|
/**
|
|
47
|
-
* 메서드 override 등록.
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
68
|
+
* 메서드 override 등록. / Register a method override.
|
|
69
|
+
*
|
|
70
|
+
* 1. 최초 1회 원본을 this-bound 로 보존. / Preserve the original once, this-bound.
|
|
71
|
+
* 2. 레이어 push (FIFO 등록순). / Push the layer (FIFO registration order).
|
|
72
|
+
* 3. reduce 좌측폴드로 합성(나중 등록 = 최외곽). / Compose via reduce left-fold (later registration = outermost).
|
|
73
|
+
* 4. 재진입 가드 + 에러 격리로 감싼 dispatcher 를 host[name] 인스턴스 프로퍼티에 할당. / Assign a re-entry-guarded, error-isolated dispatcher to the host[name] instance property.
|
|
74
|
+
*
|
|
75
|
+
* @param name - override 대상 메서드명 / Method name to override
|
|
76
|
+
* @param fn - override 레이어(첫 인자는 안쪽 orig) / Override layer (first arg is the inner orig)
|
|
77
|
+
* @param opts - override 옵션 / Override options
|
|
78
|
+
* @returns 체이닝용 host / The host for chaining
|
|
52
79
|
*/
|
|
53
80
|
override(name: string, fn: OverrideLayer, opts?: OverrideOptions): OverrideKernelHost;
|
|
54
81
|
/** 합성된 dispatcher 생성. override/restore 시점마다 재구성. */
|
|
55
82
|
private _buildDispatcher;
|
|
56
|
-
/**
|
|
83
|
+
/**
|
|
84
|
+
* strategy 슬롯 등록(매니저 배선용 API). / Register a strategy slot (manager-wiring API).
|
|
85
|
+
*
|
|
86
|
+
* @param slot - 전략 슬롯 이름 / Strategy slot name
|
|
87
|
+
* @param fn - 전략 함수 / Strategy function
|
|
88
|
+
* @returns 체이닝용 host / The host for chaining
|
|
89
|
+
*/
|
|
57
90
|
strategy(slot: string, fn: Function): OverrideKernelHost;
|
|
58
|
-
/**
|
|
91
|
+
/**
|
|
92
|
+
* strategy 슬롯 조회 — 미등록 시 fallback 반환(매니저 read API). / Read a strategy slot — returns fallback when unregistered (manager read API).
|
|
93
|
+
*
|
|
94
|
+
* @param slot - 전략 슬롯 이름 / Strategy slot name
|
|
95
|
+
* @param fallback - 미등록 시 반환할 기본 함수 / Default function returned when unregistered
|
|
96
|
+
* @returns 등록된 전략 또는 fallback / The registered strategy or fallback
|
|
97
|
+
*/
|
|
59
98
|
getStrategy<F extends Function>(slot: string, fallback: F): F;
|
|
60
|
-
/** 슬롯 등록 여부. */
|
|
99
|
+
/** 전략 슬롯 등록 여부. / Whether a strategy slot is registered. */
|
|
61
100
|
hasStrategy(slot: string): boolean;
|
|
62
|
-
/**
|
|
101
|
+
/**
|
|
102
|
+
* 단일 메서드 원본 복구. 없으면 no-op. / Restore a single method's original; no-op if absent.
|
|
103
|
+
*
|
|
104
|
+
* @param name - 복구할 메서드명 / Method name to restore
|
|
105
|
+
* @returns 체이닝용 host / The host for chaining
|
|
106
|
+
*/
|
|
63
107
|
restore(name: string): OverrideKernelHost;
|
|
64
|
-
/** 전체 복구 + strategy clear. destroy 시 호출. */
|
|
108
|
+
/** 전체 복구 + strategy clear. destroy 시 호출. / Restore everything + clear strategies; called on destroy. */
|
|
65
109
|
restoreAll(): OverrideKernelHost;
|
|
66
|
-
/** override
|
|
110
|
+
/** 해당 메서드가 override 등록돼 있는가. / Whether the given method is overridden. */
|
|
67
111
|
hasOverride(name: string): boolean;
|
|
68
|
-
/** override 등록된 메서드 이름 목록. */
|
|
112
|
+
/** override 등록된 메서드 이름 목록. / List of overridden method names. */
|
|
69
113
|
getOverrideNames(): string[];
|
|
70
114
|
}
|
|
@@ -1,13 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 페이지 변경 시 전달되는 이벤트 페이로드. / Event payload delivered on a page change.
|
|
3
|
+
*/
|
|
1
4
|
export interface PageChangeEvent {
|
|
5
|
+
/** 현재(변경 후) 페이지 번호(1-base). / Current (post-change) page number (1-based). */
|
|
2
6
|
page: number;
|
|
7
|
+
/** 페이지당 행 수. / Rows per page. */
|
|
3
8
|
pageSize: number;
|
|
9
|
+
/** 전체 행 수. / Total row count. */
|
|
4
10
|
totalRows: number;
|
|
11
|
+
/** 전체 페이지 수. / Total page count. */
|
|
5
12
|
totalPages: number;
|
|
6
13
|
}
|
|
14
|
+
/** 페이지 변경 콜백. / Callback invoked on a page change. */
|
|
7
15
|
export type PageChangeFn = (e: PageChangeEvent) => void;
|
|
16
|
+
/** i18n: 페이지네이션 라벨 해석기(행/페이지·범위 배지·빈 상태). / i18n: pagination label resolver (rows-per-page, range badge, empty). */
|
|
17
|
+
export type PaginationT = (key: string, params?: Record<string, string | number>) => string;
|
|
8
18
|
/**
|
|
9
|
-
* 그리드 하단 페이지네이션 UI + 상태 관리.
|
|
10
|
-
*
|
|
19
|
+
* 그리드 하단 페이지네이션 UI + 상태 관리. / Grid bottom pagination UI plus state management.
|
|
20
|
+
*
|
|
21
|
+
* DataLayer의 `_displayIndexes` 슬라이싱 범위(`getRange`)를 계산해 넘겨준다.
|
|
22
|
+
* / Computes the slice range (`getRange`) used against DataLayer's `_displayIndexes`.
|
|
11
23
|
*/
|
|
12
24
|
export declare class Pagination {
|
|
13
25
|
private _el;
|
|
@@ -15,20 +27,47 @@ export declare class Pagination {
|
|
|
15
27
|
private _pageSize;
|
|
16
28
|
private _totalRows;
|
|
17
29
|
private _onChange;
|
|
18
|
-
|
|
30
|
+
private _t;
|
|
31
|
+
constructor(container: HTMLElement, pageSize: number, onChange: PageChangeFn, t?: PaginationT);
|
|
32
|
+
/** 현재 페이지 번호(1-base). / Current page number (1-based). */
|
|
19
33
|
get page(): number;
|
|
34
|
+
/** 페이지당 행 수. / Rows per page. */
|
|
20
35
|
get pageSize(): number;
|
|
36
|
+
/** 전체 페이지 수(최소 1). / Total page count (minimum 1). */
|
|
21
37
|
get totalPages(): number;
|
|
22
|
-
/**
|
|
38
|
+
/**
|
|
39
|
+
* 전체 행 수 갱신 → 현재 페이지 유효성 검사 후 재렌더. / Update the total row count, clamp the current page if needed, and re-render.
|
|
40
|
+
*
|
|
41
|
+
* @param n - 새 전체 행 수 / New total row count
|
|
42
|
+
*/
|
|
23
43
|
setTotalRows(n: number): void;
|
|
44
|
+
/**
|
|
45
|
+
* 페이지당 행 수를 변경하고 1페이지로 리셋한다. / Change rows-per-page and reset to page 1.
|
|
46
|
+
*
|
|
47
|
+
* @param size - 새 페이지당 행 수 / New rows-per-page value
|
|
48
|
+
*/
|
|
24
49
|
setPageSize(size: number): void;
|
|
50
|
+
/**
|
|
51
|
+
* 지정 페이지로 이동한다(범위를 벗어나면 클램프). / Navigate to the given page (clamped to valid range).
|
|
52
|
+
*
|
|
53
|
+
* @param page - 이동할 페이지 번호(1-base) / Target page number (1-based)
|
|
54
|
+
*/
|
|
25
55
|
goTo(page: number): void;
|
|
26
|
-
/**
|
|
56
|
+
/**
|
|
57
|
+
* 현재 페이지의 `[startIndex, endIndex]` 반환(DataLayer 인덱스 기준). / Return `[startIndex, endIndex]` for the current page (DataLayer index space).
|
|
58
|
+
*
|
|
59
|
+
* @returns 현재 페이지의 시작/끝 인덱스(포함) / Start/end index (inclusive) for the current page
|
|
60
|
+
*/
|
|
27
61
|
getRange(): {
|
|
28
62
|
start: number;
|
|
29
63
|
end: number;
|
|
30
64
|
};
|
|
65
|
+
/** @internal 현재 상태로 `onChange` 콜백을 실행한다. / Invokes the `onChange` callback with the current state. */
|
|
31
66
|
private _emit;
|
|
67
|
+
/** @internal 페이지네이션 바 DOM 을 전체 재렌더한다. / Fully re-renders the pagination bar DOM. */
|
|
32
68
|
private _render;
|
|
69
|
+
/** i18n: 상주 크롬 라벨을 활성 로케일로 다시 그린다(setLocale 경로). / i18n: repaint resident chrome labels in the active locale (setLocale path). */
|
|
70
|
+
refreshLabels(): void;
|
|
71
|
+
/** 페이지네이션 바 DOM 을 제거한다. / Remove the pagination bar DOM. */
|
|
33
72
|
destroy(): void;
|
|
34
73
|
}
|
|
@@ -6,6 +6,11 @@ import { FlatRowModel } from './FlatRowModel.js';
|
|
|
6
6
|
import { GridOptions } from './types.js';
|
|
7
7
|
import { RangeStats } from './range/RangeQuery.js';
|
|
8
8
|
import { CellRange, Direction, FillMode, FillPreview } from './range/types.js';
|
|
9
|
+
/**
|
|
10
|
+
* RangeSelectionManager 가 OpenGrid 서브시스템을 읽고 쓰기 위해 주입받는 클로저 묶음.
|
|
11
|
+
* / Closures injected into RangeSelectionManager so it can read and write OpenGrid subsystem
|
|
12
|
+
* state without owning it directly.
|
|
13
|
+
*/
|
|
9
14
|
export interface RangeSelectionDeps<T extends Record<string, any>> {
|
|
10
15
|
getOptions: () => Required<GridOptions<T>>;
|
|
11
16
|
getData: () => DataLayer<T>;
|
|
@@ -13,20 +18,39 @@ export interface RangeSelectionDeps<T extends Record<string, any>> {
|
|
|
13
18
|
getFlatModel: () => FlatRowModel;
|
|
14
19
|
getRenderer: () => GridRenderer | null;
|
|
15
20
|
getEditMgr: () => CellEditManager<T>;
|
|
21
|
+
/** 포커스 셀을 이동. / Move the focused cell. */
|
|
16
22
|
setFocusCell: (ri: number, ci: number) => void;
|
|
23
|
+
/** 배치 경유 셀 쓰기(재렌더 ≤1회, C2.1). / Batched cell write (at most one re-render, C2.1). */
|
|
17
24
|
writeCells: (patches: Array<{
|
|
18
25
|
rowIndex: number;
|
|
19
26
|
field: string;
|
|
20
27
|
value: any;
|
|
21
28
|
}>) => number;
|
|
29
|
+
/** 셀의 화면 표시 텍스트(포맷 적용). / The cell's display text (formatted). */
|
|
22
30
|
getDisplayValue: (ri: number, field: string) => string;
|
|
31
|
+
/** 그리드 이벤트 발행. / Emit a grid event. */
|
|
23
32
|
emit: (event: string, ...args: any[]) => void;
|
|
33
|
+
/** 현재 가시 범위를 재렌더. / Re-render the currently visible range. */
|
|
24
34
|
doRender: () => void;
|
|
35
|
+
/** aria-live 영역에 메시지를 공지. / Announce a message via the aria-live region. */
|
|
25
36
|
announce: (msg: string) => void;
|
|
37
|
+
/** i18n: 범위 선택/채우기 announce·aria 해석. / i18n: resolve range selection/fill announce & aria. */
|
|
38
|
+
t: (key: string, params?: Record<string, string | number>) => string;
|
|
26
39
|
hasCellFormula?: (rowId: string, field: string) => boolean;
|
|
27
40
|
offsetFormula?: (rowId: string, field: string, dRow: number, dCol: number) => string;
|
|
28
41
|
setCellFormulaByRowId?: (rowId: string, field: string, formula: string) => void;
|
|
29
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* F1 범위 선택 + 채우기 매니저. / F1 range selection + fill manager.
|
|
45
|
+
*
|
|
46
|
+
* 포인터 드래그·클릭·Shift+화살표로 셀 범위를 선택하고, 채우기 핸들 드래그/Ctrl+D·R 로 값·수식을
|
|
47
|
+
* 복제하며, 탭 구분 텍스트 복사/붙여넣기(TSV)까지 담당한다. 선택 모델 자체는 헤드리스
|
|
48
|
+
* `RangeModel`(core/range/*)이 소유하고, 이 클래스는 DOM 이벤트·오버레이 렌더·그리드 배선만
|
|
49
|
+
* 책임진다. / Handles cell-range selection via pointer drag, click, and Shift+Arrow; duplicates
|
|
50
|
+
* values/formulas via fill-handle drag or Ctrl+D/R; and drives tab-separated (TSV) copy/paste.
|
|
51
|
+
* The selection model itself is owned by the headless `RangeModel` (core/range/*); this class is
|
|
52
|
+
* responsible only for DOM events, overlay rendering, and grid wiring.
|
|
53
|
+
*/
|
|
30
54
|
export declare class RangeSelectionManager<T extends Record<string, any> = any> {
|
|
31
55
|
private _d;
|
|
32
56
|
private _model;
|
|
@@ -44,47 +68,139 @@ export declare class RangeSelectionManager<T extends Record<string, any> = any>
|
|
|
44
68
|
private _handleEl;
|
|
45
69
|
private _mountedWrap;
|
|
46
70
|
constructor(deps: RangeSelectionDeps<T>);
|
|
71
|
+
/** 범위 선택 기능이 켜져 있는지. / Whether range selection is enabled.
|
|
72
|
+
* @returns 켜져 있으면 true / True if enabled */
|
|
47
73
|
isEnabled(): boolean;
|
|
48
74
|
private _rangeOpts;
|
|
49
75
|
private _editorActive;
|
|
76
|
+
/** 현재 범위 선택이 있는지. / Whether there is an active range selection. */
|
|
50
77
|
hasSelection(): boolean;
|
|
78
|
+
/** 현재 선택된 모든 범위(multiRange 지원 시 다건). / All currently selected ranges (multiple when multiRange is enabled). */
|
|
51
79
|
getRangeSelection(): CellRange[];
|
|
80
|
+
/** 마지막(활성) 범위. 없으면 `null`. / The last (active) range, or `null` if none. */
|
|
52
81
|
getActiveRange(): CellRange | null;
|
|
82
|
+
/** 채우기 핸들 드래그 중인 미리보기 범위. 없으면 `null`. / The fill preview range while dragging the fill handle, or `null`. */
|
|
53
83
|
getFillPreview(): FillPreview | null;
|
|
84
|
+
/** 활성 범위의 셀 값들을 2차원 배열로 반환(범위 없으면 빈 배열).
|
|
85
|
+
* / Return the active range's cell values as a 2D array (empty array if no active range). */
|
|
54
86
|
getRangeValues(): any[][];
|
|
87
|
+
/** 활성 범위의 합계/평균 등 통계(범위 없으면 `null`).
|
|
88
|
+
* / Statistics (sum/average/etc.) for the active range, or `null` if none. */
|
|
55
89
|
getRangeStats(): RangeStats | null;
|
|
56
90
|
private _queryCtx;
|
|
91
|
+
/**
|
|
92
|
+
* 셀 위 마우스 다운 — 드래그 선택을 시작한다(UC-1). / Mouse-down on a cell — begins drag selection (UC-1).
|
|
93
|
+
*
|
|
94
|
+
* @param ri - 시작 행 인덱스 / Starting row index
|
|
95
|
+
* @param ci - 시작 열 인덱스 / Starting column index
|
|
96
|
+
* @param e - 원본 마우스 이벤트(Ctrl/Meta=추가선택, Shift=확장) / Original mouse event (Ctrl/Meta = additive, Shift = extend)
|
|
97
|
+
*/
|
|
57
98
|
handleCellMouseDown(ri: number, ci: number, e: MouseEvent): void;
|
|
99
|
+
/**
|
|
100
|
+
* 드래그 중 셀 위 마우스 이동 — 범위를 갱신하고 가장자리 근처면 자동 스크롤한다.
|
|
101
|
+
* / Mouse move over a cell while dragging — updates the range and auto-scrolls near edges.
|
|
102
|
+
*
|
|
103
|
+
* @param ri - 현재 행 인덱스 / Current row index
|
|
104
|
+
* @param ci - 현재 열 인덱스 / Current column index
|
|
105
|
+
* @param e - 원본 마우스 이벤트(자동 스크롤 거리 계산용) / Original mouse event (used to compute auto-scroll distance)
|
|
106
|
+
*/
|
|
58
107
|
handleCellMouseMove(ri: number, ci: number, e: MouseEvent): void;
|
|
108
|
+
/** 드래그 종료 — 자동 스크롤 정지 + 선택 확정 + 이벤트 발행. 셀 밖 mouseup(document 폴백)도 이 경로를 탄다.
|
|
109
|
+
* / End the drag — stops auto-scroll, finalizes the selection, and emits events. A mouseup
|
|
110
|
+
* outside any cell (document-level fallback) also flows through this path. */
|
|
59
111
|
handleCellMouseUp(_ri: number, _ci: number, _e: MouseEvent): void;
|
|
112
|
+
/**
|
|
113
|
+
* 셀 클릭 처리 — 일반 클릭은 단일 셀 선택, Shift+클릭은 활성 범위를 확장한다(UC-2).
|
|
114
|
+
* / Handle a cell click — a plain click selects a single cell; Shift+click extends the active range (UC-2).
|
|
115
|
+
*
|
|
116
|
+
* @param ri - 클릭된 행 인덱스 / Clicked row index
|
|
117
|
+
* @param ci - 클릭된 열 인덱스 / Clicked column index
|
|
118
|
+
* @param shiftKey - Shift 키가 눌려 있었는지 / Whether the Shift key was held
|
|
119
|
+
*/
|
|
60
120
|
handleClick(ri: number, ci: number, shiftKey: boolean): void;
|
|
121
|
+
/**
|
|
122
|
+
* Shift+화살표로 활성 범위를 방향으로 확장한다(UC-3). / Extend the active range in a direction via Shift+Arrow (UC-3).
|
|
123
|
+
*
|
|
124
|
+
* @param dir - 확장 방향 / Direction to extend
|
|
125
|
+
*/
|
|
61
126
|
extendFocus(dir: Direction): void;
|
|
127
|
+
/** 범위 선택을 해제한다(선택 없으면 no-op). / Clear the range selection (no-op if nothing is selected). */
|
|
62
128
|
clear(): void;
|
|
129
|
+
/** `clear()` 별칭(공개 API 명명 일관성). / Alias for `clear()` (public API naming consistency). */
|
|
63
130
|
clearRangeSelection(): void;
|
|
131
|
+
/**
|
|
132
|
+
* 범위 선택을 프로그램적으로 지정한다(§6.2 공개 API). / Programmatically set the range selection (§6.2 public API).
|
|
133
|
+
*
|
|
134
|
+
* @param range - 지정할 범위(배열이면 첫 요소만 사용) / Range to set (if an array, only the first element is used)
|
|
135
|
+
* @example
|
|
136
|
+
* grid.setRangeSelection({ startRow: 0, endRow: 2, startCol: 0, endCol: 1 });
|
|
137
|
+
*/
|
|
64
138
|
setRangeSelection(range: CellRange | CellRange[]): void;
|
|
65
|
-
/** applySort/applyFilter 직후 호출(C0.5, §2.5) — 선택은 rowId 집합 기준으로 재투영(해제 아님).
|
|
139
|
+
/** applySort/applyFilter 직후 호출(C0.5, §2.5) — 선택은 rowId 집합 기준으로 재투영(해제 아님).
|
|
140
|
+
* / Called right after applySort/applyFilter (C0.5, §2.5) — re-projects the selection by its
|
|
141
|
+
* rowId set instead of clearing it. */
|
|
66
142
|
reproject(): void;
|
|
67
143
|
private _afterModelChange;
|
|
68
144
|
private _announceSelection;
|
|
145
|
+
/**
|
|
146
|
+
* Ctrl+D(아래로 채우기)/Ctrl+R(오른쪽으로 채우기) 키보드 단축키(UR-5, §3.3).
|
|
147
|
+
* / Ctrl+D (fill down) / Ctrl+R (fill right) keyboard shortcuts (UR-5, §3.3).
|
|
148
|
+
*
|
|
149
|
+
* @param axis - 채우기 방향 / Fill direction
|
|
150
|
+
*/
|
|
69
151
|
ctrlFill(axis: 'down' | 'right'): void;
|
|
70
|
-
/** 공개 API(§6.2): source→target 채우기. axis 는 두 rect 의 상대 위치로 추론한다.
|
|
152
|
+
/** 공개 API(§6.2): source→target 채우기. axis 는 두 rect 의 상대 위치로 추론한다.
|
|
153
|
+
* / Public API (§6.2): fill from source to target. The axis is inferred from the two rects'
|
|
154
|
+
* relative position.
|
|
155
|
+
*
|
|
156
|
+
* @param source - 채우기 원본 범위 / Source range to fill from
|
|
157
|
+
* @param target - 채우기 대상 범위 / Target range to fill into
|
|
158
|
+
* @param mode - 채우기 모드(기본 'copy') / Fill mode (default 'copy')
|
|
159
|
+
* @example
|
|
160
|
+
* grid.fillRange(
|
|
161
|
+
* { startRow: 0, endRow: 0, startCol: 0, endCol: 0 },
|
|
162
|
+
* { startRow: 1, endRow: 3, startCol: 0, endCol: 0 },
|
|
163
|
+
* 'series',
|
|
164
|
+
* );
|
|
165
|
+
*/
|
|
71
166
|
fillRange(source: CellRange, target: CellRange, mode?: FillMode): void;
|
|
72
167
|
private _isEditable;
|
|
73
168
|
private _commitFill;
|
|
74
|
-
/** KeyboardManager._copyToClipboard 가 소비. 범위 없으면 null(호출측이 기존 경로로 폴백).
|
|
169
|
+
/** KeyboardManager._copyToClipboard 가 소비. 범위 없으면 null(호출측이 기존 경로로 폴백).
|
|
170
|
+
* / Consumed by KeyboardManager._copyToClipboard. Returns null when there is no active range
|
|
171
|
+
* (the caller falls back to its existing path).
|
|
172
|
+
*
|
|
173
|
+
* @returns 활성 범위의 TSV 텍스트, 없으면 `null` / TSV text for the active range, or `null`
|
|
174
|
+
*/
|
|
75
175
|
copyText(): string | null;
|
|
76
|
-
/** KeyboardManager._pasteFromClipboard 가 소비. true = 처리함(배치 경유), false = 범위 없음(폴백).
|
|
176
|
+
/** KeyboardManager._pasteFromClipboard 가 소비. true = 처리함(배치 경유), false = 범위 없음(폴백).
|
|
177
|
+
* / Consumed by KeyboardManager._pasteFromClipboard.
|
|
178
|
+
*
|
|
179
|
+
* @param text - 붙여넣을 TSV 텍스트 / TSV text to paste
|
|
180
|
+
* @returns 처리했으면 true(배치 경유), 활성 범위가 없으면 false(호출측 폴백)
|
|
181
|
+
* / True if handled (batched write); false if there is no active range (caller falls back)
|
|
182
|
+
*/
|
|
77
183
|
pasteText(text: string): boolean;
|
|
78
184
|
private _maybeAutoscroll;
|
|
79
185
|
private _scrollSpeed;
|
|
80
186
|
private _runAutoscroll;
|
|
81
187
|
private _stopAutoscroll;
|
|
82
|
-
/** bodyWrap 자식으로 오버레이 1회 생성(renderBody 파괴 회피, CON-3 해법).
|
|
188
|
+
/** bodyWrap 자식으로 오버레이 1회 생성(renderBody 파괴 회피, CON-3 해법).
|
|
189
|
+
* / Creates the overlay once as a child of bodyWrap (avoids renderBody teardown; the CON-3 fix).
|
|
190
|
+
*
|
|
191
|
+
* @param bodyWrap - 그리드 바디 래퍼 엘리먼트 / The grid body wrapper element
|
|
192
|
+
*/
|
|
83
193
|
mount(bodyWrap: HTMLElement): void;
|
|
84
|
-
/** _doRender 매 호출 뒤 실행(M-6 통합점) — 코너 셀 실측 → 연속 테두리/핸들/프리뷰 갱신(QA-2, CON-4).
|
|
194
|
+
/** _doRender 매 호출 뒤 실행(M-6 통합점) — 코너 셀 실측 → 연속 테두리/핸들/프리뷰 갱신(QA-2, CON-4).
|
|
195
|
+
* / Runs after every _doRender call (M-6 integration point) — measures the corner cells and
|
|
196
|
+
* updates the contiguous border/handle/preview overlay (QA-2, CON-4). */
|
|
85
197
|
repaint(): void;
|
|
86
198
|
private _hideOverlay;
|
|
87
|
-
/** OpenGrid._doRender 가 renderBody extraOpts 로 전달(M-6).
|
|
199
|
+
/** OpenGrid._doRender 가 renderBody extraOpts 로 전달(M-6).
|
|
200
|
+
* / Passed by OpenGrid._doRender as renderBody's extraOpts (M-6).
|
|
201
|
+
*
|
|
202
|
+
* @returns 현재 선택 범위들을 담은 렌더 옵션 조각 / A render-options fragment carrying the current selected ranges
|
|
203
|
+
*/
|
|
88
204
|
getOverlayExtraOpts(): {
|
|
89
205
|
_rangeRects: CellRange[];
|
|
90
206
|
};
|
|
@@ -22,6 +22,17 @@ import { GridOptions } from './types.js';
|
|
|
22
22
|
* 값(컬럼폭·옵션 등)은 늦은-null / 재할당(worksheet 전환 시 colLayout 교체)을 견디도록
|
|
23
23
|
* 전부 getter 클로저로 읽는다. `fallbackViewportHeight` 클램프 시맨틱과 RenderFrame 구성은
|
|
24
24
|
* 원본과 1:1 동일하다(회귀 0).
|
|
25
|
+
* / Dependency contract for the sole entry point of the render loop (R5, §3.1 C4, §6-R5),
|
|
26
|
+
* moving `_onResize`/`_recalcWidths`/`_renderHeader`/`_syncHeaderLayout`/`_doRender`/`_visRange`
|
|
27
|
+
* (plus the private helpers `_visCount`/`_paginationHeight`) out of the `OpenGrid` God object
|
|
28
|
+
* with **behavior unchanged**.
|
|
29
|
+
*
|
|
30
|
+
* Strangler principle (A2): collaborators (GridRenderer/VirtualScroll/Pagination, etc.) are
|
|
31
|
+
* still created and owned by `OpenGrid._mount`; they are only **injected** here via the
|
|
32
|
+
* `*Deps` closure-inversion pattern. Values (column widths, options, etc.) are all read
|
|
33
|
+
* through getter closures so they tolerate late-null / reassignment (colLayout swap on
|
|
34
|
+
* worksheet switch). The `fallbackViewportHeight` clamp semantics and RenderFrame construction
|
|
35
|
+
* are 1:1 identical to the original (zero regression).
|
|
25
36
|
*/
|
|
26
37
|
export interface RenderControllerDeps<T extends Record<string, any> = any> {
|
|
27
38
|
getContainer: () => HTMLElement;
|
|
@@ -35,6 +46,7 @@ export interface RenderControllerDeps<T extends Record<string, any> = any> {
|
|
|
35
46
|
getMergeEngine: () => MergeEngine;
|
|
36
47
|
getColWidths: () => number[];
|
|
37
48
|
setColWidths: (widths: number[]) => void;
|
|
49
|
+
/** 사용자가 직접 조절한 컬럼폭(리사이즈 시 보존 대상). / User-resized column widths (preserved across recalcWidths). */
|
|
38
50
|
getUserWidths: () => Map<string, number>;
|
|
39
51
|
getSfMgr: () => SortFilterManager<T>;
|
|
40
52
|
getRowMgr: () => RowManager<T>;
|
|
@@ -42,24 +54,68 @@ export interface RenderControllerDeps<T extends Record<string, any> = any> {
|
|
|
42
54
|
getGrpMgr: () => GroupTreeManager<T>;
|
|
43
55
|
getDetailMgr: () => DetailManager<T>;
|
|
44
56
|
getRangeMgr: () => RangeSelectionManager<T>;
|
|
57
|
+
/** F2: detail 렌더 컨텍스트 조립(비활성 시 undefined). / F2: build the detail render context (undefined when inactive). */
|
|
45
58
|
buildDetailRenderContext: () => DetailRenderContext | undefined;
|
|
59
|
+
/** 푸터 합계 영역 재렌더. / Re-render the footer summary area. */
|
|
46
60
|
renderFooterEl: () => void;
|
|
47
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* 렌더 루프의 유일 진입점. / Sole entry point of the render loop.
|
|
64
|
+
*
|
|
65
|
+
* 리사이즈·헤더/본문 렌더·뷰포트 높이 동기화·가시 범위 계산을 담당한다(R5).
|
|
66
|
+
* / Handles resize, header/body rendering, viewport-height sync, and visible-range
|
|
67
|
+
* computation (R5).
|
|
68
|
+
*/
|
|
48
69
|
export declare class RenderController<T extends Record<string, any> = any> {
|
|
49
70
|
private _deps;
|
|
50
71
|
private _autoHeightWarned;
|
|
51
72
|
constructor(deps: RenderControllerDeps<T>);
|
|
73
|
+
/** @internal */
|
|
52
74
|
private _paginationHeight;
|
|
75
|
+
/**
|
|
76
|
+
* 컨테이너 리사이즈에 반응해 폭 재계산 → 헤더 재렌더 → 본문 재렌더를 수행한다.
|
|
77
|
+
* / Responds to a container resize: recalculates widths, re-renders the header, then
|
|
78
|
+
* re-renders the body.
|
|
79
|
+
*/
|
|
53
80
|
onResize(): void;
|
|
81
|
+
/**
|
|
82
|
+
* 전체 폭에서 고정 UI 요소(state/드래그/행번호/체크 컬럼)를 뺀 뒤 컬럼폭을 재계산한다.
|
|
83
|
+
* 사용자가 직접 조절한 폭은 보존한다.
|
|
84
|
+
* / Recalculate column widths from the total width minus fixed UI elements (state/drag/
|
|
85
|
+
* row-number/check columns). User-resized widths are preserved.
|
|
86
|
+
*
|
|
87
|
+
* @param totalWidth - 컨테이너 전체 폭(px) / Total container width in px
|
|
88
|
+
*/
|
|
54
89
|
recalcWidths(totalWidth: number): void;
|
|
90
|
+
/**
|
|
91
|
+
* 헤더(컬럼 제목 행)를 다시 그린다. / Re-render the header (column title row).
|
|
92
|
+
*/
|
|
55
93
|
renderHeader(): void;
|
|
56
94
|
/**
|
|
57
95
|
* 렌더된 헤더의 실제 높이를 측정해 본문(bodyWrap) 높이와 뷰포트 높이에 반영한다.
|
|
58
96
|
* 줄바꿈이 없는 헤더는 측정 높이가 headerHeight 이하라 기존 고정 동작과 동일하다.
|
|
59
97
|
* (public: OpenGrid 가 `_syncHeaderLayout` 위임으로 노출 — 특성화 테스트가 직접 호출한다.)
|
|
98
|
+
* / Measures the rendered header's actual height and applies it to the body (bodyWrap)
|
|
99
|
+
* height and viewport height. Headers without wrapping measure at or below `headerHeight`,
|
|
100
|
+
* so existing fixed-height behavior is unchanged. (Public: `OpenGrid` exposes this via a
|
|
101
|
+
* `_syncHeaderLayout` delegate — characterization tests call it directly.)
|
|
60
102
|
*/
|
|
61
103
|
syncHeaderLayout(): void;
|
|
104
|
+
/**
|
|
105
|
+
* 지정 범위의 본문 행을 렌더한다(autoHeight 활성 시 범위 인자를 무시하고 전체 행을 렌더).
|
|
106
|
+
* / Render body rows within the given range (when autoHeight is active, the range
|
|
107
|
+
* arguments are ignored and all rows are rendered).
|
|
108
|
+
*
|
|
109
|
+
* @param startIndex - 렌더 시작 flat index / Starting flat index to render
|
|
110
|
+
* @param endIndex - 렌더 끝 flat index / Ending flat index to render
|
|
111
|
+
*/
|
|
62
112
|
doRender(startIndex: number, endIndex: number): void;
|
|
113
|
+
/**
|
|
114
|
+
* 현재 화면에 보이는 행 범위를 반환한다. / Return the currently visible row range.
|
|
115
|
+
*
|
|
116
|
+
* @returns `[시작, 끝]` flat index 쌍 / `[start, end]` flat index pair
|
|
117
|
+
*/
|
|
63
118
|
visRange(): [number, number];
|
|
119
|
+
/** @internal */
|
|
64
120
|
private _visCount;
|
|
65
121
|
}
|