@pie-element/hotspot 9.0.2-esm.0 → 9.2.0-mui-update.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.
Files changed (125) hide show
  1. package/CHANGELOG.md +74 -0
  2. package/configure/CHANGELOG.md +74 -0
  3. package/configure/lib/DeleteWidget.js +31 -44
  4. package/configure/lib/DeleteWidget.js.map +1 -1
  5. package/configure/lib/__tests__/DeleteWidget.test.js +60 -0
  6. package/configure/lib/__tests__/hotspot-container.test.js +377 -0
  7. package/configure/lib/__tests__/hotspot-drawable.test.js +233 -0
  8. package/configure/lib/__tests__/index.test.js +211 -0
  9. package/configure/lib/__tests__/root.test.js +440 -0
  10. package/configure/lib/__tests__/utils.test.js +287 -0
  11. package/configure/lib/button.js +27 -46
  12. package/configure/lib/button.js.map +1 -1
  13. package/configure/lib/buttons/circle.js +21 -28
  14. package/configure/lib/buttons/circle.js.map +1 -1
  15. package/configure/lib/buttons/polygon.js +27 -34
  16. package/configure/lib/buttons/polygon.js.map +1 -1
  17. package/configure/lib/buttons/rectangle.js +27 -34
  18. package/configure/lib/buttons/rectangle.js.map +1 -1
  19. package/configure/lib/defaults.js +3 -4
  20. package/configure/lib/defaults.js.map +1 -1
  21. package/configure/lib/hotspot-circle.js +133 -199
  22. package/configure/lib/hotspot-circle.js.map +1 -1
  23. package/configure/lib/hotspot-container.js +251 -356
  24. package/configure/lib/hotspot-container.js.map +1 -1
  25. package/configure/lib/hotspot-drawable.js +361 -473
  26. package/configure/lib/hotspot-drawable.js.map +1 -1
  27. package/configure/lib/hotspot-palette.js +93 -140
  28. package/configure/lib/hotspot-palette.js.map +1 -1
  29. package/configure/lib/hotspot-polygon.js +213 -318
  30. package/configure/lib/hotspot-polygon.js.map +1 -1
  31. package/configure/lib/hotspot-rectangle.js +129 -193
  32. package/configure/lib/hotspot-rectangle.js.map +1 -1
  33. package/configure/lib/icons.js +4 -8
  34. package/configure/lib/icons.js.map +1 -1
  35. package/configure/lib/image-konva.js +47 -87
  36. package/configure/lib/image-konva.js.map +1 -1
  37. package/configure/lib/index.js +163 -223
  38. package/configure/lib/index.js.map +1 -1
  39. package/configure/lib/root.js +302 -394
  40. package/configure/lib/root.js.map +1 -1
  41. package/configure/lib/shapes/circle.js +70 -102
  42. package/configure/lib/shapes/circle.js.map +1 -1
  43. package/configure/lib/shapes/index.js +5 -13
  44. package/configure/lib/shapes/index.js.map +1 -1
  45. package/configure/lib/shapes/polygon.js +65 -97
  46. package/configure/lib/shapes/polygon.js.map +1 -1
  47. package/configure/lib/shapes/rectagle.js +70 -102
  48. package/configure/lib/shapes/rectagle.js.map +1 -1
  49. package/configure/lib/shapes/utils.js +3 -9
  50. package/configure/lib/shapes/utils.js.map +1 -1
  51. package/configure/lib/upload-control.js +26 -53
  52. package/configure/lib/upload-control.js.map +1 -1
  53. package/configure/lib/utils.js +85 -138
  54. package/configure/lib/utils.js.map +1 -1
  55. package/configure/package.json +11 -10
  56. package/configure/src/__tests__/index.test.js +11 -5
  57. package/configure/src/button.jsx +12 -20
  58. package/configure/src/hotspot-circle.jsx +5 -18
  59. package/configure/src/hotspot-container.jsx +82 -98
  60. package/configure/src/hotspot-drawable.jsx +43 -45
  61. package/configure/src/hotspot-palette.jsx +45 -37
  62. package/configure/src/hotspot-polygon.jsx +4 -20
  63. package/configure/src/hotspot-rectangle.jsx +4 -17
  64. package/configure/src/icons.js +4 -2
  65. package/configure/src/index.js +12 -2
  66. package/configure/src/root.jsx +85 -79
  67. package/configure/src/upload-control.jsx +6 -16
  68. package/controller/CHANGELOG.md +60 -0
  69. package/controller/lib/__tests__/index.test.js +586 -0
  70. package/controller/lib/__tests__/utils.test.js +8 -0
  71. package/controller/lib/defaults.js +3 -4
  72. package/controller/lib/defaults.js.map +1 -1
  73. package/controller/lib/index.js +152 -206
  74. package/controller/lib/index.js.map +1 -1
  75. package/controller/lib/utils.js +15 -35
  76. package/controller/lib/utils.js.map +1 -1
  77. package/controller/package.json +2 -2
  78. package/docs/demo/pie.manifest.json +11 -0
  79. package/lib/__tests__/container.test.js +221 -0
  80. package/lib/__tests__/index.test.js +113 -0
  81. package/lib/__tests__/polygon.test.js +245 -0
  82. package/lib/__tests__/rectangle.test.js +236 -0
  83. package/lib/__tests__/session-updater.test.js +69 -0
  84. package/lib/hotspot/circle.js +111 -170
  85. package/lib/hotspot/circle.js.map +1 -1
  86. package/lib/hotspot/container.js +175 -261
  87. package/lib/hotspot/container.js.map +1 -1
  88. package/lib/hotspot/icons.js +5 -10
  89. package/lib/hotspot/icons.js.map +1 -1
  90. package/lib/hotspot/image-konva-tooltip.js +66 -113
  91. package/lib/hotspot/image-konva-tooltip.js.map +1 -1
  92. package/lib/hotspot/index.js +136 -199
  93. package/lib/hotspot/index.js.map +1 -1
  94. package/lib/hotspot/polygon.js +151 -215
  95. package/lib/hotspot/polygon.js.map +1 -1
  96. package/lib/hotspot/rectangle.js +130 -186
  97. package/lib/hotspot/rectangle.js.map +1 -1
  98. package/lib/index.js +188 -257
  99. package/lib/index.js.map +1 -1
  100. package/lib/session-updater.js +13 -19
  101. package/lib/session-updater.js.map +1 -1
  102. package/package.json +15 -29
  103. package/src/hotspot/circle.jsx +2 -13
  104. package/src/hotspot/container.jsx +35 -50
  105. package/src/hotspot/icons.js +6 -5
  106. package/src/hotspot/index.jsx +16 -28
  107. package/src/hotspot/polygon.jsx +4 -13
  108. package/src/hotspot/rectangle.jsx +4 -13
  109. package/src/index.js +21 -12
  110. package/LICENSE.md +0 -5
  111. package/configure/node_modules/debug/CHANGELOG.md +0 -395
  112. package/configure/node_modules/debug/LICENSE +0 -19
  113. package/configure/node_modules/debug/README.md +0 -437
  114. package/configure/node_modules/debug/node.js +0 -1
  115. package/configure/node_modules/debug/package.json +0 -51
  116. package/configure/node_modules/debug/src/browser.js +0 -180
  117. package/configure/node_modules/debug/src/common.js +0 -249
  118. package/configure/node_modules/debug/src/index.js +0 -12
  119. package/configure/node_modules/debug/src/node.js +0 -177
  120. package/esm/configure.js +0 -25986
  121. package/esm/configure.js.map +0 -1
  122. package/esm/controller.js +0 -344
  123. package/esm/controller.js.map +0 -1
  124. package/esm/element.js +0 -1312
  125. 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
@@ -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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"}