@pie-element/inline-dropdown 8.0.1-next.0 → 8.0.1
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 +5 -5
- package/controller/package.json +2 -2
- package/esm/configure.js +18187 -0
- package/esm/configure.js.map +1 -0
- package/esm/controller.js +364 -0
- package/esm/controller.js.map +1 -0
- package/esm/element.js +7677 -0
- package/esm/element.js.map +1 -0
- package/package.json +24 -7
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
import map from 'lodash/map';
|
|
2
|
+
import reduce from 'lodash/reduce';
|
|
3
|
+
import isEmpty from 'lodash/isEmpty';
|
|
4
|
+
import { partialScoring, lockChoices, getShuffledChoices } from '@pie-lib/controller-utils';
|
|
5
|
+
import forEach from 'lodash/forEach';
|
|
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 _defineProperty(obj, key, value) {
|
|
44
|
+
if (key in obj) {
|
|
45
|
+
Object.defineProperty(obj, key, {
|
|
46
|
+
value: value,
|
|
47
|
+
enumerable: true,
|
|
48
|
+
configurable: true,
|
|
49
|
+
writable: true
|
|
50
|
+
});
|
|
51
|
+
} else {
|
|
52
|
+
obj[key] = value;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return obj;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
var defaults = {
|
|
59
|
+
alternateResponse: {},
|
|
60
|
+
choiceRationaleEnabled: true,
|
|
61
|
+
choices: {},
|
|
62
|
+
disabled: false,
|
|
63
|
+
displayType: 'block',
|
|
64
|
+
markup: '',
|
|
65
|
+
mode: 'gather',
|
|
66
|
+
prompt: '',
|
|
67
|
+
promptEnabled: true,
|
|
68
|
+
rationale: '',
|
|
69
|
+
rationaleEnabled: true,
|
|
70
|
+
shuffle: true,
|
|
71
|
+
studentInstructionsEnabled: true,
|
|
72
|
+
teacherInstructions: '',
|
|
73
|
+
teacherInstructionsEnabled: true,
|
|
74
|
+
toolbarEditorPosition: 'bottom'
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
var getAllCorrectResponses = _ref => {
|
|
78
|
+
var {
|
|
79
|
+
choices,
|
|
80
|
+
alternateResponse
|
|
81
|
+
} = _ref;
|
|
82
|
+
alternateResponse = alternateResponse || {};
|
|
83
|
+
var correctAnswers = {};
|
|
84
|
+
forEach(choices, (respArea, key) => {
|
|
85
|
+
if (!correctAnswers[key]) {
|
|
86
|
+
correctAnswers[key] = [];
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (respArea) {
|
|
90
|
+
respArea.forEach(choice => {
|
|
91
|
+
if (choice.correct) {
|
|
92
|
+
correctAnswers[key].push(choice.value);
|
|
93
|
+
|
|
94
|
+
if (alternateResponse[key]) {
|
|
95
|
+
correctAnswers[key] = [...correctAnswers[key], ...alternateResponse[key]];
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
return correctAnswers;
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
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; }
|
|
105
|
+
|
|
106
|
+
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; }
|
|
107
|
+
|
|
108
|
+
var getFeedback = correct => {
|
|
109
|
+
if (correct) {
|
|
110
|
+
return 'correct';
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return 'incorrect';
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
var normalize = question => _objectSpread(_objectSpread({}, defaults), question);
|
|
117
|
+
/**
|
|
118
|
+
*
|
|
119
|
+
* @param {*} question
|
|
120
|
+
* @param {*} session
|
|
121
|
+
* @param {*} env
|
|
122
|
+
* @param {*} updateSession - optional - a function that will set the properties passed into it on the session.
|
|
123
|
+
*/
|
|
124
|
+
|
|
125
|
+
function model(question, session, env, updateSession) {
|
|
126
|
+
return new Promise( /*#__PURE__*/function () {
|
|
127
|
+
var _ref = _asyncToGenerator(function* (resolve) {
|
|
128
|
+
var normalizedQuestion = normalize(question);
|
|
129
|
+
var {
|
|
130
|
+
value = {}
|
|
131
|
+
} = session || {};
|
|
132
|
+
var choices = reduce(normalizedQuestion.choices, (obj, area, key) => {
|
|
133
|
+
obj[key] = map(area, choice => choice);
|
|
134
|
+
return obj;
|
|
135
|
+
}, {});
|
|
136
|
+
var feedback = {};
|
|
137
|
+
|
|
138
|
+
if (env.mode === 'evaluate') {
|
|
139
|
+
var allCorrectResponses = getAllCorrectResponses(normalizedQuestion);
|
|
140
|
+
var respAreaLength = Object.keys(allCorrectResponses).length;
|
|
141
|
+
var correctResponses = 0;
|
|
142
|
+
|
|
143
|
+
var _loop = function _loop(i) {
|
|
144
|
+
var result = reduce(allCorrectResponses, (obj, choices, key) => {
|
|
145
|
+
var answer = value && value[key] || '';
|
|
146
|
+
var correctChoice = choices[i] || '';
|
|
147
|
+
var isCorrect = answer && correctChoice && correctChoice === answer;
|
|
148
|
+
obj.feedback[key] = getFeedback(isCorrect);
|
|
149
|
+
|
|
150
|
+
if (isCorrect) {
|
|
151
|
+
obj.correctResponses += 1;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return obj;
|
|
155
|
+
}, {
|
|
156
|
+
correctResponses: 0,
|
|
157
|
+
feedback: {}
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
if (result.correctResponses >= correctResponses) {
|
|
161
|
+
correctResponses = result.correctResponses;
|
|
162
|
+
feedback = result.feedback;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
if (result.correctResponses === respAreaLength) {
|
|
166
|
+
return "break";
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
for (var i = 0; i < respAreaLength; i++) {
|
|
171
|
+
var _ret = _loop(i);
|
|
172
|
+
|
|
173
|
+
if (_ret === "break") break;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
var lockChoiceOrder = lockChoices(normalizedQuestion, session, env);
|
|
178
|
+
|
|
179
|
+
if (!lockChoiceOrder) {
|
|
180
|
+
var keys = Object.keys(choices);
|
|
181
|
+
|
|
182
|
+
var _i;
|
|
183
|
+
|
|
184
|
+
for (_i = 0; _i < keys.length; _i++) {
|
|
185
|
+
var key = keys[_i];
|
|
186
|
+
choices[key] = yield getShuffledChoices(choices[key], session, updateSession, 'value');
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
var teacherInstructions = null;
|
|
191
|
+
var rationale = null;
|
|
192
|
+
var choicesWillNullRationales = (Object.keys(choices) || []).reduce((acc, currentValue) => {
|
|
193
|
+
acc[currentValue] = (choices[currentValue] || []).map(choice => _objectSpread(_objectSpread({}, choice), {}, {
|
|
194
|
+
rationale: null
|
|
195
|
+
}));
|
|
196
|
+
return acc;
|
|
197
|
+
}, {});
|
|
198
|
+
|
|
199
|
+
if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {
|
|
200
|
+
rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;
|
|
201
|
+
teacherInstructions = normalizedQuestion.teacherInstructionsEnabled ? normalizedQuestion.teacherInstructions : null;
|
|
202
|
+
choices = normalizedQuestion.choiceRationaleEnabled ? normalizedQuestion.choices : choicesWillNullRationales;
|
|
203
|
+
} else {
|
|
204
|
+
rationale = null;
|
|
205
|
+
teacherInstructions = null;
|
|
206
|
+
choices = choicesWillNullRationales;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
var out = {
|
|
210
|
+
disabled: env.mode !== 'gather',
|
|
211
|
+
mode: env.mode,
|
|
212
|
+
prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,
|
|
213
|
+
displayType: normalizedQuestion.displayType,
|
|
214
|
+
markup: normalizedQuestion.markup,
|
|
215
|
+
choices,
|
|
216
|
+
feedback,
|
|
217
|
+
responseCorrect: env.mode === 'evaluate' ? getScore(normalizedQuestion, session) === 1 : undefined,
|
|
218
|
+
rationale,
|
|
219
|
+
teacherInstructions,
|
|
220
|
+
language: normalizedQuestion.language,
|
|
221
|
+
extraCSSRules: normalizedQuestion.extraCSSRules
|
|
222
|
+
};
|
|
223
|
+
resolve(out);
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
return function (_x) {
|
|
227
|
+
return _ref.apply(this, arguments);
|
|
228
|
+
};
|
|
229
|
+
}());
|
|
230
|
+
}
|
|
231
|
+
var getScore = (config, session) => {
|
|
232
|
+
var {
|
|
233
|
+
value = {}
|
|
234
|
+
} = session || {};
|
|
235
|
+
var maxScore = config && config.choices ? Object.keys(config.choices).length : 0;
|
|
236
|
+
var allCorrectResponses = getAllCorrectResponses(config);
|
|
237
|
+
var correctCount = 0;
|
|
238
|
+
|
|
239
|
+
var _loop2 = function _loop2(i) {
|
|
240
|
+
var result = reduce(allCorrectResponses, (total, choices, key) => {
|
|
241
|
+
var answer = value && value[key] || '';
|
|
242
|
+
var correctChoice = choices[i] || '';
|
|
243
|
+
|
|
244
|
+
if (correctChoice && answer && correctChoice === answer) {
|
|
245
|
+
return total;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
return total - 1;
|
|
249
|
+
}, maxScore);
|
|
250
|
+
|
|
251
|
+
if (result > correctCount) {
|
|
252
|
+
correctCount = result;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
if (result === maxScore) {
|
|
256
|
+
return "break";
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
for (var i = 0; i < maxScore; i++) {
|
|
261
|
+
var _ret2 = _loop2(i);
|
|
262
|
+
|
|
263
|
+
if (_ret2 === "break") break;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
var str = (correctCount / maxScore).toFixed(2);
|
|
267
|
+
return parseFloat(str);
|
|
268
|
+
};
|
|
269
|
+
/**
|
|
270
|
+
*
|
|
271
|
+
* The score is partial by default for checkbox mode, allOrNothing for radio mode.
|
|
272
|
+
* To disable partial scoring for checkbox mode you either set model.partialScoring = false or env.partialScoring =
|
|
273
|
+
* false. the value in `env` will override the value in `model`.
|
|
274
|
+
* @param {Object} model - the main model
|
|
275
|
+
* @param {boolean} model.partialScoring - is partial scoring enabled (if undefined set to to true)
|
|
276
|
+
* @param {*} session
|
|
277
|
+
* @param {Object} env
|
|
278
|
+
* @param {boolean} env.partialScoring - is partial scoring enabled (if undefined default to true) This overrides
|
|
279
|
+
* `model.partialScoring`.
|
|
280
|
+
*/
|
|
281
|
+
|
|
282
|
+
function outcome(model, session) {
|
|
283
|
+
var env = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
284
|
+
return new Promise(resolve => {
|
|
285
|
+
if (!session || isEmpty(session)) {
|
|
286
|
+
resolve({
|
|
287
|
+
score: 0,
|
|
288
|
+
empty: true
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
var partialScoringEnabled = partialScoring.enabled(model, env);
|
|
293
|
+
var score = getScore(model, session);
|
|
294
|
+
resolve({
|
|
295
|
+
score: partialScoringEnabled ? score : Math.floor(score),
|
|
296
|
+
empty: false
|
|
297
|
+
});
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
var createCorrectResponseSession = (question, env) => {
|
|
301
|
+
return new Promise(resolve => {
|
|
302
|
+
if (env.mode !== 'evaluate' && env.role === 'instructor') {
|
|
303
|
+
var {
|
|
304
|
+
choices
|
|
305
|
+
} = question;
|
|
306
|
+
var value = {};
|
|
307
|
+
|
|
308
|
+
if (choices) {
|
|
309
|
+
Object.keys(choices).forEach((key, i) => {
|
|
310
|
+
var correctChoices = choices[key] && choices[key].filter(c => c.correct);
|
|
311
|
+
value[i] = correctChoices && correctChoices[0].value;
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
resolve({
|
|
316
|
+
id: '1',
|
|
317
|
+
value
|
|
318
|
+
});
|
|
319
|
+
} else {
|
|
320
|
+
resolve(null);
|
|
321
|
+
}
|
|
322
|
+
});
|
|
323
|
+
}; // remove all html tags
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
var getContent = html => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
|
|
327
|
+
|
|
328
|
+
var validate = function validate() {
|
|
329
|
+
var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
330
|
+
var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
331
|
+
var {
|
|
332
|
+
markup,
|
|
333
|
+
choices
|
|
334
|
+
} = model;
|
|
335
|
+
var {
|
|
336
|
+
maxResponseAreas,
|
|
337
|
+
maxResponseAreaChoices
|
|
338
|
+
} = config;
|
|
339
|
+
var errors = {};
|
|
340
|
+
['teacherInstructions', 'prompt', 'rationale'].forEach(field => {
|
|
341
|
+
var _config$field;
|
|
342
|
+
|
|
343
|
+
if ((_config$field = config[field]) !== null && _config$field !== void 0 && _config$field.required && !getContent(model[field])) {
|
|
344
|
+
errors[field] = 'This field is required.';
|
|
345
|
+
}
|
|
346
|
+
});
|
|
347
|
+
var nbOfResponseAreas = ((markup || '').match(/\{\{(\d+)\}\}/g) || []).length;
|
|
348
|
+
|
|
349
|
+
if (nbOfResponseAreas > maxResponseAreas) {
|
|
350
|
+
errors.responseAreasError = "No more than ".concat(maxResponseAreas, " response areas should be defined.");
|
|
351
|
+
} else if (nbOfResponseAreas < 1) {
|
|
352
|
+
errors.responseAreasError = 'There should be defined at least 1 response area.';
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
(Object.keys(choices) || []).forEach(choiceKey => {
|
|
356
|
+
if (choices[choiceKey] && choices[choiceKey].length > maxResponseAreaChoices) {
|
|
357
|
+
errors.responseAreaChoicesError = "No more than ".concat(maxResponseAreaChoices, " choices per response area should be defined.");
|
|
358
|
+
}
|
|
359
|
+
});
|
|
360
|
+
return errors;
|
|
361
|
+
};
|
|
362
|
+
|
|
363
|
+
export { createCorrectResponseSession, getScore, model, normalize, outcome, validate };
|
|
364
|
+
//# sourceMappingURL=controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.js","sources":["../../../node_modules/@babel/runtime/helpers/esm/asyncToGenerator.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 _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}","export default {\n alternateResponse: {},\n choiceRationaleEnabled: true,\n choices: {},\n disabled: false,\n displayType: 'block',\n markup: '',\n mode: 'gather',\n prompt: '',\n promptEnabled: true,\n rationale: '',\n rationaleEnabled: true,\n shuffle: true,\n studentInstructionsEnabled: true,\n teacherInstructions: '',\n teacherInstructionsEnabled: true,\n toolbarEditorPosition: 'bottom',\n};\n","import forEach from 'lodash/forEach';\n\nexport const getAllCorrectResponses = ({ choices, alternateResponse }) => {\n alternateResponse = alternateResponse || {};\n const correctAnswers = {};\n\n forEach(choices, (respArea, key) => {\n if (!correctAnswers[key]) {\n correctAnswers[key] = [];\n }\n\n if (respArea) {\n respArea.forEach((choice) => {\n if (choice.correct) {\n correctAnswers[key].push(choice.value);\n\n if (alternateResponse[key]) {\n correctAnswers[key] = [...correctAnswers[key], ...alternateResponse[key]];\n }\n }\n });\n }\n });\n\n return correctAnswers;\n};\n","import map from 'lodash/map';\nimport reduce from 'lodash/reduce';\nimport isEmpty from 'lodash/isEmpty';\nimport { lockChoices, getShuffledChoices, partialScoring } from '@pie-lib/controller-utils';\nimport defaults from './defaults';\n\nimport { getAllCorrectResponses } from './utils';\n\nconst getFeedback = (correct) => {\n if (correct) {\n return 'correct';\n }\n\n return 'incorrect';\n};\n\nexport const normalize = (question) => ({ ...defaults, ...question });\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n * @param {*} updateSession - optional - a function that will set the properties passed into it on the session.\n */\nexport function model(question, session, env, updateSession) {\n return new Promise(async (resolve) => {\n const normalizedQuestion = normalize(question);\n const { value = {} } = session || {};\n let choices = reduce(\n normalizedQuestion.choices,\n (obj, area, key) => {\n obj[key] = map(area, (choice) => choice);\n\n return obj;\n },\n {},\n );\n\n let feedback = {};\n\n if (env.mode === 'evaluate') {\n const allCorrectResponses = getAllCorrectResponses(normalizedQuestion);\n const respAreaLength = Object.keys(allCorrectResponses).length;\n let correctResponses = 0;\n\n for (let i = 0; i < respAreaLength; i++) {\n const result = reduce(\n allCorrectResponses,\n (obj, choices, key) => {\n const answer = (value && value[key]) || '';\n const correctChoice = choices[i] || '';\n const isCorrect = answer && correctChoice && correctChoice === answer;\n\n obj.feedback[key] = getFeedback(isCorrect);\n\n if (isCorrect) {\n obj.correctResponses += 1;\n }\n\n return obj;\n },\n { correctResponses: 0, feedback: {} },\n );\n\n if (result.correctResponses >= correctResponses) {\n correctResponses = result.correctResponses;\n feedback = result.feedback;\n }\n\n if (result.correctResponses === respAreaLength) {\n break;\n }\n }\n }\n\n const lockChoiceOrder = lockChoices(normalizedQuestion, session, env);\n\n if (!lockChoiceOrder) {\n const keys = Object.keys(choices);\n let i;\n\n for (i = 0; i < keys.length; i++) {\n const key = keys[i];\n\n choices[key] = await getShuffledChoices(choices[key], session, updateSession, 'value');\n }\n }\n\n let teacherInstructions = null;\n let rationale = null;\n\n const choicesWillNullRationales = (Object.keys(choices) || []).reduce((acc, currentValue) => {\n acc[currentValue] = (choices[currentValue] || []).map((choice) => ({\n ...choice,\n rationale: null,\n }));\n\n return acc;\n }, {});\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;\n teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n\n choices = normalizedQuestion.choiceRationaleEnabled ? normalizedQuestion.choices : choicesWillNullRationales;\n } else {\n rationale = null;\n teacherInstructions = null;\n choices = choicesWillNullRationales;\n }\n\n const out = {\n disabled: env.mode !== 'gather',\n mode: env.mode,\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n displayType: normalizedQuestion.displayType,\n markup: normalizedQuestion.markup,\n choices,\n feedback,\n\n responseCorrect: env.mode === 'evaluate' ? getScore(normalizedQuestion, session) === 1 : undefined,\n rationale,\n teacherInstructions,\n language: normalizedQuestion.language,\n extraCSSRules: normalizedQuestion.extraCSSRules,\n };\n\n resolve(out);\n });\n}\n\nexport const getScore = (config, session) => {\n const { value = {} } = session || {};\n const maxScore = config && config.choices ? Object.keys(config.choices).length : 0;\n const allCorrectResponses = getAllCorrectResponses(config);\n let correctCount = 0;\n\n for (let i = 0; i < maxScore; i++) {\n const result = reduce(\n allCorrectResponses,\n (total, choices, key) => {\n const answer = (value && value[key]) || '';\n const correctChoice = choices[i] || '';\n\n if (correctChoice && answer && correctChoice === answer) {\n return total;\n }\n\n return total - 1;\n },\n maxScore,\n );\n\n if (result > correctCount) {\n correctCount = result;\n }\n\n if (result === maxScore) {\n break;\n }\n }\n\n const str = (correctCount / maxScore).toFixed(2);\n\n return parseFloat(str);\n};\n\n/**\n *\n * The score is partial by default for checkbox mode, allOrNothing for radio mode.\n * To disable partial scoring for checkbox mode you either set model.partialScoring = false or env.partialScoring =\n * false. the value in `env` will override the value in `model`.\n * @param {Object} model - the main model\n * @param {boolean} model.partialScoring - is partial scoring enabled (if undefined set to to true)\n * @param {*} session\n * @param {Object} env\n * @param {boolean} env.partialScoring - is partial scoring enabled (if undefined default to true) This overrides\n * `model.partialScoring`.\n */\nexport function outcome(model, session, env = {}) {\n return new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n }\n\n const partialScoringEnabled = partialScoring.enabled(model, env);\n const score = getScore(model, session);\n\n resolve({\n score: partialScoringEnabled ? score : Math.floor(score),\n 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;\n const value = {};\n\n if (choices) {\n Object.keys(choices).forEach((key, i) => {\n const correctChoices = choices[key] && choices[key].filter((c) => c.correct);\n\n value[i] = correctChoices && correctChoices[0].value;\n });\n }\n\n resolve({\n id: '1',\n 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 { markup, choices } = model;\n const { maxResponseAreas, maxResponseAreaChoices } = config;\n const errors = {};\n\n ['teacherInstructions', 'prompt', 'rationale'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n const nbOfResponseAreas = ((markup || '').match(/\\{\\{(\\d+)\\}\\}/g) || []).length;\n\n if (nbOfResponseAreas > maxResponseAreas) {\n errors.responseAreasError = `No more than ${maxResponseAreas} response areas should be defined.`;\n } else if (nbOfResponseAreas < 1) {\n errors.responseAreasError = 'There should be defined at least 1 response area.';\n }\n\n (Object.keys(choices) || []).forEach((choiceKey) => {\n if (choices[choiceKey] && choices[choiceKey].length > maxResponseAreaChoices) {\n errors.responseAreaChoicesError = `No more than ${maxResponseAreaChoices} choices per response area should be defined.`;\n }\n });\n\n return errors;\n};\n"],"names":["alternateResponse","choiceRationaleEnabled","choices","disabled","displayType","markup","mode","prompt","promptEnabled","rationale","rationaleEnabled","shuffle","studentInstructionsEnabled","teacherInstructions","teacherInstructionsEnabled","toolbarEditorPosition","getAllCorrectResponses","correctAnswers","forEach","respArea","key","choice","correct","push","value","getFeedback","normalize","question","defaults","model","session","env","updateSession","Promise","resolve","normalizedQuestion","reduce","obj","area","map","feedback","allCorrectResponses","respAreaLength","Object","keys","length","correctResponses","i","result","answer","correctChoice","isCorrect","lockChoiceOrder","lockChoices","getShuffledChoices","choicesWillNullRationales","acc","currentValue","role","out","responseCorrect","getScore","undefined","language","extraCSSRules","config","maxScore","correctCount","total","str","toFixed","parseFloat","outcome","isEmpty","score","empty","partialScoringEnabled","partialScoring","enabled","Math","floor","createCorrectResponseSession","correctChoices","filter","c","id","getContent","html","replace","validate","maxResponseAreas","maxResponseAreaChoices","errors","field","required","nbOfResponseAreas","match","responseAreasError","choiceKey","responseAreaChoicesError"],"mappings":"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"}
|