Skip to content

Commit af54f15

Browse files
committed
Add dynamic constraints/examples to QuestionForm
Add dynamic number of constraints and examples to QuestionForm
1 parent 522af84 commit af54f15

File tree

1 file changed

+100
-14
lines changed

1 file changed

+100
-14
lines changed

frontend/src/components/Questions/QuestionForm.tsx

Lines changed: 100 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ import Grid from '@mui/material/Grid';
44
import TextField from '@mui/material/TextField';
55
import MenuItem from '@mui/material/MenuItem';
66
import Button from '@mui/material/Button';
7-
import {Autocomplete} from "@mui/material";
7+
import {Autocomplete, Typography} from "@mui/material";
88
import {QUESTION_CATEGORIES} from "./QuestionCategories";
9+
import {Example} from "../../data/data.context";
910

1011
interface QuestionFormProps {
1112
question?: Question;
@@ -19,6 +20,10 @@ const QuestionForm: React.FC<QuestionFormProps> = ({question:initialQuestion, on
1920
new Question({
2021
difficulty: 'Easy',
2122
}));
23+
const [constraints, setConstraints] = useState<string[]>(
24+
initialQuestion ? initialQuestion.constraints : []);
25+
const [examples, setExamples] = useState<Example[]>(
26+
initialQuestion ? initialQuestion.examples : []);
2227

2328
const complexities = [
2429
{value: 'Easy', label: 'Easy'},
@@ -28,9 +33,6 @@ const QuestionForm: React.FC<QuestionFormProps> = ({question:initialQuestion, on
2833

2934
const handleTextInputChange = (e: { target: { id: any; value: any; }; }) => {
3035
let {id, value} = e.target;
31-
if (id === 'constraints') {
32-
value = [value]
33-
}
3436
setQuestion((q) => ({
3537
...q,
3638
[id]: value,
@@ -39,13 +41,32 @@ const QuestionForm: React.FC<QuestionFormProps> = ({question:initialQuestion, on
3941

4042
const handleSubmit = (e: { preventDefault: () => void; }) => {
4143
e.preventDefault();
42-
onSubmit(question);
44+
let questionToAdd = {...question};
45+
questionToAdd.constraints = constraints.filter((constraint) => constraint !== '');
46+
questionToAdd.examples = examples.filter((example) => example.text !== '' || example.image !== '');
47+
onSubmit(questionToAdd);
4348
};
4449

4550
const handleCancel = () => {
4651
onCancel();
4752
};
4853

54+
const handleAddConstraint = () => {
55+
setConstraints([...constraints, '']);
56+
}
57+
58+
const handleRemoveConstraint = (index: number) => {
59+
setConstraints(constraints.filter((_, i) => i !== index));
60+
}
61+
62+
const handleAddExample = () => {
63+
setExamples([...examples, {text: '', image: ''}]);
64+
}
65+
66+
const handleRemoveExample = (index: number) => {
67+
setExamples(examples.filter((_, i) => i !== index));
68+
}
69+
4970
return (
5071
<React.Fragment>
5172
<form>
@@ -111,15 +132,80 @@ const QuestionForm: React.FC<QuestionFormProps> = ({question:initialQuestion, on
111132
onChange={handleTextInputChange}
112133
/>
113134
</Grid>
114-
<Grid item xs={12}>
115-
<TextField
116-
id="constraints"
117-
label="Constraints"
118-
multiline
119-
fullWidth
120-
value={question.constraints}
121-
onChange={handleTextInputChange}
122-
/>
135+
<Grid container item xs={12} direction={"row"} spacing={3} alignItems={"center"}>
136+
<Grid item>
137+
<Typography variant="h6">Constraints: {constraints.length}</Typography>
138+
</Grid>
139+
<Grid item>
140+
<Button variant="contained" onClick={handleAddConstraint}>+</Button>
141+
</Grid>
142+
</Grid>
143+
<Grid container item xs={12} spacing={3}>
144+
{constraints.map((constraint, index) => (
145+
<Grid container item xs={12} direction={"row"} spacing={3} alignItems={"center"} key={index}>
146+
<Grid item xs={10}>
147+
<TextField
148+
id={"constraint" + (index+1)}
149+
label={"Constraint " + (index + 1)}
150+
fullWidth
151+
value={constraint}
152+
onChange={(e) => {
153+
let updatedConstraints = [...constraints];
154+
updatedConstraints[index] = e.target.value;
155+
setConstraints(updatedConstraints);
156+
}}
157+
/>
158+
</Grid>
159+
<Grid item xs={2}>
160+
<Button variant="contained" onClick={() => handleRemoveConstraint(index)}>-</Button>
161+
</Grid>
162+
</Grid>
163+
))}
164+
</Grid>
165+
<Grid container item xs={12} direction={"row"} spacing={3} alignItems={"center"}>
166+
<Grid item>
167+
<Typography variant="h6">Examples: {examples.length}</Typography>
168+
</Grid>
169+
<Grid item>
170+
<Button variant="contained" onClick={handleAddExample}>+</Button>
171+
</Grid>
172+
</Grid>
173+
<Grid container item xs={12} spacing={3}>
174+
{examples.map((example, index) => (
175+
<Grid container item xs={12} direction={"row"} spacing={3} alignItems={"center"} key={index}>
176+
<Grid container item xs={10} spacing={1} alignItems={"center"}>
177+
<Grid item xs={12}>
178+
<TextField
179+
id={"example" + (index+1) + "text"}
180+
label={"Example " + (index + 1) + " Text"}
181+
fullWidth
182+
value={example.text}
183+
onChange={(e) => {
184+
let updatedExamples = [...examples];
185+
updatedExamples[index].text = e.target.value;
186+
setExamples(updatedExamples);
187+
}}
188+
/>
189+
</Grid>
190+
<Grid item xs={12}>
191+
<TextField
192+
id={"example" + (index+1) + "image"}
193+
label={"Example " + (index + 1) + " Image"}
194+
fullWidth
195+
value={example.image}
196+
onChange={(e) => {
197+
let updatedExamples = [...examples];
198+
updatedExamples[index].image = e.target.value;
199+
setExamples(updatedExamples);
200+
}}
201+
/>
202+
</Grid>
203+
</Grid>
204+
<Grid item xs={2}>
205+
<Button variant="contained" onClick={() => handleRemoveExample(index)}>-</Button>
206+
</Grid>
207+
</Grid>
208+
))}
123209
</Grid>
124210
<Grid container item xs={12} spacing={2}>
125211
<Grid item>

0 commit comments

Comments
 (0)