@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/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 ownKeys(object, enumerableOnly) {
7
- var keys = Object.keys(object);
8
-
9
- if (Object.getOwnPropertySymbols) {
10
- var symbols = Object.getOwnPropertySymbols(object);
11
- enumerableOnly && (symbols = symbols.filter(function (sym) {
12
- return Object.getOwnPropertyDescriptor(object, sym).enumerable;
13
- })), keys.push.apply(keys, symbols);
14
- }
15
-
16
- return keys;
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
- function _defineProperty(obj, key, value) {
33
- if (key in obj) {
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 obj;
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
- function _objectWithoutProperties(source, excluded) {
63
- if (source == null) return {};
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
- var choices = [...rectangles, ...polygons, ...circles];
93
- var correctResponseIds = getCorrectResponse(choices);
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
- var answerIds = (session.answers || []).map(a => a.id);
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
- var _excluded = ["index", "correct"],
137
- _excluded2 = ["index", "correct"],
138
- _excluded3 = ["index", "correct"];
139
- var log = debug('pie-elements:hotspot:controller');
140
- var normalize = question => _objectSpread2(_objectSpread2({}, defaults), question);
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
- var normalizedQuestion = normalize(question);
143
- var {
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
- var {
116
+ const {
161
117
  rectangles,
162
118
  polygons,
163
119
  circles
164
120
  } = shapes || {};
165
- var shouldIncludeCorrectResponse = env.mode === 'evaluate' || env.role === 'instructor' && env.mode === 'view';
121
+ const shouldIncludeCorrectResponse = env.mode === 'evaluate' || env.role === 'instructor' && env.mode === 'view';
166
122
  return new Promise(resolve => {
167
- var out = {
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: _objectSpread2(_objectSpread2({}, shapes), {}, {
139
+ shapes: _extends({}, shapes, {
184
140
  // eslint-disable-next-line no-unused-vars
185
141
  rectangles: (rectangles || []).map(_ref => {
186
- var {
187
- index,
142
+ let {
188
143
  correct
189
144
  } = _ref,
190
- rectProps = _objectWithoutProperties(_ref, _excluded);
145
+ rectProps = _objectWithoutPropertiesLoose(_ref, _excluded);
191
146
 
192
- return shouldIncludeCorrectResponse ? _objectSpread2({
147
+ return shouldIncludeCorrectResponse ? _extends({
193
148
  correct
194
- }, rectProps) : _objectSpread2({}, rectProps);
149
+ }, rectProps) : _extends({}, rectProps);
195
150
  }),
196
151
  // eslint-disable-next-line no-unused-vars
197
152
  polygons: (polygons || []).map(_ref2 => {
198
- var {
199
- index,
153
+ let {
200
154
  correct
201
155
  } = _ref2,
202
- polyProps = _objectWithoutProperties(_ref2, _excluded2);
156
+ polyProps = _objectWithoutPropertiesLoose(_ref2, _excluded2);
203
157
 
204
- return shouldIncludeCorrectResponse ? _objectSpread2({
158
+ return shouldIncludeCorrectResponse ? _extends({
205
159
  correct
206
- }, polyProps) : _objectSpread2({}, polyProps);
160
+ }, polyProps) : _extends({}, polyProps);
207
161
  }),
208
162
  // eslint-disable-next-line no-unused-vars
209
163
  circles: (circles || []).map(_ref3 => {
210
- var {
211
- index,
164
+ let {
212
165
  correct
213
166
  } = _ref3,
214
- circleProps = _objectWithoutProperties(_ref3, _excluded3);
167
+ circleProps = _objectWithoutPropertiesLoose(_ref3, _excluded3);
215
168
 
216
- return shouldIncludeCorrectResponse ? _objectSpread2({
169
+ return shouldIncludeCorrectResponse ? _extends({
217
170
  correct
218
- }, circleProps) : _objectSpread2({}, 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
- var createDefaultModel = function createDefaultModel() {
239
- var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
240
- return new Promise(resolve => {
241
- resolve(_objectSpread2(_objectSpread2({}, defaults), model));
242
- });
243
- };
191
+ const createDefaultModel = (model = {}) => new Promise(resolve => {
192
+ resolve(_extends({}, defaults, model));
193
+ });
244
194
 
245
- var getScore = function getScore(config, session) {
246
- var env = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
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
- var {
204
+ const {
256
205
  shapes: {
257
206
  rectangles = [],
258
207
  polygons = [],
259
208
  circles = []
260
209
  } = {}
261
210
  } = config;
262
- var partialScoringEnabled = partialScoring.enabled(config, env);
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
- var correctAnswers = 0;
269
- var selectedChoices = 0;
270
- var choices = [...rectangles, ...polygons, ...circles];
271
- var correctChoices = choices.filter(choice => choice.correct);
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
- var selected = answers && answers.filter(answer => answer.id === shape.id)[0];
274
- var correctlySelected = shape.correct && selected;
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
- var extraAnswers = selectedChoices > correctChoices.length ? selectedChoices - correctChoices.length : 0;
285
- var total = correctChoices.length === 0 ? 1 : correctChoices.length;
286
- var str = ((correctAnswers - extraAnswers) / total).toFixed(2);
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
- var score = getScore(config, session, env);
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
- var returnShapesCorrect = shapes => {
317
- var answers = [];
264
+ const returnShapesCorrect = shapes => {
265
+ let answers = [];
318
266
  shapes.forEach(i => {
319
- var {
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
- var createCorrectResponseSession = (question, env) => {
281
+ const createCorrectResponseSession = (question, env) => {
334
282
  return new Promise(resolve => {
335
283
  if (env.mode !== 'evaluate' && env.role === 'instructor') {
336
- var {
284
+ const {
337
285
  shapes: {
338
286
  rectangles = [],
339
287
  circles = [],
340
288
  polygons = {}
341
289
  } = {}
342
290
  } = question;
343
- var rectangleCorrect = returnShapesCorrect(rectangles);
344
- var polygonsCorrect = returnShapesCorrect(polygons);
345
- var circlesCorrect = returnShapesCorrect(circles);
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
- var getContent = html => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
305
+ const getContent = html => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
358
306
 
359
- var validate = function validate() {
360
- var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
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
- var {
311
+ const {
366
312
  minShapes = 2,
367
313
  maxShapes,
368
314
  maxSelections
369
315
  } = config;
370
- var errors = {};
316
+ const errors = {};
371
317
  ['teacherInstructions', 'prompt', 'rationale'].forEach(field => {
372
318
  var _config$field;
373
319
 
374
- if ((_config$field = config[field]) !== null && _config$field !== void 0 && _config$field.required && !getContent(model[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
- var allShapes = Object.values(shapes || {}).reduce((acc, shape) => [...acc, ...shape], []);
379
- var nbOfSelections = (allShapes || []).reduce((acc, shape) => shape.correct ? acc + 1 : acc, 0);
380
- var nbOfShapes = (allShapes || []).length;
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 = "There should be at least ".concat(minShapes, " shapes defined.");
329
+ errors.shapes = `There should be at least ${minShapes} shapes defined.`;
384
330
  } else if (nbOfShapes > maxShapes) {
385
- errors.shapes = "No more than ".concat(maxShapes, " shapes should be defined.");
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 = "No more than ".concat(maxSelections, " shapes should be selected.");
337
+ errors.selections = `No more than ${maxSelections} shapes should be selected.`;
392
338
  }
393
339
 
394
340
  return errors;
@@ -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":"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"}
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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"}