kokotable 0.95.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +320 -0
- package/contract/table-request.schema.json +424 -0
- package/dist/core/src/adapters/sources.d.ts +59 -0
- package/dist/core/src/adapters/sources.js +235 -0
- package/dist/core/src/client/aggregate.d.ts +94 -0
- package/dist/core/src/client/aggregate.js +222 -0
- package/dist/core/src/client/groupRows.d.ts +40 -0
- package/dist/core/src/client/groupRows.js +145 -0
- package/dist/core/src/client/runClientQuery.d.ts +67 -0
- package/dist/core/src/client/runClientQuery.js +157 -0
- package/dist/core/src/columns/ColumnBuilder.d.ts +121 -0
- package/dist/core/src/columns/ColumnBuilder.js +273 -0
- package/dist/core/src/columns/cascade.d.ts +24 -0
- package/dist/core/src/columns/cascade.js +93 -0
- package/dist/core/src/columns/deriveOperators.d.ts +38 -0
- package/dist/core/src/columns/deriveOperators.js +94 -0
- package/dist/core/src/columns/expandSorting.d.ts +19 -0
- package/dist/core/src/columns/expandSorting.js +52 -0
- package/dist/core/src/columns/helper.d.ts +196 -0
- package/dist/core/src/columns/helper.js +250 -0
- package/dist/core/src/columns/labels.d.ts +12 -0
- package/dist/core/src/columns/labels.js +21 -0
- package/dist/core/src/contract.d.ts +12 -0
- package/dist/core/src/contract.js +12 -0
- package/dist/core/src/contracts/aiColumnMeta.d.ts +102 -0
- package/dist/core/src/contracts/aiColumnMeta.js +197 -0
- package/dist/core/src/contracts/describeColumns.d.ts +48 -0
- package/dist/core/src/contracts/describeColumns.js +40 -0
- package/dist/core/src/contracts/exportData.d.ts +150 -0
- package/dist/core/src/contracts/exportData.js +228 -0
- package/dist/core/src/contracts/index.d.ts +6 -0
- package/dist/core/src/contracts/index.js +12 -0
- package/dist/core/src/contracts/legacyUrl.d.ts +47 -0
- package/dist/core/src/contracts/legacyUrl.js +156 -0
- package/dist/core/src/contracts/preset.d.ts +104 -0
- package/dist/core/src/contracts/preset.js +141 -0
- package/dist/core/src/contracts/presetStore.d.ts +81 -0
- package/dist/core/src/contracts/presetStore.js +146 -0
- package/dist/core/src/contracts/usePresets.d.ts +51 -0
- package/dist/core/src/contracts/usePresets.js +170 -0
- package/dist/core/src/defaults.d.ts +7 -0
- package/dist/core/src/defaults.js +9 -0
- package/dist/core/src/filters/codec.d.ts +20 -0
- package/dist/core/src/filters/codec.js +61 -0
- package/dist/core/src/filters/date.d.ts +30 -0
- package/dist/core/src/filters/date.js +179 -0
- package/dist/core/src/filters/describe.d.ts +45 -0
- package/dist/core/src/filters/describe.js +189 -0
- package/dist/core/src/filters/kind.d.ts +52 -0
- package/dist/core/src/filters/kind.js +110 -0
- package/dist/core/src/filters/kinds/_list.d.ts +13 -0
- package/dist/core/src/filters/kinds/_list.js +42 -0
- package/dist/core/src/filters/kinds/boolean.d.ts +3 -0
- package/dist/core/src/filters/kinds/boolean.js +21 -0
- package/dist/core/src/filters/kinds/cascade.d.ts +6 -0
- package/dist/core/src/filters/kinds/cascade.js +16 -0
- package/dist/core/src/filters/kinds/commonCode.d.ts +3 -0
- package/dist/core/src/filters/kinds/commonCode.js +13 -0
- package/dist/core/src/filters/kinds/date.d.ts +9 -0
- package/dist/core/src/filters/kinds/date.js +32 -0
- package/dist/core/src/filters/kinds/enum.d.ts +4 -0
- package/dist/core/src/filters/kinds/enum.js +13 -0
- package/dist/core/src/filters/kinds/index.d.ts +49 -0
- package/dist/core/src/filters/kinds/index.js +39 -0
- package/dist/core/src/filters/kinds/linear.d.ts +5 -0
- package/dist/core/src/filters/kinds/linear.js +16 -0
- package/dist/core/src/filters/kinds/number.d.ts +5 -0
- package/dist/core/src/filters/kinds/number.js +19 -0
- package/dist/core/src/filters/kinds/period.d.ts +4 -0
- package/dist/core/src/filters/kinds/period.js +17 -0
- package/dist/core/src/filters/kinds/relation.d.ts +5 -0
- package/dist/core/src/filters/kinds/relation.js +17 -0
- package/dist/core/src/filters/kinds/schedule.d.ts +5 -0
- package/dist/core/src/filters/kinds/schedule.js +16 -0
- package/dist/core/src/filters/kinds/text.d.ts +4 -0
- package/dist/core/src/filters/kinds/text.js +18 -0
- package/dist/core/src/filters/linear.d.ts +33 -0
- package/dist/core/src/filters/linear.js +65 -0
- package/dist/core/src/filters/list.d.ts +32 -0
- package/dist/core/src/filters/list.js +87 -0
- package/dist/core/src/filters/number.d.ts +17 -0
- package/dist/core/src/filters/number.js +82 -0
- package/dist/core/src/filters/registry.d.ts +23 -0
- package/dist/core/src/filters/registry.js +121 -0
- package/dist/core/src/filters/relation.d.ts +26 -0
- package/dist/core/src/filters/relation.js +75 -0
- package/dist/core/src/filters/schedule.d.ts +21 -0
- package/dist/core/src/filters/schedule.js +60 -0
- package/dist/core/src/filters/text.d.ts +44 -0
- package/dist/core/src/filters/text.js +127 -0
- package/dist/core/src/hooks/index.d.ts +6 -0
- package/dist/core/src/hooks/index.js +6 -0
- package/dist/core/src/hooks/useDataTable.d.ts +13 -0
- package/dist/core/src/hooks/useDataTable.js +109 -0
- package/dist/core/src/hooks/useGrouping.d.ts +33 -0
- package/dist/core/src/hooks/useGrouping.js +57 -0
- package/dist/core/src/hooks/useSearchHistory.d.ts +20 -0
- package/dist/core/src/hooks/useSearchHistory.js +52 -0
- package/dist/core/src/hooks/useTableData.d.ts +25 -0
- package/dist/core/src/hooks/useTableData.js +49 -0
- package/dist/core/src/hooks/useTableFromDefinition.d.ts +47 -0
- package/dist/core/src/hooks/useTableFromDefinition.js +174 -0
- package/dist/core/src/hooks/useTableSearch.d.ts +10 -0
- package/dist/core/src/hooks/useTableSearch.js +434 -0
- package/dist/core/src/hooks/useUrlSync.d.ts +64 -0
- package/dist/core/src/hooks/useUrlSync.js +145 -0
- package/dist/core/src/index.d.ts +38 -0
- package/dist/core/src/index.js +43 -0
- package/dist/core/src/pivot/runClientPivot.d.ts +101 -0
- package/dist/core/src/pivot/runClientPivot.js +230 -0
- package/dist/core/src/pivot/transforms.d.ts +19 -0
- package/dist/core/src/pivot/transforms.js +105 -0
- package/dist/core/src/registry.d.ts +46 -0
- package/dist/core/src/registry.js +67 -0
- package/dist/core/src/types/column.d.ts +213 -0
- package/dist/core/src/types/column.js +1 -0
- package/dist/core/src/types/data.d.ts +63 -0
- package/dist/core/src/types/data.js +1 -0
- package/dist/core/src/types/definition.d.ts +239 -0
- package/dist/core/src/types/definition.js +59 -0
- package/dist/core/src/types/filter.d.ts +94 -0
- package/dist/core/src/types/filter.js +1 -0
- package/dist/core/src/types/filterKind.d.ts +204 -0
- package/dist/core/src/types/filterKind.js +1 -0
- package/dist/core/src/types/grouping.d.ts +80 -0
- package/dist/core/src/types/grouping.js +4 -0
- package/dist/core/src/types/index.d.ts +8 -0
- package/dist/core/src/types/index.js +8 -0
- package/dist/core/src/types/operators.d.ts +64 -0
- package/dist/core/src/types/operators.js +108 -0
- package/dist/core/src/types/request.d.ts +114 -0
- package/dist/core/src/types/request.js +1 -0
- package/dist/core/src/types/search.d.ts +112 -0
- package/dist/core/src/types/search.js +1 -0
- package/dist/core/src/types/sources.d.ts +84 -0
- package/dist/core/src/types/sources.js +1 -0
- package/dist/core/src/types/table.d.ts +40 -0
- package/dist/core/src/types/table.js +1 -0
- package/dist/core/src/utils/compare.d.ts +13 -0
- package/dist/core/src/utils/compare.js +53 -0
- package/dist/core/src/utils/dateText.d.ts +12 -0
- package/dist/core/src/utils/dateText.js +30 -0
- package/dist/core/src/utils/getValue.d.ts +9 -0
- package/dist/core/src/utils/getValue.js +32 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/mui/src/TableLayout.d.ts +75 -0
- package/dist/mui/src/TableLayout.js +162 -0
- package/dist/mui/src/TableScreen.d.ts +70 -0
- package/dist/mui/src/TableScreen.js +174 -0
- package/dist/mui/src/addons/FilterModal.d.ts +45 -0
- package/dist/mui/src/addons/FilterModal.js +39 -0
- package/dist/mui/src/addons/FilterStatusModal.d.ts +40 -0
- package/dist/mui/src/addons/FilterStatusModal.js +68 -0
- package/dist/mui/src/addons/PresetBar.d.ts +56 -0
- package/dist/mui/src/addons/PresetBar.js +145 -0
- package/dist/mui/src/addons/ShareDropdown.d.ts +35 -0
- package/dist/mui/src/addons/ShareDropdown.js +41 -0
- package/dist/mui/src/addons/searchStore.d.ts +44 -0
- package/dist/mui/src/addons/searchStore.js +112 -0
- package/dist/mui/src/addons/searchSummary.d.ts +106 -0
- package/dist/mui/src/addons/searchSummary.js +109 -0
- package/dist/mui/src/columns/displayColumns.d.ts +100 -0
- package/dist/mui/src/columns/displayColumns.js +174 -0
- package/dist/mui/src/content/CardContent.d.ts +24 -0
- package/dist/mui/src/content/CardContent.js +25 -0
- package/dist/mui/src/content/ColumnMenu.d.ts +43 -0
- package/dist/mui/src/content/ColumnMenu.js +40 -0
- package/dist/mui/src/content/ColumnVisibilityMenu.d.ts +14 -0
- package/dist/mui/src/content/ColumnVisibilityMenu.js +37 -0
- package/dist/mui/src/content/EditCell.d.ts +19 -0
- package/dist/mui/src/content/EditCell.js +61 -0
- package/dist/mui/src/content/HeaderCell.d.ts +59 -0
- package/dist/mui/src/content/HeaderCell.js +88 -0
- package/dist/mui/src/content/SelectionActionBar.d.ts +17 -0
- package/dist/mui/src/content/SelectionActionBar.js +19 -0
- package/dist/mui/src/content/SortControl.d.ts +17 -0
- package/dist/mui/src/content/SortControl.js +45 -0
- package/dist/mui/src/content/TableContent.d.ts +191 -0
- package/dist/mui/src/content/TableContent.js +525 -0
- package/dist/mui/src/content/TableErrorFallback.d.ts +24 -0
- package/dist/mui/src/content/TableErrorFallback.js +29 -0
- package/dist/mui/src/content/cellError.d.ts +13 -0
- package/dist/mui/src/content/cellError.js +20 -0
- package/dist/mui/src/content/cellRenderers.d.ts +71 -0
- package/dist/mui/src/content/cellRenderers.js +127 -0
- package/dist/mui/src/content/cellValue.d.ts +27 -0
- package/dist/mui/src/content/cellValue.js +82 -0
- package/dist/mui/src/content/columnOrder.d.ts +7 -0
- package/dist/mui/src/content/columnOrder.js +48 -0
- package/dist/mui/src/content/density.d.ts +13 -0
- package/dist/mui/src/content/density.js +12 -0
- package/dist/mui/src/content/menuItems.d.ts +118 -0
- package/dist/mui/src/content/menuItems.js +128 -0
- package/dist/mui/src/content/pinning.d.ts +17 -0
- package/dist/mui/src/content/pinning.js +65 -0
- package/dist/mui/src/exporters/index.d.ts +1 -0
- package/dist/mui/src/exporters/index.js +1 -0
- package/dist/mui/src/exporters/useExportFormatters.d.ts +13 -0
- package/dist/mui/src/exporters/useExportFormatters.js +17 -0
- package/dist/mui/src/filter/FilterArea.d.ts +40 -0
- package/dist/mui/src/filter/FilterArea.js +37 -0
- package/dist/mui/src/filter/FilterInput.d.ts +14 -0
- package/dist/mui/src/filter/FilterInput.js +18 -0
- package/dist/mui/src/filter/inputs/DateFilterInput.d.ts +14 -0
- package/dist/mui/src/filter/inputs/DateFilterInput.js +112 -0
- package/dist/mui/src/filter/inputs/LinearFilterInput.d.ts +10 -0
- package/dist/mui/src/filter/inputs/LinearFilterInput.js +35 -0
- package/dist/mui/src/filter/inputs/NumberFilterInput.d.ts +12 -0
- package/dist/mui/src/filter/inputs/NumberFilterInput.js +111 -0
- package/dist/mui/src/filter/inputs/OperatorMenu.d.ts +14 -0
- package/dist/mui/src/filter/inputs/OperatorMenu.js +25 -0
- package/dist/mui/src/filter/inputs/RelationFilterInput.d.ts +11 -0
- package/dist/mui/src/filter/inputs/RelationFilterInput.js +67 -0
- package/dist/mui/src/filter/inputs/ScheduleFilterInput.d.ts +8 -0
- package/dist/mui/src/filter/inputs/ScheduleFilterInput.js +17 -0
- package/dist/mui/src/filter/inputs/SelectFilterInput.d.ts +16 -0
- package/dist/mui/src/filter/inputs/SelectFilterInput.js +57 -0
- package/dist/mui/src/filter/inputs/TextFilterInput.d.ts +13 -0
- package/dist/mui/src/filter/inputs/TextFilterInput.js +55 -0
- package/dist/mui/src/filter/kinds.d.ts +58 -0
- package/dist/mui/src/filter/kinds.js +103 -0
- package/dist/mui/src/grouping/AggregateChip.d.ts +55 -0
- package/dist/mui/src/grouping/AggregateChip.js +128 -0
- package/dist/mui/src/grouping/AggregationChips.d.ts +49 -0
- package/dist/mui/src/grouping/AggregationChips.js +80 -0
- package/dist/mui/src/grouping/AggregationSettingsButton.d.ts +14 -0
- package/dist/mui/src/grouping/AggregationSettingsButton.js +19 -0
- package/dist/mui/src/grouping/GroupingBar.d.ts +59 -0
- package/dist/mui/src/grouping/GroupingBar.js +267 -0
- package/dist/mui/src/grouping/StepExpandButton.d.ts +12 -0
- package/dist/mui/src/grouping/StepExpandButton.js +18 -0
- package/dist/mui/src/grouping/groupRow.d.ts +68 -0
- package/dist/mui/src/grouping/groupRow.js +129 -0
- package/dist/mui/src/headers/defaultHeader.d.ts +28 -0
- package/dist/mui/src/headers/defaultHeader.js +90 -0
- package/dist/mui/src/headers/defineHeader.d.ts +21 -0
- package/dist/mui/src/headers/defineHeader.js +68 -0
- package/dist/mui/src/headers/index.d.ts +5 -0
- package/dist/mui/src/headers/index.js +3 -0
- package/dist/mui/src/headers/meta.d.ts +18 -0
- package/dist/mui/src/headers/meta.js +11 -0
- package/dist/mui/src/headers/types.d.ts +84 -0
- package/dist/mui/src/headers/types.js +1 -0
- package/dist/mui/src/index.d.ts +110 -0
- package/dist/mui/src/index.js +79 -0
- package/dist/mui/src/layout/ResizeHandle.d.ts +30 -0
- package/dist/mui/src/layout/ResizeHandle.js +66 -0
- package/dist/mui/src/menus/columnMenu.d.ts +45 -0
- package/dist/mui/src/menus/columnMenu.js +144 -0
- package/dist/mui/src/menus/copy.d.ts +5 -0
- package/dist/mui/src/menus/copy.js +25 -0
- package/dist/mui/src/menus/index.d.ts +6 -0
- package/dist/mui/src/menus/index.js +4 -0
- package/dist/mui/src/menus/resolve.d.ts +15 -0
- package/dist/mui/src/menus/resolve.js +60 -0
- package/dist/mui/src/menus/rowMenu.d.ts +46 -0
- package/dist/mui/src/menus/rowMenu.js +76 -0
- package/dist/mui/src/pagination/PaginationArea.d.ts +16 -0
- package/dist/mui/src/pagination/PaginationArea.js +23 -0
- package/dist/mui/src/pivot/PivotTable.d.ts +18 -0
- package/dist/mui/src/pivot/PivotTable.js +100 -0
- package/dist/mui/src/provider/KokoTableProvider.d.ts +184 -0
- package/dist/mui/src/provider/KokoTableProvider.js +118 -0
- package/dist/mui/src/provider/labels.d.ts +85 -0
- package/dist/mui/src/provider/labels.js +104 -0
- package/dist/mui/src/registry.d.ts +30 -0
- package/dist/mui/src/registry.js +5 -0
- package/dist/mui/src/toolbar/GlobalFilterField.d.ts +36 -0
- package/dist/mui/src/toolbar/GlobalFilterField.js +78 -0
- package/dist/mui/src/virtual/VirtualTableContent.d.ts +41 -0
- package/dist/mui/src/virtual/VirtualTableContent.js +58 -0
- package/dist/mui/src/virtual/VirtualTableScreen.d.ts +13 -0
- package/dist/mui/src/virtual/VirtualTableScreen.js +23 -0
- package/dist/mui/src/virtual.d.ts +4 -0
- package/dist/mui/src/virtual.js +4 -0
- package/dist/mui/src/virtualColumns/VirtualColumnCard.d.ts +26 -0
- package/dist/mui/src/virtualColumns/VirtualColumnCard.js +29 -0
- package/dist/mui/src/virtualColumns/VirtualColumnDialog.d.ts +27 -0
- package/dist/mui/src/virtualColumns/VirtualColumnDialog.js +154 -0
- package/dist/mui/src/virtualColumns/VirtualColumnSection.d.ts +31 -0
- package/dist/mui/src/virtualColumns/VirtualColumnSection.js +55 -0
- package/dist/mui/src/virtualColumns/expression.d.ts +68 -0
- package/dist/mui/src/virtualColumns/expression.js +489 -0
- package/dist/mui/src/virtualColumns/useVirtualColumns.d.ts +67 -0
- package/dist/mui/src/virtualColumns/useVirtualColumns.js +111 -0
- package/dist/mui/src/virtualColumns/virtualColumnDefs.d.ts +29 -0
- package/dist/mui/src/virtualColumns/virtualColumnDefs.js +51 -0
- package/dist/mui-virtual.d.ts +1 -0
- package/dist/mui-virtual.js +2 -0
- package/dist/mui.d.ts +1 -0
- package/dist/mui.js +2 -0
- package/dist/query/src/index.d.ts +6 -0
- package/dist/query/src/index.js +7 -0
- package/dist/query/src/serverPivot.d.ts +42 -0
- package/dist/query/src/serverPivot.js +153 -0
- package/dist/query/src/useServerGrouping.d.ts +52 -0
- package/dist/query/src/useServerGrouping.js +186 -0
- package/dist/query/src/useServerTable.d.ts +20 -0
- package/dist/query/src/useServerTable.js +106 -0
- package/dist/query/src/useServerTableData.d.ts +48 -0
- package/dist/query/src/useServerTableData.js +64 -0
- package/dist/query/src/wire.d.ts +16 -0
- package/dist/query/src/wire.js +32 -0
- package/dist/query.d.ts +1 -0
- package/dist/query.js +2 -0
- package/package.json +125 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { TableCell } from "@mui/material";
|
|
4
|
+
import { flexRender } from "@tanstack/react-table";
|
|
5
|
+
import { ColumnMenu } from "./ColumnMenu";
|
|
6
|
+
import { isDisplayColumnId } from "../columns/displayColumns";
|
|
7
|
+
import { explicitWidth, pinnedSx } from "./pinning";
|
|
8
|
+
import { useKokoTableConfig } from "../provider/KokoTableProvider";
|
|
9
|
+
import { createHeaderContext } from "./menuItems";
|
|
10
|
+
import { applyHeaderRules, resolveHeaderDef } from "../headers/defineHeader";
|
|
11
|
+
import { defaultHeader, headerRegistry, materializeHeader } from "../headers/defaultHeader";
|
|
12
|
+
import { headerRuleMetaOf, resolveCellAlign } from "../headers/meta";
|
|
13
|
+
export { headerRuleMetaOf, resolveCellAlign } from "../headers/meta";
|
|
14
|
+
/**
|
|
15
|
+
* 헤더 셀 — 바깥 `<th>`(colSpan · 고정 sticky · 폭 · 드래그 · 우클릭 메뉴)를 맡고,
|
|
16
|
+
* 안쪽 내용은 **헤더 정의**(`defineHeader`)가 그린다.
|
|
17
|
+
*
|
|
18
|
+
* 정의 적용 순서: `headerDef` prop → `column.meta.header`(id 또는 정의) → Provider `headers[]` 중 `when` 이 참인 첫 정의 → 기본.
|
|
19
|
+
* 정의의 `rules` 는 여기서 해석돼 정렬 클릭·리사이즈 핸들·드래그·메뉴 항목 `when` 과 TanStack `column.getCan*()` 모두에 반영된다.
|
|
20
|
+
*
|
|
21
|
+
* 정렬은 `SortSource` 로만 받는다. 콘텐츠 계약에 섞지 않은 이유는
|
|
22
|
+
* 카드 화면처럼 헤더가 없는 곳에서도 정렬 컨트롤을 따로 둘 수 있어야 하기 때문이다.
|
|
23
|
+
* 컬럼 단위 규칙은 `meta.headerTooltip` / `meta.headerAlign` / `meta.align` 을 읽는다.
|
|
24
|
+
*/
|
|
25
|
+
export function HeaderCell({ header, sort, table: tableProp, enableColumnMenu = true, size, draggableGroup, columnMenuItems, grouping, onGroupingChange, aggregation, onAggregationChange, onOpenFilter, headerCellProps, renderHeader, headerDef, }) {
|
|
26
|
+
const { components, labels, headers } = useKokoTableConfig();
|
|
27
|
+
const ColumnMenuComponent = (components.ColumnMenu ?? ColumnMenu);
|
|
28
|
+
const column = header.column;
|
|
29
|
+
const table = tableProp ?? header.getContext().table;
|
|
30
|
+
const rule = headerRuleMetaOf(column.columnDef);
|
|
31
|
+
const isDisplay = isDisplayColumnId(column.id);
|
|
32
|
+
const resizingEnabled = !!table.options.enableColumnResizing;
|
|
33
|
+
const [menuAnchor, setMenuAnchor] = useState(null);
|
|
34
|
+
// ── 헤더 정의 해석 ──
|
|
35
|
+
const baseCtx = createHeaderContext({ header, column, table, sort, labels });
|
|
36
|
+
const def = headerDef ?? resolveHeaderDef(baseCtx, headers, headerRegistry, defaultHeader);
|
|
37
|
+
const can = applyHeaderRules(baseCtx, def);
|
|
38
|
+
const { render, slots } = materializeHeader(def);
|
|
39
|
+
const canDragGroup = (draggableGroup ?? table.options.enableGrouping === true)
|
|
40
|
+
&& !isDisplay && !header.isPlaceholder && can.canGroup;
|
|
41
|
+
const canResize = resizingEnabled && can.canResize;
|
|
42
|
+
const showMenu = !!tableProp && enableColumnMenu && !isDisplay && !header.isPlaceholder && header.subHeaders.length === 0;
|
|
43
|
+
const width = explicitWidth(column, table);
|
|
44
|
+
const align = isDisplay ? "center" : (rule.headerAlign ?? resolveCellAlign(column.columnDef));
|
|
45
|
+
const rawContent = header.isPlaceholder ? null : flexRender(column.columnDef.header, header.getContext());
|
|
46
|
+
const defaultContent = renderHeader ? renderHeader({ header, table, defaultContent: rawContent }) : rawContent;
|
|
47
|
+
const renderCtx = {
|
|
48
|
+
...baseCtx,
|
|
49
|
+
can,
|
|
50
|
+
defaultContent,
|
|
51
|
+
align,
|
|
52
|
+
menuEnabled: showMenu,
|
|
53
|
+
openMenu: (anchor) => { if (showMenu)
|
|
54
|
+
setMenuAnchor(anchor); },
|
|
55
|
+
size,
|
|
56
|
+
};
|
|
57
|
+
const extra = headerCellProps?.(header, tableProp) ?? {};
|
|
58
|
+
const { sx: extraSx, onContextMenu: extraOnContextMenu, ...extraRest } = extra;
|
|
59
|
+
const state = baseCtx.sortState;
|
|
60
|
+
return (_jsxs(TableCell, { colSpan: header.colSpan, align: align, size: size, "data-column-id": column.id, "data-header-def": def.id, ...extraRest, sx: [
|
|
61
|
+
{
|
|
62
|
+
fontWeight: 600,
|
|
63
|
+
whiteSpace: "nowrap",
|
|
64
|
+
backgroundColor: "background.paper",
|
|
65
|
+
borderBottom: "2px solid",
|
|
66
|
+
borderColor: "divider",
|
|
67
|
+
width,
|
|
68
|
+
minWidth: width,
|
|
69
|
+
maxWidth: canResize ? width : undefined,
|
|
70
|
+
position: "relative",
|
|
71
|
+
// 메뉴 버튼은 hover 전까지 흐리게 — 헤더가 버튼으로 어지러워지지 않게
|
|
72
|
+
"&:hover .koko-column-menu-button": { opacity: 1 },
|
|
73
|
+
// sticky header(z 2) 위에 고정 컬럼 헤더가 오도록
|
|
74
|
+
...(pinnedSx(column, 3) ?? {}),
|
|
75
|
+
...(column.getIsPinned() ? { top: 0 } : {}),
|
|
76
|
+
},
|
|
77
|
+
...(Array.isArray(extraSx) ? extraSx : extraSx ? [extraSx] : []),
|
|
78
|
+
], sortDirection: state ? (state.desc ? "desc" : "asc") : false, draggable: canDragGroup || undefined, onDragStart: canDragGroup ? (event) => {
|
|
79
|
+
event.dataTransfer.effectAllowed = "copyMove";
|
|
80
|
+
event.dataTransfer.setData("text/koko-column", column.id);
|
|
81
|
+
} : undefined, onContextMenu: (event) => {
|
|
82
|
+
extraOnContextMenu?.(event);
|
|
83
|
+
if (!showMenu || event.defaultPrevented)
|
|
84
|
+
return;
|
|
85
|
+
event.preventDefault();
|
|
86
|
+
setMenuAnchor({ top: event.clientY, left: event.clientX });
|
|
87
|
+
}, children: [render(renderCtx, slots), showMenu && (_jsx(ColumnMenuComponent, { table: table, column: column, header: header, sort: sort, grouping: grouping, onGroupingChange: onGroupingChange, aggregation: aggregation, onAggregationChange: onAggregationChange, onOpenFilter: onOpenFilter, items: columnMenuItems, hideButton: true, anchor: menuAnchor, onAnchorClose: () => setMenuAnchor(null) }))] }));
|
|
88
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import type { RowData } from "@tanstack/react-table";
|
|
3
|
+
import { type AnySelectionSource } from "../../../core/src/index";
|
|
4
|
+
export interface SelectionActionBarProps<T extends RowData> {
|
|
5
|
+
/** 테이블 인스턴스 또는 `SelectionSource` */
|
|
6
|
+
source: AnySelectionSource<T>;
|
|
7
|
+
/** 선택된 행에 대한 액션 — 기존 `renderSelectAction({ table, selectedRows })` 대응 */
|
|
8
|
+
renderActions?: (selectedRows: T[]) => ReactNode;
|
|
9
|
+
children?: ReactNode;
|
|
10
|
+
/** 선택이 없어도 자리를 유지할지. 기본은 접힌다 */
|
|
11
|
+
keepMounted?: boolean;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* 선택 액션바 — 행이 하나라도 선택되면 슬라이드로 나타난다.
|
|
15
|
+
* `SelectionSource` 계약 위에서 동작하므로 테이블 없는 카드 화면에서도 같은 바를 쓴다.
|
|
16
|
+
*/
|
|
17
|
+
export declare function SelectionActionBar<T extends RowData>({ source, renderActions, children, keepMounted, }: SelectionActionBarProps<T>): import("react").JSX.Element;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Button, Checkbox, Collapse, Typography } from "@mui/material";
|
|
3
|
+
import CloseIcon from "@mui/icons-material/Close";
|
|
4
|
+
import { toSelectionSource } from "../../../core/src/index";
|
|
5
|
+
/**
|
|
6
|
+
* 선택 액션바 — 행이 하나라도 선택되면 슬라이드로 나타난다.
|
|
7
|
+
* `SelectionSource` 계약 위에서 동작하므로 테이블 없는 카드 화면에서도 같은 바를 쓴다.
|
|
8
|
+
*/
|
|
9
|
+
export function SelectionActionBar({ source, renderActions, children, keepMounted = false, }) {
|
|
10
|
+
const selection = toSelectionSource(source);
|
|
11
|
+
const selectedRows = selection.getSelectedRows();
|
|
12
|
+
const count = selectedRows.length;
|
|
13
|
+
const visible = count > 0;
|
|
14
|
+
const allSelected = selection.isAllSelected();
|
|
15
|
+
return (_jsx(Collapse, { in: visible, timeout: 250, unmountOnExit: !keepMounted, children: _jsxs(Box, { role: "toolbar", "aria-label": "\uC120\uD0DD \uC561\uC158", sx: {
|
|
16
|
+
display: "flex", alignItems: "center", gap: 1.5, px: 1.5, py: 0.75, mb: 1,
|
|
17
|
+
bgcolor: "primary.50", borderRadius: 1, border: "1px solid", borderColor: "primary.200",
|
|
18
|
+
}, children: [_jsx(Checkbox, { size: "small", checked: allSelected, indeterminate: !allSelected && visible, inputProps: { "aria-label": allSelected ? "전체 해제" : "전체 선택" }, onChange: () => (allSelected ? selection.deselectAll() : selection.selectAll()), sx: { p: 0.25 } }), _jsxs(Typography, { variant: "body2", fontWeight: 600, color: "primary.main", sx: { whiteSpace: "nowrap" }, children: [count, "\uAC1C \uC120\uD0DD"] }), _jsxs(Box, { sx: { display: "flex", gap: 0.5, flex: 1, alignItems: "center" }, children: [renderActions?.(selectedRows), children] }), _jsx(Button, { size: "small", color: "inherit", startIcon: _jsx(CloseIcon, { fontSize: "small" }), onClick: () => selection.deselectAll(), sx: { minWidth: "auto", color: "text.secondary", fontSize: "0.75rem" }, children: "\uD574\uC81C" })] }) }));
|
|
19
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { RowData } from "@tanstack/react-table";
|
|
2
|
+
import type { AnySortSource, TableColumnDefs } from "../../../core/src/index";
|
|
3
|
+
export interface SortControlProps<T extends RowData> {
|
|
4
|
+
source: AnySortSource<T>;
|
|
5
|
+
/** 정렬 후보 컬럼. `search.columns` 를 그대로 넘기면 된다 */
|
|
6
|
+
columns: TableColumnDefs<T>;
|
|
7
|
+
/** 정렬이 하나도 없을 때 보여줄 문구 */
|
|
8
|
+
placeholder?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* 단독 정렬 컨트롤 — **테이블 헤더 없이** 정렬을 조작한다.
|
|
12
|
+
*
|
|
13
|
+
* 정렬을 `ContentSource` 에 넣지 않고 `SortSource` 로 분리한 이유가 이것이다.
|
|
14
|
+
* 카드 그리드·차트처럼 헤더가 없는 화면에서도 같은 정렬 상태를 그대로 쓴다.
|
|
15
|
+
* 테이블 화면에서는 헤더(`HeaderCell`)가 같은 계약을 쓰므로 둘이 항상 일치한다.
|
|
16
|
+
*/
|
|
17
|
+
export declare function SortControl<T extends RowData>({ source, columns, placeholder, }: SortControlProps<T>): import("react").JSX.Element;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { Button, Chip, ListItemText, Menu, MenuItem, Stack, Tooltip, Typography, } from "@mui/material";
|
|
4
|
+
import ArrowDownwardIcon from "@mui/icons-material/ArrowDownward";
|
|
5
|
+
import ArrowUpwardIcon from "@mui/icons-material/ArrowUpward";
|
|
6
|
+
import SortIcon from "@mui/icons-material/Sort";
|
|
7
|
+
import { columnKey, toSortSource } from "../../../core/src/index";
|
|
8
|
+
function candidates(columns) {
|
|
9
|
+
const list = [];
|
|
10
|
+
for (const column of columns) {
|
|
11
|
+
const id = columnKey(column);
|
|
12
|
+
if (!id)
|
|
13
|
+
continue;
|
|
14
|
+
if (column.enableSorting === false)
|
|
15
|
+
continue;
|
|
16
|
+
if (column.meta?.forceHidden)
|
|
17
|
+
continue;
|
|
18
|
+
const header = column.filterLabel ?? column.header;
|
|
19
|
+
list.push({ id, label: typeof header === "string" ? header : id });
|
|
20
|
+
}
|
|
21
|
+
return list;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 단독 정렬 컨트롤 — **테이블 헤더 없이** 정렬을 조작한다.
|
|
25
|
+
*
|
|
26
|
+
* 정렬을 `ContentSource` 에 넣지 않고 `SortSource` 로 분리한 이유가 이것이다.
|
|
27
|
+
* 카드 그리드·차트처럼 헤더가 없는 화면에서도 같은 정렬 상태를 그대로 쓴다.
|
|
28
|
+
* 테이블 화면에서는 헤더(`HeaderCell`)가 같은 계약을 쓰므로 둘이 항상 일치한다.
|
|
29
|
+
*/
|
|
30
|
+
export function SortControl({ source, columns, placeholder = "정렬 없음", }) {
|
|
31
|
+
const sort = toSortSource(source);
|
|
32
|
+
const [anchorEl, setAnchorEl] = useState(null);
|
|
33
|
+
const all = candidates(columns);
|
|
34
|
+
const labelOf = (id) => all.find((c) => c.id === id)?.label ?? id;
|
|
35
|
+
const current = sort.getSort();
|
|
36
|
+
const remaining = all.filter((c) => !current.some((s) => s.id === c.id));
|
|
37
|
+
return (_jsxs(Stack, { direction: "row", alignItems: "center", spacing: 1, sx: { flexWrap: "wrap", gap: 0.5 }, children: [_jsx(SortIcon, { fontSize: "small", sx: { color: "text.disabled" } }), current.length === 0 ? (_jsx(Typography, { variant: "body2", color: "text.disabled", children: placeholder })) : (current.map((entry, index) => (_jsx(Tooltip, { title: "\uD074\uB9AD: \uBC29\uD5A5 \uC804\uD658", children: _jsx(Chip, { size: "small", variant: "outlined", color: "primary", icon: entry.desc ? _jsx(ArrowDownwardIcon, {}) : _jsx(ArrowUpwardIcon, {}), label: current.length > 1
|
|
38
|
+
? `${index + 1}. ${labelOf(entry.id)}`
|
|
39
|
+
: labelOf(entry.id),
|
|
40
|
+
// 방향 전환은 multi 로 — 아니면 다른 정렬 기준이 함께 날아간다
|
|
41
|
+
onClick: () => sort.toggleSort(entry.id, { desc: !entry.desc, multi: true }), onDelete: () => sort.clearSort(entry.id) }) }, entry.id)))), _jsx(Button, { size: "small", disabled: remaining.length === 0, onClick: (event) => setAnchorEl(event.currentTarget), children: "\uC815\uB82C \uCD94\uAC00" }), current.length > 0 && (_jsx(Button, { size: "small", color: "inherit", onClick: () => sort.clearSort(), children: "\uD574\uC81C" })), _jsx(Menu, { anchorEl: anchorEl, open: !!anchorEl, onClose: () => setAnchorEl(null), children: remaining.map((candidate) => (_jsx(MenuItem, { onClick: () => {
|
|
42
|
+
sort.toggleSort(candidate.id, { multi: current.length > 0 });
|
|
43
|
+
setAnchorEl(null);
|
|
44
|
+
}, children: _jsx(ListItemText, { primary: candidate.label }) }, candidate.id))) })] }));
|
|
45
|
+
}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import type { AggregationSpec } from "../../../core/src/index";
|
|
2
|
+
import { type ReactNode, type Ref } from "react";
|
|
3
|
+
import { type TableCellProps, type TableRowProps } from "@mui/material";
|
|
4
|
+
import { type Column, type Header, type Row, type RowData, type Table as TanTable } from "@tanstack/react-table";
|
|
5
|
+
import type { AggFnKey, ContentSource, FieldErrors, FlatItem, GroupPath, GroupTreeNode, SortSource } from "../../../core/src/index";
|
|
6
|
+
import { type RenderHeaderContext } from "./HeaderCell";
|
|
7
|
+
import { type CellValueOptions } from "./cellValue";
|
|
8
|
+
import { type Density } from "./density";
|
|
9
|
+
import { type ColumnMenuItemsFn, type RowMenuItemsFn } from "./menuItems";
|
|
10
|
+
/** 행에 얹을 MUI `TableRow` props — 기존 `muiTableBodyRowProps` 대응 */
|
|
11
|
+
export type RowProps = Omit<TableRowProps, "children" | "ref">;
|
|
12
|
+
/** detail panel 행·셀에 얹을 props — 기존 `muiDetailPanelProps`(셀) 대응 + 행 */
|
|
13
|
+
export interface DetailPanelProps {
|
|
14
|
+
row?: RowProps;
|
|
15
|
+
cell?: Omit<TableCellProps, "children" | "ref" | "colSpan">;
|
|
16
|
+
}
|
|
17
|
+
export type EditMode = "cell" | "row" | "modal";
|
|
18
|
+
export interface EditingOptions<T extends RowData> {
|
|
19
|
+
/**
|
|
20
|
+
* cell — 셀 더블클릭으로 그 셀만 편집. Enter/blur 확정, Escape 취소.
|
|
21
|
+
* row — `editingRowId` 행의 편집 가능 컬럼을 모두 입력으로 그린다(행 더블클릭 또는 외부 제어).
|
|
22
|
+
* modal — 행 더블클릭 시 `onEditRow` 를 부르고 `renderEditDialog` 가 있으면 그것을 띄운다.
|
|
23
|
+
*/
|
|
24
|
+
mode: EditMode;
|
|
25
|
+
/** row 모드에서 편집 중인 행 id (제어형). 없으면 행 더블클릭으로 내부 상태가 정한다 */
|
|
26
|
+
editingRowId?: string | null;
|
|
27
|
+
/**
|
|
28
|
+
* 값 확정. 없으면 `meta.edit.onCommit(value, row.original)`, 그것도 없으면
|
|
29
|
+
* `row.original[columnId]` 에 직접 반영한다(EditSpec 의 기본 규칙).
|
|
30
|
+
*/
|
|
31
|
+
onCommit?: (value: unknown, row: Row<T>, columnId: string) => void;
|
|
32
|
+
/** row/modal 모드에서 편집 진입(행 더블클릭) 알림 */
|
|
33
|
+
onEditRow?: (row: Row<T>) => void;
|
|
34
|
+
onCancel?: (row: Row<T>) => void;
|
|
35
|
+
}
|
|
36
|
+
/** 가상화 어댑터 — `VirtualTableContent` 가 채운다. 이 파일은 virtualizer 라이브러리를 모른다 */
|
|
37
|
+
export interface VirtualRows {
|
|
38
|
+
items: Array<{
|
|
39
|
+
index: number;
|
|
40
|
+
start: number;
|
|
41
|
+
end: number;
|
|
42
|
+
}>;
|
|
43
|
+
totalSize: number;
|
|
44
|
+
measureElement?: (element: Element | null) => void;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 열 가상화 어댑터 — **가운데(고정되지 않은) 보이는 리프 컬럼** 의 인덱스 범위다.
|
|
48
|
+
* 고정 컬럼은 항상 그린다. `VirtualTableContent({ virtualizeColumns })` 가 채운다.
|
|
49
|
+
*/
|
|
50
|
+
export interface VirtualColumns {
|
|
51
|
+
items: Array<{
|
|
52
|
+
index: number;
|
|
53
|
+
start: number;
|
|
54
|
+
end: number;
|
|
55
|
+
}>;
|
|
56
|
+
totalSize: number;
|
|
57
|
+
}
|
|
58
|
+
export interface TableContentProps<T extends RowData> {
|
|
59
|
+
/** 헤더·셀 렌더에 필요하므로 콘텐츠 구역 중 **테이블 본문만** 인스턴스를 요구한다 */
|
|
60
|
+
table: TanTable<T>;
|
|
61
|
+
content?: ContentSource<T>;
|
|
62
|
+
sort?: SortSource;
|
|
63
|
+
/** 그룹핑이 켜져 있으면 평탄화된 항목을 넘긴다 */
|
|
64
|
+
groupItems?: Array<FlatItem<T>>;
|
|
65
|
+
onToggleGroup?: (node: GroupTreeNode<T>) => void;
|
|
66
|
+
isGroupExpanded?: (node: GroupTreeNode<T>) => boolean;
|
|
67
|
+
/** 서버 그룹핑의 "더 보기" — 그 경로의 하위를 배치만큼 더 받는다 */
|
|
68
|
+
onLoadMore?: (path: GroupPath) => void;
|
|
69
|
+
emptyMessage?: ReactNode;
|
|
70
|
+
/** 빈 상태 슬롯 — 있으면 `emptyMessage` 대신 그린다 (기존 `renderEmptyRowsFallback`) */
|
|
71
|
+
renderEmpty?: () => ReactNode;
|
|
72
|
+
/** 초기 로딩 스켈레톤 행 수. 0 이면 "불러오는 중…" 텍스트 */
|
|
73
|
+
skeletonRows?: number;
|
|
74
|
+
/** 에러 UI 의 "필터 초기화" — 있으면 버튼이 생긴다 (`search.reset`) */
|
|
75
|
+
onResetFilters?: () => void;
|
|
76
|
+
/** 에러 UI 교체 슬롯 */
|
|
77
|
+
renderError?: (error: Error | undefined, retry: () => void) => ReactNode;
|
|
78
|
+
/** 조밀도 (`density` 가 있으면 무시) */
|
|
79
|
+
dense?: boolean;
|
|
80
|
+
/** 프리셋 `density` 값을 그대로 받는다 */
|
|
81
|
+
density?: Density;
|
|
82
|
+
maxHeight?: number | string;
|
|
83
|
+
stickyHeader?: boolean;
|
|
84
|
+
/** 행별 `TableRow` props — 기존 `muiTableBodyRowProps({ row, table })` 대응 */
|
|
85
|
+
getRowProps?: (row: Row<T>, table: TanTable<T>) => RowProps | undefined;
|
|
86
|
+
/** 행 클릭으로 선택 토글 (`tableOptions.enableRowSelection` 이 허용하는 행만) */
|
|
87
|
+
selectOnRowClick?: boolean;
|
|
88
|
+
/** 펼친 행 아래 전체 폭 패널 — `expandColumn()` 과 짝. 기존 `renderDetailPanel({ row, table })` */
|
|
89
|
+
renderDetailPanel?: (row: Row<T>, table: TanTable<T>) => ReactNode;
|
|
90
|
+
/** detail panel 행·셀 props — 기존 `muiDetailPanelProps({ row, table })` */
|
|
91
|
+
getDetailPanelProps?: (row: Row<T>, table: TanTable<T>) => DetailPanelProps | undefined;
|
|
92
|
+
editing?: EditingOptions<T>;
|
|
93
|
+
/** modal 모드의 편집 다이얼로그 — 내용은 소비자가 그린다 */
|
|
94
|
+
renderEditDialog?: (row: Row<T>, close: () => void) => ReactNode;
|
|
95
|
+
/** 셀 단위 에러. 없으면 `useDataTable({ fieldErrors })` 로 얹은 값을 읽는다 */
|
|
96
|
+
fieldErrors?: FieldErrors;
|
|
97
|
+
/** 링크 셀(`meta.link`) 클릭 — SPA 라우터 연결 자리 */
|
|
98
|
+
onNavigate?: CellValueOptions<T>["onNavigate"];
|
|
99
|
+
/** 헤더 컬럼 메뉴(정렬·고정·이동·숨기기). 기본 true (Provider `defaults.enableColumnMenu`). 우클릭 메뉴도 같이 꺼진다 */
|
|
100
|
+
enableColumnMenu?: boolean;
|
|
101
|
+
/**
|
|
102
|
+
* 컬럼 메뉴(버튼·헤더 우클릭) 항목 추가·제거·재배열.
|
|
103
|
+
* `ctx.defaultItems` 가 기본 항목(정렬·고정·이동·숨기기·그룹·너비 초기화)이다.
|
|
104
|
+
*/
|
|
105
|
+
columnMenuItems?: ColumnMenuItemsFn<T>;
|
|
106
|
+
/** 있으면 컬럼 메뉴에 "그룹 기준 추가/제거" 항목이 생긴다 (`search.setGrouping` 등) */
|
|
107
|
+
onGroupingChange?: (grouping: string[]) => void;
|
|
108
|
+
/** 그룹핑 중 헤더 메뉴 "집계" 항목 — `search.params.aggregation` / `patchParams({ aggregation })` */
|
|
109
|
+
aggregation?: AggregationSpec;
|
|
110
|
+
onAggregationChange?: (next: AggregationSpec) => void;
|
|
111
|
+
/** 있으면 컬럼 메뉴에 "필터 열기" 항목이 생긴다 (미지정 시 Provider `onOpenFilter`) */
|
|
112
|
+
onOpenFilter?: (column: Column<T, unknown>, table: TanTable<T>) => void;
|
|
113
|
+
/** 헤더 `TableCell` props — 기존 `muiTableHeadCellProps({ column, table })` 대응 */
|
|
114
|
+
headerCellProps?: (header: Header<T, unknown>, table: TanTable<T>) => TableCellProps | undefined;
|
|
115
|
+
/** 헤더 내용 규칙 덮어쓰기 — 단위·필수 표시·툴팁. `ctx.defaultContent` 를 감싸거나 대체한다 */
|
|
116
|
+
renderHeader?: (ctx: RenderHeaderContext<T>) => ReactNode;
|
|
117
|
+
/**
|
|
118
|
+
* 본문 행 우클릭 메뉴. 말단 행은 `ctx.row`, 그룹 행은 `ctx.group` 이 있다.
|
|
119
|
+
* 기본 항목(Provider `menus.row` 레지스트리 — 말단: 행 복사 / 그룹: 펼치기·접기·N단계까지 펼치기)은
|
|
120
|
+
* `ctx.defaultItems` 로 온다 — 미지정이면 그 기본 항목이 그대로 뜬다. 빈 배열을 돌려주면 메뉴를 열지 않는다(브라우저 기본 메뉴).
|
|
121
|
+
*/
|
|
122
|
+
rowMenuItems?: RowMenuItemsFn<T>;
|
|
123
|
+
/** 그룹 행 메뉴의 "N단계까지 펼치기" — `group.expand.expandToDepth` 를 넘긴다. 없으면 그 항목이 빠진다 */
|
|
124
|
+
onExpandGroupToDepth?: (depth: number, node: GroupTreeNode<T>) => void;
|
|
125
|
+
/**
|
|
126
|
+
* 그룹핑이 켜져 있을 때(`groupItems` 있음) 그룹 기준 컬럼을 어떻게 놓을지.
|
|
127
|
+
* - `reorder`(기본) — 그룹 컬럼을 맨 앞(왼쪽 고정 컬럼 다음)으로 당긴다. TanStack 상태는 건드리지
|
|
128
|
+
* 않고 **렌더 순서만** 바꾼다 (`row.getVisibleCells()` / `headerGroup.headers` 재배열).
|
|
129
|
+
* - `remove` — 그룹 컬럼을 헤더·본문에서 뺀다. 값은 그룹 행 헤더에 이미 보인다. colSpan 도 줄어든다.
|
|
130
|
+
* - `false` — 선언 순서 그대로.
|
|
131
|
+
* 열 가상화(`VirtualTableContent({ virtualizeColumns })`)가 켜져 있거나 헤더가 2단 이상이면
|
|
132
|
+
* 순서·colSpan 을 맞출 수 없어 **둘 다 건너뛴다**(선언 순서 그대로).
|
|
133
|
+
*/
|
|
134
|
+
groupedColumnMode?: GroupedColumnMode;
|
|
135
|
+
/**
|
|
136
|
+
* 그룹 기준 컬럼 id. 기본은 `table.getState().grouping` — `useDataTable` 이 `search.params.grouping`
|
|
137
|
+
* 을 넣어 준다. TanStack 상태와 다른 기준으로 그리고 있으면 여기로 덮어쓴다.
|
|
138
|
+
*/
|
|
139
|
+
grouping?: string[];
|
|
140
|
+
/**
|
|
141
|
+
* 그룹 행 배치.
|
|
142
|
+
* - `columns`(기본) — 그룹 행도 **컬럼별 셀**로 그린다. 현재 depth 의 그룹 컬럼 셀에 펼침 아이콘 + 그룹값 + `(n)`,
|
|
143
|
+
* 다른 그룹 컬럼은 빈 셀, 나머지 컬럼에는 그 컬럼의 집계 칩(`AggregateChip`)이 **그 컬럼 아래** 놓인다.
|
|
144
|
+
* - `inline` — 한 셀(colSpan)에 그룹값과 집계 캡션을 줄줄이 붙인다. 카드·좁은 화면용.
|
|
145
|
+
*/
|
|
146
|
+
groupRowLayout?: GroupRowLayout;
|
|
147
|
+
/** 그룹 행 높이(px). 미지정 시 내용에 맞춘다 */
|
|
148
|
+
groupRowHeight?: number;
|
|
149
|
+
/**
|
|
150
|
+
* 컬럼별로 그룹 행에 보일 집계 함수 `{ 컬럼: 함수 }` (제어형). 컬럼에 집계가 둘 이상이면 칩을 눌러 바꾼다.
|
|
151
|
+
* 없으면 내부 상태로 관리한다. 목록에 없는 컬럼은 첫 집계 값을 보인다.
|
|
152
|
+
*/
|
|
153
|
+
aggregateSelection?: Record<string, AggFnKey>;
|
|
154
|
+
/** 칩으로 함수를 바꿨을 때. `aggregateSelection` 없이 주면 내부 상태도 함께 바뀐다 */
|
|
155
|
+
onAggregateSelectionChange?: (columnId: string, fn: AggFnKey) => void;
|
|
156
|
+
}
|
|
157
|
+
export type GroupRowLayout = "columns" | "inline";
|
|
158
|
+
export type GroupedColumnMode = "reorder" | "remove" | false;
|
|
159
|
+
/**
|
|
160
|
+
* 그룹 컬럼 배치 — 렌더 순서만 바꾼다.
|
|
161
|
+
* `reorder`: 왼쪽 고정 → 그룹 컬럼(grouping 순) → 나머지 → 오른쪽 고정.
|
|
162
|
+
* `remove`: 그룹 컬럼 제외.
|
|
163
|
+
* `false`: 선언 순서. `declaredRank`(선언 순서 + `columnOrder`, 그룹핑 무시)를 주면 그 순서로 되돌린다 —
|
|
164
|
+
* TanStack 은 `grouping` 상태가 있으면 자체 `groupedColumnMode`(기본 `reorder`)로 이미 그룹 컬럼을
|
|
165
|
+
* 앞으로 당겨 놓기 때문에, "그대로" 를 그리려면 되돌려야 한다.
|
|
166
|
+
* 고정 컬럼은 sticky 오프셋(`getStart`)이 TanStack 순서 기준이므로 자리를 옮기지 않는다.
|
|
167
|
+
*/
|
|
168
|
+
export declare function arrangeGroupedColumns<C extends {
|
|
169
|
+
id: string;
|
|
170
|
+
getIsPinned: () => false | "left" | "right";
|
|
171
|
+
}>(columns: C[], grouping: readonly string[], mode: GroupedColumnMode, declaredRank?: ReadonlyMap<string, number>): C[];
|
|
172
|
+
/** 내부 전용 — `VirtualTableContent` 가 컨테이너 ref 와 가상 행 범위를 넘긴다 */
|
|
173
|
+
export interface TableContentInternalProps<T extends RowData> extends TableContentProps<T> {
|
|
174
|
+
virtual?: VirtualRows;
|
|
175
|
+
virtualColumns?: VirtualColumns;
|
|
176
|
+
containerRef?: Ref<HTMLDivElement>;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* 콘텐츠 구역 — 테이블 본문.
|
|
180
|
+
*
|
|
181
|
+
* 로딩·에러·빈 상태를 **제자리에서** 그린다. 조회 실패를 throw 해서 상위
|
|
182
|
+
* ErrorBoundary 로 올리면 테이블 트리가 통째로 파괴되고, 리마운트가 캐시의
|
|
183
|
+
* 에러를 다시 읽어 즉시 재-throw 하므로 경계 리셋으로 복구가 안 된다.
|
|
184
|
+
*
|
|
185
|
+
* 행 선택·확장·고정·리사이즈·순서는 TanStack 상태를 그대로 그린다. 기능을 켜는 것은
|
|
186
|
+
* `useDataTable` 의 `tableOptions` (`enableRowSelection`, `enableColumnResizing`,
|
|
187
|
+
* `getRowCanExpand` …) 몫이고, 체크박스·확장 토글·행 번호·행 액션 열은
|
|
188
|
+
* `withDisplayColumns()` 로 컬럼 목록에 끼운다.
|
|
189
|
+
*/
|
|
190
|
+
export declare function TableContent<T extends RowData>(props: TableContentProps<T>): import("react").JSX.Element;
|
|
191
|
+
export declare function TableContentBase<T extends RowData>(rawProps: TableContentInternalProps<T>): import("react").JSX.Element;
|