quiz-interactions
Version:
A React UI component Library for quiz interaction types.
299 lines (256 loc) • 13 kB
JavaScript
"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 _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf3 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _react = _interopRequireWildcard(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _uiThemeable = require("@instructure/ui-themeable");
var _uiElements = require("@instructure/ui-elements");
var _ChoiceInput = _interopRequireDefault(require("../../../common/edit/components/ChoiceInput"));
var _AnswerInput = _interopRequireDefault(require("../../../common/edit/components/AnswerInput"));
var _RemoveChoiceButton = _interopRequireDefault(require("../../../common/edit/components/RemoveChoiceButton"));
var _Footer = _interopRequireDefault(require("../../../common/edit/components/Footer"));
var _theme = _interopRequireDefault(require("./theme"));
var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/lib/format-message"));
var _dec, _class, _class2, _temp;
var styles = {
componentId: 'fwNdm',
template: function template(theme) {
return "\n\n.fwNdm_kBjv{border-bottom:".concat(theme.borderWidth || 'inherit', " solid ").concat(theme.borderColor || 'inherit', ";padding-bottom:").concat(theme.categoriesWrapperPadding || 'inherit', "}\n\n.fwNdm_cIVb{display:flex;flex-flow:row wrap;padding-bottom:").concat(theme.categoriesContainerPadding || 'inherit', ";position:relative}\n\n.fwNdm_dEen{flex-basis:50%}\n\n.fwNdm_cghZ{padding-right:").concat(theme.categoryContainerWrapperPadding || 'inherit', "}\n\n.fwNdm_hiOc{border:").concat(theme.borderWidth || 'inherit', " solid ").concat(theme.borderColor || 'inherit', "}\n\n.fwNdm_dgyO{background-color:").concat(theme.categoryDescriptionBackground || 'inherit', ";padding:").concat(theme.categoryDescriptionInputPadding || 'inherit', "}\n\n.fwNdm_eThm{padding:").concat(theme.categoryBodyAnswersPadding || 'inherit', "}\n\n.fwNdm_dFuC{align-items:flex-start;display:flex;padding-top:").concat(theme.itemContainerPadding || 'inherit', "}\n\n.fwNdm_emOZ{align-items:center;display:flex;flex:1;padding:").concat(theme.itemContainerBodyPadding || 'inherit', "}\n\n.fwNdm_gaxB{display:flex}\n\n@media only screen and (max-width:48rem){.fwNdm_dEen{flex-basis:100%}}");
},
'categoriesWrapper': 'fwNdm_kBjv',
'categoriesContainer': 'fwNdm_cIVb',
'categoryContainer': 'fwNdm_dEen',
'categoryContainerWrapper': 'fwNdm_cghZ',
'categoryBody': 'fwNdm_hiOc',
'categoryBodyDescriptionInput': 'fwNdm_dgyO',
'categoryBodyAnswers': 'fwNdm_eThm',
'itemContainer': 'fwNdm_dFuC',
'itemContainerBody': 'fwNdm_emOZ',
'itemContainerActions': 'fwNdm_gaxB'
};
var CategoryForm = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _dec(_class = (_temp = _class2 =
/*#__PURE__*/
function (_Component) {
(0, _inherits2.default)(CategoryForm, _Component);
function CategoryForm() {
var _getPrototypeOf2;
var _this;
(0, _classCallCheck2.default)(this, CategoryForm);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = (0, _possibleConstructorReturn2.default)(this, (_getPrototypeOf2 = (0, _getPrototypeOf3.default)(CategoryForm)).call.apply(_getPrototypeOf2, [this].concat(args)));
_this.answerRefs = {};
_this.categoryRefs = {};
_this.categoryAnswerInputRefs = {};
_this._answerRemoveHandlers = {};
_this._categoryRemoveHandlers = {};
_this._createAnswerHandlers = {};
_this._isMounted = false;
_this.getCreateAnswerHandler = function (categoryId) {
var createAnswerHandler = _this._createAnswerHandlers[categoryId];
if (createAnswerHandler) return createAnswerHandler;
createAnswerHandler = _this.props.onCreateAnswer.bind((0, _assertThisInitialized2.default)(_this), categoryId);
_this._createAnswerHandlers[categoryId] = createAnswerHandler;
return createAnswerHandler;
};
_this.getAnswerRemoveHandler = function (answerId, categoryId) {
var answerRemoveHandler = _this._answerRemoveHandlers[categoryId];
if (answerRemoveHandler) return answerRemoveHandler;
answerRemoveHandler = _this.props.onRemoveAnswer.bind((0, _assertThisInitialized2.default)(_this), answerId, categoryId);
_this._answerRemoveHandlers[answerId] = answerRemoveHandler;
return answerRemoveHandler;
};
_this.getCategoryRemoveHandler = function (categoryId) {
var categoryRemoveHandler = _this._categoryRemoveHandlers[categoryId];
if (categoryRemoveHandler) return categoryRemoveHandler;
categoryRemoveHandler = _this.props.onRemoveCategory.bind((0, _assertThisInitialized2.default)(_this), categoryId);
_this._categoryRemoveHandlers[categoryId] = categoryRemoveHandler;
return categoryRemoveHandler;
};
_this.handleFooterRef = function (node) {
_this.footerRef = node;
};
_this.renderRemoveButton = function (category, index) {
var onRemoveCategory = _this.getCategoryRemoveHandler(category.id);
var singleCategory = _this.props.sortedCategories.length === 1;
if (!singleCategory && !_this.props.disabled) {
return _react.default.createElement(_RemoveChoiceButton.default, {
choiceId: category.id,
screenReaderText: (0, _formatMessage.default)('Remove Category {index}: {category}', {
index: index,
category: category.itemBody
}),
onRemoveChoice: onRemoveCategory
});
}
};
_this.renderCategory = function (category, index, focusOnMount) {
var onCreateAnswer = _this.getCreateAnswerHandler(category.id);
var categoryAnswerInputRefs = function categoryAnswerInputRefs(node) {
_this.categoryAnswerInputRefs[category.id] = node;
};
var categoryRef = function categoryRef(node) {
_this.categoryRefs[category.id] = node;
};
return _react.default.createElement("div", {
key: category.id,
className: styles.categoryContainer
}, _react.default.createElement("div", {
className: styles.categoryContainerWrapper
}, _react.default.createElement("div", {
className: styles.itemContainer
}, _react.default.createElement("div", {
className: styles.itemContainerBody
}, _react.default.createElement(_uiElements.Text, {
color: "primary"
}, (0, _formatMessage.default)('Category {position, number}', {
position: index + 1
}))), _this.renderRemoveButton(category, index + 1)), _react.default.createElement("div", {
className: styles.categoryBody
}, _react.default.createElement("div", {
className: styles.categoryBodyDescriptionInput
}, _react.default.createElement(_AnswerInput.default, {
ref: categoryAnswerInputRefs,
disabled: _this.props.disabled,
onChangeHandler: _this.props.onCategoryInputChange,
onModalClose: _this.props.onModalClose,
onModalOpen: _this.props.onModalOpen,
id: category.id,
itemBody: category.itemBody,
errors: _this.props.getCategoryErrors(category.id),
placeholder: (0, _formatMessage.default)('Type a category description'),
screenReaderText: (0, _formatMessage.default)('Category Description'),
focusOnMount: focusOnMount && _this._isMounted,
noRCE: true
})), _react.default.createElement("div", {
className: styles.categoryBodyAnswers
}, _this.props.categoryScoringData(category.id).map(function (answerId, index, source) {
var answer = _this.props.distractors[answerId];
var focusOnMount = index + 1 === source.length && !answer.itemBody;
return _this.renderAnswer(answer, category.id, focusOnMount);
})), !_this.props.disabled && _react.default.createElement(_Footer.default, {
onCreateChoice: onCreateAnswer,
ref: categoryRef,
screenReaderText: (0, _formatMessage.default)('Add answer to category {position, number}', {
position: index + 1
})
}))));
};
return _this;
}
(0, _createClass2.default)(CategoryForm, [{
key: "componentDidMount",
value: function componentDidMount() {
// focusOnMount is conditional on this component being mounted so that focus
// is not stolen on initial render when creating a new categorization question
this._isMounted = true;
}
}, {
key: "componentWillReceiveProps",
value: function componentWillReceiveProps(nextProps) {
if (this.props.onCreateAnswer !== nextProps.onCreateAnswer) {
this._createAnswerHandlers = {};
}
if (this.props.onRemoveAnswer !== nextProps.onRemoveAnswer) {
this._answerRemoveHandlers = {};
}
if (this.props.onRemoveCategory !== nextProps.onRemoveCategory) {
this._categoryRemoveHandlers = {};
}
}
}, {
key: "renderAnswer",
// ===========
// RENDER
// ===========
value: function renderAnswer(answer, categoryId, focusOnMount) {
var _this2 = this;
var onRemoveAnswer = this.getAnswerRemoveHandler(answer.id, categoryId);
return _react.default.createElement(_ChoiceInput.default, {
key: "answerInput".concat(answer.id) // eslint-disable-line react/jsx-no-literals
,
ref: function ref(node) {
_this2.answerRefs[answer.id] = node;
},
disabledFields: this.props.disabled ? ['answerInput'] : [],
id: answer.id,
itemBody: answer.itemBody,
errors: this.props.distractorErrors(answer.id),
onInputChange: this.props.onDistractorInputChange,
onModalClose: this.props.onModalClose,
onModalOpen: this.props.onModalOpen,
onRemoveChoice: onRemoveAnswer,
shouldRenderRemoveChoice: !this.props.disabled,
focusOnMount: focusOnMount && this._isMounted,
noRCE: true,
notifyScreenreader: this.props.notifyScreenreader
});
}
}, {
key: "render",
value: function render() {
var _this3 = this;
return _react.default.createElement("div", {
className: styles.categoriesWrapper
}, _react.default.createElement("div", {
className: styles.categoriesContainer
}, this.props.sortedCategories.map(function (category, index, source) {
var focusOnMount = index + 1 === source.length && !category.itemBody;
return _this3.renderCategory(category, index, focusOnMount);
})), !this.props.disabled && _react.default.createElement(_Footer.default, {
ref: this.handleFooterRef,
onCreateChoice: this.props.onCreateCategory,
buttonText: (0, _formatMessage.default)('Category'),
screenReaderText: (0, _formatMessage.default)('Add Category')
}));
}
}]);
CategoryForm.displayName = "CategoryForm";
return CategoryForm;
}(_react.Component), _class2.propTypes = {
getCategoryErrors: _propTypes.default.func,
categoryScoringData: _propTypes.default.func,
disabled: _propTypes.default.bool,
distractors: _propTypes.default.objectOf(_propTypes.default.shape({
itemBody: _propTypes.default.string.isRequired
})).isRequired,
distractorErrors: _propTypes.default.func,
notifyScreenreader: _propTypes.default.func.isRequired,
onCategoryInputChange: _propTypes.default.func,
onCreateAnswer: _propTypes.default.func,
onCreateCategory: _propTypes.default.func,
onDistractorInputChange: _propTypes.default.func,
onModalClose: _propTypes.default.func,
onModalOpen: _propTypes.default.func,
onRemoveAnswer: _propTypes.default.func,
onRemoveCategory: _propTypes.default.func,
sortedCategories: _propTypes.default.arrayOf(_propTypes.default.shape({
id: _propTypes.default.string.isRequired,
itemBody: _propTypes.default.string
})).isRequired
}, _class2.defaultProps = {
getCategoryErrors: void 0,
categoryScoringData: void 0,
disabled: void 0,
distractorErrors: void 0,
onCategoryInputChange: void 0,
onCreateAnswer: void 0,
onCreateCategory: void 0,
onDistractorInputChange: void 0,
onModalClose: void 0,
onModalOpen: void 0,
onRemoveAnswer: void 0,
onRemoveCategory: void 0
}, _temp)) || _class);
exports.default = CategoryForm;