@pie-element/categorize 7.1.6 → 7.1.7
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 +11 -0
- package/configure/CHANGELOG.md +11 -0
- package/configure/lib/design/builder.js +7 -4
- package/configure/lib/design/builder.js.map +1 -1
- package/configure/package.json +4 -4
- package/controller/CHANGELOG.md +17 -0
- package/controller/lib/index.js +20 -12
- package/controller/lib/index.js.map +1 -1
- package/controller/package.json +1 -1
- package/package.json +5 -5
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,17 @@
|
|
|
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.1.7](https://github.com/pie-framework/pie-elements/compare/@pie-element/categorize@7.1.6...@pie-element/categorize@7.1.7) (2022-08-31)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Bug Fixes
|
|
10
|
+
|
|
11
|
+
* **categorize:** filter choices to prevent crash of wrongly imported items PD-1982 ([05c5ead](https://github.com/pie-framework/pie-elements/commit/05c5eadd4275a6f29ec1cbde6ea699a8379b68d5))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
6
17
|
## [7.1.6](https://github.com/pie-framework/pie-elements/compare/@pie-element/categorize@7.1.5...@pie-element/categorize@7.1.6) (2022-08-16)
|
|
7
18
|
|
|
8
19
|
**Note:** Version bump only for package @pie-element/categorize
|
package/configure/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,17 @@
|
|
|
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
|
+
## [6.1.7](https://github.com/pie-framework/pie-elements/compare/@pie-element/categorize-configure@6.1.6...@pie-element/categorize-configure@6.1.7) (2022-08-31)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Bug Fixes
|
|
10
|
+
|
|
11
|
+
* **categorize:** filter choices to prevent crash of wrongly imported items PD-1982 ([05c5ead](https://github.com/pie-framework/pie-elements/commit/05c5eadd4275a6f29ec1cbde6ea699a8379b68d5))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
6
17
|
## [6.1.6](https://github.com/pie-framework/pie-elements/compare/@pie-element/categorize-configure@6.1.5...@pie-element/categorize-configure@6.1.6) (2022-08-16)
|
|
7
18
|
|
|
8
19
|
**Note:** Version bump only for package @pie-element/categorize-configure
|
|
@@ -21,10 +21,13 @@ var buildCategories = function buildCategories(categories, choices, correctRespo
|
|
|
21
21
|
var choice = choices.find(function (h) {
|
|
22
22
|
return h.id === choiceId;
|
|
23
23
|
});
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
|
|
25
|
+
if (choice) {
|
|
26
|
+
return Object.assign({}, {
|
|
27
|
+
id: choice.id,
|
|
28
|
+
content: choice.content
|
|
29
|
+
});
|
|
30
|
+
}
|
|
28
31
|
});
|
|
29
32
|
}
|
|
30
33
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/design/builder.js"],"names":["buildCategories","categories","choices","correctResponse","clonedCategories","map","category","cr","find","id","choiceId","choice","h","Object","assign","content","getChoices","cat","index","alternateResponses","length","alt","ch","buildAlternateResponses","mostAlternates","reduce","mostAlt","alternatesArray","Array","fill","val","catIndex","currentCategory","label"],"mappings":";;;;;;;;;AAAA;;AAEO,IAAMA,eAAe,GAAG,SAAlBA,eAAkB,CAACC,UAAD,EAAaC,OAAb,EAAsBC,eAAtB,EAA0C;AACvE,MAAMC,gBAAgB,GAAG,2BAAUH,UAAV,CAAzB;AAEA,SAAOG,gBAAgB,CAACC,GAAjB,CAAqB,UAAAC,QAAQ,EAAI;AACtC,QAAMC,EAAE,GAAGJ,eAAe,CAACK,IAAhB,CAAqB,UAAAD,EAAE;AAAA,aAAIA,EAAE,CAACD,QAAH,KAAgBA,QAAQ,CAACG,EAA7B;AAAA,KAAvB,CAAX;;AAEA,QAAIF,EAAJ,EAAQ;AACND,MAAAA,QAAQ,CAACJ,OAAT,GAAmB,CAACK,EAAE,CAACL,OAAH,IAAc,EAAf,EAAmBG,GAAnB,CAAuB,UAAAK,QAAQ,EAAI;AACpD,YAAMC,MAAM,GAAGT,OAAO,CAACM,IAAR,CAAa,UAAAI,CAAC;AAAA,iBAAIA,CAAC,CAACH,EAAF,KAASC,QAAb;AAAA,SAAd,CAAf
|
|
1
|
+
{"version":3,"sources":["../../src/design/builder.js"],"names":["buildCategories","categories","choices","correctResponse","clonedCategories","map","category","cr","find","id","choiceId","choice","h","Object","assign","content","getChoices","cat","index","alternateResponses","length","alt","ch","buildAlternateResponses","mostAlternates","reduce","mostAlt","alternatesArray","Array","fill","val","catIndex","currentCategory","label"],"mappings":";;;;;;;;;AAAA;;AAEO,IAAMA,eAAe,GAAG,SAAlBA,eAAkB,CAACC,UAAD,EAAaC,OAAb,EAAsBC,eAAtB,EAA0C;AACvE,MAAMC,gBAAgB,GAAG,2BAAUH,UAAV,CAAzB;AAEA,SAAOG,gBAAgB,CAACC,GAAjB,CAAqB,UAAAC,QAAQ,EAAI;AACtC,QAAMC,EAAE,GAAGJ,eAAe,CAACK,IAAhB,CAAqB,UAAAD,EAAE;AAAA,aAAIA,EAAE,CAACD,QAAH,KAAgBA,QAAQ,CAACG,EAA7B;AAAA,KAAvB,CAAX;;AAEA,QAAIF,EAAJ,EAAQ;AACND,MAAAA,QAAQ,CAACJ,OAAT,GAAmB,CAACK,EAAE,CAACL,OAAH,IAAc,EAAf,EAAmBG,GAAnB,CAAuB,UAAAK,QAAQ,EAAI;AACpD,YAAMC,MAAM,GAAGT,OAAO,CAACM,IAAR,CAAa,UAAAI,CAAC;AAAA,iBAAIA,CAAC,CAACH,EAAF,KAASC,QAAb;AAAA,SAAd,CAAf;;AACA,YAAIC,MAAJ,EAAY;AACV,iBAAOE,MAAM,CAACC,MAAP,CAAc,EAAd,EAAkB;AAAEL,YAAAA,EAAE,EAAEE,MAAM,CAACF,EAAb;AAAiBM,YAAAA,OAAO,EAAEJ,MAAM,CAACI;AAAjC,WAAlB,CAAP;AACD;AACF,OALkB,CAAnB;AAMD;;AAED,WAAOT,QAAP;AACD,GAbM,CAAP;AAcD,CAjBM;;;;AAmBP,IAAMU,UAAU,GAAG,SAAbA,UAAa,CAACC,GAAD,EAAMf,OAAN,EAAegB,KAAf,EAAyB;AAC1C,MAAI,CAACD,GAAG,CAACE,kBAAL,IAA2BF,GAAG,CAACE,kBAAJ,CAAuBC,MAAvB,KAAkC,CAAjE,EAAoE;AAClE,WAAO,EAAP;AACD;;AAED,SAAO,CAACH,GAAG,CAACE,kBAAJ,CAAuBD,KAAvB,KAAiC,EAAlC,EAAsCb,GAAtC,CAA0C,UAAAgB,GAAG,EAAI;AACtD,WAAOnB,OAAO,CAACM,IAAR,CAAa,UAAAc,EAAE;AAAA,aAAIA,EAAE,CAACb,EAAH,KAAUY,GAAd;AAAA,KAAf,CAAP;AACD,GAFM,CAAP;AAGD,CARD;;AAUO,IAAME,uBAAuB,GAAG,SAA1BA,uBAA0B,CAACtB,UAAD,EAAaC,OAAb,EAAsBC,eAAtB,EAA0C;AAC/E,MAAMqB,cAAc,GAAGrB,eAAe,CAACsB,MAAhB,CAAuB,UAACC,OAAD,EAAUT,GAAV,EAAkB;AAC9D,QAAIA,GAAG,CAACE,kBAAJ,IAA0BF,GAAG,CAACE,kBAAJ,CAAuBC,MAAvB,IAAiCM,OAA/D,EAAwE;AACtE,aAAOT,GAAG,CAACE,kBAAJ,CAAuBC,MAA9B;AACD;;AAED,WAAOM,OAAP;AACD,GANsB,EAMpB,CANoB,CAAvB;AAOA,MAAMC,eAAe,GAAI,IAAIC,KAAJ,CAAUJ,cAAV,CAAD,CAA4BK,IAA5B,CAAiC,CAAjC,CAAxB;AAEA,SAAOF,eAAe,CAACtB,GAAhB,CAAoB,UAACyB,GAAD,EAAMZ,KAAN,EAAgB;AACzC,WAAOf,eAAe,CAACE,GAAhB,CAAoB,UAACY,GAAD,EAAMc,QAAN,EAAmB;AAC5C,UAAMC,eAAe,GAAG/B,UAAU,CAAC8B,QAAD,CAAlC;AAEA,aAAO;AACLtB,QAAAA,EAAE,EAAEuB,eAAe,CAACvB,EADf;AAELwB,QAAAA,KAAK,EAAED,eAAe,CAACC,KAFlB;AAGL/B,QAAAA,OAAO,EAAEc,UAAU,CAACC,GAAD,EAAMf,OAAN,EAAegB,KAAf;AAHd,OAAP;AAKD,KARM,CAAP;AASD,GAVM,CAAP;AAWD,CArBM","sourcesContent":["import cloneDeep from 'lodash/cloneDeep';\n\nexport const buildCategories = (categories, choices, correctResponse) => {\n const clonedCategories = cloneDeep(categories);\n\n return clonedCategories.map(category => {\n const cr = correctResponse.find(cr => cr.category === category.id);\n\n if (cr) {\n category.choices = (cr.choices || []).map(choiceId => {\n const choice = choices.find(h => h.id === choiceId);\n if (choice) {\n return Object.assign({}, { id: choice.id, content: choice.content });\n }\n });\n }\n\n return category;\n });\n};\n\nconst getChoices = (cat, choices, index) => {\n if (!cat.alternateResponses || cat.alternateResponses.length === 0) {\n return [];\n }\n\n return (cat.alternateResponses[index] || []).map(alt => {\n return choices.find(ch => ch.id === alt);\n });\n};\n\nexport const buildAlternateResponses = (categories, choices, correctResponse) => {\n const mostAlternates = correctResponse.reduce((mostAlt, cat) => {\n if (cat.alternateResponses && cat.alternateResponses.length >= mostAlt) {\n return cat.alternateResponses.length;\n }\n\n return mostAlt;\n }, 0);\n const alternatesArray = (new Array(mostAlternates)).fill(0);\n\n return alternatesArray.map((val, index) => {\n return correctResponse.map((cat, catIndex) => {\n const currentCategory = categories[catIndex];\n\n return {\n id: currentCategory.id,\n label: currentCategory.label,\n choices: getChoices(cat, choices, index)\n };\n });\n });\n};\n"],"file":"builder.js"}
|
package/configure/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"private": true,
|
|
4
4
|
"main": "lib/index.js",
|
|
5
5
|
"module": "src/index.js",
|
|
6
|
-
"version": "6.1.
|
|
6
|
+
"version": "6.1.7",
|
|
7
7
|
"description": "",
|
|
8
8
|
"scripts": {},
|
|
9
9
|
"author": "pie framework developers",
|
|
@@ -13,10 +13,10 @@
|
|
|
13
13
|
"@material-ui/icons": "^3.0.1",
|
|
14
14
|
"@pie-framework/pie-configure-events": "^1.2.0",
|
|
15
15
|
"@pie-lib/categorize": "^0.6.24",
|
|
16
|
-
"@pie-lib/config-ui": "^11.0.
|
|
16
|
+
"@pie-lib/config-ui": "^11.0.15",
|
|
17
17
|
"@pie-lib/drag": "^1.1.52",
|
|
18
|
-
"@pie-lib/editable-html": "^9.1.
|
|
19
|
-
"@pie-lib/render-ui": "^4.13.
|
|
18
|
+
"@pie-lib/editable-html": "^9.1.5",
|
|
19
|
+
"@pie-lib/render-ui": "^4.13.4",
|
|
20
20
|
"classnames": "^2.2.5",
|
|
21
21
|
"debug": "^3.1.0",
|
|
22
22
|
"lodash": "^4.17.15",
|
package/controller/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,23 @@
|
|
|
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
|
+
# [5.3.0](https://github.com/pie-framework/pie-elements/compare/@pie-element/categorize-controller@5.2.8...@pie-element/categorize-controller@5.3.0) (2022-08-31)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Bug Fixes
|
|
10
|
+
|
|
11
|
+
* **categorize:** filter choices to prevent crash of wrongly imported items PD-1982 ([05c5ead](https://github.com/pie-framework/pie-elements/commit/05c5eadd4275a6f29ec1cbde6ea699a8379b68d5))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
### Features
|
|
15
|
+
|
|
16
|
+
* **categorize:** added configurable validation PD-1739 ([c0d8275](https://github.com/pie-framework/pie-elements/commit/c0d827559fd43106e907967c111912ad92366e8e))
|
|
17
|
+
* **categorize:** implement generate validation message method, add info tooltip PD-1740 ([b315f4e](https://github.com/pie-framework/pie-elements/commit/b315f4ea0bc1461da0a8469bd9df383bc98e78ca))
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
6
23
|
## [5.2.8](https://github.com/pie-framework/pie-elements/compare/@pie-element/categorize-controller@5.2.7...@pie-element/categorize-controller@5.2.8) (2022-05-16)
|
|
7
24
|
|
|
8
25
|
**Note:** Version bump only for package @pie-element/categorize-controller
|
package/controller/lib/index.js
CHANGED
|
@@ -177,7 +177,7 @@ exports.normalize = normalize;
|
|
|
177
177
|
var model = function model(question, session, env, updateSession) {
|
|
178
178
|
return new Promise( /*#__PURE__*/function () {
|
|
179
179
|
var _ref6 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(resolve) {
|
|
180
|
-
var normalizedQuestion, answerCorrectness, _ref7, mode, role, categories, categoriesPerRow, choicesLabel, choicesPosition, correctResponse, feedback, feedbackEnabled, promptEnabled, prompt, removeTilesAfterPlacing, rowLabels, rationaleEnabled, rationale, note, teacherInstructionsEnabled, teacherInstructions, choices, fb, lockChoiceOrder, alternates, out;
|
|
180
|
+
var normalizedQuestion, answerCorrectness, _ref7, mode, role, categories, categoriesPerRow, choicesLabel, choicesPosition, correctResponse, feedback, feedbackEnabled, promptEnabled, prompt, removeTilesAfterPlacing, rowLabels, rationaleEnabled, rationale, note, teacherInstructionsEnabled, teacherInstructions, choices, fb, lockChoiceOrder, filteredCorrectResponse, alternates, out;
|
|
181
181
|
|
|
182
182
|
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
183
183
|
while (1) {
|
|
@@ -193,32 +193,40 @@ var model = function model(question, session, env, updateSession) {
|
|
|
193
193
|
categories = normalizedQuestion.categories, categoriesPerRow = normalizedQuestion.categoriesPerRow, choicesLabel = normalizedQuestion.choicesLabel, choicesPosition = normalizedQuestion.choicesPosition, correctResponse = normalizedQuestion.correctResponse, feedback = normalizedQuestion.feedback, feedbackEnabled = normalizedQuestion.feedbackEnabled, promptEnabled = normalizedQuestion.promptEnabled, prompt = normalizedQuestion.prompt, removeTilesAfterPlacing = normalizedQuestion.removeTilesAfterPlacing, rowLabels = normalizedQuestion.rowLabels, rationaleEnabled = normalizedQuestion.rationaleEnabled, rationale = normalizedQuestion.rationale, note = normalizedQuestion.note, teacherInstructionsEnabled = normalizedQuestion.teacherInstructionsEnabled, teacherInstructions = normalizedQuestion.teacherInstructions;
|
|
194
194
|
choices = normalizedQuestion.choices;
|
|
195
195
|
lockChoiceOrder = (0, _controllerUtils.lockChoices)(normalizedQuestion, session, env);
|
|
196
|
+
filteredCorrectResponse = correctResponse.map(function (response) {
|
|
197
|
+
var filteredChoices = (response.choices || []).filter(function (choice) {
|
|
198
|
+
return choice !== 'null';
|
|
199
|
+
});
|
|
200
|
+
return _objectSpread(_objectSpread({}, response), {}, {
|
|
201
|
+
choices: filteredChoices
|
|
202
|
+
});
|
|
203
|
+
});
|
|
196
204
|
|
|
197
205
|
if (!(mode === 'evaluate' && feedbackEnabled)) {
|
|
198
|
-
_context.next =
|
|
206
|
+
_context.next = 13;
|
|
199
207
|
break;
|
|
200
208
|
}
|
|
201
209
|
|
|
202
|
-
_context.next =
|
|
210
|
+
_context.next = 12;
|
|
203
211
|
return (0, _feedback.getFeedbackForCorrectness)(answerCorrectness, feedback);
|
|
204
212
|
|
|
205
|
-
case
|
|
213
|
+
case 12:
|
|
206
214
|
fb = _context.sent;
|
|
207
215
|
|
|
208
|
-
case
|
|
216
|
+
case 13:
|
|
209
217
|
if (lockChoiceOrder) {
|
|
210
|
-
_context.next =
|
|
218
|
+
_context.next = 17;
|
|
211
219
|
break;
|
|
212
220
|
}
|
|
213
221
|
|
|
214
|
-
_context.next =
|
|
222
|
+
_context.next = 16;
|
|
215
223
|
return (0, _controllerUtils.getShuffledChoices)(choices, session, updateSession, 'id');
|
|
216
224
|
|
|
217
|
-
case
|
|
225
|
+
case 16:
|
|
218
226
|
choices = _context.sent;
|
|
219
227
|
|
|
220
|
-
case
|
|
221
|
-
alternates = getAlternates(
|
|
228
|
+
case 17:
|
|
229
|
+
alternates = getAlternates(filteredCorrectResponse);
|
|
222
230
|
out = {
|
|
223
231
|
categories: categories || [],
|
|
224
232
|
categoriesPerRow: categoriesPerRow || 2,
|
|
@@ -235,7 +243,7 @@ var model = function model(question, session, env, updateSession) {
|
|
|
235
243
|
note: note,
|
|
236
244
|
env: env,
|
|
237
245
|
showNote: alternates && alternates.length > 0,
|
|
238
|
-
correctResponse: mode === 'evaluate' ?
|
|
246
|
+
correctResponse: mode === 'evaluate' ? filteredCorrectResponse : undefined
|
|
239
247
|
};
|
|
240
248
|
|
|
241
249
|
if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {
|
|
@@ -248,7 +256,7 @@ var model = function model(question, session, env, updateSession) {
|
|
|
248
256
|
|
|
249
257
|
resolve(out);
|
|
250
258
|
|
|
251
|
-
case
|
|
259
|
+
case 21:
|
|
252
260
|
case "end":
|
|
253
261
|
return _context.stop();
|
|
254
262
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.js"],"names":["getPartialScore","correctResponse","builtCategories","reduce","acc","choices","placements","length","score","filter","ch","correct","maxScore","extraPlacements","totalScore","parseFloat","toFixed","getAlternates","map","c","alternateResponses","alternate","getTotalScore","question","session","env","Object","keys","categories","answers","alternates","enabled","partialScoring","getCorrectness","Promise","resolve","mode","undefined","createDefaultModel","model","defaults","normalize","feedbackEnabled","rationaleEnabled","promptEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","updateSession","normalizedQuestion","answerCorrectness","role","categoriesPerRow","choicesLabel","choicesPosition","feedback","prompt","removeTilesAfterPlacing","rowLabels","rationale","note","teacherInstructions","lockChoiceOrder","fb","out","correctness","disabled","showNote","outcome","reject","Error","empty","createCorrectResponseSession","id","validate","config","minChoices","maxChoices","maxCategories","reversedChoices","reverse","errors","choicesErrors","forEach","choice","index","content","identicalAnswer","slice","some","nbOfCategories","nbOfChoices","categoriesError","choicesError","hasAssociations","response","associationError"],"mappings":"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","sourcesContent":["import isEmpty from 'lodash/isEmpty';\nimport { buildState, score } from '@pie-lib/categorize';\nimport { getFeedbackForCorrectness } from '@pie-lib/feedback';\nimport {\n lockChoices,\n getShuffledChoices,\n partialScoring,\n} from '@pie-lib/controller-utils';\nimport defaults from './defaults';\n\n// eslint-disable-next-line no-console\n\nexport { score };\n\nexport const getPartialScore = (correctResponse, builtCategories) => {\n // in the resulted best scenario we make a sum with all the correct responses\n // and all the placements\n const { placements, score } = builtCategories.reduce(\n (acc, { choices = [] }) => ({\n placements: acc.placements + choices.length,\n score: acc.score + choices.filter((ch) => ch.correct).length,\n }),\n { placements: 0, score: 0 }\n );\n\n // in the correct response, we make a sum of the max possible score\n const { maxScore } = correctResponse.reduce(\n (acc, { choices }) => ({\n maxScore: acc.maxScore + choices.length,\n }),\n { maxScore: 0 }\n );\n\n // if there are any extra placements, we subtract from the obtained score\n const extraPlacements = placements > maxScore ? placements - maxScore : 0;\n const totalScore = (score - extraPlacements) / maxScore;\n\n return totalScore < 0 ? 0 : parseFloat(totalScore.toFixed(2));\n};\n\nconst getAlternates = correctResponse => correctResponse\n .map((c) => c.alternateResponses)\n .filter((alternate) => alternate);\n\nexport const getTotalScore = (question, session, env) => {\n if (!session) {\n return 0;\n }\n\n if (Object.keys(session).length === 0) {\n return 0;\n }\n const { categories, choices } = question || {};\n let { correctResponse } = question || {};\n let { answers } = session || {};\n answers = answers || [];\n correctResponse = correctResponse || [];\n\n // this function is used in pie-ui/categorize as well, in order to get the best scenario\n // so we get the best scenario and calculate the score\n const { categories: builtCategories, correct } = buildState(\n categories,\n choices,\n answers,\n correctResponse\n );\n\n const alternates = getAlternates(correctResponse);\n const enabled = partialScoring.enabled(question, env);\n\n // if there are any alternates, there will be no partial scoring!\n if (enabled && !alternates.length) {\n // we apply partial scoring\n return getPartialScore(correctResponse, builtCategories);\n }\n\n // else we apply dichotomous\n return correct ? 1 : 0;\n};\n\nexport const getCorrectness = (question, session, env) => {\n return new Promise((resolve) => {\n if (env.mode === 'evaluate') {\n const score = getTotalScore(question, session, env);\n if (score === 1) {\n resolve('correct');\n } else if (score === 0) {\n resolve('incorrect');\n } else {\n resolve('partially-correct');\n }\n } else {\n resolve(undefined);\n }\n });\n};\n\nexport const createDefaultModel = (model = {}) =>\n new Promise((resolve) => {\n resolve({\n ...defaults,\n ...model,\n });\n });\n\nexport const normalize = (question) => ({\n feedbackEnabled: true,\n rationaleEnabled: true,\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 * @param {*} updateSession - optional - a function that will set the properties passed into it on the session.\n */\nexport const model = (question, session, env, updateSession) =>\n new Promise(async (resolve) => {\n const normalizedQuestion = normalize(question);\n const answerCorrectness = await getCorrectness(normalizedQuestion, session, env);\n\n const { mode, role } = env || {};\n\n const {\n categories,\n categoriesPerRow,\n choicesLabel,\n choicesPosition,\n correctResponse,\n feedback,\n feedbackEnabled,\n promptEnabled,\n prompt,\n removeTilesAfterPlacing,\n rowLabels,\n rationaleEnabled,\n rationale,\n note,\n teacherInstructionsEnabled,\n teacherInstructions,\n } = normalizedQuestion;\n let { choices } = normalizedQuestion;\n let fb;\n\n const lockChoiceOrder = lockChoices(normalizedQuestion, session, env);\n\n if (mode === 'evaluate' && feedbackEnabled) {\n fb = await getFeedbackForCorrectness(\n answerCorrectness,\n feedback\n );\n }\n\n if (!lockChoiceOrder) {\n choices = await getShuffledChoices(choices, session, updateSession, 'id');\n }\n\n const alternates = getAlternates(correctResponse);\n const out = {\n categories: categories || [],\n categoriesPerRow: categoriesPerRow || 2,\n correctness: answerCorrectness,\n choices: choices || [],\n choicesLabel: choicesLabel || '',\n choicesPosition,\n disabled: mode !== 'gather',\n feedback: fb,\n lockChoiceOrder,\n prompt: promptEnabled ? prompt : null,\n removeTilesAfterPlacing,\n rowLabels,\n note,\n env,\n showNote: alternates && alternates.length > 0,\n correctResponse: mode === 'evaluate' ? correctResponse : undefined,\n };\n\n if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {\n out.rationale = rationaleEnabled ? rationale : null;\n out.teacherInstructions = teacherInstructionsEnabled\n ? teacherInstructions\n : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n resolve(out);\n });\n\nexport const outcome = (question, session, env) => {\n if (env.mode !== 'evaluate') {\n return Promise.reject(\n new Error('Can not call outcome when mode is not evaluate')\n );\n } else {\n return new Promise((resolve) => {\n resolve({\n score: getTotalScore(question, session, env),\n empty: !session || isEmpty(session),\n });\n });\n }\n};\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n const { mode, role } = env || {};\n\n if (mode !== 'evaluate' && role === 'instructor') {\n const { correctResponse } = question;\n\n resolve({ answers: correctResponse, id: 1 });\n } else {\n return resolve(null);\n }\n });\n};\n\nexport const validate = (model = {}, config = {}) => {\n const { categories, choices, correctResponse } = model;\n const { minChoices = 1, maxChoices, maxCategories } = config;\n const reversedChoices = [ ...choices || []].reverse();\n const errors = {};\n const choicesErrors = {};\n\n reversedChoices.forEach((choice, index) => {\n const { id, content } = choice;\n\n if (content === '' || content === '<div></div>') {\n choicesErrors[id] = 'Content should not be empty.';\n } else {\n const identicalAnswer = reversedChoices.slice(index + 1).some(c => c.content === content);\n\n if (identicalAnswer) {\n choicesErrors[id] = 'Content should be unique.';\n }\n }\n });\n\n const nbOfCategories = (categories || []).length;\n const nbOfChoices = (choices || []).length\n\n if (nbOfCategories > maxCategories) {\n errors.categoriesError = `No more than ${maxCategories} categories should be defined.`;\n } else if (nbOfCategories < 1) {\n errors.categoriesError = 'There should be at least 1 category defined.';\n }\n\n if (nbOfChoices < minChoices) {\n errors.choicesError = `There should be at least ${minChoices} choices defined.`;\n } else if (nbOfChoices > maxChoices) {\n errors.choicesError = `No more than ${maxChoices} choices should be defined.`;\n }\n\n if (nbOfChoices && nbOfCategories) {\n let hasAssociations = false;\n\n (correctResponse || []).forEach(response => {\n const { choices = [], alternateResponses = [] } = response;\n\n if (choices.length) {\n hasAssociations = true;\n } else {\n alternateResponses.forEach(alternate => {\n if ((alternate || []).length) {\n hasAssociations = true;\n }\n });\n }\n });\n\n if (!hasAssociations) {\n errors.associationError = 'At least one token should be assigned to at least one category.';\n }\n }\n\n if (!isEmpty(choicesErrors)) {\n errors.choicesErrors = choicesErrors;\n }\n\n return errors;\n};\n"],"file":"index.js"}
|
|
1
|
+
{"version":3,"sources":["../src/index.js"],"names":["getPartialScore","correctResponse","builtCategories","reduce","acc","choices","placements","length","score","filter","ch","correct","maxScore","extraPlacements","totalScore","parseFloat","toFixed","getAlternates","map","c","alternateResponses","alternate","getTotalScore","question","session","env","Object","keys","categories","answers","alternates","enabled","partialScoring","getCorrectness","Promise","resolve","mode","undefined","createDefaultModel","model","defaults","normalize","feedbackEnabled","rationaleEnabled","promptEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","updateSession","normalizedQuestion","answerCorrectness","role","categoriesPerRow","choicesLabel","choicesPosition","feedback","prompt","removeTilesAfterPlacing","rowLabels","rationale","note","teacherInstructions","lockChoiceOrder","filteredCorrectResponse","response","filteredChoices","choice","fb","out","correctness","disabled","showNote","outcome","reject","Error","empty","createCorrectResponseSession","id","validate","config","minChoices","maxChoices","maxCategories","reversedChoices","reverse","errors","choicesErrors","forEach","index","content","identicalAnswer","slice","some","nbOfCategories","nbOfChoices","categoriesError","choicesError","hasAssociations","associationError"],"mappings":"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","sourcesContent":["import isEmpty from 'lodash/isEmpty';\nimport { buildState, score } from '@pie-lib/categorize';\nimport { getFeedbackForCorrectness } from '@pie-lib/feedback';\nimport {\n lockChoices,\n getShuffledChoices,\n partialScoring,\n} from '@pie-lib/controller-utils';\nimport defaults from './defaults';\n\n// eslint-disable-next-line no-console\n\nexport { score };\n\nexport const getPartialScore = (correctResponse, builtCategories) => {\n // in the resulted best scenario we make a sum with all the correct responses\n // and all the placements\n const { placements, score } = builtCategories.reduce(\n (acc, { choices = [] }) => ({\n placements: acc.placements + choices.length,\n score: acc.score + choices.filter((ch) => ch.correct).length,\n }),\n { placements: 0, score: 0 }\n );\n\n // in the correct response, we make a sum of the max possible score\n const { maxScore } = correctResponse.reduce(\n (acc, { choices }) => ({\n maxScore: acc.maxScore + choices.length,\n }),\n { maxScore: 0 }\n );\n\n // if there are any extra placements, we subtract from the obtained score\n const extraPlacements = placements > maxScore ? placements - maxScore : 0;\n const totalScore = (score - extraPlacements) / maxScore;\n\n return totalScore < 0 ? 0 : parseFloat(totalScore.toFixed(2));\n};\n\nconst getAlternates = correctResponse => correctResponse\n .map((c) => c.alternateResponses)\n .filter((alternate) => alternate);\n\nexport const getTotalScore = (question, session, env) => {\n if (!session) {\n return 0;\n }\n\n if (Object.keys(session).length === 0) {\n return 0;\n }\n const { categories, choices } = question || {};\n let { correctResponse } = question || {};\n let { answers } = session || {};\n answers = answers || [];\n correctResponse = correctResponse || [];\n\n // this function is used in pie-ui/categorize as well, in order to get the best scenario\n // so we get the best scenario and calculate the score\n const { categories: builtCategories, correct } = buildState(\n categories,\n choices,\n answers,\n correctResponse\n );\n\n const alternates = getAlternates(correctResponse);\n const enabled = partialScoring.enabled(question, env);\n\n // if there are any alternates, there will be no partial scoring!\n if (enabled && !alternates.length) {\n // we apply partial scoring\n return getPartialScore(correctResponse, builtCategories);\n }\n\n // else we apply dichotomous\n return correct ? 1 : 0;\n};\n\nexport const getCorrectness = (question, session, env) => {\n return new Promise((resolve) => {\n if (env.mode === 'evaluate') {\n const score = getTotalScore(question, session, env);\n if (score === 1) {\n resolve('correct');\n } else if (score === 0) {\n resolve('incorrect');\n } else {\n resolve('partially-correct');\n }\n } else {\n resolve(undefined);\n }\n });\n};\n\nexport const createDefaultModel = (model = {}) =>\n new Promise((resolve) => {\n resolve({\n ...defaults,\n ...model,\n });\n });\n\nexport const normalize = (question) => ({\n feedbackEnabled: true,\n rationaleEnabled: true,\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 * @param {*} updateSession - optional - a function that will set the properties passed into it on the session.\n */\nexport const model = (question, session, env, updateSession) =>\n new Promise(async (resolve) => {\n const normalizedQuestion = normalize(question);\n const answerCorrectness = await getCorrectness(normalizedQuestion, session, env);\n\n const { mode, role } = env || {};\n\n const {\n categories,\n categoriesPerRow,\n choicesLabel,\n choicesPosition,\n correctResponse,\n feedback,\n feedbackEnabled,\n promptEnabled,\n prompt,\n removeTilesAfterPlacing,\n rowLabels,\n rationaleEnabled,\n rationale,\n note,\n teacherInstructionsEnabled,\n teacherInstructions,\n } = normalizedQuestion;\n let { choices } = normalizedQuestion;\n let fb;\n\n const lockChoiceOrder = lockChoices(normalizedQuestion, session, env);\n\n const filteredCorrectResponse = correctResponse.map(response => {\n const filteredChoices = (response.choices || []).filter(choice => choice !== 'null');\n return { ...response, choices: filteredChoices};\n });\n\n if (mode === 'evaluate' && feedbackEnabled) {\n fb = await getFeedbackForCorrectness(\n answerCorrectness,\n feedback\n );\n }\n\n if (!lockChoiceOrder) {\n choices = await getShuffledChoices(choices, session, updateSession, 'id');\n }\n\n const alternates = getAlternates(filteredCorrectResponse);\n const out = {\n categories: categories || [],\n categoriesPerRow: categoriesPerRow || 2,\n correctness: answerCorrectness,\n choices: choices || [],\n choicesLabel: choicesLabel || '',\n choicesPosition,\n disabled: mode !== 'gather',\n feedback: fb,\n lockChoiceOrder,\n prompt: promptEnabled ? prompt : null,\n removeTilesAfterPlacing,\n rowLabels,\n note,\n env,\n showNote: alternates && alternates.length > 0,\n correctResponse: mode === 'evaluate' ? filteredCorrectResponse : undefined,\n };\n\n if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {\n out.rationale = rationaleEnabled ? rationale : null;\n out.teacherInstructions = teacherInstructionsEnabled\n ? teacherInstructions\n : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n resolve(out);\n });\n\nexport const outcome = (question, session, env) => {\n if (env.mode !== 'evaluate') {\n return Promise.reject(\n new Error('Can not call outcome when mode is not evaluate')\n );\n } else {\n return new Promise((resolve) => {\n resolve({\n score: getTotalScore(question, session, env),\n empty: !session || isEmpty(session),\n });\n });\n }\n};\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n const { mode, role } = env || {};\n\n if (mode !== 'evaluate' && role === 'instructor') {\n const { correctResponse } = question;\n\n resolve({ answers: correctResponse, id: 1 });\n } else {\n return resolve(null);\n }\n });\n};\n\nexport const validate = (model = {}, config = {}) => {\n const { categories, choices, correctResponse } = model;\n const { minChoices = 1, maxChoices, maxCategories } = config;\n const reversedChoices = [ ...choices || []].reverse();\n const errors = {};\n const choicesErrors = {};\n\n reversedChoices.forEach((choice, index) => {\n const { id, content } = choice;\n\n if (content === '' || content === '<div></div>') {\n choicesErrors[id] = 'Content should not be empty.';\n } else {\n const identicalAnswer = reversedChoices.slice(index + 1).some(c => c.content === content);\n\n if (identicalAnswer) {\n choicesErrors[id] = 'Content should be unique.';\n }\n }\n });\n\n const nbOfCategories = (categories || []).length;\n const nbOfChoices = (choices || []).length\n\n if (nbOfCategories > maxCategories) {\n errors.categoriesError = `No more than ${maxCategories} categories should be defined.`;\n } else if (nbOfCategories < 1) {\n errors.categoriesError = 'There should be at least 1 category defined.';\n }\n\n if (nbOfChoices < minChoices) {\n errors.choicesError = `There should be at least ${minChoices} choices defined.`;\n } else if (nbOfChoices > maxChoices) {\n errors.choicesError = `No more than ${maxChoices} choices should be defined.`;\n }\n\n if (nbOfChoices && nbOfCategories) {\n let hasAssociations = false;\n\n (correctResponse || []).forEach(response => {\n const { choices = [], alternateResponses = [] } = response;\n\n if (choices.length) {\n hasAssociations = true;\n } else {\n alternateResponses.forEach(alternate => {\n if ((alternate || []).length) {\n hasAssociations = true;\n }\n });\n }\n });\n\n if (!hasAssociations) {\n errors.associationError = 'At least one token should be assigned to at least one category.';\n }\n }\n\n if (!isEmpty(choicesErrors)) {\n errors.choicesErrors = choicesErrors;\n }\n\n return errors;\n};\n"],"file":"index.js"}
|
package/controller/package.json
CHANGED
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
7
|
-
"version": "7.1.
|
|
7
|
+
"version": "7.1.7",
|
|
8
8
|
"description": "",
|
|
9
9
|
"author": "pie framework developers",
|
|
10
10
|
"license": "ISC",
|
|
@@ -12,10 +12,10 @@
|
|
|
12
12
|
"@material-ui/core": "^3.9.2",
|
|
13
13
|
"@pie-framework/pie-player-events": "^0.1.0",
|
|
14
14
|
"@pie-lib/categorize": "^0.6.24",
|
|
15
|
-
"@pie-lib/correct-answer-toggle": "^2.3.
|
|
15
|
+
"@pie-lib/correct-answer-toggle": "^2.3.44",
|
|
16
16
|
"@pie-lib/drag": "^1.1.52",
|
|
17
|
-
"@pie-lib/math-rendering": "^2.
|
|
18
|
-
"@pie-lib/render-ui": "^4.13.
|
|
17
|
+
"@pie-lib/math-rendering": "^2.5.0",
|
|
18
|
+
"@pie-lib/render-ui": "^4.13.4",
|
|
19
19
|
"classnames": "^2.2.5",
|
|
20
20
|
"debug": "^4.1.1",
|
|
21
21
|
"lodash": "^4.17.15",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"react-dnd": "^9.3.2",
|
|
25
25
|
"react-dom": "^16.8.1"
|
|
26
26
|
},
|
|
27
|
-
"gitHead": "
|
|
27
|
+
"gitHead": "286deccc05bad768d148964d59f854caa33de9e3",
|
|
28
28
|
"scripts": {
|
|
29
29
|
"postpublish": "../../scripts/postpublish"
|
|
30
30
|
},
|