@pie-element/hotspot 11.3.2-beta.8 → 11.3.2-beta.9

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.
Files changed (76) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/configure/CHANGELOG.md +4 -0
  3. package/configure/package.json +3 -3
  4. package/controller/CHANGELOG.md +4 -0
  5. package/controller/package.json +1 -1
  6. package/package.json +2 -2
  7. package/configure/lib/DeleteWidget.js +0 -64
  8. package/configure/lib/DeleteWidget.js.map +0 -1
  9. package/configure/lib/button.js +0 -42
  10. package/configure/lib/button.js.map +0 -1
  11. package/configure/lib/buttons/circle.js +0 -33
  12. package/configure/lib/buttons/circle.js.map +0 -1
  13. package/configure/lib/buttons/polygon.js +0 -39
  14. package/configure/lib/buttons/polygon.js.map +0 -1
  15. package/configure/lib/buttons/rectangle.js +0 -39
  16. package/configure/lib/buttons/rectangle.js.map +0 -1
  17. package/configure/lib/defaults.js +0 -155
  18. package/configure/lib/defaults.js.map +0 -1
  19. package/configure/lib/hotspot-circle.js +0 -192
  20. package/configure/lib/hotspot-circle.js.map +0 -1
  21. package/configure/lib/hotspot-container.js +0 -320
  22. package/configure/lib/hotspot-container.js.map +0 -1
  23. package/configure/lib/hotspot-drawable.js +0 -519
  24. package/configure/lib/hotspot-drawable.js.map +0 -1
  25. package/configure/lib/hotspot-palette.js +0 -107
  26. package/configure/lib/hotspot-palette.js.map +0 -1
  27. package/configure/lib/hotspot-polygon.js +0 -293
  28. package/configure/lib/hotspot-polygon.js.map +0 -1
  29. package/configure/lib/hotspot-rectangle.js +0 -190
  30. package/configure/lib/hotspot-rectangle.js.map +0 -1
  31. package/configure/lib/icons.js +0 -7
  32. package/configure/lib/icons.js.map +0 -1
  33. package/configure/lib/image-konva.js +0 -66
  34. package/configure/lib/image-konva.js.map +0 -1
  35. package/configure/lib/index.js +0 -198
  36. package/configure/lib/index.js.map +0 -1
  37. package/configure/lib/root.js +0 -331
  38. package/configure/lib/root.js.map +0 -1
  39. package/configure/lib/shapes/circle.js +0 -84
  40. package/configure/lib/shapes/circle.js.map +0 -1
  41. package/configure/lib/shapes/index.js +0 -50
  42. package/configure/lib/shapes/index.js.map +0 -1
  43. package/configure/lib/shapes/polygon.js +0 -82
  44. package/configure/lib/shapes/polygon.js.map +0 -1
  45. package/configure/lib/shapes/rectagle.js +0 -84
  46. package/configure/lib/shapes/rectagle.js.map +0 -1
  47. package/configure/lib/shapes/utils.js +0 -21
  48. package/configure/lib/shapes/utils.js.map +0 -1
  49. package/configure/lib/upload-control.js +0 -41
  50. package/configure/lib/upload-control.js.map +0 -1
  51. package/configure/lib/utils.js +0 -185
  52. package/configure/lib/utils.js.map +0 -1
  53. package/controller/lib/defaults.js +0 -33
  54. package/controller/lib/defaults.js.map +0 -1
  55. package/controller/lib/index.js +0 -342
  56. package/controller/lib/index.js.map +0 -1
  57. package/controller/lib/utils.js +0 -32
  58. package/controller/lib/utils.js.map +0 -1
  59. package/lib/hotspot/circle.js +0 -160
  60. package/lib/hotspot/circle.js.map +0 -1
  61. package/lib/hotspot/container.js +0 -291
  62. package/lib/hotspot/container.js.map +0 -1
  63. package/lib/hotspot/icons.js +0 -8
  64. package/lib/hotspot/icons.js.map +0 -1
  65. package/lib/hotspot/image-konva-tooltip.js +0 -86
  66. package/lib/hotspot/image-konva-tooltip.js.map +0 -1
  67. package/lib/hotspot/index.js +0 -174
  68. package/lib/hotspot/index.js.map +0 -1
  69. package/lib/hotspot/polygon.js +0 -207
  70. package/lib/hotspot/polygon.js.map +0 -1
  71. package/lib/hotspot/rectangle.js +0 -178
  72. package/lib/hotspot/rectangle.js.map +0 -1
  73. package/lib/index.js +0 -214
  74. package/lib/index.js.map +0 -1
  75. package/lib/session-updater.js +0 -42
  76. package/lib/session-updater.js.map +0 -1
@@ -1,342 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.getLogTrace = exports.createDefaultModel = exports.createCorrectResponseSession = void 0;
8
- exports.model = model;
9
- exports.normalize = void 0;
10
- exports.outcome = outcome;
11
- exports.validate = void 0;
12
- var _debug = _interopRequireDefault(require("debug"));
13
- var _lodashEs = require("lodash-es");
14
- var _controllerUtils = require("@pie-lib/controller-utils");
15
- var _utils = require("./utils");
16
- var _defaults = _interopRequireDefault(require("./defaults"));
17
- const log = (0, _debug.default)('pie-elements:hotspot:controller');
18
- const checkNullish = value => value !== null && value !== undefined;
19
- const normalize = question => ({
20
- ..._defaults.default,
21
- ...question
22
- });
23
- exports.normalize = normalize;
24
- function model(question, session, env) {
25
- const normalizedQuestion = normalize(question);
26
- const {
27
- imageUrl,
28
- dimensions,
29
- hotspotColor,
30
- hoverOutlineColor,
31
- selectedHotspotColor,
32
- multipleCorrect,
33
- outlineColor,
34
- partialScoring,
35
- prompt,
36
- shapes,
37
- language,
38
- fontSizeFactor,
39
- autoplayAudioEnabled,
40
- completeAudioEnabled,
41
- customAudioButton
42
- } = normalizedQuestion;
43
- const {
44
- rectangles,
45
- polygons,
46
- circles
47
- } = shapes || {};
48
- const shouldIncludeCorrectResponse = env.mode === 'evaluate' || env.role === 'instructor' && env.mode === 'view';
49
- return new Promise(resolve => {
50
- const out = {
51
- disabled: env.mode !== 'gather',
52
- mode: env.mode,
53
- dimensions,
54
- imageUrl,
55
- outlineColor,
56
- hotspotColor,
57
- hoverOutlineColor: checkNullish(hoverOutlineColor) ? hoverOutlineColor : 'black',
58
- selectedHotspotColor,
59
- multipleCorrect,
60
- partialScoring,
61
- language,
62
- fontSizeFactor,
63
- autoplayAudioEnabled,
64
- completeAudioEnabled,
65
- customAudioButton,
66
- shapes: {
67
- ...shapes,
68
- // eslint-disable-next-line no-unused-vars
69
- rectangles: (rectangles || []).map(({
70
- index,
71
- correct,
72
- ...rectProps
73
- }) => shouldIncludeCorrectResponse ? {
74
- correct,
75
- ...rectProps
76
- } : {
77
- ...rectProps
78
- }),
79
- // eslint-disable-next-line no-unused-vars
80
- polygons: (polygons || []).map(({
81
- index,
82
- correct,
83
- ...polyProps
84
- }) => shouldIncludeCorrectResponse ? {
85
- correct,
86
- ...polyProps
87
- } : {
88
- ...polyProps
89
- }),
90
- // eslint-disable-next-line no-unused-vars
91
- circles: (circles || []).map(({
92
- index,
93
- correct,
94
- ...circleProps
95
- }) => shouldIncludeCorrectResponse ? {
96
- correct,
97
- ...circleProps
98
- } : {
99
- ...circleProps
100
- })
101
- },
102
- responseCorrect: env.mode === 'evaluate' ? (0, _utils.isResponseCorrect)(normalizedQuestion, session) : undefined,
103
- extraCSSRules: normalizedQuestion.extraCSSRules
104
- };
105
- if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {
106
- out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;
107
- out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled ? normalizedQuestion.teacherInstructions : null;
108
- } else {
109
- out.rationale = null;
110
- out.teacherInstructions = null;
111
- }
112
- out.prompt = normalizedQuestion.promptEnabled ? prompt : null;
113
- out.strokeWidth = normalizedQuestion.strokeWidth;
114
- resolve(out);
115
- });
116
- }
117
- const createDefaultModel = (model = {}) => new Promise(resolve => {
118
- resolve({
119
- ..._defaults.default,
120
- ...model
121
- });
122
- });
123
- exports.createDefaultModel = createDefaultModel;
124
- const getScore = (config, session, env = {}) => {
125
- const {
126
- answers
127
- } = session || {};
128
- if (!config.shapes || !config.shapes.rectangles && !config.shapes.polygons && !config.shapes.circles) {
129
- return 0;
130
- }
131
- const {
132
- shapes: {
133
- rectangles = [],
134
- polygons = [],
135
- circles = []
136
- } = {}
137
- } = config;
138
- const partialScoringEnabled = _controllerUtils.partialScoring.enabled(config, env);
139
- if (!partialScoringEnabled) {
140
- return (0, _utils.isResponseCorrect)(config, session) ? 1 : 0;
141
- }
142
- let correctAnswers = 0;
143
- let selectedChoices = 0;
144
- const choices = [...rectangles, ...polygons, ...circles];
145
- const correctChoices = choices.filter(choice => choice.correct);
146
- choices.forEach(shape => {
147
- const selected = answers && answers.filter(answer => answer.id === shape.id)[0];
148
- const correctlySelected = shape.correct && selected;
149
- if (selected) {
150
- selectedChoices += 1;
151
- }
152
- if (correctlySelected) {
153
- correctAnswers += 1;
154
- }
155
- });
156
- const extraAnswers = selectedChoices > correctChoices.length ? selectedChoices - correctChoices.length : 0;
157
- const total = correctChoices.length === 0 ? 1 : correctChoices.length;
158
- const str = ((correctAnswers - extraAnswers) / total).toFixed(2);
159
- return str < 0 ? 0 : parseFloat(str);
160
- };
161
-
162
- /**
163
- * Generates detailed trace log for scoring evaluation
164
- * @param {Object} model - the question model
165
- * @param {Object} session - the student session
166
- * @param {Object} env - the environment
167
- * @returns {Array} traceLog - array of trace messages
168
- */
169
- const getLogTrace = (model, session, env) => {
170
- const traceLog = [];
171
- const {
172
- answers
173
- } = session || {};
174
- const {
175
- shapes
176
- } = model || {};
177
- const allShapes = [];
178
- if (shapes) {
179
- if (shapes.rectangles) allShapes.push(...shapes.rectangles);
180
- if (shapes.polygons) allShapes.push(...shapes.polygons);
181
- if (shapes.circles) allShapes.push(...shapes.circles);
182
- }
183
- const correctShapes = allShapes.filter(shape => shape.correct);
184
- const totalShapes = allShapes.length;
185
- traceLog.push(`Total of ${totalShapes} hotspot(s) defined, ${correctShapes.length} correct.`);
186
- if (answers && answers.length > 0) {
187
- traceLog.push(`Student selected ${answers.length} hotspot(s).`);
188
- let correctSelections = 0;
189
- let incorrectSelections = 0;
190
- answers.forEach(answer => {
191
- const shape = allShapes.find(s => s.id === answer.id);
192
- if (shape && shape.correct) {
193
- correctSelections++;
194
- } else {
195
- incorrectSelections++;
196
- }
197
- });
198
- const missedCorrect = correctShapes.filter(correctShape => !answers.some(answer => answer.id === correctShape.id)).length;
199
- if (correctSelections > 0) {
200
- traceLog.push(`${correctSelections} correct hotspot(s) selected.`);
201
- }
202
- if (incorrectSelections > 0) {
203
- traceLog.push(`${incorrectSelections} incorrect hotspot(s) selected.`);
204
- }
205
- if (missedCorrect > 0) {
206
- traceLog.push(`${missedCorrect} correct hotspot(s) missed.`);
207
- }
208
- } else {
209
- traceLog.push('No hotspots selected.');
210
- }
211
- const partialScoringEnabled = _controllerUtils.partialScoring.enabled(model, env);
212
- if (partialScoringEnabled) {
213
- traceLog.push(`Score calculated using partial scoring.`);
214
- if (answers && answers.length > 0) {
215
- let correctSelections = 0;
216
- let incorrectSelections = 0;
217
- answers.forEach(answer => {
218
- const shape = allShapes.find(s => s.id === answer.id);
219
- if (shape && shape.correct) {
220
- correctSelections++;
221
- } else {
222
- incorrectSelections++;
223
- }
224
- });
225
- const totalCorrectAvailable = correctShapes.length;
226
- traceLog.push(`Partial scoring calculation: ${correctSelections} correct selections out of ${totalCorrectAvailable} available.`);
227
- if (incorrectSelections > totalCorrectAvailable) {
228
- const extraSelections = incorrectSelections - (totalCorrectAvailable - correctSelections);
229
- traceLog.push(`${extraSelections} extra incorrect selection(s) beyond required amount are deducted from score.`);
230
- }
231
- }
232
- } else {
233
- traceLog.push(`Score calculated using all-or-nothing scoring.`);
234
- }
235
- const score = getScore(model, session, env);
236
- traceLog.push(`Score: ${score}.`);
237
- return traceLog;
238
- };
239
- exports.getLogTrace = getLogTrace;
240
- function outcome(config, session, env = {}) {
241
- return new Promise(resolve => {
242
- log('outcome...');
243
- if (!session || (0, _lodashEs.isEmpty)(session)) {
244
- resolve({
245
- score: 0,
246
- empty: true,
247
- traceLog: ['No hotspots selected. Score: 0.']
248
- });
249
- }
250
- if (session.answers) {
251
- const traceLog = getLogTrace(config, session, env);
252
- const score = getScore(config, session, env);
253
- resolve({
254
- score,
255
- empty: false,
256
- traceLog
257
- });
258
- } else {
259
- resolve({
260
- score: 0,
261
- empty: true,
262
- traceLog: ['No hotspots selected. Score: 0.']
263
- });
264
- }
265
- });
266
- }
267
- const returnShapesCorrect = shapes => {
268
- let answers = [];
269
- shapes.forEach(i => {
270
- const {
271
- correct,
272
- id
273
- } = i;
274
- if (correct) {
275
- answers.push({
276
- id
277
- });
278
- }
279
- });
280
- return answers;
281
- };
282
- const createCorrectResponseSession = (question, env) => {
283
- return new Promise(resolve => {
284
- if (env.mode !== 'evaluate' && env.role === 'instructor') {
285
- const {
286
- shapes: {
287
- rectangles = [],
288
- circles = [],
289
- polygons = {}
290
- } = {}
291
- } = question;
292
- const rectangleCorrect = returnShapesCorrect(rectangles);
293
- const polygonsCorrect = returnShapesCorrect(polygons);
294
- const circlesCorrect = returnShapesCorrect(circles);
295
- resolve({
296
- answers: [...rectangleCorrect, ...polygonsCorrect, ...circlesCorrect],
297
- id: '1'
298
- });
299
- } else {
300
- resolve(null);
301
- }
302
- });
303
- };
304
-
305
- // remove all html tags
306
- exports.createCorrectResponseSession = createCorrectResponseSession;
307
- const getInnerText = html => (html || '').replaceAll(/<[^>]*>/g, '');
308
-
309
- // remove all html tags except img, iframe and source tag for audio
310
- const getContent = html => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
311
- const validate = (model = {}, config = {}) => {
312
- const {
313
- shapes
314
- } = model;
315
- const {
316
- minShapes = 2,
317
- maxShapes,
318
- maxSelections
319
- } = config;
320
- const errors = {};
321
- ['teacherInstructions', 'prompt', 'rationale'].forEach(field => {
322
- if (config[field]?.required && !getContent(model[field])) {
323
- errors[field] = 'This field is required.';
324
- }
325
- });
326
- const allShapes = Object.values(shapes || {}).reduce((acc, shape) => [...acc, ...shape], []);
327
- const nbOfSelections = (allShapes || []).reduce((acc, shape) => shape.correct ? acc + 1 : acc, 0);
328
- const nbOfShapes = (allShapes || []).length;
329
- if (nbOfShapes < minShapes) {
330
- errors.shapes = `There should be at least ${minShapes} shapes defined.`;
331
- } else if (nbOfShapes > maxShapes) {
332
- errors.shapes = `No more than ${maxShapes} shapes should be defined.`;
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
- return errors;
340
- };
341
- exports.validate = validate;
342
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","names":["_debug","_interopRequireDefault","require","_lodashEs","_controllerUtils","_utils","_defaults","log","debug","checkNullish","value","undefined","normalize","question","defaults","exports","model","session","env","normalizedQuestion","imageUrl","dimensions","hotspotColor","hoverOutlineColor","selectedHotspotColor","multipleCorrect","outlineColor","partialScoring","prompt","shapes","language","fontSizeFactor","autoplayAudioEnabled","completeAudioEnabled","customAudioButton","rectangles","polygons","circles","shouldIncludeCorrectResponse","mode","role","Promise","resolve","out","disabled","map","index","correct","rectProps","polyProps","circleProps","responseCorrect","isResponseCorrect","extraCSSRules","rationale","rationaleEnabled","teacherInstructions","teacherInstructionsEnabled","promptEnabled","strokeWidth","createDefaultModel","getScore","config","answers","partialScoringEnabled","enabled","correctAnswers","selectedChoices","choices","correctChoices","filter","choice","forEach","shape","selected","answer","id","correctlySelected","extraAnswers","length","total","str","toFixed","parseFloat","getLogTrace","traceLog","allShapes","push","correctShapes","totalShapes","correctSelections","incorrectSelections","find","s","missedCorrect","correctShape","some","totalCorrectAvailable","extraSelections","score","outcome","isEmpty","empty","returnShapesCorrect","i","createCorrectResponseSession","rectangleCorrect","polygonsCorrect","circlesCorrect","getInnerText","html","replaceAll","getContent","replace","validate","minShapes","maxShapes","maxSelections","errors","field","required","Object","values","reduce","acc","nbOfSelections","nbOfShapes","selections"],"sources":["../src/index.js"],"sourcesContent":["import debug from 'debug';\nimport { isEmpty } from 'lodash-es';\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\nconst checkNullish = (value) => value !== null && value !== undefined;\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: checkNullish(hoverOutlineColor) ? hoverOutlineColor : 'black',\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\n /**\n * Generates detailed trace log for scoring evaluation\n * @param {Object} model - the question model\n * @param {Object} session - the student session\n * @param {Object} env - the environment\n * @returns {Array} traceLog - array of trace messages\n */\nexport const getLogTrace = (model, session, env) => {\n const traceLog = [];\n const { answers } = session || {};\n const { shapes } = model || {};\n\n const allShapes = [];\n if (shapes) {\n if (shapes.rectangles) allShapes.push(...shapes.rectangles);\n if (shapes.polygons) allShapes.push(...shapes.polygons);\n if (shapes.circles) allShapes.push(...shapes.circles);\n }\n\n const correctShapes = allShapes.filter(shape => shape.correct);\n const totalShapes = allShapes.length;\n\n traceLog.push(`Total of ${totalShapes} hotspot(s) defined, ${correctShapes.length} correct.`);\n\n if (answers && answers.length > 0) {\n traceLog.push(`Student selected ${answers.length} hotspot(s).`);\n\n let correctSelections = 0;\n let incorrectSelections = 0;\n\n answers.forEach(answer => {\n const shape = allShapes.find(s => s.id === answer.id);\n if (shape && shape.correct) {\n correctSelections++;\n } else {\n incorrectSelections++;\n }\n });\n\n const missedCorrect = correctShapes.filter(correctShape =>\n !answers.some(answer => answer.id === correctShape.id)\n ).length;\n\n if (correctSelections > 0) {\n traceLog.push(`${correctSelections} correct hotspot(s) selected.`);\n }\n if (incorrectSelections > 0) {\n traceLog.push(`${incorrectSelections} incorrect hotspot(s) selected.`);\n }\n if (missedCorrect > 0) {\n traceLog.push(`${missedCorrect} correct hotspot(s) missed.`);\n }\n } else {\n traceLog.push('No hotspots selected.');\n }\n\n const partialScoringEnabled = partialScoring.enabled(model, env);\n\n if (partialScoringEnabled) {\n traceLog.push(`Score calculated using partial scoring.`);\n\n if (answers && answers.length > 0) {\n let correctSelections = 0;\n let incorrectSelections = 0;\n\n answers.forEach(answer => {\n const shape = allShapes.find(s => s.id === answer.id);\n if (shape && shape.correct) {\n correctSelections++;\n } else {\n incorrectSelections++;\n }\n });\n\n const totalCorrectAvailable = correctShapes.length;\n traceLog.push(`Partial scoring calculation: ${correctSelections} correct selections out of ${totalCorrectAvailable} available.`);\n\n if (incorrectSelections > totalCorrectAvailable) {\n const extraSelections = incorrectSelections - (totalCorrectAvailable - correctSelections);\n traceLog.push(`${extraSelections} extra incorrect selection(s) beyond required amount are deducted from score.`);\n }\n }\n } else {\n traceLog.push(`Score calculated using all-or-nothing scoring.`);\n }\n\n const score = getScore(model, session, env);\n traceLog.push(`Score: ${score}.`);\n\n return traceLog;\n}\n\nexport function outcome(config, session, env = {}) {\n return new Promise((resolve) => {\n log('outcome...');\n\n if (!session || isEmpty(session)) {\n resolve({\n score: 0,\n empty: true,\n traceLog: ['No hotspots selected. Score: 0.']\n });\n }\n\n if (session.answers) {\n const traceLog = getLogTrace(config, session, env);\n const score = getScore(config, session, env);\n\n resolve({ score, empty: false, traceLog });\n } else {\n resolve({\n score: 0,\n empty: true,\n traceLog: ['No hotspots selected. Score: 0.']\n });\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"],"mappings":"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","ignoreList":[]}
@@ -1,32 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.isResponseCorrect = exports.getCorrectResponse = void 0;
7
- var _lodashEs = require("lodash-es");
8
- const getCorrectResponse = choices => choices.filter(c => c.correct).map(c => c.id).sort();
9
- exports.getCorrectResponse = getCorrectResponse;
10
- const isResponseCorrect = (question, session) => {
11
- const {
12
- shapes: {
13
- rectangles = [],
14
- polygons = [],
15
- circles = []
16
- }
17
- } = question;
18
- const choices = [...rectangles, ...polygons, ...circles];
19
- let correctResponseIds = getCorrectResponse(choices);
20
- if (!session || (0, _lodashEs.isEmpty)(session)) {
21
- return false;
22
- }
23
- if (session.answers && session.answers.length) {
24
- let answerIds = (session.answers || []).map(a => a.id);
25
- return (0, _lodashEs.isEqual)(answerIds.sort(), correctResponseIds);
26
- } else if (!(correctResponseIds && correctResponseIds.length)) {
27
- return true;
28
- }
29
- return false;
30
- };
31
- exports.isResponseCorrect = isResponseCorrect;
32
- //# sourceMappingURL=utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","names":["_lodashEs","require","getCorrectResponse","choices","filter","c","correct","map","id","sort","exports","isResponseCorrect","question","session","shapes","rectangles","polygons","circles","correctResponseIds","isEmpty","answers","length","answerIds","a","isEqual"],"sources":["../src/utils.js"],"sourcesContent":["import { isEmpty, isEqual } from 'lodash-es';\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"],"mappings":";;;;;;AAAA,IAAAA,SAAA,GAAAC,OAAA;AAEO,MAAMC,kBAAkB,GAAIC,OAAO,IACxCA,OAAO,CACJC,MAAM,CAAEC,CAAC,IAAKA,CAAC,CAACC,OAAO,CAAC,CACxBC,GAAG,CAAEF,CAAC,IAAKA,CAAC,CAACG,EAAE,CAAC,CAChBC,IAAI,CAAC,CAAC;AAACC,OAAA,CAAAR,kBAAA,GAAAA,kBAAA;AAEL,MAAMS,iBAAiB,GAAGA,CAACC,QAAQ,EAAEC,OAAO,KAAK;EACtD,MAAM;IACJC,MAAM,EAAE;MAAEC,UAAU,GAAG,EAAE;MAAEC,QAAQ,GAAG,EAAE;MAAEC,OAAO,GAAG;IAAG;EACzD,CAAC,GAAGL,QAAQ;EACZ,MAAMT,OAAO,GAAG,CAAC,GAAGY,UAAU,EAAE,GAAGC,QAAQ,EAAE,GAAGC,OAAO,CAAC;EACxD,IAAIC,kBAAkB,GAAGhB,kBAAkB,CAACC,OAAO,CAAC;EAEpD,IAAI,CAACU,OAAO,IAAI,IAAAM,iBAAO,EAACN,OAAO,CAAC,EAAE;IAChC,OAAO,KAAK;EACd;EAEA,IAAIA,OAAO,CAACO,OAAO,IAAIP,OAAO,CAACO,OAAO,CAACC,MAAM,EAAE;IAC7C,IAAIC,SAAS,GAAG,CAACT,OAAO,CAACO,OAAO,IAAI,EAAE,EAAEb,GAAG,CAAEgB,CAAC,IAAKA,CAAC,CAACf,EAAE,CAAC;IAExD,OAAO,IAAAgB,iBAAO,EAACF,SAAS,CAACb,IAAI,CAAC,CAAC,EAAES,kBAAkB,CAAC;EACtD,CAAC,MAAM,IAAI,EAAEA,kBAAkB,IAAIA,kBAAkB,CAACG,MAAM,CAAC,EAAE;IAC7D,OAAO,IAAI;EACb;EAEA,OAAO,KAAK;AACd,CAAC;AAACX,OAAA,CAAAC,iBAAA,GAAAA,iBAAA","ignoreList":[]}
@@ -1,160 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.default = void 0;
8
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
- var _react = _interopRequireDefault(require("react"));
10
- var _propTypes = _interopRequireDefault(require("prop-types"));
11
- var _reactKonva = require("react-konva");
12
- var _imageKonvaTooltip = _interopRequireDefault(require("./image-konva-tooltip"));
13
- var _icons = require("./icons");
14
- class CircleComponent extends _react.default.Component {
15
- constructor(props) {
16
- super(props);
17
- (0, _defineProperty2.default)(this, "handleClick", e => {
18
- const {
19
- onClick,
20
- id,
21
- selected,
22
- disabled
23
- } = this.props;
24
- if (!disabled) {
25
- e.cancelBubble = true;
26
- onClick({
27
- id,
28
- selected: !selected,
29
- selector: 'Mouse'
30
- });
31
- }
32
- });
33
- (0, _defineProperty2.default)(this, "handleMouseEnter", () => {
34
- const {
35
- disabled
36
- } = this.props;
37
- if (!disabled) {
38
- document.body.style.cursor = 'pointer';
39
- }
40
- this.setState({
41
- hovered: true
42
- });
43
- });
44
- (0, _defineProperty2.default)(this, "handleMouseLeave", () => {
45
- document.body.style.cursor = 'default';
46
- this.setState({
47
- hovered: false
48
- });
49
- });
50
- (0, _defineProperty2.default)(this, "getEvaluateOutlineColor", (isCorrect, markAsCorrect, outlineColor) => markAsCorrect ? 'green' : isCorrect ? outlineColor : 'red');
51
- (0, _defineProperty2.default)(this, "getOutlineWidth", (showCorrectEnabled, selected, markAsCorrect, strokeWidth) => markAsCorrect || !markAsCorrect && !showCorrectEnabled && selected ? strokeWidth : 0);
52
- this.state = {
53
- hovered: false
54
- };
55
- }
56
- render() {
57
- const {
58
- radius,
59
- hotspotColor,
60
- isCorrect,
61
- isEvaluateMode,
62
- hoverOutlineColor,
63
- outlineColor,
64
- selected,
65
- focused,
66
- x,
67
- y,
68
- evaluateText,
69
- strokeWidth,
70
- scale,
71
- markAsCorrect,
72
- selectedHotspotColor,
73
- showCorrectEnabled
74
- } = this.props;
75
- const {
76
- hovered
77
- } = this.state;
78
- const outlineColorParsed = isEvaluateMode ? this.getEvaluateOutlineColor(isCorrect, markAsCorrect, outlineColor) : outlineColor;
79
- const outlineWidth = this.getOutlineWidth(showCorrectEnabled, selected, markAsCorrect, strokeWidth);
80
- const iconX = x - 10;
81
- const iconY = y - 10; // Adjust position for the icon
82
-
83
- let iconSrc;
84
- if (showCorrectEnabled) {
85
- if (selected && isCorrect || !selected && !isCorrect) {
86
- iconSrc = _icons.faCorrect;
87
- }
88
- } else {
89
- if (selected) {
90
- if (isCorrect) {
91
- iconSrc = _icons.faCorrect;
92
- } else {
93
- iconSrc = _icons.faWrong;
94
- }
95
- } else if (!isCorrect) {
96
- iconSrc = _icons.faWrong;
97
- }
98
- }
99
- const useHoveredStyle = (hovered || focused) && hoverOutlineColor;
100
- return /*#__PURE__*/_react.default.createElement(_reactKonva.Group, {
101
- scaleX: scale,
102
- scaleY: scale,
103
- onMouseLeave: this.handleMouseLeave,
104
- onMouseEnter: this.handleMouseEnter
105
- }, /*#__PURE__*/_react.default.createElement(_reactKonva.Circle, {
106
- radius: radius,
107
- fill: selected && selectedHotspotColor ? selectedHotspotColor : hotspotColor,
108
- onClick: this.handleClick,
109
- onTap: this.handleClick,
110
- draggable: false,
111
- stroke: useHoveredStyle && !selected ? 'transparent' : outlineColorParsed,
112
- strokeWidth: useHoveredStyle && !selected ? 0 : outlineWidth,
113
- x: x,
114
- y: y
115
- }), useHoveredStyle && /*#__PURE__*/_react.default.createElement(_reactKonva.Rect, {
116
- x: x - radius,
117
- y: y - radius,
118
- width: radius * 2,
119
- height: radius * 2,
120
- stroke: hoverOutlineColor,
121
- strokeWidth: strokeWidth,
122
- listening: false
123
- }), isEvaluateMode && iconSrc ? /*#__PURE__*/_react.default.createElement(_imageKonvaTooltip.default, {
124
- src: iconSrc,
125
- x: iconX,
126
- y: iconY,
127
- tooltip: evaluateText
128
- }) : null);
129
- }
130
- }
131
- CircleComponent.propTypes = {
132
- radius: _propTypes.default.number.isRequired,
133
- hotspotColor: _propTypes.default.string.isRequired,
134
- id: _propTypes.default.string.isRequired,
135
- isCorrect: _propTypes.default.oneOfType([_propTypes.default.bool, _propTypes.default.string]),
136
- isEvaluateMode: _propTypes.default.bool.isRequired,
137
- disabled: _propTypes.default.bool.isRequired,
138
- focused: _propTypes.default.bool,
139
- hoverOutlineColor: _propTypes.default.string,
140
- onClick: _propTypes.default.func.isRequired,
141
- outlineColor: _propTypes.default.string.isRequired,
142
- selected: _propTypes.default.bool.isRequired,
143
- x: _propTypes.default.number.isRequired,
144
- y: _propTypes.default.number.isRequired,
145
- evaluateText: _propTypes.default.string,
146
- strokeWidth: _propTypes.default.number,
147
- scale: _propTypes.default.number,
148
- selectedHotspotColor: _propTypes.default.string,
149
- markAsCorrect: _propTypes.default.bool.isRequired,
150
- showCorrectEnabled: _propTypes.default.bool.isRequired
151
- };
152
- CircleComponent.defaultProps = {
153
- isCorrect: false,
154
- evaluateText: null,
155
- focused: false,
156
- strokeWidth: 5,
157
- scale: 1
158
- };
159
- var _default = exports.default = CircleComponent;
160
- //# sourceMappingURL=circle.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"circle.js","names":["_react","_interopRequireDefault","require","_propTypes","_reactKonva","_imageKonvaTooltip","_icons","CircleComponent","React","Component","constructor","props","_defineProperty2","default","e","onClick","id","selected","disabled","cancelBubble","selector","document","body","style","cursor","setState","hovered","isCorrect","markAsCorrect","outlineColor","showCorrectEnabled","strokeWidth","state","render","radius","hotspotColor","isEvaluateMode","hoverOutlineColor","focused","x","y","evaluateText","scale","selectedHotspotColor","outlineColorParsed","getEvaluateOutlineColor","outlineWidth","getOutlineWidth","iconX","iconY","iconSrc","faCorrect","faWrong","useHoveredStyle","createElement","Group","scaleX","scaleY","onMouseLeave","handleMouseLeave","onMouseEnter","handleMouseEnter","Circle","fill","handleClick","onTap","draggable","stroke","Rect","width","height","listening","src","tooltip","propTypes","PropTypes","number","isRequired","string","oneOfType","bool","func","defaultProps","_default","exports"],"sources":["../../src/hotspot/circle.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Circle, Group, Rect } from 'react-konva';\nimport ImageComponent from './image-konva-tooltip';\nimport { faCorrect, faWrong } from './icons';\n\nclass CircleComponent extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n hovered: false,\n };\n }\n\n handleClick = (e) => {\n const { onClick, id, selected, disabled } = this.props;\n\n if (!disabled) {\n e.cancelBubble = true;\n onClick({ id, selected: !selected, selector: 'Mouse' });\n }\n };\n\n handleMouseEnter = () => {\n const { disabled } = this.props;\n\n if (!disabled) {\n document.body.style.cursor = 'pointer';\n }\n this.setState({ hovered: true });\n };\n\n handleMouseLeave = () => {\n document.body.style.cursor = 'default';\n this.setState({ hovered: false });\n };\n\n getEvaluateOutlineColor = (isCorrect, markAsCorrect, outlineColor) =>\n markAsCorrect ? 'green' : isCorrect ? outlineColor : 'red';\n\n getOutlineWidth = (showCorrectEnabled, selected, markAsCorrect, strokeWidth) =>\n markAsCorrect || (!markAsCorrect && !showCorrectEnabled && selected) ? strokeWidth : 0;\n\n render() {\n const {\n radius,\n hotspotColor,\n isCorrect,\n isEvaluateMode,\n hoverOutlineColor,\n outlineColor,\n selected,\n focused,\n x,\n y,\n evaluateText,\n strokeWidth,\n scale,\n markAsCorrect,\n selectedHotspotColor,\n showCorrectEnabled,\n } = this.props;\n\n const { hovered } = this.state;\n\n const outlineColorParsed = isEvaluateMode\n ? this.getEvaluateOutlineColor(isCorrect, markAsCorrect, outlineColor)\n : outlineColor;\n\n const outlineWidth = this.getOutlineWidth(showCorrectEnabled, selected, markAsCorrect, strokeWidth);\n\n const iconX = x - 10;\n const iconY = y - 10; // Adjust position for the icon\n\n let iconSrc;\n if (showCorrectEnabled) {\n if ((selected && isCorrect) || (!selected && !isCorrect)) {\n iconSrc = faCorrect;\n }\n } else {\n if (selected) {\n if (isCorrect) {\n iconSrc = faCorrect;\n } else {\n iconSrc = faWrong;\n }\n } else if (!isCorrect) {\n iconSrc = faWrong;\n }\n }\n\n const useHoveredStyle = (hovered || focused) && hoverOutlineColor;\n\n return (\n <Group scaleX={scale} scaleY={scale} onMouseLeave={this.handleMouseLeave} onMouseEnter={this.handleMouseEnter}>\n <Circle\n radius={radius}\n fill={selected && selectedHotspotColor ? selectedHotspotColor : hotspotColor}\n onClick={this.handleClick}\n onTap={this.handleClick}\n draggable={false}\n stroke={useHoveredStyle && !selected ? 'transparent' : outlineColorParsed}\n strokeWidth={useHoveredStyle && !selected ? 0 : outlineWidth}\n x={x}\n y={y}\n />\n {useHoveredStyle && (\n <Rect\n x={x - radius}\n y={y - radius}\n width={radius * 2}\n height={radius * 2}\n stroke={hoverOutlineColor}\n strokeWidth={strokeWidth}\n listening={false}\n />\n )}\n {isEvaluateMode && iconSrc ? <ImageComponent src={iconSrc} x={iconX} y={iconY} tooltip={evaluateText} /> : null}\n </Group>\n );\n }\n}\n\nCircleComponent.propTypes = {\n radius: PropTypes.number.isRequired,\n hotspotColor: PropTypes.string.isRequired,\n id: PropTypes.string.isRequired,\n isCorrect: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]),\n isEvaluateMode: PropTypes.bool.isRequired,\n disabled: PropTypes.bool.isRequired,\n focused: PropTypes.bool,\n hoverOutlineColor: PropTypes.string,\n onClick: PropTypes.func.isRequired,\n outlineColor: PropTypes.string.isRequired,\n selected: PropTypes.bool.isRequired,\n x: PropTypes.number.isRequired,\n y: PropTypes.number.isRequired,\n evaluateText: PropTypes.string,\n strokeWidth: PropTypes.number,\n scale: PropTypes.number,\n selectedHotspotColor: PropTypes.string,\n markAsCorrect: PropTypes.bool.isRequired,\n showCorrectEnabled: PropTypes.bool.isRequired,\n};\n\nCircleComponent.defaultProps = {\n isCorrect: false,\n evaluateText: null,\n focused: false,\n strokeWidth: 5,\n scale: 1,\n};\n\nexport default CircleComponent;\n"],"mappings":"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","ignoreList":[]}