UNPKG

quiz-interactions

Version:

A React UI component Library for quiz interaction types.

270 lines (230 loc) 8.59 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); 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 _immutabilityHelper = _interopRequireDefault(require("immutability-helper")); var _findIndex = _interopRequireDefault(require("lodash/findIndex")); var _omit = _interopRequireDefault(require("lodash/omit")); var _without = _interopRequireDefault(require("lodash/without")); var _isString = _interopRequireDefault(require("lodash/isString")); var CategorizationPresenter = /*#__PURE__*/ function () { function CategorizationPresenter(props) { var _this = this; (0, _classCallCheck2.default)(this, CategorizationPresenter); this.onCategoryInputChange = function (itemId, e) { var categories = (0, _immutabilityHelper.default)(_this.props.interactionData.categories, (0, _defineProperty2.default)({}, itemId, { itemBody: { $set: e.target.value } })); _this.updateInteractionData({ categories: categories }); }; this.onCreateCategory = function () { var newItemId = _this.props.newId(); var newItem = { id: newItemId, itemBody: '' }; var newCategories = (0, _immutabilityHelper.default)(_this.props.interactionData.categories, (0, _defineProperty2.default)({}, newItemId, { $set: newItem })); var newCategoryOrder = (0, _immutabilityHelper.default)(_this.getCategoryOrder(), { $push: [newItemId] }); var newCategoryScoringData = { id: newItemId, scoringAlgorithm: 'AllOrNothing', scoringData: { value: [] } }; var interactionData = (0, _immutabilityHelper.default)(_this.props.interactionData, { categories: { $set: newCategories }, categoryOrder: { $set: newCategoryOrder } }); var scoringData = (0, _immutabilityHelper.default)(_this.props.scoringData, { value: { $push: [newCategoryScoringData] } }); _this.props.changeItemState({ interactionData: interactionData, scoringData: scoringData }); }; this.onRemoveCategory = function (categoryId) { var newCategories = (0, _omit.default)(_this.props.interactionData.categories, categoryId); var newCategoryOrder = _this.getCategoryOrder().filter(function (c) { return c !== categoryId; }); var newDistractors = (0, _omit.default)(_this.props.interactionData.distractors, _this.props.scoringData.value.filter(function (item) { return item.id === categoryId; })[0].scoringData.value); var newScoringData = _this.props.scoringData.value.filter(function (item) { return item.id !== categoryId; }); var interactionData = (0, _immutabilityHelper.default)(_this.props.interactionData, { categoryOrder: { $set: newCategoryOrder }, categories: { $set: newCategories }, distractors: { $set: newDistractors } }); var scoringData = (0, _immutabilityHelper.default)(_this.props.scoringData, { value: { $set: newScoringData } }); _this.props.changeItemState({ interactionData: interactionData, scoringData: scoringData }); }; this.onCreateAnswer = function (categoryId) { var newItemId = _this.props.newId(); var newItem = { id: newItemId, itemBody: '' }; var newDistractors = (0, _immutabilityHelper.default)(_this.props.interactionData.distractors, (0, _defineProperty2.default)({}, newItemId, { $set: newItem })); var scoringDataCategoryIndex = (0, _findIndex.default)(_this.props.scoringData.value, function (item) { return item.id === categoryId; }); var interactionData = (0, _immutabilityHelper.default)(_this.props.interactionData, { distractors: { $set: newDistractors } }); var scoringData = (0, _immutabilityHelper.default)(_this.props.scoringData, { value: (0, _defineProperty2.default)({}, scoringDataCategoryIndex, { scoringData: { value: { // because kinesis does not save empty arrays well, // we need to guard against this being null $apply: function $apply(answersList) { return (answersList || []).concat([newItemId]); } } } }) }); _this.props.changeItemState({ interactionData: interactionData, scoringData: scoringData }); }; this.onRemoveAnswer = function (itemId, categoryId) { var newDistractors = (0, _omit.default)(_this.props.interactionData.distractors, itemId); var scoringDataCategoryIndex = (0, _findIndex.default)(_this.props.scoringData.value, function (item) { return item.id === categoryId; }); var scoringDataCategory = _this.props.scoringData.value[scoringDataCategoryIndex]; var newCategScoringDataValues = (0, _without.default)(scoringDataCategory.scoringData.value, itemId); var interactionData = (0, _immutabilityHelper.default)(_this.props.interactionData, { distractors: { $set: newDistractors } }); var scoringData = (0, _immutabilityHelper.default)(_this.props.scoringData, { value: (0, _defineProperty2.default)({}, scoringDataCategoryIndex, { scoringData: { value: { $set: newCategScoringDataValues } } }) }); _this.props.changeItemState({ interactionData: interactionData, scoringData: scoringData }); }; this.onDistractorInputChange = function (itemId, e) { var distractors = (0, _immutabilityHelper.default)(_this.props.interactionData.distractors, (0, _defineProperty2.default)({}, itemId, { itemBody: { $set: e.target.value } })); _this.updateInteractionData({ distractors: distractors }); }; this.onRemoveDistractor = function (itemId) { var newList = (0, _omit.default)(_this.props.interactionData.distractors, itemId); var newInteractionData = (0, _immutabilityHelper.default)(_this.props.interactionData, { distractors: { $set: newList } }); _this.props.changeItemState({ interactionData: newInteractionData }); }; this.props = props; } (0, _createClass2.default)(CategorizationPresenter, [{ key: "componentWillReceiveProps", value: function componentWillReceiveProps(props) { this.props = props; } // ============= // HELPERS // ============= }, { key: "getNextItemIdFromArray", value: function getNextItemIdFromArray(itemId, items) { if (items.length > 1) { // the array can have objects or strings var indexCurrentItem = (0, _findIndex.default)(items, function (item) { return item.id === itemId || item === itemId; }); // get previous item if exists, else the next item var nextItem = items[indexCurrentItem - 1] || items[indexCurrentItem + 1]; if (nextItem.id) { // if nextItem is an object with an id return nextItem.id; } if ((0, _isString.default)(nextItem)) { // if nextItem a sting return nextItem; } } } }, { key: "getCategoryOrder", value: function getCategoryOrder() { // This is to protect against quizzes which were // created before categoryOrder was introduced var intData = this.props.interactionData; return intData.categoryOrder || Object.keys(intData.categories); } }, { key: "updateInteractionData", value: function updateInteractionData(updates) { this.props.changeItemState({ interactionData: Object.assign({}, this.props.interactionData || {}, updates) }); } // =========== // ACTIONS - CATEGORIES // =========== }]); return CategorizationPresenter; }(); exports.default = CategorizationPresenter;