@pie-element/ebsr 9.8.1-next.1 → 9.9.1-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,18 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [9.9.0](https://github.com/pie-framework/pie-elements/compare/@pie-element/ebsr@9.8.0...@pie-element/ebsr@9.9.0) (2024-04-01)
7
+
8
+
9
+ ### Features
10
+
11
+ * **ebsr:** add required fields functionality and fix validation PD-3592 ([a7fe66f](https://github.com/pie-framework/pie-elements/commit/a7fe66f2e46b0369efc6042e03194de437aff91c))
12
+ * update pie-lib/pie-toolbox PD-3567, PD-3426 ([2a706d7](https://github.com/pie-framework/pie-elements/commit/2a706d799bb000c60b7a77a790de9dc66345ebf5))
13
+
14
+
15
+
16
+
17
+
6
18
  # [9.8.0](https://github.com/pie-framework/pie-elements/compare/@pie-element/ebsr@9.7.1...@pie-element/ebsr@9.8.0) (2024-03-28)
7
19
 
8
20
 
@@ -3,6 +3,18 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [9.7.0](https://github.com/pie-framework/pie-elements/compare/@pie-element/ebsr-configure@9.6.0...@pie-element/ebsr-configure@9.7.0) (2024-04-01)
7
+
8
+
9
+ ### Features
10
+
11
+ * **ebsr:** add required fields functionality and fix validation PD-3592 ([a7fe66f](https://github.com/pie-framework/pie-elements/commit/a7fe66f2e46b0369efc6042e03194de437aff91c))
12
+ * update pie-lib/pie-toolbox PD-3567, PD-3426 ([2a706d7](https://github.com/pie-framework/pie-elements/commit/2a706d799bb000c60b7a77a790de9dc66345ebf5))
13
+
14
+
15
+
16
+
17
+
6
18
  # [9.6.0](https://github.com/pie-framework/pie-elements/compare/@pie-element/ebsr-configure@9.5.2...@pie-element/ebsr-configure@9.6.0) (2024-03-28)
7
19
 
8
20
 
@@ -52,7 +52,8 @@ var defaultConfig = {
52
52
  image: {
53
53
  disabled: false
54
54
  }
55
- }
55
+ },
56
+ required: false
56
57
  },
57
58
  rationale: {
58
59
  settings: true,
@@ -67,7 +68,8 @@ var defaultConfig = {
67
68
  image: {
68
69
  disabled: false
69
70
  }
70
- }
71
+ },
72
+ required: false
71
73
  },
72
74
  settingsPanelDisabled: true,
73
75
  studentInstructions: {
@@ -87,7 +89,8 @@ var defaultConfig = {
87
89
  image: {
88
90
  disabled: false
89
91
  }
90
- }
92
+ },
93
+ required: false
91
94
  },
92
95
  choicesLayout: {
93
96
  settings: false,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/defaults.js"],"names":["defaultConfig","addChoiceButton","settings","label","choiceMode","choicePrefix","deleteChoice","feedback","lockChoiceOrder","prompt","inputConfiguration","audio","disabled","video","image","rationale","settingsPanelDisabled","studentInstructions","teacherInstructions","choicesLayout","gridColumns","spellCheck","enabled","maxImageWidth","choices","maxImageHeight","mathMlOptions","mmlOutput","mmlEditing","baseInputConfiguration","partModel","base","rationaleEnabled","feedbackEnabled","promptEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","spellCheckEnabled","model","partLabels","partLabelType","partA","partB","configuration","partialScoring","scoringType","language","languageChoices","options"],"mappings":"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","sourcesContent":["import cloneDeep from 'lodash/cloneDeep';\n\nconst defaultConfig = {\n addChoiceButton: {\n settings: true,\n label: 'Add a Choice',\n },\n choiceMode: {\n settings: true,\n label: 'Response Type',\n },\n choicePrefix: {\n settings: true,\n label: 'Choice Labels',\n },\n deleteChoice: {\n settings: true,\n },\n feedback: {\n settings: true,\n label: 'Feedback',\n },\n lockChoiceOrder: {\n settings: true,\n label: 'Lock Choice Order',\n },\n prompt: {\n settings: true,\n label: 'Prompt',\n inputConfiguration: {\n audio: { disabled: false },\n video: { disabled: false },\n image: { disabled: false },\n }\n },\n rationale: {\n settings: true,\n label: 'Rationale',\n inputConfiguration: {\n audio: { disabled: false },\n video: { disabled: false },\n image: { disabled: false },\n }\n },\n settingsPanelDisabled: true,\n studentInstructions: {\n settings: false,\n label: 'Student Instructions',\n },\n teacherInstructions: {\n settings: true,\n label: 'Teacher Instructions',\n inputConfiguration: {\n audio: { disabled: false },\n video: { disabled: false },\n image: { disabled: false },\n }\n },\n choicesLayout: {\n settings: false,\n label: 'Choices Layout',\n },\n gridColumns: {\n label: 'Grid columns',\n },\n spellCheck: {\n label: 'Spellcheck',\n settings: false,\n enabled: true,\n },\n maxImageWidth: {\n teacherInstructions: 300,\n prompt: 300,\n rationale: 636,\n choices: 636,\n },\n maxImageHeight: {\n teacherInstructions: 300,\n prompt: 300,\n rationale: 300,\n choices: 300,\n },\n mathMlOptions: {\n mmlOutput: false,\n mmlEditing: false,\n },\n choices: {\n inputConfiguration: {\n audio: { disabled: false },\n video: { disabled: false },\n image: { disabled: false },\n },\n },\n baseInputConfiguration: {\n audio: { disabled: false },\n video: { disabled: false },\n image: { disabled: false },\n },\n};\n\nconst partModel = (base) => ({\n choiceMode: 'radio',\n choices: [],\n choicePrefix: 'numbers',\n prompt: 'Prompt',\n rationaleEnabled: true,\n feedbackEnabled: false,\n promptEnabled: true,\n teacherInstructions: '',\n rationale: '',\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n spellCheckEnabled: true,\n choicesLayout: 'vertical',\n gridColumns: '2',\n ...base,\n});\n\nexport default {\n model: {\n partLabels: true,\n partLabelType: 'Letters',\n // partialScoring: false,\n partA: partModel({ prompt: 'Prompt A' }),\n partB: partModel({ prompt: 'Prompt B' }),\n },\n configuration: {\n baseInputConfiguration: {\n audio: { disabled: false },\n video: { disabled: false },\n image: { disabled: false },\n },\n partialScoring: {\n label: 'Allow Partial Scoring',\n // this will turn off partial scoring toggle in the settings tab by default for the interaction\n // as we'd like partial scoring to be controlled from the environment entirely\n // if any other consumers would like to enable it for themselves, they can do so from their model directly.\n settings: false,\n },\n scoringType: {\n settings: false,\n label: 'Scoring Type',\n },\n partA: cloneDeep(defaultConfig),\n partB: cloneDeep(defaultConfig),\n partLabels: {\n settings: true,\n label: 'Part Labels',\n },\n settingsPanelDisabled: false,\n language: {\n settings: false,\n label: 'Specify Language',\n enabled: false,\n },\n languageChoices: {\n label: 'Language Choices',\n options: [],\n }\n },\n};\n"],"file":"defaults.js"}
1
+ {"version":3,"sources":["../src/defaults.js"],"names":["defaultConfig","addChoiceButton","settings","label","choiceMode","choicePrefix","deleteChoice","feedback","lockChoiceOrder","prompt","inputConfiguration","audio","disabled","video","image","required","rationale","settingsPanelDisabled","studentInstructions","teacherInstructions","choicesLayout","gridColumns","spellCheck","enabled","maxImageWidth","choices","maxImageHeight","mathMlOptions","mmlOutput","mmlEditing","baseInputConfiguration","partModel","base","rationaleEnabled","feedbackEnabled","promptEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","spellCheckEnabled","model","partLabels","partLabelType","partA","partB","configuration","partialScoring","scoringType","language","languageChoices","options"],"mappings":"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","sourcesContent":["import cloneDeep from 'lodash/cloneDeep';\n\nconst defaultConfig = {\n addChoiceButton: {\n settings: true,\n label: 'Add a Choice',\n },\n choiceMode: {\n settings: true,\n label: 'Response Type',\n },\n choicePrefix: {\n settings: true,\n label: 'Choice Labels',\n },\n deleteChoice: {\n settings: true,\n },\n feedback: {\n settings: true,\n label: 'Feedback',\n },\n lockChoiceOrder: {\n settings: true,\n label: 'Lock Choice Order',\n },\n prompt: {\n settings: true,\n label: 'Prompt',\n inputConfiguration: {\n audio: { disabled: false },\n video: { disabled: false },\n image: { disabled: false },\n },\n required: false,\n },\n rationale: {\n settings: true,\n label: 'Rationale',\n inputConfiguration: {\n audio: { disabled: false },\n video: { disabled: false },\n image: { disabled: false },\n },\n required: false,\n },\n settingsPanelDisabled: true,\n studentInstructions: {\n settings: false,\n label: 'Student Instructions',\n },\n teacherInstructions: {\n settings: true,\n label: 'Teacher Instructions',\n inputConfiguration: {\n audio: { disabled: false },\n video: { disabled: false },\n image: { disabled: false },\n },\n required: false,\n },\n choicesLayout: {\n settings: false,\n label: 'Choices Layout',\n },\n gridColumns: {\n label: 'Grid columns',\n },\n spellCheck: {\n label: 'Spellcheck',\n settings: false,\n enabled: true,\n },\n maxImageWidth: {\n teacherInstructions: 300,\n prompt: 300,\n rationale: 636,\n choices: 636,\n },\n maxImageHeight: {\n teacherInstructions: 300,\n prompt: 300,\n rationale: 300,\n choices: 300,\n },\n mathMlOptions: {\n mmlOutput: false,\n mmlEditing: false,\n },\n choices: {\n inputConfiguration: {\n audio: { disabled: false },\n video: { disabled: false },\n image: { disabled: false },\n },\n },\n baseInputConfiguration: {\n audio: { disabled: false },\n video: { disabled: false },\n image: { disabled: false },\n },\n};\n\nconst partModel = (base) => ({\n choiceMode: 'radio',\n choices: [],\n choicePrefix: 'numbers',\n prompt: 'Prompt',\n rationaleEnabled: true,\n feedbackEnabled: false,\n promptEnabled: true,\n teacherInstructions: '',\n rationale: '',\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n spellCheckEnabled: true,\n choicesLayout: 'vertical',\n gridColumns: '2',\n ...base,\n});\n\nexport default {\n model: {\n partLabels: true,\n partLabelType: 'Letters',\n // partialScoring: false,\n partA: partModel({ prompt: 'Prompt A' }),\n partB: partModel({ prompt: 'Prompt B' }),\n },\n configuration: {\n baseInputConfiguration: {\n audio: { disabled: false },\n video: { disabled: false },\n image: { disabled: false },\n },\n partialScoring: {\n label: 'Allow Partial Scoring',\n // this will turn off partial scoring toggle in the settings tab by default for the interaction\n // as we'd like partial scoring to be controlled from the environment entirely\n // if any other consumers would like to enable it for themselves, they can do so from their model directly.\n settings: false,\n },\n scoringType: {\n settings: false,\n label: 'Scoring Type',\n },\n partA: cloneDeep(defaultConfig),\n partB: cloneDeep(defaultConfig),\n partLabels: {\n settings: true,\n label: 'Part Labels',\n },\n settingsPanelDisabled: false,\n language: {\n settings: false,\n label: 'Specify Language',\n enabled: false,\n },\n languageChoices: {\n label: 'Language Choices',\n options: [],\n }\n },\n};\n"],"file":"defaults.js"}
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "name": "@pie-element/ebsr-configure",
3
3
  "private": true,
4
- "version": "9.6.0",
4
+ "version": "9.7.0",
5
5
  "description": "",
6
6
  "main": "lib/index.js",
7
7
  "module": "src/index.js",
8
8
  "author": "",
9
9
  "dependencies": {
10
10
  "@material-ui/core": "^3.9.2",
11
- "@pie-element/multiple-choice": "^8.10.0",
11
+ "@pie-element/multiple-choice": "^8.11.0",
12
12
  "@pie-framework/pie-configure-events": "^1.2.0",
13
13
  "@pie-lib/pie-toolbox": "1.12.3",
14
14
  "lodash": "^4.17.15",
@@ -31,7 +31,8 @@ const defaultConfig = {
31
31
  audio: { disabled: false },
32
32
  video: { disabled: false },
33
33
  image: { disabled: false },
34
- }
34
+ },
35
+ required: false,
35
36
  },
36
37
  rationale: {
37
38
  settings: true,
@@ -40,7 +41,8 @@ const defaultConfig = {
40
41
  audio: { disabled: false },
41
42
  video: { disabled: false },
42
43
  image: { disabled: false },
43
- }
44
+ },
45
+ required: false,
44
46
  },
45
47
  settingsPanelDisabled: true,
46
48
  studentInstructions: {
@@ -54,7 +56,8 @@ const defaultConfig = {
54
56
  audio: { disabled: false },
55
57
  video: { disabled: false },
56
58
  image: { disabled: false },
57
- }
59
+ },
60
+ required: false,
58
61
  },
59
62
  choicesLayout: {
60
63
  settings: false,
@@ -3,6 +3,18 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [7.6.0](https://github.com/pie-framework/pie-elements/compare/@pie-element/ebsr-controller@7.5.2...@pie-element/ebsr-controller@7.6.0) (2024-04-01)
7
+
8
+
9
+ ### Features
10
+
11
+ * **ebsr:** add required fields functionality and fix validation PD-3592 ([a7fe66f](https://github.com/pie-framework/pie-elements/commit/a7fe66f2e46b0369efc6042e03194de437aff91c))
12
+ * update pie-lib/pie-toolbox PD-3567, PD-3426 ([2a706d7](https://github.com/pie-framework/pie-elements/commit/2a706d799bb000c60b7a77a790de9dc66345ebf5))
13
+
14
+
15
+
16
+
17
+
6
18
  ## [7.5.2](https://github.com/pie-framework/pie-elements/compare/@pie-element/ebsr-controller@7.5.1...@pie-element/ebsr-controller@7.5.2) (2024-03-28)
7
19
 
8
20
 
@@ -406,10 +406,20 @@ var createCorrectResponseSession = function createCorrectResponseSession(questio
406
406
  resolve(null);
407
407
  }
408
408
  });
409
- };
409
+ }; // remove all html tags
410
+
410
411
 
411
412
  exports.createCorrectResponseSession = createCorrectResponseSession;
412
413
 
414
+ var getInnerText = function getInnerText(html) {
415
+ return (html || '').replaceAll(/<[^>]*>/g, '');
416
+ }; // remove all html tags except img and iframe
417
+
418
+
419
+ var getContent = function getContent(html) {
420
+ return (html || '').replace(/(<(?!img|iframe)([^>]+)>)/gi, '');
421
+ };
422
+
413
423
  var validatePart = function validatePart() {
414
424
  var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
415
425
  var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
@@ -418,18 +428,30 @@ var validatePart = function validatePart() {
418
428
  minAnswerChoices = _config$minAnswerChoi === void 0 ? 2 : _config$minAnswerChoi,
419
429
  maxAnswerChoices = config.maxAnswerChoices;
420
430
  var reversedChoices = (0, _toConsumableArray2["default"])(choices || []).reverse();
431
+ var errors = {};
421
432
  var choicesErrors = {};
433
+ var rationaleErrors = {};
422
434
  var hasCorrectResponse = false;
435
+ ['teacherInstructions', 'prompt'].forEach(function (field) {
436
+ var _config$field;
437
+
438
+ if ((_config$field = config[field]) !== null && _config$field !== void 0 && _config$field.required && !getContent(model[field])) {
439
+ errors[field] = 'This field is required.';
440
+ }
441
+ });
423
442
  reversedChoices.forEach(function (choice, index) {
443
+ var _config$rationale;
444
+
424
445
  var correct = choice.correct,
425
446
  value = choice.value,
426
- label = choice.label;
447
+ label = choice.label,
448
+ rationale = choice.rationale;
427
449
 
428
450
  if (correct) {
429
451
  hasCorrectResponse = true;
430
452
  }
431
453
 
432
- if (label === '' || label === '<div></div>') {
454
+ if (!getContent(label)) {
433
455
  choicesErrors[value] = 'Content should not be empty.';
434
456
  } else {
435
457
  var identicalAnswer = reversedChoices.slice(index + 1).some(function (c) {
@@ -440,22 +462,29 @@ var validatePart = function validatePart() {
440
462
  choicesErrors[value] = 'Content should be unique.';
441
463
  }
442
464
  }
465
+
466
+ if ((_config$rationale = config.rationale) !== null && _config$rationale !== void 0 && _config$rationale.required && !getContent(rationale)) {
467
+ rationaleErrors[value] = 'This field is required.';
468
+ }
443
469
  });
444
- var errors = {};
445
470
  var nbOfChoices = (choices || []).length;
446
471
 
447
472
  if (nbOfChoices < minAnswerChoices) {
448
- errors.answerChoicesError = "There should be at least ".concat(minAnswerChoices, " choices defined.");
473
+ errors.answerChoices = "There should be at least ".concat(minAnswerChoices, " choices defined.");
449
474
  } else if (nbOfChoices > maxAnswerChoices) {
450
- errors.answerChoicesError = "No more than ".concat(maxAnswerChoices, " choices should be defined.");
475
+ errors.answerChoices = "No more than ".concat(maxAnswerChoices, " choices should be defined.");
451
476
  }
452
477
 
453
478
  if (!hasCorrectResponse) {
454
- errors.correctResponseError = 'No correct response defined.';
479
+ errors.correctResponse = 'No correct response defined.';
455
480
  }
456
481
 
457
482
  if (!(0, _isEmpty["default"])(choicesErrors)) {
458
- errors.choicesErrors = choicesErrors;
483
+ errors.choices = choicesErrors;
484
+ }
485
+
486
+ if (!(0, _isEmpty["default"])(rationaleErrors)) {
487
+ errors.rationale = rationaleErrors;
459
488
  }
460
489
 
461
490
  return errors;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.js"],"names":["translator","Translator","prepareChoice","model","env","defaultFeedback","choice","out","label","value","role","mode","rationale","rationaleEnabled","correct","feedbackEnabled","feedbackType","feedback","type","parsePart","part","key","session","Object","assign","incorrect","choices","map","disabled","complete","min","filter","c","length","responseCorrect","undefined","normalize","partA","partB","question","partLabels","partLabelType","defaults","promptEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","gridColumns","choicesLayout","verticalMode","updateSession","normalizedQuestion","shuffledValues","us","id","element","update","Promise","resolve","partASession","partALockChoiceOrder","partAChoices","partBChoices","partBSession","partBLockChoiceOrder","e","console","error","language","partLabel","t","lng","index","teacherInstructions","prompt","createDefaultModel","isCorrect","getScore","config","sessionPart","partialScoringEnabled","maxScore","sessionPartValue","chosen","find","v","correctAndNotChosen","incorrectAndChosen","correctChoices","reduce","total","parseFloat","toFixed","outcome","score","scoreA","scoreB","empty","partialScoring","enabled","max","returnPartCorrect","answers","forEach","i","push","createCorrectResponseSession","partACorrect","partBCorrect","validatePart","minAnswerChoices","maxAnswerChoices","reversedChoices","reverse","choicesErrors","hasCorrectResponse","identicalAnswer","slice","some","errors","nbOfChoices","answerChoicesError","correctResponseError","validate","partAConfig","partBConfig","partAErrors","partBErrors"],"mappings":"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","sourcesContent":["import defaults from './defaults';\nimport { lockChoices, getShuffledChoices, partialScoring } from '@pie-lib/pie-toolbox/controller-utils';\nimport { isResponseCorrect } from './utils';\nimport get from 'lodash/get';\nimport isEmpty from 'lodash/isEmpty';\nimport Translator from '@pie-lib/pie-toolbox/translator';\n\nconst { translator } = Translator;\n\nconst prepareChoice = (model, env, defaultFeedback) => (choice) => {\n const out = {\n label: choice.label,\n value: choice.value,\n };\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.rationale = model.rationaleEnabled ? choice.rationale : null;\n } else {\n out.rationale = null;\n }\n\n if (env.mode === 'evaluate') {\n out.correct = !!choice.correct;\n\n if (model.feedbackEnabled) {\n const feedbackType = (choice.feedback && choice.feedback.type) || 'none';\n\n if (feedbackType === 'default') {\n out.feedback = defaultFeedback[choice.correct ? 'correct' : 'incorrect'];\n } else if (feedbackType === 'custom') {\n out.feedback = choice.feedback.value;\n }\n }\n }\n\n return out;\n};\n\nconst parsePart = (part, key, session, env) => {\n const defaultFeedback = Object.assign({ correct: 'Correct', incorrect: 'Incorrect' }, part.defaultFeedback);\n\n let choices = part.choices ? part.choices.map(prepareChoice(part, env, defaultFeedback)) : [];\n\n return {\n ...part,\n choices,\n disabled: env.mode !== 'gather',\n complete: {\n min: part.choices.filter((c) => c.correct).length,\n },\n responseCorrect: env.mode === 'evaluate' ? isResponseCorrect(part, key, session) : undefined,\n };\n};\n\nexport const normalize = ({ partA = {}, partB = {}, ...question }) => ({\n partLabels: true,\n partLabelType: 'Letters',\n ...question,\n partA: {\n ...defaults.partA,\n rationaleEnabled: true,\n feedbackEnabled: false,\n promptEnabled: true,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n gridColumns: '2',\n ...partA,\n choicesLayout: partA.choicesLayout || (partA.verticalMode === false && 'horizontal') || 'vertical',\n },\n partB: {\n ...defaults.partB,\n rationaleEnabled: true,\n promptEnabled: true,\n feedbackEnabled: false,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n gridColumns: '2',\n ...partB,\n choicesLayout: partB.choicesLayout || (partB.verticalMode === false && 'horizontal') || 'vertical',\n },\n});\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n * @param {*} updateSession - optional - a function that will set the properties passed into it on the session.\n */\nexport async function model(question, session, env, updateSession) {\n const normalizedQuestion = normalize(question);\n const partA = parsePart(normalizedQuestion.partA, 'partA', session, env);\n const partB = parsePart(normalizedQuestion.partB, 'partB', session, env);\n\n const shuffledValues = {};\n\n const us = (part) => (id, element, update) =>\n new Promise((resolve) => {\n shuffledValues[part] = update.shuffledValues;\n resolve();\n });\n\n const partASession = get(session, 'value.partA');\n const partALockChoiceOrder = lockChoices(normalizedQuestion.partA, partASession, env);\n\n const { choices: partAChoices } = partA || {};\n const { choices: partBChoices } = partB || {};\n\n if (!partALockChoiceOrder && partAChoices && partAChoices.length) {\n partA.choices = await getShuffledChoices(\n partAChoices,\n { shuffledValues: (session.shuffledValues || {}).partA },\n us('partA'),\n 'value',\n );\n }\n\n const partBSession = get(session, 'value.partB');\n const partBLockChoiceOrder = lockChoices(normalizedQuestion.partB, partBSession, env);\n\n if (!partBLockChoiceOrder && partBChoices && partBChoices.length) {\n partB.choices = await getShuffledChoices(\n partBChoices,\n { shuffledValues: (session.shuffledValues || {}).partB },\n us('partB'),\n 'value',\n );\n }\n\n if (!isEmpty(shuffledValues)) {\n if (updateSession && typeof updateSession === 'function') {\n updateSession(session.id, session.element, {\n shuffledValues,\n }).catch((e) => {\n // eslint-disable-next-line no-console\n console.error('update session failed', e);\n });\n }\n }\n\n if (normalizedQuestion.partLabels) {\n const language = normalizedQuestion.language;\n partA.partLabel = translator.t('ebsr.part', {lng: language, index: normalizedQuestion.partLabelType === 'Letters' ? 'A' : '1'});\n partB.partLabel = translator.t('ebsr.part', {lng: language, index: normalizedQuestion.partLabelType === 'Letters' ? 'B' : '2'});\n } else {\n partA.partLabel = undefined;\n partB.partLabel = undefined;\n }\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n partA.teacherInstructions = normalizedQuestion.partA.teacherInstructionsEnabled\n ? normalizedQuestion.partA.teacherInstructions\n : null;\n partB.teacherInstructions = normalizedQuestion.partB.teacherInstructionsEnabled\n ? normalizedQuestion.partB.teacherInstructions\n : null;\n } else {\n partA.teacherInstructions = null;\n partB.teacherInstructions = null;\n }\n\n partA.prompt = normalizedQuestion.partA.promptEnabled ? normalizedQuestion.partA.prompt : null;\n partB.prompt = normalizedQuestion.partB.promptEnabled ? normalizedQuestion.partB.prompt : null;\n\n return new Promise((resolve) => {\n resolve({\n disabled: env.mode !== 'gather',\n mode: env.mode,\n partA,\n partB,\n });\n });\n}\n\nexport const createDefaultModel = (model = {}) =>\n new Promise((resolve) => {\n resolve({\n ...defaults,\n ...model,\n });\n });\n\nconst isCorrect = (c) => c.correct === true;\n\nconst getScore = (config, sessionPart, key, partialScoringEnabled) => {\n const { choices = [] } = (config && config[key]) || {};\n const maxScore = choices.length;\n const { value: sessionPartValue } = sessionPart || {};\n\n const chosen = (c) => !!(sessionPartValue || []).find((v) => v === c.value);\n const correctAndNotChosen = (c) => isCorrect(c) && !chosen(c);\n const incorrectAndChosen = (c) => !isCorrect(c) && chosen(c);\n const correctChoices = choices.reduce((total, choice) => {\n if (correctAndNotChosen(choice) || incorrectAndChosen(choice)) {\n return total - 1;\n } else {\n return total;\n }\n }, choices.length);\n\n // determine score for a part\n if (!partialScoringEnabled && correctChoices < maxScore) {\n return 0;\n }\n\n return parseFloat(maxScore ? (correctChoices / maxScore).toFixed(2) : 0);\n};\n\nexport function outcome(config, session, env) {\n return new Promise((resolve) => {\n const { value } = session || {};\n\n if (!session || !value) {\n resolve({ score: 0, scoreA: 0, scoreB: 0, empty: true });\n }\n\n if (value) {\n const { partA, partB } = value || {};\n\n const partialScoringEnabled = partialScoring.enabled(config, env);\n\n const scoreA = getScore(config, partA, 'partA', partialScoringEnabled);\n const scoreB = getScore(config, partB, 'partB', partialScoringEnabled);\n\n if (!partialScoringEnabled) {\n // The EBSR item is worth 1 point\n // That point is awarded if and only if both parts are fully correct, otherwise no points are awarded\n resolve({ score: scoreA === 1 && scoreB === 1 ? 1 : 0, scoreA, scoreB, max: 1 });\n } else {\n // The EBSR item is worth 2 points\n if (scoreA === 1) {\n if (scoreB === 1) {\n // If Part A and Part B are both correct, 2 points are awarded\n resolve({ score: 2, scoreA, scoreB, max: 2 });\n } else {\n // If Part A is correct and part B is incorrect, 1 point is awarded\n resolve({ score: 1, scoreA, scoreB, max: 2 });\n }\n } else {\n // For all other combinations, no points are awarded\n resolve({ score: 0, scoreA, scoreB, max: 2 });\n }\n }\n }\n });\n}\n\nconst returnPartCorrect = (choices) => {\n let answers = [];\n\n choices.forEach((i) => {\n const { correct, value } = i;\n if (correct) {\n answers.push(value);\n }\n });\n return answers;\n};\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { partA, partB } = question;\n\n const partACorrect = returnPartCorrect(partA.choices);\n const partBCorrect = returnPartCorrect(partB.choices);\n\n resolve({\n value: {\n partA: {\n id: 'partA',\n value: partACorrect,\n },\n partB: {\n id: 'partB',\n value: partBCorrect,\n },\n },\n id: '1',\n });\n } else {\n resolve(null);\n }\n });\n};\n\nconst validatePart = (model = {}, config = {}) => {\n const { choices } = model;\n const { minAnswerChoices = 2, maxAnswerChoices } = config;\n const reversedChoices = [...(choices || [])].reverse();\n const choicesErrors = {};\n let hasCorrectResponse = false;\n\n reversedChoices.forEach((choice, index) => {\n const { correct, value, label } = choice;\n\n if (correct) {\n hasCorrectResponse = true;\n }\n\n if (label === '' || label === '<div></div>') {\n choicesErrors[value] = 'Content should not be empty.';\n } else {\n const identicalAnswer = reversedChoices.slice(index + 1).some((c) => c.label === label);\n\n if (identicalAnswer) {\n choicesErrors[value] = 'Content should be unique.';\n }\n }\n });\n\n const errors = {};\n const nbOfChoices = (choices || []).length;\n\n if (nbOfChoices < minAnswerChoices) {\n errors.answerChoicesError = `There should be at least ${minAnswerChoices} choices defined.`;\n } else if (nbOfChoices > maxAnswerChoices) {\n errors.answerChoicesError = `No more than ${maxAnswerChoices} choices should be defined.`;\n }\n\n if (!hasCorrectResponse) {\n errors.correctResponseError = 'No correct response defined.';\n }\n\n if (!isEmpty(choicesErrors)) {\n errors.choicesErrors = choicesErrors;\n }\n\n return errors;\n};\n\nexport const validate = (model = {}, config = {}) => {\n const { partA, partB } = model || {};\n const { partA: partAConfig, partB: partBConfig } = config || {};\n\n const partAErrors = validatePart(partA, partAConfig);\n const partBErrors = validatePart(partB, partBConfig);\n\n return { partA: partAErrors, partB: partBErrors };\n};\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../src/index.js"],"names":["translator","Translator","prepareChoice","model","env","defaultFeedback","choice","out","label","value","role","mode","rationale","rationaleEnabled","correct","feedbackEnabled","feedbackType","feedback","type","parsePart","part","key","session","Object","assign","incorrect","choices","map","disabled","complete","min","filter","c","length","responseCorrect","undefined","normalize","partA","partB","question","partLabels","partLabelType","defaults","promptEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","gridColumns","choicesLayout","verticalMode","updateSession","normalizedQuestion","shuffledValues","us","id","element","update","Promise","resolve","partASession","partALockChoiceOrder","partAChoices","partBChoices","partBSession","partBLockChoiceOrder","e","console","error","language","partLabel","t","lng","index","teacherInstructions","prompt","createDefaultModel","isCorrect","getScore","config","sessionPart","partialScoringEnabled","maxScore","sessionPartValue","chosen","find","v","correctAndNotChosen","incorrectAndChosen","correctChoices","reduce","total","parseFloat","toFixed","outcome","score","scoreA","scoreB","empty","partialScoring","enabled","max","returnPartCorrect","answers","forEach","i","push","createCorrectResponseSession","partACorrect","partBCorrect","getInnerText","html","replaceAll","getContent","replace","validatePart","minAnswerChoices","maxAnswerChoices","reversedChoices","reverse","errors","choicesErrors","rationaleErrors","hasCorrectResponse","field","required","identicalAnswer","slice","some","nbOfChoices","answerChoices","correctResponse","validate","partAConfig","partBConfig","partAErrors","partBErrors"],"mappings":"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","sourcesContent":["import defaults from './defaults';\nimport { lockChoices, getShuffledChoices, partialScoring } from '@pie-lib/pie-toolbox/controller-utils';\nimport { isResponseCorrect } from './utils';\nimport get from 'lodash/get';\nimport isEmpty from 'lodash/isEmpty';\nimport Translator from '@pie-lib/pie-toolbox/translator';\n\nconst { translator } = Translator;\n\nconst prepareChoice = (model, env, defaultFeedback) => (choice) => {\n const out = {\n label: choice.label,\n value: choice.value,\n };\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.rationale = model.rationaleEnabled ? choice.rationale : null;\n } else {\n out.rationale = null;\n }\n\n if (env.mode === 'evaluate') {\n out.correct = !!choice.correct;\n\n if (model.feedbackEnabled) {\n const feedbackType = (choice.feedback && choice.feedback.type) || 'none';\n\n if (feedbackType === 'default') {\n out.feedback = defaultFeedback[choice.correct ? 'correct' : 'incorrect'];\n } else if (feedbackType === 'custom') {\n out.feedback = choice.feedback.value;\n }\n }\n }\n\n return out;\n};\n\nconst parsePart = (part, key, session, env) => {\n const defaultFeedback = Object.assign({ correct: 'Correct', incorrect: 'Incorrect' }, part.defaultFeedback);\n\n let choices = part.choices ? part.choices.map(prepareChoice(part, env, defaultFeedback)) : [];\n\n return {\n ...part,\n choices,\n disabled: env.mode !== 'gather',\n complete: {\n min: part.choices.filter((c) => c.correct).length,\n },\n responseCorrect: env.mode === 'evaluate' ? isResponseCorrect(part, key, session) : undefined,\n };\n};\n\nexport const normalize = ({ partA = {}, partB = {}, ...question }) => ({\n partLabels: true,\n partLabelType: 'Letters',\n ...question,\n partA: {\n ...defaults.partA,\n rationaleEnabled: true,\n feedbackEnabled: false,\n promptEnabled: true,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n gridColumns: '2',\n ...partA,\n choicesLayout: partA.choicesLayout || (partA.verticalMode === false && 'horizontal') || 'vertical',\n },\n partB: {\n ...defaults.partB,\n rationaleEnabled: true,\n promptEnabled: true,\n feedbackEnabled: false,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n gridColumns: '2',\n ...partB,\n choicesLayout: partB.choicesLayout || (partB.verticalMode === false && 'horizontal') || 'vertical',\n },\n});\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n * @param {*} updateSession - optional - a function that will set the properties passed into it on the session.\n */\nexport async function model(question, session, env, updateSession) {\n const normalizedQuestion = normalize(question);\n const partA = parsePart(normalizedQuestion.partA, 'partA', session, env);\n const partB = parsePart(normalizedQuestion.partB, 'partB', session, env);\n\n const shuffledValues = {};\n\n const us = (part) => (id, element, update) =>\n new Promise((resolve) => {\n shuffledValues[part] = update.shuffledValues;\n resolve();\n });\n\n const partASession = get(session, 'value.partA');\n const partALockChoiceOrder = lockChoices(normalizedQuestion.partA, partASession, env);\n\n const { choices: partAChoices } = partA || {};\n const { choices: partBChoices } = partB || {};\n\n if (!partALockChoiceOrder && partAChoices && partAChoices.length) {\n partA.choices = await getShuffledChoices(\n partAChoices,\n { shuffledValues: (session.shuffledValues || {}).partA },\n us('partA'),\n 'value',\n );\n }\n\n const partBSession = get(session, 'value.partB');\n const partBLockChoiceOrder = lockChoices(normalizedQuestion.partB, partBSession, env);\n\n if (!partBLockChoiceOrder && partBChoices && partBChoices.length) {\n partB.choices = await getShuffledChoices(\n partBChoices,\n { shuffledValues: (session.shuffledValues || {}).partB },\n us('partB'),\n 'value',\n );\n }\n\n if (!isEmpty(shuffledValues)) {\n if (updateSession && typeof updateSession === 'function') {\n updateSession(session.id, session.element, {\n shuffledValues,\n }).catch((e) => {\n // eslint-disable-next-line no-console\n console.error('update session failed', e);\n });\n }\n }\n\n if (normalizedQuestion.partLabels) {\n const language = normalizedQuestion.language;\n partA.partLabel = translator.t('ebsr.part', {lng: language, index: normalizedQuestion.partLabelType === 'Letters' ? 'A' : '1'});\n partB.partLabel = translator.t('ebsr.part', {lng: language, index: normalizedQuestion.partLabelType === 'Letters' ? 'B' : '2'});\n } else {\n partA.partLabel = undefined;\n partB.partLabel = undefined;\n }\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n partA.teacherInstructions = normalizedQuestion.partA.teacherInstructionsEnabled\n ? normalizedQuestion.partA.teacherInstructions\n : null;\n partB.teacherInstructions = normalizedQuestion.partB.teacherInstructionsEnabled\n ? normalizedQuestion.partB.teacherInstructions\n : null;\n } else {\n partA.teacherInstructions = null;\n partB.teacherInstructions = null;\n }\n\n partA.prompt = normalizedQuestion.partA.promptEnabled ? normalizedQuestion.partA.prompt : null;\n partB.prompt = normalizedQuestion.partB.promptEnabled ? normalizedQuestion.partB.prompt : null;\n\n return new Promise((resolve) => {\n resolve({\n disabled: env.mode !== 'gather',\n mode: env.mode,\n partA,\n partB,\n });\n });\n}\n\nexport const createDefaultModel = (model = {}) =>\n new Promise((resolve) => {\n resolve({\n ...defaults,\n ...model,\n });\n });\n\nconst isCorrect = (c) => c.correct === true;\n\nconst getScore = (config, sessionPart, key, partialScoringEnabled) => {\n const { choices = [] } = (config && config[key]) || {};\n const maxScore = choices.length;\n const { value: sessionPartValue } = sessionPart || {};\n\n const chosen = (c) => !!(sessionPartValue || []).find((v) => v === c.value);\n const correctAndNotChosen = (c) => isCorrect(c) && !chosen(c);\n const incorrectAndChosen = (c) => !isCorrect(c) && chosen(c);\n const correctChoices = choices.reduce((total, choice) => {\n if (correctAndNotChosen(choice) || incorrectAndChosen(choice)) {\n return total - 1;\n } else {\n return total;\n }\n }, choices.length);\n\n // determine score for a part\n if (!partialScoringEnabled && correctChoices < maxScore) {\n return 0;\n }\n\n return parseFloat(maxScore ? (correctChoices / maxScore).toFixed(2) : 0);\n};\n\nexport function outcome(config, session, env) {\n return new Promise((resolve) => {\n const { value } = session || {};\n\n if (!session || !value) {\n resolve({ score: 0, scoreA: 0, scoreB: 0, empty: true });\n }\n\n if (value) {\n const { partA, partB } = value || {};\n\n const partialScoringEnabled = partialScoring.enabled(config, env);\n\n const scoreA = getScore(config, partA, 'partA', partialScoringEnabled);\n const scoreB = getScore(config, partB, 'partB', partialScoringEnabled);\n\n if (!partialScoringEnabled) {\n // The EBSR item is worth 1 point\n // That point is awarded if and only if both parts are fully correct, otherwise no points are awarded\n resolve({ score: scoreA === 1 && scoreB === 1 ? 1 : 0, scoreA, scoreB, max: 1 });\n } else {\n // The EBSR item is worth 2 points\n if (scoreA === 1) {\n if (scoreB === 1) {\n // If Part A and Part B are both correct, 2 points are awarded\n resolve({ score: 2, scoreA, scoreB, max: 2 });\n } else {\n // If Part A is correct and part B is incorrect, 1 point is awarded\n resolve({ score: 1, scoreA, scoreB, max: 2 });\n }\n } else {\n // For all other combinations, no points are awarded\n resolve({ score: 0, scoreA, scoreB, max: 2 });\n }\n }\n }\n });\n}\n\nconst returnPartCorrect = (choices) => {\n let answers = [];\n\n choices.forEach((i) => {\n const { correct, value } = i;\n if (correct) {\n answers.push(value);\n }\n });\n return answers;\n};\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { partA, partB } = question;\n\n const partACorrect = returnPartCorrect(partA.choices);\n const partBCorrect = returnPartCorrect(partB.choices);\n\n resolve({\n value: {\n partA: {\n id: 'partA',\n value: partACorrect,\n },\n partB: {\n id: 'partB',\n value: partBCorrect,\n },\n },\n id: '1',\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 and iframe\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe)([^>]+)>)/gi, '');\n\nconst validatePart = (model = {}, config = {}) => {\n const { choices } = model;\n const { minAnswerChoices = 2, maxAnswerChoices } = config;\n const reversedChoices = [...(choices || [])].reverse();\n const errors = {};\n const choicesErrors = {};\n const rationaleErrors = {};\n let hasCorrectResponse = false;\n\n ['teacherInstructions', 'prompt'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n reversedChoices.forEach((choice, index) => {\n const { correct, value, label, rationale } = choice;\n\n if (correct) {\n hasCorrectResponse = true;\n }\n\n if (!getContent(label)) {\n choicesErrors[value] = 'Content should not be empty.';\n } else {\n const identicalAnswer = reversedChoices.slice(index + 1).some((c) => c.label === label);\n\n if (identicalAnswer) {\n choicesErrors[value] = 'Content should be unique.';\n }\n }\n\n if (config.rationale?.required && !getContent(rationale)) {\n rationaleErrors[value] = 'This field is required.';\n }\n });\n\n const nbOfChoices = (choices || []).length;\n\n if (nbOfChoices < minAnswerChoices) {\n errors.answerChoices = `There should be at least ${minAnswerChoices} choices defined.`;\n } else if (nbOfChoices > maxAnswerChoices) {\n errors.answerChoices = `No more than ${maxAnswerChoices} choices should be defined.`;\n }\n\n if (!hasCorrectResponse) {\n errors.correctResponse = 'No correct response defined.';\n }\n\n if (!isEmpty(choicesErrors)) {\n errors.choices = choicesErrors;\n }\n\n if (!isEmpty(rationaleErrors)) {\n errors.rationale = rationaleErrors;\n }\n\n return errors;\n};\n\nexport const validate = (model = {}, config = {}) => {\n const { partA, partB } = model || {};\n const { partA: partAConfig, partB: partBConfig } = config || {};\n\n const partAErrors = validatePart(partA, partAConfig);\n const partBErrors = validatePart(partB, partBConfig);\n\n return { partA: partAErrors, partB: partBErrors };\n};\n"],"file":"index.js"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@pie-element/ebsr-controller",
3
3
  "private": true,
4
- "version": "7.5.2",
4
+ "version": "7.6.0",
5
5
  "description": "",
6
6
  "scripts": {
7
7
  "test": "echo \"Error: no test specified\" && exit 1"
@@ -284,21 +284,35 @@ export const createCorrectResponseSession = (question, env) => {
284
284
  });
285
285
  };
286
286
 
287
+ // remove all html tags
288
+ const getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');
289
+
290
+ // remove all html tags except img and iframe
291
+ const getContent = (html) => (html || '').replace(/(<(?!img|iframe)([^>]+)>)/gi, '');
292
+
287
293
  const validatePart = (model = {}, config = {}) => {
288
294
  const { choices } = model;
289
295
  const { minAnswerChoices = 2, maxAnswerChoices } = config;
290
296
  const reversedChoices = [...(choices || [])].reverse();
297
+ const errors = {};
291
298
  const choicesErrors = {};
299
+ const rationaleErrors = {};
292
300
  let hasCorrectResponse = false;
293
301
 
302
+ ['teacherInstructions', 'prompt'].forEach((field) => {
303
+ if (config[field]?.required && !getContent(model[field])) {
304
+ errors[field] = 'This field is required.';
305
+ }
306
+ });
307
+
294
308
  reversedChoices.forEach((choice, index) => {
295
- const { correct, value, label } = choice;
309
+ const { correct, value, label, rationale } = choice;
296
310
 
297
311
  if (correct) {
298
312
  hasCorrectResponse = true;
299
313
  }
300
314
 
301
- if (label === '' || label === '<div></div>') {
315
+ if (!getContent(label)) {
302
316
  choicesErrors[value] = 'Content should not be empty.';
303
317
  } else {
304
318
  const identicalAnswer = reversedChoices.slice(index + 1).some((c) => c.label === label);
@@ -307,23 +321,30 @@ const validatePart = (model = {}, config = {}) => {
307
321
  choicesErrors[value] = 'Content should be unique.';
308
322
  }
309
323
  }
324
+
325
+ if (config.rationale?.required && !getContent(rationale)) {
326
+ rationaleErrors[value] = 'This field is required.';
327
+ }
310
328
  });
311
329
 
312
- const errors = {};
313
330
  const nbOfChoices = (choices || []).length;
314
331
 
315
332
  if (nbOfChoices < minAnswerChoices) {
316
- errors.answerChoicesError = `There should be at least ${minAnswerChoices} choices defined.`;
333
+ errors.answerChoices = `There should be at least ${minAnswerChoices} choices defined.`;
317
334
  } else if (nbOfChoices > maxAnswerChoices) {
318
- errors.answerChoicesError = `No more than ${maxAnswerChoices} choices should be defined.`;
335
+ errors.answerChoices = `No more than ${maxAnswerChoices} choices should be defined.`;
319
336
  }
320
337
 
321
338
  if (!hasCorrectResponse) {
322
- errors.correctResponseError = 'No correct response defined.';
339
+ errors.correctResponse = 'No correct response defined.';
323
340
  }
324
341
 
325
342
  if (!isEmpty(choicesErrors)) {
326
- errors.choicesErrors = choicesErrors;
343
+ errors.choices = choicesErrors;
344
+ }
345
+
346
+ if (!isEmpty(rationaleErrors)) {
347
+ errors.rationale = rationaleErrors;
327
348
  }
328
349
 
329
350
  return errors;