@pie-element/hotspot 6.3.2-next.9 → 6.4.1-next.5

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 (56) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/configure/CHANGELOG.md +19 -0
  3. package/configure/lib/DeleteWidget.js +19 -14
  4. package/configure/lib/DeleteWidget.js.map +1 -1
  5. package/configure/lib/buttons/circle.js +1 -1
  6. package/configure/lib/buttons/circle.js.map +1 -1
  7. package/configure/lib/defaults.js +2 -1
  8. package/configure/lib/defaults.js.map +1 -1
  9. package/configure/lib/hotspot-circle.js +229 -0
  10. package/configure/lib/hotspot-circle.js.map +1 -0
  11. package/configure/lib/hotspot-container.js +9 -7
  12. package/configure/lib/hotspot-container.js.map +1 -1
  13. package/configure/lib/hotspot-drawable.js +41 -14
  14. package/configure/lib/hotspot-drawable.js.map +1 -1
  15. package/configure/lib/hotspot-polygon.js +1 -2
  16. package/configure/lib/hotspot-polygon.js.map +1 -1
  17. package/configure/lib/hotspot-rectangle.js +0 -1
  18. package/configure/lib/hotspot-rectangle.js.map +1 -1
  19. package/configure/lib/index.js +8 -1
  20. package/configure/lib/index.js.map +1 -1
  21. package/configure/lib/shapes/circle.js +29 -10
  22. package/configure/lib/shapes/circle.js.map +1 -1
  23. package/configure/lib/utils.js +14 -1
  24. package/configure/lib/utils.js.map +1 -1
  25. package/configure/package.json +2 -2
  26. package/configure/src/DeleteWidget.jsx +16 -8
  27. package/configure/src/__tests__/__snapshots__/hotspot-container.test.js.snap +18 -0
  28. package/configure/src/__tests__/__snapshots__/hotspot-drawable.test.js.snap +0 -9
  29. package/configure/src/__tests__/__snapshots__/root.test.js.snap +18 -0
  30. package/configure/src/__tests__/hotspot-container.test.js +58 -3
  31. package/configure/src/__tests__/root.test.js +17 -0
  32. package/configure/src/__tests__/utils.test.js +18 -3
  33. package/configure/src/buttons/circle.jsx +1 -1
  34. package/configure/src/defaults.js +1 -0
  35. package/configure/src/hotspot-circle.jsx +145 -0
  36. package/configure/src/hotspot-container.jsx +13 -6
  37. package/configure/src/hotspot-drawable.jsx +26 -16
  38. package/configure/src/hotspot-polygon.jsx +1 -8
  39. package/configure/src/hotspot-rectangle.jsx +1 -9
  40. package/configure/src/index.js +3 -2
  41. package/configure/src/shapes/circle.js +21 -9
  42. package/configure/src/utils.js +12 -0
  43. package/controller/CHANGELOG.md +17 -0
  44. package/controller/lib/index.js +8 -3
  45. package/controller/lib/index.js.map +1 -1
  46. package/controller/package.json +2 -2
  47. package/controller/src/index.js +16 -6
  48. package/lib/hotspot/circle.js +191 -0
  49. package/lib/hotspot/circle.js.map +1 -0
  50. package/lib/hotspot/container.js +34 -2
  51. package/lib/hotspot/container.js.map +1 -1
  52. package/lib/hotspot/index.js.map +1 -1
  53. package/package.json +3 -3
  54. package/src/hotspot/circle.jsx +141 -0
  55. package/src/hotspot/container.jsx +31 -1
  56. package/src/hotspot/index.jsx +1 -1
@@ -1,13 +1,14 @@
1
- import React, { Component } from 'react';
2
- import PropTypes from 'prop-types';
3
- import classNames from 'classnames';
4
1
  import { withStyles } from '@material-ui/core/styles/index';
5
2
  import Help from '@material-ui/icons/Help';
3
+ import classNames from 'classnames';
4
+ import PropTypes from 'prop-types';
5
+ import React, { Component } from 'react';
6
+ import Button from './button';
7
+ import { CircleButton } from './buttons/circle';
8
+ import { PolygonButton } from './buttons/polygon';
9
+ import { RectangleButton } from './buttons/rectangle';
6
10
 
7
11
  import Drawable from './hotspot-drawable';
8
- import { RectangleButton } from './buttons/rectangle';
9
- import { PolygonButton } from './buttons/polygon';
10
- import Button from './button';
11
12
  import UploadControl from './upload-control';
12
13
  import { getAllShapes, groupShapes } from './utils';
13
14
 
@@ -191,6 +192,12 @@ export class Container extends Component {
191
192
  >
192
193
  <PolygonButton isActive={selectedShape === 'polygon'} />
193
194
  </div>
195
+ {/*<div*/}
196
+ {/* onClick={() => this.setState({ selectedShape: selectedShape === 'circle' ? 'none' : 'circle' })}*/}
197
+ {/* className={classes.buttonShape}*/}
198
+ {/*>*/}
199
+ {/* <CircleButton isActive={selectedShape === 'circle'} />*/}
200
+ {/*</div>*/}
194
201
 
195
202
  {imageUrl && (
196
203
  <UploadControl
@@ -6,6 +6,7 @@ import { withStyles } from '@material-ui/core/styles/index';
6
6
 
7
7
  import Rectangle from './hotspot-rectangle';
8
8
  import Polygon from './hotspot-polygon';
9
+ import Circle from './hotspot-circle';
9
10
  import { updateImageDimensions, getUpdatedShapes } from './utils';
10
11
  import RectangleShape from './shapes/rectagle';
11
12
  import CircleShape from './shapes/circle';
@@ -14,16 +15,12 @@ const IMAGE_MAX_WIDTH = 800;
14
15
 
15
16
  export class Drawable extends React.Component {
16
17
  static getDerivedStateFromProps(nextProps, prevState) {
17
- let dimensions = nextProps.dimensions;
18
-
19
- if (prevState && prevState.resizing) {
20
- dimensions = prevState.dimensions;
18
+ // Update the state only if the props have changed
19
+ if (nextProps.shapes !== prevState.shapes) {
20
+ return { shapes: nextProps.shapes };
21
21
  }
22
22
 
23
- return {
24
- ...prevState,
25
- dimensions: dimensions,
26
- };
23
+ return null;
27
24
  }
28
25
 
29
26
  constructor(props) {
@@ -165,10 +162,7 @@ export class Drawable extends React.Component {
165
162
  const { shapes, onUpdateShapes } = this.props;
166
163
  const newShapes = shapes.map((shape) => {
167
164
  if (shape.id === id) {
168
- return {
169
- ...shape,
170
- ...updatedProps,
171
- };
165
+ return { ...shape, ...updatedProps };
172
166
  }
173
167
  return shape;
174
168
  });
@@ -349,12 +343,28 @@ export class Drawable extends React.Component {
349
343
  >
350
344
  <Layer>
351
345
  {shapesToUse.map((shape, i) => {
352
- const Tag = shape.group === 'polygons' ? Polygon : Rectangle;
346
+ let Tag;
347
+ switch (shape.group) {
348
+ case 'rectangles':
349
+ Tag = Rectangle;
350
+ break;
351
+ case 'circles':
352
+ Tag = Circle;
353
+ break;
354
+ case 'polygons':
355
+ Tag = Polygon;
356
+ break;
357
+ default:
358
+ return null;
359
+ }
360
+
353
361
  return (
354
362
  <Tag
355
363
  correct={shape.correct}
356
364
  isDrawing={isDrawing}
357
- height={shape.height}
365
+ {...(shape.group === 'circles'
366
+ ? { radius: shape.radius }
367
+ : { height: shape.height, width: shape.width })}
358
368
  hotspotColor={hotspotColor}
359
369
  id={shape.id}
360
370
  key={i}
@@ -365,11 +375,11 @@ export class Drawable extends React.Component {
365
375
  width={shape.width}
366
376
  x={shape.x}
367
377
  y={shape.y}
368
- points={shape.points}
378
+ {...(shape.group === 'polygons' ? { points: shape.points } : {})}
369
379
  strokeWidth={strokeWidth}
370
380
  imageHeight={heightFromState || height}
371
381
  imageWidth={widthFromState || width}
372
- addPolygonPoint={(e) => this.addPolygonPoint(e)}
382
+ {...(shape.group === 'polygons' ? { addPolygonPoint: (e) => this.addPolygonPoint(e) } : {})}
373
383
  />
374
384
  );
375
385
  })}
@@ -223,14 +223,7 @@ class PolComponent extends React.Component {
223
223
  />
224
224
  ))}
225
225
  {!this.state.isDragging && this.state.hovered && (
226
- <DeleteWidget
227
- x={x}
228
- y={y}
229
- id={id}
230
- handleWidgetClick={this.handleDelete}
231
- points={points}
232
- outlineColor={outlineColor}
233
- />
226
+ <DeleteWidget x={x} y={y} id={id} handleWidgetClick={this.handleDelete} points={points} />
234
227
  )}
235
228
  </Group>
236
229
  );
@@ -96,15 +96,7 @@ class RectComponent extends React.Component {
96
96
  y={y}
97
97
  />
98
98
  {!this.state.isDragging && this.state.hovered && (
99
- <DeleteWidget
100
- id={id}
101
- height={height}
102
- width={width}
103
- x={x}
104
- y={y}
105
- outlineColor={outlineColor}
106
- handleWidgetClick={this.handleDelete}
107
- />
99
+ <DeleteWidget id={id} height={height} width={width} x={x} y={y} handleWidgetClick={this.handleDelete} />
108
100
  )}
109
101
  {this.state.hovered && (
110
102
  <Transformer
@@ -60,7 +60,7 @@ export default class HotspotConfigure extends HTMLElement {
60
60
 
61
61
  // check if the language is already included in the languageChoices.options array
62
62
  // and if not, then add it.
63
- if (!this._configuration.languageChoices.options.find(option => option.value === this._model.language)) {
63
+ if (!this._configuration.languageChoices.options.find((option) => option.value === this._model.language)) {
64
64
  this._configuration.languageChoices.options.push({
65
65
  value: this._model.language,
66
66
  label: this._model.language,
@@ -94,10 +94,11 @@ export default class HotspotConfigure extends HTMLElement {
94
94
  const _model = m;
95
95
 
96
96
  if (propertyType === 'multipleCorrect') {
97
- const { rectangles = [], polygons = [] } = _model.shapes || {};
97
+ const { rectangles = [], polygons = [], circles = [] } = _model.shapes || {};
98
98
 
99
99
  _model.shapes.rectangles = rectangles.map((shape) => ({ ...shape, correct: false }));
100
100
  _model.shapes.polygons = polygons.map((shape) => ({ ...shape, correct: false }));
101
+ _model.shapes.circles = circles.map((shape) => ({ ...shape, correct: false }));
101
102
  }
102
103
 
103
104
  this.onModelChanged(_model);
@@ -14,7 +14,7 @@ export default class CircleShape {
14
14
  newShapes.push(newCircle);
15
15
 
16
16
  return {
17
- newShapes,
17
+ shapes: newShapes,
18
18
  isDrawing: true,
19
19
  isDrawingShapeId: newCircle.id,
20
20
  };
@@ -25,21 +25,32 @@ export default class CircleShape {
25
25
 
26
26
  if (currentShapeIndex !== -1) {
27
27
  const currentShape = state.shapes[currentShapeIndex];
28
- const updatedShapes = [...props.shapes];
29
28
 
29
+ // Check if the shape is a valid circle (has more than 0 radius) before finalizing
30
30
  if (currentShape.radius > 0) {
31
- updatedShapes.push(currentShape);
32
-
33
31
  return {
32
+ ...state,
34
33
  isDrawing: false,
35
34
  stateShapes: false,
36
35
  isDrawingShapeId: undefined,
37
- shapes: updatedShapes,
36
+ };
37
+ } else {
38
+ return {
39
+ ...state,
40
+ isDrawing: false,
41
+ stateShapes: false,
42
+ isDrawingShapeId: undefined,
43
+ shapes: state.shapes.filter((shape) => shape.id !== state.isDrawingShapeId),
38
44
  };
39
45
  }
40
46
  }
41
47
 
42
- return state;
48
+ return {
49
+ ...state,
50
+ isDrawing: false,
51
+ stateShapes: false,
52
+ isDrawingShapeId: undefined,
53
+ };
43
54
  }
44
55
 
45
56
  static handleMouseMove(state, e) {
@@ -52,9 +63,10 @@ export default class CircleShape {
52
63
  if (resizingShapeIndex !== -1) {
53
64
  const resizingShape = tempShapes[resizingShapeIndex];
54
65
 
55
- resizingShape.radius = Math.sqrt(
56
- Math.pow(e.evt.layerX - resizingShape.x, 2) + Math.pow(e.evt.layerY - resizingShape.y, 2),
57
- );
66
+ // Calculate radius based on mouse position
67
+ const dx = e.evt.layerX - resizingShape.x;
68
+ const dy = e.evt.layerY - resizingShape.y;
69
+ resizingShape.radius = Math.sqrt(dx * dx + dy * dy);
58
70
 
59
71
  return {
60
72
  shapes: tempShapes,
@@ -41,6 +41,13 @@ const getUpdatedRectangle = (initialDim, nextDim, shape) => ({
41
41
  y: getDelta(initialDim.height, nextDim.height, shape.y),
42
42
  });
43
43
 
44
+ const getUpdatedCircles = (initialDim, nextDim, shape) => ({
45
+ ...shape,
46
+ radius: getDelta(initialDim.radius, nextDim.radius, shape.radius),
47
+ x: getDelta(initialDim.width, nextDim.width, shape.x),
48
+ y: getDelta(initialDim.height, nextDim.height, shape.y),
49
+ });
50
+
44
51
  const getUpdatedPlygon = (initialDim, nextDim, shape) => ({
45
52
  ...shape,
46
53
  points: shape.points.map((point) => ({
@@ -61,6 +68,10 @@ const getUpdatedShapes = (initialDim, nextDim, shapes) => {
61
68
  if (shape.group === 'polygons') {
62
69
  return getUpdatedPlygon(initialDim, nextDim, shape);
63
70
  }
71
+
72
+ if (shape.group === 'circles') {
73
+ return getUpdatedCircles(initialDim, nextDim, shape);
74
+ }
64
75
  });
65
76
  };
66
77
 
@@ -102,6 +113,7 @@ const groupShapes = (shapesArray) => {
102
113
  const shapesMap = {
103
114
  rectangles: [],
104
115
  polygons: [],
116
+ circles: [],
105
117
  };
106
118
 
107
119
  if (shapesArray.length) {
@@ -3,6 +3,23 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [4.2.0](https://github.com/pie-framework/pie-elements/compare/@pie-element/hotspot-controller@4.1.4...@pie-element/hotspot-controller@4.2.0) (2024-01-23)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * update to pie-lib/pie-toolbox 1.5.4 for PD-3387, PD-3384, PD-3383, PD-3392 ([2278f9a](https://github.com/pie-framework/pie-elements/commit/2278f9a3fdf1bc89ab590f240d926a857339179e))
12
+ * update to pie-lib/pie-toolbox 1.5.5 for PD-3392 ([d4286e0](https://github.com/pie-framework/pie-elements/commit/d4286e08a060a73e6de098f87173baaaa88cc997))
13
+
14
+
15
+ ### Features
16
+
17
+ * display and validate circles PD-1446 ([d42e74e](https://github.com/pie-framework/pie-elements/commit/d42e74e449c531c14cfe1fa0957154bcb3adbfd7))
18
+
19
+
20
+
21
+
22
+
6
23
  ## [4.1.4](https://github.com/pie-framework/pie-elements/compare/@pie-element/hotspot-controller@4.1.3...@pie-element/hotspot-controller@4.1.4) (2024-01-15)
7
24
 
8
25
 
@@ -125,7 +125,9 @@ var getScore = function getScore(config, session) {
125
125
  var _config$shapes$rectan = _config$shapes.rectangles,
126
126
  rectangles = _config$shapes$rectan === void 0 ? [] : _config$shapes$rectan,
127
127
  _config$shapes$polygo = _config$shapes.polygons,
128
- polygons = _config$shapes$polygo === void 0 ? [] : _config$shapes$polygo;
128
+ polygons = _config$shapes$polygo === void 0 ? [] : _config$shapes$polygo,
129
+ _config$shapes$circle = _config$shapes.circles,
130
+ circles = _config$shapes$circle === void 0 ? [] : _config$shapes$circle;
129
131
 
130
132
  var partialScoringEnabled = _controllerUtils.partialScoring.enabled(config, env);
131
133
 
@@ -135,7 +137,7 @@ var getScore = function getScore(config, session) {
135
137
 
136
138
  var correctAnswers = 0;
137
139
  var selectedChoices = 0;
138
- var choices = [].concat((0, _toConsumableArray2["default"])(rectangles), (0, _toConsumableArray2["default"])(polygons));
140
+ var choices = [].concat((0, _toConsumableArray2["default"])(rectangles), (0, _toConsumableArray2["default"])(polygons), (0, _toConsumableArray2["default"])(circles));
139
141
  var correctChoices = choices.filter(function (choice) {
140
142
  return choice.correct;
141
143
  });
@@ -207,12 +209,15 @@ var createCorrectResponseSession = function createCorrectResponseSession(questio
207
209
  _question$shapes = _question$shapes === void 0 ? {} : _question$shapes;
208
210
  var _question$shapes$rect = _question$shapes.rectangles,
209
211
  rectangles = _question$shapes$rect === void 0 ? [] : _question$shapes$rect,
212
+ _question$shapes$circ = _question$shapes.circles,
213
+ circles = _question$shapes$circ === void 0 ? [] : _question$shapes$circ,
210
214
  _question$shapes$poly = _question$shapes.polygons,
211
215
  polygons = _question$shapes$poly === void 0 ? {} : _question$shapes$poly;
212
216
  var rectangleCorrect = returnShapesCorrect(rectangles);
213
217
  var polygonsCorrect = returnShapesCorrect(polygons);
218
+ var circlesCorrect = returnShapesCorrect(circles);
214
219
  resolve({
215
- answers: [].concat((0, _toConsumableArray2["default"])(rectangleCorrect), (0, _toConsumableArray2["default"])(polygonsCorrect)),
220
+ answers: [].concat((0, _toConsumableArray2["default"])(rectangleCorrect), (0, _toConsumableArray2["default"])(polygonsCorrect), (0, _toConsumableArray2["default"])(circlesCorrect)),
216
221
  id: '1'
217
222
  });
218
223
  } else {
@@ -1 +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","Promise","resolve","out","disabled","mode","map","index","rectProps","polyProps","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","validate","minShapes","maxShapes","maxSelections","errors","allShapes","Object","values","reduce","acc","nbOfSelections","nbOfShapes","shapesError","selectionsError"],"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 { imageUrl, dimensions, hotspotColor, multipleCorrect, outlineColor, partialScoring, prompt, shapes, language } =\n normalizedQuestion;\n const { rectangles, polygons } = 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 },\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)) {\n return 0;\n }\n\n const { shapes: { rectangles = [], polygons = [] } = {} } = 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];\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 = [], polygons = {} } = {} } = question;\n\n const rectangleCorrect = returnShapesCorrect(rectangles);\n const polygonsCorrect = returnShapesCorrect(polygons);\n\n resolve({\n answers: [...rectangleCorrect, ...polygonsCorrect],\n id: '1',\n });\n } else {\n resolve(null);\n }\n });\n};\n\nexport const validate = (model = {}, config = {}) => {\n const { shapes } = model;\n const { minShapes = 2, maxShapes, maxSelections } = config;\n const errors = {};\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.shapesError = `There should be at least ${minShapes} shapes defined.`;\n } else if (nbOfShapes > maxShapes) {\n errors.shapesError = `No more than ${maxShapes} shapes should be defined.`;\n }\n\n if (nbOfSelections < 1) {\n errors.selectionsError = 'There should be at least 1 shape selected.';\n } else if (nbOfSelections > maxSelections) {\n errors.selectionsError = `No more than ${maxSelections} shapes should be selected.`;\n }\n\n return errors;\n};\n"],"file":"index.js"}
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","Promise","resolve","out","disabled","mode","map","index","rectProps","polyProps","responseCorrect","undefined","role","rationale","rationaleEnabled","teacherInstructions","teacherInstructionsEnabled","promptEnabled","strokeWidth","createDefaultModel","getScore","config","answers","circles","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","validate","minShapes","maxShapes","maxSelections","errors","allShapes","Object","values","reduce","acc","nbOfSelections","nbOfShapes","shapesError","selectionsError"],"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 } = 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 },\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)) {\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\nexport const validate = (model = {}, config = {}) => {\n const { shapes } = model;\n const { minShapes = 2, maxShapes, maxSelections } = config;\n const errors = {};\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.shapesError = `There should be at least ${minShapes} shapes defined.`;\n } else if (nbOfShapes > maxShapes) {\n errors.shapesError = `No more than ${maxShapes} shapes should be defined.`;\n }\n\n if (nbOfSelections < 1) {\n errors.selectionsError = 'There should be at least 1 shape selected.';\n } else if (nbOfSelections > maxSelections) {\n errors.selectionsError = `No more than ${maxSelections} shapes should be selected.`;\n }\n\n return errors;\n};\n"],"file":"index.js"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@pie-element/hotspot-controller",
3
3
  "private": true,
4
- "version": "4.1.4",
4
+ "version": "4.2.0",
5
5
  "description": "",
6
6
  "scripts": {
7
7
  "test": "echo \"Error: no test specified\" && exit 1"
@@ -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.5.2",
14
+ "@pie-lib/pie-toolbox": "1.5.6",
15
15
  "debug": "^4.1.1",
16
16
  "lodash": "^4.17.15"
17
17
  }
@@ -15,8 +15,17 @@ export const normalize = (question) => ({
15
15
 
16
16
  export function model(question, session, env) {
17
17
  const normalizedQuestion = normalize(question);
18
- const { imageUrl, dimensions, hotspotColor, multipleCorrect, outlineColor, partialScoring, prompt, shapes, language } =
19
- normalizedQuestion;
18
+ const {
19
+ imageUrl,
20
+ dimensions,
21
+ hotspotColor,
22
+ multipleCorrect,
23
+ outlineColor,
24
+ partialScoring,
25
+ prompt,
26
+ shapes,
27
+ language,
28
+ } = normalizedQuestion;
20
29
  const { rectangles, polygons } = shapes || {};
21
30
 
22
31
  return new Promise((resolve) => {
@@ -73,7 +82,7 @@ const getScore = (config, session, env = {}) => {
73
82
  return 0;
74
83
  }
75
84
 
76
- const { shapes: { rectangles = [], polygons = [] } = {} } = config;
85
+ const { shapes: { rectangles = [], polygons = [], circles = [] } = {} } = config;
77
86
  const partialScoringEnabled = partialScoring.enabled(config, env);
78
87
 
79
88
  if (!partialScoringEnabled) {
@@ -83,7 +92,7 @@ const getScore = (config, session, env = {}) => {
83
92
  let correctAnswers = 0;
84
93
  let selectedChoices = 0;
85
94
 
86
- const choices = [...rectangles, ...polygons];
95
+ const choices = [...rectangles, ...polygons, ...circles];
87
96
 
88
97
  const correctChoices = choices.filter((choice) => choice.correct);
89
98
 
@@ -140,13 +149,14 @@ const returnShapesCorrect = (shapes) => {
140
149
  export const createCorrectResponseSession = (question, env) => {
141
150
  return new Promise((resolve) => {
142
151
  if (env.mode !== 'evaluate' && env.role === 'instructor') {
143
- const { shapes: { rectangles = [], polygons = {} } = {} } = question;
152
+ const { shapes: { rectangles = [], circles = [], polygons = {} } = {} } = question;
144
153
 
145
154
  const rectangleCorrect = returnShapesCorrect(rectangles);
146
155
  const polygonsCorrect = returnShapesCorrect(polygons);
156
+ const circlesCorrect = returnShapesCorrect(circles);
147
157
 
148
158
  resolve({
149
- answers: [...rectangleCorrect, ...polygonsCorrect],
159
+ answers: [...rectangleCorrect, ...polygonsCorrect, ...circlesCorrect],
150
160
  id: '1',
151
161
  });
152
162
  } else {
@@ -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