Babel + JSX
import { HotTable } from '@handsontable/react-wrapper';
import React from 'react';
import ReactDOM from 'react-dom/client';
import 'handsontable/styles/handsontable.css';
import 'handsontable/styles/ht-theme-main.css';
const HEADER_GROUP_INFO = {
'-4,1': { label: 'B', startCol: 1, endCol: 8 },
'-3,1': { label: 'E', startCol: 1, endCol: 4 },
'-3,5': { label: 'F', startCol: 5, endCol: 8 },
'-2,1': { label: 'I', startCol: 1, endCol: 2 },
'-2,3': { label: 'J', startCol: 3, endCol: 4 },
'-2,5': { label: 'K', startCol: 5, endCol: 6 },
'-2,7': { label: 'L', startCol: 7, endCol: 8 },
};
const PARENT_HEADER_MAP = {
'-3,1': '-4,1',
'-3,5': '-4,1',
'-2,1': '-3,1',
'-2,3': '-3,1',
'-2,5': '-3,5',
'-2,7': '-3,5',
};
const CHILD_GROUPS_MAP = (() => {
const map = {};
for (const [child, parent] of Object.entries(PARENT_HEADER_MAP)) {
if (!map[parent]) map[parent] = [];
map[parent].push(child);
}
for (const parent in map) {
map[parent].sort((a, b) => {
return HEADER_GROUP_INFO[a].startCol - HEADER_GROUP_INFO[b].startCol;
});
}
return map;
})();
const NESTED_HEADERS = [
['A', { label: 'B', colspan: 8 }, 'C'],
['D', { label: 'E', colspan: 4 }, { label: 'F', colspan: 4 }, 'G'],
[
'H',
{ label: 'I', colspan: 2 },
{ label: 'J', colspan: 2 },
{ label: 'K', colspan: 2 },
{ label: 'L', colspan: 2 },
'M',
],
['N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W'],
];
const ExampleComponent = ({ externalHiddenColumns = [] }) => {
const hotRef = React.useRef(null);
const [collapsedGroups, setCollapsedGroups] = React.useState({});
const [hiddenColumnsState, setHiddenColumnsState] = React.useState([]);
const processedGroupsData = React.useMemo(() => {
const hiddenByCollapseLogic = new Set();
const totalCols = 10;
const colWidthsToApply = Array(totalCols).fill(60);
const processedGroups = new Set();
...