drf-react-by-schema
Version:
Components and Tools for building a React App having Django Rest Framework (DRF) as server
140 lines (139 loc) • 8.79 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 __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 Snackbar_1 = __importDefault(require("@mui/material/Snackbar"));
const Alert_1 = __importDefault(require("@mui/material/Alert"));
const material_1 = require("@mui/material");
const utils_1 = require("../utils");
const ConfirmDialog_1 = require("./DataGridBySchemaEditable/ConfirmDialog");
const APIWrapperContext_1 = require("../context/APIWrapperContext");
const DataGridDesktop_1 = __importDefault(require("./DataGridBySchemaEditable/DataGridDesktop"));
const DataGridMobile_1 = __importDefault(require("./DataGridBySchemaEditable/DataGridMobile"));
const theme_1 = __importDefault(require("../styles/theme"));
const DataGridBySchemaEditable = (0, react_1.forwardRef)(({ schema, data, rowCount = 0, columns, model, name = Math.floor(Math.random() * 1000000).toString(), indexField = 'nome', addExistingModel, indexFieldMinWidth = 350, indexFieldBasePath = '', indexFieldViewBasePath, stateToLink = {}, minWidth = 80, loading, modelParent, modelParentId, customColumnOperations, customFieldFormLayouts, customLinkDestination, LinkComponent, onProcessRow, onDataChange, onEditModel, isEditable = false, hasBulkSelect = false, onSelectActions, isAutoHeight = false, defaultValues = {}, hideFooterPagination = false, setVisibleRows, paginationModel = undefined, setPaginationModel = undefined, hideFooterComponent, hideToolbarComponent, tableAutoHeight, actions = ['editInline', 'remove'], customActions, hideColumnsButton, hideFilterButton, hideDensityButton, hideExportButton, hideQuickFilterBar, optionsAC, extraValidators, MobileListRenderItem, }, _) => {
const apiContext = (0, APIWrapperContext_1.useAPIWrapper)();
const initialSnackBar = {
open: false,
msg: '',
severity: 'info',
};
const [snackBar, setSnackBar] = (0, react_1.useState)(initialSnackBar);
const [dataGrid, setDataGrid] = (0, react_1.useState)({
data: [],
});
const [confirmDialogOpen, setConfirmDialogOpen] = (0, react_1.useState)(false);
const [emptyItem, setEmptyItem] = (0, react_1.useState)({});
const yupValidationSchema = (0, react_1.useRef)(null);
const idToRemove = (0, react_1.useRef)(null);
const isMobile = (0, material_1.useMediaQuery)(theme_1.default.breakpoints.down('md'));
const handleConfirmDialogClose = () => {
setConfirmDialogOpen(false);
};
const handleDeleteSave = () => {
if (idToRemove.current === null) {
setConfirmDialogOpen(false);
return;
}
const newData = dataGrid.data.filter((row) => row.id !== idToRemove.current);
setDataGrid(Object.assign(Object.assign({}, dataGrid), { data: newData }));
if (modelParent && modelParentId && apiContext) {
apiContext.onDeleteRelatedModel({
model: modelParent,
id: modelParentId,
relatedModel: model,
relatedModelId: idToRemove.current,
});
}
// Reflect changes to the outside, for example for doing global calculations over multiple rows:
if (onDataChange) {
onDataChange(newData);
}
idToRemove.current = null;
setConfirmDialogOpen(false);
};
const handleDeleteClick = (id) => () => {
idToRemove.current = id;
setConfirmDialogOpen(true);
};
(0, react_1.useEffect)(() => {
if (!columns) {
setDataGrid({ data: [] });
return;
}
const newEmptyItem = {};
if (isEditable) {
for (const col of columns) {
if (schema[col.field].model_default) {
newEmptyItem[col.field] = schema[col.field].model_default;
continue;
}
if (col.field in defaultValues) {
newEmptyItem[col.field] = defaultValues[col.field];
continue;
}
newEmptyItem[col.field] = schema[col.field] ? (0, utils_1.emptyByType)(schema[col.field]) : null;
}
setEmptyItem(newEmptyItem);
}
const skipFields = [];
if (indexField && addExistingModel) {
skipFields.push(indexField);
}
yupValidationSchema.current = (0, utils_1.buildGenericYupValidationSchema)({
data: newEmptyItem,
schema,
skipFields,
extraValidators,
});
setDataGrid({
data,
});
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [data]);
return (react_1.default.createElement(Box_1.default, { sx: { height: '100%' } },
isMobile && MobileListRenderItem ? (react_1.default.createElement(DataGridMobile_1.default, { name: name, data: data, schema: schema, columns: columns, customColumnOperations: customColumnOperations, MobileListRenderItem: MobileListRenderItem })) : (react_1.default.createElement(DataGridDesktop_1.default, { schema: schema, dataGrid: dataGrid, setDataGrid: setDataGrid, rowCount: rowCount, columns: columns, model: model, name: name, indexField: indexField, addExistingModel: addExistingModel, indexFieldMinWidth: indexFieldMinWidth, indexFieldBasePath: indexFieldBasePath, indexFieldViewBasePath: indexFieldViewBasePath, stateToLink: stateToLink, minWidth: minWidth, loading: loading, modelParentId: modelParentId, modelParent: modelParent, customColumnOperations: customColumnOperations, customFieldFormLayouts: customFieldFormLayouts, customLinkDestination: customLinkDestination, LinkComponent: LinkComponent, onProcessRow: onProcessRow, onDataChange: onDataChange, onEditModel: onEditModel, isEditable: isEditable, hasBulkSelect: hasBulkSelect, onSelectActions: onSelectActions, isAutoHeight: isAutoHeight, defaultValues: defaultValues, hideFooterPagination: hideFooterPagination, setVisibleRows: setVisibleRows, paginationModel: paginationModel, setPaginationModel: setPaginationModel, hideFooterComponent: hideFooterComponent, hideToolbarComponent: hideToolbarComponent, tableAutoHeight: tableAutoHeight, actions: actions, customActions: customActions, hideColumnsButton: hideColumnsButton, hideFilterButton: hideFilterButton, hideDensityButton: hideDensityButton, hideExportButton: hideExportButton, hideQuickFilterBar: hideQuickFilterBar, optionsAC: optionsAC, extraValidators: extraValidators, emptyItem: emptyItem, handleDeleteClick: handleDeleteClick, setSnackBar: setSnackBar })),
react_1.default.createElement(ConfirmDialog_1.ConfirmDialog, { open: confirmDialogOpen, onClose: handleConfirmDialogClose, onConfirm: handleDeleteSave }),
react_1.default.createElement(Snackbar_1.default, { open: snackBar.open, autoHideDuration: 5000, onClose: () => {
setSnackBar(Object.assign(Object.assign({}, initialSnackBar), { open: false }));
}, anchorOrigin: { vertical: 'top', horizontal: 'center' } },
react_1.default.createElement(Alert_1.default, { severity: snackBar.severity }, snackBar.msg))));
});
DataGridBySchemaEditable.displayName = 'DataGridBySchemaEditable';
exports.default = DataGridBySchemaEditable;