+
+
);
}
- // eslint-disable-next-line react/jsx-no-useless-fragment
- return (<>>);
+ return null;
};
return (
@@ -62,7 +82,7 @@ const SettingsWidget = ({
- {ProblemTypeKeys.NUMERIC === problemType
- && (
-
-
-
- )}
+
+ {problemType === ProblemTypeKeys.NUMERIC && (
+
+
+
+ )}
+
{!isLibrary && (
)}
+
+
{feedbackCard()}
+
@@ -117,6 +139,7 @@ const SettingsWidget = ({
+
{!isLibrary && (
@@ -131,14 +154,13 @@ const SettingsWidget = ({
{!isLibrary && (
)}
- {
- problemType === ProblemTypeKeys.ADVANCED && (
+ {problemType === ProblemTypeKeys.ADVANCED && (
- )
- }
+ )}
{!isLibrary && (
-
+
)}
- { showMarkdownEditorButton
- && (
-
-
-
+ {showMarkdownEditorButton && (
+
+
+
)}
@@ -169,63 +192,8 @@ const SettingsWidget = ({
};
SettingsWidget.propTypes = {
- answers: PropTypes.arrayOf(PropTypes.shape({
- correct: PropTypes.bool,
- id: PropTypes.string,
- selectedFeedback: PropTypes.string,
- title: PropTypes.string,
- unselectedFeedback: PropTypes.string,
- })).isRequired,
- groupFeedbackList: PropTypes.arrayOf(
- PropTypes.shape(
- {
- id: PropTypes.number,
- feedback: PropTypes.string,
- answers: PropTypes.arrayOf(PropTypes.string),
- },
- ),
- ).isRequired,
- blockTitle: PropTypes.string.isRequired,
- correctAnswerCount: PropTypes.number.isRequired,
problemType: PropTypes.string.isRequired,
- setBlockTitle: PropTypes.func.isRequired,
- updateAnswer: PropTypes.func.isRequired,
- updateField: PropTypes.func.isRequired,
- updateSettings: PropTypes.func.isRequired,
- defaultSettings: PropTypes.shape({
- maxAttempts: PropTypes.number,
- showanswer: PropTypes.string,
- showResetButton: PropTypes.bool,
- rerandomize: PropTypes.string,
- }).isRequired,
- images: PropTypes.shape({}).isRequired,
- learningContextId: PropTypes.string.isRequired,
- isLibrary: PropTypes.bool.isRequired,
- // eslint-disable-next-line
- settings: PropTypes.any.isRequired,
- showMarkdownEditorButton: PropTypes.bool.isRequired,
-};
-
-const mapStateToProps = (state) => ({
- groupFeedbackList: selectors.problem.groupFeedbackList(state),
- settings: selectors.problem.settings(state),
- answers: selectors.problem.answers(state),
- blockTitle: selectors.app.blockTitle(state),
- correctAnswerCount: selectors.problem.correctAnswerCount(state),
- defaultSettings: selectors.problem.defaultSettings(state),
- images: selectors.app.images(state),
- isLibrary: selectors.app.isLibrary(state),
- learningContextId: selectors.app.learningContextId(state),
- showMarkdownEditorButton: selectors.app.isMarkdownEditorEnabledForCourse(state)
- && selectors.problem.rawMarkdown(state),
-});
-
-export const mapDispatchToProps = {
- setBlockTitle: actions.app.setBlockTitle,
- updateSettings: actions.problem.updateSettings,
- updateField: actions.problem.updateField,
- updateAnswer: actions.problem.updateAnswer,
};
-export const SettingsWidgetInternal = SettingsWidget; // For testing only
-export default connect(mapStateToProps, mapDispatchToProps)(SettingsWidget);
+export const SettingsWidgetInternal = SettingsWidget; // For testing
+export default SettingsWidget;
diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/ScoringCard.jsx b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/ScoringCard.jsx
index 6b12e552a2..5ebaa97e5f 100644
--- a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/ScoringCard.jsx
+++ b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/ScoringCard.jsx
@@ -1,7 +1,7 @@
import React from 'react';
import isNil from 'lodash/isNil';
import PropTypes from 'prop-types';
-import { connect } from 'react-redux';
+import { useSelector } from 'react-redux';
import { FormattedMessage, useIntl } from '@edx/frontend-platform/i18n';
import { Form, Hyperlink } from '@openedx/paragon';
import { selectors } from '../../../../../../data/redux';
@@ -13,12 +13,13 @@ const ScoringCard = ({
scoring,
defaultValue,
updateSettings,
- // redux
- studioEndpointUrl,
- learningContextId,
- isLibrary,
}) => {
const intl = useIntl();
+
+ const studioEndpointUrl = useSelector(selectors.app.studioEndpointUrl);
+ const learningContextId = useSelector(selectors.app.learningContextId);
+ const isLibrary = useSelector(selectors.app.isLibrary);
+
const {
handleUnlimitedChange,
handleMaxAttemptChange,
@@ -92,27 +93,19 @@ const ScoringCard = ({
};
ScoringCard.propTypes = {
- // eslint-disable-next-line
- scoring: PropTypes.any.isRequired,
+ scoring: PropTypes.shape({
+ weight: PropTypes.number.isRequired,
+ attempts: PropTypes.shape({
+ number: PropTypes.number,
+ unlimited: PropTypes.bool.isRequired,
+ }).isRequired,
+ }).isRequired,
updateSettings: PropTypes.func.isRequired,
defaultValue: PropTypes.number,
- // redux
- studioEndpointUrl: PropTypes.string.isRequired,
- learningContextId: PropTypes.string,
- isLibrary: PropTypes.bool.isRequired,
};
ScoringCard.defaultProps = {
- learningContextId: null,
defaultValue: null,
};
-export const mapStateToProps = (state) => ({
- studioEndpointUrl: selectors.app.studioEndpointUrl(state),
- learningContextId: selectors.app.learningContextId(state),
- isLibrary: selectors.app.isLibrary(state),
-});
-
-export const mapDispatchToProps = {};
-
-export default connect(mapStateToProps, mapDispatchToProps)(ScoringCard);
+export default ScoringCard;
diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/ScoringCard.test.jsx b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/ScoringCard.test.jsx
index e5f632a392..61a127c13a 100644
--- a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/ScoringCard.test.jsx
+++ b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/ScoringCard.test.jsx
@@ -1,9 +1,10 @@
import React from 'react';
import {
- render, screen, initializeMocks, fireEvent,
+ screen, initializeMocks, fireEvent,
} from '@src/testUtils';
import ScoringCard from './ScoringCard';
import { selectors } from '../../../../../../data/redux';
+import { editorRender } from '../../../../../../editorTestRender';
const { app } = selectors;
@@ -24,33 +25,30 @@ describe('ScoringCard', () => {
};
beforeEach(() => {
- jest.spyOn(app, 'studioEndpointUrl').mockReturnValue('studioEndpointUrl');
- jest.spyOn(app, 'learningContextId').mockReturnValue('learningContextId');
- jest.spyOn(app, 'isLibrary').mockReturnValue(false);
initializeMocks();
});
test('render the component', () => {
- render(
);
+ editorRender(
);
expect(screen.getByText('Scoring')).toBeInTheDocument();
});
test('should not render advance settings link when isLibrary is true', () => {
jest.spyOn(app, 'isLibrary').mockReturnValue(true);
- render(
);
+ editorRender(
);
fireEvent.click(screen.getByText('Scoring'));
expect(screen.queryByText('Set a default value in advanced settings')).not.toBeInTheDocument();
});
test('should render advance settings link when isLibrary is false', () => {
jest.spyOn(app, 'isLibrary').mockReturnValue(false);
- render(
);
+ editorRender(
);
fireEvent.click(screen.getByText('Scoring'));
expect(screen.getByText('Set a default value in advanced settings')).toBeInTheDocument();
});
test('should call updateSettings when clicking points button', () => {
- render(
);
+ editorRender(
);
fireEvent.click(screen.getByText('Scoring'));
const pointsButton = screen.getByRole('spinbutton', { name: 'Points' });
expect(pointsButton).toBeInTheDocument();
@@ -61,7 +59,7 @@ describe('ScoringCard', () => {
test('should call updateSettings when clicking attempts button', () => {
const scoringUnlimited = { ...scoring, attempts: { unlimited: true, number: 0 } };
- render(
);
+ editorRender(
);
fireEvent.click(screen.getByText('Scoring'));
fireEvent.click(screen.getByText('Attempts'));
const attemptsButton = screen.getByRole('spinbutton', { name: 'Points' });
@@ -73,7 +71,7 @@ describe('ScoringCard', () => {
test('should display checked checkbox when unlimited is true', () => {
const scoringUnlimited = { ...scoring, attempts: { unlimited: true, number: 0 } };
- render(
);
+ editorRender(
);
fireEvent.click(screen.getByText('Scoring'));
const checkbox = screen.getByRole('checkbox', { name: 'Unlimited attempts' });
expect(checkbox).toBeChecked();
diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/ShowAnswerCard.jsx b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/ShowAnswerCard.jsx
index 414233d53f..34c805007c 100644
--- a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/ShowAnswerCard.jsx
+++ b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/ShowAnswerCard.jsx
@@ -1,7 +1,7 @@
import React from 'react';
import PropTypes from 'prop-types';
-import { connect } from 'react-redux';
-import { FormattedMessage, useIntl } from '@edx/frontend-platform/i18n';
+import { useSelector } from 'react-redux';
+import { injectIntl, FormattedMessage, intlShape } from '@edx/frontend-platform/i18n';
import { Form, Hyperlink } from '@openedx/paragon';
import SettingsOption from '../SettingsOption';
import { ShowAnswerTypes, ShowAnswerTypesKeys } from '../../../../../../data/constants/problem';
@@ -13,12 +13,12 @@ const ShowAnswerCard = ({
showAnswer,
updateSettings,
defaultValue,
- // redux
- studioEndpointUrl,
- learningContextId,
- isLibrary,
+ intl,
}) => {
- const intl = useIntl();
+ const studioEndpointUrl = useSelector(selectors.app.studioEndpointUrl);
+ const learningContextId = useSelector(selectors.app.learningContextId);
+ const isLibrary = useSelector(selectors.app.isLibrary);
+
const {
handleShowAnswerChange,
handleAttemptsChange,
@@ -50,7 +50,10 @@ const ShowAnswerCard = ({
{Object.values(ShowAnswerTypesKeys).map((answerType) => {
let optionDisplayName = ShowAnswerTypes[answerType];
if (answerType === defaultValue) {
- optionDisplayName = { ...optionDisplayName, defaultMessage: `${optionDisplayName.defaultMessage} (Default)` };
+ optionDisplayName = {
+ ...optionDisplayName,
+ defaultMessage: `${optionDisplayName.defaultMessage} (Default)`,
+ };
}
return (