@pie-element/hotspot 6.15.2-next.1 → 6.15.2-next.2

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 (65) hide show
  1. package/configure/lib/DeleteWidget.js +79 -0
  2. package/configure/lib/DeleteWidget.js.map +1 -0
  3. package/configure/lib/button.js +61 -0
  4. package/configure/lib/button.js.map +1 -0
  5. package/configure/lib/buttons/circle.js +40 -0
  6. package/configure/lib/buttons/circle.js.map +1 -0
  7. package/configure/lib/buttons/polygon.js +46 -0
  8. package/configure/lib/buttons/polygon.js.map +1 -0
  9. package/configure/lib/buttons/rectangle.js +46 -0
  10. package/configure/lib/buttons/rectangle.js.map +1 -0
  11. package/configure/lib/defaults.js +143 -0
  12. package/configure/lib/defaults.js.map +1 -0
  13. package/configure/lib/hotspot-circle.js +246 -0
  14. package/configure/lib/hotspot-circle.js.map +1 -0
  15. package/configure/lib/hotspot-container.js +417 -0
  16. package/configure/lib/hotspot-container.js.map +1 -0
  17. package/configure/lib/hotspot-drawable.js +548 -0
  18. package/configure/lib/hotspot-drawable.js.map +1 -0
  19. package/configure/lib/hotspot-palette.js +154 -0
  20. package/configure/lib/hotspot-palette.js.map +1 -0
  21. package/configure/lib/hotspot-polygon.js +364 -0
  22. package/configure/lib/hotspot-polygon.js.map +1 -0
  23. package/configure/lib/hotspot-rectangle.js +240 -0
  24. package/configure/lib/hotspot-rectangle.js.map +1 -0
  25. package/configure/lib/icons.js +7 -0
  26. package/configure/lib/icons.js.map +1 -0
  27. package/configure/lib/index.js +254 -0
  28. package/configure/lib/index.js.map +1 -0
  29. package/configure/lib/root.js +418 -0
  30. package/configure/lib/root.js.map +1 -0
  31. package/configure/lib/shapes/circle.js +115 -0
  32. package/configure/lib/shapes/circle.js.map +1 -0
  33. package/configure/lib/shapes/polygon.js +111 -0
  34. package/configure/lib/shapes/polygon.js.map +1 -0
  35. package/configure/lib/shapes/rectagle.js +115 -0
  36. package/configure/lib/shapes/rectagle.js.map +1 -0
  37. package/configure/lib/upload-control.js +68 -0
  38. package/configure/lib/upload-control.js.map +1 -0
  39. package/configure/lib/utils.js +237 -0
  40. package/configure/lib/utils.js.map +1 -0
  41. package/configure/package.json +1 -1
  42. package/controller/lib/defaults.js +33 -0
  43. package/controller/lib/defaults.js.map +1 -0
  44. package/controller/lib/index.js +289 -0
  45. package/controller/lib/index.js.map +1 -0
  46. package/controller/lib/utils.js +54 -0
  47. package/controller/lib/utils.js.map +1 -0
  48. package/controller/package.json +1 -1
  49. package/lib/hotspot/circle.js +191 -0
  50. package/lib/hotspot/circle.js.map +1 -0
  51. package/lib/hotspot/container.js +282 -0
  52. package/lib/hotspot/container.js.map +1 -0
  53. package/lib/hotspot/icons.js +8 -0
  54. package/lib/hotspot/icons.js.map +1 -0
  55. package/lib/hotspot/index.js +209 -0
  56. package/lib/hotspot/index.js.map +1 -0
  57. package/lib/hotspot/polygon.js +225 -0
  58. package/lib/hotspot/polygon.js.map +1 -0
  59. package/lib/hotspot/rectangle.js +207 -0
  60. package/lib/hotspot/rectangle.js.map +1 -0
  61. package/lib/index.js +114 -0
  62. package/lib/index.js.map +1 -0
  63. package/lib/session-updater.js +30 -0
  64. package/lib/session-updater.js.map +1 -0
  65. package/package.json +3 -3
@@ -0,0 +1,289 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.createDefaultModel = exports.createCorrectResponseSession = void 0;
9
+ exports.model = model;
10
+ exports.normalize = void 0;
11
+ exports.outcome = outcome;
12
+ exports.validate = void 0;
13
+
14
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
15
+
16
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
17
+
18
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
19
+
20
+ var _debug = _interopRequireDefault(require("debug"));
21
+
22
+ var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
23
+
24
+ var _controllerUtils = require("@pie-lib/pie-toolbox/controller-utils");
25
+
26
+ var _utils = require("./utils");
27
+
28
+ var _defaults = _interopRequireDefault(require("./defaults"));
29
+
30
+ var _excluded = ["index"],
31
+ _excluded2 = ["index"],
32
+ _excluded3 = ["index"];
33
+
34
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
35
+
36
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
37
+
38
+ var log = (0, _debug["default"])('pie-elements:hotspot:controller');
39
+
40
+ var normalize = function normalize(question) {
41
+ return _objectSpread(_objectSpread({}, _defaults["default"]), question);
42
+ };
43
+
44
+ exports.normalize = normalize;
45
+
46
+ function model(question, session, env) {
47
+ var normalizedQuestion = normalize(question);
48
+ var imageUrl = normalizedQuestion.imageUrl,
49
+ dimensions = normalizedQuestion.dimensions,
50
+ hotspotColor = normalizedQuestion.hotspotColor,
51
+ multipleCorrect = normalizedQuestion.multipleCorrect,
52
+ outlineColor = normalizedQuestion.outlineColor,
53
+ partialScoring = normalizedQuestion.partialScoring,
54
+ prompt = normalizedQuestion.prompt,
55
+ shapes = normalizedQuestion.shapes,
56
+ language = normalizedQuestion.language;
57
+
58
+ var _ref = shapes || {},
59
+ rectangles = _ref.rectangles,
60
+ polygons = _ref.polygons,
61
+ circles = _ref.circles;
62
+
63
+ return new Promise(function (resolve) {
64
+ var out = {
65
+ disabled: env.mode !== 'gather',
66
+ mode: env.mode,
67
+ dimensions: dimensions,
68
+ imageUrl: imageUrl,
69
+ outlineColor: outlineColor,
70
+ hotspotColor: hotspotColor,
71
+ multipleCorrect: multipleCorrect,
72
+ partialScoring: partialScoring,
73
+ language: language,
74
+ shapes: _objectSpread(_objectSpread({}, shapes), {}, {
75
+ // eslint-disable-next-line no-unused-vars
76
+ rectangles: (rectangles || []).map(function (_ref2) {
77
+ var index = _ref2.index,
78
+ rectProps = (0, _objectWithoutProperties2["default"])(_ref2, _excluded);
79
+ return _objectSpread({}, rectProps);
80
+ }),
81
+ // eslint-disable-next-line no-unused-vars
82
+ polygons: (polygons || []).map(function (_ref3) {
83
+ var index = _ref3.index,
84
+ polyProps = (0, _objectWithoutProperties2["default"])(_ref3, _excluded2);
85
+ return _objectSpread({}, polyProps);
86
+ }),
87
+ // eslint-disable-next-line no-unused-vars
88
+ circles: (circles || []).map(function (_ref4) {
89
+ var index = _ref4.index,
90
+ circleProps = (0, _objectWithoutProperties2["default"])(_ref4, _excluded3);
91
+ return _objectSpread({}, circleProps);
92
+ })
93
+ }),
94
+ responseCorrect: env.mode === 'evaluate' ? (0, _utils.isResponseCorrect)(normalizedQuestion, session) : undefined
95
+ };
96
+
97
+ if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {
98
+ out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;
99
+ out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled ? normalizedQuestion.teacherInstructions : null;
100
+ } else {
101
+ out.rationale = null;
102
+ out.teacherInstructions = null;
103
+ }
104
+
105
+ out.prompt = normalizedQuestion.promptEnabled ? prompt : null;
106
+ out.strokeWidth = normalizedQuestion.strokeWidth; // console.log(out);
107
+
108
+ resolve(out);
109
+ });
110
+ }
111
+
112
+ var createDefaultModel = function createDefaultModel() {
113
+ var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
114
+ return new Promise(function (resolve) {
115
+ resolve(_objectSpread(_objectSpread({}, _defaults["default"]), model));
116
+ });
117
+ };
118
+
119
+ exports.createDefaultModel = createDefaultModel;
120
+
121
+ var getScore = function getScore(config, session) {
122
+ var env = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
123
+
124
+ var _ref5 = session || {},
125
+ answers = _ref5.answers;
126
+
127
+ if (!config.shapes || !config.shapes.rectangles && !config.shapes.polygons && !config.shapes.circles) {
128
+ return 0;
129
+ }
130
+
131
+ var _config$shapes = config.shapes;
132
+ _config$shapes = _config$shapes === void 0 ? {} : _config$shapes;
133
+ var _config$shapes$rectan = _config$shapes.rectangles,
134
+ rectangles = _config$shapes$rectan === void 0 ? [] : _config$shapes$rectan,
135
+ _config$shapes$polygo = _config$shapes.polygons,
136
+ polygons = _config$shapes$polygo === void 0 ? [] : _config$shapes$polygo,
137
+ _config$shapes$circle = _config$shapes.circles,
138
+ circles = _config$shapes$circle === void 0 ? [] : _config$shapes$circle;
139
+
140
+ var partialScoringEnabled = _controllerUtils.partialScoring.enabled(config, env);
141
+
142
+ if (!partialScoringEnabled) {
143
+ return (0, _utils.isResponseCorrect)(config, session) ? 1 : 0;
144
+ }
145
+
146
+ var correctAnswers = 0;
147
+ var selectedChoices = 0;
148
+ var choices = [].concat((0, _toConsumableArray2["default"])(rectangles), (0, _toConsumableArray2["default"])(polygons), (0, _toConsumableArray2["default"])(circles));
149
+ var correctChoices = choices.filter(function (choice) {
150
+ return choice.correct;
151
+ });
152
+ choices.forEach(function (shape) {
153
+ var selected = answers && answers.filter(function (answer) {
154
+ return answer.id === shape.id;
155
+ })[0];
156
+ var correctlySelected = shape.correct && selected;
157
+
158
+ if (selected) {
159
+ selectedChoices += 1;
160
+ }
161
+
162
+ if (correctlySelected) {
163
+ correctAnswers += 1;
164
+ }
165
+ });
166
+ var extraAnswers = selectedChoices > correctChoices.length ? selectedChoices - correctChoices.length : 0;
167
+ var total = correctChoices.length === 0 ? 1 : correctChoices.length;
168
+ var str = ((correctAnswers - extraAnswers) / total).toFixed(2);
169
+ return str < 0 ? 0 : parseFloat(str);
170
+ };
171
+
172
+ function outcome(config, session) {
173
+ var env = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
174
+ return new Promise(function (resolve) {
175
+ log('outcome...');
176
+
177
+ if (!session || (0, _isEmpty["default"])(session)) {
178
+ resolve({
179
+ score: 0,
180
+ empty: true
181
+ });
182
+ }
183
+
184
+ if (session.answers) {
185
+ var score = getScore(config, session, env);
186
+ resolve({
187
+ score: score
188
+ });
189
+ } else {
190
+ resolve({
191
+ score: 0,
192
+ empty: true
193
+ });
194
+ }
195
+ });
196
+ }
197
+
198
+ var returnShapesCorrect = function returnShapesCorrect(shapes) {
199
+ var answers = [];
200
+ shapes.forEach(function (i) {
201
+ var correct = i.correct,
202
+ id = i.id;
203
+
204
+ if (correct) {
205
+ answers.push({
206
+ id: id
207
+ });
208
+ }
209
+ });
210
+ return answers;
211
+ };
212
+
213
+ var createCorrectResponseSession = function createCorrectResponseSession(question, env) {
214
+ return new Promise(function (resolve) {
215
+ if (env.mode !== 'evaluate' && env.role === 'instructor') {
216
+ var _question$shapes = question.shapes;
217
+ _question$shapes = _question$shapes === void 0 ? {} : _question$shapes;
218
+ var _question$shapes$rect = _question$shapes.rectangles,
219
+ rectangles = _question$shapes$rect === void 0 ? [] : _question$shapes$rect,
220
+ _question$shapes$circ = _question$shapes.circles,
221
+ circles = _question$shapes$circ === void 0 ? [] : _question$shapes$circ,
222
+ _question$shapes$poly = _question$shapes.polygons,
223
+ polygons = _question$shapes$poly === void 0 ? {} : _question$shapes$poly;
224
+ var rectangleCorrect = returnShapesCorrect(rectangles);
225
+ var polygonsCorrect = returnShapesCorrect(polygons);
226
+ var circlesCorrect = returnShapesCorrect(circles);
227
+ resolve({
228
+ answers: [].concat((0, _toConsumableArray2["default"])(rectangleCorrect), (0, _toConsumableArray2["default"])(polygonsCorrect), (0, _toConsumableArray2["default"])(circlesCorrect)),
229
+ id: '1'
230
+ });
231
+ } else {
232
+ resolve(null);
233
+ }
234
+ });
235
+ }; // remove all html tags
236
+
237
+
238
+ exports.createCorrectResponseSession = createCorrectResponseSession;
239
+
240
+ var getInnerText = function getInnerText(html) {
241
+ return (html || '').replaceAll(/<[^>]*>/g, '');
242
+ }; // remove all html tags except img and iframe
243
+
244
+
245
+ var getContent = function getContent(html) {
246
+ return (html || '').replace(/(<(?!img|iframe)([^>]+)>)/gi, '');
247
+ };
248
+
249
+ var validate = function validate() {
250
+ var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
251
+ var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
252
+ var shapes = model.shapes;
253
+ var _config$minShapes = config.minShapes,
254
+ minShapes = _config$minShapes === void 0 ? 2 : _config$minShapes,
255
+ maxShapes = config.maxShapes,
256
+ maxSelections = config.maxSelections;
257
+ var errors = {};
258
+ ['teacherInstructions', 'prompt', 'rationale'].forEach(function (field) {
259
+ var _config$field;
260
+
261
+ if ((_config$field = config[field]) !== null && _config$field !== void 0 && _config$field.required && !getContent(model[field])) {
262
+ errors[field] = 'This field is required.';
263
+ }
264
+ });
265
+ var allShapes = Object.values(shapes || {}).reduce(function (acc, shape) {
266
+ return [].concat((0, _toConsumableArray2["default"])(acc), (0, _toConsumableArray2["default"])(shape));
267
+ }, []);
268
+ var nbOfSelections = (allShapes || []).reduce(function (acc, shape) {
269
+ return shape.correct ? acc + 1 : acc;
270
+ }, 0);
271
+ var nbOfShapes = (allShapes || []).length;
272
+
273
+ if (nbOfShapes < minShapes) {
274
+ errors.shapes = "There should be at least ".concat(minShapes, " shapes defined.");
275
+ } else if (nbOfShapes > maxShapes) {
276
+ errors.shapes = "No more than ".concat(maxShapes, " shapes should be defined.");
277
+ }
278
+
279
+ if (nbOfSelections < 1) {
280
+ errors.selections = 'There should be at least 1 shape selected.';
281
+ } else if (nbOfSelections > maxSelections) {
282
+ errors.selections = "No more than ".concat(maxSelections, " shapes should be selected.");
283
+ }
284
+
285
+ return errors;
286
+ };
287
+
288
+ exports.validate = validate;
289
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.js"],"names":["log","normalize","question","defaults","model","session","env","normalizedQuestion","imageUrl","dimensions","hotspotColor","multipleCorrect","outlineColor","partialScoring","prompt","shapes","language","rectangles","polygons","circles","Promise","resolve","out","disabled","mode","map","index","rectProps","polyProps","circleProps","responseCorrect","undefined","role","rationale","rationaleEnabled","teacherInstructions","teacherInstructionsEnabled","promptEnabled","strokeWidth","createDefaultModel","getScore","config","answers","partialScoringEnabled","enabled","correctAnswers","selectedChoices","choices","correctChoices","filter","choice","correct","forEach","shape","selected","answer","id","correctlySelected","extraAnswers","length","total","str","toFixed","parseFloat","outcome","score","empty","returnShapesCorrect","i","push","createCorrectResponseSession","rectangleCorrect","polygonsCorrect","circlesCorrect","getInnerText","html","replaceAll","getContent","replace","validate","minShapes","maxShapes","maxSelections","errors","field","required","allShapes","Object","values","reduce","acc","nbOfSelections","nbOfShapes","selections"],"mappings":"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","sourcesContent":["import debug from 'debug';\nimport isEmpty from 'lodash/isEmpty';\nimport { partialScoring } from '@pie-lib/pie-toolbox/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 multipleCorrect,\n outlineColor,\n partialScoring,\n prompt,\n shapes,\n language,\n } = normalizedQuestion;\n const { rectangles, polygons, circles } = shapes || {};\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 multipleCorrect,\n partialScoring,\n language,\n shapes: {\n ...shapes,\n // eslint-disable-next-line no-unused-vars\n rectangles: (rectangles || []).map(({ index, ...rectProps }) => ({ ...rectProps })),\n // eslint-disable-next-line no-unused-vars\n polygons: (polygons || []).map(({ index, ...polyProps }) => ({ ...polyProps })),\n // eslint-disable-next-line no-unused-vars\n circles: (circles || []).map(({ index, ...circleProps }) => ({ ...circleProps })),\n },\n responseCorrect: env.mode === 'evaluate' ? isResponseCorrect(normalizedQuestion, session) : undefined,\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 // console.log(out);\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 and iframe\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe)([^>]+)>)/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"],"file":"index.js"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.isResponseCorrect = exports.getCorrectResponse = void 0;
9
+
10
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
11
+
12
+ var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
13
+
14
+ var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
15
+
16
+ var getCorrectResponse = function getCorrectResponse(choices) {
17
+ return choices.filter(function (c) {
18
+ return c.correct;
19
+ }).map(function (c) {
20
+ return c.id;
21
+ }).sort();
22
+ };
23
+
24
+ exports.getCorrectResponse = getCorrectResponse;
25
+
26
+ var isResponseCorrect = function isResponseCorrect(question, session) {
27
+ var _question$shapes = question.shapes,
28
+ _question$shapes$rect = _question$shapes.rectangles,
29
+ rectangles = _question$shapes$rect === void 0 ? [] : _question$shapes$rect,
30
+ _question$shapes$poly = _question$shapes.polygons,
31
+ polygons = _question$shapes$poly === void 0 ? [] : _question$shapes$poly,
32
+ _question$shapes$circ = _question$shapes.circles,
33
+ circles = _question$shapes$circ === void 0 ? [] : _question$shapes$circ;
34
+ var choices = [].concat((0, _toConsumableArray2["default"])(rectangles), (0, _toConsumableArray2["default"])(polygons), (0, _toConsumableArray2["default"])(circles));
35
+ var correctResponseIds = getCorrectResponse(choices);
36
+
37
+ if (!session || (0, _isEmpty["default"])(session)) {
38
+ return false;
39
+ }
40
+
41
+ if (session.answers && session.answers.length) {
42
+ var answerIds = (session.answers || []).map(function (a) {
43
+ return a.id;
44
+ });
45
+ return (0, _isEqual["default"])(answerIds.sort(), correctResponseIds);
46
+ } else if (!(correctResponseIds && correctResponseIds.length)) {
47
+ return true;
48
+ }
49
+
50
+ return false;
51
+ };
52
+
53
+ exports.isResponseCorrect = isResponseCorrect;
54
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils.js"],"names":["getCorrectResponse","choices","filter","c","correct","map","id","sort","isResponseCorrect","question","session","shapes","rectangles","polygons","circles","correctResponseIds","answers","length","answerIds","a"],"mappings":";;;;;;;;;;;AAAA;;AACA;;AAEO,IAAMA,kBAAkB,GAAG,SAArBA,kBAAqB,CAACC,OAAD;AAAA,SAChCA,OAAO,CACJC,MADH,CACU,UAACC,CAAD;AAAA,WAAOA,CAAC,CAACC,OAAT;AAAA,GADV,EAEGC,GAFH,CAEO,UAACF,CAAD;AAAA,WAAOA,CAAC,CAACG,EAAT;AAAA,GAFP,EAGGC,IAHH,EADgC;AAAA,CAA3B;;;;AAMA,IAAMC,iBAAiB,GAAG,SAApBA,iBAAoB,CAACC,QAAD,EAAWC,OAAX,EAAuB;AACtD,yBAEID,QAFJ,CACEE,MADF;AAAA,+CACYC,UADZ;AAAA,MACYA,UADZ,sCACyB,EADzB;AAAA,+CAC6BC,QAD7B;AAAA,MAC6BA,QAD7B,sCACwC,EADxC;AAAA,+CAC4CC,OAD5C;AAAA,MAC4CA,OAD5C,sCACsD,EADtD;AAGA,MAAMb,OAAO,iDAAOW,UAAP,uCAAsBC,QAAtB,uCAAmCC,OAAnC,EAAb;AACA,MAAIC,kBAAkB,GAAGf,kBAAkB,CAACC,OAAD,CAA3C;;AAEA,MAAI,CAACS,OAAD,IAAY,yBAAQA,OAAR,CAAhB,EAAkC;AAChC,WAAO,KAAP;AACD;;AAED,MAAIA,OAAO,CAACM,OAAR,IAAmBN,OAAO,CAACM,OAAR,CAAgBC,MAAvC,EAA+C;AAC7C,QAAIC,SAAS,GAAG,CAACR,OAAO,CAACM,OAAR,IAAmB,EAApB,EAAwBX,GAAxB,CAA4B,UAACc,CAAD;AAAA,aAAOA,CAAC,CAACb,EAAT;AAAA,KAA5B,CAAhB;AAEA,WAAO,yBAAQY,SAAS,CAACX,IAAV,EAAR,EAA0BQ,kBAA1B,CAAP;AACD,GAJD,MAIO,IAAI,EAAEA,kBAAkB,IAAIA,kBAAkB,CAACE,MAA3C,CAAJ,EAAwD;AAC7D,WAAO,IAAP;AACD;;AAED,SAAO,KAAP;AACD,CApBM","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"],"file":"utils.js"}
@@ -11,7 +11,7 @@
11
11
  "main": "lib/index.js",
12
12
  "module": "src/index.js",
13
13
  "dependencies": {
14
- "@pie-lib/pie-toolbox": "1.13.2-next.21",
14
+ "@pie-lib/pie-toolbox": "1.13.1",
15
15
  "debug": "^4.1.1",
16
16
  "lodash": "^4.17.15"
17
17
  }
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+
10
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
+
12
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
13
+
14
+ var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
15
+
16
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
17
+
18
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
19
+
20
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
21
+
22
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
23
+
24
+ var _react = _interopRequireDefault(require("react"));
25
+
26
+ var _propTypes = _interopRequireDefault(require("prop-types"));
27
+
28
+ var _reactKonva = require("react-konva");
29
+
30
+ var _styles = require("@material-ui/core/styles");
31
+
32
+ var _icons = require("@pie-lib/pie-toolbox/icons");
33
+
34
+ var _icons2 = require("./icons");
35
+
36
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
37
+
38
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
39
+
40
+ var CircleComponent = /*#__PURE__*/function (_React$Component) {
41
+ (0, _inherits2["default"])(CircleComponent, _React$Component);
42
+
43
+ var _super = _createSuper(CircleComponent);
44
+
45
+ function CircleComponent(props) {
46
+ var _this;
47
+
48
+ (0, _classCallCheck2["default"])(this, CircleComponent);
49
+ _this = _super.call(this, props);
50
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleClick", function (e) {
51
+ var _this$props = _this.props,
52
+ onClick = _this$props.onClick,
53
+ id = _this$props.id,
54
+ selected = _this$props.selected,
55
+ disabled = _this$props.disabled;
56
+
57
+ if (!disabled) {
58
+ e.cancelBubble = true;
59
+ onClick({
60
+ id: id,
61
+ selected: !selected
62
+ });
63
+ }
64
+ });
65
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleMouseEnter", function () {
66
+ var disabled = _this.props.disabled;
67
+
68
+ if (!disabled) {
69
+ document.body.style.cursor = 'pointer';
70
+ }
71
+ });
72
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleMouseLeave", function () {
73
+ document.body.style.cursor = 'default';
74
+ });
75
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "getEvaluateOutlineColor", function (isCorrect, markAsCorrect, outlineColor) {
76
+ return markAsCorrect ? 'green' : isCorrect ? outlineColor : 'red';
77
+ });
78
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "getOutlineWidth", function (showCorrectEnabled, selected, markAsCorrect, strokeWidth) {
79
+ return markAsCorrect || !markAsCorrect && !showCorrectEnabled && selected ? strokeWidth : 0;
80
+ });
81
+ return _this;
82
+ }
83
+
84
+ (0, _createClass2["default"])(CircleComponent, [{
85
+ key: "render",
86
+ value: function render() {
87
+ var _this$props2 = this.props,
88
+ classes = _this$props2.classes,
89
+ radius = _this$props2.radius,
90
+ hotspotColor = _this$props2.hotspotColor,
91
+ isCorrect = _this$props2.isCorrect,
92
+ isEvaluateMode = _this$props2.isEvaluateMode,
93
+ outlineColor = _this$props2.outlineColor,
94
+ selected = _this$props2.selected,
95
+ x = _this$props2.x,
96
+ y = _this$props2.y,
97
+ evaluateText = _this$props2.evaluateText,
98
+ strokeWidth = _this$props2.strokeWidth,
99
+ scale = _this$props2.scale,
100
+ markAsCorrect = _this$props2.markAsCorrect,
101
+ showCorrectEnabled = _this$props2.showCorrectEnabled;
102
+ var outlineColorParsed = isEvaluateMode ? this.getEvaluateOutlineColor(isCorrect, markAsCorrect, outlineColor) : outlineColor;
103
+ var outlineWidth = this.getOutlineWidth(showCorrectEnabled, selected, markAsCorrect, strokeWidth);
104
+ var iconX = x - 10;
105
+ var iconY = y - 10; // Adjust position for the icon
106
+
107
+ var iconSrc;
108
+
109
+ if (showCorrectEnabled) {
110
+ if (selected && isCorrect || !selected && !isCorrect) {
111
+ iconSrc = _icons2.faCorrect;
112
+ }
113
+ } else {
114
+ if (selected) {
115
+ if (isCorrect) {
116
+ iconSrc = _icons2.faCorrect;
117
+ } else {
118
+ iconSrc = _icons2.faWrong;
119
+ }
120
+ } else if (!isCorrect) {
121
+ iconSrc = _icons2.faWrong;
122
+ }
123
+ }
124
+
125
+ return /*#__PURE__*/_react["default"].createElement(_reactKonva.Group, {
126
+ scaleX: scale,
127
+ scaleY: scale
128
+ }, /*#__PURE__*/_react["default"].createElement(_reactKonva.Circle, {
129
+ classes: classes.base,
130
+ radius: radius,
131
+ fill: hotspotColor,
132
+ onClick: this.handleClick,
133
+ onTap: this.handleClick,
134
+ draggable: false,
135
+ stroke: outlineColorParsed,
136
+ strokeWidth: outlineWidth,
137
+ onMouseLeave: this.handleMouseLeave,
138
+ onMouseEnter: this.handleMouseEnter,
139
+ x: x,
140
+ y: y
141
+ }), isEvaluateMode && iconSrc ? /*#__PURE__*/_react["default"].createElement(_icons.ImageComponent, {
142
+ src: iconSrc,
143
+ x: iconX,
144
+ y: iconY,
145
+ tooltip: evaluateText
146
+ }) : null);
147
+ }
148
+ }]);
149
+ return CircleComponent;
150
+ }(_react["default"].Component);
151
+
152
+ var styles = function styles() {
153
+ return {
154
+ base: {
155
+ cursor: 'pointer',
156
+ opacity: 0.5,
157
+ position: 'relative'
158
+ }
159
+ };
160
+ };
161
+
162
+ CircleComponent.propTypes = {
163
+ classes: _propTypes["default"].object.isRequired,
164
+ radius: _propTypes["default"].number.isRequired,
165
+ hotspotColor: _propTypes["default"].string.isRequired,
166
+ id: _propTypes["default"].string.isRequired,
167
+ isCorrect: _propTypes["default"].oneOfType([_propTypes["default"].bool, _propTypes["default"].string]),
168
+ isEvaluateMode: _propTypes["default"].bool.isRequired,
169
+ disabled: _propTypes["default"].bool.isRequired,
170
+ onClick: _propTypes["default"].func.isRequired,
171
+ outlineColor: _propTypes["default"].string.isRequired,
172
+ selected: _propTypes["default"].bool.isRequired,
173
+ x: _propTypes["default"].number.isRequired,
174
+ y: _propTypes["default"].number.isRequired,
175
+ evaluateText: _propTypes["default"].string,
176
+ strokeWidth: _propTypes["default"].number,
177
+ scale: _propTypes["default"].number,
178
+ markAsCorrect: _propTypes["default"].bool.isRequired,
179
+ showCorrectEnabled: _propTypes["default"].bool.isRequired
180
+ };
181
+ CircleComponent.defaultProps = {
182
+ isCorrect: false,
183
+ evaluateText: null,
184
+ strokeWidth: 5,
185
+ scale: 1
186
+ };
187
+
188
+ var _default = (0, _styles.withStyles)(styles)(CircleComponent);
189
+
190
+ exports["default"] = _default;
191
+ //# sourceMappingURL=circle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/hotspot/circle.jsx"],"names":["CircleComponent","props","e","onClick","id","selected","disabled","cancelBubble","document","body","style","cursor","isCorrect","markAsCorrect","outlineColor","showCorrectEnabled","strokeWidth","classes","radius","hotspotColor","isEvaluateMode","x","y","evaluateText","scale","outlineColorParsed","getEvaluateOutlineColor","outlineWidth","getOutlineWidth","iconX","iconY","iconSrc","faCorrect","faWrong","base","handleClick","handleMouseLeave","handleMouseEnter","React","Component","styles","opacity","position","propTypes","PropTypes","object","isRequired","number","string","oneOfType","bool","func","defaultProps"],"mappings":"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","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Circle, Group } from 'react-konva';\nimport { withStyles } from '@material-ui/core/styles';\nimport { ImageComponent } from '@pie-lib/pie-toolbox/icons';\nimport { faCorrect, faWrong } from './icons';\n\nclass CircleComponent extends React.Component {\n constructor(props) {\n super(props);\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 });\n }\n };\n\n handleMouseEnter = () => {\n const { disabled } = this.props;\n\n if (!disabled) {\n document.body.style.cursor = 'pointer';\n }\n };\n\n handleMouseLeave = () => {\n document.body.style.cursor = 'default';\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 classes,\n radius,\n hotspotColor,\n isCorrect,\n isEvaluateMode,\n outlineColor,\n selected,\n x,\n y,\n evaluateText,\n strokeWidth,\n scale,\n markAsCorrect,\n showCorrectEnabled,\n } = this.props;\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 return (\n <Group scaleX={scale} scaleY={scale}>\n <Circle\n classes={classes.base}\n radius={radius}\n fill={hotspotColor}\n onClick={this.handleClick}\n onTap={this.handleClick}\n draggable={false}\n stroke={outlineColorParsed}\n strokeWidth={outlineWidth}\n onMouseLeave={this.handleMouseLeave}\n onMouseEnter={this.handleMouseEnter}\n x={x}\n y={y}\n />\n {isEvaluateMode && iconSrc ? <ImageComponent src={iconSrc} x={iconX} y={iconY} tooltip={evaluateText} /> : null}\n </Group>\n );\n }\n}\n\nconst styles = () => ({\n base: {\n cursor: 'pointer',\n opacity: 0.5,\n position: 'relative',\n },\n});\n\nCircleComponent.propTypes = {\n classes: PropTypes.object.isRequired,\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 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 markAsCorrect: PropTypes.bool.isRequired,\n showCorrectEnabled: PropTypes.bool.isRequired,\n};\n\nCircleComponent.defaultProps = {\n isCorrect: false,\n evaluateText: null,\n strokeWidth: 5,\n scale: 1,\n};\n\nexport default withStyles(styles)(CircleComponent);\n"],"file":"circle.js"}