quiz-interactions
Version:
A React UI component Library for quiz interaction types.
270 lines (230 loc) • 8.59 kB
JavaScript
;
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;