drf-react-by-schema
Version:
Components and Tools for building a React App having Django Rest Framework (DRF) as server
187 lines (186 loc) • 11.8 kB
JavaScript
"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 () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const react_1 = __importStar(require("react"));
const Box_1 = __importDefault(require("@mui/material/Box"));
const Typography_1 = __importDefault(require("@mui/material/Typography"));
const Button_1 = __importDefault(require("@mui/material/Button"));
const AddCircleOutline_1 = __importDefault(require("@mui/icons-material/AddCircleOutline"));
const Backdrop_1 = __importDefault(require("@mui/material/Backdrop"));
const CircularProgress_1 = __importDefault(require("@mui/material/CircularProgress"));
const DataGridBySchemaEditable_1 = __importDefault(require("./DataGridBySchemaEditable"));
const DataTotals_1 = __importDefault(require("./DataTotals"));
const DataTotalsServer_1 = __importDefault(require("./DataTotalsServer"));
const styles_1 = require("../styles");
const utils_1 = require("../utils");
const api_1 = require("../api");
const DRFReactBySchemaContext_1 = require("../context/DRFReactBySchemaContext");
const APIWrapperContext_1 = require("../context/APIWrapperContext");
const GenericModelList = ({ model, columnFields, hiddenFields = [], creatableFields, disabledFields, minWidthFields, indexField, indexFieldBasePath, indexFieldViewBasePath, addExistingModel, onProcessRow, onDataChange, reloadAfterRowUpdate, customColumnOperations, customFieldFormLayouts, customLinkDestination, isEditable, hasBulkSelect = false, onSelectActions, sumRows, isAutoHeight = true, forceReload = false, LinkComponent = null, hasHeader = false, paginationMode = 'client', defaultFilter, queryParams, hideFooterComponent, hideToolbarComponent, tableAutoHeight, actions, customActions, optionsAC, defaultValues, disableScreenLoading, extraValidators, MobileListRenderItem, }) => {
const { serverEndPoint, isInBatches, firstBatchLength } = (0, DRFReactBySchemaContext_1.useDRFReactBySchema)();
const { onEditModel } = (0, APIWrapperContext_1.useAPIWrapper)();
const [data, setData] = (0, react_1.useState)(false);
const [loading, setLoading] = (0, react_1.useState)(false);
const [visibleRows, setVisibleRows] = (0, react_1.useState)([]);
const [hideFooterPagination, setHideFooterPagination] = (0, react_1.useState)(false);
const [paginationModel, setPaginationModel] = (0, react_1.useState)(paginationMode === 'server' ? { page: 0, pageSize: 100 } : undefined);
const finalCustomColumnOperations = (column) => __awaiter(void 0, void 0, void 0, function* () {
if (minWidthFields) {
if (column.field in minWidthFields) {
column.minWidth = minWidthFields[column.field];
}
}
if (customColumnOperations) {
return yield customColumnOperations(column);
}
return column;
});
const loadObjectList = () => __awaiter(void 0, void 0, void 0, function* () {
if (!disableScreenLoading) {
setLoading(true);
}
switch (paginationMode) {
case 'client':
const loadParams = {
model,
serverEndPoint,
columnFields,
hiddenFields,
creatableFields,
disabledFields,
isInBatches,
queryParams,
};
const loadedData = yield (0, api_1.getGenericModelList)(loadParams);
if (loadedData && typeof loadedData !== 'boolean') {
setData(loadedData);
setLoading(false);
if (isInBatches && loadedData.data.length === firstBatchLength) {
setHideFooterPagination(true);
(0, api_1.getGenericModelList)(Object.assign(Object.assign({}, loadParams), { loadedSchema: loadedData.schema, loadedModelOptions: loadedData.modelOptions })).then((lastBatchData) => {
if (lastBatchData && typeof lastBatchData !== 'boolean') {
setData(Object.assign(Object.assign({}, loadedData), { data: [...loadedData.data, ...lastBatchData.data] }));
}
setHideFooterPagination(false);
});
}
return;
}
console.log('error retrieving data!');
return;
case 'server':
const page = paginationModel ? paginationModel.page : 0;
const filter = (0, utils_1.mergeFilterItems)(defaultFilter, paginationModel ? paginationModel.filter : undefined);
const sort = paginationModel ? paginationModel.sort : undefined;
const loadPaginatedParams = {
model,
serverEndPoint,
columnFields,
hiddenFields,
creatableFields,
disabledFields,
page,
filter,
queryParams,
sort,
sumRows,
};
const paginatedData = yield (0, api_1.getGenericModelList)(loadPaginatedParams);
if (paginatedData && typeof paginatedData !== 'boolean') {
setData(paginatedData);
setLoading(false);
return;
}
console.log('error retrieving data!');
return;
}
});
(0, react_1.useEffect)(() => {
if (forceReload) {
loadObjectList();
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [forceReload]);
(0, react_1.useEffect)(() => {
loadObjectList();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [model, defaultFilter, queryParams, hiddenFields]);
(0, react_1.useEffect)(() => {
if (paginationMode === 'server') {
loadObjectList();
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [paginationModel]);
if (!serverEndPoint) {
console.error('Error: There is no endpoint defined in DRFReactBySchemaProvider!');
return react_1.default.createElement(react_1.default.Fragment, null);
}
return (react_1.default.createElement(react_1.default.Fragment, null, typeof data !== 'boolean' && data.columns ? (react_1.default.createElement(react_1.default.Fragment, null,
hasHeader && (react_1.default.createElement(Box_1.default, { sx: Object.assign(Object.assign({}, styles_1.Layout.flexRowGrow), { mb: 2 }) },
react_1.default.createElement(Typography_1.default, { variant: "h5" }, data.modelOptions.verbose_name_plural || data.modelOptions.name),
LinkComponent && (react_1.default.createElement(Box_1.default, { sx: styles_1.Layout.flexRow },
react_1.default.createElement(LinkComponent, { to: `novo` },
react_1.default.createElement(Button_1.default, { variant: "contained", size: "medium", sx: { alignSelf: 'stretch' }, startIcon: react_1.default.createElement(AddCircleOutline_1.default, null) }, "Adicionar")))))),
react_1.default.createElement(Box_1.default, { sx: tableAutoHeight ? {} : styles_1.Layout.dataGridWithTabs },
react_1.default.createElement(DataGridBySchemaEditable_1.default, { data: data.data, columns: data.columns, schema: data.schema || {}, model: model, loading: loading, indexField: indexField, indexFieldBasePath: indexFieldBasePath, indexFieldViewBasePath: indexFieldViewBasePath, addExistingModel: addExistingModel, isEditable: isEditable, hasBulkSelect: hasBulkSelect, onSelectActions: onSelectActions, onEditModel: onEditModel, isAutoHeight: isAutoHeight, tableAutoHeight: tableAutoHeight, customColumnOperations: finalCustomColumnOperations, customFieldFormLayouts: customFieldFormLayouts, setVisibleRows: setVisibleRows, hideFooterPagination: hideFooterPagination, hideFooterComponent: hideFooterComponent, hideToolbarComponent: hideToolbarComponent, customLinkDestination: customLinkDestination, actions: actions, customActions: customActions, optionsAC: optionsAC, defaultValues: defaultValues, onProcessRow: onProcessRow, onDataChange: (newData) => {
if (reloadAfterRowUpdate) {
loadObjectList();
return;
}
if (onDataChange) {
onDataChange(newData);
}
setData(Object.assign(Object.assign({}, data), { data: newData }));
}, LinkComponent: LinkComponent || undefined, paginationModel: paginationMode === 'server' ? paginationModel : undefined, setPaginationModel: paginationMode === 'server' ? setPaginationModel : undefined, rowCount: paginationMode === 'client'
? undefined
: typeof data.rowCount !== undefined
? data.rowCount
: 0, extraValidators: extraValidators, MobileListRenderItem: MobileListRenderItem })),
paginationMode === 'client' ? (react_1.default.createElement(DataTotals_1.default, { data: data.data, sumRows: sumRows, visibleRows: visibleRows })) : (react_1.default.createElement(DataTotalsServer_1.default, { sumRows: sumRows, totals: data.sumRowsTotals })))) : (react_1.default.createElement(Backdrop_1.default, { invisible: true, sx: { color: '#fff', zIndex: (theme) => theme.zIndex.drawer + 1 }, open: loading },
react_1.default.createElement(CircularProgress_1.default, null)))));
};
exports.default = GenericModelList;