@pie-element/multiple-choice 5.9.2 → 5.9.3-next.1016
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 +203 -0
- package/PRINT.md +35 -0
- package/configure/CHANGELOG.md +172 -0
- package/configure/lib/defaults.js +36 -9
- package/configure/lib/defaults.js.map +1 -1
- package/configure/lib/index.js +10 -5
- package/configure/lib/index.js.map +1 -1
- package/configure/lib/main.js +263 -49
- package/configure/lib/main.js.map +1 -1
- package/configure/lib/utils.js +18 -0
- package/configure/lib/utils.js.map +1 -0
- package/configure/package.json +4 -4
- package/controller/CHANGELOG.md +43 -0
- package/controller/lib/defaults.js +4 -2
- package/controller/lib/defaults.js.map +1 -1
- package/controller/lib/index.js +85 -9
- package/controller/lib/index.js.map +1 -1
- package/controller/lib/utils.js +9 -1
- package/controller/lib/utils.js.map +1 -1
- package/controller/package.json +1 -1
- package/docs/config-schema.json +137 -1
- package/docs/config-schema.json.md +107 -3
- package/docs/demo/generate.js +10 -5
- package/docs/pie-schema.json +63 -4
- package/docs/pie-schema.json.md +53 -2
- package/lib/choice-input.js +44 -20
- package/lib/choice-input.js.map +1 -1
- package/lib/choice.js +157 -0
- package/lib/choice.js.map +1 -0
- package/lib/feedback-tick.js +1 -1
- package/lib/feedback-tick.js.map +1 -1
- package/lib/index.js +2 -2
- package/lib/index.js.map +1 -1
- package/lib/main.js +1 -1
- package/lib/main.js.map +1 -1
- package/lib/multiple-choice.js +70 -143
- package/lib/multiple-choice.js.map +1 -1
- package/lib/print.js +129 -0
- package/lib/print.js.map +1 -0
- package/package.json +11 -7
- package/docs/demo/pie.manifest.json +0 -11
- package/module/configure.js +0 -881
- package/module/controller.js +0 -20268
- package/module/demo.js +0 -74
- package/module/element.js +0 -1221
- package/module/index.html +0 -16
- package/module/manifest.json +0 -10
package/configure/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pie-element/multiple-choice-configure",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.1.6",
|
|
4
4
|
"private": true,
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"module": "src/index.js",
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
"@material-ui/core": "^3.9.2",
|
|
9
9
|
"@material-ui/icons": "^3.0.1",
|
|
10
10
|
"@pie-framework/pie-configure-events": "^1.2.0",
|
|
11
|
-
"@pie-lib/config-ui": "^10.
|
|
12
|
-
"@pie-lib/editable-html": "^7.
|
|
13
|
-
"@pie-lib/scoring-config": "^3.5.
|
|
11
|
+
"@pie-lib/config-ui": "^10.13.3",
|
|
12
|
+
"@pie-lib/editable-html": "^7.22.6",
|
|
13
|
+
"@pie-lib/scoring-config": "^3.5.163",
|
|
14
14
|
"debug": "^3.1.0",
|
|
15
15
|
"lodash": "^4.17.15",
|
|
16
16
|
"prop-types": "^15.6.2",
|
package/controller/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,49 @@
|
|
|
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
|
+
## [3.5.1](https://github.com/pie-framework/pie-elements/compare/@pie-element/multiple-choice-controller@3.4.1...@pie-element/multiple-choice-controller@3.5.1) (2021-11-11)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @pie-element/multiple-choice-controller
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
# [3.5.0](https://github.com/pie-framework/pie-elements/compare/@pie-element/multiple-choice-controller@3.3.3...@pie-element/multiple-choice-controller@3.5.0) (2021-11-11)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
### Features
|
|
18
|
+
|
|
19
|
+
* **multiple-choice:** accessibility label - added aria label to checkbox and radio input types ([22514bb](https://github.com/pie-framework/pie-elements/commit/22514bb5e2476bc79a55756ff9a5c0c1e0642a29))
|
|
20
|
+
* if there are no choices - do not show grid columns dropdown BREAKING CHANGE: removed verticalMode(boolean) from model & configuration - and replaced it with choicesLayout(string) ([1c36ae8](https://github.com/pie-framework/pie-elements/commit/1c36ae8b7f9369b2723a6a84e7350370e1186c50))
|
|
21
|
+
* **multiple-choice:** added possibility to change layout - vertical, grid, horizontal ([46e7681](https://github.com/pie-framework/pie-elements/commit/46e7681a178ff29c983db1c7b6206389b55e2a00))
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
## [3.4.1](https://github.com/pie-framework/pie-elements/compare/@pie-element/multiple-choice-controller@3.4.0...@pie-element/multiple-choice-controller@3.4.1) (2021-09-01)
|
|
29
|
+
|
|
30
|
+
**Note:** Version bump only for package @pie-element/multiple-choice-controller
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
# [3.4.0](https://github.com/pie-framework/pie-elements/compare/@pie-element/multiple-choice-controller@3.3.3...@pie-element/multiple-choice-controller@3.4.0) (2021-08-05)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
### Features
|
|
40
|
+
|
|
41
|
+
* **multiple-choice:** accessibility label - added aria label to checkbox and radio input types ([22514bb](https://github.com/pie-framework/pie-elements/commit/22514bb5e2476bc79a55756ff9a5c0c1e0642a29))
|
|
42
|
+
* if there are no choices - do not show grid columns dropdown BREAKING CHANGE: removed verticalMode(boolean) from model & configuration - and replaced it with choicesLayout(string) ([1c36ae8](https://github.com/pie-framework/pie-elements/commit/1c36ae8b7f9369b2723a6a84e7350370e1186c50))
|
|
43
|
+
* **multiple-choice:** added possibility to change layout - vertical, grid, horizontal ([46e7681](https://github.com/pie-framework/pie-elements/commit/46e7681a178ff29c983db1c7b6206389b55e2a00))
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
6
49
|
## [3.3.3](https://github.com/pie-framework/pie-elements/compare/@pie-element/multiple-choice-controller@3.3.1...@pie-element/multiple-choice-controller@3.3.3) (2021-08-05)
|
|
7
50
|
|
|
8
51
|
|
|
@@ -7,10 +7,12 @@ exports["default"] = void 0;
|
|
|
7
7
|
var _default = {
|
|
8
8
|
promptEnabled: true,
|
|
9
9
|
rationaleEnabled: true,
|
|
10
|
+
accessibilityLabelsEnabled: false,
|
|
10
11
|
teacherInstructionsEnabled: true,
|
|
11
12
|
studentInstructionsEnabled: true,
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
choicePrefix: 'letters',
|
|
14
|
+
choicesLayout: 'vertical',
|
|
15
|
+
gridColumns: '2'
|
|
14
16
|
};
|
|
15
17
|
exports["default"] = _default;
|
|
16
18
|
//# sourceMappingURL=defaults.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/defaults.js"],"names":["promptEnabled","rationaleEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","
|
|
1
|
+
{"version":3,"sources":["../src/defaults.js"],"names":["promptEnabled","rationaleEnabled","accessibilityLabelsEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","choicePrefix","choicesLayout","gridColumns"],"mappings":";;;;;;eAAe;AACbA,EAAAA,aAAa,EAAE,IADF;AAEbC,EAAAA,gBAAgB,EAAE,IAFL;AAGbC,EAAAA,0BAA0B,EAAE,KAHf;AAIbC,EAAAA,0BAA0B,EAAE,IAJf;AAKbC,EAAAA,0BAA0B,EAAE,IALf;AAMbC,EAAAA,YAAY,EAAE,SAND;AAObC,EAAAA,aAAa,EAAE,UAPF;AAQbC,EAAAA,WAAW,EAAE;AARA,C","sourcesContent":["export default {\n promptEnabled: true,\n rationaleEnabled: true,\n accessibilityLabelsEnabled: false,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n choicePrefix: 'letters',\n choicesLayout: 'vertical',\n gridColumns: '2'\n};\n"],"file":"defaults.js"}
|
package/controller/lib/index.js
CHANGED
|
@@ -5,15 +5,22 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
|
+
exports.createCorrectResponseSession = void 0;
|
|
8
9
|
exports.createDefaultModel = createDefaultModel;
|
|
10
|
+
exports.getScore = void 0;
|
|
9
11
|
exports.model = model;
|
|
12
|
+
exports.normalize = void 0;
|
|
10
13
|
exports.outcome = outcome;
|
|
11
|
-
exports.
|
|
14
|
+
exports.validate = void 0;
|
|
12
15
|
|
|
13
16
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
14
17
|
|
|
18
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
19
|
+
|
|
15
20
|
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
16
21
|
|
|
22
|
+
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
23
|
+
|
|
17
24
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
18
25
|
|
|
19
26
|
var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
|
|
@@ -24,9 +31,11 @@ var _defaults = _interopRequireDefault(require("./defaults"));
|
|
|
24
31
|
|
|
25
32
|
var _controllerUtils = require("@pie-lib/controller-utils");
|
|
26
33
|
|
|
27
|
-
|
|
34
|
+
var _excluded = ["verticalMode", "choicesLayout"];
|
|
28
35
|
|
|
29
|
-
function
|
|
36
|
+
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; }
|
|
37
|
+
|
|
38
|
+
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; }
|
|
30
39
|
|
|
31
40
|
var prepareChoice = function prepareChoice(model, env, defaultFeedback) {
|
|
32
41
|
return function (choice) {
|
|
@@ -39,6 +48,10 @@ var prepareChoice = function prepareChoice(model, env, defaultFeedback) {
|
|
|
39
48
|
value: choice.value
|
|
40
49
|
};
|
|
41
50
|
|
|
51
|
+
if (model.accessibilityLabelsEnabled) {
|
|
52
|
+
out.accessibility = (0, _utils.parseHTML)(choice.accessibility).textContent || choice.value;
|
|
53
|
+
}
|
|
54
|
+
|
|
42
55
|
if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {
|
|
43
56
|
out.rationale = model.rationaleEnabled ? choice.rationale : null;
|
|
44
57
|
} else {
|
|
@@ -71,7 +84,16 @@ function createDefaultModel() {
|
|
|
71
84
|
}
|
|
72
85
|
|
|
73
86
|
var normalize = function normalize(question) {
|
|
74
|
-
|
|
87
|
+
var _ref2 = question || {},
|
|
88
|
+
verticalMode = _ref2.verticalMode,
|
|
89
|
+
choicesLayout = _ref2.choicesLayout,
|
|
90
|
+
questionProps = (0, _objectWithoutProperties2["default"])(_ref2, _excluded);
|
|
91
|
+
|
|
92
|
+
return _objectSpread(_objectSpread(_objectSpread({}, _defaults["default"]), questionProps), {}, {
|
|
93
|
+
// This is used for offering support for old models which have the property verticalMode
|
|
94
|
+
// Same thing is set in authoring : packages/multiple-choice/configure/src/index.jsx - createDefaultModel
|
|
95
|
+
choicesLayout: choicesLayout || verticalMode === false && 'horizontal' || _defaults["default"].choicesLayout
|
|
96
|
+
});
|
|
75
97
|
};
|
|
76
98
|
/**
|
|
77
99
|
*
|
|
@@ -90,7 +112,7 @@ function model(_x, _x2, _x3, _x4) {
|
|
|
90
112
|
|
|
91
113
|
function _model() {
|
|
92
114
|
_model = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(question, session, env, updateSession) {
|
|
93
|
-
var normalizedQuestion, defaultFeedback, choices, lockChoiceOrder, out,
|
|
115
|
+
var normalizedQuestion, defaultFeedback, choices, lockChoiceOrder, out, _ref4, role, mode;
|
|
94
116
|
|
|
95
117
|
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
96
118
|
while (1) {
|
|
@@ -120,13 +142,14 @@ function _model() {
|
|
|
120
142
|
disabled: env.mode !== 'gather',
|
|
121
143
|
mode: env.mode,
|
|
122
144
|
prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,
|
|
123
|
-
|
|
145
|
+
choicesLayout: normalizedQuestion.choicesLayout,
|
|
146
|
+
gridColumns: normalizedQuestion.gridColumns,
|
|
124
147
|
choiceMode: normalizedQuestion.choiceMode,
|
|
125
148
|
keyMode: normalizedQuestion.choicePrefix,
|
|
126
149
|
choices: choices,
|
|
127
150
|
responseCorrect: env.mode === 'evaluate' ? (0, _utils.isResponseCorrect)(normalizedQuestion, session) : undefined
|
|
128
151
|
};
|
|
129
|
-
|
|
152
|
+
_ref4 = env || {}, role = _ref4.role, mode = _ref4.mode;
|
|
130
153
|
|
|
131
154
|
if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {
|
|
132
155
|
out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled ? normalizedQuestion.teacherInstructions : null;
|
|
@@ -206,10 +229,10 @@ function outcome(model, session, env) {
|
|
|
206
229
|
var createCorrectResponseSession = function createCorrectResponseSession(question, env) {
|
|
207
230
|
return new Promise(function (resolve) {
|
|
208
231
|
if (env.mode !== 'evaluate' && env.role === 'instructor') {
|
|
209
|
-
var
|
|
232
|
+
var _ref3 = question || {
|
|
210
233
|
choices: []
|
|
211
234
|
},
|
|
212
|
-
choices =
|
|
235
|
+
choices = _ref3.choices;
|
|
213
236
|
|
|
214
237
|
resolve({
|
|
215
238
|
id: '1',
|
|
@@ -226,4 +249,57 @@ var createCorrectResponseSession = function createCorrectResponseSession(questio
|
|
|
226
249
|
};
|
|
227
250
|
|
|
228
251
|
exports.createCorrectResponseSession = createCorrectResponseSession;
|
|
252
|
+
|
|
253
|
+
var validate = function validate() {
|
|
254
|
+
var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
255
|
+
var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
256
|
+
var choices = model.choices;
|
|
257
|
+
var _config$minAnswerChoi = config.minAnswerChoices,
|
|
258
|
+
minAnswerChoices = _config$minAnswerChoi === void 0 ? 2 : _config$minAnswerChoi,
|
|
259
|
+
maxAnswerChoices = config.maxAnswerChoices;
|
|
260
|
+
var reversedChoices = (0, _toConsumableArray2["default"])(choices || []).reverse();
|
|
261
|
+
var choicesErrors = {};
|
|
262
|
+
var hasCorrectResponse = false;
|
|
263
|
+
reversedChoices.forEach(function (choice, index) {
|
|
264
|
+
var correct = choice.correct,
|
|
265
|
+
value = choice.value,
|
|
266
|
+
label = choice.label;
|
|
267
|
+
|
|
268
|
+
if (correct) {
|
|
269
|
+
hasCorrectResponse = true;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
if (label === '' || label === '<div></div>') {
|
|
273
|
+
choicesErrors[value] = 'Content should not be empty.';
|
|
274
|
+
} else {
|
|
275
|
+
var identicalAnswer = reversedChoices.slice(index + 1).some(function (c) {
|
|
276
|
+
return c.label === label;
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
if (identicalAnswer) {
|
|
280
|
+
choicesErrors[value] = 'Content should be unique.';
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
var errors = {};
|
|
285
|
+
var nbOfChoices = (choices || []).length;
|
|
286
|
+
|
|
287
|
+
if (nbOfChoices < minAnswerChoices) {
|
|
288
|
+
errors.answerChoicesError = "There should be at least ".concat(minAnswerChoices, " choices defined.");
|
|
289
|
+
} else if (nbOfChoices > maxAnswerChoices) {
|
|
290
|
+
errors.answerChoicesError = "No more than ".concat(maxAnswerChoices, " choices should be defined.");
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
if (!hasCorrectResponse) {
|
|
294
|
+
errors.correctResponseError = 'No correct response defined.';
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
if (!(0, _isEmpty["default"])(choicesErrors)) {
|
|
298
|
+
errors.choicesErrors = choicesErrors;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
return errors;
|
|
302
|
+
};
|
|
303
|
+
|
|
304
|
+
exports.validate = validate;
|
|
229
305
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.js"],"names":["prepareChoice","model","env","defaultFeedback","choice","role","mode","out","label","value","rationale","rationaleEnabled","correct","feedbackEnabled","feedbackType","feedback","type","createDefaultModel","Promise","resolve","defaults","normalize","question","session","updateSession","normalizedQuestion","Object","assign","incorrect","choices","map","lockChoiceOrder","disabled","prompt","promptEnabled","verticalMode","choiceMode","keyMode","choicePrefix","responseCorrect","undefined","teacherInstructions","teacherInstructionsEnabled","getScore","config","selectedChoices","correctChoices","filter","ch","score","reduce","acc","selectedChoice","find","length","str","parseFloat","toFixed","outcome","empty","partialScoringEnabled","partialScoring","enabled","createCorrectResponseSession","id","c"],"mappings":";;;;;;;;;;;;;;;;;;AACA;;AACA;;AACA;;AACA;;;;;;AAEA,IAAMA,aAAa,GAAG,SAAhBA,aAAgB,CAACC,KAAD,EAAQC,GAAR,EAAaC,eAAb;AAAA,SAAiC,UAAAC,MAAM,EAAI;AAAA,eACxCF,GAAG,IAAI,EADiC;AAAA,QACvDG,IADuD,QACvDA,IADuD;AAAA,QACjDC,IADiD,QACjDA,IADiD;;AAE/D,QAAMC,GAAG,GAAG;AACVC,MAAAA,KAAK,EAAEJ,MAAM,CAACI,KADJ;AAEVC,MAAAA,KAAK,EAAEL,MAAM,CAACK;AAFJ,KAAZ;;AAKA,QAAIJ,IAAI,KAAK,YAAT,KAA0BC,IAAI,KAAK,MAAT,IAAmBA,IAAI,KAAK,UAAtD,CAAJ,EAAuE;AACrEC,MAAAA,GAAG,CAACG,SAAJ,GAAgBT,KAAK,CAACU,gBAAN,GAAyBP,MAAM,CAACM,SAAhC,GAA4C,IAA5D;AACD,KAFD,MAEO;AACLH,MAAAA,GAAG,CAACG,SAAJ,GAAgB,IAAhB;AACD;;AAED,QAAIJ,IAAI,KAAK,UAAb,EAAyB;AACvBC,MAAAA,GAAG,CAACK,OAAJ,GAAc,CAAC,CAACR,MAAM,CAACQ,OAAvB;;AAEA,UAAIX,KAAK,CAACY,eAAV,EAA2B;AACzB,YAAMC,YAAY,GAAIV,MAAM,CAACW,QAAP,IAAmBX,MAAM,CAACW,QAAP,CAAgBC,IAApC,IAA6C,MAAlE;;AAEA,YAAIF,YAAY,KAAK,SAArB,EAAgC;AAC9BP,UAAAA,GAAG,CAACQ,QAAJ,GAAeZ,eAAe,CAACC,MAAM,CAACQ,OAAP,GAAiB,SAAjB,GAA6B,WAA9B,CAA9B;AACD,SAFD,MAEO,IAAIE,YAAY,KAAK,QAArB,EAA+B;AACpCP,UAAAA,GAAG,CAACQ,QAAJ,GAAeX,MAAM,CAACW,QAAP,CAAgBN,KAA/B;AACD;AACF;AACF;;AAED,WAAOF,GAAP;AACD,GA5BqB;AAAA,CAAtB;;AA8BO,SAASU,kBAAT,GAAwC;AAAA,MAAZhB,KAAY,uEAAJ,EAAI;AAC7C,SAAO,IAAIiB,OAAJ,CAAY,UAAAC,OAAO;AAAA,WAAIA,OAAO,iCAAMC,oBAAN,GAAmBnB,KAAnB,EAAX;AAAA,GAAnB,CAAP;AACD;;AAEM,IAAMoB,SAAS,GAAG,SAAZA,SAAY,CAAAC,QAAQ;AAAA,yCAAUF,oBAAV,GAAuBE,QAAvB;AAAA,CAA1B;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;;;;;SACsBrB,K;;;;;yFAAf,iBAAqBqB,QAArB,EAA+BC,OAA/B,EAAwCrB,GAAxC,EAA6CsB,aAA7C;AAAA;;AAAA;AAAA;AAAA;AAAA;AACCC,YAAAA,kBADD,GACsBJ,SAAS,CAACC,QAAD,CAD/B;AAECnB,YAAAA,eAFD,GAEmBuB,MAAM,CAACC,MAAP,CACtB;AAAEf,cAAAA,OAAO,EAAE,SAAX;AAAsBgB,cAAAA,SAAS,EAAE;AAAjC,aADsB,EAEtBH,kBAAkB,CAACtB,eAFG,CAFnB;AAOD0B,YAAAA,OAPC,GAOSJ,kBAAkB,CAACI,OAAnB,CAA2BC,GAA3B,CACZ9B,aAAa,CAACyB,kBAAD,EAAqBvB,GAArB,EAA0BC,eAA1B,CADD,CAPT;AAWC4B,YAAAA,eAXD,GAWmB,kCAAYN,kBAAZ,EAAgCF,OAAhC,EAAyCrB,GAAzC,CAXnB;;AAAA,gBAaA6B,eAbA;AAAA;AAAA;AAAA;;AAAA;AAAA,mBAca,yCACdF,OADc,EAEdN,OAFc,EAGdC,aAHc,EAId,OAJc,CAdb;;AAAA;AAcHK,YAAAA,OAdG;;AAAA;AAsBCtB,YAAAA,GAtBD,GAsBO;AACVyB,cAAAA,QAAQ,EAAE9B,GAAG,CAACI,IAAJ,KAAa,QADb;AAEVA,cAAAA,IAAI,EAAEJ,GAAG,CAACI,IAFA;AAGV2B,cAAAA,MAAM,EAAER,kBAAkB,CAACS,aAAnB,GAAmCT,kBAAkB,CAACQ,MAAtD,GAA+D,IAH7D;AAIVE,cAAAA,YAAY,EAAEV,kBAAkB,CAACU,YAJvB;AAKVC,cAAAA,UAAU,EAAEX,kBAAkB,CAACW,UALrB;AAMVC,cAAAA,OAAO,EAAEZ,kBAAkB,CAACa,YANlB;AAOVT,cAAAA,OAAO,EAAPA,OAPU;AAQVU,cAAAA,eAAe,EACbrC,GAAG,CAACI,IAAJ,KAAa,UAAb,GAA0B,8BAAkBmB,kBAAlB,EAAsCF,OAAtC,CAA1B,GAA2EiB;AATnE,aAtBP;AAAA,oBAkCkBtC,GAAG,IAAI,EAlCzB,EAkCGG,IAlCH,SAkCGA,IAlCH,EAkCSC,IAlCT,SAkCSA,IAlCT;;AAoCL,gBAAID,IAAI,KAAK,YAAT,KAA0BC,IAAI,KAAK,MAAT,IAAmBA,IAAI,KAAK,UAAtD,CAAJ,EAAuE;AACrEC,cAAAA,GAAG,CAACkC,mBAAJ,GAA0BhB,kBAAkB,CAACiB,0BAAnB,GACtBjB,kBAAkB,CAACgB,mBADG,GAEtB,IAFJ;AAGD,aAJD,MAIO;AACLlC,cAAAA,GAAG,CAACkC,mBAAJ,GAA0B,IAA1B;AACD;;AA1CI,6CA4CElC,GA5CF;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,G;;;;AAgDA,IAAMoC,QAAQ,GAAG,SAAXA,QAAW,CAACC,MAAD,EAASrB,OAAT,EAAqB;AAC3C,MAAI,CAACA,OAAD,IAAY,yBAAQA,OAAR,CAAhB,EAAkC;AAChC,WAAO,CAAP;AACD;;AAED,MAAMsB,eAAe,GAAGtB,OAAO,CAACd,KAAR,IAAiB,EAAzC;AACA,MAAMqC,cAAc,GAAG,CAACF,MAAM,CAACf,OAAP,IAAkB,EAAnB,EAAuBkB,MAAvB,CAA8B,UAAAC,EAAE;AAAA,WAAIA,EAAE,CAACpC,OAAP;AAAA,GAAhC,CAAvB;AAEA,MAAIqC,KAAK,GAAGJ,eAAe,CAACK,MAAhB,CAAuB,UAACC,GAAD,EAAMC,cAAN;AAAA,WACjCD,GAAG,IAAIL,cAAc,CAACO,IAAf,CAAoB,UAAAL,EAAE;AAAA,aAAIA,EAAE,CAACvC,KAAH,KAAa2C,cAAjB;AAAA,KAAtB,IAAyD,CAAzD,GAA6D,CAAjE,CAD8B;AAAA,GAAvB,EAC8D,CAD9D,CAAZ;;AAGA,MAAIN,cAAc,CAACQ,MAAf,GAAwBT,eAAe,CAACS,MAA5C,EAAoD;AAClDL,IAAAA,KAAK,IAAIJ,eAAe,CAACS,MAAhB,GAAyBR,cAAc,CAACQ,MAAjD;;AAEA,QAAIL,KAAK,GAAG,CAAZ,EAAe;AACbA,MAAAA,KAAK,GAAG,CAAR;AACD;AACF;;AAED,MAAMM,GAAG,GAAGT,cAAc,CAACQ,MAAf,GAAwBL,KAAK,GAAGH,cAAc,CAACQ,MAA/C,GAAwD,CAApE;AAEA,SAAOE,UAAU,CAACD,GAAG,CAACE,OAAJ,CAAY,CAAZ,CAAD,CAAjB;AACD,CAtBM;AAwBP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AACO,SAASC,OAAT,CAAiBzD,KAAjB,EAAwBsB,OAAxB,EAAiCrB,GAAjC,EAAsC;AAC3C,SAAO,IAAIgB,OAAJ,CAAY,UAAAC,OAAO,EAAI;AAC5B,QAAI,CAACI,OAAD,IAAY,yBAAQA,OAAR,CAAhB,EAAkC;AAChCJ,MAAAA,OAAO,CAAC;AAAE8B,QAAAA,KAAK,EAAE,CAAT;AAAYU,QAAAA,KAAK,EAAE;AAAnB,OAAD,CAAP;AACD,KAFD,MAEO;AACL,UAAMC,qBAAqB,GACzBC,gCAAeC,OAAf,CAAuB7D,KAAvB,EAA8BC,GAA9B,KAAsCD,KAAK,CAACmC,UAAN,KAAqB,OAD7D;AAEA,UAAMa,KAAK,GAAGN,QAAQ,CAAC1C,KAAD,EAAQsB,OAAR,CAAtB;AAEAJ,MAAAA,OAAO,CAAC;AAAE8B,QAAAA,KAAK,EAAEW,qBAAqB,GAAGX,KAAH,GAAWA,KAAK,KAAK,CAAV,GAAc,CAAd,GAAkB,CAA3D;AAA8DU,QAAAA,KAAK,EAAE;AAArE,OAAD,CAAP;AACD;AACF,GAVM,CAAP;AAWD;;AAEM,IAAMI,4BAA4B,GAAG,SAA/BA,4BAA+B,CAACzC,QAAD,EAAWpB,GAAX,EAAmB;AAC7D,SAAO,IAAIgB,OAAJ,CAAY,UAAAC,OAAO,EAAI;AAC5B,QAAIjB,GAAG,CAACI,IAAJ,KAAa,UAAb,IAA2BJ,GAAG,CAACG,IAAJ,KAAa,YAA5C,EAA0D;AAAA,kBACpCiB,QAAQ,IAAI;AAAEO,QAAAA,OAAO,EAAE;AAAX,OADwB;AAAA,UAChDA,OADgD,SAChDA,OADgD;;AAGxDV,MAAAA,OAAO,CAAC;AACN6C,QAAAA,EAAE,EAAE,GADE;AAENvD,QAAAA,KAAK,EAAEoB,OAAO,CAACkB,MAAR,CAAe,UAAAkB,CAAC;AAAA,iBAAIA,CAAC,CAACrD,OAAN;AAAA,SAAhB,EAA+BkB,GAA/B,CAAmC,UAAAmC,CAAC;AAAA,iBAAIA,CAAC,CAACxD,KAAN;AAAA,SAApC;AAFD,OAAD,CAAP;AAID,KAPD,MAOO;AACLU,MAAAA,OAAO,CAAC,IAAD,CAAP;AACD;AACF,GAXM,CAAP;AAYD,CAbM","sourcesContent":["/* eslint-disable no-console */\nimport isEmpty from 'lodash/isEmpty';\nimport { isResponseCorrect } from './utils';\nimport defaults from './defaults';\nimport { lockChoices, partialScoring, getShuffledChoices } from '@pie-lib/controller-utils';\n\nconst prepareChoice = (model, env, defaultFeedback) => choice => {\n const { role, mode } = env || {};\n const out = {\n label: choice.label,\n value: choice.value\n };\n\n if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {\n out.rationale = model.rationaleEnabled ? choice.rationale : null;\n } else {\n out.rationale = null;\n }\n\n if (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\nexport function createDefaultModel(model = {}) {\n return new Promise(resolve => resolve({ ...defaults, ...model }));\n}\n\nexport const normalize = question => ({ ...defaults, ...question });\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n * @param {*} updateSession - optional - a function that will set the properties passed into it on the session.\n */\nexport async function model(question, session, env, updateSession) {\n const normalizedQuestion = normalize(question);\n const defaultFeedback = Object.assign(\n { correct: 'Correct', incorrect: 'Incorrect' },\n normalizedQuestion.defaultFeedback\n );\n\n let choices = normalizedQuestion.choices.map(\n prepareChoice(normalizedQuestion, env, defaultFeedback)\n );\n\n const lockChoiceOrder = lockChoices(normalizedQuestion, session, env);\n\n if (!lockChoiceOrder) {\n choices = await getShuffledChoices(\n choices,\n session,\n updateSession,\n 'value'\n );\n }\n\n const out = {\n disabled: env.mode !== 'gather',\n mode: env.mode,\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n verticalMode: normalizedQuestion.verticalMode,\n choiceMode: normalizedQuestion.choiceMode,\n keyMode: normalizedQuestion.choicePrefix,\n choices,\n responseCorrect:\n env.mode === 'evaluate' ? isResponseCorrect(normalizedQuestion, session) : undefined\n };\n\n const { role, mode } = env || {};\n\n if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n out.teacherInstructions = null;\n }\n\n return out;\n}\n\n\nexport const getScore = (config, session) => {\n if (!session || isEmpty(session)) {\n return 0;\n }\n\n const selectedChoices = session.value || [];\n const correctChoices = (config.choices || []).filter(ch => ch.correct);\n\n let score = selectedChoices.reduce((acc, selectedChoice) =>\n acc + (correctChoices.find(ch => ch.value === selectedChoice) ? 1 : 0), 0);\n\n if (correctChoices.length < selectedChoices.length) {\n score -= selectedChoices.length - correctChoices.length;\n\n if (score < 0) {\n score = 0;\n }\n }\n\n const str = correctChoices.length ? score / correctChoices.length : 0;\n\n return parseFloat(str.toFixed(2));\n};\n\n/**\n *\n * The score is partial by default for checkbox mode, allOrNothing for radio mode.\n * To disable partial scoring for checkbox mode you either set model.partialScoring = false or env.partialScoring = false. the value in `env` will\n * override the value in `model`.\n * @param {Object} model - the main model\n * @param {*} session\n * @param {Object} env\n */\nexport function outcome(model, session, env) {\n return new Promise(resolve => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n } else {\n const partialScoringEnabled =\n partialScoring.enabled(model, env) && model.choiceMode !== 'radio';\n const score = getScore(model, session);\n\n resolve({ score: partialScoringEnabled ? score : score === 1 ? 1 : 0, empty: false });\n }\n });\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise(resolve => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { choices } = question || { choices: [] };\n\n resolve({\n id: '1',\n value: choices.filter(c => c.correct).map(c => c.value)\n });\n } else {\n resolve(null);\n }\n });\n};\n"],"file":"index.js"}
|
|
1
|
+
{"version":3,"sources":["../src/index.js"],"names":["prepareChoice","model","env","defaultFeedback","choice","role","mode","out","label","value","accessibilityLabelsEnabled","accessibility","textContent","rationale","rationaleEnabled","correct","feedbackEnabled","feedbackType","feedback","type","createDefaultModel","Promise","resolve","defaults","normalize","question","verticalMode","choicesLayout","questionProps","session","updateSession","normalizedQuestion","Object","assign","incorrect","choices","map","lockChoiceOrder","disabled","prompt","promptEnabled","gridColumns","choiceMode","keyMode","choicePrefix","responseCorrect","undefined","teacherInstructions","teacherInstructionsEnabled","getScore","config","selectedChoices","correctChoices","filter","ch","score","reduce","acc","selectedChoice","find","length","str","parseFloat","toFixed","outcome","empty","partialScoringEnabled","partialScoring","enabled","createCorrectResponseSession","id","c","validate","minAnswerChoices","maxAnswerChoices","reversedChoices","reverse","choicesErrors","hasCorrectResponse","forEach","index","identicalAnswer","slice","some","errors","nbOfChoices","answerChoicesError","correctResponseError"],"mappings":"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","sourcesContent":["/* eslint-disable no-console */\nimport isEmpty from 'lodash/isEmpty';\nimport { isResponseCorrect, parseHTML } from './utils';\nimport defaults from './defaults';\nimport { lockChoices, partialScoring, getShuffledChoices } from '@pie-lib/controller-utils';\n\nconst prepareChoice = (model, env, defaultFeedback) => choice => {\n const { role, mode } = env || {};\n const out = {\n label: choice.label,\n value: choice.value,\n };\n\n if (model.accessibilityLabelsEnabled) {\n out.accessibility = parseHTML(choice.accessibility).textContent || choice.value;\n }\n\n if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {\n out.rationale = model.rationaleEnabled ? choice.rationale : null;\n } else {\n out.rationale = null;\n }\n\n if (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\nexport function createDefaultModel(model = {}) {\n return new Promise(resolve => resolve({ ...defaults, ...model }));\n}\n\nexport const normalize = question => {\n const { verticalMode, choicesLayout, ...questionProps } = question || {};\n\n return {\n ...defaults,\n ...questionProps,\n // This is used for offering support for old models which have the property verticalMode\n // Same thing is set in authoring : packages/multiple-choice/configure/src/index.jsx - createDefaultModel\n choicesLayout: choicesLayout || (verticalMode === false && 'horizontal') || defaults.choicesLayout\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\n const defaultFeedback = Object.assign(\n { correct: 'Correct', incorrect: 'Incorrect' },\n normalizedQuestion.defaultFeedback\n );\n\n let choices = normalizedQuestion.choices.map(\n prepareChoice(normalizedQuestion, env, defaultFeedback)\n );\n\n const lockChoiceOrder = lockChoices(normalizedQuestion, session, env);\n\n if (!lockChoiceOrder) {\n choices = await getShuffledChoices(\n choices,\n session,\n updateSession,\n 'value'\n );\n }\n\n const out = {\n disabled: env.mode !== 'gather',\n mode: env.mode,\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n choicesLayout: normalizedQuestion.choicesLayout,\n gridColumns: normalizedQuestion.gridColumns,\n choiceMode: normalizedQuestion.choiceMode,\n keyMode: normalizedQuestion.choicePrefix,\n choices,\n responseCorrect:\n env.mode === 'evaluate' ? isResponseCorrect(normalizedQuestion, session) : undefined\n };\n\n const { role, mode } = env || {};\n\n if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n out.teacherInstructions = null;\n }\n\n return out;\n}\n\n\nexport const getScore = (config, session) => {\n if (!session || isEmpty(session)) {\n return 0;\n }\n\n const selectedChoices = session.value || [];\n const correctChoices = (config.choices || []).filter(ch => ch.correct);\n\n let score = selectedChoices.reduce((acc, selectedChoice) =>\n acc + (correctChoices.find(ch => ch.value === selectedChoice) ? 1 : 0), 0);\n\n if (correctChoices.length < selectedChoices.length) {\n score -= selectedChoices.length - correctChoices.length;\n\n if (score < 0) {\n score = 0;\n }\n }\n\n const str = correctChoices.length ? score / correctChoices.length : 0;\n\n return parseFloat(str.toFixed(2));\n};\n\n/**\n *\n * The score is partial by default for checkbox mode, allOrNothing for radio mode.\n * To disable partial scoring for checkbox mode you either set model.partialScoring = false or env.partialScoring = false. the value in `env` will\n * override the value in `model`.\n * @param {Object} model - the main model\n * @param {*} session\n * @param {Object} env\n */\nexport function outcome(model, session, env) {\n return new Promise(resolve => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n } else {\n const partialScoringEnabled =\n partialScoring.enabled(model, env) && model.choiceMode !== 'radio';\n const score = getScore(model, session);\n\n resolve({ score: partialScoringEnabled ? score : score === 1 ? 1 : 0, empty: false });\n }\n });\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise(resolve => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { choices } = question || { choices: [] };\n\n resolve({\n id: '1',\n value: choices.filter(c => c.correct).map(c => c.value)\n });\n } else {\n resolve(null);\n }\n });\n};\n\nexport const validate = (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"],"file":"index.js"}
|
package/controller/lib/utils.js
CHANGED
|
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
|
-
exports.isResponseCorrect = exports.getCorrectResponse = void 0;
|
|
8
|
+
exports.parseHTML = exports.isResponseCorrect = exports.getCorrectResponse = void 0;
|
|
9
9
|
|
|
10
10
|
var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
|
|
11
11
|
|
|
@@ -25,4 +25,12 @@ var isResponseCorrect = function isResponseCorrect(question, session) {
|
|
|
25
25
|
};
|
|
26
26
|
|
|
27
27
|
exports.isResponseCorrect = isResponseCorrect;
|
|
28
|
+
|
|
29
|
+
var parseHTML = function parseHTML(html) {
|
|
30
|
+
var template = document.createElement('template');
|
|
31
|
+
template.innerHTML = html;
|
|
32
|
+
return template.content;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
exports.parseHTML = parseHTML;
|
|
28
36
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils.js"],"names":["getCorrectResponse","choices","filter","c","correct","map","value","sort","isResponseCorrect","question","session","correctResponse"],"mappings":";;;;;;;;;AAAA;;AAEO,IAAMA,kBAAkB,GAAG,SAArBA,kBAAqB,CAACC,OAAD;AAAA,SAAaA,OAAO,CACnDC,MAD4C,CACrC,UAAAC,CAAC;AAAA,WAAIA,CAAC,CAACC,OAAN;AAAA,GADoC,EAE5CC,GAF4C,CAExC,UAAAF,CAAC;AAAA,WAAIA,CAAC,CAACG,KAAN;AAAA,GAFuC,EAG5CC,IAH4C,EAAb;AAAA,CAA3B;;;;AAKA,IAAMC,iBAAiB,GAAG,SAApBA,iBAAoB,CAACC,QAAD,EAAWC,OAAX,EAAuB;AACtD,MAAIC,eAAe,GAAGX,kBAAkB,CAACS,QAAQ,CAACR,OAAV,CAAxC;AACA,SAAOS,OAAO,IAAI,yBAAQ,CAACA,OAAO,CAACJ,KAAR,IAAiB,EAAlB,EAAsBC,IAAtB,EAAR,EAAsCI,eAAtC,CAAlB;AACD,CAHM","sourcesContent":["import isEqual from 'lodash/isEqual';\n\nexport const getCorrectResponse = (choices) => choices\n .filter(c => c.correct)\n .map(c => c.value)\n .sort();\n\nexport const isResponseCorrect = (question, session) => {\n let correctResponse = getCorrectResponse(question.choices);\n return session && isEqual((session.value || []).sort(), correctResponse);\n};\n"],"file":"utils.js"}
|
|
1
|
+
{"version":3,"sources":["../src/utils.js"],"names":["getCorrectResponse","choices","filter","c","correct","map","value","sort","isResponseCorrect","question","session","correctResponse","parseHTML","html","template","document","createElement","innerHTML","content"],"mappings":";;;;;;;;;AAAA;;AAEO,IAAMA,kBAAkB,GAAG,SAArBA,kBAAqB,CAACC,OAAD;AAAA,SAAaA,OAAO,CACnDC,MAD4C,CACrC,UAAAC,CAAC;AAAA,WAAIA,CAAC,CAACC,OAAN;AAAA,GADoC,EAE5CC,GAF4C,CAExC,UAAAF,CAAC;AAAA,WAAIA,CAAC,CAACG,KAAN;AAAA,GAFuC,EAG5CC,IAH4C,EAAb;AAAA,CAA3B;;;;AAKA,IAAMC,iBAAiB,GAAG,SAApBA,iBAAoB,CAACC,QAAD,EAAWC,OAAX,EAAuB;AACtD,MAAIC,eAAe,GAAGX,kBAAkB,CAACS,QAAQ,CAACR,OAAV,CAAxC;AACA,SAAOS,OAAO,IAAI,yBAAQ,CAACA,OAAO,CAACJ,KAAR,IAAiB,EAAlB,EAAsBC,IAAtB,EAAR,EAAsCI,eAAtC,CAAlB;AACD,CAHM;;;;AAKA,IAAMC,SAAS,GAAG,SAAZA,SAAY,CAACC,IAAD,EAAU;AACjC,MAAMC,QAAQ,GAAGC,QAAQ,CAACC,aAAT,CAAuB,UAAvB,CAAjB;AACAF,EAAAA,QAAQ,CAACG,SAAT,GAAqBJ,IAArB;AACA,SAAOC,QAAQ,CAACI,OAAhB;AACD,CAJM","sourcesContent":["import isEqual from 'lodash/isEqual';\n\nexport const getCorrectResponse = (choices) => choices\n .filter(c => c.correct)\n .map(c => c.value)\n .sort();\n\nexport const isResponseCorrect = (question, session) => {\n let correctResponse = getCorrectResponse(question.choices);\n return session && isEqual((session.value || []).sort(), correctResponse);\n};\n\nexport const parseHTML = (html) => {\n const template = document.createElement('template');\n template.innerHTML = html;\n return template.content;\n};\n"],"file":"utils.js"}
|
package/controller/package.json
CHANGED
package/docs/config-schema.json
CHANGED
|
@@ -106,7 +106,39 @@
|
|
|
106
106
|
}
|
|
107
107
|
}
|
|
108
108
|
},
|
|
109
|
-
"
|
|
109
|
+
"spellCheck": {
|
|
110
|
+
"title": "ConfigureProp",
|
|
111
|
+
"type": "object",
|
|
112
|
+
"properties": {
|
|
113
|
+
"settings": {
|
|
114
|
+
"description": "Indicates if the item has to be displayed in the Settings Panel",
|
|
115
|
+
"type": "boolean",
|
|
116
|
+
"title": "settings"
|
|
117
|
+
},
|
|
118
|
+
"label": {
|
|
119
|
+
"description": "Indicates the label for the item that has to be displayed in the Settings Panel",
|
|
120
|
+
"type": "string",
|
|
121
|
+
"title": "label"
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
"choicesLayout": {
|
|
126
|
+
"title": "ConfigureProp",
|
|
127
|
+
"type": "object",
|
|
128
|
+
"properties": {
|
|
129
|
+
"settings": {
|
|
130
|
+
"description": "Indicates if the item has to be displayed in the Settings Panel",
|
|
131
|
+
"type": "boolean",
|
|
132
|
+
"title": "settings"
|
|
133
|
+
},
|
|
134
|
+
"label": {
|
|
135
|
+
"description": "Indicates the label for the item that has to be displayed in the Settings Panel",
|
|
136
|
+
"type": "string",
|
|
137
|
+
"title": "label"
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
"gridColumns": {
|
|
110
142
|
"title": "ConfigureProp",
|
|
111
143
|
"type": "object",
|
|
112
144
|
"properties": {
|
|
@@ -239,6 +271,84 @@
|
|
|
239
271
|
}
|
|
240
272
|
}
|
|
241
273
|
},
|
|
274
|
+
"accessibility": {
|
|
275
|
+
"title": "ConfigureProp",
|
|
276
|
+
"type": "object",
|
|
277
|
+
"properties": {
|
|
278
|
+
"settings": {
|
|
279
|
+
"description": "Indicates if the item has to be displayed in the Settings Panel",
|
|
280
|
+
"type": "boolean",
|
|
281
|
+
"title": "settings"
|
|
282
|
+
},
|
|
283
|
+
"label": {
|
|
284
|
+
"description": "Indicates the label for the item that has to be displayed in the Settings Panel",
|
|
285
|
+
"type": "string",
|
|
286
|
+
"title": "label"
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
},
|
|
290
|
+
"minAnswerChoices": {
|
|
291
|
+
"description": "Minimum number of answer choices",
|
|
292
|
+
"type": "number",
|
|
293
|
+
"title": "minAnswerChoices"
|
|
294
|
+
},
|
|
295
|
+
"maxAnswerChoices": {
|
|
296
|
+
"description": "Maximum number of answer choices",
|
|
297
|
+
"type": "number",
|
|
298
|
+
"title": "maxAnswerChoices"
|
|
299
|
+
},
|
|
300
|
+
"maxImageWidth": {
|
|
301
|
+
"title": "ConfigureMaxImageDimensionsProp",
|
|
302
|
+
"type": "object",
|
|
303
|
+
"properties": {
|
|
304
|
+
"teacherInstructions": {
|
|
305
|
+
"description": "Indicates the max dimension for images in teacher instructions",
|
|
306
|
+
"type": "number",
|
|
307
|
+
"title": "teacherInstructions"
|
|
308
|
+
},
|
|
309
|
+
"prompt": {
|
|
310
|
+
"description": "Indicates the max dimension for images in prompt - this is also the default dimension for all other input fields if it's not specified",
|
|
311
|
+
"type": "number",
|
|
312
|
+
"title": "prompt"
|
|
313
|
+
},
|
|
314
|
+
"rationale": {
|
|
315
|
+
"description": "Indicates the max dimension for images in rationale",
|
|
316
|
+
"type": "number",
|
|
317
|
+
"title": "rationale"
|
|
318
|
+
},
|
|
319
|
+
"choices": {
|
|
320
|
+
"description": "Indicates the max dimension for images in choices",
|
|
321
|
+
"type": "number",
|
|
322
|
+
"title": "choices"
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
},
|
|
326
|
+
"maxImageHeight": {
|
|
327
|
+
"title": "ConfigureMaxImageDimensionsProp",
|
|
328
|
+
"type": "object",
|
|
329
|
+
"properties": {
|
|
330
|
+
"teacherInstructions": {
|
|
331
|
+
"description": "Indicates the max dimension for images in teacher instructions",
|
|
332
|
+
"type": "number",
|
|
333
|
+
"title": "teacherInstructions"
|
|
334
|
+
},
|
|
335
|
+
"prompt": {
|
|
336
|
+
"description": "Indicates the max dimension for images in prompt - this is also the default dimension for all other input fields if it's not specified",
|
|
337
|
+
"type": "number",
|
|
338
|
+
"title": "prompt"
|
|
339
|
+
},
|
|
340
|
+
"rationale": {
|
|
341
|
+
"description": "Indicates the max dimension for images in rationale",
|
|
342
|
+
"type": "number",
|
|
343
|
+
"title": "rationale"
|
|
344
|
+
},
|
|
345
|
+
"choices": {
|
|
346
|
+
"description": "Indicates the max dimension for images in choices",
|
|
347
|
+
"type": "number",
|
|
348
|
+
"title": "choices"
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
},
|
|
242
352
|
"showPrompt": {
|
|
243
353
|
"description": "Determines whether prompt field will be displayed or not",
|
|
244
354
|
"default": true,
|
|
@@ -289,6 +399,32 @@
|
|
|
289
399
|
"title": "enabled"
|
|
290
400
|
}
|
|
291
401
|
}
|
|
402
|
+
},
|
|
403
|
+
"ConfigureMaxImageDimensionsProp": {
|
|
404
|
+
"title": "ConfigureMaxImageDimensionsProp",
|
|
405
|
+
"type": "object",
|
|
406
|
+
"properties": {
|
|
407
|
+
"teacherInstructions": {
|
|
408
|
+
"description": "Indicates the max dimension for images in teacher instructions",
|
|
409
|
+
"type": "number",
|
|
410
|
+
"title": "teacherInstructions"
|
|
411
|
+
},
|
|
412
|
+
"prompt": {
|
|
413
|
+
"description": "Indicates the max dimension for images in prompt - this is also the default dimension for all other input fields if it's not specified",
|
|
414
|
+
"type": "number",
|
|
415
|
+
"title": "prompt"
|
|
416
|
+
},
|
|
417
|
+
"rationale": {
|
|
418
|
+
"description": "Indicates the max dimension for images in rationale",
|
|
419
|
+
"type": "number",
|
|
420
|
+
"title": "rationale"
|
|
421
|
+
},
|
|
422
|
+
"choices": {
|
|
423
|
+
"description": "Indicates the max dimension for images in choices",
|
|
424
|
+
"type": "number",
|
|
425
|
+
"title": "choices"
|
|
426
|
+
}
|
|
427
|
+
}
|
|
292
428
|
}
|
|
293
429
|
},
|
|
294
430
|
"$schema": "http://json-schema.org/draft-07/schema#"
|
|
@@ -84,9 +84,33 @@ Indicates if the item has to be displayed in the Settings Panel
|
|
|
84
84
|
|
|
85
85
|
Indicates the label for the item that has to be displayed in the Settings Panel
|
|
86
86
|
|
|
87
|
-
# `
|
|
87
|
+
# `spellCheck` (object)
|
|
88
88
|
|
|
89
|
-
Properties of the `
|
|
89
|
+
Properties of the `spellCheck` object:
|
|
90
|
+
|
|
91
|
+
## `settings` (boolean)
|
|
92
|
+
|
|
93
|
+
Indicates if the item has to be displayed in the Settings Panel
|
|
94
|
+
|
|
95
|
+
## `label` (string)
|
|
96
|
+
|
|
97
|
+
Indicates the label for the item that has to be displayed in the Settings Panel
|
|
98
|
+
|
|
99
|
+
# `choicesLayout` (object)
|
|
100
|
+
|
|
101
|
+
Properties of the `choicesLayout` object:
|
|
102
|
+
|
|
103
|
+
## `settings` (boolean)
|
|
104
|
+
|
|
105
|
+
Indicates if the item has to be displayed in the Settings Panel
|
|
106
|
+
|
|
107
|
+
## `label` (string)
|
|
108
|
+
|
|
109
|
+
Indicates the label for the item that has to be displayed in the Settings Panel
|
|
110
|
+
|
|
111
|
+
# `gridColumns` (object)
|
|
112
|
+
|
|
113
|
+
Properties of the `gridColumns` object:
|
|
90
114
|
|
|
91
115
|
## `settings` (boolean)
|
|
92
116
|
|
|
@@ -185,6 +209,66 @@ Indicates the label for the item that has to be displayed in the Settings Panel
|
|
|
185
209
|
Indicates the value of the item if it affects config-ui
|
|
186
210
|
(eg.: if item is a switch and displaying an input on the config-ui depends on the switch value: on/off)
|
|
187
211
|
|
|
212
|
+
# `accessibility` (object)
|
|
213
|
+
|
|
214
|
+
Properties of the `accessibility` object:
|
|
215
|
+
|
|
216
|
+
## `settings` (boolean)
|
|
217
|
+
|
|
218
|
+
Indicates if the item has to be displayed in the Settings Panel
|
|
219
|
+
|
|
220
|
+
## `label` (string)
|
|
221
|
+
|
|
222
|
+
Indicates the label for the item that has to be displayed in the Settings Panel
|
|
223
|
+
|
|
224
|
+
# `minAnswerChoices` (number)
|
|
225
|
+
|
|
226
|
+
Minimum number of answer choices
|
|
227
|
+
|
|
228
|
+
# `maxAnswerChoices` (number)
|
|
229
|
+
|
|
230
|
+
Maximum number of answer choices
|
|
231
|
+
|
|
232
|
+
# `maxImageWidth` (object)
|
|
233
|
+
|
|
234
|
+
Properties of the `maxImageWidth` object:
|
|
235
|
+
|
|
236
|
+
## `teacherInstructions` (number)
|
|
237
|
+
|
|
238
|
+
Indicates the max dimension for images in teacher instructions
|
|
239
|
+
|
|
240
|
+
## `prompt` (number)
|
|
241
|
+
|
|
242
|
+
Indicates the max dimension for images in prompt - this is also the default dimension for all other input fields if it's not specified
|
|
243
|
+
|
|
244
|
+
## `rationale` (number)
|
|
245
|
+
|
|
246
|
+
Indicates the max dimension for images in rationale
|
|
247
|
+
|
|
248
|
+
## `choices` (number)
|
|
249
|
+
|
|
250
|
+
Indicates the max dimension for images in choices
|
|
251
|
+
|
|
252
|
+
# `maxImageHeight` (object)
|
|
253
|
+
|
|
254
|
+
Properties of the `maxImageHeight` object:
|
|
255
|
+
|
|
256
|
+
## `teacherInstructions` (number)
|
|
257
|
+
|
|
258
|
+
Indicates the max dimension for images in teacher instructions
|
|
259
|
+
|
|
260
|
+
## `prompt` (number)
|
|
261
|
+
|
|
262
|
+
Indicates the max dimension for images in prompt - this is also the default dimension for all other input fields if it's not specified
|
|
263
|
+
|
|
264
|
+
## `rationale` (number)
|
|
265
|
+
|
|
266
|
+
Indicates the max dimension for images in rationale
|
|
267
|
+
|
|
268
|
+
## `choices` (number)
|
|
269
|
+
|
|
270
|
+
Indicates the max dimension for images in choices
|
|
271
|
+
|
|
188
272
|
# `showPrompt` (boolean)
|
|
189
273
|
|
|
190
274
|
Determines whether prompt field will be displayed or not
|
|
@@ -230,4 +314,24 @@ Indicates the label for the item that has to be displayed in the Settings Panel
|
|
|
230
314
|
### `enabled` (boolean)
|
|
231
315
|
|
|
232
316
|
Indicates the value of the item if it affects config-ui
|
|
233
|
-
(eg.: if item is a switch and displaying an input on the config-ui depends on the switch value: on/off)
|
|
317
|
+
(eg.: if item is a switch and displaying an input on the config-ui depends on the switch value: on/off)
|
|
318
|
+
|
|
319
|
+
## `ConfigureMaxImageDimensionsProp` (object)
|
|
320
|
+
|
|
321
|
+
Properties of the `ConfigureMaxImageDimensionsProp` object:
|
|
322
|
+
|
|
323
|
+
### `teacherInstructions` (number)
|
|
324
|
+
|
|
325
|
+
Indicates the max dimension for images in teacher instructions
|
|
326
|
+
|
|
327
|
+
### `prompt` (number)
|
|
328
|
+
|
|
329
|
+
Indicates the max dimension for images in prompt - this is also the default dimension for all other input fields if it's not specified
|
|
330
|
+
|
|
331
|
+
### `rationale` (number)
|
|
332
|
+
|
|
333
|
+
Indicates the max dimension for images in rationale
|
|
334
|
+
|
|
335
|
+
### `choices` (number)
|
|
336
|
+
|
|
337
|
+
Indicates the max dimension for images in choices
|