@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,208 +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
- disconnectedCallback() {
204
- if (this._root) {
205
- this._root.unmount();
206
- }
207
- }
208
- }
@@ -1,346 +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 DimensionsContainer = styled('div')(({ theme }) => ({
16
- display: 'flex',
17
- marginBottom: theme.spacing(1.5),
18
- }));
19
-
20
- const FieldContainer = styled('div')({
21
- flex: 1,
22
- width: '90%',
23
- });
24
-
25
- const PromptContainer = styled(InputContainer)(({ theme }) => ({
26
- paddingTop: theme.spacing(1),
27
- marginTop: theme.spacing(2),
28
- marginBottom: theme.spacing(2),
29
- width: '100%',
30
- }));
31
-
32
- const SubHeading = styled(Typography)(({ theme }) => ({
33
- marginRight: theme.spacing(1),
34
- }));
35
-
36
- const FlexContainer = styled('div')({
37
- display: 'flex',
38
- alignItems: 'center',
39
- });
40
-
41
- const StyledTooltip = styled(Tooltip)(({ theme }) => ({
42
- '& .MuiTooltip-tooltip': {
43
- fontSize: theme.typography.fontSize - 2,
44
- whiteSpace: 'pre',
45
- maxWidth: '500px',
46
- },
47
- }));
48
-
49
- const ErrorText = styled('div')(({ theme }) => ({
50
- fontSize: theme.typography.fontSize - 2,
51
- color: theme.palette.error.main,
52
- paddingTop: theme.spacing(1),
53
- }));
54
-
55
- export class Root extends React.Component {
56
- handleColorChange = (fieldType, color) => {
57
- const { onColorChanged } = this.props;
58
- const cType = `${fieldType}Color`;
59
-
60
- onColorChanged(cType, color);
61
- };
62
-
63
- handleOnUpdateImageDimensions = (value, resizeType) => {
64
- const {
65
- model: { dimensions, shapes },
66
- configuration: { preserveAspectRatio = {} },
67
- onUpdateImageDimension,
68
- onUpdateShapes,
69
- } = this.props;
70
-
71
- const nextImageDimensions = { ...dimensions, [resizeType]: value };
72
-
73
- // if preserveAspectRatio.enabled, updateImageDimensions function makes sure aspect ratio is kept
74
- const updatedDimensions = updateImageDimensions(
75
- dimensions,
76
- nextImageDimensions,
77
- preserveAspectRatio.enabled,
78
- resizeType,
79
- );
80
- // transform shapes map into shapes array
81
- const shapesArray = getAllShapes(shapes);
82
- // transform all the shapes to fit the re-sized image
83
- const updatedShapes = getUpdatedShapes(dimensions, updatedDimensions, shapesArray);
84
- // transform shapes array back into shapes map
85
-
86
- onUpdateShapes(groupShapes(updatedShapes));
87
- onUpdateImageDimension(updatedDimensions);
88
- };
89
-
90
- render() {
91
- const {
92
- configuration,
93
- model,
94
- imageSupport,
95
- uploadSoundSupport,
96
- onConfigurationChanged,
97
- onImageUpload,
98
- onModelChangedByConfig,
99
- onPromptChanged,
100
- onRationaleChanged,
101
- onUpdateImageDimension,
102
- onTeacherInstructionsChanged,
103
- onUpdateShapes,
104
- } = this.props;
105
- const {
106
- baseInputConfiguration = {},
107
- contentDimensions = {},
108
- maxImageWidth = {},
109
- maxImageHeight = {},
110
- multipleCorrect = {},
111
- partialScoring = {},
112
- preserveAspectRatio = {},
113
- prompt = {},
114
- rationale = {},
115
- settingsPanelDisabled,
116
- spellCheck = {},
117
- teacherInstructions = {},
118
- withRubric = {},
119
- mathMlOptions = {},
120
- language = {},
121
- languageChoices = {},
122
- } = configuration || {};
123
- const {
124
- errors,
125
- extraCSSRules,
126
- promptEnabled,
127
- rationaleEnabled,
128
- spellCheckEnabled,
129
- teacherInstructionsEnabled,
130
- toolbarEditorPosition,
131
- } = model || {};
132
- const {
133
- prompt: promptError,
134
- rationale: rationaleError,
135
- shapes: shapesError,
136
- selections: selectionsError,
137
- teacherInstructions: teacherInstructionsError,
138
- } = errors || {};
139
- const validationMessage = generateValidationMessage(configuration);
140
-
141
- const defaultImageMaxWidth = maxImageWidth && maxImageWidth.prompt;
142
- const defaultImageMaxHeight = maxImageHeight && maxImageHeight.prompt;
143
-
144
- const toolbarOpts = {
145
- position: toolbarEditorPosition === 'top' ? 'top' : 'bottom',
146
- };
147
-
148
- const panelSettings = {
149
- multipleCorrect: multipleCorrect.settings && toggle(multipleCorrect.label),
150
- partialScoring: partialScoring.settings && toggle(partialScoring.label),
151
- promptEnabled: prompt.settings && toggle(prompt.label),
152
- 'language.enabled': language.settings && toggle(language.label, true),
153
- language: language.settings && language.enabled && dropdown(languageChoices.label, languageChoices.options),
154
- };
155
- const panelProperties = {
156
- teacherInstructionsEnabled: teacherInstructions.settings && toggle(teacherInstructions.label),
157
- rationaleEnabled: rationale.settings && toggle(rationale.label),
158
- spellCheckEnabled: spellCheck.settings && toggle(spellCheck.label),
159
- rubricEnabled: withRubric?.settings && toggle(withRubric?.label),
160
- };
161
-
162
- const getPluginProps = (props = {}) => ({
163
- ...baseInputConfiguration,
164
- ...props,
165
- });
166
-
167
- return (
168
- <layout.ConfigLayout
169
- extraCSSRules={extraCSSRules}
170
- dimensions={contentDimensions}
171
- hideSettings={settingsPanelDisabled}
172
- settings={
173
- <Panel
174
- model={model}
175
- onChangeModel={onModelChangedByConfig}
176
- configuration={configuration}
177
- onChangeConfiguration={onConfigurationChanged}
178
- groups={{
179
- Settings: panelSettings,
180
- Properties: panelProperties,
181
- }}
182
- />
183
- }
184
- >
185
- {teacherInstructionsEnabled && (
186
- <PromptContainer label={teacherInstructions.label}>
187
- <EditableHtml
188
- markup={model.teacherInstructions || ''}
189
- onChange={onTeacherInstructionsChanged}
190
- imageSupport={imageSupport}
191
- nonEmpty={false}
192
- error={teacherInstructionsError}
193
- toolbarOpts={toolbarOpts}
194
- pluginProps={getPluginProps(teacherInstructions?.inputConfiguration)}
195
- spellCheck={spellCheckEnabled}
196
- maxImageWidth={(maxImageWidth && maxImageWidth.teacherInstructions) || defaultImageMaxWidth}
197
- maxImageHeight={(maxImageHeight && maxImageHeight.teacherInstructions) || defaultImageMaxHeight}
198
- uploadSoundSupport={uploadSoundSupport}
199
- languageCharactersProps={[{ language: 'spanish' }, { language: 'special' }]}
200
- mathMlOptions={mathMlOptions}
201
- />
202
- {teacherInstructionsError && <ErrorText>{teacherInstructionsError}</ErrorText>}
203
- </PromptContainer>
204
- )}
205
-
206
- {promptEnabled && (
207
- <PromptContainer label={prompt.label}>
208
- <EditableHtml
209
- markup={model.prompt || ''}
210
- onChange={onPromptChanged}
211
- imageSupport={imageSupport}
212
- nonEmpty={false}
213
- error={promptError}
214
- toolbarOpts={toolbarOpts}
215
- pluginProps={getPluginProps(prompt?.inputConfiguration)}
216
- spellCheck={spellCheckEnabled}
217
- maxImageWidth={defaultImageMaxWidth}
218
- maxImageHeight={defaultImageMaxHeight}
219
- uploadSoundSupport={uploadSoundSupport}
220
- languageCharactersProps={[{ language: 'spanish' }, { language: 'special' }]}
221
- mathMlOptions={mathMlOptions}
222
- />
223
- {promptError && <ErrorText>{promptError}</ErrorText>}
224
- </PromptContainer>
225
- )}
226
-
227
- <FlexContainer>
228
- <SubHeading variant="h6">
229
- Define Hotspot
230
- </SubHeading>
231
- <StyledTooltip
232
- disableFocusListener
233
- disableTouchListener
234
- placement={'left'}
235
- title={validationMessage}
236
- >
237
- <Info fontSize={'small'} color={'primary'} style={{ float: 'right' }} />
238
- </StyledTooltip>
239
- </FlexContainer>
240
-
241
- <HotspotPalette
242
- hotspotColor={model.hotspotColor}
243
- hotspotList={model.hotspotList}
244
- outlineColor={model.outlineColor}
245
- outlineList={model.outlineList}
246
- onHotspotColorChange={(color) => this.handleColorChange('hotspot', color)}
247
- onOutlineColorChange={(color) => this.handleColorChange('outline', color)}
248
- />
249
-
250
- <HotspotContainer
251
- dimensions={model.dimensions}
252
- imageUrl={model.imageUrl}
253
- multipleCorrect={model.multipleCorrect}
254
- hasErrors={!!shapesError || !!selectionsError}
255
- hotspotColor={model.hotspotColor}
256
- outlineColor={model.outlineColor}
257
- selectedHotspotColor={model.selectedHotspotColor}
258
- hoverOutlineColor={model.hoverOutlineColor}
259
- onUpdateImageDimension={onUpdateImageDimension}
260
- onUpdateShapes={onUpdateShapes}
261
- onImageUpload={onImageUpload}
262
- shapes={model.shapes}
263
- strokeWidth={model.strokeWidth}
264
- preserveAspectRatioEnabled={preserveAspectRatio.enabled}
265
- insertImage={imageSupport && imageSupport.add}
266
- />
267
- {shapesError && <ErrorText>{shapesError}</ErrorText>}
268
- {selectionsError && <ErrorText>{selectionsError}</ErrorText>}
269
-
270
- {model.imageUrl && (
271
- <React.Fragment>
272
- <Typography variant="h6">Image Dimensions</Typography>
273
-
274
- <DimensionsContainer>
275
- <FieldContainer>
276
- <NumberTextField
277
- key="hotspot-manual-width"
278
- label="Width"
279
- value={model.dimensions.width}
280
- min={0}
281
- onChange={(e, value) => this.handleOnUpdateImageDimensions(value, 'width')}
282
- showErrorWhenOutsideRange
283
- />
284
- </FieldContainer>
285
-
286
- <FieldContainer>
287
- <NumberTextField
288
- key="hotspot-manual-height"
289
- label="Height"
290
- value={model.dimensions.height}
291
- min={0}
292
- onChange={(e, value) => this.handleOnUpdateImageDimensions(value, 'height')}
293
- showErrorWhenOutsideRange
294
- />
295
- </FieldContainer>
296
- </DimensionsContainer>
297
- </React.Fragment>
298
- )}
299
-
300
- {rationaleEnabled && (
301
- <PromptContainer label={rationale.label}>
302
- <EditableHtml
303
- markup={model.rationale || ''}
304
- onChange={onRationaleChanged}
305
- imageSupport={imageSupport}
306
- error={rationaleError}
307
- toolbarOpts={toolbarOpts}
308
- pluginProps={getPluginProps(rationale?.inputConfiguration)}
309
- spellCheck={spellCheckEnabled}
310
- maxImageWidth={(maxImageWidth && maxImageWidth.rationale) || defaultImageMaxWidth}
311
- maxImageHeight={(maxImageHeight && maxImageHeight.rationale) || defaultImageMaxHeight}
312
- uploadSoundSupport={uploadSoundSupport}
313
- languageCharactersProps={[{ language: 'spanish' }, { language: 'special' }]}
314
- mathMlOptions={mathMlOptions}
315
- />
316
- {rationaleError && <ErrorText>{rationaleError}</ErrorText>}
317
- </PromptContainer>
318
- )}
319
- </layout.ConfigLayout>
320
- );
321
- }
322
- }
323
-
324
- Root.propTypes = {
325
- configuration: PropTypes.object,
326
- model: PropTypes.object.isRequired,
327
- imageSupport: PropTypes.shape({
328
- add: PropTypes.func,
329
- delete: PropTypes.func,
330
- }),
331
- uploadSoundSupport: PropTypes.shape({
332
- add: PropTypes.func,
333
- delete: PropTypes.func,
334
- }),
335
- onImageUpload: PropTypes.func.isRequired,
336
- onColorChanged: PropTypes.func.isRequired,
337
- onPromptChanged: PropTypes.func.isRequired,
338
- onUpdateImageDimension: PropTypes.func.isRequired,
339
- onUpdateShapes: PropTypes.func.isRequired,
340
- onModelChangedByConfig: PropTypes.func.isRequired,
341
- onRationaleChanged: PropTypes.func.isRequired,
342
- onConfigurationChanged: PropTypes.func.isRequired,
343
- onTeacherInstructionsChanged: PropTypes.func.isRequired,
344
- };
345
-
346
- 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';