@pie-element/number-line 11.3.4-next.3 → 12.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/configure/lib/arrows.js +68 -103
- package/configure/lib/arrows.js.map +1 -1
- package/configure/lib/card-bar.js +41 -62
- package/configure/lib/card-bar.js.map +1 -1
- package/configure/lib/defaults.js +5 -7
- package/configure/lib/defaults.js.map +1 -1
- package/configure/lib/domain.js +60 -116
- package/configure/lib/domain.js.map +1 -1
- package/configure/lib/index.js +124 -194
- package/configure/lib/index.js.map +1 -1
- package/configure/lib/main.js +585 -721
- package/configure/lib/main.js.map +1 -1
- package/configure/lib/number-text-field.js +15 -86
- package/configure/lib/number-text-field.js.map +1 -1
- package/configure/lib/point-config.js +69 -129
- package/configure/lib/point-config.js.map +1 -1
- package/configure/lib/size.js +43 -77
- package/configure/lib/size.js.map +1 -1
- package/configure/lib/ticks.js +89 -151
- package/configure/lib/ticks.js.map +1 -1
- package/configure/lib/utils.js +2 -4
- package/configure/lib/utils.js.map +1 -1
- package/configure/package.json +10 -7
- package/controller/lib/defaults.js +5 -6
- package/controller/lib/defaults.js.map +1 -1
- package/controller/lib/index.js +171 -286
- package/controller/lib/index.js.map +1 -1
- package/controller/lib/tickUtils.js +96 -169
- package/controller/lib/tickUtils.js.map +1 -1
- package/controller/lib/utils.js +55 -88
- package/controller/lib/utils.js.map +1 -1
- package/controller/package.json +3 -3
- package/lib/data-converter.js +19 -23
- package/lib/data-converter.js.map +1 -1
- package/lib/draggable/index.js +104 -43
- package/lib/draggable/index.js.map +1 -1
- package/lib/index.js +118 -205
- package/lib/index.js.map +1 -1
- package/lib/number-line/colors.js +3 -13
- package/lib/number-line/colors.js.map +1 -1
- package/lib/number-line/feedback.js +53 -69
- package/lib/number-line/feedback.js.map +1 -1
- package/lib/number-line/graph/arrow.js +19 -38
- package/lib/number-line/graph/arrow.js.map +1 -1
- package/lib/number-line/graph/elements/base.js +7 -13
- package/lib/number-line/graph/elements/base.js.map +1 -1
- package/lib/number-line/graph/elements/builder.js +6 -7
- package/lib/number-line/graph/elements/builder.js.map +1 -1
- package/lib/number-line/graph/elements/line.js +209 -265
- package/lib/number-line/graph/elements/line.js.map +1 -1
- package/lib/number-line/graph/elements/point.js +170 -201
- package/lib/number-line/graph/elements/point.js.map +1 -1
- package/lib/number-line/graph/elements/ray.js +147 -185
- package/lib/number-line/graph/elements/ray.js.map +1 -1
- package/lib/number-line/graph/index.js +217 -283
- package/lib/number-line/graph/index.js.map +1 -1
- package/lib/number-line/graph/line.js +12 -22
- package/lib/number-line/graph/line.js.map +1 -1
- package/lib/number-line/graph/stacks.js +31 -54
- package/lib/number-line/graph/stacks.js.map +1 -1
- package/lib/number-line/graph/tick-utils.js +120 -209
- package/lib/number-line/graph/tick-utils.js.map +1 -1
- package/lib/number-line/graph/ticks.js +144 -225
- package/lib/number-line/graph/ticks.js.map +1 -1
- package/lib/number-line/index.js +331 -395
- package/lib/number-line/index.js.map +1 -1
- package/lib/number-line/point-chooser/button.js +33 -58
- package/lib/number-line/point-chooser/button.js.map +1 -1
- package/lib/number-line/point-chooser/img.js +2 -3
- package/lib/number-line/point-chooser/img.js.map +1 -1
- package/lib/number-line/point-chooser/index.js +152 -148
- package/lib/number-line/point-chooser/index.js.map +1 -1
- package/lib/number-line/point-chooser/styles.js +29 -52
- package/lib/number-line/point-chooser/styles.js.map +1 -1
- package/lib/number-line/transitions/fade.js +69 -48
- package/lib/number-line/transitions/fade.js.map +1 -1
- package/lib/number-line/transitions/index.js +2 -4
- package/lib/number-line/transitions/index.js.map +1 -1
- package/package.json +14 -11
- package/esm/configure.js +0 -84095
- package/esm/configure.js.map +0 -1
- package/esm/controller.js +0 -68122
- package/esm/controller.js.map +0 -1
- package/esm/element.js +0 -44487
- package/esm/element.js.map +0 -1
- package/esm/package.json +0 -3
package/controller/lib/index.js
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
6
|
-
|
|
7
4
|
Object.defineProperty(exports, "__esModule", {
|
|
8
5
|
value: true
|
|
9
6
|
});
|
|
@@ -15,114 +12,74 @@ exports.model = model;
|
|
|
15
12
|
exports.normalize = normalize;
|
|
16
13
|
exports.outcome = outcome;
|
|
17
14
|
exports.validate = void 0;
|
|
18
|
-
|
|
19
|
-
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
20
|
-
|
|
21
|
-
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
22
|
-
|
|
23
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
24
|
-
|
|
25
15
|
var _cloneDeep = _interopRequireDefault(require("lodash/cloneDeep"));
|
|
26
|
-
|
|
27
16
|
var _find = _interopRequireDefault(require("lodash/find"));
|
|
28
|
-
|
|
29
17
|
var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
|
|
30
|
-
|
|
31
18
|
var _isEqualWith = _interopRequireDefault(require("lodash/isEqualWith"));
|
|
32
|
-
|
|
33
19
|
var _merge = _interopRequireDefault(require("lodash/merge"));
|
|
34
|
-
|
|
35
20
|
var _omitBy = _interopRequireDefault(require("lodash/omitBy"));
|
|
36
|
-
|
|
37
21
|
var _feedback = require("@pie-lib/feedback");
|
|
38
|
-
|
|
39
22
|
var _controllerUtils = require("@pie-lib/controller-utils");
|
|
40
|
-
|
|
41
23
|
var math = _interopRequireWildcard(require("mathjs"));
|
|
42
|
-
|
|
43
24
|
var _defaults = _interopRequireDefault(require("./defaults"));
|
|
44
|
-
|
|
45
25
|
var _utils = require("./utils");
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
50
|
-
|
|
51
|
-
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; }
|
|
52
|
-
|
|
53
|
-
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; }
|
|
54
|
-
|
|
55
|
-
var score = function score(number) {
|
|
26
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
27
|
+
const score = number => {
|
|
56
28
|
return {
|
|
57
29
|
score: {
|
|
58
30
|
scaled: number
|
|
59
31
|
}
|
|
60
32
|
};
|
|
61
33
|
};
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
});
|
|
68
|
-
|
|
34
|
+
const getPartialScore = (corrected, ps) => {
|
|
35
|
+
const {
|
|
36
|
+
correct
|
|
37
|
+
} = corrected;
|
|
38
|
+
const rule = ps.find(r => r.numberOfCorrect === correct.length);
|
|
69
39
|
if (rule) {
|
|
70
40
|
return 1.0 * (rule.scorePercentage / 100);
|
|
71
41
|
} else {
|
|
72
42
|
return 0;
|
|
73
43
|
}
|
|
74
44
|
};
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
return
|
|
78
|
-
var isCorrectResponse = correctResponse.some(function (cr) {
|
|
79
|
-
return matches(cr)(answer);
|
|
80
|
-
});
|
|
81
|
-
return total + (isCorrectResponse ? 1 : 0);
|
|
82
|
-
};
|
|
45
|
+
const accumulateAnswer = correctResponse => (total, answer) => {
|
|
46
|
+
const isCorrectResponse = correctResponse.some(cr => matches(cr)(answer));
|
|
47
|
+
return total + (isCorrectResponse ? 1 : 0);
|
|
83
48
|
};
|
|
49
|
+
|
|
84
50
|
/**
|
|
85
51
|
*/
|
|
86
|
-
|
|
87
|
-
|
|
88
52
|
function outcome(model, session, env) {
|
|
89
|
-
return new Promise(
|
|
90
|
-
if (!session || (0, _isEmpty
|
|
53
|
+
return new Promise(resolve => {
|
|
54
|
+
if (!session || (0, _isEmpty.default)(session)) {
|
|
91
55
|
resolve({
|
|
92
56
|
score: 0,
|
|
93
57
|
empty: true
|
|
94
58
|
});
|
|
95
59
|
} else {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
var numIncorrect = 0;
|
|
101
|
-
|
|
60
|
+
const partialScoringEnabled = _controllerUtils.partialScoring.enabled(model, env);
|
|
61
|
+
const numCorrect = (session.answer || []).reduce(accumulateAnswer(model.correctResponse), 0);
|
|
62
|
+
let total = model.correctResponse.length;
|
|
63
|
+
let numIncorrect = 0;
|
|
102
64
|
if ((session.answer || []).length > total) {
|
|
103
65
|
numIncorrect = (session.answer || []).length - total;
|
|
104
66
|
}
|
|
105
|
-
|
|
106
67
|
if (total === 0) {
|
|
107
68
|
total = 1;
|
|
108
69
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
if (_score < 0) {
|
|
113
|
-
_score = 0;
|
|
70
|
+
let score = numCorrect < 0 ? 0 : (numCorrect - numIncorrect) / total;
|
|
71
|
+
if (score < 0) {
|
|
72
|
+
score = 0;
|
|
114
73
|
}
|
|
115
|
-
|
|
116
74
|
resolve({
|
|
117
|
-
score: partialScoringEnabled ?
|
|
75
|
+
score: partialScoringEnabled ? score : score === 1 ? 1 : 0
|
|
118
76
|
});
|
|
119
77
|
}
|
|
120
78
|
});
|
|
121
79
|
}
|
|
122
|
-
|
|
123
80
|
function getScore(question, session) {
|
|
124
|
-
return new Promise(
|
|
125
|
-
if (!session || (0, _isEmpty
|
|
81
|
+
return new Promise(resolve => {
|
|
82
|
+
if (!session || (0, _isEmpty.default)(session)) {
|
|
126
83
|
resolve({
|
|
127
84
|
score: {
|
|
128
85
|
scaled: 0
|
|
@@ -130,23 +87,19 @@ function getScore(question, session) {
|
|
|
130
87
|
});
|
|
131
88
|
} else {
|
|
132
89
|
session.answer = session.answer || [];
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
90
|
+
const corrected = getCorrected(session.answer, (0, _cloneDeep.default)(question.correctResponse));
|
|
91
|
+
const correctness = getCorrectness(corrected);
|
|
136
92
|
if (correctness === 'correct') {
|
|
137
93
|
resolve(score(1.0));
|
|
138
94
|
} else if (correctness === 'incorrect') {
|
|
139
95
|
resolve(score(0.0));
|
|
140
96
|
} else if (correctness === 'partial') {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
var canDoPartialScoring = allowPartialScoring && ps.length > 0;
|
|
149
|
-
|
|
97
|
+
const {
|
|
98
|
+
allowPartialScoring,
|
|
99
|
+
partialScoring
|
|
100
|
+
} = question;
|
|
101
|
+
const ps = (partialScoring || []).filter(o => !(0, _isEmpty.default)(o));
|
|
102
|
+
const canDoPartialScoring = allowPartialScoring && ps.length > 0;
|
|
150
103
|
if (canDoPartialScoring) {
|
|
151
104
|
resolve(score(getPartialScore(corrected, ps)));
|
|
152
105
|
} else {
|
|
@@ -162,32 +115,24 @@ function getScore(question, session) {
|
|
|
162
115
|
}
|
|
163
116
|
});
|
|
164
117
|
}
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
exports.CLOSE_TO_PRECISION = CLOSE_TO_PRECISION;
|
|
168
|
-
|
|
169
|
-
var closeTo = function closeTo(a, b, precision) {
|
|
118
|
+
const CLOSE_TO_PRECISION = exports.CLOSE_TO_PRECISION = 3;
|
|
119
|
+
const closeTo = (a, b, precision) => {
|
|
170
120
|
precision = precision || 5;
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
121
|
+
const expectedDiff = Math.pow(10, -precision) / 2;
|
|
122
|
+
const receivedDiff = Math.abs(a - b);
|
|
123
|
+
const close = receivedDiff <= expectedDiff;
|
|
174
124
|
return close;
|
|
175
125
|
};
|
|
176
|
-
|
|
177
126
|
exports.closeTo = closeTo;
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
}
|
|
185
|
-
});
|
|
186
|
-
};
|
|
127
|
+
const matches = a => v => {
|
|
128
|
+
return (0, _isEqualWith.default)(a, v, (v, ov) => {
|
|
129
|
+
if (typeof v === 'number' && typeof ov === 'number') {
|
|
130
|
+
return closeTo(v, ov, CLOSE_TO_PRECISION);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
187
133
|
};
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
if ((0, _isEmpty["default"])(correctResponse) && answer.length > 0) {
|
|
134
|
+
const getCorrected = (answer, correctResponse) => {
|
|
135
|
+
if ((0, _isEmpty.default)(correctResponse) && answer.length > 0) {
|
|
191
136
|
return {
|
|
192
137
|
correct: [],
|
|
193
138
|
incorrect: [],
|
|
@@ -195,20 +140,19 @@ var getCorrected = function getCorrected(answer, correctResponse) {
|
|
|
195
140
|
noCorrectResponse: true
|
|
196
141
|
};
|
|
197
142
|
}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
143
|
+
return answer.reduce((acc, a, index) => {
|
|
144
|
+
const {
|
|
145
|
+
correct,
|
|
146
|
+
incorrect,
|
|
147
|
+
notInAnswer
|
|
148
|
+
} = acc;
|
|
149
|
+
const match = (0, _find.default)(notInAnswer, matches(a));
|
|
205
150
|
if (match) {
|
|
206
151
|
correct.push(index);
|
|
207
152
|
notInAnswer.splice(notInAnswer.indexOf(match), 1);
|
|
208
153
|
} else {
|
|
209
154
|
incorrect.push(index);
|
|
210
155
|
}
|
|
211
|
-
|
|
212
156
|
return {
|
|
213
157
|
correct: correct,
|
|
214
158
|
incorrect: incorrect,
|
|
@@ -220,27 +164,23 @@ var getCorrected = function getCorrected(answer, correctResponse) {
|
|
|
220
164
|
notInAnswer: correctResponse
|
|
221
165
|
});
|
|
222
166
|
};
|
|
223
|
-
|
|
224
167
|
exports.getCorrected = getCorrected;
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
168
|
+
const getCorrectness = corrected => {
|
|
169
|
+
const {
|
|
170
|
+
incorrect,
|
|
171
|
+
correct,
|
|
172
|
+
notInAnswer,
|
|
173
|
+
noCorrectResponse
|
|
174
|
+
} = corrected;
|
|
232
175
|
if (noCorrectResponse) {
|
|
233
176
|
return 'unknown';
|
|
234
177
|
}
|
|
235
|
-
|
|
236
178
|
if (incorrect.length === 0 && correct.length === 0) {
|
|
237
179
|
return 'unanswered';
|
|
238
180
|
}
|
|
239
|
-
|
|
240
181
|
if (incorrect.length === 0 && notInAnswer.length === 0) {
|
|
241
182
|
return 'correct';
|
|
242
183
|
}
|
|
243
|
-
|
|
244
184
|
if (incorrect.length > 0 || notInAnswer.length > 0) {
|
|
245
185
|
if (correct.length > 0) {
|
|
246
186
|
return 'partial';
|
|
@@ -248,230 +188,175 @@ var getCorrectness = function getCorrectness(corrected) {
|
|
|
248
188
|
return 'incorrect';
|
|
249
189
|
}
|
|
250
190
|
}
|
|
251
|
-
|
|
252
191
|
return 'unknown';
|
|
253
192
|
};
|
|
193
|
+
|
|
254
194
|
/**
|
|
255
195
|
* A sample of a normalize function see:
|
|
256
196
|
* https://github.com/pie-framework/pie-elements/issues/21
|
|
257
197
|
*/
|
|
258
|
-
|
|
259
|
-
|
|
260
198
|
exports.getCorrectness = getCorrectness;
|
|
261
|
-
|
|
262
199
|
function normalize(question) {
|
|
263
|
-
|
|
264
|
-
return
|
|
265
|
-
|
|
266
|
-
|
|
200
|
+
const feedback = (0, _merge.default)(_defaults.default.feedback, question.feedback);
|
|
201
|
+
return {
|
|
202
|
+
..._defaults.default,
|
|
203
|
+
...question,
|
|
204
|
+
feedback
|
|
205
|
+
};
|
|
267
206
|
}
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
207
|
+
function createDefaultModel(model = {}) {
|
|
208
|
+
return new Promise(resolve => {
|
|
209
|
+
const out = {
|
|
210
|
+
...model,
|
|
211
|
+
graph: {
|
|
212
|
+
..._defaults.default.graph,
|
|
213
|
+
...model.graph
|
|
214
|
+
},
|
|
274
215
|
colorContrast: 'black_on_white'
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
resolve((0, _omitBy["default"])(out, function (v) {
|
|
278
|
-
return !v;
|
|
279
|
-
}));
|
|
216
|
+
};
|
|
217
|
+
resolve((0, _omitBy.default)(out, v => !v));
|
|
280
218
|
});
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
var updateTicks = function updateTicks(model) {
|
|
285
|
-
var _model$graph = model.graph;
|
|
286
|
-
_model$graph = _model$graph === void 0 ? {} : _model$graph;
|
|
287
|
-
var domain = _model$graph.domain,
|
|
288
|
-
labelStep = _model$graph.labelStep,
|
|
289
|
-
_model$graph$ticks = _model$graph.ticks,
|
|
290
|
-
ticks = _model$graph$ticks === void 0 ? {} : _model$graph$ticks;
|
|
291
|
-
var minor = ticks.minor,
|
|
292
|
-
major = ticks.major;
|
|
219
|
+
}
|
|
293
220
|
|
|
221
|
+
// this function is duplicated in configure; at some point, use the same shared function
|
|
222
|
+
const updateTicks = model => {
|
|
223
|
+
const {
|
|
224
|
+
graph: {
|
|
225
|
+
domain,
|
|
226
|
+
labelStep,
|
|
227
|
+
ticks = {}
|
|
228
|
+
} = {}
|
|
229
|
+
} = model;
|
|
230
|
+
const {
|
|
231
|
+
minor,
|
|
232
|
+
major
|
|
233
|
+
} = ticks;
|
|
294
234
|
if (domain) {
|
|
295
235
|
domain.min = Number((domain.min || 0).toFixed(2));
|
|
296
236
|
domain.max = Number((domain.max || 0).toFixed(2));
|
|
297
237
|
}
|
|
298
|
-
|
|
299
238
|
if (labelStep && typeof labelStep === 'string' && labelStep.match(/^[1-9][0-9]*\/[1-9][0-9]*$/g)) {
|
|
300
239
|
model.graph.fraction = true;
|
|
301
|
-
ticks.tickIntervalType = 'Fraction';
|
|
302
|
-
|
|
303
|
-
var step = math.evaluate(labelStep);
|
|
240
|
+
ticks.tickIntervalType = 'Fraction';
|
|
304
241
|
|
|
242
|
+
// update the ticks frequency and label value to match the label step if needed
|
|
243
|
+
const step = math.evaluate(labelStep);
|
|
305
244
|
if (step !== major) {
|
|
306
245
|
ticks.major = step;
|
|
307
246
|
ticks.minor = step / (major / minor);
|
|
308
247
|
}
|
|
309
248
|
}
|
|
310
|
-
|
|
311
249
|
return model;
|
|
312
250
|
};
|
|
313
|
-
|
|
314
|
-
function model(question, session, env) {
|
|
251
|
+
async function model(question, session, env) {
|
|
315
252
|
if (!question) {
|
|
316
|
-
|
|
253
|
+
throw new Error('question is null');
|
|
317
254
|
}
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
var out = {
|
|
351
|
-
prompt: normalizedQuestion.prompt,
|
|
352
|
-
teacherInstructions: teacherInstructions,
|
|
353
|
-
graph: graph,
|
|
354
|
-
disabled: disabled,
|
|
355
|
-
corrected: corrected,
|
|
356
|
-
correctResponse: evaluateMode && ['unanswered', 'correct'].indexOf(correctness) === -1 && normalizedQuestion.correctResponse,
|
|
357
|
-
feedback: feedbackMessage && {
|
|
358
|
-
type: correctness,
|
|
359
|
-
message: feedbackMessage
|
|
360
|
-
},
|
|
361
|
-
colorContrast: env.accessibility && env.accessibility.colorContrast || 'black_on_white',
|
|
362
|
-
language: normalizedQuestion.language,
|
|
363
|
-
extraCSSRules: normalizedQuestion.extraCSSRules
|
|
364
|
-
};
|
|
365
|
-
resolve((0, _omitBy["default"])(out, function (v) {
|
|
366
|
-
return !v;
|
|
367
|
-
}));
|
|
368
|
-
});
|
|
369
|
-
} else {
|
|
370
|
-
reject(new Error('graph is undefined'));
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
case 6:
|
|
374
|
-
case "end":
|
|
375
|
-
return _context.stop();
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
}, _callee);
|
|
379
|
-
}));
|
|
380
|
-
|
|
381
|
-
return function (_x, _x2) {
|
|
382
|
-
return _ref.apply(this, arguments);
|
|
255
|
+
const normalizedQuestion = await normalize(question);
|
|
256
|
+
const normalizedModel = updateTicks(normalizedQuestion);
|
|
257
|
+
// this function is also called in configure, it is a duplicate to maintain consistency and correctness
|
|
258
|
+
const graph = (0, _utils.reloadTicksData)(normalizedModel.graph);
|
|
259
|
+
if (graph) {
|
|
260
|
+
const evaluateMode = env.mode === 'evaluate';
|
|
261
|
+
const correctResponse = (0, _cloneDeep.default)(normalizedQuestion.correctResponse);
|
|
262
|
+
const corrected = evaluateMode && getCorrected(session ? session.answer || [] : [], correctResponse);
|
|
263
|
+
const correctness = evaluateMode && getCorrectness(corrected);
|
|
264
|
+
const {
|
|
265
|
+
exhibitOnly
|
|
266
|
+
} = graph;
|
|
267
|
+
const disabled = env.mode !== 'gather' || exhibitOnly === true;
|
|
268
|
+
let teacherInstructions = null;
|
|
269
|
+
if (env.role === 'instructor' && (env.mode === 'view' || evaluateMode)) {
|
|
270
|
+
teacherInstructions = normalizedQuestion.teacherInstructions;
|
|
271
|
+
}
|
|
272
|
+
const feedbackMessage = evaluateMode ? await (0, _feedback.getFeedbackForCorrectness)(correctness, normalizedQuestion.feedback) : undefined;
|
|
273
|
+
const out = {
|
|
274
|
+
prompt: normalizedQuestion.prompt,
|
|
275
|
+
teacherInstructions,
|
|
276
|
+
graph,
|
|
277
|
+
disabled,
|
|
278
|
+
corrected,
|
|
279
|
+
correctResponse: evaluateMode && ['unanswered', 'correct'].indexOf(correctness) === -1 && normalizedQuestion.correctResponse,
|
|
280
|
+
feedback: feedbackMessage && {
|
|
281
|
+
type: correctness,
|
|
282
|
+
message: feedbackMessage
|
|
283
|
+
},
|
|
284
|
+
colorContrast: env.accessibility && env.accessibility.colorContrast || 'black_on_white',
|
|
285
|
+
language: normalizedQuestion.language,
|
|
286
|
+
extraCSSRules: normalizedQuestion.extraCSSRules
|
|
383
287
|
};
|
|
384
|
-
|
|
288
|
+
return (0, _omitBy.default)(out, v => !v);
|
|
289
|
+
} else {
|
|
290
|
+
throw new Error('graph is undefined');
|
|
291
|
+
}
|
|
385
292
|
}
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
return new Promise(function (resolve) {
|
|
293
|
+
const createCorrectResponseSession = (question, env) => {
|
|
294
|
+
return new Promise(resolve => {
|
|
389
295
|
if (env.mode !== 'evaluate' && env.role === 'instructor') {
|
|
390
|
-
|
|
296
|
+
const {
|
|
297
|
+
correctResponse: answer
|
|
298
|
+
} = question;
|
|
391
299
|
resolve({
|
|
392
|
-
answer
|
|
300
|
+
answer,
|
|
393
301
|
id: '1'
|
|
394
302
|
});
|
|
395
303
|
} else {
|
|
396
304
|
resolve(null);
|
|
397
305
|
}
|
|
398
306
|
});
|
|
399
|
-
}; // remove all html tags
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
exports.createCorrectResponseSession = createCorrectResponseSession;
|
|
403
|
-
|
|
404
|
-
var getInnerText = function getInnerText(html) {
|
|
405
|
-
return (html || '').replaceAll(/<[^>]*>/g, '');
|
|
406
|
-
}; // remove all html tags except img, iframe and source tag for audio
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
var getContent = function getContent(html) {
|
|
410
|
-
return (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
|
|
411
307
|
};
|
|
412
308
|
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
var _config$field;
|
|
444
|
-
|
|
445
|
-
if ((_config$field = config[field]) !== null && _config$field !== void 0 && _config$field.required && !getContent(model[field])) {
|
|
309
|
+
// remove all html tags
|
|
310
|
+
exports.createCorrectResponseSession = createCorrectResponseSession;
|
|
311
|
+
const getInnerText = html => (html || '').replaceAll(/<[^>]*>/g, '');
|
|
312
|
+
|
|
313
|
+
// remove all html tags except img, iframe and source tag for audio
|
|
314
|
+
const getContent = html => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
|
|
315
|
+
const validate = (model = {}, config = {}) => {
|
|
316
|
+
const {
|
|
317
|
+
graph,
|
|
318
|
+
correctResponse
|
|
319
|
+
} = model || {};
|
|
320
|
+
const {
|
|
321
|
+
maxMaxElements = 20,
|
|
322
|
+
numberLineDimensions: {
|
|
323
|
+
min: minWidth = 200,
|
|
324
|
+
max: maxWidth = 800
|
|
325
|
+
} = {}
|
|
326
|
+
} = config || {};
|
|
327
|
+
const {
|
|
328
|
+
width,
|
|
329
|
+
domain,
|
|
330
|
+
maxNumberOfPoints
|
|
331
|
+
} = graph || {};
|
|
332
|
+
const {
|
|
333
|
+
min,
|
|
334
|
+
max
|
|
335
|
+
} = domain || {};
|
|
336
|
+
const errors = {};
|
|
337
|
+
['teacherInstructions', 'prompt'].forEach(field => {
|
|
338
|
+
if (config[field]?.required && !getContent(model[field])) {
|
|
446
339
|
errors[field] = 'This field is required.';
|
|
447
340
|
}
|
|
448
341
|
});
|
|
449
|
-
|
|
450
342
|
if (width < minWidth || width > maxWidth) {
|
|
451
|
-
errors.widthError =
|
|
343
|
+
errors.widthError = `Width should be a value between ${minWidth} and ${maxWidth}.`;
|
|
452
344
|
}
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
var MAX_DOMAIN = 100000;
|
|
456
|
-
|
|
345
|
+
const MIN_DOMAIN = -100000;
|
|
346
|
+
const MAX_DOMAIN = 100000;
|
|
457
347
|
if (min < MIN_DOMAIN || min > MAX_DOMAIN || max < MIN_DOMAIN || max > MAX_DOMAIN) {
|
|
458
|
-
errors.domainError =
|
|
348
|
+
errors.domainError = `Min and max values must both be in the range [${MIN_DOMAIN}, ${MAX_DOMAIN}].`;
|
|
459
349
|
}
|
|
460
|
-
|
|
461
350
|
if (min >= max) {
|
|
462
351
|
errors.maxError = 'Max value must be greater than min value.';
|
|
463
352
|
}
|
|
464
|
-
|
|
465
353
|
if (maxNumberOfPoints < 1 || maxNumberOfPoints > maxMaxElements) {
|
|
466
|
-
errors.pointsError =
|
|
354
|
+
errors.pointsError = `Max number of elements should be between 1 and ${maxMaxElements}.`;
|
|
467
355
|
}
|
|
468
|
-
|
|
469
356
|
if (correctResponse && correctResponse.length === 0) {
|
|
470
357
|
errors.correctResponseError = 'The correct answer should include at least one number line object.';
|
|
471
358
|
}
|
|
472
|
-
|
|
473
359
|
return errors;
|
|
474
360
|
};
|
|
475
|
-
|
|
476
361
|
exports.validate = validate;
|
|
477
362
|
//# sourceMappingURL=index.js.map
|