UNPKG

@appbuckets/react-ui

Version:
120 lines (117 loc) 3.06 kB
import { __assign } from 'tslib'; import * as React from 'react'; import clsx from 'clsx'; import areEqualStringArray from '../../utils/areEqualStringArray.js'; import { useRxTable } from '../RxTable.context.js'; /* -------- * Component Definition * -------- */ var ColumnHeader = function (props) { var className = props.className, column = props.column, disableSorting = props.disableSorting, isFilterHeader = props.isFilterHeader, overrideContent = props.overrideContent; // ---- // Get Context Data // ---- var _a = useRxTable(), classes = _a.classes, HeaderCell = _a.Components.HeaderCell, getColumnWidth = _a.columns.getWidth, isVirtualized = _a.layout.isVirtualized, _b = _a.sorting, currentSorting = _b.current, setSorting = _b.set, isSortReversed = _b.isReversed, styles = _a.styles; // ---- // Get Column Sort Property // ---- var columnSort = React.useMemo( function () { var isSortable = Array.isArray(column.sort) && !!column.sort.length && !disableSorting && !isFilterHeader; return { isSortable: isSortable, isSorted: isSortable && areEqualStringArray(currentSorting, column.sort), }; }, [column.sort, currentSorting, disableSorting, isFilterHeader] ); // ---- // Build Header Classes // ---- var headerClasses = clsx( column.textAlign && 'has-text-'.concat(column.textAlign), className, column.headerClassName, isFilterHeader ? classes.FilterCell || classes.HeaderCell : classes.HeaderCell, isFilterHeader && 'filter' ); // ---- // Handlers // ---- var handleSortChange = React.useCallback( function () { if (!columnSort.isSortable) { return; } if (columnSort.isSorted) { setSorting(column.sort, !isSortReversed); } else { setSorting(column.sort, false); } }, [ column.sort, isSortReversed, setSorting, columnSort.isSortable, columnSort.isSorted, ] ); // ---- // Get Column Width // ---- var columnWidth = React.useMemo( function () { return getColumnWidth(column.key); }, [getColumnWidth, column.key] ); // ---- // Render the Component // ---- return React.createElement( HeaderCell, { className: headerClasses, column: column, content: column.header, hasSorting: columnSort.isSortable, isActualSortingColumn: columnSort.isSorted, isReversedSorting: columnSort.isSorted && isSortReversed, isVirtualized: isVirtualized, style: __assign( __assign( {}, isFilterHeader ? styles.FilterCell || styles.HeaderCell : styles.HeaderCell ), { flexBasis: columnWidth, width: columnWidth } ), onClick: columnSort.isSortable ? handleSortChange : undefined, }, overrideContent ); }; ColumnHeader.displayName = 'ColumnHeader'; export { ColumnHeader as default };