@pie-element/hotspot 6.3.2-next.18 → 6.3.2-next.22
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/configure/lib/DeleteWidget.js +19 -14
- package/configure/lib/DeleteWidget.js.map +1 -1
- package/configure/lib/buttons/circle.js +1 -1
- package/configure/lib/buttons/circle.js.map +1 -1
- package/configure/lib/defaults.js +2 -1
- package/configure/lib/defaults.js.map +1 -1
- package/configure/lib/hotspot-circle.js +229 -0
- package/configure/lib/hotspot-circle.js.map +1 -0
- package/configure/lib/hotspot-container.js +18 -7
- package/configure/lib/hotspot-container.js.map +1 -1
- package/configure/lib/hotspot-drawable.js +41 -14
- package/configure/lib/hotspot-drawable.js.map +1 -1
- package/configure/lib/hotspot-polygon.js +1 -2
- package/configure/lib/hotspot-polygon.js.map +1 -1
- package/configure/lib/hotspot-rectangle.js +0 -1
- package/configure/lib/hotspot-rectangle.js.map +1 -1
- package/configure/lib/index.js +8 -1
- package/configure/lib/index.js.map +1 -1
- package/configure/lib/shapes/circle.js +29 -10
- package/configure/lib/shapes/circle.js.map +1 -1
- package/configure/lib/utils.js +14 -1
- package/configure/lib/utils.js.map +1 -1
- package/configure/src/DeleteWidget.jsx +16 -8
- package/configure/src/__tests__/__snapshots__/hotspot-container.test.js.snap +25 -0
- package/configure/src/__tests__/__snapshots__/hotspot-drawable.test.js.snap +0 -9
- package/configure/src/__tests__/__snapshots__/root.test.js.snap +18 -0
- package/configure/src/__tests__/hotspot-container.test.js +58 -3
- package/configure/src/__tests__/root.test.js +17 -0
- package/configure/src/__tests__/utils.test.js +18 -3
- package/configure/src/buttons/circle.jsx +1 -1
- package/configure/src/defaults.js +1 -0
- package/configure/src/hotspot-circle.jsx +145 -0
- package/configure/src/hotspot-container.jsx +13 -6
- package/configure/src/hotspot-drawable.jsx +26 -16
- package/configure/src/hotspot-polygon.jsx +1 -8
- package/configure/src/hotspot-rectangle.jsx +1 -9
- package/configure/src/index.js +3 -2
- package/configure/src/shapes/circle.js +21 -9
- package/configure/src/utils.js +12 -0
- package/controller/lib/index.js +8 -3
- package/controller/lib/index.js.map +1 -1
- package/controller/src/index.js +16 -6
- package/lib/hotspot/circle.js +191 -0
- package/lib/hotspot/circle.js.map +1 -0
- package/lib/hotspot/container.js +34 -2
- package/lib/hotspot/container.js.map +1 -1
- package/lib/hotspot/index.js.map +1 -1
- package/package.json +2 -2
- package/src/hotspot/circle.jsx +141 -0
- package/src/hotspot/container.jsx +31 -1
- 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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
378
|
+
{...(shape.group === 'polygons' ? { points: shape.points } : {})}
|
|
369
379
|
strokeWidth={strokeWidth}
|
|
370
380
|
imageHeight={heightFromState || height}
|
|
371
381
|
imageWidth={widthFromState || width}
|
|
372
|
-
|
|
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
|
package/configure/src/index.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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
|
-
|
|
56
|
-
|
|
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,
|
package/configure/src/utils.js
CHANGED
|
@@ -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) {
|
package/controller/lib/index.js
CHANGED
|
@@ -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":";;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AAEA;;AAEA;;;;;;;;;AAEA,IAAMA,GAAG,GAAG,uBAAM,iCAAN,CAAZ;;AAEO,IAAMC,SAAS,GAAG,SAAZA,SAAY,CAACC,QAAD;AAAA,yCACpBC,oBADoB,GAEpBD,QAFoB;AAAA,CAAlB;;;;AAKA,SAASE,KAAT,CAAeF,QAAf,EAAyBG,OAAzB,EAAkCC,GAAlC,EAAuC;AAC5C,MAAMC,kBAAkB,GAAGN,SAAS,CAACC,QAAD,CAApC;AACA,MAAQM,QAAR,GACED,kBADF,CAAQC,QAAR;AAAA,MAAkBC,UAAlB,GACEF,kBADF,CAAkBE,UAAlB;AAAA,MAA8BC,YAA9B,GACEH,kBADF,CAA8BG,YAA9B;AAAA,MAA4CC,eAA5C,GACEJ,kBADF,CAA4CI,eAA5C;AAAA,MAA6DC,YAA7D,GACEL,kBADF,CAA6DK,YAA7D;AAAA,MAA2EC,cAA3E,GACEN,kBADF,CAA2EM,cAA3E;AAAA,MAA2FC,MAA3F,GACEP,kBADF,CAA2FO,MAA3F;AAAA,MAAmGC,MAAnG,GACER,kBADF,CAAmGQ,MAAnG;AAAA,MAA2GC,QAA3G,GACET,kBADF,CAA2GS,QAA3G;;AAEA,aAAiCD,MAAM,IAAI,EAA3C;AAAA,MAAQE,UAAR,QAAQA,UAAR;AAAA,MAAoBC,QAApB,QAAoBA,QAApB;;AAEA,SAAO,IAAIC,OAAJ,CAAY,UAACC,OAAD,EAAa;AAC9B,QAAMC,GAAG,GAAG;AACVC,MAAAA,QAAQ,EAAEhB,GAAG,CAACiB,IAAJ,KAAa,QADb;AAEVA,MAAAA,IAAI,EAAEjB,GAAG,CAACiB,IAFA;AAGVd,MAAAA,UAAU,EAAVA,UAHU;AAIVD,MAAAA,QAAQ,EAARA,QAJU;AAKVI,MAAAA,YAAY,EAAZA,YALU;AAMVF,MAAAA,YAAY,EAAZA,YANU;AAOVC,MAAAA,eAAe,EAAfA,eAPU;AAQVE,MAAAA,cAAc,EAAdA,cARU;AASVG,MAAAA,QAAQ,EAARA,QATU;AAUVD,MAAAA,MAAM,kCACDA,MADC;AAEJ;AACAE,QAAAA,UAAU,EAAE,CAACA,UAAU,IAAI,EAAf,EAAmBO,GAAnB,CAAuB;AAAA,cAAGC,KAAH,SAAGA,KAAH;AAAA,cAAaC,SAAb;AAAA,mCAAmCA,SAAnC;AAAA,SAAvB,CAHR;AAIJ;AACAR,QAAAA,QAAQ,EAAE,CAACA,QAAQ,IAAI,EAAb,EAAiBM,GAAjB,CAAqB;AAAA,cAAGC,KAAH,SAAGA,KAAH;AAAA,cAAaE,SAAb;AAAA,mCAAmCA,SAAnC;AAAA,SAArB;AALN,QAVI;AAiBVC,MAAAA,eAAe,EAAEtB,GAAG,CAACiB,IAAJ,KAAa,UAAb,GAA0B,8BAAkBhB,kBAAlB,EAAsCF,OAAtC,CAA1B,GAA2EwB;AAjBlF,KAAZ;;AAoBA,QAAIvB,GAAG,CAACwB,IAAJ,KAAa,YAAb,KAA8BxB,GAAG,CAACiB,IAAJ,KAAa,MAAb,IAAuBjB,GAAG,CAACiB,IAAJ,KAAa,UAAlE,CAAJ,EAAmF;AACjFF,MAAAA,GAAG,CAACU,SAAJ,GAAgBxB,kBAAkB,CAACyB,gBAAnB,GAAsCzB,kBAAkB,CAACwB,SAAzD,GAAqE,IAArF;AACAV,MAAAA,GAAG,CAACY,mBAAJ,GAA0B1B,kBAAkB,CAAC2B,0BAAnB,GACtB3B,kBAAkB,CAAC0B,mBADG,GAEtB,IAFJ;AAGD,KALD,MAKO;AACLZ,MAAAA,GAAG,CAACU,SAAJ,GAAgB,IAAhB;AACAV,MAAAA,GAAG,CAACY,mBAAJ,GAA0B,IAA1B;AACD;;AAEDZ,IAAAA,GAAG,CAACP,MAAJ,GAAaP,kBAAkB,CAAC4B,aAAnB,GAAmCrB,MAAnC,GAA4C,IAAzD;AACAO,IAAAA,GAAG,CAACe,WAAJ,GAAkB7B,kBAAkB,CAAC6B,WAArC,CAhC8B,CAkC9B;;AACAhB,IAAAA,OAAO,CAACC,GAAD,CAAP;AACD,GApCM,CAAP;AAqCD;;AAEM,IAAMgB,kBAAkB,GAAG,SAArBA,kBAAqB;AAAA,MAACjC,KAAD,uEAAS,EAAT;AAAA,SAChC,IAAIe,OAAJ,CAAY,UAACC,OAAD,EAAa;AACvBA,IAAAA,OAAO,iCACFjB,oBADE,GAEFC,KAFE,EAAP;AAID,GALD,CADgC;AAAA,CAA3B;;;;AAQP,IAAMkC,QAAQ,GAAG,SAAXA,QAAW,CAACC,MAAD,EAASlC,OAAT,EAA+B;AAAA,MAAbC,GAAa,uEAAP,EAAO;;AAC9C,cAAoBD,OAAO,IAAI,EAA/B;AAAA,MAAQmC,OAAR,SAAQA,OAAR;;AAEA,MAAI,CAACD,MAAM,CAACxB,MAAR,IAAmB,CAACwB,MAAM,CAACxB,MAAP,CAAcE,UAAf,IAA6B,CAACsB,MAAM,CAACxB,MAAP,CAAcG,QAAnE,EAA8E;AAC5E,WAAO,CAAP;AACD;;AAED,uBAA4DqB,MAA5D,CAAQxB,MAAR;AAAA,+CAAqD,EAArD;AAAA,6CAAkBE,UAAlB;AAAA,MAAkBA,UAAlB,sCAA+B,EAA/B;AAAA,6CAAmCC,QAAnC;AAAA,MAAmCA,QAAnC,sCAA8C,EAA9C;;AACA,MAAMuB,qBAAqB,GAAG5B,gCAAe6B,OAAf,CAAuBH,MAAvB,EAA+BjC,GAA/B,CAA9B;;AAEA,MAAI,CAACmC,qBAAL,EAA4B;AAC1B,WAAO,8BAAkBF,MAAlB,EAA0BlC,OAA1B,IAAqC,CAArC,GAAyC,CAAhD;AACD;;AAED,MAAIsC,cAAc,GAAG,CAArB;AACA,MAAIC,eAAe,GAAG,CAAtB;AAEA,MAAMC,OAAO,iDAAO5B,UAAP,uCAAsBC,QAAtB,EAAb;AAEA,MAAM4B,cAAc,GAAGD,OAAO,CAACE,MAAR,CAAe,UAACC,MAAD;AAAA,WAAYA,MAAM,CAACC,OAAnB;AAAA,GAAf,CAAvB;AAEAJ,EAAAA,OAAO,CAACK,OAAR,CAAgB,UAACC,KAAD,EAAW;AACzB,QAAMC,QAAQ,GAAGZ,OAAO,IAAIA,OAAO,CAACO,MAAR,CAAe,UAACM,MAAD;AAAA,aAAYA,MAAM,CAACC,EAAP,KAAcH,KAAK,CAACG,EAAhC;AAAA,KAAf,EAAmD,CAAnD,CAA5B;AACA,QAAMC,iBAAiB,GAAGJ,KAAK,CAACF,OAAN,IAAiBG,QAA3C;;AAEA,QAAIA,QAAJ,EAAc;AACZR,MAAAA,eAAe,IAAI,CAAnB;AACD;;AAED,QAAIW,iBAAJ,EAAuB;AACrBZ,MAAAA,cAAc,IAAI,CAAlB;AACD;AACF,GAXD;AAaA,MAAMa,YAAY,GAAGZ,eAAe,GAAGE,cAAc,CAACW,MAAjC,GAA0Cb,eAAe,GAAGE,cAAc,CAACW,MAA3E,GAAoF,CAAzG;AAEA,MAAMC,KAAK,GAAGZ,cAAc,CAACW,MAAf,KAA0B,CAA1B,GAA8B,CAA9B,GAAkCX,cAAc,CAACW,MAA/D;AACA,MAAME,GAAG,GAAG,CAAC,CAAChB,cAAc,GAAGa,YAAlB,IAAkCE,KAAnC,EAA0CE,OAA1C,CAAkD,CAAlD,CAAZ;AAEA,SAAOD,GAAG,GAAG,CAAN,GAAU,CAAV,GAAcE,UAAU,CAACF,GAAD,CAA/B;AACD,CAxCD;;AA0CO,SAASG,OAAT,CAAiBvB,MAAjB,EAAyBlC,OAAzB,EAA4C;AAAA,MAAVC,GAAU,uEAAJ,EAAI;AACjD,SAAO,IAAIa,OAAJ,CAAY,UAACC,OAAD,EAAa;AAC9BpB,IAAAA,GAAG,CAAC,YAAD,CAAH;;AAEA,QAAI,CAACK,OAAD,IAAY,yBAAQA,OAAR,CAAhB,EAAkC;AAChCe,MAAAA,OAAO,CAAC;AAAE2C,QAAAA,KAAK,EAAE,CAAT;AAAYC,QAAAA,KAAK,EAAE;AAAnB,OAAD,CAAP;AACD;;AAED,QAAI3D,OAAO,CAACmC,OAAZ,EAAqB;AACnB,UAAMuB,KAAK,GAAGzB,QAAQ,CAACC,MAAD,EAASlC,OAAT,EAAkBC,GAAlB,CAAtB;AACAc,MAAAA,OAAO,CAAC;AAAE2C,QAAAA,KAAK,EAALA;AAAF,OAAD,CAAP;AACD,KAHD,MAGO;AACL3C,MAAAA,OAAO,CAAC;AAAE2C,QAAAA,KAAK,EAAE,CAAT;AAAYC,QAAAA,KAAK,EAAE;AAAnB,OAAD,CAAP;AACD;AACF,GAbM,CAAP;AAcD;;AAED,IAAMC,mBAAmB,GAAG,SAAtBA,mBAAsB,CAAClD,MAAD,EAAY;AACtC,MAAIyB,OAAO,GAAG,EAAd;AAEAzB,EAAAA,MAAM,CAACmC,OAAP,CAAe,UAACgB,CAAD,EAAO;AACpB,QAAQjB,OAAR,GAAwBiB,CAAxB,CAAQjB,OAAR;AAAA,QAAiBK,EAAjB,GAAwBY,CAAxB,CAAiBZ,EAAjB;;AACA,QAAIL,OAAJ,EAAa;AACXT,MAAAA,OAAO,CAAC2B,IAAR,CAAa;AAAEb,QAAAA,EAAE,EAAFA;AAAF,OAAb;AACD;AACF,GALD;AAMA,SAAOd,OAAP;AACD,CAVD;;AAYO,IAAM4B,4BAA4B,GAAG,SAA/BA,4BAA+B,CAAClE,QAAD,EAAWI,GAAX,EAAmB;AAC7D,SAAO,IAAIa,OAAJ,CAAY,UAACC,OAAD,EAAa;AAC9B,QAAId,GAAG,CAACiB,IAAJ,KAAa,UAAb,IAA2BjB,GAAG,CAACwB,IAAJ,KAAa,YAA5C,EAA0D;AACxD,6BAA4D5B,QAA5D,CAAQa,MAAR;AAAA,uDAAqD,EAArD;AAAA,mDAAkBE,UAAlB;AAAA,UAAkBA,UAAlB,sCAA+B,EAA/B;AAAA,mDAAmCC,QAAnC;AAAA,UAAmCA,QAAnC,sCAA8C,EAA9C;AAEA,UAAMmD,gBAAgB,GAAGJ,mBAAmB,CAAChD,UAAD,CAA5C;AACA,UAAMqD,eAAe,GAAGL,mBAAmB,CAAC/C,QAAD,CAA3C;AAEAE,MAAAA,OAAO,CAAC;AACNoB,QAAAA,OAAO,gDAAM6B,gBAAN,uCAA2BC,eAA3B,EADD;AAENhB,QAAAA,EAAE,EAAE;AAFE,OAAD,CAAP;AAID,KAVD,MAUO;AACLlC,MAAAA,OAAO,CAAC,IAAD,CAAP;AACD;AACF,GAdM,CAAP;AAeD,CAhBM;;;;AAkBA,IAAMmD,QAAQ,GAAG,SAAXA,QAAW,GAA6B;AAAA,MAA5BnE,KAA4B,uEAApB,EAAoB;AAAA,MAAhBmC,MAAgB,uEAAP,EAAO;AACnD,MAAQxB,MAAR,GAAmBX,KAAnB,CAAQW,MAAR;AACA,0BAAoDwB,MAApD,CAAQiC,SAAR;AAAA,MAAQA,SAAR,kCAAoB,CAApB;AAAA,MAAuBC,SAAvB,GAAoDlC,MAApD,CAAuBkC,SAAvB;AAAA,MAAkCC,aAAlC,GAAoDnC,MAApD,CAAkCmC,aAAlC;AACA,MAAMC,MAAM,GAAG,EAAf;AAEA,MAAMC,SAAS,GAAGC,MAAM,CAACC,MAAP,CAAc/D,MAAM,IAAI,EAAxB,EAA4BgE,MAA5B,CAAmC,UAACC,GAAD,EAAM7B,KAAN;AAAA,yDAAoB6B,GAApB,uCAA4B7B,KAA5B;AAAA,GAAnC,EAAuE,EAAvE,CAAlB;AAEA,MAAM8B,cAAc,GAAG,CAACL,SAAS,IAAI,EAAd,EAAkBG,MAAlB,CAAyB,UAACC,GAAD,EAAM7B,KAAN;AAAA,WAAiBA,KAAK,CAACF,OAAN,GAAgB+B,GAAG,GAAG,CAAtB,GAA0BA,GAA3C;AAAA,GAAzB,EAA0E,CAA1E,CAAvB;AAEA,MAAME,UAAU,GAAG,CAACN,SAAS,IAAI,EAAd,EAAkBnB,MAArC;;AAEA,MAAIyB,UAAU,GAAGV,SAAjB,EAA4B;AAC1BG,IAAAA,MAAM,CAACQ,WAAP,sCAAiDX,SAAjD;AACD,GAFD,MAEO,IAAIU,UAAU,GAAGT,SAAjB,EAA4B;AACjCE,IAAAA,MAAM,CAACQ,WAAP,0BAAqCV,SAArC;AACD;;AAED,MAAIQ,cAAc,GAAG,CAArB,EAAwB;AACtBN,IAAAA,MAAM,CAACS,eAAP,GAAyB,4CAAzB;AACD,GAFD,MAEO,IAAIH,cAAc,GAAGP,aAArB,EAAoC;AACzCC,IAAAA,MAAM,CAACS,eAAP,0BAAyCV,aAAzC;AACD;;AAED,SAAOC,MAAP;AACD,CAxBM","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"}
|
package/controller/src/index.js
CHANGED
|
@@ -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 {
|
|
19
|
-
|
|
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
|
|
@@ -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"}
|