@vmscloud/moz-ui-grid-react 0.1.19
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/README.md +148 -0
- package/dist/MozGrid.d.ts +136 -0
- package/dist/bridge/ReactRenderer.d.ts +45 -0
- package/dist/bridge/fieldBuilder.d.ts +9 -0
- package/dist/bridge/templateRegistry.d.ts +11 -0
- package/dist/index.cjs +25 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +96086 -0
- package/dist/legacy/components/common/Dragging.d.ts +30 -0
- package/dist/legacy/components/common/custom-cell/FormulaEngine.d.ts +256 -0
- package/dist/legacy/components/common/custom-cell/FormulaInput.d.ts +25 -0
- package/dist/legacy/components/common/custom-cell/GridCustomCell.d.ts +17 -0
- package/dist/legacy/components/common/custom-cell/useFormulaAutocomplete.d.ts +54 -0
- package/dist/legacy/components/common/excel/ClientExcelUploadPopup.d.ts +6 -0
- package/dist/legacy/components/common/filter/GridFilter.d.ts +13 -0
- package/dist/legacy/components/common/footer/GridFooter.d.ts +17 -0
- package/dist/legacy/components/common/sort/GridSort.d.ts +12 -0
- package/dist/legacy/components/common/toolbar/GridSearchInput.d.ts +26 -0
- package/dist/legacy/components/grid/CellEditor.d.ts +9 -0
- package/dist/legacy/components/grid/CellTemplate.d.ts +21 -0
- package/dist/legacy/components/grid/DetailTemplate.d.ts +8 -0
- package/dist/legacy/components/grid/GroupTemplate.d.ts +8 -0
- package/dist/legacy/components/grid/HeaderTemplate.d.ts +9 -0
- package/dist/legacy/components/grid/MozGridReact.d.ts +12 -0
- package/dist/legacy/components/grid/MozGridReactCore.d.ts +28 -0
- package/dist/legacy/components/grid/bulk-editor/GridBulkEditor.d.ts +11 -0
- package/dist/legacy/components/grid/context-menu/GridContextMenu.d.ts +22 -0
- package/dist/legacy/components/grid/group-panel/GroupPanel.d.ts +5 -0
- package/dist/legacy/components/grid/toolbar/ColumnPicker.d.ts +18 -0
- package/dist/legacy/components/grid/toolbar/GridOptionModal.d.ts +30 -0
- package/dist/legacy/components/grid/toolbar/GridSetupPopover.d.ts +25 -0
- package/dist/legacy/components/grid/toolbar/GridToolBox.d.ts +49 -0
- package/dist/legacy/components/pivot/MozPivotReact.d.ts +47 -0
- package/dist/legacy/components/pivot/PivotContextMenu.d.ts +23 -0
- package/dist/legacy/components/pivot/PivotFieldChip.d.ts +17 -0
- package/dist/legacy/components/pivot/PivotFieldDropZone.d.ts +30 -0
- package/dist/legacy/components/pivot/PivotFieldPanel.d.ts +26 -0
- package/dist/legacy/components/pivot/PivotOptionModal.d.ts +36 -0
- package/dist/legacy/components/pivot/PivotToolBox.d.ts +56 -0
- package/dist/legacy/components/pivot/chart/EChart.d.ts +18 -0
- package/dist/legacy/components/pivot/chart/MozPivotChart.d.ts +23 -0
- package/dist/legacy/components/pivot/chart/PivotChartDetail.d.ts +17 -0
- package/dist/legacy/components/pivot/chart/PivotChartMini.d.ts +19 -0
- package/dist/legacy/components/pivot/chart/PivotChartMultiple.d.ts +16 -0
- package/dist/legacy/components/pivot/chart/PivotChartToolbar.d.ts +32 -0
- package/dist/legacy/components/pivot/chart/chartUtils.d.ts +45 -0
- package/dist/legacy/contexts/index.d.ts +31 -0
- package/dist/legacy/contracts/notification.contract.d.ts +34 -0
- package/dist/legacy/hooks/index.d.ts +16 -0
- package/dist/legacy/hooks/useCellTooltip.d.ts +8 -0
- package/dist/legacy/hooks/useClientExcelExport.d.ts +27 -0
- package/dist/legacy/hooks/useClientExcelStore.d.ts +18 -0
- package/dist/legacy/hooks/useContextMenu.d.ts +62 -0
- package/dist/legacy/hooks/useGridBulkEditor.d.ts +16 -0
- package/dist/legacy/hooks/useGridChanges.d.ts +10 -0
- package/dist/legacy/hooks/useGridColumns.d.ts +11 -0
- package/dist/legacy/hooks/useGridCustomCell.d.ts +32 -0
- package/dist/legacy/hooks/useGridCustomCellModule.d.ts +9 -0
- package/dist/legacy/hooks/useGridEvents.d.ts +13 -0
- package/dist/legacy/hooks/useGridFilter.d.ts +19 -0
- package/dist/legacy/hooks/useGridInstance.d.ts +9 -0
- package/dist/legacy/hooks/useGridSelect.d.ts +10 -0
- package/dist/legacy/hooks/useGridSelection.d.ts +6 -0
- package/dist/legacy/hooks/useGridSort.d.ts +16 -0
- package/dist/legacy/hooks/useGridUndoRedo.d.ts +10 -0
- package/dist/legacy/hooks/useGridValidation.d.ts +9 -0
- package/dist/legacy/hooks/useSearchHighlight.d.ts +9 -0
- package/dist/legacy/icons/index.d.ts +36 -0
- package/dist/legacy/index.d.ts +71 -0
- package/dist/legacy/locale/MozConfigProvider.d.ts +31 -0
- package/dist/legacy/locale/contextWrapper.d.ts +19 -0
- package/dist/legacy/locale/en.d.ts +2 -0
- package/dist/legacy/locale/index.d.ts +8 -0
- package/dist/legacy/locale/ja.d.ts +2 -0
- package/dist/legacy/locale/ko.d.ts +2 -0
- package/dist/legacy/locale/types.d.ts +328 -0
- package/dist/legacy/locale/useMozLocale.d.ts +15 -0
- package/dist/legacy/locale/zh.d.ts +2 -0
- package/dist/legacy/stories/MozGridReact.stories.d.ts +7 -0
- package/dist/legacy/stories/MozPivotReact.stories.d.ts +44 -0
- package/dist/legacy/stories/_helpers/sampleData.d.ts +54 -0
- package/dist/legacy/types/pivot-props.d.ts +62 -0
- package/dist/legacy/types/props.d.ts +118 -0
- package/dist/legacy/types/toolbar.d.ts +117 -0
- package/dist/legacy/ui/button/Button.d.ts +18 -0
- package/dist/legacy/ui/button/index.d.ts +1 -0
- package/dist/legacy/ui/checkbox/CheckBox.d.ts +17 -0
- package/dist/legacy/ui/checkbox/icons.d.ts +9 -0
- package/dist/legacy/ui/checkbox/index.d.ts +1 -0
- package/dist/legacy/ui/context-menu/ContextMenu.d.ts +36 -0
- package/dist/legacy/ui/context-menu/index.d.ts +2 -0
- package/dist/legacy/ui/context-menu/types.d.ts +26 -0
- package/dist/legacy/ui/date-input/DateInput.d.ts +25 -0
- package/dist/legacy/ui/date-input/index.d.ts +1 -0
- package/dist/legacy/ui/empty-state/EmptyState.d.ts +28 -0
- package/dist/legacy/ui/empty-state/index.d.ts +1 -0
- package/dist/legacy/ui/input/Input.d.ts +27 -0
- package/dist/legacy/ui/input/index.d.ts +1 -0
- package/dist/legacy/ui/multi-select/MultiSelect.d.ts +43 -0
- package/dist/legacy/ui/multi-select/index.d.ts +1 -0
- package/dist/legacy/ui/number-input/NumberInput.d.ts +22 -0
- package/dist/legacy/ui/number-input/index.d.ts +1 -0
- package/dist/legacy/ui/popup/Popup.d.ts +50 -0
- package/dist/legacy/ui/popup/index.d.ts +1 -0
- package/dist/legacy/ui/select/Select.d.ts +56 -0
- package/dist/legacy/ui/select/index.d.ts +1 -0
- package/dist/legacy/ui/toggle/Toggle.d.ts +21 -0
- package/dist/legacy/ui/toggle/index.d.ts +1 -0
- package/dist/legacy/utils/cn.d.ts +5 -0
- package/dist/legacy/utils/file.d.ts +17 -0
- package/dist/legacy/utils/index.d.ts +2 -0
- package/dist/legacy/utils/misc.d.ts +17 -0
- package/dist/stories/MozGrid.stories.d.ts +18 -0
- package/dist/style.css +1 -0
- package/dist/types/slots.d.ts +49 -0
- package/docs/manual/examples.md +2385 -0
- package/docs/manual/reference.md +4695 -0
- package/docs/manual/reference_react.md +720 -0
- package/package.json +104 -0
package/README.md
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# @vmscloud/moz-ui-grid-react
|
|
2
|
+
|
|
3
|
+
`@vmscloud/moz-ui-grid-core`의 React 18+ wrapping 라이브러리입니다. Vue 버전(`@vmscloud/moz-ui-grid-vue`)과 외관·동작·API가 동등합니다.
|
|
4
|
+
|
|
5
|
+
## 설치
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add @vmscloud/moz-ui-grid-react react react-dom
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
npmjs 공개 패키지라 레지스트리 설정이나 토큰 없이 설치됩니다.
|
|
12
|
+
예전에 `.npmrc`에 넣어 둔 `@vmscloud:registry=https://npm.pkg.github.com` 매핑은 제거하세요.
|
|
13
|
+
|
|
14
|
+
## 문서
|
|
15
|
+
|
|
16
|
+
전체 API 레퍼런스가 패키지에 **동봉**됩니다 (`node_modules/@vmscloud/moz-ui-grid-react/docs/manual/`):
|
|
17
|
+
|
|
18
|
+
- **`reference_react.md`** — React 래퍼(신규 `MozGrid`) Props·이벤트·Slot·인스턴스 API
|
|
19
|
+
- **`reference.md`** — 코어(`PureSheet`) Config·타입·이벤트 전체 레퍼런스 (래퍼 문서가 링크로 위임)
|
|
20
|
+
- **`examples.md`** — 코어 사용 예제
|
|
21
|
+
|
|
22
|
+
> 아래 "기본 사용법"은 legacy 컴포넌트(`MozGridReact`) 기준입니다. `coreConfig` 기반 신규 `MozGrid` API는 `reference_react.md`를 참조하세요.
|
|
23
|
+
|
|
24
|
+
## 기본 사용법
|
|
25
|
+
|
|
26
|
+
```tsx
|
|
27
|
+
import { MozGridReact, MozConfigProvider, koKR } from '@vmscloud/moz-ui-grid-react';
|
|
28
|
+
// 그리드 전체 CSS(core+chrome 합본)는 wrapper 패키지가 제공한다 (react/vue 는 wrapper 를 external 화).
|
|
29
|
+
import '@vmscloud/moz-ui-grid-wrapper/style.css';
|
|
30
|
+
|
|
31
|
+
const fields = [
|
|
32
|
+
{ id: 'name', header: '이름', dataType: 'string' },
|
|
33
|
+
{ id: 'age', header: '나이', dataType: 'number' },
|
|
34
|
+
];
|
|
35
|
+
const data = [
|
|
36
|
+
{ id: 1, name: '홍길동', age: 30 },
|
|
37
|
+
{ id: 2, name: '김철수', age: 25 },
|
|
38
|
+
];
|
|
39
|
+
|
|
40
|
+
function App() {
|
|
41
|
+
return (
|
|
42
|
+
<MozConfigProvider locale={koKR}>
|
|
43
|
+
<div style={{ height: 600 }}>
|
|
44
|
+
<MozGridReact fields={fields} data={data} />
|
|
45
|
+
</div>
|
|
46
|
+
</MozConfigProvider>
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## 아키텍처
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
moz-ui-grid-react/
|
|
55
|
+
├── src/
|
|
56
|
+
│ ├── components/grid/ MozGridReact, MozGridReactCore, toolbar/, context-menu/, bulk-editor/
|
|
57
|
+
│ ├── components/common/ Filter, Sort, CustomCell, SearchInput, Footer, ClientExcelUploadPopup, Dragging
|
|
58
|
+
│ ├── components/pivot/ MozPivotReact, ToolBox, OptionModal, FieldPanel, ContextMenu, chart/
|
|
59
|
+
│ ├── ui/ Radix UI 기반 12 primitives (CheckBox, Toggle, Button, Input, NumberInput,
|
|
60
|
+
│ │ DateInput, EmptyState, Popup, ContextMenu, Select, MultiSelect)
|
|
61
|
+
│ ├── bridge/ ReactRenderer (React ↔ DOM), fieldBuilder, templateRegistry
|
|
62
|
+
│ ├── contexts/ 8 React Context (Grid/Renderer/Registry/Filter/Sort/CustomCell/BulkEditor/Container)
|
|
63
|
+
│ ├── hooks/ 15 hook (useGridInstance/Events/Selection/Changes/UndoRedo/Validation/
|
|
64
|
+
│ │ Columns/Select/SearchHighlight/CellTooltip/Filter/Sort/CustomCell/
|
|
65
|
+
│ │ BulkEditor/ContextMenu/ClientExcelStore/ClientExcelExport)
|
|
66
|
+
│ ├── contracts/ NotificationContract
|
|
67
|
+
│ ├── icons/ 20개 SVG 아이콘
|
|
68
|
+
│ ├── locale/ ko/en/zh/ja 사전 + MozConfigProvider + useMozLocale
|
|
69
|
+
│ ├── types/ props, slots, toolbar, pivot-props
|
|
70
|
+
│ └── utils/ cn, generateUUID, pxToRem, formatMessage, pickFile, downloadBlob
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Vue 버전과의 차이점
|
|
74
|
+
|
|
75
|
+
| 항목 | Vue | React |
|
|
76
|
+
|---|---|---|
|
|
77
|
+
| Provider | `<MozConfigProvider :locale="...">` | `<MozConfigProvider locale={...}>` |
|
|
78
|
+
| Composable | `useGridInstance()` → `Ref<PureSheet \| null>` | `useGridInstance()` → `PureSheet \| null` (React 리렌더로 자동 갱신) |
|
|
79
|
+
| v-model | `v-model:visible="..."` | `visible={...} onVisibleChange={...}` |
|
|
80
|
+
| Slots | `<template #default>` | `children` 또는 `xxxSlot` 함수 prop |
|
|
81
|
+
| Refs | `defineExpose` | `forwardRef` + `useImperativeHandle` |
|
|
82
|
+
| `provide/inject` | InjectionKey | React Context |
|
|
83
|
+
| `VueRenderer` | `createApp` per cell | `createRoot` per cell (`ReactRenderer`) |
|
|
84
|
+
| Pinia store | `useExcelStore` 등 | (서버사이드 Excel은 본 패키지에서 제외) |
|
|
85
|
+
|
|
86
|
+
## 셀 커스터마이즈 (template)
|
|
87
|
+
|
|
88
|
+
```tsx
|
|
89
|
+
import { useEffect, useContext } from 'react';
|
|
90
|
+
import {
|
|
91
|
+
MozGridReact,
|
|
92
|
+
GridTemplateRegistryContext,
|
|
93
|
+
type CellSlotProps,
|
|
94
|
+
} from '@vmscloud/moz-ui-grid-react';
|
|
95
|
+
|
|
96
|
+
function StatusCell({ value }: CellSlotProps) {
|
|
97
|
+
return <span style={{ color: value === 'active' ? '#357e63' : '#dc5a5a' }}>{String(value)}</span>;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function MyGrid() {
|
|
101
|
+
return (
|
|
102
|
+
<MozGridReact fields={fields} data={data}>
|
|
103
|
+
<RegisterStatusCell />
|
|
104
|
+
</MozGridReact>
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function RegisterStatusCell() {
|
|
109
|
+
const registry = useContext(GridTemplateRegistryContext);
|
|
110
|
+
useEffect(() => {
|
|
111
|
+
if (!registry) return;
|
|
112
|
+
registry.register({ type: 'cell', fieldId: 'status', component: StatusCell });
|
|
113
|
+
return () => registry.unregister('cell', 'status');
|
|
114
|
+
}, [registry]);
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## 스타일
|
|
120
|
+
|
|
121
|
+
- 모든 클래스는 `moz-r-` prefix (Vue `moz-` prefix와 분리)
|
|
122
|
+
- Radix UI primitive + scoped SCSS (Tailwind 미사용)
|
|
123
|
+
- 컬러 토큰: `#4568e0`(accent), `#bac6d4`(border), `#dc5a5a`(error), `#28364e`(text), `#96a5be`(placeholder)
|
|
124
|
+
- 그리드 전체 CSS(core+chrome 합본)는 `import '@vmscloud/moz-ui-grid-wrapper/style.css'` 로 로드 (react/vue 는 wrapper 를 external 화)
|
|
125
|
+
|
|
126
|
+
## 제한사항 / 향후 보강 항목
|
|
127
|
+
|
|
128
|
+
- **서버사이드 Excel 미포함**: Vue 측 `useExcelStore`/`useExcelDownloadStore`/`useExcelUploadStore`와 `ExcelGuard`/`ExcelQueueManager`/`ExcelTaskRunner`/`ExcelTimeoutManager`/`ExcelImportUtil`은 본 패키지에 없음. 클라이언트사이드 Excel(`ClientExcelUploadPopup`, `useClientExcelStore`, `runClientExport`, `exportCsv`)만 제공.
|
|
129
|
+
- **DateInput**: 현재는 native `<input type="date">` 기반. Vue의 커스텀 Calendar popup은 추후 보강.
|
|
130
|
+
- **Pivot Field Panel**: 시각 골격만 제공. 드래그-드롭 dnd 통합은 호스트가 콜백으로 처리.
|
|
131
|
+
- **GridFilter/GridSort/GridCustomCell**: hook 연동 골격. 고급 옵션(헤더 필터 UI, drag-resize 행) 추후 보강.
|
|
132
|
+
|
|
133
|
+
## 빌드
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
pnpm install
|
|
137
|
+
pnpm --filter @vmscloud/moz-ui-grid-react build
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
산출물:
|
|
141
|
+
- `dist/index.js` (ES module)
|
|
142
|
+
- `dist/index.cjs` (CommonJS)
|
|
143
|
+
- `dist/index.d.ts` (TypeScript)
|
|
144
|
+
- `dist/style.css` (단일 스타일시트, 24.8kB)
|
|
145
|
+
|
|
146
|
+
## 라이센스
|
|
147
|
+
|
|
148
|
+
ISC
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { ReactNode, ComponentType } from 'react';
|
|
2
|
+
import { GridChrome, WrapperExtras, MozGridCoreProps, WrapperToolItemsProps } from '@vmscloud/moz-ui-grid-wrapper';
|
|
3
|
+
import { PureSheet, ScrollEndReachedPayload, ScrollPayload } from '@vmscloud/moz-ui-grid-core';
|
|
4
|
+
import { CellSlotProps, HeaderSlotProps, EditorSlotProps } from './types/slots';
|
|
5
|
+
/**
|
|
6
|
+
* MozGrid — vanilla GridChrome(@vmscloud/moz-ui-grid-wrapper) 위임 React 어댑터.
|
|
7
|
+
*
|
|
8
|
+
* props = core(`MozGridCoreProps` = PureSheetConfig 평탄화, controlled) + wrapper 개별 props(`WrapperExtras`)
|
|
9
|
+
* + React 전용(템플릿/slot ReactNode/이벤트). 마운트 후 변경은 변경된 설정만 코어/크롬에 타깃 반영(전체 재렌더 회피):
|
|
10
|
+
* - core 설정 → `chrome.reconcileCoreConfig` (data→loadData, fields→updateFields, theme/group/… 전용 setter).
|
|
11
|
+
* - 런타임 setter 없는 키(rowHeight/editable/keyFields/…) → 상태보존 재생성(getConfig→applyConfig).
|
|
12
|
+
* - wrapper UI 플래그(useToolBox 등) → `chrome.setUIOptions` (그리드 보존, 크롬만 부분 재조립).
|
|
13
|
+
*/
|
|
14
|
+
export type MozGridProps = WrapperExtras & {
|
|
15
|
+
/**
|
|
16
|
+
* core 설정 1덩어리 (`MozGridCoreProps` = PureSheetConfig 평탄형) — **controlled(양방향)**.
|
|
17
|
+
* 그리드 내부 변경(피벗 패널/옵션 모달·그룹)이 `onCoreConfigChange` 로 역류 → 단방향 prop 클로버 버그 소멸.
|
|
18
|
+
*/
|
|
19
|
+
coreConfig?: MozGridCoreProps;
|
|
20
|
+
onCoreConfigChange?: (next: MozGridCoreProps) => void;
|
|
21
|
+
cellTemplates?: Record<string, ComponentType<CellSlotProps>>;
|
|
22
|
+
headerTemplates?: Record<string, ComponentType<HeaderSlotProps>>;
|
|
23
|
+
editorTemplates?: Record<string, ComponentType<EditorSlotProps>>;
|
|
24
|
+
toolLeft?: ReactNode;
|
|
25
|
+
/** tool-items 슬롯 — 정적 ReactNode 또는 {disabled,hasItem} 받는 render-prop (Vue 스코프 슬롯 대응). */
|
|
26
|
+
toolItems?: ReactNode | ((props: WrapperToolItemsProps) => ReactNode);
|
|
27
|
+
toolBottom?: ReactNode;
|
|
28
|
+
optionPopup?: ReactNode;
|
|
29
|
+
notification?: ReactNode;
|
|
30
|
+
footer?: ReactNode;
|
|
31
|
+
/** 빈 상태 customState 영역 (Vue `#empty-state` 슬롯 대응) */
|
|
32
|
+
emptyStateContent?: ReactNode;
|
|
33
|
+
/**
|
|
34
|
+
* 그리드 준비 완료. `grid` 는 core 인스턴스, `chrome` 은 wrapper 크롬이다.
|
|
35
|
+
* 예) 피벗 옵션 바를 처음부터 켜 두기: `(grid, chrome) => chrome.setPivotBarVisible(true)`.
|
|
36
|
+
*/
|
|
37
|
+
onReady?: (grid: PureSheet, chrome: GridChrome) => void;
|
|
38
|
+
onDataLoaded?: () => void;
|
|
39
|
+
onRowClick?: (payload: unknown) => void;
|
|
40
|
+
onRowDblclick?: (payload: unknown) => void;
|
|
41
|
+
onRowPinned?: (payload: unknown) => void;
|
|
42
|
+
onRowUnpinned?: (payload: unknown) => void;
|
|
43
|
+
onRowReordered?: (payload: unknown) => void;
|
|
44
|
+
onCellClick?: (payload: unknown) => void;
|
|
45
|
+
onCellDblclick?: (payload: unknown) => void;
|
|
46
|
+
onCellChange?: (payload: unknown) => void;
|
|
47
|
+
onCellBeforeEdit?: (payload: unknown) => void;
|
|
48
|
+
onCellEditCommitting?: (payload: unknown) => void;
|
|
49
|
+
onCellEditCommitted?: (payload: unknown) => void;
|
|
50
|
+
onCellTooltip?: (payload: unknown) => void;
|
|
51
|
+
onSelectionChanged?: (payload: unknown) => void;
|
|
52
|
+
onColumnResize?: (payload: unknown) => void;
|
|
53
|
+
onColumnReorder?: (payload: unknown) => void;
|
|
54
|
+
onColumnPin?: (payload: unknown) => void;
|
|
55
|
+
onColumnVisibility?: (payload: unknown) => void;
|
|
56
|
+
onSortChanged?: (payload: unknown) => void;
|
|
57
|
+
onHeaderClick?: (payload: unknown) => void;
|
|
58
|
+
onHeaderSortClick?: (payload: unknown) => void;
|
|
59
|
+
onHeaderFilterClick?: (payload: unknown) => void;
|
|
60
|
+
onFilterChanged?: (payload: unknown) => void;
|
|
61
|
+
onScroll?: (payload: ScrollPayload) => void;
|
|
62
|
+
onEndReached?: (payload: ScrollEndReachedPayload) => void;
|
|
63
|
+
onUndoStateChange?: (payload: unknown) => void;
|
|
64
|
+
onClipboardCopy?: (payload: unknown) => void;
|
|
65
|
+
onClipboardPaste?: (payload: unknown) => void;
|
|
66
|
+
onValidationChanged?: (payload: unknown) => void;
|
|
67
|
+
onColumnGroupToggle?: (payload: unknown) => void;
|
|
68
|
+
onGroupToggle?: (payload: unknown) => void;
|
|
69
|
+
onGroupBatchToggle?: (payload: unknown) => void;
|
|
70
|
+
onContextMenu?: (payload: unknown) => void;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* ref 핸들 — GridChrome 전체 표면 평탄 노출(Vue MozGrid.vue Proxy expose 대응).
|
|
74
|
+
* `ref.current.grid/filter/sort/pivot/chart/setUIOptions/on...` 직접 접근 + chrome 재생성 자연 반영.
|
|
75
|
+
*/
|
|
76
|
+
export type MozGridHandle = GridChrome & {
|
|
77
|
+
chrome: GridChrome | null;
|
|
78
|
+
};
|
|
79
|
+
export declare const MozGrid: import('react').ForwardRefExoticComponent<WrapperExtras & {
|
|
80
|
+
/**
|
|
81
|
+
* core 설정 1덩어리 (`MozGridCoreProps` = PureSheetConfig 평탄형) — **controlled(양방향)**.
|
|
82
|
+
* 그리드 내부 변경(피벗 패널/옵션 모달·그룹)이 `onCoreConfigChange` 로 역류 → 단방향 prop 클로버 버그 소멸.
|
|
83
|
+
*/
|
|
84
|
+
coreConfig?: MozGridCoreProps;
|
|
85
|
+
onCoreConfigChange?: (next: MozGridCoreProps) => void;
|
|
86
|
+
cellTemplates?: Record<string, ComponentType<CellSlotProps>>;
|
|
87
|
+
headerTemplates?: Record<string, ComponentType<HeaderSlotProps>>;
|
|
88
|
+
editorTemplates?: Record<string, ComponentType<EditorSlotProps>>;
|
|
89
|
+
toolLeft?: ReactNode;
|
|
90
|
+
/** tool-items 슬롯 — 정적 ReactNode 또는 {disabled,hasItem} 받는 render-prop (Vue 스코프 슬롯 대응). */
|
|
91
|
+
toolItems?: ReactNode | ((props: WrapperToolItemsProps) => ReactNode);
|
|
92
|
+
toolBottom?: ReactNode;
|
|
93
|
+
optionPopup?: ReactNode;
|
|
94
|
+
notification?: ReactNode;
|
|
95
|
+
footer?: ReactNode;
|
|
96
|
+
/** 빈 상태 customState 영역 (Vue `#empty-state` 슬롯 대응) */
|
|
97
|
+
emptyStateContent?: ReactNode;
|
|
98
|
+
/**
|
|
99
|
+
* 그리드 준비 완료. `grid` 는 core 인스턴스, `chrome` 은 wrapper 크롬이다.
|
|
100
|
+
* 예) 피벗 옵션 바를 처음부터 켜 두기: `(grid, chrome) => chrome.setPivotBarVisible(true)`.
|
|
101
|
+
*/
|
|
102
|
+
onReady?: (grid: PureSheet, chrome: GridChrome) => void;
|
|
103
|
+
onDataLoaded?: () => void;
|
|
104
|
+
onRowClick?: (payload: unknown) => void;
|
|
105
|
+
onRowDblclick?: (payload: unknown) => void;
|
|
106
|
+
onRowPinned?: (payload: unknown) => void;
|
|
107
|
+
onRowUnpinned?: (payload: unknown) => void;
|
|
108
|
+
onRowReordered?: (payload: unknown) => void;
|
|
109
|
+
onCellClick?: (payload: unknown) => void;
|
|
110
|
+
onCellDblclick?: (payload: unknown) => void;
|
|
111
|
+
onCellChange?: (payload: unknown) => void;
|
|
112
|
+
onCellBeforeEdit?: (payload: unknown) => void;
|
|
113
|
+
onCellEditCommitting?: (payload: unknown) => void;
|
|
114
|
+
onCellEditCommitted?: (payload: unknown) => void;
|
|
115
|
+
onCellTooltip?: (payload: unknown) => void;
|
|
116
|
+
onSelectionChanged?: (payload: unknown) => void;
|
|
117
|
+
onColumnResize?: (payload: unknown) => void;
|
|
118
|
+
onColumnReorder?: (payload: unknown) => void;
|
|
119
|
+
onColumnPin?: (payload: unknown) => void;
|
|
120
|
+
onColumnVisibility?: (payload: unknown) => void;
|
|
121
|
+
onSortChanged?: (payload: unknown) => void;
|
|
122
|
+
onHeaderClick?: (payload: unknown) => void;
|
|
123
|
+
onHeaderSortClick?: (payload: unknown) => void;
|
|
124
|
+
onHeaderFilterClick?: (payload: unknown) => void;
|
|
125
|
+
onFilterChanged?: (payload: unknown) => void;
|
|
126
|
+
onScroll?: (payload: ScrollPayload) => void;
|
|
127
|
+
onEndReached?: (payload: ScrollEndReachedPayload) => void;
|
|
128
|
+
onUndoStateChange?: (payload: unknown) => void;
|
|
129
|
+
onClipboardCopy?: (payload: unknown) => void;
|
|
130
|
+
onClipboardPaste?: (payload: unknown) => void;
|
|
131
|
+
onValidationChanged?: (payload: unknown) => void;
|
|
132
|
+
onColumnGroupToggle?: (payload: unknown) => void;
|
|
133
|
+
onGroupToggle?: (payload: unknown) => void;
|
|
134
|
+
onGroupBatchToggle?: (payload: unknown) => void;
|
|
135
|
+
onContextMenu?: (payload: unknown) => void;
|
|
136
|
+
} & import('react').RefAttributes<MozGridHandle>>;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { ComponentType, ReactNode } from 'react';
|
|
2
|
+
export type ContextWrapper = (children: ReactNode) => ReactNode;
|
|
3
|
+
export declare class ReactRenderer {
|
|
4
|
+
private instances;
|
|
5
|
+
private contextWrapper;
|
|
6
|
+
/**
|
|
7
|
+
* lifecycle 셀 renderer 전용: 컨테이너(.ps-cell-content)별 "현재 owner root".
|
|
8
|
+
* 가상 스크롤/그룹 토글로 CellPool이 같은 DOM 노드를 LIFO로 즉시 재획득할 때
|
|
9
|
+
* 발생하는 "지연 unmount ↔ 새 mount" 경쟁을 막기 위한 추적용. (mountInstance 참조)
|
|
10
|
+
*/
|
|
11
|
+
private lifecycleRoots;
|
|
12
|
+
/** 외부 Provider 트리를 캡처 (MozGridReactCore의 useLayoutEffect에서 호출). */
|
|
13
|
+
setContextWrapper(wrapper: ContextWrapper | null): void;
|
|
14
|
+
/**
|
|
15
|
+
* React 컴포넌트를 DOM 요소에 마운트합니다.
|
|
16
|
+
*
|
|
17
|
+
* 동일 key로 재호출 시 props만 업데이트합니다 (root.render 재호출).
|
|
18
|
+
*/
|
|
19
|
+
mount(key: string, container: HTMLElement, component: ComponentType<any>, props?: Record<string, unknown>): void;
|
|
20
|
+
/**
|
|
21
|
+
* 컨테이너 단위 lifecycle 인스턴스 마운트 (키 없음).
|
|
22
|
+
*
|
|
23
|
+
* core 의 LifecycleCellRenderer(arity 2: `(container, params) => instance`) 전용.
|
|
24
|
+
* 전역 키맵을 쓰지 않고 셀 컨테이너마다 독립 root 를 만들며, update(=root.render 재호출)로 갱신,
|
|
25
|
+
* destroy(=root.unmount)로 정리한다. 가상 스크롤 재사용은 destroy 없이 update 로 처리.
|
|
26
|
+
* (키 충돌·미재마운트로 셀이 안 그려지던 버그 해소)
|
|
27
|
+
*/
|
|
28
|
+
mountInstance(container: HTMLElement, component: ComponentType<any>, initialProps: Record<string, unknown>): {
|
|
29
|
+
update: (props: Record<string, unknown>) => void;
|
|
30
|
+
destroy: () => void;
|
|
31
|
+
};
|
|
32
|
+
/** props 업데이트 (재마운트 없음, root.render 재호출) */
|
|
33
|
+
updateProps(key: string, props: Record<string, unknown>): void;
|
|
34
|
+
/** 특정 인스턴스 언마운트 */
|
|
35
|
+
unmount(key: string): void;
|
|
36
|
+
/** 접두사 기반 일괄 언마운트 (예: 'cell:' 접두사) */
|
|
37
|
+
unmountByPrefix(prefix: string): void;
|
|
38
|
+
/** 전체 인스턴스 언마운트 */
|
|
39
|
+
unmountAll(): void;
|
|
40
|
+
/** 현재 마운트된 인스턴스 수 */
|
|
41
|
+
get size(): number;
|
|
42
|
+
/** 특정 key의 인스턴스가 존재하는지 확인 */
|
|
43
|
+
has(key: string): boolean;
|
|
44
|
+
private render;
|
|
45
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { FieldDef } from '@vmscloud/moz-ui-grid-core';
|
|
2
|
+
import { TemplateRegistry } from '../types/slots';
|
|
3
|
+
import { ReactRenderer } from './ReactRenderer';
|
|
4
|
+
/**
|
|
5
|
+
* 사용자 FieldDef + 등록된 React 컴포넌트 → cellRenderer/headerRenderer/editor 주입.
|
|
6
|
+
*
|
|
7
|
+
* Vue 측 fieldBuilder.ts의 React 대응.
|
|
8
|
+
*/
|
|
9
|
+
export declare function buildFieldDefs(fields: FieldDef[], registry: TemplateRegistry, renderer: ReactRenderer): FieldDef[];
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { TemplateRegistry } from '../types/slots';
|
|
2
|
+
/**
|
|
3
|
+
* 템플릿 레지스트리 생성.
|
|
4
|
+
*
|
|
5
|
+
* CellTemplate, HeaderTemplate, CellEditor, DetailTemplate, GroupTemplate React
|
|
6
|
+
* 컴포넌트가 mount 시 register하고, unmount 시 unregister합니다.
|
|
7
|
+
*
|
|
8
|
+
* Vue 버전과 달리 reactive하지 않습니다. 등록 후 PureSheet가 다시 빌드되어야 반영됩니다
|
|
9
|
+
* (그리드의 fields prop 변경 시 자동으로 rebuildFields가 호출됨).
|
|
10
|
+
*/
|
|
11
|
+
export declare function createTemplateRegistry(): TemplateRegistry;
|