@pie-element/hotspot 9.0.1 → 11.0.3-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/lib/icons.js +7 -3
- package/configure/lib/icons.js.map +1 -1
- package/configure/package.json +3 -3
- package/configure/src/icons.js +2 -4
- package/controller/package.json +2 -2
- package/esm/configure.js +26302 -0
- package/esm/configure.js.map +1 -0
- package/esm/controller.js +81 -135
- package/esm/controller.js.map +1 -1
- package/esm/element.js +1312 -0
- package/esm/element.js.map +1 -0
- package/lib/hotspot/icons.js +9 -4
- package/lib/hotspot/icons.js.map +1 -1
- package/package.json +16 -6
- package/src/hotspot/icons.js +5 -6
package/esm/controller.js
CHANGED
|
@@ -3,45 +3,22 @@ import isEmpty from 'lodash/isEmpty';
|
|
|
3
3
|
import { partialScoring } from '@pie-lib/controller-utils';
|
|
4
4
|
import isEqual from 'lodash/isEqual';
|
|
5
5
|
|
|
6
|
-
function
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
function _objectSpread2(target) {
|
|
20
|
-
for (var i = 1; i < arguments.length; i++) {
|
|
21
|
-
var source = null != arguments[i] ? arguments[i] : {};
|
|
22
|
-
i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {
|
|
23
|
-
_defineProperty(target, key, source[key]);
|
|
24
|
-
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {
|
|
25
|
-
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
return target;
|
|
30
|
-
}
|
|
6
|
+
function _extends() {
|
|
7
|
+
_extends = Object.assign || function (target) {
|
|
8
|
+
for (var i = 1; i < arguments.length; i++) {
|
|
9
|
+
var source = arguments[i];
|
|
10
|
+
|
|
11
|
+
for (var key in source) {
|
|
12
|
+
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
13
|
+
target[key] = source[key];
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
31
17
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
Object.defineProperty(obj, key, {
|
|
35
|
-
value: value,
|
|
36
|
-
enumerable: true,
|
|
37
|
-
configurable: true,
|
|
38
|
-
writable: true
|
|
39
|
-
});
|
|
40
|
-
} else {
|
|
41
|
-
obj[key] = value;
|
|
42
|
-
}
|
|
18
|
+
return target;
|
|
19
|
+
};
|
|
43
20
|
|
|
44
|
-
return
|
|
21
|
+
return _extends.apply(this, arguments);
|
|
45
22
|
}
|
|
46
23
|
|
|
47
24
|
function _objectWithoutPropertiesLoose(source, excluded) {
|
|
@@ -59,45 +36,24 @@ function _objectWithoutPropertiesLoose(source, excluded) {
|
|
|
59
36
|
return target;
|
|
60
37
|
}
|
|
61
38
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
var target = _objectWithoutPropertiesLoose(source, excluded);
|
|
66
|
-
|
|
67
|
-
var key, i;
|
|
68
|
-
|
|
69
|
-
if (Object.getOwnPropertySymbols) {
|
|
70
|
-
var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
|
|
71
|
-
|
|
72
|
-
for (i = 0; i < sourceSymbolKeys.length; i++) {
|
|
73
|
-
key = sourceSymbolKeys[i];
|
|
74
|
-
if (excluded.indexOf(key) >= 0) continue;
|
|
75
|
-
if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
|
|
76
|
-
target[key] = source[key];
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
return target;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
var getCorrectResponse = choices => choices.filter(c => c.correct).map(c => c.id).sort();
|
|
84
|
-
var isResponseCorrect = (question, session) => {
|
|
85
|
-
var {
|
|
39
|
+
const getCorrectResponse = choices => choices.filter(c => c.correct).map(c => c.id).sort();
|
|
40
|
+
const isResponseCorrect = (question, session) => {
|
|
41
|
+
const {
|
|
86
42
|
shapes: {
|
|
87
43
|
rectangles = [],
|
|
88
44
|
polygons = [],
|
|
89
45
|
circles = []
|
|
90
46
|
}
|
|
91
47
|
} = question;
|
|
92
|
-
|
|
93
|
-
|
|
48
|
+
const choices = [...rectangles, ...polygons, ...circles];
|
|
49
|
+
let correctResponseIds = getCorrectResponse(choices);
|
|
94
50
|
|
|
95
51
|
if (!session || isEmpty(session)) {
|
|
96
52
|
return false;
|
|
97
53
|
}
|
|
98
54
|
|
|
99
55
|
if (session.answers && session.answers.length) {
|
|
100
|
-
|
|
56
|
+
let answerIds = (session.answers || []).map(a => a.id);
|
|
101
57
|
return isEqual(answerIds.sort(), correctResponseIds);
|
|
102
58
|
} else if (!(correctResponseIds && correctResponseIds.length)) {
|
|
103
59
|
return true;
|
|
@@ -133,14 +89,14 @@ var defaults = {
|
|
|
133
89
|
toolbarEditorPosition: 'bottom'
|
|
134
90
|
};
|
|
135
91
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
92
|
+
const _excluded = ["index", "correct"],
|
|
93
|
+
_excluded2 = ["index", "correct"],
|
|
94
|
+
_excluded3 = ["index", "correct"];
|
|
95
|
+
const log = debug('pie-elements:hotspot:controller');
|
|
96
|
+
const normalize = question => _extends({}, defaults, question);
|
|
141
97
|
function model(question, session, env) {
|
|
142
|
-
|
|
143
|
-
|
|
98
|
+
const normalizedQuestion = normalize(question);
|
|
99
|
+
const {
|
|
144
100
|
imageUrl,
|
|
145
101
|
dimensions,
|
|
146
102
|
hotspotColor,
|
|
@@ -157,14 +113,14 @@ function model(question, session, env) {
|
|
|
157
113
|
completeAudioEnabled,
|
|
158
114
|
customAudioButton
|
|
159
115
|
} = normalizedQuestion;
|
|
160
|
-
|
|
116
|
+
const {
|
|
161
117
|
rectangles,
|
|
162
118
|
polygons,
|
|
163
119
|
circles
|
|
164
120
|
} = shapes || {};
|
|
165
|
-
|
|
121
|
+
const shouldIncludeCorrectResponse = env.mode === 'evaluate' || env.role === 'instructor' && env.mode === 'view';
|
|
166
122
|
return new Promise(resolve => {
|
|
167
|
-
|
|
123
|
+
const out = {
|
|
168
124
|
disabled: env.mode !== 'gather',
|
|
169
125
|
mode: env.mode,
|
|
170
126
|
dimensions,
|
|
@@ -180,42 +136,39 @@ function model(question, session, env) {
|
|
|
180
136
|
autoplayAudioEnabled,
|
|
181
137
|
completeAudioEnabled,
|
|
182
138
|
customAudioButton,
|
|
183
|
-
shapes:
|
|
139
|
+
shapes: _extends({}, shapes, {
|
|
184
140
|
// eslint-disable-next-line no-unused-vars
|
|
185
141
|
rectangles: (rectangles || []).map(_ref => {
|
|
186
|
-
|
|
187
|
-
index,
|
|
142
|
+
let {
|
|
188
143
|
correct
|
|
189
144
|
} = _ref,
|
|
190
|
-
rectProps =
|
|
145
|
+
rectProps = _objectWithoutPropertiesLoose(_ref, _excluded);
|
|
191
146
|
|
|
192
|
-
return shouldIncludeCorrectResponse ?
|
|
147
|
+
return shouldIncludeCorrectResponse ? _extends({
|
|
193
148
|
correct
|
|
194
|
-
}, rectProps) :
|
|
149
|
+
}, rectProps) : _extends({}, rectProps);
|
|
195
150
|
}),
|
|
196
151
|
// eslint-disable-next-line no-unused-vars
|
|
197
152
|
polygons: (polygons || []).map(_ref2 => {
|
|
198
|
-
|
|
199
|
-
index,
|
|
153
|
+
let {
|
|
200
154
|
correct
|
|
201
155
|
} = _ref2,
|
|
202
|
-
polyProps =
|
|
156
|
+
polyProps = _objectWithoutPropertiesLoose(_ref2, _excluded2);
|
|
203
157
|
|
|
204
|
-
return shouldIncludeCorrectResponse ?
|
|
158
|
+
return shouldIncludeCorrectResponse ? _extends({
|
|
205
159
|
correct
|
|
206
|
-
}, polyProps) :
|
|
160
|
+
}, polyProps) : _extends({}, polyProps);
|
|
207
161
|
}),
|
|
208
162
|
// eslint-disable-next-line no-unused-vars
|
|
209
163
|
circles: (circles || []).map(_ref3 => {
|
|
210
|
-
|
|
211
|
-
index,
|
|
164
|
+
let {
|
|
212
165
|
correct
|
|
213
166
|
} = _ref3,
|
|
214
|
-
circleProps =
|
|
167
|
+
circleProps = _objectWithoutPropertiesLoose(_ref3, _excluded3);
|
|
215
168
|
|
|
216
|
-
return shouldIncludeCorrectResponse ?
|
|
169
|
+
return shouldIncludeCorrectResponse ? _extends({
|
|
217
170
|
correct
|
|
218
|
-
}, circleProps) :
|
|
171
|
+
}, circleProps) : _extends({}, circleProps);
|
|
219
172
|
})
|
|
220
173
|
}),
|
|
221
174
|
responseCorrect: env.mode === 'evaluate' ? isResponseCorrect(normalizedQuestion, session) : undefined,
|
|
@@ -235,16 +188,12 @@ function model(question, session, env) {
|
|
|
235
188
|
resolve(out);
|
|
236
189
|
});
|
|
237
190
|
}
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
resolve(_objectSpread2(_objectSpread2({}, defaults), model));
|
|
242
|
-
});
|
|
243
|
-
};
|
|
191
|
+
const createDefaultModel = (model = {}) => new Promise(resolve => {
|
|
192
|
+
resolve(_extends({}, defaults, model));
|
|
193
|
+
});
|
|
244
194
|
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
var {
|
|
195
|
+
const getScore = (config, session, env = {}) => {
|
|
196
|
+
const {
|
|
248
197
|
answers
|
|
249
198
|
} = session || {};
|
|
250
199
|
|
|
@@ -252,26 +201,26 @@ var getScore = function getScore(config, session) {
|
|
|
252
201
|
return 0;
|
|
253
202
|
}
|
|
254
203
|
|
|
255
|
-
|
|
204
|
+
const {
|
|
256
205
|
shapes: {
|
|
257
206
|
rectangles = [],
|
|
258
207
|
polygons = [],
|
|
259
208
|
circles = []
|
|
260
209
|
} = {}
|
|
261
210
|
} = config;
|
|
262
|
-
|
|
211
|
+
const partialScoringEnabled = partialScoring.enabled(config, env);
|
|
263
212
|
|
|
264
213
|
if (!partialScoringEnabled) {
|
|
265
214
|
return isResponseCorrect(config, session) ? 1 : 0;
|
|
266
215
|
}
|
|
267
216
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
217
|
+
let correctAnswers = 0;
|
|
218
|
+
let selectedChoices = 0;
|
|
219
|
+
const choices = [...rectangles, ...polygons, ...circles];
|
|
220
|
+
const correctChoices = choices.filter(choice => choice.correct);
|
|
272
221
|
choices.forEach(shape => {
|
|
273
|
-
|
|
274
|
-
|
|
222
|
+
const selected = answers && answers.filter(answer => answer.id === shape.id)[0];
|
|
223
|
+
const correctlySelected = shape.correct && selected;
|
|
275
224
|
|
|
276
225
|
if (selected) {
|
|
277
226
|
selectedChoices += 1;
|
|
@@ -281,14 +230,13 @@ var getScore = function getScore(config, session) {
|
|
|
281
230
|
correctAnswers += 1;
|
|
282
231
|
}
|
|
283
232
|
});
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
233
|
+
const extraAnswers = selectedChoices > correctChoices.length ? selectedChoices - correctChoices.length : 0;
|
|
234
|
+
const total = correctChoices.length === 0 ? 1 : correctChoices.length;
|
|
235
|
+
const str = ((correctAnswers - extraAnswers) / total).toFixed(2);
|
|
287
236
|
return str < 0 ? 0 : parseFloat(str);
|
|
288
237
|
};
|
|
289
238
|
|
|
290
|
-
function outcome(config, session) {
|
|
291
|
-
var env = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
239
|
+
function outcome(config, session, env = {}) {
|
|
292
240
|
return new Promise(resolve => {
|
|
293
241
|
log('outcome...');
|
|
294
242
|
|
|
@@ -300,7 +248,7 @@ function outcome(config, session) {
|
|
|
300
248
|
}
|
|
301
249
|
|
|
302
250
|
if (session.answers) {
|
|
303
|
-
|
|
251
|
+
const score = getScore(config, session, env);
|
|
304
252
|
resolve({
|
|
305
253
|
score
|
|
306
254
|
});
|
|
@@ -313,10 +261,10 @@ function outcome(config, session) {
|
|
|
313
261
|
});
|
|
314
262
|
}
|
|
315
263
|
|
|
316
|
-
|
|
317
|
-
|
|
264
|
+
const returnShapesCorrect = shapes => {
|
|
265
|
+
let answers = [];
|
|
318
266
|
shapes.forEach(i => {
|
|
319
|
-
|
|
267
|
+
const {
|
|
320
268
|
correct,
|
|
321
269
|
id
|
|
322
270
|
} = i;
|
|
@@ -330,19 +278,19 @@ var returnShapesCorrect = shapes => {
|
|
|
330
278
|
return answers;
|
|
331
279
|
};
|
|
332
280
|
|
|
333
|
-
|
|
281
|
+
const createCorrectResponseSession = (question, env) => {
|
|
334
282
|
return new Promise(resolve => {
|
|
335
283
|
if (env.mode !== 'evaluate' && env.role === 'instructor') {
|
|
336
|
-
|
|
284
|
+
const {
|
|
337
285
|
shapes: {
|
|
338
286
|
rectangles = [],
|
|
339
287
|
circles = [],
|
|
340
288
|
polygons = {}
|
|
341
289
|
} = {}
|
|
342
290
|
} = question;
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
291
|
+
const rectangleCorrect = returnShapesCorrect(rectangles);
|
|
292
|
+
const polygonsCorrect = returnShapesCorrect(polygons);
|
|
293
|
+
const circlesCorrect = returnShapesCorrect(circles);
|
|
346
294
|
resolve({
|
|
347
295
|
answers: [...rectangleCorrect, ...polygonsCorrect, ...circlesCorrect],
|
|
348
296
|
id: '1'
|
|
@@ -354,41 +302,39 @@ var createCorrectResponseSession = (question, env) => {
|
|
|
354
302
|
}; // remove all html tags
|
|
355
303
|
|
|
356
304
|
|
|
357
|
-
|
|
305
|
+
const getContent = html => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
|
|
358
306
|
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
362
|
-
var {
|
|
307
|
+
const validate = (model = {}, config = {}) => {
|
|
308
|
+
const {
|
|
363
309
|
shapes
|
|
364
310
|
} = model;
|
|
365
|
-
|
|
311
|
+
const {
|
|
366
312
|
minShapes = 2,
|
|
367
313
|
maxShapes,
|
|
368
314
|
maxSelections
|
|
369
315
|
} = config;
|
|
370
|
-
|
|
316
|
+
const errors = {};
|
|
371
317
|
['teacherInstructions', 'prompt', 'rationale'].forEach(field => {
|
|
372
318
|
var _config$field;
|
|
373
319
|
|
|
374
|
-
if ((_config$field = config[field])
|
|
320
|
+
if ((_config$field = config[field]) != null && _config$field.required && !getContent(model[field])) {
|
|
375
321
|
errors[field] = 'This field is required.';
|
|
376
322
|
}
|
|
377
323
|
});
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
324
|
+
const allShapes = Object.values(shapes || {}).reduce((acc, shape) => [...acc, ...shape], []);
|
|
325
|
+
const nbOfSelections = (allShapes || []).reduce((acc, shape) => shape.correct ? acc + 1 : acc, 0);
|
|
326
|
+
const nbOfShapes = (allShapes || []).length;
|
|
381
327
|
|
|
382
328
|
if (nbOfShapes < minShapes) {
|
|
383
|
-
errors.shapes =
|
|
329
|
+
errors.shapes = `There should be at least ${minShapes} shapes defined.`;
|
|
384
330
|
} else if (nbOfShapes > maxShapes) {
|
|
385
|
-
errors.shapes =
|
|
331
|
+
errors.shapes = `No more than ${maxShapes} shapes should be defined.`;
|
|
386
332
|
}
|
|
387
333
|
|
|
388
334
|
if (nbOfSelections < 1) {
|
|
389
335
|
errors.selections = 'There should be at least 1 shape selected.';
|
|
390
336
|
} else if (nbOfSelections > maxSelections) {
|
|
391
|
-
errors.selections =
|
|
337
|
+
errors.selections = `No more than ${maxSelections} shapes should be selected.`;
|
|
392
338
|
}
|
|
393
339
|
|
|
394
340
|
return errors;
|
package/esm/controller.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.js","sources":["../controller/src/utils.js","../controller/src/defaults.js","../controller/src/index.js"],"sourcesContent":["import isEqual from 'lodash/isEqual';\nimport isEmpty from 'lodash/isEmpty';\n\nexport const getCorrectResponse = (choices) =>\n choices\n .filter((c) => c.correct)\n .map((c) => c.id)\n .sort();\n\nexport const isResponseCorrect = (question, session) => {\n const {\n shapes: { rectangles = [], polygons = [], circles = [] },\n } = question;\n const choices = [...rectangles, ...polygons, ...circles];\n let correctResponseIds = getCorrectResponse(choices);\n\n if (!session || isEmpty(session)) {\n return false;\n }\n\n if (session.answers && session.answers.length) {\n let answerIds = (session.answers || []).map((a) => a.id);\n\n return isEqual(answerIds.sort(), correctResponseIds);\n } else if (!(correctResponseIds && correctResponseIds.length)) {\n return true;\n }\n\n return false;\n};\n","export default {\n dimensions: { height: 0, width: 0 },\n hotspotColor: 'rgba(137, 183, 244, 0.25)',\n hotspotList: ['rgba(137, 183, 244, 0.25)'],\n imageUrl: '',\n multipleCorrect: true,\n outlineColor: 'blue',\n outlineList: ['blue'],\n partialScoring: false,\n prompt: '',\n promptEnabled: true,\n rationaleEnabled: true,\n shapes: { rectangles: [], polygons: [], circles: [] },\n strokeWidth: 5,\n studentInstructionsEnabled: true,\n teacherInstructions: '',\n teacherInstructionsEnabled: true,\n toolbarEditorPosition: 'bottom',\n};\n","import debug from 'debug';\nimport isEmpty from 'lodash/isEmpty';\nimport { partialScoring } from '@pie-lib/controller-utils';\n\nimport { isResponseCorrect } from './utils';\n\nimport defaults from './defaults';\n\nconst log = debug('pie-elements:hotspot:controller');\n\nexport const normalize = (question) => ({\n ...defaults,\n ...question,\n});\n\nexport function model(question, session, env) {\n const normalizedQuestion = normalize(question);\n const {\n imageUrl,\n dimensions,\n hotspotColor,\n hoverOutlineColor,\n selectedHotspotColor,\n multipleCorrect,\n outlineColor,\n partialScoring,\n prompt,\n shapes,\n language,\n fontSizeFactor,\n autoplayAudioEnabled,\n completeAudioEnabled,\n customAudioButton,\n } = normalizedQuestion;\n const { rectangles, polygons, circles } = shapes || {};\n\n const shouldIncludeCorrectResponse = env.mode === 'evaluate' || (env.role === 'instructor' && env.mode === 'view');\n\n return new Promise((resolve) => {\n const out = {\n disabled: env.mode !== 'gather',\n mode: env.mode,\n dimensions,\n imageUrl,\n outlineColor,\n hotspotColor,\n hoverOutlineColor,\n selectedHotspotColor,\n multipleCorrect,\n partialScoring,\n language,\n fontSizeFactor,\n autoplayAudioEnabled,\n completeAudioEnabled,\n customAudioButton,\n shapes: {\n ...shapes,\n // eslint-disable-next-line no-unused-vars\n rectangles: (rectangles || []).map(({ index, correct, ...rectProps }) =>\n shouldIncludeCorrectResponse ? { correct, ...rectProps } : { ...rectProps },\n ),\n // eslint-disable-next-line no-unused-vars\n polygons: (polygons || []).map(({ index, correct, ...polyProps }) =>\n shouldIncludeCorrectResponse ? { correct, ...polyProps } : { ...polyProps },\n ),\n // eslint-disable-next-line no-unused-vars\n circles: (circles || []).map(({ index, correct, ...circleProps }) =>\n shouldIncludeCorrectResponse ? { correct, ...circleProps } : { ...circleProps },\n ),\n },\n responseCorrect: env.mode === 'evaluate' ? isResponseCorrect(normalizedQuestion, session) : undefined,\n extraCSSRules: normalizedQuestion.extraCSSRules,\n };\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n out.prompt = normalizedQuestion.promptEnabled ? prompt : null;\n out.strokeWidth = normalizedQuestion.strokeWidth;\n\n resolve(out);\n });\n}\n\nexport const createDefaultModel = (model = {}) =>\n new Promise((resolve) => {\n resolve({\n ...defaults,\n ...model,\n });\n });\n\nconst getScore = (config, session, env = {}) => {\n const { answers } = session || {};\n\n if (!config.shapes || (!config.shapes.rectangles && !config.shapes.polygons && !config.shapes.circles)) {\n return 0;\n }\n\n const { shapes: { rectangles = [], polygons = [], circles = [] } = {} } = config;\n const partialScoringEnabled = partialScoring.enabled(config, env);\n\n if (!partialScoringEnabled) {\n return isResponseCorrect(config, session) ? 1 : 0;\n }\n\n let correctAnswers = 0;\n let selectedChoices = 0;\n\n const choices = [...rectangles, ...polygons, ...circles];\n\n const correctChoices = choices.filter((choice) => choice.correct);\n\n choices.forEach((shape) => {\n const selected = answers && answers.filter((answer) => answer.id === shape.id)[0];\n const correctlySelected = shape.correct && selected;\n\n if (selected) {\n selectedChoices += 1;\n }\n\n if (correctlySelected) {\n correctAnswers += 1;\n }\n });\n\n const extraAnswers = selectedChoices > correctChoices.length ? selectedChoices - correctChoices.length : 0;\n\n const total = correctChoices.length === 0 ? 1 : correctChoices.length;\n const str = ((correctAnswers - extraAnswers) / total).toFixed(2);\n\n return str < 0 ? 0 : parseFloat(str);\n};\n\nexport function outcome(config, session, env = {}) {\n return new Promise((resolve) => {\n log('outcome...');\n\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n }\n\n if (session.answers) {\n const score = getScore(config, session, env);\n resolve({ score });\n } else {\n resolve({ score: 0, empty: true });\n }\n });\n}\n\nconst returnShapesCorrect = (shapes) => {\n let answers = [];\n\n shapes.forEach((i) => {\n const { correct, id } = i;\n if (correct) {\n answers.push({ id });\n }\n });\n return answers;\n};\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { shapes: { rectangles = [], circles = [], polygons = {} } = {} } = question;\n\n const rectangleCorrect = returnShapesCorrect(rectangles);\n const polygonsCorrect = returnShapesCorrect(polygons);\n const circlesCorrect = returnShapesCorrect(circles);\n\n resolve({\n answers: [...rectangleCorrect, ...polygonsCorrect, ...circlesCorrect],\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 { shapes } = model;\n const { minShapes = 2, maxShapes, maxSelections } = 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 allShapes = Object.values(shapes || {}).reduce((acc, shape) => [...acc, ...shape], []);\n\n const nbOfSelections = (allShapes || []).reduce((acc, shape) => (shape.correct ? acc + 1 : acc), 0);\n\n const nbOfShapes = (allShapes || []).length;\n\n if (nbOfShapes < minShapes) {\n errors.shapes = `There should be at least ${minShapes} shapes defined.`;\n } else if (nbOfShapes > maxShapes) {\n errors.shapes = `No more than ${maxShapes} shapes should be defined.`;\n }\n\n if (nbOfSelections < 1) {\n errors.selections = 'There should be at least 1 shape selected.';\n } else if (nbOfSelections > maxSelections) {\n errors.selections = `No more than ${maxSelections} shapes should be selected.`;\n }\n\n return errors;\n};\n"],"names":["getCorrectResponse","choices","filter","c","correct","map","id","sort","isResponseCorrect","question","session","shapes","rectangles","polygons","circles","correctResponseIds","isEmpty","answers","length","answerIds","a","isEqual","dimensions","height","width","hotspotColor","hotspotList","imageUrl","multipleCorrect","outlineColor","outlineList","partialScoring","prompt","promptEnabled","rationaleEnabled","strokeWidth","studentInstructionsEnabled","teacherInstructions","teacherInstructionsEnabled","toolbarEditorPosition","log","debug","normalize","defaults","model","env","normalizedQuestion","hoverOutlineColor","selectedHotspotColor","language","fontSizeFactor","autoplayAudioEnabled","completeAudioEnabled","customAudioButton","shouldIncludeCorrectResponse","mode","role","Promise","resolve","out","disabled","index","rectProps","_objectSpread","polyProps","circleProps","responseCorrect","undefined","extraCSSRules","rationale","createDefaultModel","getScore","config","partialScoringEnabled","enabled","correctAnswers","selectedChoices","correctChoices","choice","forEach","shape","selected","answer","correctlySelected","extraAnswers","total","str","toFixed","parseFloat","outcome","score","empty","returnShapesCorrect","i","push","createCorrectResponseSession","rectangleCorrect","polygonsCorrect","circlesCorrect","getContent","html","replace","validate","minShapes","maxShapes","maxSelections","errors","field","required","allShapes","Object","values","reduce","acc","nbOfSelections","nbOfShapes","selections"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGO,IAAMA,kBAAkB,GAAIC,OAAD,IAChCA,OAAO,CACJC,MADH,CACWC,CAAD,IAAOA,CAAC,CAACC,OADnB,CAAA,CAEGC,GAFH,CAEQF,CAAD,IAAOA,CAAC,CAACG,EAFhB,CAGGC,CAAAA,IAHH,EADK,CAAA;AAMA,IAAMC,iBAAiB,GAAG,CAACC,QAAD,EAAWC,OAAX,KAAuB;AACtD,EAAM,IAAA;AACJC,IAAAA,MAAM,EAAE;AAAEC,MAAAA,UAAU,GAAG,EAAf;AAAmBC,MAAAA,QAAQ,GAAG,EAA9B;AAAkCC,MAAAA,OAAO,GAAG,EAAA;AAA5C,KAAA;AADJ,GAAA,GAEFL,QAFJ,CAAA;AAGA,EAAMR,IAAAA,OAAO,GAAG,CAAC,GAAGW,UAAJ,EAAgB,GAAGC,QAAnB,EAA6B,GAAGC,OAAhC,CAAhB,CAAA;AACA,EAAA,IAAIC,kBAAkB,GAAGf,kBAAkB,CAACC,OAAD,CAA3C,CAAA;;AAEA,EAAA,IAAI,CAACS,OAAD,IAAYM,OAAO,CAACN,OAAD,CAAvB,EAAkC;AAChC,IAAA,OAAO,KAAP,CAAA;AACD,GAAA;;AAED,EAAIA,IAAAA,OAAO,CAACO,OAAR,IAAmBP,OAAO,CAACO,OAAR,CAAgBC,MAAvC,EAA+C;AAC7C,IAAA,IAAIC,SAAS,GAAG,CAACT,OAAO,CAACO,OAAR,IAAmB,EAApB,EAAwBZ,GAAxB,CAA6Be,CAAD,IAAOA,CAAC,CAACd,EAArC,CAAhB,CAAA;AAEA,IAAOe,OAAAA,OAAO,CAACF,SAAS,CAACZ,IAAV,EAAD,EAAmBQ,kBAAnB,CAAd,CAAA;AACD,GAJD,MAIO,IAAI,EAAEA,kBAAkB,IAAIA,kBAAkB,CAACG,MAA3C,CAAJ,EAAwD;AAC7D,IAAA,OAAO,IAAP,CAAA;AACD,GAAA;;AAED,EAAA,OAAO,KAAP,CAAA;AACD,CApBM;;ACTP,eAAe;AACbI,EAAAA,UAAU,EAAE;AAAEC,IAAAA,MAAM,EAAE,CAAV;AAAaC,IAAAA,KAAK,EAAE,CAAA;AAApB,GADC;AAEbC,EAAAA,YAAY,EAAE,2BAFD;AAGbC,EAAAA,WAAW,EAAE,CAAC,2BAAD,CAHA;AAIbC,EAAAA,QAAQ,EAAE,EAJG;AAKbC,EAAAA,eAAe,EAAE,IALJ;AAMbC,EAAAA,YAAY,EAAE,MAND;AAObC,EAAAA,WAAW,EAAE,CAAC,MAAD,CAPA;AAQbC,EAAAA,cAAc,EAAE,KARH;AASbC,EAAAA,MAAM,EAAE,EATK;AAUbC,EAAAA,aAAa,EAAE,IAVF;AAWbC,EAAAA,gBAAgB,EAAE,IAXL;AAYbvB,EAAAA,MAAM,EAAE;AAAEC,IAAAA,UAAU,EAAE,EAAd;AAAkBC,IAAAA,QAAQ,EAAE,EAA5B;AAAgCC,IAAAA,OAAO,EAAE,EAAA;AAAzC,GAZK;AAabqB,EAAAA,WAAW,EAAE,CAbA;AAcbC,EAAAA,0BAA0B,EAAE,IAdf;AAebC,EAAAA,mBAAmB,EAAE,EAfR;AAgBbC,EAAAA,0BAA0B,EAAE,IAhBf;AAiBbC,EAAAA,qBAAqB,EAAE,QAAA;AAjBV,CAAf;;;;;ACQA,IAAMC,GAAG,GAAGC,KAAK,CAAC,iCAAD,CAAjB,CAAA;AAEO,IAAMC,SAAS,GAAIjC,QAAD,sCACpBkC,QADoB,CAAA,EAEpBlC,QAFoB,EAAlB;AAKA,SAASmC,KAAT,CAAenC,QAAf,EAAyBC,OAAzB,EAAkCmC,GAAlC,EAAuC;AAC5C,EAAA,IAAMC,kBAAkB,GAAGJ,SAAS,CAACjC,QAAD,CAApC,CAAA;AACA,EAAM,IAAA;AACJkB,IAAAA,QADI;AAEJL,IAAAA,UAFI;AAGJG,IAAAA,YAHI;AAIJsB,IAAAA,iBAJI;AAKJC,IAAAA,oBALI;AAMJpB,IAAAA,eANI;AAOJC,IAAAA,YAPI;AAQJE,IAAAA,cARI;AASJC,IAAAA,MATI;AAUJrB,IAAAA,MAVI;AAWJsC,IAAAA,QAXI;AAYJC,IAAAA,cAZI;AAaJC,IAAAA,oBAbI;AAcJC,IAAAA,oBAdI;AAeJC,IAAAA,iBAAAA;AAfI,GAAA,GAgBFP,kBAhBJ,CAAA;AAiBA,EAAM,IAAA;AAAElC,IAAAA,UAAF;AAAcC,IAAAA,QAAd;AAAwBC,IAAAA,OAAAA;AAAxB,GAAoCH,GAAAA,MAAM,IAAI,EAApD,CAAA;AAEA,EAAA,IAAM2C,4BAA4B,GAAGT,GAAG,CAACU,IAAJ,KAAa,UAAb,IAA4BV,GAAG,CAACW,IAAJ,KAAa,YAAb,IAA6BX,GAAG,CAACU,IAAJ,KAAa,MAA3G,CAAA;AAEA,EAAA,OAAO,IAAIE,OAAJ,CAAaC,OAAD,IAAa;AAC9B,IAAA,IAAMC,GAAG,GAAG;AACVC,MAAAA,QAAQ,EAAEf,GAAG,CAACU,IAAJ,KAAa,QADb;AAEVA,MAAAA,IAAI,EAAEV,GAAG,CAACU,IAFA;AAGVjC,MAAAA,UAHU;AAIVK,MAAAA,QAJU;AAKVE,MAAAA,YALU;AAMVJ,MAAAA,YANU;AAOVsB,MAAAA,iBAPU;AAQVC,MAAAA,oBARU;AASVpB,MAAAA,eATU;AAUVG,MAAAA,cAVU;AAWVkB,MAAAA,QAXU;AAYVC,MAAAA,cAZU;AAaVC,MAAAA,oBAbU;AAcVC,MAAAA,oBAdU;AAeVC,MAAAA,iBAfU;AAgBV1C,MAAAA,MAAM,oCACDA,MADC,CAAA,EAAA,EAAA,EAAA;AAEJ;AACAC,QAAAA,UAAU,EAAE,CAACA,UAAU,IAAI,EAAf,EAAmBP,GAAnB,CAAuB,IAAA,IAAA;AAAA,UAAC,IAAA;AAAEwD,YAAAA,KAAF;AAASzD,YAAAA,OAAAA;AAAT,WAAD,GAAA,IAAA;AAAA,cAAsB0D,SAAtB,GAAA,wBAAA,CAAA,IAAA,EAAA,SAAA,CAAA,CAAA;;AAAA,UAAA,OACjCR,4BAA4B,GAAAS,cAAA,CAAA;AAAK3D,YAAAA,OAAAA;AAAL,WAAiB0D,EAAAA,SAAjB,CAAoCA,GAAAA,cAAAA,CAAAA,EAAAA,EAAAA,SAApC,CADK,CAAA;AAAA,SAAvB,CAHR;AAMJ;AACAjD,QAAAA,QAAQ,EAAE,CAACA,QAAQ,IAAI,EAAb,EAAiBR,GAAjB,CAAqB,KAAA,IAAA;AAAA,UAAC,IAAA;AAAEwD,YAAAA,KAAF;AAASzD,YAAAA,OAAAA;AAAT,WAAD,GAAA,KAAA;AAAA,cAAsB4D,SAAtB,GAAA,wBAAA,CAAA,KAAA,EAAA,UAAA,CAAA,CAAA;;AAAA,UAAA,OAC7BV,4BAA4B,GAAAS,cAAA,CAAA;AAAK3D,YAAAA,OAAAA;AAAL,WAAiB4D,EAAAA,SAAjB,CAAoCA,GAAAA,cAAAA,CAAAA,EAAAA,EAAAA,SAApC,CADC,CAAA;AAAA,SAArB,CAPN;AAUJ;AACAlD,QAAAA,OAAO,EAAE,CAACA,OAAO,IAAI,EAAZ,EAAgBT,GAAhB,CAAoB,KAAA,IAAA;AAAA,UAAC,IAAA;AAAEwD,YAAAA,KAAF;AAASzD,YAAAA,OAAAA;AAAT,WAAD,GAAA,KAAA;AAAA,cAAsB6D,WAAtB,GAAA,wBAAA,CAAA,KAAA,EAAA,UAAA,CAAA,CAAA;;AAAA,UAAA,OAC3BX,4BAA4B,GAAAS,cAAA,CAAA;AAAK3D,YAAAA,OAAAA;AAAL,WAAiB6D,EAAAA,WAAjB,CAAsCA,GAAAA,cAAAA,CAAAA,EAAAA,EAAAA,WAAtC,CADD,CAAA;AAAA,SAApB,CAAA;AAXL,OAhBI,CAAA;AA+BVC,MAAAA,eAAe,EAAErB,GAAG,CAACU,IAAJ,KAAa,UAAb,GAA0B/C,iBAAiB,CAACsC,kBAAD,EAAqBpC,OAArB,CAA3C,GAA2EyD,SA/BlF;AAgCVC,MAAAA,aAAa,EAAEtB,kBAAkB,CAACsB,aAAAA;AAhCxB,KAAZ,CAAA;;AAmCA,IAAA,IAAIvB,GAAG,CAACW,IAAJ,KAAa,YAAb,KAA8BX,GAAG,CAACU,IAAJ,KAAa,MAAb,IAAuBV,GAAG,CAACU,IAAJ,KAAa,UAAlE,CAAJ,EAAmF;AACjFI,MAAAA,GAAG,CAACU,SAAJ,GAAgBvB,kBAAkB,CAACZ,gBAAnB,GAAsCY,kBAAkB,CAACuB,SAAzD,GAAqE,IAArF,CAAA;AACAV,MAAAA,GAAG,CAACtB,mBAAJ,GAA0BS,kBAAkB,CAACR,0BAAnB,GACtBQ,kBAAkB,CAACT,mBADG,GAEtB,IAFJ,CAAA;AAGD,KALD,MAKO;AACLsB,MAAAA,GAAG,CAACU,SAAJ,GAAgB,IAAhB,CAAA;AACAV,MAAAA,GAAG,CAACtB,mBAAJ,GAA0B,IAA1B,CAAA;AACD,KAAA;;AAEDsB,IAAAA,GAAG,CAAC3B,MAAJ,GAAac,kBAAkB,CAACb,aAAnB,GAAmCD,MAAnC,GAA4C,IAAzD,CAAA;AACA2B,IAAAA,GAAG,CAACxB,WAAJ,GAAkBW,kBAAkB,CAACX,WAArC,CAAA;AAEAuB,IAAAA,OAAO,CAACC,GAAD,CAAP,CAAA;AACD,GAlDM,CAAP,CAAA;AAmDD,CAAA;AAEYW,IAAAA,kBAAkB,GAAG,SAArBA,kBAAqB,GAAA;AAAA,EAAC1B,IAAAA,KAAD,uEAAS,EAAT,CAAA;AAAA,EAAA,OAChC,IAAIa,OAAJ,CAAaC,OAAD,IAAa;AACvBA,IAAAA,OAAO,CAAAK,cAAA,CAAAA,cAAA,CAAA,EAAA,EACFpB,QADE,CAAA,EAEFC,KAFE,CAAP,CAAA,CAAA;AAID,GALD,CADgC,CAAA;AAAA,EAA3B;;AAQP,IAAM2B,QAAQ,GAAG,SAAXA,QAAW,CAACC,MAAD,EAAS9D,OAAT,EAA+B;AAAA,EAAbmC,IAAAA,GAAa,uEAAP,EAAO,CAAA;AAC9C,EAAM,IAAA;AAAE5B,IAAAA,OAAAA;AAAF,GAAcP,GAAAA,OAAO,IAAI,EAA/B,CAAA;;AAEA,EAAI,IAAA,CAAC8D,MAAM,CAAC7D,MAAR,IAAmB,CAAC6D,MAAM,CAAC7D,MAAP,CAAcC,UAAf,IAA6B,CAAC4D,MAAM,CAAC7D,MAAP,CAAcE,QAA5C,IAAwD,CAAC2D,MAAM,CAAC7D,MAAP,CAAcG,OAA9F,EAAwG;AACtG,IAAA,OAAO,CAAP,CAAA;AACD,GAAA;;AAED,EAAM,IAAA;AAAEH,IAAAA,MAAM,EAAE;AAAEC,MAAAA,UAAU,GAAG,EAAf;AAAmBC,MAAAA,QAAQ,GAAG,EAA9B;AAAkCC,MAAAA,OAAO,GAAG,EAAA;AAA5C,KAAmD,GAAA,EAAA;AAA7D,GAAA,GAAoE0D,MAA1E,CAAA;AACA,EAAMC,IAAAA,qBAAqB,GAAG1C,cAAc,CAAC2C,OAAf,CAAuBF,MAAvB,EAA+B3B,GAA/B,CAA9B,CAAA;;AAEA,EAAI,IAAA,CAAC4B,qBAAL,EAA4B;AAC1B,IAAOjE,OAAAA,iBAAiB,CAACgE,MAAD,EAAS9D,OAAT,CAAjB,GAAqC,CAArC,GAAyC,CAAhD,CAAA;AACD,GAAA;;AAED,EAAIiE,IAAAA,cAAc,GAAG,CAArB,CAAA;AACA,EAAIC,IAAAA,eAAe,GAAG,CAAtB,CAAA;AAEA,EAAM3E,IAAAA,OAAO,GAAG,CAAC,GAAGW,UAAJ,EAAgB,GAAGC,QAAnB,EAA6B,GAAGC,OAAhC,CAAhB,CAAA;AAEA,EAAM+D,IAAAA,cAAc,GAAG5E,OAAO,CAACC,MAAR,CAAgB4E,MAAD,IAAYA,MAAM,CAAC1E,OAAlC,CAAvB,CAAA;AAEAH,EAAAA,OAAO,CAAC8E,OAAR,CAAiBC,KAAD,IAAW;AACzB,IAAA,IAAMC,QAAQ,GAAGhE,OAAO,IAAIA,OAAO,CAACf,MAAR,CAAgBgF,MAAD,IAAYA,MAAM,CAAC5E,EAAP,KAAc0E,KAAK,CAAC1E,EAA/C,CAAA,CAAmD,CAAnD,CAA5B,CAAA;AACA,IAAA,IAAM6E,iBAAiB,GAAGH,KAAK,CAAC5E,OAAN,IAAiB6E,QAA3C,CAAA;;AAEA,IAAA,IAAIA,QAAJ,EAAc;AACZL,MAAAA,eAAe,IAAI,CAAnB,CAAA;AACD,KAAA;;AAED,IAAA,IAAIO,iBAAJ,EAAuB;AACrBR,MAAAA,cAAc,IAAI,CAAlB,CAAA;AACD,KAAA;AACF,GAXD,CAAA,CAAA;AAaA,EAAA,IAAMS,YAAY,GAAGR,eAAe,GAAGC,cAAc,CAAC3D,MAAjC,GAA0C0D,eAAe,GAAGC,cAAc,CAAC3D,MAA3E,GAAoF,CAAzG,CAAA;AAEA,EAAA,IAAMmE,KAAK,GAAGR,cAAc,CAAC3D,MAAf,KAA0B,CAA1B,GAA8B,CAA9B,GAAkC2D,cAAc,CAAC3D,MAA/D,CAAA;AACA,EAAA,IAAMoE,GAAG,GAAG,CAAC,CAACX,cAAc,GAAGS,YAAlB,IAAkCC,KAAnC,EAA0CE,OAA1C,CAAkD,CAAlD,CAAZ,CAAA;AAEA,EAAOD,OAAAA,GAAG,GAAG,CAAN,GAAU,CAAV,GAAcE,UAAU,CAACF,GAAD,CAA/B,CAAA;AACD,CAxCD,CAAA;;AA0CO,SAASG,OAAT,CAAiBjB,MAAjB,EAAyB9D,OAAzB,EAA4C;AAAA,EAAVmC,IAAAA,GAAU,uEAAJ,EAAI,CAAA;AACjD,EAAA,OAAO,IAAIY,OAAJ,CAAaC,OAAD,IAAa;AAC9BlB,IAAAA,GAAG,CAAC,YAAD,CAAH,CAAA;;AAEA,IAAA,IAAI,CAAC9B,OAAD,IAAYM,OAAO,CAACN,OAAD,CAAvB,EAAkC;AAChCgD,MAAAA,OAAO,CAAC;AAAEgC,QAAAA,KAAK,EAAE,CAAT;AAAYC,QAAAA,KAAK,EAAE,IAAA;AAAnB,OAAD,CAAP,CAAA;AACD,KAAA;;AAED,IAAIjF,IAAAA,OAAO,CAACO,OAAZ,EAAqB;AACnB,MAAMyE,IAAAA,KAAK,GAAGnB,QAAQ,CAACC,MAAD,EAAS9D,OAAT,EAAkBmC,GAAlB,CAAtB,CAAA;AACAa,MAAAA,OAAO,CAAC;AAAEgC,QAAAA,KAAAA;AAAF,OAAD,CAAP,CAAA;AACD,KAHD,MAGO;AACLhC,MAAAA,OAAO,CAAC;AAAEgC,QAAAA,KAAK,EAAE,CAAT;AAAYC,QAAAA,KAAK,EAAE,IAAA;AAAnB,OAAD,CAAP,CAAA;AACD,KAAA;AACF,GAbM,CAAP,CAAA;AAcD,CAAA;;AAED,IAAMC,mBAAmB,GAAIjF,MAAD,IAAY;AACtC,EAAIM,IAAAA,OAAO,GAAG,EAAd,CAAA;AAEAN,EAAAA,MAAM,CAACoE,OAAP,CAAgBc,CAAD,IAAO;AACpB,IAAM,IAAA;AAAEzF,MAAAA,OAAF;AAAWE,MAAAA,EAAAA;AAAX,KAAA,GAAkBuF,CAAxB,CAAA;;AACA,IAAA,IAAIzF,OAAJ,EAAa;AACXa,MAAAA,OAAO,CAAC6E,IAAR,CAAa;AAAExF,QAAAA,EAAAA;AAAF,OAAb,CAAA,CAAA;AACD,KAAA;AACF,GALD,CAAA,CAAA;AAMA,EAAA,OAAOW,OAAP,CAAA;AACD,CAVD,CAAA;;IAYa8E,4BAA4B,GAAG,CAACtF,QAAD,EAAWoC,GAAX,KAAmB;AAC7D,EAAA,OAAO,IAAIY,OAAJ,CAAaC,OAAD,IAAa;AAC9B,IAAIb,IAAAA,GAAG,CAACU,IAAJ,KAAa,UAAb,IAA2BV,GAAG,CAACW,IAAJ,KAAa,YAA5C,EAA0D;AACxD,MAAM,IAAA;AAAE7C,QAAAA,MAAM,EAAE;AAAEC,UAAAA,UAAU,GAAG,EAAf;AAAmBE,UAAAA,OAAO,GAAG,EAA7B;AAAiCD,UAAAA,QAAQ,GAAG,EAAA;AAA5C,SAAmD,GAAA,EAAA;AAA7D,OAAA,GAAoEJ,QAA1E,CAAA;AAEA,MAAA,IAAMuF,gBAAgB,GAAGJ,mBAAmB,CAAChF,UAAD,CAA5C,CAAA;AACA,MAAA,IAAMqF,eAAe,GAAGL,mBAAmB,CAAC/E,QAAD,CAA3C,CAAA;AACA,MAAA,IAAMqF,cAAc,GAAGN,mBAAmB,CAAC9E,OAAD,CAA1C,CAAA;AAEA4C,MAAAA,OAAO,CAAC;AACNzC,QAAAA,OAAO,EAAE,CAAC,GAAG+E,gBAAJ,EAAsB,GAAGC,eAAzB,EAA0C,GAAGC,cAA7C,CADH;AAEN5F,QAAAA,EAAE,EAAE,GAAA;AAFE,OAAD,CAAP,CAAA;AAID,KAXD,MAWO;AACLoD,MAAAA,OAAO,CAAC,IAAD,CAAP,CAAA;AACD,KAAA;AACF,GAfM,CAAP,CAAA;AAgBD;;;AAMD,IAAMyC,UAAU,GAAIC,IAAD,IAAU,CAACA,IAAI,IAAI,EAAT,EAAaC,OAAb,CAAqB,oCAArB,EAA2D,EAA3D,CAA7B,CAAA;;AAEaC,IAAAA,QAAQ,GAAG,SAAXA,QAAW,GAA6B;AAAA,EAA5B1D,IAAAA,KAA4B,uEAApB,EAAoB,CAAA;AAAA,EAAhB4B,IAAAA,MAAgB,uEAAP,EAAO,CAAA;AACnD,EAAM,IAAA;AAAE7D,IAAAA,MAAAA;AAAF,GAAA,GAAaiC,KAAnB,CAAA;AACA,EAAM,IAAA;AAAE2D,IAAAA,SAAS,GAAG,CAAd;AAAiBC,IAAAA,SAAjB;AAA4BC,IAAAA,aAAAA;AAA5B,GAAA,GAA8CjC,MAApD,CAAA;AACA,EAAMkC,IAAAA,MAAM,GAAG,EAAf,CAAA;AAEA,EAAC,CAAA,qBAAD,EAAwB,QAAxB,EAAkC,WAAlC,CAA+C3B,CAAAA,OAA/C,CAAwD4B,KAAD,IAAW;AAAA,IAAA,IAAA,aAAA,CAAA;;AAChE,IAAA,IAAI,iBAAAnC,MAAM,CAACmC,KAAD,CAAN,wDAAeC,QAAf,IAA2B,CAACT,UAAU,CAACvD,KAAK,CAAC+D,KAAD,CAAN,CAA1C,EAA0D;AACxDD,MAAAA,MAAM,CAACC,KAAD,CAAN,GAAgB,yBAAhB,CAAA;AACD,KAAA;AACF,GAJD,CAAA,CAAA;AAMA,EAAME,IAAAA,SAAS,GAAGC,MAAM,CAACC,MAAP,CAAcpG,MAAM,IAAI,EAAxB,CAA4BqG,CAAAA,MAA5B,CAAmC,CAACC,GAAD,EAAMjC,KAAN,KAAgB,CAAC,GAAGiC,GAAJ,EAAS,GAAGjC,KAAZ,CAAnD,EAAuE,EAAvE,CAAlB,CAAA;AAEA,EAAMkC,IAAAA,cAAc,GAAG,CAACL,SAAS,IAAI,EAAd,EAAkBG,MAAlB,CAAyB,CAACC,GAAD,EAAMjC,KAAN,KAAiBA,KAAK,CAAC5E,OAAN,GAAgB6G,GAAG,GAAG,CAAtB,GAA0BA,GAApE,EAA0E,CAA1E,CAAvB,CAAA;AAEA,EAAA,IAAME,UAAU,GAAG,CAACN,SAAS,IAAI,EAAd,EAAkB3F,MAArC,CAAA;;AAEA,EAAIiG,IAAAA,UAAU,GAAGZ,SAAjB,EAA4B;AAC1BG,IAAAA,MAAM,CAAC/F,MAAP,GAAA,2BAAA,CAAA,MAAA,CAA4C4F,SAA5C,EAAA,kBAAA,CAAA,CAAA;AACD,GAFD,MAEO,IAAIY,UAAU,GAAGX,SAAjB,EAA4B;AACjCE,IAAAA,MAAM,CAAC/F,MAAP,GAAA,eAAA,CAAA,MAAA,CAAgC6F,SAAhC,EAAA,4BAAA,CAAA,CAAA;AACD,GAAA;;AAED,EAAIU,IAAAA,cAAc,GAAG,CAArB,EAAwB;AACtBR,IAAAA,MAAM,CAACU,UAAP,GAAoB,4CAApB,CAAA;AACD,GAFD,MAEO,IAAIF,cAAc,GAAGT,aAArB,EAAoC;AACzCC,IAAAA,MAAM,CAACU,UAAP,GAAA,eAAA,CAAA,MAAA,CAAoCX,aAApC,EAAA,6BAAA,CAAA,CAAA;AACD,GAAA;;AAED,EAAA,OAAOC,MAAP,CAAA;AACD;;;;"}
|
|
1
|
+
{"version":3,"file":"controller.js","sources":["../controller/src/utils.js","../controller/src/defaults.js","../controller/src/index.js"],"sourcesContent":["import isEqual from 'lodash/isEqual';\nimport isEmpty from 'lodash/isEmpty';\n\nexport const getCorrectResponse = (choices) =>\n choices\n .filter((c) => c.correct)\n .map((c) => c.id)\n .sort();\n\nexport const isResponseCorrect = (question, session) => {\n const {\n shapes: { rectangles = [], polygons = [], circles = [] },\n } = question;\n const choices = [...rectangles, ...polygons, ...circles];\n let correctResponseIds = getCorrectResponse(choices);\n\n if (!session || isEmpty(session)) {\n return false;\n }\n\n if (session.answers && session.answers.length) {\n let answerIds = (session.answers || []).map((a) => a.id);\n\n return isEqual(answerIds.sort(), correctResponseIds);\n } else if (!(correctResponseIds && correctResponseIds.length)) {\n return true;\n }\n\n return false;\n};\n","export default {\n dimensions: { height: 0, width: 0 },\n hotspotColor: 'rgba(137, 183, 244, 0.25)',\n hotspotList: ['rgba(137, 183, 244, 0.25)'],\n imageUrl: '',\n multipleCorrect: true,\n outlineColor: 'blue',\n outlineList: ['blue'],\n partialScoring: false,\n prompt: '',\n promptEnabled: true,\n rationaleEnabled: true,\n shapes: { rectangles: [], polygons: [], circles: [] },\n strokeWidth: 5,\n studentInstructionsEnabled: true,\n teacherInstructions: '',\n teacherInstructionsEnabled: true,\n toolbarEditorPosition: 'bottom',\n};\n","import debug from 'debug';\nimport isEmpty from 'lodash/isEmpty';\nimport { partialScoring } from '@pie-lib/controller-utils';\n\nimport { isResponseCorrect } from './utils';\n\nimport defaults from './defaults';\n\nconst log = debug('pie-elements:hotspot:controller');\n\nexport const normalize = (question) => ({\n ...defaults,\n ...question,\n});\n\nexport function model(question, session, env) {\n const normalizedQuestion = normalize(question);\n const {\n imageUrl,\n dimensions,\n hotspotColor,\n hoverOutlineColor,\n selectedHotspotColor,\n multipleCorrect,\n outlineColor,\n partialScoring,\n prompt,\n shapes,\n language,\n fontSizeFactor,\n autoplayAudioEnabled,\n completeAudioEnabled,\n customAudioButton,\n } = normalizedQuestion;\n const { rectangles, polygons, circles } = shapes || {};\n\n const shouldIncludeCorrectResponse = env.mode === 'evaluate' || (env.role === 'instructor' && env.mode === 'view');\n\n return new Promise((resolve) => {\n const out = {\n disabled: env.mode !== 'gather',\n mode: env.mode,\n dimensions,\n imageUrl,\n outlineColor,\n hotspotColor,\n hoverOutlineColor,\n selectedHotspotColor,\n multipleCorrect,\n partialScoring,\n language,\n fontSizeFactor,\n autoplayAudioEnabled,\n completeAudioEnabled,\n customAudioButton,\n shapes: {\n ...shapes,\n // eslint-disable-next-line no-unused-vars\n rectangles: (rectangles || []).map(({ index, correct, ...rectProps }) =>\n shouldIncludeCorrectResponse ? { correct, ...rectProps } : { ...rectProps },\n ),\n // eslint-disable-next-line no-unused-vars\n polygons: (polygons || []).map(({ index, correct, ...polyProps }) =>\n shouldIncludeCorrectResponse ? { correct, ...polyProps } : { ...polyProps },\n ),\n // eslint-disable-next-line no-unused-vars\n circles: (circles || []).map(({ index, correct, ...circleProps }) =>\n shouldIncludeCorrectResponse ? { correct, ...circleProps } : { ...circleProps },\n ),\n },\n responseCorrect: env.mode === 'evaluate' ? isResponseCorrect(normalizedQuestion, session) : undefined,\n extraCSSRules: normalizedQuestion.extraCSSRules,\n };\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n out.prompt = normalizedQuestion.promptEnabled ? prompt : null;\n out.strokeWidth = normalizedQuestion.strokeWidth;\n\n resolve(out);\n });\n}\n\nexport const createDefaultModel = (model = {}) =>\n new Promise((resolve) => {\n resolve({\n ...defaults,\n ...model,\n });\n });\n\nconst getScore = (config, session, env = {}) => {\n const { answers } = session || {};\n\n if (!config.shapes || (!config.shapes.rectangles && !config.shapes.polygons && !config.shapes.circles)) {\n return 0;\n }\n\n const { shapes: { rectangles = [], polygons = [], circles = [] } = {} } = config;\n const partialScoringEnabled = partialScoring.enabled(config, env);\n\n if (!partialScoringEnabled) {\n return isResponseCorrect(config, session) ? 1 : 0;\n }\n\n let correctAnswers = 0;\n let selectedChoices = 0;\n\n const choices = [...rectangles, ...polygons, ...circles];\n\n const correctChoices = choices.filter((choice) => choice.correct);\n\n choices.forEach((shape) => {\n const selected = answers && answers.filter((answer) => answer.id === shape.id)[0];\n const correctlySelected = shape.correct && selected;\n\n if (selected) {\n selectedChoices += 1;\n }\n\n if (correctlySelected) {\n correctAnswers += 1;\n }\n });\n\n const extraAnswers = selectedChoices > correctChoices.length ? selectedChoices - correctChoices.length : 0;\n\n const total = correctChoices.length === 0 ? 1 : correctChoices.length;\n const str = ((correctAnswers - extraAnswers) / total).toFixed(2);\n\n return str < 0 ? 0 : parseFloat(str);\n};\n\nexport function outcome(config, session, env = {}) {\n return new Promise((resolve) => {\n log('outcome...');\n\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n }\n\n if (session.answers) {\n const score = getScore(config, session, env);\n resolve({ score });\n } else {\n resolve({ score: 0, empty: true });\n }\n });\n}\n\nconst returnShapesCorrect = (shapes) => {\n let answers = [];\n\n shapes.forEach((i) => {\n const { correct, id } = i;\n if (correct) {\n answers.push({ id });\n }\n });\n return answers;\n};\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { shapes: { rectangles = [], circles = [], polygons = {} } = {} } = question;\n\n const rectangleCorrect = returnShapesCorrect(rectangles);\n const polygonsCorrect = returnShapesCorrect(polygons);\n const circlesCorrect = returnShapesCorrect(circles);\n\n resolve({\n answers: [...rectangleCorrect, ...polygonsCorrect, ...circlesCorrect],\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 { shapes } = model;\n const { minShapes = 2, maxShapes, maxSelections } = 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 allShapes = Object.values(shapes || {}).reduce((acc, shape) => [...acc, ...shape], []);\n\n const nbOfSelections = (allShapes || []).reduce((acc, shape) => (shape.correct ? acc + 1 : acc), 0);\n\n const nbOfShapes = (allShapes || []).length;\n\n if (nbOfShapes < minShapes) {\n errors.shapes = `There should be at least ${minShapes} shapes defined.`;\n } else if (nbOfShapes > maxShapes) {\n errors.shapes = `No more than ${maxShapes} shapes should be defined.`;\n }\n\n if (nbOfSelections < 1) {\n errors.selections = 'There should be at least 1 shape selected.';\n } else if (nbOfSelections > maxSelections) {\n errors.selections = `No more than ${maxSelections} shapes should be selected.`;\n }\n\n return errors;\n};\n"],"names":["getCorrectResponse","choices","filter","c","correct","map","id","sort","isResponseCorrect","question","session","shapes","rectangles","polygons","circles","correctResponseIds","isEmpty","answers","length","answerIds","a","isEqual","dimensions","height","width","hotspotColor","hotspotList","imageUrl","multipleCorrect","outlineColor","outlineList","partialScoring","prompt","promptEnabled","rationaleEnabled","strokeWidth","studentInstructionsEnabled","teacherInstructions","teacherInstructionsEnabled","toolbarEditorPosition","log","debug","normalize","defaults","model","env","normalizedQuestion","hoverOutlineColor","selectedHotspotColor","language","fontSizeFactor","autoplayAudioEnabled","completeAudioEnabled","customAudioButton","shouldIncludeCorrectResponse","mode","role","Promise","resolve","out","disabled","rectProps","polyProps","circleProps","responseCorrect","undefined","extraCSSRules","rationale","createDefaultModel","getScore","config","partialScoringEnabled","enabled","correctAnswers","selectedChoices","correctChoices","choice","forEach","shape","selected","answer","correctlySelected","extraAnswers","total","str","toFixed","parseFloat","outcome","score","empty","returnShapesCorrect","i","push","createCorrectResponseSession","rectangleCorrect","polygonsCorrect","circlesCorrect","getContent","html","replace","validate","minShapes","maxShapes","maxSelections","errors","field","required","allShapes","Object","values","reduce","acc","nbOfSelections","nbOfShapes","selections"],"mappings":"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"}
|