aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/components/Question.tsx15
-rw-r--r--src/pages/FormPage.tsx38
2 files changed, 44 insertions, 9 deletions
diff --git a/src/components/Question.tsx b/src/components/Question.tsx
index 2914ae6..ebacb4a 100644
--- a/src/components/Question.tsx
+++ b/src/components/Question.tsx
@@ -37,6 +37,9 @@ class RenderedQuestion extends React.Component<QuestionProp> {
this.setPublicState("valid", true);
this.setPublicState("error", "");
+ if (props.question.type === QuestionType.Code) {
+ this.setPublicState("unittestsFailed", false);
+ }
if (!skip_normal_state.includes(props.question.type)) {
this.setPublicState("value", "");
@@ -44,8 +47,8 @@ class RenderedQuestion extends React.Component<QuestionProp> {
}
setPublicState(target: string, value: string | boolean | null, callback?:() => void): void {
- this.setState({[target]: value}, callback);
this.props.public_state.set(target, value);
+ this.setState({[target]: value}, callback);
}
// This is here to allow dynamic selection between the general handler, textarea, and code field handlers.
@@ -155,6 +158,7 @@ class RenderedQuestion extends React.Component<QuestionProp> {
}
let invalid = false;
+ let unittest_failed = false;
const options: string | string[] = this.props.question.data["options"];
switch (this.props.question.type) {
case QuestionType.TextArea:
@@ -163,6 +167,9 @@ class RenderedQuestion extends React.Component<QuestionProp> {
if (this.props.public_state.get("value") === "") {
invalid = true;
}
+ if (this.props.public_state.get("unittestsFailed")) {
+ unittest_failed = true;
+ }
break;
case QuestionType.Select:
@@ -189,7 +196,11 @@ class RenderedQuestion extends React.Component<QuestionProp> {
if (invalid) {
this.setPublicState("error", "Field must be filled.");
this.setPublicState("valid", false);
- } else {
+ } else if (unittest_failed) {
+ this.setPublicState("error", "1 or more unittests failed.");
+ this.setPublicState("valid", false);
+ }
+ else {
this.setPublicState("error", "");
this.setPublicState("valid", true);
}
diff --git a/src/pages/FormPage.tsx b/src/pages/FormPage.tsx
index 082be23..f21e4f0 100644
--- a/src/pages/FormPage.tsx
+++ b/src/pages/FormPage.tsx
@@ -5,6 +5,7 @@ import { Link } from "react-router-dom";
import React, { SyntheticEvent, useEffect, useState, createRef } from "react";
import { useParams } from "react-router";
import { PropagateLoader } from "react-spinners";
+import { AxiosError } from "axios";
import HeaderBar from "../components/HeaderBar";
import RenderedQuestion from "../components/Question";
@@ -89,7 +90,7 @@ class Navigation extends React.Component<NavigationProps> {
constructor(props: NavigationProps) {
super(props);
- this.setState({"logged_in": false});
+ this.state = {"logged_in": false};
}
render(): JSX.Element {
@@ -232,6 +233,9 @@ function FormPage(): JSX.Element {
const questionRef = refMap.get(question.id);
if (questionRef && questionRef.current) {
+ if(questionRef.current.props.question.type == QuestionType.Code){
+ questionRef.current.props.public_state.set("unittestsFailed", false);
+ }
questionRef.current.validateField();
}
// In case when field is invalid, add this to invalid fields list.
@@ -263,7 +267,6 @@ function FormPage(): JSX.Element {
return;
}
- setSending(true);
const answers: { [key: string]: unknown } = {};
questions.forEach(prop => {
@@ -296,12 +299,33 @@ function FormPage(): JSX.Element {
answers[question.id] = prop.props.public_state.get("value");
}
});
-
- await ApiClient.post(`forms/submit/${id}`, {response: answers});
- setSending(false);
- setSent(true);
+ await ApiClient.post(`forms/submit/${id}`, { response: answers })
+ .then(() => {
+ setSending(true);
+ setSending(false);
+ setSent(true);
+ })
+ .catch((err: AxiosError) => {
+ switch (err.response.status) {
+ case 422: {
+ // Validation on a submitted code questions
+ const questionId =
+ err.response.data.test_results[0].question_id;
+ questions.forEach((prop) => {
+ const question: Question = prop.props.question;
+ const questionRef = refMap.get(question.id);
+ if (question.id === questionId) {
+ prop.props.public_state.set("unittestsFailed", true);
+ questionRef.current.validateField();
+ }
+ });
+ break;
+ }
+ default:
+ throw err;
+ }
+ });
}
-
return (
<div>
<HeaderBar title={form.name} description={form.description}/>