@pie-element/ebsr 8.5.1-beta.3 → 8.5.1-beta.4
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/configure/lib/defaults.js +130 -0
- package/configure/lib/defaults.js.map +1 -0
- package/configure/lib/index.js +158 -0
- package/configure/lib/index.js.map +1 -0
- package/configure/lib/main.js +251 -0
- package/configure/lib/main.js.map +1 -0
- package/controller/lib/defaults.js +28 -0
- package/controller/lib/defaults.js.map +1 -0
- package/controller/lib/index.js +398 -0
- package/controller/lib/index.js.map +1 -0
- package/controller/lib/utils.js +25 -0
- package/controller/lib/utils.js.map +1 -0
- package/lib/index.js +160 -0
- package/lib/index.js.map +1 -0
- package/lib/print.js +199 -0
- package/lib/print.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports["default"] = void 0;
|
|
7
|
+
var _default = {
|
|
8
|
+
partA: {
|
|
9
|
+
choicePrefix: 'letters',
|
|
10
|
+
choices: [{
|
|
11
|
+
value: 'a',
|
|
12
|
+
label: 'label a'
|
|
13
|
+
}],
|
|
14
|
+
prompt: 'prompt a',
|
|
15
|
+
disabled: false
|
|
16
|
+
},
|
|
17
|
+
partB: {
|
|
18
|
+
choicePrefix: 'letters',
|
|
19
|
+
choices: [{
|
|
20
|
+
value: 'b',
|
|
21
|
+
label: 'label b'
|
|
22
|
+
}],
|
|
23
|
+
prompt: 'prompt b',
|
|
24
|
+
disabled: false
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
exports["default"] = _default;
|
|
28
|
+
//# sourceMappingURL=defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.js","names":["partA","choicePrefix","choices","value","label","prompt","disabled","partB","exports","_default"],"sources":["../src/defaults.js"],"sourcesContent":["export default {\n partA: {\n choicePrefix: 'letters',\n choices: [\n {\n value: 'a',\n label: 'label a',\n },\n ],\n prompt: 'prompt a',\n disabled: false,\n },\n partB: {\n choicePrefix: 'letters',\n choices: [\n {\n value: 'b',\n label: 'label b',\n },\n ],\n prompt: 'prompt b',\n disabled: false,\n },\n};\n"],"mappings":";;;;;;eAAe;EACbA,KAAK,EAAE;IACLC,YAAY,EAAE,SAAS;IACvBC,OAAO,EAAE,CACP;MACEC,KAAK,EAAE,GAAG;MACVC,KAAK,EAAE;IACT,CAAC,CACF;IACDC,MAAM,EAAE,UAAU;IAClBC,QAAQ,EAAE;EACZ,CAAC;EACDC,KAAK,EAAE;IACLN,YAAY,EAAE,SAAS;IACvBC,OAAO,EAAE,CACP;MACEC,KAAK,EAAE,GAAG;MACVC,KAAK,EAAE;IACT,CAAC,CACF;IACDC,MAAM,EAAE,UAAU;IAClBC,QAAQ,EAAE;EACZ;AACF,CAAC;AAAAE,OAAA,cAAAC,QAAA"}
|
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.createDefaultModel = exports.createCorrectResponseSession = void 0;
|
|
8
|
+
exports.model = model;
|
|
9
|
+
exports.normalize = void 0;
|
|
10
|
+
exports.outcome = outcome;
|
|
11
|
+
exports.validate = void 0;
|
|
12
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
13
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
14
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
15
|
+
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
16
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
17
|
+
var _defaults = _interopRequireDefault(require("./defaults"));
|
|
18
|
+
var _controllerUtils = require("@pie-lib/controller-utils");
|
|
19
|
+
var _utils = require("./utils");
|
|
20
|
+
var _get = _interopRequireDefault(require("lodash/get"));
|
|
21
|
+
var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
|
|
22
|
+
var _excluded = ["partA", "partB"];
|
|
23
|
+
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; }
|
|
24
|
+
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; }
|
|
25
|
+
var prepareChoice = function prepareChoice(model, env, defaultFeedback) {
|
|
26
|
+
return function (choice) {
|
|
27
|
+
var out = {
|
|
28
|
+
label: choice.label,
|
|
29
|
+
value: choice.value
|
|
30
|
+
};
|
|
31
|
+
if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {
|
|
32
|
+
out.rationale = model.rationaleEnabled ? choice.rationale : null;
|
|
33
|
+
} else {
|
|
34
|
+
out.rationale = null;
|
|
35
|
+
}
|
|
36
|
+
if (env.mode === 'evaluate') {
|
|
37
|
+
out.correct = !!choice.correct;
|
|
38
|
+
if (model.feedbackEnabled) {
|
|
39
|
+
var feedbackType = choice.feedback && choice.feedback.type || 'none';
|
|
40
|
+
if (feedbackType === 'default') {
|
|
41
|
+
out.feedback = defaultFeedback[choice.correct ? 'correct' : 'incorrect'];
|
|
42
|
+
} else if (feedbackType === 'custom') {
|
|
43
|
+
out.feedback = choice.feedback.value;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return out;
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
var parsePart = function parsePart(part, key, session, env) {
|
|
51
|
+
var defaultFeedback = Object.assign({
|
|
52
|
+
correct: 'Correct',
|
|
53
|
+
incorrect: 'Incorrect'
|
|
54
|
+
}, part.defaultFeedback);
|
|
55
|
+
var choices = part.choices ? part.choices.map(prepareChoice(part, env, defaultFeedback)) : [];
|
|
56
|
+
return _objectSpread(_objectSpread({}, part), {}, {
|
|
57
|
+
choices: choices,
|
|
58
|
+
disabled: env.mode !== 'gather',
|
|
59
|
+
complete: {
|
|
60
|
+
min: part.choices.filter(function (c) {
|
|
61
|
+
return c.correct;
|
|
62
|
+
}).length
|
|
63
|
+
},
|
|
64
|
+
responseCorrect: env.mode === 'evaluate' ? (0, _utils.isResponseCorrect)(part, key, session) : undefined
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
var normalize = function normalize(_ref) {
|
|
68
|
+
var _ref$partA = _ref.partA,
|
|
69
|
+
partA = _ref$partA === void 0 ? {} : _ref$partA,
|
|
70
|
+
_ref$partB = _ref.partB,
|
|
71
|
+
partB = _ref$partB === void 0 ? {} : _ref$partB,
|
|
72
|
+
question = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
|
|
73
|
+
return _objectSpread(_objectSpread({
|
|
74
|
+
partLabels: true,
|
|
75
|
+
partLabelType: 'Letters'
|
|
76
|
+
}, question), {}, {
|
|
77
|
+
partA: _objectSpread(_objectSpread(_objectSpread({}, _defaults["default"].partA), {}, {
|
|
78
|
+
rationaleEnabled: true,
|
|
79
|
+
feedbackEnabled: true,
|
|
80
|
+
promptEnabled: true,
|
|
81
|
+
teacherInstructionsEnabled: true,
|
|
82
|
+
studentInstructionsEnabled: true,
|
|
83
|
+
gridColumns: '2'
|
|
84
|
+
}, partA), {}, {
|
|
85
|
+
choicesLayout: partA.choicesLayout || partA.verticalMode === false && 'horizontal' || 'vertical'
|
|
86
|
+
}),
|
|
87
|
+
partB: _objectSpread(_objectSpread(_objectSpread({}, _defaults["default"].partB), {}, {
|
|
88
|
+
rationaleEnabled: true,
|
|
89
|
+
promptEnabled: true,
|
|
90
|
+
feedbackEnabled: true,
|
|
91
|
+
teacherInstructionsEnabled: true,
|
|
92
|
+
studentInstructionsEnabled: true,
|
|
93
|
+
gridColumns: '2'
|
|
94
|
+
}, partB), {}, {
|
|
95
|
+
choicesLayout: partB.choicesLayout || partB.verticalMode === false && 'horizontal' || 'vertical'
|
|
96
|
+
})
|
|
97
|
+
});
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
*
|
|
102
|
+
* @param {*} question
|
|
103
|
+
* @param {*} session
|
|
104
|
+
* @param {*} env
|
|
105
|
+
* @param {*} updateSession - optional - a function that will set the properties passed into it on the session.
|
|
106
|
+
*/
|
|
107
|
+
exports.normalize = normalize;
|
|
108
|
+
function model(_x, _x2, _x3, _x4) {
|
|
109
|
+
return _model.apply(this, arguments);
|
|
110
|
+
}
|
|
111
|
+
function _model() {
|
|
112
|
+
_model = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(question, session, env, updateSession) {
|
|
113
|
+
var normalizedQuestion, partA, partB, shuffledValues, us, partASession, partALockChoiceOrder, _ref8, partAChoices, _ref9, partBChoices, partBSession, partBLockChoiceOrder;
|
|
114
|
+
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
115
|
+
while (1) switch (_context.prev = _context.next) {
|
|
116
|
+
case 0:
|
|
117
|
+
normalizedQuestion = normalize(question);
|
|
118
|
+
partA = parsePart(normalizedQuestion.partA, 'partA', session, env);
|
|
119
|
+
partB = parsePart(normalizedQuestion.partB, 'partB', session, env);
|
|
120
|
+
shuffledValues = {};
|
|
121
|
+
us = function us(part) {
|
|
122
|
+
return function (id, element, update) {
|
|
123
|
+
return new Promise(function (resolve) {
|
|
124
|
+
shuffledValues[part] = update.shuffledValues;
|
|
125
|
+
resolve();
|
|
126
|
+
});
|
|
127
|
+
};
|
|
128
|
+
};
|
|
129
|
+
partASession = (0, _get["default"])(session, 'value.partA');
|
|
130
|
+
partALockChoiceOrder = (0, _controllerUtils.lockChoices)(normalizedQuestion.partA, partASession, env);
|
|
131
|
+
_ref8 = partA || {}, partAChoices = _ref8.choices;
|
|
132
|
+
_ref9 = partB || {}, partBChoices = _ref9.choices;
|
|
133
|
+
if (!(!partALockChoiceOrder && partAChoices && partAChoices.length)) {
|
|
134
|
+
_context.next = 13;
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
_context.next = 12;
|
|
138
|
+
return (0, _controllerUtils.getShuffledChoices)(partAChoices, {
|
|
139
|
+
shuffledValues: (session.shuffledValues || {}).partA
|
|
140
|
+
}, us('partA'), 'value');
|
|
141
|
+
case 12:
|
|
142
|
+
partA.choices = _context.sent;
|
|
143
|
+
case 13:
|
|
144
|
+
partBSession = (0, _get["default"])(session, 'value.partB');
|
|
145
|
+
partBLockChoiceOrder = (0, _controllerUtils.lockChoices)(normalizedQuestion.partB, partBSession, env);
|
|
146
|
+
if (!(!partBLockChoiceOrder && partBChoices && partBChoices.length)) {
|
|
147
|
+
_context.next = 19;
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
_context.next = 18;
|
|
151
|
+
return (0, _controllerUtils.getShuffledChoices)(partBChoices, {
|
|
152
|
+
shuffledValues: (session.shuffledValues || {}).partB
|
|
153
|
+
}, us('partB'), 'value');
|
|
154
|
+
case 18:
|
|
155
|
+
partB.choices = _context.sent;
|
|
156
|
+
case 19:
|
|
157
|
+
if (!(0, _isEmpty["default"])(shuffledValues)) {
|
|
158
|
+
if (updateSession && typeof updateSession === 'function') {
|
|
159
|
+
updateSession(session.id, session.element, {
|
|
160
|
+
shuffledValues: shuffledValues
|
|
161
|
+
})["catch"](function (e) {
|
|
162
|
+
console.error('update session failed', e);
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if (normalizedQuestion.partLabels) {
|
|
167
|
+
partA.partLabel = normalizedQuestion.partLabelType === 'Letters' ? 'Part A' : 'Part 1';
|
|
168
|
+
partB.partLabel = normalizedQuestion.partLabelType === 'Letters' ? 'Part B' : 'Part 2';
|
|
169
|
+
} else {
|
|
170
|
+
partA.partLabel = undefined;
|
|
171
|
+
partB.partLabel = undefined;
|
|
172
|
+
}
|
|
173
|
+
if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {
|
|
174
|
+
partA.teacherInstructions = normalizedQuestion.partA.teacherInstructionsEnabled ? normalizedQuestion.partA.teacherInstructions : null;
|
|
175
|
+
partB.teacherInstructions = normalizedQuestion.partB.teacherInstructionsEnabled ? normalizedQuestion.partB.teacherInstructions : null;
|
|
176
|
+
} else {
|
|
177
|
+
partA.teacherInstructions = null;
|
|
178
|
+
partB.teacherInstructions = null;
|
|
179
|
+
}
|
|
180
|
+
partA.prompt = normalizedQuestion.partA.promptEnabled ? normalizedQuestion.partA.prompt : null;
|
|
181
|
+
partB.prompt = normalizedQuestion.partB.promptEnabled ? normalizedQuestion.partB.prompt : null;
|
|
182
|
+
return _context.abrupt("return", new Promise(function (resolve) {
|
|
183
|
+
resolve({
|
|
184
|
+
disabled: env.mode !== 'gather',
|
|
185
|
+
mode: env.mode,
|
|
186
|
+
partA: partA,
|
|
187
|
+
partB: partB
|
|
188
|
+
});
|
|
189
|
+
}));
|
|
190
|
+
case 25:
|
|
191
|
+
case "end":
|
|
192
|
+
return _context.stop();
|
|
193
|
+
}
|
|
194
|
+
}, _callee);
|
|
195
|
+
}));
|
|
196
|
+
return _model.apply(this, arguments);
|
|
197
|
+
}
|
|
198
|
+
var createDefaultModel = function createDefaultModel() {
|
|
199
|
+
var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
200
|
+
return new Promise(function (resolve) {
|
|
201
|
+
resolve(_objectSpread(_objectSpread({}, _defaults["default"]), model));
|
|
202
|
+
});
|
|
203
|
+
};
|
|
204
|
+
exports.createDefaultModel = createDefaultModel;
|
|
205
|
+
var isCorrect = function isCorrect(c) {
|
|
206
|
+
return c.correct === true;
|
|
207
|
+
};
|
|
208
|
+
var getScore = function getScore(config, sessionPart, key, partialScoringEnabled) {
|
|
209
|
+
var _ref2 = config && config[key] || {},
|
|
210
|
+
_ref2$choices = _ref2.choices,
|
|
211
|
+
choices = _ref2$choices === void 0 ? [] : _ref2$choices;
|
|
212
|
+
var maxScore = choices.length;
|
|
213
|
+
var _ref3 = sessionPart || {},
|
|
214
|
+
sessionPartValue = _ref3.value;
|
|
215
|
+
var chosen = function chosen(c) {
|
|
216
|
+
return !!(sessionPartValue || []).find(function (v) {
|
|
217
|
+
return v === c.value;
|
|
218
|
+
});
|
|
219
|
+
};
|
|
220
|
+
var correctAndNotChosen = function correctAndNotChosen(c) {
|
|
221
|
+
return isCorrect(c) && !chosen(c);
|
|
222
|
+
};
|
|
223
|
+
var incorrectAndChosen = function incorrectAndChosen(c) {
|
|
224
|
+
return !isCorrect(c) && chosen(c);
|
|
225
|
+
};
|
|
226
|
+
var correctChoices = choices.reduce(function (total, choice) {
|
|
227
|
+
if (correctAndNotChosen(choice) || incorrectAndChosen(choice)) {
|
|
228
|
+
return total - 1;
|
|
229
|
+
} else {
|
|
230
|
+
return total;
|
|
231
|
+
}
|
|
232
|
+
}, choices.length);
|
|
233
|
+
|
|
234
|
+
// determine score for a part
|
|
235
|
+
if (!partialScoringEnabled && correctChoices < maxScore) {
|
|
236
|
+
return 0;
|
|
237
|
+
}
|
|
238
|
+
return parseFloat(maxScore ? (correctChoices / maxScore).toFixed(2) : 0);
|
|
239
|
+
};
|
|
240
|
+
function outcome(config, session, env) {
|
|
241
|
+
return new Promise(function (resolve) {
|
|
242
|
+
var _ref4 = session || {},
|
|
243
|
+
value = _ref4.value;
|
|
244
|
+
if (!session || !value) {
|
|
245
|
+
resolve({
|
|
246
|
+
score: 0,
|
|
247
|
+
scoreA: 0,
|
|
248
|
+
scoreB: 0,
|
|
249
|
+
empty: true
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
if (value) {
|
|
253
|
+
var _ref5 = value || {},
|
|
254
|
+
partA = _ref5.partA,
|
|
255
|
+
partB = _ref5.partB;
|
|
256
|
+
var partialScoringEnabled = _controllerUtils.partialScoring.enabled(config, env);
|
|
257
|
+
var scoreA = getScore(config, partA, 'partA', partialScoringEnabled);
|
|
258
|
+
var scoreB = getScore(config, partB, 'partB', partialScoringEnabled);
|
|
259
|
+
if (!partialScoringEnabled) {
|
|
260
|
+
// The EBSR item is worth 1 point
|
|
261
|
+
// That point is awarded if and only if both parts are fully correct, otherwise no points are awarded
|
|
262
|
+
resolve({
|
|
263
|
+
score: scoreA === 1 && scoreB === 1 ? 1 : 0,
|
|
264
|
+
scoreA: scoreA,
|
|
265
|
+
scoreB: scoreB,
|
|
266
|
+
max: 1
|
|
267
|
+
});
|
|
268
|
+
} else {
|
|
269
|
+
// The EBSR item is worth 2 points
|
|
270
|
+
if (scoreA === 1) {
|
|
271
|
+
if (scoreB === 1) {
|
|
272
|
+
// If Part A and Part B are both correct, 2 points are awarded
|
|
273
|
+
resolve({
|
|
274
|
+
score: 2,
|
|
275
|
+
scoreA: scoreA,
|
|
276
|
+
scoreB: scoreB,
|
|
277
|
+
max: 2
|
|
278
|
+
});
|
|
279
|
+
} else {
|
|
280
|
+
// If Part A is correct and part B is incorrect, 1 point is awarded
|
|
281
|
+
resolve({
|
|
282
|
+
score: 1,
|
|
283
|
+
scoreA: scoreA,
|
|
284
|
+
scoreB: scoreB,
|
|
285
|
+
max: 2
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
} else {
|
|
289
|
+
// For all other combinations, no points are awarded
|
|
290
|
+
resolve({
|
|
291
|
+
score: 0,
|
|
292
|
+
scoreA: scoreA,
|
|
293
|
+
scoreB: scoreB,
|
|
294
|
+
max: 2
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
var returnPartCorrect = function returnPartCorrect(choices) {
|
|
302
|
+
var answers = [];
|
|
303
|
+
choices.forEach(function (i) {
|
|
304
|
+
var correct = i.correct,
|
|
305
|
+
value = i.value;
|
|
306
|
+
if (correct) {
|
|
307
|
+
answers.push(value);
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
return answers;
|
|
311
|
+
};
|
|
312
|
+
var createCorrectResponseSession = function createCorrectResponseSession(question, env) {
|
|
313
|
+
return new Promise(function (resolve) {
|
|
314
|
+
if (env.mode !== 'evaluate' && env.role === 'instructor') {
|
|
315
|
+
var partA = question.partA,
|
|
316
|
+
partB = question.partB;
|
|
317
|
+
var partACorrect = returnPartCorrect(partA.choices);
|
|
318
|
+
var partBCorrect = returnPartCorrect(partB.choices);
|
|
319
|
+
resolve({
|
|
320
|
+
value: {
|
|
321
|
+
partA: {
|
|
322
|
+
id: 'partA',
|
|
323
|
+
value: partACorrect
|
|
324
|
+
},
|
|
325
|
+
partB: {
|
|
326
|
+
id: 'partB',
|
|
327
|
+
value: partBCorrect
|
|
328
|
+
}
|
|
329
|
+
},
|
|
330
|
+
id: '1'
|
|
331
|
+
});
|
|
332
|
+
} else {
|
|
333
|
+
resolve(null);
|
|
334
|
+
}
|
|
335
|
+
});
|
|
336
|
+
};
|
|
337
|
+
exports.createCorrectResponseSession = createCorrectResponseSession;
|
|
338
|
+
var validatePart = function validatePart() {
|
|
339
|
+
var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
340
|
+
var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
341
|
+
var choices = model.choices;
|
|
342
|
+
var _config$minAnswerChoi = config.minAnswerChoices,
|
|
343
|
+
minAnswerChoices = _config$minAnswerChoi === void 0 ? 2 : _config$minAnswerChoi,
|
|
344
|
+
maxAnswerChoices = config.maxAnswerChoices;
|
|
345
|
+
var reversedChoices = (0, _toConsumableArray2["default"])(choices || []).reverse();
|
|
346
|
+
var choicesErrors = {};
|
|
347
|
+
var hasCorrectResponse = false;
|
|
348
|
+
reversedChoices.forEach(function (choice, index) {
|
|
349
|
+
var correct = choice.correct,
|
|
350
|
+
value = choice.value,
|
|
351
|
+
label = choice.label;
|
|
352
|
+
if (correct) {
|
|
353
|
+
hasCorrectResponse = true;
|
|
354
|
+
}
|
|
355
|
+
if (label === '' || label === '<div></div>') {
|
|
356
|
+
choicesErrors[value] = 'Content should not be empty.';
|
|
357
|
+
} else {
|
|
358
|
+
var identicalAnswer = reversedChoices.slice(index + 1).some(function (c) {
|
|
359
|
+
return c.label === label;
|
|
360
|
+
});
|
|
361
|
+
if (identicalAnswer) {
|
|
362
|
+
choicesErrors[value] = 'Content should be unique.';
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
});
|
|
366
|
+
var errors = {};
|
|
367
|
+
var nbOfChoices = (choices || []).length;
|
|
368
|
+
if (nbOfChoices < minAnswerChoices) {
|
|
369
|
+
errors.answerChoicesError = "There should be at least ".concat(minAnswerChoices, " choices defined.");
|
|
370
|
+
} else if (nbOfChoices > maxAnswerChoices) {
|
|
371
|
+
errors.answerChoicesError = "No more than ".concat(maxAnswerChoices, " choices should be defined.");
|
|
372
|
+
}
|
|
373
|
+
if (!hasCorrectResponse) {
|
|
374
|
+
errors.correctResponseError = 'No correct response defined.';
|
|
375
|
+
}
|
|
376
|
+
if (!(0, _isEmpty["default"])(choicesErrors)) {
|
|
377
|
+
errors.choicesErrors = choicesErrors;
|
|
378
|
+
}
|
|
379
|
+
return errors;
|
|
380
|
+
};
|
|
381
|
+
var validate = function validate() {
|
|
382
|
+
var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
383
|
+
var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
384
|
+
var _ref6 = model || {},
|
|
385
|
+
partA = _ref6.partA,
|
|
386
|
+
partB = _ref6.partB;
|
|
387
|
+
var _ref7 = config || {},
|
|
388
|
+
partAConfig = _ref7.partA,
|
|
389
|
+
partBConfig = _ref7.partB;
|
|
390
|
+
var partAErrors = validatePart(partA, partAConfig);
|
|
391
|
+
var partBErrors = validatePart(partB, partBConfig);
|
|
392
|
+
return {
|
|
393
|
+
partA: partAErrors,
|
|
394
|
+
partB: partBErrors
|
|
395
|
+
};
|
|
396
|
+
};
|
|
397
|
+
exports.validate = validate;
|
|
398
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["_defaults","_interopRequireDefault","require","_controllerUtils","_utils","_get","_isEmpty","_excluded","ownKeys","object","enumerableOnly","keys","Object","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","target","i","arguments","length","source","forEach","key","_defineProperty2","getOwnPropertyDescriptors","defineProperties","defineProperty","prepareChoice","model","env","defaultFeedback","choice","out","label","value","role","mode","rationale","rationaleEnabled","correct","feedbackEnabled","feedbackType","feedback","type","parsePart","part","session","assign","incorrect","choices","map","disabled","complete","min","c","responseCorrect","isResponseCorrect","undefined","normalize","_ref","_ref$partA","partA","_ref$partB","partB","question","_objectWithoutProperties2","partLabels","partLabelType","defaults","promptEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","gridColumns","choicesLayout","verticalMode","exports","_x","_x2","_x3","_x4","_model","_asyncToGenerator2","_regenerator","mark","_callee","updateSession","normalizedQuestion","shuffledValues","us","partASession","partALockChoiceOrder","_ref8","partAChoices","_ref9","partBChoices","partBSession","partBLockChoiceOrder","wrap","_callee$","_context","prev","next","id","element","update","Promise","resolve","get","lockChoices","getShuffledChoices","sent","isEmpty","e","console","error","partLabel","teacherInstructions","prompt","abrupt","stop","createDefaultModel","isCorrect","getScore","config","sessionPart","partialScoringEnabled","_ref2","_ref2$choices","maxScore","_ref3","sessionPartValue","chosen","find","v","correctAndNotChosen","incorrectAndChosen","correctChoices","reduce","total","parseFloat","toFixed","outcome","_ref4","score","scoreA","scoreB","empty","_ref5","partialScoring","enabled","max","returnPartCorrect","answers","createCorrectResponseSession","partACorrect","partBCorrect","validatePart","_config$minAnswerChoi","minAnswerChoices","maxAnswerChoices","reversedChoices","_toConsumableArray2","reverse","choicesErrors","hasCorrectResponse","index","identicalAnswer","slice","some","errors","nbOfChoices","answerChoicesError","concat","correctResponseError","validate","_ref6","_ref7","partAConfig","partBConfig","partAErrors","partBErrors"],"sources":["../src/index.js"],"sourcesContent":["import defaults from './defaults';\nimport { lockChoices, getShuffledChoices, partialScoring } from '@pie-lib/controller-utils';\nimport { isResponseCorrect } from './utils';\nimport get from 'lodash/get';\nimport isEmpty from 'lodash/isEmpty';\n\nconst prepareChoice = (model, env, defaultFeedback) => (choice) => {\n const out = {\n label: choice.label,\n value: choice.value,\n };\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.rationale = model.rationaleEnabled ? choice.rationale : null;\n } else {\n out.rationale = null;\n }\n\n if (env.mode === 'evaluate') {\n out.correct = !!choice.correct;\n\n if (model.feedbackEnabled) {\n const feedbackType = (choice.feedback && choice.feedback.type) || 'none';\n\n if (feedbackType === 'default') {\n out.feedback = defaultFeedback[choice.correct ? 'correct' : 'incorrect'];\n } else if (feedbackType === 'custom') {\n out.feedback = choice.feedback.value;\n }\n }\n }\n\n return out;\n};\n\nconst parsePart = (part, key, session, env) => {\n const defaultFeedback = Object.assign({ correct: 'Correct', incorrect: 'Incorrect' }, part.defaultFeedback);\n\n let choices = part.choices ? part.choices.map(prepareChoice(part, env, defaultFeedback)) : [];\n\n return {\n ...part,\n choices,\n disabled: env.mode !== 'gather',\n complete: {\n min: part.choices.filter((c) => c.correct).length,\n },\n responseCorrect: env.mode === 'evaluate' ? isResponseCorrect(part, key, session) : undefined,\n };\n};\n\nexport const normalize = ({ partA = {}, partB = {}, ...question }) => ({\n partLabels: true,\n partLabelType: 'Letters',\n ...question,\n partA: {\n ...defaults.partA,\n rationaleEnabled: true,\n feedbackEnabled: true,\n promptEnabled: true,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n gridColumns: '2',\n ...partA,\n choicesLayout: partA.choicesLayout || (partA.verticalMode === false && 'horizontal') || 'vertical',\n },\n partB: {\n ...defaults.partB,\n rationaleEnabled: true,\n promptEnabled: true,\n feedbackEnabled: true,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n gridColumns: '2',\n ...partB,\n choicesLayout: partB.choicesLayout || (partB.verticalMode === false && 'horizontal') || 'vertical',\n },\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 async function model(question, session, env, updateSession) {\n const normalizedQuestion = normalize(question);\n const partA = parsePart(normalizedQuestion.partA, 'partA', session, env);\n const partB = parsePart(normalizedQuestion.partB, 'partB', session, env);\n\n const shuffledValues = {};\n\n const us = (part) => (id, element, update) =>\n new Promise((resolve) => {\n shuffledValues[part] = update.shuffledValues;\n resolve();\n });\n\n const partASession = get(session, 'value.partA');\n const partALockChoiceOrder = lockChoices(normalizedQuestion.partA, partASession, env);\n\n const { choices: partAChoices } = partA || {};\n const { choices: partBChoices } = partB || {};\n\n if (!partALockChoiceOrder && partAChoices && partAChoices.length) {\n partA.choices = await getShuffledChoices(\n partAChoices,\n { shuffledValues: (session.shuffledValues || {}).partA },\n us('partA'),\n 'value',\n );\n }\n\n const partBSession = get(session, 'value.partB');\n const partBLockChoiceOrder = lockChoices(normalizedQuestion.partB, partBSession, env);\n\n if (!partBLockChoiceOrder && partBChoices && partBChoices.length) {\n partB.choices = await getShuffledChoices(\n partBChoices,\n { shuffledValues: (session.shuffledValues || {}).partB },\n us('partB'),\n 'value',\n );\n }\n\n if (!isEmpty(shuffledValues)) {\n if (updateSession && typeof updateSession === 'function') {\n updateSession(session.id, session.element, {\n shuffledValues,\n }).catch((e) => {\n console.error('update session failed', e);\n });\n }\n }\n\n if (normalizedQuestion.partLabels) {\n partA.partLabel = normalizedQuestion.partLabelType === 'Letters' ? 'Part A' : 'Part 1';\n partB.partLabel = normalizedQuestion.partLabelType === 'Letters' ? 'Part B' : 'Part 2';\n } else {\n partA.partLabel = undefined;\n partB.partLabel = undefined;\n }\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n partA.teacherInstructions = normalizedQuestion.partA.teacherInstructionsEnabled\n ? normalizedQuestion.partA.teacherInstructions\n : null;\n partB.teacherInstructions = normalizedQuestion.partB.teacherInstructionsEnabled\n ? normalizedQuestion.partB.teacherInstructions\n : null;\n } else {\n partA.teacherInstructions = null;\n partB.teacherInstructions = null;\n }\n\n partA.prompt = normalizedQuestion.partA.promptEnabled ? normalizedQuestion.partA.prompt : null;\n partB.prompt = normalizedQuestion.partB.promptEnabled ? normalizedQuestion.partB.prompt : null;\n\n return new Promise((resolve) => {\n resolve({\n disabled: env.mode !== 'gather',\n mode: env.mode,\n partA,\n partB,\n });\n });\n}\n\nexport const createDefaultModel = (model = {}) =>\n new Promise((resolve) => {\n resolve({\n ...defaults,\n ...model,\n });\n });\n\nconst isCorrect = (c) => c.correct === true;\n\nconst getScore = (config, sessionPart, key, partialScoringEnabled) => {\n const { choices = [] } = (config && config[key]) || {};\n const maxScore = choices.length;\n const { value: sessionPartValue } = sessionPart || {};\n\n const chosen = (c) => !!(sessionPartValue || []).find((v) => v === c.value);\n const correctAndNotChosen = (c) => isCorrect(c) && !chosen(c);\n const incorrectAndChosen = (c) => !isCorrect(c) && chosen(c);\n const correctChoices = choices.reduce((total, choice) => {\n if (correctAndNotChosen(choice) || incorrectAndChosen(choice)) {\n return total - 1;\n } else {\n return total;\n }\n }, choices.length);\n\n // determine score for a part\n if (!partialScoringEnabled && correctChoices < maxScore) {\n return 0;\n }\n\n return parseFloat(maxScore ? (correctChoices / maxScore).toFixed(2) : 0);\n};\n\nexport function outcome(config, session, env) {\n return new Promise((resolve) => {\n const { value } = session || {};\n\n if (!session || !value) {\n resolve({ score: 0, scoreA: 0, scoreB: 0, empty: true });\n }\n\n if (value) {\n const { partA, partB } = value || {};\n\n const partialScoringEnabled = partialScoring.enabled(config, env);\n\n const scoreA = getScore(config, partA, 'partA', partialScoringEnabled);\n const scoreB = getScore(config, partB, 'partB', partialScoringEnabled);\n\n if (!partialScoringEnabled) {\n // The EBSR item is worth 1 point\n // That point is awarded if and only if both parts are fully correct, otherwise no points are awarded\n resolve({ score: scoreA === 1 && scoreB === 1 ? 1 : 0, scoreA, scoreB, max: 1 });\n } else {\n // The EBSR item is worth 2 points\n if (scoreA === 1) {\n if (scoreB === 1) {\n // If Part A and Part B are both correct, 2 points are awarded\n resolve({ score: 2, scoreA, scoreB, max: 2 });\n } else {\n // If Part A is correct and part B is incorrect, 1 point is awarded\n resolve({ score: 1, scoreA, scoreB, max: 2 });\n }\n } else {\n // For all other combinations, no points are awarded\n resolve({ score: 0, scoreA, scoreB, max: 2 });\n }\n }\n }\n });\n}\n\nconst returnPartCorrect = (choices) => {\n let answers = [];\n\n choices.forEach((i) => {\n const { correct, value } = i;\n if (correct) {\n answers.push(value);\n }\n });\n return answers;\n};\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { partA, partB } = question;\n\n const partACorrect = returnPartCorrect(partA.choices);\n const partBCorrect = returnPartCorrect(partB.choices);\n\n resolve({\n value: {\n partA: {\n id: 'partA',\n value: partACorrect,\n },\n partB: {\n id: 'partB',\n value: partBCorrect,\n },\n },\n id: '1',\n });\n } else {\n resolve(null);\n }\n });\n};\n\nconst validatePart = (model = {}, config = {}) => {\n const { choices } = model;\n const { minAnswerChoices = 2, maxAnswerChoices } = config;\n const reversedChoices = [...(choices || [])].reverse();\n const choicesErrors = {};\n let hasCorrectResponse = false;\n\n reversedChoices.forEach((choice, index) => {\n const { correct, value, label } = choice;\n\n if (correct) {\n hasCorrectResponse = true;\n }\n\n if (label === '' || label === '<div></div>') {\n choicesErrors[value] = 'Content should not be empty.';\n } else {\n const identicalAnswer = reversedChoices.slice(index + 1).some((c) => c.label === label);\n\n if (identicalAnswer) {\n choicesErrors[value] = 'Content should be unique.';\n }\n }\n });\n\n const errors = {};\n const nbOfChoices = (choices || []).length;\n\n if (nbOfChoices < minAnswerChoices) {\n errors.answerChoicesError = `There should be at least ${minAnswerChoices} choices defined.`;\n } else if (nbOfChoices > maxAnswerChoices) {\n errors.answerChoicesError = `No more than ${maxAnswerChoices} choices should be defined.`;\n }\n\n if (!hasCorrectResponse) {\n errors.correctResponseError = 'No correct response defined.';\n }\n\n if (!isEmpty(choicesErrors)) {\n errors.choicesErrors = choicesErrors;\n }\n\n return errors;\n};\n\nexport const validate = (model = {}, config = {}) => {\n const { partA, partB } = model || {};\n const { partA: partAConfig, partB: partBConfig } = config || {};\n\n const partAErrors = validatePart(partA, partAConfig);\n const partBErrors = validatePart(partB, partBConfig);\n\n return { partA: partAErrors, partB: partBErrors };\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.isResponseCorrect = exports.getCorrectResponse = void 0;
|
|
8
|
+
var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
|
|
9
|
+
var getCorrectResponse = function getCorrectResponse(choices) {
|
|
10
|
+
return choices && choices.filter(function (c) {
|
|
11
|
+
return c.correct;
|
|
12
|
+
}).map(function (c) {
|
|
13
|
+
return c.value;
|
|
14
|
+
}).sort();
|
|
15
|
+
};
|
|
16
|
+
exports.getCorrectResponse = getCorrectResponse;
|
|
17
|
+
var isResponseCorrect = function isResponseCorrect(question, key, session) {
|
|
18
|
+
var correctResponse = getCorrectResponse(question.choices);
|
|
19
|
+
if (session && session.value) {
|
|
20
|
+
return (0, _isEqual["default"])((session.value[key].value || []).sort(), correctResponse);
|
|
21
|
+
}
|
|
22
|
+
return false;
|
|
23
|
+
};
|
|
24
|
+
exports.isResponseCorrect = isResponseCorrect;
|
|
25
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","names":["_isEqual","_interopRequireDefault","require","getCorrectResponse","choices","filter","c","correct","map","value","sort","exports","isResponseCorrect","question","key","session","correctResponse","isEqual"],"sources":["../src/utils.js"],"sourcesContent":["import isEqual from 'lodash/isEqual';\n\nexport const getCorrectResponse = (choices) =>\n choices &&\n choices\n .filter((c) => c.correct)\n .map((c) => c.value)\n .sort();\n\nexport const isResponseCorrect = (question, key, session) => {\n let correctResponse = getCorrectResponse(question.choices);\n\n if (session && session.value) {\n return isEqual((session.value[key].value || []).sort(), correctResponse);\n }\n\n return false;\n};\n"],"mappings":";;;;;;;AAAA,IAAAA,QAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEO,IAAMC,kBAAkB,GAAG,SAArBA,kBAAkBA,CAAIC,OAAO;EAAA,OACxCA,OAAO,IACPA,OAAO,CACJC,MAAM,CAAC,UAACC,CAAC;IAAA,OAAKA,CAAC,CAACC,OAAO;EAAA,EAAC,CACxBC,GAAG,CAAC,UAACF,CAAC;IAAA,OAAKA,CAAC,CAACG,KAAK;EAAA,EAAC,CACnBC,IAAI,CAAC,CAAC;AAAA;AAACC,OAAA,CAAAR,kBAAA,GAAAA,kBAAA;AAEL,IAAMS,iBAAiB,GAAG,SAApBA,iBAAiBA,CAAIC,QAAQ,EAAEC,GAAG,EAAEC,OAAO,EAAK;EAC3D,IAAIC,eAAe,GAAGb,kBAAkB,CAACU,QAAQ,CAACT,OAAO,CAAC;EAE1D,IAAIW,OAAO,IAAIA,OAAO,CAACN,KAAK,EAAE;IAC5B,OAAO,IAAAQ,mBAAO,EAAC,CAACF,OAAO,CAACN,KAAK,CAACK,GAAG,CAAC,CAACL,KAAK,IAAI,EAAE,EAAEC,IAAI,CAAC,CAAC,EAAEM,eAAe,CAAC;EAC1E;EAEA,OAAO,KAAK;AACd,CAAC;AAACL,OAAA,CAAAC,iBAAA,GAAAA,iBAAA"}
|