@pie-element/drawing-response 12.1.2-next.5 → 12.1.3

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 +1972 -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 +1772 -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-HceGvxhZ.js +0 -10487
  117. package/dist/browser/MenuItem-HceGvxhZ.js.map +0 -1
  118. package/dist/browser/author/index.js +0 -43740
  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,62 @@
1
+ import React from 'react';
2
+ import { Arrow } from 'react-konva';
3
+
4
+ import DrawableHelper from './drawable-helper';
5
+
6
+ export default class LineDrawable extends DrawableHelper {
7
+ static TYPE = 'LineDrawable';
8
+
9
+ constructor(props) {
10
+ super(props, LineDrawable.TYPE);
11
+ const { startx, starty, x, y, posX, posY } = props;
12
+
13
+ this.x = x || startx;
14
+ this.y = y || starty;
15
+ this.posX = posX || 0;
16
+ this.posY = posY || 0;
17
+ }
18
+
19
+ registerMovement(x, y) {
20
+ this.x = x;
21
+ this.y = y;
22
+ }
23
+
24
+ handleOnClick(props) {
25
+ const { paint, paintColor, forceUpdate } = props;
26
+
27
+ if (paint) {
28
+ this.paintColor = paintColor;
29
+ forceUpdate();
30
+ }
31
+ }
32
+
33
+ handleDragEnd = (props, event) => {
34
+ this.posX = event.target.getX();
35
+ this.posY = event.target.getY();
36
+
37
+ props.handleSessionChange();
38
+ };
39
+
40
+ render(props) {
41
+ const { draggable, key, onMouseOverElement, onMouseOutElement } = props;
42
+ const points = [this.startx, this.starty, this.x, this.y];
43
+
44
+ return (
45
+ <Arrow
46
+ key={key}
47
+ draggable={draggable}
48
+ points={points}
49
+ fill={this.paintColor || this.outlineColor}
50
+ onClick={() => this.handleOnClick(props)}
51
+ stroke={this.paintColor || this.outlineColor}
52
+ onDragEnd={this.handleDragEnd.bind(this, props)}
53
+ onMouseEnter={onMouseOverElement}
54
+ onMouseLeave={onMouseOutElement}
55
+ x={this.posX}
56
+ y={this.posY}
57
+ pointerWidth={0}
58
+ pointerLength={0}
59
+ />
60
+ );
61
+ }
62
+ }
@@ -0,0 +1,333 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { cloneDeep, isEqual, omit } from 'lodash-es';
4
+ import { Layer, Stage } from 'react-konva';
5
+ import { styled } from '@mui/material/styles';
6
+ import Translator from '@pie-lib/translator';
7
+
8
+ const { translator } = Translator;
9
+ import ImageBackground from './drawable-image';
10
+ import Button from './button';
11
+ import factory from './factory';
12
+
13
+ const Wrapper = styled('div')({
14
+ display: 'flex',
15
+ flexWrap: 'wrap',
16
+ justifyContent: 'flex-end',
17
+ });
18
+
19
+ const Base = styled('div')({
20
+ position: 'relative',
21
+ width: '100%',
22
+ });
23
+
24
+ const UndoControls = styled('div')({
25
+ marginTop: -43,
26
+ marginRight: 10,
27
+ position: 'absolute',
28
+ });
29
+
30
+ export class DrawableMain extends React.Component {
31
+ constructor(props) {
32
+ super(props);
33
+ this.state = {
34
+ drawables: [],
35
+ newDrawable: [],
36
+ textIsSelected: false,
37
+ };
38
+ this.stage = null;
39
+ this.layer = null;
40
+ }
41
+
42
+ componentWillUnmount() {
43
+ // Clean up refs to prevent React Konva errors
44
+ this.stage = null;
45
+ this.layer = null;
46
+ }
47
+
48
+ UNSAFE_componentWillReceiveProps(nextProps) {
49
+ if (nextProps.session) {
50
+ const { TextEntry } = nextProps;
51
+ const { drawables: currentDrawables } = this.state;
52
+
53
+ if (nextProps.session.drawables) {
54
+ const newDrawables = cloneDeep(nextProps.session.drawables);
55
+ const drawablesString = JSON.stringify(currentDrawables);
56
+ const sessionDrawableString = JSON.stringify((newDrawables || []).map((drawable) => omit(drawable, 'type')));
57
+
58
+ if (drawablesString !== sessionDrawableString) {
59
+ const drawableArray = nextProps.session.drawables;
60
+
61
+ this.setState({
62
+ drawables: drawableArray.map((drawable) => factory(drawable.type, drawable)),
63
+ });
64
+ }
65
+
66
+ const currentTexts = TextEntry.all.map((text) => ({
67
+ ...text,
68
+ ...(TextEntry[`text_${text.id}`] && TextEntry[`text_${text.id}`].attrs),
69
+ value: TextEntry[`textarea_${text.id}`] && TextEntry[`textarea_${text.id}`].value,
70
+ }));
71
+
72
+ if (!isEqual(currentTexts, nextProps.session.texts)) {
73
+ TextEntry.setAll(nextProps.session.texts || []);
74
+ }
75
+ }
76
+ } else {
77
+ this.handleSessionChange();
78
+ }
79
+ }
80
+
81
+ handleSessionChange = () => {
82
+ const { onSessionChange, session, TextEntry, drawableDimensions } = this.props;
83
+ const { drawables } = this.state;
84
+
85
+ const newSession = {
86
+ width: drawableDimensions.width,
87
+ drawables: drawables.map((d) => d.toJson()),
88
+ texts: TextEntry.all.map((text) => ({
89
+ ...text,
90
+ ...(TextEntry[`text_${text.id}`] && TextEntry[`text_${text.id}`].attrs),
91
+ value: TextEntry[`textarea_${text.id}`] && TextEntry[`textarea_${text.id}`].value,
92
+ })),
93
+ };
94
+
95
+ if (!isEqual(newSession, session)) {
96
+ onSessionChange({
97
+ ...session,
98
+ ...newSession,
99
+ });
100
+ }
101
+ };
102
+
103
+ onMouseOverElement = () => this.setState({ isOver: true });
104
+
105
+ onMouseOutElement = () => this.setState({ isOver: false });
106
+
107
+ handleMouseDown = (e) => {
108
+ // ONLY IF MOBILE?
109
+ document.body.style.overflow = 'hidden';
110
+
111
+ const { newDrawable, textIsSelected } = this.state;
112
+ const { toolActive, fillColor, outlineColor, scale } = this.props;
113
+
114
+ if (newDrawable.length === 0 && !textIsSelected) {
115
+ const stage = e.target.getStage();
116
+ if (!stage) return;
117
+
118
+ const { x, y } = stage.getPointerPosition();
119
+
120
+ const newDrawable = factory(toolActive.type, {
121
+ startx: x / scale,
122
+ starty: y / scale,
123
+ fillColor,
124
+ outlineColor,
125
+ createdAt: new Date(),
126
+ });
127
+
128
+ this.setState({
129
+ newDrawable: [newDrawable],
130
+ });
131
+ }
132
+ };
133
+
134
+ handleMouseUp = (e) => {
135
+ // ONLY IF MOBILE?
136
+ document.body.style.overflow = 'initial';
137
+
138
+ const { newDrawable, drawables } = this.state;
139
+ const { scale } = this.props;
140
+
141
+ if (newDrawable.length === 1) {
142
+ const stage = e.target.getStage();
143
+ if (!stage) return;
144
+
145
+ const { x, y } = stage.getPointerPosition();
146
+ const drawableToAdd = newDrawable[0];
147
+
148
+ drawableToAdd.registerMovement(x / scale, y / scale);
149
+ drawables.push(drawableToAdd);
150
+
151
+ this.setState(
152
+ {
153
+ newDrawable: [],
154
+ drawables,
155
+ },
156
+ this.handleSessionChange.bind(this, drawableToAdd),
157
+ );
158
+ }
159
+ };
160
+
161
+ handleMouseMove = (e) => {
162
+ const { newDrawable } = this.state;
163
+ const { scale } = this.props;
164
+
165
+ if (newDrawable.length === 1) {
166
+ const stage = e.target.getStage();
167
+ if (!stage) return;
168
+
169
+ const { x, y } = stage.getPointerPosition();
170
+ const updatedNewDrawable = newDrawable[0];
171
+
172
+ updatedNewDrawable.registerMovement(x / scale, y / scale);
173
+
174
+ this.setState({
175
+ newDrawable: [updatedNewDrawable],
176
+ });
177
+ }
178
+ };
179
+
180
+ handleUndo = () => {
181
+ const { drawables } = this.state;
182
+ const { TextEntry } = this.props;
183
+
184
+ const newDrawables = [...drawables];
185
+ const allData = [...drawables, ...TextEntry.all];
186
+
187
+ allData.sort((a, b) => new Date(a.createdAt) - new Date(b.createdAt));
188
+ const lastElement = allData[allData.length - 1];
189
+
190
+ if (lastElement && lastElement.type === 'text-entry') {
191
+ TextEntry.all.pop();
192
+ this.setState({ updatedAt: new Date() }, this.handleSessionChange);
193
+ } else {
194
+ newDrawables.pop();
195
+ this.setState({ drawables: newDrawables }, this.handleSessionChange);
196
+ }
197
+ };
198
+
199
+ handleClearAll = () => {
200
+ const { TextEntry } = this.props;
201
+
202
+ TextEntry.all = [];
203
+ this.setState({ drawables: [], updatedAt: new Date() }, this.handleSessionChange);
204
+ };
205
+
206
+ toggleTextSelected = (textIsSelected) => this.setState({ textIsSelected });
207
+
208
+ render() {
209
+ const {
210
+ disabled,
211
+ drawableDimensions,
212
+ fillColor,
213
+ imageDimensions,
214
+ imageUrl,
215
+ paintColor,
216
+ outlineColor,
217
+ TextEntry,
218
+ backgroundImageEnabled = true,
219
+ toolActive: { type },
220
+ scale,
221
+ language,
222
+ } = this.props;
223
+ const { isOver, newDrawable } = this.state;
224
+
225
+ const draggable = type === 'Select';
226
+ const paint = type === 'PaintBucket';
227
+ const drawables = [...this.state.drawables, ...this.state.newDrawable];
228
+
229
+ const drawableProps = {
230
+ draggable: draggable && !disabled,
231
+ disabled,
232
+ paint,
233
+ fillColor,
234
+ forceUpdate: () => this.setState({ updatedAt: new Date() }),
235
+ paintColor,
236
+ outlineColor,
237
+ toggleTextSelected: this.toggleTextSelected,
238
+ handleSessionChange: this.handleSessionChange,
239
+ stage: this.stage,
240
+ onMouseOverElement: this.onMouseOverElement,
241
+ onMouseOutElement: this.onMouseOutElement,
242
+ scale,
243
+ };
244
+
245
+ let listeners = {};
246
+
247
+ if (!disabled) {
248
+ listeners = {
249
+ onMouseUp: this.handleMouseUp,
250
+ onTouchEnd: this.handleMouseUp,
251
+ onMouseMove: this.handleMouseMove,
252
+ onTouchMove: this.handleMouseMove,
253
+ };
254
+
255
+ if (!draggable) {
256
+ listeners.onMouseDown = this.handleMouseDown;
257
+ listeners.onTouchStart = this.handleMouseDown;
258
+ }
259
+ }
260
+
261
+ const imageHeight = imageDimensions?.height * scale;
262
+ const imageWidth = imageDimensions?.width * scale;
263
+
264
+ return (
265
+ <Wrapper>
266
+ <UndoControls>
267
+ <Button
268
+ disabled={disabled}
269
+ onClick={this.handleUndo}
270
+ label={translator.t('common:undo', { lng: language })}
271
+ />
272
+ <Button
273
+ disabled={disabled}
274
+ onClick={this.handleClearAll}
275
+ label={translator.t('common:clearAll', { lng: language })}
276
+ />
277
+ </UndoControls>
278
+ <Base>
279
+ {backgroundImageEnabled && imageUrl && (
280
+ <ImageBackground dimensions={{ height: imageHeight, width: imageWidth }} url={imageUrl} />
281
+ )}
282
+
283
+ {TextEntry.renderTextareas()}
284
+
285
+ {/* Wrap Stage in a styled div instead of styling Stage directly */}
286
+ <div
287
+ style={{
288
+ position: 'absolute',
289
+ left: 0,
290
+ top: 0,
291
+ touchAction: 'none',
292
+ cursor: draggable && (isOver || newDrawable.length === 1) ? 'pointer' : 'default',
293
+ }}
294
+ >
295
+ <Stage
296
+ key="drawing-stage"
297
+ scaleX={scale}
298
+ scaleY={scale}
299
+ ref={(ref) => (this.stage = ref)}
300
+ height={drawableDimensions.height}
301
+ width={drawableDimensions.width}
302
+ {...listeners}
303
+ >
304
+ <Layer ref={(ref) => (this.layer = ref)}>
305
+ {drawables.map((drawable, key) => drawable.render({ ...drawableProps, key }))}
306
+ {TextEntry.render(drawableProps)}
307
+ </Layer>
308
+ </Stage>
309
+ </div>
310
+ </Base>
311
+ </Wrapper>
312
+ );
313
+ }
314
+ }
315
+
316
+ DrawableMain.propTypes = {
317
+ disabled: PropTypes.bool,
318
+ drawableDimensions: PropTypes.object.isRequired,
319
+ imageDimensions: PropTypes.object.isRequired,
320
+ fillColor: PropTypes.string.isRequired,
321
+ onSessionChange: PropTypes.func.isRequired,
322
+ paintColor: PropTypes.string.isRequired,
323
+ outlineColor: PropTypes.string.isRequired,
324
+ imageUrl: PropTypes.string.isRequired,
325
+ TextEntry: PropTypes.object.isRequired,
326
+ toolActive: PropTypes.object.isRequired,
327
+ session: PropTypes.object.isRequired,
328
+ backgroundImageEnabled: PropTypes.bool.isRequired,
329
+ scale: PropTypes.number.isRequired,
330
+ language: PropTypes.string,
331
+ };
332
+
333
+ export default DrawableMain;
@@ -0,0 +1,99 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { InputContainer } from '@pie-lib/render-ui';
4
+ import Select from '@mui/material/Select';
5
+ import MenuItem from '@mui/material/MenuItem';
6
+ import { styled } from '@mui/material/styles';
7
+ import Translator from '@pie-lib/translator';
8
+
9
+ const { translator } = Translator;
10
+
11
+ const BaseContainer = styled('div')(({ theme }) => ({
12
+ marginTop: theme.spacing(2),
13
+ display: 'flex',
14
+ }));
15
+
16
+ const StyledInputContainer = styled(InputContainer)({
17
+ flex: 1,
18
+ fontSize: 'inherit',
19
+ width: '90%',
20
+ });
21
+
22
+ const StyledMenuItem = styled(MenuItem)(({ theme, isBlackColor }) => ({
23
+ borderRadius: '2px',
24
+ fontSize: 'inherit',
25
+ height: '22px',
26
+ marginLeft: theme.spacing(2),
27
+ marginRight: theme.spacing(2),
28
+ marginTop: theme.spacing(2),
29
+ ...(isBlackColor && {
30
+ color: theme.palette.background.paper,
31
+ }),
32
+ }));
33
+
34
+ const StyledSelect = styled(Select)({
35
+ fontSize: 'inherit',
36
+ transform: 'translate(0%, 40%)',
37
+ });
38
+
39
+ // TODO: Change Palette so will render inputs and colors dynamically
40
+ class Palette extends React.Component {
41
+ onChange = (name) => (event) => {
42
+ const { value } = event.target;
43
+ const { onFillColorChange, onOutlineColorChange, onPaintColorChange } = this.props;
44
+
45
+ if (name === 'fill') {
46
+ onFillColorChange(value);
47
+ } else if (name === 'outline') {
48
+ onOutlineColorChange(value);
49
+ } else {
50
+ onPaintColorChange(value);
51
+ }
52
+ };
53
+
54
+ render() {
55
+ const { fillColor, outlineColor, fillList, outlineList, language } = this.props;
56
+
57
+ return (
58
+ <BaseContainer>
59
+ <StyledInputContainer label={translator.t('drawingResponse.fillColor', { lng: language })}>
60
+ <StyledSelect onChange={this.onChange('fill')} value={fillColor} variant='standard' MenuProps={{ transitionDuration: { enter: 225, exit: 195 } }}>
61
+ {fillList.map(({ value, label }) => (
62
+ <StyledMenuItem
63
+ key={value}
64
+ value={value}
65
+ isBlackColor={value === 'black'}
66
+ style={{ backgroundColor: value }}
67
+ >
68
+ {label}
69
+ </StyledMenuItem>
70
+ ))}
71
+ </StyledSelect>
72
+ </StyledInputContainer>
73
+
74
+ <StyledInputContainer label={translator.t('drawingResponse.outlineColor', { lng: language })}>
75
+ <StyledSelect onChange={this.onChange('outline')} value={outlineColor} variant='standard' MenuProps={{ transitionDuration: { enter: 225, exit: 195 } }}>
76
+ {outlineList.map(({ value, label }) => (
77
+ <StyledMenuItem key={value} value={value} style={{ border: `2px solid ${value}` }}>
78
+ {label}
79
+ </StyledMenuItem>
80
+ ))}
81
+ </StyledSelect>
82
+ </StyledInputContainer>
83
+ </BaseContainer>
84
+ );
85
+ }
86
+ }
87
+
88
+ Palette.propTypes = {
89
+ fillColor: PropTypes.string.isRequired,
90
+ fillList: PropTypes.array.isRequired,
91
+ onFillColorChange: PropTypes.func.isRequired,
92
+ onOutlineColorChange: PropTypes.func.isRequired,
93
+ onPaintColorChange: PropTypes.func.isRequired,
94
+ outlineColor: PropTypes.string.isRequired,
95
+ outlineList: PropTypes.array.isRequired,
96
+ language: PropTypes.string,
97
+ };
98
+
99
+ export default Palette;
@@ -0,0 +1,69 @@
1
+ import React from 'react';
2
+ import { Rect } from 'react-konva';
3
+
4
+ import DrawableHelper from './drawable-helper';
5
+
6
+ export default class RectangleDrawable extends DrawableHelper {
7
+ static TYPE = 'RectangleDrawable';
8
+ constructor(props) {
9
+ super(props, RectangleDrawable.TYPE);
10
+ const { startx, starty, x, y } = props;
11
+ this.startx = startx;
12
+ this.starty = starty;
13
+ this.x = x || startx;
14
+ this.y = y || starty;
15
+ this.width = x - startx || 0;
16
+ this.height = y - starty || 0;
17
+ }
18
+
19
+ registerMovement(x, y) {
20
+ this.x = x;
21
+ this.y = y;
22
+ this.width = this.x - this.startx;
23
+ this.height = this.y - this.starty;
24
+ }
25
+
26
+ handleOnClick(props) {
27
+ const { paint, paintColor, forceUpdate } = props;
28
+
29
+ if (paint) {
30
+ this.paintColor = paintColor;
31
+ forceUpdate();
32
+ }
33
+ }
34
+
35
+ handleDragEnd = (props, event) => {
36
+ const deltaX = this.startx - event.target.getX();
37
+ const deltaY = this.starty - event.target.getY();
38
+
39
+ this.startx = event.target.getX();
40
+ this.starty = event.target.getY();
41
+
42
+ this.x = this.x - deltaX;
43
+ this.y = this.y - deltaY;
44
+
45
+ props.handleSessionChange();
46
+ };
47
+
48
+ render(props) {
49
+ const { draggable, key, onMouseOverElement, onMouseOutElement } = props;
50
+
51
+ return (
52
+ <Rect
53
+ key={key}
54
+ height={this.height}
55
+ width={this.width}
56
+ fill={this.paintColor || this.fillColor}
57
+ onClick={() => this.handleOnClick(props)}
58
+ onDragEnd={this.handleDragEnd.bind(this, props)}
59
+ onMouseEnter={onMouseOverElement}
60
+ onMouseLeave={onMouseOutElement}
61
+ stroke={this.outlineColor}
62
+ draggable={draggable}
63
+ strokeWidth={2}
64
+ x={this.startx}
65
+ y={this.starty}
66
+ />
67
+ );
68
+ }
69
+ }