UNPKG

@vlsergey/react-bootstrap-pagetable

Version:

Complex solution to work with pageable data, including sorting, filtering, actions, changing displayed columns, etc.

62 lines (61 loc) 3.94 kB
import { __assign, __read, __rest, __spreadArray } from "tslib"; import React, { useCallback, useMemo } from 'react'; import Form from 'react-bootstrap/Form'; import useSelectAllCheckbox from './useSelectAllCheckbox'; function renderCheckboxField(_a) { var value = _a.value; return React.createElement(Form.Check, { checked: value, readOnly: true, type: "checkbox" }); } export default (function (Child) { return function WithSelectable(_a) { var itemFieldCellHyperlink = _a.itemFieldCellHyperlink, itemModel = _a.itemModel, page = _a.page, selectable = _a.selectable, onSelectedIdsChange = _a.onSelectedIdsChange, onSelectedItemsChange = _a.onSelectedItemsChange, selectedIds = _a.selectedIds, etcProps = __rest(_a, ["itemFieldCellHyperlink", "itemModel", "page", "selectable", "onSelectedIdsChange", "onSelectedItemsChange", "selectedIds"]); var idF = useMemo(function () { return itemModel.idF; }, [itemModel]); var selectedIdsSet = useMemo(function () { return new Set(selectedIds); }, [selectedIds]); var itemsMap = useMemo(function () { return new Map(page.content.map(function (item) { return [itemModel.idF(item), item]; })); }, [page, itemModel]); var handleTrigger = useCallback(function (item) { var itemKey = idF(item); var index = selectedIds.indexOf(itemKey); if (index === -1) { var newSelectedIds = __spreadArray(__spreadArray([], __read(selectedIds)), [itemKey]); if (onSelectedItemsChange) { onSelectedItemsChange(newSelectedIds.map(function (id) { return itemsMap.get(id); })); } return onSelectedIdsChange(newSelectedIds); } var spliced = __spreadArray([], __read(selectedIds)); spliced.splice(index, 1); if (onSelectedItemsChange) { onSelectedItemsChange(spliced.map(function (id) { return itemsMap.get(id); })); } return onSelectedIdsChange(spliced); }, [idF, itemsMap, onSelectedIdsChange, onSelectedItemsChange, selectedIds]); var rowProps = useCallback(function (item) { return ({ onClick: function () { return handleTrigger(item); }, style: { cursor: 'pointer' }, }); }, [handleTrigger]); var selectableFieldGetter = useCallback(function (item) { return selectedIdsSet.has(idF(item)); }, [idF, selectedIdsSet]); var selectAllProps = useSelectAllCheckbox(page.content, idF, onSelectedIdsChange, onSelectedItemsChange, selectedIdsSet); var newItemModel = useMemo(function () { return (__assign(__assign({}, itemModel), { fields: __spreadArray([ __assign({ key: '$selectable', getter: selectableFieldGetter, render: renderCheckboxField, title: '[item checkbox]' }, selectAllProps) ], __read(itemModel.fields)) })); }, [selectAllProps, itemModel, selectableFieldGetter]); var hasSelectedIds = selectedIds.length > 0; var newItemFieldCellHyperlink = useMemo(function () { if (!itemFieldCellHyperlink) return itemFieldCellHyperlink; return function (item, field) { if (field.key === '$selectable' || hasSelectedIds) { return null; } return itemFieldCellHyperlink(item, field); }; }, [itemFieldCellHyperlink, hasSelectedIds]); if (!selectable) { return React.createElement(Child, __assign({}, etcProps, { itemFieldCellHyperlink: itemFieldCellHyperlink, itemModel: itemModel, page: page })); } return React.createElement(Child, __assign({}, etcProps, { itemFieldCellHyperlink: newItemFieldCellHyperlink, itemModel: newItemModel, page: page, rowProps: rowProps })); }; });