@pie-element/drag-in-the-blank 6.10.8-next.7 → 6.11.0

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 CHANGED
@@ -3,6 +3,22 @@
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
+ # [6.11.0](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank@6.10.7...@pie-element/drag-in-the-blank@6.11.0) (2025-06-19)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * update pie-lib/pie-toolbox PD-5076, PD-5063, PD-4832, PD-5059 ([16201a3](https://github.com/pie-framework/pie-elements/commit/16201a35183965fabd033bbf797ef3b438d69a85))
12
+
13
+
14
+ ### Features
15
+
16
+ * **drag-in-the-blank:** remove lodash where possible to improve bundle size PD-5076 ([efa0205](https://github.com/pie-framework/pie-elements/commit/efa02058a6186afc0079c77afbd46ba9e23c1ada))
17
+
18
+
19
+
20
+
21
+
6
22
  ## [6.10.7](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank@6.10.6...@pie-element/drag-in-the-blank@6.10.7) (2025-06-05)
7
23
 
8
24
 
@@ -3,6 +3,22 @@
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
+ # [6.5.0](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank-configure@6.4.7...@pie-element/drag-in-the-blank-configure@6.5.0) (2025-06-19)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * update pie-lib/pie-toolbox PD-5076, PD-5063, PD-4832, PD-5059 ([16201a3](https://github.com/pie-framework/pie-elements/commit/16201a35183965fabd033bbf797ef3b438d69a85))
12
+
13
+
14
+ ### Features
15
+
16
+ * **drag-in-the-blank:** remove lodash where possible to improve bundle size PD-5076 ([efa0205](https://github.com/pie-framework/pie-elements/commit/efa02058a6186afc0079c77afbd46ba9e23c1ada))
17
+
18
+
19
+
20
+
21
+
6
22
  ## [6.4.7](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank-configure@6.4.6...@pie-element/drag-in-the-blank-configure@6.4.7) (2025-06-05)
7
23
 
8
24
 
@@ -33,18 +33,16 @@ var _editableHtml = require("@pie-lib/pie-toolbox/editable-html");
33
33
 
34
34
  var _mathRendering = require("@pie-lib/pie-toolbox/math-rendering");
35
35
 
36
- var _find = _interopRequireDefault(require("lodash/find"));
36
+ var _configUi = require("@pie-lib/pie-toolbox/config-ui");
37
37
 
38
38
  var _Button = _interopRequireDefault(require("@material-ui/core/Button"));
39
39
 
40
+ var _styles = require("@material-ui/core/styles");
41
+
40
42
  var _choice = _interopRequireDefault(require("./choice"));
41
43
 
42
44
  var _markupUtils = require("./markupUtils");
43
45
 
44
- var _styles = require("@material-ui/core/styles");
45
-
46
- var _configUi = require("@pie-lib/pie-toolbox/config-ui");
47
-
48
46
  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
47
 
50
48
  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; }
@@ -239,9 +237,7 @@ var Choices = /*#__PURE__*/function (_React$Component) {
239
237
 
240
238
 
241
239
  return choices.filter(function (choice) {
242
- return !(0, _find["default"])(correctResponse, function (v) {
243
- return v === choice.id;
244
- });
240
+ return !(correctResponse && Object.values(correctResponse).includes(choice.id));
245
241
  });
246
242
  });
247
243
  return _this;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/choices.jsx"],"names":["styles","theme","design","display","flexDirection","marginBottom","spacing","unit","addButton","marginLeft","altChoices","alignItems","flexWrap","justifyContent","marginTop","margin","errorText","fontSize","typography","color","palette","error","main","paddingBottom","Choices","warning","open","domNode","ReactDOM","findDOMNode","prevValue","val","key","props","onChange","model","choices","correctResponse","alternateResponses","duplicatedValue","find","c","value","id","newChoices","filter","setState","text","map","choice","usedForResponse","Object","keys","forEach","responseKey","values","alternate","indexOf","newChoicesWithoutTheEmptyOne","focusedEl","oldChoices","length","duplicates","v","rerenderMath","focusedNodeRef","focus","state","classes","mathMlOptions","maxChoices","toolbarOpts","uploadSoundSupport","imageSupport","pluginProps","maxImageWidth","maxImageHeight","maxLength","visibleChoices","getVisibleChoices","onAddChoice","index","minWidth","zIndex","ref","prompt","language","preventDone","onChoiceChanged","undefined","e","inInInsertCharacter","relatedTarget","closest","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/pie-toolbox/editable-html';\nimport { renderMath } from '@pie-lib/pie-toolbox/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/pie-toolbox/config-ui';\n\nconst styles = (theme) => ({\n design: {\n display: 'flex',\n flexDirection: 'column',\n marginBottom: theme.spacing.unit * 1.5,\n },\n addButton: {\n marginLeft: 'auto',\n },\n altChoices: {\n alignItems: 'flex-start',\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'space-evenly',\n marginTop: theme.spacing.unit,\n\n '& > *': {\n margin: theme.spacing.unit,\n },\n },\n errorText: {\n fontSize: theme.typography.fontSize - 2,\n color: theme.palette.error.main,\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 pluginProps: PropTypes.object,\n maxChoices: PropTypes.number,\n uploadSoundSupport: PropTypes.object,\n maxImageWidth: PropTypes.number,\n maxImageHeight: PropTypes.number,\n maxLength: PropTypes.number\n };\n\n state = { warning: { open: false } };\n preventDone = false;\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 warning: {\n open: true,\n text: 'Identical answer choices are not allowed and the changes will be discarded.',\n },\n });\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 onChange(newChoices);\n\n return;\n }\n\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 && !usedForResponse) {\n Object.values(alternateResponses).forEach((alternate) => {\n if (alternate.indexOf(key) >= 0) {\n usedForResponse = true;\n }\n });\n }\n\n if (usedForResponse) {\n this.setState({\n warning: {\n open: true,\n text: 'Answer choices cannot be blank and the changes will be discarded.',\n },\n });\n\n return;\n }\n\n const newChoicesWithoutTheEmptyOne = newChoices.filter((choice) => choice.id !== key);\n\n onChange(newChoicesWithoutTheEmptyOne);\n\n this.setState({\n warning: {\n open: true,\n text: 'Answer choices cannot be blank.',\n },\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, warning } = this.state;\n const {\n classes,\n duplicates,\n error,\n mathMlOptions = {},\n maxChoices,\n model: { choices },\n toolbarOpts,\n uploadSoundSupport,\n imageSupport = {},\n pluginProps = {},\n maxImageWidth,\n maxImageHeight,\n maxLength,\n } = this.props;\n const visibleChoices = this.getVisibleChoices() || [];\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 ref={(ref) => (this.focusedNodeRef = ref)}\n className={classes.prompt}\n imageSupport={imageSupport}\n markup={choice.value}\n pluginProps={pluginProps}\n languageCharactersProps={[{ language: 'spanish' }, { language: 'special' }]}\n onChange={(val) => {\n if (this.preventDone) {\n return;\n }\n\n this.onChoiceChanged(choice.value, val, choice.id);\n }}\n onDone={() => {\n if (this.preventDone) {\n return;\n }\n\n this.setState({\n focusedEl: undefined,\n });\n }}\n onBlur={(e) => {\n const inInInsertCharacter = e.relatedTarget && e.relatedTarget.closest('.insert-character-dialog');\n\n this.preventDone = inInInsertCharacter;\n }}\n disableUnderline\n toolbarOpts={toolbarOpts}\n uploadSoundSupport={uploadSoundSupport}\n mathMlOptions={mathMlOptions}\n maxImageHeight={maxImageHeight}\n maxImageWidth={maxImageWidth}\n charactersLimit={maxLength}\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={warning.open}\n title=\"Warning\"\n text={warning.text}\n onConfirm={() => this.setState({ warning: { open: false } })}\n />\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":["styles","theme","design","display","flexDirection","marginBottom","spacing","unit","addButton","marginLeft","altChoices","alignItems","flexWrap","justifyContent","marginTop","margin","errorText","fontSize","typography","color","palette","error","main","paddingBottom","Choices","warning","open","domNode","ReactDOM","findDOMNode","prevValue","val","key","props","onChange","model","choices","correctResponse","alternateResponses","duplicatedValue","find","c","value","id","newChoices","filter","setState","text","map","choice","usedForResponse","Object","keys","forEach","responseKey","values","alternate","indexOf","newChoicesWithoutTheEmptyOne","focusedEl","oldChoices","length","duplicates","includes","rerenderMath","focusedNodeRef","focus","state","classes","mathMlOptions","maxChoices","toolbarOpts","uploadSoundSupport","imageSupport","pluginProps","maxImageWidth","maxImageHeight","maxLength","visibleChoices","getVisibleChoices","onAddChoice","index","minWidth","zIndex","ref","prompt","language","preventDone","onChoiceChanged","undefined","e","inInInsertCharacter","relatedTarget","closest","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/pie-toolbox/editable-html';\nimport { renderMath } from '@pie-lib/pie-toolbox/math-rendering';\nimport { AlertDialog } from '@pie-lib/pie-toolbox/config-ui';\nimport Button from '@material-ui/core/Button';\nimport { withStyles } from '@material-ui/core/styles';\n\nimport Choice from './choice';\nimport { choiceIsEmpty } from './markupUtils';\n\nconst styles = (theme) => ({\n design: {\n display: 'flex',\n flexDirection: 'column',\n marginBottom: theme.spacing.unit * 1.5,\n },\n addButton: {\n marginLeft: 'auto',\n },\n altChoices: {\n alignItems: 'flex-start',\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'space-evenly',\n marginTop: theme.spacing.unit,\n\n '& > *': {\n margin: theme.spacing.unit,\n },\n },\n errorText: {\n fontSize: theme.typography.fontSize - 2,\n color: theme.palette.error.main,\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 pluginProps: PropTypes.object,\n maxChoices: PropTypes.number,\n uploadSoundSupport: PropTypes.object,\n maxImageWidth: PropTypes.number,\n maxImageHeight: PropTypes.number,\n maxLength: PropTypes.number\n };\n\n state = { warning: { open: false } };\n preventDone = false;\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 warning: {\n open: true,\n text: 'Identical answer choices are not allowed and the changes will be discarded.',\n },\n });\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 onChange(newChoices);\n\n return;\n }\n\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 && !usedForResponse) {\n Object.values(alternateResponses).forEach((alternate) => {\n if (alternate.indexOf(key) >= 0) {\n usedForResponse = true;\n }\n });\n }\n\n if (usedForResponse) {\n this.setState({\n warning: {\n open: true,\n text: 'Answer choices cannot be blank and the changes will be discarded.',\n },\n });\n\n return;\n }\n\n const newChoicesWithoutTheEmptyOne = newChoices.filter((choice) => choice.id !== key);\n\n onChange(newChoicesWithoutTheEmptyOne);\n\n this.setState({\n warning: {\n open: true,\n text: 'Answer choices cannot be blank.',\n },\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(\n (choice) => !(correctResponse && Object.values(correctResponse).includes(choice.id))\n );\n };\n\n render() {\n const { focusedEl, warning } = this.state;\n const {\n classes,\n duplicates,\n error,\n mathMlOptions = {},\n maxChoices,\n model: { choices },\n toolbarOpts,\n uploadSoundSupport,\n imageSupport = {},\n pluginProps = {},\n maxImageWidth,\n maxImageHeight,\n maxLength,\n } = this.props;\n const visibleChoices = this.getVisibleChoices() || [];\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 ref={(ref) => (this.focusedNodeRef = ref)}\n className={classes.prompt}\n imageSupport={imageSupport}\n markup={choice.value}\n pluginProps={pluginProps}\n languageCharactersProps={[{ language: 'spanish' }, { language: 'special' }]}\n onChange={(val) => {\n if (this.preventDone) {\n return;\n }\n\n this.onChoiceChanged(choice.value, val, choice.id);\n }}\n onDone={() => {\n if (this.preventDone) {\n return;\n }\n\n this.setState({\n focusedEl: undefined,\n });\n }}\n onBlur={(e) => {\n const inInInsertCharacter = e.relatedTarget && e.relatedTarget.closest('.insert-character-dialog');\n\n this.preventDone = inInInsertCharacter;\n }}\n disableUnderline\n toolbarOpts={toolbarOpts}\n uploadSoundSupport={uploadSoundSupport}\n mathMlOptions={mathMlOptions}\n maxImageHeight={maxImageHeight}\n maxImageWidth={maxImageWidth}\n charactersLimit={maxLength}\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={warning.open}\n title=\"Warning\"\n text={warning.text}\n onConfirm={() => this.setState({ warning: { open: false } })}\n />\n </div>\n );\n }\n}\n\nconst Styled = withStyles(styles)(Choices);\n\nexport default Styled;\n"],"file":"choices.js"}
@@ -9,8 +9,6 @@ exports.removeUnwantedCharacters = exports.processMarkup = exports.createSlateMa
9
9
 
10
10
  var _escape = _interopRequireDefault(require("lodash/escape"));
11
11
 
12
- var _isUndefined = _interopRequireDefault(require("lodash/isUndefined"));
13
-
14
12
  var createElementFromHTML = function createElementFromHTML(htmlString) {
15
13
  var div = document.createElement('div');
16
14
  div.innerHTML = htmlString.trim();
@@ -53,7 +51,7 @@ var processMarkup = function processMarkup(markup) {
53
51
  markup: slateMarkup.innerHTML,
54
52
  choices: choices,
55
53
  correctResponse: choices.reduce(function (obj, c, index) {
56
- obj[index] = !(0, _isUndefined["default"])(c.id) && c.id || '';
54
+ obj[index] = c.id !== undefined && c.id || '';
57
55
  return obj;
58
56
  }, {})
59
57
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/markupUtils.js"],"names":["createElementFromHTML","htmlString","div","document","createElement","innerHTML","trim","tSymbols","nSymbols","matchTabAndNewLine","RegExp","removeUnwantedCharacters","markup","replace","processMarkup","newMarkup","slateMarkup","choices","index","querySelectorAll","forEach","s","value","dataset","push","id","replaceWith","correctResponse","reduce","obj","c","REGEX","createSlateMarkup","match","g","correctId","correctChoice","find","choiceIsEmpty","choice","domEl","Array","from","tagName","childNodes","length","remove","newString"],"mappings":"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","sourcesContent":["import escape from 'lodash/escape';\nimport isUndefined from 'lodash/isUndefined';\n\nexport const createElementFromHTML = (htmlString) => {\n const div = document.createElement('div');\n\n div.innerHTML = htmlString.trim();\n\n return div;\n};\n\n// do not remove \\t from \\times, \\triangle, \\tan, \\theta or \\therefore\nconst tSymbols = 'imes|riangle|an|heta|herefore';\n// do not remove \\n from \\nthroot, \\nparallel, \\ncong, \\napprox, \\neq, \\ne or \\nsim\nconst nSymbols = 'throot|parallel|cong|approx|eq|e|sim';\n// match all \\t and \\n that are not part of math symbols that starts with \\t or \\n\nconst matchTabAndNewLine = new RegExp(\n `(\\\\t(?!${tSymbols}))|(\\\\n(?!${nSymbols}))|(\\\\\\\\t(?!${tSymbols}))|(\\\\\\\\n(?!${nSymbols}))`,\n 'g',\n);\n\nexport const removeUnwantedCharacters = (markup) =>\n markup.replace(matchTabAndNewLine, '').replace(/\\\\\"/g, '\"').replace(/\\\\\\//g, '/');\n\nexport const processMarkup = (markup) => {\n const newMarkup = removeUnwantedCharacters(markup);\n const slateMarkup = createElementFromHTML(newMarkup);\n const choices = [];\n let index = 0;\n\n slateMarkup.querySelectorAll('[data-type=\"drag_in_the_blank\"]').forEach((s) => {\n let value = s.dataset.value && s.dataset.value.replace(/&nbsp;/g, ' ').trim();\n\n if (!value) {\n value = '';\n }\n\n choices.push({\n value,\n id: s.dataset.id,\n });\n\n s.replaceWith(`{{${index++}}}`);\n });\n\n return {\n markup: slateMarkup.innerHTML,\n choices: choices,\n correctResponse: choices.reduce((obj, c, index) => {\n obj[index] = (!isUndefined(c.id) && c.id) || '';\n\n return obj;\n }, {}),\n };\n};\n\nconst REGEX = /\\{\\{(\\d+)\\}\\}/g;\n\nexport const createSlateMarkup = (markup, choices, correctResponse) => {\n const newMarkup = removeUnwantedCharacters(markup);\n let index = 0;\n\n return newMarkup.replace(REGEX, (match, g) => {\n const correctId = correctResponse[g];\n let correctChoice = choices.find((c) => c.id === correctId);\n\n if (!correctChoice || !correctChoice.value) {\n correctChoice = {\n id: '',\n value: '',\n };\n }\n\n return `<span data-type=\"drag_in_the_blank\" data-index=\"${index++}\" data-id=\"${\n correctChoice.id\n }\" data-value=\"${escape(correctChoice.value)}\"></span>`;\n });\n};\n\nexport const choiceIsEmpty = (choice) => {\n if (choice) {\n const { value = '' } = choice;\n const domEl = createElementFromHTML(value);\n\n Array.from(domEl.querySelectorAll('*')).forEach((domEl) => {\n if (domEl.tagName !== 'IMG' && domEl.childNodes.length === 0) {\n domEl.remove();\n }\n });\n\n const newString = domEl.innerHTML.trim();\n\n return newString === '';\n }\n\n return false;\n};\n"],"file":"markupUtils.js"}
1
+ {"version":3,"sources":["../src/markupUtils.js"],"names":["createElementFromHTML","htmlString","div","document","createElement","innerHTML","trim","tSymbols","nSymbols","matchTabAndNewLine","RegExp","removeUnwantedCharacters","markup","replace","processMarkup","newMarkup","slateMarkup","choices","index","querySelectorAll","forEach","s","value","dataset","push","id","replaceWith","correctResponse","reduce","obj","c","undefined","REGEX","createSlateMarkup","match","g","correctId","correctChoice","find","choiceIsEmpty","choice","domEl","Array","from","tagName","childNodes","length","remove","newString"],"mappings":";;;;;;;;;AAAA;;AAEO,IAAMA,qBAAqB,GAAG,SAAxBA,qBAAwB,CAACC,UAAD,EAAgB;AACnD,MAAMC,GAAG,GAAGC,QAAQ,CAACC,aAAT,CAAuB,KAAvB,CAAZ;AAEAF,EAAAA,GAAG,CAACG,SAAJ,GAAgBJ,UAAU,CAACK,IAAX,EAAhB;AAEA,SAAOJ,GAAP;AACD,CANM,C,CAQP;;;;AACA,IAAMK,QAAQ,GAAG,+BAAjB,C,CACA;;AACA,IAAMC,QAAQ,GAAG,sCAAjB,C,CACA;;AACA,IAAMC,kBAAkB,GAAG,IAAIC,MAAJ,kBACfH,QADe,uBACMC,QADN,yBAC6BD,QAD7B,yBACoDC,QADpD,SAEzB,GAFyB,CAA3B;;AAKO,IAAMG,wBAAwB,GAAG,SAA3BA,wBAA2B,CAACC,MAAD;AAAA,SACtCA,MAAM,CAACC,OAAP,CAAeJ,kBAAf,EAAmC,EAAnC,EAAuCI,OAAvC,CAA+C,MAA/C,EAAuD,GAAvD,EAA4DA,OAA5D,CAAoE,OAApE,EAA6E,GAA7E,CADsC;AAAA,CAAjC;;;;AAGA,IAAMC,aAAa,GAAG,SAAhBA,aAAgB,CAACF,MAAD,EAAY;AACvC,MAAMG,SAAS,GAAGJ,wBAAwB,CAACC,MAAD,CAA1C;AACA,MAAMI,WAAW,GAAGhB,qBAAqB,CAACe,SAAD,CAAzC;AACA,MAAME,OAAO,GAAG,EAAhB;AACA,MAAIC,KAAK,GAAG,CAAZ;AAEAF,EAAAA,WAAW,CAACG,gBAAZ,CAA6B,iCAA7B,EAAgEC,OAAhE,CAAwE,UAACC,CAAD,EAAO;AAC7E,QAAIC,KAAK,GAAGD,CAAC,CAACE,OAAF,CAAUD,KAAV,IAAmBD,CAAC,CAACE,OAAF,CAAUD,KAAV,CAAgBT,OAAhB,CAAwB,SAAxB,EAAmC,GAAnC,EAAwCP,IAAxC,EAA/B;;AAEA,QAAI,CAACgB,KAAL,EAAY;AACVA,MAAAA,KAAK,GAAG,EAAR;AACD;;AAEDL,IAAAA,OAAO,CAACO,IAAR,CAAa;AACXF,MAAAA,KAAK,EAALA,KADW;AAEXG,MAAAA,EAAE,EAAEJ,CAAC,CAACE,OAAF,CAAUE;AAFH,KAAb;AAKAJ,IAAAA,CAAC,CAACK,WAAF,aAAmBR,KAAK,EAAxB;AACD,GAbD;AAeA,SAAO;AACLN,IAAAA,MAAM,EAAEI,WAAW,CAACX,SADf;AAELY,IAAAA,OAAO,EAAEA,OAFJ;AAGLU,IAAAA,eAAe,EAAEV,OAAO,CAACW,MAAR,CAAe,UAACC,GAAD,EAAMC,CAAN,EAASZ,KAAT,EAAmB;AACjDW,MAAAA,GAAG,CAACX,KAAD,CAAH,GAAcY,CAAC,CAACL,EAAF,KAASM,SAAT,IAAuBD,CAAC,CAACL,EAA1B,IAAiC,EAA9C;AAEA,aAAOI,GAAP;AACD,KAJgB,EAId,EAJc;AAHZ,GAAP;AASD,CA9BM;;;AAgCP,IAAMG,KAAK,GAAG,gBAAd;;AAEO,IAAMC,iBAAiB,GAAG,SAApBA,iBAAoB,CAACrB,MAAD,EAASK,OAAT,EAAkBU,eAAlB,EAAsC;AACrE,MAAMZ,SAAS,GAAGJ,wBAAwB,CAACC,MAAD,CAA1C;AACA,MAAIM,KAAK,GAAG,CAAZ;AAEA,SAAOH,SAAS,CAACF,OAAV,CAAkBmB,KAAlB,EAAyB,UAACE,KAAD,EAAQC,CAAR,EAAc;AAC5C,QAAMC,SAAS,GAAGT,eAAe,CAACQ,CAAD,CAAjC;AACA,QAAIE,aAAa,GAAGpB,OAAO,CAACqB,IAAR,CAAa,UAACR,CAAD;AAAA,aAAOA,CAAC,CAACL,EAAF,KAASW,SAAhB;AAAA,KAAb,CAApB;;AAEA,QAAI,CAACC,aAAD,IAAkB,CAACA,aAAa,CAACf,KAArC,EAA4C;AAC1Ce,MAAAA,aAAa,GAAG;AACdZ,QAAAA,EAAE,EAAE,EADU;AAEdH,QAAAA,KAAK,EAAE;AAFO,OAAhB;AAID;;AAED,wEAA0DJ,KAAK,EAA/D,0BACEmB,aAAa,CAACZ,EADhB,6BAEiB,wBAAOY,aAAa,CAACf,KAArB,CAFjB;AAGD,GAdM,CAAP;AAeD,CAnBM;;;;AAqBA,IAAMiB,aAAa,GAAG,SAAhBA,aAAgB,CAACC,MAAD,EAAY;AACvC,MAAIA,MAAJ,EAAY;AACV,wBAAuBA,MAAvB,CAAQlB,KAAR;AAAA,QAAQA,KAAR,8BAAgB,EAAhB;AACA,QAAMmB,KAAK,GAAGzC,qBAAqB,CAACsB,KAAD,CAAnC;AAEAoB,IAAAA,KAAK,CAACC,IAAN,CAAWF,KAAK,CAACtB,gBAAN,CAAuB,GAAvB,CAAX,EAAwCC,OAAxC,CAAgD,UAACqB,KAAD,EAAW;AACzD,UAAIA,KAAK,CAACG,OAAN,KAAkB,KAAlB,IAA2BH,KAAK,CAACI,UAAN,CAAiBC,MAAjB,KAA4B,CAA3D,EAA8D;AAC5DL,QAAAA,KAAK,CAACM,MAAN;AACD;AACF,KAJD;AAMA,QAAMC,SAAS,GAAGP,KAAK,CAACpC,SAAN,CAAgBC,IAAhB,EAAlB;AAEA,WAAO0C,SAAS,KAAK,EAArB;AACD;;AAED,SAAO,KAAP;AACD,CAjBM","sourcesContent":["import escape from 'lodash/escape';\n\nexport const createElementFromHTML = (htmlString) => {\n const div = document.createElement('div');\n\n div.innerHTML = htmlString.trim();\n\n return div;\n};\n\n// do not remove \\t from \\times, \\triangle, \\tan, \\theta or \\therefore\nconst tSymbols = 'imes|riangle|an|heta|herefore';\n// do not remove \\n from \\nthroot, \\nparallel, \\ncong, \\napprox, \\neq, \\ne or \\nsim\nconst nSymbols = 'throot|parallel|cong|approx|eq|e|sim';\n// match all \\t and \\n that are not part of math symbols that starts with \\t or \\n\nconst matchTabAndNewLine = new RegExp(\n `(\\\\t(?!${tSymbols}))|(\\\\n(?!${nSymbols}))|(\\\\\\\\t(?!${tSymbols}))|(\\\\\\\\n(?!${nSymbols}))`,\n 'g',\n);\n\nexport const removeUnwantedCharacters = (markup) =>\n markup.replace(matchTabAndNewLine, '').replace(/\\\\\"/g, '\"').replace(/\\\\\\//g, '/');\n\nexport const processMarkup = (markup) => {\n const newMarkup = removeUnwantedCharacters(markup);\n const slateMarkup = createElementFromHTML(newMarkup);\n const choices = [];\n let index = 0;\n\n slateMarkup.querySelectorAll('[data-type=\"drag_in_the_blank\"]').forEach((s) => {\n let value = s.dataset.value && s.dataset.value.replace(/&nbsp;/g, ' ').trim();\n\n if (!value) {\n value = '';\n }\n\n choices.push({\n value,\n id: s.dataset.id,\n });\n\n s.replaceWith(`{{${index++}}}`);\n });\n\n return {\n markup: slateMarkup.innerHTML,\n choices: choices,\n correctResponse: choices.reduce((obj, c, index) => {\n obj[index] = (c.id !== undefined && c.id) || '';\n\n return obj;\n }, {}),\n };\n};\n\nconst REGEX = /\\{\\{(\\d+)\\}\\}/g;\n\nexport const createSlateMarkup = (markup, choices, correctResponse) => {\n const newMarkup = removeUnwantedCharacters(markup);\n let index = 0;\n\n return newMarkup.replace(REGEX, (match, g) => {\n const correctId = correctResponse[g];\n let correctChoice = choices.find((c) => c.id === correctId);\n\n if (!correctChoice || !correctChoice.value) {\n correctChoice = {\n id: '',\n value: '',\n };\n }\n\n return `<span data-type=\"drag_in_the_blank\" data-index=\"${index++}\" data-id=\"${\n correctChoice.id\n }\" data-value=\"${escape(correctChoice.value)}\"></span>`;\n });\n};\n\nexport const choiceIsEmpty = (choice) => {\n if (choice) {\n const { value = '' } = choice;\n const domEl = createElementFromHTML(value);\n\n Array.from(domEl.querySelectorAll('*')).forEach((domEl) => {\n if (domEl.tagName !== 'IMG' && domEl.childNodes.length === 0) {\n domEl.remove();\n }\n });\n\n const newString = domEl.innerHTML.trim();\n\n return newString === '';\n }\n\n return false;\n};\n"],"file":"markupUtils.js"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pie-element/drag-in-the-blank-configure",
3
- "version": "6.4.7",
3
+ "version": "6.5.0",
4
4
  "private": true,
5
5
  "main": "lib/index.js",
6
6
  "module": "src/index.js",
@@ -8,7 +8,7 @@
8
8
  "@material-ui/core": "^3.9.2",
9
9
  "@material-ui/icons": "^3.0.1",
10
10
  "@pie-framework/pie-configure-events": "^1.3.0",
11
- "@pie-lib/pie-toolbox": "2.17.6",
11
+ "@pie-lib/pie-toolbox": "2.18.0",
12
12
  "debug": "^3.1.0",
13
13
  "lodash": "^4.17.15",
14
14
  "prop-types": "^15.6.2",
@@ -3,6 +3,22 @@
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
+ # [6.2.0](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank-controller@6.1.7...@pie-element/drag-in-the-blank-controller@6.2.0) (2025-06-19)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * update pie-lib/pie-toolbox PD-5076, PD-5063, PD-4832, PD-5059 ([16201a3](https://github.com/pie-framework/pie-elements/commit/16201a35183965fabd033bbf797ef3b438d69a85))
12
+
13
+
14
+ ### Features
15
+
16
+ * **drag-in-the-blank:** remove lodash where possible to improve bundle size PD-5076 ([efa0205](https://github.com/pie-framework/pie-elements/commit/efa02058a6186afc0079c77afbd46ba9e23c1ada))
17
+
18
+
19
+
20
+
21
+
6
22
  ## [6.1.7](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank-controller@6.1.6...@pie-element/drag-in-the-blank-controller@6.1.7) (2025-06-05)
7
23
 
8
24
 
@@ -17,8 +17,6 @@ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/
17
17
 
18
18
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
19
19
 
20
- var _reduce = _interopRequireDefault(require("lodash/reduce"));
21
-
22
20
  var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
23
21
 
24
22
  var _utils = require("./utils");
@@ -67,7 +65,8 @@ function model(question, session, env, updateSession) {
67
65
  value = _ref2.value;
68
66
 
69
67
  var _loop = function _loop(i) {
70
- var result = (0, _reduce["default"])(allCorrectResponses, function (obj, choices, key) {
68
+ var result = Object.keys(allCorrectResponses).reduce(function (obj, key) {
69
+ var choices = allCorrectResponses[key];
71
70
  var answer = value && value[key] || '';
72
71
  obj.feedback[key] = choices[i] === answer;
73
72
 
@@ -156,7 +155,8 @@ var getScore = function getScore(config, session) {
156
155
  value = _ref3.value;
157
156
 
158
157
  var _loop2 = function _loop2(i) {
159
- var result = (0, _reduce["default"])(allCorrectResponses, function (total, choices, key) {
158
+ var result = Object.keys(allCorrectResponses).reduce(function (total, key) {
159
+ var choices = allCorrectResponses[key];
160
160
  var answer = value && value[key] || '';
161
161
 
162
162
  if (choices[i] === answer) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.js"],"names":["normalize","question","defaults","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","shouldIncludeCorrectResponse","role","out","prompt","promptEnabled","disabled","responseCorrect","getScore","correctResponse","rationale","rationaleEnabled","teacherInstructions","teacherInstructionsEnabled","config","maxScore","Object","keys","length","correctCount","total","str","toFixed","parseFloat","outcome","partialScoringEnabled","partialScoring","enabled","score","empty","createCorrectResponseSession","id","getInnerText","html","replaceAll","getContent","replace","validate","markup","minChoices","maxChoices","maxResponseAreas","errors","forEach","field","required","nbOfResponseAreas","match","nbOfChoices","emptyResponseAreas","values","response","correctResponseError","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/pie-toolbox/controller-utils';\nimport defaults from './defaults';\n\nexport const normalize = (question) => ({\n ...defaults,\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(\n allCorrectResponses,\n (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 },\n { correctResponses: 0, feedback: {} },\n );\n\n if (correctResponses === undefined || result.correctResponses > correctResponses) {\n correctResponses = result.correctResponses;\n feedback = result.feedback;\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 shouldIncludeCorrectResponse = env.mode === 'evaluate' || (env.role === 'instructor' && env.mode === 'view');\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: env.mode === 'evaluate' ? getScore(normalizedQuestion, session) === 1 : undefined,\n correctResponse: shouldIncludeCorrectResponse ? normalizedQuestion.correctResponse : undefined,\n };\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : 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(\n allCorrectResponses,\n (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 },\n maxScore,\n );\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\n// remove all html tags\nconst getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');\n\n// remove all html tags except img, iframe and source tag for audio\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const { choices, correctResponse, markup } = model;\n const { minChoices = 2, maxChoices, maxResponseAreas } = config;\n const errors = {};\n\n ['teacherInstructions', 'prompt', 'rationale'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n const nbOfResponseAreas = ((markup || '').match(/\\{\\{(\\d+)\\}\\}/g) || []).length;\n const nbOfChoices = (choices || []).length;\n const emptyResponseAreas = Object.values(correctResponse)?.filter((response) => !response);\n\n if (emptyResponseAreas.length) {\n errors.correctResponseError = 'There should be a choice defined for each response area.';\n }\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} tokens defined.`;\n } else if (nbOfChoices > maxChoices) {\n errors.choicesError = `No more than ${maxChoices} tokens should be defined.`;\n }\n\n return errors;\n};\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../src/index.js"],"names":["normalize","question","defaults","model","session","env","updateSession","Promise","resolve","normalizedQuestion","feedback","mode","responses","allCorrectResponses","possibleResponses","numberOfPossibleResponses","correctResponses","undefined","value","i","result","Object","keys","reduce","obj","key","choices","answer","filter","choice","lockChoiceOrder","shouldIncludeCorrectResponse","role","out","prompt","promptEnabled","disabled","responseCorrect","getScore","correctResponse","rationale","rationaleEnabled","teacherInstructions","teacherInstructionsEnabled","config","maxScore","length","correctCount","total","str","toFixed","parseFloat","outcome","partialScoringEnabled","partialScoring","enabled","score","empty","createCorrectResponseSession","id","getInnerText","html","replaceAll","getContent","replace","validate","markup","minChoices","maxChoices","maxResponseAreas","errors","forEach","field","required","nbOfResponseAreas","match","nbOfChoices","emptyResponseAreas","values","response","correctResponseError","responseAreasError","choicesError"],"mappings":"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","sourcesContent":["import isEmpty from 'lodash/isEmpty';\nimport { getAllCorrectResponses, choiceIsEmpty } from './utils';\nimport { lockChoices, getShuffledChoices, partialScoring } from '@pie-lib/pie-toolbox/controller-utils';\nimport defaults from './defaults';\n\nexport const normalize = (question) => ({\n ...defaults,\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 = Object.keys(allCorrectResponses).reduce(\n (obj, key) => {\n const choices = allCorrectResponses[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 },\n { correctResponses: 0, feedback: {} },\n );\n\n if (correctResponses === undefined || result.correctResponses > correctResponses) {\n correctResponses = result.correctResponses;\n feedback = result.feedback;\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 shouldIncludeCorrectResponse = env.mode === 'evaluate' || (env.role === 'instructor' && env.mode === 'view');\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: env.mode === 'evaluate' ? getScore(normalizedQuestion, session) === 1 : undefined,\n correctResponse: shouldIncludeCorrectResponse ? normalizedQuestion.correctResponse : undefined,\n };\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : 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 = Object.keys(allCorrectResponses).reduce(\n (total, key) => {\n const choices = allCorrectResponses[key];\n const answer = (value && value[key]) || '';\n\n if (choices[i] === answer) {\n return total;\n }\n\n return total - 1;\n },\n maxScore,\n );\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\n// remove all html tags\nconst getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');\n\n// remove all html tags except img, iframe and source tag for audio\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const { choices, correctResponse, markup } = model;\n const { minChoices = 2, maxChoices, maxResponseAreas } = config;\n const errors = {};\n\n ['teacherInstructions', 'prompt', 'rationale'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n const nbOfResponseAreas = ((markup || '').match(/\\{\\{(\\d+)\\}\\}/g) || []).length;\n const nbOfChoices = (choices || []).length;\n const emptyResponseAreas = Object.values(correctResponse)?.filter((response) => !response);\n\n if (emptyResponseAreas.length) {\n errors.correctResponseError = 'There should be a choice defined for each response area.';\n }\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} tokens defined.`;\n } else if (nbOfChoices > maxChoices) {\n errors.choicesError = `No more than ${maxChoices} tokens should be defined.`;\n }\n\n return errors;\n};\n"],"file":"index.js"}
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "name": "@pie-element/drag-in-the-blank-controller",
3
3
  "private": true,
4
- "version": "6.1.7",
4
+ "version": "6.2.0",
5
5
  "description": "",
6
6
  "main": "lib/index.js",
7
7
  "module": "src/index.js",
8
8
  "author": "",
9
9
  "license": "ISC",
10
10
  "dependencies": {
11
- "@pie-lib/pie-toolbox": "2.17.6",
11
+ "@pie-lib/pie-toolbox": "2.18.0",
12
12
  "debug": "^3.1.0",
13
13
  "lodash": "^4.17.15",
14
14
  "type-of": "^2.0.1"
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "access": "public"
5
5
  },
6
6
  "repository": "pie-framework/pie-elements",
7
- "version": "6.10.8-next.7+ea1831187",
7
+ "version": "6.11.0",
8
8
  "description": "",
9
9
  "scripts": {
10
10
  "postpublish": "../../scripts/postpublish"
@@ -12,7 +12,7 @@
12
12
  "dependencies": {
13
13
  "@material-ui/core": "^3.9.2",
14
14
  "@pie-framework/pie-player-events": "^0.1.0",
15
- "@pie-lib/pie-toolbox": "2.17.6",
15
+ "@pie-lib/pie-toolbox": "2.18.0",
16
16
  "classnames": "^2.2.5",
17
17
  "lodash": "^4.17.10",
18
18
  "prop-types": "^15.6.1",
@@ -21,7 +21,7 @@
21
21
  },
22
22
  "author": "",
23
23
  "license": "ISC",
24
- "gitHead": "ea18311870fbffe39749d88765a5118d9ff00b21",
24
+ "gitHead": "e8f3c4c4569ee20e507671b02df1499daf3cfb71",
25
25
  "main": "lib/index.js",
26
26
  "module": "src/index.js"
27
27
  }