@pie-element/hotspot 11.1.1 → 11.1.2-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 (234) hide show
  1. package/configure.js +2 -0
  2. package/controller.js +1 -0
  3. package/dist/author/DeleteWidget.d.ts +38 -0
  4. package/dist/author/DeleteWidget.js +46 -0
  5. package/dist/author/button.d.ts +31 -0
  6. package/dist/author/button.js +27 -0
  7. package/dist/author/buttons/circle.d.ts +18 -0
  8. package/dist/author/buttons/circle.js +25 -0
  9. package/dist/author/buttons/polygon.d.ts +18 -0
  10. package/dist/author/buttons/polygon.js +36 -0
  11. package/dist/author/buttons/rectangle.d.ts +18 -0
  12. package/dist/author/buttons/rectangle.js +36 -0
  13. package/dist/author/defaults.d.ts +157 -0
  14. package/dist/author/defaults.js +119 -0
  15. package/dist/author/hotspot-circle.d.ts +21 -0
  16. package/dist/author/hotspot-circle.js +124 -0
  17. package/dist/author/hotspot-container.d.ts +29 -0
  18. package/dist/author/hotspot-container.js +210 -0
  19. package/dist/author/hotspot-drawable.d.ts +31 -0
  20. package/dist/author/hotspot-drawable.js +312 -0
  21. package/dist/author/hotspot-palette.d.ts +14 -0
  22. package/dist/author/hotspot-palette.js +72 -0
  23. package/dist/author/hotspot-polygon.d.ts +38 -0
  24. package/dist/author/hotspot-polygon.js +200 -0
  25. package/dist/author/hotspot-rectangle.d.ts +20 -0
  26. package/dist/author/hotspot-rectangle.js +119 -0
  27. package/dist/author/icons.d.ts +9 -0
  28. package/dist/author/icons.js +4 -0
  29. package/dist/author/image-konva.d.ts +19 -0
  30. package/dist/author/image-konva.js +49 -0
  31. package/dist/author/index.d.ts +52 -0
  32. package/dist/author/index.js +143 -0
  33. package/dist/author/root.d.ts +15 -0
  34. package/dist/author/root.js +215 -0
  35. package/dist/author/shapes/circle.d.ts +18 -0
  36. package/dist/author/shapes/circle.js +47 -0
  37. package/dist/author/shapes/index.d.ts +12 -0
  38. package/dist/author/shapes/polygon.d.ts +19 -0
  39. package/dist/author/shapes/polygon.js +51 -0
  40. package/dist/author/shapes/rectagle.d.ts +18 -0
  41. package/dist/author/shapes/rectagle.js +57 -0
  42. package/dist/author/shapes/utils.d.ts +19 -0
  43. package/dist/author/shapes/utils.js +16 -0
  44. package/dist/author/upload-control.d.ts +29 -0
  45. package/dist/author/upload-control.js +28 -0
  46. package/dist/author/utils.d.ts +24 -0
  47. package/dist/author/utils.js +83 -0
  48. package/dist/browser/ReactKonva-Z9-1H-UZ.js +19329 -0
  49. package/dist/browser/ReactKonva-Z9-1H-UZ.js.map +1 -0
  50. package/dist/browser/author/index.js +41646 -0
  51. package/dist/browser/author/index.js.map +1 -0
  52. package/dist/browser/browser-CfnAFove.js +219 -0
  53. package/dist/browser/browser-CfnAFove.js.map +1 -0
  54. package/dist/browser/controller/index.js +198 -0
  55. package/dist/browser/controller/index.js.map +1 -0
  56. package/dist/browser/delivery/index.js +2460 -0
  57. package/dist/browser/delivery/index.js.map +1 -0
  58. package/dist/browser/dist-C78LDz6R.js +96 -0
  59. package/dist/browser/dist-C78LDz6R.js.map +1 -0
  60. package/dist/browser/hotspot.css +2 -0
  61. package/dist/controller/defaults.d.ts +35 -0
  62. package/dist/controller/defaults.js +29 -0
  63. package/dist/controller/index.d.ts +22 -0
  64. package/dist/controller/index.js +154 -0
  65. package/dist/controller/utils.d.ts +10 -0
  66. package/dist/controller/utils.js +12 -0
  67. package/dist/delivery/hotspot/circle.d.ts +19 -0
  68. package/dist/delivery/hotspot/circle.js +100 -0
  69. package/dist/delivery/hotspot/container.d.ts +16 -0
  70. package/dist/delivery/hotspot/container.js +150 -0
  71. package/dist/delivery/hotspot/icons.d.ts +10 -0
  72. package/dist/delivery/hotspot/icons.js +4 -0
  73. package/dist/delivery/hotspot/image-konva-tooltip.d.ts +19 -0
  74. package/dist/delivery/hotspot/image-konva-tooltip.js +66 -0
  75. package/dist/delivery/hotspot/index.d.ts +17 -0
  76. package/dist/delivery/hotspot/index.js +114 -0
  77. package/dist/delivery/hotspot/polygon.d.ts +21 -0
  78. package/dist/delivery/hotspot/polygon.js +108 -0
  79. package/dist/delivery/hotspot/rectangle.d.ts +19 -0
  80. package/dist/delivery/hotspot/rectangle.js +104 -0
  81. package/dist/delivery/index.d.ts +20 -0
  82. package/dist/delivery/index.js +107 -0
  83. package/dist/delivery/session-updater.d.ts +10 -0
  84. package/dist/delivery/session-updater.js +14 -0
  85. package/dist/index.d.ts +1 -0
  86. package/dist/index.iife.d.ts +8 -0
  87. package/dist/index.iife.js +169 -0
  88. package/dist/index.js +2 -0
  89. package/dist/runtime-support.d.ts +12 -0
  90. package/dist/runtime-support.js +12 -0
  91. package/package.json +84 -18
  92. package/CHANGELOG.json +0 -997
  93. package/CHANGELOG.md +0 -2214
  94. package/LICENSE.md +0 -5
  95. package/README.md +0 -1
  96. package/configure/CHANGELOG.json +0 -682
  97. package/configure/CHANGELOG.md +0 -1951
  98. package/configure/lib/DeleteWidget.js +0 -64
  99. package/configure/lib/DeleteWidget.js.map +0 -1
  100. package/configure/lib/button.js +0 -42
  101. package/configure/lib/button.js.map +0 -1
  102. package/configure/lib/buttons/circle.js +0 -33
  103. package/configure/lib/buttons/circle.js.map +0 -1
  104. package/configure/lib/buttons/polygon.js +0 -39
  105. package/configure/lib/buttons/polygon.js.map +0 -1
  106. package/configure/lib/buttons/rectangle.js +0 -39
  107. package/configure/lib/buttons/rectangle.js.map +0 -1
  108. package/configure/lib/defaults.js +0 -155
  109. package/configure/lib/defaults.js.map +0 -1
  110. package/configure/lib/hotspot-circle.js +0 -192
  111. package/configure/lib/hotspot-circle.js.map +0 -1
  112. package/configure/lib/hotspot-container.js +0 -320
  113. package/configure/lib/hotspot-container.js.map +0 -1
  114. package/configure/lib/hotspot-drawable.js +0 -519
  115. package/configure/lib/hotspot-drawable.js.map +0 -1
  116. package/configure/lib/hotspot-palette.js +0 -107
  117. package/configure/lib/hotspot-palette.js.map +0 -1
  118. package/configure/lib/hotspot-polygon.js +0 -293
  119. package/configure/lib/hotspot-polygon.js.map +0 -1
  120. package/configure/lib/hotspot-rectangle.js +0 -190
  121. package/configure/lib/hotspot-rectangle.js.map +0 -1
  122. package/configure/lib/icons.js +0 -7
  123. package/configure/lib/icons.js.map +0 -1
  124. package/configure/lib/image-konva.js +0 -66
  125. package/configure/lib/image-konva.js.map +0 -1
  126. package/configure/lib/index.js +0 -194
  127. package/configure/lib/index.js.map +0 -1
  128. package/configure/lib/root.js +0 -330
  129. package/configure/lib/root.js.map +0 -1
  130. package/configure/lib/shapes/circle.js +0 -84
  131. package/configure/lib/shapes/circle.js.map +0 -1
  132. package/configure/lib/shapes/index.js +0 -50
  133. package/configure/lib/shapes/index.js.map +0 -1
  134. package/configure/lib/shapes/polygon.js +0 -82
  135. package/configure/lib/shapes/polygon.js.map +0 -1
  136. package/configure/lib/shapes/rectagle.js +0 -84
  137. package/configure/lib/shapes/rectagle.js.map +0 -1
  138. package/configure/lib/shapes/utils.js +0 -21
  139. package/configure/lib/shapes/utils.js.map +0 -1
  140. package/configure/lib/upload-control.js +0 -41
  141. package/configure/lib/upload-control.js.map +0 -1
  142. package/configure/lib/utils.js +0 -185
  143. package/configure/lib/utils.js.map +0 -1
  144. package/configure/package.json +0 -26
  145. package/configure/src/DeleteWidget.jsx +0 -51
  146. package/configure/src/__tests__/DeleteWidget.test.jsx +0 -366
  147. package/configure/src/__tests__/button.test.jsx +0 -198
  148. package/configure/src/__tests__/hotspot-circle.test.jsx +0 -259
  149. package/configure/src/__tests__/hotspot-container.test.js +0 -366
  150. package/configure/src/__tests__/hotspot-drawable.test.js +0 -271
  151. package/configure/src/__tests__/hotspot-palette.test.jsx +0 -71
  152. package/configure/src/__tests__/image-konva.test.jsx +0 -226
  153. package/configure/src/__tests__/index.test.js +0 -329
  154. package/configure/src/__tests__/root.test.js +0 -400
  155. package/configure/src/__tests__/utils.test.js +0 -241
  156. package/configure/src/button.jsx +0 -35
  157. package/configure/src/buttons/circle.jsx +0 -18
  158. package/configure/src/buttons/polygon.jsx +0 -29
  159. package/configure/src/buttons/rectangle.jsx +0 -29
  160. package/configure/src/defaults.js +0 -109
  161. package/configure/src/hotspot-circle.jsx +0 -183
  162. package/configure/src/hotspot-container.jsx +0 -330
  163. package/configure/src/hotspot-drawable.jsx +0 -527
  164. package/configure/src/hotspot-palette.jsx +0 -90
  165. package/configure/src/hotspot-polygon.jsx +0 -294
  166. package/configure/src/hotspot-rectangle.jsx +0 -169
  167. package/configure/src/icons.js +0 -5
  168. package/configure/src/image-konva.jsx +0 -63
  169. package/configure/src/index.js +0 -208
  170. package/configure/src/root.jsx +0 -346
  171. package/configure/src/shapes/circle.js +0 -81
  172. package/configure/src/shapes/index.js +0 -4
  173. package/configure/src/shapes/polygon.js +0 -81
  174. package/configure/src/shapes/rectagle.js +0 -82
  175. package/configure/src/shapes/utils.js +0 -16
  176. package/configure/src/upload-control.jsx +0 -33
  177. package/configure/src/utils.js +0 -210
  178. package/controller/CHANGELOG.json +0 -362
  179. package/controller/CHANGELOG.md +0 -1304
  180. package/controller/lib/defaults.js +0 -33
  181. package/controller/lib/defaults.js.map +0 -1
  182. package/controller/lib/index.js +0 -341
  183. package/controller/lib/index.js.map +0 -1
  184. package/controller/lib/utils.js +0 -32
  185. package/controller/lib/utils.js.map +0 -1
  186. package/controller/package.json +0 -18
  187. package/controller/src/__tests__/index.test.js +0 -419
  188. package/controller/src/__tests__/utils.test.js +0 -5
  189. package/controller/src/defaults.js +0 -19
  190. package/controller/src/index.js +0 -328
  191. package/controller/src/utils.js +0 -29
  192. package/docs/config-schema.json +0 -2023
  193. package/docs/config-schema.json.md +0 -1495
  194. package/docs/demo/config.js +0 -8
  195. package/docs/demo/generate.js +0 -118
  196. package/docs/demo/index.html +0 -1
  197. package/docs/demo/session.js +0 -11
  198. package/docs/pie-schema.json +0 -1204
  199. package/docs/pie-schema.json.md +0 -851
  200. package/lib/hotspot/circle.js +0 -156
  201. package/lib/hotspot/circle.js.map +0 -1
  202. package/lib/hotspot/container.js +0 -206
  203. package/lib/hotspot/container.js.map +0 -1
  204. package/lib/hotspot/icons.js +0 -8
  205. package/lib/hotspot/icons.js.map +0 -1
  206. package/lib/hotspot/image-konva-tooltip.js +0 -86
  207. package/lib/hotspot/image-konva-tooltip.js.map +0 -1
  208. package/lib/hotspot/index.js +0 -163
  209. package/lib/hotspot/index.js.map +0 -1
  210. package/lib/hotspot/polygon.js +0 -203
  211. package/lib/hotspot/polygon.js.map +0 -1
  212. package/lib/hotspot/rectangle.js +0 -175
  213. package/lib/hotspot/rectangle.js.map +0 -1
  214. package/lib/index.js +0 -213
  215. package/lib/index.js.map +0 -1
  216. package/lib/session-updater.js +0 -42
  217. package/lib/session-updater.js.map +0 -1
  218. package/src/__tests__/container.test.jsx +0 -58
  219. package/src/__tests__/index.test.js +0 -123
  220. package/src/__tests__/session-updater.test.jsx +0 -69
  221. package/src/hotspot/__tests__/circle.test.jsx +0 -464
  222. package/src/hotspot/__tests__/container.test.jsx +0 -546
  223. package/src/hotspot/__tests__/image-konva-tooltip.test.jsx +0 -510
  224. package/src/hotspot/__tests__/polygon.test.jsx +0 -502
  225. package/src/hotspot/__tests__/rectangle.test.jsx +0 -418
  226. package/src/hotspot/circle.jsx +0 -152
  227. package/src/hotspot/container.jsx +0 -217
  228. package/src/hotspot/icons.js +0 -7
  229. package/src/hotspot/image-konva-tooltip.jsx +0 -76
  230. package/src/hotspot/index.jsx +0 -165
  231. package/src/hotspot/polygon.jsx +0 -195
  232. package/src/hotspot/rectangle.jsx +0 -171
  233. package/src/index.js +0 -226
  234. package/src/session-updater.js +0 -29
@@ -1,81 +0,0 @@
1
- export class PolygonShape {
2
- static name = 'polygon'
3
-
4
- static create(shapes, e) {
5
- const newShapes = [...shapes];
6
- const newPolygon = {
7
- id: 'newPolygon',
8
- points: [{ x: e.evt.layerX, y: e.evt.layerY }],
9
- group: 'polygons',
10
- index: newShapes.length,
11
- };
12
-
13
- newShapes.push(newPolygon);
14
-
15
- return {
16
- shapes: newShapes,
17
- isDrawing: true,
18
- isDrawingShapeId: newPolygon.id,
19
- };
20
- }
21
-
22
- static addPoint(state, e, onPolygonComplete) {
23
- // Number of pixels allowed to determine if the first point was clicked
24
- const clickDelta = 5;
25
-
26
- const shapesCopy = JSON.parse(JSON.stringify(state.shapes));
27
- const currentShapeIndex = shapesCopy.findIndex((shape) => shape.id === state.isDrawingShapeId);
28
-
29
- if (currentShapeIndex !== -1) {
30
- const currentShape = shapesCopy[currentShapeIndex];
31
- if (currentShape.points && Array.isArray(currentShape.points)) {
32
- const firstPoint = currentShape.points[0];
33
-
34
- // If click is close enough to the first point (within clickDelta pixels), close the polygon
35
- if (
36
- Math.abs(firstPoint.x - e.evt.layerX) <= clickDelta &&
37
- Math.abs(firstPoint.y - e.evt.layerY) <= clickDelta
38
- ) {
39
- return PolygonShape.finalizeCreation(state, onPolygonComplete);
40
- }
41
-
42
- currentShape.points.push({ x: e.evt.layerX, y: e.evt.layerY });
43
- shapesCopy[currentShapeIndex] = currentShape;
44
-
45
- return {
46
- shapes: shapesCopy,
47
- };
48
- }
49
- }
50
- return state;
51
- }
52
-
53
- static finalizeCreation(state, onPolygonComplete) {
54
- const { shapes } = state;
55
- const tempShapes = [...shapes];
56
- const highestId = Math.max(...state.shapes.map((shape) => parseInt(shape.id) || 0), 0);
57
-
58
- const polygonIndex = tempShapes.findIndex((shape) => shape.id === state.isDrawingShapeId);
59
-
60
- if (polygonIndex !== -1 && tempShapes[polygonIndex].points.length > 2) {
61
- const completedPolygon = tempShapes[polygonIndex];
62
-
63
- completedPolygon.id = `${highestId + 1}`;
64
- onPolygonComplete(tempShapes);
65
-
66
- return {
67
- isDrawing: false,
68
- shapes: tempShapes,
69
- isDrawingShapeId: undefined,
70
- };
71
- }
72
-
73
- return state;
74
- }
75
-
76
- // No need to update anything on mouse move,
77
- // but it's here if we need to add any logic later.
78
- static handleMouseMove(state, e) {
79
- return state;
80
- }
81
- }
@@ -1,82 +0,0 @@
1
- export class RectangleShape {
2
- static name = 'rectangle'
3
-
4
- static create(shapes, e) {
5
- const newShapes = [...shapes];
6
- const highestId = Math.max(...newShapes.map((shape) => parseInt(shape.id)), 0) || 0;
7
-
8
- const newRectangle = {
9
- id: `${highestId + 1}`,
10
- height: 0,
11
- width: 0,
12
- x: e.evt.layerX,
13
- y: e.evt.layerY,
14
- group: 'rectangles',
15
- index: newShapes.length,
16
- };
17
-
18
- newShapes.push(newRectangle);
19
-
20
- return {
21
- shapes: newShapes,
22
- isDrawing: true,
23
- isDrawingShapeId: newRectangle.id,
24
- };
25
- }
26
-
27
- static finalizeCreation(state, props) {
28
- const currentShapeIndex = state.shapes.findIndex((shape) => shape.id === state.isDrawingShapeId);
29
-
30
- if (currentShapeIndex !== -1) {
31
- const currentShape = state.shapes[currentShapeIndex];
32
-
33
- // Check if the shape is a valid rectangle (has more than 0 width and height) before finalizing
34
- if (currentShape.width > 0 && currentShape.height > 0) {
35
- return {
36
- ...state,
37
- isDrawing: false,
38
- stateShapes: false,
39
- isDrawingShapeId: undefined,
40
- };
41
- } else {
42
- return {
43
- ...state,
44
- isDrawing: false,
45
- stateShapes: false,
46
- isDrawingShapeId: undefined,
47
- shapes: state.shapes.filter((shape) => shape.id !== state.isDrawingShapeId),
48
- };
49
- }
50
- }
51
-
52
- // Return current state if not drawing a rectangle
53
- return {
54
- ...state,
55
- isDrawing: false,
56
- stateShapes: false,
57
- isDrawingShapeId: undefined,
58
- };
59
- }
60
-
61
- static handleMouseMove(state, e) {
62
- const { isDrawing, isDrawingShapeId, shapes } = state;
63
-
64
- if (isDrawing) {
65
- const tempShapes = [...shapes];
66
- const resizingShapeIndex = tempShapes.findIndex((shape) => shape.id === isDrawingShapeId);
67
-
68
- if (resizingShapeIndex !== -1) {
69
- const resizingShape = tempShapes[resizingShapeIndex];
70
-
71
- resizingShape.width = e.evt.layerX - resizingShape.x;
72
- resizingShape.height = e.evt.layerY - resizingShape.y;
73
-
74
- return {
75
- shapes: tempShapes,
76
- };
77
- }
78
- }
79
-
80
- return state;
81
- }
82
- }
@@ -1,16 +0,0 @@
1
- import { CircleShape } from './circle';
2
- import { PolygonShape } from './polygon';
3
- import { RectangleShape } from './rectagle';
4
-
5
- export const SUPPORTED_SHAPES = {
6
- CIRCLE: CircleShape.name,
7
- POLYGON: PolygonShape.name,
8
- RECTANGLE: RectangleShape.name,
9
- NONE: 'none',
10
- };
11
-
12
- export const SHAPE_GROUPS = {
13
- CIRCLES: 'circles',
14
- POLYGONS: 'polygons',
15
- RECTANGLES: 'rectangles',
16
- };
@@ -1,33 +0,0 @@
1
- import React from 'react';
2
- import PropTypes from 'prop-types';
3
-
4
- import Button from './button';
5
-
6
- const UploadControl = ({ label, onInputClick, onUploadImage, setRef }) => (
7
- <>
8
- <Button label={label} onClick={onInputClick} />
9
- <input
10
- accept="image/*"
11
- style={{ display: 'none' }}
12
- onChange={onUploadImage}
13
- ref={(ref) => {
14
- setRef(ref);
15
- }}
16
- type="file"
17
- />
18
- </>
19
- );
20
-
21
- UploadControl.propTypes = {
22
- label: PropTypes.string.isRequired,
23
- onInputClick: PropTypes.func.isRequired,
24
- onUploadImage: PropTypes.func.isRequired,
25
- setRef: PropTypes.func.isRequired,
26
- };
27
-
28
- UploadControl.defaultProps = {
29
- classNameButton: '',
30
- classNameSection: '',
31
- };
32
-
33
- export default UploadControl;
@@ -1,210 +0,0 @@
1
- import { cloneDeep } from 'lodash-es';
2
- import { SHAPE_GROUPS } from './shapes';
3
-
4
- const updateImageDimensions = (initialDim, nextDim, keepAspectRatio, resizeType) => {
5
- // if we want to keep image aspect ratio
6
- if (keepAspectRatio) {
7
- const imageAspectRatio = initialDim.width / initialDim.height;
8
-
9
- if (resizeType === 'height') {
10
- // if we want to change image height => we update the width accordingly
11
- return {
12
- width: nextDim.height * imageAspectRatio,
13
- height: nextDim.height,
14
- };
15
- }
16
-
17
- // if we want to change image width => we update the height accordingly
18
- return {
19
- width: nextDim.width,
20
- height: nextDim.width / imageAspectRatio,
21
- };
22
- }
23
-
24
- // if we don't want to keep aspect ratio, we just update both values
25
- return {
26
- width: nextDim.width,
27
- height: nextDim.height,
28
- };
29
- };
30
-
31
- // referenceInitialValue = the initial value of the Stage
32
- // referenceNextValue = the next value of the Stage
33
- // currentValue = the value that has to be re-sized influenced by the changes that were made on the Stage
34
- const getDelta = (referenceInitialValue, referenceNextValue, currentValue) =>
35
- (referenceNextValue / referenceInitialValue) * currentValue;
36
-
37
- const getUpdatedRectangle = (initialDim, nextDim, shape) => ({
38
- ...shape,
39
- width: getDelta(initialDim.width, nextDim.width, shape.width),
40
- height: getDelta(initialDim.height, nextDim.height, shape.height),
41
- x: getDelta(initialDim.width, nextDim.width, shape.x),
42
- y: getDelta(initialDim.height, nextDim.height, shape.y),
43
- });
44
-
45
- const getUpdatedCircles = (initialDim, nextDim, shape) => ({
46
- ...shape,
47
- radius: getDelta(initialDim.width, nextDim.width, shape.radius),
48
- x: getDelta(initialDim.width, nextDim.width, shape.x),
49
- y: getDelta(initialDim.height, nextDim.height, shape.y),
50
- });
51
-
52
- const getUpdatedPolygon = (initialDim, nextDim, shape) => ({
53
- ...shape,
54
- points: shape.points.map((point) => ({
55
- x: getDelta(initialDim.width, nextDim.width, point.x),
56
- y: getDelta(initialDim.height, nextDim.height, point.y),
57
- })),
58
- });
59
-
60
- // initialDim = the initial dimensions: { width, height } of the Stage
61
- // nextDim = the next dimensions: { width, height } of the Stage
62
- // shapes = array of shapes that have to be re-sized and re-positioned
63
- const getUpdatedShapes = (initialDim, nextDim, shapes) => {
64
- return shapes.map((shape) => {
65
- if (shape.group === SHAPE_GROUPS.RECTANGLES) {
66
- return getUpdatedRectangle(initialDim, nextDim, shape);
67
- }
68
-
69
- if (shape.group === SHAPE_GROUPS.POLYGONS) {
70
- return getUpdatedPolygon(initialDim, nextDim, shape);
71
- }
72
-
73
- if (shape.group === SHAPE_GROUPS.CIRCLES) {
74
- return getUpdatedCircles(initialDim, nextDim, shape);
75
- }
76
- });
77
- };
78
-
79
- // converts shapes map to shapes array
80
- // example:
81
- // from: { rectangles: [r1], polygons: [p1, p2]}
82
- // to: [{ ...r1, group: 'rectangles' }, { ...p1, group: 'polygons' }, { ...p2, group: 'polygons' }]
83
- // if a shape has index defined, keep it, otherwise initialize it
84
- // index is used for the UNDO function
85
- const getAllShapes = (shapesMap) => {
86
- shapesMap = shapesMap || {};
87
- const shapesArray = [];
88
- const shapesKeys = Object.keys(shapesMap);
89
-
90
- return shapesKeys.length
91
- ? shapesKeys.reduce(
92
- (acc, currentShapeKey) =>
93
- acc.concat(
94
- shapesMap[currentShapeKey]
95
- ? shapesMap[currentShapeKey].map((shape, index) => ({
96
- ...shape,
97
- group: currentShapeKey,
98
- index: shape.index || acc.length + index,
99
- }))
100
- : [],
101
- ),
102
- shapesArray,
103
- )
104
- : shapesArray;
105
- };
106
-
107
- // converts shapes array to shapes map
108
- // is the reverse of getAllShapes function
109
- // example:
110
- // from: [{ ...r1, group: 'rectangles' }, { ...p1, group: 'polygons' }, { ...p2, group: 'polygons' }]
111
- // to: { rectangles: [r1], polygons: [p1, p2]}
112
- const groupShapes = (shapesArray) => {
113
- shapesArray = shapesArray || [];
114
- const shapesMap = {
115
- rectangles: [],
116
- polygons: [],
117
- circles: [],
118
- };
119
-
120
- if (shapesArray.length) {
121
- return shapesArray.reduce((acc, { group, ...shapeProps }) => {
122
- acc[group] = [...(acc[group] || []), shapeProps];
123
- return acc;
124
- }, shapesMap);
125
- }
126
-
127
- return cloneDeep(shapesMap);
128
- };
129
-
130
- const isPointInsidePolygon = (polygon, x, y) => {
131
- let inside = false;
132
-
133
- if (!polygon || polygon.length <= 0) {
134
- return inside;
135
- }
136
-
137
- for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
138
- const xi = polygon[i].x;
139
- const yi = polygon[i].y;
140
- const xj = polygon[j].x;
141
- const yj = polygon[j].y;
142
-
143
- const intersect = yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi;
144
-
145
- if (intersect) {
146
- inside = !inside;
147
- }
148
- }
149
-
150
- return inside;
151
- };
152
-
153
- const calculate = (polygonPoints) => {
154
- if (!polygonPoints || polygonPoints.length <= 0) {
155
- return { x: 0, y: 0 };
156
- }
157
-
158
- const xPoints = polygonPoints.map((point) => point.x);
159
- const yPoints = polygonPoints.map((point) => point.y);
160
- const minX = Math.min(...xPoints);
161
- const minY = Math.min(...yPoints);
162
- const maxX = Math.max(...xPoints);
163
- const maxY = Math.max(...yPoints);
164
-
165
- // Find a suitable position for the text element within the polygon
166
- let textX, textY;
167
-
168
- for (let x = minX; x <= maxX - 20; x++) {
169
- for (let y = maxY - 20; y > minY; y--) {
170
- // Check if the text element's position (x, y) is within the polygon
171
- if (isPointInsidePolygon(polygonPoints, x, y)) {
172
- textX = x - 10;
173
- textY = y;
174
- break;
175
- }
176
- }
177
- }
178
-
179
- return { x: textX, y: textY };
180
- };
181
-
182
- const generateValidationMessage = (config) => {
183
- const { minShapes, maxShapes, maxSelections } = config;
184
-
185
- const shapesMessage =
186
- `\nThere should be at least ${minShapes} ` + (maxShapes ? `and at most ${maxShapes} ` : '') + 'shapes defined.';
187
-
188
- const selectionsMessage =
189
- '\nThere should be at least 1 ' +
190
- (maxSelections ? `and at most ${maxSelections} ` : '') +
191
- 'shape' +
192
- (maxSelections ? 's' : '') +
193
- ' selected.';
194
-
195
- const message = 'Validation requirements:' + shapesMessage + selectionsMessage;
196
-
197
- return message;
198
- };
199
-
200
- export {
201
- calculate,
202
- isPointInsidePolygon,
203
- updateImageDimensions,
204
- generateValidationMessage,
205
- getUpdatedShapes,
206
- getAllShapes,
207
- groupShapes,
208
- getUpdatedRectangle,
209
- getUpdatedPolygon,
210
- };