@pie-element/hotspot 4.8.3 → 4.8.4-next.1016

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 (68) hide show
  1. package/CHANGELOG.md +151 -0
  2. package/configure/CHANGELOG.md +135 -0
  3. package/configure/lib/defaults.js +17 -0
  4. package/configure/lib/defaults.js.map +1 -1
  5. package/configure/lib/hotspot-container.js +18 -6
  6. package/configure/lib/hotspot-container.js.map +1 -1
  7. package/configure/lib/hotspot-drawable.js +11 -5
  8. package/configure/lib/hotspot-drawable.js.map +1 -1
  9. package/configure/lib/hotspot-palette.js +1 -1
  10. package/configure/lib/hotspot-palette.js.map +1 -1
  11. package/configure/lib/hotspot-polygon.js +1 -1
  12. package/configure/lib/hotspot-polygon.js.map +1 -1
  13. package/configure/lib/hotspot-rectangle.js +1 -1
  14. package/configure/lib/hotspot-rectangle.js.map +1 -1
  15. package/configure/lib/index.js +3 -3
  16. package/configure/lib/index.js.map +1 -1
  17. package/configure/lib/root.js +96 -13
  18. package/configure/lib/root.js.map +1 -1
  19. package/configure/lib/utils.js +18 -4
  20. package/configure/lib/utils.js.map +1 -1
  21. package/configure/package.json +3 -3
  22. package/configure/src/__tests__/__snapshots__/hotspot-container.test.js.snap +1 -0
  23. package/configure/src/__tests__/__snapshots__/root.test.js.snap +48 -4
  24. package/configure/src/defaults.js +17 -0
  25. package/configure/src/hotspot-container.jsx +10 -1
  26. package/configure/src/hotspot-drawable.jsx +8 -2
  27. package/configure/src/root.jsx +80 -9
  28. package/configure/src/utils.js +23 -1
  29. package/controller/CHANGELOG.md +16 -0
  30. package/controller/lib/index.js +44 -5
  31. package/controller/lib/index.js.map +1 -1
  32. package/controller/lib/utils.js.map +1 -1
  33. package/controller/package.json +1 -1
  34. package/controller/src/index.js +26 -0
  35. package/docs/config-schema.json +196 -0
  36. package/docs/config-schema.json.md +153 -0
  37. package/docs/demo/generate.js +1 -0
  38. package/docs/pie-schema.json +53 -0
  39. package/docs/pie-schema.json.md +43 -0
  40. package/lib/hotspot/container.js +33 -4
  41. package/lib/hotspot/container.js.map +1 -1
  42. package/lib/hotspot/image.js +35 -8
  43. package/lib/hotspot/image.js.map +1 -1
  44. package/lib/hotspot/index.js +61 -17
  45. package/lib/hotspot/index.js.map +1 -1
  46. package/lib/hotspot/polygon.js +16 -17
  47. package/lib/hotspot/polygon.js.map +1 -1
  48. package/lib/hotspot/rectangle.js +16 -17
  49. package/lib/hotspot/rectangle.js.map +1 -1
  50. package/lib/index.js +4 -1
  51. package/lib/index.js.map +1 -1
  52. package/lib/session-updater.js.map +1 -1
  53. package/package.json +4 -4
  54. package/src/__tests__/image-test.jsx +9 -1
  55. package/src/__tests__/polygon-test.jsx +2 -1
  56. package/src/__tests__/rectangle-test.jsx +2 -1
  57. package/src/hotspot/container.jsx +34 -2
  58. package/src/hotspot/image.jsx +29 -12
  59. package/src/hotspot/index.jsx +54 -6
  60. package/src/hotspot/polygon.jsx +11 -15
  61. package/src/hotspot/rectangle.jsx +11 -15
  62. package/src/index.js +5 -0
  63. package/module/configure.js +0 -2340
  64. package/module/controller.js +0 -19764
  65. package/module/demo.js +0 -94
  66. package/module/element.js +0 -717
  67. package/module/index.html +0 -16
  68. package/module/manifest.json +0 -14
@@ -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 { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
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
- strokeWidth = _this$props2.strokeWidth;
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, null, /*#__PURE__*/_react["default"].createElement(_reactKonva.Rect, {
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
- strokeWidth: _propTypes["default"].number
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
- strokeWidth: 5
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":"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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 getEvaluateText = (isCorrect, selected) => {\n if (selected && isCorrect) {\n return 'Correctly\\nselected';\n } else if (selected && !isCorrect) {\n return 'Incorrectly\\nselected';\n } else if (!selected && isCorrect) {\n return 'Correctly\\nunselected';\n }\n return 'Incorrectly\\nunselected';\n };\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 strokeWidth\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>\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 />\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 strokeWidth: PropTypes.number\n};\n\nRectComponent.defaultProps = {\n isCorrect: false,\n strokeWidth: 5\n};\n\nexport default withStyles(styles)(RectComponent);\n"],"file":"rectangle.js"}
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 { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
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;;;SAED,aAAYC,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;;;WAED,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;;AAKAC,6BAASC,MAAT,CAAgBT,EAAhB,EAAoB,IAApB,EAA0B,YAAM;AAC9B,yCAAW,KAAX;AACD,SAFD;AAGD;AACF;;;kDA1DkCU,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 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 ReactDOM.render(el, this, () => {\n renderMath(this);\n });\n }\n }\n}\n"],"file":"index.js"}
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;AAAA,MAC/CC,EAD+C,GAC9BD,IAD8B,CAC/CC,EAD+C;AAAA,MAC3CC,QAD2C,GAC9BF,IAD8B,CAC3CE,QAD2C;AAAA,MAE/CC,eAF+C,GAE3BJ,KAF2B,CAE/CI,eAF+C;AAGvDL,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"}
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",
3
+ "version": "4.8.4-next.1016+1dc291af4",
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.8",
13
- "@pie-lib/render-ui": "^4.11.7",
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": "c4ade45496a17fa2a49e6fe44f6bc500ea17580f",
22
+ "gitHead": "1dc291af490cf91cc86a6a7c8d0eb0fdf184232b",
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);
@@ -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
- <Image
47
- width={20}
48
- height={20}
49
- x={x}
50
- y={y}
51
- image={image}
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;
@@ -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 { Collapsible, hasText } from '@pie-lib/render-ui';
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
- <div dangerouslySetInnerHTML={{ __html: teacherInstructions }}/>
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
- <span dangerouslySetInnerHTML={{ __html: prompt }} />
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
- <div dangerouslySetInnerHTML={{ __html: rationale }} />
128
+ <PreviewPrompt
129
+ className="prompt"
130
+ prompt={rationale}
131
+ />
84
132
  </Collapsible>
85
133
  )
86
134
  }
@@ -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
- strokeWidth
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
- strokeWidth: PropTypes.number
145
+ evaluateText: PropTypes.string,
146
+ strokeWidth: PropTypes.number,
147
+ scale: PropTypes.number
154
148
  };
155
149
 
156
150
  PolygonComponent.defaultProps = {
157
- strokeWidth: 5
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
- strokeWidth
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
- strokeWidth: PropTypes.number
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
- strokeWidth: 5
140
+ evaluateText: null,
141
+ strokeWidth: 5,
142
+ scale: 1
147
143
  };
148
144
 
149
145
  export default withStyles(styles)(RectComponent);