@pie-element/hotspot 4.8.1 → 4.8.4-next.1014
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/CHANGELOG.md +162 -0
- package/configure/CHANGELOG.md +146 -0
- package/configure/lib/defaults.js +17 -0
- package/configure/lib/defaults.js.map +1 -1
- package/configure/lib/hotspot-container.js +18 -6
- package/configure/lib/hotspot-container.js.map +1 -1
- package/configure/lib/hotspot-drawable.js +11 -5
- package/configure/lib/hotspot-drawable.js.map +1 -1
- package/configure/lib/hotspot-palette.js +1 -1
- package/configure/lib/hotspot-palette.js.map +1 -1
- package/configure/lib/hotspot-polygon.js +1 -1
- package/configure/lib/hotspot-polygon.js.map +1 -1
- package/configure/lib/hotspot-rectangle.js +1 -1
- package/configure/lib/hotspot-rectangle.js.map +1 -1
- package/configure/lib/index.js +3 -3
- package/configure/lib/index.js.map +1 -1
- package/configure/lib/root.js +96 -13
- package/configure/lib/root.js.map +1 -1
- package/configure/lib/utils.js +18 -4
- package/configure/lib/utils.js.map +1 -1
- package/configure/package.json +3 -3
- package/configure/src/__tests__/__snapshots__/hotspot-container.test.js.snap +1 -0
- package/configure/src/__tests__/__snapshots__/root.test.js.snap +48 -4
- package/configure/src/defaults.js +17 -0
- package/configure/src/hotspot-container.jsx +10 -1
- package/configure/src/hotspot-drawable.jsx +8 -2
- package/configure/src/root.jsx +80 -9
- package/configure/src/utils.js +23 -1
- package/controller/CHANGELOG.md +27 -0
- package/controller/lib/index.js +44 -5
- package/controller/lib/index.js.map +1 -1
- package/controller/lib/utils.js.map +1 -1
- package/controller/package.json +1 -1
- package/controller/src/index.js +26 -0
- package/docs/config-schema.json +196 -0
- package/docs/config-schema.json.md +153 -0
- package/docs/demo/generate.js +1 -0
- package/docs/pie-schema.json +53 -0
- package/docs/pie-schema.json.md +43 -0
- package/lib/hotspot/container.js +33 -4
- package/lib/hotspot/container.js.map +1 -1
- package/lib/hotspot/image.js +35 -8
- package/lib/hotspot/image.js.map +1 -1
- package/lib/hotspot/index.js +61 -17
- package/lib/hotspot/index.js.map +1 -1
- package/lib/hotspot/polygon.js +16 -17
- package/lib/hotspot/polygon.js.map +1 -1
- package/lib/hotspot/rectangle.js +16 -17
- package/lib/hotspot/rectangle.js.map +1 -1
- package/lib/index.js +4 -1
- package/lib/index.js.map +1 -1
- package/lib/session-updater.js.map +1 -1
- package/package.json +4 -4
- package/src/__tests__/image-test.jsx +9 -1
- package/src/__tests__/polygon-test.jsx +2 -1
- package/src/__tests__/rectangle-test.jsx +2 -1
- package/src/hotspot/container.jsx +34 -2
- package/src/hotspot/image.jsx +29 -12
- package/src/hotspot/index.jsx +54 -6
- package/src/hotspot/polygon.jsx +11 -15
- package/src/hotspot/rectangle.jsx +11 -15
- package/src/index.js +5 -0
package/lib/hotspot/rectangle.js
CHANGED
|
@@ -35,7 +35,7 @@ var _icons = require("./icons");
|
|
|
35
35
|
|
|
36
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
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 {
|
|
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
39
|
|
|
40
40
|
var RectComponent = /*#__PURE__*/function (_React$Component) {
|
|
41
41
|
(0, _inherits2["default"])(RectComponent, _React$Component);
|
|
@@ -78,17 +78,6 @@ var RectComponent = /*#__PURE__*/function (_React$Component) {
|
|
|
78
78
|
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "getOutlineWidth", function (selected, strokeWidth) {
|
|
79
79
|
return selected ? strokeWidth : 0;
|
|
80
80
|
});
|
|
81
|
-
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "getEvaluateText", function (isCorrect, selected) {
|
|
82
|
-
if (selected && isCorrect) {
|
|
83
|
-
return 'Correctly\nselected';
|
|
84
|
-
} else if (selected && !isCorrect) {
|
|
85
|
-
return 'Incorrectly\nselected';
|
|
86
|
-
} else if (!selected && isCorrect) {
|
|
87
|
-
return 'Correctly\nunselected';
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
return 'Incorrectly\nunselected';
|
|
91
|
-
});
|
|
92
81
|
return _this;
|
|
93
82
|
}
|
|
94
83
|
|
|
@@ -106,7 +95,9 @@ var RectComponent = /*#__PURE__*/function (_React$Component) {
|
|
|
106
95
|
width = _this$props2.width,
|
|
107
96
|
x = _this$props2.x,
|
|
108
97
|
y = _this$props2.y,
|
|
109
|
-
|
|
98
|
+
evaluateText = _this$props2.evaluateText,
|
|
99
|
+
strokeWidth = _this$props2.strokeWidth,
|
|
100
|
+
scale = _this$props2.scale;
|
|
110
101
|
var outlineColorParsed = isEvaluateMode ? this.getEvaluateOutlineColor(isCorrect, outlineColor) : outlineColor;
|
|
111
102
|
var outlineWidth = this.getOutlineWidth(selected, strokeWidth);
|
|
112
103
|
var iconX = x + width / 2 - 10;
|
|
@@ -127,7 +118,10 @@ var RectComponent = /*#__PURE__*/function (_React$Component) {
|
|
|
127
118
|
iconSrc = _icons.faWrong;
|
|
128
119
|
}
|
|
129
120
|
|
|
130
|
-
return /*#__PURE__*/_react["default"].createElement(_reactKonva.Group,
|
|
121
|
+
return /*#__PURE__*/_react["default"].createElement(_reactKonva.Group, {
|
|
122
|
+
scaleX: scale,
|
|
123
|
+
scaleY: scale
|
|
124
|
+
}, /*#__PURE__*/_react["default"].createElement(_reactKonva.Rect, {
|
|
131
125
|
classes: classes.base,
|
|
132
126
|
width: width,
|
|
133
127
|
height: height,
|
|
@@ -144,7 +138,8 @@ var RectComponent = /*#__PURE__*/function (_React$Component) {
|
|
|
144
138
|
}), isEvaluateMode && iconSrc ? /*#__PURE__*/_react["default"].createElement(_image["default"], {
|
|
145
139
|
src: iconSrc,
|
|
146
140
|
x: iconX,
|
|
147
|
-
y: iconY
|
|
141
|
+
y: iconY,
|
|
142
|
+
tooltip: evaluateText
|
|
148
143
|
}) : null);
|
|
149
144
|
}
|
|
150
145
|
}]);
|
|
@@ -175,11 +170,15 @@ RectComponent.propTypes = {
|
|
|
175
170
|
width: _propTypes["default"].number.isRequired,
|
|
176
171
|
x: _propTypes["default"].number.isRequired,
|
|
177
172
|
y: _propTypes["default"].number.isRequired,
|
|
178
|
-
|
|
173
|
+
evaluateText: _propTypes["default"].string,
|
|
174
|
+
strokeWidth: _propTypes["default"].number,
|
|
175
|
+
scale: _propTypes["default"].number
|
|
179
176
|
};
|
|
180
177
|
RectComponent.defaultProps = {
|
|
181
178
|
isCorrect: false,
|
|
182
|
-
|
|
179
|
+
evaluateText: null,
|
|
180
|
+
strokeWidth: 5,
|
|
181
|
+
scale: 1
|
|
183
182
|
};
|
|
184
183
|
|
|
185
184
|
var _default = (0, _styles.withStyles)(styles)(RectComponent);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/hotspot/rectangle.jsx"],"names":["RectComponent","props","e","onClick","id","selected","disabled","cancelBubble","document","body","style","cursor","isCorrect","outlineColor","strokeWidth","classes","height","hotspotColor","isEvaluateMode","width","x","y","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":";;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AAEA;;AACA;;;;;;IAEMA,a;;;;;AACJ,yBAAYC,KAAZ,EAAmB;AAAA;;AAAA;AACjB,8BAAMA,KAAN;AADiB,oGAIL,UAACC,CAAD,EAAO;
|
|
1
|
+
{"version":3,"sources":["../../src/hotspot/rectangle.jsx"],"names":["RectComponent","props","e","onClick","id","selected","disabled","cancelBubble","document","body","style","cursor","isCorrect","outlineColor","strokeWidth","classes","height","hotspotColor","isEvaluateMode","width","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 { Rect, Group } from 'react-konva';\nimport { withStyles } from '@material-ui/core/styles';\n\nimport Image from './image';\nimport { faCorrect, faWrong } from './icons';\n\nclass RectComponent 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, outlineColor) => isCorrect ? outlineColor : 'red';\n\n getOutlineWidth = (selected, strokeWidth) => selected ? strokeWidth : 0;\n\n render() {\n const {\n classes,\n height,\n hotspotColor,\n isCorrect,\n isEvaluateMode,\n outlineColor,\n selected,\n width,\n x,\n y,\n evaluateText,\n strokeWidth,\n scale\n } = this.props;\n\n const outlineColorParsed = isEvaluateMode\n ? this.getEvaluateOutlineColor(isCorrect, outlineColor)\n : outlineColor;\n\n const outlineWidth = this.getOutlineWidth(selected, strokeWidth);\n\n const iconX = (x + (width / 2)) - 10;\n const iconY = (y + (height / 2)) - 10;\n\n // Correctly selected hotspot: white checkmark in green circle (plus the selected hotspot will have a heavy outline, as on “Gather”)\n // Correctly not selected hotspot: none\n // Incorrectly selected hostpot: white “X” in red circle, plus the heavy outline around the selection should appear in red\n // Incorrectly not selected hotspot: white “X” in red circle\n let iconSrc;\n\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 return (\n <Group scaleX={scale} scaleY={scale}>\n <Rect\n classes={classes.base}\n width={width}\n height={height}\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) ? (\n <Image\n src={iconSrc}\n x={iconX}\n y={iconY}\n tooltip={evaluateText}\n />\n ): null}\n </Group>\n );\n }\n}\n\nconst styles = () => ({\n base: {\n cursor: 'pointer',\n opacity: 0.5,\n position: 'relative'\n },\n});\n\nRectComponent.propTypes = {\n classes: PropTypes.object.isRequired,\n height: 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 width: PropTypes.number.isRequired,\n x: PropTypes.number.isRequired,\n y: PropTypes.number.isRequired,\n evaluateText: PropTypes.string,\n strokeWidth: PropTypes.number,\n scale: PropTypes.number\n};\n\nRectComponent.defaultProps = {\n isCorrect: false,\n evaluateText: null,\n strokeWidth: 5,\n scale: 1\n};\n\nexport default withStyles(styles)(RectComponent);\n"],"file":"rectangle.js"}
|
package/lib/index.js
CHANGED
|
@@ -33,7 +33,7 @@ var _sessionUpdater = require("./session-updater");
|
|
|
33
33
|
|
|
34
34
|
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); }; }
|
|
35
35
|
|
|
36
|
-
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try {
|
|
36
|
+
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; } }
|
|
37
37
|
|
|
38
38
|
var Hotspot = /*#__PURE__*/function (_HTMLElement) {
|
|
39
39
|
(0, _inherits2["default"])(Hotspot, _HTMLElement);
|
|
@@ -64,6 +64,9 @@ var Hotspot = /*#__PURE__*/function (_HTMLElement) {
|
|
|
64
64
|
}
|
|
65
65
|
}, {
|
|
66
66
|
key: "session",
|
|
67
|
+
get: function get() {
|
|
68
|
+
return this._session;
|
|
69
|
+
},
|
|
67
70
|
set: function set(s) {
|
|
68
71
|
if (s && !s.answers) {
|
|
69
72
|
s.answers = [];
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.js"],"names":["Hotspot","m","_model","dispatchEvent","ModelSetEvent","tagName","toLowerCase","isComplete","_render","_session","Array","isArray","answers","length","s","data","SessionChangedEvent","el","React","createElement","HotspotComponent","model","session","onSelectChoice","bind","ReactDOM","render","HTMLElement"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AAKA;;AACA;;;;;;IAEqBA,O;;;;;;;;;;;;SACnB,aAAUC,CAAV,EAAa;AACX,WAAKC,MAAL,GAAcD,CAAd;AAEA,WAAKE,aAAL,CACE,IAAIC,8BAAJ,CACE,KAAKC,OAAL,CAAaC,WAAb,EADF,EAEE,KAAKC,UAAL,EAFF,EAGE,CAAC,CAAC,KAAKL,MAHT,CADF;;AAOA,WAAKM,OAAL;AACD;;;WAED,sBAAa;AACX,UAAI,CAAC,KAAKC,QAAV,EAAoB;AAClB,eAAO,KAAP;AACD;;AAED,aACEC,KAAK,CAACC,OAAN,CAAc,KAAKF,QAAL,CAAcG,OAA5B,KAAwC,KAAKH,QAAL,CAAcG,OAAd,CAAsBC,MAAtB,GAA+B,CADzE;AAGD;;;
|
|
1
|
+
{"version":3,"sources":["../src/index.js"],"names":["Hotspot","m","_model","dispatchEvent","ModelSetEvent","tagName","toLowerCase","isComplete","_render","_session","Array","isArray","answers","length","s","data","SessionChangedEvent","el","React","createElement","HotspotComponent","model","session","onSelectChoice","bind","ReactDOM","render","HTMLElement"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AAKA;;AACA;;;;;;IAEqBA,O;;;;;;;;;;;;SACnB,aAAUC,CAAV,EAAa;AACX,WAAKC,MAAL,GAAcD,CAAd;AAEA,WAAKE,aAAL,CACE,IAAIC,8BAAJ,CACE,KAAKC,OAAL,CAAaC,WAAb,EADF,EAEE,KAAKC,UAAL,EAFF,EAGE,CAAC,CAAC,KAAKL,MAHT,CADF;;AAOA,WAAKM,OAAL;AACD;;;WAED,sBAAa;AACX,UAAI,CAAC,KAAKC,QAAV,EAAoB;AAClB,eAAO,KAAP;AACD;;AAED,aACEC,KAAK,CAACC,OAAN,CAAc,KAAKF,QAAL,CAAcG,OAA5B,KAAwC,KAAKH,QAAL,CAAcG,OAAd,CAAsBC,MAAtB,GAA+B,CADzE;AAGD;;;SAWD,eAAc;AACZ,aAAO,KAAKJ,QAAZ;AACD,K;SAXD,aAAYK,CAAZ,EAAe;AACb,UAAIA,CAAC,IAAI,CAACA,CAAC,CAACF,OAAZ,EAAqB;AACnBE,QAAAA,CAAC,CAACF,OAAF,GAAY,EAAZ;AACD;;AAED,WAAKH,QAAL,GAAgBK,CAAhB;;AACA,WAAKN,OAAL;AACD;;;WAMD,wBAAeO,IAAf,EAAqB;AACnB,8CAAmB,KAAKN,QAAxB,EAAkC,KAAKP,MAAvC,EAA+Ca,IAA/C;AAEA,WAAKZ,aAAL,CACE,IAAIa,oCAAJ,CAAwB,KAAKX,OAAL,CAAaC,WAAb,EAAxB,EAAoD,KAAKC,UAAL,EAApD,CADF;;AAIA,WAAKC,OAAL;AACD;;;WAED,6BAAoB;AAClB,WAAKA,OAAL;AACD;;;WAED,mBAAU;AAAA;;AACR,UAAI,KAAKN,MAAL,IAAe,KAAKO,QAAxB,EAAkC;AAChC,YAAMQ,EAAE,gBAAGC,kBAAMC,aAAN,CAAoBC,mBAApB,EAAsC;AAC/CC,UAAAA,KAAK,EAAE,KAAKnB,MADmC;AAE/CoB,UAAAA,OAAO,EAAE,KAAKb,QAFiC;AAG/Cc,UAAAA,cAAc,EAAE,KAAKA,cAAL,CAAoBC,IAApB,CAAyB,IAAzB;AAH+B,SAAtC,CAAX;;AAMAC,6BAASC,MAAT,CAAgBT,EAAhB,EAAoB,IAApB,EAA0B,YAAM;AAC9B,yCAAW,KAAX;AACD,SAFD;AAGD;AACF;;;kDA/DkCU,W","sourcesContent":["import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { renderMath } from '@pie-lib/math-rendering';\nimport {\n SessionChangedEvent,\n ModelSetEvent\n} from '@pie-framework/pie-player-events';\n\nimport HotspotComponent from './hotspot';\nimport { updateSessionValue } from './session-updater';\n\nexport default class Hotspot extends HTMLElement {\n set model(m) {\n this._model = m;\n\n this.dispatchEvent(\n new ModelSetEvent(\n this.tagName.toLowerCase(),\n this.isComplete(),\n !!this._model\n )\n );\n this._render();\n }\n\n isComplete() {\n if (!this._session) {\n return false;\n }\n\n return (\n Array.isArray(this._session.answers) && this._session.answers.length > 0\n );\n }\n\n set session(s) {\n if (s && !s.answers) {\n s.answers = [];\n }\n\n this._session = s;\n this._render();\n }\n\n get session() {\n return this._session;\n }\n\n onSelectChoice(data) {\n updateSessionValue(this._session, this._model, data);\n\n this.dispatchEvent(\n new SessionChangedEvent(this.tagName.toLowerCase(), this.isComplete())\n );\n\n this._render();\n }\n\n connectedCallback() {\n this._render();\n }\n\n _render() {\n if (this._model && this._session) {\n const el = React.createElement(HotspotComponent, {\n model: this._model,\n session: this._session,\n onSelectChoice: this.onSelectChoice.bind(this)\n });\n\n ReactDOM.render(el, this, () => {\n renderMath(this);\n });\n }\n }\n}\n"],"file":"index.js"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/session-updater.js"],"names":["updateSessionValue","session","model","data","id","selected","multipleCorrect","answers","filter","answer","item","push"],"mappings":";;;;;;;AAAO,SAASA,kBAAT,CAA4BC,OAA5B,EAAqCC,KAArC,EAA4CC,IAA5C,EAAkD;
|
|
1
|
+
{"version":3,"sources":["../src/session-updater.js"],"names":["updateSessionValue","session","model","data","id","selected","multipleCorrect","answers","filter","answer","item","push"],"mappings":";;;;;;;AAAO,SAASA,kBAAT,CAA4BC,OAA5B,EAAqCC,KAArC,EAA4CC,IAA5C,EAAkD;AACvD,MAAQC,EAAR,GAAyBD,IAAzB,CAAQC,EAAR;AAAA,MAAYC,QAAZ,GAAyBF,IAAzB,CAAYE,QAAZ;AACA,MAAQC,eAAR,GAA4BJ,KAA5B,CAAQI,eAAR;AACAL,EAAAA,OAAO,CAACM,OAAR,GAAkBN,OAAO,CAACM,OAAR,IAAmB,EAArC;;AAEA,MAAI,CAACF,QAAL,EAAe;AACbJ,IAAAA,OAAO,CAACM,OAAR,GAAkBN,OAAO,CAACM,OAAR,CAAgBC,MAAhB,CAAuB,UAAAC,MAAM;AAAA,aAAIA,MAAM,CAACL,EAAP,KAAcA,EAAlB;AAAA,KAA7B,CAAlB;AACD,GAFD,MAEO;AACL,QAAMM,IAAI,GAAG;AAAEN,MAAAA,EAAE,EAAFA;AAAF,KAAb;;AACA,QAAIE,eAAJ,EAAqB;AACnBL,MAAAA,OAAO,CAACM,OAAR,CAAgBI,IAAhB,CAAqBD,IAArB;AACD,KAFD,MAEO;AACLT,MAAAA,OAAO,CAACM,OAAR,GAAkB,CAACG,IAAD,CAAlB;AACD;AACF;AACF","sourcesContent":["export function updateSessionValue(session, model, data) {\n const { id, selected } = data;\n const { multipleCorrect } = model;\n session.answers = session.answers || [];\n\n if (!selected) {\n session.answers = session.answers.filter(answer => answer.id !== id);\n } else {\n const item = { id };\n if (multipleCorrect) {\n session.answers.push(item);\n } else {\n session.answers = [item];\n }\n }\n}\n"],"file":"session-updater.js"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pie-element/hotspot",
|
|
3
|
-
"version": "4.8.
|
|
3
|
+
"version": "4.8.4-next.1014+b002895e2",
|
|
4
4
|
"description": "",
|
|
5
5
|
"repository": "pie-framework/pie-elements",
|
|
6
6
|
"publishConfig": {
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
"dependencies": {
|
|
10
10
|
"@material-ui/core": "^3.9.3",
|
|
11
11
|
"@pie-framework/pie-player-events": "^0.1.0",
|
|
12
|
-
"@pie-lib/math-rendering": "^2.3
|
|
13
|
-
"@pie-lib/render-ui": "^4.
|
|
12
|
+
"@pie-lib/math-rendering": "^2.4.3",
|
|
13
|
+
"@pie-lib/render-ui": "^4.12.9",
|
|
14
14
|
"konva": "^3.2.5",
|
|
15
15
|
"prop-types": "^15.6.1",
|
|
16
16
|
"react": "^16.8.1",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
},
|
|
20
20
|
"author": "pie framework developers",
|
|
21
21
|
"license": "ISC",
|
|
22
|
-
"gitHead": "
|
|
22
|
+
"gitHead": "b002895e29dec43623f303053f9a2bbefe276040",
|
|
23
23
|
"scripts": {
|
|
24
24
|
"postpublish": "../../scripts/postpublish"
|
|
25
25
|
},
|
|
@@ -16,7 +16,8 @@ describe('Image', () => {
|
|
|
16
16
|
{
|
|
17
17
|
x: 5,
|
|
18
18
|
y: 5,
|
|
19
|
-
src: ''
|
|
19
|
+
src: '',
|
|
20
|
+
tooltip: null
|
|
20
21
|
},
|
|
21
22
|
opts
|
|
22
23
|
);
|
|
@@ -42,5 +43,12 @@ describe('Image', () => {
|
|
|
42
43
|
expect(toJson(wrapper)).toMatchSnapshot();
|
|
43
44
|
});
|
|
44
45
|
});
|
|
46
|
+
|
|
47
|
+
describe('tooltip', () => {
|
|
48
|
+
it('renders', () => {
|
|
49
|
+
const wrapper = mkWrapper({ tooltip: 'Correctly\nselected' });
|
|
50
|
+
expect(toJson(wrapper)).toMatchSnapshot();
|
|
51
|
+
});
|
|
52
|
+
});
|
|
45
53
|
});
|
|
46
54
|
});
|
|
@@ -22,6 +22,7 @@ describe('Polygon', () => {
|
|
|
22
22
|
id: '1',
|
|
23
23
|
isCorrect: false,
|
|
24
24
|
isEvaluateMode: false,
|
|
25
|
+
evaluateText: null,
|
|
25
26
|
disabled: false,
|
|
26
27
|
outlineColor: 'blue',
|
|
27
28
|
selected: false,
|
|
@@ -68,7 +69,7 @@ describe('Polygon', () => {
|
|
|
68
69
|
|
|
69
70
|
describe('evaluate with correct answer', () => {
|
|
70
71
|
it('renders', () => {
|
|
71
|
-
const wrapper = mkWrapper({ isEvaluateMode: true, isCorrect: true });
|
|
72
|
+
const wrapper = mkWrapper({ isEvaluateMode: true, isCorrect: true, evaluateText: 'Correctly\nselected' });
|
|
72
73
|
expect(toJson(wrapper)).toMatchSnapshot();
|
|
73
74
|
});
|
|
74
75
|
});
|
|
@@ -22,6 +22,7 @@ describe('Rectangle', () => {
|
|
|
22
22
|
id: '1',
|
|
23
23
|
isCorrect: false,
|
|
24
24
|
isEvaluateMode: false,
|
|
25
|
+
evaluateText: null,
|
|
25
26
|
disabled: false,
|
|
26
27
|
outlineColor: 'blue',
|
|
27
28
|
selected: false,
|
|
@@ -69,7 +70,7 @@ describe('Rectangle', () => {
|
|
|
69
70
|
|
|
70
71
|
describe('evaluate with correct answer', () => {
|
|
71
72
|
it('renders', () => {
|
|
72
|
-
const wrapper = mkWrapper({ isEvaluateMode: true, isCorrect: true });
|
|
73
|
+
const wrapper = mkWrapper({ isEvaluateMode: true, isCorrect: true, evaluateText: 'Correctly\nselected' });
|
|
73
74
|
expect(toJson(wrapper)).toMatchSnapshot();
|
|
74
75
|
});
|
|
75
76
|
});
|
|
@@ -15,10 +15,26 @@ export class Container extends React.Component {
|
|
|
15
15
|
|
|
16
16
|
correctness = (isCorrect, isChecked) => isCorrect ? isChecked : !isChecked;
|
|
17
17
|
|
|
18
|
+
getEvaluateText = (isCorrect, selected) => {
|
|
19
|
+
if (selected && isCorrect) {
|
|
20
|
+
return 'Correctly\nselected';
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (selected && !isCorrect) {
|
|
24
|
+
return 'Should not have\nbeen selected';
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (!selected && isCorrect) {
|
|
28
|
+
return 'Should have\nbeen selected';
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return null;
|
|
32
|
+
};
|
|
33
|
+
|
|
18
34
|
render() {
|
|
19
35
|
const {
|
|
20
36
|
classes,
|
|
21
|
-
dimensions: { width, height },
|
|
37
|
+
dimensions: { width: withProp, height: heightProp },
|
|
22
38
|
disabled,
|
|
23
39
|
hotspotColor,
|
|
24
40
|
imageUrl,
|
|
@@ -26,9 +42,13 @@ export class Container extends React.Component {
|
|
|
26
42
|
outlineColor,
|
|
27
43
|
onSelectChoice,
|
|
28
44
|
shapes: { rectangles, polygons },
|
|
45
|
+
scale: SCALE,
|
|
29
46
|
strokeWidth
|
|
30
47
|
} = this.props;
|
|
31
48
|
|
|
49
|
+
const width = withProp * SCALE;
|
|
50
|
+
const height = heightProp * SCALE;
|
|
51
|
+
|
|
32
52
|
return (
|
|
33
53
|
<div
|
|
34
54
|
className={classes.base}
|
|
@@ -37,6 +57,7 @@ export class Container extends React.Component {
|
|
|
37
57
|
{imageUrl ? (
|
|
38
58
|
<div className={classes.imageContainer}>
|
|
39
59
|
<img
|
|
60
|
+
alt="hotspot-image"
|
|
40
61
|
className={classes.image}
|
|
41
62
|
height="auto"
|
|
42
63
|
src={imageUrl}
|
|
@@ -56,11 +77,14 @@ export class Container extends React.Component {
|
|
|
56
77
|
{rectangles.map((shape) => {
|
|
57
78
|
const selected = this.isSelected(shape);
|
|
58
79
|
const isCorrect = isEvaluateMode ? this.correctness(shape.correct, selected) : undefined;
|
|
80
|
+
const evaluateText = isEvaluateMode ? this.getEvaluateText(shape.correct, selected) : null;
|
|
59
81
|
|
|
60
82
|
return (
|
|
61
83
|
<Rectangle
|
|
84
|
+
scale={SCALE}
|
|
62
85
|
isEvaluateMode={isEvaluateMode}
|
|
63
86
|
isCorrect={isCorrect}
|
|
87
|
+
evaluateText={evaluateText}
|
|
64
88
|
disabled={disabled}
|
|
65
89
|
selected={selected}
|
|
66
90
|
height={shape.height}
|
|
@@ -79,11 +103,14 @@ export class Container extends React.Component {
|
|
|
79
103
|
{polygons.map((polygon) => {
|
|
80
104
|
const selected = this.isSelected(polygon);
|
|
81
105
|
const isCorrect = isEvaluateMode ? this.correctness(polygon.correct, selected) : undefined;
|
|
106
|
+
const evaluateText = isEvaluateMode ? this.getEvaluateText(polygon.correct, selected) : null;
|
|
82
107
|
|
|
83
108
|
return (
|
|
84
109
|
<Polygon
|
|
110
|
+
scale={SCALE}
|
|
85
111
|
isEvaluateMode={isEvaluateMode}
|
|
86
112
|
isCorrect={!!isCorrect}
|
|
113
|
+
evaluateText={evaluateText}
|
|
87
114
|
disabled={disabled}
|
|
88
115
|
selected={selected}
|
|
89
116
|
hotspotColor={hotspotColor}
|
|
@@ -145,7 +172,12 @@ Container.propTypes = {
|
|
|
145
172
|
outlineColor:PropTypes.string.isRequired,
|
|
146
173
|
session:PropTypes.object.isRequired,
|
|
147
174
|
shapes:PropTypes.object.isRequired,
|
|
148
|
-
strokeWidth: PropTypes.number
|
|
175
|
+
strokeWidth: PropTypes.number,
|
|
176
|
+
scale: PropTypes.number
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
Container.defaultProps = {
|
|
180
|
+
scale: 1
|
|
149
181
|
};
|
|
150
182
|
|
|
151
183
|
export default withStyles(styles)(Container);
|
package/src/hotspot/image.jsx
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import PropTypes from 'prop-types';
|
|
3
|
-
import { Image } from 'react-konva';
|
|
3
|
+
import { Group, Image, Text, Tag, Label } from 'react-konva';
|
|
4
4
|
|
|
5
5
|
class ImageComponent extends React.Component {
|
|
6
6
|
constructor(props) {
|
|
7
7
|
super(props);
|
|
8
8
|
this.state = {
|
|
9
|
-
image: null
|
|
9
|
+
image: null,
|
|
10
|
+
showTooltip: false
|
|
10
11
|
};
|
|
11
12
|
}
|
|
12
13
|
|
|
@@ -39,17 +40,32 @@ class ImageComponent extends React.Component {
|
|
|
39
40
|
};
|
|
40
41
|
|
|
41
42
|
render() {
|
|
42
|
-
const { x, y } = this.props;
|
|
43
|
-
const { image } = this.state;
|
|
43
|
+
const { x, y, tooltip } = this.props;
|
|
44
|
+
const { image, showTooltip } = this.state;
|
|
44
45
|
|
|
45
46
|
return (
|
|
46
|
-
<
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
47
|
+
<Group>
|
|
48
|
+
<Image
|
|
49
|
+
width={20}
|
|
50
|
+
height={20}
|
|
51
|
+
x={x}
|
|
52
|
+
y={y}
|
|
53
|
+
image={image}
|
|
54
|
+
onMouseEnter={() => this.setState({ showTooltip: true })}
|
|
55
|
+
onMouseLeave={() => this.setState({ showTooltip: false })}
|
|
56
|
+
/>
|
|
57
|
+
|
|
58
|
+
{showTooltip && tooltip && (
|
|
59
|
+
<Label x={x - 30} y={y + 25}>
|
|
60
|
+
<Tag
|
|
61
|
+
fill="white"
|
|
62
|
+
cornerRadius={5}
|
|
63
|
+
opacity={0.9}
|
|
64
|
+
/>
|
|
65
|
+
<Text text={tooltip} padding={5} />
|
|
66
|
+
</Label>
|
|
67
|
+
)}
|
|
68
|
+
</Group>
|
|
53
69
|
);
|
|
54
70
|
}
|
|
55
71
|
}
|
|
@@ -57,7 +73,8 @@ class ImageComponent extends React.Component {
|
|
|
57
73
|
ImageComponent.propTypes = {
|
|
58
74
|
src: PropTypes.string.isRequired,
|
|
59
75
|
x: PropTypes.number.isRequired,
|
|
60
|
-
y: PropTypes.number.isRequired
|
|
76
|
+
y: PropTypes.number.isRequired,
|
|
77
|
+
tooltip: PropTypes.string
|
|
61
78
|
};
|
|
62
79
|
|
|
63
80
|
export default ImageComponent;
|
package/src/hotspot/index.jsx
CHANGED
|
@@ -1,18 +1,56 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import PropTypes from 'prop-types';
|
|
3
3
|
import Typography from '@material-ui/core/Typography';
|
|
4
|
-
import {
|
|
5
|
-
import Container from './container';
|
|
4
|
+
import {Collapsible, hasText, PreviewPrompt} from '@pie-lib/render-ui';
|
|
6
5
|
import { withStyles } from '@material-ui/core/styles';
|
|
7
6
|
|
|
7
|
+
import Container from './container';
|
|
8
|
+
|
|
8
9
|
class HotspotComponent extends React.Component {
|
|
9
10
|
constructor(props) {
|
|
10
11
|
super(props);
|
|
11
12
|
this.state = {
|
|
12
|
-
showCorrect: false
|
|
13
|
+
showCorrect: false,
|
|
14
|
+
observer: null,
|
|
15
|
+
scale: 1
|
|
13
16
|
};
|
|
14
17
|
}
|
|
15
18
|
|
|
19
|
+
componentDidMount() {
|
|
20
|
+
this.observer = new MutationObserver((mutations) => {
|
|
21
|
+
mutations.forEach(() => {
|
|
22
|
+
const target = document.getElementById('question-container')?.style?.cssText
|
|
23
|
+
const zoom = target?.substring(
|
|
24
|
+
target.indexOf('--pie-zoom') + 11,
|
|
25
|
+
target.lastIndexOf('%')
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
const zoomParsed = zoom?.replace(/\s/g, '');
|
|
29
|
+
if (zoomParsed) {
|
|
30
|
+
const newScale = parseFloat(zoomParsed) / 100;
|
|
31
|
+
if (newScale !== this.state.scale) {
|
|
32
|
+
this.setState({
|
|
33
|
+
scale: parseFloat(zoomParsed) / 100,
|
|
34
|
+
})
|
|
35
|
+
}
|
|
36
|
+
} else if (!zoomParsed && this.state.scale !== 1) {
|
|
37
|
+
this.setState({
|
|
38
|
+
scale: 1,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
const target = document.getElementById('question-container');
|
|
45
|
+
if (target) {
|
|
46
|
+
this.observer.observe(target, { attributes : true, attributeFilter : ['style'] })
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
componentWillUnmount() {
|
|
51
|
+
this.observer?.disconnect();
|
|
52
|
+
}
|
|
53
|
+
|
|
16
54
|
onToggle = () => {
|
|
17
55
|
const { showCorrect } = this.state;
|
|
18
56
|
this.setState({ showCorrect: !showCorrect });
|
|
@@ -49,13 +87,19 @@ class HotspotComponent extends React.Component {
|
|
|
49
87
|
labels={{ hidden: 'Show Teacher Instructions', visible: 'Hide Teacher Instructions' }}
|
|
50
88
|
className={classes.collapsible}
|
|
51
89
|
>
|
|
52
|
-
<
|
|
90
|
+
<PreviewPrompt
|
|
91
|
+
className="prompt"
|
|
92
|
+
prompt={teacherInstructions}
|
|
93
|
+
/>
|
|
53
94
|
</Collapsible>
|
|
54
95
|
)
|
|
55
96
|
}
|
|
56
97
|
|
|
57
98
|
<Typography className={classes.prompt}>
|
|
58
|
-
<
|
|
99
|
+
<PreviewPrompt
|
|
100
|
+
className="prompt"
|
|
101
|
+
prompt={prompt}
|
|
102
|
+
/>
|
|
59
103
|
</Typography>
|
|
60
104
|
|
|
61
105
|
{imageUrl ? (
|
|
@@ -71,6 +115,7 @@ class HotspotComponent extends React.Component {
|
|
|
71
115
|
shapes={shapes}
|
|
72
116
|
disabled={disabled}
|
|
73
117
|
strokeWidth={strokeWidth}
|
|
118
|
+
scale={this.state.scale}
|
|
74
119
|
/>
|
|
75
120
|
) : null}
|
|
76
121
|
|
|
@@ -80,7 +125,10 @@ class HotspotComponent extends React.Component {
|
|
|
80
125
|
labels={{ hidden: 'Show Rationale', visible: 'Hide Rationale' }}
|
|
81
126
|
className={classes.collapsible}
|
|
82
127
|
>
|
|
83
|
-
<
|
|
128
|
+
<PreviewPrompt
|
|
129
|
+
className="prompt"
|
|
130
|
+
prompt={rationale}
|
|
131
|
+
/>
|
|
84
132
|
</Collapsible>
|
|
85
133
|
)
|
|
86
134
|
}
|
package/src/hotspot/polygon.jsx
CHANGED
|
@@ -55,17 +55,6 @@ class PolygonComponent extends React.Component {
|
|
|
55
55
|
|
|
56
56
|
getOutlineWidth = (selected, strokeWidth) => selected ? strokeWidth : 0;
|
|
57
57
|
|
|
58
|
-
getEvaluateText = (isCorrect, selected) => {
|
|
59
|
-
if (selected && isCorrect) {
|
|
60
|
-
return 'Correctly\nselected';
|
|
61
|
-
} else if (selected && !isCorrect) {
|
|
62
|
-
return 'Incorrectly\nselected';
|
|
63
|
-
} else if (!selected && isCorrect) {
|
|
64
|
-
return 'Correctly\nunselected';
|
|
65
|
-
}
|
|
66
|
-
return 'Incorrectly\nunselected';
|
|
67
|
-
};
|
|
68
|
-
|
|
69
58
|
render() {
|
|
70
59
|
const {
|
|
71
60
|
classes,
|
|
@@ -75,7 +64,9 @@ class PolygonComponent extends React.Component {
|
|
|
75
64
|
outlineColor,
|
|
76
65
|
selected,
|
|
77
66
|
points,
|
|
78
|
-
|
|
67
|
+
evaluateText,
|
|
68
|
+
strokeWidth,
|
|
69
|
+
scale
|
|
79
70
|
} = this.props;
|
|
80
71
|
|
|
81
72
|
const outlineColorParsed = isEvaluateMode
|
|
@@ -105,7 +96,7 @@ class PolygonComponent extends React.Component {
|
|
|
105
96
|
}
|
|
106
97
|
|
|
107
98
|
return (
|
|
108
|
-
<Group>
|
|
99
|
+
<Group scaleX={scale} scaleY={scale}>
|
|
109
100
|
<Line
|
|
110
101
|
points={pointsParsed}
|
|
111
102
|
closed={true}
|
|
@@ -124,6 +115,7 @@ class PolygonComponent extends React.Component {
|
|
|
124
115
|
src={iconSrc}
|
|
125
116
|
x={iconX}
|
|
126
117
|
y={iconY}
|
|
118
|
+
tooltip={evaluateText}
|
|
127
119
|
/>
|
|
128
120
|
): null}
|
|
129
121
|
</Group>
|
|
@@ -150,11 +142,15 @@ PolygonComponent.propTypes = {
|
|
|
150
142
|
outlineColor: PropTypes.string.isRequired,
|
|
151
143
|
points: PropTypes.array.isRequired,
|
|
152
144
|
selected: PropTypes.bool.isRequired,
|
|
153
|
-
|
|
145
|
+
evaluateText: PropTypes.string,
|
|
146
|
+
strokeWidth: PropTypes.number,
|
|
147
|
+
scale: PropTypes.number
|
|
154
148
|
};
|
|
155
149
|
|
|
156
150
|
PolygonComponent.defaultProps = {
|
|
157
|
-
|
|
151
|
+
evaluateText: null,
|
|
152
|
+
strokeWidth: 5,
|
|
153
|
+
scale: 1
|
|
158
154
|
};
|
|
159
155
|
|
|
160
156
|
export default withStyles(styles)(PolygonComponent);
|
|
@@ -36,17 +36,6 @@ class RectComponent extends React.Component {
|
|
|
36
36
|
|
|
37
37
|
getOutlineWidth = (selected, strokeWidth) => selected ? strokeWidth : 0;
|
|
38
38
|
|
|
39
|
-
getEvaluateText = (isCorrect, selected) => {
|
|
40
|
-
if (selected && isCorrect) {
|
|
41
|
-
return 'Correctly\nselected';
|
|
42
|
-
} else if (selected && !isCorrect) {
|
|
43
|
-
return 'Incorrectly\nselected';
|
|
44
|
-
} else if (!selected && isCorrect) {
|
|
45
|
-
return 'Correctly\nunselected';
|
|
46
|
-
}
|
|
47
|
-
return 'Incorrectly\nunselected';
|
|
48
|
-
};
|
|
49
|
-
|
|
50
39
|
render() {
|
|
51
40
|
const {
|
|
52
41
|
classes,
|
|
@@ -59,7 +48,9 @@ class RectComponent extends React.Component {
|
|
|
59
48
|
width,
|
|
60
49
|
x,
|
|
61
50
|
y,
|
|
62
|
-
|
|
51
|
+
evaluateText,
|
|
52
|
+
strokeWidth,
|
|
53
|
+
scale
|
|
63
54
|
} = this.props;
|
|
64
55
|
|
|
65
56
|
const outlineColorParsed = isEvaluateMode
|
|
@@ -88,7 +79,7 @@ class RectComponent extends React.Component {
|
|
|
88
79
|
}
|
|
89
80
|
|
|
90
81
|
return (
|
|
91
|
-
<Group>
|
|
82
|
+
<Group scaleX={scale} scaleY={scale}>
|
|
92
83
|
<Rect
|
|
93
84
|
classes={classes.base}
|
|
94
85
|
width={width}
|
|
@@ -109,6 +100,7 @@ class RectComponent extends React.Component {
|
|
|
109
100
|
src={iconSrc}
|
|
110
101
|
x={iconX}
|
|
111
102
|
y={iconY}
|
|
103
|
+
tooltip={evaluateText}
|
|
112
104
|
/>
|
|
113
105
|
): null}
|
|
114
106
|
</Group>
|
|
@@ -138,12 +130,16 @@ RectComponent.propTypes = {
|
|
|
138
130
|
width: PropTypes.number.isRequired,
|
|
139
131
|
x: PropTypes.number.isRequired,
|
|
140
132
|
y: PropTypes.number.isRequired,
|
|
141
|
-
|
|
133
|
+
evaluateText: PropTypes.string,
|
|
134
|
+
strokeWidth: PropTypes.number,
|
|
135
|
+
scale: PropTypes.number
|
|
142
136
|
};
|
|
143
137
|
|
|
144
138
|
RectComponent.defaultProps = {
|
|
145
139
|
isCorrect: false,
|
|
146
|
-
|
|
140
|
+
evaluateText: null,
|
|
141
|
+
strokeWidth: 5,
|
|
142
|
+
scale: 1
|
|
147
143
|
};
|
|
148
144
|
|
|
149
145
|
export default withStyles(styles)(RectComponent);
|