@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,259 +0,0 @@
1
- import React from 'react';
2
- import { render, fireEvent } from '@testing-library/react';
3
- import Konva from 'konva';
4
- import CircleComponent from '../hotspot-circle';
5
-
6
- Konva.isBrowser = false;
7
-
8
- jest.mock('react-konva', () => {
9
- const React = require('react');
10
- return {
11
- Circle: React.forwardRef(({ onClick, onTap, onMouseEnter, onMouseLeave, onDragStart, onDragEnd, onTransformStart, onTransformEnd, ...props }, ref) => {
12
- const handleClick = (e) => {
13
- if (onClick) onClick(e);
14
- if (onTap) onTap(e);
15
- };
16
- return React.createElement('div', {
17
- ref,
18
- 'data-testid': 'circle',
19
- onClick: handleClick,
20
- onMouseEnter,
21
- onMouseLeave,
22
- ...props,
23
- });
24
- }),
25
- Group: ({ children, onMouseEnter, onMouseLeave, ...props }) =>
26
- React.createElement('div', { 'data-testid': 'group', onMouseEnter, onMouseLeave, ...props }, children),
27
- Transformer: React.forwardRef(({ borderStroke, ...props }, ref) => {
28
- return React.createElement('div', { ref, 'data-testid': 'transformer', 'data-border-stroke': borderStroke, ...props });
29
- }),
30
- };
31
- });
32
-
33
- jest.mock('../DeleteWidget', () => {
34
- return function DeleteWidget({ id, handleWidgetClick }) {
35
- return (
36
- <div
37
- data-testid="delete-widget"
38
- data-id={id}
39
- onClick={() => handleWidgetClick(id)}
40
- />
41
- );
42
- };
43
- });
44
-
45
- describe('CircleComponent', () => {
46
- let defaultProps;
47
-
48
- beforeEach(() => {
49
- defaultProps = {
50
- id: 'circle1',
51
- x: 100,
52
- y: 150,
53
- radius: 50,
54
- hotspotColor: '#FF0000',
55
- selectedHotspotColor: '#00FF00',
56
- outlineColor: '#0000FF',
57
- hoverOutlineColor: '#FFFF00',
58
- correct: false,
59
- isDrawing: false,
60
- onClick: jest.fn(),
61
- onDeleteShape: jest.fn(),
62
- onDragEnd: jest.fn(),
63
- strokeWidth: 5,
64
- };
65
-
66
- document.body.style.cursor = 'default';
67
- });
68
-
69
- afterEach(() => {
70
- document.body.style.cursor = 'default';
71
- });
72
-
73
- describe('rendering', () => {
74
- it('should render without crashing', () => {
75
- const { container } = render(<CircleComponent {...defaultProps} />);
76
- expect(container).toBeTruthy();
77
- });
78
-
79
- it('should render Group and Circle', () => {
80
- const { getByTestId } = render(<CircleComponent {...defaultProps} />);
81
- expect(getByTestId('group')).toBeInTheDocument();
82
- expect(getByTestId('circle')).toBeInTheDocument();
83
- });
84
-
85
- it('should render with correct radius', () => {
86
- const { getByTestId } = render(<CircleComponent {...defaultProps} radius={75} />);
87
- const circle = getByTestId('circle');
88
- expect(circle).toHaveAttribute('radius', '75');
89
- });
90
-
91
- it('should use minimum radius of 5 for invalid radius', () => {
92
- const { getByTestId } = render(<CircleComponent {...defaultProps} radius={0} />);
93
- const circle = getByTestId('circle');
94
- expect(circle).toHaveAttribute('radius', '5');
95
- });
96
-
97
- it('should use minimum radius of 5 for NaN radius', () => {
98
- const { getByTestId } = render(<CircleComponent {...defaultProps} radius={NaN} />);
99
- const circle = getByTestId('circle');
100
- expect(circle).toHaveAttribute('radius', '5');
101
- });
102
-
103
- it('should use minimum radius of 5 for negative radius', () => {
104
- const { getByTestId } = render(<CircleComponent {...defaultProps} radius={-10} />);
105
- const circle = getByTestId('circle');
106
- expect(circle).toHaveAttribute('radius', '5');
107
- });
108
-
109
- it('should render with hotspot color when not correct', () => {
110
- const { getByTestId } = render(<CircleComponent {...defaultProps} correct={false} />);
111
- const circle = getByTestId('circle');
112
- expect(circle).toHaveAttribute('fill', '#FF0000');
113
- });
114
-
115
- it('should render with selected color when correct', () => {
116
- const { getByTestId } = render(<CircleComponent {...defaultProps} correct={true} />);
117
- const circle = getByTestId('circle');
118
- expect(circle).toHaveAttribute('fill', '#00FF00');
119
- });
120
- });
121
-
122
- describe('interactions', () => {
123
- it('should call onClick when clicked', () => {
124
- const onClick = jest.fn();
125
- const { getByTestId } = render(<CircleComponent {...defaultProps} onClick={onClick} />);
126
- const circle = getByTestId('circle');
127
-
128
- fireEvent.click(circle);
129
-
130
- expect(onClick).toHaveBeenCalledWith('circle1');
131
- });
132
-
133
- it('should not call onClick when radius is 0 and isDrawing', () => {
134
- const onClick = jest.fn();
135
- const { getByTestId } = render(
136
- <CircleComponent {...defaultProps} radius={0} isDrawing={true} onClick={onClick} />
137
- );
138
- const circle = getByTestId('circle');
139
-
140
- fireEvent.click(circle);
141
-
142
- expect(onClick).not.toHaveBeenCalled();
143
- });
144
- });
145
-
146
- describe('hover state', () => {
147
- it('should not show Transformer when not hovered', () => {
148
- const { queryByTestId } = render(<CircleComponent {...defaultProps} />);
149
-
150
- expect(queryByTestId('transformer')).not.toBeInTheDocument();
151
- });
152
- });
153
-
154
- describe('drag functionality', () => {
155
- it('should call onDragEnd with new position', () => {
156
- const onDragEnd = jest.fn();
157
- const { getByTestId } = render(
158
- <CircleComponent {...defaultProps} onDragEnd={onDragEnd} />
159
- );
160
- const circle = getByTestId('circle');
161
-
162
- const mockEvent = {
163
- target: {
164
- x: () => 200,
165
- y: () => 250,
166
- },
167
- };
168
-
169
- if (circle.onDragEnd) {
170
- circle.onDragEnd(mockEvent);
171
- }
172
- });
173
- });
174
-
175
- describe('resize functionality', () => {
176
- it('should handle resize with minimum radius constraint', () => {
177
- const onDragEnd = jest.fn();
178
- const { getByTestId } = render(
179
- <CircleComponent {...defaultProps} onDragEnd={onDragEnd} />
180
- );
181
-
182
- // This tests the component's ability to handle transforms
183
- // In actual usage, the transformer would modify the node's scale
184
- const transformer = getByTestId('group');
185
- expect(transformer).toBeInTheDocument();
186
- });
187
- });
188
-
189
- describe('edge cases', () => {
190
- it('should handle very large radius', () => {
191
- const { getByTestId } = render(<CircleComponent {...defaultProps} radius={500} />);
192
- const circle = getByTestId('circle');
193
- expect(circle).toHaveAttribute('radius', '500');
194
- });
195
-
196
- it('should handle position at origin', () => {
197
- const { getByTestId } = render(<CircleComponent {...defaultProps} x={0} y={0} />);
198
- const circle = getByTestId('circle');
199
- expect(circle).toHaveAttribute('x', '0');
200
- expect(circle).toHaveAttribute('y', '0');
201
- });
202
-
203
- it('should handle negative positions', () => {
204
- const { getByTestId } = render(<CircleComponent {...defaultProps} x={-50} y={-75} />);
205
- const circle = getByTestId('circle');
206
- expect(circle).toHaveAttribute('x', '-50');
207
- expect(circle).toHaveAttribute('y', '-75');
208
- });
209
-
210
- it('should use default correct value of false', () => {
211
- const { getByTestId } = render(<CircleComponent {...defaultProps} correct={undefined} />);
212
- const circle = getByTestId('circle');
213
- expect(circle).toHaveAttribute('fill', '#FF0000');
214
- });
215
-
216
- it('should handle missing selectedHotspotColor', () => {
217
- const { getByTestId } = render(
218
- <CircleComponent {...defaultProps} correct={true} selectedHotspotColor={undefined} />
219
- );
220
- const circle = getByTestId('circle');
221
- // Should fall back to hotspotColor
222
- expect(circle).toHaveAttribute('fill', '#FF0000');
223
- });
224
- });
225
-
226
- describe('prop updates', () => {
227
- it('should update radius when prop changes', () => {
228
- const { getByTestId, rerender } = render(<CircleComponent {...defaultProps} radius={50} />);
229
- let circle = getByTestId('circle');
230
- expect(circle).toHaveAttribute('radius', '50');
231
-
232
- rerender(<CircleComponent {...defaultProps} radius={75} />);
233
- circle = getByTestId('circle');
234
- expect(circle).toHaveAttribute('radius', '75');
235
- });
236
-
237
- it('should update color when correct prop changes', () => {
238
- const { getByTestId, rerender } = render(<CircleComponent {...defaultProps} correct={false} />);
239
- let circle = getByTestId('circle');
240
- expect(circle).toHaveAttribute('fill', '#FF0000');
241
-
242
- rerender(<CircleComponent {...defaultProps} correct={true} />);
243
- circle = getByTestId('circle');
244
- expect(circle).toHaveAttribute('fill', '#00FF00');
245
- });
246
-
247
- it('should update position when props change', () => {
248
- const { getByTestId, rerender } = render(<CircleComponent {...defaultProps} x={100} y={150} />);
249
- let circle = getByTestId('circle');
250
- expect(circle).toHaveAttribute('x', '100');
251
- expect(circle).toHaveAttribute('y', '150');
252
-
253
- rerender(<CircleComponent {...defaultProps} x={200} y={250} />);
254
- circle = getByTestId('circle');
255
- expect(circle).toHaveAttribute('x', '200');
256
- expect(circle).toHaveAttribute('y', '250');
257
- });
258
- });
259
- });
@@ -1,366 +0,0 @@
1
- import { render } from '@testing-library/react';
2
- import React from 'react';
3
- import { Container } from '../hotspot-container';
4
- import { getAllShapes, groupShapes } from '../utils';
5
-
6
- jest.mock('react-konva', () => {
7
- const React = require('react');
8
- return {
9
- Stage: ({ children, ...props }) => React.createElement('div', { 'data-testid': 'stage', ...props }, children),
10
- Layer: ({ children, ...props }) => React.createElement('div', { 'data-testid': 'layer', ...props }, children),
11
- Rect: (props) => React.createElement('div', { 'data-testid': 'rect', ...props }),
12
- Circle: (props) => React.createElement('div', { 'data-testid': 'circle', ...props }),
13
- Line: (props) => React.createElement('div', { 'data-testid': 'line', ...props }),
14
- Group: ({ children, ...props }) => React.createElement('div', { 'data-testid': 'group', ...props }, children),
15
- Image: (props) => React.createElement('div', { 'data-testid': 'image', ...props }),
16
- };
17
- });
18
-
19
- const model = () => ({
20
- imageUrl: 'https://cdn.fluence.net/image/0240eb1455ce4c4bb6180232347b6aef_W',
21
- shapes: groupShapes(
22
- getAllShapes({
23
- rectangles: [
24
- {
25
- id: '0',
26
- height: 140,
27
- width: 130,
28
- x: 1,
29
- y: 1,
30
- correct: true,
31
- },
32
- {
33
- id: '1',
34
- height: 140,
35
- width: 130,
36
- x: 140,
37
- y: 1,
38
- },
39
- {
40
- id: '2',
41
- height: 140,
42
- width: 130,
43
- x: 280,
44
- y: 1,
45
- },
46
- ],
47
- polygons: [
48
- {
49
- id: '3',
50
- points: [
51
- { x: 1, y: 148 },
52
- { x: 1, y: 288 },
53
- { y: 288, x: 129 },
54
- { y: 148, x: 129 },
55
- ],
56
- correct: true,
57
- },
58
- {
59
- id: '4',
60
- points: [
61
- { y: 151, x: 141 },
62
- { y: 289, x: 141 },
63
- { y: 289, x: 269 },
64
- { x: 269, y: 151 },
65
- ],
66
- correct: false,
67
- },
68
- {
69
- id: '5',
70
- points: [
71
- { x: 279, y: 150 },
72
- { x: 279, y: 289 },
73
- { x: 407, y: 289 },
74
- { x: 407, y: 150 },
75
- ],
76
- correct: false,
77
- },
78
- ],
79
- circles: [
80
- {
81
- id: '6',
82
- radius: 70,
83
- x: 100,
84
- y: 100,
85
- correct: false,
86
- },
87
- {
88
- id: '7',
89
- radius: 30,
90
- x: 200,
91
- y: 150,
92
- correct: true,
93
- },
94
- ],
95
- }),
96
- ),
97
- dimensions: {
98
- height: 291,
99
- width: 410,
100
- },
101
- hotspotColor: 'rgba(137, 183, 244, 0.65)',
102
- outlineColor: 'blue',
103
- multipleCorrect: true,
104
- });
105
-
106
- describe('HotspotContainer', () => {
107
- let w,
108
- onImageUpload = jest.fn(),
109
- onUpdateImageDimension = jest.fn(),
110
- onDeleteShape = jest.fn(),
111
- onUpdateShapes = jest.fn(),
112
- initialModel = model();
113
- beforeEach(() => {
114
- w = (extras) => {
115
- const props = {
116
- classes: {},
117
- dimensions: initialModel.dimensions,
118
- imageUrl: initialModel.imageUrl,
119
- multipleCorrect: initialModel.multipleCorrect,
120
- hotspotColor: initialModel.hotspotColor,
121
- outlineColor: initialModel.outlineColor,
122
- onUpdateImageDimension: onUpdateImageDimension,
123
- onUpdateShapes: onUpdateShapes,
124
- onDeleteShape: onDeleteShape,
125
- onImageUpload: onImageUpload,
126
- shapes: initialModel.shapes,
127
- ...extras,
128
- };
129
-
130
- return render(<Container {...props} />);
131
- };
132
- });
133
-
134
- describe('logic', () => {
135
- const createInstance = () => {
136
- const props = {
137
- classes: {},
138
- dimensions: initialModel.dimensions,
139
- imageUrl: initialModel.imageUrl,
140
- multipleCorrect: initialModel.multipleCorrect,
141
- hotspotColor: initialModel.hotspotColor,
142
- outlineColor: initialModel.outlineColor,
143
- onUpdateImageDimension: onUpdateImageDimension,
144
- onUpdateShapes: onUpdateShapes,
145
- onDeleteShape: onDeleteShape,
146
- onImageUpload: onImageUpload,
147
- shapes: initialModel.shapes,
148
- };
149
- const instance = new Container(props);
150
-
151
- // Mock setState to execute callback immediately for testing
152
- instance.setState = jest.fn((state, callback) => {
153
- Object.assign(instance.state, typeof state === 'function' ? state(instance.state) : state);
154
- if (callback) callback();
155
- });
156
-
157
- return instance;
158
- };
159
-
160
- let formattedShapes = [
161
- {
162
- id: '0',
163
- height: 140,
164
- width: 130,
165
- x: 1,
166
- y: 1,
167
- correct: true,
168
- group: 'rectangles',
169
- index: 0,
170
- },
171
- {
172
- id: '1',
173
- height: 140,
174
- width: 130,
175
- x: 140,
176
- y: 1,
177
- group: 'rectangles',
178
- index: 1,
179
- },
180
- {
181
- id: '2',
182
- height: 140,
183
- width: 130,
184
- x: 280,
185
- y: 1,
186
- group: 'rectangles',
187
- index: 2,
188
- },
189
- {
190
- id: '3',
191
- points: [
192
- { x: 1, y: 148 },
193
- { x: 1, y: 288 },
194
- { y: 288, x: 129 },
195
- { y: 148, x: 129 },
196
- ],
197
- correct: true,
198
- group: 'polygons',
199
- index: 3,
200
- },
201
- {
202
- id: '4',
203
- points: [
204
- { y: 151, x: 141 },
205
- { y: 289, x: 141 },
206
- { y: 289, x: 269 },
207
- { x: 269, y: 151 },
208
- ],
209
- correct: false,
210
- group: 'polygons',
211
- index: 4,
212
- },
213
- {
214
- id: '5',
215
- points: [
216
- { x: 279, y: 150 },
217
- { x: 279, y: 289 },
218
- { x: 407, y: 289 },
219
- { x: 407, y: 150 },
220
- ],
221
- correct: false,
222
- group: 'polygons',
223
- index: 5,
224
- },
225
- {
226
- id: '6',
227
- radius: 70,
228
- x: 100,
229
- y: 100,
230
- correct: false,
231
- group: 'circles',
232
- index: 6,
233
- },
234
- {
235
- id: '7',
236
- radius: 30,
237
- x: 200,
238
- y: 150,
239
- correct: true,
240
- group: 'circles',
241
- index: 7,
242
- },
243
- ];
244
-
245
- it('state will contain formatted shapes', () => {
246
- const instance = createInstance();
247
- expect(instance.state.shapes).toEqual(expect.arrayContaining(formattedShapes));
248
- });
249
-
250
- it('onUpdateShapes with new added shape', () => {
251
- const instance = createInstance();
252
- const newShape = {
253
- id: '8',
254
- height: 140,
255
- width: 130,
256
- x: 280,
257
- y: 1,
258
- group: 'rectangles',
259
- };
260
-
261
- instance.onUpdateShapes([...formattedShapes, newShape]);
262
-
263
- expect(onUpdateShapes).toHaveBeenLastCalledWith({
264
- rectangles: [
265
- ...initialModel.shapes.rectangles,
266
- {
267
- id: '8',
268
- height: 140,
269
- width: 130,
270
- x: 280,
271
- y: 1,
272
- },
273
- ],
274
- polygons: initialModel.shapes.polygons,
275
- circles: initialModel.shapes.circles,
276
- });
277
- });
278
-
279
- it('onDeleteShape by id', () => {
280
- const instance = createInstance();
281
- instance.onDeleteShape('8');
282
- expect(onUpdateShapes).toHaveBeenCalledWith(
283
- groupShapes([
284
- { correct: true, group: 'rectangles', height: 140, id: '0', index: 0, width: 130, x: 1, y: 1 },
285
- { group: 'rectangles', height: 140, id: '1', index: 1, width: 130, x: 140, y: 1 },
286
- { group: 'rectangles', height: 140, id: '2', index: 2, width: 130, x: 280, y: 1 },
287
- {
288
- correct: true,
289
- group: 'polygons',
290
- id: '3',
291
- index: 3,
292
- points: [
293
- { x: 1, y: 148 },
294
- { x: 1, y: 288 },
295
- { x: 129, y: 288 },
296
- { x: 129, y: 148 },
297
- ],
298
- },
299
- {
300
- correct: false,
301
- group: 'polygons',
302
- id: '4',
303
- index: 4,
304
- points: [
305
- { x: 141, y: 151 },
306
- { x: 141, y: 289 },
307
- { x: 269, y: 289 },
308
- { x: 269, y: 151 },
309
- ],
310
- },
311
- {
312
- correct: false,
313
- group: 'polygons',
314
- id: '5',
315
- index: 5,
316
- points: [
317
- { x: 279, y: 150 },
318
- { x: 279, y: 289 },
319
- { x: 407, y: 289 },
320
- { x: 407, y: 150 },
321
- ],
322
- },
323
- {
324
- id: '6',
325
- radius: 70,
326
- x: 100,
327
- y: 100,
328
- correct: false,
329
- group: 'circles',
330
- index: 6,
331
- },
332
- {
333
- id: '7',
334
- radius: 30,
335
- x: 200,
336
- y: 150,
337
- correct: true,
338
- group: 'circles',
339
- index: 7,
340
- },
341
- ]),
342
- );
343
- });
344
-
345
- it('onUpdateShapes with no shapes', () => {
346
- const instance = createInstance();
347
- instance.onUpdateShapes([]);
348
-
349
- expect(onUpdateShapes).toHaveBeenLastCalledWith({
350
- rectangles: [],
351
- polygons: [],
352
- circles: [],
353
- });
354
- });
355
-
356
- it('handleClearAll', () => {
357
- const instance = createInstance();
358
- instance.handleClearAll();
359
- expect(onUpdateShapes).toHaveBeenLastCalledWith({
360
- rectangles: [],
361
- polygons: [],
362
- circles: [],
363
- });
364
- });
365
- });
366
- });