@pie-element/drag-in-the-blank 3.13.7 → 3.13.10
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 +24 -0
- package/configure/CHANGELOG.md +24 -0
- package/configure/lib/choices.js +7 -3
- package/configure/lib/choices.js.map +1 -1
- package/configure/lib/main.js +57 -6
- package/configure/lib/main.js.map +1 -1
- package/configure/package.json +4 -4
- package/configure/utils.js +14 -0
- package/controller/CHANGELOG.md +8 -0
- package/controller/lib/index.js +31 -0
- package/controller/lib/index.js.map +1 -1
- package/controller/package.json +1 -1
- package/docs/config-schema.json +15 -0
- package/docs/config-schema.json.md +12 -0
- package/package.json +6 -6
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,30 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [3.13.10](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank@3.13.9...@pie-element/drag-in-the-blank@3.13.10) (2022-05-16)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @pie-element/drag-in-the-blank
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
## [3.13.9](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank@3.13.8...@pie-element/drag-in-the-blank@3.13.9) (2022-05-09)
|
|
15
|
+
|
|
16
|
+
**Note:** Version bump only for package @pie-element/drag-in-the-blank
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
## [3.13.8](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank@3.13.7...@pie-element/drag-in-the-blank@3.13.8) (2022-05-03)
|
|
23
|
+
|
|
24
|
+
**Note:** Version bump only for package @pie-element/drag-in-the-blank
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
6
30
|
## [3.13.7](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank@3.13.6...@pie-element/drag-in-the-blank@3.13.7) (2022-04-12)
|
|
7
31
|
|
|
8
32
|
**Note:** Version bump only for package @pie-element/drag-in-the-blank
|
package/configure/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,30 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [3.6.23](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank-configure@3.6.22...@pie-element/drag-in-the-blank-configure@3.6.23) (2022-05-16)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @pie-element/drag-in-the-blank-configure
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
## [3.6.22](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank-configure@3.6.21...@pie-element/drag-in-the-blank-configure@3.6.22) (2022-05-09)
|
|
15
|
+
|
|
16
|
+
**Note:** Version bump only for package @pie-element/drag-in-the-blank-configure
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
## [3.6.21](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank-configure@3.6.20...@pie-element/drag-in-the-blank-configure@3.6.21) (2022-05-03)
|
|
23
|
+
|
|
24
|
+
**Note:** Version bump only for package @pie-element/drag-in-the-blank-configure
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
6
30
|
## [3.6.20](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank-configure@3.6.19...@pie-element/drag-in-the-blank-configure@3.6.20) (2022-04-12)
|
|
7
31
|
|
|
8
32
|
**Note:** Version bump only for package @pie-element/drag-in-the-blank-configure
|
package/configure/lib/choices.js
CHANGED
|
@@ -288,7 +288,9 @@ var Choices = /*#__PURE__*/function (_React$Component) {
|
|
|
288
288
|
var _this$props5 = this.props,
|
|
289
289
|
classes = _this$props5.classes,
|
|
290
290
|
duplicates = _this$props5.duplicates,
|
|
291
|
-
toolbarOpts = _this$props5.toolbarOpts
|
|
291
|
+
toolbarOpts = _this$props5.toolbarOpts,
|
|
292
|
+
maxChoices = _this$props5.maxChoices,
|
|
293
|
+
choices = _this$props5.model.choices;
|
|
292
294
|
var visibleChoices = this.getVisibleChoices() || [];
|
|
293
295
|
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
294
296
|
className: classes.design
|
|
@@ -300,7 +302,8 @@ var Choices = /*#__PURE__*/function (_React$Component) {
|
|
|
300
302
|
className: classes.addButton,
|
|
301
303
|
variant: "contained",
|
|
302
304
|
color: "primary",
|
|
303
|
-
onClick: this.onAddChoice
|
|
305
|
+
onClick: this.onAddChoice,
|
|
306
|
+
disabled: maxChoices && choices && maxChoices === choices.length
|
|
304
307
|
}, "Add Choice"), /*#__PURE__*/_react["default"].createElement("div", {
|
|
305
308
|
className: classes.altChoices
|
|
306
309
|
}, visibleChoices.map(function (c, index) {
|
|
@@ -362,7 +365,8 @@ exports.Choices = Choices;
|
|
|
362
365
|
model: _propTypes["default"].object.isRequired,
|
|
363
366
|
onChange: _propTypes["default"].func.isRequired,
|
|
364
367
|
classes: _propTypes["default"].object.isRequired,
|
|
365
|
-
toolbarOpts: _propTypes["default"].object
|
|
368
|
+
toolbarOpts: _propTypes["default"].object,
|
|
369
|
+
maxChoices: _propTypes["default"].number
|
|
366
370
|
});
|
|
367
371
|
var Styled = (0, _styles.withStyles)(styles)(Choices);
|
|
368
372
|
var _default = Styled;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/choices.jsx"],"names":["window","renMath","renderMath","InfoDialog","open","title","onOk","propTypes","PropTypes","bool","func","string","styles","theme","design","marginTop","spacing","unit","altChoices","alignItems","display","flexWrap","justifyContent","padding","marginBottom","Choices","dialog","domNode","ReactDOM","findDOMNode","prevValue","val","key","props","onChange","model","choices","correctResponse","alternateResponses","duplicatedValue","find","c","value","id","newChoices","filter","setState","message","map","usedForResponse","Object","keys","forEach","responseKey","values","alternate","indexOf","alert","newChoicesWithoutTheEmptyOne","choice","focusedEl","oldChoices","length","duplicates","v","rerenderMath","focusedNodeRef","focus","state","classes","toolbarOpts","visibleChoices","getVisibleChoices","addButton","onAddChoice","index","minWidth","zIndex","ref","prompt","video","disabled","audio","onChoiceChanged","undefined","onChoiceFocus","handleChoiceRemove","React","Component","object","isRequired","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 Dialog from '@material-ui/core/Dialog';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport DialogActions from '@material-ui/core/DialogActions';\n\nwindow.renMath = renderMath;\n\nconst InfoDialog = ({ open, title, onOk }) => (\n <Dialog open={open}>\n <DialogTitle>{title || ''}</DialogTitle>\n <DialogActions>\n {onOk && (\n <Button onClick={onOk} color=\"primary\">\n OK\n </Button>\n )}\n </DialogActions>\n </Dialog>\n);\n\nInfoDialog.propTypes = {\n open: PropTypes.bool,\n onOk: PropTypes.func,\n title: PropTypes.string\n};\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 toolbarOpts: PropTypes.object\n };\n\n state = {\n dialog: {\n open: false\n }\n };\n\n componentDidMount() {\n this.rerenderMath();\n }\n\n componentDidUpdate() {\n this.rerenderMath();\n\n if (this.focusedNodeRef) {\n this.focusedNodeRef.focus('end');\n }\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({\n dialog: {\n open: true,\n message: 'Identical answer choices are not allowed and the changes will be discarded',\n onOk: () => this.setState({ dialog: { open: false }})\n }\n });\n\n return;\n }\n\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, dialog } = this.state;\n const {\n classes,\n duplicates,\n toolbarOpts\n } = this.props;\n const visibleChoices = this.getVisibleChoices() || [];\n\n return (\n <div className={classes.design}>\n <InfoDialog\n open={dialog.open}\n title={dialog.message}\n onOk={dialog.onOk}\n />\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 toolbarOpts={toolbarOpts}\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","InfoDialog","open","title","onOk","propTypes","PropTypes","bool","func","string","styles","theme","design","marginTop","spacing","unit","altChoices","alignItems","display","flexWrap","justifyContent","padding","marginBottom","Choices","dialog","domNode","ReactDOM","findDOMNode","prevValue","val","key","props","onChange","model","choices","correctResponse","alternateResponses","duplicatedValue","find","c","value","id","newChoices","filter","setState","message","map","usedForResponse","Object","keys","forEach","responseKey","values","alternate","indexOf","alert","newChoicesWithoutTheEmptyOne","choice","focusedEl","oldChoices","length","duplicates","v","rerenderMath","focusedNodeRef","focus","state","classes","toolbarOpts","maxChoices","visibleChoices","getVisibleChoices","addButton","onAddChoice","index","minWidth","zIndex","ref","prompt","video","disabled","audio","onChoiceChanged","undefined","onChoiceFocus","handleChoiceRemove","React","Component","object","isRequired","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 Dialog from '@material-ui/core/Dialog';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport DialogActions from '@material-ui/core/DialogActions';\n\nwindow.renMath = renderMath;\n\nconst InfoDialog = ({ open, title, onOk }) => (\n <Dialog open={open}>\n <DialogTitle>{title || ''}</DialogTitle>\n <DialogActions>\n {onOk && (\n <Button onClick={onOk} color=\"primary\">\n OK\n </Button>\n )}\n </DialogActions>\n </Dialog>\n);\n\nInfoDialog.propTypes = {\n open: PropTypes.bool,\n onOk: PropTypes.func,\n title: PropTypes.string\n};\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 toolbarOpts: PropTypes.object,\n maxChoices: PropTypes.number\n };\n\n state = {\n dialog: {\n open: false\n }\n };\n\n componentDidMount() {\n this.rerenderMath();\n }\n\n componentDidUpdate() {\n this.rerenderMath();\n\n if (this.focusedNodeRef) {\n this.focusedNodeRef.focus('end');\n }\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({\n dialog: {\n open: true,\n message: 'Identical answer choices are not allowed and the changes will be discarded',\n onOk: () => this.setState({ dialog: { open: false }})\n }\n });\n\n return;\n }\n\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, dialog } = this.state;\n const {\n classes,\n duplicates,\n toolbarOpts,\n maxChoices,\n model: { choices }\n } = this.props;\n const visibleChoices = this.getVisibleChoices() || [];\n\n return (\n <div className={classes.design}>\n <InfoDialog\n open={dialog.open}\n title={dialog.message}\n onOk={dialog.onOk}\n />\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 <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 toolbarOpts={toolbarOpts}\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"}
|
package/configure/lib/main.js
CHANGED
|
@@ -41,10 +41,16 @@ var _styles = require("@material-ui/core/styles");
|
|
|
41
41
|
|
|
42
42
|
var _Typography = _interopRequireDefault(require("@material-ui/core/Typography"));
|
|
43
43
|
|
|
44
|
+
var _Info = _interopRequireDefault(require("@material-ui/icons/Info"));
|
|
45
|
+
|
|
46
|
+
var _Tooltip = _interopRequireDefault(require("@material-ui/core/Tooltip"));
|
|
47
|
+
|
|
44
48
|
var _choices = _interopRequireDefault(require("./choices"));
|
|
45
49
|
|
|
46
50
|
var _markupUtils = require("./markupUtils");
|
|
47
51
|
|
|
52
|
+
var _utils = require("../utils");
|
|
53
|
+
|
|
48
54
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
49
55
|
|
|
50
56
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
@@ -99,6 +105,20 @@ var styles = function styles(theme) {
|
|
|
99
105
|
fontSize: '16px',
|
|
100
106
|
lineHeight: '19px',
|
|
101
107
|
color: '#495B8F'
|
|
108
|
+
},
|
|
109
|
+
tooltip: {
|
|
110
|
+
fontSize: '12px',
|
|
111
|
+
whiteSpace: 'pre',
|
|
112
|
+
maxWidth: '500px'
|
|
113
|
+
},
|
|
114
|
+
errorText: {
|
|
115
|
+
fontSize: '12px',
|
|
116
|
+
color: 'red',
|
|
117
|
+
padding: '5px 0'
|
|
118
|
+
},
|
|
119
|
+
flexContainer: {
|
|
120
|
+
display: 'flex',
|
|
121
|
+
alignItems: 'end'
|
|
102
122
|
}
|
|
103
123
|
};
|
|
104
124
|
};
|
|
@@ -193,16 +213,25 @@ var Main = /*#__PURE__*/function (_React$Component) {
|
|
|
193
213
|
_ref$choicesPosition = _ref.choicesPosition,
|
|
194
214
|
choicesPosition = _ref$choicesPosition === void 0 ? {} : _ref$choicesPosition,
|
|
195
215
|
_ref$spellCheck = _ref.spellCheck,
|
|
196
|
-
spellCheck = _ref$spellCheck === void 0 ? {} : _ref$spellCheck
|
|
216
|
+
spellCheck = _ref$spellCheck === void 0 ? {} : _ref$spellCheck,
|
|
217
|
+
maxChoices = _ref.maxChoices,
|
|
218
|
+
maxResponseAreas = _ref.maxResponseAreas;
|
|
197
219
|
|
|
198
220
|
var _ref2 = model || {},
|
|
199
221
|
rationaleEnabled = _ref2.rationaleEnabled,
|
|
200
222
|
promptEnabled = _ref2.promptEnabled,
|
|
201
223
|
teacherInstructionsEnabled = _ref2.teacherInstructionsEnabled,
|
|
202
|
-
spellCheckEnabled = _ref2.spellCheckEnabled
|
|
224
|
+
spellCheckEnabled = _ref2.spellCheckEnabled,
|
|
225
|
+
errors = _ref2.errors;
|
|
203
226
|
|
|
204
227
|
var toolbarOpts = {};
|
|
205
228
|
|
|
229
|
+
var _ref3 = errors || {},
|
|
230
|
+
responseAreasError = _ref3.responseAreasError,
|
|
231
|
+
choicesError = _ref3.choicesError;
|
|
232
|
+
|
|
233
|
+
var validationMessage = (0, _utils.generateValidationMessage)(configuration);
|
|
234
|
+
|
|
206
235
|
switch (model.toolbarEditorPosition) {
|
|
207
236
|
case 'top':
|
|
208
237
|
toolbarOpts.position = 'top';
|
|
@@ -263,9 +292,29 @@ var Main = /*#__PURE__*/function (_React$Component) {
|
|
|
263
292
|
disableUnderline: true,
|
|
264
293
|
toolbarOpts: toolbarOpts,
|
|
265
294
|
spellCheck: spellCheckEnabled
|
|
266
|
-
})), /*#__PURE__*/_react["default"].createElement(
|
|
295
|
+
})), /*#__PURE__*/_react["default"].createElement("div", {
|
|
296
|
+
className: classes.flexContainer
|
|
297
|
+
}, /*#__PURE__*/_react["default"].createElement(_Typography["default"], {
|
|
267
298
|
className: classes.text
|
|
268
|
-
}, "Define Template, Choices, and Correct Responses"), /*#__PURE__*/_react["default"].createElement(
|
|
299
|
+
}, "Define Template, Choices, and Correct Responses"), /*#__PURE__*/_react["default"].createElement(_Tooltip["default"], {
|
|
300
|
+
classes: {
|
|
301
|
+
tooltip: classes.tooltip
|
|
302
|
+
},
|
|
303
|
+
disableFocusListener: true,
|
|
304
|
+
disableTouchListener: true,
|
|
305
|
+
placement: 'right',
|
|
306
|
+
title: validationMessage
|
|
307
|
+
}, /*#__PURE__*/_react["default"].createElement(_Info["default"], {
|
|
308
|
+
fontSize: 'small',
|
|
309
|
+
color: 'primary',
|
|
310
|
+
style: {
|
|
311
|
+
marginLeft: '5px'
|
|
312
|
+
}
|
|
313
|
+
}))), responseAreasError && /*#__PURE__*/_react["default"].createElement("div", {
|
|
314
|
+
className: classes.errorText
|
|
315
|
+
}, responseAreasError), choicesError && /*#__PURE__*/_react["default"].createElement("div", {
|
|
316
|
+
className: classes.errorText
|
|
317
|
+
}, choicesError), /*#__PURE__*/_react["default"].createElement(_editableHtml["default"], (_React$createElement = {
|
|
269
318
|
activePlugins: _editableHtml.ALL_PLUGINS,
|
|
270
319
|
toolbarOpts: {
|
|
271
320
|
position: 'top'
|
|
@@ -274,7 +323,8 @@ var Main = /*#__PURE__*/function (_React$Component) {
|
|
|
274
323
|
type: 'drag-in-the-blank',
|
|
275
324
|
options: {
|
|
276
325
|
duplicates: model.duplicates
|
|
277
|
-
}
|
|
326
|
+
},
|
|
327
|
+
maxResponseAreas: maxResponseAreas
|
|
278
328
|
},
|
|
279
329
|
className: classes.markup,
|
|
280
330
|
markup: model.slateMarkup,
|
|
@@ -294,7 +344,8 @@ var Main = /*#__PURE__*/function (_React$Component) {
|
|
|
294
344
|
model: model,
|
|
295
345
|
duplicates: model.duplicates,
|
|
296
346
|
onChange: this.onResponsesChanged,
|
|
297
|
-
toolbarOpts: toolbarOpts
|
|
347
|
+
toolbarOpts: toolbarOpts,
|
|
348
|
+
maxChoices: maxChoices
|
|
298
349
|
}), rationaleEnabled && /*#__PURE__*/_react["default"].createElement(_configUi.InputContainer, {
|
|
299
350
|
label: rationale.label,
|
|
300
351
|
className: classes.promptHolder
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/main.jsx"],"names":["dropdown","settings","toggle","Panel","styles","theme","promptHolder","width","paddingBottom","spacing","unit","marginBottom","prompt","paddingTop","markup","minHeight","design","choiceConfiguration","switchElement","justifyContent","margin","addButton","text","fontFamily","fontSize","lineHeight","color","Main","newVal","props","onModelChanged","model","rationale","teacherInstructions","slateMarkup","choices","correctResponse","domNode","ReactDOM","findDOMNode","classes","configuration","onConfigurationChanged","imageSupport","duplicates","partialScoring","lockChoiceOrder","choicesPosition","spellCheck","rationaleEnabled","promptEnabled","teacherInstructionsEnabled","spellCheckEnabled","toolbarOpts","toolbarEditorPosition","position","onModelChange","Settings","label","Properties","onTeacherInstructionsChanged","onPromptChanged","ALL_PLUGINS","type","options","onMarkupChanged","audio","disabled","video","onResponsesChanged","onRationaleChanged","React","Component","PropTypes","object","isRequired","disableSidePanel","bool","func","shape","add","Styled"],"mappings":"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","sourcesContent":["import React from 'react';\nimport ReactDOM from 'react-dom';\nimport PropTypes from 'prop-types';\nimport EditableHtml, { ALL_PLUGINS } from '@pie-lib/editable-html';\nimport { InputContainer, layout, settings } from '@pie-lib/config-ui';\nimport { withDragContext } from '@pie-lib/drag';\nimport { renderMath } from '@pie-lib/math-rendering';\nimport { withStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\n\nimport Choices from './choices';\nimport { createSlateMarkup } from './markupUtils';\nconst { dropdown, toggle, Panel } = settings;\n\nconst styles = theme => ({\n promptHolder: {\n width: '100%',\n paddingBottom: theme.spacing.unit * 2,\n marginBottom: theme.spacing.unit * 2\n },\n prompt: {\n paddingTop: theme.spacing.unit * 2,\n width: '100%'\n },\n markup: {\n minHeight: '235px',\n paddingTop: theme.spacing.unit * 2,\n width: '100%',\n '& [data-slate-editor=\"true\"]': {\n minHeight: '235px'\n }\n },\n design: {\n paddingTop: theme.spacing.unit * 3\n },\n choiceConfiguration: {\n paddingTop: theme.spacing.unit * 2,\n paddingBottom: theme.spacing.unit * 2\n },\n switchElement: {\n justifyContent: 'space-between',\n margin: 0\n },\n addButton: {\n float: 'right'\n },\n text: {\n fontFamily: 'Cerebri Sans',\n fontSize: '16px',\n lineHeight: '19px',\n color: '#495B8F'\n }\n});\n\nexport class Main extends React.Component {\n static propTypes = {\n configuration: PropTypes.object.isRequired,\n model: PropTypes.object.isRequired,\n disableSidePanel: PropTypes.bool,\n onModelChanged: PropTypes.func.isRequired,\n onConfigurationChanged: PropTypes.func.isRequired,\n classes: PropTypes.object.isRequired,\n imageSupport: PropTypes.shape({\n add: PropTypes.func.isRequired,\n delete: PropTypes.func.isRequired\n })\n };\n\n state = {};\n\n componentDidUpdate() {\n // eslint-disable-next-line\n const domNode = ReactDOM.findDOMNode(this);\n\n renderMath(domNode);\n }\n\n onModelChange = newVal => {\n this.props.onModelChanged({\n ...this.props.model,\n ...newVal\n });\n };\n\n onPromptChanged = prompt => {\n this.props.onModelChanged({\n ...this.props.model,\n prompt\n });\n };\n\n onRationaleChanged = rationale => {\n this.props.onModelChanged({\n ...this.props.model,\n rationale\n });\n };\n\n onTeacherInstructionsChanged = teacherInstructions => {\n this.props.onModelChanged({\n ...this.props.model,\n teacherInstructions\n });\n };\n\n onMarkupChanged = slateMarkup => {\n this.props.onModelChanged({\n ...this.props.model,\n slateMarkup\n });\n };\n\n onResponsesChanged = choices => {\n const {\n model: { correctResponse, markup }\n } = this.props;\n const slateMarkup = createSlateMarkup(markup, choices, correctResponse);\n\n this.props.onModelChanged({\n ...this.props.model,\n slateMarkup,\n choices\n });\n };\n\n render() {\n const {\n classes,\n model,\n configuration,\n onConfigurationChanged,\n imageSupport\n } = this.props;\n const {\n duplicates = {},\n prompt = {},\n partialScoring = {},\n lockChoiceOrder = {},\n rationale = {},\n teacherInstructions = {},\n choicesPosition = {},\n spellCheck = {}\n } = configuration || {};\n const { rationaleEnabled, promptEnabled, teacherInstructionsEnabled, spellCheckEnabled } =\n model || {};\n const toolbarOpts = {};\n\n switch (model.toolbarEditorPosition) {\n case 'top':\n toolbarOpts.position = 'top';\n break;\n default:\n toolbarOpts.position = 'bottom';\n break;\n }\n return (\n <div className={classes.design}>\n <layout.ConfigLayout\n settings={\n <Panel\n model={model}\n configuration={configuration}\n onChangeModel={model => this.onModelChange(model)}\n onChangeConfiguration={configuration =>\n onConfigurationChanged(configuration, true)\n }\n groups={{\n Settings: {\n partialScoring:\n partialScoring.settings && toggle(partialScoring.label),\n duplicates: duplicates.settings && toggle(duplicates.label),\n lockChoiceOrder:\n lockChoiceOrder.settings && toggle(lockChoiceOrder.label),\n choicesPosition:\n choicesPosition.settings &&\n dropdown(choicesPosition.label, [\n 'above',\n 'below',\n 'left',\n 'right'\n ])\n },\n Properties: {\n teacherInstructionsEnabled:\n teacherInstructions.settings &&\n toggle(teacherInstructions.label),\n rationaleEnabled:\n rationale.settings && toggle(rationale.label),\n spellCheckEnabled:\n spellCheck.settings && toggle(spellCheck.label),\n promptEnabled: prompt.settings && toggle(prompt.label)\n }\n }}\n />\n }\n >\n <div>\n {teacherInstructionsEnabled && (\n <InputContainer\n label={teacherInstructions.label}\n className={classes.promptHolder}\n >\n <EditableHtml\n className={classes.prompt}\n markup={model.teacherInstructions || ''}\n onChange={this.onTeacherInstructionsChanged}\n imageSupport={imageSupport}\n nonEmpty={false}\n toolbarOpts={toolbarOpts}\n spellCheck={spellCheckEnabled}\n />\n </InputContainer>\n )}\n {promptEnabled && (\n <InputContainer\n label={prompt.label}\n className={classes.promptHolder}\n >\n <EditableHtml\n className={classes.prompt}\n markup={model.prompt}\n onChange={this.onPromptChanged}\n imageSupport={imageSupport}\n nonEmpty={false}\n disableUnderline\n toolbarOpts={toolbarOpts}\n spellCheck={spellCheckEnabled}\n />\n </InputContainer>\n )}\n <Typography className={classes.text}>\n Define Template, Choices, and Correct Responses\n </Typography>\n <EditableHtml\n activePlugins={ALL_PLUGINS}\n toolbarOpts={{ position: 'top' }}\n responseAreaProps={{\n type: 'drag-in-the-blank',\n options: {\n duplicates: model.duplicates\n }\n }}\n className={classes.markup}\n markup={model.slateMarkup}\n onChange={this.onMarkupChanged}\n imageSupport={imageSupport}\n nonEmpty={false}\n disableUnderline\n pluginProps={{\n audio: { disabled: true },\n video: { disabled: true }\n }}\n toolbarOpts={toolbarOpts}\n spellCheck={spellCheckEnabled}\n />\n <Choices\n model={model}\n duplicates={model.duplicates}\n onChange={this.onResponsesChanged}\n toolbarOpts={toolbarOpts}\n />\n {rationaleEnabled && (\n <InputContainer\n label={rationale.label}\n className={classes.promptHolder}\n >\n <EditableHtml\n className={classes.prompt}\n markup={model.rationale || ''}\n onChange={this.onRationaleChanged}\n imageSupport={imageSupport}\n toolbarOpts={toolbarOpts}\n spellCheck={spellCheckEnabled}\n />\n </InputContainer>\n )}\n </div>\n </layout.ConfigLayout>\n </div>\n );\n }\n}\n\nconst Styled = withStyles(styles)(Main);\n\nexport default withDragContext(Styled);\n"],"file":"main.js"}
|
|
1
|
+
{"version":3,"sources":["../src/main.jsx"],"names":["dropdown","settings","toggle","Panel","styles","theme","promptHolder","width","paddingBottom","spacing","unit","marginBottom","prompt","paddingTop","markup","minHeight","design","choiceConfiguration","switchElement","justifyContent","margin","addButton","text","fontFamily","fontSize","lineHeight","color","tooltip","whiteSpace","maxWidth","errorText","padding","flexContainer","display","alignItems","Main","newVal","props","onModelChanged","model","rationale","teacherInstructions","slateMarkup","choices","correctResponse","domNode","ReactDOM","findDOMNode","classes","configuration","onConfigurationChanged","imageSupport","duplicates","partialScoring","lockChoiceOrder","choicesPosition","spellCheck","maxChoices","maxResponseAreas","rationaleEnabled","promptEnabled","teacherInstructionsEnabled","spellCheckEnabled","errors","toolbarOpts","responseAreasError","choicesError","validationMessage","toolbarEditorPosition","position","onModelChange","Settings","label","Properties","onTeacherInstructionsChanged","onPromptChanged","marginLeft","ALL_PLUGINS","type","options","onMarkupChanged","audio","disabled","video","onResponsesChanged","onRationaleChanged","React","Component","PropTypes","object","isRequired","disableSidePanel","bool","func","shape","add","Styled"],"mappings":"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","sourcesContent":["import React from 'react';\nimport ReactDOM from 'react-dom';\nimport PropTypes from 'prop-types';\nimport EditableHtml, { ALL_PLUGINS } from '@pie-lib/editable-html';\nimport { InputContainer, layout, settings } from '@pie-lib/config-ui';\nimport { withDragContext } from '@pie-lib/drag';\nimport { renderMath } from '@pie-lib/math-rendering';\nimport { withStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport Info from '@material-ui/icons/Info';\nimport Tooltip from '@material-ui/core/Tooltip';\n\nimport Choices from './choices';\nimport { createSlateMarkup } from './markupUtils';\nimport {generateValidationMessage} from '../utils';\nconst { dropdown, toggle, Panel } = settings;\n\nconst styles = theme => ({\n promptHolder: {\n width: '100%',\n paddingBottom: theme.spacing.unit * 2,\n marginBottom: theme.spacing.unit * 2\n },\n prompt: {\n paddingTop: theme.spacing.unit * 2,\n width: '100%'\n },\n markup: {\n minHeight: '235px',\n paddingTop: theme.spacing.unit * 2,\n width: '100%',\n '& [data-slate-editor=\"true\"]': {\n minHeight: '235px'\n }\n },\n design: {\n paddingTop: theme.spacing.unit * 3\n },\n choiceConfiguration: {\n paddingTop: theme.spacing.unit * 2,\n paddingBottom: theme.spacing.unit * 2\n },\n switchElement: {\n justifyContent: 'space-between',\n margin: 0\n },\n addButton: {\n float: 'right'\n },\n text: {\n fontFamily: 'Cerebri Sans',\n fontSize: '16px',\n lineHeight: '19px',\n color: '#495B8F'\n },\n tooltip: {\n fontSize: '12px',\n whiteSpace: 'pre',\n maxWidth: '500px',\n },\n errorText: {\n fontSize: '12px',\n color: 'red',\n padding: '5px 0'\n },\n flexContainer: {\n display: 'flex',\n alignItems: 'end'\n }\n});\n\nexport class Main extends React.Component {\n static propTypes = {\n configuration: PropTypes.object.isRequired,\n model: PropTypes.object.isRequired,\n disableSidePanel: PropTypes.bool,\n onModelChanged: PropTypes.func.isRequired,\n onConfigurationChanged: PropTypes.func.isRequired,\n classes: PropTypes.object.isRequired,\n imageSupport: PropTypes.shape({\n add: PropTypes.func.isRequired,\n delete: PropTypes.func.isRequired\n })\n };\n\n state = {};\n\n componentDidUpdate() {\n // eslint-disable-next-line\n const domNode = ReactDOM.findDOMNode(this);\n\n renderMath(domNode);\n }\n\n onModelChange = newVal => {\n this.props.onModelChanged({\n ...this.props.model,\n ...newVal\n });\n };\n\n onPromptChanged = prompt => {\n this.props.onModelChanged({\n ...this.props.model,\n prompt\n });\n };\n\n onRationaleChanged = rationale => {\n this.props.onModelChanged({\n ...this.props.model,\n rationale\n });\n };\n\n onTeacherInstructionsChanged = teacherInstructions => {\n this.props.onModelChanged({\n ...this.props.model,\n teacherInstructions\n });\n };\n\n onMarkupChanged = slateMarkup => {\n this.props.onModelChanged({\n ...this.props.model,\n slateMarkup\n });\n };\n\n onResponsesChanged = choices => {\n const {\n model: { correctResponse, markup }\n } = this.props;\n const slateMarkup = createSlateMarkup(markup, choices, correctResponse);\n\n this.props.onModelChanged({\n ...this.props.model,\n slateMarkup,\n choices\n });\n };\n\n render() {\n const {\n classes,\n model,\n configuration,\n onConfigurationChanged,\n imageSupport\n } = this.props;\n const {\n duplicates = {},\n prompt = {},\n partialScoring = {},\n lockChoiceOrder = {},\n rationale = {},\n teacherInstructions = {},\n choicesPosition = {},\n spellCheck = {},\n maxChoices,\n maxResponseAreas\n } = configuration || {};\n const { rationaleEnabled, promptEnabled, teacherInstructionsEnabled, spellCheckEnabled, errors } =\n model || {};\n const toolbarOpts = {};\n\n const { responseAreasError, choicesError } = errors || {};\n const validationMessage = generateValidationMessage(configuration);\n\n switch (model.toolbarEditorPosition) {\n case 'top':\n toolbarOpts.position = 'top';\n break;\n default:\n toolbarOpts.position = 'bottom';\n break;\n }\n return (\n <div className={classes.design}>\n <layout.ConfigLayout\n settings={\n <Panel\n model={model}\n configuration={configuration}\n onChangeModel={model => this.onModelChange(model)}\n onChangeConfiguration={configuration =>\n onConfigurationChanged(configuration, true)\n }\n groups={{\n Settings: {\n partialScoring:\n partialScoring.settings && toggle(partialScoring.label),\n duplicates: duplicates.settings && toggle(duplicates.label),\n lockChoiceOrder:\n lockChoiceOrder.settings && toggle(lockChoiceOrder.label),\n choicesPosition:\n choicesPosition.settings &&\n dropdown(choicesPosition.label, [\n 'above',\n 'below',\n 'left',\n 'right'\n ])\n },\n Properties: {\n teacherInstructionsEnabled:\n teacherInstructions.settings &&\n toggle(teacherInstructions.label),\n rationaleEnabled:\n rationale.settings && toggle(rationale.label),\n spellCheckEnabled:\n spellCheck.settings && toggle(spellCheck.label),\n promptEnabled: prompt.settings && toggle(prompt.label)\n }\n }}\n />\n }\n >\n <div>\n {teacherInstructionsEnabled && (\n <InputContainer\n label={teacherInstructions.label}\n className={classes.promptHolder}\n >\n <EditableHtml\n className={classes.prompt}\n markup={model.teacherInstructions || ''}\n onChange={this.onTeacherInstructionsChanged}\n imageSupport={imageSupport}\n nonEmpty={false}\n toolbarOpts={toolbarOpts}\n spellCheck={spellCheckEnabled}\n />\n </InputContainer>\n )}\n {promptEnabled && (\n <InputContainer\n label={prompt.label}\n className={classes.promptHolder}\n >\n <EditableHtml\n className={classes.prompt}\n markup={model.prompt}\n onChange={this.onPromptChanged}\n imageSupport={imageSupport}\n nonEmpty={false}\n disableUnderline\n toolbarOpts={toolbarOpts}\n spellCheck={spellCheckEnabled}\n />\n </InputContainer>\n )}\n <div className={classes.flexContainer}>\n <Typography className={classes.text}>\n Define Template, Choices, and Correct Responses\n </Typography>\n <Tooltip\n classes={{tooltip: classes.tooltip}}\n disableFocusListener\n disableTouchListener\n placement={'right'}\n title={validationMessage}\n >\n <Info fontSize={'small'} color={'primary'} style={{marginLeft: '5px'}}/>\n </Tooltip>\n </div>\n {responseAreasError && <div className={classes.errorText}>{responseAreasError}</div>}\n {choicesError && <div className={classes.errorText}>{choicesError}</div>}\n <EditableHtml\n activePlugins={ALL_PLUGINS}\n toolbarOpts={{ position: 'top' }}\n responseAreaProps={{\n type: 'drag-in-the-blank',\n options: {\n duplicates: model.duplicates\n },\n maxResponseAreas: maxResponseAreas,\n }}\n className={classes.markup}\n markup={model.slateMarkup}\n onChange={this.onMarkupChanged}\n imageSupport={imageSupport}\n nonEmpty={false}\n disableUnderline\n pluginProps={{\n audio: { disabled: true },\n video: { disabled: true }\n }}\n toolbarOpts={toolbarOpts}\n spellCheck={spellCheckEnabled}\n />\n <Choices\n model={model}\n duplicates={model.duplicates}\n onChange={this.onResponsesChanged}\n toolbarOpts={toolbarOpts}\n maxChoices={maxChoices}\n />\n {rationaleEnabled && (\n <InputContainer\n label={rationale.label}\n className={classes.promptHolder}\n >\n <EditableHtml\n className={classes.prompt}\n markup={model.rationale || ''}\n onChange={this.onRationaleChanged}\n imageSupport={imageSupport}\n toolbarOpts={toolbarOpts}\n spellCheck={spellCheckEnabled}\n />\n </InputContainer>\n )}\n </div>\n </layout.ConfigLayout>\n </div>\n );\n }\n}\n\nconst Styled = withStyles(styles)(Main);\n\nexport default withDragContext(Styled);\n"],"file":"main.js"}
|
package/configure/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pie-element/drag-in-the-blank-configure",
|
|
3
|
-
"version": "3.6.
|
|
3
|
+
"version": "3.6.23",
|
|
4
4
|
"private": true,
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"module": "src/index.js",
|
|
@@ -8,10 +8,10 @@
|
|
|
8
8
|
"@material-ui/core": "^3.9.2",
|
|
9
9
|
"@material-ui/icons": "^3.0.1",
|
|
10
10
|
"@pie-framework/pie-configure-events": "^1.2.0",
|
|
11
|
-
"@pie-lib/config-ui": "^10.
|
|
11
|
+
"@pie-lib/config-ui": "^10.13.0",
|
|
12
12
|
"@pie-lib/drag": "^1.1.52",
|
|
13
|
-
"@pie-lib/editable-html": "^7.
|
|
14
|
-
"@pie-lib/math-rendering": "^2.
|
|
13
|
+
"@pie-lib/editable-html": "^7.22.3",
|
|
14
|
+
"@pie-lib/math-rendering": "^2.4.0",
|
|
15
15
|
"debug": "^3.1.0",
|
|
16
16
|
"lodash": "^4.17.15",
|
|
17
17
|
"prop-types": "^15.6.2",
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export const generateValidationMessage = config => {
|
|
2
|
+
let { maxResponseAreas, minChoices, maxChoices } = config;
|
|
3
|
+
minChoices = minChoices || 3;
|
|
4
|
+
|
|
5
|
+
const responseAreasMessage = '\nThe tokens should ' +
|
|
6
|
+
'not be empty and should be unique.\nThere should be at least 1 ' +
|
|
7
|
+
(maxResponseAreas ? `and at most ${maxResponseAreas} ` : '') +
|
|
8
|
+
'response area' + (maxResponseAreas ? 's' : '') + ' defined.' +
|
|
9
|
+
`\nThere should be at least ${minChoices} ` +
|
|
10
|
+
(maxChoices ? `and at most ${maxChoices} ` : '') +
|
|
11
|
+
'tokens defined.';
|
|
12
|
+
|
|
13
|
+
return 'Validation requirements:' + responseAreasMessage;
|
|
14
|
+
};
|
package/controller/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,14 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [3.3.22](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank-controller@3.3.21...@pie-element/drag-in-the-blank-controller@3.3.22) (2022-05-16)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @pie-element/drag-in-the-blank-controller
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
6
14
|
## [3.3.18](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank-controller@3.3.16...@pie-element/drag-in-the-blank-controller@3.3.18) (2021-11-11)
|
|
7
15
|
|
|
8
16
|
**Note:** Version bump only for package @pie-element/drag-in-the-blank-controller
|
package/controller/lib/index.js
CHANGED
|
@@ -9,6 +9,7 @@ exports.getScore = exports.createCorrectResponseSession = void 0;
|
|
|
9
9
|
exports.model = model;
|
|
10
10
|
exports.normalize = void 0;
|
|
11
11
|
exports.outcome = outcome;
|
|
12
|
+
exports.validate = void 0;
|
|
12
13
|
|
|
13
14
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
14
15
|
|
|
@@ -233,4 +234,34 @@ var createCorrectResponseSession = function createCorrectResponseSession(questio
|
|
|
233
234
|
};
|
|
234
235
|
|
|
235
236
|
exports.createCorrectResponseSession = createCorrectResponseSession;
|
|
237
|
+
|
|
238
|
+
var validate = function validate() {
|
|
239
|
+
var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
240
|
+
var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
241
|
+
var choices = model.choices,
|
|
242
|
+
markup = model.markup;
|
|
243
|
+
var _config$minChoices = config.minChoices,
|
|
244
|
+
minChoices = _config$minChoices === void 0 ? 2 : _config$minChoices,
|
|
245
|
+
maxChoices = config.maxChoices,
|
|
246
|
+
maxResponseAreas = config.maxResponseAreas;
|
|
247
|
+
var errors = {};
|
|
248
|
+
var nbOfResponseAreas = (markup.match(/\{\{(\d+)\}\}/g) || []).length;
|
|
249
|
+
var nbOfChoices = (choices || []).length;
|
|
250
|
+
|
|
251
|
+
if (nbOfResponseAreas > maxResponseAreas) {
|
|
252
|
+
errors.responseAreasError = "No more than ".concat(maxResponseAreas, " response areas should be defined.");
|
|
253
|
+
} else if (nbOfResponseAreas < 1) {
|
|
254
|
+
errors.responseAreasError = 'There should be at least 1 response area defined.';
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
if (nbOfChoices < minChoices) {
|
|
258
|
+
errors.choicesError = "There should be at least ".concat(minChoices, " choices defined.");
|
|
259
|
+
} else if (nbOfChoices > maxChoices) {
|
|
260
|
+
errors.choicesError = "No more than ".concat(maxChoices, " choices should be defined.");
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
return errors;
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
exports.validate = validate;
|
|
236
267
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.js"],"names":["normalize","question","rationaleEnabled","promptEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","model","session","env","updateSession","Promise","resolve","normalizedQuestion","feedback","mode","responses","allCorrectResponses","possibleResponses","numberOfPossibleResponses","correctResponses","undefined","value","i","result","obj","choices","key","answer","filter","choice","lockChoiceOrder","out","prompt","disabled","responseCorrect","getScore","role","rationale","teacherInstructions","config","maxScore","Object","keys","correctResponse","length","correctCount","total","str","toFixed","parseFloat","outcome","partialScoringEnabled","partialScoring","enabled","score","empty","createCorrectResponseSession","id"],"mappings":"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","sourcesContent":["import reduce from 'lodash/reduce';\nimport isEmpty from 'lodash/isEmpty';\nimport { getAllCorrectResponses, choiceIsEmpty } from './utils';\nimport { lockChoices, getShuffledChoices, partialScoring } from '@pie-lib/controller-utils';\n\nexport const normalize = question => ({\n rationaleEnabled: true,\n promptEnabled: true,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n ...question,\n});\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n * @param {*} updateSession - optional - a function that will set the properties passed into it on the session.\n */\nexport function model(question, session, env, updateSession) {\n return new Promise(async resolve => {\n const normalizedQuestion = normalize(question);\n let feedback = {};\n\n if (env.mode === 'evaluate') {\n const responses = getAllCorrectResponses(normalizedQuestion) || {};\n const allCorrectResponses = responses.possibleResponses;\n const numberOfPossibleResponses = responses.numberOfPossibleResponses || 0;\n let correctResponses = undefined;\n const { value } = session || {};\n\n for (let i = 0; i < numberOfPossibleResponses; i++) {\n const result = reduce(allCorrectResponses, (obj, choices, key) => {\n const answer = (value && value[key]) || '';\n\n obj.feedback[key] = choices[i] === answer;\n\n if (obj.feedback[key]) {\n obj.correctResponses += 1;\n }\n\n return obj;\n }, { correctResponses: 0, feedback: {} });\n\n if (correctResponses === undefined || result.correctResponses > correctResponses) {\n correctResponses = result.correctResponses;\n feedback = result.feedback;\n }\n\n if (result.correctResponses === numberOfPossibleResponses) {\n break;\n }\n }\n }\n\n let choices = normalizedQuestion.choices && normalizedQuestion.choices.filter(choice => !choiceIsEmpty(choice));\n\n const lockChoiceOrder = lockChoices(normalizedQuestion, session, env);\n\n if (!lockChoiceOrder) {\n choices = await getShuffledChoices(choices, session, updateSession, 'id');\n }\n\n const out = {\n ...normalizedQuestion,\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n choices,\n feedback,\n mode: env.mode,\n disabled: env.mode !== 'gather',\n responseCorrect:\n env.mode === 'evaluate'\n ? getScore(normalizedQuestion, session) === 1\n : undefined,\n };\n\n if (\n env.role === 'instructor' &&\n (env.mode === 'view' || env.mode === 'evaluate')\n ) {\n out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled ? normalizedQuestion.teacherInstructions : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n resolve(out);\n });\n}\n\nexport const getScore = (config, session) => {\n const responses = getAllCorrectResponses(config);\n const allCorrectResponses = responses.possibleResponses;\n const maxScore = Object.keys(config.correctResponse).length;\n const numberOfPossibleResponses = responses.numberOfPossibleResponses || 0;\n let correctCount = 0;\n const { value } = session || {};\n\n for (let i = 0; i < numberOfPossibleResponses; i++) {\n const result = reduce(allCorrectResponses, (total, choices, key) => {\n const answer = (value && value[key]) || '';\n\n if (choices[i] === answer) {\n return total;\n }\n\n return total - 1;\n }, maxScore);\n\n if (result > correctCount) {\n correctCount = result;\n }\n\n if (result === maxScore) {\n break;\n }\n }\n\n const str = maxScore ? (correctCount / maxScore).toFixed(2) : 0;\n\n return parseFloat(str);\n};\n\n/**\n *\n * The score is partial by default for checkbox mode, allOrNothing for radio mode.\n * To disable partial scoring for checkbox mode you either set model.partialScoring = false or env.partialScoring =\n * false. the value in `env` will override the value in `model`.\n * @param {Object} model - the main model\n * @param {boolean} model.partialScoring - is partial scoring enabled (if undefined set to to true)\n * @param {*} session\n * @param {Object} env\n * @param {boolean} env.partialScoring - is partial scoring enabled (if undefined default to true) This overrides\n * `model.partialScoring`.\n */\nexport function outcome(model, session, env = {}) {\n return new Promise(resolve => {\n const partialScoringEnabled = partialScoring.enabled(model, env);\n const score = getScore(model, session);\n\n resolve({\n score: partialScoringEnabled ? score : score === 1 ? 1 : 0,\n empty: !session || isEmpty(session)\n });\n });\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise(resolve => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n resolve({\n value: question.correctResponse,\n id: '1'\n });\n } else {\n resolve(null);\n }\n });\n};\n"],"file":"index.js"}
|
|
1
|
+
{"version":3,"sources":["../src/index.js"],"names":["normalize","question","rationaleEnabled","promptEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","model","session","env","updateSession","Promise","resolve","normalizedQuestion","feedback","mode","responses","allCorrectResponses","possibleResponses","numberOfPossibleResponses","correctResponses","undefined","value","i","result","obj","choices","key","answer","filter","choice","lockChoiceOrder","out","prompt","disabled","responseCorrect","getScore","role","rationale","teacherInstructions","config","maxScore","Object","keys","correctResponse","length","correctCount","total","str","toFixed","parseFloat","outcome","partialScoringEnabled","partialScoring","enabled","score","empty","createCorrectResponseSession","id","validate","markup","minChoices","maxChoices","maxResponseAreas","errors","nbOfResponseAreas","match","nbOfChoices","responseAreasError","choicesError"],"mappings":"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","sourcesContent":["import reduce from 'lodash/reduce';\nimport isEmpty from 'lodash/isEmpty';\nimport { getAllCorrectResponses, choiceIsEmpty } from './utils';\nimport { lockChoices, getShuffledChoices, partialScoring } from '@pie-lib/controller-utils';\n\nexport const normalize = question => ({\n rationaleEnabled: true,\n promptEnabled: true,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n ...question,\n});\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n * @param {*} updateSession - optional - a function that will set the properties passed into it on the session.\n */\nexport function model(question, session, env, updateSession) {\n return new Promise(async resolve => {\n const normalizedQuestion = normalize(question);\n let feedback = {};\n\n if (env.mode === 'evaluate') {\n const responses = getAllCorrectResponses(normalizedQuestion) || {};\n const allCorrectResponses = responses.possibleResponses;\n const numberOfPossibleResponses = responses.numberOfPossibleResponses || 0;\n let correctResponses = undefined;\n const { value } = session || {};\n\n for (let i = 0; i < numberOfPossibleResponses; i++) {\n const result = reduce(allCorrectResponses, (obj, choices, key) => {\n const answer = (value && value[key]) || '';\n\n obj.feedback[key] = choices[i] === answer;\n\n if (obj.feedback[key]) {\n obj.correctResponses += 1;\n }\n\n return obj;\n }, { correctResponses: 0, feedback: {} });\n\n if (correctResponses === undefined || result.correctResponses > correctResponses) {\n correctResponses = result.correctResponses;\n feedback = result.feedback;\n }\n\n if (result.correctResponses === numberOfPossibleResponses) {\n break;\n }\n }\n }\n\n let choices = normalizedQuestion.choices && normalizedQuestion.choices.filter(choice => !choiceIsEmpty(choice));\n\n const lockChoiceOrder = lockChoices(normalizedQuestion, session, env);\n\n if (!lockChoiceOrder) {\n choices = await getShuffledChoices(choices, session, updateSession, 'id');\n }\n\n const out = {\n ...normalizedQuestion,\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n choices,\n feedback,\n mode: env.mode,\n disabled: env.mode !== 'gather',\n responseCorrect:\n env.mode === 'evaluate'\n ? getScore(normalizedQuestion, session) === 1\n : undefined,\n };\n\n if (\n env.role === 'instructor' &&\n (env.mode === 'view' || env.mode === 'evaluate')\n ) {\n out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled ? normalizedQuestion.teacherInstructions : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n resolve(out);\n });\n}\n\nexport const getScore = (config, session) => {\n const responses = getAllCorrectResponses(config);\n const allCorrectResponses = responses.possibleResponses;\n const maxScore = Object.keys(config.correctResponse).length;\n const numberOfPossibleResponses = responses.numberOfPossibleResponses || 0;\n let correctCount = 0;\n const { value } = session || {};\n\n for (let i = 0; i < numberOfPossibleResponses; i++) {\n const result = reduce(allCorrectResponses, (total, choices, key) => {\n const answer = (value && value[key]) || '';\n\n if (choices[i] === answer) {\n return total;\n }\n\n return total - 1;\n }, maxScore);\n\n if (result > correctCount) {\n correctCount = result;\n }\n\n if (result === maxScore) {\n break;\n }\n }\n\n const str = maxScore ? (correctCount / maxScore).toFixed(2) : 0;\n\n return parseFloat(str);\n};\n\n/**\n *\n * The score is partial by default for checkbox mode, allOrNothing for radio mode.\n * To disable partial scoring for checkbox mode you either set model.partialScoring = false or env.partialScoring =\n * false. the value in `env` will override the value in `model`.\n * @param {Object} model - the main model\n * @param {boolean} model.partialScoring - is partial scoring enabled (if undefined set to to true)\n * @param {*} session\n * @param {Object} env\n * @param {boolean} env.partialScoring - is partial scoring enabled (if undefined default to true) This overrides\n * `model.partialScoring`.\n */\nexport function outcome(model, session, env = {}) {\n return new Promise(resolve => {\n const partialScoringEnabled = partialScoring.enabled(model, env);\n const score = getScore(model, session);\n\n resolve({\n score: partialScoringEnabled ? score : score === 1 ? 1 : 0,\n empty: !session || isEmpty(session)\n });\n });\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise(resolve => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n resolve({\n value: question.correctResponse,\n id: '1'\n });\n } else {\n resolve(null);\n }\n });\n};\n\nexport const validate = (model = {}, config = {}) => {\n const { choices, markup } = model;\n const { minChoices = 2, maxChoices, maxResponseAreas } = config;\n const errors = {};\n\n const nbOfResponseAreas = (markup.match(/\\{\\{(\\d+)\\}\\}/g) || []).length;\n const nbOfChoices = (choices || []).length;\n\n if (nbOfResponseAreas > maxResponseAreas) {\n errors.responseAreasError = `No more than ${maxResponseAreas} response areas should be defined.`;\n } else if (nbOfResponseAreas < 1) {\n errors.responseAreasError = 'There should be at least 1 response area defined.';\n }\n\n if (nbOfChoices < minChoices) {\n errors.choicesError = `There should be at least ${minChoices} choices defined.`;\n } else if (nbOfChoices > maxChoices) {\n errors.choicesError = `No more than ${maxChoices} choices should be defined.`;\n }\n\n return errors;\n};\n"],"file":"index.js"}
|
package/controller/package.json
CHANGED
package/docs/config-schema.json
CHANGED
|
@@ -131,6 +131,21 @@
|
|
|
131
131
|
}
|
|
132
132
|
}
|
|
133
133
|
},
|
|
134
|
+
"minChoices": {
|
|
135
|
+
"description": "Minimum number of choices",
|
|
136
|
+
"type": "number",
|
|
137
|
+
"title": "minChoices"
|
|
138
|
+
},
|
|
139
|
+
"maxChoices": {
|
|
140
|
+
"description": "Maximum number of choices",
|
|
141
|
+
"type": "number",
|
|
142
|
+
"title": "maxChoices"
|
|
143
|
+
},
|
|
144
|
+
"maxResponseAreas": {
|
|
145
|
+
"description": "Maximum number of response areas",
|
|
146
|
+
"type": "number",
|
|
147
|
+
"title": "maxResponseAreas"
|
|
148
|
+
},
|
|
134
149
|
"showPrompt": {
|
|
135
150
|
"description": "Determines whether prompt field will be displayed or not",
|
|
136
151
|
"default": true,
|
|
@@ -98,6 +98,18 @@ Indicates if the item has to be displayed in the Settings Panel
|
|
|
98
98
|
|
|
99
99
|
Indicates the label for the item that has to be displayed in the Settings Panel
|
|
100
100
|
|
|
101
|
+
# `minChoices` (number)
|
|
102
|
+
|
|
103
|
+
Minimum number of choices
|
|
104
|
+
|
|
105
|
+
# `maxChoices` (number)
|
|
106
|
+
|
|
107
|
+
Maximum number of choices
|
|
108
|
+
|
|
109
|
+
# `maxResponseAreas` (number)
|
|
110
|
+
|
|
111
|
+
Maximum number of response areas
|
|
112
|
+
|
|
101
113
|
# `showPrompt` (boolean)
|
|
102
114
|
|
|
103
115
|
Determines whether prompt field will be displayed or not
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
6
|
"repository": "pie-framework/pie-elements",
|
|
7
|
-
"version": "3.13.
|
|
7
|
+
"version": "3.13.10",
|
|
8
8
|
"description": "",
|
|
9
9
|
"scripts": {
|
|
10
10
|
"test": "echo \"Error: no test specified\" && exit 1",
|
|
@@ -13,10 +13,10 @@
|
|
|
13
13
|
"dependencies": {
|
|
14
14
|
"@material-ui/core": "^3.9.2",
|
|
15
15
|
"@pie-framework/pie-player-events": "^0.1.0",
|
|
16
|
-
"@pie-lib/correct-answer-toggle": "^2.3.
|
|
17
|
-
"@pie-lib/mask-markup": "^1.12.
|
|
18
|
-
"@pie-lib/math-rendering": "^2.
|
|
19
|
-
"@pie-lib/render-ui": "^4.12.
|
|
16
|
+
"@pie-lib/correct-answer-toggle": "^2.3.36",
|
|
17
|
+
"@pie-lib/mask-markup": "^1.12.4",
|
|
18
|
+
"@pie-lib/math-rendering": "^2.4.0",
|
|
19
|
+
"@pie-lib/render-ui": "^4.12.6",
|
|
20
20
|
"classnames": "^2.2.5",
|
|
21
21
|
"lodash": "^4.17.10",
|
|
22
22
|
"prop-types": "^15.6.1",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
},
|
|
26
26
|
"author": "",
|
|
27
27
|
"license": "ISC",
|
|
28
|
-
"gitHead": "
|
|
28
|
+
"gitHead": "8ea971e13e74d785cd35a04fd9fe1abe1fa2dabf",
|
|
29
29
|
"main": "lib/index.js",
|
|
30
30
|
"module": "src/index.js"
|
|
31
31
|
}
|