import React from 'react' import { useGridComponents } from '../context/grid-components-context' import { useGridContext, useGridSelector } from '../context/grid-context' import { getGroupIndex } from '../state/reducer/column-utils' import { GridHeaderGroupCellSpacer } from './grid-header-group-cell-spacer' import { size } from '@planview/pv-utilities' import { useDndContext } from '@dnd-kit/core' const GridHeaderImpl = () => { const { GridHeadLayout, GridHeaderRow, GridHeaderCell, GridHeaderGroupCell, } = useGridComponents() const { selectors } = useGridContext() const columnIds = useGridSelector(selectors.selectColumnIds) const headerRowIds = useGridSelector(selectors.selectHeaderRowIds) const headerHierarchy = useGridSelector(selectors.selectHeaderHierarchy) const areHeadersHidden = useGridSelector(selectors.selectAreHeadersHidden) const { levels, groups } = headerHierarchy const { active } = useDndContext() const columnsBeingDragged = React.useMemo(() => { if (active?.data.current?.columnsDragged) { return [...(active.data.current?.columnsDragged as string[])].sort( (a, b) => columnIds.indexOf(a) - columnIds.indexOf(b) ) } return [] }, [active, columnIds]) const groupsBeingDragged = React.useMemo(() => { if (active) { return (active.data.current?.groupsDragged as string[]) ?? [] } return [] }, [active]) const columnHeaders = React.useMemo(() => { const ret: React.ReactNode[] = [] const groupsAdded = new Set() if (levels) { Array.from({ length: levels, }).forEach((_, index) => { const rowId = headerRowIds[index] const level = levels - index const groupIndexes = groups .filter((g) => g.level === level) .map((g) => ({ ...g, index: getGroupIndex(g.columnIds, columnIds), })) const groupElements: React.JSX.Element[] = [] columnIds.forEach((cId, cIndex) => { const nextGroup = groupIndexes.find( (record) => record.index === cIndex || (record.index < cIndex && cIndex < record.index + record.width) ) if (nextGroup && !groupsAdded.has(nextGroup.id)) { groupsAdded.add(nextGroup.id) groupElements.push( ) } if (!nextGroup) { groupElements.push( ) } }) ret.push( {groupElements} ) }) } return ret.length ? ret : null }, [ levels, headerRowIds, groups, columnIds, GridHeaderRow, GridHeaderGroupCell, groupsBeingDragged, columnsBeingDragged, ]) return ( {columnHeaders} {columnIds.map((columnId) => ( ))} ) } export const GridHeader = React.memo(GridHeaderImpl)