@@ -4,8 +4,9 @@ import Grid from '@mui/material/Grid';
4
4
import TextField from '@mui/material/TextField' ;
5
5
import MenuItem from '@mui/material/MenuItem' ;
6
6
import Button from '@mui/material/Button' ;
7
- import { Autocomplete } from "@mui/material" ;
7
+ import { Autocomplete , Typography } from "@mui/material" ;
8
8
import { QUESTION_CATEGORIES } from "./QuestionCategories" ;
9
+ import { Example } from "../../data/data.context" ;
9
10
10
11
interface QuestionFormProps {
11
12
question ?: Question ;
@@ -19,6 +20,10 @@ const QuestionForm: React.FC<QuestionFormProps> = ({question:initialQuestion, on
19
20
new Question ( {
20
21
difficulty : 'Easy' ,
21
22
} ) ) ;
23
+ const [ constraints , setConstraints ] = useState < string [ ] > (
24
+ initialQuestion ? initialQuestion . constraints : [ ] ) ;
25
+ const [ examples , setExamples ] = useState < Example [ ] > (
26
+ initialQuestion ? initialQuestion . examples : [ ] ) ;
22
27
23
28
const complexities = [
24
29
{ value : 'Easy' , label : 'Easy' } ,
@@ -28,9 +33,6 @@ const QuestionForm: React.FC<QuestionFormProps> = ({question:initialQuestion, on
28
33
29
34
const handleTextInputChange = ( e : { target : { id : any ; value : any ; } ; } ) => {
30
35
let { id, value} = e . target ;
31
- if ( id === 'constraints' ) {
32
- value = [ value ]
33
- }
34
36
setQuestion ( ( q ) => ( {
35
37
...q ,
36
38
[ id ] : value ,
@@ -39,13 +41,32 @@ const QuestionForm: React.FC<QuestionFormProps> = ({question:initialQuestion, on
39
41
40
42
const handleSubmit = ( e : { preventDefault : ( ) => void ; } ) => {
41
43
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 ) ;
43
48
} ;
44
49
45
50
const handleCancel = ( ) => {
46
51
onCancel ( ) ;
47
52
} ;
48
53
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
+
49
70
return (
50
71
< React . Fragment >
51
72
< form >
@@ -111,15 +132,80 @@ const QuestionForm: React.FC<QuestionFormProps> = ({question:initialQuestion, on
111
132
onChange = { handleTextInputChange }
112
133
/>
113
134
</ 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
+ ) ) }
123
209
</ Grid >
124
210
< Grid container item xs = { 12 } spacing = { 2 } >
125
211
< Grid item >
0 commit comments