Skip to content

Commit ca61729

Browse files
committed
feat: Add max value warning and disable the submit button
Co-authored-by: lkatsikaris Signed-off-by: Farhaan Bukhsh <[email protected]>
1 parent e458d6f commit ca61729

File tree

7 files changed

+43
-5
lines changed

7 files changed

+43
-5
lines changed

src/components/GradesView/EditModal/OverrideTable/AdjustedGradeInput/__snapshots__/index.test.jsx.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ exports[`AdjustedGradeInput component render snapshot 1`] = `
55
<Form.Control
66
name="adjustedGradeValue"
77
onChange={[MockFunction hook.onChange]}
8-
type="text"
8+
type="number"
99
value="test-value"
1010
/>
1111
some-hint-text

src/components/GradesView/EditModal/OverrideTable/AdjustedGradeInput/hooks.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ const useAdjustedGradeInputData = () => {
1515
value,
1616
onChange,
1717
hintText,
18+
possibleGrade,
1819
};
1920
};
2021

src/components/GradesView/EditModal/OverrideTable/AdjustedGradeInput/index.jsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ import React from 'react';
22

33
import { Form } from '@openedx/paragon';
44

5+
import { useIntl } from '@edx/frontend-platform/i18n';
56
import useAdjustedGradeInputData from './hooks';
7+
import messages from '../messages';
68

79
/**
810
* <AdjustedGradeInput />
@@ -14,16 +16,18 @@ export const AdjustedGradeInput = () => {
1416
value,
1517
onChange,
1618
hintText,
19+
possibleGrade,
1720
} = useAdjustedGradeInputData();
21+
const { formatMessage } = useIntl();
1822
return (
1923
<span>
2024
<Form.Control
21-
type="text"
25+
type="number"
2226
name="adjustedGradeValue"
2327
value={value}
2428
onChange={onChange}
2529
/>
26-
{hintText}
30+
{value > possibleGrade ? <div style={{ color: 'red' }}>{ formatMessage(messages.adjustedGradeError, { possibleGrade })}</div> : hintText}
2731
</span>
2832
);
2933
};

src/components/GradesView/EditModal/OverrideTable/messages.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ const messages = defineMessages({
2121
defaultMessage: 'Reason',
2222
description: 'Edit Modal Override Table Reason column header',
2323
},
24+
adjustedGradeError: {
25+
id: 'gradebook.GradesView.EditModal.Overrides.adjustedGradeError',
26+
defaultMessage: 'The value exceeds the maximum grade: {possibleGrade}',
27+
description: 'Edit Modal Override Adjusted Grade Error',
28+
},
2429
});
2530

2631
export default messages;

src/components/GradesView/EditModal/__snapshots__/index.test.jsx.snap

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ exports[`EditModal component render with error snapshot 1`] = `
3636
Cancel
3737
</ModalDialog.CloseButton>
3838
<Button
39+
disabled={false}
3940
onClick={[MockFunction hooks.handleAdjustedGradeClick]}
4041
variant="primary"
4142
>
@@ -80,6 +81,7 @@ exports[`EditModal component render without error snapshot 1`] = `
8081
Cancel
8182
</ModalDialog.CloseButton>
8283
<Button
84+
disabled={false}
8385
onClick={[MockFunction hooks.handleAdjustedGradeClick]}
8486
variant="primary"
8587
>

src/components/GradesView/EditModal/index.jsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import OverrideTable from './OverrideTable';
1212
import ModalHeaders from './ModalHeaders';
1313
import useEditModalData from './hooks';
1414
import messages from './messages';
15+
import useAdjustedGradeInputData from './OverrideTable/AdjustedGradeInput/hooks';
1516

1617
/**
1718
* <EditModal />
@@ -30,6 +31,10 @@ export const EditModal = () => {
3031
handleAdjustedGradeClick,
3132
isOpen,
3233
} = useEditModalData();
34+
const {
35+
value,
36+
possibleGrade,
37+
} = useAdjustedGradeInputData();
3338

3439
return (
3540
<ModalDialog
@@ -57,7 +62,7 @@ export const EditModal = () => {
5762
<ModalDialog.CloseButton variant="tertiary">
5863
{formatMessage(messages.closeText)}
5964
</ModalDialog.CloseButton>
60-
<Button variant="primary" onClick={handleAdjustedGradeClick}>
65+
<Button variant="primary" onClick={handleAdjustedGradeClick} disabled={value > possibleGrade}>
6166
{formatMessage(messages.saveGrade)}
6267
</Button>
6368
</ActionRow>

src/components/GradesView/EditModal/index.test.jsx

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@ import OverrideTable from './OverrideTable';
1414
import useEditModalData from './hooks';
1515
import EditModal from '.';
1616
import messages from './messages';
17+
import useAdjustedGradeInputData from './OverrideTable/AdjustedGradeInput/hooks';
1718

1819
jest.mock('./hooks', () => jest.fn());
1920
jest.mock('./ModalHeaders', () => 'ModalHeaders');
2021
jest.mock('./OverrideTable', () => 'OverrideTable');
22+
jest.mock('./OverrideTable/AdjustedGradeInput/hooks', () => jest.fn());
2123

2224
const hookProps = {
2325
onClose: jest.fn().mockName('hooks.onClose'),
@@ -27,6 +29,12 @@ const hookProps = {
2729
};
2830
useEditModalData.mockReturnValue(hookProps);
2931

32+
const adjustedGradeProps = {
33+
value: 50,
34+
possibleGrade: 100,
35+
};
36+
useAdjustedGradeInputData.mockReturnValue(adjustedGradeProps);
37+
3038
let el;
3139
describe('EditModal component', () => {
3240
beforeEach(() => {
@@ -39,6 +47,7 @@ describe('EditModal component', () => {
3947
});
4048
it('initializes component hooks', () => {
4149
expect(useEditModalData).toHaveBeenCalled();
50+
expect(useAdjustedGradeInputData).toHaveBeenCalled();
4251
});
4352
});
4453
describe('render', () => {
@@ -88,16 +97,18 @@ describe('EditModal component', () => {
8897
expect(button.children[0].el).toEqual(formatMessage(messages.closeText));
8998
expect(button.type).toEqual('ModalDialog.CloseButton');
9099
});
91-
test('adjusted grade button', () => {
100+
test('adjusted grade button enabled', () => {
92101
const button = footer[1].findByType(ActionRow)[0].children[1];
93102
expect(button.children[0].el).toEqual(formatMessage(messages.saveGrade));
94103
expect(button.type).toEqual('Button');
95104
expect(button.props.onClick).toEqual(hookProps.handleAdjustedGradeClick);
105+
expect(button.props.disabled).toEqual(false);
96106
});
97107
};
98108
describe('without error', () => {
99109
beforeEach(() => {
100110
useEditModalData.mockReturnValueOnce({ ...hookProps, error: undefined });
111+
useAdjustedGradeInputData.mockReturnValueOnce({ value: 50, possibleGrade: 100 });
101112
el = shallow(<EditModal />);
102113
});
103114
test('snapshot', () => {
@@ -124,5 +135,15 @@ describe('EditModal component', () => {
124135
});
125136
testFooter();
126137
});
138+
describe('when the adjusted grade button is disabled', () => {
139+
beforeEach(() => {
140+
useAdjustedGradeInputData.mockReturnValueOnce({ value: 101, possibleGrade: 100 });
141+
el = shallow(<EditModal />);
142+
});
143+
test('adjusted grade button is disabled', () => {
144+
const button = el.instance.findByType(ActionRow)[0].children[1];
145+
expect(button.props.disabled).toEqual(true);
146+
});
147+
});
127148
});
128149
});

0 commit comments

Comments
 (0)