@pie-element/explicit-constructed-response 10.0.0-next.43 → 10.1.1-next.1

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.
@@ -10,10 +10,7 @@ exports.normalize = void 0;
10
10
  exports.outcome = outcome;
11
11
  exports.validate = exports.prepareVal = exports.prepareChoice = void 0;
12
12
  var _debug = _interopRequireDefault(require("debug"));
13
- var _map = _interopRequireDefault(require("lodash/map"));
14
- var _reduce = _interopRequireDefault(require("lodash/reduce"));
15
- var _find = _interopRequireDefault(require("lodash/find"));
16
- var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
13
+ var _lodashEs = require("lodash-es");
17
14
  var _he = require("he");
18
15
  var _controllerUtils = require("@pie-lib/controller-utils");
19
16
  var _translator = _interopRequireDefault(require("@pie-lib/translator"));
@@ -66,7 +63,7 @@ const getAdjustedLength = length => {
66
63
  // we can't use the dom parser here because it is not available in the node environment
67
64
  const decodeHtmlEntities = str => {
68
65
  if (!str) return '';
69
- return str.replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g, '"').replace(/&#x27;|&#39;/g, '\'').replace(/&amp;/g, '&');
66
+ return str.replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g, '"').replace(/&#x27;|&#39;/g, "'").replace(/&amp;/g, '&');
70
67
  };
71
68
  const normalize = question => ({
72
69
  ..._defaults.default,
@@ -103,16 +100,16 @@ async function model(question, session, env) {
103
100
  incorrect: 'Incorrect'
104
101
  }, normalizedQuestion.defaultFeedback);
105
102
  const prepareChoiceFn = prepareChoice(env.mode, defaultFeedback);
106
- const choices = (0, _reduce.default)(normalizedQuestion.choices, (obj, area, key) => {
107
- obj[key] = (0, _map.default)(area, prepareChoiceFn);
103
+ const choices = (0, _lodashEs.reduce)(normalizedQuestion.choices, (obj, area, key) => {
104
+ obj[key] = (0, _lodashEs.map)(area, prepareChoiceFn);
108
105
  return obj;
109
106
  }, {});
110
107
  const {
111
108
  value = {}
112
109
  } = session || {};
113
- const feedback = env.mode === 'evaluate' ? (0, _reduce.default)(normalizedQuestion.choices, (obj, respArea, key) => {
110
+ const feedback = env.mode === 'evaluate' ? (0, _lodashEs.reduce)(normalizedQuestion.choices, (obj, respArea, key) => {
114
111
  const chosenValue = value && value[key];
115
- const val = !(0, _isEmpty.default)(chosenValue) && (0, _find.default)(respArea, c => prepareVal(c.label) === prepareVal(chosenValue));
112
+ const val = !(0, _lodashEs.isEmpty)(chosenValue) && (0, _lodashEs.find)(respArea, c => prepareVal(c.label) === prepareVal(chosenValue));
116
113
  obj[key] = getFeedback(val);
117
114
  return obj;
118
115
  }, {}) : {};
@@ -171,14 +168,14 @@ const getScore = (config, session) => {
171
168
  const {
172
169
  value
173
170
  } = session || {};
174
- if (!session || (0, _isEmpty.default)(session) || !value) {
171
+ if (!session || (0, _lodashEs.isEmpty)(session) || !value) {
175
172
  return 0;
176
173
  }
177
174
  const responseAreas = config.markup && config.markup.match(/\{\{(.+?)\}\}/g);
178
175
  const maxScore = responseAreas ? responseAreas.length : 0;
179
- const correctCount = (0, _reduce.default)(config.choices, (total, respArea, key) => {
176
+ const correctCount = (0, _lodashEs.reduce)(config.choices, (total, respArea, key) => {
180
177
  const chosenValue = value && value[key];
181
- if ((0, _isEmpty.default)(chosenValue) || !(0, _find.default)(respArea, c => prepareVal(c.label) === prepareVal(chosenValue))) {
178
+ if ((0, _lodashEs.isEmpty)(chosenValue) || !(0, _lodashEs.find)(respArea, c => prepareVal(c.label) === prepareVal(chosenValue))) {
182
179
  return total;
183
180
  }
184
181
  return total + 1;
@@ -205,7 +202,7 @@ function outcome(model, session, env = {}) {
205
202
  const score = getScore(model, session);
206
203
  resolve({
207
204
  score: partialScoringEnabled ? score : score === 1 ? 1 : 0,
208
- empty: (0, _isEmpty.default)(session)
205
+ empty: (0, _lodashEs.isEmpty)(session)
209
206
  });
210
207
  });
211
208
  }
@@ -279,7 +276,7 @@ const validate = (model = {}, config = {}) => {
279
276
  }
280
277
  }
281
278
  });
282
- if (!(0, _isEmpty.default)(choicesErrors)) {
279
+ if (!(0, _lodashEs.isEmpty)(choicesErrors)) {
283
280
  allChoicesErrors[key] = choicesErrors;
284
281
  }
285
282
  });
@@ -289,7 +286,7 @@ const validate = (model = {}, config = {}) => {
289
286
  } else if (nbOfResponseAreas < 1) {
290
287
  errors.responseAreas = 'There should be at least 1 response area defined.';
291
288
  }
292
- if (!(0, _isEmpty.default)(allChoicesErrors)) {
289
+ if (!(0, _lodashEs.isEmpty)(allChoicesErrors)) {
293
290
  errors.choices = allChoicesErrors;
294
291
  }
295
292
  return errors;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_debug","_interopRequireDefault","require","_map","_reduce","_find","_isEmpty","_he","_controllerUtils","_translator","_defaults","translator","Translator","log","debug","prepareChoice","mode","defaultFeedback","choice","out","label","value","correct","feedbackType","feedback","type","exports","getFeedback","getAdjustedLength","length","Math","abs","Infinity","decodeHtmlEntities","str","replace","normalize","question","defaults","model","session","env","choices","Object","keys","forEach","key","map","item","index","normalizedQuestion","assign","incorrect","prepareChoiceFn","reduce","obj","area","respArea","chosenValue","val","isEmpty","find","c","prepareVal","showNote","values","some","note","t","lng","language","maxLengthPerChoice","maxLengthPerChoiceEnabled","undefinedLengths","labelLengthsArr","max","disabled","displayType","role","markup","playerSpellCheckEnabled","prompt","promptEnabled","rationale","responseCorrect","getScore","undefined","teacherInstructions","responseAreaInputConfiguration","extraCSSRules","rationaleEnabled","teacherInstructionsEnabled","html","decodeHTML","getInnerText","trim","config","responseAreas","match","maxScore","correctCount","total","toFixed","parseFloat","outcome","Promise","resolve","partialScoringEnabled","partialScoring","enabled","score","empty","createCorrectResponseSession","i","id","replaceAll","decode","getContent","validate","maxResponseAreas","allChoicesErrors","errors","field","required","entries","reversedChoices","reverse","choicesErrors","identicalAnswer","slice","nbOfResponseAreas"],"sources":["../src/index.js"],"sourcesContent":["import debug from 'debug';\nimport map from 'lodash/map';\nimport reduce from 'lodash/reduce';\nimport find from 'lodash/find';\nimport isEmpty from 'lodash/isEmpty';\nimport { decode } from 'he';\nimport { partialScoring } from '@pie-lib/controller-utils';\nimport Translator from '@pie-lib/translator';\nimport defaults from './defaults';\n\nconst { translator } = Translator;\n\nconst log = debug('explicit-constructed-response:controller');\n\nexport const prepareChoice = (mode, defaultFeedback) => (choice) => {\n const out = {\n label: choice.label,\n value: choice.value,\n };\n\n if (mode === 'evaluate') {\n out.correct = true;\n\n const feedbackType = (choice.feedback && choice.feedback.type) || 'none';\n\n if (feedbackType === 'default') {\n out.feedback = defaultFeedback['correct'];\n } else if (feedbackType === 'custom') {\n out.feedback = choice.feedback.value;\n }\n }\n\n return out;\n};\n\nconst getFeedback = (value) => {\n if (value) {\n return 'correct';\n }\n\n return 'incorrect';\n};\n\n// also used in configure/src/markupUtils.js\nconst getAdjustedLength = (length) => {\n if (Math.abs(length) === Infinity) {\n return 2;\n }\n\n if (length <= 2) {\n return length + 2;\n }\n\n if (length <= 4) {\n return length + 3;\n }\n\n if (length <= 6) {\n return length + 4;\n }\n\n return length + 5;\n};\n\n// we can't use the dom parser here because it is not available in the node environment\nconst decodeHtmlEntities = (str) => {\n if (!str) return '';\n return str\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&#x27;|&#39;/g, '\\'')\n .replace(/&amp;/g, '&');\n};\n\nexport const normalize = (question) => ({ ...defaults, ...question });\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n */\nexport async function model(question, session, env) {\n // this was added to treat an exception, when the model has choices without\n // the \"value\" property like: { label: 'test' }\n if (question.choices) {\n Object.keys(question.choices).forEach((key) => {\n question.choices[key] = (question.choices[key] || []).map((item, index) => {\n if (!item.value) {\n log('Choice does not contain \"value\" property, which is required.', item);\n return { value: `${index}`, ...item };\n }\n\n return item;\n });\n });\n }\n\n const normalizedQuestion = normalize(question);\n const defaultFeedback = Object.assign(\n { correct: 'Correct', incorrect: 'Incorrect' },\n normalizedQuestion.defaultFeedback,\n );\n const prepareChoiceFn = prepareChoice(env.mode, defaultFeedback);\n const choices = reduce(\n normalizedQuestion.choices,\n (obj, area, key) => {\n obj[key] = map(area, prepareChoiceFn);\n\n return obj;\n },\n {},\n );\n\n const { value = {} } = session || {};\n const feedback =\n env.mode === 'evaluate'\n ? reduce(\n normalizedQuestion.choices,\n (obj, respArea, key) => {\n const chosenValue = value && value[key];\n const val =\n !isEmpty(chosenValue) && find(respArea, (c) => prepareVal(c.label) === prepareVal(chosenValue));\n\n obj[key] = getFeedback(val);\n\n return obj;\n },\n {},\n )\n : {};\n\n // check if at least one choice has an alternate\n const showNote = Object.values(choices).some((choice) => choice?.length > 1);\n const note =\n normalizedQuestion.note ||\n translator.t('common:commonCorrectAnswerWithAlternates', { lng: normalizedQuestion.language });\n\n const { maxLengthPerChoice = [], maxLengthPerChoiceEnabled } = normalizedQuestion;\n const undefinedLengths = !maxLengthPerChoice.length;\n\n // calculate maxLengthPerChoice array if it is not defined or defined incorrectly\n Object.values(choices).forEach((choice, index) => {\n const labelLengthsArr = (choice || []).map((choice) => decodeHtmlEntities(choice.label || '').length);\n const length = Math.max(...labelLengthsArr);\n\n if (\n undefinedLengths ||\n !maxLengthPerChoice[index] ||\n maxLengthPerChoice[index] < length ||\n maxLengthPerChoice[index] > length + 10\n ) {\n maxLengthPerChoice[index] = getAdjustedLength(length);\n }\n });\n\n const out = {\n choices,\n disabled: env.mode !== 'gather',\n displayType: normalizedQuestion.displayType,\n mode: env.mode,\n role: env.role,\n feedback,\n language: normalizedQuestion.language,\n markup: normalizedQuestion.markup,\n maxLengthPerChoice,\n maxLengthPerChoiceEnabled,\n note,\n playerSpellCheckEnabled: normalizedQuestion.playerSpellCheckEnabled,\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : defaults.prompt,\n rationale: defaults.rationale,\n responseCorrect: env.mode === 'evaluate' ? getScore(normalizedQuestion, session) === 1 : undefined,\n showNote,\n teacherInstructions: defaults.teacherInstructions,\n responseAreaInputConfiguration: normalizedQuestion.responseAreaInputConfiguration,\n extraCSSRules: normalizedQuestion.extraCSSRules,\n };\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : defaults.rationale;\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : defaults.teacherInstructions;\n }\n\n return out;\n}\n\nexport const prepareVal = (html) => {\n return decodeHTML(getInnerText(html).trim());\n};\n\nexport const getScore = (config, session) => {\n const { value } = session || {};\n\n if (!session || isEmpty(session) || !value) {\n return 0;\n }\n\n const responseAreas = config.markup && config.markup.match(/\\{\\{(.+?)\\}\\}/g);\n const maxScore = responseAreas ? responseAreas.length : 0;\n const correctCount = reduce(\n config.choices,\n (total, respArea, key) => {\n const chosenValue = value && value[key];\n\n if (isEmpty(chosenValue) || !find(respArea, (c) => prepareVal(c.label) === prepareVal(chosenValue))) {\n return total;\n }\n\n return total + 1;\n },\n 0,\n );\n\n const str = maxScore ? (correctCount / maxScore).toFixed(2) : 0;\n\n return parseFloat(str);\n};\n\n/**\n * The score is partial by default for checkbox mode, allOrNothing for radio mode.\n * To disable partial scoring for checkbox mode you either set model.partialScoring = false or env.partialScoring =\n * false. the value in `env` will override the value in `model`.\n * @param {Object} model - the main model\n * @param {boolean} model.partialScoring - is partial scoring enabled (if undefined set to to true)\n * @param {*} session\n * @param {Object} env\n * @param {boolean} env.partialScoring - is partial scoring enabled (if undefined default to true) This overrides\n * `model.partialScoring`.\n */\nexport function outcome(model, session, env = {}) {\n return new Promise((resolve) => {\n const partialScoringEnabled = partialScoring.enabled(model, env);\n const score = getScore(model, session);\n\n resolve({ score: partialScoringEnabled ? score : score === 1 ? 1 : 0, empty: isEmpty(session) });\n });\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { choices } = question;\n const value = {};\n\n Object.keys(choices).forEach((key, i) => {\n value[i] = choices[key][0].label;\n });\n\n resolve({ id: '1', value });\n } else {\n resolve(null);\n }\n });\n};\n\n// remove all html tags\n// const getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');\nconst getInnerText = (html) => {\n if (typeof html !== 'string') {\n return '';\n }\n if (typeof html.replaceAll === 'function') {\n return html.replaceAll(/<[^>]*>/g, '');\n } else {\n // Polyfill for replaceAll using replace and a global regex\n return html.replace(/<[^>]*>/g, '');\n }\n};\n\nconst decodeHTML = (html) => decode(html);\n\n// remove all html tags except img, iframe and source tag for audio\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const { choices, markup } = model;\n const { maxResponseAreas } = config;\n const allChoicesErrors = {};\n const errors = {};\n\n ['teacherInstructions', 'prompt', 'rationale'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n Object.entries(choices || {}).forEach(([key, values]) => {\n const reversedChoices = [...(values || [])].reverse();\n const choicesErrors = {};\n\n reversedChoices.forEach((choice, index) => {\n const { value, label } = choice;\n\n if (label === '' || label === '<div></div>') {\n choicesErrors[value] = 'Content should not be empty.';\n } else {\n const identicalAnswer = reversedChoices.slice(index + 1).some((c) => c.label === label);\n\n if (identicalAnswer) {\n choicesErrors[value] = 'Content should be unique.';\n }\n }\n });\n\n if (!isEmpty(choicesErrors)) {\n allChoicesErrors[key] = choicesErrors;\n }\n });\n\n const nbOfResponseAreas = (markup.match(/\\{\\{(\\d+)\\}\\}/g) || []).length;\n\n if (nbOfResponseAreas > maxResponseAreas) {\n errors.responseAreas = `No more than ${maxResponseAreas} response areas should be defined.`;\n } else if (nbOfResponseAreas < 1) {\n errors.responseAreas = 'There should be at least 1 response area defined.';\n }\n\n if (!isEmpty(allChoicesErrors)) {\n errors.choices = allChoicesErrors;\n }\n\n return errors;\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["_debug","_interopRequireDefault","require","_lodashEs","_he","_controllerUtils","_translator","_defaults","translator","Translator","log","debug","prepareChoice","mode","defaultFeedback","choice","out","label","value","correct","feedbackType","feedback","type","exports","getFeedback","getAdjustedLength","length","Math","abs","Infinity","decodeHtmlEntities","str","replace","normalize","question","defaults","model","session","env","choices","Object","keys","forEach","key","map","item","index","normalizedQuestion","assign","incorrect","prepareChoiceFn","reduce","obj","area","respArea","chosenValue","val","isEmpty","find","c","prepareVal","showNote","values","some","note","t","lng","language","maxLengthPerChoice","maxLengthPerChoiceEnabled","undefinedLengths","labelLengthsArr","max","disabled","displayType","role","markup","playerSpellCheckEnabled","prompt","promptEnabled","rationale","responseCorrect","getScore","undefined","teacherInstructions","responseAreaInputConfiguration","extraCSSRules","rationaleEnabled","teacherInstructionsEnabled","html","decodeHTML","getInnerText","trim","config","responseAreas","match","maxScore","correctCount","total","toFixed","parseFloat","outcome","Promise","resolve","partialScoringEnabled","partialScoring","enabled","score","empty","createCorrectResponseSession","i","id","replaceAll","decode","getContent","validate","maxResponseAreas","allChoicesErrors","errors","field","required","entries","reversedChoices","reverse","choicesErrors","identicalAnswer","slice","nbOfResponseAreas"],"sources":["../src/index.js"],"sourcesContent":["import debug from 'debug';\nimport { find, isEmpty, map, reduce } from 'lodash-es';\nimport { decode } from 'he';\nimport { partialScoring } from '@pie-lib/controller-utils';\nimport Translator from '@pie-lib/translator';\nimport defaults from './defaults';\n\nconst { translator } = Translator;\n\nconst log = debug('explicit-constructed-response:controller');\n\nexport const prepareChoice = (mode, defaultFeedback) => (choice) => {\n const out = {\n label: choice.label,\n value: choice.value,\n };\n\n if (mode === 'evaluate') {\n out.correct = true;\n\n const feedbackType = (choice.feedback && choice.feedback.type) || 'none';\n\n if (feedbackType === 'default') {\n out.feedback = defaultFeedback['correct'];\n } else if (feedbackType === 'custom') {\n out.feedback = choice.feedback.value;\n }\n }\n\n return out;\n};\n\nconst getFeedback = (value) => {\n if (value) {\n return 'correct';\n }\n\n return 'incorrect';\n};\n\n// also used in configure/src/markupUtils.js\nconst getAdjustedLength = (length) => {\n if (Math.abs(length) === Infinity) {\n return 2;\n }\n\n if (length <= 2) {\n return length + 2;\n }\n\n if (length <= 4) {\n return length + 3;\n }\n\n if (length <= 6) {\n return length + 4;\n }\n\n return length + 5;\n};\n\n// we can't use the dom parser here because it is not available in the node environment\nconst decodeHtmlEntities = (str) => {\n if (!str) return '';\n return str\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&#x27;|&#39;/g, \"'\")\n .replace(/&amp;/g, '&');\n};\n\nexport const normalize = (question) => ({ ...defaults, ...question });\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n */\nexport async function model(question, session, env) {\n // this was added to treat an exception, when the model has choices without\n // the \"value\" property like: { label: 'test' }\n if (question.choices) {\n Object.keys(question.choices).forEach((key) => {\n question.choices[key] = (question.choices[key] || []).map((item, index) => {\n if (!item.value) {\n log('Choice does not contain \"value\" property, which is required.', item);\n return { value: `${index}`, ...item };\n }\n\n return item;\n });\n });\n }\n\n const normalizedQuestion = normalize(question);\n const defaultFeedback = Object.assign(\n { correct: 'Correct', incorrect: 'Incorrect' },\n normalizedQuestion.defaultFeedback,\n );\n const prepareChoiceFn = prepareChoice(env.mode, defaultFeedback);\n const choices = reduce(\n normalizedQuestion.choices,\n (obj, area, key) => {\n obj[key] = map(area, prepareChoiceFn);\n\n return obj;\n },\n {},\n );\n\n const { value = {} } = session || {};\n const feedback =\n env.mode === 'evaluate'\n ? reduce(\n normalizedQuestion.choices,\n (obj, respArea, key) => {\n const chosenValue = value && value[key];\n const val = !isEmpty(chosenValue) && find(respArea, (c) => prepareVal(c.label) === prepareVal(chosenValue));\n\n obj[key] = getFeedback(val);\n\n return obj;\n },\n {},\n )\n : {};\n\n // check if at least one choice has an alternate\n const showNote = Object.values(choices).some((choice) => choice?.length > 1);\n const note =\n normalizedQuestion.note ||\n translator.t('common:commonCorrectAnswerWithAlternates', { lng: normalizedQuestion.language });\n\n const { maxLengthPerChoice = [], maxLengthPerChoiceEnabled } = normalizedQuestion;\n const undefinedLengths = !maxLengthPerChoice.length;\n\n // calculate maxLengthPerChoice array if it is not defined or defined incorrectly\n Object.values(choices).forEach((choice, index) => {\n const labelLengthsArr = (choice || []).map((choice) => decodeHtmlEntities(choice.label || '').length);\n const length = Math.max(...labelLengthsArr);\n\n if (\n undefinedLengths ||\n !maxLengthPerChoice[index] ||\n maxLengthPerChoice[index] < length ||\n maxLengthPerChoice[index] > length + 10\n ) {\n maxLengthPerChoice[index] = getAdjustedLength(length);\n }\n });\n\n const out = {\n choices,\n disabled: env.mode !== 'gather',\n displayType: normalizedQuestion.displayType,\n mode: env.mode,\n role: env.role,\n feedback,\n language: normalizedQuestion.language,\n markup: normalizedQuestion.markup,\n maxLengthPerChoice,\n maxLengthPerChoiceEnabled,\n note,\n playerSpellCheckEnabled: normalizedQuestion.playerSpellCheckEnabled,\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : defaults.prompt,\n rationale: defaults.rationale,\n responseCorrect: env.mode === 'evaluate' ? getScore(normalizedQuestion, session) === 1 : undefined,\n showNote,\n teacherInstructions: defaults.teacherInstructions,\n responseAreaInputConfiguration: normalizedQuestion.responseAreaInputConfiguration,\n extraCSSRules: normalizedQuestion.extraCSSRules,\n };\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : defaults.rationale;\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : defaults.teacherInstructions;\n }\n\n return out;\n}\n\nexport const prepareVal = (html) => {\n return decodeHTML(getInnerText(html).trim());\n};\n\nexport const getScore = (config, session) => {\n const { value } = session || {};\n\n if (!session || isEmpty(session) || !value) {\n return 0;\n }\n\n const responseAreas = config.markup && config.markup.match(/\\{\\{(.+?)\\}\\}/g);\n const maxScore = responseAreas ? responseAreas.length : 0;\n const correctCount = reduce(\n config.choices,\n (total, respArea, key) => {\n const chosenValue = value && value[key];\n\n if (isEmpty(chosenValue) || !find(respArea, (c) => prepareVal(c.label) === prepareVal(chosenValue))) {\n return total;\n }\n\n return total + 1;\n },\n 0,\n );\n\n const str = maxScore ? (correctCount / maxScore).toFixed(2) : 0;\n\n return parseFloat(str);\n};\n\n/**\n * The score is partial by default for checkbox mode, allOrNothing for radio mode.\n * To disable partial scoring for checkbox mode you either set model.partialScoring = false or env.partialScoring =\n * false. the value in `env` will override the value in `model`.\n * @param {Object} model - the main model\n * @param {boolean} model.partialScoring - is partial scoring enabled (if undefined set to to true)\n * @param {*} session\n * @param {Object} env\n * @param {boolean} env.partialScoring - is partial scoring enabled (if undefined default to true) This overrides\n * `model.partialScoring`.\n */\nexport function outcome(model, session, env = {}) {\n return new Promise((resolve) => {\n const partialScoringEnabled = partialScoring.enabled(model, env);\n const score = getScore(model, session);\n\n resolve({ score: partialScoringEnabled ? score : score === 1 ? 1 : 0, empty: isEmpty(session) });\n });\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { choices } = question;\n const value = {};\n\n Object.keys(choices).forEach((key, i) => {\n value[i] = choices[key][0].label;\n });\n\n resolve({ id: '1', value });\n } else {\n resolve(null);\n }\n });\n};\n\n// remove all html tags\n// const getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');\nconst getInnerText = (html) => {\n if (typeof html !== 'string') {\n return '';\n }\n if (typeof html.replaceAll === 'function') {\n return html.replaceAll(/<[^>]*>/g, '');\n } else {\n // Polyfill for replaceAll using replace and a global regex\n return html.replace(/<[^>]*>/g, '');\n }\n};\n\nconst decodeHTML = (html) => decode(html);\n\n// remove all html tags except img, iframe and source tag for audio\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const { choices, markup } = model;\n const { maxResponseAreas } = config;\n const allChoicesErrors = {};\n const errors = {};\n\n ['teacherInstructions', 'prompt', 'rationale'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n Object.entries(choices || {}).forEach(([key, values]) => {\n const reversedChoices = [...(values || [])].reverse();\n const choicesErrors = {};\n\n reversedChoices.forEach((choice, index) => {\n const { value, label } = choice;\n\n if (label === '' || label === '<div></div>') {\n choicesErrors[value] = 'Content should not be empty.';\n } else {\n const identicalAnswer = reversedChoices.slice(index + 1).some((c) => c.label === label);\n\n if (identicalAnswer) {\n choicesErrors[value] = 'Content should be unique.';\n }\n }\n });\n\n if (!isEmpty(choicesErrors)) {\n allChoicesErrors[key] = choicesErrors;\n }\n });\n\n const nbOfResponseAreas = (markup.match(/\\{\\{(\\d+)\\}\\}/g) || []).length;\n\n if (nbOfResponseAreas > maxResponseAreas) {\n errors.responseAreas = `No more than ${maxResponseAreas} response areas should be defined.`;\n } else if (nbOfResponseAreas < 1) {\n errors.responseAreas = 'There should be at least 1 response area defined.';\n }\n\n if (!isEmpty(allChoicesErrors)) {\n errors.choices = allChoicesErrors;\n }\n\n return errors;\n};\n"],"mappings":";;;;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,SAAA,GAAAD,OAAA;AACA,IAAAE,GAAA,GAAAF,OAAA;AACA,IAAAG,gBAAA,GAAAH,OAAA;AACA,IAAAI,WAAA,GAAAL,sBAAA,CAAAC,OAAA;AACA,IAAAK,SAAA,GAAAN,sBAAA,CAAAC,OAAA;AAEA,MAAM;EAAEM;AAAW,CAAC,GAAGC,mBAAU;AAEjC,MAAMC,GAAG,GAAG,IAAAC,cAAK,EAAC,0CAA0C,CAAC;AAEtD,MAAMC,aAAa,GAAGA,CAACC,IAAI,EAAEC,eAAe,KAAMC,MAAM,IAAK;EAClE,MAAMC,GAAG,GAAG;IACVC,KAAK,EAAEF,MAAM,CAACE,KAAK;IACnBC,KAAK,EAAEH,MAAM,CAACG;EAChB,CAAC;EAED,IAAIL,IAAI,KAAK,UAAU,EAAE;IACvBG,GAAG,CAACG,OAAO,GAAG,IAAI;IAElB,MAAMC,YAAY,GAAIL,MAAM,CAACM,QAAQ,IAAIN,MAAM,CAACM,QAAQ,CAACC,IAAI,IAAK,MAAM;IAExE,IAAIF,YAAY,KAAK,SAAS,EAAE;MAC9BJ,GAAG,CAACK,QAAQ,GAAGP,eAAe,CAAC,SAAS,CAAC;IAC3C,CAAC,MAAM,IAAIM,YAAY,KAAK,QAAQ,EAAE;MACpCJ,GAAG,CAACK,QAAQ,GAAGN,MAAM,CAACM,QAAQ,CAACH,KAAK;IACtC;EACF;EAEA,OAAOF,GAAG;AACZ,CAAC;AAACO,OAAA,CAAAX,aAAA,GAAAA,aAAA;AAEF,MAAMY,WAAW,GAAIN,KAAK,IAAK;EAC7B,IAAIA,KAAK,EAAE;IACT,OAAO,SAAS;EAClB;EAEA,OAAO,WAAW;AACpB,CAAC;;AAED;AACA,MAAMO,iBAAiB,GAAIC,MAAM,IAAK;EACpC,IAAIC,IAAI,CAACC,GAAG,CAACF,MAAM,CAAC,KAAKG,QAAQ,EAAE;IACjC,OAAO,CAAC;EACV;EAEA,IAAIH,MAAM,IAAI,CAAC,EAAE;IACf,OAAOA,MAAM,GAAG,CAAC;EACnB;EAEA,IAAIA,MAAM,IAAI,CAAC,EAAE;IACf,OAAOA,MAAM,GAAG,CAAC;EACnB;EAEA,IAAIA,MAAM,IAAI,CAAC,EAAE;IACf,OAAOA,MAAM,GAAG,CAAC;EACnB;EAEA,OAAOA,MAAM,GAAG,CAAC;AACnB,CAAC;;AAED;AACA,MAAMI,kBAAkB,GAAIC,GAAG,IAAK;EAClC,IAAI,CAACA,GAAG,EAAE,OAAO,EAAE;EACnB,OAAOA,GAAG,CACPC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CACrBA,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CACrBA,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CACvBA,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,CAC7BA,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;AAC3B,CAAC;AAEM,MAAMC,SAAS,GAAIC,QAAQ,KAAM;EAAE,GAAGC,iBAAQ;EAAE,GAAGD;AAAS,CAAC,CAAC;;AAErE;AACA;AACA;AACA;AACA;AACA;AALAX,OAAA,CAAAU,SAAA,GAAAA,SAAA;AAMO,eAAeG,KAAKA,CAACF,QAAQ,EAAEG,OAAO,EAAEC,GAAG,EAAE;EAClD;EACA;EACA,IAAIJ,QAAQ,CAACK,OAAO,EAAE;IACpBC,MAAM,CAACC,IAAI,CAACP,QAAQ,CAACK,OAAO,CAAC,CAACG,OAAO,CAAEC,GAAG,IAAK;MAC7CT,QAAQ,CAACK,OAAO,CAACI,GAAG,CAAC,GAAG,CAACT,QAAQ,CAACK,OAAO,CAACI,GAAG,CAAC,IAAI,EAAE,EAAEC,GAAG,CAAC,CAACC,IAAI,EAAEC,KAAK,KAAK;QACzE,IAAI,CAACD,IAAI,CAAC3B,KAAK,EAAE;UACfR,GAAG,CAAC,8DAA8D,EAAEmC,IAAI,CAAC;UACzE,OAAO;YAAE3B,KAAK,EAAE,GAAG4B,KAAK,EAAE;YAAE,GAAGD;UAAK,CAAC;QACvC;QAEA,OAAOA,IAAI;MACb,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ;EAEA,MAAME,kBAAkB,GAAGd,SAAS,CAACC,QAAQ,CAAC;EAC9C,MAAMpB,eAAe,GAAG0B,MAAM,CAACQ,MAAM,CACnC;IAAE7B,OAAO,EAAE,SAAS;IAAE8B,SAAS,EAAE;EAAY,CAAC,EAC9CF,kBAAkB,CAACjC,eACrB,CAAC;EACD,MAAMoC,eAAe,GAAGtC,aAAa,CAAC0B,GAAG,CAACzB,IAAI,EAAEC,eAAe,CAAC;EAChE,MAAMyB,OAAO,GAAG,IAAAY,gBAAM,EACpBJ,kBAAkB,CAACR,OAAO,EAC1B,CAACa,GAAG,EAAEC,IAAI,EAAEV,GAAG,KAAK;IAClBS,GAAG,CAACT,GAAG,CAAC,GAAG,IAAAC,aAAG,EAACS,IAAI,EAAEH,eAAe,CAAC;IAErC,OAAOE,GAAG;EACZ,CAAC,EACD,CAAC,CACH,CAAC;EAED,MAAM;IAAElC,KAAK,GAAG,CAAC;EAAE,CAAC,GAAGmB,OAAO,IAAI,CAAC,CAAC;EACpC,MAAMhB,QAAQ,GACZiB,GAAG,CAACzB,IAAI,KAAK,UAAU,GACnB,IAAAsC,gBAAM,EACJJ,kBAAkB,CAACR,OAAO,EAC1B,CAACa,GAAG,EAAEE,QAAQ,EAAEX,GAAG,KAAK;IACtB,MAAMY,WAAW,GAAGrC,KAAK,IAAIA,KAAK,CAACyB,GAAG,CAAC;IACvC,MAAMa,GAAG,GAAG,CAAC,IAAAC,iBAAO,EAACF,WAAW,CAAC,IAAI,IAAAG,cAAI,EAACJ,QAAQ,EAAGK,CAAC,IAAKC,UAAU,CAACD,CAAC,CAAC1C,KAAK,CAAC,KAAK2C,UAAU,CAACL,WAAW,CAAC,CAAC;IAE3GH,GAAG,CAACT,GAAG,CAAC,GAAGnB,WAAW,CAACgC,GAAG,CAAC;IAE3B,OAAOJ,GAAG;EACZ,CAAC,EACD,CAAC,CACH,CAAC,GACD,CAAC,CAAC;;EAER;EACA,MAAMS,QAAQ,GAAGrB,MAAM,CAACsB,MAAM,CAACvB,OAAO,CAAC,CAACwB,IAAI,CAAEhD,MAAM,IAAKA,MAAM,EAAEW,MAAM,GAAG,CAAC,CAAC;EAC5E,MAAMsC,IAAI,GACRjB,kBAAkB,CAACiB,IAAI,IACvBxD,UAAU,CAACyD,CAAC,CAAC,0CAA0C,EAAE;IAAEC,GAAG,EAAEnB,kBAAkB,CAACoB;EAAS,CAAC,CAAC;EAEhG,MAAM;IAAEC,kBAAkB,GAAG,EAAE;IAAEC;EAA0B,CAAC,GAAGtB,kBAAkB;EACjF,MAAMuB,gBAAgB,GAAG,CAACF,kBAAkB,CAAC1C,MAAM;;EAEnD;EACAc,MAAM,CAACsB,MAAM,CAACvB,OAAO,CAAC,CAACG,OAAO,CAAC,CAAC3B,MAAM,EAAE+B,KAAK,KAAK;IAChD,MAAMyB,eAAe,GAAG,CAACxD,MAAM,IAAI,EAAE,EAAE6B,GAAG,CAAE7B,MAAM,IAAKe,kBAAkB,CAACf,MAAM,CAACE,KAAK,IAAI,EAAE,CAAC,CAACS,MAAM,CAAC;IACrG,MAAMA,MAAM,GAAGC,IAAI,CAAC6C,GAAG,CAAC,GAAGD,eAAe,CAAC;IAE3C,IACED,gBAAgB,IAChB,CAACF,kBAAkB,CAACtB,KAAK,CAAC,IAC1BsB,kBAAkB,CAACtB,KAAK,CAAC,GAAGpB,MAAM,IAClC0C,kBAAkB,CAACtB,KAAK,CAAC,GAAGpB,MAAM,GAAG,EAAE,EACvC;MACA0C,kBAAkB,CAACtB,KAAK,CAAC,GAAGrB,iBAAiB,CAACC,MAAM,CAAC;IACvD;EACF,CAAC,CAAC;EAEF,MAAMV,GAAG,GAAG;IACVuB,OAAO;IACPkC,QAAQ,EAAEnC,GAAG,CAACzB,IAAI,KAAK,QAAQ;IAC/B6D,WAAW,EAAE3B,kBAAkB,CAAC2B,WAAW;IAC3C7D,IAAI,EAAEyB,GAAG,CAACzB,IAAI;IACd8D,IAAI,EAAErC,GAAG,CAACqC,IAAI;IACdtD,QAAQ;IACR8C,QAAQ,EAAEpB,kBAAkB,CAACoB,QAAQ;IACrCS,MAAM,EAAE7B,kBAAkB,CAAC6B,MAAM;IACjCR,kBAAkB;IAClBC,yBAAyB;IACzBL,IAAI;IACJa,uBAAuB,EAAE9B,kBAAkB,CAAC8B,uBAAuB;IACnEC,MAAM,EAAE/B,kBAAkB,CAACgC,aAAa,GAAGhC,kBAAkB,CAAC+B,MAAM,GAAG3C,iBAAQ,CAAC2C,MAAM;IACtFE,SAAS,EAAE7C,iBAAQ,CAAC6C,SAAS;IAC7BC,eAAe,EAAE3C,GAAG,CAACzB,IAAI,KAAK,UAAU,GAAGqE,QAAQ,CAACnC,kBAAkB,EAAEV,OAAO,CAAC,KAAK,CAAC,GAAG8C,SAAS;IAClGtB,QAAQ;IACRuB,mBAAmB,EAAEjD,iBAAQ,CAACiD,mBAAmB;IACjDC,8BAA8B,EAAEtC,kBAAkB,CAACsC,8BAA8B;IACjFC,aAAa,EAAEvC,kBAAkB,CAACuC;EACpC,CAAC;EAED,IAAIhD,GAAG,CAACqC,IAAI,KAAK,YAAY,KAAKrC,GAAG,CAACzB,IAAI,KAAK,MAAM,IAAIyB,GAAG,CAACzB,IAAI,KAAK,UAAU,CAAC,EAAE;IACjFG,GAAG,CAACgE,SAAS,GAAGjC,kBAAkB,CAACwC,gBAAgB,GAAGxC,kBAAkB,CAACiC,SAAS,GAAG7C,iBAAQ,CAAC6C,SAAS;IACvGhE,GAAG,CAACoE,mBAAmB,GAAGrC,kBAAkB,CAACyC,0BAA0B,GACnEzC,kBAAkB,CAACqC,mBAAmB,GACtCjD,iBAAQ,CAACiD,mBAAmB;EAClC;EAEA,OAAOpE,GAAG;AACZ;AAEO,MAAM4C,UAAU,GAAI6B,IAAI,IAAK;EAClC,OAAOC,UAAU,CAACC,YAAY,CAACF,IAAI,CAAC,CAACG,IAAI,CAAC,CAAC,CAAC;AAC9C,CAAC;AAACrE,OAAA,CAAAqC,UAAA,GAAAA,UAAA;AAEK,MAAMsB,QAAQ,GAAGA,CAACW,MAAM,EAAExD,OAAO,KAAK;EAC3C,MAAM;IAAEnB;EAAM,CAAC,GAAGmB,OAAO,IAAI,CAAC,CAAC;EAE/B,IAAI,CAACA,OAAO,IAAI,IAAAoB,iBAAO,EAACpB,OAAO,CAAC,IAAI,CAACnB,KAAK,EAAE;IAC1C,OAAO,CAAC;EACV;EAEA,MAAM4E,aAAa,GAAGD,MAAM,CAACjB,MAAM,IAAIiB,MAAM,CAACjB,MAAM,CAACmB,KAAK,CAAC,gBAAgB,CAAC;EAC5E,MAAMC,QAAQ,GAAGF,aAAa,GAAGA,aAAa,CAACpE,MAAM,GAAG,CAAC;EACzD,MAAMuE,YAAY,GAAG,IAAA9C,gBAAM,EACzB0C,MAAM,CAACtD,OAAO,EACd,CAAC2D,KAAK,EAAE5C,QAAQ,EAAEX,GAAG,KAAK;IACxB,MAAMY,WAAW,GAAGrC,KAAK,IAAIA,KAAK,CAACyB,GAAG,CAAC;IAEvC,IAAI,IAAAc,iBAAO,EAACF,WAAW,CAAC,IAAI,CAAC,IAAAG,cAAI,EAACJ,QAAQ,EAAGK,CAAC,IAAKC,UAAU,CAACD,CAAC,CAAC1C,KAAK,CAAC,KAAK2C,UAAU,CAACL,WAAW,CAAC,CAAC,EAAE;MACnG,OAAO2C,KAAK;IACd;IAEA,OAAOA,KAAK,GAAG,CAAC;EAClB,CAAC,EACD,CACF,CAAC;EAED,MAAMnE,GAAG,GAAGiE,QAAQ,GAAG,CAACC,YAAY,GAAGD,QAAQ,EAAEG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;EAE/D,OAAOC,UAAU,CAACrE,GAAG,CAAC;AACxB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAVAR,OAAA,CAAA2D,QAAA,GAAAA,QAAA;AAWO,SAASmB,OAAOA,CAACjE,KAAK,EAAEC,OAAO,EAAEC,GAAG,GAAG,CAAC,CAAC,EAAE;EAChD,OAAO,IAAIgE,OAAO,CAAEC,OAAO,IAAK;IAC9B,MAAMC,qBAAqB,GAAGC,+BAAc,CAACC,OAAO,CAACtE,KAAK,EAAEE,GAAG,CAAC;IAChE,MAAMqE,KAAK,GAAGzB,QAAQ,CAAC9C,KAAK,EAAEC,OAAO,CAAC;IAEtCkE,OAAO,CAAC;MAAEI,KAAK,EAAEH,qBAAqB,GAAGG,KAAK,GAAGA,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;MAAEC,KAAK,EAAE,IAAAnD,iBAAO,EAACpB,OAAO;IAAE,CAAC,CAAC;EAClG,CAAC,CAAC;AACJ;AAEO,MAAMwE,4BAA4B,GAAGA,CAAC3E,QAAQ,EAAEI,GAAG,KAAK;EAC7D,OAAO,IAAIgE,OAAO,CAAEC,OAAO,IAAK;IAC9B,IAAIjE,GAAG,CAACzB,IAAI,KAAK,UAAU,IAAIyB,GAAG,CAACqC,IAAI,KAAK,YAAY,EAAE;MACxD,MAAM;QAAEpC;MAAQ,CAAC,GAAGL,QAAQ;MAC5B,MAAMhB,KAAK,GAAG,CAAC,CAAC;MAEhBsB,MAAM,CAACC,IAAI,CAACF,OAAO,CAAC,CAACG,OAAO,CAAC,CAACC,GAAG,EAAEmE,CAAC,KAAK;QACvC5F,KAAK,CAAC4F,CAAC,CAAC,GAAGvE,OAAO,CAACI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC1B,KAAK;MAClC,CAAC,CAAC;MAEFsF,OAAO,CAAC;QAAEQ,EAAE,EAAE,GAAG;QAAE7F;MAAM,CAAC,CAAC;IAC7B,CAAC,MAAM;MACLqF,OAAO,CAAC,IAAI,CAAC;IACf;EACF,CAAC,CAAC;AACJ,CAAC;;AAED;AACA;AAAAhF,OAAA,CAAAsF,4BAAA,GAAAA,4BAAA;AACA,MAAMlB,YAAY,GAAIF,IAAI,IAAK;EAC7B,IAAI,OAAOA,IAAI,KAAK,QAAQ,EAAE;IAC5B,OAAO,EAAE;EACX;EACA,IAAI,OAAOA,IAAI,CAACuB,UAAU,KAAK,UAAU,EAAE;IACzC,OAAOvB,IAAI,CAACuB,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC;EACxC,CAAC,MAAM;IACL;IACA,OAAOvB,IAAI,CAACzD,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;EACrC;AACF,CAAC;AAED,MAAM0D,UAAU,GAAID,IAAI,IAAK,IAAAwB,UAAM,EAACxB,IAAI,CAAC;;AAEzC;AACA,MAAMyB,UAAU,GAAIzB,IAAI,IAAK,CAACA,IAAI,IAAI,EAAE,EAAEzD,OAAO,CAAC,oCAAoC,EAAE,EAAE,CAAC;AAEpF,MAAMmF,QAAQ,GAAGA,CAAC/E,KAAK,GAAG,CAAC,CAAC,EAAEyD,MAAM,GAAG,CAAC,CAAC,KAAK;EACnD,MAAM;IAAEtD,OAAO;IAAEqC;EAAO,CAAC,GAAGxC,KAAK;EACjC,MAAM;IAAEgF;EAAiB,CAAC,GAAGvB,MAAM;EACnC,MAAMwB,gBAAgB,GAAG,CAAC,CAAC;EAC3B,MAAMC,MAAM,GAAG,CAAC,CAAC;EAEjB,CAAC,qBAAqB,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC5E,OAAO,CAAE6E,KAAK,IAAK;IAChE,IAAI1B,MAAM,CAAC0B,KAAK,CAAC,EAAEC,QAAQ,IAAI,CAACN,UAAU,CAAC9E,KAAK,CAACmF,KAAK,CAAC,CAAC,EAAE;MACxDD,MAAM,CAACC,KAAK,CAAC,GAAG,yBAAyB;IAC3C;EACF,CAAC,CAAC;EAEF/E,MAAM,CAACiF,OAAO,CAAClF,OAAO,IAAI,CAAC,CAAC,CAAC,CAACG,OAAO,CAAC,CAAC,CAACC,GAAG,EAAEmB,MAAM,CAAC,KAAK;IACvD,MAAM4D,eAAe,GAAG,CAAC,IAAI5D,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC6D,OAAO,CAAC,CAAC;IACrD,MAAMC,aAAa,GAAG,CAAC,CAAC;IAExBF,eAAe,CAAChF,OAAO,CAAC,CAAC3B,MAAM,EAAE+B,KAAK,KAAK;MACzC,MAAM;QAAE5B,KAAK;QAAED;MAAM,CAAC,GAAGF,MAAM;MAE/B,IAAIE,KAAK,KAAK,EAAE,IAAIA,KAAK,KAAK,aAAa,EAAE;QAC3C2G,aAAa,CAAC1G,KAAK,CAAC,GAAG,8BAA8B;MACvD,CAAC,MAAM;QACL,MAAM2G,eAAe,GAAGH,eAAe,CAACI,KAAK,CAAChF,KAAK,GAAG,CAAC,CAAC,CAACiB,IAAI,CAAEJ,CAAC,IAAKA,CAAC,CAAC1C,KAAK,KAAKA,KAAK,CAAC;QAEvF,IAAI4G,eAAe,EAAE;UACnBD,aAAa,CAAC1G,KAAK,CAAC,GAAG,2BAA2B;QACpD;MACF;IACF,CAAC,CAAC;IAEF,IAAI,CAAC,IAAAuC,iBAAO,EAACmE,aAAa,CAAC,EAAE;MAC3BP,gBAAgB,CAAC1E,GAAG,CAAC,GAAGiF,aAAa;IACvC;EACF,CAAC,CAAC;EAEF,MAAMG,iBAAiB,GAAG,CAACnD,MAAM,CAACmB,KAAK,CAAC,gBAAgB,CAAC,IAAI,EAAE,EAAErE,MAAM;EAEvE,IAAIqG,iBAAiB,GAAGX,gBAAgB,EAAE;IACxCE,MAAM,CAACxB,aAAa,GAAG,gBAAgBsB,gBAAgB,oCAAoC;EAC7F,CAAC,MAAM,IAAIW,iBAAiB,GAAG,CAAC,EAAE;IAChCT,MAAM,CAACxB,aAAa,GAAG,mDAAmD;EAC5E;EAEA,IAAI,CAAC,IAAArC,iBAAO,EAAC4D,gBAAgB,CAAC,EAAE;IAC9BC,MAAM,CAAC/E,OAAO,GAAG8E,gBAAgB;EACnC;EAEA,OAAOC,MAAM;AACf,CAAC;AAAC/F,OAAA,CAAA4F,QAAA,GAAAA,QAAA","ignoreList":[]}
@@ -1,18 +1,18 @@
1
1
  {
2
2
  "name": "@pie-element/explicit-constructed-response-controller",
3
3
  "private": true,
4
- "version": "7.0.0-beta.1",
4
+ "version": "7.1.1-next.1",
5
5
  "description": "",
6
6
  "main": "lib/index.js",
7
7
  "module": "src/index.js",
8
8
  "author": "",
9
9
  "license": "ISC",
10
10
  "dependencies": {
11
- "@pie-lib/controller-utils": "1.1.1-next.0",
12
- "@pie-lib/translator": "3.1.1-next.0",
11
+ "@pie-lib/controller-utils": "1.2.0-next.3",
12
+ "@pie-lib/translator": "3.2.0-next.3",
13
13
  "debug": "^4.1.1",
14
14
  "he": "^1.2.0",
15
- "lodash": "^4.17.15",
15
+ "lodash-es": "^4.17.23",
16
16
  "type-of": "^2.0.1"
17
17
  }
18
18
  }
package/lib/main.js CHANGED
@@ -9,9 +9,7 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
9
9
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
10
  var _react = _interopRequireDefault(require("react"));
11
11
  var _propTypes = _interopRequireDefault(require("prop-types"));
12
- var _debounce = _interopRequireDefault(require("lodash/debounce"));
13
- var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
14
- var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
12
+ var _lodashEs = require("lodash-es");
15
13
  var _correctAnswerToggle = _interopRequireDefault(require("@pie-lib/correct-answer-toggle"));
16
14
  var _maskMarkup = require("@pie-lib/mask-markup");
17
15
  var _renderUi = require("@pie-lib/render-ui");
@@ -56,7 +54,7 @@ class Main extends _react.default.Component {
56
54
  showCorrectAnswer: this.props.alwaysShowCorrect || false
57
55
  });
58
56
  // if for all responses max length is 1, call onChange for each keystroke
59
- (0, _defineProperty2.default)(this, "getChangeSession", maxLengthPerChoice => maxLengthPerChoice && maxLengthPerChoice.every((val, _i, arr) => val === arr[0] && val === 1) ? this.props.onChange : (0, _debounce.default)(this.props.onChange, 200, {
57
+ (0, _defineProperty2.default)(this, "getChangeSession", maxLengthPerChoice => maxLengthPerChoice && maxLengthPerChoice.every((val, _i, arr) => val === arr[0] && val === 1) ? this.props.onChange : (0, _lodashEs.debounce)(this.props.onChange, 200, {
60
58
  maxWait: 200
61
59
  }));
62
60
  (0, _defineProperty2.default)(this, "toggleShowCorrect", () => {
@@ -77,7 +75,7 @@ class Main extends _react.default.Component {
77
75
  let {
78
76
  note
79
77
  } = this.props;
80
- if ((0, _isEmpty.default)(nextProps.feedback)) {
78
+ if ((0, _lodashEs.isEmpty)(nextProps.feedback)) {
81
79
  this.setState({
82
80
  showCorrectAnswer: false
83
81
  });
@@ -87,7 +85,7 @@ class Main extends _react.default.Component {
87
85
  showCorrectAnswer: true
88
86
  });
89
87
  }
90
- if (maxLengthPerChoice && !(0, _isEqual.default)(maxLengthPerChoice, nextProps.maxLengthPerChoice)) {
88
+ if (maxLengthPerChoice && !(0, _lodashEs.isEqual)(maxLengthPerChoice, nextProps.maxLengthPerChoice)) {
91
89
  this.changeSession = this.getChangeSession(nextProps.maxLengthPerChoice);
92
90
  }
93
91
 
package/lib/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","names":["_react","_interopRequireDefault","require","_propTypes","_debounce","_isEmpty","_isEqual","_correctAnswerToggle","_maskMarkup","_renderUi","_styles","_translator","translator","Translator","MainContainer","styled","UiLayout","alwaysShowCorrect","color","text","backgroundColor","background","borderColor","NoteContainer","theme","marginBottom","spacing","CollapsibleContainer","SrOnly","position","left","top","width","height","overflow","Main","React","Component","constructor","args","_defineProperty2","default","showCorrectAnswer","props","maxLengthPerChoice","every","val","_i","arr","onChange","debounce","maxWait","setState","state","getChangeSession","value","changeSession","UNSAFE_componentWillReceiveProps","nextProps","language","note","isEmpty","feedback","isEqual","t","lng","render","animationsDisabled","mode","displayType","role","maxLengthPerChoiceEnabled","playerSpellCheckEnabled","prompt","rationale","showNote","teacherInstructions","responseAreaInputConfiguration","model","extraCSSRules","displayNote","teacherInstructionsDiv","createElement","PreviewPrompt","defaultClassName","rationaleDiv","showRationale","hasText","hasMedia","showTeacherInstructions","style","display","Collapsible","labels","hidden","visible","show","toggled","onToggle","toggleShowCorrect","ConstructedResponse","_extends2","maxLength","adjustedLimit","spellCheck","pluginProps","dangerouslySetInnerHTML","__html","exports","PropTypes","bool","disabled","string","object","markup","array","func","isRequired","_default"],"sources":["../src/main.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport debounce from 'lodash/debounce';\nimport isEmpty from 'lodash/isEmpty';\nimport isEqual from 'lodash/isEqual';\nimport CorrectAnswerToggle from '@pie-lib/correct-answer-toggle';\nimport { ConstructedResponse } from '@pie-lib/mask-markup';\nimport { color, Collapsible, hasText, hasMedia, PreviewPrompt, UiLayout } from '@pie-lib/render-ui';\nimport { styled } from '@mui/material/styles';\nimport Translator from '@pie-lib/translator';\n\nconst { translator } = Translator;\n\nconst MainContainer = styled(UiLayout)(({ alwaysShowCorrect }) => ({\n color: color.text(),\n backgroundColor: color.background(),\n ...(alwaysShowCorrect && {\n '& *': {\n borderColor: `${color.text()} !important`,\n },\n }),\n}));\n\nconst NoteContainer = styled('div')(({ theme }) => ({\n marginBottom: theme.spacing(2),\n}));\n\nconst CollapsibleContainer = styled('div')(({ theme }) => ({\n marginBottom: theme.spacing(2),\n}));\n\nconst SrOnly = styled('h2')({\n position: 'absolute',\n left: '-10000px',\n top: 'auto',\n width: '1px',\n height: '1px',\n overflow: 'hidden',\n});\n\nexport class Main extends React.Component {\n static propTypes = {\n alwaysShowCorrect: PropTypes.bool,\n animationsDisabled: PropTypes.bool,\n disabled: PropTypes.bool,\n displayType: PropTypes.string,\n feedback: PropTypes.object,\n language: PropTypes.string,\n markup: PropTypes.string,\n maxLengthPerChoice: PropTypes.array,\n maxLengthPerChoiceEnabled: PropTypes.bool,\n mode: PropTypes.string,\n note: PropTypes.string,\n onChange: PropTypes.func,\n playerSpellCheckEnabled: PropTypes.bool,\n prompt: PropTypes.string,\n rationale: PropTypes.string,\n role: PropTypes.string,\n showNote: PropTypes.bool,\n teacherInstructions: PropTypes.string,\n value: PropTypes.object,\n responseAreaInputConfiguration: PropTypes.object,\n model: PropTypes.object.isRequired,\n };\n\n static defaultProps = {\n value: {},\n };\n\n state = {\n showCorrectAnswer: this.props.alwaysShowCorrect || false,\n };\n\n // if for all responses max length is 1, call onChange for each keystroke\n getChangeSession = (maxLengthPerChoice) =>\n maxLengthPerChoice && maxLengthPerChoice.every((val, _i, arr) => val === arr[0] && val === 1)\n ? this.props.onChange\n : debounce(this.props.onChange, 200, { maxWait: 200 });\n\n UNSAFE_componentWillReceiveProps(nextProps) {\n const { maxLengthPerChoice, language } = this.props;\n let { note } = this.props;\n\n if (isEmpty(nextProps.feedback)) {\n this.setState({ showCorrectAnswer: false });\n }\n\n if (nextProps.alwaysShowCorrect) {\n this.setState({ showCorrectAnswer: true });\n }\n\n if (maxLengthPerChoice && !isEqual(maxLengthPerChoice, nextProps.maxLengthPerChoice)) {\n this.changeSession = this.getChangeSession(nextProps.maxLengthPerChoice);\n }\n\n // check if the note is the default one for prev language and change to the default one for new language\n // this check is necessary in order to diferanciate between default and authour defined note\n // and only change between languages for default ones\n if (\n note &&\n language &&\n language !== nextProps.language &&\n note === translator.t('common:commonCorrectAnswerWithAlternates', { lng: language })\n ) {\n note = translator.t('common:commonCorrectAnswerWithAlternates', { lng: nextProps.language });\n }\n }\n\n toggleShowCorrect = () => {\n this.setState({ showCorrectAnswer: !this.state.showCorrectAnswer });\n };\n\n changeSession = this.getChangeSession(this.props.maxLengthPerChoice);\n\n onChange = (value) => {\n this.changeSession(value);\n };\n\n render() {\n const { showCorrectAnswer } = this.state;\n const {\n alwaysShowCorrect,\n animationsDisabled,\n mode,\n displayType,\n role,\n language,\n maxLengthPerChoice,\n maxLengthPerChoiceEnabled,\n note,\n playerSpellCheckEnabled,\n prompt,\n rationale,\n showNote,\n teacherInstructions,\n responseAreaInputConfiguration,\n model,\n value,\n } = this.props;\n\n const { extraCSSRules } = model || {};\n const displayNote = (showCorrectAnswer || (mode === 'view' && role === 'instructor')) && showNote && note;\n\n const teacherInstructionsDiv = (\n <PreviewPrompt defaultClassName=\"teacher-instructions\" prompt={teacherInstructions} />\n );\n\n const rationaleDiv = <PreviewPrompt prompt={rationale} />;\n\n const showRationale = rationale && (hasText(rationale) || hasMedia(rationale));\n const showTeacherInstructions =\n teacherInstructions && (hasText(teacherInstructions) || hasMedia(teacherInstructions));\n\n return (\n <MainContainer\n extraCSSRules={extraCSSRules}\n alwaysShowCorrect={alwaysShowCorrect}\n style={{ display: `${displayType}` }}\n >\n {mode === 'gather' && <SrOnly>Fill in the Blank Question</SrOnly>}\n\n {showTeacherInstructions && (\n <CollapsibleContainer>\n {!animationsDisabled ? (\n <Collapsible labels={{ hidden: 'Show Teacher Instructions', visible: 'Hide Teacher Instructions' }}>\n {teacherInstructionsDiv}\n </Collapsible>\n ) : (\n teacherInstructionsDiv\n )}\n </CollapsibleContainer>\n )}\n\n {prompt && <PreviewPrompt prompt={prompt} />}\n\n {!alwaysShowCorrect && (\n <CorrectAnswerToggle\n show={mode === 'evaluate'}\n toggled={showCorrectAnswer}\n onToggle={this.toggleShowCorrect}\n language={language}\n />\n )}\n\n <ConstructedResponse\n {...this.props}\n onChange={this.onChange}\n showCorrectAnswer={showCorrectAnswer}\n value={value}\n maxLength={maxLengthPerChoice}\n adjustedLimit={maxLengthPerChoiceEnabled}\n spellCheck={playerSpellCheckEnabled}\n pluginProps={responseAreaInputConfiguration}\n />\n\n {displayNote && <NoteContainer dangerouslySetInnerHTML={{ __html: note }} />}\n\n {showRationale && (\n <CollapsibleContainer>\n {!animationsDisabled ? (\n <Collapsible labels={{ hidden: 'Show Rationale', visible: 'Hide Rationale' }}>{rationaleDiv}</Collapsible>\n ) : (\n rationaleDiv\n )}\n </CollapsibleContainer>\n )}\n </MainContainer>\n );\n }\n}\n\nexport default Main;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"main.js","names":["_react","_interopRequireDefault","require","_propTypes","_lodashEs","_correctAnswerToggle","_maskMarkup","_renderUi","_styles","_translator","translator","Translator","MainContainer","styled","UiLayout","alwaysShowCorrect","color","text","backgroundColor","background","borderColor","NoteContainer","theme","marginBottom","spacing","CollapsibleContainer","SrOnly","position","left","top","width","height","overflow","Main","React","Component","constructor","args","_defineProperty2","default","showCorrectAnswer","props","maxLengthPerChoice","every","val","_i","arr","onChange","debounce","maxWait","setState","state","getChangeSession","value","changeSession","UNSAFE_componentWillReceiveProps","nextProps","language","note","isEmpty","feedback","isEqual","t","lng","render","animationsDisabled","mode","displayType","role","maxLengthPerChoiceEnabled","playerSpellCheckEnabled","prompt","rationale","showNote","teacherInstructions","responseAreaInputConfiguration","model","extraCSSRules","displayNote","teacherInstructionsDiv","createElement","PreviewPrompt","defaultClassName","rationaleDiv","showRationale","hasText","hasMedia","showTeacherInstructions","style","display","Collapsible","labels","hidden","visible","show","toggled","onToggle","toggleShowCorrect","ConstructedResponse","_extends2","maxLength","adjustedLimit","spellCheck","pluginProps","dangerouslySetInnerHTML","__html","exports","PropTypes","bool","disabled","string","object","markup","array","func","isRequired","_default"],"sources":["../src/main.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { isEmpty, isEqual, debounce } from 'lodash-es';\nimport CorrectAnswerToggle from '@pie-lib/correct-answer-toggle';\nimport { ConstructedResponse } from '@pie-lib/mask-markup';\nimport { color, Collapsible, hasText, hasMedia, PreviewPrompt, UiLayout } from '@pie-lib/render-ui';\nimport { styled } from '@mui/material/styles';\nimport Translator from '@pie-lib/translator';\n\nconst { translator } = Translator;\n\nconst MainContainer = styled(UiLayout)(({ alwaysShowCorrect }) => ({\n color: color.text(),\n backgroundColor: color.background(),\n ...(alwaysShowCorrect && {\n '& *': {\n borderColor: `${color.text()} !important`,\n },\n }),\n}));\n\nconst NoteContainer = styled('div')(({ theme }) => ({\n marginBottom: theme.spacing(2),\n}));\n\nconst CollapsibleContainer = styled('div')(({ theme }) => ({\n marginBottom: theme.spacing(2),\n}));\n\nconst SrOnly = styled('h2')({\n position: 'absolute',\n left: '-10000px',\n top: 'auto',\n width: '1px',\n height: '1px',\n overflow: 'hidden',\n});\n\nexport class Main extends React.Component {\n static propTypes = {\n alwaysShowCorrect: PropTypes.bool,\n animationsDisabled: PropTypes.bool,\n disabled: PropTypes.bool,\n displayType: PropTypes.string,\n feedback: PropTypes.object,\n language: PropTypes.string,\n markup: PropTypes.string,\n maxLengthPerChoice: PropTypes.array,\n maxLengthPerChoiceEnabled: PropTypes.bool,\n mode: PropTypes.string,\n note: PropTypes.string,\n onChange: PropTypes.func,\n playerSpellCheckEnabled: PropTypes.bool,\n prompt: PropTypes.string,\n rationale: PropTypes.string,\n role: PropTypes.string,\n showNote: PropTypes.bool,\n teacherInstructions: PropTypes.string,\n value: PropTypes.object,\n responseAreaInputConfiguration: PropTypes.object,\n model: PropTypes.object.isRequired,\n };\n\n static defaultProps = {\n value: {},\n };\n\n state = {\n showCorrectAnswer: this.props.alwaysShowCorrect || false,\n };\n\n // if for all responses max length is 1, call onChange for each keystroke\n getChangeSession = (maxLengthPerChoice) =>\n maxLengthPerChoice && maxLengthPerChoice.every((val, _i, arr) => val === arr[0] && val === 1)\n ? this.props.onChange\n : debounce(this.props.onChange, 200, { maxWait: 200 });\n\n UNSAFE_componentWillReceiveProps(nextProps) {\n const { maxLengthPerChoice, language } = this.props;\n let { note } = this.props;\n\n if (isEmpty(nextProps.feedback)) {\n this.setState({ showCorrectAnswer: false });\n }\n\n if (nextProps.alwaysShowCorrect) {\n this.setState({ showCorrectAnswer: true });\n }\n\n if (maxLengthPerChoice && !isEqual(maxLengthPerChoice, nextProps.maxLengthPerChoice)) {\n this.changeSession = this.getChangeSession(nextProps.maxLengthPerChoice);\n }\n\n // check if the note is the default one for prev language and change to the default one for new language\n // this check is necessary in order to diferanciate between default and authour defined note\n // and only change between languages for default ones\n if (\n note &&\n language &&\n language !== nextProps.language &&\n note === translator.t('common:commonCorrectAnswerWithAlternates', { lng: language })\n ) {\n note = translator.t('common:commonCorrectAnswerWithAlternates', { lng: nextProps.language });\n }\n }\n\n toggleShowCorrect = () => {\n this.setState({ showCorrectAnswer: !this.state.showCorrectAnswer });\n };\n\n changeSession = this.getChangeSession(this.props.maxLengthPerChoice);\n\n onChange = (value) => {\n this.changeSession(value);\n };\n\n render() {\n const { showCorrectAnswer } = this.state;\n const {\n alwaysShowCorrect,\n animationsDisabled,\n mode,\n displayType,\n role,\n language,\n maxLengthPerChoice,\n maxLengthPerChoiceEnabled,\n note,\n playerSpellCheckEnabled,\n prompt,\n rationale,\n showNote,\n teacherInstructions,\n responseAreaInputConfiguration,\n model,\n value,\n } = this.props;\n\n const { extraCSSRules } = model || {};\n const displayNote = (showCorrectAnswer || (mode === 'view' && role === 'instructor')) && showNote && note;\n\n const teacherInstructionsDiv = (\n <PreviewPrompt defaultClassName=\"teacher-instructions\" prompt={teacherInstructions} />\n );\n\n const rationaleDiv = <PreviewPrompt prompt={rationale} />;\n\n const showRationale = rationale && (hasText(rationale) || hasMedia(rationale));\n const showTeacherInstructions =\n teacherInstructions && (hasText(teacherInstructions) || hasMedia(teacherInstructions));\n\n return (\n <MainContainer\n extraCSSRules={extraCSSRules}\n alwaysShowCorrect={alwaysShowCorrect}\n style={{ display: `${displayType}` }}\n >\n {mode === 'gather' && <SrOnly>Fill in the Blank Question</SrOnly>}\n\n {showTeacherInstructions && (\n <CollapsibleContainer>\n {!animationsDisabled ? (\n <Collapsible labels={{ hidden: 'Show Teacher Instructions', visible: 'Hide Teacher Instructions' }}>\n {teacherInstructionsDiv}\n </Collapsible>\n ) : (\n teacherInstructionsDiv\n )}\n </CollapsibleContainer>\n )}\n\n {prompt && <PreviewPrompt prompt={prompt} />}\n\n {!alwaysShowCorrect && (\n <CorrectAnswerToggle\n show={mode === 'evaluate'}\n toggled={showCorrectAnswer}\n onToggle={this.toggleShowCorrect}\n language={language}\n />\n )}\n\n <ConstructedResponse\n {...this.props}\n onChange={this.onChange}\n showCorrectAnswer={showCorrectAnswer}\n value={value}\n maxLength={maxLengthPerChoice}\n adjustedLimit={maxLengthPerChoiceEnabled}\n spellCheck={playerSpellCheckEnabled}\n pluginProps={responseAreaInputConfiguration}\n />\n\n {displayNote && <NoteContainer dangerouslySetInnerHTML={{ __html: note }} />}\n\n {showRationale && (\n <CollapsibleContainer>\n {!animationsDisabled ? (\n <Collapsible labels={{ hidden: 'Show Rationale', visible: 'Hide Rationale' }}>{rationaleDiv}</Collapsible>\n ) : (\n rationaleDiv\n )}\n </CollapsibleContainer>\n )}\n </MainContainer>\n );\n }\n}\n\nexport default Main;\n"],"mappings":"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","ignoreList":[]}
package/lib/print.js CHANGED
@@ -7,7 +7,7 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.default = void 0;
8
8
  var _react = _interopRequireDefault(require("react"));
9
9
  var _client = require("react-dom/client");
10
- var _debounce = _interopRequireDefault(require("lodash/debounce"));
10
+ var _lodashEs = require("lodash-es");
11
11
  var _main = _interopRequireDefault(require("./main"));
12
12
  var _mathRendering = require("@pie-lib/math-rendering");
13
13
  var _debug = _interopRequireDefault(require("debug"));
@@ -30,7 +30,7 @@ class ExplicitConstructedResponsePrint extends HTMLElement {
30
30
  this._model = null;
31
31
  this._session = [];
32
32
  this._root = null;
33
- this._rerender = (0, _debounce.default)(() => {
33
+ this._rerender = (0, _lodashEs.debounce)(() => {
34
34
  if (this._model && this._session) {
35
35
  const printModel = preparePrintModel(this._model, this._options);
36
36
  const element = this._options && /*#__PURE__*/_react.default.createElement(_main.default, {
package/lib/print.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"print.js","names":["_react","_interopRequireDefault","require","_client","_debounce","_main","_mathRendering","_debug","log","debug","preparePrintModel","model","opts","isInstructor","role","prompt","promptEnabled","undefined","teacherInstructions","teacherInstructionsEnabled","rationale","rationaleEnabled","alwaysShowCorrect","mode","disabled","animationsDisabled","ExplicitConstructedResponsePrint","HTMLElement","constructor","_options","_model","_session","_root","_rerender","debounce","printModel","element","React","createElement","Main","onChange","createRoot","render","queueMicrotask","renderMath","leading","trailing","options","o","s","connectedCallback","disconnectedCallback","unmount","exports","default"],"sources":["../src/print.js"],"sourcesContent":["import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport debounce from 'lodash/debounce';\nimport Main from './main';\nimport { renderMath } from '@pie-lib/math-rendering';\nimport debug from 'debug';\n\nconst log = debug('pie-element:explicit-constructed-response:print');\n\nconst preparePrintModel = (model, opts) => {\n const isInstructor = opts.role === 'instructor';\n\n model.prompt = model.promptEnabled !== false ? model.prompt : undefined;\n model.teacherInstructions =\n isInstructor && model.teacherInstructionsEnabled !== false ? model.teacherInstructions : undefined;\n model.rationale = isInstructor && model.rationaleEnabled !== false ? model.rationale : undefined;\n model.alwaysShowCorrect = isInstructor;\n model.mode = isInstructor ? 'evaluate' : model.mode;\n model.disabled = true;\n model.animationsDisabled = true;\n\n return model;\n};\n\nexport default class ExplicitConstructedResponsePrint extends HTMLElement {\n constructor() {\n super();\n this._options = null;\n this._model = null;\n this._session = [];\n this._root = null;\n\n this._rerender = debounce(\n () => {\n if (this._model && this._session) {\n const printModel = preparePrintModel(this._model, this._options);\n\n const element =\n this._options &&\n React.createElement(Main, {\n ...printModel,\n onChange: () => {},\n });\n\n if (!this._root) {\n this._root = createRoot(this);\n }\n this._root.render(element);\n queueMicrotask(() => {\n log('render complete - render math');\n renderMath(this);\n });\n } else {\n log('skip');\n }\n },\n 50,\n { leading: false, trailing: true },\n );\n }\n\n set options(o) {\n this._options = o;\n }\n\n set model(s) {\n this._model = s;\n this._rerender();\n }\n\n connectedCallback() {}\n\n disconnectedCallback() {\n if (this._root) {\n this._root.unmount();\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"print.js","names":["_react","_interopRequireDefault","require","_client","_lodashEs","_main","_mathRendering","_debug","log","debug","preparePrintModel","model","opts","isInstructor","role","prompt","promptEnabled","undefined","teacherInstructions","teacherInstructionsEnabled","rationale","rationaleEnabled","alwaysShowCorrect","mode","disabled","animationsDisabled","ExplicitConstructedResponsePrint","HTMLElement","constructor","_options","_model","_session","_root","_rerender","debounce","printModel","element","React","createElement","Main","onChange","createRoot","render","queueMicrotask","renderMath","leading","trailing","options","o","s","connectedCallback","disconnectedCallback","unmount","exports","default"],"sources":["../src/print.js"],"sourcesContent":["import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { debounce } from 'lodash-es';\nimport Main from './main';\nimport { renderMath } from '@pie-lib/math-rendering';\nimport debug from 'debug';\n\nconst log = debug('pie-element:explicit-constructed-response:print');\n\nconst preparePrintModel = (model, opts) => {\n const isInstructor = opts.role === 'instructor';\n\n model.prompt = model.promptEnabled !== false ? model.prompt : undefined;\n model.teacherInstructions =\n isInstructor && model.teacherInstructionsEnabled !== false ? model.teacherInstructions : undefined;\n model.rationale = isInstructor && model.rationaleEnabled !== false ? model.rationale : undefined;\n model.alwaysShowCorrect = isInstructor;\n model.mode = isInstructor ? 'evaluate' : model.mode;\n model.disabled = true;\n model.animationsDisabled = true;\n\n return model;\n};\n\nexport default class ExplicitConstructedResponsePrint extends HTMLElement {\n constructor() {\n super();\n this._options = null;\n this._model = null;\n this._session = [];\n this._root = null;\n\n this._rerender = debounce(\n () => {\n if (this._model && this._session) {\n const printModel = preparePrintModel(this._model, this._options);\n\n const element =\n this._options &&\n React.createElement(Main, {\n ...printModel,\n onChange: () => {},\n });\n\n if (!this._root) {\n this._root = createRoot(this);\n }\n this._root.render(element);\n queueMicrotask(() => {\n log('render complete - render math');\n renderMath(this);\n });\n } else {\n log('skip');\n }\n },\n 50,\n { leading: false, trailing: true },\n );\n }\n\n set options(o) {\n this._options = o;\n }\n\n set model(s) {\n this._model = s;\n this._rerender();\n }\n\n connectedCallback() {}\n\n disconnectedCallback() {\n if (this._root) {\n this._root.unmount();\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@pie-element/explicit-constructed-response",
3
+ "repository": "pie-framework/pie-elements",
3
4
  "publishConfig": {
4
5
  "access": "public"
5
6
  },
6
- "repository": "pie-framework/pie-elements",
7
- "version": "10.0.0-next.43+4249fa78f",
7
+ "version": "10.1.1-next.1",
8
8
  "description": "",
9
9
  "scripts": {
10
10
  "postpublish": "../../scripts/postpublish"
@@ -15,21 +15,21 @@
15
15
  "@mui/icons-material": "^7.3.4",
16
16
  "@mui/material": "^7.3.4",
17
17
  "@pie-framework/pie-player-events": "^0.1.0",
18
- "@pie-lib/correct-answer-toggle": "3.1.1-next.0",
19
- "@pie-lib/mask-markup": "2.1.1-next.0",
20
- "@pie-lib/math-rendering": "4.1.1-next.0",
21
- "@pie-lib/render-ui": "5.1.1-next.0",
22
- "@pie-lib/translator": "3.1.1-next.0",
18
+ "@pie-lib/correct-answer-toggle": "3.2.0-next.4",
19
+ "@pie-lib/mask-markup": "2.2.0-next.11",
20
+ "@pie-lib/math-rendering": "4.2.0-next.3",
21
+ "@pie-lib/render-ui": "5.2.0-next.4",
22
+ "@pie-lib/translator": "3.2.0-next.3",
23
23
  "classnames": "^2.2.5",
24
24
  "he": "^1.2.0",
25
- "lodash": "^4.17.10",
25
+ "lodash-es": "^4.17.23",
26
26
  "prop-types": "^15.6.1",
27
27
  "react": "18.3.1",
28
28
  "react-dom": "18.3.1"
29
29
  },
30
30
  "author": "",
31
31
  "license": "ISC",
32
- "gitHead": "4249fa78fc423ef0a8c89002b8f937c42b3478ea",
32
+ "gitHead": "9cc4a1cd183a260a03c7d817e0085517112a1a56",
33
33
  "main": "lib/index.js",
34
34
  "module": "src/index.js",
35
35
  "exports": {
@@ -1 +0,0 @@
1
- import{_dll_lodash as e,_dll_react as t,_dll_prop_types as a,_dll_mui__material_styles as o,_dll_mui__material as n,_dll_mui__icons_material as s,_dll_debug as l,_dll_react_dom as i}from"../../../@pie-lib/shared-module@^3.0.5/module/index.js";import{_dll_pie_lib__editable_html_tip_tap as r}from"../../../@pie-lib/editable-html-module@^6.0.5/module/index.js";import{_dll_pie_lib__config_ui as d}from"../../../@pie-lib/config-module@^3.0.0/module/index.js";function u(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var c,p={},h={exports:{}};(c=h).exports=function(e){return e&&e.__esModule?e:{default:e}},c.exports.__esModule=!0,c.exports.default=c.exports,u(h.exports);var g={exports:{}},f={exports:{}},m={exports:{}};!function(e){function t(a){return e.exports=t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e.exports.__esModule=!0,e.exports.default=e.exports,t(a)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports}(m),u(m.exports);var b={exports:{}};!function(e){var t=m.exports.default;e.exports=function(e,a){if("object"!=t(e)||!e)return e;var o=e[Symbol.toPrimitive];if(void 0!==o){var n=o.call(e,a||"default");if("object"!=t(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===a?String:Number)(e)},e.exports.__esModule=!0,e.exports.default=e.exports}(b),u(b.exports),function(e){var t=m.exports.default,a=b.exports;e.exports=function(e){var o=a(e,"string");return"symbol"==t(o)?o:o+""},e.exports.__esModule=!0,e.exports.default=e.exports}(f),u(f.exports),function(e){var t=f.exports;e.exports=function(e,a,o){return(a=t(a))in e?Object.defineProperty(e,a,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[a]=o,e},e.exports.__esModule=!0,e.exports.default=e.exports}(g),u(g.exports);var C={};Object.defineProperty(C,"__esModule",{value:!0});class x extends CustomEvent{constructor(e,t=!1){super(x.TYPE,{bubbles:!0,detail:{update:e,reset:t}}),this.update=e,this.reset=t}}x.TYPE="model.updated",C.ModelUpdatedEvent=x;class v extends CustomEvent{constructor(e,t){super(v.TYPE,{bubbles:!0,detail:{src:e,done:t}}),this.src=e,this.done=t}}v.TYPE="delete.image",C.DeleteImageEvent=v;class y extends CustomEvent{constructor(e){super(y.TYPE,{bubbles:!0,detail:e}),this.handler=e}}y.TYPE="insert.image",C.InsertImageEvent=y;class _ extends CustomEvent{constructor(e,t){super(_.TYPE,{bubbles:!0,detail:{src:e,done:t}}),this.src=e,this.done=t}}_.TYPE="delete.sound",C.DeleteSoundEvent=_;class E extends CustomEvent{constructor(e){super(E.TYPE,{bubbles:!0,detail:e}),this.handler=e}}E.TYPE="insert.sound",C.InsertSoundEvent=E;var S={},M={},P={exports:{}};!function(e){function t(){return e.exports=t=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var o in a)({}).hasOwnProperty.call(a,o)&&(e[o]=a[o])}return e},e.exports.__esModule=!0,e.exports.default=e.exports,t.apply(null,arguments)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports}(P),u(P.exports);var k={};const{escape:L}=e;var A=h.exports;Object.defineProperty(k,"__esModule",{value:!0}),k.stripHtmlTags=k.removeUnwantedCharacters=k.processMarkup=k.getAdjustedLength=k.decodeHTML=k.createSlateMarkup=void 0;var I=A(L);const T="imes|riangle|an|heta|herefore",R="throot|parallel|cong|approx|eq|e|sim",j=new RegExp(`(\\t(?!${T}))|(\\n(?!${R}))|(\\\\t(?!${T}))|(\\\\n(?!${R}))`,"g"),w=e=>e.replace(j,"").replace(/\\"/g,'"').replace(/\\\//g,"/");k.removeUnwantedCharacters=w,k.processMarkup=e=>{const t=((e="")=>{const t=document.createElement("div");return t.innerHTML=e.trim(),t})(w(e||"")||"");let a=0;return t.querySelectorAll('[data-type="explicit_constructed_response"]').forEach(e=>{e.replaceWith(`{{${a++}}}`)}),t.innerHTML};const O=/\{\{(\d+)\}\}/g;k.createSlateMarkup=(e,t)=>e?w(e).replace(O,(e,a)=>{const o=t[a][0].label||"";return`<span data-type="explicit_constructed_response" data-index="${a}" data-value="${(0,I.default)(o)}"></span>`}):"",k.getAdjustedLength=e=>e<=2?e+2:e<=4?e+3:e<=6?e+4:e+5,k.stripHtmlTags=e=>"string"!=typeof e?"":e.replace(/<\/?[^>]+(>|$)/g,""),k.decodeHTML=e=>(new DOMParser).parseFromString(e,"text/html").body.textContent||"";const D=t,q=a,H=o,W=r;function B(e){let t,a=e[0],o=1;for(;o<e.length;){const n=e[o],s=e[o+1];if(o+=2,("optionalAccess"===n||"optionalCall"===n)&&null==a)return;"access"===n||"optionalAccess"===n?(t=a,a=s(a)):"call"!==n&&"optionalCall"!==n||(a=s((...e)=>a.call(t,...e)),t=void 0)}return a}var N=h.exports;Object.defineProperty(M,"__esModule",{value:!0}),M.default=M.ECRToolbar=void 0;var U=N(P.exports),z=N(g.exports),$=N(D),Y=N(q),F=H,K=N(W),V=k;const G=(0,F.styled)(K.default)(({theme:e})=>({backgroundColor:e.palette.common.white,outline:"none",lineHeight:"15px"}));class J extends $.default.Component{constructor(...e){super(...e),(0,z.default)(this,"state",{markup:"",toolbarStyle:{}}),(0,z.default)(this,"onDone",e=>{const{node:t,editor:a,onToolbarDone:o,onChangeResponse:n}=this.props,s=(0,V.stripHtmlTags)(e);this.setState({markup:s}),a.commands.updateAttributes("explicit_constructed_response",{value:s}),o(!0),n(s)}),(0,z.default)(this,"onRespAreaChange",e=>{this.setState({respAreaMarkup:e})}),(0,z.default)(this,"onKeyDown",e=>{if("Enter"===e.key)return!0}),(0,z.default)(this,"onBlur",()=>{this.clickedInside&&(this.clickedInside=!1)})}componentDidMount(){const{correctChoice:e,node:t,editor:a}=this.props,o=e||{},n=a.view.nodeDOM(a.state.selection.from);if(1===B([n,"optionalAccess",e=>e.nodeType])){const e=n.getBoundingClientRect(),t=n.closest(".tiptap").getBoundingClientRect();e.top,t.top,e.left,t.left,this.setState({markup:o.label,toolbarStyle:{position:"absolute",top:0,left:0,width:e.width-4+"px"}})}}render(){const{maxLengthPerChoiceEnabled:e,pluginProps:t,spellCheck:a}=this.props,{markup:o,toolbarStyle:n}=this.state,s=e?{}:{maxLength:25};return $.default.createElement("div",{style:n},$.default.createElement(G,(0,U.default)({autoFocus:!0,disableUnderline:!0,onChange:e=>{this.preventDone||this.onRespAreaChange(e)},onDone:e=>{this.preventDone||this.onDone(e)},onBlur:e=>{this.preventDone=e.relatedTarget&&e.relatedTarget.closest(".insert-character-dialog"),this.onBlur(e)},onKeyDown:this.onKeyDown,markup:o||"",activePlugins:["languageCharacters"],pluginProps:t,languageCharactersProps:[{language:"spanish"}],minHeight:"15px",maxHeight:"15px",spellCheck:a,autoWidthToolbar:!0,toolbarOpts:{minWidth:"auto",isHidden:!!B([t,"optionalAccess",e=>e.characters,"optionalAccess",e=>e.disabled])}},s)))}}M.ECRToolbar=J,(0,z.default)(J,"propTypes",{correctChoice:Y.default.object,node:Y.default.object,onDone:Y.default.func,onChangeResponse:Y.default.func.isRequired,onToolbarDone:Y.default.func.isRequired,value:Y.default.shape({change:Y.default.func.isRequired,document:Y.default.shape({getNextText:Y.default.func.isRequired})}),editor:Y.default.object,maxLengthPerChoiceEnabled:Y.default.bool,pluginProps:Y.default.object,spellCheck:Y.default.bool}),M.default=J;var Q={},X={};const Z=t,ee=a,{debounce:te}=e,{isEqual:ae}=e,{max:oe}=e,{Button:ne}=n,{IconButton:se}=n,{MenuItem:le}=n,{Select:ie}=n,{TextField:re}=n,{Delete:de}=s,ue=o,ce=r;function pe(e){let t,a=e[0],o=1;for(;o<e.length;){const n=e[o],s=e[o+1];if(o+=2,("optionalAccess"===n||"optionalCall"===n)&&null==a)return;"access"===n||"optionalAccess"===n?(t=a,a=s(a)):"call"!==n&&"optionalCall"!==n||(a=s((...e)=>a.call(t,...e)),t=void 0)}return a}var he=h.exports;Object.defineProperty(X,"__esModule",{value:!0}),X.default=X.Choice=X.AlternateSection=void 0;var ge=he(P.exports),fe=he(g.exports),me=he(Z),be=he(ee),Ce=he(te),xe=he(ae),ve=he(ne),ye=he(de),_e=he(se),Ee=he(le),Se=he(ie),Me=he(re),Pe=ue,ke=he(oe),Le=he(ce),Ae=k;const Ie=(0,Pe.styled)("div")(({theme:e})=>({marginBottom:e.spacing(.5)})),Te=(0,Pe.styled)("div")(({theme:e})=>({alignItems:"flex-start",flexDirection:"column",display:"flex",paddingTop:e.spacing(2.5),"& > *":{marginBottom:e.spacing(2.5),width:"100%"}})),Re=(0,Pe.styled)(Le.default)(({theme:e,hasError:t})=>({flex:"1",marginRight:e.spacing(2.5),...t&&{border:`2px solid ${e.palette.error.main}`,borderRadius:"6px"}})),je=(0,Pe.styled)(_e.default)(({theme:e})=>({"& svg":{fill:e.palette.grey[600]}})),we=(0,Pe.styled)("div")({alignItems:"flex-end",display:"flex",justifyContent:"space-between",width:"100%"}),Oe=(0,Pe.styled)("div")({alignItems:"center",display:"flex"}),De=(0,Pe.styled)(Me.default)(({theme:e})=>({width:"230px",marginRight:e.spacing(2.5),"& .MuiInput-underline:before":{borderBottomColor:e.palette.divider},"& .MuiInput-underline:hover:not(.Mui-disabled):before":{borderBottomColor:e.palette.text.primary},"& .MuiInput-underline:after":{borderBottomColor:e.palette.primary.main}})),qe=(0,Pe.styled)("div")(({theme:e})=>({fontSize:e.typography.fontSize-2,color:e.palette.error.main,paddingTop:e.spacing(.5)})),He=(0,Pe.styled)("div")({alignItems:"center",display:"flex",justifyContent:"space-between"});class We extends me.default.Component{constructor(...e){super(...e),(0,fe.default)(this,"state",{value:this.props.markup}),(0,fe.default)(this,"updateText",(0,Ce.default)(this.props.onChange,300)),(0,fe.default)(this,"onChange",e=>{const t=(0,Ae.stripHtmlTags)(e);this.setState({value:t}),this.updateText(t)}),(0,fe.default)(this,"onKeyDown",e=>{if("Enter"===e.key)return!0})}UNSAFE_componentWillReceiveProps(e){e.markup&&this.setState({value:e.markup})}render(){const{value:e}=this.state,{onDelete:t,spellCheck:a,error:o,showMaxLength:n,pluginProps:s}=this.props,l=n?{}:{maxLength:25};return me.default.createElement(me.default.Fragment,null,me.default.createElement(He,null,me.default.createElement(Re,(0,ge.default)({hasError:!!o,disableUnderline:!0,onChange:this.onChange,onKeyDown:this.onKeyDown,markup:e||"",activePlugins:["languageCharacters"],pluginProps:s,languageCharactersProps:[{language:"spanish"}],spellCheck:a,autoWidthToolbar:!0,toolbarOpts:{minWidth:"auto",isHidden:!!pe([s,"optionalAccess",e=>e.characters,"optionalAccess",e=>e.disabled])}},l)),me.default.createElement(je,{"aria-label":"delete",onClick:t,size:"large"},me.default.createElement(ye.default,null))),o&&me.default.createElement(qe,null,o))}}X.Choice=We,(0,fe.default)(We,"propTypes",{error:be.default.string,markup:be.default.string,onChange:be.default.func.isRequired,onDelete:be.default.func.isRequired,value:be.default.string,spellCheck:be.default.bool,showMaxLength:be.default.bool,pluginProps:be.default.object});class Be extends me.default.Component{constructor(...e){super(...e),(0,fe.default)(this,"state",{}),(0,fe.default)(this,"updateChoicesIfNeeded",e=>{this.state.choices&&(0,xe.default)(e.choices,this.state.choices)&&(0,xe.default)(e.choices,this.props.choices)||this.setState({choices:e.choices})}),(0,fe.default)(this,"handleSelect",e=>{const{onSelect:t,selectChoices:a}=this.props,{value:o}=e.target;t(a.find(e=>e.value===o))}),(0,fe.default)(this,"onAddChoice",()=>{const{choices:e}=this.state;if(e.length&&""!==e[e.length-1].label){const t=(0,ke.default)(e.map(e=>parseInt(e.value)).filter(e=>!isNaN(e)))||0;this.setState({choices:[...e,{value:`${t+1}`,label:""}]})}}),(0,fe.default)(this,"onChoiceChanged",(e,t,a)=>{const{choiceChanged:o,lengthChanged:n,maxLength:s,choices:l}=this.props,i=l.map(e=>(0,Ae.decodeHTML)(e.label||"").length);i[a]=(0,Ae.decodeHTML)(t).length;const r=Math.max(...i);o({...e,label:t}),(r>s||r+10<=s)&&n((0,Ae.getAdjustedLength)(r))}),(0,fe.default)(this,"onRemoveChoice",e=>{const{choiceRemoved:t}=this.props;t(e.value)}),(0,fe.default)(this,"getChoicesMaxLength",()=>{const{choices:e}=this.state;if(!e)return 1;const t=e.map(e=>(0,Ae.decodeHTML)(e.label||"").length);return Math.max(...t)}),(0,fe.default)(this,"changeLength",e=>{const{lengthChanged:t}=this.props,a=parseInt(e.target.value,10),o=this.getChoicesMaxLength();a&&a>=o&&a<=o+10&&t(a)})}UNSAFE_componentWillReceiveProps(e){this.updateChoicesIfNeeded(e)}componentDidMount(){this.updateChoicesIfNeeded(this.props)}render(){const{selectChoices:e,maxLength:t,showMaxLength:a,value:o,spellCheck:n,errors:s,pluginProps:l}=this.props,{choices:i}=this.state,r=this.getChoicesMaxLength();return me.default.createElement(Ie,null,me.default.createElement(we,null,me.default.createElement(Se.default,{variant:"standard",displayEmpty:!0,onChange:this.handleSelect,value:o||"",readOnly:a,MenuProps:{transitionDuration:{enter:225,exit:195}}},me.default.createElement(Ee.default,{value:""},me.default.createElement("em",null,o?"Remove selection":"Select a response")),e.map((e,t)=>me.default.createElement(Ee.default,{key:t,value:pe([e,"optionalAccess",e=>e.value])},(0,Ae.decodeHTML)(pe([e,"optionalAccess",e=>e.label]))))),i&&i.length>0&&me.default.createElement(Oe,null,t&&a&&me.default.createElement(De,{variant:"standard",label:"Maximum length (characters)",type:"number",inputProps:{min:r,max:r+10},value:t,onChange:this.changeLength}),me.default.createElement(ve.default,{variant:"contained",color:"primary",onClick:this.onAddChoice},"Add"))),s&&s[0]&&me.default.createElement(qe,null,s[0]),me.default.createElement(Te,null,i&&i.map((e,t)=>t>0&&me.default.createElement(We,{key:t,markup:e.label,onChange:a=>this.onChoiceChanged(e,a,t),onDelete:()=>this.onRemoveChoice(e),spellCheck:n,error:s&&s[t],showMaxLength:a,pluginProps:l}))))}}X.AlternateSection=Be,(0,fe.default)(Be,"propTypes",{choices:be.default.array,selectChoices:be.default.array.isRequired,errors:be.default.object,onSelect:be.default.func.isRequired,choiceChanged:be.default.func.isRequired,lengthChanged:be.default.func,choiceRemoved:be.default.func.isRequired,value:be.default.string,maxLength:be.default.number,showMaxLength:be.default.bool,spellCheck:be.default.bool,pluginProps:be.default.object}),X.default=Be;const Ne=t,Ue=a,{isEqual:ze}=e,{map:$e}=e,{reduce:Ye}=e,{cloneDeep:Fe}=e;var Ke=h.exports;Object.defineProperty(Q,"__esModule",{value:!0}),Q.default=Q.AlternateResponses=void 0;var Ve=Ke(g.exports),Ge=Ke(Ne),Je=Ke(Ue),Qe=Ke(ze),Xe=Ke($e),Ze=Ke(Ye),et=Ke(Fe),tt=Ke(X);class at extends Ge.default.Component{constructor(...e){super(...e),(0,Ve.default)(this,"state",{maxLengthPerChoice:(0,et.default)(this.props.model.maxLengthPerChoice)}),(0,Ve.default)(this,"updateChoicesIfNeeded",e=>{if(!this.state.choices||!(0,Qe.default)(this.state.choices,e.model.choices)||!(0,Qe.default)(e.model.choices,this.props.model.choices)||this.state.values&&Object.keys(this.state.values).length!==Object.keys(this.props.model.choices).length||e.maxLengthPerChoiceEnabled!==this.props.maxLengthPerChoiceEnabled){const{choices:t,maxLengthPerChoice:a}=e.model,o=(0,Ze.default)(t,(t,a,o)=>(a&&(e.maxLengthPerChoiceEnabled||a.length>1)&&(t[o]=a[0]),t),{});this.setState({choices:e.model.choices,values:o,maxLengthPerChoice:(0,et.default)(a)})}}),(0,Ve.default)(this,"getRemainingChoices",e=>{const{choices:t}=this.state;return(0,Ze.default)(t,(t,a,o)=>(a&&1===a.length&&!e&&t.push({label:a[0].label,value:o}),t),[])}),(0,Ve.default)(this,"onChoiceChanged",(e,t)=>{const{onChange:a}=this.props,{choices:o}=this.state,n=o[t]||[],s=!n.find(t=>t.value===e.value),l=n.reduce((t,a)=>{const o=a.value===e.value?e:a;return t.push(o),t},[]);s&&l.push(e),a({...o,[t]:l})}),(0,Ve.default)(this,"onChoiceRemoved",(e,t)=>{const{onChange:a}=this.props,{choices:o}=this.state,n=(o[t]||[]).reduce((t,a)=>(a.value===e||t.push(a),t),[]);a({...o,[t]:n})}),(0,Ve.default)(this,"onSectionSelect",(e,t)=>{const{onChange:a}=this.props,{choices:o,values:n}=this.state;o[t]&&o[t].length>1?e||a({...o,[t]:[o[t][0]]}):this.setState({choices:{...o,[t]:[...o[t],{label:"",value:"1"}]},values:{...n,[t]:o[t][0]}})}),(0,Ve.default)(this,"onLengthChanged",(e,t)=>{const{model:a,onLengthChange:o}=this.props,{maxLengthPerChoice:n}=a;n[t]=e,o(n)})}UNSAFE_componentWillReceiveProps(e){this.updateChoicesIfNeeded(e)}componentDidMount(){this.updateChoicesIfNeeded(this.props)}render(){const{choices:e}=this.state,{model:{maxLengthPerChoice:t,maxLengthPerChoiceEnabled:a},spellCheck:o,choicesErrors:n,pluginProps:s}=this.props;return Ge.default.createElement("div",null,(0,Xe.default)(e,(e,l)=>{if(e&&(a||e.length>1)){const i=this.state.values[l];return Ge.default.createElement(tt.default,{key:l,value:i&&i.value,errors:n&&n[l],onSelect:e=>this.onSectionSelect(e,l),choiceChanged:e=>this.onChoiceChanged(e,l),choiceRemoved:e=>this.onChoiceRemoved(e,l),lengthChanged:e=>this.onLengthChanged(e,l),selectChoices:[i],choices:e,maxLength:t[l],showMaxLength:a,spellCheck:o,pluginProps:s})}}),e&&Object.keys(this.state.values).length!==Object.keys(e).length&&Ge.default.createElement(tt.default,{value:"",onSelect:e=>this.onSectionSelect(e,e.value),choiceChanged:e=>this.onChoiceChanged(e),choiceRemoved:e=>this.onChoiceRemoved(e),selectChoices:this.getRemainingChoices(),spellCheck:o,pluginProps:s}))}}Q.AlternateResponses=at,(0,Ve.default)(at,"propTypes",{choicesErrors:Je.default.object,model:Je.default.object.isRequired,onChange:Je.default.func.isRequired,onLengthChange:Je.default.func.isRequired,maxLengthPerChoiceEnabled:Je.default.bool.isRequired,spellCheck:Je.default.bool,pluginProps:Je.default.object}),Q.default=at;var ot={};Object.defineProperty(ot,"__esModule",{value:!0}),ot.generateValidationMessage=void 0,ot.generateValidationMessage=e=>{const{maxResponseAreas:t}=e;return"Validation requirements:\nCorrect answers should not be blank.\nEach answer defined for a response area should be unique.\nThere should be at least 1 "+(t?`and at most ${t} `:"")+"response area"+(t?"s":"")+" defined."};const nt=t,st=a,{cloneDeep:lt}=e,{isEmpty:it}=e,{pick:rt}=e,{throttle:dt}=e,ut=o,{Typography:ct}=n,{Tooltip:pt}=n,{Info:ht}=s,gt=r,ft=d;function mt(e){let t,a=e[0],o=1;for(;o<e.length;){const n=e[o],s=e[o+1];if(o+=2,("optionalAccess"===n||"optionalCall"===n)&&null==a)return;"access"===n||"optionalAccess"===n?(t=a,a=s(a)):"call"!==n&&"optionalCall"!==n||(a=s((...e)=>a.call(t,...e)),t=void 0)}return a}var bt=h.exports;Object.defineProperty(S,"__esModule",{value:!0}),S.default=S.Main=void 0;var Ct=bt(g.exports),xt=bt(nt),vt=bt(st),yt=bt(lt),_t=bt(it),Et=bt(rt),St=bt(dt),Mt=function(e){if("function"==typeof WeakMap){var t=new WeakMap;new WeakMap}return function(e){if(e&&e.__esModule)return e;var a,o,n={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return n;if(a=t){if(a.has(e))return a.get(e);a.set(e,n)}for(const t in e)"default"!==t&&{}.hasOwnProperty.call(e,t)&&((o=(a=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,t))&&(o.get||o.set)?a(n,t,o):n[t]=e[t]);return n}(e)}(gt),Pt=ft,kt=ut,Lt=bt(ct),At=bt(ht),It=bt(pt),Tt=bt(M),Rt=bt(Q),jt=k,wt=ot;const{toggle:Ot,Panel:Dt,dropdown:qt}=Pt.settings,Ht=(0,kt.styled)(Pt.InputContainer)(({theme:e})=>({width:"100%",paddingTop:e.spacing(1),marginTop:e.spacing(2),marginBottom:e.spacing(2)})),Wt=(0,kt.styled)(Mt.default)(({theme:e})=>({minHeight:"100px",paddingTop:e.spacing(1),width:"100%",'& [data-slate-editor="true"]':{minHeight:"100px"}})),Bt=(0,kt.styled)(Lt.default)(({theme:e})=>({fontSize:e.typography.fontSize+2})),Nt=(0,kt.styled)(It.default)(({theme:e})=>({"& .MuiTooltip-tooltip":{fontSize:e.typography.fontSize-2,whiteSpace:"pre",maxWidth:"500px"}})),Ut=(0,kt.styled)("div")(({theme:e})=>({fontSize:e.typography.fontSize-2,color:e.palette.error.main,paddingTop:e.spacing(1)})),zt=(0,kt.styled)("div")({display:"flex",alignItems:"center"}),$t=(0,kt.styled)(Lt.default)(({theme:e})=>({fontSize:e.typography.fontSize+2,marginTop:e.spacing(3),marginBottom:e.spacing(1)}));class Yt extends xt.default.Component{constructor(...e){super(...e),(0,Ct.default)(this,"state",{}),(0,Ct.default)(this,"onModelChange",e=>{this.props.onModelChanged({...this.props.model,...e})}),(0,Ct.default)(this,"onPromptChanged",e=>{this.props.onModelChanged({...this.props.model,prompt:e})}),(0,Ct.default)(this,"onRationaleChanged",e=>{this.props.onModelChanged({...this.props.model,rationale:e})}),(0,Ct.default)(this,"onTeacherInstructionsChanged",e=>{const{model:t,onModelChanged:a}=this.props;a({...t,teacherInstructions:e})}),(0,Ct.default)(this,"onMarkupChanged",e=>{this.props.onModelChanged({...this.props.model,slateMarkup:e})}),(0,Ct.default)(this,"onResponsesChanged",e=>{this.props.onModelChanged({...this.props.model,choices:e})}),(0,Ct.default)(this,"onLengthChanged",e=>{const{model:t,onModelChanged:a}=this.props;a({...t,maxLengthPerChoice:e})}),(0,Ct.default)(this,"onChangeResponse",(e,t)=>{const{model:a,onModelChanged:o}=this.props,{choices:n}=a;let{maxLengthPerChoice:s}=a;const l=(0,jt.decodeHTML)(t||"").length;if(n[e]&&n[e].length)n[e][0].label=t||"",s&&(s[e]<l||s[e]>l+10)&&(s[e]=(0,jt.getAdjustedLength)(l));else{n[e]=[{label:t||"",value:"0"}];const a=e>s.length?e-s.length:0;s=[...s,...Array(a).fill(1)],s.splice(e,0,(0,jt.getAdjustedLength)(l))}o({...a,choices:n,maxLengthPerChoice:s})}),(0,Ct.default)(this,"onChange",e=>{const{model:{choices:t,maxLengthPerChoice:a},onModelChanged:o}=this.props,n=(e=>{const t=document.createElement("div");return t.innerHTML=e.trim(),t})(e),s=n.querySelectorAll('[data-type="explicit_constructed_response"]'),l={},i=[];s.forEach((e,o)=>{const n=(0,yt.default)(t[e.dataset.index]);n&&(n[0]={label:e.dataset.value||"",value:"0"},i[o]=a[e.dataset.index]),l[o]=n,e.dataset.index=o}),this.setState({cachedChoices:void 0},()=>o({...this.props.model,choices:l,slateMarkup:n.innerHTML,maxLengthPerChoice:i}))}),(0,Ct.default)(this,"onHandleAreaChange",(0,St.default)(e=>{const{model:{choices:t},onModelChanged:a}=this.props,{cachedChoices:o}=this.state;if(!e)return;const n=t?(0,yt.default)(t):{},s=o?(0,yt.default)(o):{};e.forEach(e=>{const t=e.index;!n[t]&&s[t]?(Object.assign(n,(0,Et.default)(s,t)),Object.prototype.hasOwnProperty.call(s,t)&&delete s[t]):(Object.assign(s,(0,Et.default)(n,t)),Object.prototype.hasOwnProperty.call(n,t)&&delete n[t])}),this.setState({cachedChoices:s},()=>a({...this.props.model,choices:n}))},500,{trailing:!1,leading:!0}))}componentDidMount(){const{model:{slateMarkup:e,choices:t,maxLengthPerChoice:a=[]},onModelChanged:o}=this.props,n=!a.length;this.setState({markup:e}),Object.values(t).forEach((e,t)=>{const o=e.map(e=>(0,jt.decodeHTML)(e.label||"").length),s=Math.max(...o);(n||!a[t]||a[t]<s||a[t]>s+10)&&(a[t]=(0,jt.getAdjustedLength)(s))}),o({...this.props.model,maxLengthPerChoice:a})}render(){const{model:e,configuration:t,onConfigurationChanged:a,imageSupport:o,uploadSoundSupport:n}=this.props,{baseInputConfiguration:s={},contentDimensions:l={},maxImageWidth:i={},maxImageHeight:r={},maxLengthPerChoice:d={},maxResponseAreas:u,partialScoring:c={},playerSpellCheck:p={},prompt:h={},rationale:g={},template:f={},settingsPanelDisabled:m,spellCheck:b={},editSource:C={},teacherInstructions:x={},withRubric:v={},mathMlOptions:y={},language:_={},languageChoices:E={},spanishButton:S={},responseAreaInputConfiguration:M={}}=t||{},{errors:P,extraCSSRules:k,maxLengthPerChoiceEnabled:L,promptEnabled:A,rationaleEnabled:I,spellCheckEnabled:T,teacherInstructionsEnabled:R,toolbarEditorPosition:j}=e||{},{choices:w={},prompt:O,rationale:D,responseAreas:q,teacherInstructions:H}=P||{},W=(0,wt.generateValidationMessage)(t),B=i&&i.prompt,N=r&&r.prompt,U={position:"top"===j?"top":"bottom"},z={partialScoring:c.settings&&Ot(c.label),maxLengthPerChoiceEnabled:d.settings&&Ot(d.label),"language.enabled":_.settings&&Ot(_.label,!0),language:_.settings&&_.enabled&&qt(E.label,E.options),"responseAreaInputConfiguration.inputConfiguration.characters.disabled":S.settings&&Ot(S.label,!0)},$={teacherInstructionsEnabled:x.settings&&Ot(x.label),rationaleEnabled:g.settings&&Ot(g.label),promptEnabled:h.settings&&Ot(h.label),spellCheckEnabled:b.settings&&Ot(b.label),playerSpellCheckEnabled:p.settings&&Ot(p.label),rubricEnabled:mt([v,"optionalAccess",e=>e.settings])&&Ot(mt([v,"optionalAccess",e=>e.label])),"editSource.enabled":mt([C,"optionalAccess",e=>e.settings])&&Ot(C.label,!0)},Y=(e={})=>({...s,...e});return xt.default.createElement(Pt.layout.ConfigLayout,{extraCSSRules:k,dimensions:l,hideSettings:m,settings:xt.default.createElement(Dt,{model:e,configuration:t,onChangeModel:e=>this.onModelChange(e),onChangeConfiguration:e=>a(e,!0),groups:{Settings:z,Properties:$}})},R&&xt.default.createElement(Ht,{label:x.label},xt.default.createElement(Mt.default,{className:"prompt",markup:e.teacherInstructions||"",onChange:this.onTeacherInstructionsChanged,imageSupport:o,nonEmpty:!1,error:H,toolbarOpts:U,pluginProps:Y(mt([x,"optionalAccess",e=>e.inputConfiguration])),spellCheck:T,maxImageWidth:i&&i.teacherInstructions||B,maxImageHeight:r&&r.teacherInstructions||N,uploadSoundSupport:n,languageCharactersProps:[{language:"spanish"},{language:"special"}],mathMlOptions:y,autoWidthToolbar:!0}),H&&xt.default.createElement(Ut,null,H)),A&&xt.default.createElement(Ht,{label:h.label},xt.default.createElement(Mt.default,{className:"prompt",markup:e.prompt,onChange:this.onPromptChanged,imageSupport:o,nonEmpty:!1,disableUnderline:!0,error:O,toolbarOpts:U,pluginProps:Y(mt([h,"optionalAccess",e=>e.inputConfiguration])),spellCheck:T,maxImageWidth:B,maxImageHeight:N,uploadSoundSupport:n,languageCharactersProps:[{language:"spanish"},{language:"special"}],mathMlOptions:y,autoWidthToolbar:!0}),O&&xt.default.createElement(Ut,null,O)),xt.default.createElement(zt,null,xt.default.createElement(Bt,{component:"div"},"Define Template, Choices, and Correct Responses"),xt.default.createElement(Nt,{disableFocusListener:!0,disableTouchListener:!0,placement:"right",title:W},xt.default.createElement(At.default,{fontSize:"small",color:"primary",style:{marginLeft:"8px"}}))),xt.default.createElement(Wt,{activePlugins:Mt.ALL_PLUGINS,toolbarOpts:{position:"top"},spellCheck:T,pluginProps:Y(mt([f,"optionalAccess",e=>e.inputConfiguration])),responseAreaProps:{type:"explicit-constructed-response",options:{duplicates:!0},maxResponseAreas:u,respAreaToolbar:(e,t,a)=>{const{model:o}=this.props,n=(o.choices[e.attrs.index]||[])[0];return()=>xt.default.createElement(Tt.default,{onChangeResponse:t=>this.onChangeResponse(e.attrs.index,t),node:e,editor:t,onToolbarDone:a,correctChoice:n,maxLengthPerChoiceEnabled:L,pluginProps:Y(mt([M,"optionalAccess",e=>e.inputConfiguration]))})},error:()=>w,onHandleAreaChange:this.onHandleAreaChange},markup:e.slateMarkup,onChange:this.onChange,imageSupport:o,disableImageAlignmentButtons:!0,onBlur:this.onBlur,disabled:!1,highlightShape:!1,error:q,uploadSoundSupport:n,languageCharactersProps:[{language:"spanish"},{language:"special"}],mathMlOptions:y,autoWidthToolbar:!0}),q&&xt.default.createElement(Ut,null,q),!(0,_t.default)(e.choices)&&xt.default.createElement($t,null,"Define Alternates "+(L?"and Character Limits":"")),xt.default.createElement(Rt.default,{model:e,onChange:this.onResponsesChanged,onLengthChange:this.onLengthChanged,maxLengthPerChoiceEnabled:L,spellCheck:T,choicesErrors:w,pluginProps:Y(mt([M,"optionalAccess",e=>e.inputConfiguration]))}),I&&xt.default.createElement(Ht,{label:g.label},xt.default.createElement(Mt.default,{className:"prompt",markup:e.rationale||"",onChange:this.onRationaleChanged,imageSupport:o,error:D,toolbarOpts:U,pluginProps:Y(mt([g,"optionalAccess",e=>e.inputConfiguration])),spellCheck:T,maxImageWidth:i&&i.rationale||B,maxImageHeight:r&&r.rationale||N,uploadSoundSupport:n,languageCharactersProps:[{language:"spanish"},{language:"special"}],mathMlOptions:y,autoWidthToolbar:!0}),D&&xt.default.createElement(Ut,null,D)))}}S.Main=Yt,(0,Ct.default)(Yt,"propTypes",{configuration:vt.default.object.isRequired,model:vt.default.object.isRequired,disableSidePanel:vt.default.bool,onModelChanged:vt.default.func.isRequired,onConfigurationChanged:vt.default.func.isRequired,imageSupport:vt.default.shape({add:vt.default.func.isRequired,delete:vt.default.func.isRequired}),uploadSoundSupport:vt.default.object}),S.default=Yt;var Ft={};Object.defineProperty(Ft,"__esModule",{value:!0}),Ft.default=void 0,Ft.default={model:{choices:{},displayType:"block",markup:"",maxLengthPerChoiceEnabled:!0,playerSpellCheckEnabled:!0,prompt:"",promptEnabled:!0,rationale:"",rationaleEnabled:!0,spellCheckEnabled:!0,studentInstructionsEnabled:!0,teacherInstructions:"",teacherInstructionsEnabled:!0,toolbarEditorPosition:"bottom",responseAreaInputConfiguration:{}},configuration:{baseInputConfiguration:{html:{disabled:!0},audio:{disabled:!1},video:{disabled:!1},image:{disabled:!1},textAlign:{disabled:!0},showParagraphs:{disabled:!1},separateParagraphs:{disabled:!0}},prompt:{settings:!0,label:"Prompt",inputConfiguration:{audio:{disabled:!1},video:{disabled:!1},image:{disabled:!1}},required:!1},partialScoring:{settings:!1,label:"Allow Partial Scoring"},rationale:{settings:!0,label:"Rationale",inputConfiguration:{audio:{disabled:!1},video:{disabled:!1},image:{disabled:!1}},required:!1},settingsPanelDisabled:!1,spellCheck:{label:"Spellcheck",settings:!1,enabled:!0},editSource:{label:"Edit Source",settings:!1,enabled:!1},playerSpellCheck:{label:"Student Spellcheck",settings:!0,enabled:!0},teacherInstructions:{settings:!0,label:"Teacher Instructions",inputConfiguration:{audio:{disabled:!1},video:{disabled:!1},image:{disabled:!1}},required:!1},template:{inputConfiguration:{audio:{disabled:!1},video:{disabled:!1},image:{disabled:!1},h3:{disabled:!0},blockquote:{disabled:!0}}},maxLengthPerChoice:{settings:!0,label:"Maximum Length Per Choice"},maxResponseAreas:10,maxImageWidth:{teacherInstructions:300,prompt:300,rationale:300},maxImageHeight:{teacherInstructions:300,prompt:300,rationale:300},withRubric:{settings:!1,label:"Add Rubric"},mathMlOptions:{mmlOutput:!1,mmlEditing:!1},language:{settings:!1,label:"Specify Language",enabled:!1},languageChoices:{label:"Language Choices",options:[]},responseAreaInputConfiguration:{inputConfiguration:{characters:{disabled:!0}}},spanishButton:{settings:!0,label:"Disable Spanish Characters"}}};const Kt=t,{client:Vt}=i,Gt=l,{defaults:Jt}=e,{isArray:Qt}=e;function Xt(e){let t,a=e[0],o=1;for(;o<e.length;){const n=e[o],s=e[o+1];if(o+=2,("optionalAccess"===n||"optionalCall"===n)&&null==a)return;"access"===n||"optionalAccess"===n?(t=a,a=s(a)):"call"!==n&&"optionalCall"!==n||(a=s((...e)=>a.call(t,...e)),t=void 0)}return a}var Zt=h.exports;Object.defineProperty(p,"__esModule",{value:!0});var ea=p.default=void 0,ta=Zt(g.exports),aa=Zt(Kt),oa=Vt,na=Zt(Gt),sa=Zt(Jt),la=Zt(Qt),ia=C,ra=Zt(S),da=Zt(Ft),ua=k;const ca=(0,na.default)("explicit-constructed-response:configure");class pa extends HTMLElement{constructor(){super(),this._root=null,this._model=pa.prepareModel(),this._configuration=da.default.configuration,this.onModelChanged=this.onModelChanged.bind(this),this.onConfigurationChanged=this.onConfigurationChanged.bind(this)}set model(e){this._model=pa.prepareModel(e),this._model.responseAreaInputConfiguration&&(this._model.responseAreaInputConfiguration=Xt([this,"access",e=>e._configuration,"access",e=>e.responseAreaInputConfiguration,"optionalAccess",e=>e.inputConfiguration])),this._render()}set configuration(e){this._configuration=(0,sa.default)(e,da.default.configuration),Xt([e,"access",e=>e.language,"optionalAccess",e=>e.enabled])?Xt([e,"access",e=>e.languageChoices,"optionalAccess",e=>e.options,"optionalAccess",e=>e.length])&&(this._model.language=e.languageChoices.options[0].value):e.language.settings&&this._model.language?(this._configuration.language.enabled=!0,this._configuration.languageChoices.options&&this._configuration.languageChoices.options.length||(this._configuration.languageChoices.options=[]),this._configuration.languageChoices.options.find(e=>e.value===this._model.language)||this._configuration.languageChoices.options.push({value:this._model.language,label:this._model.language})):delete this._model.language,this._render()}set disableSidePanel(e){this._disableSidePanel=e,this._render()}dispatchModelUpdated(e){const t=!!e;this.dispatchEvent(new ia.ModelUpdatedEvent(this._model,t))}onModelChanged(e,t){this._model=pa.prepareModel(e),this._render(),this.dispatchModelUpdated(t)}onConfigurationChanged(e){this._configuration=e;const t=Xt([this,"access",e=>e._configuration,"optionalAccess",e=>e.responseAreaInputConfiguration,"optionalAccess",e=>e.inputConfiguration]);this._model={...this._model,responseAreaInputConfiguration:t},this.onModelChanged(this._model)}insertImage(e){this.dispatchEvent(new ia.InsertImageEvent(e))}onDeleteImage(e,t){this.dispatchEvent(new ia.DeleteImageEvent(e,t))}insertSound(e){this.dispatchEvent(new ia.InsertSoundEvent(e))}onDeleteSound(e,t){this.dispatchEvent(new ia.DeleteSoundEvent(e,t))}_render(){ca("_render");let e=aa.default.createElement(ra.default,{model:this._model,configuration:this._configuration,onModelChanged:this.onModelChanged,onConfigurationChanged:this.onConfigurationChanged,disableSidePanel:this._disableSidePanel,imageSupport:{add:this.insertImage.bind(this),delete:this.onDeleteImage.bind(this)},uploadSoundSupport:{add:this.insertSound.bind(this),delete:this.onDeleteSound.bind(this)}});this._root||(this._root=(0,oa.createRoot)(this)),this._root.render(e)}disconnectedCallback(){this._root&&this._root.unmount()}}ea=p.default=pa,(0,ta.default)(pa,"prepareModel",(e={})=>{const t={...da.default.model,...e},a=t.slateMarkup||(0,ua.createSlateMarkup)(t.markup,t.choices),o=(0,ua.processMarkup)(a);return t.choices&&Object.keys(t.choices).forEach(e=>{(0,la.default)(t.choices[e])&&(t.choices[e]=(t.choices[e]||[]).map((e,t)=>e.value?e:(ca('Choice does not contain "value" property, which is required.',e),{value:`${t}`,...e})))}),{...t,slateMarkup:a,markup:o}});export{ea as default};