@pie-element/hotspot 9.0.2-esm.0 → 9.2.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 +19 -0
- package/configure/CHANGELOG.md +19 -0
- package/configure/lib/icons.js +3 -7
- package/configure/lib/icons.js.map +1 -1
- package/configure/package.json +3 -3
- package/configure/src/icons.js +4 -2
- package/controller/CHANGELOG.md +19 -0
- package/controller/package.json +2 -2
- package/lib/hotspot/icons.js +4 -9
- package/lib/hotspot/icons.js.map +1 -1
- package/package.json +7 -24
- package/src/hotspot/icons.js +6 -5
- package/esm/configure.js +0 -25986
- package/esm/configure.js.map +0 -1
- package/esm/controller.js +0 -344
- package/esm/controller.js.map +0 -1
- package/esm/element.js +0 -1312
- package/esm/element.js.map +0 -1
package/esm/controller.js
DELETED
|
@@ -1,344 +0,0 @@
|
|
|
1
|
-
import debug from 'debug';
|
|
2
|
-
import isEmpty from 'lodash/isEmpty';
|
|
3
|
-
import { partialScoring } from '@pie-lib/controller-utils';
|
|
4
|
-
import isEqual from 'lodash/isEqual';
|
|
5
|
-
|
|
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
|
-
}
|
|
17
|
-
|
|
18
|
-
return target;
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
return _extends.apply(this, arguments);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
function _objectWithoutPropertiesLoose(source, excluded) {
|
|
25
|
-
if (source == null) return {};
|
|
26
|
-
var target = {};
|
|
27
|
-
var sourceKeys = Object.keys(source);
|
|
28
|
-
var key, i;
|
|
29
|
-
|
|
30
|
-
for (i = 0; i < sourceKeys.length; i++) {
|
|
31
|
-
key = sourceKeys[i];
|
|
32
|
-
if (excluded.indexOf(key) >= 0) continue;
|
|
33
|
-
target[key] = source[key];
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
return target;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
const getCorrectResponse = choices => choices.filter(c => c.correct).map(c => c.id).sort();
|
|
40
|
-
const isResponseCorrect = (question, session) => {
|
|
41
|
-
const {
|
|
42
|
-
shapes: {
|
|
43
|
-
rectangles = [],
|
|
44
|
-
polygons = [],
|
|
45
|
-
circles = []
|
|
46
|
-
}
|
|
47
|
-
} = question;
|
|
48
|
-
const choices = [...rectangles, ...polygons, ...circles];
|
|
49
|
-
let correctResponseIds = getCorrectResponse(choices);
|
|
50
|
-
|
|
51
|
-
if (!session || isEmpty(session)) {
|
|
52
|
-
return false;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
if (session.answers && session.answers.length) {
|
|
56
|
-
let answerIds = (session.answers || []).map(a => a.id);
|
|
57
|
-
return isEqual(answerIds.sort(), correctResponseIds);
|
|
58
|
-
} else if (!(correctResponseIds && correctResponseIds.length)) {
|
|
59
|
-
return true;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
return false;
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
var defaults = {
|
|
66
|
-
dimensions: {
|
|
67
|
-
height: 0,
|
|
68
|
-
width: 0
|
|
69
|
-
},
|
|
70
|
-
hotspotColor: 'rgba(137, 183, 244, 0.25)',
|
|
71
|
-
hotspotList: ['rgba(137, 183, 244, 0.25)'],
|
|
72
|
-
imageUrl: '',
|
|
73
|
-
multipleCorrect: true,
|
|
74
|
-
outlineColor: 'blue',
|
|
75
|
-
outlineList: ['blue'],
|
|
76
|
-
partialScoring: false,
|
|
77
|
-
prompt: '',
|
|
78
|
-
promptEnabled: true,
|
|
79
|
-
rationaleEnabled: true,
|
|
80
|
-
shapes: {
|
|
81
|
-
rectangles: [],
|
|
82
|
-
polygons: [],
|
|
83
|
-
circles: []
|
|
84
|
-
},
|
|
85
|
-
strokeWidth: 5,
|
|
86
|
-
studentInstructionsEnabled: true,
|
|
87
|
-
teacherInstructions: '',
|
|
88
|
-
teacherInstructionsEnabled: true,
|
|
89
|
-
toolbarEditorPosition: 'bottom'
|
|
90
|
-
};
|
|
91
|
-
|
|
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);
|
|
97
|
-
function model(question, session, env) {
|
|
98
|
-
const normalizedQuestion = normalize(question);
|
|
99
|
-
const {
|
|
100
|
-
imageUrl,
|
|
101
|
-
dimensions,
|
|
102
|
-
hotspotColor,
|
|
103
|
-
hoverOutlineColor,
|
|
104
|
-
selectedHotspotColor,
|
|
105
|
-
multipleCorrect,
|
|
106
|
-
outlineColor,
|
|
107
|
-
partialScoring,
|
|
108
|
-
prompt,
|
|
109
|
-
shapes,
|
|
110
|
-
language,
|
|
111
|
-
fontSizeFactor,
|
|
112
|
-
autoplayAudioEnabled,
|
|
113
|
-
completeAudioEnabled,
|
|
114
|
-
customAudioButton
|
|
115
|
-
} = normalizedQuestion;
|
|
116
|
-
const {
|
|
117
|
-
rectangles,
|
|
118
|
-
polygons,
|
|
119
|
-
circles
|
|
120
|
-
} = shapes || {};
|
|
121
|
-
const shouldIncludeCorrectResponse = env.mode === 'evaluate' || env.role === 'instructor' && env.mode === 'view';
|
|
122
|
-
return new Promise(resolve => {
|
|
123
|
-
const out = {
|
|
124
|
-
disabled: env.mode !== 'gather',
|
|
125
|
-
mode: env.mode,
|
|
126
|
-
dimensions,
|
|
127
|
-
imageUrl,
|
|
128
|
-
outlineColor,
|
|
129
|
-
hotspotColor,
|
|
130
|
-
hoverOutlineColor,
|
|
131
|
-
selectedHotspotColor,
|
|
132
|
-
multipleCorrect,
|
|
133
|
-
partialScoring,
|
|
134
|
-
language,
|
|
135
|
-
fontSizeFactor,
|
|
136
|
-
autoplayAudioEnabled,
|
|
137
|
-
completeAudioEnabled,
|
|
138
|
-
customAudioButton,
|
|
139
|
-
shapes: _extends({}, shapes, {
|
|
140
|
-
// eslint-disable-next-line no-unused-vars
|
|
141
|
-
rectangles: (rectangles || []).map(_ref => {
|
|
142
|
-
let {
|
|
143
|
-
correct
|
|
144
|
-
} = _ref,
|
|
145
|
-
rectProps = _objectWithoutPropertiesLoose(_ref, _excluded);
|
|
146
|
-
|
|
147
|
-
return shouldIncludeCorrectResponse ? _extends({
|
|
148
|
-
correct
|
|
149
|
-
}, rectProps) : _extends({}, rectProps);
|
|
150
|
-
}),
|
|
151
|
-
// eslint-disable-next-line no-unused-vars
|
|
152
|
-
polygons: (polygons || []).map(_ref2 => {
|
|
153
|
-
let {
|
|
154
|
-
correct
|
|
155
|
-
} = _ref2,
|
|
156
|
-
polyProps = _objectWithoutPropertiesLoose(_ref2, _excluded2);
|
|
157
|
-
|
|
158
|
-
return shouldIncludeCorrectResponse ? _extends({
|
|
159
|
-
correct
|
|
160
|
-
}, polyProps) : _extends({}, polyProps);
|
|
161
|
-
}),
|
|
162
|
-
// eslint-disable-next-line no-unused-vars
|
|
163
|
-
circles: (circles || []).map(_ref3 => {
|
|
164
|
-
let {
|
|
165
|
-
correct
|
|
166
|
-
} = _ref3,
|
|
167
|
-
circleProps = _objectWithoutPropertiesLoose(_ref3, _excluded3);
|
|
168
|
-
|
|
169
|
-
return shouldIncludeCorrectResponse ? _extends({
|
|
170
|
-
correct
|
|
171
|
-
}, circleProps) : _extends({}, circleProps);
|
|
172
|
-
})
|
|
173
|
-
}),
|
|
174
|
-
responseCorrect: env.mode === 'evaluate' ? isResponseCorrect(normalizedQuestion, session) : undefined,
|
|
175
|
-
extraCSSRules: normalizedQuestion.extraCSSRules
|
|
176
|
-
};
|
|
177
|
-
|
|
178
|
-
if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {
|
|
179
|
-
out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;
|
|
180
|
-
out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled ? normalizedQuestion.teacherInstructions : null;
|
|
181
|
-
} else {
|
|
182
|
-
out.rationale = null;
|
|
183
|
-
out.teacherInstructions = null;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
out.prompt = normalizedQuestion.promptEnabled ? prompt : null;
|
|
187
|
-
out.strokeWidth = normalizedQuestion.strokeWidth;
|
|
188
|
-
resolve(out);
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
const createDefaultModel = (model = {}) => new Promise(resolve => {
|
|
192
|
-
resolve(_extends({}, defaults, model));
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
const getScore = (config, session, env = {}) => {
|
|
196
|
-
const {
|
|
197
|
-
answers
|
|
198
|
-
} = session || {};
|
|
199
|
-
|
|
200
|
-
if (!config.shapes || !config.shapes.rectangles && !config.shapes.polygons && !config.shapes.circles) {
|
|
201
|
-
return 0;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
const {
|
|
205
|
-
shapes: {
|
|
206
|
-
rectangles = [],
|
|
207
|
-
polygons = [],
|
|
208
|
-
circles = []
|
|
209
|
-
} = {}
|
|
210
|
-
} = config;
|
|
211
|
-
const partialScoringEnabled = partialScoring.enabled(config, env);
|
|
212
|
-
|
|
213
|
-
if (!partialScoringEnabled) {
|
|
214
|
-
return isResponseCorrect(config, session) ? 1 : 0;
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
let correctAnswers = 0;
|
|
218
|
-
let selectedChoices = 0;
|
|
219
|
-
const choices = [...rectangles, ...polygons, ...circles];
|
|
220
|
-
const correctChoices = choices.filter(choice => choice.correct);
|
|
221
|
-
choices.forEach(shape => {
|
|
222
|
-
const selected = answers && answers.filter(answer => answer.id === shape.id)[0];
|
|
223
|
-
const correctlySelected = shape.correct && selected;
|
|
224
|
-
|
|
225
|
-
if (selected) {
|
|
226
|
-
selectedChoices += 1;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
if (correctlySelected) {
|
|
230
|
-
correctAnswers += 1;
|
|
231
|
-
}
|
|
232
|
-
});
|
|
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);
|
|
236
|
-
return str < 0 ? 0 : parseFloat(str);
|
|
237
|
-
};
|
|
238
|
-
|
|
239
|
-
function outcome(config, session, env = {}) {
|
|
240
|
-
return new Promise(resolve => {
|
|
241
|
-
log('outcome...');
|
|
242
|
-
|
|
243
|
-
if (!session || isEmpty(session)) {
|
|
244
|
-
resolve({
|
|
245
|
-
score: 0,
|
|
246
|
-
empty: true
|
|
247
|
-
});
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
if (session.answers) {
|
|
251
|
-
const score = getScore(config, session, env);
|
|
252
|
-
resolve({
|
|
253
|
-
score
|
|
254
|
-
});
|
|
255
|
-
} else {
|
|
256
|
-
resolve({
|
|
257
|
-
score: 0,
|
|
258
|
-
empty: true
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
});
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
const returnShapesCorrect = shapes => {
|
|
265
|
-
let answers = [];
|
|
266
|
-
shapes.forEach(i => {
|
|
267
|
-
const {
|
|
268
|
-
correct,
|
|
269
|
-
id
|
|
270
|
-
} = i;
|
|
271
|
-
|
|
272
|
-
if (correct) {
|
|
273
|
-
answers.push({
|
|
274
|
-
id
|
|
275
|
-
});
|
|
276
|
-
}
|
|
277
|
-
});
|
|
278
|
-
return answers;
|
|
279
|
-
};
|
|
280
|
-
|
|
281
|
-
const createCorrectResponseSession = (question, env) => {
|
|
282
|
-
return new Promise(resolve => {
|
|
283
|
-
if (env.mode !== 'evaluate' && env.role === 'instructor') {
|
|
284
|
-
const {
|
|
285
|
-
shapes: {
|
|
286
|
-
rectangles = [],
|
|
287
|
-
circles = [],
|
|
288
|
-
polygons = {}
|
|
289
|
-
} = {}
|
|
290
|
-
} = question;
|
|
291
|
-
const rectangleCorrect = returnShapesCorrect(rectangles);
|
|
292
|
-
const polygonsCorrect = returnShapesCorrect(polygons);
|
|
293
|
-
const circlesCorrect = returnShapesCorrect(circles);
|
|
294
|
-
resolve({
|
|
295
|
-
answers: [...rectangleCorrect, ...polygonsCorrect, ...circlesCorrect],
|
|
296
|
-
id: '1'
|
|
297
|
-
});
|
|
298
|
-
} else {
|
|
299
|
-
resolve(null);
|
|
300
|
-
}
|
|
301
|
-
});
|
|
302
|
-
}; // remove all html tags
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
const getContent = html => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
|
|
306
|
-
|
|
307
|
-
const validate = (model = {}, config = {}) => {
|
|
308
|
-
const {
|
|
309
|
-
shapes
|
|
310
|
-
} = model;
|
|
311
|
-
const {
|
|
312
|
-
minShapes = 2,
|
|
313
|
-
maxShapes,
|
|
314
|
-
maxSelections
|
|
315
|
-
} = config;
|
|
316
|
-
const errors = {};
|
|
317
|
-
['teacherInstructions', 'prompt', 'rationale'].forEach(field => {
|
|
318
|
-
var _config$field;
|
|
319
|
-
|
|
320
|
-
if ((_config$field = config[field]) != null && _config$field.required && !getContent(model[field])) {
|
|
321
|
-
errors[field] = 'This field is required.';
|
|
322
|
-
}
|
|
323
|
-
});
|
|
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;
|
|
327
|
-
|
|
328
|
-
if (nbOfShapes < minShapes) {
|
|
329
|
-
errors.shapes = `There should be at least ${minShapes} shapes defined.`;
|
|
330
|
-
} else if (nbOfShapes > maxShapes) {
|
|
331
|
-
errors.shapes = `No more than ${maxShapes} shapes should be defined.`;
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
if (nbOfSelections < 1) {
|
|
335
|
-
errors.selections = 'There should be at least 1 shape selected.';
|
|
336
|
-
} else if (nbOfSelections > maxSelections) {
|
|
337
|
-
errors.selections = `No more than ${maxSelections} shapes should be selected.`;
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
return errors;
|
|
341
|
-
};
|
|
342
|
-
|
|
343
|
-
export { createCorrectResponseSession, createDefaultModel, model, normalize, outcome, validate };
|
|
344
|
-
//# sourceMappingURL=controller.js.map
|
package/esm/controller.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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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"}
|