drf-react-by-schema
Version:
Components and Tools for building a React App having Django Rest Framework (DRF) as server
171 lines (170 loc) • 6.88 kB
JavaScript
;
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 });
exports.useDataGridActions = void 0;
const axios_1 = __importDefault(require("axios"));
const utils_1 = require("../../../utils");
const APIWrapperContext_1 = require("../../../context/APIWrapperContext");
const useDataGridActions = ({ apiRef, model, schema, emptyItem, dataGrid, setDataGrid, setSelectionModel, setSelectionModelIds, setSnackBar, setDataGridLoading, onDataChange, handleStartEditing, tableAutoHeight, indexField, defaultValues, isRowEditing, }) => {
const { rawDeleteData, rawUpdateDataBySchema } = (0, APIWrapperContext_1.useAPIWrapper)();
const handleAddItems = (n = 1) => {
const newRows = [];
for (let i = 0; i < n; i++) {
const id = (0, utils_1.getTmpId)();
newRows.push(Object.assign(Object.assign(Object.assign({}, emptyItem), defaultValues), { id }));
}
const newData = tableAutoHeight
? [...dataGrid.data, ...newRows]
: [...newRows, ...dataGrid.data];
if (onDataChange) {
onDataChange(newData);
}
setDataGrid({
data: newData,
});
setTimeout(() => {
let fieldToFocus = indexField;
if (!fieldToFocus) {
const visibleColumns = apiRef.current.getAllColumns();
const firstEditableCol = visibleColumns.find((col) => col.editable && col.field !== 'actions');
fieldToFocus = firstEditableCol === null || firstEditableCol === void 0 ? void 0 : firstEditableCol.field;
}
apiRef.current.startRowEditMode({ id: newRows[0].id, fieldToFocus });
handleStartEditing(newRows[0].id);
// apiRef.current.setCellFocus(newRows[0].id, fieldToFocus);
if (!tableAutoHeight) {
apiRef.current.scrollToIndexes({ rowIndex: 0 });
}
}, 100);
};
const handleAddItem = () => {
if (isRowEditing) {
if ((0, utils_1.isTmpId)(isRowEditing)) {
setSnackBar({
open: true,
severity: 'info',
msg: 'Adicione uma linha por vez',
});
return;
}
apiRef.current.stopRowEditMode({ id: isRowEditing });
}
const id = (0, utils_1.getTmpId)();
const newRow = Object.assign(Object.assign(Object.assign({}, emptyItem), defaultValues), { id });
const newData = tableAutoHeight ? [...dataGrid.data, newRow] : [newRow, ...dataGrid.data];
if (onDataChange) {
onDataChange(newData);
}
setDataGrid({
data: newData,
});
setTimeout(() => {
let fieldToFocus = indexField;
if (!fieldToFocus) {
const visibleColumns = apiRef.current.getAllColumns();
const firstEditableCol = visibleColumns.find((col) => col.editable && col.field !== 'actions');
fieldToFocus = firstEditableCol === null || firstEditableCol === void 0 ? void 0 : firstEditableCol.field;
}
apiRef.current.startRowEditMode({ id, fieldToFocus });
handleStartEditing(id);
// apiRef.current.setCellFocus(id, fieldToFocus);
if (!tableAutoHeight) {
apiRef.current.scrollToIndexes({ rowIndex: 0 });
}
}, 100);
};
const bulkUpdateData = (newData) => __awaiter(void 0, void 0, void 0, function* () {
const promises = [];
const ids = [];
newData.map((item) => {
promises.push(rawUpdateDataBySchema({
model,
modelObjectId: item.id,
data: item,
schema,
}));
ids.push(item.id);
});
const results = yield Promise.all(promises);
setSelectionModel([]);
setSelectionModelIds([]);
const updatedData = dataGrid.data.map((item) => {
const index = ids.indexOf(item.id);
return index === -1 ? item : newData[index];
});
if (onDataChange) {
onDataChange(updatedData);
}
setDataGrid({
data: updatedData,
});
setSnackBar({
open: true,
severity: 'success',
msg: 'Alterações salvas com sucesso',
});
return results.map((result, index) => {
return {
id: ids[index],
success: !axios_1.default.isAxiosError(result),
};
});
});
const bulkDeleteData = (ids) => __awaiter(void 0, void 0, void 0, function* () {
const promises = [];
ids.map((id) => {
promises.push(rawDeleteData(model, id));
});
setDataGridLoading(true);
const results = yield Promise.all(promises);
setSelectionModel([]);
setSelectionModelIds([]);
const newData = dataGrid.data.filter(({ id }) => !ids.includes(id));
if (onDataChange) {
onDataChange(newData);
}
setDataGrid({
data: newData,
});
setDataGridLoading(false);
setSnackBar({
open: true,
severity: 'success',
msg: 'Itens apagados com sucesso',
});
return results.map((result, index) => {
return {
id: ids[index],
success: result === true,
};
});
});
const bulkCreateData = (ids) => __awaiter(void 0, void 0, void 0, function* () {
handleAddItems(ids.length);
setSelectionModel([]);
setSelectionModelIds([]);
setSnackBar({
open: true,
severity: 'success',
msg: 'Linhas adicionadas com sucesso',
});
});
return {
handleAddItem,
bulkUpdateData,
bulkDeleteData,
bulkCreateData,
};
};
exports.useDataGridActions = useDataGridActions;