@pie-element/multiple-choice 11.0.1 → 11.0.2-esm.0
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/package.json +4 -4
- package/esm/configure.css +847 -0
- package/esm/configure.js +118 -15741
- package/esm/configure.js.map +1 -1
- package/esm/controller.css +847 -0
- package/esm/controller.js +102 -169
- package/esm/controller.js.map +1 -1
- package/esm/element.css +847 -0
- package/esm/element.js +1408 -12564
- package/esm/element.js.map +1 -1
- package/esm/print.css +847 -0
- package/esm/print.js +1385 -12541
- package/esm/print.js.map +1 -1
- package/module/controller.js +84 -81
- package/module/element.js +1 -1
- package/module/index.html +1 -1
- package/module/manifest.json +1 -1
- package/module/print.html +1 -1
- package/module/print.js +1 -1
- package/package.json +4 -4
package/esm/controller.js
CHANGED
|
@@ -2,40 +2,22 @@ import isEmpty from 'lodash/isEmpty';
|
|
|
2
2
|
import isEqual from 'lodash/isEqual';
|
|
3
3
|
import { lockChoices, getShuffledChoices, partialScoring } from '@pie-lib/controller-utils';
|
|
4
4
|
|
|
5
|
-
function
|
|
6
|
-
|
|
7
|
-
var
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
if (info.done) {
|
|
15
|
-
resolve(value);
|
|
16
|
-
} else {
|
|
17
|
-
Promise.resolve(value).then(_next, _throw);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
function _asyncToGenerator(fn) {
|
|
22
|
-
return function () {
|
|
23
|
-
var self = this,
|
|
24
|
-
args = arguments;
|
|
25
|
-
return new Promise(function (resolve, reject) {
|
|
26
|
-
var gen = fn.apply(self, args);
|
|
27
|
-
|
|
28
|
-
function _next(value) {
|
|
29
|
-
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
function _throw(err) {
|
|
33
|
-
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
5
|
+
function _extends() {
|
|
6
|
+
_extends = Object.assign || function (target) {
|
|
7
|
+
for (var i = 1; i < arguments.length; i++) {
|
|
8
|
+
var source = arguments[i];
|
|
9
|
+
|
|
10
|
+
for (var key in source) {
|
|
11
|
+
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
12
|
+
target[key] = source[key];
|
|
13
|
+
}
|
|
34
14
|
}
|
|
15
|
+
}
|
|
35
16
|
|
|
36
|
-
|
|
37
|
-
});
|
|
17
|
+
return target;
|
|
38
18
|
};
|
|
19
|
+
|
|
20
|
+
return _extends.apply(this, arguments);
|
|
39
21
|
}
|
|
40
22
|
|
|
41
23
|
function _objectWithoutPropertiesLoose(source, excluded) {
|
|
@@ -53,43 +35,9 @@ function _objectWithoutPropertiesLoose(source, excluded) {
|
|
|
53
35
|
return target;
|
|
54
36
|
}
|
|
55
37
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
var key, i;
|
|
60
|
-
|
|
61
|
-
if (Object.getOwnPropertySymbols) {
|
|
62
|
-
var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
|
|
63
|
-
|
|
64
|
-
for (i = 0; i < sourceSymbolKeys.length; i++) {
|
|
65
|
-
key = sourceSymbolKeys[i];
|
|
66
|
-
if (excluded.indexOf(key) >= 0) continue;
|
|
67
|
-
if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
|
|
68
|
-
target[key] = source[key];
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
return target;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
function _defineProperty(obj, key, value) {
|
|
76
|
-
if (key in obj) {
|
|
77
|
-
Object.defineProperty(obj, key, {
|
|
78
|
-
value: value,
|
|
79
|
-
enumerable: true,
|
|
80
|
-
configurable: true,
|
|
81
|
-
writable: true
|
|
82
|
-
});
|
|
83
|
-
} else {
|
|
84
|
-
obj[key] = value;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
return obj;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
var getCorrectResponse = choices => choices.filter(c => c.correct).map(c => c.value).sort();
|
|
91
|
-
var isResponseCorrect = (question, session) => {
|
|
92
|
-
var correctResponse = getCorrectResponse(question.choices);
|
|
38
|
+
const getCorrectResponse = choices => choices.filter(c => c.correct).map(c => c.value).sort();
|
|
39
|
+
const isResponseCorrect = (question, session) => {
|
|
40
|
+
let correctResponse = getCorrectResponse(question.choices);
|
|
93
41
|
return session && isEqual((session.value || []).sort(), correctResponse);
|
|
94
42
|
};
|
|
95
43
|
|
|
@@ -120,18 +68,14 @@ var defaults = {
|
|
|
120
68
|
keyboardEventsEnabled: false
|
|
121
69
|
};
|
|
122
70
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
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; }
|
|
126
|
-
|
|
127
|
-
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) { _defineProperty(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; }
|
|
71
|
+
const _excluded = ["verticalMode", "choicesLayout"];
|
|
128
72
|
|
|
129
|
-
|
|
130
|
-
|
|
73
|
+
const prepareChoice = (model, env, defaultFeedback) => choice => {
|
|
74
|
+
const {
|
|
131
75
|
role,
|
|
132
76
|
mode
|
|
133
77
|
} = env || {};
|
|
134
|
-
|
|
78
|
+
const out = {
|
|
135
79
|
label: choice.label,
|
|
136
80
|
value: choice.value
|
|
137
81
|
};
|
|
@@ -146,7 +90,7 @@ var prepareChoice = (model, env, defaultFeedback) => choice => {
|
|
|
146
90
|
out.correct = !!choice.correct;
|
|
147
91
|
|
|
148
92
|
if (model.feedbackEnabled) {
|
|
149
|
-
|
|
93
|
+
const feedbackType = choice.feedback && choice.feedback.type || 'none';
|
|
150
94
|
|
|
151
95
|
if (feedbackType === 'default') {
|
|
152
96
|
out.feedback = defaultFeedback[choice.correct ? 'correct' : 'incorrect'];
|
|
@@ -159,19 +103,18 @@ var prepareChoice = (model, env, defaultFeedback) => choice => {
|
|
|
159
103
|
return out;
|
|
160
104
|
};
|
|
161
105
|
|
|
162
|
-
function createDefaultModel() {
|
|
163
|
-
|
|
164
|
-
return new Promise(resolve => resolve(_objectSpread(_objectSpread({}, defaults), model)));
|
|
106
|
+
function createDefaultModel(model = {}) {
|
|
107
|
+
return new Promise(resolve => resolve(_extends({}, defaults, model)));
|
|
165
108
|
}
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
109
|
+
const normalize = question => {
|
|
110
|
+
const _ref = question || {},
|
|
111
|
+
{
|
|
169
112
|
verticalMode,
|
|
170
113
|
choicesLayout
|
|
171
114
|
} = _ref,
|
|
172
|
-
|
|
115
|
+
questionProps = _objectWithoutPropertiesLoose(_ref, _excluded);
|
|
173
116
|
|
|
174
|
-
return
|
|
117
|
+
return _extends({}, defaults, questionProps, {
|
|
175
118
|
// This is used for offering support for old models which have the property verticalMode
|
|
176
119
|
// Same thing is set in authoring : packages/multiple-choice/configure/src/index.jsx - createDefaultModel
|
|
177
120
|
choicesLayout: choicesLayout || verticalMode === false && 'horizontal' || defaults.choicesLayout
|
|
@@ -185,75 +128,67 @@ var normalize = question => {
|
|
|
185
128
|
* @param {*} updateSession - optional - a function that will set the properties passed into it on the session.
|
|
186
129
|
*/
|
|
187
130
|
|
|
188
|
-
function model(
|
|
189
|
-
|
|
190
|
-
|
|
131
|
+
async function model(question, session, env, updateSession) {
|
|
132
|
+
const normalizedQuestion = normalize(question);
|
|
133
|
+
const defaultFeedback = Object.assign({
|
|
134
|
+
correct: 'Correct',
|
|
135
|
+
incorrect: 'Incorrect'
|
|
136
|
+
}, normalizedQuestion.defaultFeedback);
|
|
137
|
+
let choices = (normalizedQuestion.choices || []).map(prepareChoice(normalizedQuestion, env, defaultFeedback));
|
|
138
|
+
const lockChoiceOrder = lockChoices(normalizedQuestion, session, env);
|
|
139
|
+
|
|
140
|
+
if (!lockChoiceOrder) {
|
|
141
|
+
choices = await getShuffledChoices(choices, session, updateSession, 'value');
|
|
142
|
+
}
|
|
191
143
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
144
|
+
const out = {
|
|
145
|
+
disabled: env.mode !== 'gather',
|
|
146
|
+
mode: env.mode,
|
|
147
|
+
prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,
|
|
148
|
+
choicesLayout: normalizedQuestion.choicesLayout,
|
|
149
|
+
gridColumns: normalizedQuestion.gridColumns,
|
|
150
|
+
choiceMode: normalizedQuestion.choiceMode,
|
|
151
|
+
keyMode: normalizedQuestion.choicePrefix,
|
|
152
|
+
choices,
|
|
153
|
+
responseCorrect: env.mode === 'evaluate' ? isResponseCorrect(normalizedQuestion, session) : undefined,
|
|
154
|
+
language: normalizedQuestion.language,
|
|
155
|
+
extraCSSRules: normalizedQuestion.extraCSSRules,
|
|
156
|
+
fontSizeFactor: normalizedQuestion.fontSizeFactor,
|
|
157
|
+
isSelectionButtonBelow: normalizedQuestion.isSelectionButtonBelow,
|
|
158
|
+
selectedAnswerBackgroundColor: normalizedQuestion.selectedAnswerBackgroundColor || 'initial',
|
|
159
|
+
selectedAnswerStrokeColor: normalizedQuestion.selectedAnswerStrokeColor || 'initial',
|
|
160
|
+
selectedAnswerStrokeWidth: normalizedQuestion.selectedAnswerStrokeWidth || 'initial',
|
|
161
|
+
hoverAnswerBackgroundColor: normalizedQuestion.hoverAnswerBackgroundColor || 'initial',
|
|
162
|
+
hoverAnswerStrokeColor: normalizedQuestion.hoverAnswerStrokeColor || 'initial',
|
|
163
|
+
hoverAnswerStrokeWidth: normalizedQuestion.hoverAnswerStrokeWidth || 'initial',
|
|
164
|
+
minSelections: normalizedQuestion.minSelections,
|
|
165
|
+
maxSelections: normalizedQuestion.maxSelections,
|
|
166
|
+
keyboardEventsEnabled: normalizedQuestion.keyboardEventsEnabled,
|
|
167
|
+
autoplayAudioEnabled: normalizedQuestion.autoplayAudioEnabled,
|
|
168
|
+
completeAudioEnabled: normalizedQuestion.completeAudioEnabled,
|
|
169
|
+
customAudioButton: normalizedQuestion.customAudioButton
|
|
170
|
+
};
|
|
171
|
+
const {
|
|
172
|
+
role,
|
|
173
|
+
mode
|
|
174
|
+
} = env || {};
|
|
205
175
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
gridColumns: normalizedQuestion.gridColumns,
|
|
212
|
-
choiceMode: normalizedQuestion.choiceMode,
|
|
213
|
-
keyMode: normalizedQuestion.choicePrefix,
|
|
214
|
-
choices,
|
|
215
|
-
responseCorrect: env.mode === 'evaluate' ? isResponseCorrect(normalizedQuestion, session) : undefined,
|
|
216
|
-
language: normalizedQuestion.language,
|
|
217
|
-
extraCSSRules: normalizedQuestion.extraCSSRules,
|
|
218
|
-
fontSizeFactor: normalizedQuestion.fontSizeFactor,
|
|
219
|
-
isSelectionButtonBelow: normalizedQuestion.isSelectionButtonBelow,
|
|
220
|
-
selectedAnswerBackgroundColor: normalizedQuestion.selectedAnswerBackgroundColor || 'initial',
|
|
221
|
-
selectedAnswerStrokeColor: normalizedQuestion.selectedAnswerStrokeColor || 'initial',
|
|
222
|
-
selectedAnswerStrokeWidth: normalizedQuestion.selectedAnswerStrokeWidth || 'initial',
|
|
223
|
-
hoverAnswerBackgroundColor: normalizedQuestion.hoverAnswerBackgroundColor || 'initial',
|
|
224
|
-
hoverAnswerStrokeColor: normalizedQuestion.hoverAnswerStrokeColor || 'initial',
|
|
225
|
-
hoverAnswerStrokeWidth: normalizedQuestion.hoverAnswerStrokeWidth || 'initial',
|
|
226
|
-
minSelections: normalizedQuestion.minSelections,
|
|
227
|
-
maxSelections: normalizedQuestion.maxSelections,
|
|
228
|
-
keyboardEventsEnabled: normalizedQuestion.keyboardEventsEnabled,
|
|
229
|
-
autoplayAudioEnabled: normalizedQuestion.autoplayAudioEnabled,
|
|
230
|
-
completeAudioEnabled: normalizedQuestion.completeAudioEnabled,
|
|
231
|
-
customAudioButton: normalizedQuestion.customAudioButton
|
|
232
|
-
};
|
|
233
|
-
var {
|
|
234
|
-
role,
|
|
235
|
-
mode
|
|
236
|
-
} = env || {};
|
|
237
|
-
|
|
238
|
-
if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {
|
|
239
|
-
out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled ? normalizedQuestion.teacherInstructions : null;
|
|
240
|
-
} else {
|
|
241
|
-
out.teacherInstructions = null;
|
|
242
|
-
}
|
|
176
|
+
if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {
|
|
177
|
+
out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled ? normalizedQuestion.teacherInstructions : null;
|
|
178
|
+
} else {
|
|
179
|
+
out.teacherInstructions = null;
|
|
180
|
+
}
|
|
243
181
|
|
|
244
|
-
|
|
245
|
-
});
|
|
246
|
-
return _model.apply(this, arguments);
|
|
182
|
+
return out;
|
|
247
183
|
}
|
|
248
|
-
|
|
249
|
-
var getScore = (config, session) => {
|
|
184
|
+
const getScore = (config, session) => {
|
|
250
185
|
if (!session || isEmpty(session)) {
|
|
251
186
|
return 0;
|
|
252
187
|
}
|
|
253
188
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
189
|
+
const selectedChoices = session.value || [];
|
|
190
|
+
const correctChoices = (config.choices || []).filter(ch => ch.correct);
|
|
191
|
+
let score = selectedChoices.reduce((acc, selectedChoice) => acc + (correctChoices.find(ch => ch.value === selectedChoice) ? 1 : 0), 0);
|
|
257
192
|
|
|
258
193
|
if (correctChoices.length < selectedChoices.length) {
|
|
259
194
|
score -= selectedChoices.length - correctChoices.length;
|
|
@@ -263,7 +198,7 @@ var getScore = (config, session) => {
|
|
|
263
198
|
}
|
|
264
199
|
}
|
|
265
200
|
|
|
266
|
-
|
|
201
|
+
const str = correctChoices.length ? score / correctChoices.length : 0;
|
|
267
202
|
return parseFloat(str.toFixed(2));
|
|
268
203
|
};
|
|
269
204
|
/**
|
|
@@ -284,8 +219,8 @@ function outcome(model, session, env) {
|
|
|
284
219
|
empty: true
|
|
285
220
|
});
|
|
286
221
|
} else {
|
|
287
|
-
|
|
288
|
-
|
|
222
|
+
const partialScoringEnabled = partialScoring.enabled(model, env) && model.choiceMode !== 'radio';
|
|
223
|
+
const score = getScore(model, session);
|
|
289
224
|
resolve({
|
|
290
225
|
score: partialScoringEnabled ? score : score === 1 ? 1 : 0,
|
|
291
226
|
empty: false
|
|
@@ -293,10 +228,10 @@ function outcome(model, session, env) {
|
|
|
293
228
|
}
|
|
294
229
|
});
|
|
295
230
|
}
|
|
296
|
-
|
|
231
|
+
const createCorrectResponseSession = (question, env) => {
|
|
297
232
|
return new Promise(resolve => {
|
|
298
233
|
if (env.mode !== 'evaluate' && env.role === 'instructor') {
|
|
299
|
-
|
|
234
|
+
const {
|
|
300
235
|
choices
|
|
301
236
|
} = question || {
|
|
302
237
|
choices: []
|
|
@@ -312,34 +247,32 @@ var createCorrectResponseSession = (question, env) => {
|
|
|
312
247
|
}; // remove all html tags
|
|
313
248
|
|
|
314
249
|
|
|
315
|
-
|
|
250
|
+
const getContent = html => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
|
|
316
251
|
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
320
|
-
var {
|
|
252
|
+
const validate = (model = {}, config = {}) => {
|
|
253
|
+
const {
|
|
321
254
|
choices
|
|
322
255
|
} = model;
|
|
323
|
-
|
|
256
|
+
const {
|
|
324
257
|
minAnswerChoices = 2,
|
|
325
258
|
maxAnswerChoices
|
|
326
259
|
} = config;
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
260
|
+
const reversedChoices = [...(choices || [])].reverse();
|
|
261
|
+
const choicesErrors = {};
|
|
262
|
+
const rationaleErrors = {};
|
|
263
|
+
const errors = {};
|
|
331
264
|
['teacherInstructions', 'prompt'].forEach(field => {
|
|
332
265
|
var _config$field;
|
|
333
266
|
|
|
334
|
-
if ((_config$field = config[field])
|
|
267
|
+
if ((_config$field = config[field]) != null && _config$field.required && !getContent(model[field])) {
|
|
335
268
|
errors[field] = 'This field is required.';
|
|
336
269
|
}
|
|
337
270
|
});
|
|
338
|
-
|
|
271
|
+
let hasCorrectResponse = false;
|
|
339
272
|
reversedChoices.forEach((choice, index) => {
|
|
340
273
|
var _config$rationale;
|
|
341
274
|
|
|
342
|
-
|
|
275
|
+
const {
|
|
343
276
|
correct,
|
|
344
277
|
value,
|
|
345
278
|
label,
|
|
@@ -353,23 +286,23 @@ var validate = function validate() {
|
|
|
353
286
|
if (!getContent(label)) {
|
|
354
287
|
choicesErrors[value] = 'Content should not be empty.';
|
|
355
288
|
} else {
|
|
356
|
-
|
|
289
|
+
const identicalAnswer = reversedChoices.slice(index + 1).some(c => c.label === label);
|
|
357
290
|
|
|
358
291
|
if (identicalAnswer) {
|
|
359
292
|
choicesErrors[value] = 'Content should be unique.';
|
|
360
293
|
}
|
|
361
294
|
}
|
|
362
295
|
|
|
363
|
-
if ((_config$rationale = config.rationale)
|
|
296
|
+
if ((_config$rationale = config.rationale) != null && _config$rationale.required && !getContent(rationale)) {
|
|
364
297
|
rationaleErrors[value] = 'This field is required.';
|
|
365
298
|
}
|
|
366
299
|
});
|
|
367
|
-
|
|
300
|
+
const nbOfChoices = (choices || []).length;
|
|
368
301
|
|
|
369
302
|
if (nbOfChoices < minAnswerChoices) {
|
|
370
|
-
errors.answerChoices =
|
|
303
|
+
errors.answerChoices = `There should be at least ${minAnswerChoices} choices defined.`;
|
|
371
304
|
} else if (nbOfChoices > maxAnswerChoices) {
|
|
372
|
-
errors.answerChoices =
|
|
305
|
+
errors.answerChoices = `No more than ${maxAnswerChoices} choices should be defined.`;
|
|
373
306
|
}
|
|
374
307
|
|
|
375
308
|
if (!hasCorrectResponse) {
|
package/esm/controller.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.js","sources":["../../../node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js","../../../node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","../../../node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js","../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js","../controller/src/utils.js","../controller/src/defaults.js","../controller/src/index.js"],"sourcesContent":["function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\n\nexport default function _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n\n _next(undefined);\n });\n };\n}","export default function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}","import objectWithoutPropertiesLoose from \"./objectWithoutPropertiesLoose.js\";\nexport default function _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}","export default function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}","import isEqual from 'lodash/isEqual';\n\nexport const getCorrectResponse = (choices) =>\n choices\n .filter((c) => c.correct)\n .map((c) => c.value)\n .sort();\n\nexport const isResponseCorrect = (question, session) => {\n let correctResponse = getCorrectResponse(question.choices);\n return session && isEqual((session.value || []).sort(), correctResponse);\n};\n","export default {\n choiceMode: 'checkbox',\n choicePrefix: 'letters',\n choices: [],\n choicesLayout: 'vertical',\n feedbackEnabled: false,\n gridColumns: 2,\n lockChoiceOrder: true,\n partialScoring: true,\n prompt: '',\n promptEnabled: true,\n rationale: '',\n rationaleEnabled: true,\n scoringType: 'auto',\n studentInstructionsEnabled: true,\n teacherInstructions: '',\n teacherInstructionsEnabled: true,\n toolbarEditorPosition: 'bottom',\n selectedAnswerBackgroundColor: 'initial',\n selectedAnswerStrokeColor: 'initial',\n selectedAnswerStrokeWidth: 'initial',\n hoverAnswerBackgroundColor: 'initial',\n hoverAnswerStrokeColor: 'initial',\n hoverAnswerStrokeWidth: 'initial',\n keyboardEventsEnabled: false,\n};\n","/* eslint-disable no-console */\nimport isEmpty from 'lodash/isEmpty';\nimport { isResponseCorrect } from './utils';\nimport defaults from './defaults';\nimport { lockChoices, partialScoring, getShuffledChoices } from '@pie-lib/controller-utils';\n\nconst prepareChoice = (model, env, defaultFeedback) => (choice) => {\n const { role, mode } = env || {};\n const out = {\n label: choice.label,\n value: choice.value,\n };\n\n if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {\n out.rationale = model.rationaleEnabled ? choice.rationale : null;\n } else {\n out.rationale = null;\n }\n\n if (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\nexport function createDefaultModel(model = {}) {\n return new Promise((resolve) => resolve({ ...defaults, ...model }));\n}\n\nexport const normalize = (question) => {\n const { verticalMode, choicesLayout, ...questionProps } = question || {};\n\n return {\n ...defaults,\n ...questionProps,\n // This is used for offering support for old models which have the property verticalMode\n // Same thing is set in authoring : packages/multiple-choice/configure/src/index.jsx - createDefaultModel\n choicesLayout: choicesLayout || (verticalMode === false && 'horizontal') || defaults.choicesLayout,\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\n const defaultFeedback = Object.assign(\n { correct: 'Correct', incorrect: 'Incorrect' },\n normalizedQuestion.defaultFeedback,\n );\n\n let choices = (normalizedQuestion.choices || []).map(prepareChoice(normalizedQuestion, env, defaultFeedback));\n\n const lockChoiceOrder = lockChoices(normalizedQuestion, session, env);\n\n if (!lockChoiceOrder) {\n choices = await getShuffledChoices(choices, session, updateSession, 'value');\n }\n\n const out = {\n disabled: env.mode !== 'gather',\n mode: env.mode,\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n choicesLayout: normalizedQuestion.choicesLayout,\n gridColumns: normalizedQuestion.gridColumns,\n choiceMode: normalizedQuestion.choiceMode,\n keyMode: normalizedQuestion.choicePrefix,\n choices,\n responseCorrect: env.mode === 'evaluate' ? isResponseCorrect(normalizedQuestion, session) : undefined,\n language: normalizedQuestion.language,\n extraCSSRules: normalizedQuestion.extraCSSRules,\n fontSizeFactor: normalizedQuestion.fontSizeFactor,\n isSelectionButtonBelow: normalizedQuestion.isSelectionButtonBelow,\n selectedAnswerBackgroundColor: normalizedQuestion.selectedAnswerBackgroundColor || 'initial',\n selectedAnswerStrokeColor: normalizedQuestion.selectedAnswerStrokeColor || 'initial',\n selectedAnswerStrokeWidth: normalizedQuestion.selectedAnswerStrokeWidth || 'initial',\n hoverAnswerBackgroundColor: normalizedQuestion.hoverAnswerBackgroundColor || 'initial',\n hoverAnswerStrokeColor: normalizedQuestion.hoverAnswerStrokeColor || 'initial',\n hoverAnswerStrokeWidth: normalizedQuestion.hoverAnswerStrokeWidth || 'initial',\n minSelections: normalizedQuestion.minSelections,\n maxSelections: normalizedQuestion.maxSelections,\n keyboardEventsEnabled: normalizedQuestion.keyboardEventsEnabled,\n autoplayAudioEnabled: normalizedQuestion.autoplayAudioEnabled,\n completeAudioEnabled: normalizedQuestion.completeAudioEnabled,\n customAudioButton: normalizedQuestion.customAudioButton,\n };\n\n const { role, mode } = env || {};\n\n if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n out.teacherInstructions = null;\n }\n\n return out;\n}\n\nexport const getScore = (config, session) => {\n if (!session || isEmpty(session)) {\n return 0;\n }\n\n const selectedChoices = session.value || [];\n const correctChoices = (config.choices || []).filter((ch) => ch.correct);\n\n let score = selectedChoices.reduce(\n (acc, selectedChoice) => acc + (correctChoices.find((ch) => ch.value === selectedChoice) ? 1 : 0),\n 0,\n );\n\n if (correctChoices.length < selectedChoices.length) {\n score -= selectedChoices.length - correctChoices.length;\n\n if (score < 0) {\n score = 0;\n }\n }\n\n const str = correctChoices.length ? score / correctChoices.length : 0;\n\n return parseFloat(str.toFixed(2));\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 = false. the value in `env` will\n * override the value in `model`.\n * @param {Object} model - the main model\n * @param {*} session\n * @param {Object} env\n */\nexport function outcome(model, session, env) {\n return new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n } else {\n const partialScoringEnabled = partialScoring.enabled(model, env) && model.choiceMode !== 'radio';\n const score = getScore(model, session);\n\n resolve({ score: partialScoringEnabled ? score : score === 1 ? 1 : 0, empty: false });\n }\n });\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { choices } = question || { choices: [] };\n\n resolve({\n id: '1',\n value: choices.filter((c) => c.correct).map((c) => c.value),\n });\n } else {\n resolve(null);\n }\n });\n};\n\n// remove all html tags\nconst getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');\n\n// remove all html tags except img, iframe and source tag for audio\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const { choices } = model;\n const { minAnswerChoices = 2, maxAnswerChoices } = config;\n const reversedChoices = [...(choices || [])].reverse();\n const choicesErrors = {};\n const rationaleErrors = {};\n const errors = {};\n\n ['teacherInstructions', 'prompt'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n let hasCorrectResponse = false;\n\n reversedChoices.forEach((choice, index) => {\n const { correct, value, label, rationale } = choice;\n\n if (correct) {\n hasCorrectResponse = true;\n }\n\n if (!getContent(label)) {\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 if (config.rationale?.required && !getContent(rationale)) {\n rationaleErrors[value] = 'This field is required.';\n }\n });\n\n const nbOfChoices = (choices || []).length;\n\n if (nbOfChoices < minAnswerChoices) {\n errors.answerChoices = `There should be at least ${minAnswerChoices} choices defined.`;\n } else if (nbOfChoices > maxAnswerChoices) {\n errors.answerChoices = `No more than ${maxAnswerChoices} choices should be defined.`;\n }\n\n if (!hasCorrectResponse) {\n errors.correctResponse = 'No correct response defined.';\n }\n\n if (!isEmpty(choicesErrors)) {\n errors.choices = choicesErrors;\n }\n\n if (!isEmpty(rationaleErrors)) {\n errors.rationale = rationaleErrors;\n }\n\n return errors;\n};\n"],"names":["objectWithoutPropertiesLoose","getCorrectResponse","choices","filter","c","correct","map","value","sort","isResponseCorrect","question","session","correctResponse","isEqual","choiceMode","choicePrefix","choicesLayout","feedbackEnabled","gridColumns","lockChoiceOrder","partialScoring","prompt","promptEnabled","rationale","rationaleEnabled","scoringType","studentInstructionsEnabled","teacherInstructions","teacherInstructionsEnabled","toolbarEditorPosition","selectedAnswerBackgroundColor","selectedAnswerStrokeColor","selectedAnswerStrokeWidth","hoverAnswerBackgroundColor","hoverAnswerStrokeColor","hoverAnswerStrokeWidth","keyboardEventsEnabled","prepareChoice","model","env","defaultFeedback","choice","role","mode","out","label","feedbackType","feedback","type","createDefaultModel","Promise","resolve","defaults","normalize","verticalMode","questionProps","updateSession","normalizedQuestion","Object","assign","incorrect","lockChoices","getShuffledChoices","disabled","keyMode","responseCorrect","undefined","language","extraCSSRules","fontSizeFactor","isSelectionButtonBelow","minSelections","maxSelections","autoplayAudioEnabled","completeAudioEnabled","customAudioButton","getScore","config","isEmpty","selectedChoices","correctChoices","ch","score","reduce","acc","selectedChoice","find","length","str","parseFloat","toFixed","outcome","empty","partialScoringEnabled","enabled","createCorrectResponseSession","id","getContent","html","replace","validate","minAnswerChoices","maxAnswerChoices","reversedChoices","reverse","choicesErrors","rationaleErrors","errors","forEach","field","required","hasCorrectResponse","index","identicalAnswer","slice","some","nbOfChoices","answerChoices"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"controller.js","sources":["../controller/src/utils.js","../controller/src/defaults.js","../controller/src/index.js"],"sourcesContent":["import isEqual from 'lodash/isEqual';\n\nexport const getCorrectResponse = (choices) =>\n choices\n .filter((c) => c.correct)\n .map((c) => c.value)\n .sort();\n\nexport const isResponseCorrect = (question, session) => {\n let correctResponse = getCorrectResponse(question.choices);\n return session && isEqual((session.value || []).sort(), correctResponse);\n};\n","export default {\n choiceMode: 'checkbox',\n choicePrefix: 'letters',\n choices: [],\n choicesLayout: 'vertical',\n feedbackEnabled: false,\n gridColumns: 2,\n lockChoiceOrder: true,\n partialScoring: true,\n prompt: '',\n promptEnabled: true,\n rationale: '',\n rationaleEnabled: true,\n scoringType: 'auto',\n studentInstructionsEnabled: true,\n teacherInstructions: '',\n teacherInstructionsEnabled: true,\n toolbarEditorPosition: 'bottom',\n selectedAnswerBackgroundColor: 'initial',\n selectedAnswerStrokeColor: 'initial',\n selectedAnswerStrokeWidth: 'initial',\n hoverAnswerBackgroundColor: 'initial',\n hoverAnswerStrokeColor: 'initial',\n hoverAnswerStrokeWidth: 'initial',\n keyboardEventsEnabled: false,\n};\n","/* eslint-disable no-console */\nimport isEmpty from 'lodash/isEmpty';\nimport { isResponseCorrect } from './utils';\nimport defaults from './defaults';\nimport { lockChoices, partialScoring, getShuffledChoices } from '@pie-lib/controller-utils';\n\nconst prepareChoice = (model, env, defaultFeedback) => (choice) => {\n const { role, mode } = env || {};\n const out = {\n label: choice.label,\n value: choice.value,\n };\n\n if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {\n out.rationale = model.rationaleEnabled ? choice.rationale : null;\n } else {\n out.rationale = null;\n }\n\n if (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\nexport function createDefaultModel(model = {}) {\n return new Promise((resolve) => resolve({ ...defaults, ...model }));\n}\n\nexport const normalize = (question) => {\n const { verticalMode, choicesLayout, ...questionProps } = question || {};\n\n return {\n ...defaults,\n ...questionProps,\n // This is used for offering support for old models which have the property verticalMode\n // Same thing is set in authoring : packages/multiple-choice/configure/src/index.jsx - createDefaultModel\n choicesLayout: choicesLayout || (verticalMode === false && 'horizontal') || defaults.choicesLayout,\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\n const defaultFeedback = Object.assign(\n { correct: 'Correct', incorrect: 'Incorrect' },\n normalizedQuestion.defaultFeedback,\n );\n\n let choices = (normalizedQuestion.choices || []).map(prepareChoice(normalizedQuestion, env, defaultFeedback));\n\n const lockChoiceOrder = lockChoices(normalizedQuestion, session, env);\n\n if (!lockChoiceOrder) {\n choices = await getShuffledChoices(choices, session, updateSession, 'value');\n }\n\n const out = {\n disabled: env.mode !== 'gather',\n mode: env.mode,\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n choicesLayout: normalizedQuestion.choicesLayout,\n gridColumns: normalizedQuestion.gridColumns,\n choiceMode: normalizedQuestion.choiceMode,\n keyMode: normalizedQuestion.choicePrefix,\n choices,\n responseCorrect: env.mode === 'evaluate' ? isResponseCorrect(normalizedQuestion, session) : undefined,\n language: normalizedQuestion.language,\n extraCSSRules: normalizedQuestion.extraCSSRules,\n fontSizeFactor: normalizedQuestion.fontSizeFactor,\n isSelectionButtonBelow: normalizedQuestion.isSelectionButtonBelow,\n selectedAnswerBackgroundColor: normalizedQuestion.selectedAnswerBackgroundColor || 'initial',\n selectedAnswerStrokeColor: normalizedQuestion.selectedAnswerStrokeColor || 'initial',\n selectedAnswerStrokeWidth: normalizedQuestion.selectedAnswerStrokeWidth || 'initial',\n hoverAnswerBackgroundColor: normalizedQuestion.hoverAnswerBackgroundColor || 'initial',\n hoverAnswerStrokeColor: normalizedQuestion.hoverAnswerStrokeColor || 'initial',\n hoverAnswerStrokeWidth: normalizedQuestion.hoverAnswerStrokeWidth || 'initial',\n minSelections: normalizedQuestion.minSelections,\n maxSelections: normalizedQuestion.maxSelections,\n keyboardEventsEnabled: normalizedQuestion.keyboardEventsEnabled,\n autoplayAudioEnabled: normalizedQuestion.autoplayAudioEnabled,\n completeAudioEnabled: normalizedQuestion.completeAudioEnabled,\n customAudioButton: normalizedQuestion.customAudioButton,\n };\n\n const { role, mode } = env || {};\n\n if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n out.teacherInstructions = null;\n }\n\n return out;\n}\n\nexport const getScore = (config, session) => {\n if (!session || isEmpty(session)) {\n return 0;\n }\n\n const selectedChoices = session.value || [];\n const correctChoices = (config.choices || []).filter((ch) => ch.correct);\n\n let score = selectedChoices.reduce(\n (acc, selectedChoice) => acc + (correctChoices.find((ch) => ch.value === selectedChoice) ? 1 : 0),\n 0,\n );\n\n if (correctChoices.length < selectedChoices.length) {\n score -= selectedChoices.length - correctChoices.length;\n\n if (score < 0) {\n score = 0;\n }\n }\n\n const str = correctChoices.length ? score / correctChoices.length : 0;\n\n return parseFloat(str.toFixed(2));\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 = false. the value in `env` will\n * override the value in `model`.\n * @param {Object} model - the main model\n * @param {*} session\n * @param {Object} env\n */\nexport function outcome(model, session, env) {\n return new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n } else {\n const partialScoringEnabled = partialScoring.enabled(model, env) && model.choiceMode !== 'radio';\n const score = getScore(model, session);\n\n resolve({ score: partialScoringEnabled ? score : score === 1 ? 1 : 0, empty: false });\n }\n });\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { choices } = question || { choices: [] };\n\n resolve({\n id: '1',\n value: choices.filter((c) => c.correct).map((c) => c.value),\n });\n } else {\n resolve(null);\n }\n });\n};\n\n// remove all html tags\nconst getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');\n\n// remove all html tags except img, iframe and source tag for audio\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const { choices } = model;\n const { minAnswerChoices = 2, maxAnswerChoices } = config;\n const reversedChoices = [...(choices || [])].reverse();\n const choicesErrors = {};\n const rationaleErrors = {};\n const errors = {};\n\n ['teacherInstructions', 'prompt'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n let hasCorrectResponse = false;\n\n reversedChoices.forEach((choice, index) => {\n const { correct, value, label, rationale } = choice;\n\n if (correct) {\n hasCorrectResponse = true;\n }\n\n if (!getContent(label)) {\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 if (config.rationale?.required && !getContent(rationale)) {\n rationaleErrors[value] = 'This field is required.';\n }\n });\n\n const nbOfChoices = (choices || []).length;\n\n if (nbOfChoices < minAnswerChoices) {\n errors.answerChoices = `There should be at least ${minAnswerChoices} choices defined.`;\n } else if (nbOfChoices > maxAnswerChoices) {\n errors.answerChoices = `No more than ${maxAnswerChoices} choices should be defined.`;\n }\n\n if (!hasCorrectResponse) {\n errors.correctResponse = 'No correct response defined.';\n }\n\n if (!isEmpty(choicesErrors)) {\n errors.choices = choicesErrors;\n }\n\n if (!isEmpty(rationaleErrors)) {\n errors.rationale = rationaleErrors;\n }\n\n return errors;\n};\n"],"names":["getCorrectResponse","choices","filter","c","correct","map","value","sort","isResponseCorrect","question","session","correctResponse","isEqual","choiceMode","choicePrefix","choicesLayout","feedbackEnabled","gridColumns","lockChoiceOrder","partialScoring","prompt","promptEnabled","rationale","rationaleEnabled","scoringType","studentInstructionsEnabled","teacherInstructions","teacherInstructionsEnabled","toolbarEditorPosition","selectedAnswerBackgroundColor","selectedAnswerStrokeColor","selectedAnswerStrokeWidth","hoverAnswerBackgroundColor","hoverAnswerStrokeColor","hoverAnswerStrokeWidth","keyboardEventsEnabled","prepareChoice","model","env","defaultFeedback","choice","role","mode","out","label","feedbackType","feedback","type","createDefaultModel","Promise","resolve","defaults","normalize","verticalMode","questionProps","updateSession","normalizedQuestion","Object","assign","incorrect","lockChoices","getShuffledChoices","disabled","keyMode","responseCorrect","undefined","language","extraCSSRules","fontSizeFactor","isSelectionButtonBelow","minSelections","maxSelections","autoplayAudioEnabled","completeAudioEnabled","customAudioButton","getScore","config","isEmpty","selectedChoices","correctChoices","ch","score","reduce","acc","selectedChoice","find","length","str","parseFloat","toFixed","outcome","empty","partialScoringEnabled","enabled","createCorrectResponseSession","id","getContent","html","replace","validate","minAnswerChoices","maxAnswerChoices","reversedChoices","reverse","choicesErrors","rationaleErrors","errors","forEach","field","required","hasCorrectResponse","index","identicalAnswer","slice","some","nbOfChoices","answerChoices"],"mappings":"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"}
|