@pie-element/drawing-response 12.1.2-next.2 → 12.1.2

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 (172) hide show
  1. package/CHANGELOG.json +547 -0
  2. package/CHANGELOG.md +1966 -0
  3. package/LICENSE.md +5 -0
  4. package/README.md +1 -0
  5. package/configure/CHANGELOG.json +367 -0
  6. package/configure/CHANGELOG.md +1766 -0
  7. package/configure/lib/button.js +37 -0
  8. package/configure/lib/button.js.map +1 -0
  9. package/configure/lib/defaults.js +116 -0
  10. package/configure/lib/defaults.js.map +1 -0
  11. package/configure/lib/image-container.js +307 -0
  12. package/configure/lib/image-container.js.map +1 -0
  13. package/configure/lib/index.js +147 -0
  14. package/configure/lib/index.js.map +1 -0
  15. package/configure/lib/root.js +219 -0
  16. package/configure/lib/root.js.map +1 -0
  17. package/configure/package.json +24 -0
  18. package/configure/src/__tests__/image-container.test.jsx +231 -0
  19. package/configure/src/__tests__/index.test.js +72 -0
  20. package/configure/src/__tests__/root.test.jsx +110 -0
  21. package/configure/src/button.jsx +33 -0
  22. package/configure/src/defaults.js +80 -0
  23. package/configure/src/image-container.jsx +316 -0
  24. package/configure/src/index.js +167 -0
  25. package/configure/src/root.jsx +198 -0
  26. package/controller/CHANGELOG.json +52 -0
  27. package/controller/CHANGELOG.md +261 -0
  28. package/controller/lib/defaults.js +22 -0
  29. package/controller/lib/defaults.js.map +1 -0
  30. package/controller/lib/index.js +84 -0
  31. package/controller/lib/index.js.map +1 -0
  32. package/controller/package.json +16 -0
  33. package/controller/src/__tests__/index.test.js +172 -0
  34. package/controller/src/defaults.js +12 -0
  35. package/controller/src/index.js +71 -0
  36. package/docs/config-schema.json +1766 -0
  37. package/docs/config-schema.json.md +1313 -0
  38. package/docs/demo/config.js +8 -0
  39. package/docs/demo/generate.js +14 -0
  40. package/docs/demo/index.html +1 -0
  41. package/docs/demo/session.js +37 -0
  42. package/docs/pie-schema.json +823 -0
  43. package/docs/pie-schema.json.md +606 -0
  44. package/lib/drawing-response/button.js +49 -0
  45. package/lib/drawing-response/button.js.map +1 -0
  46. package/lib/drawing-response/constants.js +43 -0
  47. package/lib/drawing-response/constants.js.map +1 -0
  48. package/lib/drawing-response/container.js +327 -0
  49. package/lib/drawing-response/container.js.map +1 -0
  50. package/lib/drawing-response/drawable-circle.js +80 -0
  51. package/lib/drawing-response/drawable-circle.js.map +1 -0
  52. package/lib/drawing-response/drawable-eraser.js +64 -0
  53. package/lib/drawing-response/drawable-eraser.js.map +1 -0
  54. package/lib/drawing-response/drawable-free-path.js +71 -0
  55. package/lib/drawing-response/drawable-free-path.js.map +1 -0
  56. package/lib/drawing-response/drawable-helper.js +34 -0
  57. package/lib/drawing-response/drawable-helper.js.map +1 -0
  58. package/lib/drawing-response/drawable-image.js +41 -0
  59. package/lib/drawing-response/drawable-image.js.map +1 -0
  60. package/lib/drawing-response/drawable-line.js +75 -0
  61. package/lib/drawing-response/drawable-line.js.map +1 -0
  62. package/lib/drawing-response/drawable-main.js +345 -0
  63. package/lib/drawing-response/drawable-main.js.map +1 -0
  64. package/lib/drawing-response/drawable-palette.js +140 -0
  65. package/lib/drawing-response/drawable-palette.js.map +1 -0
  66. package/lib/drawing-response/drawable-rectangle.js +80 -0
  67. package/lib/drawing-response/drawable-rectangle.js.map +1 -0
  68. package/lib/drawing-response/drawable-text.js +295 -0
  69. package/lib/drawing-response/drawable-text.js.map +1 -0
  70. package/lib/drawing-response/drawable-transformer.js +52 -0
  71. package/lib/drawing-response/drawable-transformer.js.map +1 -0
  72. package/lib/drawing-response/factory.js +22 -0
  73. package/lib/drawing-response/factory.js.map +1 -0
  74. package/lib/drawing-response/icon.js +55 -0
  75. package/lib/drawing-response/icon.js.map +1 -0
  76. package/lib/drawing-response/index.js +91 -0
  77. package/lib/drawing-response/index.js.map +1 -0
  78. package/lib/index.js +68 -0
  79. package/lib/index.js.map +1 -0
  80. package/package.json +19 -82
  81. package/src/__tests__/drawing-index-test.jsx +103 -0
  82. package/src/drawing-response/__tests__/container.test.jsx +82 -0
  83. package/src/drawing-response/__tests__/drawable-helper.test.jsx +24 -0
  84. package/src/drawing-response/__tests__/drawing-main.test.jsx +855 -0
  85. package/src/drawing-response/__tests__/factory.test.js +13 -0
  86. package/src/drawing-response/button.jsx +45 -0
  87. package/src/drawing-response/constants.js +44 -0
  88. package/src/drawing-response/container.jsx +301 -0
  89. package/src/drawing-response/drawable-circle.jsx +74 -0
  90. package/src/drawing-response/drawable-eraser.jsx +53 -0
  91. package/src/drawing-response/drawable-free-path.jsx +59 -0
  92. package/src/drawing-response/drawable-helper.jsx +21 -0
  93. package/src/drawing-response/drawable-image.jsx +36 -0
  94. package/src/drawing-response/drawable-line.jsx +62 -0
  95. package/src/drawing-response/drawable-main.jsx +333 -0
  96. package/src/drawing-response/drawable-palette.jsx +99 -0
  97. package/src/drawing-response/drawable-rectangle.jsx +69 -0
  98. package/src/drawing-response/drawable-text.jsx +318 -0
  99. package/src/drawing-response/drawable-transformer.jsx +52 -0
  100. package/src/drawing-response/factory.js +17 -0
  101. package/src/drawing-response/icon.jsx +52 -0
  102. package/src/drawing-response/index.jsx +92 -0
  103. package/src/index.js +72 -0
  104. package/configure.js +0 -2
  105. package/controller.js +0 -1
  106. package/dist/author/button.d.ts +0 -29
  107. package/dist/author/button.js +0 -25
  108. package/dist/author/defaults.d.ts +0 -118
  109. package/dist/author/defaults.js +0 -86
  110. package/dist/author/image-container.d.ts +0 -42
  111. package/dist/author/image-container.js +0 -183
  112. package/dist/author/index.d.ts +0 -37
  113. package/dist/author/index.js +0 -79
  114. package/dist/author/root.d.ts +0 -17
  115. package/dist/author/root.js +0 -142
  116. package/dist/browser/MenuItem-N0xdzWSs.js +0 -10483
  117. package/dist/browser/MenuItem-N0xdzWSs.js.map +0 -1
  118. package/dist/browser/author/index.js +0 -37837
  119. package/dist/browser/author/index.js.map +0 -1
  120. package/dist/browser/browser-kkT1XVKw.js +0 -219
  121. package/dist/browser/browser-kkT1XVKw.js.map +0 -1
  122. package/dist/browser/controller/index.js +0 -61
  123. package/dist/browser/controller/index.js.map +0 -1
  124. package/dist/browser/delivery/index.js +0 -13560
  125. package/dist/browser/delivery/index.js.map +0 -1
  126. package/dist/browser/drawing-response.css +0 -2
  127. package/dist/controller/defaults.d.ts +0 -24
  128. package/dist/controller/defaults.js +0 -18
  129. package/dist/controller/index.d.ts +0 -13
  130. package/dist/controller/index.js +0 -46
  131. package/dist/delivery/drawing-response/button.d.ts +0 -31
  132. package/dist/delivery/drawing-response/button.js +0 -36
  133. package/dist/delivery/drawing-response/constants.d.ts +0 -16
  134. package/dist/delivery/drawing-response/constants.js +0 -40
  135. package/dist/delivery/drawing-response/container.d.ts +0 -32
  136. package/dist/delivery/drawing-response/container.js +0 -212
  137. package/dist/delivery/drawing-response/drawable-circle.d.ts +0 -18
  138. package/dist/delivery/drawing-response/drawable-circle.js +0 -51
  139. package/dist/delivery/drawing-response/drawable-eraser.d.ts +0 -17
  140. package/dist/delivery/drawing-response/drawable-eraser.js +0 -52
  141. package/dist/delivery/drawing-response/drawable-free-path.d.ts +0 -18
  142. package/dist/delivery/drawing-response/drawable-free-path.js +0 -52
  143. package/dist/delivery/drawing-response/drawable-helper.d.ts +0 -17
  144. package/dist/delivery/drawing-response/drawable-helper.js +0 -12
  145. package/dist/delivery/drawing-response/drawable-image.d.ts +0 -24
  146. package/dist/delivery/drawing-response/drawable-image.js +0 -28
  147. package/dist/delivery/drawing-response/drawable-line.d.ts +0 -18
  148. package/dist/delivery/drawing-response/drawable-line.js +0 -53
  149. package/dist/delivery/drawing-response/drawable-main.d.ts +0 -25
  150. package/dist/delivery/drawing-response/drawable-main.js +0 -210
  151. package/dist/delivery/drawing-response/drawable-palette.d.ts +0 -14
  152. package/dist/delivery/drawing-response/drawable-palette.js +0 -89
  153. package/dist/delivery/drawing-response/drawable-rectangle.d.ts +0 -18
  154. package/dist/delivery/drawing-response/drawable-rectangle.js +0 -49
  155. package/dist/delivery/drawing-response/drawable-text.d.ts +0 -30
  156. package/dist/delivery/drawing-response/drawable-text.js +0 -189
  157. package/dist/delivery/drawing-response/drawable-transformer.d.ts +0 -16
  158. package/dist/delivery/drawing-response/drawable-transformer.js +0 -35
  159. package/dist/delivery/drawing-response/factory.d.ts +0 -11
  160. package/dist/delivery/drawing-response/factory.js +0 -19
  161. package/dist/delivery/drawing-response/icon.d.ts +0 -19
  162. package/dist/delivery/drawing-response/icon.js +0 -52
  163. package/dist/delivery/drawing-response/index.d.ts +0 -18
  164. package/dist/delivery/drawing-response/index.js +0 -70
  165. package/dist/delivery/index.d.ts +0 -19
  166. package/dist/delivery/index.js +0 -47
  167. package/dist/index.d.ts +0 -1
  168. package/dist/index.iife.d.ts +0 -8
  169. package/dist/index.iife.js +0 -165
  170. package/dist/index.js +0 -2
  171. package/dist/runtime-support.d.ts +0 -12
  172. package/dist/runtime-support.js +0 -12
@@ -0,0 +1,318 @@
1
+ import React from 'react';
2
+ import { Text } from 'react-konva';
3
+ import Translator from '@pie-lib/translator';
4
+
5
+ const { translator } = Translator;
6
+ import Transformer from './drawable-transformer';
7
+
8
+ export const generateId = () => Math.random().toString(36).substring(2) + new Date().getTime().toString(36);
9
+
10
+ export default class TextDrawable {
11
+ static getTextareaNode(id) {
12
+ return `textarea_${id}`;
13
+ }
14
+
15
+ static getTextNode(id) {
16
+ return `text_${id}`;
17
+ }
18
+
19
+ static getTransformerNode(id) {
20
+ return `transformer_${id}`;
21
+ }
22
+
23
+ constructor(props) {
24
+ this.all = (props && props.all) || [];
25
+ this.eventListenersDetachArray = [];
26
+ }
27
+
28
+ removeEventListeners = () => this.eventListenersDetachArray.forEach((fn) => fn());
29
+
30
+ setAll = (all) => {
31
+ this.all = all;
32
+ this.props.forceUpdate();
33
+ };
34
+
35
+ addNewTextEntry = (language) => {
36
+ const all = this.all;
37
+ const id = generateId();
38
+
39
+ all.push({
40
+ id: id,
41
+ text: '',
42
+ isDefault: true,
43
+ label: translator.t('drawingResponse.onDoubleClick', { lng: language }),
44
+ width: 200,
45
+ x: (all.length + 1) * 5 + 50,
46
+ y: (all.length + 1) * 5 + 50,
47
+ textVisible: true,
48
+ transformerVisible: true,
49
+ textareaVisible: false,
50
+ createdAt: new Date(),
51
+ type: 'text-entry',
52
+ });
53
+
54
+ this.props.handleSessionChange();
55
+ };
56
+
57
+ showOnlyTextNodes() {
58
+ this.all.map((item) => {
59
+ item.textVisible = true;
60
+ item.transformerVisible = false;
61
+ item.textareaVisible = false;
62
+ });
63
+ }
64
+
65
+ toggleTextarea(id, value) {
66
+ this.all = this.all.map((item) => {
67
+ if (item.id === id) {
68
+ return {
69
+ ...item,
70
+ textVisible: !value,
71
+ transformerVisible: !value,
72
+ textareaVisible: value,
73
+ };
74
+ }
75
+ return item;
76
+ });
77
+ this.props.forceUpdate();
78
+ }
79
+
80
+ initializeDefault(id, isDefault) {
81
+ if (isDefault) {
82
+ const current = this.all.filter((item) => item.id === id)[0];
83
+ current.isDefault = false;
84
+ }
85
+ }
86
+
87
+ saveValue(id, textareaNode) {
88
+ const value = textareaNode.value;
89
+ this.all = this.all.map((t) =>
90
+ t.id === id ? { ...t, text: value } : t
91
+ );
92
+
93
+ if (!value) {
94
+ this.all = this.all.filter((t) => t.id !== id);
95
+ }
96
+
97
+ this.toggleTextarea(id, false);
98
+ this.props.handleSessionChange();
99
+ this.props.forceUpdate();
100
+ }
101
+
102
+ handleMouseDown = () => this.props.toggleTextSelected(true);
103
+ handleMouseUp = () => this.props.toggleTextSelected(false);
104
+
105
+ handleClick = (e, id) => {
106
+ const current = this.all.filter((item) => item.id === id)[0];
107
+ current.transformerVisible = true;
108
+ this.props.forceUpdate();
109
+ };
110
+
111
+ handleDblClick = (e, text) => {
112
+ const { id, isDefault } = text;
113
+ this.toggleTextarea(id, true);
114
+
115
+ const textNode = this[TextDrawable.getTextNode(id)];
116
+ const textareaNode = this[TextDrawable.getTextareaNode(id)];
117
+
118
+ if (!textNode || !textareaNode) return;
119
+
120
+ const areaPosition = textNode.getAbsolutePosition();
121
+
122
+ textareaNode.value = text.text || '';
123
+ textareaNode.style.position = 'absolute';
124
+ textareaNode.style.top = areaPosition.y + 'px';
125
+ textareaNode.style.left = areaPosition.x + 'px';
126
+ textareaNode.style.width = textNode.width() - textNode.padding() * 2 + 'px';
127
+ textareaNode.style.height = textNode.height() - textNode.padding() * 2 + 5 + 'px';
128
+ textareaNode.style.fontSize = textNode.fontSize() + 'px';
129
+ textareaNode.style.border = 'none';
130
+ textareaNode.style.padding = '0px';
131
+ textareaNode.style.margin = '0px';
132
+ textareaNode.style.overflow = 'hidden';
133
+ textareaNode.style.background = 'none';
134
+ textareaNode.style.outline = 'none';
135
+ textareaNode.style.resize = 'none';
136
+ textareaNode.style.lineHeight = textNode.lineHeight();
137
+ textareaNode.style.fontFamily = textNode.fontFamily();
138
+ textareaNode.style.transformOrigin = 'left top';
139
+ textareaNode.style.textAlign = textNode.align();
140
+ textareaNode.style.color = textNode.fill();
141
+ textareaNode.style.display = 'block';
142
+
143
+ let rotation = textNode.rotation();
144
+ textareaNode.style.transform = rotation ? `rotateZ(${rotation}deg)` : '';
145
+
146
+ textareaNode.focus();
147
+
148
+ const keyDownHandler = (e) => {
149
+ if (e.key === 'Enter' && !e.shiftKey) {
150
+ this.saveValue(id, textareaNode);
151
+ }
152
+ if (e.key === 'Escape') {
153
+ this.toggleTextarea(id, false);
154
+ }
155
+ };
156
+
157
+ const blurHandler = () => {
158
+ this.showOnlyTextNodes();
159
+ this.saveValue(id, textareaNode);
160
+ };
161
+
162
+ textareaNode.addEventListener('keydown', keyDownHandler);
163
+ textareaNode.addEventListener('blur', blurHandler);
164
+
165
+ this.eventListenersDetachArray.push(() => {
166
+ textareaNode.removeEventListener('keydown', keyDownHandler);
167
+ textareaNode.removeEventListener('blur', blurHandler);
168
+ });
169
+
170
+ this.initializeDefault(id, isDefault);
171
+ this.props.forceUpdate();
172
+ };
173
+
174
+ handleTransform = (e, textNode) => {
175
+ this[textNode].setAttrs({
176
+ width: this[textNode].width() * this[textNode].scaleX(),
177
+ scaleX: this.props.scale,
178
+ });
179
+ };
180
+
181
+ renderTextareas() {
182
+ return this.all.map((text) => {
183
+ const { id, textareaVisible } = text;
184
+ const textareaNode = `textarea_${id}`;
185
+
186
+ return (
187
+ <textarea
188
+ key={textareaNode}
189
+ ref={(textarea) => {
190
+ this[textareaNode] = textarea;
191
+ }}
192
+ style={{ display: `${textareaVisible ? 'block' : 'none'}` }}
193
+ />
194
+ );
195
+ });
196
+ }
197
+
198
+ setInitialProps(props) {
199
+ if (!this.props) {
200
+ this.props = props;
201
+ }
202
+ }
203
+
204
+ render(props) {
205
+ this.setInitialProps(props);
206
+
207
+ if (props.stage) {
208
+ const newStage = props.stage;
209
+
210
+ // setting the handler only once
211
+ if (newStage !== this.stage) {
212
+ const stageClickHandler = (e) => {
213
+ if (e.target !== this.stage) {
214
+ return;
215
+ }
216
+
217
+ this.showOnlyTextNodes();
218
+ this.props.forceUpdate();
219
+ };
220
+
221
+ newStage.on('click', stageClickHandler);
222
+ this.eventListenersDetachArray.push(() => newStage.off('click', stageClickHandler));
223
+ }
224
+
225
+ this.stage = newStage;
226
+ }
227
+
228
+ return this.all.map((text) => {
229
+ const { id, label, x, y, width, textVisible, rotation, transformerVisible } = text;
230
+
231
+ const textNode = `text_${id}`;
232
+ const transformerNode = `transformer_${id}`;
233
+ let extraProps = {};
234
+
235
+ if (!props.disabled) {
236
+ extraProps = {
237
+ onClick: (e) => this.handleClick(e, id),
238
+ onTap: (e) => this.handleClick(e, id),
239
+ onDblClick: (e) => this.handleDblClick(e, text),
240
+ onDblTap: (e) => this.handleDblClick(e, text),
241
+ onTransform: (e) => this.handleTransform(e, textNode),
242
+ onTransformEnd: this.props.handleSessionChange,
243
+
244
+ onMouseDown: (e) => {
245
+ e.cancelBubble = true;
246
+ this.props.toggleTextSelected(true);
247
+ },
248
+ onTouchStart: (e) => {
249
+ e.cancelBubble = true;
250
+ this.props.toggleTextSelected(true);
251
+ },
252
+
253
+ onDragStart: (e) => {
254
+ e.cancelBubble = true;
255
+ this.props.toggleTextSelected(true);
256
+ },
257
+ onDragMove: (e) => {
258
+ e.cancelBubble = true;
259
+ },
260
+ onDragEnd: (e) => {
261
+ e.cancelBubble = true;
262
+ this.props.toggleTextSelected(false);
263
+ this.props.handleSessionChange();
264
+ },
265
+
266
+ onMouseUp: (e) => {
267
+ e.cancelBubble = true;
268
+ this.props.toggleTextSelected(false);
269
+ },
270
+ onTouchEnd: (e) => {
271
+ e.cancelBubble = true;
272
+ this.props.toggleTextSelected(false);
273
+ },
274
+
275
+ onMouseEnter: this.props.onMouseOverElement,
276
+ onMouseLeave: this.props.onMouseOutElement,
277
+ };
278
+ }
279
+
280
+ if (rotation) {
281
+ extraProps.rotation = rotation;
282
+ }
283
+
284
+ return [
285
+ <Text
286
+ key={id}
287
+ bubbles={true}
288
+ id={id}
289
+ ref={(text) => {
290
+ this[textNode] = text;
291
+ }}
292
+ text={text.text || label}
293
+ name={textNode}
294
+ x={x}
295
+ y={y}
296
+ width={width}
297
+ draggable={!props.disabled}
298
+ visible={textVisible}
299
+ fontSize={16}
300
+ {...extraProps}
301
+ />,
302
+ transformerVisible && (
303
+ <Transformer
304
+ key={`transformer_${id}`}
305
+ ref={(text) => {
306
+ this[transformerNode] = text;
307
+ }}
308
+ selectedShapeName={textNode}
309
+ onMouseDown={this.handleMouseDown}
310
+ onTouchStart={this.handleMouseDown}
311
+ onMouseUp={this.handleMouseUp}
312
+ onTouchEnd={this.handleMouseUp}
313
+ />
314
+ ),
315
+ ];
316
+ });
317
+ }
318
+ }
@@ -0,0 +1,52 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { Transformer } from 'react-konva';
4
+
5
+ class TransformerComponent extends React.Component {
6
+ componentDidMount() {
7
+ this.checkNode();
8
+ }
9
+
10
+ componentDidUpdate() {
11
+ this.checkNode();
12
+ }
13
+
14
+ checkNode() {
15
+ // here we need to manually attach or detach Transformer node
16
+ const stage = this.transformer.getStage();
17
+ const { selectedShapeName } = this.props;
18
+
19
+ const selectedNode = stage.findOne(`.${selectedShapeName}`);
20
+ // do nothing if selected node is already attached
21
+ if (selectedNode === this.transformer.node()) {
22
+ return;
23
+ }
24
+
25
+ if (selectedNode) {
26
+ // attach to another node
27
+ this.transformer.attachTo(selectedNode);
28
+ } else {
29
+ // remove transformer
30
+ this.transformer.detach();
31
+ }
32
+ this.transformer.getLayer().batchDraw();
33
+ }
34
+
35
+ render() {
36
+ return (
37
+ <Transformer
38
+ ref={(node) => {
39
+ this.transformer = node;
40
+ }}
41
+ enabledAnchors={['middle-left', 'middle-right']}
42
+ {...this.props}
43
+ />
44
+ );
45
+ }
46
+ }
47
+
48
+ TransformerComponent.propTypes = {
49
+ selectedShapeName: PropTypes.string.isRequired,
50
+ };
51
+
52
+ export default TransformerComponent;
@@ -0,0 +1,17 @@
1
+ import FreePathDrawable from './drawable-free-path';
2
+ import LineDrawable from './drawable-line';
3
+ import RectangleDrawable from './drawable-rectangle';
4
+ import CircleDrawable from './drawable-circle';
5
+ import EraserDrawable from './drawable-eraser';
6
+
7
+ const DRAWABLES = [FreePathDrawable, LineDrawable, RectangleDrawable, CircleDrawable, EraserDrawable];
8
+
9
+ export default (type, props) => {
10
+ const T = DRAWABLES.find((D) => D.TYPE === type);
11
+
12
+ if (T) {
13
+ return new T(props);
14
+ }
15
+
16
+ throw new Error(`Can't find drawable for type: ${type} and props: ${JSON.stringify(props)}`);
17
+ };
@@ -0,0 +1,52 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import Icon from '@mdi/react';
4
+ import {
5
+ mdiCursorDefault,
6
+ mdiPencil,
7
+ mdiMinus,
8
+ mdiRectangle,
9
+ mdiCircle,
10
+ mdiFormatColorText,
11
+ mdiFormatColorFill,
12
+ mdiEraser,
13
+ } from '@mdi/js';
14
+
15
+ const IconWrapper = ({ path }) => {
16
+ let iconPath;
17
+
18
+ switch (path) {
19
+ case 'mdiPencil':
20
+ iconPath = mdiPencil;
21
+ break;
22
+ case 'mdiMinus':
23
+ iconPath = mdiMinus;
24
+ break;
25
+ case 'mdiCircle':
26
+ iconPath = mdiCircle;
27
+ break;
28
+ case 'mdiRectangle':
29
+ iconPath = mdiRectangle;
30
+ break;
31
+ case 'mdiFormatColorText':
32
+ iconPath = mdiFormatColorText;
33
+ break;
34
+ case 'mdiFormatColorFill':
35
+ iconPath = mdiFormatColorFill;
36
+ break;
37
+ case 'mdiEraser':
38
+ iconPath = mdiEraser;
39
+ break;
40
+ default:
41
+ iconPath = mdiCursorDefault;
42
+ break;
43
+ }
44
+
45
+ return <Icon path={iconPath} size={0.8} rotate={180} horizontal vertical color="#2B3963" />;
46
+ };
47
+
48
+ IconWrapper.propTypes = {
49
+ path: PropTypes.string.isRequired,
50
+ };
51
+
52
+ export default IconWrapper;
@@ -0,0 +1,92 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { color, Collapsible, PreviewPrompt, UiLayout } from '@pie-lib/render-ui';
4
+ import { styled } from '@mui/material/styles';
5
+
6
+ import Container from './container';
7
+
8
+ const StyledUiLayout = styled(UiLayout)({
9
+ color: color.text(),
10
+ backgroundColor: color.background(),
11
+ });
12
+
13
+ const StyledCollapsible = styled(Collapsible)(({ theme }) => ({
14
+ marginBottom: theme.spacing(2),
15
+ }));
16
+
17
+ const ErrorDiv = styled('div')({
18
+ color: color.text(),
19
+ backgroundColor: color.background(),
20
+ });
21
+
22
+ class DrawingResponseComponent extends React.Component {
23
+ constructor(props) {
24
+ super(props);
25
+ this.state = {
26
+ showCorrect: false,
27
+ hasError: false,
28
+ };
29
+ }
30
+
31
+ static getDerivedStateFromError(error) {
32
+ return { hasError: true, errorMessage: error.message };
33
+ }
34
+
35
+ render() {
36
+ const {
37
+ model: {
38
+ extraCSSRules,
39
+ disabled,
40
+ imageDimensions,
41
+ imageUrl,
42
+ prompt,
43
+ mode,
44
+ teacherInstructions,
45
+ backgroundImageEnabled,
46
+ language,
47
+ },
48
+ session,
49
+ onSessionChange,
50
+ } = this.props;
51
+ const { hasError, errorMessage } = this.state;
52
+ const isEvaluateMode = mode === 'evaluate';
53
+
54
+ return hasError ? (
55
+ <ErrorDiv>An error occured: {errorMessage}</ErrorDiv>
56
+ ) : (
57
+ <StyledUiLayout extraCSSRules={extraCSSRules}>
58
+ {teacherInstructions && (
59
+ <StyledCollapsible
60
+ labels={{
61
+ hidden: 'Show Teacher Instructions',
62
+ visible: 'Hide Teacher Instructions',
63
+ }}
64
+ >
65
+ <PreviewPrompt prompt={teacherInstructions} />
66
+ </StyledCollapsible>
67
+ )}
68
+
69
+ {prompt && <PreviewPrompt tagName="span" prompt={prompt} />}
70
+
71
+ <Container
72
+ session={session}
73
+ onSessionChange={onSessionChange}
74
+ isEvaluateMode={isEvaluateMode}
75
+ imageDimensions={imageDimensions}
76
+ imageUrl={imageUrl}
77
+ backgroundImageEnabled={backgroundImageEnabled}
78
+ disabled={disabled}
79
+ language={language}
80
+ />
81
+ </StyledUiLayout>
82
+ );
83
+ }
84
+ }
85
+
86
+ DrawingResponseComponent.propTypes = {
87
+ model: PropTypes.object.isRequired,
88
+ onSessionChange: PropTypes.func.isRequired,
89
+ session: PropTypes.object.isRequired,
90
+ };
91
+
92
+ export default DrawingResponseComponent;
package/src/index.js ADDED
@@ -0,0 +1,72 @@
1
+ import React from 'react';
2
+ import { createRoot } from 'react-dom/client';
3
+ import { isEmpty } from 'lodash-es';
4
+ import { renderMath } from '@pie-lib/math-rendering';
5
+ import { ModelSetEvent, SessionChangedEvent } from '@pie-framework/pie-player-events';
6
+
7
+ import DrawingResponseComponent from './drawing-response';
8
+
9
+ export default class DrawingResponse extends HTMLElement {
10
+ constructor() {
11
+ super();
12
+ this._root = null;
13
+ }
14
+
15
+ set model(m) {
16
+ this._model = m;
17
+
18
+ this.dispatchEvent(new ModelSetEvent(this.tagName.toLowerCase(), this.isComplete(), !!this._model));
19
+ this._render();
20
+ }
21
+
22
+ isComplete() {
23
+ return this._session && (!isEmpty(this._session.drawables) || !isEmpty(this._session.texts));
24
+ }
25
+
26
+ sessionChanged = (update) => {
27
+ this._session.drawables = update.drawables;
28
+ this._session.texts = update.texts;
29
+ this._session.width = update.width;
30
+
31
+ this.dispatchEvent(new SessionChangedEvent(this.tagName.toLowerCase(), this.isComplete()));
32
+
33
+ this._render();
34
+ };
35
+
36
+ set session(s) {
37
+ this._session = s;
38
+ this._render();
39
+ }
40
+
41
+ get session() {
42
+ return this._session;
43
+ }
44
+
45
+ connectedCallback() {
46
+ this._render();
47
+ }
48
+
49
+ _render() {
50
+ if (this._model && this._session) {
51
+ const el = React.createElement(DrawingResponseComponent, {
52
+ model: this._model,
53
+ session: this._session,
54
+ onSessionChange: this.sessionChanged,
55
+ });
56
+
57
+ if (!this._root) {
58
+ this._root = createRoot(this);
59
+ }
60
+ this._root.render(el);
61
+ queueMicrotask(() => {
62
+ renderMath(this);
63
+ });
64
+ }
65
+ }
66
+
67
+ disconnectedCallback() {
68
+ if (this._root) {
69
+ this._root.unmount();
70
+ }
71
+ }
72
+ }
package/configure.js DELETED
@@ -1,2 +0,0 @@
1
- export { default } from './dist/author/index.js';
2
- export * from './dist/author/index.js';
package/controller.js DELETED
@@ -1 +0,0 @@
1
- export * from './dist/controller/index.js';
@@ -1,29 +0,0 @@
1
- /**
2
- * @synced-from pie-elements/packages/drawing-response/configure/src/button.jsx
3
- * @auto-generated
4
- *
5
- * This file is automatically synced from pie-elements and converted to TypeScript.
6
- * Manual edits will be overwritten on next sync.
7
- * To make changes, edit the upstream JavaScript file and run sync again.
8
- */
9
- import React from 'react';
10
- import PropTypes from 'prop-types';
11
- declare const CustomButton: {
12
- ({ label, onClick, disabled }: {
13
- label: any;
14
- onClick: any;
15
- disabled: any;
16
- }): React.JSX.Element;
17
- propTypes: {
18
- disabled: PropTypes.Requireable<boolean>;
19
- label: PropTypes.Requireable<string>;
20
- onClick: PropTypes.Requireable<(...args: any[]) => any>;
21
- };
22
- defaultProps: {
23
- className: string;
24
- disabled: boolean;
25
- label: string;
26
- onClick: () => void;
27
- };
28
- };
29
- export default CustomButton;
@@ -1,25 +0,0 @@
1
- import "react";
2
- import e from "prop-types";
3
- import { jsx as t } from "react/jsx-runtime";
4
- import { styled as n } from "@mui/material/styles";
5
- import r from "@mui/material/Button";
6
- //#region src/author/button.tsx
7
- var i = n(r)({ marginLeft: 8 }), a = ({ label: e, onClick: n, disabled: r }) => /* @__PURE__ */ t(i, {
8
- onClick: n,
9
- disabled: r,
10
- size: "small",
11
- variant: "contained",
12
- children: e
13
- });
14
- a.propTypes = {
15
- disabled: e.bool,
16
- label: e.string,
17
- onClick: e.func
18
- }, a.defaultProps = {
19
- className: "",
20
- disabled: !1,
21
- label: "Add",
22
- onClick: () => {}
23
- };
24
- //#endregion
25
- export { a as default };