@pie-element/inline-dropdown 8.0.1 → 8.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.js +278 -16913
- package/esm/configure.js.map +1 -1
- package/esm/controller.js +124 -184
- package/esm/controller.js.map +1 -1
- package/esm/element.js +44 -7443
- package/esm/element.js.map +1 -1
- package/package.json +5 -5
package/esm/controller.js
CHANGED
|
@@ -1,58 +1,25 @@
|
|
|
1
1
|
import map from 'lodash/map';
|
|
2
2
|
import reduce from 'lodash/reduce';
|
|
3
3
|
import isEmpty from 'lodash/isEmpty';
|
|
4
|
-
import {
|
|
4
|
+
import { lockChoices, getShuffledChoices, partialScoring } from '@pie-lib/controller-utils';
|
|
5
5
|
import forEach from 'lodash/forEach';
|
|
6
6
|
|
|
7
|
-
function
|
|
8
|
-
|
|
9
|
-
var
|
|
10
|
-
|
|
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
|
-
}
|
|
7
|
+
function _extends() {
|
|
8
|
+
_extends = Object.assign || function (target) {
|
|
9
|
+
for (var i = 1; i < arguments.length; i++) {
|
|
10
|
+
var source = arguments[i];
|
|
22
11
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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);
|
|
12
|
+
for (var key in source) {
|
|
13
|
+
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
14
|
+
target[key] = source[key];
|
|
15
|
+
}
|
|
36
16
|
}
|
|
17
|
+
}
|
|
37
18
|
|
|
38
|
-
|
|
39
|
-
});
|
|
19
|
+
return target;
|
|
40
20
|
};
|
|
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
21
|
|
|
55
|
-
return
|
|
22
|
+
return _extends.apply(this, arguments);
|
|
56
23
|
}
|
|
57
24
|
|
|
58
25
|
var defaults = {
|
|
@@ -74,13 +41,12 @@ var defaults = {
|
|
|
74
41
|
toolbarEditorPosition: 'bottom'
|
|
75
42
|
};
|
|
76
43
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
} = _ref;
|
|
44
|
+
const getAllCorrectResponses = ({
|
|
45
|
+
choices,
|
|
46
|
+
alternateResponse
|
|
47
|
+
}) => {
|
|
82
48
|
alternateResponse = alternateResponse || {};
|
|
83
|
-
|
|
49
|
+
const correctAnswers = {};
|
|
84
50
|
forEach(choices, (respArea, key) => {
|
|
85
51
|
if (!correctAnswers[key]) {
|
|
86
52
|
correctAnswers[key] = [];
|
|
@@ -101,11 +67,7 @@ var getAllCorrectResponses = _ref => {
|
|
|
101
67
|
return correctAnswers;
|
|
102
68
|
};
|
|
103
69
|
|
|
104
|
-
|
|
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 => {
|
|
70
|
+
const getFeedback = correct => {
|
|
109
71
|
if (correct) {
|
|
110
72
|
return 'correct';
|
|
111
73
|
}
|
|
@@ -113,7 +75,7 @@ var getFeedback = correct => {
|
|
|
113
75
|
return 'incorrect';
|
|
114
76
|
};
|
|
115
77
|
|
|
116
|
-
|
|
78
|
+
const normalize = question => _extends({}, defaults, question);
|
|
117
79
|
/**
|
|
118
80
|
*
|
|
119
81
|
* @param {*} question
|
|
@@ -123,123 +85,110 @@ var normalize = question => _objectSpread(_objectSpread({}, defaults), question)
|
|
|
123
85
|
*/
|
|
124
86
|
|
|
125
87
|
function model(question, session, env, updateSession) {
|
|
126
|
-
return new Promise(
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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;
|
|
88
|
+
return new Promise(async resolve => {
|
|
89
|
+
const normalizedQuestion = normalize(question);
|
|
90
|
+
const {
|
|
91
|
+
value = {}
|
|
92
|
+
} = session || {};
|
|
93
|
+
let choices = reduce(normalizedQuestion.choices, (obj, area, key) => {
|
|
94
|
+
obj[key] = map(area, choice => choice);
|
|
95
|
+
return obj;
|
|
96
|
+
}, {});
|
|
97
|
+
let feedback = {};
|
|
98
|
+
|
|
99
|
+
if (env.mode === 'evaluate') {
|
|
100
|
+
const allCorrectResponses = getAllCorrectResponses(normalizedQuestion);
|
|
101
|
+
const respAreaLength = Object.keys(allCorrectResponses).length;
|
|
102
|
+
let correctResponses = 0;
|
|
103
|
+
|
|
104
|
+
for (let i = 0; i < respAreaLength; i++) {
|
|
105
|
+
const result = reduce(allCorrectResponses, (obj, choices, key) => {
|
|
106
|
+
const answer = value && value[key] || '';
|
|
107
|
+
const correctChoice = choices[i] || '';
|
|
108
|
+
const isCorrect = answer && correctChoice && correctChoice === answer;
|
|
109
|
+
obj.feedback[key] = getFeedback(isCorrect);
|
|
110
|
+
|
|
111
|
+
if (isCorrect) {
|
|
112
|
+
obj.correctResponses += 1;
|
|
163
113
|
}
|
|
164
114
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
115
|
+
return obj;
|
|
116
|
+
}, {
|
|
117
|
+
correctResponses: 0,
|
|
118
|
+
feedback: {}
|
|
119
|
+
});
|
|
169
120
|
|
|
170
|
-
|
|
171
|
-
|
|
121
|
+
if (result.correctResponses >= correctResponses) {
|
|
122
|
+
correctResponses = result.correctResponses;
|
|
123
|
+
feedback = result.feedback;
|
|
124
|
+
}
|
|
172
125
|
|
|
173
|
-
|
|
126
|
+
if (result.correctResponses === respAreaLength) {
|
|
127
|
+
break;
|
|
174
128
|
}
|
|
175
129
|
}
|
|
130
|
+
}
|
|
176
131
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
if (!lockChoiceOrder) {
|
|
180
|
-
var keys = Object.keys(choices);
|
|
181
|
-
|
|
182
|
-
var _i;
|
|
132
|
+
const lockChoiceOrder = lockChoices(normalizedQuestion, session, env);
|
|
183
133
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
}
|
|
188
|
-
}
|
|
134
|
+
if (!lockChoiceOrder) {
|
|
135
|
+
const keys = Object.keys(choices);
|
|
136
|
+
let i;
|
|
189
137
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
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;
|
|
138
|
+
for (i = 0; i < keys.length; i++) {
|
|
139
|
+
const key = keys[i];
|
|
140
|
+
choices[key] = await getShuffledChoices(choices[key], session, updateSession, 'value');
|
|
207
141
|
}
|
|
142
|
+
}
|
|
208
143
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
144
|
+
let teacherInstructions = null;
|
|
145
|
+
let rationale = null;
|
|
146
|
+
const choicesWillNullRationales = (Object.keys(choices) || []).reduce((acc, currentValue) => {
|
|
147
|
+
acc[currentValue] = (choices[currentValue] || []).map(choice => _extends({}, choice, {
|
|
148
|
+
rationale: null
|
|
149
|
+
}));
|
|
150
|
+
return acc;
|
|
151
|
+
}, {});
|
|
152
|
+
|
|
153
|
+
if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {
|
|
154
|
+
rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;
|
|
155
|
+
teacherInstructions = normalizedQuestion.teacherInstructionsEnabled ? normalizedQuestion.teacherInstructions : null;
|
|
156
|
+
choices = normalizedQuestion.choiceRationaleEnabled ? normalizedQuestion.choices : choicesWillNullRationales;
|
|
157
|
+
} else {
|
|
158
|
+
rationale = null;
|
|
159
|
+
teacherInstructions = null;
|
|
160
|
+
choices = choicesWillNullRationales;
|
|
161
|
+
}
|
|
225
162
|
|
|
226
|
-
|
|
227
|
-
|
|
163
|
+
const out = {
|
|
164
|
+
disabled: env.mode !== 'gather',
|
|
165
|
+
mode: env.mode,
|
|
166
|
+
prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,
|
|
167
|
+
displayType: normalizedQuestion.displayType,
|
|
168
|
+
markup: normalizedQuestion.markup,
|
|
169
|
+
choices,
|
|
170
|
+
feedback,
|
|
171
|
+
responseCorrect: env.mode === 'evaluate' ? getScore(normalizedQuestion, session) === 1 : undefined,
|
|
172
|
+
rationale,
|
|
173
|
+
teacherInstructions,
|
|
174
|
+
language: normalizedQuestion.language,
|
|
175
|
+
extraCSSRules: normalizedQuestion.extraCSSRules
|
|
228
176
|
};
|
|
229
|
-
|
|
177
|
+
resolve(out);
|
|
178
|
+
});
|
|
230
179
|
}
|
|
231
|
-
|
|
232
|
-
|
|
180
|
+
const getScore = (config, session) => {
|
|
181
|
+
const {
|
|
233
182
|
value = {}
|
|
234
183
|
} = session || {};
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
184
|
+
const maxScore = config && config.choices ? Object.keys(config.choices).length : 0;
|
|
185
|
+
const allCorrectResponses = getAllCorrectResponses(config);
|
|
186
|
+
let correctCount = 0;
|
|
238
187
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
188
|
+
for (let i = 0; i < maxScore; i++) {
|
|
189
|
+
const result = reduce(allCorrectResponses, (total, choices, key) => {
|
|
190
|
+
const answer = value && value[key] || '';
|
|
191
|
+
const correctChoice = choices[i] || '';
|
|
243
192
|
|
|
244
193
|
if (correctChoice && answer && correctChoice === answer) {
|
|
245
194
|
return total;
|
|
@@ -253,17 +202,11 @@ var getScore = (config, session) => {
|
|
|
253
202
|
}
|
|
254
203
|
|
|
255
204
|
if (result === maxScore) {
|
|
256
|
-
|
|
205
|
+
break;
|
|
257
206
|
}
|
|
258
|
-
};
|
|
259
|
-
|
|
260
|
-
for (var i = 0; i < maxScore; i++) {
|
|
261
|
-
var _ret2 = _loop2(i);
|
|
262
|
-
|
|
263
|
-
if (_ret2 === "break") break;
|
|
264
207
|
}
|
|
265
208
|
|
|
266
|
-
|
|
209
|
+
const str = (correctCount / maxScore).toFixed(2);
|
|
267
210
|
return parseFloat(str);
|
|
268
211
|
};
|
|
269
212
|
/**
|
|
@@ -279,8 +222,7 @@ var getScore = (config, session) => {
|
|
|
279
222
|
* `model.partialScoring`.
|
|
280
223
|
*/
|
|
281
224
|
|
|
282
|
-
function outcome(model, session) {
|
|
283
|
-
var env = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
225
|
+
function outcome(model, session, env = {}) {
|
|
284
226
|
return new Promise(resolve => {
|
|
285
227
|
if (!session || isEmpty(session)) {
|
|
286
228
|
resolve({
|
|
@@ -289,25 +231,25 @@ function outcome(model, session) {
|
|
|
289
231
|
});
|
|
290
232
|
}
|
|
291
233
|
|
|
292
|
-
|
|
293
|
-
|
|
234
|
+
const partialScoringEnabled = partialScoring.enabled(model, env);
|
|
235
|
+
const score = getScore(model, session);
|
|
294
236
|
resolve({
|
|
295
237
|
score: partialScoringEnabled ? score : Math.floor(score),
|
|
296
238
|
empty: false
|
|
297
239
|
});
|
|
298
240
|
});
|
|
299
241
|
}
|
|
300
|
-
|
|
242
|
+
const createCorrectResponseSession = (question, env) => {
|
|
301
243
|
return new Promise(resolve => {
|
|
302
244
|
if (env.mode !== 'evaluate' && env.role === 'instructor') {
|
|
303
|
-
|
|
245
|
+
const {
|
|
304
246
|
choices
|
|
305
247
|
} = question;
|
|
306
|
-
|
|
248
|
+
const value = {};
|
|
307
249
|
|
|
308
250
|
if (choices) {
|
|
309
251
|
Object.keys(choices).forEach((key, i) => {
|
|
310
|
-
|
|
252
|
+
const correctChoices = choices[key] && choices[key].filter(c => c.correct);
|
|
311
253
|
value[i] = correctChoices && correctChoices[0].value;
|
|
312
254
|
});
|
|
313
255
|
}
|
|
@@ -323,38 +265,36 @@ var createCorrectResponseSession = (question, env) => {
|
|
|
323
265
|
}; // remove all html tags
|
|
324
266
|
|
|
325
267
|
|
|
326
|
-
|
|
268
|
+
const getContent = html => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
|
|
327
269
|
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
331
|
-
var {
|
|
270
|
+
const validate = (model = {}, config = {}) => {
|
|
271
|
+
const {
|
|
332
272
|
markup,
|
|
333
273
|
choices
|
|
334
274
|
} = model;
|
|
335
|
-
|
|
275
|
+
const {
|
|
336
276
|
maxResponseAreas,
|
|
337
277
|
maxResponseAreaChoices
|
|
338
278
|
} = config;
|
|
339
|
-
|
|
279
|
+
const errors = {};
|
|
340
280
|
['teacherInstructions', 'prompt', 'rationale'].forEach(field => {
|
|
341
281
|
var _config$field;
|
|
342
282
|
|
|
343
|
-
if ((_config$field = config[field])
|
|
283
|
+
if ((_config$field = config[field]) != null && _config$field.required && !getContent(model[field])) {
|
|
344
284
|
errors[field] = 'This field is required.';
|
|
345
285
|
}
|
|
346
286
|
});
|
|
347
|
-
|
|
287
|
+
const nbOfResponseAreas = ((markup || '').match(/\{\{(\d+)\}\}/g) || []).length;
|
|
348
288
|
|
|
349
289
|
if (nbOfResponseAreas > maxResponseAreas) {
|
|
350
|
-
errors.responseAreasError =
|
|
290
|
+
errors.responseAreasError = `No more than ${maxResponseAreas} response areas should be defined.`;
|
|
351
291
|
} else if (nbOfResponseAreas < 1) {
|
|
352
292
|
errors.responseAreasError = 'There should be defined at least 1 response area.';
|
|
353
293
|
}
|
|
354
294
|
|
|
355
295
|
(Object.keys(choices) || []).forEach(choiceKey => {
|
|
356
296
|
if (choices[choiceKey] && choices[choiceKey].length > maxResponseAreaChoices) {
|
|
357
|
-
errors.responseAreaChoicesError =
|
|
297
|
+
errors.responseAreaChoicesError = `No more than ${maxResponseAreaChoices} choices per response area should be defined.`;
|
|
358
298
|
}
|
|
359
299
|
});
|
|
360
300
|
return errors;
|
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/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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"}
|
|
1
|
+
{"version":3,"file":"controller.js","sources":["../controller/src/defaults.js","../controller/src/utils.js","../controller/src/index.js"],"sourcesContent":["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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"}
|