@pie-element/number-line 11.3.4-next.3 → 12.0.0-beta.1

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.
Files changed (89) hide show
  1. package/CHANGELOG.md +0 -11
  2. package/configure/CHANGELOG.md +0 -11
  3. package/configure/lib/arrows.js +68 -103
  4. package/configure/lib/arrows.js.map +1 -1
  5. package/configure/lib/card-bar.js +41 -62
  6. package/configure/lib/card-bar.js.map +1 -1
  7. package/configure/lib/defaults.js +5 -7
  8. package/configure/lib/defaults.js.map +1 -1
  9. package/configure/lib/domain.js +60 -116
  10. package/configure/lib/domain.js.map +1 -1
  11. package/configure/lib/index.js +124 -194
  12. package/configure/lib/index.js.map +1 -1
  13. package/configure/lib/main.js +586 -722
  14. package/configure/lib/main.js.map +1 -1
  15. package/configure/lib/number-text-field.js +15 -86
  16. package/configure/lib/number-text-field.js.map +1 -1
  17. package/configure/lib/point-config.js +69 -129
  18. package/configure/lib/point-config.js.map +1 -1
  19. package/configure/lib/size.js +43 -77
  20. package/configure/lib/size.js.map +1 -1
  21. package/configure/lib/ticks.js +89 -151
  22. package/configure/lib/ticks.js.map +1 -1
  23. package/configure/lib/utils.js +2 -4
  24. package/configure/lib/utils.js.map +1 -1
  25. package/configure/package.json +10 -7
  26. package/controller/CHANGELOG.md +0 -11
  27. package/controller/lib/defaults.js +5 -6
  28. package/controller/lib/defaults.js.map +1 -1
  29. package/controller/lib/index.js +171 -286
  30. package/controller/lib/index.js.map +1 -1
  31. package/controller/lib/tickUtils.js +96 -169
  32. package/controller/lib/tickUtils.js.map +1 -1
  33. package/controller/lib/utils.js +55 -88
  34. package/controller/lib/utils.js.map +1 -1
  35. package/controller/package.json +3 -3
  36. package/lib/data-converter.js +19 -23
  37. package/lib/data-converter.js.map +1 -1
  38. package/lib/draggable/index.js +104 -43
  39. package/lib/draggable/index.js.map +1 -1
  40. package/lib/index.js +118 -205
  41. package/lib/index.js.map +1 -1
  42. package/lib/number-line/colors.js +3 -13
  43. package/lib/number-line/colors.js.map +1 -1
  44. package/lib/number-line/feedback.js +53 -69
  45. package/lib/number-line/feedback.js.map +1 -1
  46. package/lib/number-line/graph/arrow.js +19 -38
  47. package/lib/number-line/graph/arrow.js.map +1 -1
  48. package/lib/number-line/graph/elements/base.js +7 -13
  49. package/lib/number-line/graph/elements/base.js.map +1 -1
  50. package/lib/number-line/graph/elements/builder.js +6 -7
  51. package/lib/number-line/graph/elements/builder.js.map +1 -1
  52. package/lib/number-line/graph/elements/line.js +209 -265
  53. package/lib/number-line/graph/elements/line.js.map +1 -1
  54. package/lib/number-line/graph/elements/point.js +170 -201
  55. package/lib/number-line/graph/elements/point.js.map +1 -1
  56. package/lib/number-line/graph/elements/ray.js +147 -185
  57. package/lib/number-line/graph/elements/ray.js.map +1 -1
  58. package/lib/number-line/graph/index.js +217 -283
  59. package/lib/number-line/graph/index.js.map +1 -1
  60. package/lib/number-line/graph/line.js +12 -22
  61. package/lib/number-line/graph/line.js.map +1 -1
  62. package/lib/number-line/graph/stacks.js +31 -54
  63. package/lib/number-line/graph/stacks.js.map +1 -1
  64. package/lib/number-line/graph/tick-utils.js +120 -209
  65. package/lib/number-line/graph/tick-utils.js.map +1 -1
  66. package/lib/number-line/graph/ticks.js +144 -225
  67. package/lib/number-line/graph/ticks.js.map +1 -1
  68. package/lib/number-line/index.js +331 -395
  69. package/lib/number-line/index.js.map +1 -1
  70. package/lib/number-line/point-chooser/button.js +33 -58
  71. package/lib/number-line/point-chooser/button.js.map +1 -1
  72. package/lib/number-line/point-chooser/img.js +2 -3
  73. package/lib/number-line/point-chooser/img.js.map +1 -1
  74. package/lib/number-line/point-chooser/index.js +152 -148
  75. package/lib/number-line/point-chooser/index.js.map +1 -1
  76. package/lib/number-line/point-chooser/styles.js +29 -52
  77. package/lib/number-line/point-chooser/styles.js.map +1 -1
  78. package/lib/number-line/transitions/fade.js +70 -49
  79. package/lib/number-line/transitions/fade.js.map +1 -1
  80. package/lib/number-line/transitions/index.js +2 -4
  81. package/lib/number-line/transitions/index.js.map +1 -1
  82. package/package.json +16 -13
  83. package/esm/configure.js +0 -84095
  84. package/esm/configure.js.map +0 -1
  85. package/esm/controller.js +0 -68122
  86. package/esm/controller.js.map +0 -1
  87. package/esm/element.js +0 -44487
  88. package/esm/element.js.map +0 -1
  89. package/esm/package.json +0 -3
@@ -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
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
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
- var getPartialScore = function getPartialScore(corrected, ps) {
64
- var correct = corrected.correct;
65
- var rule = ps.find(function (r) {
66
- return r.numberOfCorrect === correct.length;
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
- var accumulateAnswer = function accumulateAnswer(correctResponse) {
77
- return function (total, answer) {
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(function (resolve) {
90
- if (!session || (0, _isEmpty["default"])(session)) {
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
- var partialScoringEnabled = _controllerUtils.partialScoring.enabled(model, env);
97
-
98
- var numCorrect = (session.answer || []).reduce(accumulateAnswer(model.correctResponse), 0);
99
- var total = model.correctResponse.length;
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
- var _score = numCorrect < 0 ? 0 : (numCorrect - numIncorrect) / total;
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 ? _score : _score === 1 ? 1 : 0
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(function (resolve) {
125
- if (!session || (0, _isEmpty["default"])(session)) {
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
- var corrected = getCorrected(session.answer, (0, _cloneDeep["default"])(question.correctResponse));
134
- var correctness = getCorrectness(corrected);
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
- var allowPartialScoring = question.allowPartialScoring,
142
- _partialScoring = question.partialScoring;
143
-
144
- var ps = (_partialScoring || []).filter(function (o) {
145
- return !(0, _isEmpty["default"])(o);
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
- var CLOSE_TO_PRECISION = 3;
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
- var expectedDiff = Math.pow(10, -precision) / 2;
172
- var receivedDiff = Math.abs(a - b);
173
- var close = receivedDiff <= expectedDiff;
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
- var matches = function matches(a) {
180
- return function (v) {
181
- return (0, _isEqualWith["default"])(a, v, function (v, ov) {
182
- if (typeof v === 'number' && typeof ov === 'number') {
183
- return closeTo(v, ov, CLOSE_TO_PRECISION);
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
- var getCorrected = function getCorrected(answer, correctResponse) {
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
- return answer.reduce(function (acc, a, index) {
200
- var correct = acc.correct,
201
- incorrect = acc.incorrect,
202
- notInAnswer = acc.notInAnswer;
203
- var match = (0, _find["default"])(notInAnswer, matches(a));
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
- var getCorrectness = function getCorrectness(corrected) {
227
- var incorrect = corrected.incorrect,
228
- correct = corrected.correct,
229
- notInAnswer = corrected.notInAnswer,
230
- noCorrectResponse = corrected.noCorrectResponse;
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
- var feedback = (0, _merge["default"])(_defaults["default"].feedback, question.feedback);
264
- return _objectSpread(_objectSpread(_objectSpread({}, _defaults["default"]), question), {}, {
265
- feedback: feedback
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
- function createDefaultModel() {
270
- var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
271
- return new Promise(function (resolve) {
272
- var out = _objectSpread(_objectSpread({}, model), {}, {
273
- graph: _objectSpread(_objectSpread({}, _defaults["default"].graph), model.graph),
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
- } // this function is duplicated in configure; at some point, use the same shared function
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'; // update the ticks frequency and label value to match the label step if needed
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
- return Promise.reject(new Error('question is null'));
253
+ throw new Error('question is null');
317
254
  }
318
-
319
- return new Promise( /*#__PURE__*/function () {
320
- var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(resolve, reject) {
321
- var normalizedQuestion, normalizedModel, graph, evaluateMode, correctResponse, corrected, correctness, exhibitOnly, disabled, teacherInstructions, fb;
322
- return _regenerator["default"].wrap(function _callee$(_context) {
323
- while (1) {
324
- switch (_context.prev = _context.next) {
325
- case 0:
326
- _context.next = 2;
327
- return normalize(question);
328
-
329
- case 2:
330
- normalizedQuestion = _context.sent;
331
- normalizedModel = updateTicks(normalizedQuestion); // this function is also called in configure, it is a duplicate to maintain consistency and correctness
332
-
333
- graph = (0, _utils.reloadTicksData)(normalizedModel.graph);
334
-
335
- if (graph) {
336
- evaluateMode = env.mode === 'evaluate';
337
- correctResponse = (0, _cloneDeep["default"])(normalizedQuestion.correctResponse);
338
- corrected = evaluateMode && getCorrected(session ? session.answer || [] : [], correctResponse);
339
- correctness = evaluateMode && getCorrectness(corrected);
340
- exhibitOnly = graph.exhibitOnly;
341
- disabled = env.mode !== 'gather' || exhibitOnly === true;
342
- teacherInstructions = null;
343
-
344
- if (env.role === 'instructor' && (env.mode === 'view' || evaluateMode)) {
345
- teacherInstructions = normalizedQuestion.teacherInstructions;
346
- }
347
-
348
- fb = evaluateMode ? (0, _feedback.getFeedbackForCorrectness)(correctness, normalizedQuestion.feedback) : Promise.resolve(undefined);
349
- fb.then(function (feedbackMessage) {
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
- var createCorrectResponseSession = function createCorrectResponseSession(question, env) {
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
- var answer = question.correctResponse;
296
+ const {
297
+ correctResponse: answer
298
+ } = question;
391
299
  resolve({
392
- answer: 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
- var validate = function validate() {
414
- var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
415
- var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
416
-
417
- var _ref2 = model || {},
418
- graph = _ref2.graph,
419
- correctResponse = _ref2.correctResponse;
420
-
421
- var _ref3 = config || {},
422
- _ref3$maxMaxElements = _ref3.maxMaxElements,
423
- maxMaxElements = _ref3$maxMaxElements === void 0 ? 20 : _ref3$maxMaxElements,
424
- _ref3$numberLineDimen = _ref3.numberLineDimensions;
425
-
426
- _ref3$numberLineDimen = _ref3$numberLineDimen === void 0 ? {} : _ref3$numberLineDimen;
427
- var _ref3$numberLineDimen2 = _ref3$numberLineDimen.min,
428
- minWidth = _ref3$numberLineDimen2 === void 0 ? 200 : _ref3$numberLineDimen2,
429
- _ref3$numberLineDimen3 = _ref3$numberLineDimen.max,
430
- maxWidth = _ref3$numberLineDimen3 === void 0 ? 800 : _ref3$numberLineDimen3;
431
-
432
- var _ref4 = graph || {},
433
- width = _ref4.width,
434
- domain = _ref4.domain,
435
- maxNumberOfPoints = _ref4.maxNumberOfPoints;
436
-
437
- var _ref5 = domain || {},
438
- min = _ref5.min,
439
- max = _ref5.max;
440
-
441
- var errors = {};
442
- ['teacherInstructions', 'prompt'].forEach(function (field) {
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 = "Width should be a value between ".concat(minWidth, " and ").concat(maxWidth, ".");
343
+ errors.widthError = `Width should be a value between ${minWidth} and ${maxWidth}.`;
452
344
  }
453
-
454
- var MIN_DOMAIN = -100000;
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 = "Min and max values must both be in the range [".concat(MIN_DOMAIN, ", ").concat(MAX_DOMAIN, "].");
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 = "Max number of elements should be between 1 and ".concat(maxMaxElements, ".");
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