@pie-element/explicit-constructed-response 6.12.6 → 6.12.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/defaults.js +9 -43
- package/configure/lib/defaults.js.map +1 -1
- package/configure/package.json +1 -1
- package/controller/CHANGELOG.md +11 -0
- package/controller/lib/defaults.js +2 -2
- package/controller/lib/defaults.js.map +1 -1
- package/controller/lib/index.js +44 -70
- package/controller/lib/index.js.map +1 -1
- package/controller/package.json +1 -1
- package/lib/index.js +13 -13
- package/lib/index.js.map +1 -1
- package/lib/main.js +27 -35
- package/lib/main.js.map +1 -1
- package/lib/print.js +5 -5
- package/lib/print.js.map +1 -1
- package/module/configure.js +10 -44
- package/module/controller.js +16389 -18257
- package/module/element.js +39 -40
- package/module/index.html +1 -1
- package/module/manifest.json +2 -2
- package/module/print.html +1 -1
- package/module/print.js +31 -32
- package/package.json +2 -2
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
|
+
## [6.12.7](https://github.com/pie-framework/pie-elements/compare/@pie-element/explicit-constructed-response@6.12.6...@pie-element/explicit-constructed-response@6.12.7) (2024-05-24)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Bug Fixes
|
|
10
|
+
|
|
11
|
+
* **explicit-constructed-response:** update default values and cleanup PD-3544 ([1043774](https://github.com/pie-framework/pie-elements/commit/1043774a10cfff36b868c6ee0179610259ca0850))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
6
17
|
## [6.12.6](https://github.com/pie-framework/pie-elements/compare/@pie-element/explicit-constructed-response@6.12.5...@pie-element/explicit-constructed-response@6.12.6) (2024-05-14)
|
|
7
18
|
|
|
8
19
|
|
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.11.7](https://github.com/pie-framework/pie-elements/compare/@pie-element/explicit-constructed-response-configure@6.11.6...@pie-element/explicit-constructed-response-configure@6.11.7) (2024-05-24)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Bug Fixes
|
|
10
|
+
|
|
11
|
+
* **explicit-constructed-response:** update default values and cleanup PD-3544 ([1043774](https://github.com/pie-framework/pie-elements/commit/1043774a10cfff36b868c6ee0179610259ca0850))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
6
17
|
## [6.11.6](https://github.com/pie-framework/pie-elements/compare/@pie-element/explicit-constructed-response-configure@6.11.5...@pie-element/explicit-constructed-response-configure@6.11.6) (2024-05-14)
|
|
7
18
|
|
|
8
19
|
|
|
@@ -6,53 +6,19 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports["default"] = void 0;
|
|
7
7
|
var _default = {
|
|
8
8
|
model: {
|
|
9
|
-
|
|
10
|
-
mode: 'gather',
|
|
11
|
-
prompt: 'Use the inputs to complete the sentence',
|
|
12
|
-
shuffle: true,
|
|
13
|
-
markup: '<p>The {{0}} jumped {{1}} the {{2}}</p>',
|
|
14
|
-
toolbarEditorPosition: 'bottom',
|
|
9
|
+
choices: {},
|
|
15
10
|
displayType: 'block',
|
|
16
|
-
|
|
17
|
-
playerSpellCheckEnabled: true,
|
|
18
|
-
choices: {
|
|
19
|
-
0: [{
|
|
20
|
-
label: 'cow',
|
|
21
|
-
value: '0'
|
|
22
|
-
}, {
|
|
23
|
-
label: 'cattle',
|
|
24
|
-
value: '1'
|
|
25
|
-
}, {
|
|
26
|
-
label: 'calf',
|
|
27
|
-
value: '2',
|
|
28
|
-
correct: false
|
|
29
|
-
}],
|
|
30
|
-
1: [{
|
|
31
|
-
label: 'over',
|
|
32
|
-
value: '0'
|
|
33
|
-
}, {
|
|
34
|
-
label: 'past',
|
|
35
|
-
value: '1'
|
|
36
|
-
}, {
|
|
37
|
-
label: 'beyond',
|
|
38
|
-
value: '2'
|
|
39
|
-
}],
|
|
40
|
-
2: [{
|
|
41
|
-
label: 'moon',
|
|
42
|
-
value: '0'
|
|
43
|
-
}, {
|
|
44
|
-
label: 'satellite',
|
|
45
|
-
value: '2'
|
|
46
|
-
}, {
|
|
47
|
-
label: 'house ',
|
|
48
|
-
value: '3'
|
|
49
|
-
}]
|
|
50
|
-
},
|
|
11
|
+
markup: '',
|
|
51
12
|
maxLengthPerChoiceEnabled: true,
|
|
52
|
-
|
|
13
|
+
playerSpellCheckEnabled: true,
|
|
14
|
+
prompt: '',
|
|
53
15
|
promptEnabled: true,
|
|
16
|
+
rationale: '',
|
|
17
|
+
rationaleEnabled: true,
|
|
18
|
+
spellCheckEnabled: true,
|
|
19
|
+
studentInstructionsEnabled: true,
|
|
54
20
|
teacherInstructionsEnabled: true,
|
|
55
|
-
|
|
21
|
+
toolbarEditorPosition: 'bottom'
|
|
56
22
|
},
|
|
57
23
|
configuration: {
|
|
58
24
|
baseInputConfiguration: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/defaults.js"],"names":["model","
|
|
1
|
+
{"version":3,"sources":["../src/defaults.js"],"names":["model","choices","displayType","markup","maxLengthPerChoiceEnabled","playerSpellCheckEnabled","prompt","promptEnabled","rationale","rationaleEnabled","spellCheckEnabled","studentInstructionsEnabled","teacherInstructionsEnabled","toolbarEditorPosition","configuration","baseInputConfiguration","html","disabled","audio","video","image","settings","label","inputConfiguration","required","partialScoring","settingsPanelDisabled","spellCheck","enabled","editSource","playerSpellCheck","teacherInstructions","template","maxLengthPerChoice","maxResponseAreas","maxImageWidth","maxImageHeight","withRubric","mathMlOptions","mmlOutput","mmlEditing","language","languageChoices","options"],"mappings":"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","sourcesContent":["export default {\n model: {\n choices: {},\n displayType: 'block',\n markup: '',\n maxLengthPerChoiceEnabled: true,\n playerSpellCheckEnabled: true,\n prompt: '',\n promptEnabled: true,\n rationale: '',\n rationaleEnabled: true,\n spellCheckEnabled: true,\n studentInstructionsEnabled: true,\n teacherInstructionsEnabled: true,\n toolbarEditorPosition: 'bottom',\n },\n configuration: {\n baseInputConfiguration: {\n html: { disabled: true },\n audio: { disabled: false },\n video: { disabled: false },\n image: { disabled: false },\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 partialScoring: {\n settings: false,\n label: 'Allow Partial Scoring',\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: false,\n spellCheck: {\n label: 'Spellcheck',\n settings: false,\n enabled: true,\n },\n editSource: {\n label: 'Edit Source',\n settings: false,\n enabled: false,\n },\n playerSpellCheck: {\n label: 'Student Spellcheck',\n settings: true,\n enabled: true,\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 template: {\n inputConfiguration: {\n audio: { disabled: false },\n video: { disabled: false },\n image: { disabled: false },\n },\n },\n maxLengthPerChoice: {\n settings: true,\n label: 'Maximum Length Per Choice',\n },\n maxResponseAreas: 10,\n maxImageWidth: {\n teacherInstructions: 300,\n prompt: 300,\n rationale: 300,\n },\n maxImageHeight: {\n teacherInstructions: 300,\n prompt: 300,\n rationale: 300,\n },\n withRubric: {\n settings: false,\n label: 'Add Rubric',\n },\n mathMlOptions: {\n mmlOutput: false,\n mmlEditing: false,\n },\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"}
|
package/configure/package.json
CHANGED
package/controller/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
|
+
## [4.10.7](https://github.com/pie-framework/pie-elements/compare/@pie-element/explicit-constructed-response-controller@4.10.6...@pie-element/explicit-constructed-response-controller@4.10.7) (2024-05-24)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Bug Fixes
|
|
10
|
+
|
|
11
|
+
* **explicit-constructed-response:** update default values and cleanup PD-3544 ([1043774](https://github.com/pie-framework/pie-elements/commit/1043774a10cfff36b868c6ee0179610259ca0850))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
6
17
|
## [4.10.6](https://github.com/pie-framework/pie-elements/compare/@pie-element/explicit-constructed-response-controller@4.10.5...@pie-element/explicit-constructed-response-controller@4.10.6) (2024-05-14)
|
|
7
18
|
|
|
8
19
|
|
|
@@ -10,9 +10,9 @@ var _default = {
|
|
|
10
10
|
promptEnabled: true,
|
|
11
11
|
rationale: '',
|
|
12
12
|
rationaleEnabled: true,
|
|
13
|
+
studentInstructionsEnabled: true,
|
|
13
14
|
teacherInstructions: '',
|
|
14
|
-
teacherInstructionsEnabled: true
|
|
15
|
-
studentInstructionsEnabled: true
|
|
15
|
+
teacherInstructionsEnabled: true
|
|
16
16
|
};
|
|
17
17
|
exports["default"] = _default;
|
|
18
18
|
//# sourceMappingURL=defaults.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/defaults.js"],"names":["markup","prompt","promptEnabled","rationale","rationaleEnabled","
|
|
1
|
+
{"version":3,"sources":["../src/defaults.js"],"names":["markup","prompt","promptEnabled","rationale","rationaleEnabled","studentInstructionsEnabled","teacherInstructions","teacherInstructionsEnabled"],"mappings":";;;;;;eAAe;AACbA,EAAAA,MAAM,EAAE,EADK;AAEbC,EAAAA,MAAM,EAAE,EAFK;AAGbC,EAAAA,aAAa,EAAE,IAHF;AAIbC,EAAAA,SAAS,EAAE,EAJE;AAKbC,EAAAA,gBAAgB,EAAE,IALL;AAMbC,EAAAA,0BAA0B,EAAE,IANf;AAObC,EAAAA,mBAAmB,EAAE,EAPR;AAQbC,EAAAA,0BAA0B,EAAE;AARf,C","sourcesContent":["export default {\n markup: '',\n prompt: '',\n promptEnabled: true,\n rationale: '',\n rationaleEnabled: true,\n studentInstructionsEnabled: true,\n teacherInstructions: '',\n teacherInstructionsEnabled: true,\n};\n"],"file":"defaults.js"}
|
package/controller/lib/index.js
CHANGED
|
@@ -21,22 +21,16 @@ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/
|
|
|
21
21
|
|
|
22
22
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
23
23
|
|
|
24
|
-
var _map = _interopRequireDefault(require("lodash/map"));
|
|
25
|
-
|
|
26
|
-
var _reduce = _interopRequireDefault(require("lodash/reduce"));
|
|
27
|
-
|
|
28
|
-
var _find = _interopRequireDefault(require("lodash/find"));
|
|
29
|
-
|
|
30
|
-
var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
|
|
31
|
-
|
|
32
24
|
var _debug = _interopRequireDefault(require("debug"));
|
|
33
25
|
|
|
34
|
-
var
|
|
26
|
+
var _lodash = require("lodash");
|
|
35
27
|
|
|
36
|
-
var
|
|
28
|
+
var _controllerUtils = require("@pie-lib/pie-toolbox/controller-utils");
|
|
37
29
|
|
|
38
30
|
var _translator = _interopRequireDefault(require("@pie-lib/pie-toolbox/translator"));
|
|
39
31
|
|
|
32
|
+
var _defaults = _interopRequireDefault(require("./defaults"));
|
|
33
|
+
|
|
40
34
|
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; }
|
|
41
35
|
|
|
42
36
|
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; }
|
|
@@ -109,14 +103,14 @@ exports.normalize = normalize;
|
|
|
109
103
|
function model(question, session, env) {
|
|
110
104
|
return new Promise( /*#__PURE__*/function () {
|
|
111
105
|
var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(resolve) {
|
|
112
|
-
var normalizedQuestion, defaultFeedback, _ref2, _ref2$value, value,
|
|
106
|
+
var normalizedQuestion, defaultFeedback, prepareChoiceFn, choices, _ref2, _ref2$value, value, feedback, showNote, note, _normalizedQuestion$m, maxLengthPerChoice, maxLengthPerChoiceEnabled, undefinedLengths, out;
|
|
113
107
|
|
|
114
108
|
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
115
109
|
while (1) {
|
|
116
110
|
switch (_context.prev = _context.next) {
|
|
117
111
|
case 0:
|
|
118
|
-
// this was added to treat an exception, when the model has choices without
|
|
119
|
-
// like: { label: 'test' }
|
|
112
|
+
// this was added to treat an exception, when the model has choices without
|
|
113
|
+
// the "value" property like: { label: 'test' }
|
|
120
114
|
if (question.choices) {
|
|
121
115
|
Object.keys(question.choices).forEach(function (key) {
|
|
122
116
|
question.choices[key] = (question.choices[key] || []).map(function (item, index) {
|
|
@@ -137,40 +131,27 @@ function model(question, session, env) {
|
|
|
137
131
|
correct: 'Correct',
|
|
138
132
|
incorrect: 'Incorrect'
|
|
139
133
|
}, normalizedQuestion.defaultFeedback);
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
obj[key] = (0, _map["default"])(area, preparChoiceFn);
|
|
134
|
+
prepareChoiceFn = prepareChoice(env.mode, defaultFeedback);
|
|
135
|
+
choices = (0, _lodash.reduce)(normalizedQuestion.choices, function (obj, area, key) {
|
|
136
|
+
obj[key] = (0, _lodash.map)(area, prepareChoiceFn);
|
|
144
137
|
return obj;
|
|
145
138
|
}, {});
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
var val = !(0, _isEmpty["default"])(chosenValue) && (0, _find["default"])(respArea, function (c) {
|
|
152
|
-
return prepareVal(c.label) === prepareVal(chosenValue);
|
|
153
|
-
});
|
|
154
|
-
obj[key] = getFeedback(val);
|
|
155
|
-
return obj;
|
|
156
|
-
}, {});
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
showNote = false; // check if a choice has an alternate
|
|
160
|
-
|
|
161
|
-
Object.values(choices).forEach(function (choice) {
|
|
162
|
-
if (choice && choice.length > 1) {
|
|
163
|
-
showNote = true;
|
|
164
|
-
}
|
|
165
|
-
});
|
|
166
|
-
note = normalizedQuestion.note;
|
|
167
|
-
|
|
168
|
-
if (!note) {
|
|
169
|
-
note = translator.t('common:commonCorrectAnswerWithAlternates', {
|
|
170
|
-
lng: normalizedQuestion.language
|
|
139
|
+
_ref2 = session || {}, _ref2$value = _ref2.value, value = _ref2$value === void 0 ? {} : _ref2$value;
|
|
140
|
+
feedback = env.mode === 'evaluate' ? (0, _lodash.reduce)(normalizedQuestion.choices, function (obj, respArea, key) {
|
|
141
|
+
var chosenValue = value && value[key];
|
|
142
|
+
var val = !(0, _lodash.isEmpty)(chosenValue) && (0, _lodash.find)(respArea, function (c) {
|
|
143
|
+
return prepareVal(c.label) === prepareVal(chosenValue);
|
|
171
144
|
});
|
|
172
|
-
|
|
145
|
+
obj[key] = getFeedback(val);
|
|
146
|
+
return obj;
|
|
147
|
+
}, {}) : {}; // check if at least one choice has an alternate
|
|
173
148
|
|
|
149
|
+
showNote = Object.values(choices).some(function (choice) {
|
|
150
|
+
return (choice === null || choice === void 0 ? void 0 : choice.length) > 1;
|
|
151
|
+
});
|
|
152
|
+
note = normalizedQuestion.note || translator.t('common:commonCorrectAnswerWithAlternates', {
|
|
153
|
+
lng: normalizedQuestion.language
|
|
154
|
+
});
|
|
174
155
|
_normalizedQuestion$m = normalizedQuestion.maxLengthPerChoice, maxLengthPerChoice = _normalizedQuestion$m === void 0 ? [] : _normalizedQuestion$m, maxLengthPerChoiceEnabled = normalizedQuestion.maxLengthPerChoiceEnabled;
|
|
175
156
|
undefinedLengths = !maxLengthPerChoice.length; // calculate maxLengthPerChoice array if it is not defined or defined incorrectly
|
|
176
157
|
|
|
@@ -185,34 +166,33 @@ function model(question, session, env) {
|
|
|
185
166
|
}
|
|
186
167
|
});
|
|
187
168
|
out = {
|
|
169
|
+
choices: choices,
|
|
188
170
|
disabled: env.mode !== 'gather',
|
|
171
|
+
displayType: normalizedQuestion.displayType,
|
|
189
172
|
mode: env.mode,
|
|
190
|
-
|
|
191
|
-
markup: normalizedQuestion.markup,
|
|
192
|
-
choices: choices,
|
|
173
|
+
role: env.role,
|
|
193
174
|
feedback: feedback,
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
showNote: showNote,
|
|
175
|
+
language: normalizedQuestion.language,
|
|
176
|
+
markup: normalizedQuestion.markup,
|
|
197
177
|
maxLengthPerChoice: maxLengthPerChoice,
|
|
198
178
|
maxLengthPerChoiceEnabled: maxLengthPerChoiceEnabled,
|
|
199
|
-
|
|
179
|
+
note: note,
|
|
200
180
|
playerSpellCheckEnabled: normalizedQuestion.playerSpellCheckEnabled,
|
|
181
|
+
prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : _defaults["default"].prompt,
|
|
182
|
+
rationale: _defaults["default"].rationale,
|
|
201
183
|
responseCorrect: env.mode === 'evaluate' ? getScore(normalizedQuestion, session) === 1 : undefined,
|
|
202
|
-
|
|
184
|
+
showNote: showNote,
|
|
185
|
+
teacherInstructions: _defaults["default"].teacherInstructions
|
|
203
186
|
};
|
|
204
187
|
|
|
205
188
|
if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {
|
|
206
|
-
out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale :
|
|
207
|
-
out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled ? normalizedQuestion.teacherInstructions :
|
|
208
|
-
} else {
|
|
209
|
-
out.rationale = null;
|
|
210
|
-
out.teacherInstructions = null;
|
|
189
|
+
out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : _defaults["default"].rationale;
|
|
190
|
+
out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled ? normalizedQuestion.teacherInstructions : _defaults["default"].teacherInstructions;
|
|
211
191
|
}
|
|
212
192
|
|
|
213
193
|
resolve(out);
|
|
214
194
|
|
|
215
|
-
case
|
|
195
|
+
case 15:
|
|
216
196
|
case "end":
|
|
217
197
|
return _context.stop();
|
|
218
198
|
}
|
|
@@ -226,13 +206,8 @@ function model(question, session, env) {
|
|
|
226
206
|
}());
|
|
227
207
|
}
|
|
228
208
|
|
|
229
|
-
var getTextFromHTML = function getTextFromHTML(html) {
|
|
230
|
-
return (html || '').replace(/<\/?[^>]+(>|$)/g, '');
|
|
231
|
-
};
|
|
232
|
-
|
|
233
209
|
var prepareVal = function prepareVal(html) {
|
|
234
|
-
|
|
235
|
-
return value.trim();
|
|
210
|
+
return getInnerText(html).trim();
|
|
236
211
|
};
|
|
237
212
|
|
|
238
213
|
exports.prepareVal = prepareVal;
|
|
@@ -241,16 +216,16 @@ var getScore = function getScore(config, session) {
|
|
|
241
216
|
var _ref3 = session || {},
|
|
242
217
|
value = _ref3.value;
|
|
243
218
|
|
|
244
|
-
if (!session || (0,
|
|
219
|
+
if (!session || (0, _lodash.isEmpty)(session) || !value) {
|
|
245
220
|
return 0;
|
|
246
221
|
}
|
|
247
222
|
|
|
248
223
|
var responseAreas = config.markup && config.markup.match(/\{\{(.)\}\}/g);
|
|
249
224
|
var maxScore = responseAreas ? responseAreas.length : 0;
|
|
250
|
-
var correctCount = (0,
|
|
225
|
+
var correctCount = (0, _lodash.reduce)(config.choices, function (total, respArea, key) {
|
|
251
226
|
var chosenValue = value && value[key];
|
|
252
227
|
|
|
253
|
-
if ((0,
|
|
228
|
+
if ((0, _lodash.isEmpty)(chosenValue) || !(0, _lodash.find)(respArea, function (c) {
|
|
254
229
|
return prepareVal(c.label) === prepareVal(chosenValue);
|
|
255
230
|
})) {
|
|
256
231
|
return total;
|
|
@@ -262,7 +237,6 @@ var getScore = function getScore(config, session) {
|
|
|
262
237
|
return parseFloat(str);
|
|
263
238
|
};
|
|
264
239
|
/**
|
|
265
|
-
*
|
|
266
240
|
* The score is partial by default for checkbox mode, allOrNothing for radio mode.
|
|
267
241
|
* To disable partial scoring for checkbox mode you either set model.partialScoring = false or env.partialScoring =
|
|
268
242
|
* false. the value in `env` will override the value in `model`.
|
|
@@ -285,7 +259,7 @@ function outcome(model, session) {
|
|
|
285
259
|
var score = getScore(model, session);
|
|
286
260
|
resolve({
|
|
287
261
|
score: partialScoringEnabled ? score : score === 1 ? 1 : 0,
|
|
288
|
-
empty: (0,
|
|
262
|
+
empty: (0, _lodash.isEmpty)(session)
|
|
289
263
|
});
|
|
290
264
|
});
|
|
291
265
|
}
|
|
@@ -359,7 +333,7 @@ var validate = function validate() {
|
|
|
359
333
|
}
|
|
360
334
|
});
|
|
361
335
|
|
|
362
|
-
if (!(0,
|
|
336
|
+
if (!(0, _lodash.isEmpty)(choicesErrors)) {
|
|
363
337
|
allChoicesErrors[key] = choicesErrors;
|
|
364
338
|
}
|
|
365
339
|
});
|
|
@@ -371,7 +345,7 @@ var validate = function validate() {
|
|
|
371
345
|
errors.responseAreas = 'There should be at least 1 response area defined.';
|
|
372
346
|
}
|
|
373
347
|
|
|
374
|
-
if (!(0,
|
|
348
|
+
if (!(0, _lodash.isEmpty)(allChoicesErrors)) {
|
|
375
349
|
errors.choices = allChoicesErrors;
|
|
376
350
|
}
|
|
377
351
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.js"],"names":["translator","Translator","log","prepareChoice","mode","defaultFeedback","choice","out","label","value","correct","feedbackType","feedback","type","getFeedback","getAdjustedLength","length","normalize","question","defaults","model","session","env","Promise","resolve","choices","Object","keys","forEach","key","map","item","index","normalizedQuestion","assign","incorrect","preparChoiceFn","obj","area","respArea","chosenValue","val","c","prepareVal","showNote","values","note","t","lng","language","maxLengthPerChoice","maxLengthPerChoiceEnabled","undefinedLengths","labelLengthsArr","Math","max","disabled","prompt","promptEnabled","markup","displayType","playerSpellCheckEnabled","responseCorrect","getScore","undefined","role","rationale","rationaleEnabled","teacherInstructions","teacherInstructionsEnabled","getTextFromHTML","html","replace","trim","config","responseAreas","match","maxScore","correctCount","total","str","toFixed","parseFloat","outcome","partialScoringEnabled","partialScoring","enabled","score","empty","createCorrectResponseSession","i","id","getInnerText","replaceAll","getContent","validate","maxResponseAreas","allChoicesErrors","errors","field","required","entries","reversedChoices","reverse","choicesErrors","identicalAnswer","slice","some","nbOfResponseAreas"],"mappings":"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","sourcesContent":["import map from 'lodash/map';\nimport reduce from 'lodash/reduce';\nimport find from 'lodash/find';\nimport isEmpty from 'lodash/isEmpty';\nimport debug from 'debug';\nimport { partialScoring } from '@pie-lib/pie-toolbox/controller-utils';\nimport defaults from './defaults';\nimport Translator from '@pie-lib/pie-toolbox/translator';\n\nconst { translator } = Translator;\n\nconst log = debug('explicit-constructed-response:controller');\n\nexport const prepareChoice = (mode, defaultFeedback) => (choice) => {\n const out = {\n label: choice.label,\n value: choice.value,\n };\n\n if (mode === 'evaluate') {\n out.correct = true;\n\n const feedbackType = (choice.feedback && choice.feedback.type) || 'none';\n\n if (feedbackType === 'default') {\n out.feedback = defaultFeedback['correct'];\n } else if (feedbackType === 'custom') {\n out.feedback = choice.feedback.value;\n }\n }\n\n return out;\n};\n\nconst getFeedback = (value) => {\n if (value) {\n return 'correct';\n }\n\n return 'incorrect';\n};\n\n// also used in configure/src/markupUtils.js\nconst getAdjustedLength = (length) => {\n if (length <= 2) {\n return length + 2;\n }\n\n if (length <= 4) {\n return length + 3;\n }\n\n if (length <= 6) {\n return length + 4;\n }\n\n return length + 5;\n};\n\nexport const normalize = (question) => ({ ...defaults, ...question });\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n */\nexport function model(question, session, env) {\n return new Promise(async (resolve) => {\n // this was added to treat an exception, when the model has choices without the \"value\" property\n // like: { label: 'test' }\n if (question.choices) {\n Object.keys(question.choices).forEach((key) => {\n question.choices[key] = (question.choices[key] || []).map((item, index) => {\n if (!item.value) {\n log('Choice does not contain \"value\" property, which is required.', item);\n return { value: `${index}`, ...item };\n }\n\n return item;\n });\n });\n }\n\n const normalizedQuestion = normalize(question);\n const defaultFeedback = Object.assign(\n { correct: 'Correct', incorrect: 'Incorrect' },\n normalizedQuestion.defaultFeedback,\n );\n\n const { value = {} } = session || {};\n\n const preparChoiceFn = prepareChoice(env.mode, defaultFeedback);\n\n let choices = reduce(\n normalizedQuestion.choices,\n (obj, area, key) => {\n obj[key] = map(area, preparChoiceFn);\n\n return obj;\n },\n {},\n );\n let feedback = {};\n\n if (env.mode === 'evaluate') {\n feedback = reduce(\n normalizedQuestion.choices,\n (obj, respArea, key) => {\n const chosenValue = value && value[key];\n const val = !isEmpty(chosenValue) && find(respArea, (c) => prepareVal(c.label) === prepareVal(chosenValue));\n\n obj[key] = getFeedback(val);\n\n return obj;\n },\n {},\n );\n }\n\n let showNote = false;\n // check if a choice has an alternate\n Object.values(choices).forEach((choice) => {\n if (choice && choice.length > 1) {\n showNote = true;\n }\n });\n\n let { note } = normalizedQuestion;\n\n if (!note) {\n note = translator.t('common:commonCorrectAnswerWithAlternates', { lng: normalizedQuestion.language });\n }\n\n const { maxLengthPerChoice = [], maxLengthPerChoiceEnabled } = normalizedQuestion;\n const undefinedLengths = !maxLengthPerChoice.length;\n\n // calculate maxLengthPerChoice array if it is not defined or defined incorrectly\n Object.values(choices).forEach((choice, index) => {\n const labelLengthsArr = (choice || []).map((choice) => (choice.label || '').length);\n const length = Math.max(...labelLengthsArr);\n\n if (\n undefinedLengths ||\n !maxLengthPerChoice[index] ||\n maxLengthPerChoice[index] < length ||\n maxLengthPerChoice[index] > length + 10\n ) {\n maxLengthPerChoice[index] = getAdjustedLength(length);\n }\n });\n\n const out = {\n disabled: env.mode !== 'gather',\n mode: env.mode,\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n markup: normalizedQuestion.markup,\n choices,\n feedback,\n env,\n note,\n showNote,\n maxLengthPerChoice,\n maxLengthPerChoiceEnabled,\n displayType: normalizedQuestion.displayType,\n playerSpellCheckEnabled: normalizedQuestion.playerSpellCheckEnabled,\n responseCorrect: env.mode === 'evaluate' ? getScore(normalizedQuestion, session) === 1 : undefined,\n language: normalizedQuestion.language,\n };\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n resolve(out);\n });\n}\n\nconst getTextFromHTML = (html) => {\n return (html || '').replace(/<\\/?[^>]+(>|$)/g, '');\n};\n\nexport const prepareVal = (html) => {\n const value = getTextFromHTML(html);\n\n return value.trim();\n};\n\nexport const getScore = (config, session) => {\n const { value } = session || {};\n\n if (!session || isEmpty(session) || !value) {\n return 0;\n }\n\n const responseAreas = config.markup && config.markup.match(/\\{\\{(.)\\}\\}/g);\n const maxScore = responseAreas ? responseAreas.length : 0;\n const correctCount = reduce(\n config.choices,\n (total, respArea, key) => {\n const chosenValue = value && value[key];\n\n if (isEmpty(chosenValue) || !find(respArea, (c) => prepareVal(c.label) === prepareVal(chosenValue))) {\n return total;\n }\n\n return total + 1;\n },\n 0,\n );\n\n const str = maxScore ? (correctCount / maxScore).toFixed(2) : 0;\n\n return parseFloat(str);\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 =\n * false. the value in `env` will override the value in `model`.\n * @param {Object} model - the main model\n * @param {boolean} model.partialScoring - is partial scoring enabled (if undefined set to to true)\n * @param {*} session\n * @param {Object} env\n * @param {boolean} env.partialScoring - is partial scoring enabled (if undefined default to true) This overrides\n * `model.partialScoring`.\n */\nexport function outcome(model, session, env = {}) {\n return new Promise((resolve) => {\n const partialScoringEnabled = partialScoring.enabled(model, env);\n const score = getScore(model, session);\n\n resolve({ score: partialScoringEnabled ? score : score === 1 ? 1 : 0, empty: isEmpty(session) });\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;\n const value = {};\n\n Object.keys(choices).forEach((key, i) => {\n value[i] = choices[key][0].label;\n });\n\n resolve({\n id: '1',\n value,\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\nexport const validate = (model = {}, config = {}) => {\n const { choices, markup } = model;\n const { maxResponseAreas } = config;\n const allChoicesErrors = {};\n const errors = {};\n\n ['teacherInstructions', 'prompt', 'rationale'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n Object.entries(choices || {}).forEach(([key, values]) => {\n const reversedChoices = [...(values || [])].reverse();\n const choicesErrors = {};\n\n reversedChoices.forEach((choice, index) => {\n const { value, label } = choice;\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 if (!isEmpty(choicesErrors)) {\n allChoicesErrors[key] = choicesErrors;\n }\n });\n\n const nbOfResponseAreas = (markup.match(/\\{\\{(\\d+)\\}\\}/g) || []).length;\n\n if (nbOfResponseAreas > maxResponseAreas) {\n errors.responseAreas = `No more than ${maxResponseAreas} response areas should be defined.`;\n } else if (nbOfResponseAreas < 1) {\n errors.responseAreas = 'There should be at least 1 response area defined.';\n }\n\n if (!isEmpty(allChoicesErrors)) {\n errors.choices = allChoicesErrors;\n }\n\n return errors;\n};\n"],"file":"index.js"}
|
|
1
|
+
{"version":3,"sources":["../src/index.js"],"names":["translator","Translator","log","prepareChoice","mode","defaultFeedback","choice","out","label","value","correct","feedbackType","feedback","type","getFeedback","getAdjustedLength","length","normalize","question","defaults","model","session","env","Promise","resolve","choices","Object","keys","forEach","key","map","item","index","normalizedQuestion","assign","incorrect","prepareChoiceFn","obj","area","respArea","chosenValue","val","c","prepareVal","showNote","values","some","note","t","lng","language","maxLengthPerChoice","maxLengthPerChoiceEnabled","undefinedLengths","labelLengthsArr","Math","max","disabled","displayType","role","markup","playerSpellCheckEnabled","prompt","promptEnabled","rationale","responseCorrect","getScore","undefined","teacherInstructions","rationaleEnabled","teacherInstructionsEnabled","html","getInnerText","trim","config","responseAreas","match","maxScore","correctCount","total","str","toFixed","parseFloat","outcome","partialScoringEnabled","partialScoring","enabled","score","empty","createCorrectResponseSession","i","id","replaceAll","getContent","replace","validate","maxResponseAreas","allChoicesErrors","errors","field","required","entries","reversedChoices","reverse","choicesErrors","identicalAnswer","slice","nbOfResponseAreas"],"mappings":"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","sourcesContent":["import debug from 'debug';\nimport { find, isEmpty, map, reduce } from 'lodash';\nimport { partialScoring } from '@pie-lib/pie-toolbox/controller-utils';\nimport Translator from '@pie-lib/pie-toolbox/translator';\nimport defaults from './defaults';\n\nconst { translator } = Translator;\n\nconst log = debug('explicit-constructed-response:controller');\n\nexport const prepareChoice = (mode, defaultFeedback) => (choice) => {\n const out = {\n label: choice.label,\n value: choice.value,\n };\n\n if (mode === 'evaluate') {\n out.correct = true;\n\n const feedbackType = (choice.feedback && choice.feedback.type) || 'none';\n\n if (feedbackType === 'default') {\n out.feedback = defaultFeedback['correct'];\n } else if (feedbackType === 'custom') {\n out.feedback = choice.feedback.value;\n }\n }\n\n return out;\n};\n\nconst getFeedback = (value) => {\n if (value) {\n return 'correct';\n }\n\n return 'incorrect';\n};\n\n// also used in configure/src/markupUtils.js\nconst getAdjustedLength = (length) => {\n if (length <= 2) {\n return length + 2;\n }\n\n if (length <= 4) {\n return length + 3;\n }\n\n if (length <= 6) {\n return length + 4;\n }\n\n return length + 5;\n};\n\nexport const normalize = (question) => ({ ...defaults, ...question });\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n */\nexport function model(question, session, env) {\n return new Promise(async (resolve) => {\n // this was added to treat an exception, when the model has choices without\n // the \"value\" property like: { label: 'test' }\n if (question.choices) {\n Object.keys(question.choices).forEach((key) => {\n question.choices[key] = (question.choices[key] || []).map((item, index) => {\n if (!item.value) {\n log('Choice does not contain \"value\" property, which is required.', item);\n return { value: `${index}`, ...item };\n }\n\n return item;\n });\n });\n }\n\n const normalizedQuestion = normalize(question);\n const defaultFeedback = Object.assign(\n { correct: 'Correct', incorrect: 'Incorrect' },\n normalizedQuestion.defaultFeedback,\n );\n const prepareChoiceFn = prepareChoice(env.mode, defaultFeedback);\n const choices = reduce(\n normalizedQuestion.choices,\n (obj, area, key) => {\n obj[key] = map(area, prepareChoiceFn);\n\n return obj;\n },\n {},\n );\n\n const { value = {} } = session || {};\n const feedback =\n env.mode === 'evaluate'\n ? reduce(\n normalizedQuestion.choices,\n (obj, respArea, key) => {\n const chosenValue = value && value[key];\n const val =\n !isEmpty(chosenValue) && find(respArea, (c) => prepareVal(c.label) === prepareVal(chosenValue));\n\n obj[key] = getFeedback(val);\n\n return obj;\n },\n {},\n )\n : {};\n\n // check if at least one choice has an alternate\n const showNote = Object.values(choices).some((choice) => choice?.length > 1);\n const note =\n normalizedQuestion.note ||\n translator.t('common:commonCorrectAnswerWithAlternates', { lng: normalizedQuestion.language });\n\n const { maxLengthPerChoice = [], maxLengthPerChoiceEnabled } = normalizedQuestion;\n const undefinedLengths = !maxLengthPerChoice.length;\n\n // calculate maxLengthPerChoice array if it is not defined or defined incorrectly\n Object.values(choices).forEach((choice, index) => {\n const labelLengthsArr = (choice || []).map((choice) => (choice.label || '').length);\n const length = Math.max(...labelLengthsArr);\n\n if (\n undefinedLengths ||\n !maxLengthPerChoice[index] ||\n maxLengthPerChoice[index] < length ||\n maxLengthPerChoice[index] > length + 10\n ) {\n maxLengthPerChoice[index] = getAdjustedLength(length);\n }\n });\n\n const out = {\n choices,\n disabled: env.mode !== 'gather',\n displayType: normalizedQuestion.displayType,\n mode: env.mode,\n role: env.role,\n feedback,\n language: normalizedQuestion.language,\n markup: normalizedQuestion.markup,\n maxLengthPerChoice,\n maxLengthPerChoiceEnabled,\n note,\n playerSpellCheckEnabled: normalizedQuestion.playerSpellCheckEnabled,\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : defaults.prompt,\n rationale: defaults.rationale,\n responseCorrect: env.mode === 'evaluate' ? getScore(normalizedQuestion, session) === 1 : undefined,\n showNote,\n teacherInstructions: defaults.teacherInstructions,\n };\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : defaults.rationale;\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : defaults.teacherInstructions;\n }\n\n resolve(out);\n });\n}\n\nexport const prepareVal = (html) => {\n return getInnerText(html).trim();\n};\n\nexport const getScore = (config, session) => {\n const { value } = session || {};\n\n if (!session || isEmpty(session) || !value) {\n return 0;\n }\n\n const responseAreas = config.markup && config.markup.match(/\\{\\{(.)\\}\\}/g);\n const maxScore = responseAreas ? responseAreas.length : 0;\n const correctCount = reduce(\n config.choices,\n (total, respArea, key) => {\n const chosenValue = value && value[key];\n\n if (isEmpty(chosenValue) || !find(respArea, (c) => prepareVal(c.label) === prepareVal(chosenValue))) {\n return total;\n }\n\n return total + 1;\n },\n 0,\n );\n\n const str = maxScore ? (correctCount / maxScore).toFixed(2) : 0;\n\n return parseFloat(str);\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 =\n * false. the value in `env` will override the value in `model`.\n * @param {Object} model - the main model\n * @param {boolean} model.partialScoring - is partial scoring enabled (if undefined set to to true)\n * @param {*} session\n * @param {Object} env\n * @param {boolean} env.partialScoring - is partial scoring enabled (if undefined default to true) This overrides\n * `model.partialScoring`.\n */\nexport function outcome(model, session, env = {}) {\n return new Promise((resolve) => {\n const partialScoringEnabled = partialScoring.enabled(model, env);\n const score = getScore(model, session);\n\n resolve({ score: partialScoringEnabled ? score : score === 1 ? 1 : 0, empty: isEmpty(session) });\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;\n const value = {};\n\n Object.keys(choices).forEach((key, i) => {\n value[i] = choices[key][0].label;\n });\n\n resolve({ id: '1', value });\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\nexport const validate = (model = {}, config = {}) => {\n const { choices, markup } = model;\n const { maxResponseAreas } = config;\n const allChoicesErrors = {};\n const errors = {};\n\n ['teacherInstructions', 'prompt', 'rationale'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n Object.entries(choices || {}).forEach(([key, values]) => {\n const reversedChoices = [...(values || [])].reverse();\n const choicesErrors = {};\n\n reversedChoices.forEach((choice, index) => {\n const { value, label } = choice;\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 if (!isEmpty(choicesErrors)) {\n allChoicesErrors[key] = choicesErrors;\n }\n });\n\n const nbOfResponseAreas = (markup.match(/\\{\\{(\\d+)\\}\\}/g) || []).length;\n\n if (nbOfResponseAreas > maxResponseAreas) {\n errors.responseAreas = `No more than ${maxResponseAreas} response areas should be defined.`;\n } else if (nbOfResponseAreas < 1) {\n errors.responseAreas = 'There should be at least 1 response area defined.';\n }\n\n if (!isEmpty(allChoicesErrors)) {\n errors.choices = allChoicesErrors;\n }\n\n return errors;\n};\n"],"file":"index.js"}
|
package/controller/package.json
CHANGED
package/lib/index.js
CHANGED
|
@@ -50,24 +50,24 @@ var InlineDropdown = /*#__PURE__*/function (_HTMLElement) {
|
|
|
50
50
|
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_render", function () {
|
|
51
51
|
if (_this._model && _this._session) {
|
|
52
52
|
var elem = /*#__PURE__*/_react["default"].createElement(_main["default"], {
|
|
53
|
-
teacherInstructions: _this._model.teacherInstructions,
|
|
54
|
-
prompt: _this._model.prompt,
|
|
55
|
-
note: _this._model.note,
|
|
56
|
-
showNote: _this._model.showNote,
|
|
57
|
-
env: _this._model.env,
|
|
58
|
-
rationale: _this._model.rationale,
|
|
59
|
-
disabled: _this._model.disabled,
|
|
60
53
|
choices: _this._model.choices,
|
|
54
|
+
disabled: _this._model.disabled,
|
|
55
|
+
displayType: _this._model.displayType,
|
|
56
|
+
feedback: _this._model.feedback,
|
|
57
|
+
language: _this._model.language,
|
|
61
58
|
markup: _this._model.markup,
|
|
62
|
-
mode: _this._model.mode,
|
|
63
59
|
maxLengthPerChoice: _this._model.maxLengthPerChoice,
|
|
64
60
|
maxLengthPerChoiceEnabled: _this._model.maxLengthPerChoiceEnabled,
|
|
61
|
+
mode: _this._model.mode,
|
|
62
|
+
note: _this._model.note,
|
|
63
|
+
onChange: _this.changeSession,
|
|
65
64
|
playerSpellCheckEnabled: _this._model.playerSpellCheckEnabled,
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
65
|
+
prompt: _this._model.prompt,
|
|
66
|
+
rationale: _this._model.rationale,
|
|
67
|
+
role: _this._model.role,
|
|
68
|
+
showNote: _this._model.showNote,
|
|
69
|
+
teacherInstructions: _this._model.teacherInstructions,
|
|
70
|
+
value: _this._session.value
|
|
71
71
|
});
|
|
72
72
|
|
|
73
73
|
_reactDom["default"].render(elem, (0, _assertThisInitialized2["default"])(_this), function () {
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.js"],"names":["InlineDropdown","_model","_session","elem","React","createElement","Main","
|
|
1
|
+
{"version":3,"sources":["../src/index.js"],"names":["InlineDropdown","_model","_session","elem","React","createElement","Main","choices","disabled","displayType","feedback","language","markup","maxLengthPerChoice","maxLengthPerChoiceEnabled","mode","note","onChange","changeSession","playerSpellCheckEnabled","prompt","rationale","role","showNote","teacherInstructions","value","ReactDOM","render","dispatchEvent","SessionChangedEvent","tagName","toLowerCase","session","dispatchChangedEvent","_render","m","ModelSetEvent","s","setAttribute","HTMLElement"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AAEA;;;;;;IAEqBA,c;;;;;AACnB,4BAAc;AAAA;;AAAA;AACZ;AADY,gGAwBJ,YAAM;AACd,UAAI,MAAKC,MAAL,IAAe,MAAKC,QAAxB,EAAkC;AAChC,YAAIC,IAAI,gBAAGC,kBAAMC,aAAN,CAAoBC,gBAApB,EAA0B;AACnCC,UAAAA,OAAO,EAAE,MAAKN,MAAL,CAAYM,OADc;AAEnCC,UAAAA,QAAQ,EAAE,MAAKP,MAAL,CAAYO,QAFa;AAGnCC,UAAAA,WAAW,EAAE,MAAKR,MAAL,CAAYQ,WAHU;AAInCC,UAAAA,QAAQ,EAAE,MAAKT,MAAL,CAAYS,QAJa;AAKnCC,UAAAA,QAAQ,EAAE,MAAKV,MAAL,CAAYU,QALa;AAMnCC,UAAAA,MAAM,EAAE,MAAKX,MAAL,CAAYW,MANe;AAOnCC,UAAAA,kBAAkB,EAAE,MAAKZ,MAAL,CAAYY,kBAPG;AAQnCC,UAAAA,yBAAyB,EAAE,MAAKb,MAAL,CAAYa,yBARJ;AASnCC,UAAAA,IAAI,EAAE,MAAKd,MAAL,CAAYc,IATiB;AAUnCC,UAAAA,IAAI,EAAE,MAAKf,MAAL,CAAYe,IAViB;AAWnCC,UAAAA,QAAQ,EAAE,MAAKC,aAXoB;AAYnCC,UAAAA,uBAAuB,EAAE,MAAKlB,MAAL,CAAYkB,uBAZF;AAanCC,UAAAA,MAAM,EAAE,MAAKnB,MAAL,CAAYmB,MAbe;AAcnCC,UAAAA,SAAS,EAAE,MAAKpB,MAAL,CAAYoB,SAdY;AAenCC,UAAAA,IAAI,EAAE,MAAKrB,MAAL,CAAYqB,IAfiB;AAgBnCC,UAAAA,QAAQ,EAAE,MAAKtB,MAAL,CAAYsB,QAhBa;AAiBnCC,UAAAA,mBAAmB,EAAE,MAAKvB,MAAL,CAAYuB,mBAjBE;AAkBnCC,UAAAA,KAAK,EAAE,MAAKvB,QAAL,CAAcuB;AAlBc,SAA1B,CAAX;;AAqBAC,6BAASC,MAAT,CAAgBxB,IAAhB,kDAA4B,YAAM;AAChC;AACD,SAFD;AAGD;AACF,KAnDa;AAAA,6GAqDS,YAAM;AAC3B,YAAKyB,aAAL,CAAmB,IAAIC,oCAAJ,CAAwB,MAAKC,OAAL,CAAaC,WAAb,EAAxB,EAAoD,MAAKC,OAAL,IAAgB,CAAC,CAAC,MAAKA,OAAL,CAAaP,KAAnF,CAAnB;AACD,KAvDa;AAAA,sGAyDE,UAACA,KAAD,EAAW;AACzB,YAAKO,OAAL,CAAaP,KAAb,GAAqBA,KAArB;;AACA,YAAKQ,oBAAL;;AACA,YAAKC,OAAL;AACD,KA7Da;AAEZ,UAAKjC,MAAL,GAAc,IAAd;AACA,UAAKC,QAAL,GAAgB,IAAhB;AAHY;AAIb;;;;SAED,aAAUiC,CAAV,EAAa;AACX,WAAKlC,MAAL,GAAckC,CAAd;AACA,WAAKP,aAAL,CACE,IAAIQ,8BAAJ,CAAkB,KAAKN,OAAL,CAAaC,WAAb,EAAlB,EAA8C,KAAKC,OAAL,IAAgB,CAAC,CAAC,KAAKA,OAAL,CAAaP,KAA7E,EAAoF,CAAC,CAAC,KAAKxB,MAA3F,CADF;;AAIA,WAAKiC,OAAL;AACD;;;SAOD,eAAc;AACZ,aAAO,KAAKhC,QAAZ;AACD,K;SAPD,aAAYmC,CAAZ,EAAe;AACb,WAAKnC,QAAL,GAAgBmC,CAAhB;;AACA,WAAKH,OAAL;AACD;;;WA6CD,6BAAoB;AAClB,WAAKI,YAAL,CAAkB,YAAlB,EAAgC,4BAAhC;AACA,WAAKA,YAAL,CAAkB,MAAlB,EAA0B,QAA1B;;AAEA,WAAKJ,OAAL;AACD;;;kDArEyCK,W","sourcesContent":["import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { ModelSetEvent, SessionChangedEvent } from '@pie-framework/pie-player-events';\nimport { renderMath } from '@pie-lib/pie-toolbox/math-rendering-accessible';\n\nimport Main from './main';\n\nexport default class InlineDropdown extends HTMLElement {\n constructor() {\n super();\n this._model = null;\n this._session = null;\n }\n\n set model(m) {\n this._model = m;\n this.dispatchEvent(\n new ModelSetEvent(this.tagName.toLowerCase(), this.session && !!this.session.value, !!this._model),\n );\n\n this._render();\n }\n\n set session(s) {\n this._session = s;\n this._render();\n }\n\n get session() {\n return this._session;\n }\n\n _render = () => {\n if (this._model && this._session) {\n let elem = React.createElement(Main, {\n choices: this._model.choices,\n disabled: this._model.disabled,\n displayType: this._model.displayType,\n feedback: this._model.feedback,\n language: this._model.language,\n markup: this._model.markup,\n maxLengthPerChoice: this._model.maxLengthPerChoice,\n maxLengthPerChoiceEnabled: this._model.maxLengthPerChoiceEnabled,\n mode: this._model.mode,\n note: this._model.note,\n onChange: this.changeSession,\n playerSpellCheckEnabled: this._model.playerSpellCheckEnabled,\n prompt: this._model.prompt,\n rationale: this._model.rationale,\n role: this._model.role,\n showNote: this._model.showNote,\n teacherInstructions: this._model.teacherInstructions,\n value: this._session.value,\n });\n\n ReactDOM.render(elem, this, () => {\n renderMath(this);\n });\n }\n };\n\n dispatchChangedEvent = () => {\n this.dispatchEvent(new SessionChangedEvent(this.tagName.toLowerCase(), this.session && !!this.session.value));\n };\n\n changeSession = (value) => {\n this.session.value = value;\n this.dispatchChangedEvent();\n this._render();\n };\n\n connectedCallback() {\n this.setAttribute('aria-label', 'Fill in the Blank Question');\n this.setAttribute('role', 'region');\n\n this._render();\n }\n}\n"],"file":"index.js"}
|