@pie-element/match 10.0.1 → 10.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/CHANGELOG.md +8 -0
- package/configure/CHANGELOG.md +8 -0
- package/configure/package.json +6 -6
- package/controller/CHANGELOG.md +8 -0
- package/controller/package.json +3 -3
- package/package.json +7 -24
- package/esm/configure.js +0 -26102
- package/esm/configure.js.map +0 -1
- package/esm/controller.js +0 -499
- package/esm/controller.js.map +0 -1
- package/esm/element.js +0 -12568
- package/esm/element.js.map +0 -1
package/esm/controller.js
DELETED
|
@@ -1,499 +0,0 @@
|
|
|
1
|
-
import isEqual from 'lodash/isEqual';
|
|
2
|
-
import isEmpty from 'lodash/isEmpty';
|
|
3
|
-
import cloneDeep from 'lodash/cloneDeep';
|
|
4
|
-
import { getFeedbackForCorrectness } from '@pie-lib/feedback';
|
|
5
|
-
import { partialScoring, lockChoices, getShuffledChoices } from '@pie-lib/controller-utils';
|
|
6
|
-
import debug from 'debug';
|
|
7
|
-
|
|
8
|
-
function _objectWithoutPropertiesLoose(source, excluded) {
|
|
9
|
-
if (source == null) return {};
|
|
10
|
-
var target = {};
|
|
11
|
-
var sourceKeys = Object.keys(source);
|
|
12
|
-
var key, i;
|
|
13
|
-
|
|
14
|
-
for (i = 0; i < sourceKeys.length; i++) {
|
|
15
|
-
key = sourceKeys[i];
|
|
16
|
-
if (excluded.indexOf(key) >= 0) continue;
|
|
17
|
-
target[key] = source[key];
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
return target;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function _objectWithoutProperties(source, excluded) {
|
|
24
|
-
if (source == null) return {};
|
|
25
|
-
var target = _objectWithoutPropertiesLoose(source, excluded);
|
|
26
|
-
var key, i;
|
|
27
|
-
|
|
28
|
-
if (Object.getOwnPropertySymbols) {
|
|
29
|
-
var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
|
|
30
|
-
|
|
31
|
-
for (i = 0; i < sourceSymbolKeys.length; i++) {
|
|
32
|
-
key = sourceSymbolKeys[i];
|
|
33
|
-
if (excluded.indexOf(key) >= 0) continue;
|
|
34
|
-
if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
|
|
35
|
-
target[key] = source[key];
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
return target;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
43
|
-
try {
|
|
44
|
-
var info = gen[key](arg);
|
|
45
|
-
var value = info.value;
|
|
46
|
-
} catch (error) {
|
|
47
|
-
reject(error);
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
if (info.done) {
|
|
52
|
-
resolve(value);
|
|
53
|
-
} else {
|
|
54
|
-
Promise.resolve(value).then(_next, _throw);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
function _asyncToGenerator(fn) {
|
|
59
|
-
return function () {
|
|
60
|
-
var self = this,
|
|
61
|
-
args = arguments;
|
|
62
|
-
return new Promise(function (resolve, reject) {
|
|
63
|
-
var gen = fn.apply(self, args);
|
|
64
|
-
|
|
65
|
-
function _next(value) {
|
|
66
|
-
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
function _throw(err) {
|
|
70
|
-
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
_next(undefined);
|
|
74
|
-
});
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
function _defineProperty(obj, key, value) {
|
|
79
|
-
if (key in obj) {
|
|
80
|
-
Object.defineProperty(obj, key, {
|
|
81
|
-
value: value,
|
|
82
|
-
enumerable: true,
|
|
83
|
-
configurable: true,
|
|
84
|
-
writable: true
|
|
85
|
-
});
|
|
86
|
-
} else {
|
|
87
|
-
obj[key] = value;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
return obj;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
var defaults = {
|
|
94
|
-
choiceMode: 'radio',
|
|
95
|
-
feedbackEnabled: false,
|
|
96
|
-
headers: ['Column 1', 'Column 2', 'Column 3'],
|
|
97
|
-
layout: 3,
|
|
98
|
-
lockChoiceOrder: true,
|
|
99
|
-
partialScoring: false,
|
|
100
|
-
prompt: '',
|
|
101
|
-
promptEnabled: true,
|
|
102
|
-
rationale: '',
|
|
103
|
-
rationaleEnabled: true,
|
|
104
|
-
rows: [],
|
|
105
|
-
scoringType: 'auto',
|
|
106
|
-
studentInstructionsEnabled: true,
|
|
107
|
-
teacherInstructions: '',
|
|
108
|
-
teacherInstructionsEnabled: true,
|
|
109
|
-
toolbarEditorPosition: 'bottom'
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
var _excluded = ["extraCSSRules", "feedbackEnabled", "promptEnabled", "prompt", "lockChoiceOrder"];
|
|
113
|
-
|
|
114
|
-
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; }
|
|
115
|
-
|
|
116
|
-
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; }
|
|
117
|
-
var log = debug('@pie-element:match:controller');
|
|
118
|
-
|
|
119
|
-
var getResponseCorrectness = function getResponseCorrectness(model, answers) {
|
|
120
|
-
var env = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
121
|
-
var isPartialScoring = partialScoring.enabled(model, env);
|
|
122
|
-
var rows = model.rows;
|
|
123
|
-
var checkboxMode = model.choiceMode === 'checkbox';
|
|
124
|
-
|
|
125
|
-
if (!answers || Object.keys(answers).length === 0) {
|
|
126
|
-
return 'unanswered';
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
var totalCorrectAnswers = checkboxMode ? getTotalCorrectAnswers(model) : getTotalCorrect(model);
|
|
130
|
-
var correctAnswers;
|
|
131
|
-
var incorrectAnswers = 0;
|
|
132
|
-
|
|
133
|
-
if (checkboxMode) {
|
|
134
|
-
var checkboxes = getCheckboxes(rows, answers);
|
|
135
|
-
correctAnswers = checkboxes.correctAnswers;
|
|
136
|
-
incorrectAnswers = checkboxes.incorrectAnswers;
|
|
137
|
-
} else {
|
|
138
|
-
correctAnswers = getCorrectRadios(rows, answers);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
if (totalCorrectAnswers === correctAnswers && !incorrectAnswers) {
|
|
142
|
-
return 'correct';
|
|
143
|
-
} else if (correctAnswers === 0) {
|
|
144
|
-
return 'incorrect';
|
|
145
|
-
} else if (isPartialScoring) {
|
|
146
|
-
return 'partial';
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
return 'incorrect';
|
|
150
|
-
};
|
|
151
|
-
|
|
152
|
-
var getCorrectness = function getCorrectness(question, env) {
|
|
153
|
-
var answers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
154
|
-
|
|
155
|
-
if (env.mode === 'evaluate') {
|
|
156
|
-
return getResponseCorrectness(question, answers, env);
|
|
157
|
-
}
|
|
158
|
-
};
|
|
159
|
-
|
|
160
|
-
var getCheckboxes = (rows, answers) => {
|
|
161
|
-
var correctAnswers = 0;
|
|
162
|
-
var incorrectAnswers = 0;
|
|
163
|
-
rows.forEach(row => {
|
|
164
|
-
var answer = answers[row.id];
|
|
165
|
-
|
|
166
|
-
if (answer) {
|
|
167
|
-
row.values.forEach((v, i) => {
|
|
168
|
-
if (answer[i] && answer[i] === v) {
|
|
169
|
-
correctAnswers += 1;
|
|
170
|
-
} else if (answer[i] && answer[i] !== v) {
|
|
171
|
-
incorrectAnswers += 1;
|
|
172
|
-
}
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
});
|
|
176
|
-
return {
|
|
177
|
-
correctAnswers,
|
|
178
|
-
incorrectAnswers
|
|
179
|
-
};
|
|
180
|
-
};
|
|
181
|
-
|
|
182
|
-
var getCorrectRadios = (rows, answers) => {
|
|
183
|
-
var correctAnswers = 0;
|
|
184
|
-
rows.forEach(row => {
|
|
185
|
-
if (isEqual(row.values, answers[row.id])) {
|
|
186
|
-
correctAnswers += 1;
|
|
187
|
-
}
|
|
188
|
-
});
|
|
189
|
-
return correctAnswers;
|
|
190
|
-
};
|
|
191
|
-
|
|
192
|
-
var getTotalCorrect = question => {
|
|
193
|
-
var checkboxMode = question.choiceMode === 'checkbox';
|
|
194
|
-
var matchingTable = checkboxMode ? question.layout - 1 : 1;
|
|
195
|
-
return (question.rows.length || 0) * matchingTable;
|
|
196
|
-
};
|
|
197
|
-
|
|
198
|
-
var getTotalCorrectAnswers = question => {
|
|
199
|
-
var noOfTotalCorrectAnswers = 0;
|
|
200
|
-
question.rows.forEach(row => {
|
|
201
|
-
row.values.forEach(value => {
|
|
202
|
-
if (value) {
|
|
203
|
-
noOfTotalCorrectAnswers += 1;
|
|
204
|
-
}
|
|
205
|
-
});
|
|
206
|
-
});
|
|
207
|
-
return noOfTotalCorrectAnswers;
|
|
208
|
-
};
|
|
209
|
-
|
|
210
|
-
var getPartialScore = (question, answers) => {
|
|
211
|
-
var checkboxMode = question.choiceMode === 'checkbox';
|
|
212
|
-
|
|
213
|
-
if (checkboxMode) {
|
|
214
|
-
var {
|
|
215
|
-
correctAnswers,
|
|
216
|
-
incorrectAnswers
|
|
217
|
-
} = getCheckboxes(question.rows, answers);
|
|
218
|
-
var totalCorrect = getTotalCorrectAnswers(question);
|
|
219
|
-
var total = totalCorrect === 0 ? 1 : totalCorrect;
|
|
220
|
-
|
|
221
|
-
if (correctAnswers + incorrectAnswers > totalCorrect) {
|
|
222
|
-
var extraAnswers = correctAnswers + incorrectAnswers - totalCorrect;
|
|
223
|
-
var score = parseFloat(((correctAnswers - extraAnswers) / total).toFixed(2));
|
|
224
|
-
return score < 0 ? 0 : score;
|
|
225
|
-
} else {
|
|
226
|
-
return parseFloat((correctAnswers / total).toFixed(2));
|
|
227
|
-
}
|
|
228
|
-
} else {
|
|
229
|
-
var _correctAnswers = getCorrectRadios(question.rows, answers);
|
|
230
|
-
|
|
231
|
-
var _totalCorrect = getTotalCorrect(question) === 0 ? 1 : getTotalCorrect(question);
|
|
232
|
-
|
|
233
|
-
return parseFloat((_correctAnswers / _totalCorrect).toFixed(2));
|
|
234
|
-
}
|
|
235
|
-
};
|
|
236
|
-
|
|
237
|
-
var getOutComeScore = function getOutComeScore(question, env) {
|
|
238
|
-
var answers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
239
|
-
var correctness = getCorrectness(question, env, answers);
|
|
240
|
-
var isPartialScoring = partialScoring.enabled(question, env);
|
|
241
|
-
return correctness === 'correct' ? 1 : correctness === 'partial' && isPartialScoring ? getPartialScore(question, answers) : 0;
|
|
242
|
-
};
|
|
243
|
-
|
|
244
|
-
var outcome = (question, session, env) => {
|
|
245
|
-
return new Promise(resolve => {
|
|
246
|
-
if (env.mode !== 'evaluate') {
|
|
247
|
-
resolve({
|
|
248
|
-
score: undefined,
|
|
249
|
-
completed: undefined
|
|
250
|
-
});
|
|
251
|
-
} else {
|
|
252
|
-
if (!session || isEmpty(session)) {
|
|
253
|
-
resolve({
|
|
254
|
-
score: 0,
|
|
255
|
-
empty: true
|
|
256
|
-
});
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
var out = {
|
|
260
|
-
score: getOutComeScore(question, env, session.answers)
|
|
261
|
-
};
|
|
262
|
-
resolve(out);
|
|
263
|
-
}
|
|
264
|
-
});
|
|
265
|
-
};
|
|
266
|
-
function createDefaultModel() {
|
|
267
|
-
var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
268
|
-
return new Promise(resolve => {
|
|
269
|
-
resolve(_objectSpread(_objectSpread({}, defaults), model));
|
|
270
|
-
});
|
|
271
|
-
}
|
|
272
|
-
var normalize = question => _objectSpread(_objectSpread({}, defaults), question);
|
|
273
|
-
/**
|
|
274
|
-
*
|
|
275
|
-
* @param {*} question
|
|
276
|
-
* @param {*} session
|
|
277
|
-
* @param {*} env
|
|
278
|
-
* @param {*} updateSession - optional - a function that will set the properties passed into it on the session.
|
|
279
|
-
*/
|
|
280
|
-
|
|
281
|
-
function model(question, session, env, updateSession) {
|
|
282
|
-
return new Promise( /*#__PURE__*/function () {
|
|
283
|
-
var _ref = _asyncToGenerator(function* (resolve) {
|
|
284
|
-
var normalizedQuestion = cloneDeep(normalize(question));
|
|
285
|
-
var correctness, score;
|
|
286
|
-
|
|
287
|
-
if ((!session || isEmpty(session)) && env.mode === 'evaluate') {
|
|
288
|
-
correctness = 'unanswered';
|
|
289
|
-
score = '0%';
|
|
290
|
-
} else {
|
|
291
|
-
correctness = getCorrectness(normalizedQuestion, env, session && session.answers);
|
|
292
|
-
score = "".concat(getOutComeScore(normalizedQuestion, env, session && session.answers) * 100, "%");
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
var correctResponse = {};
|
|
296
|
-
var correctInfo = {
|
|
297
|
-
score,
|
|
298
|
-
correctness
|
|
299
|
-
};
|
|
300
|
-
var lockChoiceOrder = lockChoices(normalizedQuestion, session, env);
|
|
301
|
-
|
|
302
|
-
if (!lockChoiceOrder) {
|
|
303
|
-
normalizedQuestion.rows = yield getShuffledChoices(normalizedQuestion.rows, session, updateSession, 'id');
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
normalizedQuestion.rows.forEach(row => {
|
|
307
|
-
correctResponse[row.id] = row.values;
|
|
308
|
-
|
|
309
|
-
if (env.mode !== 'evaluate') {
|
|
310
|
-
delete row.values;
|
|
311
|
-
}
|
|
312
|
-
});
|
|
313
|
-
var fb = env.mode === 'evaluate' && normalizedQuestion.feedbackEnabled ? getFeedbackForCorrectness(correctInfo.correctness, normalizedQuestion.feedback) : Promise.resolve(undefined);
|
|
314
|
-
fb.then(feedback => {
|
|
315
|
-
var {
|
|
316
|
-
extraCSSRules,
|
|
317
|
-
feedbackEnabled,
|
|
318
|
-
promptEnabled,
|
|
319
|
-
prompt,
|
|
320
|
-
lockChoiceOrder
|
|
321
|
-
} = normalizedQuestion,
|
|
322
|
-
essentials = _objectWithoutProperties(normalizedQuestion, _excluded);
|
|
323
|
-
|
|
324
|
-
var out = _objectSpread(_objectSpread({}, essentials), {}, {
|
|
325
|
-
extraCSSRules,
|
|
326
|
-
allowFeedback: feedbackEnabled,
|
|
327
|
-
prompt: promptEnabled ? prompt : null,
|
|
328
|
-
shuffled: !lockChoiceOrder,
|
|
329
|
-
feedback,
|
|
330
|
-
disabled: env.mode !== 'gather',
|
|
331
|
-
view: env.mode === 'view'
|
|
332
|
-
});
|
|
333
|
-
|
|
334
|
-
if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {
|
|
335
|
-
out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled ? normalizedQuestion.teacherInstructions : null;
|
|
336
|
-
out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;
|
|
337
|
-
} else {
|
|
338
|
-
out.rationale = null;
|
|
339
|
-
out.teacherInstructions = null;
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
if (env.mode === 'evaluate') {
|
|
343
|
-
Object.assign(out, {
|
|
344
|
-
correctResponse,
|
|
345
|
-
correctness: correctInfo
|
|
346
|
-
});
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
log('out: ', out);
|
|
350
|
-
resolve(out);
|
|
351
|
-
});
|
|
352
|
-
});
|
|
353
|
-
|
|
354
|
-
return function (_x) {
|
|
355
|
-
return _ref.apply(this, arguments);
|
|
356
|
-
};
|
|
357
|
-
}());
|
|
358
|
-
}
|
|
359
|
-
var createCorrectResponseSession = (question, env) => {
|
|
360
|
-
return new Promise(resolve => {
|
|
361
|
-
if (env.mode !== 'evaluate' && env.role === 'instructor') {
|
|
362
|
-
var {
|
|
363
|
-
rows
|
|
364
|
-
} = question;
|
|
365
|
-
var answers = {};
|
|
366
|
-
rows.forEach(r => {
|
|
367
|
-
answers[r.id] = r.values;
|
|
368
|
-
});
|
|
369
|
-
resolve({
|
|
370
|
-
answers,
|
|
371
|
-
id: '1'
|
|
372
|
-
});
|
|
373
|
-
} else {
|
|
374
|
-
resolve(null);
|
|
375
|
-
}
|
|
376
|
-
});
|
|
377
|
-
}; // remove all html tags
|
|
378
|
-
|
|
379
|
-
var getInnerText = html => (html || '').replaceAll(/<[^>]*>/g, ''); // remove all html tags except img, iframe and source tag for audio
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
var getContent = html => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
|
|
383
|
-
|
|
384
|
-
var validate = function validate() {
|
|
385
|
-
var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
386
|
-
var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
387
|
-
var {
|
|
388
|
-
rows,
|
|
389
|
-
choiceMode,
|
|
390
|
-
headers
|
|
391
|
-
} = model;
|
|
392
|
-
var {
|
|
393
|
-
minQuestions,
|
|
394
|
-
maxQuestions,
|
|
395
|
-
maxLengthQuestionsHeading,
|
|
396
|
-
maxAnswers,
|
|
397
|
-
maxLengthAnswers,
|
|
398
|
-
maxLengthFirstColumnHeading
|
|
399
|
-
} = config;
|
|
400
|
-
var rowsErrors = {};
|
|
401
|
-
var columnsErrors = {};
|
|
402
|
-
var errors = {};
|
|
403
|
-
['teacherInstructions', 'prompt', 'rationale'].forEach(field => {
|
|
404
|
-
var _config$field;
|
|
405
|
-
|
|
406
|
-
if ((_config$field = config[field]) !== null && _config$field !== void 0 && _config$field.required && !getContent(model[field])) {
|
|
407
|
-
errors[field] = 'This field is required.';
|
|
408
|
-
}
|
|
409
|
-
});
|
|
410
|
-
|
|
411
|
-
if (rows.length < minQuestions) {
|
|
412
|
-
errors.noOfRowsError = "There should be at least ".concat(minQuestions, " question rows.");
|
|
413
|
-
} else if (rows.length > maxQuestions) {
|
|
414
|
-
errors.noOfRowsError = "No more than ".concat(maxQuestions, " question rows should be defined.");
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
(rows || []).forEach((row, index) => {
|
|
418
|
-
var {
|
|
419
|
-
id,
|
|
420
|
-
values = [],
|
|
421
|
-
title
|
|
422
|
-
} = row;
|
|
423
|
-
rowsErrors[id] = '';
|
|
424
|
-
|
|
425
|
-
if (maxLengthQuestionsHeading && getInnerText(title).length > maxLengthQuestionsHeading) {
|
|
426
|
-
rowsErrors[id] += "Content length should be maximum ".concat(maxLengthQuestionsHeading, " characters. ");
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
if (!getContent(title)) {
|
|
430
|
-
rowsErrors[id] += 'Content should not be empty. ';
|
|
431
|
-
} else {
|
|
432
|
-
// check for identical content with the previous answers
|
|
433
|
-
var identicalAnswer = rows.slice(0, index).some(r => getContent(r.title) === getContent(title));
|
|
434
|
-
|
|
435
|
-
if (identicalAnswer) {
|
|
436
|
-
rowsErrors[id] += 'Content should be unique. ';
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
var hasCorrectResponse = values.some(value => !!value);
|
|
441
|
-
|
|
442
|
-
if (!hasCorrectResponse) {
|
|
443
|
-
rowsErrors[id] += 'No correct response defined.';
|
|
444
|
-
}
|
|
445
|
-
});
|
|
446
|
-
|
|
447
|
-
if (maxAnswers && headers.length - 1 > maxAnswers) {
|
|
448
|
-
errors.columnsLengthError = "There should be maximum ".concat(maxAnswers, " answers.");
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
if (maxLengthFirstColumnHeading && headers[0].length > maxLengthFirstColumnHeading) {
|
|
452
|
-
columnsErrors[0] = "Content length should be maximum ".concat(maxLengthFirstColumnHeading, " characters.");
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
var headersContent = (headers || []).map(heading => getContent(heading));
|
|
456
|
-
headersContent.shift(); // remove first column since it does not require validation
|
|
457
|
-
|
|
458
|
-
headersContent.forEach((heading, index) => {
|
|
459
|
-
var headerIndex = index + 1; // we need to add 1 because we removed first header from validation
|
|
460
|
-
|
|
461
|
-
columnsErrors[headerIndex] = '';
|
|
462
|
-
|
|
463
|
-
if (maxLengthAnswers && getInnerText(heading).length > maxLengthAnswers) {
|
|
464
|
-
columnsErrors[headerIndex] += "Content length should be maximum ".concat(maxLengthAnswers, " characters. ");
|
|
465
|
-
}
|
|
466
|
-
|
|
467
|
-
if (!heading) {
|
|
468
|
-
columnsErrors[headerIndex] += 'Content should not be empty.';
|
|
469
|
-
} else {
|
|
470
|
-
// check for identical content with the previous headers
|
|
471
|
-
var identicalAnswer = headersContent.slice(0, index).some(head => head === heading);
|
|
472
|
-
|
|
473
|
-
if (identicalAnswer) {
|
|
474
|
-
columnsErrors[index + 1] += 'Content should be unique.';
|
|
475
|
-
}
|
|
476
|
-
}
|
|
477
|
-
});
|
|
478
|
-
var hasRowErrors = Object.values(rowsErrors).some(error => (error || '').length);
|
|
479
|
-
|
|
480
|
-
if (hasRowErrors) {
|
|
481
|
-
errors.rowsErrors = rowsErrors;
|
|
482
|
-
var noCorrectAnswer = Object.values(rowsErrors).some(error => (error || '').includes('No correct response defined.'));
|
|
483
|
-
|
|
484
|
-
if (noCorrectAnswer) {
|
|
485
|
-
errors.correctResponseError = choiceMode === 'radio' ? 'There should be a correct response defined for every row.' : 'There should be at least one correct response defined for every row.';
|
|
486
|
-
}
|
|
487
|
-
}
|
|
488
|
-
|
|
489
|
-
var hasColumnErrors = Object.values(columnsErrors).some(error => (error || '').length);
|
|
490
|
-
|
|
491
|
-
if (hasColumnErrors) {
|
|
492
|
-
errors.columnsErrors = columnsErrors;
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
return errors;
|
|
496
|
-
};
|
|
497
|
-
|
|
498
|
-
export { createCorrectResponseSession, createDefaultModel, model, normalize, outcome, validate };
|
|
499
|
-
//# sourceMappingURL=controller.js.map
|
package/esm/controller.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"controller.js","sources":["../../../node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","../../../node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js","../../../node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js","../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js","../controller/src/defaults.js","../controller/src/index.js"],"sourcesContent":["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}","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 choiceMode: 'radio',\n feedbackEnabled: false,\n headers: ['Column 1', 'Column 2', 'Column 3'],\n layout: 3,\n lockChoiceOrder: true,\n partialScoring: false,\n prompt: '',\n promptEnabled: true,\n rationale: '',\n rationaleEnabled: true,\n rows: [],\n scoringType: 'auto',\n studentInstructionsEnabled: true,\n teacherInstructions: '',\n teacherInstructionsEnabled: true,\n toolbarEditorPosition: 'bottom',\n};\n","import isEqual from 'lodash/isEqual';\nimport isEmpty from 'lodash/isEmpty';\nimport cloneDeep from 'lodash/cloneDeep';\nimport { getFeedbackForCorrectness } from '@pie-lib/feedback';\nimport { lockChoices, getShuffledChoices, partialScoring } from '@pie-lib/controller-utils';\nimport debug from 'debug';\n\nconst log = debug('@pie-element:match:controller');\n\nimport defaults from './defaults';\n\nconst getResponseCorrectness = (model, answers, env = {}) => {\n const isPartialScoring = partialScoring.enabled(model, env);\n const rows = model.rows;\n const checkboxMode = model.choiceMode === 'checkbox';\n\n if (!answers || Object.keys(answers).length === 0) {\n return 'unanswered';\n }\n\n const totalCorrectAnswers = checkboxMode ? getTotalCorrectAnswers(model) : getTotalCorrect(model);\n let correctAnswers;\n let incorrectAnswers = 0;\n\n if (checkboxMode) {\n const checkboxes = getCheckboxes(rows, answers);\n\n correctAnswers = checkboxes.correctAnswers;\n incorrectAnswers = checkboxes.incorrectAnswers;\n } else {\n correctAnswers = getCorrectRadios(rows, answers);\n }\n\n if (totalCorrectAnswers === correctAnswers && !incorrectAnswers) {\n return 'correct';\n } else if (correctAnswers === 0) {\n return 'incorrect';\n } else if (isPartialScoring) {\n return 'partial';\n }\n\n return 'incorrect';\n};\n\nconst getCorrectness = (question, env, answers = {}) => {\n if (env.mode === 'evaluate') {\n return getResponseCorrectness(question, answers, env);\n }\n};\n\nconst getCheckboxes = (rows, answers) => {\n let correctAnswers = 0;\n let incorrectAnswers = 0;\n\n rows.forEach((row) => {\n const answer = answers[row.id];\n\n if (answer) {\n row.values.forEach((v, i) => {\n if (answer[i] && answer[i] === v) {\n correctAnswers += 1;\n } else if (answer[i] && answer[i] !== v) {\n incorrectAnswers += 1;\n }\n });\n }\n });\n\n return { correctAnswers, incorrectAnswers };\n};\n\nconst getCorrectRadios = (rows, answers) => {\n let correctAnswers = 0;\n\n rows.forEach((row) => {\n if (isEqual(row.values, answers[row.id])) {\n correctAnswers += 1;\n }\n });\n\n return correctAnswers;\n};\n\nconst getTotalCorrect = (question) => {\n const checkboxMode = question.choiceMode === 'checkbox';\n const matchingTable = checkboxMode ? question.layout - 1 : 1;\n return (question.rows.length || 0) * matchingTable;\n};\n\nconst getTotalCorrectAnswers = (question) => {\n let noOfTotalCorrectAnswers = 0;\n\n question.rows.forEach((row) => {\n row.values.forEach((value) => {\n if (value) {\n noOfTotalCorrectAnswers += 1;\n }\n });\n });\n\n return noOfTotalCorrectAnswers;\n};\n\nconst getPartialScore = (question, answers) => {\n const checkboxMode = question.choiceMode === 'checkbox';\n\n if (checkboxMode) {\n const { correctAnswers, incorrectAnswers } = getCheckboxes(question.rows, answers);\n const totalCorrect = getTotalCorrectAnswers(question);\n\n const total = totalCorrect === 0 ? 1 : totalCorrect;\n\n if (correctAnswers + incorrectAnswers > totalCorrect) {\n const extraAnswers = correctAnswers + incorrectAnswers - totalCorrect;\n const score = parseFloat(((correctAnswers - extraAnswers) / total).toFixed(2));\n\n return score < 0 ? 0 : score;\n } else {\n return parseFloat((correctAnswers / total).toFixed(2));\n }\n } else {\n const correctAnswers = getCorrectRadios(question.rows, answers);\n const totalCorrect = getTotalCorrect(question) === 0 ? 1 : getTotalCorrect(question);\n\n return parseFloat((correctAnswers / totalCorrect).toFixed(2));\n }\n};\n\nconst getOutComeScore = (question, env, answers = {}) => {\n const correctness = getCorrectness(question, env, answers);\n const isPartialScoring = partialScoring.enabled(question, env);\n\n return correctness === 'correct'\n ? 1\n : correctness === 'partial' && isPartialScoring\n ? getPartialScore(question, answers)\n : 0;\n};\n\nexport const outcome = (question, session, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate') {\n resolve({ score: undefined, completed: undefined });\n } else {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n }\n\n const out = {\n score: getOutComeScore(question, env, session.answers),\n };\n\n resolve(out);\n }\n });\n};\n\nexport function createDefaultModel(model = {}) {\n return new Promise((resolve) => {\n resolve({\n ...defaults,\n ...model,\n });\n });\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 = cloneDeep(normalize(question));\n let correctness, score;\n\n if ((!session || isEmpty(session)) && env.mode === 'evaluate') {\n correctness = 'unanswered';\n score = '0%';\n } else {\n correctness = getCorrectness(normalizedQuestion, env, session && session.answers);\n score = `${getOutComeScore(normalizedQuestion, env, session && session.answers) * 100}%`;\n }\n\n const correctResponse = {};\n const correctInfo = {\n score,\n correctness,\n };\n\n const lockChoiceOrder = lockChoices(normalizedQuestion, session, env);\n\n if (!lockChoiceOrder) {\n normalizedQuestion.rows = await getShuffledChoices(normalizedQuestion.rows, session, updateSession, 'id');\n }\n\n normalizedQuestion.rows.forEach((row) => {\n correctResponse[row.id] = row.values;\n\n if (env.mode !== 'evaluate') {\n delete row.values;\n }\n });\n\n const fb =\n env.mode === 'evaluate' && normalizedQuestion.feedbackEnabled\n ? getFeedbackForCorrectness(correctInfo.correctness, normalizedQuestion.feedback)\n : Promise.resolve(undefined);\n\n fb.then((feedback) => {\n const { extraCSSRules, feedbackEnabled, promptEnabled, prompt, lockChoiceOrder, ...essentials } =\n normalizedQuestion;\n const out = {\n ...essentials,\n extraCSSRules,\n allowFeedback: feedbackEnabled,\n prompt: promptEnabled ? prompt : null,\n shuffled: !lockChoiceOrder,\n feedback,\n disabled: env.mode !== 'gather',\n view: env.mode === 'view',\n };\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n if (env.mode === 'evaluate') {\n Object.assign(out, {\n correctResponse,\n correctness: correctInfo,\n });\n }\n\n log('out: ', out);\n resolve(out);\n });\n });\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { rows } = question;\n const answers = {};\n\n rows.forEach((r) => {\n answers[r.id] = r.values;\n });\n\n resolve({\n answers,\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\nexport const validate = (model = {}, config = {}) => {\n const { rows, choiceMode, headers } = model;\n const {\n minQuestions,\n maxQuestions,\n maxLengthQuestionsHeading,\n maxAnswers,\n maxLengthAnswers,\n maxLengthFirstColumnHeading,\n } = config;\n const rowsErrors = {};\n const columnsErrors = {};\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 if (rows.length < minQuestions) {\n errors.noOfRowsError = `There should be at least ${minQuestions} question rows.`;\n } else if (rows.length > maxQuestions) {\n errors.noOfRowsError = `No more than ${maxQuestions} question rows should be defined.`;\n }\n\n (rows || []).forEach((row, index) => {\n const { id, values = [], title } = row;\n rowsErrors[id] = '';\n\n if (maxLengthQuestionsHeading && getInnerText(title).length > maxLengthQuestionsHeading) {\n rowsErrors[id] += `Content length should be maximum ${maxLengthQuestionsHeading} characters. `;\n }\n\n if (!getContent(title)) {\n rowsErrors[id] += 'Content should not be empty. ';\n } else {\n // check for identical content with the previous answers\n const identicalAnswer = rows.slice(0, index).some((r) => getContent(r.title) === getContent(title));\n\n if (identicalAnswer) {\n rowsErrors[id] += 'Content should be unique. ';\n }\n }\n\n const hasCorrectResponse = values.some((value) => !!value);\n\n if (!hasCorrectResponse) {\n rowsErrors[id] += 'No correct response defined.';\n }\n });\n\n if (maxAnswers && headers.length - 1 > maxAnswers) {\n errors.columnsLengthError = `There should be maximum ${maxAnswers} answers.`;\n }\n\n if (maxLengthFirstColumnHeading && headers[0].length > maxLengthFirstColumnHeading) {\n columnsErrors[0] = `Content length should be maximum ${maxLengthFirstColumnHeading} characters.`;\n }\n\n const headersContent = (headers || []).map((heading) => getContent(heading));\n headersContent.shift(); // remove first column since it does not require validation\n\n headersContent.forEach((heading, index) => {\n const headerIndex = index + 1; // we need to add 1 because we removed first header from validation\n columnsErrors[headerIndex] = '';\n\n if (maxLengthAnswers && getInnerText(heading).length > maxLengthAnswers) {\n columnsErrors[headerIndex] += `Content length should be maximum ${maxLengthAnswers} characters. `;\n }\n\n if (!heading) {\n columnsErrors[headerIndex] += 'Content should not be empty.';\n } else {\n // check for identical content with the previous headers\n const identicalAnswer = headersContent.slice(0, index).some((head) => head === heading);\n\n if (identicalAnswer) {\n columnsErrors[index + 1] += 'Content should be unique.';\n }\n }\n });\n\n const hasRowErrors = Object.values(rowsErrors).some((error) => (error || '').length);\n\n if (hasRowErrors) {\n errors.rowsErrors = rowsErrors;\n\n const noCorrectAnswer = Object.values(rowsErrors).some((error) =>\n (error || '').includes('No correct response defined.'),\n );\n\n if (noCorrectAnswer) {\n errors.correctResponseError =\n choiceMode === 'radio'\n ? 'There should be a correct response defined for every row.'\n : 'There should be at least one correct response defined for every row.';\n }\n }\n\n const hasColumnErrors = Object.values(columnsErrors).some((error) => (error || '').length);\n\n if (hasColumnErrors) {\n errors.columnsErrors = columnsErrors;\n }\n\n return errors;\n};\n"],"names":["objectWithoutPropertiesLoose","choiceMode","feedbackEnabled","headers","layout","lockChoiceOrder","partialScoring","prompt","promptEnabled","rationale","rationaleEnabled","rows","scoringType","studentInstructionsEnabled","teacherInstructions","teacherInstructionsEnabled","toolbarEditorPosition","log","debug","getResponseCorrectness","model","answers","env","isPartialScoring","enabled","checkboxMode","Object","keys","length","totalCorrectAnswers","getTotalCorrectAnswers","getTotalCorrect","correctAnswers","incorrectAnswers","checkboxes","getCheckboxes","getCorrectRadios","getCorrectness","question","mode","forEach","row","answer","id","values","v","i","isEqual","matchingTable","noOfTotalCorrectAnswers","value","getPartialScore","totalCorrect","total","extraAnswers","score","parseFloat","toFixed","getOutComeScore","correctness","outcome","session","Promise","resolve","undefined","completed","isEmpty","empty","out","createDefaultModel","defaults","normalize","updateSession","normalizedQuestion","cloneDeep","correctResponse","correctInfo","lockChoices","getShuffledChoices","fb","getFeedbackForCorrectness","feedback","then","extraCSSRules","essentials","allowFeedback","shuffled","disabled","view","role","assign","createCorrectResponseSession","r","getInnerText","html","replaceAll","getContent","replace","validate","config","minQuestions","maxQuestions","maxLengthQuestionsHeading","maxAnswers","maxLengthAnswers","maxLengthFirstColumnHeading","rowsErrors","columnsErrors","errors","field","required","noOfRowsError","index","title","identicalAnswer","slice","some","hasCorrectResponse","columnsLengthError","headersContent","map","heading","shift","headerIndex","head","hasRowErrors","error","noCorrectAnswer","includes","correctResponseError","hasColumnErrors"],"mappings":"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"}
|