Skip to content

Commit 940482d

Browse files
fix: add validation to problem number fields (#425)
1 parent b088a8f commit 940482d

File tree

8 files changed

+36
-6
lines changed

8 files changed

+36
-6
lines changed

src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/hooks.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ export const scoringCardHooks = (scoring, updateSettings, defaultValue) => {
160160

161161
const handleWeightChange = (event) => {
162162
let weight = parseFloat(event.target.value);
163-
if (_.isNaN(weight)) {
163+
if (_.isNaN(weight) || weight < 0) {
164164
weight = 0;
165165
}
166166
updateSettings({ scoring: { ...scoring, weight } });
@@ -194,7 +194,7 @@ export const useAnswerSettings = (showAnswer, updateSettings) => {
194194

195195
const handleAttemptsChange = (event) => {
196196
let attempts = parseInt(event.target.value);
197-
if (_.isNaN(attempts)) {
197+
if (_.isNaN(attempts) || attempts < 0) {
198198
attempts = 0;
199199
}
200200
updateSettings({ showAnswer: { ...showAnswer, afterAttempts: attempts } });
@@ -210,7 +210,7 @@ export const useAnswerSettings = (showAnswer, updateSettings) => {
210210
export const timerCardHooks = (updateSettings) => ({
211211
handleChange: (event) => {
212212
let time = parseInt(event.target.value);
213-
if (_.isNaN(time)) {
213+
if (_.isNaN(time) || time < 0) {
214214
time = 0;
215215
}
216216
updateSettings({ timeBetween: time });

src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/ScoringCard.jsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ export const ScoringCard = ({
4949
<Form.Group>
5050
<Form.Control
5151
type="number"
52+
min={0}
53+
step={0.1}
5254
value={scoring.weight}
5355
onChange={handleWeightChange}
5456
floatingLabel={intl.formatMessage(messages.scoringWeightInputLabel)}
@@ -59,6 +61,8 @@ export const ScoringCard = ({
5961
</Form.Group>
6062
<Form.Group>
6163
<Form.Control
64+
type="number"
65+
min={0}
6266
value={attemptDisplayValue}
6367
onChange={handleOnChange}
6468
onBlur={handleMaxAttemptChange}

src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/ShowAnswerCard.jsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ export const ShowAnswerCard = ({
6969
<Form.Group className="pb-0 mb-0 mt-4">
7070
<Form.Control
7171
type="number"
72+
min={0}
7273
value={showAnswer.afterAttempts}
7374
onChange={handleAttemptsChange}
7475
floatingLabel={intl.formatMessage(messages.showAnswerAttemptsInputLabel)}

src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/TimerCard.jsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export const TimerCard = ({
2727
<Form.Group>
2828
<Form.Control
2929
type="number"
30+
min={0}
3031
value={timeBetween}
3132
onChange={handleChange}
3233
floatingLabel={intl.formatMessage(messages.timerInputLabel)}

src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/Tolerance/index.jsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,11 @@ export const handleToleranceTypeChange = ({ updateSettings, tolerance, answers }
2424

2525
export const handleToleranceValueChange = ({ updateSettings, tolerance, answers }) => (event) => {
2626
if (!isAnswerRangeSet({ answers })) {
27-
const newTolerance = { value: event.target.value, type: tolerance.type };
27+
let value = parseFloat(event.target.value);
28+
if (value < 0) {
29+
value = 0;
30+
}
31+
const newTolerance = { value, type: tolerance.type };
2832
updateSettings({ tolerance: newTolerance });
2933
}
3034
};
@@ -92,6 +96,8 @@ export const ToleranceCard = ({
9296
<Form.Control
9397
className="mt-4"
9498
type="number"
99+
min={0}
100+
step={0.1}
95101
value={tolerance.value}
96102
onChange={handleToleranceValueChange({ updateSettings, tolerance, answers })}
97103
floatingLabel={intl.formatMessage(messages.toleranceValueInputLabel)}

src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/Tolerance/index.test.jsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,15 +138,20 @@ describe('ToleranceCard', () => {
138138
const { queryByTestId } = render(<ToleranceCard tolerance={mockToleranceNull} {...props} />);
139139
expect(queryByTestId('input')).toBeFalsy();
140140
});
141-
it('Renders with intial value of tolerance', async () => {
141+
it('Renders with initial value of tolerance', async () => {
142142
const { queryByTestId } = render(<ToleranceCard tolerance={mockToleranceNumber} {...props} />);
143143
expect(queryByTestId('input')).toBeTruthy();
144144
expect(screen.getByDisplayValue('0')).toBeTruthy();
145145
});
146146
it('Calls change function on change.', () => {
147147
const { queryByTestId } = render(<ToleranceCard tolerance={mockToleranceNumber} {...props} />);
148148
fireEvent.change(queryByTestId('input'), { target: { value: 52 } });
149-
expect(props.updateSettings).toHaveBeenCalledWith({ tolerance: { type: ToleranceTypes.number.type, value: '52' } });
149+
expect(props.updateSettings).toHaveBeenCalledWith({ tolerance: { type: ToleranceTypes.number.type, value: 52 } });
150+
});
151+
it('Resets negative value on change.', () => {
152+
const { queryByTestId } = render(<ToleranceCard tolerance={mockToleranceNumber} {...props} />);
153+
fireEvent.change(queryByTestId('input'), { target: { value: -52 } });
154+
expect(props.updateSettings).toHaveBeenCalledWith({ tolerance: { type: ToleranceTypes.number.type, value: 0 } });
150155
});
151156
});
152157
});

src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/__snapshots__/ScoringCard.test.jsx.snap

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ exports[`ScoringCard snapshot snapshot: scoring setting card 1`] = `
2020
<Form.Group>
2121
<Form.Control
2222
floatingLabel="Points"
23+
min={0}
2324
onChange={[MockFunction scoringCardHooks.handleWeightChange]}
25+
step={0.1}
2426
type="number"
2527
value={1.5}
2628
/>
@@ -36,8 +38,10 @@ exports[`ScoringCard snapshot snapshot: scoring setting card 1`] = `
3638
<Form.Control
3739
disabled={false}
3840
floatingLabel="Attempts"
41+
min={0}
3942
onBlur={[MockFunction scoringCardHooks.handleMaxAttemptChange]}
4043
onChange={[MockFunction scoringCardHooks.handleOnChange]}
44+
type="number"
4145
/>
4246
<Form.Control.Feedback>
4347
<FormattedMessage
@@ -95,7 +99,9 @@ exports[`ScoringCard snapshot snapshot: scoring setting card max attempts 1`] =
9599
<Form.Group>
96100
<Form.Control
97101
floatingLabel="Points"
102+
min={0}
98103
onChange={[MockFunction scoringCardHooks.handleWeightChange]}
104+
step={0.1}
99105
type="number"
100106
value={1.5}
101107
/>
@@ -111,8 +117,10 @@ exports[`ScoringCard snapshot snapshot: scoring setting card max attempts 1`] =
111117
<Form.Control
112118
disabled={true}
113119
floatingLabel="Attempts"
120+
min={0}
114121
onBlur={[MockFunction scoringCardHooks.handleMaxAttemptChange]}
115122
onChange={[MockFunction scoringCardHooks.handleOnChange]}
123+
type="number"
116124
/>
117125
<Form.Control.Feedback>
118126
<FormattedMessage
@@ -170,7 +178,9 @@ exports[`ScoringCard snapshot snapshot: scoring setting card zero zero weight 1`
170178
<Form.Group>
171179
<Form.Control
172180
floatingLabel="Points"
181+
min={0}
173182
onChange={[MockFunction scoringCardHooks.handleWeightChange]}
183+
step={0.1}
174184
type="number"
175185
value={0}
176186
/>
@@ -186,8 +196,10 @@ exports[`ScoringCard snapshot snapshot: scoring setting card zero zero weight 1`
186196
<Form.Control
187197
disabled={false}
188198
floatingLabel="Attempts"
199+
min={0}
189200
onBlur={[MockFunction scoringCardHooks.handleMaxAttemptChange]}
190201
onChange={[MockFunction scoringCardHooks.handleOnChange]}
202+
type="number"
191203
/>
192204
<Form.Control.Feedback>
193205
<FormattedMessage

src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/__snapshots__/TimerCard.test.jsx.snap

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ exports[`TimerCard snapshot snapshot: renders reset true setting card 1`] = `
2222
<Form.Group>
2323
<Form.Control
2424
floatingLabel="Seconds"
25+
min={0}
2526
onChange={[MockFunction timerCardHooks.handleChange]}
2627
type="number"
2728
value={5}

0 commit comments

Comments
 (0)