@appbuckets/react-ui
Version:
Just Another React UI Framework
155 lines (148 loc) • 3.96 kB
JavaScript
;
var tslib = require('tslib');
var React = require('react');
var clsx = require('clsx');
var areEqualStringArray = require('../../utils/areEqualStringArray.js');
var RxTable_context = require('../RxTable.context.js');
function _interopDefaultLegacy(e) {
return e && typeof e === 'object' && 'default' in e ? e : { default: e };
}
function _interopNamespace(e) {
if (e && e.__esModule) return e;
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(
n,
k,
d.get
? d
: {
enumerable: true,
get: function () {
return e[k];
},
}
);
}
});
}
n['default'] = e;
return Object.freeze(n);
}
var React__namespace = /*#__PURE__*/ _interopNamespace(React);
var clsx__default = /*#__PURE__*/ _interopDefaultLegacy(clsx);
/* --------
* 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 = RxTable_context.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__namespace.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__default['default'](
column.textAlign && 'has-text-'.concat(column.textAlign),
className,
column.headerClassName,
isFilterHeader
? classes.FilterCell || classes.HeaderCell
: classes.HeaderCell,
isFilterHeader && 'filter'
);
// ----
// Handlers
// ----
var handleSortChange = React__namespace.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__namespace.useMemo(
function () {
return getColumnWidth(column.key);
},
[getColumnWidth, column.key]
);
// ----
// Render the Component
// ----
return React__namespace.createElement(
HeaderCell,
{
className: headerClasses,
column: column,
content: column.header,
hasSorting: columnSort.isSortable,
isActualSortingColumn: columnSort.isSorted,
isReversedSorting: columnSort.isSorted && isSortReversed,
isVirtualized: isVirtualized,
style: tslib.__assign(
tslib.__assign(
{},
isFilterHeader
? styles.FilterCell || styles.HeaderCell
: styles.HeaderCell
),
{ flexBasis: columnWidth, width: columnWidth }
),
onClick: columnSort.isSortable ? handleSortChange : undefined,
},
overrideContent
);
};
ColumnHeader.displayName = 'ColumnHeader';
module.exports = ColumnHeader;