UNPKG

@instructure/quiz-interactions

Version:

A React UI component Library for quiz interaction types.

192 lines (188 loc) • 8.24 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); 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 _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _uuid = require("uuid"); var _findIndex = _interopRequireDefault(require("lodash/findIndex")); var _instructureValidations = require("instructure-validations"); var _uiText = require("@instructure/ui-text"); var _InteractionType2 = _interopRequireDefault(require("../InteractionType")); var _interaction_slugs = require("../../interaction_slugs"); var _validationHelpers = require("../../util/validationHelpers"); var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message")); function _callSuper(_this, derived, args) { function isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { return !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (e) { return false; } } derived = (0, _getPrototypeOf2["default"])(derived); return (0, _possibleConstructorReturn2["default"])(_this, isNativeReflectConstruct() ? Reflect.construct(derived, args || [], (0, _getPrototypeOf2["default"])(_this).constructor) : derived.apply(_this, args)); } // ================ // ================ // HELPERS // ================ // ================ function newId() { return (0, _uuid.v4)(); } // ================ // ================ // VALIDATIONS // ================ // ================ function scoringDatumValidator(val) { var editDistanceRules = []; if (val.scoringAlgorithm === 'TextCloseEnough') { editDistanceRules = [(0, _instructureValidations.rule)('numeric', { message: (0, _formatMessage["default"])('Levenshtein Distance must be a number'), minMessage: (0, _formatMessage["default"])('Levenshtein Distance must be greater than zero'), maxMessage: (0, _formatMessage["default"])('Levenshtein Distance must be less than the length of the blank text'), requireInteger: true, integerMessage: (0, _formatMessage["default"])('Levenshtein Distance must be an integer'), min: 1, max: val.scoringData.blankText.length })]; } var textInChoicesRules = val.scoringAlgorithm === 'TextInChoices' ? // each is for multiple specified correct answers [(0, _instructureValidations.each)((0, _instructureValidations.rule)('presence', { message: (0, _validationHelpers.presenceMessage)((0, _formatMessage["default"])('Correct value')) })), (0, _instructureValidations.onSelf)((0, _instructureValidations.rule)('listSize', { minMessage: (0, _formatMessage["default"])('You must have an answer'), min: 1, allowNullOrUndefined: true }))] : [(0, _instructureValidations.onSelf)((0, _instructureValidations.rule)('presence', { message: (0, _validationHelpers.presenceMessage)((0, _formatMessage["default"])('Correct value')) }))]; return { scoringData: { editDistance: editDistanceRules, value: textInChoicesRules } }; } // ================ // ================ // RECORD // ================ // ================ var FillBlankInteractionType = exports["default"] = /*#__PURE__*/function (_InteractionType) { function FillBlankInteractionType(obj) { var _this2; (0, _classCallCheck2["default"])(this, FillBlankInteractionType); _this2 = _callSuper(this, FillBlankInteractionType); (0, _defineProperty2["default"])(_this2, "slug", _interaction_slugs.FILL_BLANK_SLUG); (0, _defineProperty2["default"])(_this2, "hideResultStem", true); (0, _defineProperty2["default"])(_this2, "translatedName", (0, _formatMessage["default"])('Fill in the Blank')); (0, _defineProperty2["default"])(_this2, "getDefaultScoringData", function () { return { value: [] }; }); (0, _defineProperty2["default"])(_this2, "getDefaultInteractionData", function () { return { stemItems: [{ id: newId(), type: 'text', value: '', position: 1 }], blanks: [] }; }); (0, _defineProperty2["default"])(_this2, "getRenderedResponse", function (responseValue) { var interactionData = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { stemItems: [], blanks: [] }; return /*#__PURE__*/_react["default"].createElement(_uiText.Text, { color: "primary" }, responseValue.map(function (value) { var blankPosition = (0, _findIndex["default"])(interactionData.blanks, function (blank) { return blank.id === value.id; }); var blank = blankPosition >= 0 && interactionData.blanks[blankPosition]; var valueText = ''; if (blank && blank.answerType === 'openEntry') { valueText = value.value; } else if (blank) { var blankChoice = blank.choices.find(function (choice) { return choice.id === value.value; }); valueText = blankChoice ? blankChoice.itemBody : ''; } return (0, _formatMessage["default"])('Blank {blankPosition, number}: {valueText}', { blankPosition: blankPosition >= 0 ? blankPosition + 1 : '', valueText: valueText }); }).join(', ')); }); (0, _get2["default"])((_this2, (0, _getPrototypeOf2["default"])(FillBlankInteractionType.prototype)), "initializeProps", _this2).call(_this2, obj); return _this2; } (0, _inherits2["default"])(FillBlankInteractionType, _InteractionType); return (0, _createClass2["default"])(FillBlankInteractionType, [{ key: "getDefaultUserResponse", value: function getDefaultUserResponse() { return { value: [] }; } }, { key: "hasResponse", value: function hasResponse(resp, intData) { var numBlanks = intData.blanks.length; var numWithResponse = resp.filter(function (blank) { return blank.value; }).length; return numBlanks === numWithResponse; } }], [{ key: "validations", value: function validations() { var eachBlankValidator = { choices: [(0, _instructureValidations.onSelf)((0, _instructureValidations.rule)('listSize', { minMessage: (0, _formatMessage["default"])('You must have more than one choice'), min: 2, allowNullOrUndefined: true })), (0, _instructureValidations.rule)('noDuplicates', { field: 'itemBody', message: (0, _validationHelpers.noDuplicatesMessage)((0, _formatMessage["default"])('Choice')) }), (0, _instructureValidations.each)({ itemBody: [(0, _instructureValidations.rule)('presence', { message: (0, _validationHelpers.presenceMessage)((0, _formatMessage["default"])('Choice')) })] })] }; var allBlanksValidator = (0, _instructureValidations.onSelf)((0, _instructureValidations.rule)('listSize', { minMessage: (0, _formatMessage["default"])('You must have a blank. e.g.: "Roses are `red`, violets are `blue`"'), min: 1 })); return { interactionData: { blanks: [allBlanksValidator, (0, _instructureValidations.each)(eachBlankValidator)] }, scoringData: { value: [(0, _instructureValidations.each)(scoringDatumValidator)] } }; } }]); }(_InteractionType2["default"]);