@appbuckets/react-ui
Version:
Just Another React UI Framework
120 lines (117 loc) • 3.06 kB
JavaScript
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 };