@pie-element/hotspot 4.8.4-next.137 → 4.8.4-next.1370

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 (71) hide show
  1. package/CHANGELOG.md +263 -0
  2. package/configure/CHANGELOG.md +233 -0
  3. package/configure/lib/defaults.js +20 -0
  4. package/configure/lib/defaults.js.map +1 -1
  5. package/configure/lib/hotspot-container.js +26 -12
  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 +17 -3
  16. package/configure/lib/index.js.map +1 -1
  17. package/configure/lib/root.js +107 -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 +4 -4
  22. package/configure/src/__tests__/__snapshots__/hotspot-container.test.js.snap +1 -0
  23. package/configure/src/__tests__/__snapshots__/root.test.js.snap +53 -4
  24. package/configure/src/defaults.js +20 -0
  25. package/configure/src/hotspot-container.jsx +16 -5
  26. package/configure/src/hotspot-drawable.jsx +8 -2
  27. package/configure/src/index.js +14 -0
  28. package/configure/src/root.jsx +87 -9
  29. package/configure/src/utils.js +23 -1
  30. package/controller/CHANGELOG.md +50 -0
  31. package/controller/lib/index.js +44 -5
  32. package/controller/lib/index.js.map +1 -1
  33. package/controller/lib/utils.js.map +1 -1
  34. package/controller/package.json +1 -1
  35. package/controller/src/index.js +26 -0
  36. package/docs/config-schema.json +212 -0
  37. package/docs/config-schema.json.md +165 -0
  38. package/docs/demo/generate.js +1 -0
  39. package/docs/pie-schema.json +49 -0
  40. package/docs/pie-schema.json.md +36 -0
  41. package/lib/hotspot/container.js +25 -7
  42. package/lib/hotspot/container.js.map +1 -1
  43. package/lib/hotspot/image.js +1 -1
  44. package/lib/hotspot/image.js.map +1 -1
  45. package/lib/hotspot/index.js +72 -18
  46. package/lib/hotspot/index.js.map +1 -1
  47. package/lib/hotspot/polygon.js +46 -20
  48. package/lib/hotspot/polygon.js.map +1 -1
  49. package/lib/hotspot/rectangle.js +46 -20
  50. package/lib/hotspot/rectangle.js.map +1 -1
  51. package/lib/index.js +4 -1
  52. package/lib/index.js.map +1 -1
  53. package/lib/session-updater.js.map +1 -1
  54. package/package.json +6 -4
  55. package/src/__tests__/__snapshots__/{container-test.jsx.snap → container.test.jsx.snap} +8 -0
  56. package/src/__tests__/__snapshots__/image.test.jsx.snap +43 -0
  57. package/src/__tests__/__snapshots__/{polygon-test.jsx.snap → polygon.test.jsx.snap} +11 -0
  58. package/src/__tests__/__snapshots__/{rectangle-test.jsx.snap → rectangle.test.jsx.snap} +11 -0
  59. package/src/__tests__/{container-test.jsx → container.test.jsx} +57 -0
  60. package/src/__tests__/{image-test.jsx → image.test.jsx} +0 -0
  61. package/src/__tests__/polygon.test.jsx +224 -0
  62. package/src/__tests__/rectangle.test.jsx +233 -0
  63. package/src/__tests__/{session-updater-test.jsx → session-updater.test.jsx} +0 -0
  64. package/src/hotspot/container.jsx +23 -3
  65. package/src/hotspot/index.jsx +68 -8
  66. package/src/hotspot/polygon.jsx +40 -17
  67. package/src/hotspot/rectangle.jsx +40 -17
  68. package/src/index.js +5 -0
  69. package/src/__tests__/__snapshots__/image-test.jsx.snap +0 -21
  70. package/src/__tests__/polygon-test.jsx +0 -77
  71. package/src/__tests__/rectangle-test.jsx +0 -78
@@ -29,23 +29,29 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
29
29
 
30
30
  var _editableHtml = _interopRequireDefault(require("@pie-lib/editable-html"));
31
31
 
32
+ var _styles = require("@material-ui/core/styles");
33
+
32
34
  var _Typography = _interopRequireDefault(require("@material-ui/core/Typography"));
33
35
 
34
- var _styles = require("@material-ui/core/styles");
36
+ var _Info = _interopRequireDefault(require("@material-ui/icons/Info"));
37
+
38
+ var _Tooltip = _interopRequireDefault(require("@material-ui/core/Tooltip"));
35
39
 
36
40
  var _hotspotPalette = _interopRequireDefault(require("./hotspot-palette"));
37
41
 
38
42
  var _hotspotContainer = _interopRequireDefault(require("./hotspot-container"));
39
43
 
44
+ var _classnames = _interopRequireDefault(require("classnames"));
45
+
40
46
  var _utils = require("./utils");
41
47
 
42
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
48
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
43
49
 
44
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
50
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
45
51
 
46
52
  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); }; }
47
53
 
48
- 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; } }
54
+ 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; } }
49
55
 
50
56
  var Panel = _configUi.settings.Panel,
51
57
  toggle = _configUi.settings.toggle;
@@ -105,6 +111,7 @@ var Root = /*#__PURE__*/function (_React$Component) {
105
111
  configuration = _this$props2.configuration,
106
112
  model = _this$props2.model,
107
113
  imageSupport = _this$props2.imageSupport,
114
+ uploadSoundSupport = _this$props2.uploadSoundSupport,
108
115
  onConfigurationChanged = _this$props2.onConfigurationChanged,
109
116
  onImageUpload = _this$props2.onImageUpload,
110
117
  onModelChangedByConfig = _this$props2.onModelChangedByConfig,
@@ -125,15 +132,32 @@ var Root = /*#__PURE__*/function (_React$Component) {
125
132
  teacherInstructions = _ref$teacherInstructi === void 0 ? {} : _ref$teacherInstructi,
126
133
  _ref$rationale = _ref.rationale,
127
134
  rationale = _ref$rationale === void 0 ? {} : _ref$rationale,
135
+ _ref$spellCheck = _ref.spellCheck,
136
+ spellCheck = _ref$spellCheck === void 0 ? {} : _ref$spellCheck,
128
137
  _ref$preserveAspectRa = _ref.preserveAspectRatio,
129
- preserveAspectRatio = _ref$preserveAspectRa === void 0 ? {} : _ref$preserveAspectRa;
138
+ preserveAspectRatio = _ref$preserveAspectRa === void 0 ? {} : _ref$preserveAspectRa,
139
+ _ref$maxImageWidth = _ref.maxImageWidth,
140
+ maxImageWidth = _ref$maxImageWidth === void 0 ? {} : _ref$maxImageWidth,
141
+ _ref$maxImageHeight = _ref.maxImageHeight,
142
+ maxImageHeight = _ref$maxImageHeight === void 0 ? {} : _ref$maxImageHeight,
143
+ withRubric = _ref.withRubric;
130
144
 
131
145
  var _ref2 = model || {},
132
146
  teacherInstructionsEnabled = _ref2.teacherInstructionsEnabled,
133
147
  promptEnabled = _ref2.promptEnabled,
134
- rationaleEnabled = _ref2.rationaleEnabled;
148
+ rationaleEnabled = _ref2.rationaleEnabled,
149
+ spellCheckEnabled = _ref2.spellCheckEnabled,
150
+ errors = _ref2.errors,
151
+ rubricEnabled = _ref2.rubricEnabled;
152
+
153
+ var _ref3 = errors || {},
154
+ shapesError = _ref3.shapesError,
155
+ selectionsError = _ref3.selectionsError;
135
156
 
136
157
  var toolbarOpts = {};
158
+ var validationMessage = (0, _utils.generateValidationMessage)(configuration);
159
+ var defaultImageMaxWidth = maxImageWidth && maxImageWidth.prompt;
160
+ var defaultImageMaxHeight = maxImageHeight && maxImageHeight.prompt;
137
161
 
138
162
  switch (model.toolbarEditorPosition) {
139
163
  case 'top':
@@ -161,7 +185,9 @@ var Root = /*#__PURE__*/function (_React$Component) {
161
185
  },
162
186
  Properties: {
163
187
  teacherInstructionsEnabled: teacherInstructions.settings && toggle(teacherInstructions.label),
164
- rationaleEnabled: rationale.settings && toggle(rationale.label)
188
+ rationaleEnabled: rationale.settings && toggle(rationale.label),
189
+ spellCheckEnabled: spellCheck.settings && toggle(spellCheck.label),
190
+ rubricEnabled: withRubric.settings && toggle(withRubric.label)
165
191
  }
166
192
  }
167
193
  })
@@ -175,7 +201,16 @@ var Root = /*#__PURE__*/function (_React$Component) {
175
201
  onChange: onTeacherInstructionsChanged,
176
202
  imageSupport: imageSupport,
177
203
  nonEmpty: false,
178
- toolbarOpts: toolbarOpts
204
+ toolbarOpts: toolbarOpts,
205
+ spellCheck: spellCheckEnabled,
206
+ maxImageWidth: maxImageWidth && maxImageWidth.teacherInstructions || defaultImageMaxWidth,
207
+ maxImageHeight: maxImageHeight && maxImageHeight.teacherInstructions || defaultImageMaxHeight,
208
+ uploadSoundSupport: uploadSoundSupport,
209
+ languageCharactersProps: [{
210
+ language: 'spanish'
211
+ }, {
212
+ language: 'special'
213
+ }]
179
214
  })), promptEnabled && /*#__PURE__*/_react["default"].createElement(_configUi.InputContainer, {
180
215
  label: prompt.label,
181
216
  className: classes.prompt
@@ -184,7 +219,16 @@ var Root = /*#__PURE__*/function (_React$Component) {
184
219
  onChange: onPromptChanged,
185
220
  imageSupport: imageSupport,
186
221
  nonEmpty: false,
187
- toolbarOpts: toolbarOpts
222
+ toolbarOpts: toolbarOpts,
223
+ spellCheck: spellCheckEnabled,
224
+ maxImageWidth: defaultImageMaxWidth,
225
+ maxImageHeight: defaultImageMaxHeight,
226
+ uploadSoundSupport: uploadSoundSupport,
227
+ languageCharactersProps: [{
228
+ language: 'spanish'
229
+ }, {
230
+ language: 'special'
231
+ }]
188
232
  })), rationaleEnabled && /*#__PURE__*/_react["default"].createElement(_configUi.InputContainer, {
189
233
  label: rationale.label,
190
234
  className: classes.prompt
@@ -192,11 +236,40 @@ var Root = /*#__PURE__*/function (_React$Component) {
192
236
  markup: model.rationale || '',
193
237
  onChange: onRationaleChanged,
194
238
  imageSupport: imageSupport,
195
- toolbarOpts: toolbarOpts
196
- })), /*#__PURE__*/_react["default"].createElement(_Typography["default"], {
197
- className: classes.label,
239
+ toolbarOpts: toolbarOpts,
240
+ spellCheck: spellCheckEnabled,
241
+ maxImageWidth: maxImageWidth && maxImageWidth.rationale || defaultImageMaxWidth,
242
+ maxImageHeight: maxImageHeight && maxImageHeight.rationale || defaultImageMaxHeight,
243
+ uploadSoundSupport: uploadSoundSupport,
244
+ languageCharactersProps: [{
245
+ language: 'spanish'
246
+ }, {
247
+ language: 'special'
248
+ }]
249
+ })), /*#__PURE__*/_react["default"].createElement("div", {
250
+ className: (0, _classnames["default"])(classes.label, classes.flexContainer)
251
+ }, /*#__PURE__*/_react["default"].createElement(_Typography["default"], {
252
+ className: classes.subheading,
198
253
  variant: "subheading"
199
- }, "Define Hotspot"), /*#__PURE__*/_react["default"].createElement(_hotspotPalette["default"], {
254
+ }, "Define Hotspot"), /*#__PURE__*/_react["default"].createElement(_Tooltip["default"], {
255
+ classes: {
256
+ tooltip: classes.tooltip
257
+ },
258
+ disableFocusListener: true,
259
+ disableTouchListener: true,
260
+ placement: 'left',
261
+ title: validationMessage
262
+ }, /*#__PURE__*/_react["default"].createElement(_Info["default"], {
263
+ fontSize: 'small',
264
+ color: 'primary',
265
+ style: {
266
+ "float": 'right'
267
+ }
268
+ }))), shapesError && /*#__PURE__*/_react["default"].createElement("div", {
269
+ className: classes.errorText
270
+ }, shapesError), selectionsError && /*#__PURE__*/_react["default"].createElement("div", {
271
+ className: classes.errorText
272
+ }, selectionsError), /*#__PURE__*/_react["default"].createElement(_hotspotPalette["default"], {
200
273
  hotspotColor: model.hotspotColor,
201
274
  hotspotList: model.hotspotList,
202
275
  outlineColor: model.outlineColor,
@@ -275,12 +348,29 @@ var styles = function styles(theme) {
275
348
  paddingTop: theme.spacing.unit * 2,
276
349
  width: '100%'
277
350
  },
351
+ subheading: {
352
+ marginRight: '5px'
353
+ },
278
354
  regular: {
279
355
  marginBottom: theme.spacing.unit * 3
280
356
  },
281
357
  switchElement: {
282
358
  justifyContent: 'space-between',
283
359
  margin: 0
360
+ },
361
+ flexContainer: {
362
+ display: 'flex',
363
+ alignItems: 'center'
364
+ },
365
+ tooltip: {
366
+ fontSize: '12px',
367
+ whiteSpace: 'pre',
368
+ maxWidth: '500px'
369
+ },
370
+ errorText: {
371
+ fontSize: '12px',
372
+ color: 'red',
373
+ padding: '5px 0'
284
374
  }
285
375
  };
286
376
  };
@@ -293,6 +383,10 @@ Root.propTypes = {
293
383
  add: _propTypes["default"].func,
294
384
  "delete": _propTypes["default"].func
295
385
  }),
386
+ uploadSoundSupport: _propTypes["default"].shape({
387
+ add: _propTypes["default"].func,
388
+ "delete": _propTypes["default"].func
389
+ }),
296
390
  onImageUpload: _propTypes["default"].func.isRequired,
297
391
  onColorChanged: _propTypes["default"].func.isRequired,
298
392
  onPromptChanged: _propTypes["default"].func.isRequired,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/root.jsx"],"names":["Panel","settings","toggle","Root","fieldType","color","onColorChanged","props","cType","value","resizeType","model","dimensions","shapes","configuration","preserveAspectRatio","onUpdateImageDimension","onUpdateShapes","nextImageDimensions","updatedDimensions","enabled","shapesArray","updatedShapes","classes","imageSupport","onConfigurationChanged","onImageUpload","onModelChangedByConfig","onPromptChanged","onRationaleChanged","onTeacherInstructionsChanged","multipleCorrect","partialScoring","prompt","teacherInstructions","rationale","teacherInstructionsEnabled","promptEnabled","rationaleEnabled","toolbarOpts","toolbarEditorPosition","position","base","label","Properties","regular","hotspotColor","hotspotList","outlineColor","outlineList","handleColorChange","imageUrl","strokeWidth","width","e","handleOnUpdateImageDimensions","field","height","React","Component","styles","theme","marginTop","spacing","unit","container","display","flex","paddingTop","marginBottom","switchElement","justifyContent","margin","propTypes","PropTypes","object","isRequired","shape","add","func"],"mappings":"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","sourcesContent":["import React from 'react';\nimport {\n settings,\n layout,\n InputContainer,\n NumberTextField\n} from '@pie-lib/config-ui';\nimport PropTypes from 'prop-types';\nimport EditableHtml from '@pie-lib/editable-html';\nimport Typography from '@material-ui/core/Typography';\nimport { withStyles } from '@material-ui/core/styles';\n\nimport HotspotPalette from './hotspot-palette';\nimport HotspotContainer from './hotspot-container';\nimport { updateImageDimensions, getUpdatedShapes, getAllShapes, groupShapes } from './utils';\n\nconst { Panel, toggle } = settings;\n\nexport class Root extends React.Component {\n handleColorChange = (fieldType, color) => {\n const { onColorChanged } = this.props;\n const cType = `${fieldType}Color`;\n\n onColorChanged(cType, color);\n };\n\n handleOnUpdateImageDimensions = (value, resizeType) => {\n const {\n model: { dimensions, shapes },\n configuration: { preserveAspectRatio = {} },\n onUpdateImageDimension,\n onUpdateShapes,\n } = this.props;\n\n const nextImageDimensions = { ...dimensions, [resizeType]: value };\n\n // if preserveAspectRatio.enabled, updateImageDimensions function makes sure aspect ratio is kept\n const updatedDimensions = updateImageDimensions(\n dimensions,\n nextImageDimensions,\n preserveAspectRatio.enabled,\n resizeType\n );\n // transform shapes map into shapes array\n const shapesArray = getAllShapes(shapes);\n // transform all the shapes to fit the re-sized image\n const updatedShapes = getUpdatedShapes(dimensions, updatedDimensions, shapesArray);\n // transform shapes array back into shapes map\n\n onUpdateShapes(groupShapes(updatedShapes));\n onUpdateImageDimension(updatedDimensions);\n };\n\n render() {\n const {\n classes,\n configuration,\n model,\n imageSupport,\n onConfigurationChanged,\n onImageUpload,\n onModelChangedByConfig,\n onPromptChanged,\n onRationaleChanged,\n onUpdateImageDimension,\n onTeacherInstructionsChanged,\n onUpdateShapes\n } = this.props;\n const {\n multipleCorrect = {},\n partialScoring = {},\n prompt = {},\n teacherInstructions = {},\n rationale = {},\n preserveAspectRatio = {}\n } = configuration || {};\n const { teacherInstructionsEnabled, promptEnabled, rationaleEnabled } = model || {};\n const toolbarOpts = {};\n\n switch (model.toolbarEditorPosition) {\n case 'top':\n toolbarOpts.position = 'top';\n break;\n default:\n toolbarOpts.position = 'bottom';\n break;\n }\n\n return (\n <div className={classes.base}>\n <layout.ConfigLayout\n settings={\n <Panel\n model={model}\n onChangeModel={onModelChangedByConfig}\n configuration={configuration}\n onChangeConfiguration={onConfigurationChanged}\n groups={{\n 'Settings': {\n multipleCorrect:\n multipleCorrect.settings && toggle(multipleCorrect.label),\n partialScoring:\n partialScoring.settings && toggle(partialScoring.label),\n promptEnabled:\n prompt.settings && toggle(prompt.label),\n },\n Properties: {\n teacherInstructionsEnabled:\n teacherInstructions.settings && toggle(teacherInstructions.label),\n rationaleEnabled: rationale.settings && toggle(rationale.label)\n }\n }}\n />\n }\n >\n <div className={classes.regular}>\n {teacherInstructionsEnabled && (\n <InputContainer label={teacherInstructions.label} className={classes.prompt}>\n <EditableHtml\n markup={model.teacherInstructions || ''}\n onChange={onTeacherInstructionsChanged}\n imageSupport={imageSupport}\n nonEmpty={false}\n toolbarOpts={toolbarOpts}\n />\n </InputContainer>\n )}\n {promptEnabled && (\n <InputContainer label={prompt.label} className={classes.prompt}>\n <EditableHtml\n markup={model.prompt || ''}\n onChange={onPromptChanged}\n imageSupport={imageSupport}\n nonEmpty={false}\n toolbarOpts={toolbarOpts}\n />\n </InputContainer>\n )}\n\n {rationaleEnabled && (\n <InputContainer\n label={rationale.label}\n className={classes.prompt}\n >\n <EditableHtml\n markup={model.rationale || ''}\n onChange={onRationaleChanged}\n imageSupport={imageSupport}\n toolbarOpts={toolbarOpts}\n />\n </InputContainer>\n )}\n\n <Typography className={classes.label} variant=\"subheading\">\n Define Hotspot\n </Typography>\n\n <HotspotPalette\n hotspotColor={model.hotspotColor}\n hotspotList={model.hotspotList}\n outlineColor={model.outlineColor}\n outlineList={model.outlineList}\n onHotspotColorChange={color =>\n this.handleColorChange('hotspot', color)\n }\n onOutlineColorChange={color =>\n this.handleColorChange('outline', color)\n }\n />\n\n <HotspotContainer\n dimensions={model.dimensions}\n imageUrl={model.imageUrl}\n multipleCorrect={model.multipleCorrect}\n hotspotColor={model.hotspotColor}\n outlineColor={model.outlineColor}\n onUpdateImageDimension={onUpdateImageDimension}\n onUpdateShapes={onUpdateShapes}\n onImageUpload={onImageUpload}\n shapes={model.shapes}\n strokeWidth={model.strokeWidth}\n preserveAspectRatioEnabled={preserveAspectRatio.enabled}\n />\n\n {model.imageUrl && (\n <div>\n <Typography className={classes.label} variant=\"subheading\">\n Image Dimensions\n </Typography>\n\n <div className={classes.dimensions}>\n <NumberTextField\n key=\"hotspot-manual-width\"\n label=\"Width\"\n value={model.dimensions.width}\n min={0}\n onChange={(e, value) => this.handleOnUpdateImageDimensions(value, 'width')}\n showErrorWhenOutsideRange\n className={classes.field}\n />\n <NumberTextField\n key=\"hotspot-manual-height\"\n label=\"Height\"\n value={model.dimensions.height}\n min={0}\n onChange={(e, value) => this.handleOnUpdateImageDimensions(value, 'height')}\n showErrorWhenOutsideRange\n className={classes.field}\n />\n </div>\n </div>\n )}\n </div>\n </layout.ConfigLayout>\n </div>\n );\n }\n}\n\nconst styles = theme => ({\n base: {\n marginTop: theme.spacing.unit * 3\n },\n container: {\n display: 'flex',\n marginTop: theme.spacing.unit\n },\n dimensions: {\n display: 'flex'\n },\n field: {\n flex: 1,\n width: '90%'\n },\n label: {\n marginTop: theme.spacing.unit * 4\n },\n prompt: {\n paddingTop: theme.spacing.unit * 2,\n width: '100%'\n },\n regular: {\n marginBottom: theme.spacing.unit * 3\n },\n switchElement: {\n justifyContent: 'space-between',\n margin: 0\n }\n});\n\nRoot.propTypes = {\n classes: PropTypes.object.isRequired,\n configuration: PropTypes.object,\n model: PropTypes.object.isRequired,\n imageSupport: PropTypes.shape({\n add: PropTypes.func,\n delete: PropTypes.func\n }),\n onImageUpload: PropTypes.func.isRequired,\n onColorChanged: PropTypes.func.isRequired,\n onPromptChanged: PropTypes.func.isRequired,\n onUpdateImageDimension: PropTypes.func.isRequired,\n onUpdateShapes: PropTypes.func.isRequired,\n onModelChangedByConfig: PropTypes.func.isRequired,\n onRationaleChanged: PropTypes.func.isRequired,\n onConfigurationChanged: PropTypes.func.isRequired,\n onTeacherInstructionsChanged: PropTypes.func.isRequired,\n};\n\nexport default withStyles(styles)(Root);\n"],"file":"root.js"}
1
+ {"version":3,"sources":["../src/root.jsx"],"names":["Panel","settings","toggle","Root","fieldType","color","onColorChanged","props","cType","value","resizeType","model","dimensions","shapes","configuration","preserveAspectRatio","onUpdateImageDimension","onUpdateShapes","nextImageDimensions","updatedDimensions","enabled","shapesArray","updatedShapes","classes","imageSupport","uploadSoundSupport","onConfigurationChanged","onImageUpload","onModelChangedByConfig","onPromptChanged","onRationaleChanged","onTeacherInstructionsChanged","multipleCorrect","partialScoring","prompt","teacherInstructions","rationale","spellCheck","maxImageWidth","maxImageHeight","withRubric","teacherInstructionsEnabled","promptEnabled","rationaleEnabled","spellCheckEnabled","errors","rubricEnabled","shapesError","selectionsError","toolbarOpts","validationMessage","defaultImageMaxWidth","defaultImageMaxHeight","toolbarEditorPosition","position","base","label","Properties","regular","language","flexContainer","subheading","tooltip","errorText","hotspotColor","hotspotList","outlineColor","outlineList","handleColorChange","imageUrl","strokeWidth","width","e","handleOnUpdateImageDimensions","field","height","React","Component","styles","theme","marginTop","spacing","unit","container","display","flex","paddingTop","marginRight","marginBottom","switchElement","justifyContent","margin","alignItems","fontSize","whiteSpace","maxWidth","padding","propTypes","PropTypes","object","isRequired","shape","add","func"],"mappings":"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","sourcesContent":["import React from 'react';\nimport {\n settings,\n layout,\n InputContainer,\n NumberTextField\n} from '@pie-lib/config-ui';\nimport PropTypes from 'prop-types';\nimport EditableHtml from '@pie-lib/editable-html';\nimport { withStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport Info from '@material-ui/icons/Info';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport HotspotPalette from './hotspot-palette';\nimport HotspotContainer from './hotspot-container';\nimport classNames from 'classnames';\nimport {\n updateImageDimensions,\n generateValidationMessage,\n getUpdatedShapes,\n getAllShapes,\n groupShapes\n} from './utils';\n\nconst { Panel, toggle } = settings;\n\nexport class Root extends React.Component {\n handleColorChange = (fieldType, color) => {\n const { onColorChanged } = this.props;\n const cType = `${fieldType}Color`;\n\n onColorChanged(cType, color);\n };\n\n handleOnUpdateImageDimensions = (value, resizeType) => {\n const {\n model: { dimensions, shapes },\n configuration: { preserveAspectRatio = {} },\n onUpdateImageDimension,\n onUpdateShapes,\n } = this.props;\n\n const nextImageDimensions = { ...dimensions, [resizeType]: value };\n\n // if preserveAspectRatio.enabled, updateImageDimensions function makes sure aspect ratio is kept\n const updatedDimensions = updateImageDimensions(\n dimensions,\n nextImageDimensions,\n preserveAspectRatio.enabled,\n resizeType\n );\n // transform shapes map into shapes array\n const shapesArray = getAllShapes(shapes);\n // transform all the shapes to fit the re-sized image\n const updatedShapes = getUpdatedShapes(dimensions, updatedDimensions, shapesArray);\n // transform shapes array back into shapes map\n\n onUpdateShapes(groupShapes(updatedShapes));\n onUpdateImageDimension(updatedDimensions);\n };\n\n render() {\n const {\n classes,\n configuration,\n model,\n imageSupport,\n uploadSoundSupport,\n onConfigurationChanged,\n onImageUpload,\n onModelChangedByConfig,\n onPromptChanged,\n onRationaleChanged,\n onUpdateImageDimension,\n onTeacherInstructionsChanged,\n onUpdateShapes\n } = this.props;\n const {\n multipleCorrect = {},\n partialScoring = {},\n prompt = {},\n teacherInstructions = {},\n rationale = {},\n spellCheck = {},\n preserveAspectRatio = {},\n maxImageWidth = {},\n maxImageHeight = {},\n withRubric\n } = configuration || {};\n const {\n teacherInstructionsEnabled,\n promptEnabled,\n rationaleEnabled,\n spellCheckEnabled,\n errors,\n rubricEnabled\n } = model || {};\n const { shapesError, selectionsError } = errors || {};\n const toolbarOpts = {};\n\n const validationMessage = generateValidationMessage(configuration);\n\n const defaultImageMaxWidth = maxImageWidth && maxImageWidth.prompt;\n const defaultImageMaxHeight = maxImageHeight && maxImageHeight.prompt;\n\n switch (model.toolbarEditorPosition) {\n case 'top':\n toolbarOpts.position = 'top';\n break;\n default:\n toolbarOpts.position = 'bottom';\n break;\n }\n\n return (\n <div className={classes.base}>\n <layout.ConfigLayout\n settings={\n <Panel\n model={model}\n onChangeModel={onModelChangedByConfig}\n configuration={configuration}\n onChangeConfiguration={onConfigurationChanged}\n groups={{\n 'Settings': {\n multipleCorrect:\n multipleCorrect.settings && toggle(multipleCorrect.label),\n partialScoring:\n partialScoring.settings && toggle(partialScoring.label),\n promptEnabled:\n prompt.settings && toggle(prompt.label),\n },\n Properties: {\n teacherInstructionsEnabled:\n teacherInstructions.settings && toggle(teacherInstructions.label),\n rationaleEnabled: rationale.settings && toggle(rationale.label),\n spellCheckEnabled:\n spellCheck.settings && toggle(spellCheck.label),\n rubricEnabled: withRubric.settings && toggle(withRubric.label)\n }\n }}\n />\n }\n >\n <div className={classes.regular}>\n {teacherInstructionsEnabled && (\n <InputContainer label={teacherInstructions.label} className={classes.prompt}>\n <EditableHtml\n markup={model.teacherInstructions || ''}\n onChange={onTeacherInstructionsChanged}\n imageSupport={imageSupport}\n nonEmpty={false}\n toolbarOpts={toolbarOpts}\n spellCheck={spellCheckEnabled}\n maxImageWidth={maxImageWidth && maxImageWidth.teacherInstructions || defaultImageMaxWidth}\n maxImageHeight={maxImageHeight && maxImageHeight.teacherInstructions || defaultImageMaxHeight}\n uploadSoundSupport={uploadSoundSupport}\n languageCharactersProps={[{ language: 'spanish' }, { language: 'special' }]}\n />\n </InputContainer>\n )}\n {promptEnabled && (\n <InputContainer label={prompt.label} className={classes.prompt}>\n <EditableHtml\n markup={model.prompt || ''}\n onChange={onPromptChanged}\n imageSupport={imageSupport}\n nonEmpty={false}\n toolbarOpts={toolbarOpts}\n spellCheck={spellCheckEnabled}\n maxImageWidth={defaultImageMaxWidth}\n maxImageHeight={defaultImageMaxHeight}\n uploadSoundSupport={uploadSoundSupport}\n languageCharactersProps={[{ language: 'spanish' }, { language: 'special' }]}\n />\n </InputContainer>\n )}\n\n {rationaleEnabled && (\n <InputContainer\n label={rationale.label}\n className={classes.prompt}\n >\n <EditableHtml\n markup={model.rationale || ''}\n onChange={onRationaleChanged}\n imageSupport={imageSupport}\n toolbarOpts={toolbarOpts}\n spellCheck={spellCheckEnabled}\n maxImageWidth={maxImageWidth && maxImageWidth.rationale || defaultImageMaxWidth}\n maxImageHeight={maxImageHeight && maxImageHeight.rationale || defaultImageMaxHeight}\n uploadSoundSupport={uploadSoundSupport}\n languageCharactersProps={[{ language: 'spanish' }, { language: 'special' }]}\n />\n </InputContainer>\n )}\n\n <div className={classNames(classes.label, classes.flexContainer)}>\n <Typography className={classes.subheading} variant=\"subheading\">\n Define Hotspot\n </Typography>\n <Tooltip\n classes={{ tooltip: classes.tooltip }}\n disableFocusListener\n disableTouchListener\n placement={'left'}\n title={validationMessage}\n >\n <Info fontSize={'small'} color={'primary'} style={{ float: 'right' }}/>\n </Tooltip>\n </div>\n {shapesError && <div className={classes.errorText}>{shapesError}</div>}\n {selectionsError && <div className={classes.errorText}>{selectionsError}</div>}\n\n <HotspotPalette\n hotspotColor={model.hotspotColor}\n hotspotList={model.hotspotList}\n outlineColor={model.outlineColor}\n outlineList={model.outlineList}\n onHotspotColorChange={color =>\n this.handleColorChange('hotspot', color)\n }\n onOutlineColorChange={color =>\n this.handleColorChange('outline', color)\n }\n />\n\n <HotspotContainer\n dimensions={model.dimensions}\n imageUrl={model.imageUrl}\n multipleCorrect={model.multipleCorrect}\n hotspotColor={model.hotspotColor}\n outlineColor={model.outlineColor}\n onUpdateImageDimension={onUpdateImageDimension}\n onUpdateShapes={onUpdateShapes}\n onImageUpload={onImageUpload}\n shapes={model.shapes}\n strokeWidth={model.strokeWidth}\n preserveAspectRatioEnabled={preserveAspectRatio.enabled}\n />\n\n {model.imageUrl && (\n <div>\n <Typography className={classes.label} variant=\"subheading\">\n Image Dimensions\n </Typography>\n\n <div className={classes.dimensions}>\n <NumberTextField\n key=\"hotspot-manual-width\"\n label=\"Width\"\n value={model.dimensions.width}\n min={0}\n onChange={(e, value) => this.handleOnUpdateImageDimensions(value, 'width')}\n showErrorWhenOutsideRange\n className={classes.field}\n />\n <NumberTextField\n key=\"hotspot-manual-height\"\n label=\"Height\"\n value={model.dimensions.height}\n min={0}\n onChange={(e, value) => this.handleOnUpdateImageDimensions(value, 'height')}\n showErrorWhenOutsideRange\n className={classes.field}\n />\n </div>\n </div>\n )}\n </div>\n </layout.ConfigLayout>\n </div>\n );\n }\n}\n\nconst styles = theme => ({\n base: {\n marginTop: theme.spacing.unit * 3\n },\n container: {\n display: 'flex',\n marginTop: theme.spacing.unit\n },\n dimensions: {\n display: 'flex'\n },\n field: {\n flex: 1,\n width: '90%'\n },\n label: {\n marginTop: theme.spacing.unit * 4\n },\n prompt: {\n paddingTop: theme.spacing.unit * 2,\n width: '100%'\n },\n subheading: {\n marginRight: '5px'\n },\n regular: {\n marginBottom: theme.spacing.unit * 3\n },\n switchElement: {\n justifyContent: 'space-between',\n margin: 0\n },\n flexContainer: {\n display: 'flex',\n alignItems: 'center'\n },\n tooltip: {\n fontSize: '12px',\n whiteSpace: 'pre',\n maxWidth: '500px',\n },\n errorText: {\n fontSize: '12px',\n color: 'red',\n padding: '5px 0'\n }\n});\n\nRoot.propTypes = {\n classes: PropTypes.object.isRequired,\n configuration: PropTypes.object,\n model: PropTypes.object.isRequired,\n imageSupport: PropTypes.shape({\n add: PropTypes.func,\n delete: PropTypes.func\n }),\n uploadSoundSupport: PropTypes.shape({\n add: PropTypes.func,\n delete: PropTypes.func\n }),\n onImageUpload: PropTypes.func.isRequired,\n onColorChanged: PropTypes.func.isRequired,\n onPromptChanged: PropTypes.func.isRequired,\n onUpdateImageDimension: PropTypes.func.isRequired,\n onUpdateShapes: PropTypes.func.isRequired,\n onModelChangedByConfig: PropTypes.func.isRequired,\n onRationaleChanged: PropTypes.func.isRequired,\n onConfigurationChanged: PropTypes.func.isRequired,\n onTeacherInstructionsChanged: PropTypes.func.isRequired,\n};\n\nexport default withStyles(styles)(Root);\n"],"file":"root.js"}
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.getUpdatedPlygon = exports.getUpdatedRectangle = exports.groupShapes = exports.getAllShapes = exports.getUpdatedShapes = exports.updateImageDimensions = void 0;
8
+ exports.updateImageDimensions = exports.groupShapes = exports.getUpdatedShapes = exports.getUpdatedRectangle = exports.getUpdatedPlygon = exports.getAllShapes = exports.generateValidationMessage = void 0;
9
9
 
10
10
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
11
11
 
@@ -15,9 +15,11 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
15
15
 
16
16
  var _cloneDeep = _interopRequireDefault(require("lodash/cloneDeep"));
17
17
 
18
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
18
+ var _excluded = ["group"];
19
19
 
20
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
20
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
21
+
22
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
21
23
 
22
24
  var updateImageDimensions = function updateImageDimensions(initialDim, nextDim, keepAspectRatio, resizeType) {
23
25
  // if we want to keep image aspect ratio
@@ -133,7 +135,7 @@ var groupShapes = function groupShapes(shapesArray) {
133
135
  if (shapesArray.length) {
134
136
  return shapesArray.reduce(function (acc, _ref) {
135
137
  var group = _ref.group,
136
- shapeProps = (0, _objectWithoutProperties2["default"])(_ref, ["group"]);
138
+ shapeProps = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
137
139
  acc[group] = [].concat((0, _toConsumableArray2["default"])(acc[group] || []), [shapeProps]);
138
140
  return acc;
139
141
  }, shapesMap);
@@ -143,4 +145,16 @@ var groupShapes = function groupShapes(shapesArray) {
143
145
  };
144
146
 
145
147
  exports.groupShapes = groupShapes;
148
+
149
+ var generateValidationMessage = function generateValidationMessage(config) {
150
+ var minShapes = config.minShapes,
151
+ maxShapes = config.maxShapes,
152
+ maxSelections = config.maxSelections;
153
+ var shapesMessage = "\nThere should be at least ".concat(minShapes, " ") + (maxShapes ? "and at most ".concat(maxShapes, " ") : '') + 'shapes defined.';
154
+ var selectionsMessage = "\nThere should be at least 1 " + (maxSelections ? "and at most ".concat(maxSelections, " ") : '') + 'shape' + (maxSelections ? 's' : '') + ' selected.';
155
+ var message = 'Validation requirements:' + shapesMessage + selectionsMessage;
156
+ return message;
157
+ };
158
+
159
+ exports.generateValidationMessage = generateValidationMessage;
146
160
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils.js"],"names":["updateImageDimensions","initialDim","nextDim","keepAspectRatio","resizeType","imageAspectRatio","width","height","getDelta","referenceInitialValue","referenceNextValue","currentValue","getUpdatedRectangle","shape","x","y","getUpdatedPlygon","points","map","point","getUpdatedShapes","shapes","group","getAllShapes","shapesMap","shapesArray","shapesKeys","Object","keys","length","reduce","acc","currentShapeKey","concat","index","groupShapes","rectangles","polygons","shapeProps"],"mappings":"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","sourcesContent":["import cloneDeep from 'lodash/cloneDeep';\n\nconst updateImageDimensions = (initialDim, nextDim, keepAspectRatio, resizeType) => {\n // if we want to keep image aspect ratio\n if (keepAspectRatio) {\n const imageAspectRatio = initialDim.width / initialDim.height;\n\n if (resizeType === 'height') {\n // if we want to change image height => we update the width accordingly\n return {\n width: nextDim.height * imageAspectRatio,\n height: nextDim.height\n }\n }\n\n // if we want to change image width => we update the height accordingly\n return {\n width: nextDim.width,\n height: nextDim.width / imageAspectRatio\n }\n }\n\n // if we don't want to keep aspect ratio, we just update both values\n return {\n width: nextDim.width,\n height: nextDim.height\n }\n};\n\n// referenceInitialValue = the initial value of the Stage\n// referenceNextValue = the next value of the Stage\n// currentValue = the value that has to be re-sized influenced by the changes that were made on the Stage\nconst getDelta = (referenceInitialValue, referenceNextValue, currentValue) => (referenceNextValue / referenceInitialValue) * currentValue;\n\nconst getUpdatedRectangle = (initialDim, nextDim, shape) => ({\n ...shape,\n width: getDelta(initialDim.width, nextDim.width, shape.width),\n height: getDelta(initialDim.height, nextDim.height, shape.height),\n x: getDelta(initialDim.width, nextDim.width, shape.x),\n y: getDelta(initialDim.height, nextDim.height, shape.y),\n});\n\nconst getUpdatedPlygon = (initialDim, nextDim, shape) => ({\n ...shape,\n points: shape.points.map(point => ({\n x: getDelta(initialDim.width, nextDim.width, point.x),\n y: getDelta(initialDim.height, nextDim.height, point.y),\n }))\n});\n\n// initialDim = the initial dimensions: { width, height } of the Stage\n// nextDim = the next dimensions: { width, height } of the Stage\n// shapes = array of shapes that have to be re-sized and re-positioned\nconst getUpdatedShapes = (initialDim, nextDim, shapes) => {\n return shapes.map(shape => {\n if (shape.group === 'rectangles') {\n return getUpdatedRectangle(initialDim, nextDim, shape);\n }\n\n if (shape.group === 'polygons') {\n return getUpdatedPlygon(initialDim, nextDim, shape);\n }\n });\n};\n\n// converts shapes map to shapes array\n// example:\n// from: { rectangles: [r1], polygons: [p1, p2]}\n// to: [{ ...r1, group: 'rectangles' }, { ...p1, group: 'polygons' }, { ...p2, group: 'polygons' }]\n// if a shape has index defined, keep it, otherwise initialize it\n// index is used for the UNDO function\nconst getAllShapes = (shapesMap) => {\n shapesMap = shapesMap || {};\n const shapesArray = [];\n const shapesKeys = Object.keys(shapesMap);\n\n return shapesKeys.length\n ? shapesKeys.reduce((acc, currentShapeKey) =>\n acc.concat(\n shapesMap[currentShapeKey]\n ? shapesMap[currentShapeKey].map((shape, index) => ({\n ...shape,\n group: currentShapeKey,\n index: shape.index || acc.length + index\n }))\n : []),\n shapesArray)\n : shapesArray;\n};\n\n// converts shapes array to shapes map\n// is the reverse of getAllShapes function\n// example:\n// from: [{ ...r1, group: 'rectangles' }, { ...p1, group: 'polygons' }, { ...p2, group: 'polygons' }]\n// to: { rectangles: [r1], polygons: [p1, p2]}\nconst groupShapes = (shapesArray) => {\n shapesArray = shapesArray || [];\n const shapesMap = {\n rectangles: [],\n polygons: []\n };\n\n if (shapesArray.length) {\n return shapesArray.reduce((acc, { group, ...shapeProps }) => {\n acc[group] = [...(acc[group] || []), shapeProps];\n return acc;\n }, shapesMap);\n }\n\n return cloneDeep(shapesMap);\n};\n\n\nexport { updateImageDimensions, getUpdatedShapes, getAllShapes, groupShapes, getUpdatedRectangle, getUpdatedPlygon };\n"],"file":"utils.js"}
1
+ {"version":3,"sources":["../src/utils.js"],"names":["updateImageDimensions","initialDim","nextDim","keepAspectRatio","resizeType","imageAspectRatio","width","height","getDelta","referenceInitialValue","referenceNextValue","currentValue","getUpdatedRectangle","shape","x","y","getUpdatedPlygon","points","map","point","getUpdatedShapes","shapes","group","getAllShapes","shapesMap","shapesArray","shapesKeys","Object","keys","length","reduce","acc","currentShapeKey","concat","index","groupShapes","rectangles","polygons","shapeProps","generateValidationMessage","config","minShapes","maxShapes","maxSelections","shapesMessage","selectionsMessage","message"],"mappings":"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","sourcesContent":["import cloneDeep from 'lodash/cloneDeep';\n\nconst updateImageDimensions = (initialDim, nextDim, keepAspectRatio, resizeType) => {\n // if we want to keep image aspect ratio\n if (keepAspectRatio) {\n const imageAspectRatio = initialDim.width / initialDim.height;\n\n if (resizeType === 'height') {\n // if we want to change image height => we update the width accordingly\n return {\n width: nextDim.height * imageAspectRatio,\n height: nextDim.height\n }\n }\n\n // if we want to change image width => we update the height accordingly\n return {\n width: nextDim.width,\n height: nextDim.width / imageAspectRatio\n }\n }\n\n // if we don't want to keep aspect ratio, we just update both values\n return {\n width: nextDim.width,\n height: nextDim.height\n }\n};\n\n// referenceInitialValue = the initial value of the Stage\n// referenceNextValue = the next value of the Stage\n// currentValue = the value that has to be re-sized influenced by the changes that were made on the Stage\nconst getDelta = (referenceInitialValue, referenceNextValue, currentValue) => (referenceNextValue / referenceInitialValue) * currentValue;\n\nconst getUpdatedRectangle = (initialDim, nextDim, shape) => ({\n ...shape,\n width: getDelta(initialDim.width, nextDim.width, shape.width),\n height: getDelta(initialDim.height, nextDim.height, shape.height),\n x: getDelta(initialDim.width, nextDim.width, shape.x),\n y: getDelta(initialDim.height, nextDim.height, shape.y),\n});\n\nconst getUpdatedPlygon = (initialDim, nextDim, shape) => ({\n ...shape,\n points: shape.points.map(point => ({\n x: getDelta(initialDim.width, nextDim.width, point.x),\n y: getDelta(initialDim.height, nextDim.height, point.y),\n }))\n});\n\n// initialDim = the initial dimensions: { width, height } of the Stage\n// nextDim = the next dimensions: { width, height } of the Stage\n// shapes = array of shapes that have to be re-sized and re-positioned\nconst getUpdatedShapes = (initialDim, nextDim, shapes) => {\n return shapes.map(shape => {\n if (shape.group === 'rectangles') {\n return getUpdatedRectangle(initialDim, nextDim, shape);\n }\n\n if (shape.group === 'polygons') {\n return getUpdatedPlygon(initialDim, nextDim, shape);\n }\n });\n};\n\n// converts shapes map to shapes array\n// example:\n// from: { rectangles: [r1], polygons: [p1, p2]}\n// to: [{ ...r1, group: 'rectangles' }, { ...p1, group: 'polygons' }, { ...p2, group: 'polygons' }]\n// if a shape has index defined, keep it, otherwise initialize it\n// index is used for the UNDO function\nconst getAllShapes = (shapesMap) => {\n shapesMap = shapesMap || {};\n const shapesArray = [];\n const shapesKeys = Object.keys(shapesMap);\n\n return shapesKeys.length\n ? shapesKeys.reduce((acc, currentShapeKey) =>\n acc.concat(\n shapesMap[currentShapeKey]\n ? shapesMap[currentShapeKey].map((shape, index) => ({\n ...shape,\n group: currentShapeKey,\n index: shape.index || acc.length + index\n }))\n : []),\n shapesArray)\n : shapesArray;\n};\n\n// converts shapes array to shapes map\n// is the reverse of getAllShapes function\n// example:\n// from: [{ ...r1, group: 'rectangles' }, { ...p1, group: 'polygons' }, { ...p2, group: 'polygons' }]\n// to: { rectangles: [r1], polygons: [p1, p2]}\nconst groupShapes = (shapesArray) => {\n shapesArray = shapesArray || [];\n const shapesMap = {\n rectangles: [],\n polygons: []\n };\n\n if (shapesArray.length) {\n return shapesArray.reduce((acc, { group, ...shapeProps }) => {\n acc[group] = [...(acc[group] || []), shapeProps];\n return acc;\n }, shapesMap);\n }\n\n return cloneDeep(shapesMap);\n};\n\nconst generateValidationMessage = config => {\n const { minShapes, maxShapes, maxSelections } = config;\n\n const shapesMessage = `\\nThere should be at least ${minShapes} ` +\n (maxShapes ? `and at most ${maxShapes} ` : '') + 'shapes defined.';\n\n const selectionsMessage = `\\nThere should be at least 1 ` +\n (maxSelections ? `and at most ${maxSelections} ` : '') + 'shape' +\n (maxSelections ? 's' : '') + ' selected.';\n\n const message = 'Validation requirements:' + shapesMessage + selectionsMessage;\n\n return message;\n};\n\nexport {\n updateImageDimensions,\n generateValidationMessage,\n getUpdatedShapes,\n getAllShapes,\n groupShapes,\n getUpdatedRectangle,\n getUpdatedPlygon\n};\n"],"file":"utils.js"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@pie-element/hotspot-configure",
3
3
  "private": true,
4
- "version": "4.4.23",
4
+ "version": "5.1.0",
5
5
  "description": "",
6
6
  "main": "lib/index.js",
7
7
  "module": "src/index.js",
@@ -9,9 +9,9 @@
9
9
  "dependencies": {
10
10
  "@material-ui/core": "^3.9.2",
11
11
  "@material-ui/icons": "^3.0.2",
12
- "@pie-framework/pie-configure-events": "^1.2.0",
13
- "@pie-lib/config-ui": "^10.10.2",
14
- "@pie-lib/editable-html": "^7.17.2",
12
+ "@pie-framework/pie-configure-events": "^1.3.0",
13
+ "@pie-lib/config-ui": "^11.0.20",
14
+ "@pie-lib/editable-html": "^9.2.2",
15
15
  "classnames": "^2.2.6",
16
16
  "debug": "^3.1.0",
17
17
  "konva": "^3.2.4",
@@ -8,6 +8,7 @@ exports[`HotspotContainer render renders 1`] = `
8
8
  onDragLeave={[Function]}
9
9
  onDragOver={[Function]}
10
10
  onDrop={[Function]}
11
+ onPaste={[Function]}
11
12
  >
12
13
  <div>
13
14
  <WithStyles(UploadControl)
@@ -7,6 +7,17 @@ exports[`Root render renders 1`] = `
7
7
  <Panel
8
8
  configuration={
9
9
  Object {
10
+ "maxImageHeight": Object {
11
+ "prompt": 300,
12
+ "rationale": 300,
13
+ "teacherInstructions": 300,
14
+ },
15
+ "maxImageWidth": Object {
16
+ "prompt": 300,
17
+ "rationale": 300,
18
+ "teacherInstructions": 300,
19
+ },
20
+ "minShapes": 2,
10
21
  "multipleCorrect": Object {
11
22
  "label": "Multiple Correct Responses",
12
23
  "settings": true,
@@ -28,16 +39,27 @@ exports[`Root render renders 1`] = `
28
39
  "label": "Rationale",
29
40
  "settings": true,
30
41
  },
42
+ "spellCheck": Object {
43
+ "enabled": true,
44
+ "label": "Spellcheck",
45
+ "settings": false,
46
+ },
31
47
  "teacherInstructions": Object {
32
48
  "label": "Teacher Instructions",
33
49
  "settings": true,
34
50
  },
51
+ "withRubric": Object {
52
+ "label": "Add Rubric",
53
+ "settings": false,
54
+ },
35
55
  }
36
56
  }
37
57
  groups={
38
58
  Object {
39
59
  "Properties": Object {
40
60
  "rationaleEnabled": undefined,
61
+ "rubricEnabled": false,
62
+ "spellCheckEnabled": false,
41
63
  "teacherInstructionsEnabled": undefined,
42
64
  },
43
65
  "Settings": Object {
@@ -170,11 +192,38 @@ exports[`Root render renders 1`] = `
170
192
  }
171
193
  >
172
194
  <div>
173
- <WithStyles(Typography)
174
- variant="subheading"
195
+ <div
196
+ className=""
175
197
  >
176
- Define Hotspot
177
- </WithStyles(Typography)>
198
+ <WithStyles(Typography)
199
+ variant="subheading"
200
+ >
201
+ Define Hotspot
202
+ </WithStyles(Typography)>
203
+ <WithStyles(Tooltip)
204
+ classes={
205
+ Object {
206
+ "tooltip": undefined,
207
+ }
208
+ }
209
+ disableFocusListener={true}
210
+ disableTouchListener={true}
211
+ placement="left"
212
+ title="Validation requirements:
213
+ There should be at least 2 shapes defined.
214
+ There should be at least 1 shape selected."
215
+ >
216
+ <pure(InfoIcon)
217
+ color="primary"
218
+ fontSize="small"
219
+ style={
220
+ Object {
221
+ "float": "right",
222
+ }
223
+ }
224
+ />
225
+ </WithStyles(Tooltip)>
226
+ </div>
178
227
  <WithStyles(Palette)
179
228
  hotspotColor="rgba(137, 183, 244, 0.65)"
180
229
  hotspotList={
@@ -44,6 +44,11 @@ export default {
44
44
  settings: true,
45
45
  label: 'Prompt'
46
46
  },
47
+ spellCheck: {
48
+ label: 'Spellcheck',
49
+ settings:false,
50
+ enabled:true
51
+ },
47
52
  teacherInstructions: {
48
53
  settings: true,
49
54
  label: 'Teacher Instructions'
@@ -52,6 +57,21 @@ export default {
52
57
  settings: false,
53
58
  enabled: true,
54
59
  label: 'Preserve aspect ratio'
60
+ },
61
+ minShapes: 2,
62
+ maxImageWidth: {
63
+ teacherInstructions: 300,
64
+ prompt: 300,
65
+ rationale: 300,
66
+ },
67
+ maxImageHeight: {
68
+ teacherInstructions: 300,
69
+ prompt: 300,
70
+ rationale: 300,
71
+ },
72
+ withRubric: {
73
+ settings: false,
74
+ label: 'Add Rubric'
55
75
  }
56
76
  }
57
77
  };
@@ -33,11 +33,13 @@ export class Container extends Component {
33
33
  }
34
34
 
35
35
  handleFileRead = (file) => {
36
- const { onImageUpload } = this.props;
37
- const reader = new FileReader();
36
+ if (file instanceof Blob) {
37
+ const { onImageUpload } = this.props;
38
+ const reader = new FileReader();
38
39
 
39
- reader.onloadend = () => onImageUpload(reader.result);
40
- reader.readAsDataURL(file)
40
+ reader.onloadend = () => onImageUpload(reader.result);
41
+ reader.readAsDataURL(file)
42
+ }
41
43
  };
42
44
 
43
45
  handleUploadImage = (e) => {
@@ -49,6 +51,14 @@ export class Container extends Component {
49
51
  enableDropzone = () => this.setState({ dropzoneActive: true });
50
52
  disableDropzone = () => this.setState({ dropzoneActive: false });
51
53
 
54
+ handleOnPaste = (e) => {
55
+ const { files } = e.clipboardData;
56
+
57
+ if (files && isImage(files[0])) {
58
+ this.handleFileRead(files[0]);
59
+ }
60
+ };
61
+
52
62
  handleOnDrop = (e) => {
53
63
  e.preventDefault();
54
64
 
@@ -139,7 +149,8 @@ export class Container extends Component {
139
149
  onDragExit: this.handleOnDragExit,
140
150
  onDragLeave: this.handleOnDragExit,
141
151
  onDragOver: this.handleOnDragOver,
142
- onDrop: this.handleOnDrop
152
+ onDrop: this.handleOnDrop,
153
+ onPaste: this.handleOnPaste
143
154
  } : {}}
144
155
  >
145
156
  <div className={classes.toolbar}>
@@ -9,6 +9,8 @@ import Rectangle from './hotspot-rectangle';
9
9
  import Polygon from './hotspot-polygon';
10
10
  import { updateImageDimensions, getUpdatedShapes } from './utils';
11
11
 
12
+ const IMAGE_MAX_WIDTH = 800;
13
+
12
14
  export class Drawable extends React.Component {
13
15
  static getDerivedStateFromProps(nextProps, prevState) {
14
16
  let dimensions = nextProps.dimensions;
@@ -153,8 +155,12 @@ export class Drawable extends React.Component {
153
155
  const elementStyle = getComputedStyle(target);
154
156
  const newHeight = parseFloat(elementStyle.height);
155
157
  const newWidth = parseFloat(elementStyle.width);
158
+ const aspectWidth = newWidth / IMAGE_MAX_WIDTH;
156
159
 
157
- const dimensions = {
160
+ const dimensions = newWidth > IMAGE_MAX_WIDTH ? {
161
+ height: newHeight / aspectWidth,
162
+ width: IMAGE_MAX_WIDTH
163
+ } : {
158
164
  height: newHeight,
159
165
  width: newWidth
160
166
  };
@@ -209,7 +215,7 @@ export class Drawable extends React.Component {
209
215
  const resizeValid = this.checkIfResizeValid(width, height);
210
216
  const hasMinimumWidth = width > 150 && height > 150;
211
217
 
212
- if (resizeValid && hasMinimumWidth) {
218
+ if (resizeValid && hasMinimumWidth && box) {
213
219
  box.style.width = `${width}px`;
214
220
  box.style.height = `${height}px`;
215
221