import React from "react";
import { DataEditorAll as DataEditor } from "../../data-editor-all.js";
import {
BeautifulWrapper,
Description,
MoreInfo,
PropName,
useMockDataGenerator,
defaultProps,
} from "../../data-editor/stories/utils.js";
import type { GridColumn } from "../../internal/data-grid/data-grid-types.js";
import { CompactSelection } from "../../internal/data-grid/data-grid-types.js";
import { SimpleThemeWrapper } from "../../stories/story-utils.js";
import type { GroupHeaderClickedEventArgs } from "../../internal/data-grid/event-args.js";
export default {
title: "Glide-Data-Grid/DataEditor Demos",
decorators: [
(Story: React.ComponentType) => (
Through clever usage of onGroupHeaderClicked you can implement
group collapsing. This is a very basic version however it is possible to go much
further.
Cells under a certain size will not attempt to render to save some frames.
>
}>
),
],
};
function useCollapsableColumnGroups(cols: readonly GridColumn[]) {
const [collapsed, setCollapsed] = React.useState([]);
const onGroupHeaderClicked = React.useCallback(
(colIndex: number, args: GroupHeaderClickedEventArgs) => {
const group = cols[colIndex].group ?? "";
setCollapsed(cv => (cv.includes(group) ? cv.filter(g => g !== group) : [...cv, group]));
args.preventDefault();
},
[cols]
);
const [selectedColumns, setSelectedColumns] = React.useState(CompactSelection.empty());
const setCols = React.useCallback((newVal: CompactSelection, trigger: string) => {
if (trigger === "group") return;
setSelectedColumns(newVal);
}, []);
const columns = React.useMemo(() => {
return cols.map(c => {
if (!collapsed.includes(c.group ?? ""))
return {
...c,
hasMenu: true,
};
return {
...c,
width: 8,
hasMenu: true,
};
});
}, [collapsed, cols]);
return {
columns,
onGroupHeaderClicked,
selectedColumns,
onSelectedColumnsChange: setCols,
};
}
export const ColumnGroupCollapse: React.VFC = () => {
const { cols, getCellContent } = useMockDataGenerator(100, true, true);
const groupHeaderArgs = useCollapsableColumnGroups(cols);
return (
);
};