drf-react-by-schema
Version:
Components and Tools for building a React App having Django Rest Framework (DRF) as server
220 lines (219 loc) • 9.8 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.useProcessRowUpdate = void 0;
const axios_1 = __importDefault(require("axios"));
const utils_1 = require("../../../utils");
const APIWrapperContext_1 = require("../../../context/APIWrapperContext");
// import { buildEditPath } from '../utils'; // TODO: Check Why it is missing here
function isYupValidationError(err) {
return err instanceof Error && err.name === 'ValidationError';
}
const useProcessRowUpdate = ({ preparedColumns, yupValidationSchema, setDataGridLoading, indexField, processingRow, setValidationErrors, modelParent, modelParentId, model, schema, addExistingModel, updateOptionsAC, dataGrid, setDataGrid, onDataChange, onProcessRow, handleStopEditing,
// extraValidators, // TODO: Check why this is missing
onEditModel, }) => {
const { onEditRelatedModelSave, onEditModelDataGridSave } = (0, APIWrapperContext_1.useAPIWrapper)();
const processRowUpdate = (editedRow) => __awaiter(void 0, void 0, void 0, function* () {
var _a, _b;
const originalRow = dataGrid.data.find((r) => r.id === editedRow.id);
if (originalRow && JSON.stringify(originalRow) === JSON.stringify(editedRow)) {
console.log('No changes detected, skipping save.');
handleStopEditing();
if ((0, utils_1.isTmpId)(editedRow.id)) {
const newData = dataGrid.data.filter(({ id: rowId }) => editedRow.id !== rowId);
setDataGrid({ data: newData });
throw new Error('CANCEL_TMP_ROW');
}
return editedRow;
}
if (!preparedColumns || !yupValidationSchema) {
return false;
}
setDataGridLoading(true);
const indexCol = preparedColumns.find((col) => col.field === indexField);
processingRow.current = editedRow.id;
try {
yield yupValidationSchema.validate(editedRow, { abortEarly: false });
}
catch (err) {
if (isYupValidationError(err)) {
const rowErrors = {};
err.inner.forEach((e) => {
if (e.path) {
rowErrors[e.path] = e.message;
}
else {
rowErrors['campo desconhecido'] = e.message;
}
});
setValidationErrors((prev) => (Object.assign(Object.assign({}, prev), { [editedRow.id]: rowErrors })));
err.message = Object.entries(rowErrors)
.map(([field, message]) => `${field}: ${message}`)
.join('; ');
}
setDataGridLoading(false);
throw err;
}
const onlyAddExisting = indexField &&
(0, utils_1.isTmpId)(editedRow.id) &&
editedRow[indexField] &&
!(0, utils_1.isTmpId)(editedRow[indexField].id) &&
(!indexCol || !indexCol.valueFormatter);
const createNewItem = indexField &&
(0, utils_1.isTmpId)(editedRow.id) &&
editedRow[indexField] &&
(0, utils_1.isTmpId)(editedRow[indexField].id);
if (onlyAddExisting) {
const row = {};
row.id_to_add = editedRow[indexField].id;
for (const [key, value] of Object.entries(editedRow[indexField])) {
if (key === 'id') {
row[key] = editedRow.id;
continue;
}
row[key] = value;
}
editedRow = Object.assign({}, row);
}
if (createNewItem && editedRow[indexField]) {
if (editedRow[indexField].inputValue) {
editedRow[indexField] = editedRow[indexField].inputValue;
}
if (addExistingModel) {
editedRow[indexField] = editedRow[indexField].label;
}
}
if (modelParent && modelParentId && onEditRelatedModelSave) {
const response = yield onEditRelatedModelSave({
model: modelParent,
id: modelParentId,
relatedModel: model,
relatedModelId: editedRow.id,
newRow: editedRow,
schema,
onlyAddExisting,
});
if (axios_1.default.isAxiosError(response)) {
let errorMessage = 'Erro desconhecido no servidor';
if (((_a = response.response) === null || _a === void 0 ? void 0 : _a.data) &&
typeof response.response.data === 'object' &&
!Array.isArray(response.response.data)) {
const backendErrors = response.response.data;
const rowErrors = {};
Object.keys(backendErrors).forEach((field) => {
const msgs = backendErrors[field];
if (Array.isArray(msgs)) {
rowErrors[field] = msgs.join(', ');
}
else if (typeof msgs === 'string') {
rowErrors[field] = msgs;
}
});
setValidationErrors((prev) => (Object.assign(Object.assign({}, prev), { [editedRow.id]: rowErrors })));
errorMessage = Object.entries(rowErrors)
.map(([field, message]) => `${field}: ${message}`)
.join('; ');
}
setDataGridLoading(false);
throw new Error(errorMessage);
}
if (onlyAddExisting || createNewItem || !onlyAddExisting) {
setValidationErrors((prev) => {
const newState = Object.assign({}, prev);
delete newState[editedRow.id];
return newState;
});
updateOptionsAC();
const data = [...dataGrid.data];
const newRow = 'data' in response && 'schema' in response ? response.data : response;
for (const i in data) {
if (data[i].id === editedRow.id) {
data[i] = newRow;
break;
}
}
if (onDataChange) {
onDataChange(data);
}
if (onProcessRow) {
onProcessRow(newRow);
}
setDataGrid({
data,
});
setDataGridLoading(false);
handleStopEditing();
return newRow;
}
}
const response = yield onEditModelDataGridSave({
model,
id: editedRow.id,
newRow: editedRow,
schema,
});
if (axios_1.default.isAxiosError(response)) {
let errorMessage = 'Erro desconhecido no servidor';
if (((_b = response.response) === null || _b === void 0 ? void 0 : _b.data) &&
typeof response.response.data === 'object' &&
!Array.isArray(response.response.data)) {
const backendErrors = response.response.data;
const rowErrors = {};
Object.keys(backendErrors).forEach((field) => {
const msgs = backendErrors[field];
if (Array.isArray(msgs)) {
rowErrors[field] = msgs.join(', ');
}
else if (typeof msgs === 'string') {
rowErrors[field] = msgs;
}
});
setValidationErrors((prev) => (Object.assign(Object.assign({}, prev), { [editedRow.id]: rowErrors })));
errorMessage = Object.entries(rowErrors)
.map(([field, message]) => `${field}: ${message}`)
.join('; ');
}
setDataGridLoading(false);
throw new Error(errorMessage);
}
setValidationErrors((prev) => {
const newState = Object.assign({}, prev);
delete newState[editedRow.id];
return newState;
});
updateOptionsAC();
const data = [...dataGrid.data];
const newRow = 'data' in response && 'schema' in response ? response.data : response;
for (const i in data) {
if (data[i].id === editedRow.id) {
data[i] = newRow;
break;
}
}
if (onDataChange) {
onDataChange(data);
}
if (onProcessRow) {
onProcessRow(newRow);
}
setDataGrid({
data,
});
setDataGridLoading(false);
handleStopEditing();
return newRow;
});
return { processRowUpdate };
};
exports.useProcessRowUpdate = useProcessRowUpdate;