@pie-element/drawing-response 3.9.11 → 3.9.14

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 (47) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/configure/CHANGELOG.md +24 -0
  3. package/configure/lib/defaults.js +7 -2
  4. package/configure/lib/defaults.js.map +1 -1
  5. package/configure/lib/image-container.js +14 -7
  6. package/configure/lib/image-container.js.map +1 -1
  7. package/configure/lib/index.js +0 -6
  8. package/configure/lib/index.js.map +1 -1
  9. package/configure/lib/root.js +15 -7
  10. package/configure/lib/root.js.map +1 -1
  11. package/configure/package.json +3 -3
  12. package/configure/src/__tests__/__snapshots__/root.test.jsx.snap +7 -14
  13. package/configure/src/defaults.js +7 -2
  14. package/configure/src/image-container.jsx +72 -44
  15. package/configure/src/index.js +0 -6
  16. package/configure/src/root.jsx +31 -24
  17. package/controller/CHANGELOG.md +8 -0
  18. package/controller/lib/index.js +6 -3
  19. package/controller/lib/index.js.map +1 -1
  20. package/controller/package.json +1 -1
  21. package/controller/src/__tests__/index.test.js +18 -9
  22. package/controller/src/index.js +4 -1
  23. package/docs/config-schema.json +16 -0
  24. package/docs/config-schema.json.md +12 -0
  25. package/docs/demo/generate.js +1 -0
  26. package/docs/pie-schema.json +12 -0
  27. package/docs/pie-schema.json.md +8 -0
  28. package/lib/drawing-response/container.js +57 -11
  29. package/lib/drawing-response/container.js.map +1 -1
  30. package/lib/drawing-response/drawable-image.js +2 -1
  31. package/lib/drawing-response/drawable-image.js.map +1 -1
  32. package/lib/drawing-response/drawable-main.js +26 -10
  33. package/lib/drawing-response/drawable-main.js.map +1 -1
  34. package/lib/drawing-response/drawable-text.js +1 -1
  35. package/lib/drawing-response/drawable-text.js.map +1 -1
  36. package/lib/drawing-response/index.js +3 -0
  37. package/lib/drawing-response/index.js.map +1 -1
  38. package/package.json +4 -4
  39. package/src/drawing-response/__tests__/__snapshots__/container.test.jsx.snap +18 -2
  40. package/src/drawing-response/__tests__/__snapshots__/drawing-main.test.jsx.snap +12 -2
  41. package/src/drawing-response/__tests__/container.test.jsx +7 -0
  42. package/src/drawing-response/__tests__/drawing-main.test.jsx +2 -1
  43. package/src/drawing-response/container.jsx +40 -2
  44. package/src/drawing-response/drawable-image.jsx +2 -1
  45. package/src/drawing-response/drawable-main.jsx +24 -10
  46. package/src/drawing-response/drawable-text.jsx +1 -1
  47. package/src/drawing-response/index.jsx +3 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pie-element/drawing-response",
3
- "version": "3.9.11",
3
+ "version": "3.9.14",
4
4
  "description": "",
5
5
  "repository": "pie-framework/pie-elements",
6
6
  "publishConfig": {
@@ -11,8 +11,8 @@
11
11
  "@mdi/js": "^3.6.95",
12
12
  "@mdi/react": "^1.1.1",
13
13
  "@pie-framework/pie-player-events": "^0.1.0",
14
- "@pie-lib/math-rendering": "^2.3.12",
15
- "@pie-lib/render-ui": "^4.12.4",
14
+ "@pie-lib/math-rendering": "^2.3.13",
15
+ "@pie-lib/render-ui": "^4.12.5",
16
16
  "classnames": "^2.2.6",
17
17
  "enzyme-to-json": "^3.3.5",
18
18
  "konva": "^3.4.1",
@@ -24,7 +24,7 @@
24
24
  },
25
25
  "author": "pie framework developers",
26
26
  "license": "ISC",
27
- "gitHead": "cd1a2efd59f915b882937dea95c2675b2d2a3a50",
27
+ "gitHead": "b32a90d35916de8f2b77d7b3428b02efbd145313",
28
28
  "scripts": {
29
29
  "postpublish": "../../scripts/postpublish"
30
30
  },
@@ -212,7 +212,14 @@ exports[`Container snapshot renders 1`] = `
212
212
  />
213
213
  </div>
214
214
  </div>
215
- <div>
215
+ <div
216
+ style={
217
+ Object {
218
+ "height": NaN,
219
+ "maxHeight": NaN,
220
+ }
221
+ }
222
+ >
216
223
  <WithStyles(DrawableMain)
217
224
  TextEntry={
218
225
  TextDrawable {
@@ -240,6 +247,7 @@ exports[`Container snapshot renders 1`] = `
240
247
  onSessionChange={[MockFunction]}
241
248
  outlineColor="black"
242
249
  paintColor="red"
250
+ scale={1}
243
251
  session={Object {}}
244
252
  toolActive={
245
253
  Object {
@@ -466,7 +474,14 @@ exports[`Container snapshot renders disabled 1`] = `
466
474
  />
467
475
  </div>
468
476
  </div>
469
- <div>
477
+ <div
478
+ style={
479
+ Object {
480
+ "height": NaN,
481
+ "maxHeight": NaN,
482
+ }
483
+ }
484
+ >
470
485
  <WithStyles(DrawableMain)
471
486
  TextEntry={
472
487
  TextDrawable {
@@ -495,6 +510,7 @@ exports[`Container snapshot renders disabled 1`] = `
495
510
  onSessionChange={[MockFunction]}
496
511
  outlineColor="black"
497
512
  paintColor="red"
513
+ scale={1}
498
514
  session={Object {}}
499
515
  toolActive={
500
516
  Object {
@@ -26,7 +26,12 @@ exports[`DrawingResponse DrawableMain snapshot renders 1`] = `
26
26
  </div>
27
27
  <div>
28
28
  <WithStyles(DrawableImage)
29
- dimensions={Object {}}
29
+ dimensions={
30
+ Object {
31
+ "height": NaN,
32
+ "width": NaN,
33
+ }
34
+ }
30
35
  url="url"
31
36
  />
32
37
  <ForwardRef
@@ -58,7 +63,12 @@ exports[`DrawingResponse DrawableMain snapshot renders disabled 1`] = `
58
63
  </div>
59
64
  <div>
60
65
  <WithStyles(DrawableImage)
61
- dimensions={Object {}}
66
+ dimensions={
67
+ Object {
68
+ "height": NaN,
69
+ "width": NaN,
70
+ }
71
+ }
62
72
  url="url"
63
73
  />
64
74
  <ForwardRef
@@ -1,5 +1,12 @@
1
1
  import { shallow } from 'enzyme';
2
2
  import React from 'react';
3
+
4
+ global.MutationObserver = class {
5
+ constructor(callback) {}
6
+ disconnect() {}
7
+ observe(element, initObject) {}
8
+ };
9
+
3
10
  import { Container } from '../container';
4
11
 
5
12
  beforeEach(() => {
@@ -507,7 +507,8 @@ describe('DrawingResponse', () => {
507
507
  startx: 200,
508
508
  starty: 200,
509
509
  x: 300,
510
- y: 300
510
+ y: 300,
511
+ scale: 1
511
512
  };
512
513
  wrapper = mkWrapper('DrawableText', props, 'div');
513
514
  });
@@ -29,7 +29,8 @@ export class Container extends Component {
29
29
  session: PropTypes.object.isRequired,
30
30
  onSessionChange: PropTypes.func.isRequired,
31
31
  imageDimensions: PropTypes.object.isRequired,
32
- imageUrl: PropTypes.string.isRequired
32
+ imageUrl: PropTypes.string.isRequired,
33
+ backgroundImageEnabled: PropTypes.bool.isRequired
33
34
  };
34
35
 
35
36
  constructor(props) {
@@ -37,6 +38,7 @@ export class Container extends Component {
37
38
  const TextEntry = new DrawableText();
38
39
 
39
40
  this.state = {
41
+ scale: 1,
40
42
  drawableDimensions: {
41
43
  height: 0,
42
44
  width: 0
@@ -80,12 +82,42 @@ export class Container extends Component {
80
82
 
81
83
  componentDidMount() {
82
84
  this.setDimensions();
85
+
86
+ this.observer = new MutationObserver((mutations) => {
87
+ mutations.forEach(() => {
88
+ const target = document.getElementById('question-container')?.style?.cssText
89
+ const zoom = target?.substring(
90
+ target.indexOf('--pie-zoom') + 11,
91
+ target.lastIndexOf('%')
92
+ );
93
+ const zoomParsed = zoom?.replace(/\s/g, '');
94
+
95
+ if (zoomParsed) {
96
+ const newScale = parseFloat(zoomParsed) / 100;
97
+ if (newScale !== this.state.scale) {
98
+ this.setState({
99
+ scale: parseFloat(zoomParsed) / 100,
100
+ })
101
+ }
102
+ } else if (!zoomParsed && this.state.scale !== 1) {
103
+ this.setState({
104
+ scale: 1,
105
+ });
106
+ }
107
+ });
108
+ });
109
+
110
+ const target = document.getElementById('question-container');
111
+ if (target) {
112
+ this.observer.observe(target, { attributes : true, attributeFilter : ['style'] })
113
+ }
83
114
  }
84
115
 
85
116
  componentWillUnmount() {
86
117
  const { TextEntry } = this.state;
87
118
 
88
119
  TextEntry.removeEventListeners();
120
+ this.observer?.disconnect();
89
121
  }
90
122
 
91
123
  handleMakeToolActive(tool) {
@@ -131,7 +163,8 @@ export class Container extends Component {
131
163
  imageUrl,
132
164
  imageDimensions,
133
165
  onSessionChange,
134
- session
166
+ session,
167
+ backgroundImageEnabled
135
168
  } = this.props;
136
169
  const {
137
170
  drawableDimensions,
@@ -145,6 +178,8 @@ export class Container extends Component {
145
178
  TextEntry
146
179
  } = this.state;
147
180
 
181
+ const heightToUse = drawableDimensions * this.state.scale;
182
+
148
183
  return (
149
184
  <div className={classes.base}>
150
185
  <DrawablePalette
@@ -185,8 +220,10 @@ export class Container extends Component {
185
220
  this.drawable = drawable;
186
221
  }}
187
222
  className={classes.drawableHeight}
223
+ style={{ height: heightToUse, maxHeight: heightToUse }}
188
224
  >
189
225
  <DrawableMain
226
+ scale={this.state.scale}
190
227
  session={session}
191
228
  disabled={disabled}
192
229
  onSessionChange={onSessionChange}
@@ -198,6 +235,7 @@ export class Container extends Component {
198
235
  imageDimensions={imageDimensions}
199
236
  toolActive={toolActive}
200
237
  TextEntry={TextEntry}
238
+ backgroundImageEnabled={backgroundImageEnabled}
201
239
  />
202
240
  </div>
203
241
  </div>
@@ -5,11 +5,12 @@ import { withStyles } from '@material-ui/core/styles';
5
5
  const DrawableImage = ({ classes, url, dimensions: { height, width } }) => (
6
6
  <div className={classes.imageContainer}>
7
7
  <img
8
+ alt="drawing-response-image"
8
9
  className={classes.image}
9
10
  src={url}
10
11
  style={{
11
12
  height,
12
- maxWidth: width,
13
+ maxWidth: 598,
13
14
  maxHeight: 350,
14
15
  width,
15
16
  }}
@@ -90,13 +90,13 @@ export class DrawableMain extends React.Component {
90
90
 
91
91
  handleMouseDown = e => {
92
92
  const { newDrawable, textIsSelected } = this.state;
93
- const { toolActive, fillColor, outlineColor } = this.props;
93
+ const { toolActive, fillColor, outlineColor, scale } = this.props;
94
94
 
95
95
  if (newDrawable.length === 0 && !textIsSelected) {
96
96
  const { x, y } = e.target.getStage().getPointerPosition();
97
97
  const newDrawable = factory(toolActive.type, {
98
- startx: x,
99
- starty: y,
98
+ startx: x / scale,
99
+ starty: y / scale,
100
100
  fillColor,
101
101
  outlineColor,
102
102
  createdAt: new Date()
@@ -110,12 +110,13 @@ export class DrawableMain extends React.Component {
110
110
 
111
111
  handleMouseUp = e => {
112
112
  const { newDrawable, drawables } = this.state;
113
+ const { scale } = this.props;
113
114
 
114
115
  if (newDrawable.length === 1) {
115
116
  const { x, y } = e.target.getStage().getPointerPosition();
116
117
  const drawableToAdd = newDrawable[0];
117
118
 
118
- drawableToAdd.registerMovement(x, y);
119
+ drawableToAdd.registerMovement(x / scale, y / scale);
119
120
  drawables.push(drawableToAdd);
120
121
 
121
122
  this.setState(
@@ -130,12 +131,13 @@ export class DrawableMain extends React.Component {
130
131
 
131
132
  handleMouseMove = e => {
132
133
  const { newDrawable } = this.state;
134
+ const { scale } = this.props;
133
135
 
134
136
  if (newDrawable.length === 1) {
135
137
  const { x, y } = e.target.getStage().getPointerPosition();
136
138
  const updatedNewDrawable = newDrawable[0];
137
139
 
138
- updatedNewDrawable.registerMovement(x, y);
140
+ updatedNewDrawable.registerMovement(x / scale, y / scale);
139
141
 
140
142
  this.setState({
141
143
  newDrawable: [updatedNewDrawable]
@@ -185,7 +187,9 @@ export class DrawableMain extends React.Component {
185
187
  paintColor,
186
188
  outlineColor,
187
189
  TextEntry,
188
- toolActive: { type }
190
+ backgroundImageEnabled = true,
191
+ toolActive: { type },
192
+ scale
189
193
  } = this.props;
190
194
  const { isOver, newDrawable } = this.state;
191
195
 
@@ -205,7 +209,8 @@ export class DrawableMain extends React.Component {
205
209
  handleSessionChange: this.handleSessionChange,
206
210
  stage: this.stage,
207
211
  onMouseOverElement: this.onMouseOverElement,
208
- onMouseOutElement: this.onMouseOutElement
212
+ onMouseOutElement: this.onMouseOutElement,
213
+ scale
209
214
  };
210
215
 
211
216
  let listeners = {};
@@ -221,6 +226,9 @@ export class DrawableMain extends React.Component {
221
226
  }
222
227
  }
223
228
 
229
+ const imageHeight = imageDimensions.height * scale;
230
+ const imageWidth = imageDimensions.width * scale;
231
+
224
232
  return (
225
233
  <div>
226
234
  <div className={classes.undoControls}>
@@ -228,13 +236,17 @@ export class DrawableMain extends React.Component {
228
236
  <Button disabled={disabled} onClick={this.handleClearAll} label="Clear all" />
229
237
  </div>
230
238
  <div className={classes.base}>
231
- {imageUrl && (
232
- <ImageBackground dimensions={imageDimensions} url={imageUrl} />
239
+ {backgroundImageEnabled && imageUrl && (
240
+ <ImageBackground
241
+ dimensions={{height: imageHeight, width: imageWidth}}
242
+ url={imageUrl}/>
233
243
  )}
234
244
 
235
245
  {TextEntry.renderTextareas()}
236
246
 
237
247
  <Stage
248
+ scaleX={scale}
249
+ scaleY={scale}
238
250
  ref={ref => {
239
251
  this.stage = ref;
240
252
  }}
@@ -297,7 +309,9 @@ DrawableMain.propTypes = {
297
309
  imageUrl: PropTypes.string.isRequired,
298
310
  TextEntry: PropTypes.object.isRequired,
299
311
  toolActive: PropTypes.object.isRequired,
300
- session: PropTypes.object.isRequired
312
+ session: PropTypes.object.isRequired,
313
+ backgroundImageEnabled: PropTypes.bool.isRequired,
314
+ scale: PropTypes.number.isRequired
301
315
  };
302
316
 
303
317
  export default withStyles(styles)(DrawableMain);
@@ -193,7 +193,7 @@ export default class TextDrawable {
193
193
  handleTransform = (e, textNode) => {
194
194
  this[textNode].setAttrs({
195
195
  width: this[textNode].width() * this[textNode].scaleX(),
196
- scaleX: 1
196
+ scaleX: this.props.scale,
197
197
  });
198
198
  };
199
199
 
@@ -27,7 +27,8 @@ class DrawingResponseComponent extends React.Component {
27
27
  imageUrl,
28
28
  prompt,
29
29
  mode,
30
- teacherInstructions
30
+ teacherInstructions,
31
+ backgroundImageEnabled = true
31
32
  },
32
33
  session,
33
34
  onSessionChange,
@@ -64,6 +65,7 @@ class DrawingResponseComponent extends React.Component {
64
65
  isEvaluateMode={isEvaluateMode}
65
66
  imageDimensions={imageDimensions}
66
67
  imageUrl={imageUrl}
68
+ backgroundImageEnabled={backgroundImageEnabled}
67
69
  disabled={disabled}
68
70
  />
69
71
  </div>