diff --git a/src/pages-and-resources/app-settings-modal/AppSettingsModal.jsx b/src/pages-and-resources/app-settings-modal/AppSettingsModal.jsx index 65426a8b9..22b6c339c 100644 --- a/src/pages-and-resources/app-settings-modal/AppSettingsModal.jsx +++ b/src/pages-and-resources/app-settings-modal/AppSettingsModal.jsx @@ -118,6 +118,7 @@ const AppSettingsModal = ({ enableAppHelp, learnMoreText, enableReinitialize, + hideAppToggle, }) => { const { courseId } = useContext(PagesAndResourcesContext); const loadingStatus = useSelector(getLoadingStatus); @@ -217,29 +218,31 @@ const AppSettingsModal = ({ {formikProps.errors.enabled?.message || intl.formatMessage(messages.errorSavingMessage)} )} - formikProps.handleChange(event)} - onBlur={formikProps.handleBlur} - checked={formikProps.values.enabled} - label={( -
- {enableAppLabel} - {formikProps.values.enabled && ( - - {intl.formatMessage(messages.enabled)} - - )} -
- )} - helpText={( -
-

{enableAppHelp}

- {learnMoreLink} -
- )} - /> + {!hideAppToggle && ( + formikProps.handleChange(event)} + onBlur={formikProps.handleBlur} + checked={formikProps.values.enabled} + label={( +
+ {enableAppLabel} + {formikProps.values.enabled && ( + + {intl.formatMessage(messages.enabled)} + + )} +
+ )} + helpText={( +
+

{enableAppHelp}

+ {learnMoreLink} +
+ )} + /> + )} {(formikProps.values.enabled || configureBeforeEnable) && children && } @@ -283,6 +286,7 @@ AppSettingsModal.propTypes = { learnMoreText: PropTypes.string.isRequired, configureBeforeEnable: PropTypes.bool, enableReinitialize: PropTypes.bool, + hideAppToggle: PropTypes.bool, }; AppSettingsModal.defaultProps = { @@ -292,6 +296,7 @@ AppSettingsModal.defaultProps = { validationSchema: {}, configureBeforeEnable: false, enableReinitialize: false, + hideAppToggle: false, }; export default injectIntl(AppSettingsModal); diff --git a/src/pages-and-resources/data/thunks.js b/src/pages-and-resources/data/thunks.js index b6fa27404..06b45459d 100644 --- a/src/pages-and-resources/data/thunks.js +++ b/src/pages-and-resources/data/thunks.js @@ -24,6 +24,7 @@ const COURSE_APPS_ORDER = [ 'live', 'textbooks', 'custom_pages', + 'ora_settings', ]; /* eslint-disable import/prefer-default-export */ diff --git a/src/pages-and-resources/ora_settings/Settings.jsx b/src/pages-and-resources/ora_settings/Settings.jsx new file mode 100644 index 000000000..4bfb3560a --- /dev/null +++ b/src/pages-and-resources/ora_settings/Settings.jsx @@ -0,0 +1,69 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import * as Yup from 'yup'; + +import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; + +import { Hyperlink } from '@edx/paragon'; +import { useModel } from '../../generic/model-store'; + +import FormSwitchGroup from '../../generic/FormSwitchGroup'; +import { useAppSetting } from '../../utils'; +import AppSettingsModal from '../app-settings-modal/AppSettingsModal'; +import messages from './messages'; + +const ORASettings = ({ intl, onClose }) => { + const appId = 'ora_settings'; + const appInfo = useModel('courseApps', appId); + const [enableFlexiblePeerGrade, saveSetting] = useAppSetting( + 'forceOnFlexiblePeerOpenassessments', + ); + const handleSettingsSave = (values) => saveSetting(values.enableFlexiblePeerGrade); + + const title = ( +
+

{intl.formatMessage(messages.heading)}

+
+ + {intl.formatMessage(messages.ORASettingsHelpLink)} + +
+
+ ); + + return ( + + {({ values, handleChange, handleBlur }) => ( + + )} + + ); +}; + +ORASettings.propTypes = { + intl: intlShape.isRequired, + onClose: PropTypes.func.isRequired, +}; + +export default injectIntl(ORASettings); diff --git a/src/pages-and-resources/ora_settings/Settings.test.jsx b/src/pages-and-resources/ora_settings/Settings.test.jsx new file mode 100644 index 000000000..86d8c0808 --- /dev/null +++ b/src/pages-and-resources/ora_settings/Settings.test.jsx @@ -0,0 +1,33 @@ +import { shallow } from 'enzyme'; +import ORASettings from './Settings'; + +jest.mock('@edx/frontend-platform/i18n', () => ({ + ...jest.requireActual('@edx/frontend-platform/i18n'), // use actual for all non-hook parts + injectIntl: (component) => component, + intlShape: {}, +})); +jest.mock('yup', () => ({ + boolean: jest.fn().mockReturnValue('Yub.boolean'), +})); +jest.mock('../../generic/model-store', () => ({ + useModel: jest.fn().mockReturnValue({ documentationLinks: { learnMoreConfiguration: 'https://learnmore.test' } }), +})); +jest.mock('../../generic/FormSwitchGroup', () => 'FormSwitchGroup'); +jest.mock('../../utils', () => ({ + useAppSetting: jest.fn().mockReturnValue(['abitrary value', jest.fn().mockName('saveSetting')]), +})); +jest.mock('../app-settings-modal/AppSettingsModal', () => 'AppSettingsModal'); + +const props = { + onClose: jest.fn().mockName('onClose'), + intl: { + formatMessage: (message) => message.defaultMessage, + }, +}; + +describe('ORASettings', () => { + it('should render', () => { + const wrapper = shallow(); + expect(wrapper).toMatchSnapshot(); + }); +}); diff --git a/src/pages-and-resources/ora_settings/__snapshots__/Settings.test.jsx.snap b/src/pages-and-resources/ora_settings/__snapshots__/Settings.test.jsx.snap new file mode 100644 index 000000000..00d14b3e9 --- /dev/null +++ b/src/pages-and-resources/ora_settings/__snapshots__/Settings.test.jsx.snap @@ -0,0 +1,41 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`ORASettings should render 1`] = ` + +

+ Configure open response assessment +

+
+ + Learn more about open response assessment settings + +
+ + } + validationSchema={ + Object { + "enableFlexiblePeerGrade": "Yub.boolean", + } + } +> + +
+`; diff --git a/src/pages-and-resources/ora_settings/messages.js b/src/pages-and-resources/ora_settings/messages.js new file mode 100644 index 000000000..7b05afa5d --- /dev/null +++ b/src/pages-and-resources/ora_settings/messages.js @@ -0,0 +1,22 @@ +import { defineMessages } from '@edx/frontend-platform/i18n'; + +const messages = defineMessages({ + heading: { + id: 'course-authoring.pages-resources.ora.heading', + defaultMessage: 'Configure open response assessment', + }, + ORASettingsHelpLink: { + id: 'course-authoring.pages-resources.ora.flex-peer-grading.link', + defaultMessage: 'Learn more about open response assessment settings', + }, + enableFlexPeerGradeLabel: { + id: 'course-authoring.pages-resources.ora.flex-peer-grading.label', + defaultMessage: 'Flex Peer Grading', + }, + enableFlexPeerGradeHelp: { + id: 'course-authoring.pages-resources.ora.flex-peer-grading.help', + defaultMessage: 'Turn on Flexible Peer Grading for all open response assessments in the course with peer grading.', + }, +}); + +export default messages;