@pie-element/hotspot 6.17.0 → 6.17.1-next.1

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 (65) hide show
  1. package/configure/package.json +1 -1
  2. package/controller/package.json +1 -1
  3. package/package.json +3 -3
  4. package/configure/lib/DeleteWidget.js +0 -79
  5. package/configure/lib/DeleteWidget.js.map +0 -1
  6. package/configure/lib/button.js +0 -61
  7. package/configure/lib/button.js.map +0 -1
  8. package/configure/lib/buttons/circle.js +0 -40
  9. package/configure/lib/buttons/circle.js.map +0 -1
  10. package/configure/lib/buttons/polygon.js +0 -46
  11. package/configure/lib/buttons/polygon.js.map +0 -1
  12. package/configure/lib/buttons/rectangle.js +0 -46
  13. package/configure/lib/buttons/rectangle.js.map +0 -1
  14. package/configure/lib/defaults.js +0 -143
  15. package/configure/lib/defaults.js.map +0 -1
  16. package/configure/lib/hotspot-circle.js +0 -246
  17. package/configure/lib/hotspot-circle.js.map +0 -1
  18. package/configure/lib/hotspot-container.js +0 -417
  19. package/configure/lib/hotspot-container.js.map +0 -1
  20. package/configure/lib/hotspot-drawable.js +0 -548
  21. package/configure/lib/hotspot-drawable.js.map +0 -1
  22. package/configure/lib/hotspot-palette.js +0 -154
  23. package/configure/lib/hotspot-palette.js.map +0 -1
  24. package/configure/lib/hotspot-polygon.js +0 -364
  25. package/configure/lib/hotspot-polygon.js.map +0 -1
  26. package/configure/lib/hotspot-rectangle.js +0 -240
  27. package/configure/lib/hotspot-rectangle.js.map +0 -1
  28. package/configure/lib/icons.js +0 -7
  29. package/configure/lib/icons.js.map +0 -1
  30. package/configure/lib/index.js +0 -254
  31. package/configure/lib/index.js.map +0 -1
  32. package/configure/lib/root.js +0 -418
  33. package/configure/lib/root.js.map +0 -1
  34. package/configure/lib/shapes/circle.js +0 -115
  35. package/configure/lib/shapes/circle.js.map +0 -1
  36. package/configure/lib/shapes/polygon.js +0 -111
  37. package/configure/lib/shapes/polygon.js.map +0 -1
  38. package/configure/lib/shapes/rectagle.js +0 -115
  39. package/configure/lib/shapes/rectagle.js.map +0 -1
  40. package/configure/lib/upload-control.js +0 -68
  41. package/configure/lib/upload-control.js.map +0 -1
  42. package/configure/lib/utils.js +0 -237
  43. package/configure/lib/utils.js.map +0 -1
  44. package/controller/lib/defaults.js +0 -33
  45. package/controller/lib/defaults.js.map +0 -1
  46. package/controller/lib/index.js +0 -289
  47. package/controller/lib/index.js.map +0 -1
  48. package/controller/lib/utils.js +0 -54
  49. package/controller/lib/utils.js.map +0 -1
  50. package/lib/hotspot/circle.js +0 -191
  51. package/lib/hotspot/circle.js.map +0 -1
  52. package/lib/hotspot/container.js +0 -282
  53. package/lib/hotspot/container.js.map +0 -1
  54. package/lib/hotspot/icons.js +0 -8
  55. package/lib/hotspot/icons.js.map +0 -1
  56. package/lib/hotspot/index.js +0 -209
  57. package/lib/hotspot/index.js.map +0 -1
  58. package/lib/hotspot/polygon.js +0 -225
  59. package/lib/hotspot/polygon.js.map +0 -1
  60. package/lib/hotspot/rectangle.js +0 -207
  61. package/lib/hotspot/rectangle.js.map +0 -1
  62. package/lib/index.js +0 -114
  63. package/lib/index.js.map +0 -1
  64. package/lib/session-updater.js +0 -30
  65. package/lib/session-updater.js.map +0 -1
@@ -1,417 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- var _typeof = require("@babel/runtime/helpers/typeof");
6
-
7
- Object.defineProperty(exports, "__esModule", {
8
- value: true
9
- });
10
- exports["default"] = exports.Container = void 0;
11
-
12
- var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
13
-
14
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
15
-
16
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
17
-
18
- var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
19
-
20
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
21
-
22
- var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
23
-
24
- var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
25
-
26
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
27
-
28
- var _index = require("@material-ui/core/styles/index");
29
-
30
- var _classnames = _interopRequireDefault(require("classnames"));
31
-
32
- var _propTypes = _interopRequireDefault(require("prop-types"));
33
-
34
- var _react = _interopRequireWildcard(require("react"));
35
-
36
- var _button = _interopRequireDefault(require("./button"));
37
-
38
- var _circle = require("./buttons/circle");
39
-
40
- var _polygon = require("./buttons/polygon");
41
-
42
- var _rectangle = require("./buttons/rectangle");
43
-
44
- var _hotspotDrawable = _interopRequireDefault(require("./hotspot-drawable"));
45
-
46
- var _uploadControl = _interopRequireDefault(require("./upload-control"));
47
-
48
- var _utils = require("./utils");
49
-
50
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
51
-
52
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
53
-
54
- 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; }
55
-
56
- 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; }
57
-
58
- 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); }; }
59
-
60
- 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; } }
61
-
62
- var isImage = function isImage(file) {
63
- var imageType = /image.*/;
64
- return file.type.match(imageType);
65
- };
66
-
67
- var Container = /*#__PURE__*/function (_Component) {
68
- (0, _inherits2["default"])(Container, _Component);
69
-
70
- var _super = _createSuper(Container);
71
-
72
- function Container(props) {
73
- var _this;
74
-
75
- (0, _classCallCheck2["default"])(this, Container);
76
- _this = _super.call(this, props);
77
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleFileRead", function (file) {
78
- if (file instanceof Blob) {
79
- var _this$props = _this.props,
80
- onImageUpload = _this$props.onImageUpload,
81
- insertImage = _this$props.insertImage;
82
- var reader = new FileReader();
83
-
84
- reader.onloadend = function () {
85
- return onImageUpload(reader.result);
86
- };
87
-
88
- reader.readAsDataURL(file);
89
-
90
- if (insertImage) {
91
- insertImage(_objectSpread(_objectSpread({}, _this.fakeImageHandler), {}, {
92
- getChosenFile: function getChosenFile() {
93
- return file;
94
- },
95
- isPasted: true
96
- }));
97
- }
98
- }
99
- });
100
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "enableDropzone", function () {
101
- return _this.setState({
102
- dropzoneActive: true
103
- });
104
- });
105
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "disableDropzone", function () {
106
- return _this.setState({
107
- dropzoneActive: false
108
- });
109
- });
110
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleOnPaste", function (e) {
111
- var files = e.clipboardData.files;
112
-
113
- if (files && isImage(files[0])) {
114
- _this.handleFileRead(files[0]);
115
- }
116
- });
117
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleOnDrop", function (e) {
118
- e.preventDefault();
119
- var _e$dataTransfer = e.dataTransfer,
120
- items = _e$dataTransfer.items,
121
- files = _e$dataTransfer.files;
122
-
123
- if (items && items[0].kind === 'file') {
124
- var file = items[0].getAsFile();
125
-
126
- if (isImage(file)) {
127
- _this.handleFileRead(file);
128
- }
129
- } else if (isImage(files[0])) {
130
- _this.handleFileRead(files[0]);
131
- }
132
-
133
- _this.disableDropzone();
134
- });
135
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleOnDragOver", function (e) {
136
- e.preventDefault();
137
- var dropzoneActive = _this.state.dropzoneActive;
138
-
139
- if (!dropzoneActive) {
140
- _this.enableDropzone();
141
- }
142
- });
143
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleOnDragExit", function (e) {
144
- e.preventDefault();
145
-
146
- _this.disableDropzone();
147
- });
148
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onUpdateShapes", function (newShapes) {
149
- var onUpdateShapes = _this.props.onUpdateShapes;
150
-
151
- _this.setState({
152
- shapes: newShapes
153
- }, // always transform shapes array back into shapes map when saving changes
154
- function () {
155
- return onUpdateShapes((0, _utils.groupShapes)(newShapes));
156
- });
157
- });
158
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onDeleteShape", function (id) {
159
- var shapes = _this.state.shapes;
160
-
161
- if (shapes && shapes.length) {
162
- // filter the deleted shape out
163
- var newShapes = shapes.filter(function (shape) {
164
- return shape.id !== id;
165
- });
166
-
167
- _this.onUpdateShapes(newShapes);
168
- }
169
- });
170
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleClearAll", function () {
171
- return _this.onUpdateShapes([]);
172
- });
173
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleEnableDrag", function () {
174
- return _this.setState({
175
- dragEnabled: true
176
- });
177
- });
178
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleDisableDrag", function () {
179
- return _this.setState({
180
- dragEnabled: false
181
- });
182
- });
183
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleInputClick", function () {
184
- var insertImage = _this.props.insertImage;
185
-
186
- if (insertImage) {
187
- insertImage(_this.fakeImageHandler);
188
- }
189
- });
190
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleFinishDrawing", function () {
191
- // Explicitly end the current shape drawing session
192
- // This would cause the finalizeCreation method to be called in the HotspotDrawable component
193
- _this.setState({
194
- selectedShape: 'none'
195
- });
196
- });
197
- _this.state = {
198
- dragEnabled: true,
199
- // always transform shapes map into shapes array at this level
200
- shapes: (0, _utils.getAllShapes)(props.shapes),
201
- selectedShape: 'none'
202
- };
203
- _this.fakeImageHandler = {
204
- cancel: function cancel() {},
205
- done: function done(a, url) {
206
- return _this.props.onImageUpload(url);
207
- },
208
- fileChosen: function fileChosen() {},
209
- progress: function progress() {}
210
- };
211
- return _this;
212
- }
213
-
214
- (0, _createClass2["default"])(Container, [{
215
- key: "render",
216
- value: function render() {
217
- var _classNames,
218
- _this2 = this;
219
-
220
- var _this$props2 = this.props,
221
- classes = _this$props2.classes,
222
- dimensions = _this$props2.dimensions,
223
- hasErrors = _this$props2.hasErrors,
224
- hotspotColor = _this$props2.hotspotColor,
225
- imageUrl = _this$props2.imageUrl,
226
- multipleCorrect = _this$props2.multipleCorrect,
227
- onUpdateImageDimension = _this$props2.onUpdateImageDimension,
228
- outlineColor = _this$props2.outlineColor,
229
- strokeWidth = _this$props2.strokeWidth,
230
- preserveAspectRatioEnabled = _this$props2.preserveAspectRatioEnabled;
231
- var _this$state = this.state,
232
- dropzoneActive = _this$state.dropzoneActive,
233
- dragEnabled = _this$state.dragEnabled;
234
- var _this$state2 = this.state,
235
- shapes = _this$state2.shapes,
236
- selectedShape = _this$state2.selectedShape;
237
- return /*#__PURE__*/_react["default"].createElement("div", {
238
- className: classes.base
239
- }, /*#__PURE__*/_react["default"].createElement("div", (0, _extends2["default"])({
240
- className: (0, _classnames["default"])(classes.box, (_classNames = {}, (0, _defineProperty2["default"])(_classNames, classes.boxError, hasErrors && !dropzoneActive), (0, _defineProperty2["default"])(_classNames, classes.boxActive, dropzoneActive), _classNames))
241
- }, dragEnabled ? {
242
- onDragExit: this.handleOnDragExit,
243
- onDragLeave: this.handleOnDragExit,
244
- onDragOver: this.handleOnDragOver,
245
- onDrop: this.handleOnDrop,
246
- onPaste: this.handleOnPaste
247
- } : {}), /*#__PURE__*/_react["default"].createElement("div", {
248
- className: classes.toolbar
249
- }, /*#__PURE__*/_react["default"].createElement("div", {
250
- onClick: function onClick() {
251
- return _this2.setState({
252
- selectedShape: selectedShape === 'rectangle' ? 'none' : 'rectangle'
253
- });
254
- },
255
- className: classes.buttonShape
256
- }, /*#__PURE__*/_react["default"].createElement(_rectangle.RectangleButton, {
257
- isActive: selectedShape === 'rectangle'
258
- })), /*#__PURE__*/_react["default"].createElement("div", {
259
- onClick: function onClick() {
260
- return _this2.setState({
261
- selectedShape: selectedShape === 'polygon' ? 'none' : 'polygon'
262
- });
263
- },
264
- className: classes.buttonShape
265
- }, /*#__PURE__*/_react["default"].createElement(_polygon.PolygonButton, {
266
- isActive: selectedShape === 'polygon'
267
- })), /*#__PURE__*/_react["default"].createElement("div", {
268
- onClick: function onClick() {
269
- return _this2.setState({
270
- selectedShape: selectedShape === 'circle' ? 'none' : 'circle'
271
- });
272
- },
273
- className: classes.buttonShape
274
- }, /*#__PURE__*/_react["default"].createElement(_circle.CircleButton, {
275
- isActive: selectedShape === 'circle'
276
- })), imageUrl && /*#__PURE__*/_react["default"].createElement(_uploadControl["default"], {
277
- classNameButton: classes.replaceButton,
278
- classNameSection: classes.replaceSection,
279
- label: "Replace Image",
280
- onInputClick: this.handleInputClick,
281
- setRef: function setRef(ref) {
282
- _this2.input = ref;
283
- }
284
- }), /*#__PURE__*/_react["default"].createElement(_button["default"], {
285
- disabled: !(shapes && shapes.length),
286
- onClick: this.handleClearAll,
287
- label: "Clear all"
288
- })), /*#__PURE__*/_react["default"].createElement("div", {
289
- ref: function ref(_ref) {
290
- _this2.imageSection = _ref;
291
- },
292
- className: classes.drawableHeight
293
- }, imageUrl ? /*#__PURE__*/_react["default"].createElement(_hotspotDrawable["default"], {
294
- dimensions: dimensions,
295
- disableDrag: this.handleDisableDrag,
296
- enableDrag: this.handleEnableDrag,
297
- shapeType: this.state.selectedShape,
298
- handleFinishDrawing: this.handleFinishDrawing,
299
- imageUrl: imageUrl,
300
- hotspotColor: hotspotColor,
301
- multipleCorrect: multipleCorrect,
302
- onUpdateImageDimension: onUpdateImageDimension,
303
- onUpdateShapes: this.onUpdateShapes,
304
- onDeleteShape: this.onDeleteShape,
305
- outlineColor: outlineColor,
306
- shapes: shapes,
307
- strokeWidth: strokeWidth,
308
- preserveAspectRatioEnabled: preserveAspectRatioEnabled
309
- }) : /*#__PURE__*/_react["default"].createElement("div", {
310
- className: (0, _classnames["default"])(classes.drawableHeight, classes.centered)
311
- }, /*#__PURE__*/_react["default"].createElement("label", null, "Drag and drop or upload image from computer"), /*#__PURE__*/_react["default"].createElement("br", null), /*#__PURE__*/_react["default"].createElement(_uploadControl["default"], {
312
- label: "Upload Image",
313
- onInputClick: this.handleInputClick,
314
- setRef: function setRef(ref) {
315
- _this2.input = ref;
316
- }
317
- })))));
318
- }
319
- }], [{
320
- key: "getDerivedStateFromProps",
321
- value: function getDerivedStateFromProps(nextProps, prevState) {
322
- // always transform shapes map into shapes array at this level
323
- return _objectSpread(_objectSpread({}, prevState), {}, {
324
- shapes: (0, _utils.getAllShapes)(nextProps.shapes)
325
- });
326
- }
327
- }]);
328
- return Container;
329
- }(_react.Component);
330
-
331
- exports.Container = Container;
332
-
333
- var styles = function styles(theme) {
334
- return {
335
- buttonShape: {
336
- marginRight: '5px',
337
- '&:hover': {
338
- cursor: 'pointer'
339
- }
340
- },
341
- base: {
342
- marginTop: theme.spacing.unit * 1.5,
343
- marginBottom: theme.spacing.unit * 2.5
344
- },
345
- box: {
346
- border: '1px solid #E0E1E6',
347
- borderRadius: '5px'
348
- },
349
- boxActive: {
350
- border: '1px solid #0032C2'
351
- },
352
- boxError: {
353
- border: "1px solid ".concat(theme.palette.error.main)
354
- },
355
- centered: {
356
- alignItems: 'center',
357
- display: 'flex',
358
- flexDirection: 'column',
359
- justifyContent: 'center'
360
- },
361
- drawableHeight: {
362
- minHeight: 350,
363
- paddingBottom: theme.spacing.unit * 5,
364
- paddingRight: theme.spacing.unit * 5
365
- },
366
- icon: {
367
- '&:hover': {
368
- color: '#333131',
369
- cursor: 'help'
370
- },
371
- color: '#C1C1C1'
372
- },
373
- replaceButton: {
374
- marginLeft: 0
375
- },
376
- replaceSection: {
377
- marginRight: 'auto'
378
- },
379
- toolbar: {
380
- backgroundColor: '#FFF',
381
- borderBottom: '1px solid #E0E1E6',
382
- borderTopLeftRadius: '5px',
383
- borderTopRightRadius: '5px',
384
- display: 'flex',
385
- justifyContent: 'flex-end',
386
- padding: theme.spacing.unit
387
- }
388
- };
389
- };
390
-
391
- Container.propTypes = {
392
- classes: _propTypes["default"].object.isRequired,
393
- dimensions: _propTypes["default"].object.isRequired,
394
- imageUrl: _propTypes["default"].string.isRequired,
395
- hotspotColor: _propTypes["default"].string.isRequired,
396
- multipleCorrect: _propTypes["default"].bool.isRequired,
397
- onImageUpload: _propTypes["default"].func.isRequired,
398
- onUpdateImageDimension: _propTypes["default"].func.isRequired,
399
- insertImage: _propTypes["default"].func,
400
- onUpdateShapes: _propTypes["default"].func.isRequired,
401
- outlineColor: _propTypes["default"].string.isRequired,
402
- shapes: _propTypes["default"].shape({
403
- rectangles: _propTypes["default"].array,
404
- polygons: _propTypes["default"].array
405
- }).isRequired,
406
- strokeWidth: _propTypes["default"].number,
407
- preserveAspectRatioEnabled: _propTypes["default"].bool,
408
- hasErrors: _propTypes["default"].bool
409
- };
410
- Container.defaultProps = {
411
- strokeWidth: 5
412
- };
413
-
414
- var _default = (0, _index.withStyles)(styles)(Container);
415
-
416
- exports["default"] = _default;
417
- //# sourceMappingURL=hotspot-container.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/hotspot-container.jsx"],"names":["isImage","file","imageType","type","match","Container","props","Blob","onImageUpload","insertImage","reader","FileReader","onloadend","result","readAsDataURL","fakeImageHandler","getChosenFile","isPasted","setState","dropzoneActive","e","files","clipboardData","handleFileRead","preventDefault","dataTransfer","items","kind","getAsFile","disableDropzone","state","enableDropzone","newShapes","onUpdateShapes","shapes","id","length","filter","shape","dragEnabled","selectedShape","cancel","done","a","url","fileChosen","progress","classes","dimensions","hasErrors","hotspotColor","imageUrl","multipleCorrect","onUpdateImageDimension","outlineColor","strokeWidth","preserveAspectRatioEnabled","base","box","boxError","boxActive","onDragExit","handleOnDragExit","onDragLeave","onDragOver","handleOnDragOver","onDrop","handleOnDrop","onPaste","handleOnPaste","toolbar","buttonShape","replaceButton","replaceSection","handleInputClick","ref","input","handleClearAll","imageSection","drawableHeight","handleDisableDrag","handleEnableDrag","handleFinishDrawing","onDeleteShape","centered","nextProps","prevState","Component","styles","theme","marginRight","cursor","marginTop","spacing","unit","marginBottom","border","borderRadius","palette","error","main","alignItems","display","flexDirection","justifyContent","minHeight","paddingBottom","paddingRight","icon","color","marginLeft","backgroundColor","borderBottom","borderTopLeftRadius","borderTopRightRadius","padding","propTypes","PropTypes","object","isRequired","string","bool","func","rectangles","array","polygons","number","defaultProps"],"mappings":"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","sourcesContent":["import { withStyles } from '@material-ui/core/styles/index';\nimport classNames from 'classnames';\nimport PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport Button from './button';\nimport { CircleButton } from './buttons/circle';\nimport { PolygonButton } from './buttons/polygon';\nimport { RectangleButton } from './buttons/rectangle';\n\nimport Drawable from './hotspot-drawable';\nimport UploadControl from './upload-control';\nimport { getAllShapes, groupShapes } from './utils';\n\nconst isImage = (file) => {\n const imageType = /image.*/;\n\n return file.type.match(imageType);\n};\n\nexport class Container extends Component {\n static getDerivedStateFromProps(nextProps, prevState) {\n // always transform shapes map into shapes array at this level\n return {\n ...prevState,\n shapes: getAllShapes(nextProps.shapes),\n };\n }\n\n constructor(props) {\n super(props);\n\n this.state = {\n dragEnabled: true,\n // always transform shapes map into shapes array at this level\n shapes: getAllShapes(props.shapes),\n selectedShape: 'none',\n };\n this.fakeImageHandler = {\n cancel: () => {},\n done: (a, url) => this.props.onImageUpload(url),\n fileChosen: () => {},\n progress: () => {},\n };\n }\n\n handleFileRead = (file) => {\n if (file instanceof Blob) {\n const { onImageUpload, insertImage } = this.props;\n const reader = new FileReader();\n\n reader.onloadend = () => onImageUpload(reader.result);\n reader.readAsDataURL(file);\n\n if (insertImage) {\n insertImage({\n ...this.fakeImageHandler,\n getChosenFile: () => file,\n isPasted: true,\n });\n }\n }\n };\n enableDropzone = () => this.setState({ dropzoneActive: true });\n\n disableDropzone = () => this.setState({ dropzoneActive: false });\n\n handleOnPaste = (e) => {\n const { files } = e.clipboardData;\n\n if (files && isImage(files[0])) {\n this.handleFileRead(files[0]);\n }\n };\n\n handleOnDrop = (e) => {\n e.preventDefault();\n\n const { items, files } = e.dataTransfer;\n\n if (items && items[0].kind === 'file') {\n const file = items[0].getAsFile();\n\n if (isImage(file)) {\n this.handleFileRead(file);\n }\n } else if (isImage(files[0])) {\n this.handleFileRead(files[0]);\n }\n\n this.disableDropzone();\n };\n\n handleOnDragOver = (e) => {\n e.preventDefault();\n\n const { dropzoneActive } = this.state;\n\n if (!dropzoneActive) {\n this.enableDropzone();\n }\n };\n\n handleOnDragExit = (e) => {\n e.preventDefault();\n\n this.disableDropzone();\n };\n\n onUpdateShapes = (newShapes) => {\n const { onUpdateShapes } = this.props;\n this.setState(\n { shapes: newShapes },\n // always transform shapes array back into shapes map when saving changes\n () => onUpdateShapes(groupShapes(newShapes)),\n );\n };\n\n onDeleteShape = (id) => {\n const { shapes } = this.state;\n if (shapes && shapes.length) {\n // filter the deleted shape out\n let newShapes = shapes.filter((shape) => shape.id !== id);\n this.onUpdateShapes(newShapes);\n }\n };\n\n handleClearAll = () => this.onUpdateShapes([]);\n\n handleEnableDrag = () => this.setState({ dragEnabled: true });\n\n handleDisableDrag = () => this.setState({ dragEnabled: false });\n\n handleInputClick = () => {\n const { insertImage } = this.props;\n\n if (insertImage) {\n insertImage(this.fakeImageHandler);\n }\n };\n\n handleFinishDrawing = () => {\n // Explicitly end the current shape drawing session\n // This would cause the finalizeCreation method to be called in the HotspotDrawable component\n this.setState({ selectedShape: 'none' });\n };\n\n render() {\n const {\n classes,\n dimensions,\n hasErrors,\n hotspotColor,\n imageUrl,\n multipleCorrect,\n onUpdateImageDimension,\n outlineColor,\n strokeWidth,\n preserveAspectRatioEnabled,\n } = this.props;\n const { dropzoneActive, dragEnabled } = this.state;\n const { shapes, selectedShape } = this.state;\n\n return (\n <div className={classes.base}>\n <div\n className={classNames(classes.box, {\n [classes.boxError]: hasErrors && !dropzoneActive,\n [classes.boxActive]: dropzoneActive,\n })}\n {...(dragEnabled\n ? {\n onDragExit: this.handleOnDragExit,\n onDragLeave: this.handleOnDragExit,\n onDragOver: this.handleOnDragOver,\n onDrop: this.handleOnDrop,\n onPaste: this.handleOnPaste,\n }\n : {})}\n >\n <div className={classes.toolbar}>\n <div\n onClick={() => this.setState({ selectedShape: selectedShape === 'rectangle' ? 'none' : 'rectangle' })}\n className={classes.buttonShape}\n >\n <RectangleButton isActive={selectedShape === 'rectangle'} />\n </div>\n <div\n onClick={() => this.setState({ selectedShape: selectedShape === 'polygon' ? 'none' : 'polygon' })}\n className={classes.buttonShape}\n >\n <PolygonButton isActive={selectedShape === 'polygon'} />\n </div>\n <div\n onClick={() => this.setState({ selectedShape: selectedShape === 'circle' ? 'none' : 'circle' })}\n className={classes.buttonShape}\n >\n <CircleButton isActive={selectedShape === 'circle'} />\n </div>\n\n {imageUrl && (\n <UploadControl\n classNameButton={classes.replaceButton}\n classNameSection={classes.replaceSection}\n label=\"Replace Image\"\n onInputClick={this.handleInputClick}\n setRef={(ref) => {\n this.input = ref;\n }}\n />\n )}\n <Button disabled={!(shapes && shapes.length)} onClick={this.handleClearAll} label=\"Clear all\" />\n </div>\n\n <div\n ref={(ref) => {\n this.imageSection = ref;\n }}\n className={classes.drawableHeight}\n >\n {imageUrl ? (\n <Drawable\n dimensions={dimensions}\n disableDrag={this.handleDisableDrag}\n enableDrag={this.handleEnableDrag}\n shapeType={this.state.selectedShape}\n handleFinishDrawing={this.handleFinishDrawing}\n imageUrl={imageUrl}\n hotspotColor={hotspotColor}\n multipleCorrect={multipleCorrect}\n onUpdateImageDimension={onUpdateImageDimension}\n onUpdateShapes={this.onUpdateShapes}\n onDeleteShape={this.onDeleteShape}\n outlineColor={outlineColor}\n shapes={shapes}\n strokeWidth={strokeWidth}\n preserveAspectRatioEnabled={preserveAspectRatioEnabled}\n />\n ) : (\n <div className={classNames(classes.drawableHeight, classes.centered)}>\n <label>Drag and drop or upload image from computer</label>\n <br />\n <UploadControl\n label=\"Upload Image\"\n onInputClick={this.handleInputClick}\n setRef={(ref) => {\n this.input = ref;\n }}\n />\n </div>\n )}\n </div>\n </div>\n </div>\n );\n }\n}\n\nconst styles = (theme) => ({\n buttonShape: {\n marginRight: '5px',\n '&:hover': {\n cursor: 'pointer',\n },\n },\n base: {\n marginTop: theme.spacing.unit * 1.5,\n marginBottom: theme.spacing.unit * 2.5,\n },\n box: {\n border: '1px solid #E0E1E6',\n borderRadius: '5px',\n },\n boxActive: {\n border: '1px solid #0032C2',\n },\n boxError: {\n border: `1px solid ${theme.palette.error.main}`,\n },\n centered: {\n alignItems: 'center',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n },\n drawableHeight: {\n minHeight: 350,\n paddingBottom: theme.spacing.unit * 5,\n paddingRight: theme.spacing.unit * 5,\n },\n icon: {\n '&:hover': {\n color: '#333131',\n cursor: 'help',\n },\n color: '#C1C1C1',\n },\n replaceButton: {\n marginLeft: 0,\n },\n replaceSection: {\n marginRight: 'auto',\n },\n toolbar: {\n backgroundColor: '#FFF',\n borderBottom: '1px solid #E0E1E6',\n borderTopLeftRadius: '5px',\n borderTopRightRadius: '5px',\n display: 'flex',\n justifyContent: 'flex-end',\n padding: theme.spacing.unit,\n },\n});\n\nContainer.propTypes = {\n classes: PropTypes.object.isRequired,\n dimensions: PropTypes.object.isRequired,\n imageUrl: PropTypes.string.isRequired,\n hotspotColor: PropTypes.string.isRequired,\n multipleCorrect: PropTypes.bool.isRequired,\n onImageUpload: PropTypes.func.isRequired,\n onUpdateImageDimension: PropTypes.func.isRequired,\n insertImage: PropTypes.func,\n onUpdateShapes: PropTypes.func.isRequired,\n outlineColor: PropTypes.string.isRequired,\n shapes: PropTypes.shape({\n rectangles: PropTypes.array,\n polygons: PropTypes.array,\n }).isRequired,\n strokeWidth: PropTypes.number,\n preserveAspectRatioEnabled: PropTypes.bool,\n hasErrors: PropTypes.bool,\n};\n\nContainer.defaultProps = {\n strokeWidth: 5,\n};\n\nexport default withStyles(styles)(Container);\n"],"file":"hotspot-container.js"}