@hitachivantara/uikit-react-core
Version:
Core React components for the NEXT Design System.
91 lines (90 loc) • 3.22 kB
JavaScript
const replaceHeaderPlaceholders = (headerGroups) => {
const [headerGroup] = headerGroups;
const hasPlaceholderHeaders = headerGroup.headers.some(
(h) => h.placeholderOf != null
);
if (!hasPlaceholderHeaders) {
return;
}
const maxDepth = headerGroups.length - 1;
const leafGroup = headerGroups[maxDepth];
headerGroup.headers.forEach((header, position) => {
const { placeholderOf } = header;
const isPlaceholderHeader = placeholderOf != null;
if (isPlaceholderHeader) {
const leafIndex = leafGroup.headers.slice(position).findIndex(({ id }) => id === placeholderOf.id) + position;
header.variant = placeholderOf.variant;
header.depth = maxDepth;
leafGroup.headers[leafIndex] = header;
placeholderOf.rowSpan = maxDepth + 1;
headerGroup.headers[position] = placeholderOf;
}
});
};
const getCellProps = (column, isHeaderCell = false) => ({
groupColumnMostLeft: column.isGroupLeftColumn,
groupColumnMostRight: column.isGroupRightColumn,
rowSpan: isHeaderCell && column.rowSpan != null ? column.rowSpan : 1
});
const getHeaderPropsHook = (props, { instance, column }) => {
const nextProps = instance.hasGroupedColumns ? getCellProps(column, true) : {};
if (instance.hasGroupedColumns) {
const isPlaceholder = column.placeholderOf != null;
nextProps.style = {
display: isPlaceholder ? "none" : props.style?.display
};
if (instance.hasStickyColumns) {
if (isPlaceholder) {
nextProps.style.display = "inline-flex";
nextProps.style.visibility = "hidden";
}
if (column.parent || isPlaceholder) {
nextProps.style.marginTop = `calc(var(--cell-height) * -1)`;
}
if (column.rowSpan > 1) {
nextProps.style.height = `calc(var(--first-row-cell-height) + var(--cell-height) * ${column.rowSpan - 1})`;
}
}
}
return [props, nextProps];
};
const getCellPropsHook = (props, { instance, cell }) => {
const nextProps = instance.hasGroupedColumns ? getCellProps(cell.column) : {};
return [props, nextProps];
};
const visibleColumnsHook = (visibleColumns, { instance }) => {
const parentList = /* @__PURE__ */ new Set();
visibleColumns.forEach(({ parent }) => {
if (parent != null && !parentList.has(parent)) {
parentList.add(parent);
}
});
const hasGroupedColumns = parentList.size > 0;
if (hasGroupedColumns) {
parentList.forEach((parent) => {
parent.align = "center";
parent.isGroupLeftColumn = true;
parent.isGroupRightColumn = true;
const { columns } = parent;
columns[0].isGroupLeftColumn = true;
columns[columns.length - 1].isGroupRightColumn = true;
});
}
Object.assign(instance, { hasGroupedColumns });
return visibleColumns;
};
const useInstanceHook = (instance) => {
if (instance.hasGroupedColumns) {
replaceHeaderPlaceholders(instance.headerGroups);
}
};
const useHvHeaderGroups = (hooks) => {
hooks.visibleColumns.push(visibleColumnsHook);
hooks.useInstance.push(useInstanceHook);
hooks.getHeaderProps.push(getHeaderPropsHook);
hooks.getCellProps.push(getCellPropsHook);
};
useHvHeaderGroups.pluginName = "useHvHeaderGroups";
export {
useHvHeaderGroups
};