@pie-element/hotspot 11.2.0-beta.0 → 11.2.0-next.17

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 (236) hide show
  1. package/author.js +2 -0
  2. package/configure.js +2 -0
  3. package/controller.js +1 -0
  4. package/dist/author/DeleteWidget.d.ts +38 -0
  5. package/dist/author/DeleteWidget.js +46 -0
  6. package/dist/author/button.d.ts +31 -0
  7. package/dist/author/button.js +27 -0
  8. package/dist/author/buttons/circle.d.ts +18 -0
  9. package/dist/author/buttons/circle.js +25 -0
  10. package/dist/author/buttons/polygon.d.ts +18 -0
  11. package/dist/author/buttons/polygon.js +36 -0
  12. package/dist/author/buttons/rectangle.d.ts +18 -0
  13. package/dist/author/buttons/rectangle.js +36 -0
  14. package/dist/author/defaults.d.ts +157 -0
  15. package/dist/author/defaults.js +119 -0
  16. package/dist/author/hotspot-circle.d.ts +21 -0
  17. package/dist/author/hotspot-circle.js +124 -0
  18. package/dist/author/hotspot-container.d.ts +29 -0
  19. package/dist/author/hotspot-container.js +210 -0
  20. package/dist/author/hotspot-drawable.d.ts +31 -0
  21. package/dist/author/hotspot-drawable.js +312 -0
  22. package/dist/author/hotspot-palette.d.ts +14 -0
  23. package/dist/author/hotspot-palette.js +72 -0
  24. package/dist/author/hotspot-polygon.d.ts +38 -0
  25. package/dist/author/hotspot-polygon.js +200 -0
  26. package/dist/author/hotspot-rectangle.d.ts +20 -0
  27. package/dist/author/hotspot-rectangle.js +119 -0
  28. package/dist/author/icons.d.ts +9 -0
  29. package/dist/author/icons.js +4 -0
  30. package/dist/author/image-konva.d.ts +19 -0
  31. package/dist/author/image-konva.js +49 -0
  32. package/dist/author/index.d.ts +53 -0
  33. package/dist/author/index.js +146 -0
  34. package/dist/author/root.d.ts +15 -0
  35. package/dist/author/root.js +215 -0
  36. package/dist/author/shapes/circle.d.ts +18 -0
  37. package/dist/author/shapes/circle.js +47 -0
  38. package/dist/author/shapes/index.d.ts +12 -0
  39. package/dist/author/shapes/polygon.d.ts +19 -0
  40. package/dist/author/shapes/polygon.js +51 -0
  41. package/dist/author/shapes/rectagle.d.ts +18 -0
  42. package/dist/author/shapes/rectagle.js +57 -0
  43. package/dist/author/shapes/utils.d.ts +19 -0
  44. package/dist/author/shapes/utils.js +16 -0
  45. package/dist/author/upload-control.d.ts +29 -0
  46. package/dist/author/upload-control.js +28 -0
  47. package/dist/author/utils.d.ts +24 -0
  48. package/dist/author/utils.js +83 -0
  49. package/dist/browser/ReactKonva-C_SewBog.js +19300 -0
  50. package/dist/browser/ReactKonva-C_SewBog.js.map +1 -0
  51. package/dist/browser/author/index.js +36984 -0
  52. package/dist/browser/author/index.js.map +1 -0
  53. package/dist/browser/browser-D4gLESxz.js +226 -0
  54. package/dist/browser/browser-D4gLESxz.js.map +1 -0
  55. package/dist/browser/controller/index.js +198 -0
  56. package/dist/browser/controller/index.js.map +1 -0
  57. package/dist/browser/delivery/index.js +2673 -0
  58. package/dist/browser/delivery/index.js.map +1 -0
  59. package/dist/browser/dist-CJeYAWp3.js +100 -0
  60. package/dist/browser/dist-CJeYAWp3.js.map +1 -0
  61. package/dist/browser/hotspot.css +2 -0
  62. package/dist/controller/defaults.d.ts +35 -0
  63. package/dist/controller/defaults.js +29 -0
  64. package/dist/controller/index.d.ts +22 -0
  65. package/dist/controller/index.js +154 -0
  66. package/dist/controller/utils.d.ts +10 -0
  67. package/dist/controller/utils.js +12 -0
  68. package/dist/delivery/hotspot/circle.d.ts +22 -0
  69. package/dist/delivery/hotspot/circle.js +113 -0
  70. package/dist/delivery/hotspot/container.d.ts +21 -0
  71. package/dist/delivery/hotspot/container.js +217 -0
  72. package/dist/delivery/hotspot/icons.d.ts +10 -0
  73. package/dist/delivery/hotspot/icons.js +4 -0
  74. package/dist/delivery/hotspot/image-konva-tooltip.d.ts +19 -0
  75. package/dist/delivery/hotspot/image-konva-tooltip.js +66 -0
  76. package/dist/delivery/hotspot/index.d.ts +18 -0
  77. package/dist/delivery/hotspot/index.js +119 -0
  78. package/dist/delivery/hotspot/polygon.d.ts +24 -0
  79. package/dist/delivery/hotspot/polygon.js +121 -0
  80. package/dist/delivery/hotspot/rectangle.d.ts +22 -0
  81. package/dist/delivery/hotspot/rectangle.js +116 -0
  82. package/dist/delivery/index.d.ts +20 -0
  83. package/dist/delivery/index.js +109 -0
  84. package/dist/delivery/session-updater.d.ts +10 -0
  85. package/dist/delivery/session-updater.js +14 -0
  86. package/dist/index.d.ts +1 -0
  87. package/dist/index.iife.d.ts +8 -0
  88. package/dist/index.iife.js +169 -0
  89. package/dist/index.js +2 -0
  90. package/dist/runtime-support.d.ts +12 -0
  91. package/dist/runtime-support.js +12 -0
  92. package/package.json +84 -18
  93. package/CHANGELOG.json +0 -997
  94. package/CHANGELOG.md +0 -2230
  95. package/LICENSE.md +0 -5
  96. package/README.md +0 -1
  97. package/configure/CHANGELOG.json +0 -682
  98. package/configure/CHANGELOG.md +0 -1964
  99. package/configure/lib/DeleteWidget.js +0 -64
  100. package/configure/lib/DeleteWidget.js.map +0 -1
  101. package/configure/lib/button.js +0 -42
  102. package/configure/lib/button.js.map +0 -1
  103. package/configure/lib/buttons/circle.js +0 -33
  104. package/configure/lib/buttons/circle.js.map +0 -1
  105. package/configure/lib/buttons/polygon.js +0 -39
  106. package/configure/lib/buttons/polygon.js.map +0 -1
  107. package/configure/lib/buttons/rectangle.js +0 -39
  108. package/configure/lib/buttons/rectangle.js.map +0 -1
  109. package/configure/lib/defaults.js +0 -155
  110. package/configure/lib/defaults.js.map +0 -1
  111. package/configure/lib/hotspot-circle.js +0 -192
  112. package/configure/lib/hotspot-circle.js.map +0 -1
  113. package/configure/lib/hotspot-container.js +0 -320
  114. package/configure/lib/hotspot-container.js.map +0 -1
  115. package/configure/lib/hotspot-drawable.js +0 -519
  116. package/configure/lib/hotspot-drawable.js.map +0 -1
  117. package/configure/lib/hotspot-palette.js +0 -107
  118. package/configure/lib/hotspot-palette.js.map +0 -1
  119. package/configure/lib/hotspot-polygon.js +0 -293
  120. package/configure/lib/hotspot-polygon.js.map +0 -1
  121. package/configure/lib/hotspot-rectangle.js +0 -190
  122. package/configure/lib/hotspot-rectangle.js.map +0 -1
  123. package/configure/lib/icons.js +0 -7
  124. package/configure/lib/icons.js.map +0 -1
  125. package/configure/lib/image-konva.js +0 -66
  126. package/configure/lib/image-konva.js.map +0 -1
  127. package/configure/lib/index.js +0 -198
  128. package/configure/lib/index.js.map +0 -1
  129. package/configure/lib/root.js +0 -331
  130. package/configure/lib/root.js.map +0 -1
  131. package/configure/lib/shapes/circle.js +0 -84
  132. package/configure/lib/shapes/circle.js.map +0 -1
  133. package/configure/lib/shapes/index.js +0 -50
  134. package/configure/lib/shapes/index.js.map +0 -1
  135. package/configure/lib/shapes/polygon.js +0 -82
  136. package/configure/lib/shapes/polygon.js.map +0 -1
  137. package/configure/lib/shapes/rectagle.js +0 -84
  138. package/configure/lib/shapes/rectagle.js.map +0 -1
  139. package/configure/lib/shapes/utils.js +0 -21
  140. package/configure/lib/shapes/utils.js.map +0 -1
  141. package/configure/lib/upload-control.js +0 -41
  142. package/configure/lib/upload-control.js.map +0 -1
  143. package/configure/lib/utils.js +0 -185
  144. package/configure/lib/utils.js.map +0 -1
  145. package/configure/package.json +0 -26
  146. package/configure/src/DeleteWidget.jsx +0 -51
  147. package/configure/src/__tests__/DeleteWidget.test.jsx +0 -366
  148. package/configure/src/__tests__/button.test.jsx +0 -198
  149. package/configure/src/__tests__/hotspot-circle.test.jsx +0 -259
  150. package/configure/src/__tests__/hotspot-container.test.js +0 -366
  151. package/configure/src/__tests__/hotspot-drawable.test.js +0 -271
  152. package/configure/src/__tests__/hotspot-palette.test.jsx +0 -71
  153. package/configure/src/__tests__/image-konva.test.jsx +0 -226
  154. package/configure/src/__tests__/index.test.js +0 -329
  155. package/configure/src/__tests__/root.test.js +0 -400
  156. package/configure/src/__tests__/utils.test.js +0 -241
  157. package/configure/src/button.jsx +0 -35
  158. package/configure/src/buttons/circle.jsx +0 -18
  159. package/configure/src/buttons/polygon.jsx +0 -29
  160. package/configure/src/buttons/rectangle.jsx +0 -29
  161. package/configure/src/defaults.js +0 -109
  162. package/configure/src/hotspot-circle.jsx +0 -183
  163. package/configure/src/hotspot-container.jsx +0 -330
  164. package/configure/src/hotspot-drawable.jsx +0 -527
  165. package/configure/src/hotspot-palette.jsx +0 -90
  166. package/configure/src/hotspot-polygon.jsx +0 -294
  167. package/configure/src/hotspot-rectangle.jsx +0 -169
  168. package/configure/src/icons.js +0 -5
  169. package/configure/src/image-konva.jsx +0 -63
  170. package/configure/src/index.js +0 -213
  171. package/configure/src/root.jsx +0 -342
  172. package/configure/src/shapes/circle.js +0 -81
  173. package/configure/src/shapes/index.js +0 -4
  174. package/configure/src/shapes/polygon.js +0 -81
  175. package/configure/src/shapes/rectagle.js +0 -82
  176. package/configure/src/shapes/utils.js +0 -16
  177. package/configure/src/upload-control.jsx +0 -33
  178. package/configure/src/utils.js +0 -210
  179. package/controller/CHANGELOG.json +0 -362
  180. package/controller/CHANGELOG.md +0 -1310
  181. package/controller/lib/defaults.js +0 -33
  182. package/controller/lib/defaults.js.map +0 -1
  183. package/controller/lib/index.js +0 -342
  184. package/controller/lib/index.js.map +0 -1
  185. package/controller/lib/utils.js +0 -32
  186. package/controller/lib/utils.js.map +0 -1
  187. package/controller/package.json +0 -18
  188. package/controller/src/__tests__/index.test.js +0 -419
  189. package/controller/src/__tests__/utils.test.js +0 -5
  190. package/controller/src/defaults.js +0 -19
  191. package/controller/src/index.js +0 -330
  192. package/controller/src/utils.js +0 -29
  193. package/docs/config-schema.json +0 -2023
  194. package/docs/config-schema.json.md +0 -1495
  195. package/docs/demo/config.js +0 -8
  196. package/docs/demo/generate.js +0 -122
  197. package/docs/demo/index.html +0 -1
  198. package/docs/demo/session.js +0 -11
  199. package/docs/pie-schema.json +0 -1204
  200. package/docs/pie-schema.json.md +0 -851
  201. package/lib/hotspot/circle.js +0 -160
  202. package/lib/hotspot/circle.js.map +0 -1
  203. package/lib/hotspot/container.js +0 -291
  204. package/lib/hotspot/container.js.map +0 -1
  205. package/lib/hotspot/icons.js +0 -8
  206. package/lib/hotspot/icons.js.map +0 -1
  207. package/lib/hotspot/image-konva-tooltip.js +0 -86
  208. package/lib/hotspot/image-konva-tooltip.js.map +0 -1
  209. package/lib/hotspot/index.js +0 -174
  210. package/lib/hotspot/index.js.map +0 -1
  211. package/lib/hotspot/polygon.js +0 -207
  212. package/lib/hotspot/polygon.js.map +0 -1
  213. package/lib/hotspot/rectangle.js +0 -178
  214. package/lib/hotspot/rectangle.js.map +0 -1
  215. package/lib/index.js +0 -214
  216. package/lib/index.js.map +0 -1
  217. package/lib/session-updater.js +0 -42
  218. package/lib/session-updater.js.map +0 -1
  219. package/src/__tests__/container.test.jsx +0 -58
  220. package/src/__tests__/index.test.js +0 -123
  221. package/src/__tests__/session-updater.test.jsx +0 -69
  222. package/src/hotspot/__tests__/circle.test.jsx +0 -464
  223. package/src/hotspot/__tests__/container.test.jsx +0 -546
  224. package/src/hotspot/__tests__/image-konva-tooltip.test.jsx +0 -510
  225. package/src/hotspot/__tests__/index.test.jsx +0 -64
  226. package/src/hotspot/__tests__/polygon.test.jsx +0 -502
  227. package/src/hotspot/__tests__/rectangle.test.jsx +0 -418
  228. package/src/hotspot/circle.jsx +0 -154
  229. package/src/hotspot/container.jsx +0 -297
  230. package/src/hotspot/icons.js +0 -7
  231. package/src/hotspot/image-konva-tooltip.jsx +0 -76
  232. package/src/hotspot/index.jsx +0 -179
  233. package/src/hotspot/polygon.jsx +0 -197
  234. package/src/hotspot/rectangle.jsx +0 -172
  235. package/src/index.js +0 -227
  236. package/src/session-updater.js +0 -29
@@ -1,213 +0,0 @@
1
- import React from 'react';
2
- import { createRoot } from 'react-dom/client';
3
- import debug from 'debug';
4
- import {
5
- ModelUpdatedEvent,
6
- DeleteImageEvent,
7
- InsertImageEvent,
8
- InsertSoundEvent,
9
- DeleteSoundEvent,
10
- } from '@pie-framework/pie-configure-events';
11
-
12
- import Root from './root';
13
- import sensibleDefaults from './defaults';
14
-
15
- const log = debug('hotspot:configure');
16
-
17
- export default class HotspotConfigure extends HTMLElement {
18
- static createDefaultModel = (model = {}) => ({
19
- ...sensibleDefaults.model,
20
- ...model,
21
- hotspotList: model.hotspotList || [model.hotspotColor] || sensibleDefaults.model.hotspotList,
22
- outlineList: model.outlineList || [model.outlineColor] || sensibleDefaults.model.outlineList,
23
- shapes: model.shapes || sensibleDefaults.model.shapes || {},
24
- });
25
-
26
- constructor() {
27
- super();
28
- this._root = null;
29
- this._model = HotspotConfigure.createDefaultModel();
30
- this._configuration = sensibleDefaults.configuration;
31
- this.onModelChanged = this.onModelChanged.bind(this);
32
- }
33
-
34
- set model(s) {
35
- this._model = HotspotConfigure.createDefaultModel(s);
36
- this._render();
37
- }
38
-
39
- set configuration(c) {
40
- const newConfiguration = {
41
- ...sensibleDefaults.configuration,
42
- ...c,
43
- };
44
-
45
- this._configuration = newConfiguration;
46
-
47
- // if language:enabled is true, then the corresponding default item model should include a language value;
48
- // if it is false, then the language field should be omitted from the item model.
49
- // if a default item model includes a language value (e.g., en_US) and the corresponding authoring view settings have language:settings = true,
50
- // then (a) language:enabled should also be true, and (b) that default language value should be represented in languageChoices[] (as a key).
51
- if (newConfiguration?.language?.enabled) {
52
- if (newConfiguration?.languageChoices?.options?.length) {
53
- this._model.language = newConfiguration?.languageChoices.options[0].value;
54
- }
55
- } else if (newConfiguration.language.settings && this._model.language) {
56
- this._configuration.language.enabled = true;
57
-
58
- if (!this._configuration.languageChoices.options || !this._configuration.languageChoices.options.length) {
59
- this._configuration.languageChoices.options = [];
60
- }
61
-
62
- // check if the language is already included in the languageChoices.options array
63
- // and if not, then add it.
64
- if (!this._configuration.languageChoices.options.find((option) => option.value === this._model.language)) {
65
- this._configuration.languageChoices.options.push({
66
- value: this._model.language,
67
- label: this._model.language,
68
- });
69
- }
70
- } else {
71
- delete this._model.language;
72
- }
73
-
74
- this._render();
75
- }
76
-
77
- dispatchModelUpdated(reset) {
78
- const resetValue = !!reset;
79
-
80
- this.dispatchEvent(new ModelUpdatedEvent(this._model, resetValue));
81
- }
82
-
83
- onModelChanged(m, reset) {
84
- this._model = m;
85
- this.dispatchModelUpdated(reset);
86
- this._render();
87
- }
88
-
89
- onConfigurationChanged = (c) => {
90
- this._configuration = c;
91
- this._render();
92
- };
93
-
94
- onModelChangedByConfig = (m, propertyType) => {
95
- const _model = m;
96
-
97
- if (propertyType === 'multipleCorrect') {
98
- const { rectangles = [], polygons = [], circles = [] } = _model.shapes || {};
99
-
100
- _model.shapes.rectangles = rectangles.map((shape) => ({ ...shape, correct: false }));
101
- _model.shapes.polygons = polygons.map((shape) => ({ ...shape, correct: false }));
102
- _model.shapes.circles = circles.map((shape) => ({ ...shape, correct: false }));
103
- }
104
-
105
- this.onModelChanged(_model);
106
- };
107
-
108
- onColorChanged = (colorType, color) => {
109
- this.onModelChanged({
110
- ...this._model,
111
- [colorType]: color,
112
- });
113
- };
114
-
115
- onPromptChanged = (prompt) => {
116
- this.onModelChanged({
117
- ...this._model,
118
- prompt,
119
- });
120
- };
121
-
122
- onRationaleChanged = (rationale) => {
123
- this.onModelChanged({
124
- ...this._model,
125
- rationale,
126
- });
127
- };
128
-
129
- onTeacherInstructionsChanged = (teacherInstructions) => {
130
- this.onModelChanged({
131
- ...this._model,
132
- teacherInstructions,
133
- });
134
- };
135
-
136
- onUpdateImageDimension = (dimensions) => {
137
- this.onModelChanged({
138
- ...this._model,
139
- dimensions,
140
- });
141
- };
142
-
143
- onUpdateShapes = (shapes) => {
144
- this.onModelChanged({
145
- ...this._model,
146
- shapes,
147
- });
148
- };
149
-
150
- onImageUpload = (imageUrl) => {
151
- this.onModelChanged({
152
- ...this._model,
153
- imageUrl,
154
- });
155
- };
156
-
157
- insertImage = (handler) => {
158
- this.dispatchEvent(new InsertImageEvent(handler));
159
- };
160
-
161
- onDeleteImage = (src, done) => {
162
- this.dispatchEvent(new DeleteImageEvent(src, done));
163
- };
164
-
165
- insertSound(handler) {
166
- this.dispatchEvent(new InsertSoundEvent(handler));
167
- }
168
-
169
- onDeleteSound(src, done) {
170
- this.dispatchEvent(new DeleteSoundEvent(src, done));
171
- }
172
-
173
- _render() {
174
- log('_render');
175
- let element = React.createElement(Root, {
176
- configuration: this._configuration,
177
- model: this._model,
178
- onColorChanged: this.onColorChanged,
179
- onImageUpload: this.onImageUpload,
180
- onRationaleChanged: this.onRationaleChanged,
181
- onConfigurationChanged: this.onConfigurationChanged,
182
- onPromptChanged: this.onPromptChanged,
183
- onUpdateImageDimension: this.onUpdateImageDimension,
184
- imageSupport: {
185
- add: this.insertImage,
186
- delete: this.onDeleteImage,
187
- },
188
- uploadSoundSupport: {
189
- add: this.insertSound.bind(this),
190
- delete: this.onDeleteSound.bind(this),
191
- },
192
- onUpdateShapes: this.onUpdateShapes,
193
- onModelChangedByConfig: this.onModelChangedByConfig,
194
- onTeacherInstructionsChanged: this.onTeacherInstructionsChanged,
195
- });
196
-
197
- if (!this._root) {
198
- this._root = createRoot(this);
199
- }
200
- this._root.render(element);
201
- }
202
-
203
- connectedCallback() {
204
- this._render();
205
- }
206
-
207
- disconnectedCallback() {
208
- if (this._root) {
209
- this._root.unmount();
210
- this._root = null;
211
- }
212
- }
213
- }
@@ -1,342 +0,0 @@
1
- import React from 'react';
2
- import { settings, layout, InputContainer, NumberTextField } from '@pie-lib/config-ui';
3
- import PropTypes from 'prop-types';
4
- import EditableHtml from '@pie-lib/editable-html-tip-tap';
5
- import { styled } from '@mui/material/styles';
6
- import Typography from '@mui/material/Typography';
7
- import Info from '@mui/icons-material/Info';
8
- import Tooltip from '@mui/material/Tooltip';
9
- import HotspotPalette from './hotspot-palette';
10
- import HotspotContainer from './hotspot-container';
11
- import { updateImageDimensions, generateValidationMessage, getUpdatedShapes, getAllShapes, groupShapes } from './utils';
12
-
13
- const { Panel, toggle, dropdown } = settings;
14
-
15
- const checkNullish = (value) => value !== null && value !== undefined;
16
-
17
- const DimensionsContainer = styled('div')(({ theme }) => ({
18
- display: 'flex',
19
- marginBottom: theme.spacing(1.5),
20
- }));
21
-
22
- const FieldContainer = styled('div')({
23
- flex: 1,
24
- width: '90%',
25
- });
26
-
27
- const PromptContainer = styled(InputContainer)(({ theme }) => ({
28
- paddingTop: theme.spacing(1),
29
- marginTop: theme.spacing(2),
30
- marginBottom: theme.spacing(2),
31
- width: '100%',
32
- }));
33
-
34
- const SubHeading = styled(Typography)(({ theme }) => ({
35
- marginRight: theme.spacing(1),
36
- }));
37
-
38
- const FlexContainer = styled('div')({
39
- display: 'flex',
40
- alignItems: 'center',
41
- });
42
-
43
- const StyledTooltip = styled(Tooltip)(({ theme }) => ({
44
- '& .MuiTooltip-tooltip': {
45
- fontSize: theme.typography.fontSize - 2,
46
- whiteSpace: 'pre',
47
- maxWidth: '500px',
48
- },
49
- }));
50
-
51
- const ErrorText = styled('div')(({ theme }) => ({
52
- fontSize: theme.typography.fontSize - 2,
53
- color: theme.palette.error.main,
54
- paddingTop: theme.spacing(1),
55
- }));
56
-
57
- export class Root extends React.Component {
58
- handleColorChange = (fieldType, color) => {
59
- const { onColorChanged } = this.props;
60
- const cType = `${fieldType}Color`;
61
-
62
- onColorChanged(cType, color);
63
- };
64
-
65
- handleOnUpdateImageDimensions = (value, resizeType) => {
66
- const {
67
- model: { dimensions, shapes },
68
- configuration: { preserveAspectRatio = {} },
69
- onUpdateImageDimension,
70
- onUpdateShapes,
71
- } = this.props;
72
-
73
- const nextImageDimensions = { ...dimensions, [resizeType]: value };
74
-
75
- // if preserveAspectRatio.enabled, updateImageDimensions function makes sure aspect ratio is kept
76
- const updatedDimensions = updateImageDimensions(
77
- dimensions,
78
- nextImageDimensions,
79
- preserveAspectRatio.enabled,
80
- resizeType,
81
- );
82
- // transform shapes map into shapes array
83
- const shapesArray = getAllShapes(shapes);
84
- // transform all the shapes to fit the re-sized image
85
- const updatedShapes = getUpdatedShapes(dimensions, updatedDimensions, shapesArray);
86
- // transform shapes array back into shapes map
87
-
88
- onUpdateShapes(groupShapes(updatedShapes));
89
- onUpdateImageDimension(updatedDimensions);
90
- };
91
-
92
- render() {
93
- const {
94
- configuration,
95
- model,
96
- imageSupport,
97
- uploadSoundSupport,
98
- onConfigurationChanged,
99
- onImageUpload,
100
- onModelChangedByConfig,
101
- onPromptChanged,
102
- onRationaleChanged,
103
- onUpdateImageDimension,
104
- onTeacherInstructionsChanged,
105
- onUpdateShapes,
106
- } = this.props;
107
- const {
108
- baseInputConfiguration = {},
109
- contentDimensions = {},
110
- maxImageWidth = {},
111
- maxImageHeight = {},
112
- multipleCorrect = {},
113
- partialScoring = {},
114
- preserveAspectRatio = {},
115
- prompt = {},
116
- rationale = {},
117
- settingsPanelDisabled,
118
- spellCheck = {},
119
- teacherInstructions = {},
120
- withRubric = {},
121
- mathMlOptions = {},
122
- language = {},
123
- languageChoices = {},
124
- } = configuration || {};
125
- const {
126
- errors,
127
- extraCSSRules,
128
- promptEnabled,
129
- rationaleEnabled,
130
- spellCheckEnabled,
131
- teacherInstructionsEnabled,
132
- toolbarEditorPosition,
133
- } = model || {};
134
- const {
135
- prompt: promptError,
136
- rationale: rationaleError,
137
- shapes: shapesError,
138
- selections: selectionsError,
139
- teacherInstructions: teacherInstructionsError,
140
- } = errors || {};
141
- const validationMessage = generateValidationMessage(configuration);
142
-
143
- const defaultImageMaxWidth = maxImageWidth && maxImageWidth.prompt;
144
- const defaultImageMaxHeight = maxImageHeight && maxImageHeight.prompt;
145
-
146
- const toolbarOpts = {
147
- position: toolbarEditorPosition === 'top' ? 'top' : 'bottom',
148
- };
149
-
150
- const panelSettings = {
151
- multipleCorrect: multipleCorrect.settings && toggle(multipleCorrect.label),
152
- partialScoring: partialScoring.settings && toggle(partialScoring.label),
153
- promptEnabled: prompt.settings && toggle(prompt.label),
154
- 'language.enabled': language.settings && toggle(language.label, true),
155
- language: language.settings && language.enabled && dropdown(languageChoices.label, languageChoices.options),
156
- };
157
- const panelProperties = {
158
- teacherInstructionsEnabled: teacherInstructions.settings && toggle(teacherInstructions.label),
159
- rationaleEnabled: rationale.settings && toggle(rationale.label),
160
- spellCheckEnabled: spellCheck.settings && toggle(spellCheck.label),
161
- rubricEnabled: withRubric?.settings && toggle(withRubric?.label),
162
- };
163
-
164
- const getPluginProps = (props = {}) => ({
165
- ...baseInputConfiguration,
166
- ...props,
167
- });
168
-
169
-
170
- return (
171
- <layout.ConfigLayout
172
- extraCSSRules={extraCSSRules}
173
- dimensions={contentDimensions}
174
- hideSettings={settingsPanelDisabled}
175
- settings={
176
- <Panel
177
- model={model}
178
- onChangeModel={onModelChangedByConfig}
179
- configuration={configuration}
180
- onChangeConfiguration={onConfigurationChanged}
181
- groups={{
182
- Settings: panelSettings,
183
- Properties: panelProperties,
184
- }}
185
- />
186
- }
187
- >
188
- {teacherInstructionsEnabled && (
189
- <PromptContainer label={teacherInstructions.label}>
190
- <EditableHtml
191
- markup={model.teacherInstructions || ''}
192
- onChange={onTeacherInstructionsChanged}
193
- imageSupport={imageSupport}
194
- nonEmpty={false}
195
- error={teacherInstructionsError}
196
- toolbarOpts={toolbarOpts}
197
- pluginProps={getPluginProps(teacherInstructions?.inputConfiguration)}
198
- spellCheck={spellCheckEnabled}
199
- maxImageWidth={(maxImageWidth && maxImageWidth.teacherInstructions) || defaultImageMaxWidth}
200
- maxImageHeight={(maxImageHeight && maxImageHeight.teacherInstructions) || defaultImageMaxHeight}
201
- uploadSoundSupport={uploadSoundSupport}
202
- languageCharactersProps={[{ language: 'spanish' }, { language: 'special' }]}
203
- mathMlOptions={mathMlOptions}
204
- />
205
- {teacherInstructionsError && <ErrorText>{teacherInstructionsError}</ErrorText>}
206
- </PromptContainer>
207
- )}
208
-
209
- {promptEnabled && (
210
- <PromptContainer label={prompt.label}>
211
- <EditableHtml
212
- markup={model.prompt || ''}
213
- onChange={onPromptChanged}
214
- imageSupport={imageSupport}
215
- nonEmpty={false}
216
- error={promptError}
217
- toolbarOpts={toolbarOpts}
218
- pluginProps={getPluginProps(prompt?.inputConfiguration)}
219
- spellCheck={spellCheckEnabled}
220
- maxImageWidth={defaultImageMaxWidth}
221
- maxImageHeight={defaultImageMaxHeight}
222
- uploadSoundSupport={uploadSoundSupport}
223
- languageCharactersProps={[{ language: 'spanish' }, { language: 'special' }]}
224
- mathMlOptions={mathMlOptions}
225
- />
226
- {promptError && <ErrorText>{promptError}</ErrorText>}
227
- </PromptContainer>
228
- )}
229
-
230
- <FlexContainer>
231
- <SubHeading variant="h6">Define Hotspot</SubHeading>
232
- <StyledTooltip disableFocusListener disableTouchListener placement={'left'} title={validationMessage}>
233
- <Info fontSize={'small'} color={'primary'} style={{ float: 'right' }} />
234
- </StyledTooltip>
235
- </FlexContainer>
236
-
237
- <HotspotPalette
238
- hotspotColor={model.hotspotColor}
239
- hotspotList={model.hotspotList}
240
- outlineColor={model.outlineColor}
241
- outlineList={model.outlineList}
242
- onHotspotColorChange={(color) => this.handleColorChange('hotspot', color)}
243
- onOutlineColorChange={(color) => this.handleColorChange('outline', color)}
244
- />
245
-
246
- <HotspotContainer
247
- dimensions={model.dimensions}
248
- imageUrl={model.imageUrl}
249
- multipleCorrect={model.multipleCorrect}
250
- hasErrors={!!shapesError || !!selectionsError}
251
- hotspotColor={model.hotspotColor}
252
- outlineColor={model.outlineColor}
253
- selectedHotspotColor={model.selectedHotspotColor}
254
- hoverOutlineColor={checkNullish(model.hoverOutlineColor) ? model.hoverOutlineColor : 'black'}
255
- onUpdateImageDimension={onUpdateImageDimension}
256
- onUpdateShapes={onUpdateShapes}
257
- onImageUpload={onImageUpload}
258
- shapes={model.shapes}
259
- strokeWidth={model.strokeWidth}
260
- preserveAspectRatioEnabled={preserveAspectRatio.enabled}
261
- insertImage={imageSupport && imageSupport.add}
262
- />
263
- {shapesError && <ErrorText>{shapesError}</ErrorText>}
264
- {selectionsError && <ErrorText>{selectionsError}</ErrorText>}
265
-
266
- {model.imageUrl && (
267
- <React.Fragment>
268
- <Typography variant="h6">Image Dimensions</Typography>
269
-
270
- <DimensionsContainer>
271
- <FieldContainer>
272
- <NumberTextField
273
- key="hotspot-manual-width"
274
- label="Width"
275
- value={model.dimensions.width}
276
- min={0}
277
- onChange={(e, value) => this.handleOnUpdateImageDimensions(value, 'width')}
278
- showErrorWhenOutsideRange
279
- />
280
- </FieldContainer>
281
-
282
- <FieldContainer>
283
- <NumberTextField
284
- key="hotspot-manual-height"
285
- label="Height"
286
- value={model.dimensions.height}
287
- min={0}
288
- onChange={(e, value) => this.handleOnUpdateImageDimensions(value, 'height')}
289
- showErrorWhenOutsideRange
290
- />
291
- </FieldContainer>
292
- </DimensionsContainer>
293
- </React.Fragment>
294
- )}
295
-
296
- {rationaleEnabled && (
297
- <PromptContainer label={rationale.label}>
298
- <EditableHtml
299
- markup={model.rationale || ''}
300
- onChange={onRationaleChanged}
301
- imageSupport={imageSupport}
302
- error={rationaleError}
303
- toolbarOpts={toolbarOpts}
304
- pluginProps={getPluginProps(rationale?.inputConfiguration)}
305
- spellCheck={spellCheckEnabled}
306
- maxImageWidth={(maxImageWidth && maxImageWidth.rationale) || defaultImageMaxWidth}
307
- maxImageHeight={(maxImageHeight && maxImageHeight.rationale) || defaultImageMaxHeight}
308
- uploadSoundSupport={uploadSoundSupport}
309
- languageCharactersProps={[{ language: 'spanish' }, { language: 'special' }]}
310
- mathMlOptions={mathMlOptions}
311
- />
312
- {rationaleError && <ErrorText>{rationaleError}</ErrorText>}
313
- </PromptContainer>
314
- )}
315
- </layout.ConfigLayout>
316
- );
317
- }
318
- }
319
-
320
- Root.propTypes = {
321
- configuration: PropTypes.object,
322
- model: PropTypes.object.isRequired,
323
- imageSupport: PropTypes.shape({
324
- add: PropTypes.func,
325
- delete: PropTypes.func,
326
- }),
327
- uploadSoundSupport: PropTypes.shape({
328
- add: PropTypes.func,
329
- delete: PropTypes.func,
330
- }),
331
- onImageUpload: PropTypes.func.isRequired,
332
- onColorChanged: PropTypes.func.isRequired,
333
- onPromptChanged: PropTypes.func.isRequired,
334
- onUpdateImageDimension: PropTypes.func.isRequired,
335
- onUpdateShapes: PropTypes.func.isRequired,
336
- onModelChangedByConfig: PropTypes.func.isRequired,
337
- onRationaleChanged: PropTypes.func.isRequired,
338
- onConfigurationChanged: PropTypes.func.isRequired,
339
- onTeacherInstructionsChanged: PropTypes.func.isRequired,
340
- };
341
-
342
- export default Root;
@@ -1,81 +0,0 @@
1
- export class CircleShape {
2
- static name = 'circle'
3
-
4
- static create(shapes, e) {
5
- const newShapes = [...shapes];
6
- const highestId = Math.max(...newShapes.map((shape) => parseInt(shape.id)), 0);
7
- const newCircle = {
8
- id: `${highestId + 1}`,
9
- radius: 0,
10
- x: e.evt.layerX,
11
- y: e.evt.layerY,
12
- group: 'circles',
13
- index: newShapes.length,
14
- };
15
-
16
- newShapes.push(newCircle);
17
-
18
- return {
19
- shapes: newShapes,
20
- isDrawing: true,
21
- isDrawingShapeId: newCircle.id,
22
- };
23
- }
24
-
25
- static finalizeCreation(state, props) {
26
- const currentShapeIndex = state.shapes.findIndex((shape) => shape.id === state.isDrawingShapeId);
27
-
28
- if (currentShapeIndex !== -1) {
29
- const currentShape = state.shapes[currentShapeIndex];
30
-
31
- // Check if the shape is a valid circle (has more than 0 radius) before finalizing
32
- if (currentShape.radius > 0) {
33
- return {
34
- ...state,
35
- isDrawing: false,
36
- stateShapes: false,
37
- isDrawingShapeId: undefined,
38
- };
39
- } else {
40
- return {
41
- ...state,
42
- isDrawing: false,
43
- stateShapes: false,
44
- isDrawingShapeId: undefined,
45
- shapes: state.shapes.filter((shape) => shape.id !== state.isDrawingShapeId),
46
- };
47
- }
48
- }
49
-
50
- return {
51
- ...state,
52
- isDrawing: false,
53
- stateShapes: false,
54
- isDrawingShapeId: undefined,
55
- };
56
- }
57
-
58
- static handleMouseMove(state, e) {
59
- const { isDrawing, isDrawingShapeId, shapes } = state;
60
-
61
- if (isDrawing) {
62
- const tempShapes = [...shapes];
63
- const resizingShapeIndex = tempShapes.findIndex((shape) => shape.id === isDrawingShapeId);
64
-
65
- if (resizingShapeIndex !== -1) {
66
- const resizingShape = tempShapes[resizingShapeIndex];
67
-
68
- // Calculate radius based on mouse position
69
- const dx = e.evt.layerX - resizingShape.x;
70
- const dy = e.evt.layerY - resizingShape.y;
71
- resizingShape.radius = Math.sqrt(dx * dx + dy * dy);
72
-
73
- return {
74
- shapes: tempShapes,
75
- };
76
- }
77
- }
78
-
79
- return state;
80
- }
81
- }
@@ -1,4 +0,0 @@
1
- export * from './circle';
2
- export * from './rectagle';
3
- export * from './polygon';
4
- export * from './utils';