UNPKG

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
"use strict"; 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;