@pie-element/categorize 11.3.4-next.3 → 12.0.0-beta.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.
- package/CHANGELOG.md +0 -11
- package/configure/CHANGELOG.md +0 -11
- package/configure/lib/__tests__/main.test.js +100 -0
- package/configure/lib/__tests__/utils.js +39 -0
- package/configure/lib/defaults.js +3 -6
- package/configure/lib/defaults.js.map +1 -1
- package/configure/lib/design/__tests__/builder.test.js +34 -0
- package/configure/lib/design/__tests__/buttons.test.js +36 -0
- package/configure/lib/design/__tests__/header.test.js +37 -0
- package/configure/lib/design/__tests__/index.test.js +125 -0
- package/configure/lib/design/__tests__/input-header.test.js +41 -0
- package/configure/lib/design/builder.js +16 -34
- package/configure/lib/design/builder.js.map +1 -1
- package/configure/lib/design/buttons.js +42 -96
- package/configure/lib/design/buttons.js.map +1 -1
- package/configure/lib/design/categories/RowLabel.js +34 -47
- package/configure/lib/design/categories/RowLabel.js.map +1 -1
- package/configure/lib/design/categories/__tests__/alternateResponses.test.js +93 -0
- package/configure/lib/design/categories/__tests__/category.test.js +65 -0
- package/configure/lib/design/categories/__tests__/choice-preview.test.js +52 -0
- package/configure/lib/design/categories/__tests__/droppable-placeholder.test.js +63 -0
- package/configure/lib/design/categories/__tests__/index.test.js +91 -0
- package/configure/lib/design/categories/alternateResponses.js +97 -252
- package/configure/lib/design/categories/alternateResponses.js.map +1 -1
- package/configure/lib/design/categories/category.js +136 -209
- package/configure/lib/design/categories/category.js.map +1 -1
- package/configure/lib/design/categories/choice-preview.js +62 -127
- package/configure/lib/design/categories/choice-preview.js.map +1 -1
- package/configure/lib/design/categories/droppable-placeholder.js +74 -166
- package/configure/lib/design/categories/droppable-placeholder.js.map +1 -1
- package/configure/lib/design/categories/index.js +196 -385
- package/configure/lib/design/categories/index.js.map +1 -1
- package/configure/lib/design/choices/__tests__/choice.test.js +62 -0
- package/configure/lib/design/choices/__tests__/config.test.js +66 -0
- package/configure/lib/design/choices/__tests__/index.test.js +70 -0
- package/configure/lib/design/choices/choice.js +156 -265
- package/configure/lib/design/choices/choice.js.map +1 -1
- package/configure/lib/design/choices/config.js +43 -99
- package/configure/lib/design/choices/config.js.map +1 -1
- package/configure/lib/design/choices/index.js +149 -237
- package/configure/lib/design/choices/index.js.map +1 -1
- package/configure/lib/design/header.js +58 -112
- package/configure/lib/design/header.js.map +1 -1
- package/configure/lib/design/index.js +633 -478
- package/configure/lib/design/index.js.map +1 -1
- package/configure/lib/design/input-header.js +95 -151
- package/configure/lib/design/input-header.js.map +1 -1
- package/configure/lib/design/utils.js +5 -16
- package/configure/lib/design/utils.js.map +1 -1
- package/configure/lib/index.js +121 -184
- package/configure/lib/index.js.map +1 -1
- package/configure/lib/main.js +31 -75
- package/configure/lib/main.js.map +1 -1
- package/configure/lib/utils.js +23 -33
- package/configure/lib/utils.js.map +1 -1
- package/configure/package.json +15 -15
- package/controller/CHANGELOG.md +0 -11
- package/controller/lib/__tests__/index.test.js +526 -0
- package/controller/lib/defaults.js +3 -6
- package/controller/lib/defaults.js.map +1 -1
- package/controller/lib/index.js +238 -319
- package/controller/lib/index.js.map +1 -1
- package/controller/lib/utils.js +29 -66
- package/controller/lib/utils.js.map +1 -1
- package/controller/package.json +5 -5
- package/docs/demo/.pie/.configure/package.json +10 -0
- package/docs/demo/.pie/.configure/yarn.lock +2181 -0
- package/docs/demo/.pie/.controllers/package.json +10 -0
- package/docs/demo/.pie/.controllers/yarn.lock +110 -0
- package/docs/demo/.pie/info.entry.js +89 -0
- package/docs/demo/.pie/info.webpack.config.js +119 -0
- package/docs/demo/.pie/package.json +10 -0
- package/docs/demo/.pie/yarn.lock +2190 -0
- package/docs/demo/pie.manifest.json +11 -0
- package/lib/__tests__/index.test.js +197 -0
- package/lib/categorize/__tests__/categories.test.js +138 -0
- package/lib/categorize/__tests__/category.test.js +137 -0
- package/lib/categorize/__tests__/choice.test.js +88 -0
- package/lib/categorize/__tests__/choices.test.js +118 -0
- package/lib/categorize/__tests__/droppable-placeholder.test.js +96 -0
- package/lib/categorize/__tests__/grid-content.test.js +48 -0
- package/lib/categorize/__tests__/index.test.js +152 -0
- package/lib/categorize/categories.js +107 -165
- package/lib/categorize/categories.js.map +1 -1
- package/lib/categorize/category.js +74 -124
- package/lib/categorize/category.js.map +1 -1
- package/lib/categorize/choice.js +119 -246
- package/lib/categorize/choice.js.map +1 -1
- package/lib/categorize/choices.js +67 -132
- package/lib/categorize/choices.js.map +1 -1
- package/lib/categorize/droppable-placeholder.js +47 -104
- package/lib/categorize/droppable-placeholder.js.map +1 -1
- package/lib/categorize/grid-content.js +40 -88
- package/lib/categorize/grid-content.js.map +1 -1
- package/lib/categorize/index.js +342 -318
- package/lib/categorize/index.js.map +1 -1
- package/lib/index.js +286 -307
- package/lib/index.js.map +1 -1
- package/package.json +16 -14
- package/esm/configure.js +0 -34401
- package/esm/configure.js.map +0 -1
- package/esm/controller.js +0 -1468
- package/esm/controller.js.map +0 -1
- package/esm/element.js +0 -13134
- package/esm/element.js.map +0 -1
- package/esm/package.json +0 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.js"],"names":["translator","Translator","getPartialScore","correctResponse","builtCategories","reduce","acc","choices","placements","length","score","filter","ch","correct","maxScore","extraPlacements","totalScore","parseFloat","toFixed","getAlternates","map","c","alternateResponses","alternate","getTotalScore","question","session","env","Object","keys","categories","answers","alternates","enabled","partialScoring","getCorrectness","Promise","resolve","mode","undefined","createDefaultModel","model","defaults","normalize","updateSession","normalizedQuestion","answerCorrectness","role","categoriesPerRow","choicesLabel","choicesPosition","feedback","feedbackEnabled","promptEnabled","prompt","rowLabels","rationaleEnabled","rationale","teacherInstructionsEnabled","teacherInstructions","language","maxChoicesPerCategory","extraCSSRules","minRowHeight","fontSizeFactor","autoplayAudioEnabled","completeAudioEnabled","customAudioButton","note","lockChoiceOrder","filteredCorrectResponse","response","filteredChoices","choice","fb","t","lng","allowAlternateEnabled","responseAreasToBeFilled","possibleResponses","hasUnplacedChoices","out","correctness","disabled","showNote","outcome","reject","Error","empty","createCorrectResponseSession","id","getInnerText","html","replaceAll","getContent","replace","validate","config","maxAnswerChoices","minChoices","minCategories","maxCategories","maxLengthPerChoice","maxLengthPerCategory","reversedChoices","reverse","errors","choicesErrors","categoriesErrors","forEach","field","required","category","label","index","content","identicalAnswer","slice","some","nbOfCategories","nbOfChoices","categoriesError","choicesError","hasAssociations","duplicateAlternateIndex","duplicateCategory","duplicateAlternate","associationError"],"mappings":"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","sourcesContent":["import isEmpty from 'lodash/isEmpty';\nimport { buildState, score } from '@pie-lib/categorize';\nimport { getFeedbackForCorrectness } from '@pie-lib/feedback';\nimport { lockChoices, getShuffledChoices, partialScoring } from '@pie-lib/controller-utils';\nimport Translator from '@pie-lib/translator';\n\nconst { translator } = Translator;\nimport defaults from './defaults';\nimport { getCompleteResponseDetails, isAlternateDuplicated, isCorrectResponseDuplicated } from './utils';\n\n// eslint-disable-next-line no-console\n\nexport { score };\n\nexport const getPartialScore = (correctResponse, builtCategories) => {\n // in the resulted best scenario we make a sum with all the correct responses\n // and all the placements\n const { placements, score } = builtCategories.reduce(\n (acc, { choices = [] }) => ({\n placements: acc.placements + choices.length,\n score: acc.score + choices.filter((ch) => ch.correct).length,\n }),\n { placements: 0, score: 0 },\n );\n\n // in the correct response, we make a sum of the max possible score\n const { maxScore } = correctResponse.reduce(\n (acc, { choices }) => ({\n maxScore: acc.maxScore + choices.length,\n }),\n { maxScore: 0 },\n );\n\n // if there are any extra placements, we subtract from the obtained score\n const extraPlacements = placements > maxScore ? placements - maxScore : 0;\n const totalScore = (score - extraPlacements) / maxScore;\n\n return totalScore < 0 ? 0 : parseFloat(totalScore.toFixed(2));\n};\n\nconst getAlternates = (correctResponse) =>\n correctResponse.map((c) => c.alternateResponses).filter((alternate) => alternate);\n\nexport const getTotalScore = (question, session, env) => {\n if (!session) {\n return 0;\n }\n\n if (Object.keys(session).length === 0) {\n return 0;\n }\n const { categories, choices } = question || {};\n let { correctResponse } = question || {};\n let { answers } = session || {};\n answers = answers || [];\n correctResponse = correctResponse || [];\n\n // this function is used in pie-ui/categorize as well, in order to get the best scenario\n // so we get the best scenario and calculate the score\n const { categories: builtCategories, correct } = buildState(categories, choices, answers, correctResponse);\n\n const alternates = getAlternates(correctResponse);\n const enabled = partialScoring.enabled(question, env);\n\n // if there are any alternates, there will be no partial scoring!\n if (enabled && !alternates.length) {\n // we apply partial scoring\n return getPartialScore(correctResponse, builtCategories);\n }\n\n // else we apply dichotomous\n return correct ? 1 : 0;\n};\n\nexport const getCorrectness = (question, session, env) => {\n return new Promise((resolve) => {\n if (env.mode === 'evaluate') {\n const score = getTotalScore(question, session, env);\n if (score === 1) {\n resolve('correct');\n } else if (score === 0) {\n resolve('incorrect');\n } else {\n resolve('partially-correct');\n }\n } else {\n resolve(undefined);\n }\n });\n};\n\nexport const createDefaultModel = (model = {}) =>\n new Promise((resolve) => {\n resolve({\n ...defaults,\n ...model,\n });\n });\n\nexport const normalize = (question) => ({ ...defaults, ...question });\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n * @param {*} updateSession - optional - a function that will set the properties passed into it on the session.\n */\nexport const model = (question, session, env, updateSession) =>\n new Promise(async (resolve) => {\n const normalizedQuestion = normalize(question);\n const answerCorrectness = await getCorrectness(normalizedQuestion, session, env);\n\n const { mode, role } = env || {};\n\n const {\n categories,\n categoriesPerRow,\n choicesLabel,\n choicesPosition,\n correctResponse,\n feedback,\n feedbackEnabled,\n promptEnabled,\n prompt,\n rowLabels,\n rationaleEnabled,\n rationale,\n teacherInstructionsEnabled,\n teacherInstructions,\n language,\n maxChoicesPerCategory,\n extraCSSRules,\n minRowHeight,\n fontSizeFactor,\n autoplayAudioEnabled,\n completeAudioEnabled,\n customAudioButton,\n } = normalizedQuestion;\n let { choices, note } = normalizedQuestion;\n let fb;\n\n const lockChoiceOrder = lockChoices(normalizedQuestion, session, env);\n\n const filteredCorrectResponse = correctResponse.map((response) => {\n const filteredChoices = (response.choices || []).filter((choice) => choice !== 'null');\n return { ...response, choices: filteredChoices };\n });\n\n if (mode === 'evaluate' && feedbackEnabled) {\n fb = await getFeedbackForCorrectness(answerCorrectness, feedback);\n }\n\n if (!lockChoiceOrder) {\n choices = await getShuffledChoices(choices, session, updateSession, 'id');\n }\n\n if (!note) {\n note = translator.t('common:commonCorrectAnswerWithAlternates', { lng: language });\n }\n\n const alternates = getAlternates(filteredCorrectResponse);\n const { responseAreasToBeFilled, possibleResponses, hasUnplacedChoices } = getCompleteResponseDetails(\n filteredCorrectResponse,\n normalizedQuestion.allowAlternateEnabled ? alternates : [],\n normalizedQuestion.choices,\n );\n const out = {\n categories: categories || [],\n categoriesPerRow: categoriesPerRow || 2,\n maxChoicesPerCategory,\n correctness: answerCorrectness,\n choices: choices || [],\n choicesLabel: choicesLabel || '',\n choicesPosition,\n disabled: mode !== 'gather',\n feedback: fb,\n lockChoiceOrder,\n prompt: promptEnabled ? prompt : null,\n rowLabels,\n note,\n env,\n showNote: alternates && alternates.length > 0,\n correctResponse: mode === 'evaluate' ? filteredCorrectResponse : undefined,\n language,\n extraCSSRules,\n fontSizeFactor,\n minRowHeight: minRowHeight,\n autoplayAudioEnabled,\n completeAudioEnabled,\n customAudioButton,\n possibleResponses,\n responseAreasToBeFilled,\n hasUnplacedChoices,\n };\n\n if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {\n out.rationale = rationaleEnabled ? rationale : null;\n out.teacherInstructions = teacherInstructionsEnabled ? teacherInstructions : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n resolve(out);\n });\n\nexport const outcome = (question, session, env) => {\n if (env.mode !== 'evaluate') {\n return Promise.reject(new Error('Can not call outcome when mode is not evaluate'));\n } else {\n return new Promise((resolve) => {\n resolve({\n score: getTotalScore(question, session, env),\n empty: !session || isEmpty(session),\n });\n });\n }\n};\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n const { mode, role } = env || {};\n\n if (mode !== 'evaluate' && role === 'instructor') {\n const { correctResponse } = question;\n\n resolve({ answers: correctResponse, id: 1 });\n } else {\n return resolve(null);\n }\n });\n};\n\n// remove all html tags\nconst getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');\n\n// remove all html tags except img, iframe and source tag for audio\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const { categories, choices, correctResponse, maxAnswerChoices } = model;\n const {\n minChoices = 1,\n minCategories = 1,\n maxCategories = 12,\n maxLengthPerChoice = 300,\n maxLengthPerCategory = 150,\n } = config;\n const reversedChoices = [...(choices || [])].reverse();\n const errors = {};\n const choicesErrors = {};\n const categoriesErrors = {};\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 (categories || []).forEach((category) => {\n const { id, label } = category;\n\n if (getInnerText(label).length > maxLengthPerCategory) {\n categoriesErrors[id] = `Category labels should be no more than ${maxLengthPerCategory} characters long.`;\n }\n });\n\n (reversedChoices || []).forEach((choice, index) => {\n const { id, content } = choice;\n\n if (getInnerText(content).length > maxLengthPerChoice) {\n choicesErrors[id] = `Tokens should be no more than ${maxLengthPerChoice} characters long.`;\n }\n\n if (!getContent(content)) {\n choicesErrors[id] = 'Tokens should not be empty.';\n } else {\n const identicalAnswer = reversedChoices.slice(index + 1).some((c) => c.content === content);\n\n if (identicalAnswer) {\n choicesErrors[id] = 'Tokens content should be unique.';\n }\n }\n });\n\n const nbOfCategories = (categories || []).length;\n const nbOfChoices = (choices || []).length;\n\n if (nbOfCategories > maxCategories) {\n errors.categoriesError = `No more than ${maxCategories} categories should be defined.`;\n } else if (nbOfCategories < minCategories) {\n errors.categoriesError = `There should be at least ${minCategories} category defined.`;\n }\n\n if (nbOfChoices < minChoices) {\n errors.choicesError = `There should be at least ${minChoices} choices defined.`;\n } else if (nbOfChoices > maxAnswerChoices) {\n errors.choicesError = `No more than ${maxAnswerChoices} choices should be defined.`;\n }\n\n if (nbOfChoices && nbOfCategories) {\n let hasAssociations = false;\n\n (correctResponse || []).forEach((response) => {\n const { choices = [], alternateResponses = [] } = response;\n\n if (choices.length) {\n hasAssociations = true;\n } else {\n alternateResponses.forEach((alternate) => {\n if ((alternate || []).length) {\n hasAssociations = true;\n }\n });\n }\n });\n\n let duplicateAlternateIndex = -1;\n let duplicateCategory = '';\n (correctResponse || []).forEach((response) => {\n const { choices = [], alternateResponses = [], category } = response;\n\n if (duplicateAlternateIndex === -1) {\n duplicateAlternateIndex = isCorrectResponseDuplicated(choices, alternateResponses);\n\n if (duplicateAlternateIndex === -1) {\n duplicateAlternateIndex = isAlternateDuplicated(alternateResponses);\n }\n\n duplicateCategory = category;\n }\n });\n\n if (duplicateAlternateIndex > -1) {\n errors.duplicateAlternate = { index: duplicateAlternateIndex, category: duplicateCategory };\n }\n\n if (!hasAssociations) {\n errors.associationError = 'At least one token should be assigned to at least one category.';\n }\n }\n\n if (!isEmpty(choicesErrors)) {\n errors.choicesErrors = choicesErrors;\n }\n\n if (!isEmpty(categoriesErrors)) {\n errors.categoriesErrors = categoriesErrors;\n }\n\n return errors;\n};\n"],"file":"index.js"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["_isEmpty","_interopRequireDefault","require","_categorize","_feedback","_controllerUtils","_translator","_defaults","_utils","translator","Translator","getPartialScore","correctResponse","builtCategories","placements","score","reduce","acc","choices","length","filter","ch","correct","maxScore","extraPlacements","totalScore","parseFloat","toFixed","exports","getAlternates","map","c","alternateResponses","alternate","getTotalScore","question","session","env","Object","keys","categories","answers","buildState","alternates","enabled","partialScoring","getCorrectness","Promise","resolve","mode","undefined","createDefaultModel","model","defaults","normalize","updateSession","normalizedQuestion","answerCorrectness","role","categoriesPerRow","choicesLabel","choicesPosition","feedback","feedbackEnabled","promptEnabled","prompt","rowLabels","rationaleEnabled","rationale","teacherInstructionsEnabled","teacherInstructions","language","maxChoicesPerCategory","extraCSSRules","minRowHeight","fontSizeFactor","autoplayAudioEnabled","completeAudioEnabled","customAudioButton","note","fb","lockChoiceOrder","lockChoices","filteredCorrectResponse","response","filteredChoices","choice","getFeedbackForCorrectness","getShuffledChoices","t","lng","responseAreasToBeFilled","possibleResponses","hasUnplacedChoices","getCompleteResponseDetails","allowAlternateEnabled","out","correctness","disabled","showNote","outcome","reject","Error","empty","isEmpty","createCorrectResponseSession","id","getInnerText","html","replaceAll","getContent","replace","validate","config","maxAnswerChoices","minChoices","minCategories","maxCategories","maxLengthPerChoice","maxLengthPerCategory","reversedChoices","reverse","errors","choicesErrors","categoriesErrors","forEach","field","required","category","label","index","content","identicalAnswer","slice","some","nbOfCategories","nbOfChoices","categoriesError","choicesError","hasAssociations","duplicateAlternateIndex","duplicateCategory","isCorrectResponseDuplicated","isAlternateDuplicated","duplicateAlternate","associationError"],"sources":["../src/index.js"],"sourcesContent":["import isEmpty from 'lodash/isEmpty';\nimport { buildState, score } from '@pie-lib/categorize';\nimport { getFeedbackForCorrectness } from '@pie-lib/feedback';\nimport { lockChoices, getShuffledChoices, partialScoring } from '@pie-lib/controller-utils';\nimport Translator from '@pie-lib/translator';\n\nconst { translator } = Translator;\nimport defaults from './defaults';\nimport { getCompleteResponseDetails, isAlternateDuplicated, isCorrectResponseDuplicated } from './utils';\n\n// eslint-disable-next-line no-console\n\nexport { score };\n\nexport const getPartialScore = (correctResponse, builtCategories) => {\n // in the resulted best scenario we make a sum with all the correct responses\n // and all the placements\n const { placements, score } = builtCategories.reduce(\n (acc, { choices = [] }) => ({\n placements: acc.placements + choices.length,\n score: acc.score + choices.filter((ch) => ch.correct).length,\n }),\n { placements: 0, score: 0 },\n );\n\n // in the correct response, we make a sum of the max possible score\n const { maxScore } = correctResponse.reduce(\n (acc, { choices }) => ({\n maxScore: acc.maxScore + choices.length,\n }),\n { maxScore: 0 },\n );\n\n // if there are any extra placements, we subtract from the obtained score\n const extraPlacements = placements > maxScore ? placements - maxScore : 0;\n const totalScore = (score - extraPlacements) / maxScore;\n\n return totalScore < 0 ? 0 : parseFloat(totalScore.toFixed(2));\n};\n\nconst getAlternates = (correctResponse) =>\n correctResponse.map((c) => c.alternateResponses).filter((alternate) => alternate);\n\nexport const getTotalScore = (question, session, env) => {\n if (!session) {\n return 0;\n }\n\n if (Object.keys(session).length === 0) {\n return 0;\n }\n const { categories, choices } = question || {};\n let { correctResponse } = question || {};\n let { answers } = session || {};\n answers = answers || [];\n correctResponse = correctResponse || [];\n\n // this function is used in pie-ui/categorize as well, in order to get the best scenario\n // so we get the best scenario and calculate the score\n const { categories: builtCategories, correct } = buildState(categories, choices, answers, correctResponse);\n\n const alternates = getAlternates(correctResponse);\n const enabled = partialScoring.enabled(question, env);\n\n // if there are any alternates, there will be no partial scoring!\n if (enabled && !alternates.length) {\n // we apply partial scoring\n return getPartialScore(correctResponse, builtCategories);\n }\n\n // else we apply dichotomous\n return correct ? 1 : 0;\n};\n\nexport const getCorrectness = (question, session, env) => {\n return new Promise((resolve) => {\n if (env.mode === 'evaluate') {\n const score = getTotalScore(question, session, env);\n if (score === 1) {\n resolve('correct');\n } else if (score === 0) {\n resolve('incorrect');\n } else {\n resolve('partially-correct');\n }\n } else {\n resolve(undefined);\n }\n });\n};\n\nexport const createDefaultModel = (model = {}) =>\n new Promise((resolve) => {\n resolve({\n ...defaults,\n ...model,\n });\n });\n\nexport const normalize = (question) => ({ ...defaults, ...question });\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n * @param {*} updateSession - optional - a function that will set the properties passed into it on the session.\n */\nexport const model = async (question, session, env, updateSession) => {\n const normalizedQuestion = normalize(question);\n const answerCorrectness = await getCorrectness(normalizedQuestion, session, env);\n\n const { mode, role } = env || {};\n\n const {\n categories,\n categoriesPerRow,\n choicesLabel,\n choicesPosition,\n correctResponse,\n feedback,\n feedbackEnabled,\n promptEnabled,\n prompt,\n rowLabels,\n rationaleEnabled,\n rationale,\n teacherInstructionsEnabled,\n teacherInstructions,\n language,\n maxChoicesPerCategory,\n extraCSSRules,\n minRowHeight,\n fontSizeFactor,\n autoplayAudioEnabled,\n completeAudioEnabled,\n customAudioButton,\n } = normalizedQuestion;\n let { choices, note } = normalizedQuestion;\n let fb;\n\n const lockChoiceOrder = lockChoices(normalizedQuestion, session, env);\n\n const filteredCorrectResponse = correctResponse.map((response) => {\n const filteredChoices = (response.choices || []).filter((choice) => choice !== 'null');\n return { ...response, choices: filteredChoices };\n });\n\n if (mode === 'evaluate' && feedbackEnabled) {\n fb = await getFeedbackForCorrectness(answerCorrectness, feedback);\n }\n\n if (!lockChoiceOrder) {\n choices = await getShuffledChoices(choices, session, updateSession, 'id');\n }\n\n if (!note) {\n note = translator.t('common:commonCorrectAnswerWithAlternates', { lng: language });\n }\n\n const alternates = getAlternates(filteredCorrectResponse);\n const { responseAreasToBeFilled, possibleResponses, hasUnplacedChoices } = getCompleteResponseDetails(\n filteredCorrectResponse,\n normalizedQuestion.allowAlternateEnabled ? alternates : [],\n normalizedQuestion.choices,\n );\n const out = {\n categories: categories || [],\n categoriesPerRow: categoriesPerRow || 2,\n maxChoicesPerCategory,\n correctness: answerCorrectness,\n choices: choices || [],\n choicesLabel: choicesLabel || '',\n choicesPosition,\n disabled: mode !== 'gather',\n feedback: fb,\n lockChoiceOrder,\n prompt: promptEnabled ? prompt : null,\n rowLabels,\n note,\n env,\n showNote: alternates && alternates.length > 0,\n correctResponse: mode === 'evaluate' ? filteredCorrectResponse : undefined,\n language,\n extraCSSRules,\n fontSizeFactor,\n minRowHeight: minRowHeight,\n autoplayAudioEnabled,\n completeAudioEnabled,\n customAudioButton,\n possibleResponses,\n responseAreasToBeFilled,\n hasUnplacedChoices,\n };\n\n if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {\n out.rationale = rationaleEnabled ? rationale : null;\n out.teacherInstructions = teacherInstructionsEnabled ? teacherInstructions : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n return out;\n};\n\nexport const outcome = (question, session, env) => {\n if (env.mode !== 'evaluate') {\n return Promise.reject(new Error('Can not call outcome when mode is not evaluate'));\n } else {\n return new Promise((resolve) => {\n resolve({\n score: getTotalScore(question, session, env),\n empty: !session || isEmpty(session),\n });\n });\n }\n};\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n const { mode, role } = env || {};\n\n if (mode !== 'evaluate' && role === 'instructor') {\n const { correctResponse } = question;\n\n resolve({ answers: correctResponse, id: 1 });\n } else {\n return resolve(null);\n }\n });\n};\n\n// remove all html tags\nconst getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');\n\n// remove all html tags except img, iframe and source tag for audio\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const { categories, choices, correctResponse, maxAnswerChoices } = model;\n const {\n minChoices = 1,\n minCategories = 1,\n maxCategories = 12,\n maxLengthPerChoice = 300,\n maxLengthPerCategory = 150,\n } = config;\n const reversedChoices = [...(choices || [])].reverse();\n const errors = {};\n const choicesErrors = {};\n const categoriesErrors = {};\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 (categories || []).forEach((category) => {\n const { id, label } = category;\n\n if (getInnerText(label).length > maxLengthPerCategory) {\n categoriesErrors[id] = `Category labels should be no more than ${maxLengthPerCategory} characters long.`;\n }\n });\n\n (reversedChoices || []).forEach((choice, index) => {\n const { id, content } = choice;\n\n if (getInnerText(content).length > maxLengthPerChoice) {\n choicesErrors[id] = `Tokens should be no more than ${maxLengthPerChoice} characters long.`;\n }\n\n if (!getContent(content)) {\n choicesErrors[id] = 'Tokens should not be empty.';\n } else {\n const identicalAnswer = reversedChoices.slice(index + 1).some((c) => c.content === content);\n\n if (identicalAnswer) {\n choicesErrors[id] = 'Tokens content should be unique.';\n }\n }\n });\n\n const nbOfCategories = (categories || []).length;\n const nbOfChoices = (choices || []).length;\n\n if (nbOfCategories > maxCategories) {\n errors.categoriesError = `No more than ${maxCategories} categories should be defined.`;\n } else if (nbOfCategories < minCategories) {\n errors.categoriesError = `There should be at least ${minCategories} category defined.`;\n }\n\n if (nbOfChoices < minChoices) {\n errors.choicesError = `There should be at least ${minChoices} choices defined.`;\n } else if (nbOfChoices > maxAnswerChoices) {\n errors.choicesError = `No more than ${maxAnswerChoices} choices should be defined.`;\n }\n\n if (nbOfChoices && nbOfCategories) {\n let hasAssociations = false;\n\n (correctResponse || []).forEach((response) => {\n const { choices = [], alternateResponses = [] } = response;\n\n if (choices.length) {\n hasAssociations = true;\n } else {\n alternateResponses.forEach((alternate) => {\n if ((alternate || []).length) {\n hasAssociations = true;\n }\n });\n }\n });\n\n let duplicateAlternateIndex = -1;\n let duplicateCategory = '';\n (correctResponse || []).forEach((response) => {\n const { choices = [], alternateResponses = [], category } = response;\n\n if (duplicateAlternateIndex === -1) {\n duplicateAlternateIndex = isCorrectResponseDuplicated(choices, alternateResponses);\n\n if (duplicateAlternateIndex === -1) {\n duplicateAlternateIndex = isAlternateDuplicated(alternateResponses);\n }\n\n duplicateCategory = category;\n }\n });\n\n if (duplicateAlternateIndex > -1) {\n errors.duplicateAlternate = { index: duplicateAlternateIndex, category: duplicateCategory };\n }\n\n if (!hasAssociations) {\n errors.associationError = 'At least one token should be assigned to at least one category.';\n }\n }\n\n if (!isEmpty(choicesErrors)) {\n errors.choicesErrors = choicesErrors;\n }\n\n if (!isEmpty(categoriesErrors)) {\n errors.categoriesErrors = categoriesErrors;\n }\n\n return errors;\n};\n"],"mappings":"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","ignoreList":[]}
|
package/controller/lib/utils.js
CHANGED
|
@@ -1,106 +1,69 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
3
|
Object.defineProperty(exports, "__esModule", {
|
|
6
4
|
value: true
|
|
7
5
|
});
|
|
8
6
|
exports.multiplePlacements = exports.isCorrectResponseDuplicated = exports.isAlternateDuplicated = exports.getCompleteResponseDetails = void 0;
|
|
9
|
-
|
|
10
|
-
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
11
|
-
|
|
12
7
|
// used in configure too, for consistency modify it there too
|
|
13
|
-
|
|
8
|
+
const multiplePlacements = exports.multiplePlacements = {
|
|
14
9
|
enabled: 'Yes',
|
|
15
10
|
disabled: 'No',
|
|
16
11
|
perChoice: 'Set Per Choice'
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
exports.multiplePlacements = multiplePlacements;
|
|
12
|
+
};
|
|
20
13
|
|
|
21
|
-
|
|
14
|
+
// used to validate the config
|
|
15
|
+
const isCorrectResponseDuplicated = (choices, alternate) => {
|
|
22
16
|
if (choices.length < 1 || alternate.length < 1) {
|
|
23
17
|
return -1;
|
|
24
18
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
return current.length > 0 ? [].concat((0, _toConsumableArray2["default"])(total), [JSON.stringify(current.sort())]) : total;
|
|
29
|
-
}, []);
|
|
30
|
-
var foundIndexDuplicate = stringAlternate.findIndex(function (alternate) {
|
|
31
|
-
return alternate.length && alternate === stringChoices;
|
|
32
|
-
});
|
|
19
|
+
const stringChoices = JSON.stringify(choices.sort());
|
|
20
|
+
const stringAlternate = alternate.reduce((total, current) => current.length > 0 ? [...total, JSON.stringify(current.sort())] : total, []);
|
|
21
|
+
const foundIndexDuplicate = stringAlternate.findIndex(alternate => alternate.length && alternate === stringChoices);
|
|
33
22
|
return foundIndexDuplicate;
|
|
34
23
|
};
|
|
35
|
-
|
|
36
24
|
exports.isCorrectResponseDuplicated = isCorrectResponseDuplicated;
|
|
37
|
-
|
|
38
|
-
var isAlternateDuplicated = function isAlternateDuplicated(alternate) {
|
|
25
|
+
const isAlternateDuplicated = alternate => {
|
|
39
26
|
if (alternate.length <= 1) {
|
|
40
27
|
return -1;
|
|
41
28
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
return current.length > 0 ? [].concat((0, _toConsumableArray2["default"])(total), [JSON.stringify(current.sort())]) : total;
|
|
46
|
-
}, []);
|
|
47
|
-
|
|
48
|
-
for (var i = 0; i < stringAlternate.length; i++) {
|
|
29
|
+
const elementSet = new Set();
|
|
30
|
+
const stringAlternate = alternate.reduce((total, current) => current.length > 0 ? [...total, JSON.stringify(current.sort())] : total, []);
|
|
31
|
+
for (let i = 0; i < stringAlternate.length; i++) {
|
|
49
32
|
if (elementSet.has(stringAlternate[i]) && stringAlternate[i]) {
|
|
50
33
|
return i;
|
|
51
34
|
}
|
|
52
|
-
|
|
53
35
|
elementSet.add(stringAlternate[i]);
|
|
54
36
|
}
|
|
55
|
-
|
|
56
37
|
return -1;
|
|
57
|
-
};
|
|
58
|
-
// and create an array with the possible responses ids
|
|
59
|
-
|
|
38
|
+
};
|
|
60
39
|
|
|
40
|
+
// calculate the minimum number of populated response areas (categories) in the correct answer or alternates
|
|
41
|
+
// and create an array with the possible responses ids
|
|
61
42
|
exports.isAlternateDuplicated = isAlternateDuplicated;
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
});
|
|
67
|
-
var possibleResponses = [choicesPerCategory.flat()];
|
|
68
|
-
var responseAreasToBeFilled = choicesPerCategory.filter(function (choices) {
|
|
69
|
-
return choices.length;
|
|
70
|
-
}).length;
|
|
71
|
-
|
|
43
|
+
const getCompleteResponseDetails = (correctResponse, alternates, allChoices) => {
|
|
44
|
+
const choicesPerCategory = correctResponse.map(category => category.choices);
|
|
45
|
+
const possibleResponses = [choicesPerCategory.flat()];
|
|
46
|
+
let responseAreasToBeFilled = choicesPerCategory.filter(choices => choices.length).length;
|
|
72
47
|
if (alternates.length) {
|
|
73
|
-
|
|
48
|
+
const alternatesPerChoice = alternates[0]?.length || 0; // number of alternates
|
|
74
49
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
var alternatesPerResponse = alternates.map(function (alternate) {
|
|
79
|
-
return alternate[index];
|
|
80
|
-
});
|
|
81
|
-
var filledCategories = alternatesPerResponse.filter(function (category) {
|
|
82
|
-
return category === null || category === void 0 ? void 0 : category.length;
|
|
83
|
-
}).length;
|
|
50
|
+
[...Array(alternatesPerChoice).keys()].forEach(index => {
|
|
51
|
+
const alternatesPerResponse = alternates.map(alternate => alternate[index]);
|
|
52
|
+
const filledCategories = alternatesPerResponse.filter(category => category?.length).length;
|
|
84
53
|
possibleResponses.push(alternatesPerResponse.flat());
|
|
85
|
-
|
|
86
54
|
if (filledCategories < responseAreasToBeFilled) {
|
|
87
55
|
responseAreasToBeFilled = filledCategories;
|
|
88
56
|
}
|
|
89
57
|
});
|
|
90
|
-
}
|
|
91
|
-
|
|
58
|
+
}
|
|
92
59
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
return response.includes(val === null || val === void 0 ? void 0 : val.id);
|
|
96
|
-
});
|
|
97
|
-
});
|
|
60
|
+
// check if any correct answer have any unplaced answer choices
|
|
61
|
+
const hasUnplacedChoices = possibleResponses.some(response => !allChoices.every(val => response.includes(val?.id)));
|
|
98
62
|
return {
|
|
99
|
-
responseAreasToBeFilled
|
|
100
|
-
possibleResponses
|
|
101
|
-
hasUnplacedChoices
|
|
63
|
+
responseAreasToBeFilled,
|
|
64
|
+
possibleResponses,
|
|
65
|
+
hasUnplacedChoices
|
|
102
66
|
};
|
|
103
67
|
};
|
|
104
|
-
|
|
105
68
|
exports.getCompleteResponseDetails = getCompleteResponseDetails;
|
|
106
|
-
//# sourceMappingURL=
|
|
69
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJtdWx0aXBsZVBsYWNlbWVudHMiLCJleHBvcnRzIiwiZW5hYmxlZCIsImRpc2FibGVkIiwicGVyQ2hvaWNlIiwiaXNDb3JyZWN0UmVzcG9uc2VEdXBsaWNhdGVkIiwiY2hvaWNlcyIsImFsdGVybmF0ZSIsImxlbmd0aCIsInN0cmluZ0Nob2ljZXMiLCJKU09OIiwic3RyaW5naWZ5Iiwic29ydCIsInN0cmluZ0FsdGVybmF0ZSIsInJlZHVjZSIsInRvdGFsIiwiY3VycmVudCIsImZvdW5kSW5kZXhEdXBsaWNhdGUiLCJmaW5kSW5kZXgiLCJpc0FsdGVybmF0ZUR1cGxpY2F0ZWQiLCJlbGVtZW50U2V0IiwiU2V0IiwiaSIsImhhcyIsImFkZCIsImdldENvbXBsZXRlUmVzcG9uc2VEZXRhaWxzIiwiY29ycmVjdFJlc3BvbnNlIiwiYWx0ZXJuYXRlcyIsImFsbENob2ljZXMiLCJjaG9pY2VzUGVyQ2F0ZWdvcnkiLCJtYXAiLCJjYXRlZ29yeSIsInBvc3NpYmxlUmVzcG9uc2VzIiwiZmxhdCIsInJlc3BvbnNlQXJlYXNUb0JlRmlsbGVkIiwiZmlsdGVyIiwiYWx0ZXJuYXRlc1BlckNob2ljZSIsIkFycmF5Iiwia2V5cyIsImZvckVhY2giLCJpbmRleCIsImFsdGVybmF0ZXNQZXJSZXNwb25zZSIsImZpbGxlZENhdGVnb3JpZXMiLCJwdXNoIiwiaGFzVW5wbGFjZWRDaG9pY2VzIiwic29tZSIsInJlc3BvbnNlIiwiZXZlcnkiLCJ2YWwiLCJpbmNsdWRlcyIsImlkIl0sInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHVzZWQgaW4gY29uZmlndXJlIHRvbywgZm9yIGNvbnNpc3RlbmN5IG1vZGlmeSBpdCB0aGVyZSB0b29cbmV4cG9ydCBjb25zdCBtdWx0aXBsZVBsYWNlbWVudHMgPSB7IGVuYWJsZWQ6ICdZZXMnLCBkaXNhYmxlZDogJ05vJywgcGVyQ2hvaWNlOiAnU2V0IFBlciBDaG9pY2UnIH07XG5cbi8vIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGNvbmZpZ1xuZXhwb3J0IGNvbnN0IGlzQ29ycmVjdFJlc3BvbnNlRHVwbGljYXRlZCA9IChjaG9pY2VzLCBhbHRlcm5hdGUpID0+IHtcbiAgaWYgKGNob2ljZXMubGVuZ3RoIDwgMSB8fCBhbHRlcm5hdGUubGVuZ3RoIDwgMSkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIGNvbnN0IHN0cmluZ0Nob2ljZXMgPSBKU09OLnN0cmluZ2lmeShjaG9pY2VzLnNvcnQoKSk7XG4gIGNvbnN0IHN0cmluZ0FsdGVybmF0ZSA9IGFsdGVybmF0ZS5yZWR1Y2UoXG4gICAgKHRvdGFsLCBjdXJyZW50KSA9PiAoY3VycmVudC5sZW5ndGggPiAwID8gWy4uLnRvdGFsLCBKU09OLnN0cmluZ2lmeShjdXJyZW50LnNvcnQoKSldIDogdG90YWwpLFxuICAgIFtdLFxuICApO1xuICBjb25zdCBmb3VuZEluZGV4RHVwbGljYXRlID0gc3RyaW5nQWx0ZXJuYXRlLmZpbmRJbmRleCgoYWx0ZXJuYXRlKSA9PiBhbHRlcm5hdGUubGVuZ3RoICYmIGFsdGVybmF0ZSA9PT0gc3RyaW5nQ2hvaWNlcyk7XG5cbiAgcmV0dXJuIGZvdW5kSW5kZXhEdXBsaWNhdGU7XG59O1xuXG5leHBvcnQgY29uc3QgaXNBbHRlcm5hdGVEdXBsaWNhdGVkID0gKGFsdGVybmF0ZSkgPT4ge1xuICBpZiAoYWx0ZXJuYXRlLmxlbmd0aCA8PSAxKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgY29uc3QgZWxlbWVudFNldCA9IG5ldyBTZXQoKTtcbiAgY29uc3Qgc3RyaW5nQWx0ZXJuYXRlID0gYWx0ZXJuYXRlLnJlZHVjZShcbiAgICAodG90YWwsIGN1cnJlbnQpID0+IChjdXJyZW50Lmxlbmd0aCA+IDAgPyBbLi4udG90YWwsIEpTT04uc3RyaW5naWZ5KGN1cnJlbnQuc29ydCgpKV0gOiB0b3RhbCksXG4gICAgW10sXG4gICk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHJpbmdBbHRlcm5hdGUubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZWxlbWVudFNldC5oYXMoc3RyaW5nQWx0ZXJuYXRlW2ldKSAmJiBzdHJpbmdBbHRlcm5hdGVbaV0pIHtcbiAgICAgIHJldHVybiBpO1xuICAgIH1cblxuICAgIGVsZW1lbnRTZXQuYWRkKHN0cmluZ0FsdGVybmF0ZVtpXSk7XG4gIH1cblxuICByZXR1cm4gLTE7XG59O1xuXG4vLyBjYWxjdWxhdGUgdGhlIG1pbmltdW0gbnVtYmVyIG9mIHBvcHVsYXRlZCByZXNwb25zZSBhcmVhcyAoY2F0ZWdvcmllcykgaW4gdGhlIGNvcnJlY3QgYW5zd2VyIG9yIGFsdGVybmF0ZXNcbi8vIGFuZCBjcmVhdGUgYW4gYXJyYXkgd2l0aCB0aGUgcG9zc2libGUgcmVzcG9uc2VzIGlkc1xuZXhwb3J0IGNvbnN0IGdldENvbXBsZXRlUmVzcG9uc2VEZXRhaWxzID0gKGNvcnJlY3RSZXNwb25zZSwgYWx0ZXJuYXRlcywgYWxsQ2hvaWNlcykgPT4ge1xuICBjb25zdCBjaG9pY2VzUGVyQ2F0ZWdvcnkgPSBjb3JyZWN0UmVzcG9uc2UubWFwKChjYXRlZ29yeSkgPT4gY2F0ZWdvcnkuY2hvaWNlcyk7XG4gIGNvbnN0IHBvc3NpYmxlUmVzcG9uc2VzID0gW2Nob2ljZXNQZXJDYXRlZ29yeS5mbGF0KCldO1xuICBsZXQgcmVzcG9uc2VBcmVhc1RvQmVGaWxsZWQgPSBjaG9pY2VzUGVyQ2F0ZWdvcnkuZmlsdGVyKChjaG9pY2VzKSA9PiBjaG9pY2VzLmxlbmd0aCkubGVuZ3RoO1xuXG4gIGlmIChhbHRlcm5hdGVzLmxlbmd0aCkge1xuICAgIGNvbnN0IGFsdGVybmF0ZXNQZXJDaG9pY2UgPSBhbHRlcm5hdGVzWzBdPy5sZW5ndGggfHwgMDsgLy8gbnVtYmVyIG9mIGFsdGVybmF0ZXNcblxuICAgIFsuLi5BcnJheShhbHRlcm5hdGVzUGVyQ2hvaWNlKS5rZXlzKCldLmZvckVhY2goKGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBhbHRlcm5hdGVzUGVyUmVzcG9uc2UgPSBhbHRlcm5hdGVzLm1hcCgoYWx0ZXJuYXRlKSA9PiBhbHRlcm5hdGVbaW5kZXhdKTtcbiAgICAgIGNvbnN0IGZpbGxlZENhdGVnb3JpZXMgPSBhbHRlcm5hdGVzUGVyUmVzcG9uc2UuZmlsdGVyKChjYXRlZ29yeSkgPT4gY2F0ZWdvcnk/Lmxlbmd0aCkubGVuZ3RoO1xuICAgICAgcG9zc2libGVSZXNwb25zZXMucHVzaChhbHRlcm5hdGVzUGVyUmVzcG9uc2UuZmxhdCgpKTtcblxuICAgICAgaWYgKGZpbGxlZENhdGVnb3JpZXMgPCByZXNwb25zZUFyZWFzVG9CZUZpbGxlZCkge1xuICAgICAgICByZXNwb25zZUFyZWFzVG9CZUZpbGxlZCA9IGZpbGxlZENhdGVnb3JpZXM7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBjaGVjayBpZiBhbnkgY29ycmVjdCBhbnN3ZXIgaGF2ZSBhbnkgdW5wbGFjZWQgYW5zd2VyIGNob2ljZXNcbiAgY29uc3QgaGFzVW5wbGFjZWRDaG9pY2VzID0gcG9zc2libGVSZXNwb25zZXMuc29tZShcbiAgICAocmVzcG9uc2UpID0+ICFhbGxDaG9pY2VzLmV2ZXJ5KCh2YWwpID0+IHJlc3BvbnNlLmluY2x1ZGVzKHZhbD8uaWQpKSxcbiAgKTtcblxuICByZXR1cm4geyByZXNwb25zZUFyZWFzVG9CZUZpbGxlZCwgcG9zc2libGVSZXNwb25zZXMsIGhhc1VucGxhY2VkQ2hvaWNlcyB9O1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDTyxNQUFNQSxrQkFBa0IsR0FBQUMsT0FBQSxDQUFBRCxrQkFBQSxHQUFHO0VBQUVFLE9BQU8sRUFBRSxLQUFLO0VBQUVDLFFBQVEsRUFBRSxJQUFJO0VBQUVDLFNBQVMsRUFBRTtBQUFpQixDQUFDOztBQUVqRztBQUNPLE1BQU1DLDJCQUEyQixHQUFHQSxDQUFDQyxPQUFPLEVBQUVDLFNBQVMsS0FBSztFQUNqRSxJQUFJRCxPQUFPLENBQUNFLE1BQU0sR0FBRyxDQUFDLElBQUlELFNBQVMsQ0FBQ0MsTUFBTSxHQUFHLENBQUMsRUFBRTtJQUM5QyxPQUFPLENB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"utils.js","names":["multiplePlacements","exports","enabled","disabled","perChoice","isCorrectResponseDuplicated","choices","alternate","length","stringChoices","JSON","stringify","sort","stringAlternate","reduce","total","current","foundIndexDuplicate","findIndex","isAlternateDuplicated","elementSet","Set","i","has","add","getCompleteResponseDetails","correctResponse","alternates","allChoices","choicesPerCategory","map","category","possibleResponses","flat","responseAreasToBeFilled","filter","alternatesPerChoice","Array","keys","forEach","index","alternatesPerResponse","filledCategories","push","hasUnplacedChoices","some","response","every","val","includes","id"],"sources":["../src/utils.js"],"sourcesContent":["// used in configure too, for consistency modify it there too\nexport const multiplePlacements = { enabled: 'Yes', disabled: 'No', perChoice: 'Set Per Choice' };\n\n// used to validate the config\nexport const isCorrectResponseDuplicated = (choices, alternate) => {\n if (choices.length < 1 || alternate.length < 1) {\n return -1;\n }\n\n const stringChoices = JSON.stringify(choices.sort());\n const stringAlternate = alternate.reduce(\n (total, current) => (current.length > 0 ? [...total, JSON.stringify(current.sort())] : total),\n [],\n );\n const foundIndexDuplicate = stringAlternate.findIndex((alternate) => alternate.length && alternate === stringChoices);\n\n return foundIndexDuplicate;\n};\n\nexport const isAlternateDuplicated = (alternate) => {\n if (alternate.length <= 1) {\n return -1;\n }\n\n const elementSet = new Set();\n const stringAlternate = alternate.reduce(\n (total, current) => (current.length > 0 ? [...total, JSON.stringify(current.sort())] : total),\n [],\n );\n\n for (let i = 0; i < stringAlternate.length; i++) {\n if (elementSet.has(stringAlternate[i]) && stringAlternate[i]) {\n return i;\n }\n\n elementSet.add(stringAlternate[i]);\n }\n\n return -1;\n};\n\n// calculate the minimum number of populated response areas (categories) in the correct answer or alternates\n// and create an array with the possible responses ids\nexport const getCompleteResponseDetails = (correctResponse, alternates, allChoices) => {\n const choicesPerCategory = correctResponse.map((category) => category.choices);\n const possibleResponses = [choicesPerCategory.flat()];\n let responseAreasToBeFilled = choicesPerCategory.filter((choices) => choices.length).length;\n\n if (alternates.length) {\n const alternatesPerChoice = alternates[0]?.length || 0; // number of alternates\n\n [...Array(alternatesPerChoice).keys()].forEach((index) => {\n const alternatesPerResponse = alternates.map((alternate) => alternate[index]);\n const filledCategories = alternatesPerResponse.filter((category) => category?.length).length;\n possibleResponses.push(alternatesPerResponse.flat());\n\n if (filledCategories < responseAreasToBeFilled) {\n responseAreasToBeFilled = filledCategories;\n }\n });\n }\n\n // check if any correct answer have any unplaced answer choices\n const hasUnplacedChoices = possibleResponses.some(\n (response) => !allChoices.every((val) => response.includes(val?.id)),\n );\n\n return { responseAreasToBeFilled, possibleResponses, hasUnplacedChoices };\n};\n"],"mappings":"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","ignoreList":[]}
|
package/controller/package.json
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
"name": "@pie-element/categorize-controller",
|
|
3
3
|
"private": true,
|
|
4
4
|
"dependencies": {
|
|
5
|
-
"@pie-lib/categorize": "0.
|
|
6
|
-
"@pie-lib/controller-utils": "0.
|
|
7
|
-
"@pie-lib/feedback": "0.
|
|
8
|
-
"@pie-lib/translator": "
|
|
5
|
+
"@pie-lib/categorize": "1.1.0-next.9",
|
|
6
|
+
"@pie-lib/controller-utils": "1.1.0-next.4",
|
|
7
|
+
"@pie-lib/feedback": "1.1.0-next.4",
|
|
8
|
+
"@pie-lib/translator": "3.1.0-next.4",
|
|
9
9
|
"lodash": "^4.17.15"
|
|
10
10
|
},
|
|
11
|
-
"version": "
|
|
11
|
+
"version": "9.0.0-beta.1",
|
|
12
12
|
"description": "",
|
|
13
13
|
"scripts": {},
|
|
14
14
|
"main": "lib/index.js",
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "auto generated package.json",
|
|
3
|
+
"license": "MIT",
|
|
4
|
+
"name": "configure-generated-pkg",
|
|
5
|
+
"private": true,
|
|
6
|
+
"version": "0.0.1",
|
|
7
|
+
"dependencies": {
|
|
8
|
+
"@pie-element/categorize-configure": "file:../node_modules/@pie-element/categorize/configure"
|
|
9
|
+
}
|
|
10
|
+
}
|