diff --git a/package.json b/package.json index 8cd02003..9a2686ae 100644 --- a/package.json +++ b/package.json @@ -33,14 +33,14 @@ "@edx/frontend-platform": "^7.1.0", "@edx/openedx-atlas": "^0.6.0", "@edx/react-unit-test-utils": "^2.0.0", - "@openedx/frontend-plugin-framework": "^1.1.2", - "@openedx/frontend-slot-footer": "^1.0.2", - "@openedx/paragon": "^22.1.1", "@edx/reactifex": "^2.1.1", "@fortawesome/fontawesome-svg-core": "^1.2.25", "@fortawesome/free-brands-svg-icons": "^5.11.2", "@fortawesome/free-solid-svg-icons": "^5.11.2", "@fortawesome/react-fontawesome": "^0.1.5", + "@openedx/frontend-plugin-framework": "^1.1.2", + "@openedx/frontend-slot-footer": "^1.0.2", + "@openedx/paragon": "^22.1.1", "@redux-beacon/segment": "^1.0.0", "@reduxjs/toolkit": "^1.5.1", "classnames": "^2.2.6", diff --git a/src/components/GradesView/EditModal/OverrideTable/AdjustedGradeInput/__snapshots__/index.test.jsx.snap b/src/components/GradesView/EditModal/OverrideTable/AdjustedGradeInput/__snapshots__/index.test.jsx.snap index b12be4b3..7fb4b8d6 100644 --- a/src/components/GradesView/EditModal/OverrideTable/AdjustedGradeInput/__snapshots__/index.test.jsx.snap +++ b/src/components/GradesView/EditModal/OverrideTable/AdjustedGradeInput/__snapshots__/index.test.jsx.snap @@ -5,7 +5,8 @@ exports[`AdjustedGradeInput component render snapshot 1`] = ` some-hint-text diff --git a/src/components/GradesView/EditModal/OverrideTable/AdjustedGradeInput/hooks.js b/src/components/GradesView/EditModal/OverrideTable/AdjustedGradeInput/hooks.js index da315857..efc4cbd5 100644 --- a/src/components/GradesView/EditModal/OverrideTable/AdjustedGradeInput/hooks.js +++ b/src/components/GradesView/EditModal/OverrideTable/AdjustedGradeInput/hooks.js @@ -15,6 +15,7 @@ const useAdjustedGradeInputData = () => { value, onChange, hintText, + possibleGrade, }; }; diff --git a/src/components/GradesView/EditModal/OverrideTable/AdjustedGradeInput/index.jsx b/src/components/GradesView/EditModal/OverrideTable/AdjustedGradeInput/index.jsx index 5a4ff3c4..02926373 100644 --- a/src/components/GradesView/EditModal/OverrideTable/AdjustedGradeInput/index.jsx +++ b/src/components/GradesView/EditModal/OverrideTable/AdjustedGradeInput/index.jsx @@ -1,6 +1,8 @@ import React from 'react'; import { Form } from '@openedx/paragon'; +import { useIntl } from '@edx/frontend-platform/i18n'; +import messages from '../messages'; import useAdjustedGradeInputData from './hooks'; @@ -13,17 +15,22 @@ export const AdjustedGradeInput = () => { const { value, onChange, + possibleGrade, hintText, } = useAdjustedGradeInputData(); + + const { formatMessage } = useIntl(); + return ( - {hintText} + {value > possibleGrade ?
{ formatMessage(messages.adjustedGradeError) } { possibleGrade }
: hintText}
); }; diff --git a/src/components/GradesView/EditModal/OverrideTable/messages.js b/src/components/GradesView/EditModal/OverrideTable/messages.js index 25e7bff1..0f31a89b 100644 --- a/src/components/GradesView/EditModal/OverrideTable/messages.js +++ b/src/components/GradesView/EditModal/OverrideTable/messages.js @@ -21,6 +21,11 @@ const messages = defineMessages({ defaultMessage: 'Reason', description: 'Edit Modal Override Table Reason column header', }, + adjustedGradeError: { + id: 'gradebook.GradesView.EditModal.Overrides.adjustedGradeError', + defaultMessage: 'The value exceeds the maximum grade:', + description: 'Edit Modal Override Adjusted Grade Error', + }, }); export default messages; diff --git a/src/components/GradesView/EditModal/__snapshots__/index.test.jsx.snap b/src/components/GradesView/EditModal/__snapshots__/index.test.jsx.snap index 46a0c513..6ec6164f 100644 --- a/src/components/GradesView/EditModal/__snapshots__/index.test.jsx.snap +++ b/src/components/GradesView/EditModal/__snapshots__/index.test.jsx.snap @@ -36,6 +36,7 @@ exports[`EditModal component render with error snapshot 1`] = ` Cancel diff --git a/src/components/GradesView/EditModal/index.test.jsx b/src/components/GradesView/EditModal/index.test.jsx index 3468096d..5a336600 100644 --- a/src/components/GradesView/EditModal/index.test.jsx +++ b/src/components/GradesView/EditModal/index.test.jsx @@ -14,10 +14,12 @@ import OverrideTable from './OverrideTable'; import useEditModalData from './hooks'; import EditModal from '.'; import messages from './messages'; +import useAdjustedGradeInputData from './OverrideTable/AdjustedGradeInput/hooks'; jest.mock('./hooks', () => jest.fn()); jest.mock('./ModalHeaders', () => 'ModalHeaders'); jest.mock('./OverrideTable', () => 'OverrideTable'); +jest.mock('./OverrideTable/AdjustedGradeInput/hooks', () => jest.fn()); const hookProps = { onClose: jest.fn().mockName('hooks.onClose'), @@ -27,6 +29,12 @@ const hookProps = { }; useEditModalData.mockReturnValue(hookProps); +const adjustedGradeProps = { + value: 50, + possibleGrade: 100, +}; +useAdjustedGradeInputData.mockReturnValue(adjustedGradeProps); + let el; describe('EditModal component', () => { beforeEach(() => { @@ -39,6 +47,7 @@ describe('EditModal component', () => { }); it('initializes component hooks', () => { expect(useEditModalData).toHaveBeenCalled(); + expect(useAdjustedGradeInputData).toHaveBeenCalled(); }); }); describe('render', () => { @@ -88,16 +97,18 @@ describe('EditModal component', () => { expect(button.children[0].el).toEqual(formatMessage(messages.closeText)); expect(button.type).toEqual('ModalDialog.CloseButton'); }); - test('adjusted grade button', () => { + test('adjusted grade button enabled', () => { const button = footer[1].findByType(ActionRow)[0].children[1]; expect(button.children[0].el).toEqual(formatMessage(messages.saveGrade)); expect(button.type).toEqual('Button'); expect(button.props.onClick).toEqual(hookProps.handleAdjustedGradeClick); + expect(button.props.disabled).toEqual(false); }); }; describe('without error', () => { beforeEach(() => { useEditModalData.mockReturnValueOnce({ ...hookProps, error: undefined }); + useAdjustedGradeInputData.mockReturnValueOnce({ value: 50, possibleGrade: 100 }); el = shallow(); }); test('snapshot', () => { @@ -124,5 +135,15 @@ describe('EditModal component', () => { }); testFooter(); }); + describe('when the adjusted grade button is disabled', () => { + beforeEach(() => { + useAdjustedGradeInputData.mockReturnValueOnce({ value: 101, possibleGrade: 100 }); + el = shallow(); + }); + test('adjusted grade button is disabled', () => { + const button = el.instance.findByType(ActionRow)[0].children[1]; + expect(button.props.disabled).toEqual(true); + }); + }); }); }); diff --git a/webpack.dev-tutor.config.js b/webpack.dev-tutor.config.js new file mode 100755 index 00000000..e69de29b