UNPKG

@dccs/react-datagrid-mui

Version:

A light datagrid build upon react-table-plain for React in a Material-UI theme.

160 lines (159 loc) 5.98 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.useDataState = void 0; var React = require("react"); function getStateFromStore(props) { if (props && props.persistState && props.persistState.uniqueID) { if (props.persistState.store === "localStorage") { var state = localStorage.getItem(props.persistState.uniqueID); if (state) { return JSON.parse(state); } } else if (props.persistState.store === "sessionStorage") { var state = sessionStorage.getItem(props.persistState.uniqueID); if (state) { return JSON.parse(state); } } } return undefined; } function useDataState(props) { var stateFromStore = getStateFromStore(props); var _a = React.useState((stateFromStore && stateFromStore.rowsPerPage) || (props && props.initialRowsPerPage) || 10), rowsPerPage = _a[0], _setRowsPerPage = _a[1]; var _b = React.useState((stateFromStore && stateFromStore.page) || (props && props.initialPage) || 0), page = _b[0], setPage = _b[1]; var _c = React.useState((stateFromStore && stateFromStore.total) || 0), total = _c[0], setTotal = _c[1]; var _d = React.useState((stateFromStore && stateFromStore.orderBy) || (props && props.initialOrderBy)), orderBy = _d[0], setOrderBy = _d[1]; var _e = React.useState((stateFromStore && stateFromStore.sort) || (props && props.initialSort)), sort = _e[0], setSort = _e[1]; var _f = React.useState((stateFromStore && stateFromStore.filter) || props.initialFilter), filter = _f[0], setFilter = _f[1]; // Always use initial here? not sure var _g = React.useState(!(props && props.initialLoad === false)), allowLoad = _g[0], setAllowLoad = _g[1]; var _h = React.useState([]), data = _h[0], setData = _h[1]; var _j = React.useState(false), loading = _j[0], setLoading = _j[1]; var _k = React.useState(false), error = _k[0], setError = _k[1]; var _l = React.useState(false), reloadDummy = _l[0], setReload = _l[1]; var reload = function () { setReload(!reloadDummy); }; function setFilterProp(key, value) { setFilter(function (f) { var _a; return (__assign(__assign({}, f), (_a = {}, _a[key] = value, _a))); }); } function handleChangePage(p) { setPage(p); } function handleChangeRowsPerPage(rows) { setRowsPerPage(rows); } function handleChangeOrderBy(ob) { var s; if (orderBy && orderBy === ob) { s = sort === "desc" ? "asc" : "desc"; } setOrderBy(ob); setSort(s); } function handleChangeFilter(ob, value) { setFilter(function (f) { var _a; return (__assign(__assign({}, f), (_a = {}, _a[ob] = value, _a))); }); } function setRowsPerPage(count) { setPage(0); // reset to first page. _setRowsPerPage(count); } React.useEffect(function () { if (allowLoad) { load(); } else { // allowLoad on second try. setAllowLoad(true); } }, [ rowsPerPage, page, orderBy, sort === "desc", reloadDummy, // Why JSON.stringify? // The way the useEffect dependency array works is by checking for strict (===) equivalency between all of the items in the array from the previous render and the new render. // Example: {}==={} -> false -> different -> rerender // Example2: JSON.stringify({}) === JSON.stringify({}) -> true -> same -> no rerender JSON.stringify(filter), ]); function load() { if (props.onLoadData) { setLoading(true); setError(false); props .onLoadData(page + 1, rowsPerPage, orderBy, sort, filter) .then(function (_a) { var d = _a.data, t = _a.total; setTotal(t); setData(d); setLoading(false); }) .catch(function () { setLoading(false); setError(true); }); } } var state = { rowsPerPage: rowsPerPage, setRowsPerPage: setRowsPerPage, page: page, setPage: setPage, total: total, setTotal: setTotal, orderBy: orderBy, setOrderBy: setOrderBy, sort: sort, setSort: setSort, filter: filter, setFilter: setFilter, setFilterProp: setFilterProp, allowLoad: allowLoad, setAllowLoad: setAllowLoad, data: data, loading: loading, error: error, reload: reload, handleChangePage: handleChangePage, handleChangeRowsPerPage: handleChangeRowsPerPage, handleChangeOrderBy: handleChangeOrderBy, handleChangeFilter: handleChangeFilter, load: load, }; React.useEffect(function () { if (props && props.persistState && props.persistState.uniqueID) { if (props.persistState.store === "localStorage") { localStorage.setItem(props.persistState.uniqueID, JSON.stringify(state)); } else if (props.persistState.store === "sessionStorage") { sessionStorage.setItem(props.persistState.uniqueID, JSON.stringify(state)); } } }, [state]); return state; } exports.useDataState = useDataState;