@pie-element/placement-ordering 12.3.4-next.3 → 13.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/choice-editor.js +189 -414
- package/configure/lib/choice-editor.js.map +1 -1
- package/configure/lib/choice-tile.js +172 -263
- package/configure/lib/choice-tile.js.map +1 -1
- package/configure/lib/defaults.js +2 -4
- package/configure/lib/defaults.js.map +1 -1
- package/configure/lib/design.js +389 -455
- package/configure/lib/design.js.map +1 -1
- package/configure/lib/help.js +5 -13
- package/configure/lib/help.js.map +1 -1
- package/configure/lib/index.js +118 -193
- package/configure/lib/index.js.map +1 -1
- package/configure/lib/utils.js +99 -4
- package/configure/lib/utils.js.map +1 -1
- package/configure/package.json +12 -10
- package/controller/CHANGELOG.md +0 -11
- package/controller/lib/defaults.js +2 -3
- package/controller/lib/defaults.js.map +1 -1
- package/controller/lib/index.js +133 -218
- package/controller/lib/index.js.map +1 -1
- package/controller/lib/scoring.js +35 -78
- package/controller/lib/scoring.js.map +1 -1
- package/controller/package.json +4 -4
- package/lib/index.js +63 -127
- package/lib/index.js.map +1 -1
- package/lib/main.js +20 -57
- package/lib/main.js.map +1 -1
- package/lib/ordering.js +52 -98
- package/lib/ordering.js.map +1 -1
- package/lib/placement-ordering.js +331 -381
- package/lib/placement-ordering.js.map +1 -1
- package/lib/tile.js +193 -267
- package/lib/tile.js.map +1 -1
- package/lib/tiler.js +126 -204
- package/lib/tiler.js.map +1 -1
- package/lib/utils.js +6 -18
- package/lib/utils.js.map +1 -1
- package/package.json +14 -11
- package/esm/configure.js +0 -25814
- package/esm/configure.js.map +0 -1
- package/esm/controller.js +0 -21221
- package/esm/controller.js.map +0 -1
- package/esm/element.js +0 -17874
- package/esm/element.js.map +0 -1
- package/esm/package.json +0 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.js"],"names":["log","translator","Translator","questionError","Error","outcome","question","session","env","Promise","resolve","reject","_","isEmpty","score","empty","correctResponse","s","finalScore","partialScoring","enabled","e","createDefaultModel","model","defaults","normalize","rationaleEnabled","feedbackEnabled","promptEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","normalizedQuestion","base","alternateResponses","every","isArray","console","error","extraCSSRules","outcomes","completeLength","length","choices","filter","choice","label","note","showNote","language","prompt","config","orientation","includeTargets","placementArea","choiceLabelEnabled","targetLabel","choiceLabel","showOrdering","numberedGuides","allowSameChoiceInTargets","removeTilesAfterPlacing","disabled","mode","t","lng","role","rationale","teacherInstructions","value","allCorrectResponses","bestSetOfResponses","reduce","info","cr","currentScore","acc","c","idx","Array","arr","map","id","isResponseCorrect","some","response","isEqual","responseScore","isCorrect","isPartialCorrect","correctness","feedback","fb","undefined","then","createCorrectResponseSession","getInnerText","html","replaceAll","getContent","replace","validate","errors","forEach","field","required","reversedChoices","reverse","choicesErrors","index","identicalAnswer","slice","choicesIds","correctResponseIds","orderError"],"mappings":"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","sourcesContent":["import { flattenCorrect, getAllCorrectResponses, score } from './scoring';\n\nimport _ from 'lodash';\nimport { getFeedbackForCorrectness } from '@pie-lib/feedback';\nimport { partialScoring } from '@pie-lib/controller-utils';\nimport debug from 'debug';\n\nimport defaults from './defaults';\nimport isEqual from 'lodash/isEqual';\nimport isEmpty from 'lodash/isEmpty';\n\nconst log = debug('@pie-element:placement-ordering:controller');\nimport Translator from '@pie-lib/translator';\n\nconst { translator } = Translator;\n\nexport const questionError = () => new Error('Question is missing required array: correctResponse');\n\nexport function outcome(question, session, env) {\n return new Promise((resolve, reject) => {\n if (!session || _.isEmpty(session)) {\n resolve({ score: 0, empty: true });\n }\n\n if (!question || !question.correctResponse || _.isEmpty(question.correctResponse)) {\n reject(questionError());\n } else {\n try {\n const s = score(question, session);\n const finalScore = partialScoring.enabled(question, env || {}) ? s : s === 1 ? 1 : 0;\n resolve({\n score: finalScore,\n });\n } catch (e) {\n reject(e);\n }\n }\n });\n}\n\nexport function createDefaultModel(model = {}) {\n return new Promise((resolve) => {\n resolve({\n ...defaults,\n ...model,\n });\n });\n}\n\nexport const normalize = (question) => ({\n ...defaults,\n rationaleEnabled: true,\n feedbackEnabled: false,\n promptEnabled: true,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n ...question,\n});\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n */\nexport function model(question, session, env) {\n return new Promise(async (resolve) => {\n const normalizedQuestion = normalize(question);\n const base = {};\n\n if (question.alternateResponses && _.every(question.alternateResponses, _.isArray)) {\n log('Deprecated structure of alternateResponses is in use');\n // eslint-disable-next-line no-console\n console.error('Deprecated structure of alternateResponses is in use');\n }\n\n base.env = env;\n base.extraCSSRules = normalizedQuestion.extraCSSRules;\n base.outcomes = [];\n base.completeLength = (normalizedQuestion.correctResponse || []).length;\n base.choices = (normalizedQuestion.choices || []).filter((choice) => choice.label);\n base.note = normalizedQuestion.note;\n base.showNote = normalizedQuestion.alternateResponses && normalizedQuestion.alternateResponses.length > 0;\n base.language = normalizedQuestion.language;\n\n log('[model] removing tileSize for the moment.');\n\n base.prompt = normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null;\n base.config = {\n orientation: normalizedQuestion.orientation || 'vertical',\n includeTargets: normalizedQuestion.placementArea,\n choiceLabelEnabled: normalizedQuestion.choiceLabelEnabled,\n targetLabel: normalizedQuestion.targetLabel,\n choiceLabel: normalizedQuestion.choiceLabel,\n showOrdering: normalizedQuestion.numberedGuides,\n allowSameChoiceInTargets: !normalizedQuestion.removeTilesAfterPlacing,\n };\n\n base.disabled = env.mode !== 'gather';\n\n if (!base.note) {\n base.note = translator.t('common:commonCorrectAnswerWithAlternates', { lng: normalizedQuestion.language });\n }\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n base.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;\n base.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n base.rationale = null;\n base.teacherInstructions = null;\n }\n\n if (env.mode === 'evaluate') {\n const value = (session && session.value) || [];\n const allCorrectResponses = getAllCorrectResponses(normalizedQuestion);\n\n const bestSetOfResponses = allCorrectResponses.reduce(\n (info, cr) => {\n const currentScore = _.reduce(value, (acc, c, idx) => acc + (Array.isArray(cr) && cr[idx] === c ? 1 : 0), 0);\n\n if (currentScore > info.score) {\n return {\n arr: cr,\n score: currentScore,\n };\n }\n\n return info;\n },\n { arr: [], score: 0 },\n );\n\n base.outcomes = _.map(value, (c, idx) => {\n return {\n id: c,\n outcome: bestSetOfResponses.arr[idx] === c ? 'correct' : 'incorrect',\n };\n });\n\n const isResponseCorrect = allCorrectResponses.some((response) => _.isEqual(response, value));\n const responseScore = score(question, session);\n const isCorrect = responseScore === 1;\n const isPartialCorrect =\n !isCorrect && partialScoring.enabled(normalizedQuestion, env || {}) && responseScore !== 0;\n\n base.correctness = isCorrect ? 'correct' : isPartialCorrect ? 'partial' : 'incorrect';\n\n if (!isResponseCorrect) {\n base.correctResponse = flattenCorrect(normalizedQuestion);\n }\n\n // requirement made in PD-2182\n if (!normalizedQuestion.feedback) {\n normalizedQuestion.feedbackEnabled = false;\n }\n\n const fb = normalizedQuestion.feedbackEnabled\n ? getFeedbackForCorrectness(base.correctness, normalizedQuestion.feedback)\n : Promise.resolve(undefined);\n\n fb.then((feedback) => {\n base.feedback = feedback;\n resolve(base);\n });\n } else {\n resolve(base);\n }\n });\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n resolve({\n id: '1',\n value: flattenCorrect(question),\n });\n } else {\n resolve(null);\n }\n });\n};\n\n// remove all html tags\nconst getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');\n\n// remove all html tags except img, iframe and source tag for audio\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const { choices, correctResponse } = model;\n const errors = {};\n\n ['teacherInstructions', 'prompt', 'rationale'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n const reversedChoices = [...(choices || [])].reverse();\n const choicesErrors = {};\n\n reversedChoices.forEach((choice, index) => {\n const { id, label } = choice;\n\n if (!getContent(label)) {\n choicesErrors[id] = '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[id] = 'Content should be unique.';\n }\n }\n });\n\n const choicesIds = (choices || []).map((choice) => choice.id);\n const correctResponseIds = (correctResponse || []).map((response) => response.id || response);\n\n if (isEqual(choicesIds, correctResponseIds)) {\n errors.orderError = 'The correct ordering should not be identical to the initial ordering.';\n }\n\n if (!isEmpty(choicesErrors)) {\n errors.choicesErrors = choicesErrors;\n }\n\n return errors;\n};\n"],"file":"index.js"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["_scoring","require","_lodash","_interopRequireDefault","_feedback","_controllerUtils","_debug","_defaults","_isEqual","_isEmpty","_translator","log","debug","translator","Translator","questionError","Error","exports","outcome","question","session","env","Promise","resolve","reject","_","isEmpty","score","empty","correctResponse","s","finalScore","partialScoring","enabled","e","createDefaultModel","model","defaults","normalize","rationaleEnabled","feedbackEnabled","promptEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","normalizedQuestion","base","alternateResponses","every","isArray","console","error","extraCSSRules","outcomes","completeLength","length","choices","filter","choice","label","note","showNote","language","prompt","config","orientation","includeTargets","placementArea","choiceLabelEnabled","targetLabel","choiceLabel","showOrdering","numberedGuides","allowSameChoiceInTargets","removeTilesAfterPlacing","disabled","mode","t","lng","role","rationale","teacherInstructions","value","allCorrectResponses","getAllCorrectResponses","bestSetOfResponses","reduce","info","cr","currentScore","acc","c","idx","Array","arr","map","id","isResponseCorrect","some","response","isEqual","responseScore","isCorrect","isPartialCorrect","correctness","flattenCorrect","feedback","getFeedbackForCorrectness","undefined","createCorrectResponseSession","getInnerText","html","replaceAll","getContent","replace","validate","errors","forEach","field","required","reversedChoices","reverse","choicesErrors","index","identicalAnswer","slice","choicesIds","correctResponseIds","orderError"],"sources":["../src/index.js"],"sourcesContent":["import { flattenCorrect, getAllCorrectResponses, score } from './scoring';\n\nimport _ from 'lodash';\nimport { getFeedbackForCorrectness } from '@pie-lib/feedback';\nimport { partialScoring } from '@pie-lib/controller-utils';\nimport debug from 'debug';\n\nimport defaults from './defaults';\nimport isEqual from 'lodash/isEqual';\nimport isEmpty from 'lodash/isEmpty';\n\nconst log = debug('@pie-element:placement-ordering:controller');\nimport Translator from '@pie-lib/translator';\n\nconst { translator } = Translator;\n\nexport const questionError = () => new Error('Question is missing required array: correctResponse');\n\nexport function outcome(question, session, env) {\n return new Promise((resolve, reject) => {\n if (!session || _.isEmpty(session)) {\n resolve({ score: 0, empty: true });\n }\n\n if (!question || !question.correctResponse || _.isEmpty(question.correctResponse)) {\n reject(questionError());\n } else {\n try {\n const s = score(question, session);\n const finalScore = partialScoring.enabled(question, env || {}) ? s : s === 1 ? 1 : 0;\n resolve({\n score: finalScore,\n });\n } catch (e) {\n reject(e);\n }\n }\n });\n}\n\nexport function createDefaultModel(model = {}) {\n return new Promise((resolve) => {\n resolve({\n ...defaults,\n ...model,\n });\n });\n}\n\nexport const normalize = (question) => ({\n ...defaults,\n rationaleEnabled: true,\n feedbackEnabled: false,\n promptEnabled: true,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n ...question,\n});\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n */\nexport async function model(question, session, env) {\n const normalizedQuestion = normalize(question);\n const base = {};\n\n if (question.alternateResponses && _.every(question.alternateResponses, _.isArray)) {\n log('Deprecated structure of alternateResponses is in use');\n // eslint-disable-next-line no-console\n console.error('Deprecated structure of alternateResponses is in use');\n }\n\n base.env = env;\n base.extraCSSRules = normalizedQuestion.extraCSSRules;\n base.outcomes = [];\n base.completeLength = (normalizedQuestion.correctResponse || []).length;\n base.choices = (normalizedQuestion.choices || []).filter((choice) => choice.label);\n base.note = normalizedQuestion.note;\n base.showNote = normalizedQuestion.alternateResponses && normalizedQuestion.alternateResponses.length > 0;\n base.language = normalizedQuestion.language;\n\n log('[model] removing tileSize for the moment.');\n\n base.prompt = normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null;\n base.config = {\n orientation: normalizedQuestion.orientation || 'vertical',\n includeTargets: normalizedQuestion.placementArea,\n choiceLabelEnabled: normalizedQuestion.choiceLabelEnabled,\n targetLabel: normalizedQuestion.targetLabel,\n choiceLabel: normalizedQuestion.choiceLabel,\n showOrdering: normalizedQuestion.numberedGuides,\n allowSameChoiceInTargets: !normalizedQuestion.removeTilesAfterPlacing,\n };\n\n base.disabled = env.mode !== 'gather';\n\n if (!base.note) {\n base.note = translator.t('common:commonCorrectAnswerWithAlternates', { lng: normalizedQuestion.language });\n }\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n base.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;\n base.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n base.rationale = null;\n base.teacherInstructions = null;\n }\n\n if (env.mode === 'evaluate') {\n const value = (session && session.value) || [];\n const allCorrectResponses = getAllCorrectResponses(normalizedQuestion);\n\n const bestSetOfResponses = allCorrectResponses.reduce(\n (info, cr) => {\n const currentScore = _.reduce(value, (acc, c, idx) => acc + (Array.isArray(cr) && cr[idx] === c ? 1 : 0), 0);\n\n if (currentScore > info.score) {\n return {\n arr: cr,\n score: currentScore,\n };\n }\n\n return info;\n },\n { arr: [], score: 0 },\n );\n\n base.outcomes = _.map(value, (c, idx) => {\n return {\n id: c,\n outcome: bestSetOfResponses.arr[idx] === c ? 'correct' : 'incorrect',\n };\n });\n\n const isResponseCorrect = allCorrectResponses.some((response) => _.isEqual(response, value));\n const responseScore = score(question, session);\n const isCorrect = responseScore === 1;\n const isPartialCorrect =\n !isCorrect && partialScoring.enabled(normalizedQuestion, env || {}) && responseScore !== 0;\n\n base.correctness = isCorrect ? 'correct' : isPartialCorrect ? 'partial' : 'incorrect';\n\n if (!isResponseCorrect) {\n base.correctResponse = flattenCorrect(normalizedQuestion);\n }\n\n // requirement made in PD-2182\n if (!normalizedQuestion.feedback) {\n normalizedQuestion.feedbackEnabled = false;\n }\n\n const feedback = normalizedQuestion.feedbackEnabled\n ? await getFeedbackForCorrectness(base.correctness, normalizedQuestion.feedback)\n : undefined;\n\n base.feedback = feedback;\n return base;\n } else {\n return base;\n }\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n resolve({\n id: '1',\n value: flattenCorrect(question),\n });\n } else {\n resolve(null);\n }\n });\n};\n\n// remove all html tags\nconst getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');\n\n// remove all html tags except img, iframe and source tag for audio\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const { choices, correctResponse } = model;\n const errors = {};\n\n ['teacherInstructions', 'prompt', 'rationale'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n const reversedChoices = [...(choices || [])].reverse();\n const choicesErrors = {};\n\n reversedChoices.forEach((choice, index) => {\n const { id, label } = choice;\n\n if (!getContent(label)) {\n choicesErrors[id] = '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[id] = 'Content should be unique.';\n }\n }\n });\n\n const choicesIds = (choices || []).map((choice) => choice.id);\n const correctResponseIds = (correctResponse || []).map((response) => response.id || response);\n\n if (isEqual(choicesIds, correctResponseIds)) {\n errors.orderError = 'The correct ordering should not be identical to the initial ordering.';\n }\n\n if (!isEmpty(choicesErrors)) {\n errors.choicesErrors = choicesErrors;\n }\n\n return errors;\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,152 +1,109 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.score = exports.pairwiseCombinationScore = exports.illegalArgumentError = exports.getAllCorrectResponses = exports.flattenCorrect = void 0;
|
|
9
|
-
|
|
10
|
-
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
11
|
-
|
|
12
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
13
|
-
|
|
14
8
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
15
|
-
|
|
16
9
|
var _jsCombinatorics = require("js-combinatorics");
|
|
17
|
-
|
|
18
10
|
var _debug = _interopRequireDefault(require("debug"));
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
23
|
-
|
|
24
|
-
var log = (0, _debug["default"])('pie-elements:placement-ordering:controller');
|
|
25
|
-
|
|
26
|
-
var illegalArgumentError = function illegalArgumentError(answer) {
|
|
27
|
-
return new Error("Cant score answer: ".concat(answer, " it has duplicates and allowDuplicates is false"));
|
|
28
|
-
};
|
|
29
|
-
|
|
11
|
+
const log = (0, _debug.default)('pie-elements:placement-ordering:controller');
|
|
12
|
+
const illegalArgumentError = answer => new Error(`Cant score answer: ${answer} it has duplicates and allowDuplicates is false`);
|
|
30
13
|
exports.illegalArgumentError = illegalArgumentError;
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
opts = _objectSpread({
|
|
14
|
+
const pairwiseCombinationScore = (correct, answer, opts) => {
|
|
15
|
+
opts = {
|
|
34
16
|
allowDuplicates: false,
|
|
35
|
-
orderMustBeComplete: false
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
if (!opts.allowDuplicates && !_lodash
|
|
17
|
+
orderMustBeComplete: false,
|
|
18
|
+
...opts
|
|
19
|
+
};
|
|
20
|
+
if (!opts.allowDuplicates && !_lodash.default.isEqual(_lodash.default.uniq(correct), correct)) {
|
|
39
21
|
throw illegalArgumentError(answer);
|
|
40
22
|
}
|
|
41
|
-
|
|
42
|
-
if (opts.allowDuplicates === false && answer.length !== _lodash["default"].uniq(answer).length) {
|
|
23
|
+
if (opts.allowDuplicates === false && answer.length !== _lodash.default.uniq(answer).length) {
|
|
43
24
|
return 0;
|
|
44
25
|
}
|
|
45
|
-
|
|
46
|
-
answer = opts.allowDuplicates !== false ? answer : _lodash["default"].uniq(answer);
|
|
26
|
+
answer = opts.allowDuplicates !== false ? answer : _lodash.default.uniq(answer);
|
|
47
27
|
log('answer:', answer);
|
|
48
|
-
|
|
49
28
|
if (!Array.isArray(correct) || correct.length === 0) {
|
|
50
29
|
throw new Error('correct must be non empty an array');
|
|
51
30
|
}
|
|
52
|
-
|
|
53
31
|
if (correct.length === 1) {
|
|
54
|
-
return _lodash
|
|
32
|
+
return _lodash.default.isEqual(correct, answer) ? 1 : 0;
|
|
55
33
|
}
|
|
56
|
-
|
|
57
34
|
if (!Array.isArray(answer) || answer.length < 2) {
|
|
58
35
|
return 0;
|
|
59
36
|
}
|
|
60
|
-
|
|
61
37
|
if (answer.length > correct.length) {
|
|
62
38
|
return 0;
|
|
63
39
|
}
|
|
64
|
-
|
|
65
40
|
if (correct.length !== answer.length && opts.orderMustBeComplete) {
|
|
66
41
|
return 0;
|
|
67
42
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
var total = correctCombo.length;
|
|
76
|
-
var actual = total - diff.length - comboLengthDiff;
|
|
77
|
-
var n = (actual / total).toFixed(2);
|
|
43
|
+
const correctCombo = (0, _jsCombinatorics.combination)(correct, 2).toArray();
|
|
44
|
+
const answerCombo = (0, _jsCombinatorics.combination)(answer, 2).toArray();
|
|
45
|
+
const diff = _lodash.default.differenceWith(answerCombo, correctCombo, _lodash.default.isEqual);
|
|
46
|
+
const comboLengthDiff = correctCombo.length - answerCombo.length;
|
|
47
|
+
const total = correctCombo.length;
|
|
48
|
+
const actual = total - diff.length - comboLengthDiff;
|
|
49
|
+
const n = (actual / total).toFixed(2);
|
|
78
50
|
return parseFloat(n);
|
|
79
51
|
};
|
|
52
|
+
|
|
80
53
|
/**
|
|
81
54
|
* Flattens the correctResponse into an array of ordered identifiers representing the
|
|
82
55
|
* correct response.
|
|
83
56
|
*/
|
|
84
|
-
|
|
85
|
-
|
|
86
57
|
exports.pairwiseCombinationScore = pairwiseCombinationScore;
|
|
58
|
+
const flattenCorrect = question => question.correctResponse ? question.correctResponse.map(r => r && r.id ? r.id : r) : [];
|
|
87
59
|
|
|
88
|
-
var flattenCorrect = function flattenCorrect(question) {
|
|
89
|
-
return question.correctResponse ? question.correctResponse.map(function (r) {
|
|
90
|
-
return r && r.id ? r.id : r;
|
|
91
|
-
}) : [];
|
|
92
|
-
};
|
|
93
60
|
/**
|
|
94
61
|
* Returns all correct responses for this question
|
|
95
62
|
* @param question - array
|
|
96
63
|
*/
|
|
97
|
-
|
|
98
|
-
|
|
99
64
|
exports.flattenCorrect = flattenCorrect;
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
var alternates = (question.alternateResponses || []).map(function (alternate) {
|
|
65
|
+
const getAllCorrectResponses = question => {
|
|
66
|
+
const alternates = (question.alternateResponses || []).map(alternate => {
|
|
103
67
|
if (Array.isArray(alternate)) {
|
|
104
68
|
return alternate;
|
|
105
69
|
}
|
|
106
|
-
|
|
107
70
|
return alternate.response;
|
|
108
|
-
}).filter(
|
|
109
|
-
|
|
110
|
-
});
|
|
111
|
-
return [flattenCorrect(question)].concat((0, _toConsumableArray2["default"])(alternates));
|
|
71
|
+
}).filter(item => item !== undefined);
|
|
72
|
+
return [flattenCorrect(question), ...alternates];
|
|
112
73
|
};
|
|
74
|
+
|
|
113
75
|
/**
|
|
114
76
|
* Returns the score for a session. If weighted scoring is present in the correctResponse
|
|
115
77
|
* field for the question, this will be used. If partial scoring is present in the question
|
|
116
78
|
* model, this will be used. Otherwise the default scoring mechanism (0 for any incorrect, 1
|
|
117
79
|
* for all correct) will be used.
|
|
118
80
|
*/
|
|
119
|
-
|
|
120
|
-
|
|
121
81
|
exports.getAllCorrectResponses = getAllCorrectResponses;
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
82
|
+
const score = (question, session) => {
|
|
83
|
+
const {
|
|
84
|
+
value
|
|
85
|
+
} = session || {};
|
|
127
86
|
if (!value) {
|
|
128
87
|
return 0;
|
|
129
88
|
}
|
|
89
|
+
const allCorrectResponse = getAllCorrectResponses(question);
|
|
90
|
+
const allowDuplicates = (question.configure && question.configure.removeTilesAfterPlacing) !== false;
|
|
130
91
|
|
|
131
|
-
var allCorrectResponse = getAllCorrectResponses(question);
|
|
132
|
-
var allowDuplicates = (question.configure && question.configure.removeTilesAfterPlacing) !== false;
|
|
133
92
|
/**
|
|
134
93
|
* We require this to be the case - locking
|
|
135
94
|
*/
|
|
136
95
|
//const orderMustBeComplete = true;
|
|
137
96
|
|
|
138
|
-
|
|
139
|
-
allCorrectResponse.forEach(
|
|
140
|
-
|
|
141
|
-
allowDuplicates
|
|
97
|
+
let bestScore = 0;
|
|
98
|
+
allCorrectResponse.forEach(cr => {
|
|
99
|
+
const currentScore = pairwiseCombinationScore(cr, value, {
|
|
100
|
+
allowDuplicates
|
|
142
101
|
});
|
|
143
|
-
|
|
144
102
|
if (currentScore >= bestScore) {
|
|
145
103
|
bestScore = currentScore;
|
|
146
104
|
}
|
|
147
105
|
});
|
|
148
106
|
return bestScore;
|
|
149
107
|
};
|
|
150
|
-
|
|
151
108
|
exports.score = score;
|
|
152
109
|
//# sourceMappingURL=scoring.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"scoring.js","names":["_lodash","_interopRequireDefault","require","_jsCombinatorics","_debug","log","debug","illegalArgumentError","answer","Error","exports","pairwiseCombinationScore","correct","opts","allowDuplicates","orderMustBeComplete","_","isEqual","uniq","length","Array","isArray","correctCombo","combination","toArray","answerCombo","diff","differenceWith","comboLengthDiff","total","actual","n","toFixed","parseFloat","flattenCorrect","question","correctResponse","map","r","id","getAllCorrectResponses","alternates","alternateResponses","alternate","response","filter","item","undefined","score","session","value","allCorrectResponse","configure","removeTilesAfterPlacing","bestScore","forEach","cr","currentScore"],"sources":["../src/scoring.js"],"sourcesContent":["import _ from 'lodash';\nimport { combination } from 'js-combinatorics';\nimport debug from 'debug';\n\nconst log = debug('pie-elements:placement-ordering:controller');\n\nexport const illegalArgumentError = (answer) =>\n new Error(`Cant score answer: ${answer} it has duplicates and allowDuplicates is false`);\nexport const pairwiseCombinationScore = (correct, answer, opts) => {\n opts = { allowDuplicates: false, orderMustBeComplete: false, ...opts };\n\n if (!opts.allowDuplicates && !_.isEqual(_.uniq(correct), correct)) {\n throw illegalArgumentError(answer);\n }\n\n if (opts.allowDuplicates === false && answer.length !== _.uniq(answer).length) {\n return 0;\n }\n\n answer = opts.allowDuplicates !== false ? answer : _.uniq(answer);\n\n log('answer:', answer);\n if (!Array.isArray(correct) || correct.length === 0) {\n throw new Error('correct must be non empty an array');\n }\n\n if (correct.length === 1) {\n return _.isEqual(correct, answer) ? 1 : 0;\n }\n\n if (!Array.isArray(answer) || answer.length < 2) {\n return 0;\n }\n\n if (answer.length > correct.length) {\n return 0;\n }\n\n if (correct.length !== answer.length && opts.orderMustBeComplete) {\n return 0;\n }\n\n const correctCombo = combination(correct, 2).toArray();\n const answerCombo = combination(answer, 2).toArray();\n\n const diff = _.differenceWith(answerCombo, correctCombo, _.isEqual);\n\n const comboLengthDiff = correctCombo.length - answerCombo.length;\n\n const total = correctCombo.length;\n const actual = total - diff.length - comboLengthDiff;\n\n const n = (actual / total).toFixed(2);\n\n return parseFloat(n);\n};\n\n/**\n * Flattens the correctResponse into an array of ordered identifiers representing the\n * correct response.\n */\nexport const flattenCorrect = (question) =>\n question.correctResponse ? question.correctResponse.map((r) => (r && r.id ? r.id : r)) : [];\n\n/**\n * Returns all correct responses for this question\n * @param question - array\n */\nexport const getAllCorrectResponses = (question) => {\n const alternates = (question.alternateResponses || []).map((alternate) => {\n if (Array.isArray(alternate)) {\n return alternate;\n }\n\n return alternate.response;\n }).filter(item => item !== undefined);\n\n return [flattenCorrect(question), ...alternates];\n};\n\n/**\n * Returns the score for a session. If weighted scoring is present in the correctResponse\n * field for the question, this will be used. If partial scoring is present in the question\n * model, this will be used. Otherwise the default scoring mechanism (0 for any incorrect, 1\n * for all correct) will be used.\n */\n\nexport const score = (question, session) => {\n const { value } = session || {};\n\n if (!value) {\n return 0;\n }\n\n const allCorrectResponse = getAllCorrectResponses(question);\n const allowDuplicates = (question.configure && question.configure.removeTilesAfterPlacing) !== false;\n\n /**\n * We require this to be the case - locking\n */\n //const orderMustBeComplete = true;\n\n let bestScore = 0;\n\n allCorrectResponse.forEach((cr) => {\n const currentScore = pairwiseCombinationScore(cr, value, {\n allowDuplicates,\n });\n\n if (currentScore >= bestScore) {\n bestScore = currentScore;\n }\n });\n\n return bestScore;\n};\n"],"mappings":";;;;;;;AAAA,IAAAA,OAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,gBAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAH,sBAAA,CAAAC,OAAA;AAEA,MAAMG,GAAG,GAAG,IAAAC,cAAK,EAAC,4CAA4C,CAAC;AAExD,MAAMC,oBAAoB,GAAIC,MAAM,IACzC,IAAIC,KAAK,CAAC,sBAAsBD,MAAM,iDAAiD,CAAC;AAACE,OAAA,CAAAH,oBAAA,GAAAA,oBAAA;AACpF,MAAMI,wBAAwB,GAAGA,CAACC,OAAO,EAAEJ,MAAM,EAAEK,IAAI,KAAK;EACjEA,IAAI,GAAG;IAAEC,eAAe,EAAE,KAAK;IAAEC,mBAAmB,EAAE,KAAK;IAAE,GAAGF;EAAK,CAAC;EAEtE,IAAI,CAACA,IAAI,CAACC,eAAe,IAAI,CAACE,eAAC,CAACC,OAAO,CAACD,eAAC,CAACE,IAAI,CAACN,OAAO,CAAC,EAAEA,OAAO,CAAC,EAAE;IACjE,MAAML,oBAAoB,CAACC,MAAM,CAAC;EACpC;EAEA,IAAIK,IAAI,CAACC,eAAe,KAAK,KAAK,IAAIN,MAAM,CAACW,MAAM,KAAKH,eAAC,CAACE,IAAI,CAACV,MAAM,CAAC,CAACW,MAAM,EAAE;IAC7E,OAAO,CAAC;EACV;EAEAX,MAAM,GAAGK,IAAI,CAACC,eAAe,KAAK,KAAK,GAAGN,MAAM,GAAGQ,eAAC,CAACE,IAAI,CAACV,MAAM,CAAC;EAEjEH,GAAG,CAAC,SAAS,EAAEG,MAAM,CAAC;EACtB,IAAI,CAACY,KAAK,CAACC,OAAO,CAACT,OAAO,CAAC,IAAIA,OAAO,CAACO,MAAM,KAAK,CAAC,EAAE;IACnD,MAAM,IAAIV,KAAK,CAAC,oCAAoC,CAAC;EACvD;EAEA,IAAIG,OAAO,CAACO,MAAM,KAAK,CAAC,EAAE;IACxB,OAAOH,eAAC,CAACC,OAAO,CAACL,OAAO,EAAEJ,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;EAC3C;EAEA,IAAI,CAACY,KAAK,CAACC,OAAO,CAACb,MAAM,CAAC,IAAIA,MAAM,CAACW,MAAM,GAAG,CAAC,EAAE;IAC/C,OAAO,CAAC;EACV;EAEA,IAAIX,MAAM,CAACW,MAAM,GAAGP,OAAO,CAACO,MAAM,EAAE;IAClC,OAAO,CAAC;EACV;EAEA,IAAIP,OAAO,CAACO,MAAM,KAAKX,MAAM,CAACW,MAAM,IAAIN,IAAI,CAACE,mBAAmB,EAAE;IAChE,OAAO,CAAC;EACV;EAEA,MAAMO,YAAY,GAAG,IAAAC,4BAAW,EAACX,OAAO,EAAE,CAAC,CAAC,CAACY,OAAO,CAAC,CAAC;EACtD,MAAMC,WAAW,GAAG,IAAAF,4BAAW,EAACf,MAAM,EAAE,CAAC,CAAC,CAACgB,OAAO,CAAC,CAAC;EAEpD,MAAME,IAAI,GAAGV,eAAC,CAACW,cAAc,CAACF,WAAW,EAAEH,YAAY,EAAEN,eAAC,CAACC,OAAO,CAAC;EAEnE,MAAMW,eAAe,GAAGN,YAAY,CAACH,MAAM,GAAGM,WAAW,CAACN,MAAM;EAEhE,MAAMU,KAAK,GAAGP,YAAY,CAACH,MAAM;EACjC,MAAMW,MAAM,GAAGD,KAAK,GAAGH,IAAI,CAACP,MAAM,GAAGS,eAAe;EAEpD,MAAMG,CAAC,GAAG,CAACD,MAAM,GAAGD,KAAK,EAAEG,OAAO,CAAC,CAAC,CAAC;EAErC,OAAOC,UAAU,CAACF,CAAC,CAAC;AACtB,CAAC;;AAED;AACA;AACA;AACA;AAHArB,OAAA,CAAAC,wBAAA,GAAAA,wBAAA;AAIO,MAAMuB,cAAc,GAAIC,QAAQ,IACrCA,QAAQ,CAACC,eAAe,GAAGD,QAAQ,CAACC,eAAe,CAACC,GAAG,CAAEC,CAAC,IAAMA,CAAC,IAAIA,CAAC,CAACC,EAAE,GAAGD,CAAC,CAACC,EAAE,GAAGD,CAAE,CAAC,GAAG,EAAE;;AAE7F;AACA;AACA;AACA;AAHA5B,OAAA,CAAAwB,cAAA,GAAAA,cAAA;AAIO,MAAMM,sBAAsB,GAAIL,QAAQ,IAAK;EAClD,MAAMM,UAAU,GAAG,CAACN,QAAQ,CAACO,kBAAkB,IAAI,EAAE,EAAEL,GAAG,CAAEM,SAAS,IAAK;IACxE,IAAIvB,KAAK,CAACC,OAAO,CAACsB,SAAS,CAAC,EAAE;MAC5B,OAAOA,SAAS;IAClB;IAEA,OAAOA,SAAS,CAACC,QAAQ;EAC3B,CAAC,CAAC,CAACC,MAAM,CAACC,IAAI,IAAIA,IAAI,KAAKC,SAAS,CAAC;EAErC,OAAO,CAACb,cAAc,CAACC,QAAQ,CAAC,EAAE,GAAGM,UAAU,CAAC;AAClD,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AALA/B,OAAA,CAAA8B,sBAAA,GAAAA,sBAAA;AAOO,MAAMQ,KAAK,GAAGA,CAACb,QAAQ,EAAEc,OAAO,KAAK;EAC1C,MAAM;IAAEC;EAAM,CAAC,GAAGD,OAAO,IAAI,CAAC,CAAC;EAE/B,IAAI,CAACC,KAAK,EAAE;IACV,OAAO,CAAC;EACV;EAEA,MAAMC,kBAAkB,GAAGX,sBAAsB,CAACL,QAAQ,CAAC;EAC3D,MAAMrB,eAAe,GAAG,CAACqB,QAAQ,CAACiB,SAAS,IAAIjB,QAAQ,CAACiB,SAAS,CAACC,uBAAuB,MAAM,KAAK;;EAEpG;AACF;AACA;EACE;;EAEA,IAAIC,SAAS,GAAG,CAAC;EAEjBH,kBAAkB,CAACI,OAAO,CAAEC,EAAE,IAAK;IACjC,MAAMC,YAAY,GAAG9C,wBAAwB,CAAC6C,EAAE,EAAEN,KAAK,EAAE;MACvDpC;IACF,CAAC,CAAC;IAEF,IAAI2C,YAAY,IAAIH,SAAS,EAAE;MAC7BA,SAAS,GAAGG,YAAY;IAC1B;EACF,CAAC,CAAC;EAEF,OAAOH,SAAS;AAClB,CAAC;AAAC5C,OAAA,CAAAsC,KAAA,GAAAA,KAAA","ignoreList":[]}
|
package/controller/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pie-element/placement-ordering-controller",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "10.0.0-beta.1",
|
|
4
4
|
"private": true,
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"module": "src/index.js",
|
|
7
7
|
"dependencies": {
|
|
8
|
-
"@pie-lib/controller-utils": "0.
|
|
9
|
-
"@pie-lib/feedback": "0.
|
|
10
|
-
"@pie-lib/translator": "
|
|
8
|
+
"@pie-lib/controller-utils": "1.1.0-next.4",
|
|
9
|
+
"@pie-lib/feedback": "1.1.0-next.4",
|
|
10
|
+
"@pie-lib/translator": "3.1.0-next.4",
|
|
11
11
|
"debug": "^3.1.0",
|
|
12
12
|
"js-combinatorics": "^0.5.4",
|
|
13
13
|
"lodash": "^4.17.19"
|
package/lib/index.js
CHANGED
|
@@ -1,149 +1,85 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
|
-
exports.isValidSession = exports
|
|
9
|
-
Object.defineProperty(exports, "swap", {
|
|
10
|
-
enumerable: true,
|
|
11
|
-
get: function get() {
|
|
12
|
-
return _ordering.swap;
|
|
13
|
-
}
|
|
14
|
-
});
|
|
15
|
-
Object.defineProperty(exports, "withDragContext", {
|
|
16
|
-
enumerable: true,
|
|
17
|
-
get: function get() {
|
|
18
|
-
return _drag.withDragContext;
|
|
19
|
-
}
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
23
|
-
|
|
24
|
-
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
25
|
-
|
|
26
|
-
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
|
|
27
|
-
|
|
28
|
-
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
29
|
-
|
|
30
|
-
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
|
31
|
-
|
|
32
|
-
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
33
|
-
|
|
34
|
-
var _wrapNativeSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/wrapNativeSuper"));
|
|
35
|
-
|
|
7
|
+
exports.isValidSession = exports.default = void 0;
|
|
36
8
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
37
|
-
|
|
38
9
|
var _react = _interopRequireDefault(require("react"));
|
|
39
|
-
|
|
40
|
-
var _reactDom = _interopRequireDefault(require("react-dom"));
|
|
41
|
-
|
|
10
|
+
var _client = require("react-dom/client");
|
|
42
11
|
var _compact = _interopRequireDefault(require("lodash/compact"));
|
|
43
|
-
|
|
44
12
|
var _debug = _interopRequireDefault(require("debug"));
|
|
45
|
-
|
|
46
13
|
var _mathRendering = require("@pie-lib/math-rendering");
|
|
47
|
-
|
|
48
|
-
var _drag = require("@pie-lib/drag");
|
|
49
|
-
|
|
50
14
|
var _piePlayerEvents = require("@pie-framework/pie-player-events");
|
|
51
|
-
|
|
52
15
|
var _main = _interopRequireDefault(require("./main"));
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
var config = model.config;
|
|
66
|
-
var compactSessionValues = session && (0, _compact["default"])(session.value) || [];
|
|
67
|
-
var completeSession = compactSessionValues.length === model.choices.length; // if it includes targets, it doesn't have to contain all the choices selected (eg: only 2 targets were filled)
|
|
16
|
+
const log = (0, _debug.default)('pie-elements:placement-ordering');
|
|
17
|
+
const isValidSession = ({
|
|
18
|
+
model,
|
|
19
|
+
session
|
|
20
|
+
}) => {
|
|
21
|
+
const {
|
|
22
|
+
config
|
|
23
|
+
} = model;
|
|
24
|
+
const compactSessionValues = session && (0, _compact.default)(session.value) || [];
|
|
25
|
+
const completeSession = compactSessionValues.length === model.choices.length;
|
|
26
|
+
|
|
27
|
+
// if it includes targets, it doesn't have to contain all the choices selected (eg: only 2 targets were filled)
|
|
68
28
|
// but if it does not include targets, it's a must to have all choices selected
|
|
69
|
-
|
|
70
29
|
return config.includeTargets || completeSession;
|
|
71
30
|
};
|
|
72
|
-
|
|
73
31
|
exports.isValidSession = isValidSession;
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
(0, _classCallCheck2["default"])(this, Ordering);
|
|
84
|
-
|
|
85
|
-
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
86
|
-
args[_key] = arguments[_key];
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
_this = _super.call.apply(_super, [this].concat(args));
|
|
90
|
-
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "isComplete", function (value) {
|
|
91
|
-
return value && (0, _compact["default"])(value).length === _this._model.completeLength;
|
|
92
|
-
});
|
|
93
|
-
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "sessionChange", function (session) {
|
|
94
|
-
_this._session.value = session.value;
|
|
95
|
-
|
|
96
|
-
_this.render();
|
|
97
|
-
|
|
98
|
-
_this.dispatchEvent(new _piePlayerEvents.SessionChangedEvent(_this.tagName.toLowerCase(), _this._session && _this.isComplete(_this._session.value)));
|
|
32
|
+
class Ordering extends HTMLElement {
|
|
33
|
+
constructor() {
|
|
34
|
+
super();
|
|
35
|
+
(0, _defineProperty2.default)(this, "isComplete", value => value && (0, _compact.default)(value).length === this._model.completeLength);
|
|
36
|
+
(0, _defineProperty2.default)(this, "sessionChange", session => {
|
|
37
|
+
this._session.value = session.value;
|
|
38
|
+
this.render();
|
|
39
|
+
this.dispatchEvent(new _piePlayerEvents.SessionChangedEvent(this.tagName.toLowerCase(), this._session && this.isComplete(this._session.value)));
|
|
99
40
|
});
|
|
100
|
-
|
|
41
|
+
this._root = null;
|
|
101
42
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
bubbles: true,
|
|
110
|
-
detail: {
|
|
111
|
-
complete: false
|
|
112
|
-
}
|
|
113
|
-
}));
|
|
114
|
-
}
|
|
115
|
-
}, {
|
|
116
|
-
key: "session",
|
|
117
|
-
get: function get() {
|
|
118
|
-
return this._session;
|
|
119
|
-
},
|
|
120
|
-
set: function set(newSession) {
|
|
121
|
-
this._session = newSession;
|
|
122
|
-
this.render();
|
|
123
|
-
}
|
|
124
|
-
}, {
|
|
125
|
-
key: "render",
|
|
126
|
-
value: function render() {
|
|
127
|
-
var _this2 = this;
|
|
128
|
-
|
|
129
|
-
if (this._model && this._session) {
|
|
130
|
-
log('[render] session: ', this._session.value);
|
|
131
|
-
log('[render] model: ', this._model);
|
|
132
|
-
|
|
133
|
-
var element = /*#__PURE__*/_react["default"].createElement(_main["default"], {
|
|
134
|
-
model: this._model,
|
|
135
|
-
session: this._session,
|
|
136
|
-
onSessionChange: this.sessionChange
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
_reactDom["default"].render(element, this, function () {
|
|
140
|
-
(0, _mathRendering.renderMath)(_this2);
|
|
141
|
-
});
|
|
43
|
+
set model(newModel) {
|
|
44
|
+
this._model = newModel;
|
|
45
|
+
this.render();
|
|
46
|
+
this.dispatchEvent(new CustomEvent('model-set', {
|
|
47
|
+
bubbles: true,
|
|
48
|
+
detail: {
|
|
49
|
+
complete: false
|
|
142
50
|
}
|
|
51
|
+
}));
|
|
52
|
+
}
|
|
53
|
+
set session(newSession) {
|
|
54
|
+
this._session = newSession;
|
|
55
|
+
this.render();
|
|
56
|
+
}
|
|
57
|
+
get session() {
|
|
58
|
+
return this._session;
|
|
59
|
+
}
|
|
60
|
+
render() {
|
|
61
|
+
if (this._model && this._session) {
|
|
62
|
+
log('[render] session: ', this._session.value);
|
|
63
|
+
log('[render] model: ', this._model);
|
|
64
|
+
const element = /*#__PURE__*/_react.default.createElement(_main.default, {
|
|
65
|
+
model: this._model,
|
|
66
|
+
session: this._session,
|
|
67
|
+
onSessionChange: this.sessionChange
|
|
68
|
+
});
|
|
69
|
+
if (!this._root) {
|
|
70
|
+
this._root = (0, _client.createRoot)(this);
|
|
71
|
+
}
|
|
72
|
+
this._root.render(element);
|
|
73
|
+
queueMicrotask(() => {
|
|
74
|
+
(0, _mathRendering.renderMath)(this);
|
|
75
|
+
});
|
|
143
76
|
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
77
|
+
}
|
|
78
|
+
disconnectedCallback() {
|
|
79
|
+
if (this._root) {
|
|
80
|
+
this._root.unmount();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
exports.default = Ordering;
|
|
149
85
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"index.js","names":["_react","_interopRequireDefault","require","_client","_compact","_debug","_mathRendering","_piePlayerEvents","_main","log","debug","isValidSession","model","session","config","compactSessionValues","compact","value","completeSession","length","choices","includeTargets","exports","Ordering","HTMLElement","constructor","_defineProperty2","default","_model","completeLength","_session","render","dispatchEvent","SessionChangedEvent","tagName","toLowerCase","isComplete","_root","newModel","CustomEvent","bubbles","detail","complete","newSession","element","React","createElement","Main","onSessionChange","sessionChange","createRoot","queueMicrotask","renderMath","disconnectedCallback","unmount"],"sources":["../src/index.js"],"sourcesContent":["import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport compact from 'lodash/compact';\nimport debug from 'debug';\nimport { renderMath } from '@pie-lib/math-rendering';\nimport { SessionChangedEvent } from '@pie-framework/pie-player-events';\nimport Main from './main';\n\nconst log = debug('pie-elements:placement-ordering');\n\nexport const isValidSession = ({ model, session }) => {\n const { config } = model;\n\n const compactSessionValues = (session && compact(session.value)) || [];\n const completeSession = compactSessionValues.length === model.choices.length;\n\n // if it includes targets, it doesn't have to contain all the choices selected (eg: only 2 targets were filled)\n // but if it does not include targets, it's a must to have all choices selected\n return config.includeTargets || completeSession;\n};\n\nexport default class Ordering extends HTMLElement {\n constructor() {\n super();\n this._root = null;\n }\n\n isComplete = (value) => value && compact(value).length === this._model.completeLength;\n\n sessionChange = (session) => {\n this._session.value = session.value;\n this.render();\n this.dispatchEvent(\n new SessionChangedEvent(this.tagName.toLowerCase(), this._session && this.isComplete(this._session.value)),\n );\n };\n\n set model(newModel) {\n this._model = newModel;\n\n this.render();\n this.dispatchEvent(\n new CustomEvent('model-set', {\n bubbles: true,\n detail: {\n complete: false,\n },\n }),\n );\n }\n\n set session(newSession) {\n this._session = newSession;\n this.render();\n }\n\n get session() {\n return this._session;\n }\n\n render() {\n if (this._model && this._session) {\n log('[render] session: ', this._session.value);\n log('[render] model: ', this._model);\n\n const element = React.createElement(Main, {\n model: this._model,\n session: this._session,\n onSessionChange: this.sessionChange,\n });\n\n if (!this._root) {\n this._root = createRoot(this);\n }\n this._root.render(element);\n queueMicrotask(() => {\n renderMath(this);\n });\n }\n }\n\n disconnectedCallback() {\n if (this._root) {\n this._root.unmount();\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|