@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.
- package/CHANGELOG.md +513 -0
- package/configure/CHANGELOG.md +421 -0
- package/configure/lib/choice.js +28 -21
- package/configure/lib/choice.js.map +1 -1
- package/configure/lib/choices.js +118 -65
- package/configure/lib/choices.js.map +1 -1
- package/configure/lib/defaults.js +24 -2
- package/configure/lib/defaults.js.map +1 -1
- package/configure/lib/index.js +20 -6
- package/configure/lib/index.js.map +1 -1
- package/configure/lib/main.js +150 -33
- package/configure/lib/main.js.map +1 -1
- package/configure/lib/markupUtils.js +9 -3
- package/configure/lib/markupUtils.js.map +1 -1
- package/configure/package.json +26 -8
- package/configure/utils.js +17 -0
- package/controller/CHANGELOG.md +91 -0
- package/controller/lib/index.js +45 -3
- package/controller/lib/index.js.map +1 -1
- package/controller/lib/utils.js +1 -1
- package/controller/lib/utils.js.map +1 -1
- package/controller/package.json +2 -2
- package/docs/config-schema.json +115 -0
- package/docs/config-schema.json.md +89 -1
- package/docs/demo/config.js +2 -2
- package/docs/demo/generate.js +30 -27
- package/docs/pie-schema.json +49 -0
- package/docs/pie-schema.json.md +39 -0
- package/lib/index.js +6 -2
- package/lib/index.js.map +1 -1
- package/lib/main.js +18 -31
- package/lib/main.js.map +1 -1
- package/package.json +9 -7
package/configure/lib/choices.js
CHANGED
|
@@ -43,13 +43,15 @@ var _markupUtils = require("./markupUtils");
|
|
|
43
43
|
|
|
44
44
|
var _styles = require("@material-ui/core/styles");
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
var _configUi = require("@pie-lib/config-ui");
|
|
47
47
|
|
|
48
|
-
function
|
|
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 {
|
|
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
|
-
|
|
68
|
+
margin: "".concat(theme.spacing.unit, "px 0"),
|
|
67
69
|
'& > *': {
|
|
68
|
-
|
|
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), "
|
|
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
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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
|
-
|
|
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), "
|
|
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 (
|
|
172
|
-
return
|
|
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
|
-
|
|
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
|
|
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 (
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
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
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
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:
|
|
307
|
+
choice: choice,
|
|
308
|
+
error: error,
|
|
271
309
|
onClick: function onClick() {
|
|
272
|
-
return _this2.onChoiceFocus(
|
|
310
|
+
return _this2.onChoiceFocus(choice.id);
|
|
273
311
|
},
|
|
274
312
|
onRemoveChoice: function onRemoveChoice() {
|
|
275
|
-
return _this2.
|
|
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","
|
|
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"}
|
package/configure/lib/index.js
CHANGED
|
@@ -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);
|
|
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]
|
|
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 {
|
|
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(
|
|
72
|
-
var formModel = _objectSpread(_objectSpread({},
|
|
73
|
-
markup: "<span>".concat(
|
|
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","
|
|
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"}
|