@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
JavaScript
;
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;