@pie-element/ebsr 12.0.1 → 12.1.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/esm/controller.js DELETED
@@ -1,549 +0,0 @@
1
- import { lockChoices, getShuffledChoices, partialScoring } from '@pie-lib/controller-utils';
2
- import isEqual from 'lodash/isEqual';
3
- import get from 'lodash/get';
4
- import isEmpty from 'lodash/isEmpty';
5
- import Translator from '@pie-lib/translator';
6
-
7
- function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
8
- try {
9
- var info = gen[key](arg);
10
- var value = info.value;
11
- } catch (error) {
12
- reject(error);
13
- return;
14
- }
15
-
16
- if (info.done) {
17
- resolve(value);
18
- } else {
19
- Promise.resolve(value).then(_next, _throw);
20
- }
21
- }
22
-
23
- function _asyncToGenerator(fn) {
24
- return function () {
25
- var self = this,
26
- args = arguments;
27
- return new Promise(function (resolve, reject) {
28
- var gen = fn.apply(self, args);
29
-
30
- function _next(value) {
31
- asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
32
- }
33
-
34
- function _throw(err) {
35
- asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
36
- }
37
-
38
- _next(undefined);
39
- });
40
- };
41
- }
42
-
43
- function _objectWithoutPropertiesLoose(source, excluded) {
44
- if (source == null) return {};
45
- var target = {};
46
- var sourceKeys = Object.keys(source);
47
- var key, i;
48
-
49
- for (i = 0; i < sourceKeys.length; i++) {
50
- key = sourceKeys[i];
51
- if (excluded.indexOf(key) >= 0) continue;
52
- target[key] = source[key];
53
- }
54
-
55
- return target;
56
- }
57
-
58
- function _objectWithoutProperties(source, excluded) {
59
- if (source == null) return {};
60
- var target = _objectWithoutPropertiesLoose(source, excluded);
61
- var key, i;
62
-
63
- if (Object.getOwnPropertySymbols) {
64
- var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
65
-
66
- for (i = 0; i < sourceSymbolKeys.length; i++) {
67
- key = sourceSymbolKeys[i];
68
- if (excluded.indexOf(key) >= 0) continue;
69
- if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
70
- target[key] = source[key];
71
- }
72
- }
73
-
74
- return target;
75
- }
76
-
77
- function _defineProperty(obj, key, value) {
78
- if (key in obj) {
79
- Object.defineProperty(obj, key, {
80
- value: value,
81
- enumerable: true,
82
- configurable: true,
83
- writable: true
84
- });
85
- } else {
86
- obj[key] = value;
87
- }
88
-
89
- return obj;
90
- }
91
-
92
- function ownKeys$1(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; }
93
-
94
- function _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$1(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$1(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
95
-
96
- var partModel = base => _objectSpread$1({
97
- choiceMode: 'radio',
98
- choicePrefix: 'letters',
99
- choices: [],
100
- choicesLayout: 'vertical',
101
- feedbackEnabled: false,
102
- gridColumns: 2,
103
- prompt: '',
104
- promptEnabled: true,
105
- rationale: '',
106
- rationaleEnabled: true,
107
- spellCheckEnabled: true,
108
- studentInstructionsEnabled: true,
109
- teacherInstructions: '',
110
- teacherInstructionsEnabled: true,
111
- toolbarEditorPosition: 'bottom'
112
- }, base);
113
-
114
- var defaults = {
115
- partLabels: true,
116
- partLabelType: 'Letters',
117
- partA: partModel(),
118
- partB: partModel()
119
- };
120
-
121
- var getCorrectResponse = choices => choices && choices.filter(c => c.correct).map(c => c.value).sort();
122
- var isResponseCorrect = (question, key, session) => {
123
- var correctResponse = getCorrectResponse(question.choices);
124
-
125
- if (session && session.value) {
126
- return isEqual((session.value[key].value || []).sort(), correctResponse);
127
- }
128
-
129
- return false;
130
- };
131
-
132
- var _excluded = ["partA", "partB", "language"];
133
-
134
- 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; }
135
-
136
- 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; }
137
- var {
138
- translator
139
- } = Translator;
140
-
141
- var prepareChoice = (model, env, defaultFeedback) => choice => {
142
- var out = {
143
- label: choice.label,
144
- value: choice.value
145
- };
146
-
147
- if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {
148
- out.rationale = model.rationaleEnabled ? choice.rationale : null;
149
- } else {
150
- out.rationale = null;
151
- }
152
-
153
- if (env.mode === 'evaluate') {
154
- out.correct = !!choice.correct;
155
-
156
- if (model.feedbackEnabled) {
157
- var feedbackType = choice.feedback && choice.feedback.type || 'none';
158
-
159
- if (feedbackType === 'default') {
160
- out.feedback = defaultFeedback[choice.correct ? 'correct' : 'incorrect'];
161
- } else if (feedbackType === 'custom') {
162
- out.feedback = choice.feedback.value;
163
- }
164
- }
165
- }
166
-
167
- return out;
168
- };
169
-
170
- var parsePart = (part, key, session, env) => {
171
- var defaultFeedback = Object.assign({
172
- correct: 'Correct',
173
- incorrect: 'Incorrect'
174
- }, part.defaultFeedback);
175
- var choices = part.choices ? part.choices.map(prepareChoice(part, env, defaultFeedback)) : [];
176
- return _objectSpread(_objectSpread({}, part), {}, {
177
- choices,
178
- disabled: env.mode !== 'gather',
179
- complete: {
180
- min: part.choices.filter(c => c.correct).length
181
- },
182
- responseCorrect: env.mode === 'evaluate' ? isResponseCorrect(part, key, session) : undefined
183
- });
184
- };
185
-
186
- var normalizePart = (model, base) => _objectSpread(_objectSpread(_objectSpread({}, base), model), {}, {
187
- choicesLayout: model.choicesLayout || model.verticalMode === false && 'horizontal' || 'vertical'
188
- });
189
-
190
- var normalize = _ref => {
191
- var {
192
- partA = {},
193
- partB = {},
194
- language
195
- } = _ref,
196
- question = _objectWithoutProperties(_ref, _excluded);
197
-
198
- return _objectSpread(_objectSpread(_objectSpread({}, defaults), question), {}, {
199
- partA: normalizePart(partA, _objectSpread(_objectSpread({}, defaults.partA), {}, {
200
- language
201
- })),
202
- partB: normalizePart(partB, _objectSpread(_objectSpread({}, defaults.partB), {}, {
203
- language
204
- }))
205
- });
206
- };
207
- /**
208
- *
209
- * @param {*} question
210
- * @param {*} session
211
- * @param {*} env
212
- * @param {*} updateSession - optional - a function that will set the properties passed into it on the session.
213
- */
214
-
215
- function model(_x, _x2, _x3, _x4) {
216
- return _model.apply(this, arguments);
217
- }
218
-
219
- function _model() {
220
- _model = _asyncToGenerator(function* (question, session, env, updateSession) {
221
- var normalizedQuestion = normalize(question);
222
- var partA = parsePart(normalizedQuestion.partA, 'partA', session, env);
223
- var partB = parsePart(normalizedQuestion.partB, 'partB', session, env);
224
- var shuffledValues = {};
225
-
226
- var us = part => (id, element, update) => new Promise(resolve => {
227
- shuffledValues[part] = update.shuffledValues;
228
- resolve();
229
- });
230
-
231
- var partASession = get(session, 'value.partA');
232
- var partALockChoiceOrder = lockChoices(normalizedQuestion.partA, partASession, env);
233
- var {
234
- choices: partAChoices
235
- } = partA || {};
236
- var {
237
- choices: partBChoices
238
- } = partB || {};
239
-
240
- if (!partALockChoiceOrder && partAChoices && partAChoices.length) {
241
- partA.choices = yield getShuffledChoices(partAChoices, {
242
- shuffledValues: (session.shuffledValues || {}).partA
243
- }, us('partA'), 'value');
244
- }
245
-
246
- var partBSession = get(session, 'value.partB');
247
- var partBLockChoiceOrder = lockChoices(normalizedQuestion.partB, partBSession, env);
248
-
249
- if (!partBLockChoiceOrder && partBChoices && partBChoices.length) {
250
- partB.choices = yield getShuffledChoices(partBChoices, {
251
- shuffledValues: (session.shuffledValues || {}).partB
252
- }, us('partB'), 'value');
253
- }
254
-
255
- if (!isEmpty(shuffledValues)) {
256
- if (updateSession && typeof updateSession === 'function') {
257
- updateSession(session.id, session.element, {
258
- shuffledValues
259
- }).catch(e => {
260
- // eslint-disable-next-line no-console
261
- console.error('update session failed', e);
262
- });
263
- }
264
- }
265
-
266
- if (normalizedQuestion.partLabels) {
267
- var language = normalizedQuestion.language;
268
- partA.partLabel = translator.t('ebsr.part', {
269
- lng: language,
270
- index: normalizedQuestion.partLabelType === 'Letters' ? 'A' : '1'
271
- });
272
- partB.partLabel = translator.t('ebsr.part', {
273
- lng: language,
274
- index: normalizedQuestion.partLabelType === 'Letters' ? 'B' : '2'
275
- });
276
- } else {
277
- partA.partLabel = undefined;
278
- partB.partLabel = undefined;
279
- }
280
-
281
- if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {
282
- partA.teacherInstructions = normalizedQuestion.partA.teacherInstructionsEnabled ? normalizedQuestion.partA.teacherInstructions : null;
283
- partB.teacherInstructions = normalizedQuestion.partB.teacherInstructionsEnabled ? normalizedQuestion.partB.teacherInstructions : null;
284
- } else {
285
- partA.teacherInstructions = null;
286
- partB.teacherInstructions = null;
287
- }
288
-
289
- partA.prompt = normalizedQuestion.partA.promptEnabled ? normalizedQuestion.partA.prompt : null;
290
- partB.prompt = normalizedQuestion.partB.promptEnabled ? normalizedQuestion.partB.prompt : null;
291
- return new Promise(resolve => {
292
- resolve({
293
- disabled: env.mode !== 'gather',
294
- mode: env.mode,
295
- extraCSSRules: normalizedQuestion.extraCSSRules,
296
- partA,
297
- partB
298
- });
299
- });
300
- });
301
- return _model.apply(this, arguments);
302
- }
303
-
304
- var createDefaultModel = function createDefaultModel() {
305
- var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
306
- return new Promise(resolve => {
307
- resolve(_objectSpread(_objectSpread({}, defaults), model));
308
- });
309
- };
310
-
311
- var isCorrect = c => c.correct === true;
312
-
313
- var getScore = (config, sessionPart, key, partialScoringEnabled) => {
314
- var {
315
- choices = []
316
- } = config && config[key] || {};
317
- var maxScore = choices.length;
318
- var {
319
- value: sessionPartValue
320
- } = sessionPart || {};
321
-
322
- var chosen = c => !!(sessionPartValue || []).find(v => v === c.value);
323
-
324
- var correctAndNotChosen = c => isCorrect(c) && !chosen(c);
325
-
326
- var incorrectAndChosen = c => !isCorrect(c) && chosen(c);
327
-
328
- var correctChoices = choices.reduce((total, choice) => {
329
- if (correctAndNotChosen(choice) || incorrectAndChosen(choice)) {
330
- return total - 1;
331
- } else {
332
- return total;
333
- }
334
- }, choices.length); // determine score for a part
335
-
336
- if (!partialScoringEnabled && correctChoices < maxScore) {
337
- return 0;
338
- }
339
-
340
- return parseFloat(maxScore ? (correctChoices / maxScore).toFixed(2) : 0);
341
- };
342
-
343
- function outcome(config, session, env) {
344
- return new Promise(resolve => {
345
- var {
346
- value
347
- } = session || {};
348
-
349
- if (!session || !value) {
350
- resolve({
351
- score: 0,
352
- scoreA: 0,
353
- scoreB: 0,
354
- empty: true
355
- });
356
- }
357
-
358
- if (value) {
359
- var {
360
- partA,
361
- partB
362
- } = value || {};
363
- var partialScoringEnabled = partialScoring.enabled(config, env);
364
- var scoreA = getScore(config, partA, 'partA', partialScoringEnabled);
365
- var scoreB = getScore(config, partB, 'partB', partialScoringEnabled);
366
-
367
- if (!partialScoringEnabled) {
368
- // The EBSR item is worth 1 point
369
- // That point is awarded if and only if both parts are fully correct, otherwise no points are awarded
370
- resolve({
371
- score: scoreA === 1 && scoreB === 1 ? 1 : 0,
372
- scoreA,
373
- scoreB,
374
- max: 1
375
- });
376
- } else {
377
- // The EBSR item is worth 2 points
378
- if (scoreA === 1) {
379
- if (scoreB === 1) {
380
- // If Part A and Part B are both correct, 2 points are awarded
381
- resolve({
382
- score: 2,
383
- scoreA,
384
- scoreB,
385
- max: 2
386
- });
387
- } else {
388
- // If Part A is correct and part B is incorrect, 1 point is awarded
389
- resolve({
390
- score: 1,
391
- scoreA,
392
- scoreB,
393
- max: 2
394
- });
395
- }
396
- } else {
397
- // For all other combinations, no points are awarded
398
- resolve({
399
- score: 0,
400
- scoreA,
401
- scoreB,
402
- max: 2
403
- });
404
- }
405
- }
406
- }
407
- });
408
- }
409
-
410
- var returnPartCorrect = choices => {
411
- var answers = [];
412
- choices.forEach(i => {
413
- var {
414
- correct,
415
- value
416
- } = i;
417
-
418
- if (correct) {
419
- answers.push(value);
420
- }
421
- });
422
- return answers;
423
- };
424
-
425
- var createCorrectResponseSession = (question, env) => {
426
- return new Promise(resolve => {
427
- if (env.mode !== 'evaluate' && env.role === 'instructor') {
428
- var {
429
- partA,
430
- partB
431
- } = question;
432
- var partACorrect = returnPartCorrect(partA.choices);
433
- var partBCorrect = returnPartCorrect(partB.choices);
434
- resolve({
435
- value: {
436
- partA: {
437
- id: 'partA',
438
- value: partACorrect
439
- },
440
- partB: {
441
- id: 'partB',
442
- value: partBCorrect
443
- }
444
- },
445
- id: '1'
446
- });
447
- } else {
448
- resolve(null);
449
- }
450
- });
451
- }; // remove all html tags
452
-
453
-
454
- var getContent = html => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
455
-
456
- var validatePart = function validatePart() {
457
- var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
458
- var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
459
- var {
460
- choices
461
- } = model;
462
- var {
463
- minAnswerChoices = 2,
464
- maxAnswerChoices
465
- } = config;
466
- var reversedChoices = [...(choices || [])].reverse();
467
- var errors = {};
468
- var choicesErrors = {};
469
- var rationaleErrors = {};
470
- var hasCorrectResponse = false;
471
- ['teacherInstructions', 'prompt'].forEach(field => {
472
- var _config$field;
473
-
474
- if ((_config$field = config[field]) !== null && _config$field !== void 0 && _config$field.required && !getContent(model[field])) {
475
- errors[field] = 'This field is required.';
476
- }
477
- });
478
- reversedChoices.forEach((choice, index) => {
479
- var _config$rationale;
480
-
481
- var {
482
- correct,
483
- value,
484
- label,
485
- rationale
486
- } = choice;
487
-
488
- if (correct) {
489
- hasCorrectResponse = true;
490
- }
491
-
492
- if (!getContent(label)) {
493
- choicesErrors[value] = 'Content should not be empty.';
494
- } else {
495
- var identicalAnswer = reversedChoices.slice(index + 1).some(c => c.label === label);
496
-
497
- if (identicalAnswer) {
498
- choicesErrors[value] = 'Content should be unique.';
499
- }
500
- }
501
-
502
- if ((_config$rationale = config.rationale) !== null && _config$rationale !== void 0 && _config$rationale.required && !getContent(rationale)) {
503
- rationaleErrors[value] = 'This field is required.';
504
- }
505
- });
506
- var nbOfChoices = (choices || []).length;
507
-
508
- if (nbOfChoices < minAnswerChoices) {
509
- errors.answerChoices = "There should be at least ".concat(minAnswerChoices, " choices defined.");
510
- } else if (nbOfChoices > maxAnswerChoices) {
511
- errors.answerChoices = "No more than ".concat(maxAnswerChoices, " choices should be defined.");
512
- }
513
-
514
- if (!hasCorrectResponse) {
515
- errors.correctResponse = 'No correct response defined.';
516
- }
517
-
518
- if (!isEmpty(choicesErrors)) {
519
- errors.choices = choicesErrors;
520
- }
521
-
522
- if (!isEmpty(rationaleErrors)) {
523
- errors.rationale = rationaleErrors;
524
- }
525
-
526
- return errors;
527
- };
528
-
529
- var validate = function validate() {
530
- var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
531
- var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
532
- var {
533
- partA,
534
- partB
535
- } = model || {};
536
- var {
537
- partA: partAConfig,
538
- partB: partBConfig
539
- } = config || {};
540
- var partAErrors = validatePart(partA, partAConfig);
541
- var partBErrors = validatePart(partB, partBConfig);
542
- return {
543
- partA: partAErrors,
544
- partB: partBErrors
545
- };
546
- };
547
-
548
- export { createCorrectResponseSession, createDefaultModel, model, normalize, outcome, validate };
549
- //# sourceMappingURL=controller.js.map
@@ -1 +0,0 @@
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/defaults.js","../controller/src/utils.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}","const partModel = (base) => ({\n choiceMode: 'radio',\n choicePrefix: 'letters',\n choices: [],\n choicesLayout: 'vertical',\n feedbackEnabled: false,\n gridColumns: 2,\n prompt: '',\n promptEnabled: true,\n rationale: '',\n rationaleEnabled: true,\n spellCheckEnabled: true,\n studentInstructionsEnabled: true,\n teacherInstructions: '',\n teacherInstructionsEnabled: true,\n toolbarEditorPosition: 'bottom',\n ...base,\n});\n\nexport default {\n partLabels: true,\n partLabelType: 'Letters',\n partA: partModel(),\n partB: partModel(),\n};\n","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","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';\nimport Translator from '@pie-lib/translator';\n\nconst { translator } = Translator;\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\nconst normalizePart = (model, base) => ({\n ...base,\n ...model,\n choicesLayout: model.choicesLayout || (model.verticalMode === false && 'horizontal') || 'vertical',\n});\n\nexport const normalize = ({ partA = {}, partB = {}, language, ...question }) => ({\n ...defaults,\n ...question,\n partA: normalizePart(partA, { ...defaults.partA, language }),\n partB: normalizePart(partB, { ...defaults.partB, language }),\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 // eslint-disable-next-line no-console\n console.error('update session failed', e);\n });\n }\n }\n\n if (normalizedQuestion.partLabels) {\n const language = normalizedQuestion.language;\n partA.partLabel = translator.t('ebsr.part', {\n lng: language,\n index: normalizedQuestion.partLabelType === 'Letters' ? 'A' : '1',\n });\n partB.partLabel = translator.t('ebsr.part', {\n lng: language,\n index: normalizedQuestion.partLabelType === 'Letters' ? 'B' : '2',\n });\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 extraCSSRules: normalizedQuestion.extraCSSRules,\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\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\nconst validatePart = (model = {}, config = {}) => {\n const { choices } = model;\n const { minAnswerChoices = 2, maxAnswerChoices } = config;\n const reversedChoices = [...(choices || [])].reverse();\n const errors = {};\n const choicesErrors = {};\n const rationaleErrors = {};\n let hasCorrectResponse = false;\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 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\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"],"names":["objectWithoutPropertiesLoose","partModel","base","_objectSpread","choiceMode","choicePrefix","choices","choicesLayout","feedbackEnabled","gridColumns","prompt","promptEnabled","rationale","rationaleEnabled","spellCheckEnabled","studentInstructionsEnabled","teacherInstructions","teacherInstructionsEnabled","toolbarEditorPosition","partLabels","partLabelType","partA","partB","getCorrectResponse","filter","c","correct","map","value","sort","isResponseCorrect","question","key","session","correctResponse","isEqual","translator","Translator","prepareChoice","model","env","defaultFeedback","choice","out","label","role","mode","feedbackType","feedback","type","parsePart","part","Object","assign","incorrect","disabled","complete","min","length","responseCorrect","undefined","normalizePart","verticalMode","normalize","language","defaults","updateSession","normalizedQuestion","shuffledValues","us","id","element","update","Promise","resolve","partASession","get","partALockChoiceOrder","lockChoices","partAChoices","partBChoices","getShuffledChoices","partBSession","partBLockChoiceOrder","isEmpty","catch","e","console","error","partLabel","t","lng","index","extraCSSRules","createDefaultModel","isCorrect","getScore","config","sessionPart","partialScoringEnabled","maxScore","sessionPartValue","chosen","find","v","correctAndNotChosen","incorrectAndChosen","correctChoices","reduce","total","parseFloat","toFixed","outcome","score","scoreA","scoreB","empty","partialScoring","enabled","max","returnPartCorrect","answers","forEach","i","push","createCorrectResponseSession","partACorrect","partBCorrect","getContent","html","replace","validatePart","minAnswerChoices","maxAnswerChoices","reversedChoices","reverse","errors","choicesErrors","rationaleErrors","hasCorrectResponse","field","required","identicalAnswer","slice","some","nbOfChoices","answerChoices","validate","partAConfig","partBConfig","partAErrors","partBErrors"],"mappings":"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"}