diff --git a/src/App.scss b/src/App.scss index 7dfe894..33c8e59 100755 --- a/src/App.scss +++ b/src/App.scss @@ -74,4 +74,7 @@ $input-focus-box-shadow: $input-box-shadow; // hack to get upgrade to paragon 4. right: 1rem !important; } } + .confirm-modal .pgn__modal-body { + overflow: hidden; + } } diff --git a/src/components/ConfirmModal.jsx b/src/components/ConfirmModal.jsx new file mode 100644 index 0000000..b60b214 --- /dev/null +++ b/src/components/ConfirmModal.jsx @@ -0,0 +1,47 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +import { AlertModal, ActionRow, Button } from '@edx/paragon'; + +export const ConfirmModal = ({ + title, + isOpen, + onCancel, + cancelText, + onConfirm, + confirmText, + content, +}) => ( + + + + + )} + > +

{content}

+
+); +ConfirmModal.defaultProps = { + isOpen: false, +}; +ConfirmModal.propTypes = { + isOpen: PropTypes.bool, + title: PropTypes.string.isRequired, + cancelText: PropTypes.string.isRequired, + onCancel: PropTypes.func.isRequired, + onConfirm: PropTypes.func.isRequired, + confirmText: PropTypes.string.isRequired, + content: PropTypes.string.isRequired, +}; + +export default ConfirmModal; diff --git a/src/components/ConfirmModal.test.jsx b/src/components/ConfirmModal.test.jsx new file mode 100644 index 0000000..bc5fb05 --- /dev/null +++ b/src/components/ConfirmModal.test.jsx @@ -0,0 +1,27 @@ +import { shallow } from 'enzyme'; + +import { ConfirmModal } from './ConfirmModal'; + +jest.mock('@edx/paragon', () => ({ + ActionRow: () => 'ActionRow', + AlertModal: () => 'AlertModal', + Button: () => 'Button', +})); + +describe('ConfirmModal', () => { + const props = { + isOpen: false, + title: 'test-title', + cancelText: 'test-cancel-text', + confirmText: 'test-confirm-text', + content: 'test-content', + onCancel: jest.fn().mockName('this.props.onCancel'), + onConfirm: jest.fn().mockName('this.props.onConfirm'), + }; + test('snapshot: closed', () => { + expect(shallow()).toMatchSnapshot(); + }); + test('snapshot: open', () => { + expect(shallow()).toMatchSnapshot(); + }); +}); diff --git a/src/components/__snapshots__/ConfirmModal.test.jsx.snap b/src/components/__snapshots__/ConfirmModal.test.jsx.snap new file mode 100644 index 0000000..dad16c1 --- /dev/null +++ b/src/components/__snapshots__/ConfirmModal.test.jsx.snap @@ -0,0 +1,57 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`ConfirmModal snapshot: closed 1`] = ` + + + + + } + isOpen={false} + title="test-title" +> +

+ test-content +

+
+`; + +exports[`ConfirmModal snapshot: open 1`] = ` + + + + + } + isOpen={true} + title="test-title" +> +

+ test-content +

+
+`; diff --git a/src/containers/ReviewActions/__snapshots__/index.test.jsx.snap b/src/containers/ReviewActions/__snapshots__/index.test.jsx.snap new file mode 100644 index 0000000..8e413b4 --- /dev/null +++ b/src/containers/ReviewActions/__snapshots__/index.test.jsx.snap @@ -0,0 +1,63 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`ReviewActions component component snapshot: do not show rubric 1`] = ` +
+ + + test-username + + +
+ + + +
+
+
+`; + +exports[`ReviewActions component component snapshot: show rubric 1`] = ` +
+ + + test-username + + +
+ + + +
+
+
+`; diff --git a/src/containers/ReviewActions/components/OverrideGradeConfirmModal.jsx b/src/containers/ReviewActions/components/OverrideGradeConfirmModal.jsx new file mode 100644 index 0000000..43a7a2f --- /dev/null +++ b/src/containers/ReviewActions/components/OverrideGradeConfirmModal.jsx @@ -0,0 +1,27 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +import ConfirmModal from 'components/ConfirmModal'; + +export const OverrideGradeConfirmModal = ({ + isOpen, + onCancel, + onConfirm, +}) => ( + +); +OverrideGradeConfirmModal.propTypes = { + isOpen: PropTypes.bool.isRequired, + onCancel: PropTypes.func.isRequired, + onConfirm: PropTypes.func.isRequired, +}; + +export default OverrideGradeConfirmModal; diff --git a/src/containers/ReviewActions/components/OverrideGradeConfirmModal.test.jsx b/src/containers/ReviewActions/components/OverrideGradeConfirmModal.test.jsx new file mode 100644 index 0000000..dfe80f3 --- /dev/null +++ b/src/containers/ReviewActions/components/OverrideGradeConfirmModal.test.jsx @@ -0,0 +1,19 @@ +import { shallow } from 'enzyme'; + +import { OverrideGradeConfirmModal } from './OverrideGradeConfirmModal'; + +jest.mock('components/ConfirmModal', () => 'ConfirmModal'); + +describe('OverrideGradeConfirmModal', () => { + const props = { + isOpen: false, + onCancel: jest.fn().mockName('this.props.onCancel'), + onConfirm: jest.fn().mockName('this.props.onConfirm'), + }; + test('snapshot: closed', () => { + expect(shallow()).toMatchSnapshot(); + }); + test('snapshot: open', () => { + expect(shallow()).toMatchSnapshot(); + }); +}); diff --git a/src/containers/ReviewActions/components/StartGradingButton.jsx b/src/containers/ReviewActions/components/StartGradingButton.jsx new file mode 100644 index 0000000..22eea53 --- /dev/null +++ b/src/containers/ReviewActions/components/StartGradingButton.jsx @@ -0,0 +1,130 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { connect } from 'react-redux'; + +import { + Button, +} from '@edx/paragon'; +import { Cancel, Highlight } from '@edx/paragon/icons'; + +import selectors from 'data/selectors'; +import thunkActions from 'data/thunkActions'; +import { gradingStatuses as statuses } from 'data/services/lms/constants'; + +import StopGradingConfirmModal from './StopGradingConfirmModal'; +import OverrideGradeConfirmModal from './OverrideGradeConfirmModal'; + +export const buttonArgs = { + [statuses.ungraded]: { + label: 'Start Grading', + iconAfter: Highlight, + }, + [statuses.graded]: { + label: 'Override grade', + iconAfter: Highlight, + }, + [statuses.inProgress]: { + label: 'Stop grading this response', + iconAfter: Cancel, + }, +}; + +export class StartGradingButton extends React.Component { + constructor(props) { + super(props); + this.state = { + showConfirmStopGrading: false, + showConfirmOverrideGrade: false, + }; + + this.showConfirmStopGrading = this.showConfirmStopGrading.bind(this); + this.hideConfirmStopGrading = this.hideConfirmStopGrading.bind(this); + this.showConfirmOverrideGrade = this.showConfirmOverrideGrade.bind(this); + this.hideConfirmOverrideGrade = this.hideConfirmOverrideGrade.bind(this); + this.confirmStopGrading = this.confirmStopGrading.bind(this); + this.confirmOverrideGrade = this.confirmOverrideGrade.bind(this); + this.handleClick = this.handleClick.bind(this); + } + + showConfirmStopGrading() { + this.setState({ showConfirmStopGrading: true }); + } + + hideConfirmStopGrading() { + this.setState({ showConfirmStopGrading: false }); + } + + showConfirmOverrideGrade() { + this.setState({ showConfirmOverrideGrade: true }); + } + + hideConfirmOverrideGrade() { + this.setState({ showConfirmOverrideGrade: false }); + } + + confirmStopGrading() { + this.hideConfirmStopGrading(); + this.props.stopGrading(); + } + + confirmOverrideGrade() { + this.hideConfirmOverrideGrade(); + this.props.startGrading(); + } + + handleClick() { + if (this.props.gradingStatus === statuses.inProgress) { + this.showConfirmStopGrading(); + } else if (this.props.gradingStatus === statuses.graded) { + this.showConfirmOverrideGrade(); + } else { + this.props.startGrading(); + } + } + + render() { + const { gradingStatus } = this.props; + if (gradingStatus === statuses.locked) { + return null; + } + const args = buttonArgs[gradingStatus]; + return ( + <> + + + + + ); + } +} + +StartGradingButton.propTypes = { + gradingStatus: PropTypes.string.isRequired, + startGrading: PropTypes.func.isRequired, + stopGrading: PropTypes.func.isRequired, +}; + +export const mapStateToProps = (state) => ({ + gradingStatus: selectors.grading.selected.gradingStatus(state), +}); + +export const mapDispatchToProps = { + startGrading: thunkActions.grading.startGrading, + stopGrading: thunkActions.grading.stopGrading, +}; + +export default connect(mapStateToProps, mapDispatchToProps)(StartGradingButton); diff --git a/src/containers/ReviewActions/components/StartGradingButton.test.jsx b/src/containers/ReviewActions/components/StartGradingButton.test.jsx new file mode 100644 index 0000000..1161914 --- /dev/null +++ b/src/containers/ReviewActions/components/StartGradingButton.test.jsx @@ -0,0 +1,81 @@ +import React from 'react'; +import { shallow } from 'enzyme'; + +import selectors from 'data/selectors'; +import thunkActions from 'data/thunkActions'; +import { gradingStatuses as statuses } from 'data/services/lms/constants'; + +import { + StartGradingButton, + mapStateToProps, + mapDispatchToProps, +} from './StartGradingButton'; + +jest.mock('@edx/paragon', () => ({ + Button: () => 'Button', +})); +jest.mock('@edx/paragon/icons', () => ({ + Cancel: 'Cancel', + Highlight: 'Highlight', +})); +jest.mock('data/selectors', () => ({ + __esModule: true, + default: { + grading: { + selected: { + gradingStatus: (state) => ({ gradingStatus: state }), + }, + }, + }, +})); + +let el; + +describe('StartGradingButton component', () => { + describe('component', () => { + const props = {}; + beforeEach(() => { + props.startGrading = jest.fn().mockName('this.props.startGrading'); + props.stopGrading = jest.fn().mockName('this.props.stopGrading'); + }); + const render = (gradingStatus) => shallow( + , + ); + test('snapshot: locked (null)', () => { + el = render(statuses.locked); + expect(el).toMatchSnapshot(); + expect(el).toEqual({}); + }); + test('snapshot: ungraded (startGrading callback)', () => { + expect(render(statuses.ungraded)).toMatchSnapshot(); + }); + test('snapshot: graded, confirmOverride (startGrading callback)', () => { + el = render(statuses.graded); + el.setState({ showConfirmOverrideGrade: true }); + expect(el.instance().render()).toMatchSnapshot(); + }); + test('snapshot: inProgress, confirmStop (stopGrading callback)', () => { + el = render(statuses.inProgress); + el.setState({ showConfirmStopGrading: true }); + expect(el.instance().render()).toMatchSnapshot(); + }); + }); + describe('mapStateToProps', () => { + let mapped; + const testState = { some: 'test-state' }; + beforeEach(() => { + mapped = mapStateToProps(testState); + }); + test('gradingStatus loads from grading.selected.gradingStatus', () => { + expect(mapped.gradingStatus).toEqual(selectors.grading.selected.gradingStatus(testState)); + }); + }); + describe('mapDispatchToProps', () => { + it('loads startGrading from thunkActions.grading.stargGrading', () => { + expect(mapDispatchToProps.startGrading).toEqual(thunkActions.grading.startGrading); + }); + it('loads stopGrading from thunkActions.grading.stopGrading', () => { + expect(mapDispatchToProps.stopGrading).toEqual(thunkActions.grading.stopGrading); + }); + }); +}); diff --git a/src/containers/ReviewActions/components/StopGradingConfirmModal.jsx b/src/containers/ReviewActions/components/StopGradingConfirmModal.jsx new file mode 100644 index 0000000..3598b92 --- /dev/null +++ b/src/containers/ReviewActions/components/StopGradingConfirmModal.jsx @@ -0,0 +1,27 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +import ConfirmModal from 'components/ConfirmModal'; + +export const StopGradingConfirmModal = ({ + isOpen, + onCancel, + onConfirm, +}) => ( + +); +StopGradingConfirmModal.propTypes = { + isOpen: PropTypes.bool.isRequired, + onCancel: PropTypes.func.isRequired, + onConfirm: PropTypes.func.isRequired, +}; + +export default StopGradingConfirmModal; diff --git a/src/containers/ReviewActions/components/StopGradingConfirmModal.test.jsx b/src/containers/ReviewActions/components/StopGradingConfirmModal.test.jsx new file mode 100644 index 0000000..83b7ba7 --- /dev/null +++ b/src/containers/ReviewActions/components/StopGradingConfirmModal.test.jsx @@ -0,0 +1,19 @@ +import { shallow } from 'enzyme'; + +import { StopGradingConfirmModal } from './StopGradingConfirmModal'; + +jest.mock('components/ConfirmModal', () => 'ConfirmModal'); + +describe('StopGradingConfirmModal', () => { + const props = { + isOpen: false, + onCancel: jest.fn().mockName('this.props.onCancel'), + onConfirm: jest.fn().mockName('this.props.onConfirm'), + }; + test('snapshot: closed', () => { + expect(shallow()).toMatchSnapshot(); + }); + test('snapshot: open', () => { + expect(shallow()).toMatchSnapshot(); + }); +}); diff --git a/src/containers/ReviewModal/SubmissionNavigation.jsx b/src/containers/ReviewActions/components/SubmissionNavigation.jsx similarity index 92% rename from src/containers/ReviewModal/SubmissionNavigation.jsx rename to src/containers/ReviewActions/components/SubmissionNavigation.jsx index 3239a4d..8cbf6b7 100644 --- a/src/containers/ReviewModal/SubmissionNavigation.jsx +++ b/src/containers/ReviewActions/components/SubmissionNavigation.jsx @@ -40,26 +40,28 @@ export const SubmissionNavigation = ({ ); SubmissionNavigation.defaultProps = { + hasPrevSubmission: false, + hasNextSubmission: false, }; SubmissionNavigation.propTypes = { - hasPrevSubmission: PropTypes.bool.isRequired, - hasNextSubmission: PropTypes.bool.isRequired, - loadPrev: PropTypes.func.isRequired, - loadNext: PropTypes.func.isRequired, activeIndex: PropTypes.number.isRequired, + hasNextSubmission: PropTypes.bool, + hasPrevSubmission: PropTypes.bool, + loadNext: PropTypes.func.isRequired, + loadPrev: PropTypes.func.isRequired, selectionLength: PropTypes.number.isRequired, }; export const mapStateToProps = (state) => ({ - hasPrevSubmission: selectors.grading.prev.doesExist(state), - hasNextSubmission: selectors.grading.next.doesExist(state), activeIndex: selectors.grading.activeIndex(state), + hasNextSubmission: selectors.grading.next.doesExist(state), + hasPrevSubmission: selectors.grading.prev.doesExist(state), selectionLength: selectors.grading.selectionLength(state), }); export const mapDispatchToProps = { - loadPrev: thunkActions.grading.loadPrev, loadNext: thunkActions.grading.loadNext, + loadPrev: thunkActions.grading.loadPrev, }; export default connect(mapStateToProps, mapDispatchToProps)(SubmissionNavigation); diff --git a/src/containers/ReviewActions/components/SubmissionNavigation.test.jsx b/src/containers/ReviewActions/components/SubmissionNavigation.test.jsx new file mode 100644 index 0000000..bc9cadd --- /dev/null +++ b/src/containers/ReviewActions/components/SubmissionNavigation.test.jsx @@ -0,0 +1,86 @@ +import React from 'react'; +import { shallow } from 'enzyme'; + +import selectors from 'data/selectors'; +import thunkActions from 'data/thunkActions'; +import { gradingStatuses as statuses } from 'data/services/lms/constants'; + +import { + SubmissionNavigation, + mapStateToProps, + mapDispatchToProps, +} from './SubmissionNavigation'; + +jest.mock('@edx/paragon', () => ({ + Icon: () => 'Icon', + IconButton: () => 'IconButton', +})); +jest.mock('@edx/paragon/icons', () => ({ + ChevronLeft: 'ChevronLeft', + ChevronRight: 'ChevronRight', +})); +jest.mock('data/selectors', () => ({ + __esModule: true, + default: { + grading: { + prev: { + doesExist: (state) => ({ prevDoesExist: state }), + }, + next: { + doesExist: (state) => ({ nextDoesExist: state }), + }, + activeIndex: (state) => ({ activeIndex: state }), + selectionLength: (state) => ({ selectionlength: state }), + }, + }, +})); + +describe('SubmissionNavigation component', () => { + describe('component', () => { + const props = { + activeIndex: 4, + selectionLength: 5, + }; + beforeEach(() => { + props.loadNext = jest.fn().mockName('this.props.loadNext'); + props.loadPrev = jest.fn().mockName('this.props.loadPrev'); + }); + test('snapshot: no prev submission (disabled)', () => { + expect(shallow( + , + )).toMatchSnapshot(); + }); + test('snapshot: no next submission (disabled)', () => { + expect(shallow( + , + )).toMatchSnapshot(); + }); + }); + describe('mapStateToProps', () => { + let mapped; + const testState = { some: 'test-state' }; + beforeEach(() => { + mapped = mapStateToProps(testState); + }); + test('activeIndex loads from grading.activeIndex', () => { + expect(mapped.activeIndex).toEqual(selectors.grading.activeIndex(testState)); + }); + test('hasNextSubmission loads from grading.next.doesExist', () => { + expect(mapped.hasNextSubmission).toEqual(selectors.grading.next.doesExist(testState)); + }); + test('hasPrevSubmission loads from grading.prev.doesExist', () => { + expect(mapped.hasPrevSubmission).toEqual(selectors.grading.prev.doesExist(testState)); + }); + test('selectionLength loads from grading.selectionLength', () => { + expect(mapped.selectionLength).toEqual(selectors.grading.selectionLength(testState)); + }); + }); + describe('mapDispatchToProps', () => { + it('loads loadNext from thunkActions.grading.loadNext', () => { + expect(mapDispatchToProps.loadNext).toEqual(thunkActions.grading.loadNext); + }); + it('loads loadPrev from thunkActions.grading.loadPrev', () => { + expect(mapDispatchToProps.loadPrev).toEqual(thunkActions.grading.loadPrev); + }); + }); +}); diff --git a/src/containers/ReviewActions/components/__snapshots__/OverrideGradeConfirmModal.test.jsx.snap b/src/containers/ReviewActions/components/__snapshots__/OverrideGradeConfirmModal.test.jsx.snap new file mode 100644 index 0000000..a62f2f9 --- /dev/null +++ b/src/containers/ReviewActions/components/__snapshots__/OverrideGradeConfirmModal.test.jsx.snap @@ -0,0 +1,25 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`OverrideGradeConfirmModal snapshot: closed 1`] = ` + +`; + +exports[`OverrideGradeConfirmModal snapshot: open 1`] = ` + +`; diff --git a/src/containers/ReviewActions/components/__snapshots__/StartGradingButton.test.jsx.snap b/src/containers/ReviewActions/components/__snapshots__/StartGradingButton.test.jsx.snap new file mode 100644 index 0000000..28c3315 --- /dev/null +++ b/src/containers/ReviewActions/components/__snapshots__/StartGradingButton.test.jsx.snap @@ -0,0 +1,69 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`StartGradingButton component component snapshot: graded, confirmOverride (startGrading callback) 1`] = ` + + + + + +`; + +exports[`StartGradingButton component component snapshot: inProgress, confirmStop (stopGrading callback) 1`] = ` + + + + + +`; + +exports[`StartGradingButton component component snapshot: locked (null) 1`] = `""`; + +exports[`StartGradingButton component component snapshot: ungraded (startGrading callback) 1`] = ` + + + + + +`; diff --git a/src/containers/ReviewActions/components/__snapshots__/StopGradingConfirmModal.test.jsx.snap b/src/containers/ReviewActions/components/__snapshots__/StopGradingConfirmModal.test.jsx.snap new file mode 100644 index 0000000..4cd3a8a --- /dev/null +++ b/src/containers/ReviewActions/components/__snapshots__/StopGradingConfirmModal.test.jsx.snap @@ -0,0 +1,25 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`StopGradingConfirmModal snapshot: closed 1`] = ` + +`; + +exports[`StopGradingConfirmModal snapshot: open 1`] = ` + +`; diff --git a/src/containers/ReviewActions/components/__snapshots__/SubmissionNavigation.test.jsx.snap b/src/containers/ReviewActions/components/__snapshots__/SubmissionNavigation.test.jsx.snap new file mode 100644 index 0000000..af1c43c --- /dev/null +++ b/src/containers/ReviewActions/components/__snapshots__/SubmissionNavigation.test.jsx.snap @@ -0,0 +1,57 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`SubmissionNavigation component component snapshot: no next submission (disabled) 1`] = ` + + + + 5 + of + 5 + + + +`; + +exports[`SubmissionNavigation component component snapshot: no prev submission (disabled) 1`] = ` + + + + 1 + of + 5 + + + +`; diff --git a/src/containers/ReviewModal/ReviewActions.jsx b/src/containers/ReviewActions/index.jsx similarity index 91% rename from src/containers/ReviewModal/ReviewActions.jsx rename to src/containers/ReviewActions/index.jsx index de2317a..66ed1b0 100644 --- a/src/containers/ReviewModal/ReviewActions.jsx +++ b/src/containers/ReviewActions/index.jsx @@ -11,9 +11,8 @@ import actions from 'data/actions'; import selectors from 'data/selectors'; import StatusBadge from 'components/StatusBadge'; -import StartGradingButton from './StartGradingButton'; -import SubmissionNavigation from './SubmissionNavigation'; -import './ReviewModal.scss'; +import StartGradingButton from './components/StartGradingButton'; +import SubmissionNavigation from './components/SubmissionNavigation'; export const ReviewActions = ({ gradingStatus, diff --git a/src/containers/ReviewActions/index.test.jsx b/src/containers/ReviewActions/index.test.jsx new file mode 100644 index 0000000..37ac095 --- /dev/null +++ b/src/containers/ReviewActions/index.test.jsx @@ -0,0 +1,67 @@ +import React from 'react'; +import { shallow } from 'enzyme'; + +import actions from 'data/actions'; +import selectors from 'data/selectors'; + +import { ReviewActions, mapStateToProps, mapDispatchToProps } from '.'; + +jest.mock('@edx/paragon', () => ({ + ActionRow: () => 'ActionRow', + Button: () => 'Button', +})); +jest.mock('data/selectors', () => ({ + __esModule: true, + default: { + app: { showRubric: (state) => ({ showRubric: state }) }, + grading: { + selected: { + username: (state) => ({ username: state }), + gradingStatus: (state) => ({ gradingStatus: state }), + }, + }, + }, +})); +jest.mock('components/StatusBadge', () => 'StatusBadge'); +jest.mock('./components/StartGradingButton', () => 'StartGradingButton'); +jest.mock('./components/SubmissionNavigation', () => 'SubmissionNavigation'); + +describe('ReviewActions component', () => { + describe('component', () => { + const props = { + gradingStatus: 'grading-status', + username: 'test-username', + showRubric: false, + }; + beforeEach(() => { + props.toggleShowRubric = jest.fn().mockName('this.props.toggleShowRubric'); + }); + test('snapshot: do not show rubric', () => { + expect(shallow()).toMatchSnapshot(); + }); + test('snapshot: show rubric', () => { + expect(shallow()).toMatchSnapshot(); + }); + }); + describe('mapStateToProps', () => { + let mapped; + const testState = { some: 'test-state' }; + beforeEach(() => { + mapped = mapStateToProps(testState); + }); + test('username loads from grading.selected.username', () => { + expect(mapped.username).toEqual(selectors.grading.selected.username(testState)); + }); + test('gradingStatus loads from grading.selected.gradingStatus', () => { + expect(mapped.gradingStatus).toEqual(selectors.grading.selected.gradingStatus(testState)); + }); + test('showRubric loads from app.showRubric', () => { + expect(mapped.showRubric).toEqual(selectors.app.showRubric(testState)); + }); + }); + describe('mapDispatchToProps', () => { + it('loads toggleShowRubric from actions.app.toggleShowRubric', () => { + expect(mapDispatchToProps.toggleShowRubric).toEqual(actions.app.toggleShowRubric); + }); + }); +}); diff --git a/src/containers/ReviewModal/StartGradingButton.jsx b/src/containers/ReviewModal/StartGradingButton.jsx deleted file mode 100644 index 47e58e9..0000000 --- a/src/containers/ReviewModal/StartGradingButton.jsx +++ /dev/null @@ -1,66 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import { connect } from 'react-redux'; - -import { - Button, -} from '@edx/paragon'; -import { Cancel, Highlight } from '@edx/paragon/icons'; - -import actions from 'data/actions'; -import selectors from 'data/selectors'; -import thunkActions from 'data/thunkActions'; -import { gradingStatuses as statuses } from 'data/services/lms/constants'; - -const buttonArgs = { - [statuses.ungraded]: { - label: 'Start Grading', - iconAfter: Highlight, - }, - [statuses.graded]: { - label: 'Override grade', - iconAfter: Highlight, - }, - [statuses.inProgress]: { - label: 'Stop grading this response', - iconAfter: Cancel, - }, -}; - -export const StartGradingButton = ({ - gradingStatus, - startGrading, - stopGrading, -}) => { - if (gradingStatus === statuses.locked) { - return null; - } - const args = buttonArgs[gradingStatus]; - const onClick = ((gradingStatus === statuses.inProgress) ? stopGrading : startGrading); - return ( - - ); -}; -StartGradingButton.propTypes = { - gradingStatus: PropTypes.string.isRequired, - startGrading: PropTypes.func.isRequired, - stopGrading: PropTypes.func.isRequired, -}; - -export const mapStateToProps = (state) => ({ - gradingStatus: selectors.grading.selected.gradingStatus(state), -}); - -export const mapDispatchToProps = { - toggleShowRubric: actions.app.toggleShowRubric, - startGrading: thunkActions.grading.startGrading, - stopGrading: thunkActions.grading.stopGrading, -}; - -export default connect(mapStateToProps, mapDispatchToProps)(StartGradingButton); diff --git a/src/containers/ReviewModal/index.jsx b/src/containers/ReviewModal/index.jsx index 131231e..311c516 100644 --- a/src/containers/ReviewModal/index.jsx +++ b/src/containers/ReviewModal/index.jsx @@ -14,7 +14,7 @@ import actions from 'data/actions'; import ResponseDisplay from 'components/ResponseDisplay'; import Rubric from 'containers/Rubric'; -import ReviewActions from './ReviewActions'; +import ReviewActions from 'containers/ReviewActions'; import './ReviewModal.scss';