Handsontable example

HTML

<script src="https://cdn.jsdelivr.net/npm/handsontable@16.0/dist/handsontable.full.min.js"></script>
<link type="text/css" rel="stylesheet" href="https://cdn.jsdelivr.net/npm/handsontable@16.0/styles/handsontable.min.css" /> 
<link type="text/css" rel="stylesheet" href="https://cdn.jsdelivr.net/npm/handsontable@16.0/styles/ht-theme-main.css" /> 
<link type="text/css" rel="stylesheet" href="https://cdn.jsdelivr.net/npm/handsontable@16.0/styles/ht-theme-horizon.css" /> 
<script src="https://cdn.jsdelivr.net/npm/react@18/umd/react.production.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/react-dom@18/umd/react-dom.production.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@handsontable/react-wrapper@16.0/dist/react-handsontable.min.js"></script>
<script src="https://handsontable.com/docs/scripts/fixer.js"></script>

<div id="example2" class="hot"></div>
<p id="version">
  <script>
    document.write('Handsontable version: ' + Handsontable.version)

  </script>
</p>

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();

   ...