@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.
Files changed (47) hide show
  1. package/CHANGELOG.md +0 -11
  2. package/configure/CHANGELOG.md +0 -11
  3. package/configure/lib/choice-editor.js +189 -414
  4. package/configure/lib/choice-editor.js.map +1 -1
  5. package/configure/lib/choice-tile.js +172 -263
  6. package/configure/lib/choice-tile.js.map +1 -1
  7. package/configure/lib/defaults.js +2 -4
  8. package/configure/lib/defaults.js.map +1 -1
  9. package/configure/lib/design.js +389 -455
  10. package/configure/lib/design.js.map +1 -1
  11. package/configure/lib/help.js +5 -13
  12. package/configure/lib/help.js.map +1 -1
  13. package/configure/lib/index.js +118 -193
  14. package/configure/lib/index.js.map +1 -1
  15. package/configure/lib/utils.js +99 -4
  16. package/configure/lib/utils.js.map +1 -1
  17. package/configure/package.json +12 -10
  18. package/controller/CHANGELOG.md +0 -11
  19. package/controller/lib/defaults.js +2 -3
  20. package/controller/lib/defaults.js.map +1 -1
  21. package/controller/lib/index.js +133 -218
  22. package/controller/lib/index.js.map +1 -1
  23. package/controller/lib/scoring.js +35 -78
  24. package/controller/lib/scoring.js.map +1 -1
  25. package/controller/package.json +4 -4
  26. package/lib/index.js +63 -127
  27. package/lib/index.js.map +1 -1
  28. package/lib/main.js +20 -57
  29. package/lib/main.js.map +1 -1
  30. package/lib/ordering.js +52 -98
  31. package/lib/ordering.js.map +1 -1
  32. package/lib/placement-ordering.js +331 -381
  33. package/lib/placement-ordering.js.map +1 -1
  34. package/lib/tile.js +193 -267
  35. package/lib/tile.js.map +1 -1
  36. package/lib/tiler.js +126 -204
  37. package/lib/tiler.js.map +1 -1
  38. package/lib/utils.js +6 -18
  39. package/lib/utils.js.map +1 -1
  40. package/package.json +14 -11
  41. package/esm/configure.js +0 -25814
  42. package/esm/configure.js.map +0 -1
  43. package/esm/controller.js +0 -21221
  44. package/esm/controller.js.map +0 -1
  45. package/esm/element.js +0 -17874
  46. package/esm/element.js.map +0 -1
  47. 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
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
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
- var pairwiseCombinationScore = function pairwiseCombinationScore(correct, answer, opts) {
33
- opts = _objectSpread({
14
+ const pairwiseCombinationScore = (correct, answer, opts) => {
15
+ opts = {
34
16
  allowDuplicates: false,
35
- orderMustBeComplete: false
36
- }, opts);
37
-
38
- if (!opts.allowDuplicates && !_lodash["default"].isEqual(_lodash["default"].uniq(correct), correct)) {
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["default"].isEqual(correct, answer) ? 1 : 0;
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
- var correctCombo = (0, _jsCombinatorics.combination)(correct, 2).toArray();
70
- var answerCombo = (0, _jsCombinatorics.combination)(answer, 2).toArray();
71
-
72
- var diff = _lodash["default"].differenceWith(answerCombo, correctCombo, _lodash["default"].isEqual);
73
-
74
- var comboLengthDiff = correctCombo.length - answerCombo.length;
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
- var getAllCorrectResponses = function getAllCorrectResponses(question) {
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(function (item) {
109
- return item !== undefined;
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
- var score = function score(question, session) {
124
- var _ref = session || {},
125
- value = _ref.value;
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
- var bestScore = 0;
139
- allCorrectResponse.forEach(function (cr) {
140
- var currentScore = pairwiseCombinationScore(cr, value, {
141
- allowDuplicates: 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,"sources":["../src/scoring.js"],"names":["log","illegalArgumentError","answer","Error","pairwiseCombinationScore","correct","opts","allowDuplicates","orderMustBeComplete","_","isEqual","uniq","length","Array","isArray","correctCombo","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"],"mappings":"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","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"],"file":"scoring.js"}
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":"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","ignoreList":[]}
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@pie-element/placement-ordering-controller",
3
- "version": "9.3.3",
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.22.2",
9
- "@pie-lib/feedback": "0.24.1",
10
- "@pie-lib/translator": "2.23.1",
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["default"] = void 0;
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
- var _ordering = require("./ordering");
55
-
56
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
57
-
58
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
59
-
60
- var log = (0, _debug["default"])('pie-elements:placement-ordering');
61
-
62
- var isValidSession = function isValidSession(_ref) {
63
- var model = _ref.model,
64
- session = _ref.session;
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
- var Ordering = /*#__PURE__*/function (_HTMLElement) {
76
- (0, _inherits2["default"])(Ordering, _HTMLElement);
77
-
78
- var _super = _createSuper(Ordering);
79
-
80
- function Ordering() {
81
- var _this;
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
- return _this;
41
+ this._root = null;
101
42
  }
102
-
103
- (0, _createClass2["default"])(Ordering, [{
104
- key: "model",
105
- set: function set(newModel) {
106
- this._model = newModel;
107
- this.render();
108
- this.dispatchEvent(new CustomEvent('model-set', {
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
- return Ordering;
146
- }( /*#__PURE__*/(0, _wrapNativeSuper2["default"])(HTMLElement));
147
-
148
- exports["default"] = Ordering;
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,"sources":["../src/index.js"],"names":["log","isValidSession","model","session","config","compactSessionValues","value","completeSession","length","choices","includeTargets","Ordering","_model","completeLength","_session","render","dispatchEvent","SessionChangedEvent","tagName","toLowerCase","isComplete","newModel","CustomEvent","bubbles","detail","complete","newSession","element","React","createElement","Main","onSessionChange","sessionChange","ReactDOM","HTMLElement"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;AAEA,IAAMA,GAAG,GAAG,uBAAM,iCAAN,CAAZ;;AAIO,IAAMC,cAAc,GAAG,SAAjBA,cAAiB,OAAwB;AAAA,MAArBC,KAAqB,QAArBA,KAAqB;AAAA,MAAdC,OAAc,QAAdA,OAAc;AACpD,MAAQC,MAAR,GAAmBF,KAAnB,CAAQE,MAAR;AAEA,MAAMC,oBAAoB,GAAIF,OAAO,IAAI,yBAAQA,OAAO,CAACG,KAAhB,CAAZ,IAAuC,EAApE;AACA,MAAMC,eAAe,GAAGF,oBAAoB,CAACG,MAArB,KAAgCN,KAAK,CAACO,OAAN,CAAcD,MAAtE,CAJoD,CAMpD;AACA;;AACA,SAAOJ,MAAM,CAACM,cAAP,IAAyBH,eAAhC;AACD,CATM;;;;IAWcI,Q;;;;;;;;;;;;;;;mGACN,UAACL,KAAD;AAAA,aAAWA,KAAK,IAAI,yBAAQA,KAAR,EAAeE,MAAf,KAA0B,MAAKI,MAAL,CAAYC,cAA1D;AAAA,K;sGAEG,UAACV,OAAD,EAAa;AAC3B,YAAKW,QAAL,CAAcR,KAAd,GAAsBH,OAAO,CAACG,KAA9B;;AACA,YAAKS,MAAL;;AACA,YAAKC,aAAL,CACE,IAAIC,oCAAJ,CAAwB,MAAKC,OAAL,CAAaC,WAAb,EAAxB,EAAoD,MAAKL,QAAL,IAAiB,MAAKM,UAAL,CAAgB,MAAKN,QAAL,CAAcR,KAA9B,CAArE,CADF;AAGD,K;;;;;;SAED,aAAUe,QAAV,EAAoB;AAClB,WAAKT,MAAL,GAAcS,QAAd;AAEA,WAAKN,MAAL;AACA,WAAKC,aAAL,CACE,IAAIM,WAAJ,CAAgB,WAAhB,EAA6B;AAC3BC,QAAAA,OAAO,EAAE,IADkB;AAE3BC,QAAAA,MAAM,EAAE;AACNC,UAAAA,QAAQ,EAAE;AADJ;AAFmB,OAA7B,CADF;AAQD;;;SAOD,eAAc;AACZ,aAAO,KAAKX,QAAZ;AACD,K;SAPD,aAAYY,UAAZ,EAAwB;AACtB,WAAKZ,QAAL,GAAgBY,UAAhB;AACA,WAAKX,MAAL;AACD;;;WAMD,kBAAS;AAAA;;AACP,UAAI,KAAKH,MAAL,IAAe,KAAKE,QAAxB,EAAkC;AAChCd,QAAAA,GAAG,CAAC,oBAAD,EAAuB,KAAKc,QAAL,CAAcR,KAArC,CAAH;AACAN,QAAAA,GAAG,CAAC,kBAAD,EAAqB,KAAKY,MAA1B,CAAH;;AAEA,YAAMe,OAAO,gBAAGC,kBAAMC,aAAN,CAAoBC,gBAApB,EAA0B;AACxC5B,UAAAA,KAAK,EAAE,KAAKU,MAD4B;AAExCT,UAAAA,OAAO,EAAE,KAAKW,QAF0B;AAGxCiB,UAAAA,eAAe,EAAE,KAAKC;AAHkB,SAA1B,CAAhB;;AAMAC,6BAASlB,MAAT,CAAgBY,OAAhB,EAAyB,IAAzB,EAA+B,YAAM;AACnC,yCAAW,MAAX;AACD,SAFD;AAGD;AACF;;;kDAjDmCO,W","sourcesContent":["import React from 'react';\nimport ReactDOM from 'react-dom';\nimport compact from 'lodash/compact';\nimport debug from 'debug';\nimport { renderMath } from '@pie-lib/math-rendering';\nimport { withDragContext } from '@pie-lib/drag';\nimport { SessionChangedEvent } from '@pie-framework/pie-player-events';\nimport Main from './main';\nimport { swap } from './ordering';\n\nconst log = debug('pie-elements:placement-ordering');\n\nexport { withDragContext, swap };\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 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 ReactDOM.render(element, this, () => {\n renderMath(this);\n });\n }\n }\n}\n"],"file":"index.js"}
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":[]}