@pie-element/drawing-response 10.3.4-next.3 → 11.0.0-beta.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 (85) hide show
  1. package/CHANGELOG.md +0 -11
  2. package/configure/CHANGELOG.md +0 -11
  3. package/configure/lib/button.js +23 -47
  4. package/configure/lib/button.js.map +1 -1
  5. package/configure/lib/defaults.js +2 -3
  6. package/configure/lib/defaults.js.map +1 -1
  7. package/configure/lib/image-container.js +238 -327
  8. package/configure/lib/image-container.js.map +1 -1
  9. package/configure/lib/index.js +115 -182
  10. package/configure/lib/index.js.map +1 -1
  11. package/configure/lib/root.js +195 -261
  12. package/configure/lib/root.js.map +1 -1
  13. package/configure/package.json +9 -7
  14. package/configure/src/__tests__/image-container.test.jsx +101 -37
  15. package/configure/src/__tests__/index.test.js +27 -5
  16. package/configure/src/__tests__/root.test.jsx +37 -21
  17. package/configure/src/button.jsx +14 -24
  18. package/configure/src/image-container.jsx +73 -77
  19. package/configure/src/index.js +12 -2
  20. package/configure/src/root.jsx +25 -26
  21. package/controller/lib/defaults.js +2 -3
  22. package/controller/lib/defaults.js.map +1 -1
  23. package/controller/lib/index.js +39 -65
  24. package/controller/lib/index.js.map +1 -1
  25. package/controller/package.json +1 -1
  26. package/lib/drawing-response/button.js +35 -60
  27. package/lib/drawing-response/button.js.map +1 -1
  28. package/lib/drawing-response/constants.js +2 -3
  29. package/lib/drawing-response/constants.js.map +1 -1
  30. package/lib/drawing-response/container.js +270 -351
  31. package/lib/drawing-response/container.js.map +1 -1
  32. package/lib/drawing-response/drawable-circle.js +65 -104
  33. package/lib/drawing-response/drawable-circle.js.map +1 -1
  34. package/lib/drawing-response/drawable-eraser.js +50 -86
  35. package/lib/drawing-response/drawable-eraser.js.map +1 -1
  36. package/lib/drawing-response/drawable-free-path.js +56 -97
  37. package/lib/drawing-response/drawable-free-path.js.map +1 -1
  38. package/lib/drawing-response/drawable-helper.js +16 -28
  39. package/lib/drawing-response/drawable-helper.js.map +1 -1
  40. package/lib/drawing-response/drawable-image.js +30 -49
  41. package/lib/drawing-response/drawable-image.js.map +1 -1
  42. package/lib/drawing-response/drawable-line.js +60 -99
  43. package/lib/drawing-response/drawable-line.js.map +1 -1
  44. package/lib/drawing-response/drawable-main.js +273 -345
  45. package/lib/drawing-response/drawable-main.js.map +1 -1
  46. package/lib/drawing-response/drawable-palette.js +123 -166
  47. package/lib/drawing-response/drawable-palette.js.map +1 -1
  48. package/lib/drawing-response/drawable-rectangle.js +65 -104
  49. package/lib/drawing-response/drawable-rectangle.js.map +1 -1
  50. package/lib/drawing-response/drawable-text.js +201 -313
  51. package/lib/drawing-response/drawable-text.js.map +1 -1
  52. package/lib/drawing-response/drawable-transformer.js +36 -79
  53. package/lib/drawing-response/drawable-transformer.js.map +1 -1
  54. package/lib/drawing-response/factory.js +6 -19
  55. package/lib/drawing-response/factory.js.map +1 -1
  56. package/lib/drawing-response/icon.js +8 -24
  57. package/lib/drawing-response/icon.js.map +1 -1
  58. package/lib/drawing-response/index.js +74 -116
  59. package/lib/drawing-response/index.js.map +1 -1
  60. package/lib/index.js +51 -102
  61. package/lib/index.js.map +1 -1
  62. package/package.json +13 -12
  63. package/src/__tests__/drawing-index-test.jsx +90 -27
  64. package/src/drawing-response/__tests__/container.test.jsx +56 -36
  65. package/src/drawing-response/__tests__/drawing-main.test.jsx +158 -139
  66. package/src/drawing-response/button.jsx +23 -34
  67. package/src/drawing-response/container.jsx +39 -40
  68. package/src/drawing-response/drawable-image.jsx +17 -20
  69. package/src/drawing-response/drawable-main.jsx +67 -60
  70. package/src/drawing-response/drawable-palette.jsx +48 -54
  71. package/src/drawing-response/drawable-text.jsx +26 -38
  72. package/src/drawing-response/index.jsx +21 -20
  73. package/src/index.js +17 -2
  74. package/configure/src/__tests__/__snapshots__/image-container.test.jsx.snap +0 -45
  75. package/configure/src/__tests__/__snapshots__/root.test.jsx.snap +0 -185
  76. package/esm/configure.js +0 -16151
  77. package/esm/configure.js.map +0 -1
  78. package/esm/controller.js +0 -814
  79. package/esm/controller.js.map +0 -1
  80. package/esm/element.js +0 -54130
  81. package/esm/element.js.map +0 -1
  82. package/esm/package.json +0 -3
  83. package/src/__tests__/__snapshots__/drawing-index-test.jsx.snap +0 -23
  84. package/src/drawing-response/__tests__/__snapshots__/container.test.jsx.snap +0 -396
  85. package/src/drawing-response/__tests__/__snapshots__/drawing-main.test.jsx.snap +0 -247
@@ -1,6 +1,6 @@
1
1
  import React, { Component } from 'react';
2
2
  import PropTypes from 'prop-types';
3
- import { withStyles } from '@material-ui/core/styles';
3
+ import { styled } from '@mui/material/styles';
4
4
 
5
5
  import Button from './button';
6
6
 
@@ -9,6 +9,61 @@ const isImage = (file) => {
9
9
  return file.type.match(imageType);
10
10
  };
11
11
 
12
+ const BaseContainer = styled('div')(({ theme }) => ({
13
+ marginTop: theme.spacing(1),
14
+ }));
15
+
16
+ const Box = styled('div')(({ active }) => ({
17
+ border: active ? '1px solid #0032C2' : '1px solid #E0E1E6',
18
+ borderRadius: '5px',
19
+ }));
20
+
21
+ const CenteredDiv = styled('div')({
22
+ alignItems: 'center',
23
+ display: 'flex',
24
+ flexDirection: 'column',
25
+ justifyContent: 'center',
26
+ });
27
+
28
+ const DrawableHeight = styled('div')({
29
+ minHeight: 350,
30
+ });
31
+
32
+ const Image = styled('img')({
33
+ alignItems: 'center',
34
+ display: 'flex',
35
+ justifyContent: 'center',
36
+ });
37
+
38
+ const StyledImageContainer = styled('div')({
39
+ position: 'relative',
40
+ width: 'fit-content',
41
+ });
42
+
43
+ const ResizeHandle = styled('div')({
44
+ borderBottom: '1px solid #727272',
45
+ borderRight: '1px solid #727272',
46
+ bottom: '-10px',
47
+ cursor: 'se-resize',
48
+ height: '10px',
49
+ position: 'absolute',
50
+ right: '-10px',
51
+ width: '10px',
52
+ });
53
+
54
+ const HiddenInput = styled('input')({
55
+ display: 'none',
56
+ });
57
+
58
+ const Toolbar = styled('div')({
59
+ backgroundColor: '#ECEDF1',
60
+ borderBottom: '1px solid #E0E1E6',
61
+ borderTopLeftRadius: '5px',
62
+ borderTopRightRadius: '5px',
63
+ display: 'flex',
64
+ padding: '12px 8px',
65
+ });
66
+
12
67
  export class ImageContainer extends Component {
13
68
 
14
69
  static propTypes = {
@@ -176,14 +231,11 @@ export class ImageContainer extends Component {
176
231
  };
177
232
 
178
233
  renderUploadControl(label) {
179
- const { classes } = this.props;
180
-
181
234
  return (
182
235
  <div>
183
236
  <Button label={label} onClick={this.handleInputClick} />
184
- <input
237
+ <HiddenInput
185
238
  accept="image/*"
186
- className={classes.input}
187
239
  onChange={this.handleUploadImage}
188
240
  ref={(ref) => {
189
241
  this.input = ref;
@@ -195,13 +247,13 @@ export class ImageContainer extends Component {
195
247
  }
196
248
 
197
249
  render() {
198
- const { classes, imageUrl, imageDimensions } = this.props;
250
+ const { imageUrl, imageDimensions } = this.props;
199
251
  const { dropzoneActive, dragEnabled, maxImageHeight, maxImageWidth } = this.state;
200
252
 
201
253
  return (
202
- <div className={classes.base}>
203
- <div
204
- className={`${classes.box} ${dropzoneActive ? classes.boxActive : ''}`}
254
+ <BaseContainer>
255
+ <Box
256
+ active={dropzoneActive}
205
257
  {...(dragEnabled
206
258
  ? {
207
259
  onDragExit: this.handleOnDragExit,
@@ -211,18 +263,16 @@ export class ImageContainer extends Component {
211
263
  }
212
264
  : {})}
213
265
  >
214
- <div className={classes.toolbar}>{this.renderUploadControl(imageUrl ? 'Replace Image' : 'Upload Image')}</div>
266
+ <Toolbar>{this.renderUploadControl(imageUrl ? 'Replace Image' : 'Upload Image')}</Toolbar>
215
267
 
216
- <div
268
+ <DrawableHeight
217
269
  ref={(ref) => {
218
270
  this.imageSection = ref;
219
271
  }}
220
- className={classes.drawableHeight}
221
272
  >
222
273
  {imageUrl ? (
223
- <div className={classes.imageContainer}>
224
- <img
225
- className={classes.image}
274
+ <StyledImageContainer>
275
+ <Image
226
276
  height="auto"
227
277
  onLoad={this.handleOnImageLoad}
228
278
  ref={(ref) => {
@@ -236,85 +286,31 @@ export class ImageContainer extends Component {
236
286
  }}
237
287
  alt=""
238
288
  />
239
- <div
289
+ <ResizeHandle
240
290
  ref={(ref) => {
241
291
  this.resize = ref;
242
292
  }}
243
- className={classes.resize}
244
293
  />
245
- </div>
294
+ </StyledImageContainer>
246
295
  ) : (
247
- <div className={`${classes.drawableHeight} ${classes.centered}`}>
296
+ <DrawableHeight as={CenteredDiv}>
248
297
  <label>Drag and drop or upload image from computer</label>
249
298
  <br />
250
299
  {this.renderUploadControl('Upload Image')}
251
- </div>
300
+ </DrawableHeight>
252
301
  )}
253
- </div>
254
- </div>
255
- </div>
302
+ </DrawableHeight>
303
+ </Box>
304
+ </BaseContainer>
256
305
  );
257
306
  }
258
307
  }
259
308
 
260
- const styles = (theme) => ({
261
- base: {
262
- marginTop: theme.spacing.unit,
263
- },
264
- box: {
265
- border: '1px solid #E0E1E6',
266
- borderRadius: '5px',
267
- },
268
- boxActive: {
269
- border: '1px solid #0032C2',
270
- },
271
- centered: {
272
- alignItems: 'center',
273
- display: 'flex',
274
- flexDirection: 'column',
275
- justifyContent: 'center',
276
- },
277
- drawableHeight: {
278
- minHeight: 350,
279
- },
280
- image: {
281
- alignItems: 'center',
282
- display: 'flex',
283
- justifyContent: 'center',
284
- },
285
- imageContainer: {
286
- position: 'relative',
287
- width: 'fit-content',
288
- },
289
- resize: {
290
- borderBottom: '1px solid #727272',
291
- borderRight: '1px solid #727272',
292
- bottom: '-10px',
293
- cursor: 'se-resize',
294
- height: '10px',
295
- position: 'absolute',
296
- right: '-10px',
297
- width: '10px',
298
- },
299
- input: {
300
- display: 'none',
301
- },
302
- toolbar: {
303
- backgroundColor: '#ECEDF1',
304
- borderBottom: '1px solid #E0E1E6',
305
- borderTopLeftRadius: '5px',
306
- borderTopRightRadius: '5px',
307
- display: 'flex',
308
- padding: '12px 8px',
309
- },
310
- });
311
-
312
309
  ImageContainer.propTypes = {
313
- classes: PropTypes.object.isRequired,
314
310
  imageUrl: PropTypes.string.isRequired,
315
311
  onImageUpload: PropTypes.func.isRequired,
316
312
  onUpdateImageDimension: PropTypes.func.isRequired,
317
313
  insertImage: PropTypes.func,
318
314
  };
319
315
 
320
- export default withStyles(styles)(ImageContainer);
316
+ export default ImageContainer;
@@ -7,7 +7,7 @@ import {
7
7
  } from '@pie-framework/pie-configure-events';
8
8
 
9
9
  import React from 'react';
10
- import ReactDOM from 'react-dom';
10
+ import { createRoot } from 'react-dom/client';
11
11
  import debug from 'debug';
12
12
 
13
13
  import Root from './root';
@@ -33,6 +33,7 @@ export default class DrawableResponseConfigure extends HTMLElement {
33
33
 
34
34
  constructor() {
35
35
  super();
36
+ this._root = null;
36
37
  this._configuration = sensibleDefaults.configuration;
37
38
 
38
39
  // if configuration.withRubric.forceEnabled is true, then we
@@ -152,6 +153,15 @@ export default class DrawableResponseConfigure extends HTMLElement {
152
153
  delete: this.onDeleteSound.bind(this),
153
154
  },
154
155
  });
155
- ReactDOM.render(element, this);
156
+ if (!this._root) {
157
+ this._root = createRoot(this);
158
+ }
159
+ this._root.render(element);
160
+ }
161
+
162
+ disconnectedCallback() {
163
+ if (this._root) {
164
+ this._root.unmount();
165
+ }
156
166
  }
157
167
  }
@@ -1,15 +1,28 @@
1
1
  import React from 'react';
2
2
  import { settings, layout, InputContainer } from '@pie-lib/config-ui';
3
3
  import PropTypes from 'prop-types';
4
- import EditableHtml from '@pie-lib/editable-html';
5
- import Typography from '@material-ui/core/Typography';
6
- import { withStyles } from '@material-ui/core/styles';
4
+ import EditableHtml from '@pie-lib/editable-html-tip-tap';
5
+ import Typography from '@mui/material/Typography';
6
+ import { styled } from '@mui/material/styles';
7
7
 
8
8
  import ImageContainer from './image-container';
9
9
  import cloneDeep from 'lodash/cloneDeep';
10
10
 
11
11
  const { Panel, toggle, dropdown } = settings;
12
12
 
13
+ const PromptHolder = styled(InputContainer)(({ theme }) => ({
14
+ paddingTop: theme.spacing(1),
15
+ marginTop: theme.spacing(2),
16
+ marginBottom: theme.spacing(1),
17
+ width: '100%',
18
+ }));
19
+
20
+ const ErrorText = styled('div')(({ theme }) => ({
21
+ fontSize: theme.typography.fontSize - 2,
22
+ color: theme.palette.error.main,
23
+ paddingTop: theme.spacing(1),
24
+ }));
25
+
13
26
  export class Root extends React.Component {
14
27
  onPromptChanged = (prompt) => {
15
28
  const { model, onModelChanged } = this.props;
@@ -37,7 +50,7 @@ export class Root extends React.Component {
37
50
  };
38
51
 
39
52
  render() {
40
- const { classes, configuration, imageSupport, model, onConfigurationChanged, onModelChanged, uploadSoundSupport } =
53
+ const { configuration, imageSupport, model, onConfigurationChanged, onModelChanged, uploadSoundSupport } =
41
54
  this.props;
42
55
  const {
43
56
  baseInputConfiguration = {},
@@ -109,7 +122,7 @@ export class Root extends React.Component {
109
122
  }
110
123
  >
111
124
  {teacherInstructionsEnabled && (
112
- <InputContainer label={teacherInstructions.label} className={classes.promptHolder}>
125
+ <PromptHolder label={teacherInstructions.label}>
113
126
  <EditableHtml
114
127
  markup={model.teacherInstructions || ''}
115
128
  onChange={this.onTeacherInstructionsChanged}
@@ -125,12 +138,12 @@ export class Root extends React.Component {
125
138
  languageCharactersProps={[{ language: 'spanish' }, { language: 'special' }]}
126
139
  mathMlOptions={mathMlOptions}
127
140
  />
128
- {teacherInstructionsError && <div className={classes.errorText}>{teacherInstructionsError}</div>}
129
- </InputContainer>
141
+ {teacherInstructionsError && <ErrorText>{teacherInstructionsError}</ErrorText>}
142
+ </PromptHolder>
130
143
  )}
131
144
 
132
145
  {promptEnabled && (
133
- <InputContainer label="Item Stem" className={classes.promptHolder}>
146
+ <PromptHolder label="Item Stem">
134
147
  <EditableHtml
135
148
  markup={model.prompt}
136
149
  onChange={this.onPromptChanged}
@@ -145,13 +158,13 @@ export class Root extends React.Component {
145
158
  languageCharactersProps={[{ language: 'spanish' }, { language: 'special' }]}
146
159
  mathMlOptions={mathMlOptions}
147
160
  />
148
- {promptError && <div className={classes.errorText}>{promptError}</div>}
149
- </InputContainer>
161
+ {promptError && <ErrorText>{promptError}</ErrorText>}
162
+ </PromptHolder>
150
163
  )}
151
164
 
152
165
  {backgroundImageEnabled && (
153
166
  <React.Fragment>
154
- <Typography variant="subheading">Define Background Image</Typography>
167
+ <Typography variant="h6">Define Background Image</Typography>
155
168
 
156
169
  <ImageContainer
157
170
  imageUrl={model.imageUrl}
@@ -167,21 +180,7 @@ export class Root extends React.Component {
167
180
  }
168
181
  }
169
182
 
170
- const styles = (theme) => ({
171
- promptHolder: {
172
- paddingTop: theme.spacing.unit * 2,
173
- marginBottom: theme.spacing.unit * 2,
174
- width: '100%',
175
- },
176
- errorText: {
177
- fontSize: theme.typography.fontSize - 2,
178
- color: theme.palette.error.main,
179
- paddingTop: theme.spacing.unit,
180
- },
181
- });
182
-
183
183
  Root.propTypes = {
184
- classes: PropTypes.object.isRequired,
185
184
  configuration: PropTypes.object,
186
185
  model: PropTypes.object.isRequired,
187
186
  imageSupport: PropTypes.shape({
@@ -196,4 +195,4 @@ Root.propTypes = {
196
195
  onConfigurationChanged: PropTypes.func.isRequired,
197
196
  };
198
197
 
199
- export default withStyles(styles)(Root);
198
+ export default Root;
@@ -3,8 +3,8 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports["default"] = void 0;
7
- var _default = {
6
+ exports.default = void 0;
7
+ var _default = exports.default = {
8
8
  backgroundImageEnabled: true,
9
9
  imageDimensions: {
10
10
  height: 0,
@@ -19,5 +19,4 @@ var _default = {
19
19
  teacherInstructionsEnabled: true,
20
20
  toolbarEditorPosition: 'bottom'
21
21
  };
22
- exports["default"] = _default;
23
22
  //# sourceMappingURL=defaults.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/defaults.js"],"names":["backgroundImageEnabled","imageDimensions","height","width","imageUrl","prompt","promptEnabled","spellCheckEnabled","studentInstructionsEnabled","teacherInstructions","teacherInstructionsEnabled","toolbarEditorPosition"],"mappings":";;;;;;eAAe;AACbA,EAAAA,sBAAsB,EAAE,IADX;AAEbC,EAAAA,eAAe,EAAE;AAAEC,IAAAA,MAAM,EAAE,CAAV;AAAaC,IAAAA,KAAK,EAAE;AAApB,GAFJ;AAGbC,EAAAA,QAAQ,EAAE,EAHG;AAIbC,EAAAA,MAAM,EAAE,EAJK;AAKbC,EAAAA,aAAa,EAAE,IALF;AAMbC,EAAAA,iBAAiB,EAAE,IANN;AAObC,EAAAA,0BAA0B,EAAE,IAPf;AAQbC,EAAAA,mBAAmB,EAAE,EARR;AASbC,EAAAA,0BAA0B,EAAE,IATf;AAUbC,EAAAA,qBAAqB,EAAE;AAVV,C","sourcesContent":["export default {\n backgroundImageEnabled: true,\n imageDimensions: { height: 0, width: 0 },\n imageUrl: '',\n prompt: '',\n promptEnabled: true,\n spellCheckEnabled: true,\n studentInstructionsEnabled: true,\n teacherInstructions: '',\n teacherInstructionsEnabled: true,\n toolbarEditorPosition: 'bottom',\n};\n"],"file":"defaults.js"}
1
+ {"version":3,"file":"defaults.js","names":["backgroundImageEnabled","imageDimensions","height","width","imageUrl","prompt","promptEnabled","spellCheckEnabled","studentInstructionsEnabled","teacherInstructions","teacherInstructionsEnabled","toolbarEditorPosition"],"sources":["../src/defaults.js"],"sourcesContent":["export default {\n backgroundImageEnabled: true,\n imageDimensions: { height: 0, width: 0 },\n imageUrl: '',\n prompt: '',\n promptEnabled: true,\n spellCheckEnabled: true,\n studentInstructionsEnabled: true,\n teacherInstructions: '',\n teacherInstructionsEnabled: true,\n toolbarEditorPosition: 'bottom',\n};\n"],"mappings":";;;;;;iCAAe;EACbA,sBAAsB,EAAE,IAAI;EAC5BC,eAAe,EAAE;IAAEC,MAAM,EAAE,CAAC;IAAEC,KAAK,EAAE;EAAE,CAAC;EACxCC,QAAQ,EAAE,EAAE;EACZC,MAAM,EAAE,EAAE;EACVC,aAAa,EAAE,IAAI;EACnBC,iBAAiB,EAAE,IAAI;EACvBC,0BAA0B,EAAE,IAAI;EAChCC,mBAAmB,EAAE,EAAE;EACvBC,0BAA0B,EAAE,IAAI;EAChCC,qBAAqB,EAAE;AACzB,CAAC","ignoreList":[]}
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
@@ -10,69 +9,54 @@ exports.model = model;
10
9
  exports.normalize = void 0;
11
10
  exports.outcome = outcome;
12
11
  exports.validate = void 0;
13
-
14
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
-
16
12
  var _debug = _interopRequireDefault(require("debug"));
17
-
18
13
  var _defaults = _interopRequireDefault(require("./defaults"));
19
-
20
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
21
-
22
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
23
-
24
- var log = (0, _debug["default"])('pie-elements:drawing-response:controller');
25
-
26
- var normalize = function normalize(question) {
27
- return _objectSpread(_objectSpread({}, _defaults["default"]), question);
28
- };
29
-
14
+ const log = (0, _debug.default)('pie-elements:drawing-response:controller');
15
+ const normalize = question => ({
16
+ ..._defaults.default,
17
+ ...question
18
+ });
30
19
  exports.normalize = normalize;
31
-
32
20
  function model(question, session, env) {
33
- var normalizedQuestion = normalize(question);
34
- var extraCSSRules = normalizedQuestion.extraCSSRules,
35
- imageUrl = normalizedQuestion.imageUrl,
36
- imageDimensions = normalizedQuestion.imageDimensions,
37
- prompt = normalizedQuestion.prompt,
38
- promptEnabled = normalizedQuestion.promptEnabled,
39
- backgroundImageEnabled = normalizedQuestion.backgroundImageEnabled,
40
- language = normalizedQuestion.language;
41
- return new Promise(function (resolve) {
42
- var out = {
21
+ const normalizedQuestion = normalize(question);
22
+ const {
23
+ extraCSSRules,
24
+ imageUrl,
25
+ imageDimensions,
26
+ prompt,
27
+ promptEnabled,
28
+ backgroundImageEnabled,
29
+ language
30
+ } = normalizedQuestion;
31
+ return new Promise(resolve => {
32
+ const out = {
43
33
  disabled: env.mode !== 'gather',
44
34
  mode: env.mode,
45
- imageDimensions: imageDimensions,
46
- imageUrl: imageUrl,
35
+ imageDimensions,
36
+ imageUrl,
47
37
  prompt: promptEnabled ? prompt : null,
48
- backgroundImageEnabled: backgroundImageEnabled,
49
- language: language,
50
- extraCSSRules: extraCSSRules
38
+ backgroundImageEnabled,
39
+ language,
40
+ extraCSSRules
51
41
  };
52
-
53
42
  if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {
54
43
  out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled ? normalizedQuestion.teacherInstructions : null;
55
44
  } else {
56
45
  out.teacherInstructions = null;
57
46
  }
58
-
59
47
  resolve(out);
60
48
  });
61
49
  }
62
-
63
- var createDefaultModel = function createDefaultModel() {
64
- var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
65
- return new Promise(function (resolve) {
66
- resolve(_objectSpread(_objectSpread({}, _defaults["default"]), model));
50
+ const createDefaultModel = (model = {}) => new Promise(resolve => {
51
+ resolve({
52
+ ..._defaults.default,
53
+ ...model
67
54
  });
68
- };
69
-
55
+ });
70
56
  exports.createDefaultModel = createDefaultModel;
71
-
72
- function
73
- /*config, session*/
74
- outcome() {
75
- return new Promise(function (resolve) {
57
+ function outcome(/*config, session*/
58
+ ) {
59
+ return new Promise(resolve => {
76
60
  log('outcome...');
77
61
  resolve({
78
62
  score: 0,
@@ -80,31 +64,21 @@ outcome() {
80
64
  note: 'Requires manual scoring'
81
65
  });
82
66
  });
83
- } // remove all html tags
84
-
85
-
86
- var getInnerText = function getInnerText(html) {
87
- return (html || '').replaceAll(/<[^>]*>/g, '');
88
- }; // remove all html tags except img, iframe and source tag for audio
89
-
90
-
91
- var getContent = function getContent(html) {
92
- return (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
93
- };
67
+ }
94
68
 
95
- var validate = function validate() {
96
- var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
97
- var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
98
- var errors = {};
99
- ['teacherInstructions', 'prompt'].forEach(function (field) {
100
- var _config$field;
69
+ // remove all html tags
70
+ const getInnerText = html => (html || '').replaceAll(/<[^>]*>/g, '');
101
71
 
102
- if ((_config$field = config[field]) !== null && _config$field !== void 0 && _config$field.required && !getContent(model[field])) {
72
+ // remove all html tags except img, iframe and source tag for audio
73
+ const getContent = html => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
74
+ const validate = (model = {}, config = {}) => {
75
+ const errors = {};
76
+ ['teacherInstructions', 'prompt'].forEach(field => {
77
+ if (config[field]?.required && !getContent(model[field])) {
103
78
  errors[field] = 'This field is required.';
104
79
  }
105
80
  });
106
81
  return errors;
107
82
  };
108
-
109
83
  exports.validate = validate;
110
84
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.js"],"names":["log","normalize","question","defaults","model","session","env","normalizedQuestion","extraCSSRules","imageUrl","imageDimensions","prompt","promptEnabled","backgroundImageEnabled","language","Promise","resolve","out","disabled","mode","role","teacherInstructions","teacherInstructionsEnabled","createDefaultModel","outcome","score","completed","note","getInnerText","html","replaceAll","getContent","replace","validate","config","errors","forEach","field","required"],"mappings":"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","sourcesContent":["import debug from 'debug';\nimport defaults from './defaults';\n\nconst log = debug('pie-elements:drawing-response:controller');\n\nexport const normalize = (question) => ({ ...defaults, ...question });\n\nexport function model(question, session, env) {\n const normalizedQuestion = normalize(question);\n const { extraCSSRules, imageUrl, imageDimensions, prompt, promptEnabled, backgroundImageEnabled, language } = normalizedQuestion;\n\n return new Promise((resolve) => {\n const out = {\n disabled: env.mode !== 'gather',\n mode: env.mode,\n imageDimensions,\n imageUrl,\n prompt: promptEnabled ? prompt : null,\n backgroundImageEnabled,\n language,\n extraCSSRules,\n };\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n out.teacherInstructions = null;\n }\n\n resolve(out);\n });\n}\n\nexport const createDefaultModel = (model = {}) =>\n new Promise((resolve) => {\n resolve({\n ...defaults,\n ...model,\n });\n });\n\nexport function outcome(/*config, session*/) {\n return new Promise((resolve) => {\n log('outcome...');\n resolve({\n score: 0,\n completed: 'n/a',\n note: 'Requires manual scoring',\n });\n });\n}\n\n// remove all html tags\nconst getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');\n\n// remove all html tags except img, iframe and source tag for audio\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const errors = {};\n\n ['teacherInstructions', 'prompt'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n return errors;\n};\n"],"file":"index.js"}
1
+ {"version":3,"file":"index.js","names":["_debug","_interopRequireDefault","require","_defaults","log","debug","normalize","question","defaults","exports","model","session","env","normalizedQuestion","extraCSSRules","imageUrl","imageDimensions","prompt","promptEnabled","backgroundImageEnabled","language","Promise","resolve","out","disabled","mode","role","teacherInstructions","teacherInstructionsEnabled","createDefaultModel","outcome","score","completed","note","getInnerText","html","replaceAll","getContent","replace","validate","config","errors","forEach","field","required"],"sources":["../src/index.js"],"sourcesContent":["import debug from 'debug';\nimport defaults from './defaults';\n\nconst log = debug('pie-elements:drawing-response:controller');\n\nexport const normalize = (question) => ({ ...defaults, ...question });\n\nexport function model(question, session, env) {\n const normalizedQuestion = normalize(question);\n const { extraCSSRules, imageUrl, imageDimensions, prompt, promptEnabled, backgroundImageEnabled, language } = normalizedQuestion;\n\n return new Promise((resolve) => {\n const out = {\n disabled: env.mode !== 'gather',\n mode: env.mode,\n imageDimensions,\n imageUrl,\n prompt: promptEnabled ? prompt : null,\n backgroundImageEnabled,\n language,\n extraCSSRules,\n };\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n out.teacherInstructions = null;\n }\n\n resolve(out);\n });\n}\n\nexport const createDefaultModel = (model = {}) =>\n new Promise((resolve) => {\n resolve({\n ...defaults,\n ...model,\n });\n });\n\nexport function outcome(/*config, session*/) {\n return new Promise((resolve) => {\n log('outcome...');\n resolve({\n score: 0,\n completed: 'n/a',\n note: 'Requires manual scoring',\n });\n });\n}\n\n// remove all html tags\nconst getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');\n\n// remove all html tags except img, iframe and source tag for audio\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const errors = {};\n\n ['teacherInstructions', 'prompt'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n return errors;\n};\n"],"mappings":";;;;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,SAAA,GAAAF,sBAAA,CAAAC,OAAA;AAEA,MAAME,GAAG,GAAG,IAAAC,cAAK,EAAC,0CAA0C,CAAC;AAEtD,MAAMC,SAAS,GAAIC,QAAQ,KAAM;EAAE,GAAGC,iBAAQ;EAAE,GAAGD;AAAS,CAAC,CAAC;AAACE,OAAA,CAAAH,SAAA,GAAAA,SAAA;AAE/D,SAASI,KAAKA,CAACH,QAAQ,EAAEI,OAAO,EAAEC,GAAG,EAAE;EAC5C,MAAMC,kBAAkB,GAAGP,SAAS,CAACC,QAAQ,CAAC;EAC9C,MAAM;IAAEO,aAAa;IAAEC,QAAQ;IAAEC,eAAe;IAAEC,MAAM;IAAEC,aAAa;IAAEC,sBAAsB;IAAEC;EAAS,CAAC,GAAGP,kBAAkB;EAEhI,OAAO,IAAIQ,OAAO,CAAEC,OAAO,IAAK;IAC9B,MAAMC,GAAG,GAAG;MACVC,QAAQ,EAAEZ,GAAG,CAACa,IAAI,KAAK,QAAQ;MAC/BA,IAAI,EAAEb,GAAG,CAACa,IAAI;MACdT,eAAe;MACfD,QAAQ;MACRE,MAAM,EAAEC,aAAa,GAAGD,MAAM,GAAG,IAAI;MACrCE,sBAAsB;MACtBC,QAAQ;MACRN;IACF,CAAC;IAED,IAAIF,GAAG,CAACc,IAAI,KAAK,YAAY,KAAKd,GAAG,CAACa,IAAI,KAAK,MAAM,IAAIb,GAAG,CAACa,IAAI,KAAK,UAAU,CAAC,EAAE;MACjFF,GAAG,CAACI,mBAAmB,GAAGd,kBAAkB,CAACe,0BAA0B,GACnEf,kBAAkB,CAACc,mBAAmB,GACtC,IAAI;IACV,CAAC,MAAM;MACLJ,GAAG,CAACI,mBAAmB,GAAG,IAAI;IAChC;IAEAL,OAAO,CAACC,GAAG,CAAC;EACd,CAAC,CAAC;AACJ;AAEO,MAAMM,kBAAkB,GAAGA,CAACnB,KAAK,GAAG,CAAC,CAAC,KAC3C,IAAIW,OAAO,CAAEC,OAAO,IAAK;EACvBA,OAAO,CAAC;IACN,GAAGd,iBAAQ;IACX,GAAGE;EACL,CAAC,CAAC;AACJ,CAAC,CAAC;AAACD,OAAA,CAAAoB,kBAAA,GAAAA,kBAAA;AAEE,SAASC,OAAOA,CAAC;AAAA,EAAqB;EAC3C,OAAO,IAAIT,OAAO,CAAEC,OAAO,IAAK;IAC9BlB,GAAG,CAAC,YAAY,CAAC;IACjBkB,OAAO,CAAC;MACNS,KAAK,EAAE,CAAC;MACRC,SAAS,EAAE,KAAK;MAChBC,IAAI,EAAE;IACR,CAAC,CAAC;EACJ,CAAC,CAAC;AACJ;;AAEA;AACA,MAAMC,YAAY,GAAIC,IAAI,IAAK,CAACA,IAAI,IAAI,EAAE,EAAEC,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC;;AAEtE;AACA,MAAMC,UAAU,GAAIF,IAAI,IAAK,CAACA,IAAI,IAAI,EAAE,EAAEG,OAAO,CAAC,oCAAoC,EAAE,EAAE,CAAC;AAEpF,MAAMC,QAAQ,GAAGA,CAAC7B,KAAK,GAAG,CAAC,CAAC,EAAE8B,MAAM,GAAG,CAAC,CAAC,KAAK;EACnD,MAAMC,MAAM,GAAG,CAAC,CAAC;EAEjB,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAACC,OAAO,CAAEC,KAAK,IAAK;IACnD,IAAIH,MAAM,CAACG,KAAK,CAAC,EAAEC,QAAQ,IAAI,CAACP,UAAU,CAAC3B,KAAK,CAACiC,KAAK,CAAC,CAAC,EAAE;MACxDF,MAAM,CAACE,KAAK,CAAC,GAAG,yBAAyB;IAC3C;EACF,CAAC,CAAC;EAEF,OAAOF,MAAM;AACf,CAAC;AAAChC,OAAA,CAAA8B,QAAA,GAAAA,QAAA","ignoreList":[]}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@pie-element/drawing-response-controller",
3
3
  "private": true,
4
- "version": "4.2.1",
4
+ "version": "5.0.0-beta.0",
5
5
  "description": "",
6
6
  "scripts": {
7
7
  "test": "echo \"Error: no test specified\" && exit 1"