UNPKG

ra-core

Version:

Core components of react-admin, a frontend Framework for building admin applications on top of REST services, using ES6, React

147 lines 7.74 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.DataTableBase = void 0; var React = __importStar(require("react")); var react_1 = require("react"); var union_1 = __importDefault(require("lodash/union")); var difference_1 = __importDefault(require("lodash/difference")); var core_1 = require("../core"); var util_1 = require("../util"); var useListContextWithProps_1 = require("../controller/list/useListContextWithProps"); var DataTableConfigContext_1 = require("./DataTableConfigContext"); var DataTableCallbacksContext_1 = require("./DataTableCallbacksContext"); var DataTableDataContext_1 = require("./DataTableDataContext"); var DataTableSelectedIdsContext_1 = require("./DataTableSelectedIdsContext"); var DataTableSortContext_1 = require("./DataTableSortContext"); var DataTableStoreContext_1 = require("./DataTableStoreContext"); var DataTableBase = function DataTable(props) { var resourceFromContext = (0, core_1.useResourceContext)(props); var children = props.children, empty = props.empty, expand = props.expand, _a = props.hiddenColumns, hiddenColumns = _a === void 0 ? emptyArray : _a, hasBulkActions = props.hasBulkActions, hover = props.hover, loading = props.loading, isRowSelectable = props.isRowSelectable, isRowExpandable = props.isRowExpandable, resource = props.resource, rowClick = props.rowClick, _b = props.expandSingle, expandSingle = _b === void 0 ? false : _b; var _c = (0, useListContextWithProps_1.useListContextWithProps)(props), sort = _c.sort, data = _c.data, isPending = _c.isPending, onSelect = _c.onSelect, onToggleItem = _c.onToggleItem, selectedIds = _c.selectedIds, setSort = _c.setSort, total = _c.total; var storeKey = props.storeKey || "".concat(resourceFromContext, ".datatable"); var handleSort = (0, util_1.useEvent)(function (event) { event.stopPropagation(); if (!setSort) return; var newField = event.currentTarget.dataset.field || 'id'; var newOrder = (sort === null || sort === void 0 ? void 0 : sort.field) === newField ? (sort === null || sort === void 0 ? void 0 : sort.order) === 'ASC' ? 'DESC' : 'ASC' : event.currentTarget.dataset.order || 'ASC'; setSort({ field: newField, order: newOrder }); }); var lastSelected = (0, react_1.useRef)(null); (0, react_1.useEffect)(function () { if (!selectedIds || selectedIds.length === 0) { lastSelected.current = null; } }, [JSON.stringify(selectedIds)]); // eslint-disable-line react-hooks/exhaustive-deps // we manage row selection here instead of in the rows level to allow shift+click to select an array of rows var handleToggleItem = (0, util_1.useEvent)(function (id, event) { if (!data) return; var ids = data.map(function (record) { return record.id; }); var lastSelectedIndex = ids.indexOf(lastSelected.current); // @ts-ignore FIXME useEvent prevents using event.currentTarget lastSelected.current = event.target.checked ? id : null; if (event.shiftKey && lastSelectedIndex !== -1) { var index = ids.indexOf(id); var idsBetweenSelections = ids.slice(Math.min(lastSelectedIndex, index), Math.max(lastSelectedIndex, index) + 1); // @ts-ignore FIXME useEvent prevents using event.currentTarget var newSelectedIds = event.target.checked ? (0, union_1.default)(selectedIds, idsBetweenSelections) : (0, difference_1.default)(selectedIds, idsBetweenSelections); onSelect === null || onSelect === void 0 ? void 0 : onSelect(isRowSelectable ? newSelectedIds.filter(function (id) { return isRowSelectable(data.find(function (record) { return record.id === id; })); }) : newSelectedIds); } else { onToggleItem === null || onToggleItem === void 0 ? void 0 : onToggleItem(id); } }); var storeContextValue = (0, react_1.useMemo)(function () { return ({ storeKey: storeKey, defaultHiddenColumns: hiddenColumns, }); }, [storeKey, hiddenColumns]); var configContextValue = (0, react_1.useMemo)(function () { return ({ expand: expand, expandSingle: expandSingle, hasBulkActions: hasBulkActions, hover: hover, }); }, [expand, expandSingle, hasBulkActions, hover]); var callbacksContextValue = (0, react_1.useMemo)(function () { return ({ handleSort: setSort ? handleSort : undefined, handleToggleItem: onToggleItem ? handleToggleItem : undefined, isRowExpandable: isRowExpandable, isRowSelectable: isRowSelectable, onSelect: onSelect, rowClick: rowClick, }); }, [ setSort, handleSort, handleToggleItem, isRowExpandable, isRowSelectable, onSelect, onToggleItem, rowClick, ]); if (isPending === true) { return loading; } /** * Once loaded, the data for the list may be empty. Instead of * displaying the table header with zero data rows, * the DataTable displays the empty component. */ if (data == null || data.length === 0 || total === 0) { if (empty) { return empty; } return null; } /** * After the initial load, if the data for the list isn't empty, * and even if the data is refreshing (e.g. after a filter change), * the DataTable displays the current data. */ return (React.createElement(DataTableStoreContext_1.DataTableStoreContext.Provider, { value: storeContextValue }, React.createElement(DataTableSortContext_1.DataTableSortContext.Provider, { value: sort }, React.createElement(DataTableSelectedIdsContext_1.DataTableSelectedIdsContext.Provider, { value: selectedIds }, React.createElement(DataTableCallbacksContext_1.DataTableCallbacksContext.Provider, { value: callbacksContextValue }, React.createElement(DataTableConfigContext_1.DataTableConfigContext.Provider, { value: configContextValue }, React.createElement(core_1.OptionalResourceContextProvider, { value: resource }, React.createElement(DataTableDataContext_1.DataTableDataContext.Provider, { value: data }, children)))))))); }; exports.DataTableBase = DataTableBase; var emptyArray = []; //# sourceMappingURL=DataTableBase.js.map