How can I show validation messages after failed form submit? API request returns HTTP 400 'application/problem+json' response and contains violations as a list with field path.
https://www.rfc-editor.org/rfc/rfc7807#section-3
{
"type": "https://example.net/validation-error",
"title": "Your request parameters didn't validate.",
"invalid-params": [
{
"name": "age",
"reason": "must be a positive integer"
},
{
"name": "color",
"reason": "must be 'green', 'red' or 'blue'"
}
]
}
To display summarized error messagesAdd a ValidationSummary control to the page at the location where you want to display the collected error messages. Set the ErrorMessage and Display properties of the individual validation controls. (Default) Each error message appears as a bulleted item.
Use the return value of the function to stop the execution of a form in JavaScript. False would return if the form fails to submit.
Client-side validation is executed by the client and can be easily bypassed.
I have the solution for you, I'd recommend to do it with Saga and HttpError.
First, from our dataProvider we need to throw the HttpError
like this:
...
import {HttpError} from 'react-admin';
...
...
// Make the request with fetch/axios whatever you prefer and catch the error:
// message - the message that will appear in the alert notification popup
// status - the status code
// errors - the errors in key => value format, example in comment below
return fetchClient.request(config).then((response) => {
return convertHTTPResponse(response, type, resource, params);
}).catch(function (error) {
throw new HttpError(error.response.data.message, error.response.status, error.response.data.errors);
});
Then create saga like that:
import {CRUD_CREATE_FAILURE} from "react-admin";
import {stopSubmit} from 'redux-form';
import {put, takeEvery} from "redux-saga/effects";
export default function* errorSagas() {
yield takeEvery(CRUD_CREATE_FAILURE, crudCreateFailure);
}
export function* crudCreateFailure(action) {
var json = action.payload;
// json structure looks like this:
// {
// username: "This username is already taken",
// age: "Your age must be above 18 years old"
// }
yield put(stopSubmit('record-form', json));
}
Please make sure the errors (json) is in the format like in the example above!
Then insert the saga in the componenet:
import errorSagas from './sagas/errorSagas';
...
...
<Admin
customSagas={[ errorSagas ]}
loginPage={LoginPage}
authProvider={authProvider}
dataProvider={dataProvider}
>
Boom! it works
Good luck!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With