diff --git a/mcc/src/client/AnimalRequest/animal-request.tsx b/mcc/src/client/AnimalRequest/animal-request.tsx
index def06335d..3e76fa3a8 100644
--- a/mcc/src/client/AnimalRequest/animal-request.tsx
+++ b/mcc/src/client/AnimalRequest/animal-request.tsx
@@ -16,6 +16,7 @@ import ResearchArea from './research-area'
import AnimalCohorts from './animal-cohort'
import Button from './button'
import SavingOverlay from './saving-overlay'
+import ErrorMessageHandler from './error-message-handler'
import {
earlyInvestigatorTooltip,
@@ -32,6 +33,33 @@ export function AnimalRequest() {
const requestId = (new URLSearchParams(window.location.search)).get("requestId")
const [isSubmitting, setIsSubmitting] = useState(false)
const [displayOverlay, setDisplayOverlay] = useState(false)
+ const [stateRollbackOnFailure, setStateRollbackOnFailure] = useState({
+ "returned": false,
+ "data": {"status": "draft",
+ middleinitial: undefined,
+ lastname: undefined,
+ firstname: undefined,
+ isprincipalinvestigator: undefined,
+ institutionname: undefined,
+ institutioncity: undefined,
+ institutionstate: undefined,
+ institutioncountry: undefined,
+ officiallastname: undefined,
+ officialfirstname: undefined,
+ officialemail: undefined,
+ experimentalrationale: undefined,
+ methodsproposed: undefined,
+ collaborations: undefined,
+ existingmarmosetcolony: undefined,
+ existingnhpfacilities: undefined,
+ rowid: undefined,
+ certify: false,
+ animalwelfare: undefined,
+ vetlastname: undefined,
+ vetemail: undefined,
+ vetfirstname: undefined
+ }
+ })
// On submit, state is managed by the FormData object in handleSubmit. These hooks are only used to propagate values
// from the database into the form via fillForm if there is a requestId
@@ -73,8 +101,13 @@ export function AnimalRequest() {
})
- function handleFailure(data) {
- console.error(data)
+ function handleFailure(response) {
+ alert(response.exception) //this is probably what you want to show. An example would be to submit data with a long value for middle initial (>14 characters)
+ setDisplayOverlay(false)
+ setAnimalRequests({
+ "returned": stateRollbackOnFailure.returned,
+ "data": { ...stateRollbackOnFailure.data, status: stateRollbackOnFailure.data.status }
+ })
}
@@ -111,7 +144,7 @@ export function AnimalRequest() {
return true
}
- return "draft" === animalRequests.data.status
+ return "draft" === animalRequests.data.status || "submitting" === animalRequests.data.status
}
function handleNextStateSubmitButton() {
@@ -158,7 +191,7 @@ export function AnimalRequest() {
function handleNextStateSaveButton() {
- setIsSubmitting(false);
+ setIsSubmitting(false)
if (animalRequests.data.status === "submitting") {
setAnimalRequests({
@@ -171,7 +204,7 @@ export function AnimalRequest() {
"data": { ...animalRequests.data, status:"submitted" }
});
} else if (animalRequests.data.status === "under-review") {
- setIsSubmitting(true);
+ setIsSubmitting(true)
setAnimalRequests({
"returned": true,
"data": { ...animalRequests.data, status:"rejecting" }
@@ -281,6 +314,10 @@ export function AnimalRequest() {
function handleSubmit(e: FormEvent) {
e.preventDefault()
setDisplayOverlay(true)
+ setStateRollbackOnFailure({
+ "returned": animalRequests.returned,
+ "data": { ...animalRequests.data, status: animalRequests.data.status }
+ })
if(animalRequests.data.status === "submitting") {
animalRequests.data.status = "submitted"
@@ -289,7 +326,7 @@ export function AnimalRequest() {
} else if(animalRequests.data.status === "approving-final") {
animalRequests.data.status = "approved"
} else if(animalRequests.data.status === "rejecting") {
- animalRequests.data.status = "rejected"
+ animalRequests.data.status = "rejected"
}
const data = new FormData(e.currentTarget as HTMLFormElement)
@@ -346,7 +383,7 @@ export function AnimalRequest() {
...coinvestigatorCommands,
...cohortCommands
],
- success: function(data) {
+ success: function(response) {
window.location.href = ActionURL.buildURL('mcc', 'mccRequests.view')
},
failure: handleFailure
@@ -478,23 +515,26 @@ export function AnimalRequest() {
return (
<>