@pie-element/math-templated 2.12.1 → 2.13.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,17 @@
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
+ # [2.13.0](https://github.com/pie-framework/pie-elements/compare/@pie-element/math-templated@2.12.1...@pie-element/math-templated@2.13.0) (2024-06-04)
7
+
8
+
9
+ ### Features
10
+
11
+ * **math-templated:** add validation method PD-3805 ([b4ae58a](https://github.com/pie-framework/pie-elements/commit/b4ae58a7f4b65d848d1c003cd964e6cf7f50ce45))
12
+
13
+
14
+
15
+
16
+
6
17
  ## [2.12.1](https://github.com/pie-framework/pie-elements/compare/@pie-element/math-templated@2.12.0...@pie-element/math-templated@2.12.1) (2024-06-04)
7
18
 
8
19
 
@@ -3,6 +3,17 @@
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
+ # [1.2.0](https://github.com/pie-framework/pie-elements/compare/@pie-element/math-templated-configure@1.1.1...@pie-element/math-templated-configure@1.2.0) (2024-06-04)
7
+
8
+
9
+ ### Features
10
+
11
+ * **math-templated:** add validation method PD-3805 ([b4ae58a](https://github.com/pie-framework/pie-elements/commit/b4ae58a7f4b65d848d1c003cd964e6cf7f50ce45))
12
+
13
+
14
+
15
+
16
+
6
17
  ## [1.1.1](https://github.com/pie-framework/pie-elements/compare/@pie-element/math-templated-configure@1.1.0...@pie-element/math-templated-configure@1.1.1) (2024-06-04)
7
18
 
8
19
 
@@ -327,13 +327,12 @@ var Design = /*#__PURE__*/function (_React$Component) {
327
327
  equationEditor = _ref3.equationEditor;
328
328
 
329
329
  var _ref4 = errors || {},
330
- _ref4$choices = _ref4.choices,
331
- choicesErrors = _ref4$choices === void 0 ? {} : _ref4$choices,
332
330
  promptError = _ref4.prompt,
333
331
  rationaleError = _ref4.rationale,
334
332
  responseAreasError = _ref4.responseAreas,
335
333
  teacherInstructionsError = _ref4.teacherInstructions,
336
- responsesErrors = _ref4.responses;
334
+ _ref4$responses = _ref4.responses,
335
+ responsesErrors = _ref4$responses === void 0 ? {} : _ref4$responses;
337
336
 
338
337
  var panelSettings = {
339
338
  'language.enabled': language.settings && toggle(language.label, true),
@@ -441,7 +440,7 @@ var Design = /*#__PURE__*/function (_React$Component) {
441
440
  type: 'math-templated',
442
441
  respAreaToolbar: null,
443
442
  error: function error() {
444
- return choicesErrors;
443
+ return responsesErrors;
445
444
  },
446
445
  onHandleAreaChange: this.onHandleAreaChange,
447
446
  maxResponseAreas: maxResponseAreas
@@ -462,7 +461,9 @@ var Design = /*#__PURE__*/function (_React$Component) {
462
461
  language: 'special'
463
462
  }],
464
463
  mathMlOptions: mathMlOptions
465
- }), /*#__PURE__*/_react["default"].createElement(_Typography["default"], {
464
+ }), responseAreasError && /*#__PURE__*/_react["default"].createElement("div", {
465
+ className: classes.responseAreaError
466
+ }, responseAreasError), /*#__PURE__*/_react["default"].createElement(_Typography["default"], {
466
467
  className: classes.title
467
468
  }, "Define Response"), /*#__PURE__*/_react["default"].createElement(_configUi.InputContainer, {
468
469
  label: "Response Template Equation Editor",
@@ -579,6 +580,11 @@ var _default = (0, _styles.withStyles)(function (theme) {
579
580
  fontSize: '0.75rem',
580
581
  marginTop: theme.spacing.unit
581
582
  },
583
+ responseAreaError: {
584
+ color: theme.palette.error.main,
585
+ fontSize: '0.75rem',
586
+ marginBottom: theme.spacing.unit
587
+ },
582
588
  markup: {
583
589
  width: '100%',
584
590
  marginTop: theme.spacing.unit * 2,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/design.jsx"],"names":["Panel","settings","toggle","createElementFromHTML","htmlString","div","document","createElement","innerHTML","trim","Design","key","value","props","onModelChanged","model","updatedModel","response","index","newModel","responses","newVal","answer","id","allowSpaces","markup","newResponses","domMarkup","responseAreas","querySelectorAll","forEach","element","dataset","dataIndex","validation","allowTrailingZeros","ignoreOrder","alternates","processedMarkup","callback","slateMarkup","setState","cachedChoices","undefined","nodes","cachedResponses","state","newChoices","newCachedResponses","node","keyForNode","data","get","Object","assign","hasOwnProperty","trailing","leading","e","relatedTarget","currentTarget","getParentWithRoleTooltip","depth","parent","offsetParent","getAttribute","getDeepChildDataKeypad","child","children","attributes","parentWithTooltipRole","childWithDataKeypad","activeAnswerBlock","classes","configuration","imageSupport","onConfigurationChanged","uploadSoundSupport","baseInputConfiguration","contentDimensions","prompt","rationale","settingsPanelDisabled","teacherInstructions","language","languageChoices","spellCheck","playerSpellCheck","maxImageWidth","maxImageHeight","mathMlOptions","template","editSource","cIgnoreOrder","cAllowTrailingZeros","partialScoring","maxResponseAreas","errors","promptEnabled","rationaleEnabled","spellCheckEnabled","teacherInstructionsEnabled","toolbarEditorPosition","equationEditor","choices","choicesErrors","promptError","rationaleError","responseAreasError","teacherInstructionsError","responsesErrors","panelSettings","label","enabled","options","panelProperties","playerSpellCheckEnabled","defaultImageMaxWidth","defaultImageMaxHeight","toolbarOpts","position","getPluginProps","Settings","Properties","promptHolder","handleChange","inputConfiguration","errorText","title","ALL_PLUGINS","type","respAreaToolbar","error","onHandleAreaChange","onChange","onBlur","selectContainer","select","event","target","keys","map","responseKey","idx","onResponseChange","math","controlledKeypadMode","React","Component","PropTypes","object","isRequired","func","shape","add","theme","width","paddingTop","spacing","unit","marginBottom","color","palette","main","fontSize","marginTop","typography","fontWeight"],"mappings":"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","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport Select from '@material-ui/core/Select';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport cloneDeep from 'lodash/cloneDeep';\nimport pick from 'lodash/pick';\nimport throttle from 'lodash/throttle';\nimport {\n InputContainer,\n settings,\n layout,\n} from '@pie-lib/pie-toolbox/config-ui';\nimport {\n ALL_PLUGINS,\n EditableHtml,\n} from '@pie-lib/pie-toolbox/editable-html';\nimport { dropdown } from '@pie-lib/pie-toolbox/code/config-ui/settings';\n\nimport Response from './response';\nimport { processMarkup } from './markupUtils';\n\nconst { Panel, toggle } = settings;\n\nconst createElementFromHTML = (htmlString) => {\n const div = document.createElement('div');\n div.innerHTML = htmlString.trim();\n\n return div;\n};\n\nclass Design extends React.Component {\n static propTypes = {\n model: PropTypes.object.isRequired,\n configuration: PropTypes.object.isRequired,\n classes: PropTypes.object.isRequired,\n onModelChanged: PropTypes.func.isRequired,\n onConfigurationChanged: PropTypes.func.isRequired,\n imageSupport: PropTypes.shape({\n add: PropTypes.func.isRequired,\n delete: PropTypes.func.isRequired,\n }),\n uploadSoundSupport: PropTypes.object,\n };\n\n state = {};\n\n componentDidMount() {\n const { model: { slateMarkup } } = this.props;\n\n this.setState({ markup: slateMarkup });\n\n }\n\n handleChange = (key, value) => {\n const { onModelChanged, model } = this.props;\n const updatedModel = cloneDeep(model);\n updatedModel[key] = value;\n onModelChanged(updatedModel);\n };\n\n onResponseChange = (response, index) => {\n const { model, onModelChanged } = this.props;\n const newModel = { ...model };\n\n newModel.responses[index] = response;\n onModelChanged(newModel);\n };\n\n onChangeResponse = (index, newVal) => {\n const { model, onModelChanged } = this.props;\n const { responses } = model;\n\n if (!responses[index]) {\n responses[index] = [{ answer: newVal || '', id: 'response' + index, allowSpaces: true }];\n } else {\n responses[index][0].answer = newVal || '';\n }\n\n onModelChanged({ ...model, responses });\n };\n\n onResponsesChanged = (responses) => {\n this.props.onModelChanged({ ...this.props.model, responses });\n };\n\n onChange = (markup) => {\n const {\n model: { responses },\n onModelChanged,\n } = this.props;\n const newResponses = {};\n const domMarkup = createElementFromHTML(markup);\n const responseAreas = domMarkup.querySelectorAll('[data-type=\"math_templated\"]');\n\n responseAreas.forEach((element) => {\n const { value, index: dataIndex } = element.dataset;\n\n if (!value) {\n element.dataset.value = `R ${dataIndex}`;\n }\n\n newResponses[dataIndex] = responses[dataIndex] || {\n // TODO: Initialize with customizable defaults\n allowSpaces: true,\n validation: 'symbolic',\n allowTrailingZeros: false,\n ignoreOrder: false,\n answer: '',\n alternates: {},\n };\n\n element.dataset.index = dataIndex;\n });\n\n const processedMarkup = processMarkup(markup);\n\n const callback = () =>\n onModelChanged({\n ...this.props.model,\n slateMarkup: domMarkup.innerHTML,\n responses: newResponses,\n markup: processedMarkup\n });\n\n this.setState({ cachedChoices: undefined }, callback);\n };\n\n onHandleAreaChange = throttle(\n (nodes) => {\n const {\n model: { responses },\n onModelChanged,\n } = this.props;\n const { cachedResponses } = this.state;\n\n if (!nodes) {\n return;\n }\n\n const newChoices = responses ? cloneDeep(responses) : {};\n const newCachedResponses = cachedResponses ? cloneDeep(cachedResponses) : {};\n\n nodes.forEach((node) => {\n const keyForNode = node.data.get('index');\n\n if (!newChoices[keyForNode] && newCachedResponses[keyForNode]) {\n Object.assign(newChoices, pick(newCachedResponses, keyForNode));\n\n if (newCachedResponses.hasOwnProperty(keyForNode)) {\n delete newCachedResponses[keyForNode];\n }\n } else {\n Object.assign(newCachedResponses, pick(newChoices, keyForNode));\n\n if (newChoices.hasOwnProperty(keyForNode)) {\n delete newChoices[keyForNode];\n }\n }\n });\n\n const callback = () => onModelChanged({ ...this.props.model, responses: newChoices });\n\n this.setState({ cachedResponses: newCachedResponses }, callback);\n },\n 500,\n { trailing: false, leading: true },\n );\n\n onBlur = (e) => {\n const { relatedTarget, currentTarget } = e || {};\n\n function getParentWithRoleTooltip(element, depth = 0) {\n // only run this max 16 times\n if (!element || depth >= 16) return null;\n\n const parent = element.offsetParent;\n\n if (!parent) return null;\n\n if (parent.getAttribute('role') === 'tooltip') {\n return parent;\n }\n\n return getParentWithRoleTooltip(parent, depth + 1);\n }\n\n function getDeepChildDataKeypad(element, depth = 0) {\n // only run this max 4 times\n if (!element || depth >= 4) return null;\n\n const child = element?.children?.[0];\n\n if (!child) return null;\n\n if (child.attributes && child.attributes['data-keypad']) {\n return child;\n }\n\n return getDeepChildDataKeypad(child, depth + 1);\n }\n\n const parentWithTooltipRole = getParentWithRoleTooltip(relatedTarget);\n const childWithDataKeypad = parentWithTooltipRole ? getDeepChildDataKeypad(parentWithTooltipRole) : null;\n\n if (!relatedTarget || !currentTarget || !childWithDataKeypad?.attributes['data-keypad']) {\n this.setState({ activeAnswerBlock: '' });\n }\n };\n\n render() {\n const {\n classes,\n configuration,\n imageSupport,\n model,\n onConfigurationChanged,\n onModelChanged,\n uploadSoundSupport,\n } = this.props;\n\n const {\n baseInputConfiguration = {},\n contentDimensions = {},\n prompt = {},\n rationale = {},\n settingsPanelDisabled,\n teacherInstructions = {},\n language = {},\n languageChoices = {},\n spellCheck = {},\n playerSpellCheck = {},\n maxImageWidth = {},\n maxImageHeight = {},\n mathMlOptions = {},\n template = {},\n editSource = {},\n ignoreOrder: cIgnoreOrder = {},\n allowTrailingZeros: cAllowTrailingZeros = {},\n partialScoring = {},\n maxResponseAreas,\n } = configuration || {};\n\n const {\n errors,\n promptEnabled,\n rationaleEnabled,\n spellCheckEnabled,\n teacherInstructionsEnabled,\n toolbarEditorPosition,\n responses,\n equationEditor,\n } = model || {};\n\n const {\n choices: choicesErrors = {},\n prompt: promptError,\n rationale: rationaleError,\n responseAreas: responseAreasError,\n teacherInstructions: teacherInstructionsError,\n responses: responsesErrors,\n } = errors || {};\n\n const panelSettings = {\n 'language.enabled': language.settings && toggle(language.label, true),\n language: language.settings && language.enabled && dropdown(languageChoices.label, languageChoices.options),\n };\n\n const panelProperties = {\n teacherInstructionsEnabled: teacherInstructions.settings && toggle(teacherInstructions.label),\n rationaleEnabled: rationale.settings && toggle(rationale.label),\n promptEnabled: prompt.settings && toggle(prompt.label),\n spellCheckEnabled: spellCheck.settings && toggle(spellCheck.label),\n playerSpellCheckEnabled: playerSpellCheck.settings && toggle(playerSpellCheck.label),\n 'editSource.enabled': editSource?.settings && toggle(editSource.label, true),\n partialScoring: partialScoring.settings && toggle(partialScoring.label),\n };\n\n const defaultImageMaxWidth = maxImageWidth && maxImageWidth.prompt;\n const defaultImageMaxHeight = maxImageHeight && maxImageHeight.prompt;\n\n const toolbarOpts = {\n position: toolbarEditorPosition === 'top' ? 'top' : 'bottom',\n };\n\n const getPluginProps = (props = {}, baseInputConfiguration = {}) => ({\n ...baseInputConfiguration,\n ...props,\n });\n\n return (\n <layout.ConfigLayout\n dimensions={contentDimensions}\n hideSettings={settingsPanelDisabled}\n settings={\n <Panel\n model={model}\n configuration={configuration}\n onChangeModel={(updatedModel) => onModelChanged(updatedModel)}\n onChangeConfiguration={onConfigurationChanged}\n groups={{\n Settings: panelSettings,\n Properties: panelProperties,\n }}\n />\n }\n >\n {teacherInstructionsEnabled && (\n <InputContainer\n label={teacherInstructions.label}\n className={classes.promptHolder}\n >\n <EditableHtml\n className={classes.prompt}\n markup={model.teacherInstructions || ''}\n onChange={(value) => this.handleChange('teacherInstructions', value)}\n imageSupport={imageSupport}\n nonEmpty={false}\n error={teacherInstructionsError}\n toolbarOpts={toolbarOpts}\n pluginProps={getPluginProps(\n teacherInstructions?.inputConfiguration,\n baseInputConfiguration\n )}\n spellCheck={spellCheckEnabled}\n maxImageWidth={\n (maxImageWidth && maxImageWidth.teacherInstructions) ||\n defaultImageMaxWidth\n }\n maxImageHeight={\n (maxImageHeight && maxImageHeight.teacherInstructions) ||\n defaultImageMaxHeight\n }\n uploadSoundSupport={uploadSoundSupport}\n languageCharactersProps={[\n { language: 'spanish' },\n { language: 'special' },\n ]}\n mathMlOptions={mathMlOptions}\n />\n {teacherInstructionsError && (\n <div className={classes.errorText}>{teacherInstructionsError}</div>\n )}\n </InputContainer>\n )}\n\n {promptEnabled && (\n <InputContainer\n label={prompt.label}\n className={classes.promptHolder}\n >\n <EditableHtml\n className={classes.prompt}\n markup={model.prompt}\n onChange={(value) => this.handleChange('prompt', value)}\n imageSupport={imageSupport}\n nonEmpty={false}\n disableUnderline\n error={promptError}\n toolbarOpts={toolbarOpts}\n pluginProps={getPluginProps(\n teacherInstructions?.inputConfiguration,\n baseInputConfiguration\n )}\n spellCheck={spellCheckEnabled}\n maxImageWidth={defaultImageMaxWidth}\n maxImageHeight={defaultImageMaxHeight}\n uploadSoundSupport={uploadSoundSupport}\n languageCharactersProps={[\n { language: 'spanish' },\n { language: 'special' },\n ]}\n mathMlOptions={mathMlOptions}\n />\n {promptError && (\n <div className={classes.errorText}>{promptError}</div>\n )}\n </InputContainer>\n )}\n\n <Typography className={classes.title}>Response Template</Typography>\n\n <EditableHtml\n activePlugins={ALL_PLUGINS}\n toolbarOpts={{ position: 'top' }}\n spellCheck={spellCheckEnabled}\n pluginProps={getPluginProps(\n template?.inputConfiguration,\n baseInputConfiguration\n )}\n responseAreaProps={{\n type: 'math-templated',\n respAreaToolbar: null,\n error: () => choicesErrors,\n onHandleAreaChange: this.onHandleAreaChange,\n maxResponseAreas: maxResponseAreas,\n }}\n className={classes.markup}\n markup={model.slateMarkup}\n onChange={this.onChange}\n imageSupport={imageSupport}\n disableImageAlignmentButtons={true}\n onBlur={this.onBlur}\n disabled={false}\n highlightShape={false}\n error={responseAreasError}\n uploadSoundSupport={uploadSoundSupport}\n languageCharactersProps={[\n { language: 'spanish' },\n { language: 'special' },\n ]}\n mathMlOptions={mathMlOptions}\n />\n\n <Typography className={classes.title}>Define Response</Typography>\n\n <InputContainer\n label=\"Response Template Equation Editor\"\n className={classes.selectContainer}\n >\n <Select\n className={classes.select}\n onChange={(event) =>\n this.handleChange('equationEditor', event.target.value)\n }\n value={equationEditor}\n >\n <MenuItem value=\"non-negative-integers\">\n Numeric - Non-Negative Integers\n </MenuItem>\n <MenuItem value=\"integers\">Numeric - Integers</MenuItem>\n <MenuItem value=\"decimals\">Numeric - Decimals</MenuItem>\n <MenuItem value=\"fractions\">Numeric - Fractions</MenuItem>\n <MenuItem value={1}>Grade 1 - 2</MenuItem>\n <MenuItem value={3}>Grade 3 - 5</MenuItem>\n <MenuItem value={6}>Grade 6 - 7</MenuItem>\n <MenuItem value={8}>Grade 8 - HS</MenuItem>\n <MenuItem value={'geometry'}>Geometry</MenuItem>\n <MenuItem value={'advanced-algebra'}>\n Advanced Algebra\n </MenuItem>\n <MenuItem value={'statistics'}>Statistics</MenuItem>\n <MenuItem value={'item-authoring'}>Item Authoring</MenuItem>\n </Select>\n </InputContainer>\n\n {Object.keys(responses || {}).map((responseKey, idx) => {\n const response = responses[responseKey];\n\n if (response) {\n return (\n <Response\n key={responseKey}\n responseKey={responseKey}\n mode={equationEditor}\n response={response}\n onResponseChange={this.onResponseChange}\n index={idx}\n cIgnoreOrder={cIgnoreOrder}\n cAllowTrailingZeros={cAllowTrailingZeros}\n error={responsesErrors && responsesErrors[idx]}\n />\n );\n }\n\n return null;\n })}\n\n {rationaleEnabled && (\n <InputContainer\n label={rationale.label}\n className={classes.promptHolder}\n >\n <EditableHtml\n className={classes.prompt}\n markup={model.rationale || ''}\n onChange={(value) => this.handleChange('rationale', value)}\n imageSupport={imageSupport}\n nonEmpty={false}\n error={rationaleError}\n toolbarOpts={toolbarOpts}\n pluginProps={getPluginProps(rationale?.inputConfiguration, {\n ...baseInputConfiguration,\n math: {\n controlledKeypadMode: false,\n },\n })}\n spellCheck={spellCheckEnabled}\n maxImageWidth={\n (maxImageWidth && maxImageWidth.rationale) ||\n defaultImageMaxWidth\n }\n maxImageHeight={\n (maxImageHeight && maxImageHeight.rationale) ||\n defaultImageMaxHeight\n }\n uploadSoundSupport={uploadSoundSupport}\n languageCharactersProps={[\n { language: 'spanish' },\n { language: 'special' },\n ]}\n mathMlOptions={mathMlOptions}\n />\n {rationaleError && (\n <div className={classes.errorText}>{rationaleError}</div>\n )}\n </InputContainer>\n )}\n </layout.ConfigLayout>\n );\n }\n}\n\nexport default withStyles((theme) => ({\n promptHolder: {\n width: '100%',\n paddingTop: theme.spacing.unit * 2,\n marginBottom: theme.spacing.unit * 2,\n },\n prompt: {\n width: '100%',\n },\n errorText: {\n color: theme.palette.error.main,\n fontSize: '0.75rem',\n marginTop: theme.spacing.unit,\n },\n markup: {\n width: '100%',\n marginTop: theme.spacing.unit * 2,\n marginBottom: theme.spacing.unit * 3,\n },\n selectContainer: {\n width: '100%',\n marginTop: theme.spacing.unit * 2,\n },\n select: {\n width: '100%',\n },\n title: {\n fontSize: theme.typography.fontSize * 1.25,\n fontWeight: 'bold',\n }\n}))(Design);\n"],"file":"design.js"}
1
+ {"version":3,"sources":["../src/design.jsx"],"names":["Panel","settings","toggle","createElementFromHTML","htmlString","div","document","createElement","innerHTML","trim","Design","key","value","props","onModelChanged","model","updatedModel","response","index","newModel","responses","newVal","answer","id","allowSpaces","markup","newResponses","domMarkup","responseAreas","querySelectorAll","forEach","element","dataset","dataIndex","validation","allowTrailingZeros","ignoreOrder","alternates","processedMarkup","callback","slateMarkup","setState","cachedChoices","undefined","nodes","cachedResponses","state","newChoices","newCachedResponses","node","keyForNode","data","get","Object","assign","hasOwnProperty","trailing","leading","e","relatedTarget","currentTarget","getParentWithRoleTooltip","depth","parent","offsetParent","getAttribute","getDeepChildDataKeypad","child","children","attributes","parentWithTooltipRole","childWithDataKeypad","activeAnswerBlock","classes","configuration","imageSupport","onConfigurationChanged","uploadSoundSupport","baseInputConfiguration","contentDimensions","prompt","rationale","settingsPanelDisabled","teacherInstructions","language","languageChoices","spellCheck","playerSpellCheck","maxImageWidth","maxImageHeight","mathMlOptions","template","editSource","cIgnoreOrder","cAllowTrailingZeros","partialScoring","maxResponseAreas","errors","promptEnabled","rationaleEnabled","spellCheckEnabled","teacherInstructionsEnabled","toolbarEditorPosition","equationEditor","promptError","rationaleError","responseAreasError","teacherInstructionsError","responsesErrors","panelSettings","label","enabled","options","panelProperties","playerSpellCheckEnabled","defaultImageMaxWidth","defaultImageMaxHeight","toolbarOpts","position","getPluginProps","Settings","Properties","promptHolder","handleChange","inputConfiguration","errorText","title","ALL_PLUGINS","type","respAreaToolbar","error","onHandleAreaChange","onChange","onBlur","responseAreaError","selectContainer","select","event","target","keys","map","responseKey","idx","onResponseChange","math","controlledKeypadMode","React","Component","PropTypes","object","isRequired","func","shape","add","theme","width","paddingTop","spacing","unit","marginBottom","color","palette","main","fontSize","marginTop","typography","fontWeight"],"mappings":"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","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport Select from '@material-ui/core/Select';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport cloneDeep from 'lodash/cloneDeep';\nimport pick from 'lodash/pick';\nimport throttle from 'lodash/throttle';\nimport {\n InputContainer,\n settings,\n layout,\n} from '@pie-lib/pie-toolbox/config-ui';\nimport {\n ALL_PLUGINS,\n EditableHtml,\n} from '@pie-lib/pie-toolbox/editable-html';\nimport { dropdown } from '@pie-lib/pie-toolbox/code/config-ui/settings';\n\nimport Response from './response';\nimport { processMarkup } from './markupUtils';\n\nconst { Panel, toggle } = settings;\n\nconst createElementFromHTML = (htmlString) => {\n const div = document.createElement('div');\n div.innerHTML = htmlString.trim();\n\n return div;\n};\n\nclass Design extends React.Component {\n static propTypes = {\n model: PropTypes.object.isRequired,\n configuration: PropTypes.object.isRequired,\n classes: PropTypes.object.isRequired,\n onModelChanged: PropTypes.func.isRequired,\n onConfigurationChanged: PropTypes.func.isRequired,\n imageSupport: PropTypes.shape({\n add: PropTypes.func.isRequired,\n delete: PropTypes.func.isRequired,\n }),\n uploadSoundSupport: PropTypes.object,\n };\n\n state = {};\n\n componentDidMount() {\n const { model: { slateMarkup } } = this.props;\n\n this.setState({ markup: slateMarkup });\n\n }\n\n handleChange = (key, value) => {\n const { onModelChanged, model } = this.props;\n const updatedModel = cloneDeep(model);\n updatedModel[key] = value;\n onModelChanged(updatedModel);\n };\n\n onResponseChange = (response, index) => {\n const { model, onModelChanged } = this.props;\n const newModel = { ...model };\n\n newModel.responses[index] = response;\n onModelChanged(newModel);\n };\n\n onChangeResponse = (index, newVal) => {\n const { model, onModelChanged } = this.props;\n const { responses } = model;\n\n if (!responses[index]) {\n responses[index] = [{ answer: newVal || '', id: 'response' + index, allowSpaces: true }];\n } else {\n responses[index][0].answer = newVal || '';\n }\n\n onModelChanged({ ...model, responses });\n };\n\n onResponsesChanged = (responses) => {\n this.props.onModelChanged({ ...this.props.model, responses });\n };\n\n onChange = (markup) => {\n const {\n model: { responses },\n onModelChanged,\n } = this.props;\n const newResponses = {};\n const domMarkup = createElementFromHTML(markup);\n const responseAreas = domMarkup.querySelectorAll('[data-type=\"math_templated\"]');\n\n responseAreas.forEach((element) => {\n const { value, index: dataIndex } = element.dataset;\n\n if (!value) {\n element.dataset.value = `R ${dataIndex}`;\n }\n\n newResponses[dataIndex] = responses[dataIndex] || {\n // TODO: Initialize with customizable defaults\n allowSpaces: true,\n validation: 'symbolic',\n allowTrailingZeros: false,\n ignoreOrder: false,\n answer: '',\n alternates: {},\n };\n\n element.dataset.index = dataIndex;\n });\n\n const processedMarkup = processMarkup(markup);\n\n const callback = () =>\n onModelChanged({\n ...this.props.model,\n slateMarkup: domMarkup.innerHTML,\n responses: newResponses,\n markup: processedMarkup\n });\n\n this.setState({ cachedChoices: undefined }, callback);\n };\n\n onHandleAreaChange = throttle(\n (nodes) => {\n const {\n model: { responses },\n onModelChanged,\n } = this.props;\n const { cachedResponses } = this.state;\n\n if (!nodes) {\n return;\n }\n\n const newChoices = responses ? cloneDeep(responses) : {};\n const newCachedResponses = cachedResponses ? cloneDeep(cachedResponses) : {};\n\n nodes.forEach((node) => {\n const keyForNode = node.data.get('index');\n\n if (!newChoices[keyForNode] && newCachedResponses[keyForNode]) {\n Object.assign(newChoices, pick(newCachedResponses, keyForNode));\n\n if (newCachedResponses.hasOwnProperty(keyForNode)) {\n delete newCachedResponses[keyForNode];\n }\n } else {\n Object.assign(newCachedResponses, pick(newChoices, keyForNode));\n\n if (newChoices.hasOwnProperty(keyForNode)) {\n delete newChoices[keyForNode];\n }\n }\n });\n\n const callback = () => onModelChanged({ ...this.props.model, responses: newChoices });\n\n this.setState({ cachedResponses: newCachedResponses }, callback);\n },\n 500,\n { trailing: false, leading: true },\n );\n\n onBlur = (e) => {\n const { relatedTarget, currentTarget } = e || {};\n\n function getParentWithRoleTooltip(element, depth = 0) {\n // only run this max 16 times\n if (!element || depth >= 16) return null;\n\n const parent = element.offsetParent;\n\n if (!parent) return null;\n\n if (parent.getAttribute('role') === 'tooltip') {\n return parent;\n }\n\n return getParentWithRoleTooltip(parent, depth + 1);\n }\n\n function getDeepChildDataKeypad(element, depth = 0) {\n // only run this max 4 times\n if (!element || depth >= 4) return null;\n\n const child = element?.children?.[0];\n\n if (!child) return null;\n\n if (child.attributes && child.attributes['data-keypad']) {\n return child;\n }\n\n return getDeepChildDataKeypad(child, depth + 1);\n }\n\n const parentWithTooltipRole = getParentWithRoleTooltip(relatedTarget);\n const childWithDataKeypad = parentWithTooltipRole ? getDeepChildDataKeypad(parentWithTooltipRole) : null;\n\n if (!relatedTarget || !currentTarget || !childWithDataKeypad?.attributes['data-keypad']) {\n this.setState({ activeAnswerBlock: '' });\n }\n };\n\n render() {\n const {\n classes,\n configuration,\n imageSupport,\n model,\n onConfigurationChanged,\n onModelChanged,\n uploadSoundSupport,\n } = this.props;\n\n const {\n baseInputConfiguration = {},\n contentDimensions = {},\n prompt = {},\n rationale = {},\n settingsPanelDisabled,\n teacherInstructions = {},\n language = {},\n languageChoices = {},\n spellCheck = {},\n playerSpellCheck = {},\n maxImageWidth = {},\n maxImageHeight = {},\n mathMlOptions = {},\n template = {},\n editSource = {},\n ignoreOrder: cIgnoreOrder = {},\n allowTrailingZeros: cAllowTrailingZeros = {},\n partialScoring = {},\n maxResponseAreas,\n } = configuration || {};\n\n const {\n errors,\n promptEnabled,\n rationaleEnabled,\n spellCheckEnabled,\n teacherInstructionsEnabled,\n toolbarEditorPosition,\n responses,\n equationEditor,\n } = model || {};\n\n const {\n prompt: promptError,\n rationale: rationaleError,\n responseAreas: responseAreasError,\n teacherInstructions: teacherInstructionsError,\n responses: responsesErrors = {},\n } = errors || {};\n\n const panelSettings = {\n 'language.enabled': language.settings && toggle(language.label, true),\n language: language.settings && language.enabled && dropdown(languageChoices.label, languageChoices.options),\n };\n\n const panelProperties = {\n teacherInstructionsEnabled: teacherInstructions.settings && toggle(teacherInstructions.label),\n rationaleEnabled: rationale.settings && toggle(rationale.label),\n promptEnabled: prompt.settings && toggle(prompt.label),\n spellCheckEnabled: spellCheck.settings && toggle(spellCheck.label),\n playerSpellCheckEnabled: playerSpellCheck.settings && toggle(playerSpellCheck.label),\n 'editSource.enabled': editSource?.settings && toggle(editSource.label, true),\n partialScoring: partialScoring.settings && toggle(partialScoring.label),\n };\n\n const defaultImageMaxWidth = maxImageWidth && maxImageWidth.prompt;\n const defaultImageMaxHeight = maxImageHeight && maxImageHeight.prompt;\n\n const toolbarOpts = {\n position: toolbarEditorPosition === 'top' ? 'top' : 'bottom',\n };\n\n const getPluginProps = (props = {}, baseInputConfiguration = {}) => ({\n ...baseInputConfiguration,\n ...props,\n });\n\n return (\n <layout.ConfigLayout\n dimensions={contentDimensions}\n hideSettings={settingsPanelDisabled}\n settings={\n <Panel\n model={model}\n configuration={configuration}\n onChangeModel={(updatedModel) => onModelChanged(updatedModel)}\n onChangeConfiguration={onConfigurationChanged}\n groups={{\n Settings: panelSettings,\n Properties: panelProperties,\n }}\n />\n }\n >\n {teacherInstructionsEnabled && (\n <InputContainer\n label={teacherInstructions.label}\n className={classes.promptHolder}\n >\n <EditableHtml\n className={classes.prompt}\n markup={model.teacherInstructions || ''}\n onChange={(value) => this.handleChange('teacherInstructions', value)}\n imageSupport={imageSupport}\n nonEmpty={false}\n error={teacherInstructionsError}\n toolbarOpts={toolbarOpts}\n pluginProps={getPluginProps(\n teacherInstructions?.inputConfiguration,\n baseInputConfiguration\n )}\n spellCheck={spellCheckEnabled}\n maxImageWidth={\n (maxImageWidth && maxImageWidth.teacherInstructions) ||\n defaultImageMaxWidth\n }\n maxImageHeight={\n (maxImageHeight && maxImageHeight.teacherInstructions) ||\n defaultImageMaxHeight\n }\n uploadSoundSupport={uploadSoundSupport}\n languageCharactersProps={[\n { language: 'spanish' },\n { language: 'special' },\n ]}\n mathMlOptions={mathMlOptions}\n />\n {teacherInstructionsError && (\n <div className={classes.errorText}>{teacherInstructionsError}</div>\n )}\n </InputContainer>\n )}\n\n {promptEnabled && (\n <InputContainer\n label={prompt.label}\n className={classes.promptHolder}\n >\n <EditableHtml\n className={classes.prompt}\n markup={model.prompt}\n onChange={(value) => this.handleChange('prompt', value)}\n imageSupport={imageSupport}\n nonEmpty={false}\n disableUnderline\n error={promptError}\n toolbarOpts={toolbarOpts}\n pluginProps={getPluginProps(\n teacherInstructions?.inputConfiguration,\n baseInputConfiguration\n )}\n spellCheck={spellCheckEnabled}\n maxImageWidth={defaultImageMaxWidth}\n maxImageHeight={defaultImageMaxHeight}\n uploadSoundSupport={uploadSoundSupport}\n languageCharactersProps={[\n { language: 'spanish' },\n { language: 'special' },\n ]}\n mathMlOptions={mathMlOptions}\n />\n {promptError && (\n <div className={classes.errorText}>{promptError}</div>\n )}\n </InputContainer>\n )}\n\n <Typography className={classes.title}>Response Template</Typography>\n\n <EditableHtml\n activePlugins={ALL_PLUGINS}\n toolbarOpts={{ position: 'top' }}\n spellCheck={spellCheckEnabled}\n pluginProps={getPluginProps(\n template?.inputConfiguration,\n baseInputConfiguration\n )}\n responseAreaProps={{\n type: 'math-templated',\n respAreaToolbar: null,\n error: () => responsesErrors,\n onHandleAreaChange: this.onHandleAreaChange,\n maxResponseAreas: maxResponseAreas,\n }}\n className={classes.markup}\n markup={model.slateMarkup}\n onChange={this.onChange}\n imageSupport={imageSupport}\n disableImageAlignmentButtons={true}\n onBlur={this.onBlur}\n disabled={false}\n highlightShape={false}\n error={responseAreasError}\n uploadSoundSupport={uploadSoundSupport}\n languageCharactersProps={[\n { language: 'spanish' },\n { language: 'special' },\n ]}\n mathMlOptions={mathMlOptions}\n />\n {responseAreasError && (\n <div className={classes.responseAreaError}>{responseAreasError}</div>\n )}\n\n <Typography className={classes.title}>Define Response</Typography>\n\n <InputContainer\n label=\"Response Template Equation Editor\"\n className={classes.selectContainer}\n >\n <Select\n className={classes.select}\n onChange={(event) =>\n this.handleChange('equationEditor', event.target.value)\n }\n value={equationEditor}\n >\n <MenuItem value=\"non-negative-integers\">\n Numeric - Non-Negative Integers\n </MenuItem>\n <MenuItem value=\"integers\">Numeric - Integers</MenuItem>\n <MenuItem value=\"decimals\">Numeric - Decimals</MenuItem>\n <MenuItem value=\"fractions\">Numeric - Fractions</MenuItem>\n <MenuItem value={1}>Grade 1 - 2</MenuItem>\n <MenuItem value={3}>Grade 3 - 5</MenuItem>\n <MenuItem value={6}>Grade 6 - 7</MenuItem>\n <MenuItem value={8}>Grade 8 - HS</MenuItem>\n <MenuItem value={'geometry'}>Geometry</MenuItem>\n <MenuItem value={'advanced-algebra'}>\n Advanced Algebra\n </MenuItem>\n <MenuItem value={'statistics'}>Statistics</MenuItem>\n <MenuItem value={'item-authoring'}>Item Authoring</MenuItem>\n </Select>\n </InputContainer>\n\n {Object.keys(responses || {}).map((responseKey, idx) => {\n const response = responses[responseKey];\n\n if (response) {\n return (\n <Response\n key={responseKey}\n responseKey={responseKey}\n mode={equationEditor}\n response={response}\n onResponseChange={this.onResponseChange}\n index={idx}\n cIgnoreOrder={cIgnoreOrder}\n cAllowTrailingZeros={cAllowTrailingZeros}\n error={responsesErrors && responsesErrors[idx]}\n />\n );\n }\n\n return null;\n })}\n\n {rationaleEnabled && (\n <InputContainer\n label={rationale.label}\n className={classes.promptHolder}\n >\n <EditableHtml\n className={classes.prompt}\n markup={model.rationale || ''}\n onChange={(value) => this.handleChange('rationale', value)}\n imageSupport={imageSupport}\n nonEmpty={false}\n error={rationaleError}\n toolbarOpts={toolbarOpts}\n pluginProps={getPluginProps(rationale?.inputConfiguration, {\n ...baseInputConfiguration,\n math: {\n controlledKeypadMode: false,\n },\n })}\n spellCheck={spellCheckEnabled}\n maxImageWidth={\n (maxImageWidth && maxImageWidth.rationale) ||\n defaultImageMaxWidth\n }\n maxImageHeight={\n (maxImageHeight && maxImageHeight.rationale) ||\n defaultImageMaxHeight\n }\n uploadSoundSupport={uploadSoundSupport}\n languageCharactersProps={[\n { language: 'spanish' },\n { language: 'special' },\n ]}\n mathMlOptions={mathMlOptions}\n />\n {rationaleError && (\n <div className={classes.errorText}>{rationaleError}</div>\n )}\n </InputContainer>\n )}\n </layout.ConfigLayout>\n );\n }\n}\n\nexport default withStyles((theme) => ({\n promptHolder: {\n width: '100%',\n paddingTop: theme.spacing.unit * 2,\n marginBottom: theme.spacing.unit * 2,\n },\n prompt: {\n width: '100%',\n },\n errorText: {\n color: theme.palette.error.main,\n fontSize: '0.75rem',\n marginTop: theme.spacing.unit,\n },\n responseAreaError: {\n color: theme.palette.error.main,\n fontSize: '0.75rem',\n marginBottom: theme.spacing.unit,\n },\n markup: {\n width: '100%',\n marginTop: theme.spacing.unit * 2,\n marginBottom: theme.spacing.unit * 3,\n },\n selectContainer: {\n width: '100%',\n marginTop: theme.spacing.unit * 2,\n },\n select: {\n width: '100%',\n },\n title: {\n fontSize: theme.typography.fontSize * 1.25,\n fontWeight: 'bold',\n }\n}))(Design);\n"],"file":"design.js"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@pie-element/math-templated-configure",
3
3
  "private": true,
4
- "version": "1.1.1",
4
+ "version": "1.2.0",
5
5
  "description": "",
6
6
  "main": "lib/index.js",
7
7
  "module": "src/index.js",
@@ -3,6 +3,17 @@
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
+ # [2.11.0](https://github.com/pie-framework/pie-elements/compare/@pie-element/math-templated-controller@2.10.1...@pie-element/math-templated-controller@2.11.0) (2024-06-04)
7
+
8
+
9
+ ### Features
10
+
11
+ * **math-templated:** add validation method PD-3805 ([b4ae58a](https://github.com/pie-framework/pie-elements/commit/b4ae58a7f4b65d848d1c003cd964e6cf7f50ce45))
12
+
13
+
14
+
15
+
16
+
6
17
  ## [2.10.1](https://github.com/pie-framework/pie-elements/compare/@pie-element/math-templated-controller@2.10.0...@pie-element/math-templated-controller@2.10.1) (2024-06-04)
7
18
 
8
19
 
@@ -9,6 +9,8 @@ Object.defineProperty(exports, "__esModule", {
9
9
  });
10
10
  exports.validate = exports.prepareVal = exports.outcome = exports.normalizeSession = exports.model = exports.getPartialScore = exports.getCorrectness = exports.createDefaultModel = exports.createCorrectResponseSession = void 0;
11
11
 
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
+
12
14
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
13
15
 
14
16
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
@@ -21,8 +23,6 @@ var _translator = _interopRequireDefault(require("@pie-lib/pie-toolbox/translato
21
23
 
22
24
  var mv = _interopRequireWildcard(require("@pie-framework/math-validation"));
23
25
 
24
- var _feedback = require("@pie-lib/pie-toolbox/feedback");
25
-
26
26
  var _defaults = _interopRequireDefault(require("./defaults"));
27
27
 
28
28
  var _controllerUtils = require("@pie-lib/pie-toolbox/controller-utils");
@@ -48,6 +48,10 @@ var getFeedback = function getFeedback(value) {
48
48
  return value ? 'correct' : 'incorrect';
49
49
  };
50
50
 
51
+ var getContent = function getContent(html) {
52
+ return (html || '').replace(/(<(?!img|iframe)([^>]+)>)/gi, '');
53
+ };
54
+
51
55
  var getIsAnswerCorrect = function getIsAnswerCorrect(correctResponse, answerItem) {
52
56
  var answerCorrect = false;
53
57
 
@@ -296,7 +300,69 @@ exports.createCorrectResponseSession = createCorrectResponseSession;
296
300
  var validate = function validate() {
297
301
  var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
298
302
  var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
303
+ var responses = model.responses,
304
+ markup = model.markup;
305
+ var maxResponseAreas = config.maxResponseAreas;
306
+ var responsesErrors = {};
299
307
  var errors = {};
308
+ ['teacherInstructions', 'prompt', 'rationale'].forEach(function (field) {
309
+ var _config$field;
310
+
311
+ if ((_config$field = config[field]) !== null && _config$field !== void 0 && _config$field.required && !getContent(model[field])) {
312
+ errors[field] = 'This field is required.';
313
+ }
314
+ });
315
+ Object.entries(responses || {}).forEach(function (_ref2, index) {
316
+ var _ref3 = (0, _slicedToArray2["default"])(_ref2, 2),
317
+ key = _ref3[0],
318
+ response = _ref3[1];
319
+
320
+ var answer = response.answer;
321
+ var reversedAlternates = (0, _toConsumableArray2["default"])(Object.entries(response.alternates || {})).reverse();
322
+ var alternatesErrors = {};
323
+ var responseError = {};
324
+
325
+ if (answer === '') {
326
+ responseError.answer = 'Content should not be empty.';
327
+ }
328
+
329
+ reversedAlternates.forEach(function (_ref4, index) {
330
+ var _ref5 = (0, _slicedToArray2["default"])(_ref4, 2),
331
+ key = _ref5[0],
332
+ value = _ref5[1];
333
+
334
+ if (value === '') {
335
+ alternatesErrors[key] = 'Content should not be empty.';
336
+ } else {
337
+ var identicalAnswer = answer === value || reversedAlternates.slice(index + 1).some(function (_ref6) {
338
+ var _ref7 = (0, _slicedToArray2["default"])(_ref6, 2),
339
+ val = _ref7[1];
340
+
341
+ return val === value;
342
+ });
343
+
344
+ if (identicalAnswer) {
345
+ alternatesErrors[key] = 'Content should be unique.';
346
+ }
347
+ }
348
+ });
349
+
350
+ if (!(0, _isEmpty["default"])(responseError) || !(0, _isEmpty["default"])(alternatesErrors)) {
351
+ responsesErrors[index] = _objectSpread(_objectSpread({}, responseError), alternatesErrors);
352
+ }
353
+ });
354
+ var nbOfResponseAreas = (markup.match(/\{\{(\d+)\}\}/g) || []).length;
355
+
356
+ if (nbOfResponseAreas > maxResponseAreas) {
357
+ errors.responseAreas = "No more than ".concat(maxResponseAreas, " response areas should be defined.");
358
+ } else if (nbOfResponseAreas < 1) {
359
+ errors.responseAreas = 'There should be at least 1 response area defined.';
360
+ }
361
+
362
+ if (!(0, _isEmpty["default"])(responsesErrors)) {
363
+ errors.responses = responsesErrors;
364
+ }
365
+
300
366
  return errors;
301
367
  };
302
368
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.js"],"names":["translator","Translator","log","getFeedback","value","getIsAnswerCorrect","correctResponse","answerItem","answerCorrect","opts","mode","validation","defaults","validationDefault","literal","allowTrailingZeros","ignoreOrder","acceptedValues","answer","Object","values","alternates","mv","latexEqual","e","getResponseCorrectness","question","sessionResponse","correctResponses","responses","correctness","score","correct","correctAnswers","correctResponsesCount","keys","length","forEach","responseId","fullyCorrect","toFixed","getCorrectness","env","session","answers","getPartialScore","outcome","Promise","resolve","empty","partialScoringEnabled","partialScoring","enabled","console","normalizeSession","undefined","completed","createDefaultModel","model","s","getTextFromHTML","html","replace","prepareVal","trim","normalizedQuestion","language","note","showNote","t","lng","out","prompt","promptEnabled","markup","equationEditor","customKeys","disabled","view","feedback","role","rationale","rationaleEnabled","teacherInstructions","teacherInstructionsEnabled","createCorrectResponseSession","reduce","acc","id","validate","config","errors"],"mappings":"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","sourcesContent":["import debug from 'debug';\nimport isEmpty from 'lodash/isEmpty';\nimport Translator from '@pie-lib/pie-toolbox/translator';\nimport * as mv from '@pie-framework/math-validation';\nimport { getFeedbackForCorrectness } from '@pie-lib/pie-toolbox/feedback';\n\nimport defaults from './defaults';\nimport { partialScoring } from '@pie-lib/pie-toolbox/controller-utils';\n\nconst { translator } = Translator;\nconst log = debug('@pie-element:math-templated:controller');\n\nconst getFeedback = value => value ? 'correct' : 'incorrect';\n\nconst getIsAnswerCorrect = (correctResponse, answerItem) => {\n let answerCorrect = false;\n\n const opts = {\n mode: correctResponse.validation || defaults.validationDefault,\n ...(correctResponse.validation === 'literal' && {\n literal: {\n allowTrailingZeros: correctResponse.allowTrailingZeros || false,\n ignoreOrder: correctResponse.ignoreOrder || false,\n }\n })\n };\n\n if (!answerCorrect) {\n const acceptedValues = [\n correctResponse.answer,\n ...Object.values(correctResponse.alternates || {})\n ];\n\n try {\n for (const value of acceptedValues) {\n answerCorrect = mv.latexEqual(answerItem.value, value, opts);\n if (answerCorrect) break;\n }\n } catch (e) {\n log('Parse failure when evaluating math', e, correctResponse, answerItem);\n answerCorrect = false;\n }\n }\n\n return answerCorrect;\n};\n\nconst getResponseCorrectness = (question, sessionResponse) => {\n const correctResponses = question.responses;\n\n if (!sessionResponse) {\n return {\n correctness: 'unanswered',\n score: 0,\n correct: false,\n };\n } else {\n let correctAnswers = 0;\n let score = 0;\n let correct = false;\n const correctResponsesCount = Object.keys(correctResponses || {}).length;\n\n Object.keys(correctResponses).forEach((responseId) => {\n const answerItem = sessionResponse['r' + responseId];\n const correctResponse = correctResponses[responseId] || {};\n\n const answerCorrect = getIsAnswerCorrect(correctResponse, answerItem);\n if (answerCorrect) {\n correctAnswers++;\n }\n });\n\n const fullyCorrect = correctAnswers === correctResponsesCount;\n\n // partial credit scoring: each correct answer is worth 1 / total answers point\n // dichotomous scoring: for credit to be awarded, a correct answer must be entered for every response area\n score = (correctAnswers / Object.keys(correctResponses).length).toFixed(2);\n\n return {\n correctness: fullyCorrect ? 'correct' : 'incorrect',\n score: correctAnswers > 0 ? score : 0,\n correct\n };\n }\n};\n\nexport const getCorrectness = (question, env, session) => {\n if (env.mode === 'evaluate') {\n return getResponseCorrectness(\n question,\n session && session.answers\n );\n }\n};\n\nexport const getPartialScore = (question, session) => {\n if (!session || isEmpty(session)) {\n return 0;\n }\n\n return 1;\n};\n\nexport const outcome = (question, session, env) =>\n new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n }\n const partialScoringEnabled = partialScoring.enabled(question, env);\n console.log('partialScoringEnabled: ', partialScoringEnabled);\n session = normalizeSession(session);\n\n if (env.mode !== 'evaluate') {\n resolve({ score: undefined, completed: undefined });\n } else {\n const correctness = getCorrectness(question, env, session, true);\n const score = correctness.score;\n\n resolve({ score: partialScoringEnabled ? score : score === 1 ? 1 : 0 });\n }\n });\n\nexport const createDefaultModel = (model = {}) => ({\n ...defaults.model,\n ...model,\n});\n\nexport const normalizeSession = (s) => ({ ...s });\n\nconst getTextFromHTML = html => (html || '').replace(/<\\/?[^>]+(>|$)/g, '');\n\nexport const prepareVal = html => getTextFromHTML(html).trim();\n\nexport const model = (question, session, env) => {\n return new Promise((resolve) => {\n session = session || {};\n const normalizedQuestion = createDefaultModel(question);\n const correctness = getCorrectness(normalizedQuestion, env, session);\n const { responses, language } = normalizedQuestion;\n let { note } = normalizedQuestion;\n let showNote = false;\n\n // check if there is at least one alternate response or if the validation for at least one response is not literal\n Object.keys(responses).forEach((responseId) => {\n const correctResponse = responses[responseId] || {};\n if (correctResponse.alternates && Object.keys(correctResponse.alternates).length > 0) {\n showNote = true;\n } else if (correctResponse.validation !== 'literal') {\n showNote = true;\n }\n });\n\n if (!note) {\n note = translator.t('mathInline.primaryCorrectWithAlternates', { lng: language });\n }\n\n const out = {\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n markup: normalizedQuestion.markup,\n responses: env.mode === 'gather' ? null : normalizedQuestion.responses,\n language: normalizedQuestion.language,\n equationEditor: normalizedQuestion.equationEditor,\n customKeys: normalizedQuestion.customKeys,\n disabled: env.mode !== 'gather',\n view: env.mode === 'view',\n correctness,\n env,\n };\n\n const { answers = {} } = session || {};\n let feedback = {};\n\n if (env.mode === 'evaluate') {\n Object.keys(responses).forEach((responseId) => {\n const answerItem = answers['r' + responseId];\n const correctResponse = responses[responseId];\n feedback[responseId] = getIsAnswerCorrect(correctResponse, answerItem);\n });\n }\n\n if (env.mode === 'evaluate') {\n out.correctResponse = {};\n out.showNote = showNote;\n out.note = note;\n out.feedback = feedback;\n } else {\n out.responses = {};\n out.showNote = false;\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 log('out: ', out);\n resolve(out);\n });\n};\n\nexport const createCorrectResponseSession = (question, env) =>\n new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const correctResponse = Object.keys(question.responses).reduce((acc, responseId) => {\n acc['r' + responseId] = { value: question.responses[responseId].answer };\n return acc;\n }, {});\n\n resolve({ id: '1', answers: correctResponse });\n } else {\n resolve(null);\n }\n });\n\nexport const validate = (model = {}, config = {}) => {\n const errors = {};\n\n return errors;\n};\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../src/index.js"],"names":["translator","Translator","log","getFeedback","value","getContent","html","replace","getIsAnswerCorrect","correctResponse","answerItem","answerCorrect","opts","mode","validation","defaults","validationDefault","literal","allowTrailingZeros","ignoreOrder","acceptedValues","answer","Object","values","alternates","mv","latexEqual","e","getResponseCorrectness","question","sessionResponse","correctResponses","responses","correctness","score","correct","correctAnswers","correctResponsesCount","keys","length","forEach","responseId","fullyCorrect","toFixed","getCorrectness","env","session","answers","getPartialScore","outcome","Promise","resolve","empty","partialScoringEnabled","partialScoring","enabled","console","normalizeSession","undefined","completed","createDefaultModel","model","s","getTextFromHTML","prepareVal","trim","normalizedQuestion","language","note","showNote","t","lng","out","prompt","promptEnabled","markup","equationEditor","customKeys","disabled","view","feedback","role","rationale","rationaleEnabled","teacherInstructions","teacherInstructionsEnabled","createCorrectResponseSession","reduce","acc","id","validate","config","maxResponseAreas","responsesErrors","errors","field","required","entries","index","key","response","reversedAlternates","reverse","alternatesErrors","responseError","identicalAnswer","slice","some","val","nbOfResponseAreas","match","responseAreas"],"mappings":";;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AAEA;;AACA;;;;;;;;;;;;;;;;AAEA,IAAQA,UAAR,GAAuBC,sBAAvB,CAAQD,UAAR;AACA,IAAME,GAAG,GAAG,uBAAM,wCAAN,CAAZ;;AAEA,IAAMC,WAAW,GAAG,SAAdA,WAAc,CAAAC,KAAK;AAAA,SAAIA,KAAK,GAAG,SAAH,GAAe,WAAxB;AAAA,CAAzB;;AACA,IAAMC,UAAU,GAAG,SAAbA,UAAa,CAACC,IAAD;AAAA,SAAU,CAACA,IAAI,IAAI,EAAT,EAAaC,OAAb,CAAqB,6BAArB,EAAoD,EAApD,CAAV;AAAA,CAAnB;;AAEA,IAAMC,kBAAkB,GAAG,SAArBA,kBAAqB,CAACC,eAAD,EAAkBC,UAAlB,EAAiC;AAC1D,MAAIC,aAAa,GAAG,KAApB;;AAEA,MAAMC,IAAI;AACRC,IAAAA,IAAI,EAAEJ,eAAe,CAACK,UAAhB,IAA8BC,qBAASC;AADrC,KAEJP,eAAe,CAACK,UAAhB,KAA+B,SAA/B,IAA4C;AAC9CG,IAAAA,OAAO,EAAE;AACPC,MAAAA,kBAAkB,EAAET,eAAe,CAACS,kBAAhB,IAAsC,KADnD;AAEPC,MAAAA,WAAW,EAAEV,eAAe,CAACU,WAAhB,IAA+B;AAFrC;AADqC,GAFxC,CAAV;;AAUA,MAAI,CAACR,aAAL,EAAoB;AAClB,QAAMS,cAAc,IAClBX,eAAe,CAACY,MADE,6CAEfC,MAAM,CAACC,MAAP,CAAcd,eAAe,CAACe,UAAhB,IAA8B,EAA5C,CAFe,EAApB;;AAKA,QAAI;AAAA,iDACkBJ,cADlB;AAAA;;AAAA;AACF,4DAAoC;AAAA,cAAzBhB,KAAyB;AAClCO,UAAAA,aAAa,GAAGc,EAAE,CAACC,UAAH,CAAchB,UAAU,CAACN,KAAzB,EAAgCA,KAAhC,EAAuCQ,IAAvC,CAAhB;AACA,cAAID,aAAJ,EAAmB;AACpB;AAJC;AAAA;AAAA;AAAA;AAAA;AAKH,KALD,CAKE,OAAOgB,CAAP,EAAU;AACVzB,MAAAA,GAAG,CAAC,oCAAD,EAAuCyB,CAAvC,EAA0ClB,eAA1C,EAA2DC,UAA3D,CAAH;AACAC,MAAAA,aAAa,GAAG,KAAhB;AACD;AACF;;AAED,SAAOA,aAAP;AACD,CA/BD;;AAiCA,IAAMiB,sBAAsB,GAAG,SAAzBA,sBAAyB,CAACC,QAAD,EAAWC,eAAX,EAA+B;AAC5D,MAAMC,gBAAgB,GAAGF,QAAQ,CAACG,SAAlC;;AAEA,MAAI,CAACF,eAAL,EAAsB;AACpB,WAAO;AACLG,MAAAA,WAAW,EAAE,YADR;AAELC,MAAAA,KAAK,EAAE,CAFF;AAGLC,MAAAA,OAAO,EAAE;AAHJ,KAAP;AAKD,GAND,MAMO;AACL,QAAIC,cAAc,GAAG,CAArB;AACA,QAAIF,KAAK,GAAG,CAAZ;AACA,QAAIC,OAAO,GAAG,KAAd;AACA,QAAME,qBAAqB,GAAGf,MAAM,CAACgB,IAAP,CAAYP,gBAAgB,IAAI,EAAhC,EAAoCQ,MAAlE;AAEAjB,IAAAA,MAAM,CAACgB,IAAP,CAAYP,gBAAZ,EAA8BS,OAA9B,CAAsC,UAACC,UAAD,EAAgB;AACpD,UAAM/B,UAAU,GAAGoB,eAAe,CAAC,MAAMW,UAAP,CAAlC;AACA,UAAMhC,eAAe,GAAGsB,gBAAgB,CAACU,UAAD,CAAhB,IAAgC,EAAxD;AAEA,UAAM9B,aAAa,GAAGH,kBAAkB,CAACC,eAAD,EAAkBC,UAAlB,CAAxC;;AACA,UAAIC,aAAJ,EAAmB;AACjByB,QAAAA,cAAc;AACf;AACF,KARD;AAUA,QAAMM,YAAY,GAAGN,cAAc,KAAKC,qBAAxC,CAhBK,CAkBL;AACA;;AACAH,IAAAA,KAAK,GAAG,CAACE,cAAc,GAAGd,MAAM,CAACgB,IAAP,CAAYP,gBAAZ,EAA8BQ,MAAhD,EAAwDI,OAAxD,CAAgE,CAAhE,CAAR;AAEA,WAAO;AACLV,MAAAA,WAAW,EAAES,YAAY,GAAG,SAAH,GAAe,WADnC;AAELR,MAAAA,KAAK,EAAEE,cAAc,GAAG,CAAjB,GAAqBF,KAArB,GAA6B,CAF/B;AAGLC,MAAAA,OAAO,EAAPA;AAHK,KAAP;AAKD;AACF,CArCD;;AAuCO,IAAMS,cAAc,GAAG,SAAjBA,cAAiB,CAACf,QAAD,EAAWgB,GAAX,EAAgBC,OAAhB,EAA4B;AACxD,MAAID,GAAG,CAAChC,IAAJ,KAAa,UAAjB,EAA6B;AAC3B,WAAOe,sBAAsB,CAC3BC,QAD2B,EAE3BiB,OAAO,IAAIA,OAAO,CAACC,OAFQ,CAA7B;AAID;AACF,CAPM;;;;AASA,IAAMC,eAAe,GAAG,SAAlBA,eAAkB,CAACnB,QAAD,EAAWiB,OAAX,EAAuB;AACpD,MAAI,CAACA,OAAD,IAAY,yBAAQA,OAAR,CAAhB,EAAkC;AAChC,WAAO,CAAP;AACD;;AAED,SAAO,CAAP;AACD,CANM;;;;AAQA,IAAMG,OAAO,GAAG,SAAVA,OAAU,CAACpB,QAAD,EAAWiB,OAAX,EAAoBD,GAApB;AAAA,SACrB,IAAIK,OAAJ,CAAY,UAACC,OAAD,EAAa;AACvB,QAAI,CAACL,OAAD,IAAY,yBAAQA,OAAR,CAAhB,EAAkC;AAChCK,MAAAA,OAAO,CAAC;AAAEjB,QAAAA,KAAK,EAAE,CAAT;AAAYkB,QAAAA,KAAK,EAAE;AAAnB,OAAD,CAAP;AACD;;AACD,QAAMC,qBAAqB,GAAGC,gCAAeC,OAAf,CAAuB1B,QAAvB,EAAiCgB,GAAjC,CAA9B;;AACAW,IAAAA,OAAO,CAACtD,GAAR,CAAY,yBAAZ,EAAuCmD,qBAAvC;AACAP,IAAAA,OAAO,GAAGW,gBAAgB,CAACX,OAAD,CAA1B;;AAEA,QAAID,GAAG,CAAChC,IAAJ,KAAa,UAAjB,EAA6B;AAC3BsC,MAAAA,OAAO,CAAC;AAAEjB,QAAAA,KAAK,EAAEwB,SAAT;AAAoBC,QAAAA,SAAS,EAAED;AAA/B,OAAD,CAAP;AACD,KAFD,MAEO;AACL,UAAMzB,WAAW,GAAGW,cAAc,CAACf,QAAD,EAAWgB,GAAX,EAAgBC,OAAhB,EAAyB,IAAzB,CAAlC;AACA,UAAMZ,KAAK,GAAGD,WAAW,CAACC,KAA1B;AAEAiB,MAAAA,OAAO,CAAC;AAAEjB,QAAAA,KAAK,EAAEmB,qBAAqB,GAAGnB,KAAH,GAAWA,KAAK,KAAK,CAAV,GAAc,CAAd,GAAkB;AAA3D,OAAD,CAAP;AACD;AACF,GAhBD,CADqB;AAAA,CAAhB;;;;AAmBA,IAAM0B,kBAAkB,GAAG,SAArBA,kBAAqB;AAAA,MAACC,KAAD,uEAAS,EAAT;AAAA,yCAC7B9C,qBAAS8C,KADoB,GAE7BA,KAF6B;AAAA,CAA3B;;;;AAKA,IAAMJ,gBAAgB,GAAG,SAAnBA,gBAAmB,CAACK,CAAD;AAAA,2BAAaA,CAAb;AAAA,CAAzB;;;;AAEP,IAAMC,eAAe,GAAG,SAAlBA,eAAkB,CAAAzD,IAAI;AAAA,SAAI,CAACA,IAAI,IAAI,EAAT,EAAaC,OAAb,CAAqB,iBAArB,EAAwC,EAAxC,CAAJ;AAAA,CAA5B;;AAEO,IAAMyD,UAAU,GAAG,SAAbA,UAAa,CAAA1D,IAAI;AAAA,SAAIyD,eAAe,CAACzD,IAAD,CAAf,CAAsB2D,IAAtB,EAAJ;AAAA,CAAvB;;;;AAEA,IAAMJ,KAAK,GAAG,SAARA,KAAQ,CAAChC,QAAD,EAAWiB,OAAX,EAAoBD,GAApB,EAA4B;AAC/C,SAAO,IAAIK,OAAJ,CAAY,UAACC,OAAD,EAAa;AAC9BL,IAAAA,OAAO,GAAGA,OAAO,IAAI,EAArB;AACA,QAAMoB,kBAAkB,GAAGN,kBAAkB,CAAC/B,QAAD,CAA7C;AACA,QAAMI,WAAW,GAAGW,cAAc,CAACsB,kBAAD,EAAqBrB,GAArB,EAA0BC,OAA1B,CAAlC;AACA,QAAQd,SAAR,GAAgCkC,kBAAhC,CAAQlC,SAAR;AAAA,QAAmBmC,QAAnB,GAAgCD,kBAAhC,CAAmBC,QAAnB;AACA,QAAMC,IAAN,GAAeF,kBAAf,CAAME,IAAN;AACA,QAAIC,QAAQ,GAAG,KAAf,CAN8B,CAQ9B;;AACA/C,IAAAA,MAAM,CAACgB,IAAP,CAAYN,SAAZ,EAAuBQ,OAAvB,CAA+B,UAACC,UAAD,EAAgB;AAC7C,UAAMhC,eAAe,GAAGuB,SAAS,CAACS,UAAD,CAAT,IAAyB,EAAjD;;AACA,UAAIhC,eAAe,CAACe,UAAhB,IAA8BF,MAAM,CAACgB,IAAP,CAAY7B,eAAe,CAACe,UAA5B,EAAwCe,MAAxC,GAAiD,CAAnF,EAAsF;AACpF8B,QAAAA,QAAQ,GAAG,IAAX;AACD,OAFD,MAEO,IAAI5D,eAAe,CAACK,UAAhB,KAA+B,SAAnC,EAA8C;AACnDuD,QAAAA,QAAQ,GAAG,IAAX;AACD;AACF,KAPD;;AASA,QAAI,CAACD,IAAL,EAAW;AACTA,MAAAA,IAAI,GAAGpE,UAAU,CAACsE,CAAX,CAAa,yCAAb,EAAwD;AAAEC,QAAAA,GAAG,EAAEJ;AAAP,OAAxD,CAAP;AACD;;AAED,QAAMK,GAAG,GAAG;AACVC,MAAAA,MAAM,EAAEP,kBAAkB,CAACQ,aAAnB,GAAmCR,kBAAkB,CAACO,MAAtD,GAA+D,IAD7D;AAEVE,MAAAA,MAAM,EAAET,kBAAkB,CAACS,MAFjB;AAGV3C,MAAAA,SAAS,EAAEa,GAAG,CAAChC,IAAJ,KAAa,QAAb,GAAwB,IAAxB,GAA+BqD,kBAAkB,CAAClC,SAHnD;AAIVmC,MAAAA,QAAQ,EAAED,kBAAkB,CAACC,QAJnB;AAKVS,MAAAA,cAAc,EAAEV,kBAAkB,CAACU,cALzB;AAMVC,MAAAA,UAAU,EAAEX,kBAAkB,CAACW,UANrB;AAOVC,MAAAA,QAAQ,EAAEjC,GAAG,CAAChC,IAAJ,KAAa,QAPb;AAQVkE,MAAAA,IAAI,EAAElC,GAAG,CAAChC,IAAJ,KAAa,MART;AASVoB,MAAAA,WAAW,EAAXA,WATU;AAUVY,MAAAA,GAAG,EAAHA;AAVU,KAAZ;;AAaA,eAAyBC,OAAO,IAAI,EAApC;AAAA,4BAAQC,OAAR;AAAA,QAAQA,OAAR,6BAAkB,EAAlB;;AACA,QAAIiC,QAAQ,GAAG,EAAf;;AAEA,QAAInC,GAAG,CAAChC,IAAJ,KAAa,UAAjB,EAA6B;AAC3BS,MAAAA,MAAM,CAACgB,IAAP,CAAYN,SAAZ,EAAuBQ,OAAvB,CAA+B,UAACC,UAAD,EAAgB;AAC7C,YAAM/B,UAAU,GAAGqC,OAAO,CAAC,MAAMN,UAAP,CAA1B;AACA,YAAMhC,eAAe,GAAGuB,SAAS,CAACS,UAAD,CAAjC;AACAuC,QAAAA,QAAQ,CAACvC,UAAD,CAAR,GAAuBjC,kBAAkB,CAACC,eAAD,EAAkBC,UAAlB,CAAzC;AACD,OAJD;AAKD;;AAED,QAAImC,GAAG,CAAChC,IAAJ,KAAa,UAAjB,EAA6B;AAC3B2D,MAAAA,GAAG,CAAC/D,eAAJ,GAAsB,EAAtB;AACA+D,MAAAA,GAAG,CAACH,QAAJ,GAAeA,QAAf;AACAG,MAAAA,GAAG,CAACJ,IAAJ,GAAWA,IAAX;AACAI,MAAAA,GAAG,CAACQ,QAAJ,GAAeA,QAAf;AACD,KALD,MAKO;AACLR,MAAAA,GAAG,CAACxC,SAAJ,GAAgB,EAAhB;AACAwC,MAAAA,GAAG,CAACH,QAAJ,GAAe,KAAf;AACD;;AAED,QAAIxB,GAAG,CAACoC,IAAJ,KAAa,YAAb,KAA8BpC,GAAG,CAAChC,IAAJ,KAAa,MAAb,IAAuBgC,GAAG,CAAChC,IAAJ,KAAa,UAAlE,CAAJ,EAAmF;AACjF2D,MAAAA,GAAG,CAACU,SAAJ,GAAgBhB,kBAAkB,CAACiB,gBAAnB,GAAsCjB,kBAAkB,CAACgB,SAAzD,GAAqE,IAArF;AACAV,MAAAA,GAAG,CAACY,mBAAJ,GAA0BlB,kBAAkB,CAACmB,0BAAnB,GACtBnB,kBAAkB,CAACkB,mBADG,GAEtB,IAFJ;AAGD,KALD,MAKO;AACLZ,MAAAA,GAAG,CAACU,SAAJ,GAAgB,IAAhB;AACAV,MAAAA,GAAG,CAACY,mBAAJ,GAA0B,IAA1B;AACD;;AAEDlF,IAAAA,GAAG,CAAC,OAAD,EAAUsE,GAAV,CAAH;AACArB,IAAAA,OAAO,CAACqB,GAAD,CAAP;AACD,GApEM,CAAP;AAqED,CAtEM;;;;AAwEA,IAAMc,4BAA4B,GAAG,SAA/BA,4BAA+B,CAACzD,QAAD,EAAWgB,GAAX;AAAA,SAC1C,IAAIK,OAAJ,CAAY,UAACC,OAAD,EAAa;AACvB,QAAIN,GAAG,CAAChC,IAAJ,KAAa,UAAb,IAA2BgC,GAAG,CAACoC,IAAJ,KAAa,YAA5C,EAA0D;AACxD,UAAMxE,eAAe,GAAGa,MAAM,CAACgB,IAAP,CAAYT,QAAQ,CAACG,SAArB,EAAgCuD,MAAhC,CAAuC,UAACC,GAAD,EAAM/C,UAAN,EAAqB;AAClF+C,QAAAA,GAAG,CAAC,MAAM/C,UAAP,CAAH,GAAwB;AAAErC,UAAAA,KAAK,EAAEyB,QAAQ,CAACG,SAAT,CAAmBS,UAAnB,EAA+BpB;AAAxC,SAAxB;AACA,eAAOmE,GAAP;AACD,OAHuB,EAGrB,EAHqB,CAAxB;AAKArC,MAAAA,OAAO,CAAC;AAAEsC,QAAAA,EAAE,EAAE,GAAN;AAAW1C,QAAAA,OAAO,EAAEtC;AAApB,OAAD,CAAP;AACD,KAPD,MAOO;AACL0C,MAAAA,OAAO,CAAC,IAAD,CAAP;AACD;AACF,GAXD,CAD0C;AAAA,CAArC;;;;AAcA,IAAMuC,QAAQ,GAAG,SAAXA,QAAW,GAA6B;AAAA,MAA5B7B,KAA4B,uEAApB,EAAoB;AAAA,MAAhB8B,MAAgB,uEAAP,EAAO;AACnD,MAAQ3D,SAAR,GAA8B6B,KAA9B,CAAQ7B,SAAR;AAAA,MAAmB2C,MAAnB,GAA8Bd,KAA9B,CAAmBc,MAAnB;AACA,MAAQiB,gBAAR,GAA6BD,MAA7B,CAAQC,gBAAR;AACA,MAAMC,eAAe,GAAG,EAAxB;AACA,MAAMC,MAAM,GAAG,EAAf;AAEA,GAAC,qBAAD,EAAwB,QAAxB,EAAkC,WAAlC,EAA+CtD,OAA/C,CAAuD,UAACuD,KAAD,EAAW;AAAA;;AAChE,QAAI,iBAAAJ,MAAM,CAACI,KAAD,CAAN,wDAAeC,QAAf,IAA2B,CAAC3F,UAAU,CAACwD,KAAK,CAACkC,KAAD,CAAN,CAA1C,EAA0D;AACxDD,MAAAA,MAAM,CAACC,KAAD,CAAN,GAAgB,yBAAhB;AACD;AACF,GAJD;AAMAzE,EAAAA,MAAM,CAAC2E,OAAP,CAAejE,SAAS,IAAI,EAA5B,EAAgCQ,OAAhC,CAAwC,iBAAkB0D,KAAlB,EAA4B;AAAA;AAAA,QAA1BC,GAA0B;AAAA,QAArBC,QAAqB;;AAClE,QAAQ/E,MAAR,GAAmB+E,QAAnB,CAAQ/E,MAAR;AACA,QAAMgF,kBAAkB,GAAG,oCAAI/E,MAAM,CAAC2E,OAAP,CAAeG,QAAQ,CAAC5E,UAAT,IAAuB,EAAtC,CAAJ,EAA+C8E,OAA/C,EAA3B;AACA,QAAMC,gBAAgB,GAAG,EAAzB;AACA,QAAMC,aAAa,GAAG,EAAtB;;AAEA,QAAInF,MAAM,KAAK,EAAf,EAAmB;AACjBmF,MAAAA,aAAa,CAACnF,MAAd,GAAuB,8BAAvB;AACD;;AAEDgF,IAAAA,kBAAkB,CAAC7D,OAAnB,CAA2B,iBAAe0D,KAAf,EAAyB;AAAA;AAAA,UAAvBC,GAAuB;AAAA,UAAlB/F,KAAkB;;AAClD,UAAIA,KAAK,KAAK,EAAd,EAAkB;AAChBmG,QAAAA,gBAAgB,CAACJ,GAAD,CAAhB,GAAwB,8BAAxB;AACD,OAFD,MAEO;AACL,YAAMM,eAAe,GACnBpF,MAAM,KAAKjB,KAAX,IAAoBiG,kBAAkB,CAACK,KAAnB,CAAyBR,KAAK,GAAG,CAAjC,EAAoCS,IAApC,CAAyC;AAAA;AAAA,cAAIC,GAAJ;;AAAA,iBAAaA,GAAG,KAAKxG,KAArB;AAAA,SAAzC,CADtB;;AAGA,YAAIqG,eAAJ,EAAqB;AACnBF,UAAAA,gBAAgB,CAACJ,GAAD,CAAhB,GAAwB,2BAAxB;AACD;AACF;AACF,KAXD;;AAaA,QAAI,CAAC,yBAAQK,aAAR,CAAD,IAA2B,CAAC,yBAAQD,gBAAR,CAAhC,EAA2D;AACzDV,MAAAA,eAAe,CAACK,KAAD,CAAf,mCAA8BM,aAA9B,GAAgDD,gBAAhD;AACD;AACF,GA1BD;AA4BA,MAAMM,iBAAiB,GAAG,CAAClC,MAAM,CAACmC,KAAP,CAAa,gBAAb,KAAkC,EAAnC,EAAuCvE,MAAjE;;AAEA,MAAIsE,iBAAiB,GAAGjB,gBAAxB,EAA0C;AACxCE,IAAAA,MAAM,CAACiB,aAAP,0BAAuCnB,gBAAvC;AACD,GAFD,MAEO,IAAIiB,iBAAiB,GAAG,CAAxB,EAA2B;AAChCf,IAAAA,MAAM,CAACiB,aAAP,GAAuB,mDAAvB;AACD;;AAED,MAAI,CAAC,yBAAQlB,eAAR,CAAL,EAA+B;AAC7BC,IAAAA,MAAM,CAAC9D,SAAP,GAAmB6D,eAAnB;AACD;;AAED,SAAOC,MAAP;AACD,CArDM","sourcesContent":["import debug from 'debug';\nimport isEmpty from 'lodash/isEmpty';\nimport Translator from '@pie-lib/pie-toolbox/translator';\nimport * as mv from '@pie-framework/math-validation';\n\nimport defaults from './defaults';\nimport { partialScoring } from '@pie-lib/pie-toolbox/controller-utils';\n\nconst { translator } = Translator;\nconst log = debug('@pie-element:math-templated:controller');\n\nconst getFeedback = value => value ? 'correct' : 'incorrect';\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe)([^>]+)>)/gi, '');\n\nconst getIsAnswerCorrect = (correctResponse, answerItem) => {\n let answerCorrect = false;\n\n const opts = {\n mode: correctResponse.validation || defaults.validationDefault,\n ...(correctResponse.validation === 'literal' && {\n literal: {\n allowTrailingZeros: correctResponse.allowTrailingZeros || false,\n ignoreOrder: correctResponse.ignoreOrder || false,\n }\n })\n };\n\n if (!answerCorrect) {\n const acceptedValues = [\n correctResponse.answer,\n ...Object.values(correctResponse.alternates || {})\n ];\n\n try {\n for (const value of acceptedValues) {\n answerCorrect = mv.latexEqual(answerItem.value, value, opts);\n if (answerCorrect) break;\n }\n } catch (e) {\n log('Parse failure when evaluating math', e, correctResponse, answerItem);\n answerCorrect = false;\n }\n }\n\n return answerCorrect;\n};\n\nconst getResponseCorrectness = (question, sessionResponse) => {\n const correctResponses = question.responses;\n\n if (!sessionResponse) {\n return {\n correctness: 'unanswered',\n score: 0,\n correct: false,\n };\n } else {\n let correctAnswers = 0;\n let score = 0;\n let correct = false;\n const correctResponsesCount = Object.keys(correctResponses || {}).length;\n\n Object.keys(correctResponses).forEach((responseId) => {\n const answerItem = sessionResponse['r' + responseId];\n const correctResponse = correctResponses[responseId] || {};\n\n const answerCorrect = getIsAnswerCorrect(correctResponse, answerItem);\n if (answerCorrect) {\n correctAnswers++;\n }\n });\n\n const fullyCorrect = correctAnswers === correctResponsesCount;\n\n // partial credit scoring: each correct answer is worth 1 / total answers point\n // dichotomous scoring: for credit to be awarded, a correct answer must be entered for every response area\n score = (correctAnswers / Object.keys(correctResponses).length).toFixed(2);\n\n return {\n correctness: fullyCorrect ? 'correct' : 'incorrect',\n score: correctAnswers > 0 ? score : 0,\n correct\n };\n }\n};\n\nexport const getCorrectness = (question, env, session) => {\n if (env.mode === 'evaluate') {\n return getResponseCorrectness(\n question,\n session && session.answers\n );\n }\n};\n\nexport const getPartialScore = (question, session) => {\n if (!session || isEmpty(session)) {\n return 0;\n }\n\n return 1;\n};\n\nexport const outcome = (question, session, env) =>\n new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n }\n const partialScoringEnabled = partialScoring.enabled(question, env);\n console.log('partialScoringEnabled: ', partialScoringEnabled);\n session = normalizeSession(session);\n\n if (env.mode !== 'evaluate') {\n resolve({ score: undefined, completed: undefined });\n } else {\n const correctness = getCorrectness(question, env, session, true);\n const score = correctness.score;\n\n resolve({ score: partialScoringEnabled ? score : score === 1 ? 1 : 0 });\n }\n });\n\nexport const createDefaultModel = (model = {}) => ({\n ...defaults.model,\n ...model,\n});\n\nexport const normalizeSession = (s) => ({ ...s });\n\nconst getTextFromHTML = html => (html || '').replace(/<\\/?[^>]+(>|$)/g, '');\n\nexport const prepareVal = html => getTextFromHTML(html).trim();\n\nexport const model = (question, session, env) => {\n return new Promise((resolve) => {\n session = session || {};\n const normalizedQuestion = createDefaultModel(question);\n const correctness = getCorrectness(normalizedQuestion, env, session);\n const { responses, language } = normalizedQuestion;\n let { note } = normalizedQuestion;\n let showNote = false;\n\n // check if there is at least one alternate response or if the validation for at least one response is not literal\n Object.keys(responses).forEach((responseId) => {\n const correctResponse = responses[responseId] || {};\n if (correctResponse.alternates && Object.keys(correctResponse.alternates).length > 0) {\n showNote = true;\n } else if (correctResponse.validation !== 'literal') {\n showNote = true;\n }\n });\n\n if (!note) {\n note = translator.t('mathInline.primaryCorrectWithAlternates', { lng: language });\n }\n\n const out = {\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n markup: normalizedQuestion.markup,\n responses: env.mode === 'gather' ? null : normalizedQuestion.responses,\n language: normalizedQuestion.language,\n equationEditor: normalizedQuestion.equationEditor,\n customKeys: normalizedQuestion.customKeys,\n disabled: env.mode !== 'gather',\n view: env.mode === 'view',\n correctness,\n env,\n };\n\n const { answers = {} } = session || {};\n let feedback = {};\n\n if (env.mode === 'evaluate') {\n Object.keys(responses).forEach((responseId) => {\n const answerItem = answers['r' + responseId];\n const correctResponse = responses[responseId];\n feedback[responseId] = getIsAnswerCorrect(correctResponse, answerItem);\n });\n }\n\n if (env.mode === 'evaluate') {\n out.correctResponse = {};\n out.showNote = showNote;\n out.note = note;\n out.feedback = feedback;\n } else {\n out.responses = {};\n out.showNote = false;\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 log('out: ', out);\n resolve(out);\n });\n};\n\nexport const createCorrectResponseSession = (question, env) =>\n new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const correctResponse = Object.keys(question.responses).reduce((acc, responseId) => {\n acc['r' + responseId] = { value: question.responses[responseId].answer };\n return acc;\n }, {});\n\n resolve({ id: '1', answers: correctResponse });\n } else {\n resolve(null);\n }\n });\n\nexport const validate = (model = {}, config = {}) => {\n const { responses, markup } = model;\n const { maxResponseAreas } = config;\n const responsesErrors = {};\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(responses || {}).forEach(([key, response], index) => {\n const { answer } = response;\n const reversedAlternates = [...Object.entries(response.alternates || {})].reverse();\n const alternatesErrors = {};\n const responseError = {};\n\n if (answer === '') {\n responseError.answer = 'Content should not be empty.';\n }\n\n reversedAlternates.forEach(([key, value], index) => {\n if (value === '') {\n alternatesErrors[key] = 'Content should not be empty.';\n } else {\n const identicalAnswer =\n answer === value || reversedAlternates.slice(index + 1).some(([, val]) => val === value);\n\n if (identicalAnswer) {\n alternatesErrors[key] = 'Content should be unique.';\n }\n }\n });\n\n if (!isEmpty(responseError) || !isEmpty(alternatesErrors)) {\n responsesErrors[index] = { ...responseError, ...alternatesErrors };\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(responsesErrors)) {\n errors.responses = responsesErrors;\n }\n\n return errors;\n};\n"],"file":"index.js"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@pie-element/math-templated-controller",
3
3
  "private": true,
4
- "version": "2.10.1",
4
+ "version": "2.11.0",
5
5
  "description": "",
6
6
  "main": "lib/index.js",
7
7
  "module": "src/index.js",
@@ -105801,7 +105801,7 @@ class Design extends React$1.Component {
105801
105801
  const {classes, configuration, imageSupport, model, onConfigurationChanged, onModelChanged, uploadSoundSupport} = this.props;
105802
105802
  const {baseInputConfiguration = {}, contentDimensions = {}, prompt = {}, rationale = {}, settingsPanelDisabled, teacherInstructions = {}, language = {}, languageChoices = {}, spellCheck = {}, playerSpellCheck = {}, maxImageWidth = {}, maxImageHeight = {}, mathMlOptions = {}, template = {}, editSource = {}, ignoreOrder: cIgnoreOrder = {}, allowTrailingZeros: cAllowTrailingZeros = {}, partialScoring = {}, maxResponseAreas} = configuration || ({});
105803
105803
  const {errors, promptEnabled, rationaleEnabled, spellCheckEnabled, teacherInstructionsEnabled, toolbarEditorPosition, responses, equationEditor} = model || ({});
105804
- const {choices: choicesErrors = {}, prompt: promptError, rationale: rationaleError, responseAreas: responseAreasError, teacherInstructions: teacherInstructionsError, responses: responsesErrors} = errors || ({});
105804
+ const {prompt: promptError, rationale: rationaleError, responseAreas: responseAreasError, teacherInstructions: teacherInstructionsError, responses: responsesErrors = {}} = errors || ({});
105805
105805
  const panelSettings = {
105806
105806
  'language.enabled': language.settings && toggle(language.label, true),
105807
105807
  language: language.settings && language.enabled && settings$1.dropdown(languageChoices.label, languageChoices.options)
@@ -105839,13 +105839,13 @@ class Design extends React$1.Component {
105839
105839
  __self: this,
105840
105840
  __source: {
105841
105841
  fileName: _jsxFileName,
105842
- lineNumber: 297
105842
+ lineNumber: 296
105843
105843
  }
105844
105844
  }),
105845
105845
  __self: this,
105846
105846
  __source: {
105847
105847
  fileName: _jsxFileName,
105848
- lineNumber: 293
105848
+ lineNumber: 292
105849
105849
  }
105850
105850
  }, teacherInstructionsEnabled && React$1.createElement(InputContainer, {
105851
105851
  label: teacherInstructions.label,
@@ -105853,7 +105853,7 @@ class Design extends React$1.Component {
105853
105853
  __self: this,
105854
105854
  __source: {
105855
105855
  fileName: _jsxFileName,
105856
- lineNumber: 310
105856
+ lineNumber: 309
105857
105857
  }
105858
105858
  }, React$1.createElement(EditableHtml, {
105859
105859
  className: classes.prompt,
@@ -105877,14 +105877,14 @@ class Design extends React$1.Component {
105877
105877
  __self: this,
105878
105878
  __source: {
105879
105879
  fileName: _jsxFileName,
105880
- lineNumber: 314
105880
+ lineNumber: 313
105881
105881
  }
105882
105882
  }), teacherInstructionsError && React$1.createElement('div', {
105883
105883
  className: classes.errorText,
105884
105884
  __self: this,
105885
105885
  __source: {
105886
105886
  fileName: _jsxFileName,
105887
- lineNumber: 343
105887
+ lineNumber: 342
105888
105888
  }
105889
105889
  }, teacherInstructionsError)), promptEnabled && React$1.createElement(InputContainer, {
105890
105890
  label: prompt.label,
@@ -105892,7 +105892,7 @@ class Design extends React$1.Component {
105892
105892
  __self: this,
105893
105893
  __source: {
105894
105894
  fileName: _jsxFileName,
105895
- lineNumber: 349
105895
+ lineNumber: 348
105896
105896
  }
105897
105897
  }, React$1.createElement(EditableHtml, {
105898
105898
  className: classes.prompt,
@@ -105917,21 +105917,21 @@ class Design extends React$1.Component {
105917
105917
  __self: this,
105918
105918
  __source: {
105919
105919
  fileName: _jsxFileName,
105920
- lineNumber: 353
105920
+ lineNumber: 352
105921
105921
  }
105922
105922
  }), promptError && React$1.createElement('div', {
105923
105923
  className: classes.errorText,
105924
105924
  __self: this,
105925
105925
  __source: {
105926
105926
  fileName: _jsxFileName,
105927
- lineNumber: 377
105927
+ lineNumber: 376
105928
105928
  }
105929
105929
  }, promptError)), React$1.createElement(Typography, {
105930
105930
  className: classes.title,
105931
105931
  __self: this,
105932
105932
  __source: {
105933
105933
  fileName: _jsxFileName,
105934
- lineNumber: 382
105934
+ lineNumber: 381
105935
105935
  }
105936
105936
  }, "Response Template"), React$1.createElement(EditableHtml, {
105937
105937
  activePlugins: ALL_PLUGINS,
@@ -105943,7 +105943,7 @@ class Design extends React$1.Component {
105943
105943
  responseAreaProps: {
105944
105944
  type: 'math-templated',
105945
105945
  respAreaToolbar: null,
105946
- error: () => choicesErrors,
105946
+ error: () => responsesErrors,
105947
105947
  onHandleAreaChange: this.onHandleAreaChange,
105948
105948
  maxResponseAreas: maxResponseAreas
105949
105949
  },
@@ -105966,14 +105966,21 @@ class Design extends React$1.Component {
105966
105966
  __self: this,
105967
105967
  __source: {
105968
105968
  fileName: _jsxFileName,
105969
- lineNumber: 384
105969
+ lineNumber: 383
105970
105970
  }
105971
- }), React$1.createElement(Typography, {
105971
+ }), responseAreasError && React$1.createElement('div', {
105972
+ className: classes.responseAreaError,
105973
+ __self: this,
105974
+ __source: {
105975
+ fileName: _jsxFileName,
105976
+ lineNumber: 415
105977
+ }
105978
+ }, responseAreasError), React$1.createElement(Typography, {
105972
105979
  className: classes.title,
105973
105980
  __self: this,
105974
105981
  __source: {
105975
105982
  fileName: _jsxFileName,
105976
- lineNumber: 416
105983
+ lineNumber: 418
105977
105984
  }
105978
105985
  }, "Define Response"), React$1.createElement(InputContainer, {
105979
105986
  label: "Response Template Equation Editor",
@@ -105981,7 +105988,7 @@ class Design extends React$1.Component {
105981
105988
  __self: this,
105982
105989
  __source: {
105983
105990
  fileName: _jsxFileName,
105984
- lineNumber: 418
105991
+ lineNumber: 420
105985
105992
  }
105986
105993
  }, React$1.createElement(Select, {
105987
105994
  className: classes.select,
@@ -105990,91 +105997,91 @@ class Design extends React$1.Component {
105990
105997
  __self: this,
105991
105998
  __source: {
105992
105999
  fileName: _jsxFileName,
105993
- lineNumber: 422
106000
+ lineNumber: 424
105994
106001
  }
105995
106002
  }, React$1.createElement(MenuItem, {
105996
106003
  value: "non-negative-integers",
105997
106004
  __self: this,
105998
106005
  __source: {
105999
106006
  fileName: _jsxFileName,
106000
- lineNumber: 429
106007
+ lineNumber: 431
106001
106008
  }
106002
106009
  }, "Numeric - Non-Negative Integers"), React$1.createElement(MenuItem, {
106003
106010
  value: "integers",
106004
106011
  __self: this,
106005
106012
  __source: {
106006
106013
  fileName: _jsxFileName,
106007
- lineNumber: 432
106014
+ lineNumber: 434
106008
106015
  }
106009
106016
  }, "Numeric - Integers"), React$1.createElement(MenuItem, {
106010
106017
  value: "decimals",
106011
106018
  __self: this,
106012
106019
  __source: {
106013
106020
  fileName: _jsxFileName,
106014
- lineNumber: 433
106021
+ lineNumber: 435
106015
106022
  }
106016
106023
  }, "Numeric - Decimals"), React$1.createElement(MenuItem, {
106017
106024
  value: "fractions",
106018
106025
  __self: this,
106019
106026
  __source: {
106020
106027
  fileName: _jsxFileName,
106021
- lineNumber: 434
106028
+ lineNumber: 436
106022
106029
  }
106023
106030
  }, "Numeric - Fractions"), React$1.createElement(MenuItem, {
106024
106031
  value: 1,
106025
106032
  __self: this,
106026
106033
  __source: {
106027
106034
  fileName: _jsxFileName,
106028
- lineNumber: 435
106035
+ lineNumber: 437
106029
106036
  }
106030
106037
  }, "Grade 1 - 2"), React$1.createElement(MenuItem, {
106031
106038
  value: 3,
106032
106039
  __self: this,
106033
106040
  __source: {
106034
106041
  fileName: _jsxFileName,
106035
- lineNumber: 436
106042
+ lineNumber: 438
106036
106043
  }
106037
106044
  }, "Grade 3 - 5"), React$1.createElement(MenuItem, {
106038
106045
  value: 6,
106039
106046
  __self: this,
106040
106047
  __source: {
106041
106048
  fileName: _jsxFileName,
106042
- lineNumber: 437
106049
+ lineNumber: 439
106043
106050
  }
106044
106051
  }, "Grade 6 - 7"), React$1.createElement(MenuItem, {
106045
106052
  value: 8,
106046
106053
  __self: this,
106047
106054
  __source: {
106048
106055
  fileName: _jsxFileName,
106049
- lineNumber: 438
106056
+ lineNumber: 440
106050
106057
  }
106051
106058
  }, "Grade 8 - HS"), React$1.createElement(MenuItem, {
106052
106059
  value: 'geometry',
106053
106060
  __self: this,
106054
106061
  __source: {
106055
106062
  fileName: _jsxFileName,
106056
- lineNumber: 439
106063
+ lineNumber: 441
106057
106064
  }
106058
106065
  }, "Geometry"), React$1.createElement(MenuItem, {
106059
106066
  value: 'advanced-algebra',
106060
106067
  __self: this,
106061
106068
  __source: {
106062
106069
  fileName: _jsxFileName,
106063
- lineNumber: 440
106070
+ lineNumber: 442
106064
106071
  }
106065
106072
  }, "Advanced Algebra"), React$1.createElement(MenuItem, {
106066
106073
  value: 'statistics',
106067
106074
  __self: this,
106068
106075
  __source: {
106069
106076
  fileName: _jsxFileName,
106070
- lineNumber: 443
106077
+ lineNumber: 445
106071
106078
  }
106072
106079
  }, "Statistics"), React$1.createElement(MenuItem, {
106073
106080
  value: 'item-authoring',
106074
106081
  __self: this,
106075
106082
  __source: {
106076
106083
  fileName: _jsxFileName,
106077
- lineNumber: 444
106084
+ lineNumber: 446
106078
106085
  }
106079
106086
  }, "Item Authoring"))), Object.keys(responses || ({})).map((responseKey, idx) => {
106080
106087
  const response = responses[responseKey];
@@ -106092,7 +106099,7 @@ class Design extends React$1.Component {
106092
106099
  __self: this,
106093
106100
  __source: {
106094
106101
  fileName: _jsxFileName,
106095
- lineNumber: 453
106102
+ lineNumber: 455
106096
106103
  }
106097
106104
  });
106098
106105
  }
@@ -106103,7 +106110,7 @@ class Design extends React$1.Component {
106103
106110
  __self: this,
106104
106111
  __source: {
106105
106112
  fileName: _jsxFileName,
106106
- lineNumber: 471
106113
+ lineNumber: 473
106107
106114
  }
106108
106115
  }, React$1.createElement(EditableHtml, {
106109
106116
  className: classes.prompt,
@@ -106132,14 +106139,14 @@ class Design extends React$1.Component {
106132
106139
  __self: this,
106133
106140
  __source: {
106134
106141
  fileName: _jsxFileName,
106135
- lineNumber: 475
106142
+ lineNumber: 477
106136
106143
  }
106137
106144
  }), rationaleError && React$1.createElement('div', {
106138
106145
  className: classes.errorText,
106139
106146
  __self: this,
106140
106147
  __source: {
106141
106148
  fileName: _jsxFileName,
106142
- lineNumber: 506
106149
+ lineNumber: 508
106143
106150
  }
106144
106151
  }, rationaleError)));
106145
106152
  }
@@ -106159,6 +106166,11 @@ var Main = styles$D.withStyles(theme => ({
106159
106166
  fontSize: '0.75rem',
106160
106167
  marginTop: theme.spacing.unit
106161
106168
  },
106169
+ responseAreaError: {
106170
+ color: theme.palette.error.main,
106171
+ fontSize: '0.75rem',
106172
+ marginBottom: theme.spacing.unit
106173
+ },
106162
106174
  markup: {
106163
106175
  width: '100%',
106164
106176
  marginTop: theme.spacing.unit * 2,
@@ -3250,8 +3250,8 @@ function transformOptions(options) {
3250
3250
  return options;
3251
3251
  }
3252
3252
 
3253
- function ownKeys$7(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; }
3254
- function _objectSpread$7(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$7(Object(source), !0).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$7(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
3253
+ 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; }
3254
+ 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) { _defineProperty__default["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; }
3255
3255
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf__default["default"](Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf__default["default"](this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn__default["default"](this, result); }; }
3256
3256
  function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
3257
3257
  function noop() {}
@@ -3311,9 +3311,9 @@ var I18n = function (_EventEmitter) {
3311
3311
  }
3312
3312
  }
3313
3313
  var defOpts = get$1();
3314
- this.options = _objectSpread$7(_objectSpread$7(_objectSpread$7({}, defOpts), this.options), transformOptions(options));
3314
+ this.options = _objectSpread(_objectSpread(_objectSpread({}, defOpts), this.options), transformOptions(options));
3315
3315
  if (this.options.compatibilityAPI !== 'v1') {
3316
- this.options.interpolation = _objectSpread$7(_objectSpread$7({}, defOpts.interpolation), this.options.interpolation);
3316
+ this.options.interpolation = _objectSpread(_objectSpread({}, defOpts.interpolation), this.options.interpolation);
3317
3317
  }
3318
3318
  if (options.keySeparator !== undefined) {
3319
3319
  this.options.userDefinedKeySeparator = options.keySeparator;
@@ -3591,7 +3591,7 @@ var I18n = function (_EventEmitter) {
3591
3591
  }
3592
3592
  options = _this5.options.overloadTranslationOptionHandler([key, opts].concat(rest));
3593
3593
  } else {
3594
- options = _objectSpread$7({}, opts);
3594
+ options = _objectSpread({}, opts);
3595
3595
  }
3596
3596
  options.lng = options.lng || fixedT.lng;
3597
3597
  options.lngs = options.lngs || fixedT.lngs;
@@ -3718,7 +3718,7 @@ var I18n = function (_EventEmitter) {
3718
3718
  var _this8 = this;
3719
3719
  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
3720
3720
  var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop;
3721
- var mergedOptions = _objectSpread$7(_objectSpread$7(_objectSpread$7({}, this.options), options), {
3721
+ var mergedOptions = _objectSpread(_objectSpread(_objectSpread({}, this.options), options), {
3722
3722
  isClone: true
3723
3723
  });
3724
3724
  var clone = new I18n(mergedOptions);
@@ -3729,7 +3729,7 @@ var I18n = function (_EventEmitter) {
3729
3729
  membersToCopy.forEach(function (m) {
3730
3730
  clone[m] = _this8[m];
3731
3731
  });
3732
- clone.services = _objectSpread$7({}, this.services);
3732
+ clone.services = _objectSpread({}, this.services);
3733
3733
  clone.services.utils = {
3734
3734
  hasLoadedNamespace: clone.hasLoadedNamespace.bind(clone)
3735
3735
  };
@@ -4041,185 +4041,6 @@ exports["default"] = _default;
4041
4041
 
4042
4042
  var Translator = /*@__PURE__*/getDefaultExportFromCjs(translator$2);
4043
4043
 
4044
- var feedback$1 = {};
4045
-
4046
- var feedback = {};
4047
-
4048
- var _interopRequireDefault$2 = interopRequireDefault.exports;
4049
-
4050
- Object.defineProperty(feedback, "__esModule", {
4051
- value: true
4052
- });
4053
- feedback.getFeedbackForCorrectness = feedback.getFeedback = feedback.getActualFeedbackForCorrectness = feedback.getActualFeedback = feedback.defaults = void 0;
4054
-
4055
- var _defineProperty2 = _interopRequireDefault$2(defineProperty$1.exports);
4056
-
4057
- 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; }
4058
-
4059
- 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; }
4060
-
4061
- var defaults$1 = {
4062
- correct: {
4063
- type: 'default',
4064
- "default": 'Correct',
4065
- custom: 'Correct'
4066
- },
4067
- incorrect: {
4068
- type: 'default',
4069
- "default": 'Incorrect',
4070
- custom: 'Incorrect'
4071
- },
4072
- partial: {
4073
- type: 'default',
4074
- "default": 'Nearly',
4075
- custom: 'Nearly'
4076
- },
4077
- unanswered: {
4078
- type: 'default',
4079
- "default": 'You have not entered a response',
4080
- custom: 'You have not entered a response'
4081
- }
4082
- };
4083
- /**
4084
- * @typedef {Object} FeedbackConfig
4085
- * @property {'default'|'none'|'custom'} type
4086
- * @property {string} default
4087
- * @property {string} custom
4088
- *
4089
- * @typedef {Object} Feedback
4090
- * @property {FeedbackConfig} correct
4091
- * @property {FeedbackConfig} incorrect
4092
- * @property {FeedbackConfig} partial
4093
- */
4094
-
4095
- feedback.defaults = defaults$1;
4096
-
4097
- var normalizeCorrectness = function normalizeCorrectness(c) {
4098
- if (c === 'partially-correct') {
4099
- return 'partial';
4100
- }
4101
-
4102
- return c;
4103
- };
4104
- /**
4105
- * Get the feedback for the correctness
4106
- *
4107
- * @param {'correct'|'incorrect'|'partial'} correctness
4108
- * @param {Feedback} feedback
4109
- */
4110
-
4111
-
4112
- var getFeedbackForCorrectness = function getFeedbackForCorrectness(correctness, feedback) {
4113
- return new Promise(function (resolve) {
4114
- feedback = _objectSpread(_objectSpread({}, defaults$1), feedback);
4115
- correctness = normalizeCorrectness(correctness);
4116
- var fb = feedback[correctness] || defaults$1[correctness] || {};
4117
- var d = defaults$1[correctness] || {};
4118
- getFeedback(fb, d[fb.type || 'default']).then(function (result) {
4119
- return resolve(result);
4120
- });
4121
- });
4122
- };
4123
- /**
4124
- * Get the feedback from a {FeedbackConfig}
4125
- *
4126
- * @param {FeedbackConfig} feedback
4127
- * @param {string} fallback
4128
- */
4129
-
4130
-
4131
- feedback.getFeedbackForCorrectness = getFeedbackForCorrectness;
4132
-
4133
- var getFeedback = function getFeedback(feedback, fallback) {
4134
- return new Promise(function (resolve) {
4135
- if (!feedback || feedback.type === 'none') {
4136
- resolve(undefined);
4137
- return;
4138
- }
4139
-
4140
- feedback = feedback || {};
4141
- var out = feedback[feedback.type] || fallback;
4142
- resolve(out);
4143
- });
4144
- }; // TODO: should replace getFeedbackForCorrectness
4145
-
4146
- /**
4147
- * Get feedback for correctness
4148
- * @param {'correct'|'incorrect'|'partial'} correctness
4149
- * @param {Feedback} feedback
4150
- */
4151
-
4152
-
4153
- feedback.getFeedback = getFeedback;
4154
-
4155
- var getActualFeedbackForCorrectness = function getActualFeedbackForCorrectness(correctness, feedback) {
4156
- feedback = _objectSpread(_objectSpread({}, defaults$1), feedback); // normalize correctness
4157
-
4158
- correctness = correctness === 'partially-correct' ? 'partial' : correctness;
4159
- var defaultFeedback = defaults$1[correctness] || {};
4160
- var fb = feedback[correctness] || defaultFeedback;
4161
- return getActualFeedback(fb, defaultFeedback[fb.type || 'default']);
4162
- }; // TODO: should replace getFeedback
4163
-
4164
- /**
4165
- * Get the feedback from a {FeedbackConfig}
4166
- * @param {FeedbackConfig} feedback
4167
- * @param {string} fallback
4168
- */
4169
-
4170
-
4171
- feedback.getActualFeedbackForCorrectness = getActualFeedbackForCorrectness;
4172
-
4173
- var getActualFeedback = function getActualFeedback(feedback, fallback) {
4174
- if (!feedback || feedback.type === 'none') {
4175
- return undefined;
4176
- }
4177
-
4178
- return feedback[feedback.type] || fallback;
4179
- };
4180
-
4181
- feedback.getActualFeedback = getActualFeedback;
4182
-
4183
- (function (exports) {
4184
-
4185
- Object.defineProperty(exports, "__esModule", {
4186
- value: true
4187
- });
4188
- Object.defineProperty(exports, "defaults", {
4189
- enumerable: true,
4190
- get: function get() {
4191
- return _feedback.defaults;
4192
- }
4193
- });
4194
- Object.defineProperty(exports, "getActualFeedback", {
4195
- enumerable: true,
4196
- get: function get() {
4197
- return _feedback.getActualFeedback;
4198
- }
4199
- });
4200
- Object.defineProperty(exports, "getActualFeedbackForCorrectness", {
4201
- enumerable: true,
4202
- get: function get() {
4203
- return _feedback.getActualFeedbackForCorrectness;
4204
- }
4205
- });
4206
- Object.defineProperty(exports, "getFeedback", {
4207
- enumerable: true,
4208
- get: function get() {
4209
- return _feedback.getFeedback;
4210
- }
4211
- });
4212
- Object.defineProperty(exports, "getFeedbackForCorrectness", {
4213
- enumerable: true,
4214
- get: function get() {
4215
- return _feedback.getFeedbackForCorrectness;
4216
- }
4217
- });
4218
-
4219
- var _feedback = feedback;
4220
-
4221
- }(feedback$1));
4222
-
4223
4044
  // Should be exactly the same as configure/defaults.js
4224
4045
  var defaults = {
4225
4046
  model: {
@@ -22971,6 +22792,7 @@ var _controllerUtils = controllerUtils;
22971
22792
  }(controllerUtils$1));
22972
22793
 
22973
22794
  const { translator } = Translator;
22795
+ const getContent = (html) => (html || '').replace(/(<(?!img|iframe)([^>]+)>)/gi, '');
22974
22796
 
22975
22797
  const getIsAnswerCorrect = (correctResponse, answerItem) => {
22976
22798
  let answerCorrect = false;
@@ -23175,8 +22997,57 @@ const createCorrectResponseSession = (question, env) =>
23175
22997
  });
23176
22998
 
23177
22999
  const validate = (model = {}, config = {}) => {
23000
+ const { responses, markup } = model;
23001
+ const { maxResponseAreas } = config;
23002
+ const responsesErrors = {};
23178
23003
  const errors = {};
23179
23004
 
23005
+ ['teacherInstructions', 'prompt', 'rationale'].forEach((field) => {
23006
+ if (config[field]?.required && !getContent(model[field])) {
23007
+ errors[field] = 'This field is required.';
23008
+ }
23009
+ });
23010
+
23011
+ Object.entries(responses || {}).forEach(([key, response], index) => {
23012
+ const { answer } = response;
23013
+ const reversedAlternates = [...Object.entries(response.alternates || {})].reverse();
23014
+ const alternatesErrors = {};
23015
+ const responseError = {};
23016
+
23017
+ if (answer === '') {
23018
+ responseError.answer = 'Content should not be empty.';
23019
+ }
23020
+
23021
+ reversedAlternates.forEach(([key, value], index) => {
23022
+ if (value === '') {
23023
+ alternatesErrors[key] = 'Content should not be empty.';
23024
+ } else {
23025
+ const identicalAnswer =
23026
+ answer === value || reversedAlternates.slice(index + 1).some(([, val]) => val === value);
23027
+
23028
+ if (identicalAnswer) {
23029
+ alternatesErrors[key] = 'Content should be unique.';
23030
+ }
23031
+ }
23032
+ });
23033
+
23034
+ if (!isEmpty_1(responseError) || !isEmpty_1(alternatesErrors)) {
23035
+ responsesErrors[index] = { ...responseError, ...alternatesErrors };
23036
+ }
23037
+ });
23038
+
23039
+ const nbOfResponseAreas = (markup.match(/\{\{(\d+)\}\}/g) || []).length;
23040
+
23041
+ if (nbOfResponseAreas > maxResponseAreas) {
23042
+ errors.responseAreas = `No more than ${maxResponseAreas} response areas should be defined.`;
23043
+ } else if (nbOfResponseAreas < 1) {
23044
+ errors.responseAreas = 'There should be at least 1 response area defined.';
23045
+ }
23046
+
23047
+ if (!isEmpty_1(responsesErrors)) {
23048
+ errors.responses = responsesErrors;
23049
+ }
23050
+
23180
23051
  return errors;
23181
23052
  };
23182
23053
 
package/module/index.html CHANGED
@@ -2,7 +2,7 @@
2
2
  <!doctype html>
3
3
  <html>
4
4
  <head>
5
- <title>@pie-element/math-templated@2.12.0</title>
5
+ <title>@pie-element/math-templated@2.12.1</title>
6
6
  <script
7
7
  type="module"
8
8
  src="https://cdn.jsdelivr.net/npm/@pslb/demo-el@^1.0.0/dist/demo-el/demo-el.esm.js"></script>
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pie-element/math-templated",
3
- "version": "2.12.0",
3
+ "version": "2.12.1",
4
4
  "modules": [
5
5
  {
6
6
  "name": "@pie-lib/pie-toolbox-math-rendering-module",
package/module/print.html CHANGED
@@ -2,7 +2,7 @@
2
2
  <!doctype html>
3
3
  <html>
4
4
  <head>
5
- <title>@pie-element/math-templated@2.12.0</title>
5
+ <title>@pie-element/math-templated@2.12.1</title>
6
6
  <link
7
7
  href="https://fonts.googleapis.com/css?family=Roboto&display=swap"
8
8
  rel="stylesheet"
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "access": "public"
5
5
  },
6
6
  "repository": "pie-framework/pie-elements",
7
- "version": "2.12.1",
7
+ "version": "2.13.0",
8
8
  "description": "",
9
9
  "dependencies": {
10
10
  "@material-ui/core": "^3.9.2",
@@ -16,7 +16,7 @@
16
16
  },
17
17
  "author": "",
18
18
  "license": "ISC",
19
- "gitHead": "989d6e261d8d8edc4da64e0aa6b572bddbb87a0f",
19
+ "gitHead": "f9eb4be445411a96452baccb77dedab25668887d",
20
20
  "scripts": {
21
21
  "postpublish": "../../scripts/postpublish"
22
22
  },