@vlsergey/react-bootstrap-pagetable
Version:
Complex solution to work with pageable data, including sorting, filtering, actions, changing displayed columns, etc.
37 lines (36 loc) • 2.08 kB
JavaScript
import { __assign } from "tslib";
/** @jsx jsx */
import { css, jsx } from '@emotion/react';
import React, { useCallback } from 'react';
import { useControlledContext } from '../controlled/ControlledContext';
import DefaultColumnHeaderCell from '../controlled/DefaultColumnHeaderCell';
function SortableHeaderCell(_a) {
var field = _a.field;
var _b = useControlledContext(), fetchArgs = _b.fetchArgs, onFetchArgsChange = _b.onFetchArgsChange;
var handleClick = useCallback(function () {
var oldDirection = ((fetchArgs.sort || [])
.find(function (sortBy) { return sortBy.field === field.key; }) || { direction: undefined })
.direction;
var newDirection = oldDirection === 'ASC' ? 'DESC' : 'ASC';
onFetchArgsChange(__assign(__assign({}, fetchArgs), { sort: [{ field: field.key, direction: newDirection }] }));
}, [fetchArgs, field.key, onFetchArgsChange]);
if (!field.sortable) {
return jsx(DefaultColumnHeaderCell, { field: field });
}
var fieldSort = (fetchArgs.sort || [])
.find(function (sortBy) { return sortBy.field === field.key; });
var iconClassName = 'fas fa-sort';
if (fieldSort !== undefined) {
iconClassName = fieldSort.direction === 'DESC'
? 'fas fa-sort-up'
: 'fas fa-sort-down';
}
var headerCellContent = field.headerCellContent;
return jsx("th", __assign({}, field.headerCellProps, { css: css("\n cursor : pointer;\n &:hover .fas {\n color: unset;\n }\n "), onClick: handleClick }),
jsx("div", { css: css("\n display: flex;\n justify-content: space-between;\n ") },
jsx("div", null, headerCellContent
? React.createElement(headerCellContent, { field: field })
: field.title),
jsx("i", { className: iconClassName, css: css("\n color: lightgray;\n line-height: unset;\n margin-left: 0.25em;\n ") })));
}
export default React.memo(SortableHeaderCell);