@pie-element/explicit-constructed-response 7.3.5-next.10 → 7.3.5-next.17

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.
@@ -356,7 +356,7 @@ var AlternateSection = /*#__PURE__*/function (_React$Component2) {
356
356
  return /*#__PURE__*/_react["default"].createElement(_MenuItem["default"], {
357
357
  key: index,
358
358
  value: c === null || c === void 0 ? void 0 : c.value
359
- }, c === null || c === void 0 ? void 0 : c.label);
359
+ }, (0, _markupUtils.decodeHTML)(c === null || c === void 0 ? void 0 : c.label));
360
360
  })), choices && choices.length > 0 && /*#__PURE__*/_react["default"].createElement("div", {
361
361
  className: classes.rightContainer
362
362
  }, maxLength && showMaxLength && /*#__PURE__*/_react["default"].createElement(_TextField["default"], {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/alternateSection.jsx"],"names":["styles","theme","design","marginBottom","spacing","unit","altChoices","alignItems","flexDirection","display","paddingTop","width","choice","flex","marginRight","deleteBtn","fill","palette","grey","selectContainer","justifyContent","rightContainer","lengthField","errorText","fontSize","typography","color","error","main","inputError","border","borderRadius","Choice","value","props","markup","onChange","e","strippedValue","setState","updateText","nextProps","state","classes","onDelete","spellCheck","showMaxLength","pluginProps","inputProps","maxLength","language","minWidth","isHidden","characters","disabled","React","Component","PropTypes","object","string","func","isRequired","bool","AlternateSection","choices","onSelect","selectChoices","target","find","c","length","label","map","parseInt","filter","id","isNaN","index","choiceChanged","lengthChanged","labelLengthsArr","newLength","Math","max","choiceRemoved","event","numberValue","minLength","getChoicesMaxLength","updateChoicesIfNeeded","errors","select","handleSelect","min","changeLength","addButton","onAddChoice","val","onChoiceChanged","onRemoveChoice","array","number","Styled"],"mappings":"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","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport debounce from 'lodash/debounce';\nimport isEqual from 'lodash/isEqual';\nimport OutlinedInput from '@material-ui/core/OutlinedInput';\nimport Button from '@material-ui/core/Button';\nimport Delete from '@material-ui/icons/Delete';\nimport IconButton from '@material-ui/core/IconButton';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Select from '@material-ui/core/Select';\nimport TextField from '@material-ui/core/TextField';\nimport { withStyles } from '@material-ui/core/styles';\nimport max from 'lodash/max';\nimport classnames from 'classnames';\nimport { EditableHtml } from '@pie-lib/pie-toolbox/editable-html';\nimport { stripHtmlTags, getAdjustedLength } from './markupUtils';\n\nconst styles = (theme) => ({\n design: {\n marginBottom: theme.spacing.unit / 2,\n },\n altChoices: {\n alignItems: 'flex-start',\n flexDirection: 'column',\n display: 'flex',\n paddingTop: theme.spacing.unit * 2.5,\n '& > *': {\n marginBottom: theme.spacing.unit * 2.5,\n width: '100%',\n },\n },\n choice: {\n flex: '1',\n marginRight: theme.spacing.unit * 2.5,\n },\n deleteBtn: {\n fill: theme.palette.grey[600],\n },\n selectContainer: {\n alignItems: 'flex-end',\n display: 'flex',\n justifyContent: 'space-between',\n width: '100%',\n },\n rightContainer: {\n alignItems: 'center',\n display: 'flex',\n },\n lengthField: {\n width: '230px',\n marginRight: theme.spacing.unit * 2.5,\n },\n errorText: {\n fontSize: theme.typography.fontSize - 2,\n color: theme.palette.error.main,\n paddingTop: theme.spacing.unit / 2,\n },\n inputError: {\n border: `2px solid ${theme.palette.error.main}`,\n borderRadius: '6px',\n },\n});\n\nexport class Choice extends React.Component {\n static propTypes = {\n classes: PropTypes.object,\n error: PropTypes.string,\n markup: PropTypes.string,\n onChange: PropTypes.func.isRequired,\n onDelete: PropTypes.func.isRequired,\n value: PropTypes.string,\n spellCheck: PropTypes.bool,\n showMaxLength: PropTypes.bool,\n pluginProps: PropTypes.object\n };\n\n state = {\n value: this.props.markup,\n };\n\n updateText = debounce(this.props.onChange, 300);\n\n UNSAFE_componentWillReceiveProps(nextProps) {\n if (nextProps.markup) {\n this.setState({ value: nextProps.markup });\n }\n }\n\n onChange = (e) => {\n const strippedValue = stripHtmlTags(e);\n this.setState({ value: strippedValue });\n this.updateText(strippedValue);\n };\n\n render() {\n const { value } = this.state;\n const { classes, onDelete, spellCheck, error, showMaxLength, pluginProps } = this.props;\n const inputProps = showMaxLength ? {} : { maxLength: 25 };\n\n return (\n <React.Fragment>\n <div\n style={{\n alignItems: 'center',\n display: 'flex',\n justifyContent: 'space-between',\n }}\n >\n <EditableHtml\n className={classnames(classes.choice, error && classes.inputError)}\n disableUnderline\n onChange={this.onChange}\n markup={value || ''}\n activePlugins={['languageCharacters']}\n pluginProps={pluginProps}\n languageCharactersProps={[{ language: 'spanish' }]}\n spellCheck={spellCheck}\n autoWidthToolbar\n toolbarOpts={{\n minWidth: 'auto',\n isHidden: !!pluginProps?.characters?.disabled\n }}\n {...inputProps}\n />\n <IconButton aria-label=\"delete\" className={classes.deleteBtn} onClick={onDelete}>\n <Delete />\n </IconButton>\n </div>\n {error && <div className={classes.errorText}>{error}</div>}\n </React.Fragment>\n );\n }\n}\n\nexport class AlternateSection extends React.Component {\n static propTypes = {\n choices: PropTypes.array,\n selectChoices: PropTypes.array.isRequired,\n classes: PropTypes.object.isRequired,\n errors: PropTypes.object,\n onSelect: PropTypes.func.isRequired,\n choiceChanged: PropTypes.func.isRequired,\n lengthChanged: PropTypes.func,\n choiceRemoved: PropTypes.func.isRequired,\n value: PropTypes.string,\n maxLength: PropTypes.number,\n showMaxLength: PropTypes.bool,\n spellCheck: PropTypes.bool,\n pluginProps: PropTypes.object\n };\n\n state = {};\n\n UNSAFE_componentWillReceiveProps(nextProps) {\n this.updateChoicesIfNeeded(nextProps);\n }\n\n componentDidMount() {\n this.updateChoicesIfNeeded(this.props);\n }\n\n updateChoicesIfNeeded = (props) => {\n if (\n !this.state.choices ||\n !isEqual(props.choices, this.state.choices) ||\n !isEqual(props.choices, this.props.choices)\n ) {\n this.setState({\n choices: props.choices,\n });\n }\n };\n\n handleSelect = (e) => {\n const { onSelect, selectChoices } = this.props;\n const { value } = e.target;\n\n onSelect(selectChoices.find((c) => c.value === value));\n };\n\n onAddChoice = () => {\n const { choices } = this.state;\n\n if (choices.length && choices[choices.length - 1].label !== '') {\n const value = max(choices.map((c) => parseInt(c.value)).filter((id) => !isNaN(id))) || 0;\n\n this.setState({\n choices: [\n ...choices,\n {\n value: `${value + 1}`,\n label: '',\n },\n ],\n });\n }\n };\n\n onChoiceChanged = (choice, value, index) => {\n const { choiceChanged, lengthChanged, maxLength, choices } = this.props;\n\n const labelLengthsArr = choices.map((choice) => (choice.label || '').length);\n labelLengthsArr[index] = value.length;\n\n const newLength = Math.max(...labelLengthsArr);\n\n choiceChanged({\n ...choice,\n label: value,\n });\n\n if (newLength > maxLength || newLength + 10 <= maxLength) {\n lengthChanged(getAdjustedLength(newLength));\n }\n };\n\n onRemoveChoice = (choice) => {\n const { choiceRemoved } = this.props;\n\n choiceRemoved(choice.value);\n };\n\n getChoicesMaxLength = () => {\n const { choices } = this.state;\n\n if (!choices) {\n return 1;\n }\n\n const labelLengthsArr = choices.map((choice) => (choice.label || '').length);\n\n return Math.max(...labelLengthsArr);\n };\n\n changeLength = (event) => {\n const { lengthChanged } = this.props;\n const numberValue = parseInt(event.target.value, 10);\n const minLength = this.getChoicesMaxLength();\n\n if (numberValue && numberValue >= minLength && numberValue <= minLength + 10) {\n lengthChanged(numberValue);\n }\n };\n\n render() {\n const { classes, selectChoices, maxLength, showMaxLength, value, spellCheck, errors, pluginProps } = this.props;\n const { choices } = this.state;\n const minLength = this.getChoicesMaxLength();\n\n return (\n <div className={classes.design}>\n <div className={classes.selectContainer}>\n <Select\n className={classes.select}\n displayEmpty\n onChange={this.handleSelect}\n value={value || ''}\n readOnly={showMaxLength}\n >\n <MenuItem value=\"\">\n <em>{value ? 'Remove selection' : 'Select a response'}</em>\n </MenuItem>\n {selectChoices.map((c, index) => (\n <MenuItem key={index} value={c?.value}>\n {c?.label}\n </MenuItem>\n ))}\n </Select>\n\n {choices && choices.length > 0 && (\n <div className={classes.rightContainer}>\n {maxLength && showMaxLength && (\n <TextField\n className={classes.lengthField}\n label=\"Maximum length (characters)\"\n type=\"number\"\n inputProps={{\n min: minLength,\n max: minLength + 10,\n }}\n value={maxLength}\n onChange={this.changeLength}\n />\n )}\n <Button className={classes.addButton} variant=\"contained\" color=\"primary\" onClick={this.onAddChoice}>\n Add\n </Button>\n </div>\n )}\n </div>\n {errors && errors[0] && <div className={classes.errorText}>{errors[0]}</div>}\n\n <div className={classes.altChoices}>\n {choices &&\n choices.map(\n (c, index) =>\n index > 0 && (\n <Choice\n key={index}\n classes={classes}\n markup={c.label}\n onChange={(val) => this.onChoiceChanged(c, val, index)}\n onDelete={() => this.onRemoveChoice(c)}\n spellCheck={spellCheck}\n error={errors && errors[index]}\n showMaxLength={showMaxLength}\n pluginProps={pluginProps}\n />\n ),\n )}\n </div>\n </div>\n );\n }\n}\n\nconst Styled = withStyles(styles)(AlternateSection);\n\nexport default Styled;\n"],"file":"alternateSection.js"}
1
+ {"version":3,"sources":["../src/alternateSection.jsx"],"names":["styles","theme","design","marginBottom","spacing","unit","altChoices","alignItems","flexDirection","display","paddingTop","width","choice","flex","marginRight","deleteBtn","fill","palette","grey","selectContainer","justifyContent","rightContainer","lengthField","errorText","fontSize","typography","color","error","main","inputError","border","borderRadius","Choice","value","props","markup","onChange","e","strippedValue","setState","updateText","nextProps","state","classes","onDelete","spellCheck","showMaxLength","pluginProps","inputProps","maxLength","language","minWidth","isHidden","characters","disabled","React","Component","PropTypes","object","string","func","isRequired","bool","AlternateSection","choices","onSelect","selectChoices","target","find","c","length","label","map","parseInt","filter","id","isNaN","index","choiceChanged","lengthChanged","labelLengthsArr","newLength","Math","max","choiceRemoved","event","numberValue","minLength","getChoicesMaxLength","updateChoicesIfNeeded","errors","select","handleSelect","min","changeLength","addButton","onAddChoice","val","onChoiceChanged","onRemoveChoice","array","number","Styled"],"mappings":"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","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport debounce from 'lodash/debounce';\nimport isEqual from 'lodash/isEqual';\nimport OutlinedInput from '@material-ui/core/OutlinedInput';\nimport Button from '@material-ui/core/Button';\nimport Delete from '@material-ui/icons/Delete';\nimport IconButton from '@material-ui/core/IconButton';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Select from '@material-ui/core/Select';\nimport TextField from '@material-ui/core/TextField';\nimport { withStyles } from '@material-ui/core/styles';\nimport max from 'lodash/max';\nimport classnames from 'classnames';\nimport { EditableHtml } from '@pie-lib/pie-toolbox/editable-html';\nimport { stripHtmlTags, getAdjustedLength, decodeHTML } from './markupUtils';\n\nconst styles = (theme) => ({\n design: {\n marginBottom: theme.spacing.unit / 2,\n },\n altChoices: {\n alignItems: 'flex-start',\n flexDirection: 'column',\n display: 'flex',\n paddingTop: theme.spacing.unit * 2.5,\n '& > *': {\n marginBottom: theme.spacing.unit * 2.5,\n width: '100%',\n },\n },\n choice: {\n flex: '1',\n marginRight: theme.spacing.unit * 2.5,\n },\n deleteBtn: {\n fill: theme.palette.grey[600],\n },\n selectContainer: {\n alignItems: 'flex-end',\n display: 'flex',\n justifyContent: 'space-between',\n width: '100%',\n },\n rightContainer: {\n alignItems: 'center',\n display: 'flex',\n },\n lengthField: {\n width: '230px',\n marginRight: theme.spacing.unit * 2.5,\n },\n errorText: {\n fontSize: theme.typography.fontSize - 2,\n color: theme.palette.error.main,\n paddingTop: theme.spacing.unit / 2,\n },\n inputError: {\n border: `2px solid ${theme.palette.error.main}`,\n borderRadius: '6px',\n },\n});\n\nexport class Choice extends React.Component {\n static propTypes = {\n classes: PropTypes.object,\n error: PropTypes.string,\n markup: PropTypes.string,\n onChange: PropTypes.func.isRequired,\n onDelete: PropTypes.func.isRequired,\n value: PropTypes.string,\n spellCheck: PropTypes.bool,\n showMaxLength: PropTypes.bool,\n pluginProps: PropTypes.object\n };\n\n state = {\n value: this.props.markup,\n };\n\n updateText = debounce(this.props.onChange, 300);\n\n UNSAFE_componentWillReceiveProps(nextProps) {\n if (nextProps.markup) {\n this.setState({ value: nextProps.markup });\n }\n }\n\n onChange = (e) => {\n const strippedValue = stripHtmlTags(e);\n this.setState({ value: strippedValue });\n this.updateText(strippedValue);\n };\n\n render() {\n const { value } = this.state;\n const { classes, onDelete, spellCheck, error, showMaxLength, pluginProps } = this.props;\n const inputProps = showMaxLength ? {} : { maxLength: 25 };\n\n return (\n <React.Fragment>\n <div\n style={{\n alignItems: 'center',\n display: 'flex',\n justifyContent: 'space-between',\n }}\n >\n <EditableHtml\n className={classnames(classes.choice, error && classes.inputError)}\n disableUnderline\n onChange={this.onChange}\n markup={value || ''}\n activePlugins={['languageCharacters']}\n pluginProps={pluginProps}\n languageCharactersProps={[{ language: 'spanish' }]}\n spellCheck={spellCheck}\n autoWidthToolbar\n toolbarOpts={{\n minWidth: 'auto',\n isHidden: !!pluginProps?.characters?.disabled\n }}\n {...inputProps}\n />\n <IconButton aria-label=\"delete\" className={classes.deleteBtn} onClick={onDelete}>\n <Delete />\n </IconButton>\n </div>\n {error && <div className={classes.errorText}>{error}</div>}\n </React.Fragment>\n );\n }\n}\n\nexport class AlternateSection extends React.Component {\n static propTypes = {\n choices: PropTypes.array,\n selectChoices: PropTypes.array.isRequired,\n classes: PropTypes.object.isRequired,\n errors: PropTypes.object,\n onSelect: PropTypes.func.isRequired,\n choiceChanged: PropTypes.func.isRequired,\n lengthChanged: PropTypes.func,\n choiceRemoved: PropTypes.func.isRequired,\n value: PropTypes.string,\n maxLength: PropTypes.number,\n showMaxLength: PropTypes.bool,\n spellCheck: PropTypes.bool,\n pluginProps: PropTypes.object\n };\n\n state = {};\n\n UNSAFE_componentWillReceiveProps(nextProps) {\n this.updateChoicesIfNeeded(nextProps);\n }\n\n componentDidMount() {\n this.updateChoicesIfNeeded(this.props);\n }\n\n updateChoicesIfNeeded = (props) => {\n if (\n !this.state.choices ||\n !isEqual(props.choices, this.state.choices) ||\n !isEqual(props.choices, this.props.choices)\n ) {\n this.setState({\n choices: props.choices,\n });\n }\n };\n\n handleSelect = (e) => {\n const { onSelect, selectChoices } = this.props;\n const { value } = e.target;\n\n onSelect(selectChoices.find((c) => c.value === value));\n };\n\n onAddChoice = () => {\n const { choices } = this.state;\n\n if (choices.length && choices[choices.length - 1].label !== '') {\n const value = max(choices.map((c) => parseInt(c.value)).filter((id) => !isNaN(id))) || 0;\n\n this.setState({\n choices: [\n ...choices,\n {\n value: `${value + 1}`,\n label: '',\n },\n ],\n });\n }\n };\n\n onChoiceChanged = (choice, value, index) => {\n const { choiceChanged, lengthChanged, maxLength, choices } = this.props;\n\n const labelLengthsArr = choices.map((choice) => (choice.label || '').length);\n labelLengthsArr[index] = value.length;\n\n const newLength = Math.max(...labelLengthsArr);\n\n choiceChanged({\n ...choice,\n label: value,\n });\n\n if (newLength > maxLength || newLength + 10 <= maxLength) {\n lengthChanged(getAdjustedLength(newLength));\n }\n };\n\n onRemoveChoice = (choice) => {\n const { choiceRemoved } = this.props;\n\n choiceRemoved(choice.value);\n };\n\n getChoicesMaxLength = () => {\n const { choices } = this.state;\n\n if (!choices) {\n return 1;\n }\n\n const labelLengthsArr = choices.map((choice) => (choice.label || '').length);\n\n return Math.max(...labelLengthsArr);\n };\n\n changeLength = (event) => {\n const { lengthChanged } = this.props;\n const numberValue = parseInt(event.target.value, 10);\n const minLength = this.getChoicesMaxLength();\n\n if (numberValue && numberValue >= minLength && numberValue <= minLength + 10) {\n lengthChanged(numberValue);\n }\n };\n\n render() {\n const { classes, selectChoices, maxLength, showMaxLength, value, spellCheck, errors, pluginProps } = this.props;\n const { choices } = this.state;\n const minLength = this.getChoicesMaxLength();\n\n return (\n <div className={classes.design}>\n <div className={classes.selectContainer}>\n <Select\n className={classes.select}\n displayEmpty\n onChange={this.handleSelect}\n value={value || ''}\n readOnly={showMaxLength}\n >\n <MenuItem value=\"\">\n <em>{value ? 'Remove selection' : 'Select a response'}</em>\n </MenuItem>\n {selectChoices.map((c, index) => (\n <MenuItem key={index} value={c?.value}>\n {decodeHTML(c?.label)}\n </MenuItem>\n ))}\n </Select>\n\n {choices && choices.length > 0 && (\n <div className={classes.rightContainer}>\n {maxLength && showMaxLength && (\n <TextField\n className={classes.lengthField}\n label=\"Maximum length (characters)\"\n type=\"number\"\n inputProps={{\n min: minLength,\n max: minLength + 10,\n }}\n value={maxLength}\n onChange={this.changeLength}\n />\n )}\n <Button className={classes.addButton} variant=\"contained\" color=\"primary\" onClick={this.onAddChoice}>\n Add\n </Button>\n </div>\n )}\n </div>\n {errors && errors[0] && <div className={classes.errorText}>{errors[0]}</div>}\n\n <div className={classes.altChoices}>\n {choices &&\n choices.map(\n (c, index) =>\n index > 0 && (\n <Choice\n key={index}\n classes={classes}\n markup={c.label}\n onChange={(val) => this.onChoiceChanged(c, val, index)}\n onDelete={() => this.onRemoveChoice(c)}\n spellCheck={spellCheck}\n error={errors && errors[index]}\n showMaxLength={showMaxLength}\n pluginProps={pluginProps}\n />\n ),\n )}\n </div>\n </div>\n );\n }\n}\n\nconst Styled = withStyles(styles)(AlternateSection);\n\nexport default Styled;\n"],"file":"alternateSection.js"}
@@ -70,7 +70,7 @@ var ECRToolbar = /*#__PURE__*/function (_React$Component) {
70
70
  value = _this$props.value,
71
71
  onToolbarDone = _this$props.onToolbarDone,
72
72
  onChangeResponse = _this$props.onChangeResponse;
73
- var sanitizedMarkup = (0, _markupUtils.stripHtmlTags)(markup);
73
+ var sanitizedMarkup = (0, _markupUtils.decodeHTML)((0, _markupUtils.stripHtmlTags)(markup));
74
74
 
75
75
  _this.setState({
76
76
  markup: sanitizedMarkup
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ecr-toolbar.jsx"],"names":["findSlateNode","key","window","document","querySelector","ECRToolbar","markup","toolbarStyle","props","node","value","onToolbarDone","onChangeResponse","sanitizedMarkup","setState","updatedData","data","toJSON","change","setNodeByKey","nextText","getNextText","moveFocusTo","moveAnchorTo","respAreaMarkup","event","clickedInside","correctChoice","choice","domNode","domNodeRect","getBoundingClientRect","editor","closest","editorRect","top","left","label","position","height","width","classes","maxLengthPerChoiceEnabled","pluginProps","spellCheck","state","inputProps","maxLength","preventDone","onRespAreaChange","val","onDone","e","relatedTarget","onBlur","onKeyDown","language","minWidth","isHidden","characters","disabled","React","Component","PropTypes","object","func","isRequired","shape","bool","StyledECRToolbar","theme","backgroundColor","palette","common","white","outline","lineHeight"],"mappings":"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","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport { EditableHtml } from '@pie-lib/pie-toolbox/editable-html';\nimport { stripHtmlTags } from './markupUtils';\n\nconst findSlateNode = (key) => {\n return window.document.querySelector('[data-key=\"' + key + '\"]');\n};\n\nexport class ECRToolbar extends React.Component {\n static propTypes = {\n correctChoice: PropTypes.object,\n classes: PropTypes.object,\n node: PropTypes.object,\n onDone: PropTypes.func,\n onChangeResponse: PropTypes.func.isRequired,\n onToolbarDone: PropTypes.func.isRequired,\n value: PropTypes.shape({\n change: PropTypes.func.isRequired,\n document: PropTypes.shape({\n getNextText: PropTypes.func.isRequired,\n }),\n }),\n maxLengthPerChoiceEnabled: PropTypes.bool,\n pluginProps: PropTypes.object,\n spellCheck: PropTypes.bool,\n };\n\n state = {\n markup: '',\n toolbarStyle: {},\n };\n\n componentDidMount() {\n const { correctChoice, node } = this.props;\n const choice = correctChoice || {};\n\n const domNode = findSlateNode(node.key);\n\n if (domNode) {\n //eslint-disable-next-line\n const domNodeRect = domNode.getBoundingClientRect();\n const editor = domNode.closest('[data-slate-editor]');\n const editorRect = editor.getBoundingClientRect();\n const top = domNodeRect.top - editorRect.top;\n const left = domNodeRect.left - editorRect.left;\n\n this.setState({\n markup: choice.label,\n toolbarStyle: {\n position: 'absolute',\n top: `${top + domNodeRect.height + 17}px`,\n left: `${left + 20}px`,\n width: `${domNodeRect.width - 4}px`,\n },\n });\n }\n }\n\n onDone = (markup) => {\n const { node, value, onToolbarDone, onChangeResponse } = this.props;\n const sanitizedMarkup = stripHtmlTags(markup);\n this.setState({ markup: sanitizedMarkup });\n\n const updatedData = { ...node.data.toJSON(), value: sanitizedMarkup };\n const change = value.change().setNodeByKey(node.key, { data: updatedData });\n const nextText = value.document.getNextText(node.key);\n\n change.moveFocusTo(nextText.key, 0).moveAnchorTo(nextText.key, 0);\n onToolbarDone(change, true);\n onChangeResponse(sanitizedMarkup);\n };\n\n onRespAreaChange = (respAreaMarkup) => {\n this.setState({ respAreaMarkup });\n };\n\n onKeyDown = (event) => {\n if (event.key === 'Enter') {\n return false;\n }\n };\n\n onBlur = () => {\n if (this.clickedInside) {\n this.clickedInside = false;\n }\n };\n\n render() {\n const { classes, maxLengthPerChoiceEnabled, pluginProps, spellCheck } = this.props;\n const { markup, toolbarStyle } = this.state;\n const inputProps = maxLengthPerChoiceEnabled ? {} : { maxLength: 25 };\n\n return (\n <div style={toolbarStyle}>\n <EditableHtml\n autoFocus={true}\n className={classes.markup}\n disableUnderline\n onChange={(respAreaMarkup) => {\n if (this.preventDone) {\n return;\n }\n this.onRespAreaChange(respAreaMarkup);\n }}\n onDone={(val) => {\n if (this.preventDone) {\n return;\n }\n this.onDone(val);\n }}\n onBlur={(e) => {\n this.preventDone = e.relatedTarget && e.relatedTarget.closest('.insert-character-dialog');\n this.onBlur(e);\n }}\n onKeyDown={this.onKeyDown}\n markup={markup || ''}\n activePlugins={['languageCharacters']}\n pluginProps={pluginProps}\n languageCharactersProps={[{ language: 'spanish' }]}\n minHeight={'15px'}\n maxHeight={'15px'}\n spellCheck={spellCheck}\n autoWidthToolbar\n toolbarOpts={{\n minWidth: 'auto',\n isHidden: !!pluginProps?.characters?.disabled\n }}\n {...inputProps}\n />\n </div>\n );\n }\n}\n\nconst StyledECRToolbar = withStyles((theme) => ({\n markup: {\n backgroundColor: theme.palette.common.white,\n outline: 'none',\n lineHeight: '15px'\n },\n}))(ECRToolbar);\n\nexport default StyledECRToolbar;\n"],"file":"ecr-toolbar.js"}
1
+ {"version":3,"sources":["../src/ecr-toolbar.jsx"],"names":["findSlateNode","key","window","document","querySelector","ECRToolbar","markup","toolbarStyle","props","node","value","onToolbarDone","onChangeResponse","sanitizedMarkup","setState","updatedData","data","toJSON","change","setNodeByKey","nextText","getNextText","moveFocusTo","moveAnchorTo","respAreaMarkup","event","clickedInside","correctChoice","choice","domNode","domNodeRect","getBoundingClientRect","editor","closest","editorRect","top","left","label","position","height","width","classes","maxLengthPerChoiceEnabled","pluginProps","spellCheck","state","inputProps","maxLength","preventDone","onRespAreaChange","val","onDone","e","relatedTarget","onBlur","onKeyDown","language","minWidth","isHidden","characters","disabled","React","Component","PropTypes","object","func","isRequired","shape","bool","StyledECRToolbar","theme","backgroundColor","palette","common","white","outline","lineHeight"],"mappings":"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","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport { EditableHtml } from '@pie-lib/pie-toolbox/editable-html';\nimport { stripHtmlTags, decodeHTML } from './markupUtils';\n\nconst findSlateNode = (key) => {\n return window.document.querySelector('[data-key=\"' + key + '\"]');\n};\n\nexport class ECRToolbar extends React.Component {\n static propTypes = {\n correctChoice: PropTypes.object,\n classes: PropTypes.object,\n node: PropTypes.object,\n onDone: PropTypes.func,\n onChangeResponse: PropTypes.func.isRequired,\n onToolbarDone: PropTypes.func.isRequired,\n value: PropTypes.shape({\n change: PropTypes.func.isRequired,\n document: PropTypes.shape({\n getNextText: PropTypes.func.isRequired,\n }),\n }),\n maxLengthPerChoiceEnabled: PropTypes.bool,\n pluginProps: PropTypes.object,\n spellCheck: PropTypes.bool,\n };\n\n state = {\n markup: '',\n toolbarStyle: {},\n };\n\n componentDidMount() {\n const { correctChoice, node } = this.props;\n const choice = correctChoice || {};\n\n const domNode = findSlateNode(node.key);\n\n if (domNode) {\n //eslint-disable-next-line\n const domNodeRect = domNode.getBoundingClientRect();\n const editor = domNode.closest('[data-slate-editor]');\n const editorRect = editor.getBoundingClientRect();\n const top = domNodeRect.top - editorRect.top;\n const left = domNodeRect.left - editorRect.left;\n\n this.setState({\n markup: choice.label,\n toolbarStyle: {\n position: 'absolute',\n top: `${top + domNodeRect.height + 17}px`,\n left: `${left + 20}px`,\n width: `${domNodeRect.width - 4}px`,\n },\n });\n }\n }\n\n onDone = (markup) => {\n const { node, value, onToolbarDone, onChangeResponse } = this.props;\n const sanitizedMarkup = decodeHTML(stripHtmlTags(markup));\n this.setState({ markup: sanitizedMarkup });\n\n const updatedData = { ...node.data.toJSON(), value: sanitizedMarkup };\n const change = value.change().setNodeByKey(node.key, { data: updatedData });\n const nextText = value.document.getNextText(node.key);\n\n change.moveFocusTo(nextText.key, 0).moveAnchorTo(nextText.key, 0);\n onToolbarDone(change, true);\n onChangeResponse(sanitizedMarkup);\n };\n\n onRespAreaChange = (respAreaMarkup) => {\n this.setState({ respAreaMarkup });\n };\n\n onKeyDown = (event) => {\n if (event.key === 'Enter') {\n return false;\n }\n };\n\n onBlur = () => {\n if (this.clickedInside) {\n this.clickedInside = false;\n }\n };\n\n render() {\n const { classes, maxLengthPerChoiceEnabled, pluginProps, spellCheck } = this.props;\n const { markup, toolbarStyle } = this.state;\n const inputProps = maxLengthPerChoiceEnabled ? {} : { maxLength: 25 };\n\n return (\n <div style={toolbarStyle}>\n <EditableHtml\n autoFocus={true}\n className={classes.markup}\n disableUnderline\n onChange={(respAreaMarkup) => {\n if (this.preventDone) {\n return;\n }\n this.onRespAreaChange(respAreaMarkup);\n }}\n onDone={(val) => {\n if (this.preventDone) {\n return;\n }\n this.onDone(val);\n }}\n onBlur={(e) => {\n this.preventDone = e.relatedTarget && e.relatedTarget.closest('.insert-character-dialog');\n this.onBlur(e);\n }}\n onKeyDown={this.onKeyDown}\n markup={markup || ''}\n activePlugins={['languageCharacters']}\n pluginProps={pluginProps}\n languageCharactersProps={[{ language: 'spanish' }]}\n minHeight={'15px'}\n maxHeight={'15px'}\n spellCheck={spellCheck}\n autoWidthToolbar\n toolbarOpts={{\n minWidth: 'auto',\n isHidden: !!pluginProps?.characters?.disabled\n }}\n {...inputProps}\n />\n </div>\n );\n }\n}\n\nconst StyledECRToolbar = withStyles((theme) => ({\n markup: {\n backgroundColor: theme.palette.common.white,\n outline: 'none',\n lineHeight: '15px'\n },\n}))(ECRToolbar);\n\nexport default StyledECRToolbar;\n"],"file":"ecr-toolbar.js"}
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.stripHtmlTags = exports.removeUnwantedCharacters = exports.processMarkup = exports.getAdjustedLength = exports.createSlateMarkup = void 0;
8
+ exports.stripHtmlTags = exports.removeUnwantedCharacters = exports.processMarkup = exports.getAdjustedLength = exports.decodeHTML = exports.createSlateMarkup = void 0;
9
9
 
10
10
  var _escape = _interopRequireDefault(require("lodash/escape"));
11
11
 
@@ -84,4 +84,11 @@ var stripHtmlTags = function stripHtmlTags(markup) {
84
84
  };
85
85
 
86
86
  exports.stripHtmlTags = stripHtmlTags;
87
+
88
+ var decodeHTML = function decodeHTML(html) {
89
+ var doc = new DOMParser().parseFromString(html, 'text/html');
90
+ return doc.body.textContent || '';
91
+ };
92
+
93
+ exports.decodeHTML = decodeHTML;
87
94
  //# sourceMappingURL=markupUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/markupUtils.js"],"names":["tSymbols","nSymbols","matchTabAndNewLine","RegExp","removeUnwantedCharacters","markup","replace","createElementFromHTML","htmlString","div","document","createElement","innerHTML","trim","processMarkup","newMarkup","slateMarkup","index","querySelectorAll","forEach","s","replaceWith","REGEX","createSlateMarkup","choices","match","g","label","getAdjustedLength","length","stripHtmlTags"],"mappings":";;;;;;;;;AAAA;;AAEA;AACA,IAAMA,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;;;;AAGP,IAAMC,qBAAqB,GAAG,SAAxBA,qBAAwB,GAAqB;AAAA,MAApBC,UAAoB,uEAAP,EAAO;AACjD,MAAMC,GAAG,GAAGC,QAAQ,CAACC,aAAT,CAAuB,KAAvB,CAAZ;AAEAF,EAAAA,GAAG,CAACG,SAAJ,GAAgBJ,UAAU,CAACK,IAAX,EAAhB;AAEA,SAAOJ,GAAP;AACD,CAND;;AAQO,IAAMK,aAAa,GAAG,SAAhBA,aAAgB,CAACT,MAAD,EAAY;AACvC,MAAMU,SAAS,GAAGX,wBAAwB,CAACC,MAAM,IAAI,EAAX,CAA1C;AACA,MAAMW,WAAW,GAAGT,qBAAqB,CAACQ,SAAS,IAAI,EAAd,CAAzC;AACA,MAAIE,KAAK,GAAG,CAAZ;AAEAD,EAAAA,WAAW,CAACE,gBAAZ,CAA6B,6CAA7B,EAA4EC,OAA5E,CAAoF,UAACC,CAAD,EAAO;AACzFA,IAAAA,CAAC,CAACC,WAAF,aAAmBJ,KAAK,EAAxB;AACD,GAFD;AAIA,SAAOD,WAAW,CAACJ,SAAnB;AACD,CAVM;;;AAYP,IAAMU,KAAK,GAAG,gBAAd;;AAEO,IAAMC,iBAAiB,GAAG,SAApBA,iBAAoB,CAAClB,MAAD,EAASmB,OAAT,EAAqB;AACpD,MAAI,CAACnB,MAAL,EAAa;AACX,WAAO,EAAP;AACD;;AAED,MAAMU,SAAS,GAAGX,wBAAwB,CAACC,MAAD,CAA1C;AAEA,SAAOU,SAAS,CAACT,OAAV,CAAkBgB,KAAlB,EAAyB,UAACG,KAAD,EAAQC,CAAR,EAAc;AAC5C,QAAMC,KAAK,GAAGH,OAAO,CAACE,CAAD,CAAP,CAAW,CAAX,EAAcC,KAAd,IAAuB,EAArC;AAEA,oFAAsED,CAAtE,6BAAwF,wBAAOC,KAAP,CAAxF;AACD,GAJM,CAAP;AAKD,CAZM,C,CAcP;;;;;AACO,IAAMC,iBAAiB,GAAG,SAApBA,iBAAoB,CAACC,MAAD,EAAY;AAC3C,MAAIA,MAAM,IAAI,CAAd,EAAiB;AACf,WAAOA,MAAM,GAAG,CAAhB;AACD;;AAED,MAAIA,MAAM,IAAI,CAAd,EAAiB;AACf,WAAOA,MAAM,GAAG,CAAhB;AACD;;AAED,MAAIA,MAAM,IAAI,CAAd,EAAiB;AACf,WAAOA,MAAM,GAAG,CAAhB;AACD;;AAED,SAAOA,MAAM,GAAG,CAAhB;AACD,CAdM;;;;AAgBA,IAAMC,aAAa,GAAG,SAAhBA,aAAgB,CAACzB,MAAD,EAAY;AACvC,MAAI,OAAOA,MAAP,KAAkB,QAAtB,EAAgC;AAC9B,WAAO,EAAP;AACD;;AACD,SAAOA,MAAM,CAACC,OAAP,CAAe,iBAAf,EAAkC,EAAlC,CAAP;AACD,CALM","sourcesContent":["import escape from 'lodash/escape';\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\nconst createElementFromHTML = (htmlString = '') => {\n const div = document.createElement('div');\n\n div.innerHTML = htmlString.trim();\n\n return div;\n};\n\nexport const processMarkup = (markup) => {\n const newMarkup = removeUnwantedCharacters(markup || '');\n const slateMarkup = createElementFromHTML(newMarkup || '');\n let index = 0;\n\n slateMarkup.querySelectorAll('[data-type=\"explicit_constructed_response\"]').forEach((s) => {\n s.replaceWith(`{{${index++}}}`);\n });\n\n return slateMarkup.innerHTML;\n};\n\nconst REGEX = /\\{\\{(\\d+)\\}\\}/g;\n\nexport const createSlateMarkup = (markup, choices) => {\n if (!markup) {\n return '';\n }\n\n const newMarkup = removeUnwantedCharacters(markup);\n\n return newMarkup.replace(REGEX, (match, g) => {\n const label = choices[g][0].label || '';\n\n return `<span data-type=\"explicit_constructed_response\" data-index=\"${g}\" data-value=\"${escape(label)}\"></span>`;\n });\n};\n\n// also used in controller/src/index.js\nexport const getAdjustedLength = (length) => {\n if (length <= 2) {\n return length + 2;\n }\n\n if (length <= 4) {\n return length + 3;\n }\n\n if (length <= 6) {\n return length + 4;\n }\n\n return length + 5;\n};\n\nexport const stripHtmlTags = (markup) => {\n if (typeof markup !== 'string') {\n return '';\n }\n return markup.replace(/<\\/?[^>]+(>|$)/g, \"\");\n};"],"file":"markupUtils.js"}
1
+ {"version":3,"sources":["../src/markupUtils.js"],"names":["tSymbols","nSymbols","matchTabAndNewLine","RegExp","removeUnwantedCharacters","markup","replace","createElementFromHTML","htmlString","div","document","createElement","innerHTML","trim","processMarkup","newMarkup","slateMarkup","index","querySelectorAll","forEach","s","replaceWith","REGEX","createSlateMarkup","choices","match","g","label","getAdjustedLength","length","stripHtmlTags","decodeHTML","html","doc","DOMParser","parseFromString","body","textContent"],"mappings":"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","sourcesContent":["import escape from 'lodash/escape';\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\nconst createElementFromHTML = (htmlString = '') => {\n const div = document.createElement('div');\n\n div.innerHTML = htmlString.trim();\n\n return div;\n};\n\nexport const processMarkup = (markup) => {\n const newMarkup = removeUnwantedCharacters(markup || '');\n const slateMarkup = createElementFromHTML(newMarkup || '');\n let index = 0;\n\n slateMarkup.querySelectorAll('[data-type=\"explicit_constructed_response\"]').forEach((s) => {\n s.replaceWith(`{{${index++}}}`);\n });\n\n return slateMarkup.innerHTML;\n};\n\nconst REGEX = /\\{\\{(\\d+)\\}\\}/g;\n\nexport const createSlateMarkup = (markup, choices) => {\n if (!markup) {\n return '';\n }\n\n const newMarkup = removeUnwantedCharacters(markup);\n\n return newMarkup.replace(REGEX, (match, g) => {\n const label = choices[g][0].label || '';\n\n return `<span data-type=\"explicit_constructed_response\" data-index=\"${g}\" data-value=\"${escape(label)}\"></span>`;\n });\n};\n\n// also used in controller/src/index.js\nexport const getAdjustedLength = (length) => {\n if (length <= 2) {\n return length + 2;\n }\n\n if (length <= 4) {\n return length + 3;\n }\n\n if (length <= 6) {\n return length + 4;\n }\n\n return length + 5;\n};\n\nexport const stripHtmlTags = (markup) => {\n if (typeof markup !== 'string') {\n return '';\n }\n return markup.replace(/<\\/?[^>]+(>|$)/g, \"\");\n};\n\nexport const decodeHTML = (html) => {\n const doc = new DOMParser().parseFromString(html, 'text/html');\n return doc.body.textContent || '';\n};"],"file":"markupUtils.js"}
@@ -215,7 +215,7 @@ function model(question, session, env) {
215
215
  }
216
216
 
217
217
  var prepareVal = function prepareVal(html) {
218
- return getInnerText(html).trim();
218
+ return decodeHTML(getInnerText(html).trim());
219
219
  };
220
220
 
221
221
  exports.prepareVal = prepareVal;
@@ -305,6 +305,11 @@ var getInnerText = function getInnerText(html) {
305
305
  // Polyfill for replaceAll using replace and a global regex
306
306
  return html.replace(/<[^>]*>/g, '');
307
307
  }
308
+ };
309
+
310
+ var decodeHTML = function decodeHTML(html) {
311
+ var doc = new DOMParser().parseFromString(html, 'text/html');
312
+ return doc.body.textContent || '';
308
313
  }; // remove all html tags except img and iframe
309
314
 
310
315
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.js"],"names":["translator","Translator","log","prepareChoice","mode","defaultFeedback","choice","out","label","value","correct","feedbackType","feedback","type","getFeedback","getAdjustedLength","length","normalize","question","defaults","model","session","env","Promise","resolve","choices","Object","keys","forEach","key","map","item","index","normalizedQuestion","assign","incorrect","prepareChoiceFn","obj","area","respArea","chosenValue","val","c","prepareVal","showNote","values","some","note","t","lng","language","maxLengthPerChoice","maxLengthPerChoiceEnabled","undefinedLengths","labelLengthsArr","Math","max","disabled","displayType","role","markup","playerSpellCheckEnabled","prompt","promptEnabled","rationale","responseCorrect","getScore","undefined","teacherInstructions","responseAreaInputConfiguration","extraCSSRules","rationaleEnabled","teacherInstructionsEnabled","html","getInnerText","trim","config","responseAreas","match","maxScore","correctCount","total","str","toFixed","parseFloat","outcome","partialScoringEnabled","partialScoring","enabled","score","empty","createCorrectResponseSession","i","id","replaceAll","replace","getContent","validate","maxResponseAreas","allChoicesErrors","errors","field","required","entries","reversedChoices","reverse","choicesErrors","identicalAnswer","slice","nbOfResponseAreas"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;AAEA,IAAQA,UAAR,GAAuBC,sBAAvB,CAAQD,UAAR;AAEA,IAAME,GAAG,GAAG,uBAAM,0CAAN,CAAZ;;AAEO,IAAMC,aAAa,GAAG,SAAhBA,aAAgB,CAACC,IAAD,EAAOC,eAAP;AAAA,SAA2B,UAACC,MAAD,EAAY;AAClE,QAAMC,GAAG,GAAG;AACVC,MAAAA,KAAK,EAAEF,MAAM,CAACE,KADJ;AAEVC,MAAAA,KAAK,EAAEH,MAAM,CAACG;AAFJ,KAAZ;;AAKA,QAAIL,IAAI,KAAK,UAAb,EAAyB;AACvBG,MAAAA,GAAG,CAACG,OAAJ,GAAc,IAAd;AAEA,UAAMC,YAAY,GAAIL,MAAM,CAACM,QAAP,IAAmBN,MAAM,CAACM,QAAP,CAAgBC,IAApC,IAA6C,MAAlE;;AAEA,UAAIF,YAAY,KAAK,SAArB,EAAgC;AAC9BJ,QAAAA,GAAG,CAACK,QAAJ,GAAeP,eAAe,CAAC,SAAD,CAA9B;AACD,OAFD,MAEO,IAAIM,YAAY,KAAK,QAArB,EAA+B;AACpCJ,QAAAA,GAAG,CAACK,QAAJ,GAAeN,MAAM,CAACM,QAAP,CAAgBH,KAA/B;AACD;AACF;;AAED,WAAOF,GAAP;AACD,GAnB4B;AAAA,CAAtB;;;;AAqBP,IAAMO,WAAW,GAAG,SAAdA,WAAc,CAACL,KAAD,EAAW;AAC7B,MAAIA,KAAJ,EAAW;AACT,WAAO,SAAP;AACD;;AAED,SAAO,WAAP;AACD,CAND,C,CAQA;;;AACA,IAAMM,iBAAiB,GAAG,SAApBA,iBAAoB,CAACC,MAAD,EAAY;AACpC,MAAIA,MAAM,IAAI,CAAd,EAAiB;AACf,WAAOA,MAAM,GAAG,CAAhB;AACD;;AAED,MAAIA,MAAM,IAAI,CAAd,EAAiB;AACf,WAAOA,MAAM,GAAG,CAAhB;AACD;;AAED,MAAIA,MAAM,IAAI,CAAd,EAAiB;AACf,WAAOA,MAAM,GAAG,CAAhB;AACD;;AAED,SAAOA,MAAM,GAAG,CAAhB;AACD,CAdD;;AAgBO,IAAMC,SAAS,GAAG,SAAZA,SAAY,CAACC,QAAD;AAAA,yCAAoBC,oBAApB,GAAiCD,QAAjC;AAAA,CAAlB;AAEP;AACA;AACA;AACA;AACA;AACA;;;;;AACO,SAASE,KAAT,CAAeF,QAAf,EAAyBG,OAAzB,EAAkCC,GAAlC,EAAuC;AAC5C,SAAO,IAAIC,OAAJ;AAAA,6FAAY,iBAAOC,OAAP;AAAA;;AAAA;AAAA;AAAA;AAAA;AACjB;AACA;AACA,kBAAIN,QAAQ,CAACO,OAAb,EAAsB;AACpBC,gBAAAA,MAAM,CAACC,IAAP,CAAYT,QAAQ,CAACO,OAArB,EAA8BG,OAA9B,CAAsC,UAACC,GAAD,EAAS;AAC7CX,kBAAAA,QAAQ,CAACO,OAAT,CAAiBI,GAAjB,IAAwB,CAACX,QAAQ,CAACO,OAAT,CAAiBI,GAAjB,KAAyB,EAA1B,EAA8BC,GAA9B,CAAkC,UAACC,IAAD,EAAOC,KAAP,EAAiB;AACzE,wBAAI,CAACD,IAAI,CAACtB,KAAV,EAAiB;AACfP,sBAAAA,GAAG,CAAC,8DAAD,EAAiE6B,IAAjE,CAAH;AACA;AAAStB,wBAAAA,KAAK,YAAKuB,KAAL;AAAd,yBAA+BD,IAA/B;AACD;;AAED,2BAAOA,IAAP;AACD,mBAPuB,CAAxB;AAQD,iBATD;AAUD;;AAEKE,cAAAA,kBAhBW,GAgBUhB,SAAS,CAACC,QAAD,CAhBnB;AAiBXb,cAAAA,eAjBW,GAiBOqB,MAAM,CAACQ,MAAP,CACtB;AAAExB,gBAAAA,OAAO,EAAE,SAAX;AAAsByB,gBAAAA,SAAS,EAAE;AAAjC,eADsB,EAEtBF,kBAAkB,CAAC5B,eAFG,CAjBP;AAqBX+B,cAAAA,eArBW,GAqBOjC,aAAa,CAACmB,GAAG,CAAClB,IAAL,EAAWC,eAAX,CArBpB;AAsBXoB,cAAAA,OAtBW,GAsBD,wBACdQ,kBAAkB,CAACR,OADL,EAEd,UAACY,GAAD,EAAMC,IAAN,EAAYT,GAAZ,EAAoB;AAClBQ,gBAAAA,GAAG,CAACR,GAAD,CAAH,GAAW,qBAAIS,IAAJ,EAAUF,eAAV,CAAX;AAEA,uBAAOC,GAAP;AACD,eANa,EAOd,EAPc,CAtBC;AAAA,sBAgCMhB,OAAO,IAAI,EAhCjB,sBAgCTZ,KAhCS,EAgCTA,KAhCS,4BAgCD,EAhCC;AAiCXG,cAAAA,QAjCW,GAkCfU,GAAG,CAAClB,IAAJ,KAAa,UAAb,GACI,wBACE6B,kBAAkB,CAACR,OADrB,EAEE,UAACY,GAAD,EAAME,QAAN,EAAgBV,GAAhB,EAAwB;AACtB,oBAAMW,WAAW,GAAG/B,KAAK,IAAIA,KAAK,CAACoB,GAAD,CAAlC;AACA,oBAAMY,GAAG,GACP,CAAC,yBAAQD,WAAR,CAAD,IAAyB,sBAAKD,QAAL,EAAe,UAACG,CAAD;AAAA,yBAAOC,UAAU,CAACD,CAAC,CAAClC,KAAH,CAAV,KAAwBmC,UAAU,CAACH,WAAD,CAAzC;AAAA,iBAAf,CAD3B;AAGAH,gBAAAA,GAAG,CAACR,GAAD,CAAH,GAAWf,WAAW,CAAC2B,GAAD,CAAtB;AAEA,uBAAOJ,GAAP;AACD,eAVH,EAWE,EAXF,CADJ,GAcI,EAhDW,EAkDjB;;AACMO,cAAAA,QAnDW,GAmDAlB,MAAM,CAACmB,MAAP,CAAcpB,OAAd,EAAuBqB,IAAvB,CAA4B,UAACxC,MAAD;AAAA,uBAAY,CAAAA,MAAM,SAAN,IAAAA,MAAM,WAAN,YAAAA,MAAM,CAAEU,MAAR,IAAiB,CAA7B;AAAA,eAA5B,CAnDA;AAoDX+B,cAAAA,IApDW,GAqDfd,kBAAkB,CAACc,IAAnB,IACA/C,UAAU,CAACgD,CAAX,CAAa,0CAAb,EAAyD;AAAEC,gBAAAA,GAAG,EAAEhB,kBAAkB,CAACiB;AAA1B,eAAzD,CAtDe;AAAA,sCAwD8CjB,kBAxD9C,CAwDTkB,kBAxDS,EAwDTA,kBAxDS,sCAwDY,EAxDZ,0BAwDgBC,yBAxDhB,GAwD8CnB,kBAxD9C,CAwDgBmB,yBAxDhB;AAyDXC,cAAAA,gBAzDW,GAyDQ,CAACF,kBAAkB,CAACnC,MAzD5B,EA2DjB;;AACAU,cAAAA,MAAM,CAACmB,MAAP,CAAcpB,OAAd,EAAuBG,OAAvB,CAA+B,UAACtB,MAAD,EAAS0B,KAAT,EAAmB;AAChD,oBAAMsB,eAAe,GAAG,CAAChD,MAAM,IAAI,EAAX,EAAewB,GAAf,CAAmB,UAACxB,MAAD;AAAA,yBAAY,CAACA,MAAM,CAACE,KAAP,IAAgB,EAAjB,EAAqBQ,MAAjC;AAAA,iBAAnB,CAAxB;AACA,oBAAMA,MAAM,GAAGuC,IAAI,CAACC,GAAL,OAAAD,IAAI,sCAAQD,eAAR,EAAnB;;AAEA,oBACED,gBAAgB,IAChB,CAACF,kBAAkB,CAACnB,KAAD,CADnB,IAEAmB,kBAAkB,CAACnB,KAAD,CAAlB,GAA4BhB,MAF5B,IAGAmC,kBAAkB,CAACnB,KAAD,CAAlB,GAA4BhB,MAAM,GAAG,EAJvC,EAKE;AACAmC,kBAAAA,kBAAkB,CAACnB,KAAD,CAAlB,GAA4BjB,iBAAiB,CAACC,MAAD,CAA7C;AACD;AACF,eAZD;AAcMT,cAAAA,GA1EW,GA0EL;AACVkB,gBAAAA,OAAO,EAAPA,OADU;AAEVgC,gBAAAA,QAAQ,EAAEnC,GAAG,CAAClB,IAAJ,KAAa,QAFb;AAGVsD,gBAAAA,WAAW,EAAEzB,kBAAkB,CAACyB,WAHtB;AAIVtD,gBAAAA,IAAI,EAAEkB,GAAG,CAAClB,IAJA;AAKVuD,gBAAAA,IAAI,EAAErC,GAAG,CAACqC,IALA;AAMV/C,gBAAAA,QAAQ,EAARA,QANU;AAOVsC,gBAAAA,QAAQ,EAAEjB,kBAAkB,CAACiB,QAPnB;AAQVU,gBAAAA,MAAM,EAAE3B,kBAAkB,CAAC2B,MARjB;AASVT,gBAAAA,kBAAkB,EAAlBA,kBATU;AAUVC,gBAAAA,yBAAyB,EAAzBA,yBAVU;AAWVL,gBAAAA,IAAI,EAAJA,IAXU;AAYVc,gBAAAA,uBAAuB,EAAE5B,kBAAkB,CAAC4B,uBAZlC;AAaVC,gBAAAA,MAAM,EAAE7B,kBAAkB,CAAC8B,aAAnB,GAAmC9B,kBAAkB,CAAC6B,MAAtD,GAA+D3C,qBAAS2C,MAbtE;AAcVE,gBAAAA,SAAS,EAAE7C,qBAAS6C,SAdV;AAeVC,gBAAAA,eAAe,EAAE3C,GAAG,CAAClB,IAAJ,KAAa,UAAb,GAA0B8D,QAAQ,CAACjC,kBAAD,EAAqBZ,OAArB,CAAR,KAA0C,CAApE,GAAwE8C,SAf/E;AAgBVvB,gBAAAA,QAAQ,EAARA,QAhBU;AAiBVwB,gBAAAA,mBAAmB,EAAEjD,qBAASiD,mBAjBpB;AAkBVC,gBAAAA,8BAA8B,EAAEpC,kBAAkB,CAACoC,8BAlBzC;AAmBVC,gBAAAA,aAAa,EAAErC,kBAAkB,CAACqC;AAnBxB,eA1EK;;AAgGjB,kBAAIhD,GAAG,CAACqC,IAAJ,KAAa,YAAb,KAA8BrC,GAAG,CAAClB,IAAJ,KAAa,MAAb,IAAuBkB,GAAG,CAAClB,IAAJ,KAAa,UAAlE,CAAJ,EAAmF;AACjFG,gBAAAA,GAAG,CAACyD,SAAJ,GAAgB/B,kBAAkB,CAACsC,gBAAnB,GAAsCtC,kBAAkB,CAAC+B,SAAzD,GAAqE7C,qBAAS6C,SAA9F;AACAzD,gBAAAA,GAAG,CAAC6D,mBAAJ,GAA0BnC,kBAAkB,CAACuC,0BAAnB,GACtBvC,kBAAkB,CAACmC,mBADG,GAEtBjD,qBAASiD,mBAFb;AAGD;;AAED5C,cAAAA,OAAO,CAACjB,GAAD,CAAP;;AAvGiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAAZ;;AAAA;AAAA;AAAA;AAAA,MAAP;AAyGD;;AAEM,IAAMoC,UAAU,GAAG,SAAbA,UAAa,CAAC8B,IAAD,EAAU;AAClC,SAAOC,YAAY,CAACD,IAAD,CAAZ,CAAmBE,IAAnB,EAAP;AACD,CAFM;;;;AAIA,IAAMT,QAAQ,GAAG,SAAXA,QAAW,CAACU,MAAD,EAASvD,OAAT,EAAqB;AAC3C,cAAkBA,OAAO,IAAI,EAA7B;AAAA,MAAQZ,KAAR,SAAQA,KAAR;;AAEA,MAAI,CAACY,OAAD,IAAY,yBAAQA,OAAR,CAAZ,IAAgC,CAACZ,KAArC,EAA4C;AAC1C,WAAO,CAAP;AACD;;AAED,MAAMoE,aAAa,GAAGD,MAAM,CAAChB,MAAP,IAAiBgB,MAAM,CAAChB,MAAP,CAAckB,KAAd,CAAoB,gBAApB,CAAvC;AACA,MAAMC,QAAQ,GAAGF,aAAa,GAAGA,aAAa,CAAC7D,MAAjB,GAA0B,CAAxD;AACA,MAAMgE,YAAY,GAAG,wBACnBJ,MAAM,CAACnD,OADY,EAEnB,UAACwD,KAAD,EAAQ1C,QAAR,EAAkBV,GAAlB,EAA0B;AACxB,QAAMW,WAAW,GAAG/B,KAAK,IAAIA,KAAK,CAACoB,GAAD,CAAlC;;AAEA,QAAI,yBAAQW,WAAR,KAAwB,CAAC,sBAAKD,QAAL,EAAe,UAACG,CAAD;AAAA,aAAOC,UAAU,CAACD,CAAC,CAAClC,KAAH,CAAV,KAAwBmC,UAAU,CAACH,WAAD,CAAzC;AAAA,KAAf,CAA7B,EAAqG;AACnG,aAAOyC,KAAP;AACD;;AAED,WAAOA,KAAK,GAAG,CAAf;AACD,GAVkB,EAWnB,CAXmB,CAArB;AAcA,MAAMC,GAAG,GAAGH,QAAQ,GAAG,CAACC,YAAY,GAAGD,QAAhB,EAA0BI,OAA1B,CAAkC,CAAlC,CAAH,GAA0C,CAA9D;AAEA,SAAOC,UAAU,CAACF,GAAD,CAAjB;AACD,CA1BM;AA4BP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AACO,SAASG,OAAT,CAAiBjE,KAAjB,EAAwBC,OAAxB,EAA2C;AAAA,MAAVC,GAAU,uEAAJ,EAAI;AAChD,SAAO,IAAIC,OAAJ,CAAY,UAACC,OAAD,EAAa;AAC9B,QAAM8D,qBAAqB,GAAGC,gCAAeC,OAAf,CAAuBpE,KAAvB,EAA8BE,GAA9B,CAA9B;;AACA,QAAMmE,KAAK,GAAGvB,QAAQ,CAAC9C,KAAD,EAAQC,OAAR,CAAtB;AAEAG,IAAAA,OAAO,CAAC;AAAEiE,MAAAA,KAAK,EAAEH,qBAAqB,GAAGG,KAAH,GAAWA,KAAK,KAAK,CAAV,GAAc,CAAd,GAAkB,CAA3D;AAA8DC,MAAAA,KAAK,EAAE,yBAAQrE,OAAR;AAArE,KAAD,CAAP;AACD,GALM,CAAP;AAMD;;AAEM,IAAMsE,4BAA4B,GAAG,SAA/BA,4BAA+B,CAACzE,QAAD,EAAWI,GAAX,EAAmB;AAC7D,SAAO,IAAIC,OAAJ,CAAY,UAACC,OAAD,EAAa;AAC9B,QAAIF,GAAG,CAAClB,IAAJ,KAAa,UAAb,IAA2BkB,GAAG,CAACqC,IAAJ,KAAa,YAA5C,EAA0D;AACxD,UAAQlC,OAAR,GAAoBP,QAApB,CAAQO,OAAR;AACA,UAAMhB,KAAK,GAAG,EAAd;AAEAiB,MAAAA,MAAM,CAACC,IAAP,CAAYF,OAAZ,EAAqBG,OAArB,CAA6B,UAACC,GAAD,EAAM+D,CAAN,EAAY;AACvCnF,QAAAA,KAAK,CAACmF,CAAD,CAAL,GAAWnE,OAAO,CAACI,GAAD,CAAP,CAAa,CAAb,EAAgBrB,KAA3B;AACD,OAFD;AAIAgB,MAAAA,OAAO,CAAC;AAAEqE,QAAAA,EAAE,EAAE,GAAN;AAAWpF,QAAAA,KAAK,EAALA;AAAX,OAAD,CAAP;AACD,KATD,MASO;AACLe,MAAAA,OAAO,CAAC,IAAD,CAAP;AACD;AACF,GAbM,CAAP;AAcD,CAfM,C,CAiBP;AACA;;;;;AACA,IAAMkD,YAAY,GAAG,SAAfA,YAAe,CAACD,IAAD,EAAU;AAC7B,MAAI,OAAOA,IAAP,KAAgB,QAApB,EAA8B;AAC5B,WAAO,EAAP;AACD;;AACD,MAAI,OAAOA,IAAI,CAACqB,UAAZ,KAA2B,UAA/B,EAA2C;AACzC,WAAOrB,IAAI,CAACqB,UAAL,CAAgB,UAAhB,EAA4B,EAA5B,CAAP;AACD,GAFD,MAEO;AACD;AACJ,WAAOrB,IAAI,CAACsB,OAAL,CAAa,UAAb,EAAyB,EAAzB,CAAP;AACD;AACF,CAVD,C,CAYA;;;AACA,IAAMC,UAAU,GAAG,SAAbA,UAAa,CAACvB,IAAD;AAAA,SAAU,CAACA,IAAI,IAAI,EAAT,EAAasB,OAAb,CAAqB,6BAArB,EAAoD,EAApD,CAAV;AAAA,CAAnB;;AAEO,IAAME,QAAQ,GAAG,SAAXA,QAAW,GAA6B;AAAA,MAA5B7E,KAA4B,uEAApB,EAAoB;AAAA,MAAhBwD,MAAgB,uEAAP,EAAO;AACnD,MAAQnD,OAAR,GAA4BL,KAA5B,CAAQK,OAAR;AAAA,MAAiBmC,MAAjB,GAA4BxC,KAA5B,CAAiBwC,MAAjB;AACA,MAAQsC,gBAAR,GAA6BtB,MAA7B,CAAQsB,gBAAR;AACA,MAAMC,gBAAgB,GAAG,EAAzB;AACA,MAAMC,MAAM,GAAG,EAAf;AAEA,GAAC,qBAAD,EAAwB,QAAxB,EAAkC,WAAlC,EAA+CxE,OAA/C,CAAuD,UAACyE,KAAD,EAAW;AAAA;;AAChE,QAAI,iBAAAzB,MAAM,CAACyB,KAAD,CAAN,wDAAeC,QAAf,IAA2B,CAACN,UAAU,CAAC5E,KAAK,CAACiF,KAAD,CAAN,CAA1C,EAA0D;AACxDD,MAAAA,MAAM,CAACC,KAAD,CAAN,GAAgB,yBAAhB;AACD;AACF,GAJD;AAMA3E,EAAAA,MAAM,CAAC6E,OAAP,CAAe9E,OAAO,IAAI,EAA1B,EAA8BG,OAA9B,CAAsC,iBAAmB;AAAA;AAAA,QAAjBC,GAAiB;AAAA,QAAZgB,MAAY;;AACvD,QAAM2D,eAAe,GAAG,oCAAK3D,MAAM,IAAI,EAAf,EAAoB4D,OAApB,EAAxB;AACA,QAAMC,aAAa,GAAG,EAAtB;AAEAF,IAAAA,eAAe,CAAC5E,OAAhB,CAAwB,UAACtB,MAAD,EAAS0B,KAAT,EAAmB;AACzC,UAAQvB,KAAR,GAAyBH,MAAzB,CAAQG,KAAR;AAAA,UAAeD,KAAf,GAAyBF,MAAzB,CAAeE,KAAf;;AAEA,UAAIA,KAAK,KAAK,EAAV,IAAgBA,KAAK,KAAK,aAA9B,EAA6C;AAC3CkG,QAAAA,aAAa,CAACjG,KAAD,CAAb,GAAuB,8BAAvB;AACD,OAFD,MAEO;AACL,YAAMkG,eAAe,GAAGH,eAAe,CAACI,KAAhB,CAAsB5E,KAAK,GAAG,CAA9B,EAAiCc,IAAjC,CAAsC,UAACJ,CAAD;AAAA,iBAAOA,CAAC,CAAClC,KAAF,KAAYA,KAAnB;AAAA,SAAtC,CAAxB;;AAEA,YAAImG,eAAJ,EAAqB;AACnBD,UAAAA,aAAa,CAACjG,KAAD,CAAb,GAAuB,2BAAvB;AACD;AACF;AACF,KAZD;;AAcA,QAAI,CAAC,yBAAQiG,aAAR,CAAL,EAA6B;AAC3BP,MAAAA,gBAAgB,CAACtE,GAAD,CAAhB,GAAwB6E,aAAxB;AACD;AACF,GArBD;AAuBA,MAAMG,iBAAiB,GAAG,CAACjD,MAAM,CAACkB,KAAP,CAAa,gBAAb,KAAkC,EAAnC,EAAuC9D,MAAjE;;AAEA,MAAI6F,iBAAiB,GAAGX,gBAAxB,EAA0C;AACxCE,IAAAA,MAAM,CAACvB,aAAP,0BAAuCqB,gBAAvC;AACD,GAFD,MAEO,IAAIW,iBAAiB,GAAG,CAAxB,EAA2B;AAChCT,IAAAA,MAAM,CAACvB,aAAP,GAAuB,mDAAvB;AACD;;AAED,MAAI,CAAC,yBAAQsB,gBAAR,CAAL,EAAgC;AAC9BC,IAAAA,MAAM,CAAC3E,OAAP,GAAiB0E,gBAAjB;AACD;;AAED,SAAOC,MAAP;AACD,CAhDM","sourcesContent":["import debug from 'debug';\nimport map from 'lodash/map';\nimport reduce from 'lodash/reduce';\nimport find from 'lodash/find';\nimport isEmpty from 'lodash/isEmpty';\nimport { partialScoring } from '@pie-lib/pie-toolbox/controller-utils';\nimport Translator from '@pie-lib/pie-toolbox/translator';\nimport defaults from './defaults';\n\nconst { translator } = Translator;\n\nconst log = debug('explicit-constructed-response:controller');\n\nexport const prepareChoice = (mode, defaultFeedback) => (choice) => {\n const out = {\n label: choice.label,\n value: choice.value,\n };\n\n if (mode === 'evaluate') {\n out.correct = true;\n\n const feedbackType = (choice.feedback && choice.feedback.type) || 'none';\n\n if (feedbackType === 'default') {\n out.feedback = defaultFeedback['correct'];\n } else if (feedbackType === 'custom') {\n out.feedback = choice.feedback.value;\n }\n }\n\n return out;\n};\n\nconst getFeedback = (value) => {\n if (value) {\n return 'correct';\n }\n\n return 'incorrect';\n};\n\n// also used in configure/src/markupUtils.js\nconst getAdjustedLength = (length) => {\n if (length <= 2) {\n return length + 2;\n }\n\n if (length <= 4) {\n return length + 3;\n }\n\n if (length <= 6) {\n return length + 4;\n }\n\n return length + 5;\n};\n\nexport const normalize = (question) => ({ ...defaults, ...question });\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n */\nexport function model(question, session, env) {\n return new Promise(async (resolve) => {\n // this was added to treat an exception, when the model has choices without\n // the \"value\" property like: { label: 'test' }\n if (question.choices) {\n Object.keys(question.choices).forEach((key) => {\n question.choices[key] = (question.choices[key] || []).map((item, index) => {\n if (!item.value) {\n log('Choice does not contain \"value\" property, which is required.', item);\n return { value: `${index}`, ...item };\n }\n\n return item;\n });\n });\n }\n\n const normalizedQuestion = normalize(question);\n const defaultFeedback = Object.assign(\n { correct: 'Correct', incorrect: 'Incorrect' },\n normalizedQuestion.defaultFeedback,\n );\n const prepareChoiceFn = prepareChoice(env.mode, defaultFeedback);\n const choices = reduce(\n normalizedQuestion.choices,\n (obj, area, key) => {\n obj[key] = map(area, prepareChoiceFn);\n\n return obj;\n },\n {},\n );\n\n const { value = {} } = session || {};\n const feedback =\n env.mode === 'evaluate'\n ? reduce(\n normalizedQuestion.choices,\n (obj, respArea, key) => {\n const chosenValue = value && value[key];\n const val =\n !isEmpty(chosenValue) && find(respArea, (c) => prepareVal(c.label) === prepareVal(chosenValue));\n\n obj[key] = getFeedback(val);\n\n return obj;\n },\n {},\n )\n : {};\n\n // check if at least one choice has an alternate\n const showNote = Object.values(choices).some((choice) => choice?.length > 1);\n const note =\n normalizedQuestion.note ||\n translator.t('common:commonCorrectAnswerWithAlternates', { lng: normalizedQuestion.language });\n\n const { maxLengthPerChoice = [], maxLengthPerChoiceEnabled } = normalizedQuestion;\n const undefinedLengths = !maxLengthPerChoice.length;\n\n // calculate maxLengthPerChoice array if it is not defined or defined incorrectly\n Object.values(choices).forEach((choice, index) => {\n const labelLengthsArr = (choice || []).map((choice) => (choice.label || '').length);\n const length = Math.max(...labelLengthsArr);\n\n if (\n undefinedLengths ||\n !maxLengthPerChoice[index] ||\n maxLengthPerChoice[index] < length ||\n maxLengthPerChoice[index] > length + 10\n ) {\n maxLengthPerChoice[index] = getAdjustedLength(length);\n }\n });\n\n const out = {\n choices,\n disabled: env.mode !== 'gather',\n displayType: normalizedQuestion.displayType,\n mode: env.mode,\n role: env.role,\n feedback,\n language: normalizedQuestion.language,\n markup: normalizedQuestion.markup,\n maxLengthPerChoice,\n maxLengthPerChoiceEnabled,\n note,\n playerSpellCheckEnabled: normalizedQuestion.playerSpellCheckEnabled,\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : defaults.prompt,\n rationale: defaults.rationale,\n responseCorrect: env.mode === 'evaluate' ? getScore(normalizedQuestion, session) === 1 : undefined,\n showNote,\n teacherInstructions: defaults.teacherInstructions,\n responseAreaInputConfiguration: normalizedQuestion.responseAreaInputConfiguration,\n extraCSSRules: normalizedQuestion.extraCSSRules,\n };\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : defaults.rationale;\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : defaults.teacherInstructions;\n }\n\n resolve(out);\n });\n}\n\nexport const prepareVal = (html) => {\n return getInnerText(html).trim();\n};\n\nexport const getScore = (config, session) => {\n const { value } = session || {};\n\n if (!session || isEmpty(session) || !value) {\n return 0;\n }\n\n const responseAreas = config.markup && config.markup.match(/\\{\\{(.+?)\\}\\}/g);\n const maxScore = responseAreas ? responseAreas.length : 0;\n const correctCount = reduce(\n config.choices,\n (total, respArea, key) => {\n const chosenValue = value && value[key];\n\n if (isEmpty(chosenValue) || !find(respArea, (c) => prepareVal(c.label) === prepareVal(chosenValue))) {\n return total;\n }\n\n return total + 1;\n },\n 0,\n );\n\n const str = maxScore ? (correctCount / maxScore).toFixed(2) : 0;\n\n return parseFloat(str);\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({ score: partialScoringEnabled ? score : score === 1 ? 1 : 0, empty: isEmpty(session) });\n });\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { choices } = question;\n const value = {};\n\n Object.keys(choices).forEach((key, i) => {\n value[i] = choices[key][0].label;\n });\n\n resolve({ id: '1', value });\n } else {\n resolve(null);\n }\n });\n};\n\n// remove all html tags\n// const getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');\nconst getInnerText = (html) => {\n if (typeof html !== 'string') {\n return '';\n }\n if (typeof html.replaceAll === 'function') {\n return html.replaceAll(/<[^>]*>/g, '');\n } else {\n // Polyfill for replaceAll using replace and a global regex\n return html.replace(/<[^>]*>/g, '');\n }\n};\n\n// remove all html tags except img and iframe\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const { choices, markup } = model;\n const { maxResponseAreas } = config;\n const allChoicesErrors = {};\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 Object.entries(choices || {}).forEach(([key, values]) => {\n const reversedChoices = [...(values || [])].reverse();\n const choicesErrors = {};\n\n reversedChoices.forEach((choice, index) => {\n const { value, label } = choice;\n\n if (label === '' || label === '<div></div>') {\n choicesErrors[value] = 'Content should not be empty.';\n } else {\n const identicalAnswer = reversedChoices.slice(index + 1).some((c) => c.label === label);\n\n if (identicalAnswer) {\n choicesErrors[value] = 'Content should be unique.';\n }\n }\n });\n\n if (!isEmpty(choicesErrors)) {\n allChoicesErrors[key] = choicesErrors;\n }\n });\n\n const nbOfResponseAreas = (markup.match(/\\{\\{(\\d+)\\}\\}/g) || []).length;\n\n if (nbOfResponseAreas > maxResponseAreas) {\n errors.responseAreas = `No more than ${maxResponseAreas} response areas should be defined.`;\n } else if (nbOfResponseAreas < 1) {\n errors.responseAreas = 'There should be at least 1 response area defined.';\n }\n\n if (!isEmpty(allChoicesErrors)) {\n errors.choices = allChoicesErrors;\n }\n\n return errors;\n};\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../src/index.js"],"names":["translator","Translator","log","prepareChoice","mode","defaultFeedback","choice","out","label","value","correct","feedbackType","feedback","type","getFeedback","getAdjustedLength","length","normalize","question","defaults","model","session","env","Promise","resolve","choices","Object","keys","forEach","key","map","item","index","normalizedQuestion","assign","incorrect","prepareChoiceFn","obj","area","respArea","chosenValue","val","c","prepareVal","showNote","values","some","note","t","lng","language","maxLengthPerChoice","maxLengthPerChoiceEnabled","undefinedLengths","labelLengthsArr","Math","max","disabled","displayType","role","markup","playerSpellCheckEnabled","prompt","promptEnabled","rationale","responseCorrect","getScore","undefined","teacherInstructions","responseAreaInputConfiguration","extraCSSRules","rationaleEnabled","teacherInstructionsEnabled","html","decodeHTML","getInnerText","trim","config","responseAreas","match","maxScore","correctCount","total","str","toFixed","parseFloat","outcome","partialScoringEnabled","partialScoring","enabled","score","empty","createCorrectResponseSession","i","id","replaceAll","replace","doc","DOMParser","parseFromString","body","textContent","getContent","validate","maxResponseAreas","allChoicesErrors","errors","field","required","entries","reversedChoices","reverse","choicesErrors","identicalAnswer","slice","nbOfResponseAreas"],"mappings":"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","sourcesContent":["import debug from 'debug';\nimport map from 'lodash/map';\nimport reduce from 'lodash/reduce';\nimport find from 'lodash/find';\nimport isEmpty from 'lodash/isEmpty';\nimport { partialScoring } from '@pie-lib/pie-toolbox/controller-utils';\nimport Translator from '@pie-lib/pie-toolbox/translator';\nimport defaults from './defaults';\n\nconst { translator } = Translator;\n\nconst log = debug('explicit-constructed-response:controller');\n\nexport const prepareChoice = (mode, defaultFeedback) => (choice) => {\n const out = {\n label: choice.label,\n value: choice.value,\n };\n\n if (mode === 'evaluate') {\n out.correct = true;\n\n const feedbackType = (choice.feedback && choice.feedback.type) || 'none';\n\n if (feedbackType === 'default') {\n out.feedback = defaultFeedback['correct'];\n } else if (feedbackType === 'custom') {\n out.feedback = choice.feedback.value;\n }\n }\n\n return out;\n};\n\nconst getFeedback = (value) => {\n if (value) {\n return 'correct';\n }\n\n return 'incorrect';\n};\n\n// also used in configure/src/markupUtils.js\nconst getAdjustedLength = (length) => {\n if (length <= 2) {\n return length + 2;\n }\n\n if (length <= 4) {\n return length + 3;\n }\n\n if (length <= 6) {\n return length + 4;\n }\n\n return length + 5;\n};\n\nexport const normalize = (question) => ({ ...defaults, ...question });\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n */\nexport function model(question, session, env) {\n return new Promise(async (resolve) => {\n // this was added to treat an exception, when the model has choices without\n // the \"value\" property like: { label: 'test' }\n if (question.choices) {\n Object.keys(question.choices).forEach((key) => {\n question.choices[key] = (question.choices[key] || []).map((item, index) => {\n if (!item.value) {\n log('Choice does not contain \"value\" property, which is required.', item);\n return { value: `${index}`, ...item };\n }\n\n return item;\n });\n });\n }\n\n const normalizedQuestion = normalize(question);\n const defaultFeedback = Object.assign(\n { correct: 'Correct', incorrect: 'Incorrect' },\n normalizedQuestion.defaultFeedback,\n );\n const prepareChoiceFn = prepareChoice(env.mode, defaultFeedback);\n const choices = reduce(\n normalizedQuestion.choices,\n (obj, area, key) => {\n obj[key] = map(area, prepareChoiceFn);\n\n return obj;\n },\n {},\n );\n\n const { value = {} } = session || {};\n const feedback =\n env.mode === 'evaluate'\n ? reduce(\n normalizedQuestion.choices,\n (obj, respArea, key) => {\n const chosenValue = value && value[key];\n const val =\n !isEmpty(chosenValue) && find(respArea, (c) => prepareVal(c.label) === prepareVal(chosenValue));\n\n obj[key] = getFeedback(val);\n\n return obj;\n },\n {},\n )\n : {};\n\n // check if at least one choice has an alternate\n const showNote = Object.values(choices).some((choice) => choice?.length > 1);\n const note =\n normalizedQuestion.note ||\n translator.t('common:commonCorrectAnswerWithAlternates', { lng: normalizedQuestion.language });\n\n const { maxLengthPerChoice = [], maxLengthPerChoiceEnabled } = normalizedQuestion;\n const undefinedLengths = !maxLengthPerChoice.length;\n\n // calculate maxLengthPerChoice array if it is not defined or defined incorrectly\n Object.values(choices).forEach((choice, index) => {\n const labelLengthsArr = (choice || []).map((choice) => (choice.label || '').length);\n const length = Math.max(...labelLengthsArr);\n\n if (\n undefinedLengths ||\n !maxLengthPerChoice[index] ||\n maxLengthPerChoice[index] < length ||\n maxLengthPerChoice[index] > length + 10\n ) {\n maxLengthPerChoice[index] = getAdjustedLength(length);\n }\n });\n\n const out = {\n choices,\n disabled: env.mode !== 'gather',\n displayType: normalizedQuestion.displayType,\n mode: env.mode,\n role: env.role,\n feedback,\n language: normalizedQuestion.language,\n markup: normalizedQuestion.markup,\n maxLengthPerChoice,\n maxLengthPerChoiceEnabled,\n note,\n playerSpellCheckEnabled: normalizedQuestion.playerSpellCheckEnabled,\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : defaults.prompt,\n rationale: defaults.rationale,\n responseCorrect: env.mode === 'evaluate' ? getScore(normalizedQuestion, session) === 1 : undefined,\n showNote,\n teacherInstructions: defaults.teacherInstructions,\n responseAreaInputConfiguration: normalizedQuestion.responseAreaInputConfiguration,\n extraCSSRules: normalizedQuestion.extraCSSRules,\n };\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : defaults.rationale;\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : defaults.teacherInstructions;\n }\n\n resolve(out);\n });\n}\n\nexport const prepareVal = (html) => {\n return decodeHTML(getInnerText(html).trim());\n};\n\nexport const getScore = (config, session) => {\n const { value } = session || {};\n\n if (!session || isEmpty(session) || !value) {\n return 0;\n }\n\n const responseAreas = config.markup && config.markup.match(/\\{\\{(.+?)\\}\\}/g);\n const maxScore = responseAreas ? responseAreas.length : 0;\n const correctCount = reduce(\n config.choices,\n (total, respArea, key) => {\n const chosenValue = value && value[key];\n\n if (isEmpty(chosenValue) || !find(respArea, (c) => prepareVal(c.label) === prepareVal(chosenValue))) {\n return total;\n }\n\n return total + 1;\n },\n 0,\n );\n\n const str = maxScore ? (correctCount / maxScore).toFixed(2) : 0;\n\n return parseFloat(str);\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({ score: partialScoringEnabled ? score : score === 1 ? 1 : 0, empty: isEmpty(session) });\n });\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { choices } = question;\n const value = {};\n\n Object.keys(choices).forEach((key, i) => {\n value[i] = choices[key][0].label;\n });\n\n resolve({ id: '1', value });\n } else {\n resolve(null);\n }\n });\n};\n\n// remove all html tags\n// const getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');\nconst getInnerText = (html) => {\n if (typeof html !== 'string') {\n return '';\n }\n if (typeof html.replaceAll === 'function') {\n return html.replaceAll(/<[^>]*>/g, '');\n } else {\n // Polyfill for replaceAll using replace and a global regex\n return html.replace(/<[^>]*>/g, '');\n }\n};\n\nconst decodeHTML = (html) => {\n const doc = new DOMParser().parseFromString(html, 'text/html');\n return doc.body.textContent || '';\n};\n\n// remove all html tags except img and iframe\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const { choices, markup } = model;\n const { maxResponseAreas } = config;\n const allChoicesErrors = {};\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 Object.entries(choices || {}).forEach(([key, values]) => {\n const reversedChoices = [...(values || [])].reverse();\n const choicesErrors = {};\n\n reversedChoices.forEach((choice, index) => {\n const { value, label } = choice;\n\n if (label === '' || label === '<div></div>') {\n choicesErrors[value] = 'Content should not be empty.';\n } else {\n const identicalAnswer = reversedChoices.slice(index + 1).some((c) => c.label === label);\n\n if (identicalAnswer) {\n choicesErrors[value] = 'Content should be unique.';\n }\n }\n });\n\n if (!isEmpty(choicesErrors)) {\n allChoicesErrors[key] = choicesErrors;\n }\n });\n\n const nbOfResponseAreas = (markup.match(/\\{\\{(\\d+)\\}\\}/g) || []).length;\n\n if (nbOfResponseAreas > maxResponseAreas) {\n errors.responseAreas = `No more than ${maxResponseAreas} response areas should be defined.`;\n } else if (nbOfResponseAreas < 1) {\n errors.responseAreas = 'There should be at least 1 response area defined.';\n }\n\n if (!isEmpty(allChoicesErrors)) {\n errors.choices = allChoicesErrors;\n }\n\n return errors;\n};\n"],"file":"index.js"}
@@ -8852,7 +8852,7 @@ var _interopRequireDefault$G = interopRequireDefault.exports;
8852
8852
  Object.defineProperty(markupUtils, "__esModule", {
8853
8853
  value: true
8854
8854
  });
8855
- markupUtils.stripHtmlTags = markupUtils.removeUnwantedCharacters = markupUtils.processMarkup = markupUtils.getAdjustedLength = markupUtils.createSlateMarkup = void 0;
8855
+ markupUtils.stripHtmlTags = markupUtils.removeUnwantedCharacters = markupUtils.processMarkup = markupUtils.getAdjustedLength = markupUtils.decodeHTML = markupUtils.createSlateMarkup = void 0;
8856
8856
  var _escape = _interopRequireDefault$G(require$$1$6);
8857
8857
  var tSymbols = 'imes|riangle|an|heta|herefore';
8858
8858
  var nSymbols = 'throot|parallel|cong|approx|eq|e|sim';
@@ -8909,6 +8909,11 @@ var stripHtmlTags = function stripHtmlTags(markup) {
8909
8909
  return markup.replace(/<\/?[^>]+(>|$)/g, "");
8910
8910
  };
8911
8911
  markupUtils.stripHtmlTags = stripHtmlTags;
8912
+ var decodeHTML = function decodeHTML(html) {
8913
+ var doc = new DOMParser().parseFromString(html, 'text/html');
8914
+ return doc.body.textContent || '';
8915
+ };
8916
+ markupUtils.decodeHTML = decodeHTML;
8912
8917
  const require$$9$d = _dll_react;
8913
8918
  const require$$10$e = _dll_prop_types;
8914
8919
  const require$$12$9 = _dll_pie_lib__pie_toolbox_editable_html;
@@ -8995,7 +9000,7 @@ const require$$12$9 = _dll_pie_lib__pie_toolbox_editable_html;
8995
9000
  });
8996
9001
  (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onDone", function (markup) {
8997
9002
  var _this$props = _this.props, node = _this$props.node, value = _this$props.value, onToolbarDone = _this$props.onToolbarDone, onChangeResponse = _this$props.onChangeResponse;
8998
- var sanitizedMarkup = (0, _markupUtils.stripHtmlTags)(markup);
9003
+ var sanitizedMarkup = (0, _markupUtils.decodeHTML)((0, _markupUtils.stripHtmlTags)(markup));
8999
9004
  _this.setState({
9000
9005
  markup: sanitizedMarkup
9001
9006
  });
@@ -15951,7 +15956,7 @@ const require$$24 = _dll_pie_lib__pie_toolbox_editable_html;
15951
15956
  return _react["default"].createElement(_MenuItem["default"], {
15952
15957
  key: index,
15953
15958
  value: c === null || c === void 0 ? void 0 : c.value
15954
- }, c === null || c === void 0 ? void 0 : c.label);
15959
+ }, (0, _markupUtils.decodeHTML)(c === null || c === void 0 ? void 0 : c.label));
15955
15960
  })), choices && choices.length > 0 && _react["default"].createElement("div", {
15956
15961
  className: classes.rightContainer
15957
15962
  }, maxLength && showMaxLength && _react["default"].createElement(_TextField["default"], {
@@ -24822,7 +24822,7 @@ function model(question, session, env) {
24822
24822
  }
24823
24823
 
24824
24824
  const prepareVal = (html) => {
24825
- return getInnerText(html).trim();
24825
+ return decodeHTML(getInnerText(html).trim());
24826
24826
  };
24827
24827
 
24828
24828
  const getScore = (config, session) => {
@@ -24904,6 +24904,11 @@ const getInnerText = (html) => {
24904
24904
  }
24905
24905
  };
24906
24906
 
24907
+ const decodeHTML = (html) => {
24908
+ const doc = new DOMParser().parseFromString(html, 'text/html');
24909
+ return doc.body.textContent || '';
24910
+ };
24911
+
24907
24912
  // remove all html tags except img and iframe
24908
24913
  const getContent = (html) => (html || '').replace(/(<(?!img|iframe)([^>]+)>)/gi, '');
24909
24914
 
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "access": "public"
5
5
  },
6
6
  "repository": "pie-framework/pie-elements",
7
- "version": "7.3.5-next.10+29cb392a6",
7
+ "version": "7.3.5-next.17+443c830f0",
8
8
  "description": "",
9
9
  "scripts": {
10
10
  "postpublish": "../../scripts/postpublish"
@@ -21,7 +21,7 @@
21
21
  },
22
22
  "author": "",
23
23
  "license": "ISC",
24
- "gitHead": "29cb392a6b20836b25a322f1ef94b8c4dc8eb245",
24
+ "gitHead": "443c830f0c972e412eda9764c78cd45f47c9df1b",
25
25
  "main": "lib/index.js",
26
26
  "module": "src/index.js",
27
27
  "exports": {