@pie-element/drag-in-the-blank 3.9.0 → 3.9.1-beta.587

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.
@@ -43,13 +43,15 @@ var _markupUtils = require("./markupUtils");
43
43
 
44
44
  var _styles = require("@material-ui/core/styles");
45
45
 
46
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
46
+ var _configUi = require("@pie-lib/config-ui");
47
47
 
48
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
48
+ 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; }
49
+
50
+ 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; }
49
51
 
50
52
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
51
53
 
52
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
54
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
53
55
 
54
56
  window.renMath = _mathRendering.renderMath;
55
57
 
@@ -63,10 +65,15 @@ var styles = function styles(theme) {
63
65
  display: 'flex',
64
66
  flexWrap: 'wrap',
65
67
  justifyContent: 'space-evenly',
66
- padding: '20px 0 0 0',
68
+ margin: "".concat(theme.spacing.unit, "px 0"),
67
69
  '& > *': {
68
- marginBottom: '20px'
70
+ margin: theme.spacing.unit
69
71
  }
72
+ },
73
+ errorText: {
74
+ fontSize: theme.typography.fontSize - 2,
75
+ color: 'red',
76
+ paddingBottom: theme.spacing.unit * 2
70
77
  }
71
78
  };
72
79
  };
@@ -86,7 +93,16 @@ var Choices = /*#__PURE__*/function (_React$Component) {
86
93
  }
87
94
 
88
95
  _this = _super.call.apply(_super, [this].concat(args));
89
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "state", {});
96
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "editorInstance", null);
97
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "state", {
98
+ showWarning: false
99
+ });
100
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "rerenderMath", function () {
101
+ //eslint-disable-next-line
102
+ var domNode = _reactDom["default"].findDOMNode((0, _assertThisInitialized2["default"])(_this));
103
+
104
+ (0, _mathRendering.renderMath)(domNode);
105
+ });
90
106
  (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onChoiceChanged", function (prevValue, val, key) {
91
107
  var _this$props = _this.props,
92
108
  onChange = _this$props.onChange,
@@ -94,15 +110,32 @@ var Choices = /*#__PURE__*/function (_React$Component) {
94
110
  var choices = model.choices,
95
111
  correctResponse = model.correctResponse,
96
112
  alternateResponses = model.alternateResponses;
97
- var newChoices = choices ? choices.map(function (c) {
98
- if (c.id === key) {
99
- return _objectSpread(_objectSpread({}, c), {}, {
100
- value: val
113
+ var duplicatedValue = (choices || []).find(function (c) {
114
+ return c.value === val && c.id !== key;
115
+ }); // discard the new added choice or the changes if the choice would be a duplicate to one that already exists
116
+
117
+ if (duplicatedValue) {
118
+ if (prevValue === '') {
119
+ // remove the new added choice from choices
120
+ var _newChoices = (choices || []).filter(function (c) {
121
+ return c.id !== key;
101
122
  });
123
+
124
+ onChange(_newChoices);
102
125
  }
103
126
 
104
- return c;
105
- }) : [];
127
+ _this.setState({
128
+ showWarning: true
129
+ });
130
+
131
+ return;
132
+ }
133
+
134
+ var newChoices = (choices === null || choices === void 0 ? void 0 : choices.map(function (choice) {
135
+ return choice.id === key ? _objectSpread(_objectSpread({}, choice), {}, {
136
+ value: val
137
+ }) : choice;
138
+ })) || [];
106
139
 
107
140
  if ((0, _markupUtils.choiceIsEmpty)({
108
141
  value: val
@@ -164,12 +197,12 @@ var Choices = /*#__PURE__*/function (_React$Component) {
164
197
  }]));
165
198
  });
166
199
  });
167
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleChoiceRemove", function (id) {
200
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onChoiceRemove", function (id) {
168
201
  var _this$props3 = _this.props,
169
202
  onChange = _this$props3.onChange,
170
203
  choices = _this$props3.model.choices;
171
- var newChoices = choices.filter(function (c) {
172
- return c.id !== id;
204
+ var newChoices = (choices || []).filter(function (choice) {
205
+ return choice.id !== id;
173
206
  });
174
207
  onChange(newChoices);
175
208
  });
@@ -199,26 +232,31 @@ var Choices = /*#__PURE__*/function (_React$Component) {
199
232
  }
200
233
 
201
234
  (0, _createClass2["default"])(Choices, [{
235
+ key: "componentDidMount",
236
+ value: function componentDidMount() {
237
+ this.rerenderMath();
238
+ }
239
+ }, {
202
240
  key: "componentDidUpdate",
203
241
  value: function componentDidUpdate() {
204
- //eslint-disable-next-line
205
- var domNode = _reactDom["default"].findDOMNode(this);
206
-
207
- (0, _mathRendering.renderMath)(domNode);
208
-
209
- if (this.focusedNodeRef) {
210
- this.focusedNodeRef.focus('end');
211
- }
242
+ this.rerenderMath();
212
243
  }
213
244
  }, {
214
245
  key: "render",
215
246
  value: function render() {
216
247
  var _this2 = this;
217
248
 
218
- var focusedEl = this.state.focusedEl;
249
+ var _this$state = this.state,
250
+ focusedEl = _this$state.focusedEl,
251
+ showWarning = _this$state.showWarning;
219
252
  var _this$props5 = this.props,
220
253
  classes = _this$props5.classes,
221
- duplicates = _this$props5.duplicates;
254
+ duplicates = _this$props5.duplicates,
255
+ error = _this$props5.error,
256
+ maxChoices = _this$props5.maxChoices,
257
+ choices = _this$props5.model.choices,
258
+ toolbarOpts = _this$props5.toolbarOpts,
259
+ uploadSoundSupport = _this$props5.uploadSoundSupport;
222
260
  var visibleChoices = this.getVisibleChoices() || [];
223
261
  return /*#__PURE__*/_react["default"].createElement("div", {
224
262
  className: classes.design
@@ -226,56 +264,67 @@ var Choices = /*#__PURE__*/function (_React$Component) {
226
264
  className: classes.addButton,
227
265
  variant: "contained",
228
266
  color: "primary",
229
- onClick: this.onAddChoice
267
+ onClick: this.onAddChoice,
268
+ disabled: maxChoices && choices && maxChoices === choices.length
230
269
  }, "Add Choice"), /*#__PURE__*/_react["default"].createElement("div", {
231
270
  className: classes.altChoices
232
- }, visibleChoices.map(function (c, index) {
233
- if (focusedEl === c.id) {
234
- return /*#__PURE__*/_react["default"].createElement("div", {
235
- key: index,
236
- style: {
237
- minWidth: '100%',
238
- zIndex: '100'
239
- }
240
- }, /*#__PURE__*/_react["default"].createElement(_editableHtml["default"], {
241
- ref: function ref(_ref) {
242
- return _this2.focusedNodeRef = _ref;
243
- },
244
- className: classes.prompt,
245
- markup: c.value,
246
- pluginProps: {
247
- video: {
248
- disabled: true
249
- },
250
- audio: {
251
- disabled: true
252
- }
253
- },
254
- onChange: function onChange(val) {
255
- return _this2.onChoiceChanged(c.value, val, c.id);
256
- },
257
- onDone: function onDone() {
258
- _this2.setState({
259
- focusedEl: undefined
260
- });
271
+ }, visibleChoices.map(function (choice, index) {
272
+ return focusedEl === choice.id ? /*#__PURE__*/_react["default"].createElement("div", {
273
+ key: index,
274
+ style: {
275
+ minWidth: '100%',
276
+ zIndex: '100'
277
+ }
278
+ }, /*#__PURE__*/_react["default"].createElement(_editableHtml["default"], {
279
+ onEditor: function onEditor(editor) {
280
+ return _this2.editorInstance = editor;
281
+ },
282
+ className: classes.prompt,
283
+ markup: choice.value,
284
+ pluginProps: {
285
+ video: {
286
+ disabled: true
261
287
  },
262
- disableUnderline: true
263
- }));
264
- }
265
-
266
- return /*#__PURE__*/_react["default"].createElement(_choice["default"], {
288
+ audio: {
289
+ disabled: true
290
+ }
291
+ },
292
+ onChange: function onChange(val) {
293
+ return _this2.onChoiceChanged(choice.value, val, choice.id);
294
+ },
295
+ onDone: function onDone() {
296
+ _this2.setState({
297
+ focusedEl: undefined
298
+ });
299
+ },
300
+ disableUnderline: true,
301
+ toolbarOpts: toolbarOpts,
302
+ uploadSoundSupport: uploadSoundSupport
303
+ })) : /*#__PURE__*/_react["default"].createElement(_choice["default"], {
267
304
  key: index,
268
305
  duplicates: duplicates,
269
306
  targetId: "0",
270
- choice: c,
307
+ choice: choice,
308
+ error: error,
271
309
  onClick: function onClick() {
272
- return _this2.onChoiceFocus(c.id);
310
+ return _this2.onChoiceFocus(choice.id);
273
311
  },
274
312
  onRemoveChoice: function onRemoveChoice() {
275
- return _this2.handleChoiceRemove(c.id);
313
+ return _this2.onChoiceRemove(choice.id);
276
314
  }
277
315
  });
278
- })));
316
+ })), error && /*#__PURE__*/_react["default"].createElement("div", {
317
+ className: classes.errorText
318
+ }, error), /*#__PURE__*/_react["default"].createElement(_configUi.AlertDialog, {
319
+ open: showWarning,
320
+ title: "Warning",
321
+ text: "Identical answer choices are not allowed and the changes will be discarded.",
322
+ onConfirm: function onConfirm() {
323
+ return _this2.setState({
324
+ showWarning: false
325
+ });
326
+ }
327
+ }));
279
328
  }
280
329
  }]);
281
330
  return Choices;
@@ -284,9 +333,13 @@ var Choices = /*#__PURE__*/function (_React$Component) {
284
333
  exports.Choices = Choices;
285
334
  (0, _defineProperty2["default"])(Choices, "propTypes", {
286
335
  duplicates: _propTypes["default"].bool,
336
+ error: _propTypes["default"].string,
287
337
  model: _propTypes["default"].object.isRequired,
288
338
  onChange: _propTypes["default"].func.isRequired,
289
- classes: _propTypes["default"].object.isRequired
339
+ classes: _propTypes["default"].object.isRequired,
340
+ toolbarOpts: _propTypes["default"].object,
341
+ maxChoices: _propTypes["default"].number,
342
+ uploadSoundSupport: _propTypes["default"].object
290
343
  });
291
344
  var Styled = (0, _styles.withStyles)(styles)(Choices);
292
345
  var _default = Styled;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/choices.jsx"],"names":["window","renMath","renderMath","styles","theme","design","marginTop","spacing","unit","altChoices","alignItems","display","flexWrap","justifyContent","padding","marginBottom","Choices","prevValue","val","key","props","onChange","model","choices","correctResponse","alternateResponses","newChoices","map","c","id","value","usedForResponse","Object","keys","forEach","responseKey","values","alternate","indexOf","alert","newChoicesWithoutTheEmptyOne","filter","choice","setState","focusedEl","oldChoices","length","duplicates","v","domNode","ReactDOM","findDOMNode","focusedNodeRef","focus","state","classes","visibleChoices","getVisibleChoices","addButton","onAddChoice","index","minWidth","zIndex","ref","prompt","video","disabled","audio","onChoiceChanged","undefined","onChoiceFocus","handleChoiceRemove","React","Component","PropTypes","bool","object","isRequired","func","Styled"],"mappings":"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","sourcesContent":["import React from 'react';\nimport ReactDOM from 'react-dom';\nimport PropTypes from 'prop-types';\nimport EditableHtml from '@pie-lib/editable-html';\nimport { renderMath } from '@pie-lib/math-rendering';\nimport find from 'lodash/find';\nimport Button from '@material-ui/core/Button';\nimport Choice from './choice';\nimport { choiceIsEmpty } from './markupUtils';\nimport { withStyles } from '@material-ui/core/styles';\n\nwindow.renMath = renderMath;\n\nconst styles = theme => ({\n design: {\n marginTop: theme.spacing.unit * 2\n },\n altChoices: {\n alignItems: 'flex-start',\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'space-evenly',\n padding: '20px 0 0 0',\n '& > *': {\n marginBottom: '20px'\n }\n }\n});\n\nexport class Choices extends React.Component {\n static propTypes = {\n duplicates: PropTypes.bool,\n model: PropTypes.object.isRequired,\n onChange: PropTypes.func.isRequired,\n classes: PropTypes.object.isRequired\n };\n\n state = {};\n\n componentDidUpdate() {\n //eslint-disable-next-line\n const domNode = ReactDOM.findDOMNode(this);\n\n renderMath(domNode);\n\n if (this.focusedNodeRef) {\n this.focusedNodeRef.focus('end');\n }\n }\n\n onChoiceChanged = (prevValue, val, key) => {\n const { onChange, model } = this.props;\n const { choices, correctResponse, alternateResponses } = model;\n const newChoices = choices\n ? choices.map(c => {\n if (c.id === key) {\n return { ...c, value: val };\n }\n\n return c;\n })\n : [];\n\n if (choiceIsEmpty({ value: val })) {\n // if the edited content is empty, its usage has to be searched in the correct response definitions\n let usedForResponse = false;\n\n if (correctResponse) {\n Object.keys(correctResponse).forEach(responseKey => {\n if (correctResponse[responseKey] === key) {\n usedForResponse = true;\n }\n });\n }\n\n if (alternateResponses) {\n Object.values(alternateResponses).forEach(alternate => {\n if (alternate.indexOf(key) >= 0) {\n usedForResponse = true;\n }\n });\n }\n\n if (usedForResponse) {\n alert('Answer choices cannot be blank.');\n } else {\n if (!choiceIsEmpty({ value: prevValue })) {\n // if the previous value was not empty, it means that the choice can be deleted\n const newChoicesWithoutTheEmptyOne = newChoices.filter(choice => choice.id !== key);\n\n onChange(newChoicesWithoutTheEmptyOne);\n } else {\n onChange(newChoices);\n }\n }\n } else {\n onChange(newChoices);\n }\n };\n\n onChoiceFocus = id => this.setState({\n focusedEl: id\n });\n\n onAddChoice = () => {\n const { model: { choices: oldChoices }, onChange } = this.props;\n\n this.setState({\n focusedEl: `${oldChoices.length}`\n }, () => {\n onChange([\n ...oldChoices,\n {\n id: `${oldChoices.length}`,\n value: ''\n }\n ]\n );\n });\n };\n\n handleChoiceRemove = id => {\n const { onChange, model: { choices } } = this.props;\n const newChoices = choices.filter(c => c.id !== id);\n\n onChange(newChoices);\n };\n\n getVisibleChoices = () => {\n const {\n duplicates,\n model: { choices, correctResponse }\n } = this.props;\n\n if (!choices) {\n return [];\n }\n\n if (duplicates) {\n return choices;\n }\n\n // if duplicates not allowed, remove the choices that are used to define the correct response\n return choices.filter(choice => !find(correctResponse, v => v === choice.id));\n };\n\n render() {\n const { focusedEl } = this.state;\n const {\n classes,\n duplicates,\n } = this.props;\n const visibleChoices = this.getVisibleChoices() || [];\n\n return (\n <div className={classes.design}>\n <Button\n className={classes.addButton}\n variant=\"contained\"\n color=\"primary\"\n onClick={this.onAddChoice}\n >\n Add Choice\n </Button>\n <div\n className={classes.altChoices}\n >\n {\n visibleChoices.map((c, index) => {\n if (focusedEl === c.id) {\n return (\n <div\n key={index}\n style={{\n minWidth: '100%',\n zIndex: '100'\n }}\n >\n <EditableHtml\n ref={ref => (this.focusedNodeRef = ref)}\n className={classes.prompt}\n markup={c.value}\n pluginProps={{\n video: {\n disabled: true\n },\n audio: {\n disabled: true\n }\n }}\n onChange={val => this.onChoiceChanged(c.value, val, c.id)}\n onDone={() => {\n this.setState({\n focusedEl: undefined\n });\n }}\n disableUnderline\n />\n </div>\n );\n }\n\n return (\n <Choice\n key={index}\n duplicates={duplicates}\n targetId=\"0\"\n choice={c}\n onClick={() => this.onChoiceFocus(c.id)}\n onRemoveChoice={() => this.handleChoiceRemove(c.id)}\n />\n );\n })\n }\n </div>\n </div>\n );\n }\n}\n\nconst Styled = withStyles(styles)(Choices);\n\nexport default Styled;\n"],"file":"choices.js"}
1
+ {"version":3,"sources":["../src/choices.jsx"],"names":["window","renMath","renderMath","styles","theme","design","marginTop","spacing","unit","altChoices","alignItems","display","flexWrap","justifyContent","margin","errorText","fontSize","typography","color","paddingBottom","Choices","showWarning","domNode","ReactDOM","findDOMNode","prevValue","val","key","props","onChange","model","choices","correctResponse","alternateResponses","duplicatedValue","find","c","value","id","newChoices","filter","setState","map","choice","usedForResponse","Object","keys","forEach","responseKey","values","alternate","indexOf","alert","newChoicesWithoutTheEmptyOne","focusedEl","oldChoices","length","duplicates","v","rerenderMath","state","classes","error","maxChoices","toolbarOpts","uploadSoundSupport","visibleChoices","getVisibleChoices","addButton","onAddChoice","index","minWidth","zIndex","editor","editorInstance","prompt","video","disabled","audio","onChoiceChanged","undefined","onChoiceFocus","onChoiceRemove","React","Component","PropTypes","bool","string","object","isRequired","func","number","Styled"],"mappings":"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","sourcesContent":["import React from 'react';\nimport ReactDOM from 'react-dom';\nimport PropTypes from 'prop-types';\nimport EditableHtml from '@pie-lib/editable-html';\nimport { renderMath } from '@pie-lib/math-rendering';\nimport find from 'lodash/find';\nimport Button from '@material-ui/core/Button';\nimport Choice from './choice';\nimport { choiceIsEmpty } from './markupUtils';\nimport { withStyles } from '@material-ui/core/styles';\nimport { AlertDialog } from '@pie-lib/config-ui';\n\nwindow.renMath = renderMath;\n\nconst styles = (theme) => ({\n design: {\n marginTop: theme.spacing.unit * 2,\n },\n altChoices: {\n alignItems: 'flex-start',\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'space-evenly',\n margin: `${theme.spacing.unit}px 0`,\n\n '& > *': {\n margin: theme.spacing.unit,\n },\n },\n errorText: {\n fontSize: theme.typography.fontSize - 2,\n color: 'red',\n paddingBottom: theme.spacing.unit * 2,\n },\n});\n\nexport class Choices extends React.Component {\n static propTypes = {\n duplicates: PropTypes.bool,\n error: PropTypes.string,\n model: PropTypes.object.isRequired,\n onChange: PropTypes.func.isRequired,\n classes: PropTypes.object.isRequired,\n toolbarOpts: PropTypes.object,\n maxChoices: PropTypes.number,\n uploadSoundSupport: PropTypes.object,\n };\n\n editorInstance = null;\n state = { showWarning: false };\n\n componentDidMount() {\n this.rerenderMath();\n }\n\n componentDidUpdate() {\n this.rerenderMath();\n }\n\n rerenderMath = () => {\n //eslint-disable-next-line\n const domNode = ReactDOM.findDOMNode(this);\n\n renderMath(domNode);\n };\n\n onChoiceChanged = (prevValue, val, key) => {\n const { onChange, model } = this.props;\n const { choices, correctResponse, alternateResponses } = model;\n const duplicatedValue = (choices || []).find((c) => c.value === val && c.id !== key);\n\n // discard the new added choice or the changes if the choice would be a duplicate to one that already exists\n if (duplicatedValue) {\n if (prevValue === '') {\n // remove the new added choice from choices\n const newChoices = (choices || []).filter((c) => c.id !== key);\n\n onChange(newChoices);\n }\n\n this.setState({ showWarning: true });\n\n return;\n }\n\n const newChoices = choices?.map((choice) => (choice.id === key ? { ...choice, value: val } : choice)) || [];\n\n if (choiceIsEmpty({ value: val })) {\n // if the edited content is empty, its usage has to be searched in the correct response definitions\n let usedForResponse = false;\n\n if (correctResponse) {\n Object.keys(correctResponse).forEach((responseKey) => {\n if (correctResponse[responseKey] === key) {\n usedForResponse = true;\n }\n });\n }\n\n if (alternateResponses) {\n Object.values(alternateResponses).forEach((alternate) => {\n if (alternate.indexOf(key) >= 0) {\n usedForResponse = true;\n }\n });\n }\n\n if (usedForResponse) {\n alert('Answer choices cannot be blank.');\n } else {\n if (!choiceIsEmpty({ value: prevValue })) {\n // if the previous value was not empty, it means that the choice can be deleted\n const newChoicesWithoutTheEmptyOne = newChoices.filter((choice) => choice.id !== key);\n\n onChange(newChoicesWithoutTheEmptyOne);\n } else {\n onChange(newChoices);\n }\n }\n } else {\n onChange(newChoices);\n }\n };\n\n onChoiceFocus = (id) =>\n this.setState({\n focusedEl: id,\n });\n\n onAddChoice = () => {\n const {\n model: { choices: oldChoices },\n onChange,\n } = this.props;\n\n this.setState(\n {\n focusedEl: `${oldChoices.length}`,\n },\n () => {\n onChange([\n ...oldChoices,\n {\n id: `${oldChoices.length}`,\n value: '',\n },\n ]);\n },\n );\n };\n\n onChoiceRemove = (id) => {\n const {\n onChange,\n model: { choices },\n } = this.props;\n const newChoices = (choices || []).filter((choice) => choice.id !== id);\n\n onChange(newChoices);\n };\n\n getVisibleChoices = () => {\n const {\n duplicates,\n model: { choices, correctResponse },\n } = this.props;\n\n if (!choices) {\n return [];\n }\n\n if (duplicates) {\n return choices;\n }\n\n // if duplicates not allowed, remove the choices that are used to define the correct response\n return choices.filter((choice) => !find(correctResponse, (v) => v === choice.id));\n };\n\n render() {\n const { focusedEl, showWarning } = this.state;\n const {\n classes,\n duplicates,\n error,\n maxChoices,\n model: { choices },\n toolbarOpts,\n uploadSoundSupport,\n } = this.props;\n const visibleChoices = this.getVisibleChoices() || [];\n\n return (\n <div className={classes.design}>\n <Button\n className={classes.addButton}\n variant=\"contained\"\n color=\"primary\"\n onClick={this.onAddChoice}\n disabled={maxChoices && choices && maxChoices === choices.length}\n >\n Add Choice\n </Button>\n\n <div className={classes.altChoices}>\n {visibleChoices.map((choice, index) =>\n focusedEl === choice.id ? (\n <div\n key={index}\n style={{\n minWidth: '100%',\n zIndex: '100',\n }}\n >\n <EditableHtml\n onEditor={editor => (this.editorInstance = editor)}\n className={classes.prompt}\n markup={choice.value}\n pluginProps={{\n video: {\n disabled: true,\n },\n audio: {\n disabled: true,\n },\n }}\n onChange={(val) => this.onChoiceChanged(choice.value, val, choice.id)}\n onDone={() => {\n this.setState({\n focusedEl: undefined,\n });\n }}\n disableUnderline\n toolbarOpts={toolbarOpts}\n uploadSoundSupport={uploadSoundSupport}\n />\n </div>\n ) : (\n <Choice\n key={index}\n duplicates={duplicates}\n targetId=\"0\"\n choice={choice}\n error={error}\n onClick={() => this.onChoiceFocus(choice.id)}\n onRemoveChoice={() => this.onChoiceRemove(choice.id)}\n />\n ),\n )}\n </div>\n {error && <div className={classes.errorText}>{error}</div>}\n\n <AlertDialog\n open={showWarning}\n title=\"Warning\"\n text=\"Identical answer choices are not allowed and the changes will be discarded.\"\n onConfirm={() => this.setState({ showWarning: false })}\n />\n </div>\n );\n }\n}\n\nconst Styled = withStyles(styles)(Choices);\n\nexport default Styled;\n"],"file":"choices.js"}
@@ -9,7 +9,6 @@ var _default = {
9
9
  disabled: false,
10
10
  mode: 'gather',
11
11
  prompt: 'Use the inputs to complete the sentence',
12
- shuffle: true,
13
12
  markup: '',
14
13
  choices: [],
15
14
  choicesPosition: 'below',
@@ -18,9 +17,15 @@ var _default = {
18
17
  rationaleEnabled: true,
19
18
  promptEnabled: true,
20
19
  teacherInstructionsEnabled: true,
21
- studentInstructionsEnabled: true
20
+ studentInstructionsEnabled: true,
21
+ toolbarEditorPosition: 'bottom'
22
22
  },
23
23
  configuration: {
24
+ spellCheck: {
25
+ label: 'Spellcheck',
26
+ settings: false,
27
+ enabled: true
28
+ },
24
29
  choicesPosition: {
25
30
  settings: true,
26
31
  label: 'Choices Position'
@@ -45,9 +50,26 @@ var _default = {
45
50
  settings: true,
46
51
  label: 'Rationale'
47
52
  },
53
+ settingsPanelDisabled: false,
48
54
  teacherInstructions: {
49
55
  settings: true,
50
56
  label: 'Teacher Instructions'
57
+ },
58
+ minChoices: 2,
59
+ maxResponseAreas: 10,
60
+ maxImageWidth: {
61
+ teacherInstructions: 300,
62
+ prompt: 300,
63
+ rationale: 300
64
+ },
65
+ maxImageHeight: {
66
+ teacherInstructions: 300,
67
+ prompt: 300,
68
+ rationale: 300
69
+ },
70
+ withRubric: {
71
+ settings: false,
72
+ label: 'Add Rubric'
51
73
  }
52
74
  }
53
75
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/defaults.js"],"names":["model","disabled","mode","prompt","shuffle","markup","choices","choicesPosition","correctResponse","duplicates","rationaleEnabled","promptEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","configuration","settings","label","lockChoiceOrder","partialScoring","rationale","teacherInstructions"],"mappings":";;;;;;eAAe;AACbA,EAAAA,KAAK,EAAE;AACLC,IAAAA,QAAQ,EAAE,KADL;AAELC,IAAAA,IAAI,EAAE,QAFD;AAGLC,IAAAA,MAAM,EAAE,yCAHH;AAILC,IAAAA,OAAO,EAAE,IAJJ;AAKLC,IAAAA,MAAM,EAAE,EALH;AAMLC,IAAAA,OAAO,EAAE,EANJ;AAOLC,IAAAA,eAAe,EAAE,OAPZ;AAQLC,IAAAA,eAAe,EAAE,EARZ;AASLC,IAAAA,UAAU,EAAE,IATP;AAULC,IAAAA,gBAAgB,EAAE,IAVb;AAWLC,IAAAA,aAAa,EAAE,IAXV;AAYLC,IAAAA,0BAA0B,EAAE,IAZvB;AAaLC,IAAAA,0BAA0B,EAAE;AAbvB,GADM;AAgBbC,EAAAA,aAAa,EAAE;AACbP,IAAAA,eAAe,EAAE;AACfQ,MAAAA,QAAQ,EAAE,IADK;AAEfC,MAAAA,KAAK,EAAE;AAFQ,KADJ;AAKbb,IAAAA,MAAM,EAAE;AACNY,MAAAA,QAAQ,EAAE,IADJ;AAENC,MAAAA,KAAK,EAAE;AAFD,KALK;AASbP,IAAAA,UAAU,EAAE;AACVM,MAAAA,QAAQ,EAAE,IADA;AAEVC,MAAAA,KAAK,EAAE;AAFG,KATC;AAabC,IAAAA,eAAe,EAAE;AACfF,MAAAA,QAAQ,EAAE,IADK;AAEfC,MAAAA,KAAK,EAAE;AAFQ,KAbJ;AAiBbE,IAAAA,cAAc,EAAE;AACdH,MAAAA,QAAQ,EAAE,KADI;AAEdC,MAAAA,KAAK,EAAE;AAFO,KAjBH;AAqBbG,IAAAA,SAAS,EAAE;AACTJ,MAAAA,QAAQ,EAAE,IADD;AAETC,MAAAA,KAAK,EAAE;AAFE,KArBE;AAyBbI,IAAAA,mBAAmB,EAAE;AACnBL,MAAAA,QAAQ,EAAE,IADS;AAEnBC,MAAAA,KAAK,EAAE;AAFY;AAzBR;AAhBF,C","sourcesContent":["export default {\n model: {\n disabled: false,\n mode: 'gather',\n prompt: 'Use the inputs to complete the sentence',\n shuffle: true,\n markup: '',\n choices: [],\n choicesPosition: 'below',\n correctResponse: {},\n duplicates: true,\n rationaleEnabled: true,\n promptEnabled: true,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true\n },\n configuration: {\n choicesPosition: {\n settings: true,\n label: 'Choices Position'\n },\n prompt: {\n settings: true,\n label: 'Prompt'\n },\n duplicates: {\n settings: true,\n label: 'Duplicates'\n },\n lockChoiceOrder: {\n settings: true,\n label: 'Lock Choice Order'\n },\n partialScoring: {\n settings: false,\n label: 'Allow Partial Scoring'\n },\n rationale: {\n settings: true,\n label: 'Rationale'\n },\n teacherInstructions: {\n settings: true,\n label: 'Teacher Instructions'\n }\n }\n};\n"],"file":"defaults.js"}
1
+ {"version":3,"sources":["../src/defaults.js"],"names":["model","disabled","mode","prompt","markup","choices","choicesPosition","correctResponse","duplicates","rationaleEnabled","promptEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","toolbarEditorPosition","configuration","spellCheck","label","settings","enabled","lockChoiceOrder","partialScoring","rationale","settingsPanelDisabled","teacherInstructions","minChoices","maxResponseAreas","maxImageWidth","maxImageHeight","withRubric"],"mappings":";;;;;;eAAe;AACbA,EAAAA,KAAK,EAAE;AACLC,IAAAA,QAAQ,EAAE,KADL;AAELC,IAAAA,IAAI,EAAE,QAFD;AAGLC,IAAAA,MAAM,EAAE,yCAHH;AAILC,IAAAA,MAAM,EAAE,EAJH;AAKLC,IAAAA,OAAO,EAAE,EALJ;AAMLC,IAAAA,eAAe,EAAE,OANZ;AAOLC,IAAAA,eAAe,EAAE,EAPZ;AAQLC,IAAAA,UAAU,EAAE,IARP;AASLC,IAAAA,gBAAgB,EAAE,IATb;AAULC,IAAAA,aAAa,EAAE,IAVV;AAWLC,IAAAA,0BAA0B,EAAE,IAXvB;AAYLC,IAAAA,0BAA0B,EAAE,IAZvB;AAaLC,IAAAA,qBAAqB,EAAE;AAblB,GADM;AAgBbC,EAAAA,aAAa,EAAE;AACbC,IAAAA,UAAU,EAAE;AACVC,MAAAA,KAAK,EAAE,YADG;AAEVC,MAAAA,QAAQ,EAAE,KAFA;AAGVC,MAAAA,OAAO,EAAE;AAHC,KADC;AAMbZ,IAAAA,eAAe,EAAE;AACfW,MAAAA,QAAQ,EAAE,IADK;AAEfD,MAAAA,KAAK,EAAE;AAFQ,KANJ;AAUbb,IAAAA,MAAM,EAAE;AACNc,MAAAA,QAAQ,EAAE,IADJ;AAEND,MAAAA,KAAK,EAAE;AAFD,KAVK;AAcbR,IAAAA,UAAU,EAAE;AACVS,MAAAA,QAAQ,EAAE,IADA;AAEVD,MAAAA,KAAK,EAAE;AAFG,KAdC;AAkBbG,IAAAA,eAAe,EAAE;AACfF,MAAAA,QAAQ,EAAE,IADK;AAEfD,MAAAA,KAAK,EAAE;AAFQ,KAlBJ;AAsBbI,IAAAA,cAAc,EAAE;AACdH,MAAAA,QAAQ,EAAE,KADI;AAEdD,MAAAA,KAAK,EAAE;AAFO,KAtBH;AA0BbK,IAAAA,SAAS,EAAE;AACTJ,MAAAA,QAAQ,EAAE,IADD;AAETD,MAAAA,KAAK,EAAE;AAFE,KA1BE;AA8BbM,IAAAA,qBAAqB,EAAE,KA9BV;AA+BbC,IAAAA,mBAAmB,EAAE;AACnBN,MAAAA,QAAQ,EAAE,IADS;AAEnBD,MAAAA,KAAK,EAAE;AAFY,KA/BR;AAmCbQ,IAAAA,UAAU,EAAE,CAnCC;AAoCbC,IAAAA,gBAAgB,EAAE,EApCL;AAqCbC,IAAAA,aAAa,EAAE;AACbH,MAAAA,mBAAmB,EAAE,GADR;AAEbpB,MAAAA,MAAM,EAAE,GAFK;AAGbkB,MAAAA,SAAS,EAAE;AAHE,KArCF;AA0CbM,IAAAA,cAAc,EAAE;AACdJ,MAAAA,mBAAmB,EAAE,GADP;AAEdpB,MAAAA,MAAM,EAAE,GAFM;AAGdkB,MAAAA,SAAS,EAAE;AAHG,KA1CH;AA+CbO,IAAAA,UAAU,EAAE;AACVX,MAAAA,QAAQ,EAAE,KADA;AAEVD,MAAAA,KAAK,EAAE;AAFG;AA/CC;AAhBF,C","sourcesContent":["export default {\n model: {\n disabled: false,\n mode: 'gather',\n prompt: 'Use the inputs to complete the sentence',\n markup: '',\n choices: [],\n choicesPosition: 'below',\n correctResponse: {},\n duplicates: true,\n rationaleEnabled: true,\n promptEnabled: true,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n toolbarEditorPosition: 'bottom',\n },\n configuration: {\n spellCheck: {\n label: 'Spellcheck',\n settings: false,\n enabled: true,\n },\n choicesPosition: {\n settings: true,\n label: 'Choices Position',\n },\n prompt: {\n settings: true,\n label: 'Prompt',\n },\n duplicates: {\n settings: true,\n label: 'Duplicates',\n },\n lockChoiceOrder: {\n settings: true,\n label: 'Lock Choice Order',\n },\n partialScoring: {\n settings: false,\n label: 'Allow Partial Scoring',\n },\n rationale: {\n settings: true,\n label: 'Rationale',\n },\n settingsPanelDisabled: false,\n teacherInstructions: {\n settings: true,\n label: 'Teacher Instructions',\n },\n minChoices: 2,\n maxResponseAreas: 10,\n maxImageWidth: {\n teacherInstructions: 300,\n prompt: 300,\n rationale: 300,\n },\n maxImageHeight: {\n teacherInstructions: 300,\n prompt: 300,\n rationale: 300,\n },\n withRubric: {\n settings: false,\n label: 'Add Rubric',\n },\n },\n};\n"],"file":"defaults.js"}
@@ -39,13 +39,13 @@ var _defaults2 = _interopRequireDefault(require("./defaults"));
39
39
 
40
40
  var _markupUtils = require("./markupUtils");
41
41
 
42
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
42
+ 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; }
43
43
 
44
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
44
+ 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; }
45
45
 
46
46
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
47
47
 
48
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
48
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
49
49
 
50
50
  var log = (0, _debug["default"])('multiple-choice:configure');
51
51
 
@@ -68,9 +68,9 @@ var DragInTheBlank = /*#__PURE__*/function (_HTMLElement) {
68
68
 
69
69
  (0, _createClass2["default"])(DragInTheBlank, [{
70
70
  key: "model",
71
- set: function set(s) {
72
- var formModel = _objectSpread(_objectSpread({}, s), {}, {
73
- markup: "<span>".concat(s.markup || _defaults2["default"].model.markup, "</span>")
71
+ set: function set(m) {
72
+ var formModel = _objectSpread(_objectSpread({}, m), {}, {
73
+ markup: "<span>".concat(m.markup || _defaults2["default"].model.markup, "</span>")
74
74
  });
75
75
 
76
76
  this._model = DragInTheBlank.prepareModel(formModel);
@@ -125,6 +125,16 @@ var DragInTheBlank = /*#__PURE__*/function (_HTMLElement) {
125
125
  value: function onDeleteImage(src, done) {
126
126
  this.dispatchEvent(new _pieConfigureEvents.DeleteImageEvent(src, done));
127
127
  }
128
+ }, {
129
+ key: "insertSound",
130
+ value: function insertSound(handler) {
131
+ this.dispatchEvent(new _pieConfigureEvents.InsertSoundEvent(handler));
132
+ }
133
+ }, {
134
+ key: "onDeleteSound",
135
+ value: function onDeleteSound(src, done) {
136
+ this.dispatchEvent(new _pieConfigureEvents.DeleteSoundEvent(src, done));
137
+ }
128
138
  }, {
129
139
  key: "_render",
130
140
  value: function _render() {
@@ -139,6 +149,10 @@ var DragInTheBlank = /*#__PURE__*/function (_HTMLElement) {
139
149
  imageSupport: {
140
150
  add: this.insertImage.bind(this),
141
151
  "delete": this.onDeleteImage.bind(this)
152
+ },
153
+ uploadSoundSupport: {
154
+ add: this.insertSound.bind(this),
155
+ "delete": this.onDeleteSound.bind(this)
142
156
  }
143
157
  });
144
158
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.js"],"names":["log","DragInTheBlank","_model","prepareModel","_configuration","sensibleDefaults","configuration","onModelChanged","bind","onConfigurationChanged","s","formModel","markup","model","_render","c","_disableSidePanel","reset","resetValue","dispatchEvent","ModelUpdatedEvent","m","dispatchModelUpdated","handler","InsertImageEvent","src","done","DeleteImageEvent","element","React","createElement","Main","disableSidePanel","imageSupport","add","insertImage","onDeleteImage","ReactDOM","render","HTMLElement","joinedObj","slateMarkup","choices","correctResponse","processedMarkup"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AAMA;;AACA;;AACA;;AACA;;AACA;;AAEA;;AACA;;;;;;;;;;AAEA,IAAMA,GAAG,GAAG,uBAAM,2BAAN,CAAZ;;IAEqBC,c;;;;;AAkBnB,4BAAc;AAAA;;AAAA;AACZ;AACA,UAAKC,MAAL,GAAcD,cAAc,CAACE,YAAf,EAAd;AACA,UAAKC,cAAL,GAAsBC,sBAAiBC,aAAvC;AACA,UAAKC,cAAL,GAAsB,MAAKA,cAAL,CAAoBC,IAApB,gDAAtB;AACA,UAAKC,sBAAL,GAA8B,MAAKA,sBAAL,CAA4BD,IAA5B,gDAA9B;AALY;AAMb;;;;SAED,aAAUE,CAAV,EAAa;AACX,UAAMC,SAAS,mCACVD,CADU;AAEbE,QAAAA,MAAM,kBAAWF,CAAC,CAACE,MAAF,IAAYP,sBAAiBQ,KAAjB,CAAuBD,MAA9C;AAFO,QAAf;;AAKA,WAAKV,MAAL,GAAcD,cAAc,CAACE,YAAf,CAA4BQ,SAA5B,CAAd;;AACA,WAAKG,OAAL;AACD;;;SAED,aAAkBC,CAAlB,EAAqB;AACnB,WAAKX,cAAL,GAAsB,0BAASW,CAAT,EAAYV,sBAAiBC,aAA7B,CAAtB;;AACA,WAAKQ,OAAL;AACD;;;SAED,aAAqBJ,CAArB,EAAwB;AACtB,WAAKM,iBAAL,GAAyBN,CAAzB;;AACA,WAAKI,OAAL;AACD;;;WAED,8BAAqBG,KAArB,EAA4B;AAC1B,UAAMC,UAAU,GAAG,CAAC,CAACD,KAArB;AAEA,WAAKE,aAAL,CAAmB,IAAIC,qCAAJ,CAAsB,KAAKlB,MAA3B,EAAmCgB,UAAnC,CAAnB;AACD;;;WAED,wBAAeG,CAAf,EAAkBJ,KAAlB,EAAyB;AACvB,WAAKf,MAAL,GAAcD,cAAc,CAACE,YAAf,CAA4BkB,CAA5B,CAAd;;AACA,WAAKP,OAAL;;AACA,WAAKQ,oBAAL,CAA0BL,KAA1B;AACD;;;WAED,gCAAuBF,CAAvB,EAA0B;AACxB,WAAKX,cAAL,GAAsBW,CAAtB;;AACA,WAAKD,OAAL;AACD;AAED;;;;WACA,qBAAYS,OAAZ,EAAqB;AACnB,WAAKJ,aAAL,CAAmB,IAAIK,oCAAJ,CAAqBD,OAArB,CAAnB;AACD;;;WAED,uBAAcE,GAAd,EAAmBC,IAAnB,EAAyB;AACvB,WAAKP,aAAL,CAAmB,IAAIQ,oCAAJ,CAAqBF,GAArB,EAA0BC,IAA1B,CAAnB;AACD;;;WAED,mBAAU;AACR1B,MAAAA,GAAG,CAAC,SAAD,CAAH;;AACA,UAAI4B,OAAO,gBAAGC,kBAAMC,aAAN,CAAoBC,gBAApB,EAA0B;AACtClB,QAAAA,KAAK,EAAE,KAAKX,MAD0B;AAEtCI,QAAAA,aAAa,EAAE,KAAKF,cAFkB;AAGtCG,QAAAA,cAAc,EAAE,KAAKA,cAHiB;AAItCE,QAAAA,sBAAsB,EAAE,KAAKA,sBAJS;AAKtCuB,QAAAA,gBAAgB,EAAE,KAAKhB,iBALe;AAMtCiB,QAAAA,YAAY,EAAE;AACZC,UAAAA,GAAG,EAAE,KAAKC,WAAL,CAAiB3B,IAAjB,CAAsB,IAAtB,CADO;AAEZ,oBAAQ,KAAK4B,aAAL,CAAmB5B,IAAnB,CAAwB,IAAxB;AAFI;AANwB,OAA1B,CAAd;;AAWA6B,2BAASC,MAAT,CAAgBV,OAAhB,EAAyB,IAAzB;AACD;;;kDAtFyCW,W;;;iCAAvBtC,c,kBACG,YAAgB;AAAA,MAAfY,KAAe,uEAAP,EAAO;;AACpC,MAAM2B,SAAS,mCACVnC,sBAAiBQ,KADP,GAEVA,KAFU,CAAf;;AAIA,MAAM4B,WAAW,GAAG5B,KAAK,CAAC4B,WAAN,IAClB,oCAAkBD,SAAS,CAAC5B,MAA5B,EAAoC4B,SAAS,CAACE,OAA9C,EAAuDF,SAAS,CAACG,eAAjE,CADF;AAEA,MAAMC,eAAe,GAAG,gCAAcH,WAAd,CAAxB;AAEA,yCACKD,SADL;AAEEC,IAAAA,WAAW,EAAXA,WAFF;AAGE7B,IAAAA,MAAM,EAAEgC,eAAe,CAAChC,MAH1B;AAIE+B,IAAAA,eAAe,EAAEC,eAAe,CAACD;AAJnC;AAMD,C","sourcesContent":["import {\n DeleteImageEvent,\n InsertImageEvent,\n ModelUpdatedEvent\n} from '@pie-framework/pie-configure-events';\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport Main from './main';\nimport debug from 'debug';\nimport defaults from 'lodash/defaults';\n\nimport sensibleDefaults from './defaults';\nimport { processMarkup, createSlateMarkup } from './markupUtils'\n\nconst log = debug('multiple-choice:configure');\n\nexport default class DragInTheBlank extends HTMLElement {\n static prepareModel = (model = {}) => {\n const joinedObj = {\n ...sensibleDefaults.model,\n ...model\n };\n const slateMarkup = model.slateMarkup ||\n createSlateMarkup(joinedObj.markup, joinedObj.choices, joinedObj.correctResponse);\n const processedMarkup = processMarkup(slateMarkup);\n\n return {\n ...joinedObj,\n slateMarkup,\n markup: processedMarkup.markup,\n correctResponse: processedMarkup.correctResponse\n };\n };\n\n constructor() {\n super();\n this._model = DragInTheBlank.prepareModel();\n this._configuration = sensibleDefaults.configuration;\n this.onModelChanged = this.onModelChanged.bind(this);\n this.onConfigurationChanged = this.onConfigurationChanged.bind(this);\n }\n\n set model(s) {\n const formModel = {\n ...s,\n markup: `<span>${s.markup || sensibleDefaults.model.markup}</span>`\n };\n\n this._model = DragInTheBlank.prepareModel(formModel);\n this._render();\n }\n\n set configuration(c) {\n this._configuration = defaults(c, sensibleDefaults.configuration);\n this._render();\n }\n\n set disableSidePanel(s) {\n this._disableSidePanel = s;\n this._render();\n }\n\n dispatchModelUpdated(reset) {\n const resetValue = !!reset;\n\n this.dispatchEvent(new ModelUpdatedEvent(this._model, resetValue));\n }\n\n onModelChanged(m, reset) {\n this._model = DragInTheBlank.prepareModel(m);\n this._render();\n this.dispatchModelUpdated(reset);\n }\n\n onConfigurationChanged(c) {\n this._configuration = c;\n this._render();\n }\n\n /** @param {done, progress, file} handler */\n insertImage(handler) {\n this.dispatchEvent(new InsertImageEvent(handler));\n }\n\n onDeleteImage(src, done) {\n this.dispatchEvent(new DeleteImageEvent(src, done));\n }\n\n _render() {\n log('_render');\n let element = React.createElement(Main, {\n model: this._model,\n configuration: this._configuration,\n onModelChanged: this.onModelChanged,\n onConfigurationChanged: this.onConfigurationChanged,\n disableSidePanel: this._disableSidePanel,\n imageSupport: {\n add: this.insertImage.bind(this),\n delete: this.onDeleteImage.bind(this)\n }\n });\n ReactDOM.render(element, this);\n }\n}\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../src/index.js"],"names":["log","DragInTheBlank","_model","prepareModel","_configuration","sensibleDefaults","configuration","onModelChanged","bind","onConfigurationChanged","m","formModel","markup","model","_render","c","s","_disableSidePanel","reset","resetValue","dispatchEvent","ModelUpdatedEvent","dispatchModelUpdated","handler","InsertImageEvent","src","done","DeleteImageEvent","InsertSoundEvent","DeleteSoundEvent","element","React","createElement","Main","disableSidePanel","imageSupport","add","insertImage","onDeleteImage","uploadSoundSupport","insertSound","onDeleteSound","ReactDOM","render","HTMLElement","joinedObj","slateMarkup","choices","correctResponse","processedMarkup"],"mappings":"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","sourcesContent":["import {\n ModelUpdatedEvent,\n DeleteImageEvent,\n InsertImageEvent,\n InsertSoundEvent,\n DeleteSoundEvent,\n} from '@pie-framework/pie-configure-events';\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport Main from './main';\nimport debug from 'debug';\nimport defaults from 'lodash/defaults';\n\nimport sensibleDefaults from './defaults';\nimport { processMarkup, createSlateMarkup } from './markupUtils';\n\nconst log = debug('multiple-choice:configure');\n\nexport default class DragInTheBlank extends HTMLElement {\n static prepareModel = (model = {}) => {\n const joinedObj = {\n ...sensibleDefaults.model,\n ...model,\n };\n const slateMarkup =\n model.slateMarkup || createSlateMarkup(joinedObj.markup, joinedObj.choices, joinedObj.correctResponse);\n const processedMarkup = processMarkup(slateMarkup);\n\n return {\n ...joinedObj,\n slateMarkup,\n markup: processedMarkup.markup,\n correctResponse: processedMarkup.correctResponse,\n };\n };\n\n constructor() {\n super();\n this._model = DragInTheBlank.prepareModel();\n this._configuration = sensibleDefaults.configuration;\n this.onModelChanged = this.onModelChanged.bind(this);\n this.onConfigurationChanged = this.onConfigurationChanged.bind(this);\n }\n\n set model(m) {\n const formModel = {\n ...m,\n markup: `<span>${m.markup || sensibleDefaults.model.markup}</span>`,\n };\n\n this._model = DragInTheBlank.prepareModel(formModel);\n this._render();\n }\n\n set configuration(c) {\n this._configuration = defaults(c, sensibleDefaults.configuration);\n this._render();\n }\n\n set disableSidePanel(s) {\n this._disableSidePanel = s;\n this._render();\n }\n\n dispatchModelUpdated(reset) {\n const resetValue = !!reset;\n\n this.dispatchEvent(new ModelUpdatedEvent(this._model, resetValue));\n }\n\n onModelChanged(m, reset) {\n this._model = DragInTheBlank.prepareModel(m);\n this._render();\n this.dispatchModelUpdated(reset);\n }\n\n onConfigurationChanged(c) {\n this._configuration = c;\n this._render();\n }\n\n /** @param {done, progress, file} handler */\n insertImage(handler) {\n this.dispatchEvent(new InsertImageEvent(handler));\n }\n\n onDeleteImage(src, done) {\n this.dispatchEvent(new DeleteImageEvent(src, done));\n }\n\n insertSound(handler) {\n this.dispatchEvent(new InsertSoundEvent(handler));\n }\n\n onDeleteSound(src, done) {\n this.dispatchEvent(new DeleteSoundEvent(src, done));\n }\n\n _render() {\n log('_render');\n\n let element = React.createElement(Main, {\n model: this._model,\n configuration: this._configuration,\n onModelChanged: this.onModelChanged,\n onConfigurationChanged: this.onConfigurationChanged,\n disableSidePanel: this._disableSidePanel,\n imageSupport: {\n add: this.insertImage.bind(this),\n delete: this.onDeleteImage.bind(this),\n },\n uploadSoundSupport: {\n add: this.insertSound.bind(this),\n delete: this.onDeleteSound.bind(this),\n },\n });\n\n ReactDOM.render(element, this);\n }\n}\n"],"file":"index.js"}