UNPKG

quiz-interactions

Version:

A React UI component Library for quiz interaction types.

361 lines (310 loc) 14.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _uiFormField = require("@instructure/ui-form-field"); var _uiForms = require("@instructure/ui-forms"); var _quizNumberInput = _interopRequireDefault(require("@instructure/quiz-number-input")); var _uiA11y = require("@instructure/ui-a11y"); var _uiThemeable = require("@instructure/ui-themeable"); var _Errors = _interopRequireDefault(require("../../common/edit/components/Errors")); var _essay = _interopRequireDefault(require("../../../records/interactions/essay")); var _QuestionSettingsContainer = _interopRequireDefault(require("../../common/edit/components/QuestionSettingsContainer")); var _QuestionContainer = _interopRequireDefault(require("../../common/edit/components/QuestionContainer")); var _theme = _interopRequireDefault(require("./theme")); var _withEditTools = _interopRequireDefault(require("../../../util/withEditTools")); var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/lib/format-message")); var _QuestionSettingsPanel = _interopRequireDefault(require("../../common/edit/components/QuestionSettingsPanel")); var _CalculatorOptionWithOqaatAlert = _interopRequireDefault(require("../../common/edit/components/CalculatorOptionWithOqaatAlert")); var _dec, _class, _class2, _temp; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } var styles = { componentId: 'ctubK', template: function template(theme) { return "\n\n.ctubK_bgyh{display:flex;margin-bottom:0;margin-left:".concat(theme.wordLimitInputContainerMarginLeft || 'inherit', ";margin-top:").concat(theme.wordLimitInputsContainerMarginTop || 'inherit', "}\n\n.ctubK_eQqJ{padding-right:").concat(theme.wordLimitInputPadding || 'inherit', "}"); }, 'wordLimitInputsContainer': 'ctubK_bgyh', 'wordLimitInput': 'ctubK_eQqJ' }; var EssayEdit = ( /** --- category: Essay --- Essay Edit component ```jsx_example function Example (props) { const exampleProps = { itemBody: 'Please enter Question/Prompt...', interactionData: { rce: false, spellCheck: false, wordCount: false, wordLimitEnabled: false, wordLimitMax: '', wordLimitMin: '', notes: '' }, scoringData: { value: 'goths and food shortage' }, additionalOptions: [] } return ( <EssayEdit {...exampleProps} {...props} /> ) } <SettingsSwitcher locales={LOCALES}> <EditStateProvider> <Example /> </EditStateProvider> </SettingsSwitcher> ``` **/ _dec = (0, _uiThemeable.themeable)(_theme.default, styles), (0, _withEditTools.default)(_class = _dec(_class = (_temp = _class2 = /*#__PURE__*/ function (_Component) { (0, _inherits2.default)(EssayEdit, _Component); function EssayEdit(props) { var _this; (0, _classCallCheck2.default)(this, EssayEdit); _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(EssayEdit).call(this, props)); _this.handleCalculatorTypeChange = function (e, value) { _this.props.changeItemState({ calculatorType: value }); }; _this.handleCheckboxChange = function (event) { _this.mergeInteractionData((0, _defineProperty2.default)({}, event.target.value, !_this.props.interactionData[event.target.value])); }; _this.handleNotesChange = function (event) { _this.props.changeItemState({ scoringData: { value: event.target.value } }); }; _this.handleWordLimitMinChange = function (event, value, normalizedValue) { _this.setState({ wordLimitMin: value, normalizedWordLimitMin: normalizedValue }); }; _this.handleWordLimitMaxChange = function (event, value, normalizedValue) { _this.setState({ wordLimitMax: value, normalizedWordLimitMax: normalizedValue }); }; _this.handleWordLimitBlur = function (key, normalizedKey) { if (_this.state[normalizedKey] == null) { _this.mergeInteractionData((0, _defineProperty2.default)({}, key, null)); _this.setState((0, _defineProperty2.default)({}, key, null)); } else { var wordLimit = parseInt(_this.state[normalizedKey], 10) || 0; _this.mergeInteractionData((0, _defineProperty2.default)({}, key, wordLimit.toString())); _this.setState((0, _defineProperty2.default)({}, key, wordLimit)); } }; _this.handleWordLimitMinBlur = function () { _this.handleWordLimitBlur('wordLimitMin', 'normalizedWordLimitMin'); }; _this.handleWordLimitMaxBlur = function () { _this.handleWordLimitBlur('wordLimitMax', 'normalizedWordLimitMax'); }; _this.handleDescriptionChange = function (itemBody) { return _this.props.changeItemState({ itemBody: itemBody }); }; var _props$interactionDat = props.interactionData, wordLimitMin = _props$interactionDat.wordLimitMin, wordLimitMax = _props$interactionDat.wordLimitMax; _this.state = { wordLimitMin: wordLimitMin && Number(wordLimitMin), wordLimitMax: wordLimitMax && Number(wordLimitMax), normalizedWordLimitMin: wordLimitMin, normalizedWordLimitMax: wordLimitMax }; return _this; } // ============= // HELPERS // ============= (0, _createClass2.default)(EssayEdit, [{ key: "mergeInteractionData", value: function mergeInteractionData(intDataDiff) { this.props.changeItemState({ interactionData: Object.assign({}, this.props.interactionData, intDataDiff) }); } // ============= // HANDLERS // ============= }, { key: "renderGradingNotes", // ============= // RENDERING // ============= value: function renderGradingNotes() { return _react.default.createElement(_uiForms.TextArea, { disabled: this.props.overrideEditableForRegrading, label: _react.default.createElement(_uiA11y.ScreenReaderContent, null, (0, _formatMessage.default)('Grading Notes')), value: this.props.scoringData.value, onChange: this.handleNotesChange, autoGrow: this.context.disableTextAreaAutoGrow ? false : null }); } }, { key: "renderOptions", value: function renderOptions() { var description = _react.default.createElement(_uiA11y.ScreenReaderContent, null, (0, _formatMessage.default)('Essay options')); return _react.default.createElement(_uiFormField.FormFieldGroup, { rowSpacing: "small", description: description }, !this.props.hiddenOptions.calculator && _react.default.createElement(_CalculatorOptionWithOqaatAlert.default, { disabled: this.props.overrideEditableForRegrading, calculatorValue: this.props.calculatorType, onCalculatorTypeChange: this.handleCalculatorTypeChange, oqaatChecked: this.props.oneQuestionAtATime, onOqaatChange: this.props.setOneQuestionAtATime }), _react.default.createElement(_uiForms.Checkbox, { disabled: this.props.overrideEditableForRegrading, value: "rce", "data-automation": "sdk-essay-rce-checkbox", label: (0, _formatMessage.default)('Rich Content Editor'), onChange: this.handleCheckboxChange, checked: this.props.interactionData.rce }), _react.default.createElement(_uiForms.Checkbox, { disabled: this.props.overrideEditableForRegrading, value: "spellCheck", "data-automation": "sdk-essay-spellcheck-checkbox", label: (0, _formatMessage.default)('Spell-check'), onChange: this.handleCheckboxChange, checked: this.props.interactionData.spellCheck }), _react.default.createElement(_uiForms.Checkbox, { disabled: this.props.overrideEditableForRegrading, value: "wordCount", "data-automation": "sdk-essay-wordcount-checkbox", label: (0, _formatMessage.default)('Show Word Count'), onChange: this.handleCheckboxChange, checked: this.props.interactionData.wordCount }), _react.default.createElement(_uiForms.Checkbox, { disabled: this.props.overrideEditableForRegrading, value: "wordLimitEnabled", "data-automation": "sdk-essay-wordlimit-checkbox", label: (0, _formatMessage.default)('Set Word Limit'), onChange: this.handleCheckboxChange, checked: this.props.interactionData.wordLimitEnabled }), this.renderWordLimitInput()); } }, { key: "renderWordLimitInput", value: function renderWordLimitInput() { if (this.props.interactionData.wordLimitEnabled) { return _react.default.createElement(_Errors.default, { errorList: this.props.getErrors('interactionData.$errors') }, _react.default.createElement("div", { className: styles.wordLimitInputsContainer }, _react.default.createElement("div", { className: styles.wordLimitInput }, _react.default.createElement(_quizNumberInput.default, { disabled: this.props.overrideEditableForRegrading, min: "0", width: "8rem", label: (0, _formatMessage.default)('Minimum'), placeholder: (0, _formatMessage.default)('Limit'), value: this.state.wordLimitMin == null ? '' : this.state.wordLimitMin, onChange: this.handleWordLimitMinChange, onBlur: this.handleWordLimitMinBlur })), _react.default.createElement("div", { className: styles.wordLimitInput }, _react.default.createElement(_quizNumberInput.default, { disabled: this.props.overrideEditableForRegrading, min: "0", width: "8rem", label: (0, _formatMessage.default)('Maximum'), placeholder: (0, _formatMessage.default)('Limit'), value: this.state.wordLimitMax == null ? '' : this.state.wordLimitMax, onChange: this.handleWordLimitMaxChange, onBlur: this.handleWordLimitMaxBlur })))); } } }, { key: "renderQuestionConfigContainer", value: function renderQuestionConfigContainer() { return _react.default.createElement(_QuestionSettingsContainer.default, { additionalOptions: this.props.additionalOptions }, _react.default.createElement(_QuestionSettingsPanel.default, { label: (0, _formatMessage.default)('Options'), defaultExpanded: true }, this.renderOptions()), _react.default.createElement(_QuestionSettingsPanel.default, { label: (0, _formatMessage.default)('Grading Notes') }, this.renderGradingNotes())); } }, { key: "render", value: function render() { return _react.default.createElement("div", null, _react.default.createElement(_QuestionContainer.default, { disabled: this.props.overrideEditableForRegrading, enableRichContentEditor: this.props.enableRichContentEditor, itemBody: this.props.itemBody, onDescriptionChange: this.handleDescriptionChange, onModalClose: this.props.onModalClose, onModalOpen: this.props.onModalOpen, openImportModal: this.props.openImportModal, placeholder: (0, _formatMessage.default)('Enter Question/Prompt...'), renderImportModal: this.props.renderImportModal, stemErrors: this.props.getErrors('itemBody') }), this.renderQuestionConfigContainer()); } }]); EssayEdit.displayName = "EssayEdit"; return EssayEdit; }(_react.Component), _class2.interactionType = _essay.default, _class2.propTypes = _objectSpread({ additionalOptions: _propTypes.default.array, calculatorType: _propTypes.default.string, changeItemState: _propTypes.default.func.isRequired, enableRichContentEditor: _propTypes.default.bool, hiddenOptions: _propTypes.default.shape({ calculator: _propTypes.default.bool }), interactionData: _propTypes.default.object.isRequired, itemBody: _propTypes.default.string.isRequired, onModalClose: _propTypes.default.func, onModalOpen: _propTypes.default.func, oneQuestionAtATime: _propTypes.default.bool, openImportModal: _propTypes.default.func, overrideEditableForRegrading: _propTypes.default.bool, renderImportModal: _propTypes.default.func, scoringData: _propTypes.default.shape({ value: _propTypes.default.string.isRequired }).isRequired, setOneQuestionAtATime: _propTypes.default.func }, _withEditTools.default.injectedProps), _class2.defaultProps = { calculatorType: 'none', enableRichContentEditor: true, hiddenOptions: { calculator: true }, oneQuestionAtATime: false, overrideEditableForRegrading: false, additionalOptions: [], setOneQuestionAtATime: Function.prototype, onModalClose: void 0, onModalOpen: void 0, openImportModal: void 0, renderImportModal: void 0 }, _class2.contextTypes = { disableTextAreaAutoGrow: _propTypes.default.bool }, _temp)) || _class) || _class); exports.default = EssayEdit;