@pie-element/drag-in-the-blank 3.10.2 → 3.10.3-next.1008
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +172 -0
- package/configure/CHANGELOG.md +120 -0
- package/configure/lib/choice.js +1 -1
- package/configure/lib/choice.js.map +1 -1
- package/configure/lib/choices.js +45 -23
- package/configure/lib/choices.js.map +1 -1
- package/configure/lib/defaults.js +18 -2
- package/configure/lib/defaults.js.map +1 -1
- package/configure/lib/index.js +3 -3
- package/configure/lib/main.js +107 -16
- package/configure/lib/main.js.map +1 -1
- package/configure/lib/markupUtils.js +9 -3
- package/configure/lib/markupUtils.js.map +1 -1
- package/configure/package.json +4 -4
- package/configure/utils.js +14 -0
- package/controller/CHANGELOG.md +16 -0
- package/controller/lib/index.js +35 -3
- package/controller/lib/index.js.map +1 -1
- package/controller/lib/utils.js +1 -1
- package/controller/lib/utils.js.map +1 -1
- package/controller/package.json +1 -1
- package/docs/config-schema.json +94 -0
- package/docs/config-schema.json.md +73 -1
- package/docs/demo/generate.js +2 -1
- package/docs/pie-schema.json +43 -0
- package/docs/pie-schema.json.md +35 -0
- package/lib/index.js +6 -2
- package/lib/index.js.map +1 -1
- package/lib/main.js +14 -28
- package/lib/main.js.map +1 -1
- package/package.json +6 -6
- package/module/configure.js +0 -1393
- package/module/controller.js +0 -21609
- package/module/demo.js +0 -65
- package/module/element.js +0 -218
- package/module/index.html +0 -16
- package/module/manifest.json +0 -10
package/configure/lib/index.js
CHANGED
|
@@ -39,13 +39,13 @@ var _defaults2 = _interopRequireDefault(require("./defaults"));
|
|
|
39
39
|
|
|
40
40
|
var _markupUtils = require("./markupUtils");
|
|
41
41
|
|
|
42
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object);
|
|
42
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
43
43
|
|
|
44
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]
|
|
44
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
45
45
|
|
|
46
46
|
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
|
|
47
47
|
|
|
48
|
-
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try {
|
|
48
|
+
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
49
49
|
|
|
50
50
|
var log = (0, _debug["default"])('multiple-choice:configure');
|
|
51
51
|
|
package/configure/lib/main.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
|
|
4
|
-
|
|
5
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
6
4
|
|
|
5
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
6
|
+
|
|
7
7
|
Object.defineProperty(exports, "__esModule", {
|
|
8
8
|
value: true
|
|
9
9
|
});
|
|
@@ -41,17 +41,27 @@ var _styles = require("@material-ui/core/styles");
|
|
|
41
41
|
|
|
42
42
|
var _Typography = _interopRequireDefault(require("@material-ui/core/Typography"));
|
|
43
43
|
|
|
44
|
+
var _Info = _interopRequireDefault(require("@material-ui/icons/Info"));
|
|
45
|
+
|
|
46
|
+
var _Tooltip = _interopRequireDefault(require("@material-ui/core/Tooltip"));
|
|
47
|
+
|
|
44
48
|
var _choices = _interopRequireDefault(require("./choices"));
|
|
45
49
|
|
|
46
50
|
var _markupUtils = require("./markupUtils");
|
|
47
51
|
|
|
48
|
-
|
|
52
|
+
var _utils = require("../utils");
|
|
53
|
+
|
|
54
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
55
|
+
|
|
56
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
49
57
|
|
|
50
|
-
function
|
|
58
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
59
|
+
|
|
60
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
51
61
|
|
|
52
62
|
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
|
|
53
63
|
|
|
54
|
-
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try {
|
|
64
|
+
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
55
65
|
|
|
56
66
|
var dropdown = _configUi.settings.dropdown,
|
|
57
67
|
toggle = _configUi.settings.toggle,
|
|
@@ -95,6 +105,20 @@ var styles = function styles(theme) {
|
|
|
95
105
|
fontSize: '16px',
|
|
96
106
|
lineHeight: '19px',
|
|
97
107
|
color: '#495B8F'
|
|
108
|
+
},
|
|
109
|
+
tooltip: {
|
|
110
|
+
fontSize: '12px',
|
|
111
|
+
whiteSpace: 'pre',
|
|
112
|
+
maxWidth: '500px'
|
|
113
|
+
},
|
|
114
|
+
errorText: {
|
|
115
|
+
fontSize: '12px',
|
|
116
|
+
color: 'red',
|
|
117
|
+
padding: '5px 0'
|
|
118
|
+
},
|
|
119
|
+
flexContainer: {
|
|
120
|
+
display: 'flex',
|
|
121
|
+
alignItems: 'end'
|
|
98
122
|
}
|
|
99
123
|
};
|
|
100
124
|
};
|
|
@@ -163,7 +187,8 @@ var Main = /*#__PURE__*/function (_React$Component) {
|
|
|
163
187
|
}, {
|
|
164
188
|
key: "render",
|
|
165
189
|
value: function render() {
|
|
166
|
-
var _this2 = this
|
|
190
|
+
var _this2 = this,
|
|
191
|
+
_React$createElement;
|
|
167
192
|
|
|
168
193
|
var _this$props = this.props,
|
|
169
194
|
classes = _this$props.classes,
|
|
@@ -186,12 +211,42 @@ var Main = /*#__PURE__*/function (_React$Component) {
|
|
|
186
211
|
_ref$teacherInstructi = _ref.teacherInstructions,
|
|
187
212
|
teacherInstructions = _ref$teacherInstructi === void 0 ? {} : _ref$teacherInstructi,
|
|
188
213
|
_ref$choicesPosition = _ref.choicesPosition,
|
|
189
|
-
choicesPosition = _ref$choicesPosition === void 0 ? {} : _ref$choicesPosition
|
|
214
|
+
choicesPosition = _ref$choicesPosition === void 0 ? {} : _ref$choicesPosition,
|
|
215
|
+
_ref$spellCheck = _ref.spellCheck,
|
|
216
|
+
spellCheck = _ref$spellCheck === void 0 ? {} : _ref$spellCheck,
|
|
217
|
+
maxChoices = _ref.maxChoices,
|
|
218
|
+
maxResponseAreas = _ref.maxResponseAreas,
|
|
219
|
+
_ref$maxImageWidth = _ref.maxImageWidth,
|
|
220
|
+
maxImageWidth = _ref$maxImageWidth === void 0 ? {} : _ref$maxImageWidth,
|
|
221
|
+
_ref$maxImageHeight = _ref.maxImageHeight,
|
|
222
|
+
maxImageHeight = _ref$maxImageHeight === void 0 ? {} : _ref$maxImageHeight;
|
|
190
223
|
|
|
191
224
|
var _ref2 = model || {},
|
|
192
225
|
rationaleEnabled = _ref2.rationaleEnabled,
|
|
193
226
|
promptEnabled = _ref2.promptEnabled,
|
|
194
|
-
teacherInstructionsEnabled = _ref2.teacherInstructionsEnabled
|
|
227
|
+
teacherInstructionsEnabled = _ref2.teacherInstructionsEnabled,
|
|
228
|
+
spellCheckEnabled = _ref2.spellCheckEnabled,
|
|
229
|
+
errors = _ref2.errors;
|
|
230
|
+
|
|
231
|
+
var toolbarOpts = {};
|
|
232
|
+
|
|
233
|
+
var _ref3 = errors || {},
|
|
234
|
+
responseAreasError = _ref3.responseAreasError,
|
|
235
|
+
choicesError = _ref3.choicesError;
|
|
236
|
+
|
|
237
|
+
var validationMessage = (0, _utils.generateValidationMessage)(configuration);
|
|
238
|
+
var defaultImageMaxWidth = maxImageWidth && maxImageWidth.prompt;
|
|
239
|
+
var defaultImageMaxHeight = maxImageHeight && maxImageHeight.prompt;
|
|
240
|
+
|
|
241
|
+
switch (model.toolbarEditorPosition) {
|
|
242
|
+
case 'top':
|
|
243
|
+
toolbarOpts.position = 'top';
|
|
244
|
+
break;
|
|
245
|
+
|
|
246
|
+
default:
|
|
247
|
+
toolbarOpts.position = 'bottom';
|
|
248
|
+
break;
|
|
249
|
+
}
|
|
195
250
|
|
|
196
251
|
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
197
252
|
className: classes.design
|
|
@@ -215,6 +270,7 @@ var Main = /*#__PURE__*/function (_React$Component) {
|
|
|
215
270
|
Properties: {
|
|
216
271
|
teacherInstructionsEnabled: teacherInstructions.settings && toggle(teacherInstructions.label),
|
|
217
272
|
rationaleEnabled: rationale.settings && toggle(rationale.label),
|
|
273
|
+
spellCheckEnabled: spellCheck.settings && toggle(spellCheck.label),
|
|
218
274
|
promptEnabled: prompt.settings && toggle(prompt.label)
|
|
219
275
|
}
|
|
220
276
|
}
|
|
@@ -227,7 +283,11 @@ var Main = /*#__PURE__*/function (_React$Component) {
|
|
|
227
283
|
markup: model.teacherInstructions || '',
|
|
228
284
|
onChange: this.onTeacherInstructionsChanged,
|
|
229
285
|
imageSupport: imageSupport,
|
|
230
|
-
nonEmpty: false
|
|
286
|
+
nonEmpty: false,
|
|
287
|
+
toolbarOpts: toolbarOpts,
|
|
288
|
+
spellCheck: spellCheckEnabled,
|
|
289
|
+
maxImageWidth: maxImageWidth && maxImageWidth.teacherInstructions || defaultImageMaxWidth,
|
|
290
|
+
maxImageHeight: maxImageHeight && maxImageHeight.teacherInstructions || defaultImageMaxHeight
|
|
231
291
|
})), promptEnabled && /*#__PURE__*/_react["default"].createElement(_configUi.InputContainer, {
|
|
232
292
|
label: prompt.label,
|
|
233
293
|
className: classes.promptHolder
|
|
@@ -237,10 +297,34 @@ var Main = /*#__PURE__*/function (_React$Component) {
|
|
|
237
297
|
onChange: this.onPromptChanged,
|
|
238
298
|
imageSupport: imageSupport,
|
|
239
299
|
nonEmpty: false,
|
|
240
|
-
disableUnderline: true
|
|
241
|
-
|
|
300
|
+
disableUnderline: true,
|
|
301
|
+
toolbarOpts: toolbarOpts,
|
|
302
|
+
spellCheck: spellCheckEnabled,
|
|
303
|
+
maxImageWidth: defaultImageMaxWidth,
|
|
304
|
+
maxImageHeight: defaultImageMaxHeight
|
|
305
|
+
})), /*#__PURE__*/_react["default"].createElement("div", {
|
|
306
|
+
className: classes.flexContainer
|
|
307
|
+
}, /*#__PURE__*/_react["default"].createElement(_Typography["default"], {
|
|
242
308
|
className: classes.text
|
|
243
|
-
}, "Define Template, Choices, and Correct Responses"), /*#__PURE__*/_react["default"].createElement(
|
|
309
|
+
}, "Define Template, Choices, and Correct Responses"), /*#__PURE__*/_react["default"].createElement(_Tooltip["default"], {
|
|
310
|
+
classes: {
|
|
311
|
+
tooltip: classes.tooltip
|
|
312
|
+
},
|
|
313
|
+
disableFocusListener: true,
|
|
314
|
+
disableTouchListener: true,
|
|
315
|
+
placement: 'right',
|
|
316
|
+
title: validationMessage
|
|
317
|
+
}, /*#__PURE__*/_react["default"].createElement(_Info["default"], {
|
|
318
|
+
fontSize: 'small',
|
|
319
|
+
color: 'primary',
|
|
320
|
+
style: {
|
|
321
|
+
marginLeft: '5px'
|
|
322
|
+
}
|
|
323
|
+
}))), responseAreasError && /*#__PURE__*/_react["default"].createElement("div", {
|
|
324
|
+
className: classes.errorText
|
|
325
|
+
}, responseAreasError), choicesError && /*#__PURE__*/_react["default"].createElement("div", {
|
|
326
|
+
className: classes.errorText
|
|
327
|
+
}, choicesError), /*#__PURE__*/_react["default"].createElement(_editableHtml["default"], (_React$createElement = {
|
|
244
328
|
activePlugins: _editableHtml.ALL_PLUGINS,
|
|
245
329
|
toolbarOpts: {
|
|
246
330
|
position: 'top'
|
|
@@ -249,7 +333,8 @@ var Main = /*#__PURE__*/function (_React$Component) {
|
|
|
249
333
|
type: 'drag-in-the-blank',
|
|
250
334
|
options: {
|
|
251
335
|
duplicates: model.duplicates
|
|
252
|
-
}
|
|
336
|
+
},
|
|
337
|
+
maxResponseAreas: maxResponseAreas
|
|
253
338
|
},
|
|
254
339
|
className: classes.markup,
|
|
255
340
|
markup: model.slateMarkup,
|
|
@@ -265,10 +350,12 @@ var Main = /*#__PURE__*/function (_React$Component) {
|
|
|
265
350
|
disabled: true
|
|
266
351
|
}
|
|
267
352
|
}
|
|
268
|
-
}), /*#__PURE__*/_react["default"].createElement(_choices["default"], {
|
|
353
|
+
}, (0, _defineProperty2["default"])(_React$createElement, "toolbarOpts", toolbarOpts), (0, _defineProperty2["default"])(_React$createElement, "spellCheck", spellCheckEnabled), _React$createElement)), /*#__PURE__*/_react["default"].createElement(_choices["default"], {
|
|
269
354
|
model: model,
|
|
270
355
|
duplicates: model.duplicates,
|
|
271
|
-
onChange: this.onResponsesChanged
|
|
356
|
+
onChange: this.onResponsesChanged,
|
|
357
|
+
toolbarOpts: toolbarOpts,
|
|
358
|
+
maxChoices: maxChoices
|
|
272
359
|
}), rationaleEnabled && /*#__PURE__*/_react["default"].createElement(_configUi.InputContainer, {
|
|
273
360
|
label: rationale.label,
|
|
274
361
|
className: classes.promptHolder
|
|
@@ -276,7 +363,11 @@ var Main = /*#__PURE__*/function (_React$Component) {
|
|
|
276
363
|
className: classes.prompt,
|
|
277
364
|
markup: model.rationale || '',
|
|
278
365
|
onChange: this.onRationaleChanged,
|
|
279
|
-
imageSupport: imageSupport
|
|
366
|
+
imageSupport: imageSupport,
|
|
367
|
+
toolbarOpts: toolbarOpts,
|
|
368
|
+
spellCheck: spellCheckEnabled,
|
|
369
|
+
maxImageWidth: maxImageWidth && maxImageWidth.rationale || defaultImageMaxWidth,
|
|
370
|
+
maxImageHeight: maxImageHeight && maxImageHeight.rationale || defaultImageMaxHeight
|
|
280
371
|
})))));
|
|
281
372
|
}
|
|
282
373
|
}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/main.jsx"],"names":["dropdown","settings","toggle","Panel","styles","theme","promptHolder","width","paddingBottom","spacing","unit","marginBottom","prompt","paddingTop","markup","minHeight","design","choiceConfiguration","switchElement","justifyContent","margin","addButton","text","fontFamily","fontSize","lineHeight","color","Main","newVal","props","onModelChanged","model","rationale","teacherInstructions","slateMarkup","choices","correctResponse","domNode","ReactDOM","findDOMNode","classes","configuration","onConfigurationChanged","imageSupport","duplicates","partialScoring","lockChoiceOrder","choicesPosition","rationaleEnabled","promptEnabled","teacherInstructionsEnabled","onModelChange","Settings","label","Properties","onTeacherInstructionsChanged","onPromptChanged","ALL_PLUGINS","position","type","options","onMarkupChanged","audio","disabled","video","onResponsesChanged","onRationaleChanged","React","Component","PropTypes","object","isRequired","disableSidePanel","bool","func","shape","add","Styled"],"mappings":"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","sourcesContent":["import React from 'react';\nimport ReactDOM from 'react-dom';\nimport PropTypes from 'prop-types';\nimport EditableHtml, { ALL_PLUGINS } from '@pie-lib/editable-html';\nimport { InputContainer, layout, settings } from '@pie-lib/config-ui';\nimport { withDragContext } from '@pie-lib/drag';\nimport { renderMath } from '@pie-lib/math-rendering';\nimport { withStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\n\nimport Choices from './choices';\nimport { createSlateMarkup } from './markupUtils';\nconst { dropdown, toggle, Panel } = settings;\n\nconst styles = theme => ({\n promptHolder: {\n width: '100%',\n paddingBottom: theme.spacing.unit * 2,\n marginBottom: theme.spacing.unit * 2\n },\n prompt: {\n paddingTop: theme.spacing.unit * 2,\n width: '100%'\n },\n markup: {\n minHeight: '235px',\n paddingTop: theme.spacing.unit * 2,\n width: '100%',\n '& [data-slate-editor=\"true\"]': {\n minHeight: '235px'\n }\n },\n design: {\n paddingTop: theme.spacing.unit * 3\n },\n choiceConfiguration: {\n paddingTop: theme.spacing.unit * 2,\n paddingBottom: theme.spacing.unit * 2\n },\n switchElement: {\n justifyContent: 'space-between',\n margin: 0\n },\n addButton: {\n float: 'right'\n },\n text: {\n fontFamily: 'Cerebri Sans',\n fontSize: '16px',\n lineHeight: '19px',\n color: '#495B8F'\n }\n});\n\nexport class Main extends React.Component {\n static propTypes = {\n configuration: PropTypes.object.isRequired,\n model: PropTypes.object.isRequired,\n disableSidePanel: PropTypes.bool,\n onModelChanged: PropTypes.func.isRequired,\n onConfigurationChanged: PropTypes.func.isRequired,\n classes: PropTypes.object.isRequired,\n imageSupport: PropTypes.shape({\n add: PropTypes.func.isRequired,\n delete: PropTypes.func.isRequired\n })\n };\n\n state = {};\n\n componentDidUpdate() {\n // eslint-disable-next-line\n const domNode = ReactDOM.findDOMNode(this);\n\n renderMath(domNode);\n }\n\n onModelChange = newVal => {\n this.props.onModelChanged({\n ...this.props.model,\n ...newVal\n });\n };\n\n onPromptChanged = prompt => {\n this.props.onModelChanged({\n ...this.props.model,\n prompt\n });\n };\n\n onRationaleChanged = rationale => {\n this.props.onModelChanged({\n ...this.props.model,\n rationale\n });\n };\n\n onTeacherInstructionsChanged = teacherInstructions => {\n this.props.onModelChanged({\n ...this.props.model,\n teacherInstructions\n });\n };\n\n onMarkupChanged = slateMarkup => {\n this.props.onModelChanged({\n ...this.props.model,\n slateMarkup\n });\n };\n\n onResponsesChanged = choices => {\n const {\n model: { correctResponse, markup }\n } = this.props;\n const slateMarkup = createSlateMarkup(markup, choices, correctResponse);\n\n this.props.onModelChanged({\n ...this.props.model,\n slateMarkup,\n choices\n });\n };\n\n render() {\n const {\n classes,\n model,\n configuration,\n onConfigurationChanged,\n imageSupport\n } = this.props;\n const {\n duplicates = {},\n prompt = {},\n partialScoring = {},\n lockChoiceOrder = {},\n rationale = {},\n teacherInstructions = {},\n choicesPosition = {}\n } = configuration || {};\n const { rationaleEnabled, promptEnabled, teacherInstructionsEnabled } =\n model || {};\n\n return (\n <div className={classes.design}>\n <layout.ConfigLayout\n settings={\n <Panel\n model={model}\n configuration={configuration}\n onChangeModel={model => this.onModelChange(model)}\n onChangeConfiguration={configuration =>\n onConfigurationChanged(configuration, true)\n }\n groups={{\n Settings: {\n partialScoring:\n partialScoring.settings && toggle(partialScoring.label),\n duplicates: duplicates.settings && toggle(duplicates.label),\n lockChoiceOrder:\n lockChoiceOrder.settings && toggle(lockChoiceOrder.label),\n choicesPosition:\n choicesPosition.settings &&\n dropdown(choicesPosition.label, [\n 'above',\n 'below',\n 'left',\n 'right'\n ])\n },\n Properties: {\n teacherInstructionsEnabled:\n teacherInstructions.settings &&\n toggle(teacherInstructions.label),\n rationaleEnabled:\n rationale.settings && toggle(rationale.label),\n promptEnabled: prompt.settings && toggle(prompt.label)\n }\n }}\n />\n }\n >\n <div>\n {teacherInstructionsEnabled && (\n <InputContainer\n label={teacherInstructions.label}\n className={classes.promptHolder}\n >\n <EditableHtml\n className={classes.prompt}\n markup={model.teacherInstructions || ''}\n onChange={this.onTeacherInstructionsChanged}\n imageSupport={imageSupport}\n nonEmpty={false}\n />\n </InputContainer>\n )}\n {promptEnabled && (\n <InputContainer\n label={prompt.label}\n className={classes.promptHolder}\n >\n <EditableHtml\n className={classes.prompt}\n markup={model.prompt}\n onChange={this.onPromptChanged}\n imageSupport={imageSupport}\n nonEmpty={false}\n disableUnderline\n />\n </InputContainer>\n )}\n <Typography className={classes.text}>\n Define Template, Choices, and Correct Responses\n </Typography>\n <EditableHtml\n activePlugins={ALL_PLUGINS}\n toolbarOpts={{ position: 'top' }}\n responseAreaProps={{\n type: 'drag-in-the-blank',\n options: {\n duplicates: model.duplicates\n }\n }}\n className={classes.markup}\n markup={model.slateMarkup}\n onChange={this.onMarkupChanged}\n imageSupport={imageSupport}\n nonEmpty={false}\n disableUnderline\n pluginProps={{\n audio: { disabled: true },\n video: { disabled: true }\n }}\n />\n <Choices\n model={model}\n duplicates={model.duplicates}\n onChange={this.onResponsesChanged}\n />\n {rationaleEnabled && (\n <InputContainer\n label={rationale.label}\n className={classes.promptHolder}\n >\n <EditableHtml\n className={classes.prompt}\n markup={model.rationale || ''}\n onChange={this.onRationaleChanged}\n imageSupport={imageSupport}\n />\n </InputContainer>\n )}\n </div>\n </layout.ConfigLayout>\n </div>\n );\n }\n}\n\nconst Styled = withStyles(styles)(Main);\n\nexport default withDragContext(Styled);\n"],"file":"main.js"}
|
|
1
|
+
{"version":3,"sources":["../src/main.jsx"],"names":["dropdown","settings","toggle","Panel","styles","theme","promptHolder","width","paddingBottom","spacing","unit","marginBottom","prompt","paddingTop","markup","minHeight","design","choiceConfiguration","switchElement","justifyContent","margin","addButton","text","fontFamily","fontSize","lineHeight","color","tooltip","whiteSpace","maxWidth","errorText","padding","flexContainer","display","alignItems","Main","newVal","props","onModelChanged","model","rationale","teacherInstructions","slateMarkup","choices","correctResponse","domNode","ReactDOM","findDOMNode","classes","configuration","onConfigurationChanged","imageSupport","duplicates","partialScoring","lockChoiceOrder","choicesPosition","spellCheck","maxChoices","maxResponseAreas","maxImageWidth","maxImageHeight","rationaleEnabled","promptEnabled","teacherInstructionsEnabled","spellCheckEnabled","errors","toolbarOpts","responseAreasError","choicesError","validationMessage","defaultImageMaxWidth","defaultImageMaxHeight","toolbarEditorPosition","position","onModelChange","Settings","label","Properties","onTeacherInstructionsChanged","onPromptChanged","marginLeft","ALL_PLUGINS","type","options","onMarkupChanged","audio","disabled","video","onResponsesChanged","onRationaleChanged","React","Component","PropTypes","object","isRequired","disableSidePanel","bool","func","shape","add","Styled"],"mappings":"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","sourcesContent":["import React from 'react';\nimport ReactDOM from 'react-dom';\nimport PropTypes from 'prop-types';\nimport EditableHtml, { ALL_PLUGINS } from '@pie-lib/editable-html';\nimport { InputContainer, layout, settings } from '@pie-lib/config-ui';\nimport { withDragContext } from '@pie-lib/drag';\nimport { renderMath } from '@pie-lib/math-rendering';\nimport { withStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport Info from '@material-ui/icons/Info';\nimport Tooltip from '@material-ui/core/Tooltip';\n\nimport Choices from './choices';\nimport { createSlateMarkup } from './markupUtils';\nimport {generateValidationMessage} from '../utils';\nconst { dropdown, toggle, Panel } = settings;\n\nconst styles = theme => ({\n promptHolder: {\n width: '100%',\n paddingBottom: theme.spacing.unit * 2,\n marginBottom: theme.spacing.unit * 2\n },\n prompt: {\n paddingTop: theme.spacing.unit * 2,\n width: '100%'\n },\n markup: {\n minHeight: '235px',\n paddingTop: theme.spacing.unit * 2,\n width: '100%',\n '& [data-slate-editor=\"true\"]': {\n minHeight: '235px'\n }\n },\n design: {\n paddingTop: theme.spacing.unit * 3\n },\n choiceConfiguration: {\n paddingTop: theme.spacing.unit * 2,\n paddingBottom: theme.spacing.unit * 2\n },\n switchElement: {\n justifyContent: 'space-between',\n margin: 0\n },\n addButton: {\n float: 'right'\n },\n text: {\n fontFamily: 'Cerebri Sans',\n fontSize: '16px',\n lineHeight: '19px',\n color: '#495B8F'\n },\n tooltip: {\n fontSize: '12px',\n whiteSpace: 'pre',\n maxWidth: '500px',\n },\n errorText: {\n fontSize: '12px',\n color: 'red',\n padding: '5px 0'\n },\n flexContainer: {\n display: 'flex',\n alignItems: 'end'\n }\n});\n\nexport class Main extends React.Component {\n static propTypes = {\n configuration: PropTypes.object.isRequired,\n model: PropTypes.object.isRequired,\n disableSidePanel: PropTypes.bool,\n onModelChanged: PropTypes.func.isRequired,\n onConfigurationChanged: PropTypes.func.isRequired,\n classes: PropTypes.object.isRequired,\n imageSupport: PropTypes.shape({\n add: PropTypes.func.isRequired,\n delete: PropTypes.func.isRequired\n })\n };\n\n state = {};\n\n componentDidUpdate() {\n // eslint-disable-next-line\n const domNode = ReactDOM.findDOMNode(this);\n\n renderMath(domNode);\n }\n\n onModelChange = newVal => {\n this.props.onModelChanged({\n ...this.props.model,\n ...newVal\n });\n };\n\n onPromptChanged = prompt => {\n this.props.onModelChanged({\n ...this.props.model,\n prompt\n });\n };\n\n onRationaleChanged = rationale => {\n this.props.onModelChanged({\n ...this.props.model,\n rationale\n });\n };\n\n onTeacherInstructionsChanged = teacherInstructions => {\n this.props.onModelChanged({\n ...this.props.model,\n teacherInstructions\n });\n };\n\n onMarkupChanged = slateMarkup => {\n this.props.onModelChanged({\n ...this.props.model,\n slateMarkup\n });\n };\n\n onResponsesChanged = choices => {\n const {\n model: { correctResponse, markup }\n } = this.props;\n const slateMarkup = createSlateMarkup(markup, choices, correctResponse);\n\n this.props.onModelChanged({\n ...this.props.model,\n slateMarkup,\n choices\n });\n };\n\n render() {\n const {\n classes,\n model,\n configuration,\n onConfigurationChanged,\n imageSupport\n } = this.props;\n const {\n duplicates = {},\n prompt = {},\n partialScoring = {},\n lockChoiceOrder = {},\n rationale = {},\n teacherInstructions = {},\n choicesPosition = {},\n spellCheck = {},\n maxChoices,\n maxResponseAreas,\n maxImageWidth = {},\n maxImageHeight = {}\n } = configuration || {};\n const { rationaleEnabled, promptEnabled, teacherInstructionsEnabled, spellCheckEnabled, errors } =\n model || {};\n const toolbarOpts = {};\n\n const { responseAreasError, choicesError } = errors || {};\n const validationMessage = generateValidationMessage(configuration);\n\n const defaultImageMaxWidth = maxImageWidth && maxImageWidth.prompt;\n const defaultImageMaxHeight = maxImageHeight && maxImageHeight.prompt;\n\n switch (model.toolbarEditorPosition) {\n case 'top':\n toolbarOpts.position = 'top';\n break;\n default:\n toolbarOpts.position = 'bottom';\n break;\n }\n return (\n <div className={classes.design}>\n <layout.ConfigLayout\n settings={\n <Panel\n model={model}\n configuration={configuration}\n onChangeModel={model => this.onModelChange(model)}\n onChangeConfiguration={configuration =>\n onConfigurationChanged(configuration, true)\n }\n groups={{\n Settings: {\n partialScoring:\n partialScoring.settings && toggle(partialScoring.label),\n duplicates: duplicates.settings && toggle(duplicates.label),\n lockChoiceOrder:\n lockChoiceOrder.settings && toggle(lockChoiceOrder.label),\n choicesPosition:\n choicesPosition.settings &&\n dropdown(choicesPosition.label, [\n 'above',\n 'below',\n 'left',\n 'right'\n ])\n },\n Properties: {\n teacherInstructionsEnabled:\n teacherInstructions.settings &&\n toggle(teacherInstructions.label),\n rationaleEnabled:\n rationale.settings && toggle(rationale.label),\n spellCheckEnabled:\n spellCheck.settings && toggle(spellCheck.label),\n promptEnabled: prompt.settings && toggle(prompt.label)\n }\n }}\n />\n }\n >\n <div>\n {teacherInstructionsEnabled && (\n <InputContainer\n label={teacherInstructions.label}\n className={classes.promptHolder}\n >\n <EditableHtml\n className={classes.prompt}\n markup={model.teacherInstructions || ''}\n onChange={this.onTeacherInstructionsChanged}\n imageSupport={imageSupport}\n nonEmpty={false}\n toolbarOpts={toolbarOpts}\n spellCheck={spellCheckEnabled}\n maxImageWidth={maxImageWidth && maxImageWidth.teacherInstructions || defaultImageMaxWidth}\n maxImageHeight={maxImageHeight && maxImageHeight.teacherInstructions || defaultImageMaxHeight}\n />\n </InputContainer>\n )}\n {promptEnabled && (\n <InputContainer\n label={prompt.label}\n className={classes.promptHolder}\n >\n <EditableHtml\n className={classes.prompt}\n markup={model.prompt}\n onChange={this.onPromptChanged}\n imageSupport={imageSupport}\n nonEmpty={false}\n disableUnderline\n toolbarOpts={toolbarOpts}\n spellCheck={spellCheckEnabled}\n maxImageWidth={defaultImageMaxWidth}\n maxImageHeight={defaultImageMaxHeight}\n />\n </InputContainer>\n )}\n <div className={classes.flexContainer}>\n <Typography className={classes.text}>\n Define Template, Choices, and Correct Responses\n </Typography>\n <Tooltip\n classes={{tooltip: classes.tooltip}}\n disableFocusListener\n disableTouchListener\n placement={'right'}\n title={validationMessage}\n >\n <Info fontSize={'small'} color={'primary'} style={{marginLeft: '5px'}}/>\n </Tooltip>\n </div>\n {responseAreasError && <div className={classes.errorText}>{responseAreasError}</div>}\n {choicesError && <div className={classes.errorText}>{choicesError}</div>}\n <EditableHtml\n activePlugins={ALL_PLUGINS}\n toolbarOpts={{ position: 'top' }}\n responseAreaProps={{\n type: 'drag-in-the-blank',\n options: {\n duplicates: model.duplicates\n },\n maxResponseAreas: maxResponseAreas,\n }}\n className={classes.markup}\n markup={model.slateMarkup}\n onChange={this.onMarkupChanged}\n imageSupport={imageSupport}\n nonEmpty={false}\n disableUnderline\n pluginProps={{\n audio: { disabled: true },\n video: { disabled: true }\n }}\n toolbarOpts={toolbarOpts}\n spellCheck={spellCheckEnabled}\n />\n <Choices\n model={model}\n duplicates={model.duplicates}\n onChange={this.onResponsesChanged}\n toolbarOpts={toolbarOpts}\n maxChoices={maxChoices}\n />\n {rationaleEnabled && (\n <InputContainer\n label={rationale.label}\n className={classes.promptHolder}\n >\n <EditableHtml\n className={classes.prompt}\n markup={model.rationale || ''}\n onChange={this.onRationaleChanged}\n imageSupport={imageSupport}\n toolbarOpts={toolbarOpts}\n spellCheck={spellCheckEnabled}\n maxImageWidth={maxImageWidth && maxImageWidth.rationale || defaultImageMaxWidth}\n maxImageHeight={maxImageHeight && maxImageHeight.rationale || defaultImageMaxHeight}\n />\n </InputContainer>\n )}\n </div>\n </layout.ConfigLayout>\n </div>\n );\n }\n}\n\nconst Styled = withStyles(styles)(Main);\n\nexport default withDragContext(Styled);\n"],"file":"main.js"}
|
|
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
|
-
exports.
|
|
8
|
+
exports.removeUnwantedCharacters = exports.processMarkup = exports.createSlateMarkup = exports.createElementFromHTML = exports.choiceIsEmpty = void 0;
|
|
9
9
|
|
|
10
10
|
var _escape = _interopRequireDefault(require("lodash/escape"));
|
|
11
11
|
|
|
@@ -15,12 +15,18 @@ var createElementFromHTML = function createElementFromHTML(htmlString) {
|
|
|
15
15
|
var div = document.createElement('div');
|
|
16
16
|
div.innerHTML = htmlString.trim();
|
|
17
17
|
return div;
|
|
18
|
-
};
|
|
18
|
+
}; // do not remove \t from \times, \triangle, \tan, \theta or \therefore
|
|
19
|
+
|
|
19
20
|
|
|
20
21
|
exports.createElementFromHTML = createElementFromHTML;
|
|
22
|
+
var tSymbols = 'imes|riangle|an|heta|herefore'; // do not remove \n from \nthroot, \nparallel, \ncong, \napprox, \neq, \ne or \nsim
|
|
23
|
+
|
|
24
|
+
var nSymbols = 'throot|parallel|cong|approx|eq|e|sim'; // match all \t and \n that are not part of math symbols that starts with \t or \n
|
|
25
|
+
|
|
26
|
+
var matchTabAndNewLine = new RegExp("(\\t(?!".concat(tSymbols, "))|(\\n(?!").concat(nSymbols, "))|(\\\\t(?!").concat(tSymbols, "))|(\\\\n(?!").concat(nSymbols, "))"), 'g');
|
|
21
27
|
|
|
22
28
|
var removeUnwantedCharacters = function removeUnwantedCharacters(markup) {
|
|
23
|
-
return markup.replace(
|
|
29
|
+
return markup.replace(matchTabAndNewLine, '').replace(/\\"/g, '"').replace(/\\\//g, '/');
|
|
24
30
|
};
|
|
25
31
|
|
|
26
32
|
exports.removeUnwantedCharacters = removeUnwantedCharacters;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/markupUtils.js"],"names":["createElementFromHTML","htmlString","div","document","createElement","innerHTML","trim","removeUnwantedCharacters","markup","replace","processMarkup","newMarkup","slateMarkup","choices","index","querySelectorAll","forEach","s","value","dataset","push","id","replaceWith","correctResponse","reduce","obj","c","REGEX","createSlateMarkup","match","g","correctId","correctChoice","find","choiceIsEmpty","choice","domEl","Array","from","tagName","childNodes","length","remove","newString"],"mappings":";;;;;;;;;AAAA;;AACA;;AAEO,IAAMA,qBAAqB,GAAG,SAAxBA,qBAAwB,CAAAC,UAAU,EAAI;AACjD,MAAMC,GAAG,GAAGC,QAAQ,CAACC,aAAT,CAAuB,KAAvB,CAAZ;AAEAF,EAAAA,GAAG,CAACG,SAAJ,GAAgBJ,UAAU,CAACK,IAAX,EAAhB;AAEA,SAAOJ,GAAP;AACD,CANM;;;;
|
|
1
|
+
{"version":3,"sources":["../src/markupUtils.js"],"names":["createElementFromHTML","htmlString","div","document","createElement","innerHTML","trim","tSymbols","nSymbols","matchTabAndNewLine","RegExp","removeUnwantedCharacters","markup","replace","processMarkup","newMarkup","slateMarkup","choices","index","querySelectorAll","forEach","s","value","dataset","push","id","replaceWith","correctResponse","reduce","obj","c","REGEX","createSlateMarkup","match","g","correctId","correctChoice","find","choiceIsEmpty","choice","domEl","Array","from","tagName","childNodes","length","remove","newString"],"mappings":"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","sourcesContent":["import escape from 'lodash/escape';\nimport isUndefined from 'lodash/isUndefined';\n\nexport const createElementFromHTML = htmlString => {\n const div = document.createElement('div');\n\n div.innerHTML = htmlString.trim();\n\n return div;\n};\n\n// do not remove \\t from \\times, \\triangle, \\tan, \\theta or \\therefore\nconst tSymbols = 'imes|riangle|an|heta|herefore';\n// do not remove \\n from \\nthroot, \\nparallel, \\ncong, \\napprox, \\neq, \\ne or \\nsim\nconst nSymbols = 'throot|parallel|cong|approx|eq|e|sim';\n// match all \\t and \\n that are not part of math symbols that starts with \\t or \\n\nconst matchTabAndNewLine = new RegExp(`(\\\\t(?!${tSymbols}))|(\\\\n(?!${nSymbols}))|(\\\\\\\\t(?!${tSymbols}))|(\\\\\\\\n(?!${nSymbols}))`, 'g');\n\nexport const removeUnwantedCharacters = markup =>\n markup.replace(matchTabAndNewLine, '').replace(/\\\\\"/g, '\"').replace(/\\\\\\//g, '/');\n\nexport const processMarkup = markup => {\n const newMarkup = removeUnwantedCharacters(markup);\n const slateMarkup = createElementFromHTML(newMarkup);\n const choices = [];\n let index = 0;\n\n slateMarkup.querySelectorAll('[data-type=\"drag_in_the_blank\"]').forEach(s => {\n let value = s.dataset.value && s.dataset.value.replace(/ /g, ' ').trim();\n\n if (!value) {\n value = '';\n }\n\n choices.push({\n value,\n id: s.dataset.id\n });\n\n s.replaceWith(`{{${index++}}}`);\n });\n\n return {\n markup: slateMarkup.innerHTML,\n choices: choices,\n correctResponse: choices.reduce((obj, c, index) => {\n obj[index] = !isUndefined(c.id) && c.id || '';\n\n return obj;\n }, {})\n };\n};\n\nconst REGEX = /\\{\\{(\\d+)\\}\\}/g;\n\nexport const createSlateMarkup = (markup, choices, correctResponse) => {\n const newMarkup = removeUnwantedCharacters(markup);\n let index = 0;\n\n return newMarkup.replace(REGEX, (match, g) => {\n const correctId = correctResponse[g];\n let correctChoice = choices.find(c => c.id === correctId);\n\n if (!correctChoice || !correctChoice.value) {\n correctChoice = {\n id: '',\n value: ''\n };\n }\n\n return `<span data-type=\"drag_in_the_blank\" data-index=\"${index++}\" data-id=\"${correctChoice.id}\" data-value=\"${escape(correctChoice.value)}\"></span>`;\n });\n};\n\nexport const choiceIsEmpty = choice => {\n if (choice) {\n const { value = '' } = choice;\n const domEl = createElementFromHTML(value);\n\n Array.from(domEl.querySelectorAll('*')).forEach((domEl) => {\n if (domEl.tagName !== 'IMG' && domEl.childNodes.length === 0) {\n domEl.remove();\n }\n });\n\n const newString = domEl.innerHTML.trim();\n\n return newString === '';\n }\n\n return false;\n};\n"],"file":"markupUtils.js"}
|
package/configure/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pie-element/drag-in-the-blank-configure",
|
|
3
|
-
"version": "3.6.
|
|
3
|
+
"version": "3.6.19",
|
|
4
4
|
"private": true,
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"module": "src/index.js",
|
|
@@ -8,10 +8,10 @@
|
|
|
8
8
|
"@material-ui/core": "^3.9.2",
|
|
9
9
|
"@material-ui/icons": "^3.0.1",
|
|
10
10
|
"@pie-framework/pie-configure-events": "^1.2.0",
|
|
11
|
-
"@pie-lib/config-ui": "^10.
|
|
11
|
+
"@pie-lib/config-ui": "^10.13.3",
|
|
12
12
|
"@pie-lib/drag": "^1.1.52",
|
|
13
|
-
"@pie-lib/editable-html": "^7.
|
|
14
|
-
"@pie-lib/math-rendering": "^2.3
|
|
13
|
+
"@pie-lib/editable-html": "^7.22.6",
|
|
14
|
+
"@pie-lib/math-rendering": "^2.4.3",
|
|
15
15
|
"debug": "^3.1.0",
|
|
16
16
|
"lodash": "^4.17.15",
|
|
17
17
|
"prop-types": "^15.6.2",
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export const generateValidationMessage = config => {
|
|
2
|
+
let { maxResponseAreas, minChoices, maxChoices } = config;
|
|
3
|
+
minChoices = minChoices || 3;
|
|
4
|
+
|
|
5
|
+
const responseAreasMessage = '\nThe tokens should ' +
|
|
6
|
+
'not be empty and should be unique.\nThere should be at least 1 ' +
|
|
7
|
+
(maxResponseAreas ? `and at most ${maxResponseAreas} ` : '') +
|
|
8
|
+
'response area' + (maxResponseAreas ? 's' : '') + ' defined.' +
|
|
9
|
+
`\nThere should be at least ${minChoices} ` +
|
|
10
|
+
(maxChoices ? `and at most ${maxChoices} ` : '') +
|
|
11
|
+
'tokens defined.';
|
|
12
|
+
|
|
13
|
+
return 'Validation requirements:' + responseAreasMessage;
|
|
14
|
+
};
|
package/controller/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,22 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [3.3.18](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank-controller@3.3.16...@pie-element/drag-in-the-blank-controller@3.3.18) (2021-11-11)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @pie-element/drag-in-the-blank-controller
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
## [3.3.17](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank-controller@3.3.16...@pie-element/drag-in-the-blank-controller@3.3.17) (2021-11-11)
|
|
15
|
+
|
|
16
|
+
**Note:** Version bump only for package @pie-element/drag-in-the-blank-controller
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
6
22
|
## [3.3.16](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank-controller@3.3.14...@pie-element/drag-in-the-blank-controller@3.3.16) (2021-08-05)
|
|
7
23
|
|
|
8
24
|
|
package/controller/lib/index.js
CHANGED
|
@@ -5,9 +5,11 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
|
+
exports.getScore = exports.createCorrectResponseSession = void 0;
|
|
8
9
|
exports.model = model;
|
|
10
|
+
exports.normalize = void 0;
|
|
9
11
|
exports.outcome = outcome;
|
|
10
|
-
exports.
|
|
12
|
+
exports.validate = void 0;
|
|
11
13
|
|
|
12
14
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
13
15
|
|
|
@@ -23,9 +25,9 @@ var _utils = require("./utils");
|
|
|
23
25
|
|
|
24
26
|
var _controllerUtils = require("@pie-lib/controller-utils");
|
|
25
27
|
|
|
26
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object);
|
|
28
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
27
29
|
|
|
28
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]
|
|
30
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
29
31
|
|
|
30
32
|
var normalize = function normalize(question) {
|
|
31
33
|
return _objectSpread({
|
|
@@ -232,4 +234,34 @@ var createCorrectResponseSession = function createCorrectResponseSession(questio
|
|
|
232
234
|
};
|
|
233
235
|
|
|
234
236
|
exports.createCorrectResponseSession = createCorrectResponseSession;
|
|
237
|
+
|
|
238
|
+
var validate = function validate() {
|
|
239
|
+
var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
240
|
+
var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
241
|
+
var choices = model.choices,
|
|
242
|
+
markup = model.markup;
|
|
243
|
+
var _config$minChoices = config.minChoices,
|
|
244
|
+
minChoices = _config$minChoices === void 0 ? 2 : _config$minChoices,
|
|
245
|
+
maxChoices = config.maxChoices,
|
|
246
|
+
maxResponseAreas = config.maxResponseAreas;
|
|
247
|
+
var errors = {};
|
|
248
|
+
var nbOfResponseAreas = ((markup || '').match(/\{\{(\d+)\}\}/g) || []).length;
|
|
249
|
+
var nbOfChoices = (choices || []).length;
|
|
250
|
+
|
|
251
|
+
if (nbOfResponseAreas > maxResponseAreas) {
|
|
252
|
+
errors.responseAreasError = "No more than ".concat(maxResponseAreas, " response areas should be defined.");
|
|
253
|
+
} else if (nbOfResponseAreas < 1) {
|
|
254
|
+
errors.responseAreasError = 'There should be at least 1 response area defined.';
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
if (nbOfChoices < minChoices) {
|
|
258
|
+
errors.choicesError = "There should be at least ".concat(minChoices, " choices defined.");
|
|
259
|
+
} else if (nbOfChoices > maxChoices) {
|
|
260
|
+
errors.choicesError = "No more than ".concat(maxChoices, " choices should be defined.");
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
return errors;
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
exports.validate = validate;
|
|
235
267
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.js"],"names":["normalize","question","rationaleEnabled","promptEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","model","session","env","updateSession","Promise","resolve","normalizedQuestion","feedback","mode","responses","allCorrectResponses","possibleResponses","numberOfPossibleResponses","correctResponses","undefined","value","i","result","obj","choices","key","answer","filter","choice","lockChoiceOrder","out","prompt","disabled","responseCorrect","getScore","role","rationale","teacherInstructions","config","maxScore","Object","keys","correctResponse","length","correctCount","total","str","toFixed","parseFloat","outcome","partialScoringEnabled","partialScoring","enabled","score","empty","createCorrectResponseSession","id"],"mappings":"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","sourcesContent":["import reduce from 'lodash/reduce';\nimport isEmpty from 'lodash/isEmpty';\nimport { getAllCorrectResponses, choiceIsEmpty } from './utils';\nimport { lockChoices, getShuffledChoices, partialScoring } from '@pie-lib/controller-utils';\n\nexport const normalize = question => ({\n rationaleEnabled: true,\n promptEnabled: true,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n ...question,\n});\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n * @param {*} updateSession - optional - a function that will set the properties passed into it on the session.\n */\nexport function model(question, session, env, updateSession) {\n return new Promise(async resolve => {\n const normalizedQuestion = normalize(question);\n let feedback = {};\n\n if (env.mode === 'evaluate') {\n const responses = getAllCorrectResponses(normalizedQuestion) || {};\n const allCorrectResponses = responses.possibleResponses;\n const numberOfPossibleResponses = responses.numberOfPossibleResponses || 0;\n let correctResponses = undefined;\n const { value } = session || {};\n\n for (let i = 0; i < numberOfPossibleResponses; i++) {\n const result = reduce(allCorrectResponses, (obj, choices, key) => {\n const answer = (value && value[key]) || '';\n\n obj.feedback[key] = choices[i] === answer;\n\n if (obj.feedback[key]) {\n obj.correctResponses += 1;\n }\n\n return obj;\n }, { correctResponses: 0, feedback: {} });\n\n if (correctResponses === undefined || result.correctResponses > correctResponses) {\n correctResponses = result.correctResponses;\n feedback = result.feedback;\n }\n\n if (result.correctResponses === numberOfPossibleResponses) {\n break;\n }\n }\n }\n\n let choices = normalizedQuestion.choices && normalizedQuestion.choices.filter(choice => !choiceIsEmpty(choice));\n\n const lockChoiceOrder = lockChoices(normalizedQuestion, session, env);\n\n if (!lockChoiceOrder) {\n choices = await getShuffledChoices(choices, session, updateSession, 'id');\n }\n\n const out = {\n ...normalizedQuestion,\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n choices,\n feedback,\n mode: env.mode,\n disabled: env.mode !== 'gather',\n responseCorrect:\n env.mode === 'evaluate'\n ? getScore(normalizedQuestion, session) === 1\n : undefined,\n };\n\n if (\n env.role === 'instructor' &&\n (env.mode === 'view' || env.mode === 'evaluate')\n ) {\n out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled ? normalizedQuestion.teacherInstructions : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n resolve(out);\n });\n}\n\nexport const getScore = (config, session) => {\n const responses = getAllCorrectResponses(config);\n const allCorrectResponses = responses.possibleResponses;\n const maxScore = Object.keys(config.correctResponse).length;\n const numberOfPossibleResponses = responses.numberOfPossibleResponses || 0;\n let correctCount = 0;\n const { value } = session || {};\n\n for (let i = 0; i < numberOfPossibleResponses; i++) {\n const result = reduce(allCorrectResponses, (total, choices, key) => {\n const answer = (value && value[key]) || '';\n\n if (choices[i] === answer) {\n return total;\n }\n\n return total - 1;\n }, maxScore);\n\n if (result > correctCount) {\n correctCount = result;\n }\n\n if (result === maxScore) {\n break;\n }\n }\n\n const str = maxScore ? (correctCount / maxScore).toFixed(2) : 0;\n\n return parseFloat(str);\n};\n\n/**\n *\n * The score is partial by default for checkbox mode, allOrNothing for radio mode.\n * To disable partial scoring for checkbox mode you either set model.partialScoring = false or env.partialScoring =\n * false. the value in `env` will override the value in `model`.\n * @param {Object} model - the main model\n * @param {boolean} model.partialScoring - is partial scoring enabled (if undefined set to to true)\n * @param {*} session\n * @param {Object} env\n * @param {boolean} env.partialScoring - is partial scoring enabled (if undefined default to true) This overrides\n * `model.partialScoring`.\n */\nexport function outcome(model, session, env = {}) {\n return new Promise(resolve => {\n const partialScoringEnabled = partialScoring.enabled(model, env);\n const score = getScore(model, session);\n\n resolve({\n score: partialScoringEnabled ? score : score === 1 ? 1 : 0,\n empty: !session || isEmpty(session)\n });\n });\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise(resolve => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n resolve({\n value: question.correctResponse,\n id: '1'\n });\n } else {\n resolve(null);\n }\n });\n};\n"],"file":"index.js"}
|
|
1
|
+
{"version":3,"sources":["../src/index.js"],"names":["normalize","question","rationaleEnabled","promptEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","model","session","env","updateSession","Promise","resolve","normalizedQuestion","feedback","mode","responses","allCorrectResponses","possibleResponses","numberOfPossibleResponses","correctResponses","undefined","value","i","result","obj","choices","key","answer","filter","choice","lockChoiceOrder","out","prompt","disabled","responseCorrect","getScore","role","rationale","teacherInstructions","config","maxScore","Object","keys","correctResponse","length","correctCount","total","str","toFixed","parseFloat","outcome","partialScoringEnabled","partialScoring","enabled","score","empty","createCorrectResponseSession","id","validate","markup","minChoices","maxChoices","maxResponseAreas","errors","nbOfResponseAreas","match","nbOfChoices","responseAreasError","choicesError"],"mappings":"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","sourcesContent":["import reduce from 'lodash/reduce';\nimport isEmpty from 'lodash/isEmpty';\nimport { getAllCorrectResponses, choiceIsEmpty } from './utils';\nimport { lockChoices, getShuffledChoices, partialScoring } from '@pie-lib/controller-utils';\n\nexport const normalize = question => ({\n rationaleEnabled: true,\n promptEnabled: true,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n ...question,\n});\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n * @param {*} updateSession - optional - a function that will set the properties passed into it on the session.\n */\nexport function model(question, session, env, updateSession) {\n return new Promise(async resolve => {\n const normalizedQuestion = normalize(question);\n let feedback = {};\n\n if (env.mode === 'evaluate') {\n const responses = getAllCorrectResponses(normalizedQuestion) || {};\n const allCorrectResponses = responses.possibleResponses;\n const numberOfPossibleResponses = responses.numberOfPossibleResponses || 0;\n let correctResponses = undefined;\n const { value } = session || {};\n\n for (let i = 0; i < numberOfPossibleResponses; i++) {\n const result = reduce(allCorrectResponses, (obj, choices, key) => {\n const answer = (value && value[key]) || '';\n\n obj.feedback[key] = choices[i] === answer;\n\n if (obj.feedback[key]) {\n obj.correctResponses += 1;\n }\n\n return obj;\n }, { correctResponses: 0, feedback: {} });\n\n if (correctResponses === undefined || result.correctResponses > correctResponses) {\n correctResponses = result.correctResponses;\n feedback = result.feedback;\n }\n\n if (result.correctResponses === numberOfPossibleResponses) {\n break;\n }\n }\n }\n\n let choices = normalizedQuestion.choices && normalizedQuestion.choices.filter(choice => !choiceIsEmpty(choice));\n\n const lockChoiceOrder = lockChoices(normalizedQuestion, session, env);\n\n if (!lockChoiceOrder) {\n choices = await getShuffledChoices(choices, session, updateSession, 'id');\n }\n\n const out = {\n ...normalizedQuestion,\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n choices,\n feedback,\n mode: env.mode,\n disabled: env.mode !== 'gather',\n responseCorrect:\n env.mode === 'evaluate'\n ? getScore(normalizedQuestion, session) === 1\n : undefined,\n };\n\n if (\n env.role === 'instructor' &&\n (env.mode === 'view' || env.mode === 'evaluate')\n ) {\n out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled ? normalizedQuestion.teacherInstructions : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n resolve(out);\n });\n}\n\nexport const getScore = (config, session) => {\n const responses = getAllCorrectResponses(config);\n const allCorrectResponses = responses.possibleResponses;\n const maxScore = Object.keys(config.correctResponse).length;\n const numberOfPossibleResponses = responses.numberOfPossibleResponses || 0;\n let correctCount = 0;\n const { value } = session || {};\n\n for (let i = 0; i < numberOfPossibleResponses; i++) {\n const result = reduce(allCorrectResponses, (total, choices, key) => {\n const answer = (value && value[key]) || '';\n\n if (choices[i] === answer) {\n return total;\n }\n\n return total - 1;\n }, maxScore);\n\n if (result > correctCount) {\n correctCount = result;\n }\n\n if (result === maxScore) {\n break;\n }\n }\n\n const str = maxScore ? (correctCount / maxScore).toFixed(2) : 0;\n\n return parseFloat(str);\n};\n\n/**\n *\n * The score is partial by default for checkbox mode, allOrNothing for radio mode.\n * To disable partial scoring for checkbox mode you either set model.partialScoring = false or env.partialScoring =\n * false. the value in `env` will override the value in `model`.\n * @param {Object} model - the main model\n * @param {boolean} model.partialScoring - is partial scoring enabled (if undefined set to to true)\n * @param {*} session\n * @param {Object} env\n * @param {boolean} env.partialScoring - is partial scoring enabled (if undefined default to true) This overrides\n * `model.partialScoring`.\n */\nexport function outcome(model, session, env = {}) {\n return new Promise(resolve => {\n const partialScoringEnabled = partialScoring.enabled(model, env);\n const score = getScore(model, session);\n\n resolve({\n score: partialScoringEnabled ? score : score === 1 ? 1 : 0,\n empty: !session || isEmpty(session)\n });\n });\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise(resolve => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n resolve({\n value: question.correctResponse,\n id: '1'\n });\n } else {\n resolve(null);\n }\n });\n};\n\nexport const validate = (model = {}, config = {}) => {\n const { choices, markup } = model;\n const { minChoices = 2, maxChoices, maxResponseAreas } = config;\n const errors = {};\n\n const nbOfResponseAreas = ((markup || '').match(/\\{\\{(\\d+)\\}\\}/g) || []).length;\n const nbOfChoices = (choices || []).length;\n\n if (nbOfResponseAreas > maxResponseAreas) {\n errors.responseAreasError = `No more than ${maxResponseAreas} response areas should be defined.`;\n } else if (nbOfResponseAreas < 1) {\n errors.responseAreasError = 'There should be at least 1 response area defined.';\n }\n\n if (nbOfChoices < minChoices) {\n errors.choicesError = `There should be at least ${minChoices} choices defined.`;\n } else if (nbOfChoices > maxChoices) {\n errors.choicesError = `No more than ${maxChoices} choices should be defined.`;\n }\n\n return errors;\n};\n"],"file":"index.js"}
|
package/controller/lib/utils.js
CHANGED
|
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
|
-
exports.
|
|
8
|
+
exports.getAllCorrectResponses = exports.choiceIsEmpty = void 0;
|
|
9
9
|
|
|
10
10
|
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
11
11
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils.js"],"names":["replaceHtmlRegex","getAllCorrectResponses","correctResponse","alternateResponses","obj","val","key","possibleResponses","numberOfPossibleResponses","undefined","length","choiceIsEmpty","choice","value","withoutEmptyTags","replace","trim"],"mappings":";;;;;;;;;;;AAAA;;AACA;;AAEA,IAAMA,gBAAgB,GAAG,mBAAzB;;AAEO,IAAMC,sBAAsB,GAAG,SAAzBA,sBAAyB,OAA6C;AAAA,MAA1CC,eAA0C,QAA1CA,eAA0C;AAAA,MAAzBC,kBAAyB,QAAzBA,kBAAyB;AACjF,SAAO,wBAAOD,eAAe,IAAI,EAA1B,EAA8B,UAACE,GAAD,EAAMC,GAAN,EAAWC,GAAX,EAAmB;AACtDF,IAAAA,GAAG,CAACG,iBAAJ,CAAsBD,GAAtB,IAA6B,CAACD,GAAD,CAA7B;;AAEA,QAAIF,kBAAkB,IAAIA,kBAAkB,CAACG,GAAD,CAA5C,EAAmD;AACjDF,MAAAA,GAAG,CAACG,iBAAJ,CAAsBD,GAAtB,kDACKF,GAAG,CAACG,iBAAJ,CAAsBD,GAAtB,CADL,uCAEK,2BAAUH,kBAAkB,CAACG,GAAD,CAA5B,CAFL;AAID;;AAED,QACGF,GAAG,CAACI,yBAAJ,KAAkCC,SAAnC,IACCL,GAAG,CAACI,yBAAJ,GAAgCJ,GAAG,CAACG,iBAAJ,CAAsBD,GAAtB,EAA2BI,MAF9D,EAGE;AACAN,MAAAA,GAAG,CAACI,yBAAJ,GAAgCJ,GAAG,CAACG,iBAAJ,CAAsBD,GAAtB,EAA2BI,MAA3D;AACD;;AAED,WAAON,GAAP;AACD,GAlBM,EAkBJ;AACDG,IAAAA,iBAAiB,EAAE,EADlB;AAEDC,IAAAA,yBAAyB,EAAEC;AAF1B,GAlBI,CAAP;AAsBD,CAvBM;;;;AAyBA,IAAME,aAAa,GAAG,SAAhBA,aAAgB,CAAAC,MAAM,EAAI;AACrC,MAAIA,MAAJ,EAAY;
|
|
1
|
+
{"version":3,"sources":["../src/utils.js"],"names":["replaceHtmlRegex","getAllCorrectResponses","correctResponse","alternateResponses","obj","val","key","possibleResponses","numberOfPossibleResponses","undefined","length","choiceIsEmpty","choice","value","withoutEmptyTags","replace","trim"],"mappings":";;;;;;;;;;;AAAA;;AACA;;AAEA,IAAMA,gBAAgB,GAAG,mBAAzB;;AAEO,IAAMC,sBAAsB,GAAG,SAAzBA,sBAAyB,OAA6C;AAAA,MAA1CC,eAA0C,QAA1CA,eAA0C;AAAA,MAAzBC,kBAAyB,QAAzBA,kBAAyB;AACjF,SAAO,wBAAOD,eAAe,IAAI,EAA1B,EAA8B,UAACE,GAAD,EAAMC,GAAN,EAAWC,GAAX,EAAmB;AACtDF,IAAAA,GAAG,CAACG,iBAAJ,CAAsBD,GAAtB,IAA6B,CAACD,GAAD,CAA7B;;AAEA,QAAIF,kBAAkB,IAAIA,kBAAkB,CAACG,GAAD,CAA5C,EAAmD;AACjDF,MAAAA,GAAG,CAACG,iBAAJ,CAAsBD,GAAtB,kDACKF,GAAG,CAACG,iBAAJ,CAAsBD,GAAtB,CADL,uCAEK,2BAAUH,kBAAkB,CAACG,GAAD,CAA5B,CAFL;AAID;;AAED,QACGF,GAAG,CAACI,yBAAJ,KAAkCC,SAAnC,IACCL,GAAG,CAACI,yBAAJ,GAAgCJ,GAAG,CAACG,iBAAJ,CAAsBD,GAAtB,EAA2BI,MAF9D,EAGE;AACAN,MAAAA,GAAG,CAACI,yBAAJ,GAAgCJ,GAAG,CAACG,iBAAJ,CAAsBD,GAAtB,EAA2BI,MAA3D;AACD;;AAED,WAAON,GAAP;AACD,GAlBM,EAkBJ;AACDG,IAAAA,iBAAiB,EAAE,EADlB;AAEDC,IAAAA,yBAAyB,EAAEC;AAF1B,GAlBI,CAAP;AAsBD,CAvBM;;;;AAyBA,IAAME,aAAa,GAAG,SAAhBA,aAAgB,CAAAC,MAAM,EAAI;AACrC,MAAIA,MAAJ,EAAY;AACV,wBAAuBA,MAAvB,CAAQC,KAAR;AAAA,QAAQA,KAAR,8BAAgB,EAAhB;AACA,QAAMC,gBAAgB,GAAGD,KAAK,CAACE,OAAN,CAAcf,gBAAd,EAAgC,EAAhC,KAAuC,EAAhE;AAEA,WAAOc,gBAAgB,CAACE,IAAjB,OAA4B,EAAnC;AACD;;AAED,SAAO,KAAP;AACD,CATM","sourcesContent":["import cloneDeep from 'lodash/cloneDeep';\nimport reduce from 'lodash/reduce';\n\nconst replaceHtmlRegex = /<(?!img)[^>]*>?/gm;\n\nexport const getAllCorrectResponses = ({ correctResponse, alternateResponses }) => {\n return reduce(correctResponse || {}, (obj, val, key) => {\n obj.possibleResponses[key] = [val];\n\n if (alternateResponses && alternateResponses[key]) {\n obj.possibleResponses[key] = [\n ...obj.possibleResponses[key],\n ...cloneDeep(alternateResponses[key])\n ];\n }\n\n if (\n (obj.numberOfPossibleResponses === undefined) ||\n (obj.numberOfPossibleResponses > obj.possibleResponses[key].length)\n ) {\n obj.numberOfPossibleResponses = obj.possibleResponses[key].length;\n }\n\n return obj;\n }, {\n possibleResponses: {},\n numberOfPossibleResponses: undefined\n });\n};\n\nexport const choiceIsEmpty = choice => {\n if (choice) {\n const { value = '' } = choice;\n const withoutEmptyTags = value.replace(replaceHtmlRegex, '') || '';\n\n return withoutEmptyTags.trim() === '';\n }\n\n return false;\n};\n"],"file":"utils.js"}
|