@pie-element/number-line 5.10.0 → 5.10.1-beta.587

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 (73) hide show
  1. package/CHANGELOG.md +504 -0
  2. package/configure/CHANGELOG.md +429 -0
  3. package/configure/lib/arrows.js +3 -3
  4. package/configure/lib/arrows.js.map +1 -1
  5. package/configure/lib/card-bar.js +10 -3
  6. package/configure/lib/card-bar.js.map +1 -1
  7. package/configure/lib/defaults.js +21 -2
  8. package/configure/lib/defaults.js.map +1 -1
  9. package/configure/lib/domain.js +3 -3
  10. package/configure/lib/domain.js.map +1 -1
  11. package/configure/lib/index.js +61 -8
  12. package/configure/lib/index.js.map +1 -1
  13. package/configure/lib/main.js +212 -92
  14. package/configure/lib/main.js.map +1 -1
  15. package/configure/lib/number-text-field.js +4 -4
  16. package/configure/lib/number-text-field.js.map +1 -1
  17. package/configure/lib/point-config.js +7 -4
  18. package/configure/lib/point-config.js.map +1 -1
  19. package/configure/lib/size.js +2 -2
  20. package/configure/lib/size.js.map +1 -1
  21. package/configure/lib/ticks.js +8 -4
  22. package/configure/lib/ticks.js.map +1 -1
  23. package/configure/lib/utils.js +14 -0
  24. package/configure/lib/utils.js.map +1 -0
  25. package/configure/package.json +4 -4
  26. package/controller/CHANGELOG.md +90 -0
  27. package/controller/lib/defaults.js +36 -23
  28. package/controller/lib/defaults.js.map +1 -1
  29. package/controller/lib/index.js +179 -64
  30. package/controller/lib/index.js.map +1 -1
  31. package/controller/package.json +3 -3
  32. package/docs/config-schema.json +16 -0
  33. package/docs/config-schema.json.md +12 -0
  34. package/docs/demo/config.js +2 -2
  35. package/docs/demo/generate.js +22 -26
  36. package/docs/demo/index.html +1 -1
  37. package/docs/pie-schema.json +29 -13
  38. package/docs/pie-schema.json.md +23 -8
  39. package/lib/data-converter.js +1 -1
  40. package/lib/data-converter.js.map +1 -1
  41. package/lib/draggable/index.js +1 -1
  42. package/lib/draggable/index.js.map +1 -1
  43. package/lib/index.js +16 -5
  44. package/lib/index.js.map +1 -1
  45. package/lib/number-line/colors.js +1 -1
  46. package/lib/number-line/feedback.js.map +1 -1
  47. package/lib/number-line/graph/arrow.js.map +1 -1
  48. package/lib/number-line/graph/elements/base.js.map +1 -1
  49. package/lib/number-line/graph/elements/builder.js.map +1 -1
  50. package/lib/number-line/graph/elements/line.js +3 -3
  51. package/lib/number-line/graph/elements/line.js.map +1 -1
  52. package/lib/number-line/graph/elements/point.js +12 -4
  53. package/lib/number-line/graph/elements/point.js.map +1 -1
  54. package/lib/number-line/graph/elements/ray.js +12 -5
  55. package/lib/number-line/graph/elements/ray.js.map +1 -1
  56. package/lib/number-line/graph/index.js +6 -4
  57. package/lib/number-line/graph/index.js.map +1 -1
  58. package/lib/number-line/graph/line.js.map +1 -1
  59. package/lib/number-line/graph/stacks.js +1 -1
  60. package/lib/number-line/graph/stacks.js.map +1 -1
  61. package/lib/number-line/graph/tick-utils.js +14 -10
  62. package/lib/number-line/graph/tick-utils.js.map +1 -1
  63. package/lib/number-line/graph/ticks.js +58 -14
  64. package/lib/number-line/graph/ticks.js.map +1 -1
  65. package/lib/number-line/index.js +68 -45
  66. package/lib/number-line/index.js.map +1 -1
  67. package/lib/number-line/point-chooser/button.js.map +1 -1
  68. package/lib/number-line/point-chooser/index.js +1 -1
  69. package/lib/number-line/point-chooser/index.js.map +1 -1
  70. package/lib/number-line/point-chooser/styles.js +1 -1
  71. package/lib/number-line/point-chooser/styles.js.map +1 -1
  72. package/lib/number-line/transitions/fade.js.map +1 -1
  73. package/package.json +9 -8
@@ -2,15 +2,23 @@
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
4
 
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
5
7
  Object.defineProperty(exports, "__esModule", {
6
8
  value: true
7
9
  });
8
- exports.outcome = outcome;
9
- exports.getScore = getScore;
10
- exports.normalize = normalize;
10
+ exports.createCorrectResponseSession = exports.closeTo = exports.CLOSE_TO_PRECISION = void 0;
11
11
  exports.createDefaultModel = createDefaultModel;
12
+ exports.getCorrectness = exports.getCorrected = void 0;
13
+ exports.getScore = getScore;
12
14
  exports.model = model;
13
- exports.createCorrectResponseSession = exports.getCorrectness = exports.getCorrected = exports.closeTo = exports.CLOSE_TO_PRECISION = void 0;
15
+ exports.normalize = normalize;
16
+ exports.outcome = outcome;
17
+ exports.validate = void 0;
18
+
19
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
20
+
21
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
14
22
 
15
23
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
16
24
 
@@ -32,11 +40,17 @@ var _feedback = require("@pie-lib/feedback");
32
40
 
33
41
  var _controllerUtils = require("@pie-lib/controller-utils");
34
42
 
43
+ var math = _interopRequireWildcard(require("mathjs"));
44
+
35
45
  var _defaults = _interopRequireDefault(require("./defaults"));
36
46
 
37
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
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; }
38
50
 
39
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
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; }
40
54
 
41
55
  var score = function score(number) {
42
56
  return {
@@ -64,7 +78,7 @@ var accumulateAnswer = function accumulateAnswer(correctResponse) {
64
78
  var isCorrectResponse = correctResponse.some(function (cr) {
65
79
  return matches(cr)(answer);
66
80
  });
67
- return total + (isCorrectResponse ? 1 : -1);
81
+ return total + (isCorrectResponse ? 1 : 0);
68
82
  };
69
83
  };
70
84
  /**
@@ -83,8 +97,21 @@ function outcome(model, session, env) {
83
97
 
84
98
  var numCorrect = (session.answer || []).reduce(accumulateAnswer(model.correctResponse), 0);
85
99
  var total = model.correctResponse.length;
100
+ var numIncorrect = 0;
101
+
102
+ if ((session.answer || []).length > total) {
103
+ numIncorrect = (session.answer || []).length - total;
104
+ }
105
+
106
+ if (total === 0) {
107
+ total = 1;
108
+ }
86
109
 
87
- var _score = numCorrect < 0 ? 0 : numCorrect / total;
110
+ var _score = numCorrect < 0 ? 0 : (numCorrect - numIncorrect) / total;
111
+
112
+ if (_score < 0) {
113
+ _score = 0;
114
+ }
88
115
 
89
116
  resolve({
90
117
  score: partialScoringEnabled ? _score : _score === 1 ? 1 : 0
@@ -224,36 +251,24 @@ var getCorrectness = function getCorrectness(corrected) {
224
251
 
225
252
  return 'unknown';
226
253
  };
227
-
228
- exports.getCorrectness = getCorrectness;
229
- var feedbackDefaults = {
230
- correct: {
231
- type: 'default',
232
- "default": 'Correct'
233
- },
234
- incorrect: {
235
- type: 'default',
236
- "default": 'Incorrect'
237
- },
238
- partial: {
239
- type: 'default',
240
- "default": 'Nearly'
241
- }
242
- };
243
254
  /**
244
255
  * A sample of a normalize function see:
245
256
  * https://github.com/pie-framework/pie-elements/issues/21
246
257
  */
247
258
 
259
+
260
+ exports.getCorrectness = getCorrectness;
261
+
248
262
  function normalize(question) {
249
263
  return new Promise(function (resolve) {
250
- var feedback = (0, _merge["default"])(feedbackDefaults, question.feedback);
264
+ var feedback = (0, _merge["default"])(_defaults["default"].feedback, question.feedback);
251
265
 
252
266
  if ((0, _isEqual["default"])(feedback, question.feedback)) {
253
- return resolve(undefined);
267
+ return resolve(_objectSpread({}, question));
254
268
  } else {
255
- question.feedback = feedback;
256
- resolve(question);
269
+ resolve(_objectSpread(_objectSpread({}, question), {}, {
270
+ feedback: feedback
271
+ }));
257
272
  }
258
273
  });
259
274
  }
@@ -261,53 +276,108 @@ function normalize(question) {
261
276
  function createDefaultModel() {
262
277
  var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
263
278
  return new Promise(function (resolve) {
264
- var out = {
265
- graph: _objectSpread(_objectSpread({}, _defaults["default"]), model),
279
+ var out = _objectSpread(_objectSpread({}, model), {}, {
280
+ graph: _objectSpread(_objectSpread({}, _defaults["default"].graph), model.graph),
266
281
  colorContrast: 'black_on_white'
267
- };
282
+ });
283
+
268
284
  resolve((0, _omitBy["default"])(out, function (v) {
269
285
  return !v;
270
286
  }));
271
287
  });
272
- }
288
+ } // this function is duplicated in configure; at some point, use the same shared function
289
+
290
+
291
+ var updateTicks = function updateTicks(model) {
292
+ var _model$graph = model.graph;
293
+ _model$graph = _model$graph === void 0 ? {} : _model$graph;
294
+ var domain = _model$graph.domain,
295
+ labelStep = _model$graph.labelStep,
296
+ _model$graph$ticks = _model$graph.ticks,
297
+ ticks = _model$graph$ticks === void 0 ? {} : _model$graph$ticks;
298
+ var minor = ticks.minor,
299
+ major = ticks.major;
300
+
301
+ if (domain) {
302
+ domain.min = Number((domain.min || 0).toFixed(2));
303
+ domain.max = Number((domain.max || 0).toFixed(2));
304
+ }
305
+
306
+ if (labelStep && typeof labelStep === 'string' && labelStep.match(/^[1-9][0-9]*\/[1-9][0-9]*$/g)) {
307
+ model.graph.fraction = true; // update the ticks frequency and label value to match the label step if needed
308
+
309
+ var step = math.evaluate(labelStep);
310
+
311
+ if (step !== major) {
312
+ ticks.major = step;
313
+ ticks.minor = step / (major / minor);
314
+ }
315
+ }
316
+
317
+ return model;
318
+ };
273
319
 
274
320
  function model(question, session, env) {
275
321
  if (!question) {
276
322
  return Promise.reject(new Error('question is null'));
277
323
  }
278
324
 
279
- return new Promise(function (resolve, reject) {
280
- var graph = question.graph;
281
-
282
- if (graph) {
283
- var evaluateMode = env.mode === 'evaluate';
284
- var correctResponse = (0, _cloneDeep["default"])(question.correctResponse);
285
- var corrected = evaluateMode && getCorrected(session ? session.answer || [] : [], correctResponse);
286
- var correctness = evaluateMode && getCorrectness(corrected);
287
- var exhibitOnly = graph.exhibitOnly;
288
- var disabled = env.mode !== 'gather' || exhibitOnly === true;
289
- var fb = evaluateMode ? (0, _feedback.getFeedbackForCorrectness)(correctness, question.feedback) : Promise.resolve(undefined);
290
- fb.then(function (feedbackMessage) {
291
- var out = {
292
- prompt: question.prompt,
293
- graph: graph,
294
- disabled: disabled,
295
- corrected: corrected,
296
- correctResponse: evaluateMode && ['unanswered', 'correct'].indexOf(correctness) === -1 && question.correctResponse,
297
- feedback: feedbackMessage && {
298
- type: correctness,
299
- message: feedbackMessage
300
- },
301
- colorContrast: env.accessibility && env.accessibility.colorContrast || 'black_on_white'
302
- };
303
- resolve((0, _omitBy["default"])(out, function (v) {
304
- return !v;
305
- }));
306
- });
307
- } else {
308
- reject(new Error('graph is undefined'));
309
- }
310
- });
325
+ return new Promise( /*#__PURE__*/function () {
326
+ var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(resolve, reject) {
327
+ var normalizedQuestion, _updateTicks, graph, evaluateMode, correctResponse, corrected, correctness, exhibitOnly, disabled, fb;
328
+
329
+ return _regenerator["default"].wrap(function _callee$(_context) {
330
+ while (1) {
331
+ switch (_context.prev = _context.next) {
332
+ case 0:
333
+ _context.next = 2;
334
+ return normalize(question);
335
+
336
+ case 2:
337
+ normalizedQuestion = _context.sent;
338
+ _updateTicks = updateTicks(normalizedQuestion), graph = _updateTicks.graph;
339
+
340
+ if (graph) {
341
+ evaluateMode = env.mode === 'evaluate';
342
+ correctResponse = (0, _cloneDeep["default"])(normalizedQuestion.correctResponse);
343
+ corrected = evaluateMode && getCorrected(session ? session.answer || [] : [], correctResponse);
344
+ correctness = evaluateMode && getCorrectness(corrected);
345
+ exhibitOnly = graph.exhibitOnly;
346
+ disabled = env.mode !== 'gather' || exhibitOnly === true;
347
+ fb = evaluateMode ? (0, _feedback.getFeedbackForCorrectness)(correctness, normalizedQuestion.feedback) : Promise.resolve(undefined);
348
+ fb.then(function (feedbackMessage) {
349
+ var out = {
350
+ prompt: normalizedQuestion.prompt,
351
+ graph: graph,
352
+ disabled: disabled,
353
+ corrected: corrected,
354
+ correctResponse: evaluateMode && ['unanswered', 'correct'].indexOf(correctness) === -1 && normalizedQuestion.correctResponse,
355
+ feedback: feedbackMessage && {
356
+ type: correctness,
357
+ message: feedbackMessage
358
+ },
359
+ colorContrast: env.accessibility && env.accessibility.colorContrast || 'black_on_white'
360
+ };
361
+ resolve((0, _omitBy["default"])(out, function (v) {
362
+ return !v;
363
+ }));
364
+ });
365
+ } else {
366
+ reject(new Error('graph is undefined'));
367
+ }
368
+
369
+ case 5:
370
+ case "end":
371
+ return _context.stop();
372
+ }
373
+ }
374
+ }, _callee);
375
+ }));
376
+
377
+ return function (_x, _x2) {
378
+ return _ref.apply(this, arguments);
379
+ };
380
+ }());
311
381
  }
312
382
 
313
383
  var createCorrectResponseSession = function createCorrectResponseSession(question, env) {
@@ -325,4 +395,49 @@ var createCorrectResponseSession = function createCorrectResponseSession(questio
325
395
  };
326
396
 
327
397
  exports.createCorrectResponseSession = createCorrectResponseSession;
398
+
399
+ var validate = function validate() {
400
+ var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
401
+ var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
402
+
403
+ // TODO: add configurable validation props after authoring is updated
404
+ var _ref2 = model || {},
405
+ graph = _ref2.graph,
406
+ correctResponse = _ref2.correctResponse;
407
+
408
+ var _ref3 = graph || {},
409
+ width = _ref3.width,
410
+ domain = _ref3.domain,
411
+ maxNumberOfPoints = _ref3.maxNumberOfPoints;
412
+
413
+ var _ref4 = domain || {},
414
+ min = _ref4.min,
415
+ max = _ref4.max;
416
+
417
+ var errors = {};
418
+
419
+ if (width < 200 || width > 800) {
420
+ errors.widthError = 'Width should be a value between 200 and 800.';
421
+ }
422
+
423
+ if (min < -100000 || min > 10000 || max < -100000 || max > 10000) {
424
+ errors.domainError = 'Min and max must both be in the range [-100000, 10000].';
425
+ }
426
+
427
+ if (min >= max) {
428
+ errors.maxError = 'Max must be greater than min.';
429
+ }
430
+
431
+ if (maxNumberOfPoints < 1 || maxNumberOfPoints > 20) {
432
+ errors.pointsError = 'Max number of elements should be between 1 and 20.';
433
+ }
434
+
435
+ if (correctResponse && correctResponse.length === 0) {
436
+ errors.correctResponseError = 'The correct answer should include at least one number line object.';
437
+ }
438
+
439
+ return errors;
440
+ };
441
+
442
+ exports.validate = validate;
328
443
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.js"],"names":["score","number","scaled","getPartialScore","corrected","ps","correct","rule","find","r","numberOfCorrect","length","scorePercentage","accumulateAnswer","correctResponse","total","answer","isCorrectResponse","some","cr","matches","outcome","model","session","env","Promise","resolve","empty","partialScoringEnabled","partialScoring","enabled","numCorrect","reduce","getScore","question","getCorrected","correctness","getCorrectness","allowPartialScoring","filter","o","canDoPartialScoring","CLOSE_TO_PRECISION","closeTo","a","b","precision","expectedDiff","Math","pow","receivedDiff","abs","close","v","ov","incorrect","notInAnswer","noCorrectResponse","acc","index","match","push","splice","indexOf","feedbackDefaults","type","partial","normalize","feedback","undefined","createDefaultModel","out","graph","defaults","colorContrast","reject","Error","evaluateMode","mode","exhibitOnly","disabled","fb","then","feedbackMessage","prompt","message","accessibility","createCorrectResponseSession","role","id"],"mappings":"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","sourcesContent":["import cloneDeep from 'lodash/cloneDeep';\nimport find from 'lodash/find';\nimport isEmpty from 'lodash/isEmpty';\nimport isEqual from 'lodash/isEqual';\nimport isEqualWith from 'lodash/isEqualWith';\nimport merge from 'lodash/merge';\nimport omitBy from 'lodash/omitBy';\nimport { getFeedbackForCorrectness } from '@pie-lib/feedback';\nimport { partialScoring } from '@pie-lib/controller-utils';\n\nimport defaults from './defaults';\n\nconst score = number => {\n return {\n score: {\n scaled: number\n }\n };\n};\n\nconst getPartialScore = (corrected, ps) => {\n const { correct } = corrected;\n const rule = ps.find(r => r.numberOfCorrect === correct.length);\n\n if (rule) {\n return 1.0 * (rule.scorePercentage / 100);\n } else {\n return 0;\n }\n};\n\nconst accumulateAnswer = correctResponse => (total, answer) => {\n const isCorrectResponse = correctResponse.some(cr => matches(cr)(answer));\n return total + (isCorrectResponse ? 1 : -1);\n};\n\n/**\n */\nexport function outcome(model, session, env) {\n return new Promise(resolve => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n } else {\n const partialScoringEnabled = partialScoring.enabled(model, env);\n const numCorrect = (session.answer || []).reduce(\n accumulateAnswer(model.correctResponse),\n 0\n );\n const total = model.correctResponse.length;\n const score = numCorrect < 0 ? 0 : numCorrect / total;\n\n resolve({ score: partialScoringEnabled ? score : score === 1 ? 1 : 0 });\n }\n });\n}\n\nexport function getScore(question, session) {\n return new Promise(resolve => {\n if (!session || isEmpty(session)) {\n resolve({ score: { scaled: 0 } })\n } else {\n session.answer = session.answer || [];\n\n const corrected = getCorrected(\n session.answer,\n cloneDeep(question.correctResponse)\n );\n\n const correctness = getCorrectness(corrected);\n\n if (correctness === 'correct') {\n resolve(score(1.0));\n } else if (correctness === 'incorrect') {\n resolve(score(0.0));\n } else if (correctness === 'partial') {\n const { allowPartialScoring, partialScoring } = question;\n const ps = (partialScoring || []).filter(o => !isEmpty(o));\n const canDoPartialScoring = allowPartialScoring && ps.length > 0;\n if (canDoPartialScoring) {\n resolve(score(getPartialScore(corrected, ps)));\n } else {\n resolve(score(0.0));\n }\n } else {\n resolve({ score: { scaled: -1 } });\n }\n }\n });\n}\n\nexport const CLOSE_TO_PRECISION = 3;\n\nexport const closeTo = (a, b, precision) => {\n precision = precision || 5;\n const expectedDiff = Math.pow(10, -precision) / 2;\n const receivedDiff = Math.abs(a - b);\n const close = receivedDiff <= expectedDiff;\n return close;\n};\n\nconst matches = a => v => {\n return isEqualWith(a, v, (v, ov) => {\n if (typeof v === 'number' && typeof ov === 'number') {\n return closeTo(v, ov, CLOSE_TO_PRECISION);\n }\n });\n};\n\nexport const getCorrected = (answer, correctResponse) => {\n if (isEmpty(correctResponse) && answer.length > 0) {\n return {\n correct: [],\n incorrect: [],\n notInAnswer: [],\n noCorrectResponse: true\n };\n }\n\n return answer.reduce(\n (acc, a, index) => {\n const { correct, incorrect, notInAnswer } = acc;\n\n const match = find(notInAnswer, matches(a));\n if (match) {\n correct.push(index);\n notInAnswer.splice(notInAnswer.indexOf(match), 1);\n } else {\n incorrect.push(index);\n }\n\n return {\n correct: correct,\n incorrect: incorrect,\n notInAnswer: notInAnswer\n };\n },\n {\n correct: [],\n incorrect: [],\n notInAnswer: correctResponse\n }\n );\n};\n\nexport const getCorrectness = corrected => {\n const { incorrect, correct, notInAnswer, noCorrectResponse } = corrected;\n\n if (noCorrectResponse) {\n return 'unknown';\n }\n\n if (incorrect.length === 0 && correct.length === 0) {\n return 'unanswered';\n }\n\n if (incorrect.length === 0 && notInAnswer.length === 0) {\n return 'correct';\n }\n\n if (incorrect.length > 0 || notInAnswer.length > 0) {\n if (correct.length > 0) {\n return 'partial';\n } else {\n return 'incorrect';\n }\n }\n\n return 'unknown';\n};\n\nconst feedbackDefaults = {\n correct: {\n type: 'default',\n default: 'Correct'\n },\n incorrect: {\n type: 'default',\n default: 'Incorrect'\n },\n partial: {\n type: 'default',\n default: 'Nearly'\n }\n};\n\n/**\n * A sample of a normalize function see:\n * https://github.com/pie-framework/pie-elements/issues/21\n */\nexport function normalize(question) {\n return new Promise(resolve => {\n const feedback = merge(feedbackDefaults, question.feedback);\n if (isEqual(feedback, question.feedback)) {\n return resolve(undefined);\n } else {\n question.feedback = feedback;\n resolve(question);\n }\n });\n}\n\nexport function createDefaultModel(model = {}) {\n return new Promise(resolve => {\n const out = {\n graph: {\n ...defaults,\n ...model\n },\n colorContrast: 'black_on_white'\n };\n\n resolve(omitBy(out, v => !v));\n });\n}\n\nexport function model(question, session, env) {\n if (!question) {\n return Promise.reject(new Error('question is null'));\n }\n\n return new Promise((resolve, reject) => {\n const { graph } = question;\n if (graph) {\n const evaluateMode = env.mode === 'evaluate';\n\n const correctResponse = cloneDeep(question.correctResponse);\n const corrected =\n evaluateMode &&\n getCorrected(session ? session.answer || [] : [], correctResponse);\n const correctness = evaluateMode && getCorrectness(corrected);\n\n const { exhibitOnly } = graph;\n\n const disabled = env.mode !== 'gather' || exhibitOnly === true;\n\n const fb = evaluateMode\n ? getFeedbackForCorrectness(correctness, question.feedback)\n : Promise.resolve(undefined);\n\n fb.then(feedbackMessage => {\n const out = {\n prompt: question.prompt,\n graph,\n disabled,\n corrected,\n correctResponse:\n evaluateMode &&\n ['unanswered', 'correct'].indexOf(correctness) === -1 &&\n question.correctResponse,\n feedback: feedbackMessage && {\n type: correctness,\n message: feedbackMessage\n },\n colorContrast:\n (env.accessibility && env.accessibility.colorContrast) ||\n 'black_on_white'\n };\n\n resolve(omitBy(out, v => !v));\n });\n } else {\n reject(new Error('graph is undefined'));\n }\n });\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise(resolve => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { correctResponse: answer } = question;\n\n resolve({\n answer,\n id: '1'\n });\n } else {\n resolve(null);\n }\n });\n};\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../src/index.js"],"names":["score","number","scaled","getPartialScore","corrected","ps","correct","rule","find","r","numberOfCorrect","length","scorePercentage","accumulateAnswer","correctResponse","total","answer","isCorrectResponse","some","cr","matches","outcome","model","session","env","Promise","resolve","empty","partialScoringEnabled","partialScoring","enabled","numCorrect","reduce","numIncorrect","getScore","question","getCorrected","correctness","getCorrectness","allowPartialScoring","filter","o","canDoPartialScoring","CLOSE_TO_PRECISION","closeTo","a","b","precision","expectedDiff","Math","pow","receivedDiff","abs","close","v","ov","incorrect","notInAnswer","noCorrectResponse","acc","index","match","push","splice","indexOf","normalize","feedback","defaults","createDefaultModel","out","graph","colorContrast","updateTicks","domain","labelStep","ticks","minor","major","min","Number","toFixed","max","fraction","step","math","evaluate","reject","Error","normalizedQuestion","evaluateMode","mode","exhibitOnly","disabled","fb","undefined","then","feedbackMessage","prompt","type","message","accessibility","createCorrectResponseSession","role","id","validate","config","width","maxNumberOfPoints","errors","widthError","domainError","maxError","pointsError","correctResponseError"],"mappings":"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","sourcesContent":["import cloneDeep from 'lodash/cloneDeep';\nimport find from 'lodash/find';\nimport isEmpty from 'lodash/isEmpty';\nimport isEqual from 'lodash/isEqual';\nimport isEqualWith from 'lodash/isEqualWith';\nimport merge from 'lodash/merge';\nimport omitBy from 'lodash/omitBy';\nimport { getFeedbackForCorrectness } from '@pie-lib/feedback';\nimport { partialScoring } from '@pie-lib/controller-utils';\nimport * as math from 'mathjs';\n\nimport defaults from './defaults';\n\nconst score = (number) => {\n return {\n score: {\n scaled: number,\n },\n };\n};\n\nconst getPartialScore = (corrected, ps) => {\n const { correct } = corrected;\n const rule = ps.find((r) => r.numberOfCorrect === correct.length);\n\n if (rule) {\n return 1.0 * (rule.scorePercentage / 100);\n } else {\n return 0;\n }\n};\n\nconst accumulateAnswer = (correctResponse) => (total, answer) => {\n const isCorrectResponse = correctResponse.some((cr) => matches(cr)(answer));\n return total + (isCorrectResponse ? 1 : 0);\n};\n\n/**\n */\nexport function outcome(model, session, env) {\n return new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n } else {\n const partialScoringEnabled = partialScoring.enabled(model, env);\n const numCorrect = (session.answer || []).reduce(accumulateAnswer(model.correctResponse), 0);\n\n let total = model.correctResponse.length;\n let numIncorrect = 0;\n\n if ((session.answer || []).length > total) {\n numIncorrect = (session.answer || []).length - total;\n }\n\n if (total === 0) {\n total = 1;\n }\n\n let score = numCorrect < 0 ? 0 : (numCorrect - numIncorrect) / total;\n\n if (score < 0) {\n score = 0;\n }\n\n resolve({ score: partialScoringEnabled ? score : score === 1 ? 1 : 0 });\n }\n });\n}\n\nexport function getScore(question, session) {\n return new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: { scaled: 0 } });\n } else {\n session.answer = session.answer || [];\n\n const corrected = getCorrected(session.answer, cloneDeep(question.correctResponse));\n\n const correctness = getCorrectness(corrected);\n\n if (correctness === 'correct') {\n resolve(score(1.0));\n } else if (correctness === 'incorrect') {\n resolve(score(0.0));\n } else if (correctness === 'partial') {\n const { allowPartialScoring, partialScoring } = question;\n const ps = (partialScoring || []).filter((o) => !isEmpty(o));\n const canDoPartialScoring = allowPartialScoring && ps.length > 0;\n if (canDoPartialScoring) {\n resolve(score(getPartialScore(corrected, ps)));\n } else {\n resolve(score(0.0));\n }\n } else {\n resolve({ score: { scaled: -1 } });\n }\n }\n });\n}\n\nexport const CLOSE_TO_PRECISION = 3;\n\nexport const closeTo = (a, b, precision) => {\n precision = precision || 5;\n const expectedDiff = Math.pow(10, -precision) / 2;\n const receivedDiff = Math.abs(a - b);\n const close = receivedDiff <= expectedDiff;\n return close;\n};\n\nconst matches = (a) => (v) => {\n return isEqualWith(a, v, (v, ov) => {\n if (typeof v === 'number' && typeof ov === 'number') {\n return closeTo(v, ov, CLOSE_TO_PRECISION);\n }\n });\n};\n\nexport const getCorrected = (answer, correctResponse) => {\n if (isEmpty(correctResponse) && answer.length > 0) {\n return {\n correct: [],\n incorrect: [],\n notInAnswer: [],\n noCorrectResponse: true,\n };\n }\n\n return answer.reduce(\n (acc, a, index) => {\n const { correct, incorrect, notInAnswer } = acc;\n\n const match = find(notInAnswer, matches(a));\n if (match) {\n correct.push(index);\n notInAnswer.splice(notInAnswer.indexOf(match), 1);\n } else {\n incorrect.push(index);\n }\n\n return {\n correct: correct,\n incorrect: incorrect,\n notInAnswer: notInAnswer,\n };\n },\n {\n correct: [],\n incorrect: [],\n notInAnswer: correctResponse,\n },\n );\n};\n\nexport const getCorrectness = (corrected) => {\n const { incorrect, correct, notInAnswer, noCorrectResponse } = corrected;\n\n if (noCorrectResponse) {\n return 'unknown';\n }\n\n if (incorrect.length === 0 && correct.length === 0) {\n return 'unanswered';\n }\n\n if (incorrect.length === 0 && notInAnswer.length === 0) {\n return 'correct';\n }\n\n if (incorrect.length > 0 || notInAnswer.length > 0) {\n if (correct.length > 0) {\n return 'partial';\n } else {\n return 'incorrect';\n }\n }\n\n return 'unknown';\n};\n\n/**\n * A sample of a normalize function see:\n * https://github.com/pie-framework/pie-elements/issues/21\n */\nexport function normalize(question) {\n return new Promise((resolve) => {\n const feedback = merge(defaults.feedback, question.feedback);\n\n if (isEqual(feedback, question.feedback)) {\n return resolve({ ...question });\n } else {\n resolve({ ...question, feedback });\n }\n });\n}\n\nexport function createDefaultModel(model = {}) {\n return new Promise((resolve) => {\n const out = {\n ...model,\n graph: {\n ...defaults.graph,\n ...model.graph,\n },\n colorContrast: 'black_on_white',\n };\n\n resolve(omitBy(out, (v) => !v));\n });\n}\n\n// this function is duplicated in configure; at some point, use the same shared function\nconst updateTicks = (model) => {\n const { graph: { domain, labelStep, ticks = {} } = {} } = model;\n const { minor, major } = ticks;\n\n if (domain) {\n domain.min = Number((domain.min || 0).toFixed(2));\n domain.max = Number((domain.max || 0).toFixed(2));\n }\n\n if (labelStep && typeof labelStep === 'string' && labelStep.match(/^[1-9][0-9]*\\/[1-9][0-9]*$/g)) {\n model.graph.fraction = true;\n\n // update the ticks frequency and label value to match the label step if needed\n const step = math.evaluate(labelStep);\n\n if (step !== major) {\n ticks.major = step;\n ticks.minor = step / (major / minor);\n }\n }\n\n return model;\n};\n\nexport function model(question, session, env) {\n if (!question) {\n return Promise.reject(new Error('question is null'));\n }\n\n return new Promise(async (resolve, reject) => {\n const normalizedQuestion = await normalize(question);\n const { graph } = updateTicks(normalizedQuestion);\n\n if (graph) {\n const evaluateMode = env.mode === 'evaluate';\n\n const correctResponse = cloneDeep(normalizedQuestion.correctResponse);\n const corrected = evaluateMode && getCorrected(session ? session.answer || [] : [], correctResponse);\n const correctness = evaluateMode && getCorrectness(corrected);\n\n const { exhibitOnly } = graph;\n const disabled = env.mode !== 'gather' || exhibitOnly === true;\n\n const fb = evaluateMode\n ? getFeedbackForCorrectness(correctness, normalizedQuestion.feedback)\n : Promise.resolve(undefined);\n\n fb.then((feedbackMessage) => {\n const out = {\n prompt: normalizedQuestion.prompt,\n graph,\n disabled,\n corrected,\n correctResponse:\n evaluateMode && ['unanswered', 'correct'].indexOf(correctness) === -1 && normalizedQuestion.correctResponse,\n feedback: feedbackMessage && {\n type: correctness,\n message: feedbackMessage,\n },\n colorContrast: (env.accessibility && env.accessibility.colorContrast) || 'black_on_white',\n };\n\n resolve(omitBy(out, (v) => !v));\n });\n } else {\n reject(new Error('graph is undefined'));\n }\n });\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { correctResponse: answer } = question;\n\n resolve({\n answer,\n id: '1',\n });\n } else {\n resolve(null);\n }\n });\n};\n\nexport const validate = (model = {}, config = {}) => {\n // TODO: add configurable validation props after authoring is updated\n const { graph, correctResponse } = model || {};\n const { width, domain, maxNumberOfPoints } = graph || {};\n const { min, max } = domain || {};\n const errors = {};\n\n if (width < 200 || width > 800) {\n errors.widthError = 'Width should be a value between 200 and 800.';\n }\n\n if (min < -100000 || min > 10000 || max < -100000 || max > 10000) {\n errors.domainError = 'Min and max must both be in the range [-100000, 10000].';\n }\n\n if (min >= max) {\n errors.maxError = 'Max must be greater than min.';\n }\n\n if (maxNumberOfPoints < 1 || maxNumberOfPoints > 20) {\n errors.pointsError = 'Max number of elements should be between 1 and 20.';\n }\n\n if (correctResponse && correctResponse.length === 0) {\n errors.correctResponseError = 'The correct answer should include at least one number line object.';\n }\n\n return errors;\n};\n"],"file":"index.js"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@pie-element/number-line-controller",
3
3
  "private": true,
4
- "version": "4.3.14",
4
+ "version": "4.4.1",
5
5
  "description": "Controller logic for @pie-ui/number-line",
6
6
  "keywords": [
7
7
  "pie",
@@ -14,8 +14,8 @@
14
14
  "access": "public"
15
15
  },
16
16
  "dependencies": {
17
- "@pie-lib/controller-utils": "^0.2.24",
18
- "@pie-lib/feedback": "^0.4.25",
17
+ "@pie-lib/controller-utils": "^0.2.42",
18
+ "@pie-lib/feedback": "^0.4.42",
19
19
  "lodash": "^4.17.15"
20
20
  },
21
21
  "author": "",
@@ -19,6 +19,22 @@
19
19
  }
20
20
  }
21
21
  },
22
+ "spellCheck": {
23
+ "title": "ConfigureProp",
24
+ "type": "object",
25
+ "properties": {
26
+ "settings": {
27
+ "description": "Indicates if the item has to be displayed in the Settings Panel",
28
+ "type": "boolean",
29
+ "title": "settings"
30
+ },
31
+ "label": {
32
+ "description": "Indicates the label for the item that has to be displayed in the Settings Panel",
33
+ "type": "string",
34
+ "title": "label"
35
+ }
36
+ }
37
+ },
22
38
  "showPrompt": {
23
39
  "description": "Determines whether prompt field will be displayed or not",
24
40
  "default": true,
@@ -14,6 +14,18 @@ Indicates if the item has to be displayed in the Settings Panel
14
14
 
15
15
  Indicates the label for the item that has to be displayed in the Settings Panel
16
16
 
17
+ # `spellCheck` (object)
18
+
19
+ Properties of the `spellCheck` object:
20
+
21
+ ## `settings` (boolean)
22
+
23
+ Indicates if the item has to be displayed in the Settings Panel
24
+
25
+ ## `label` (string)
26
+
27
+ Indicates the label for the item that has to be displayed in the Settings Panel
28
+
17
29
  # `showPrompt` (boolean)
18
30
 
19
31
  Determines whether prompt field will be displayed or not
@@ -2,7 +2,7 @@ const { model } = require('./generate');
2
2
 
3
3
  module.exports = {
4
4
  elements: {
5
- 'number-line': '../..'
5
+ 'number-line': '../..',
6
6
  },
7
- models: [model('1', 'number-line')]
7
+ models: [model('1', 'number-line')],
8
8
  };
@@ -5,55 +5,51 @@ exports.oldModel = (id, element) => ({
5
5
  {
6
6
  type: 'point',
7
7
  pointType: 'full',
8
- domainPosition: 1
8
+ domainPosition: 1,
9
9
  },
10
10
  {
11
11
  type: 'line',
12
12
  leftPoint: 'full',
13
13
  rightPoint: 'empty',
14
14
  domainPosition: 1,
15
- size: 2
16
- }
15
+ size: 2,
16
+ },
17
17
  ],
18
18
  feedback: {
19
19
  correct: {
20
20
  type: 'default',
21
- default: 'Correct'
21
+ default: 'Correct',
22
22
  },
23
23
  partial: {
24
24
  type: 'default',
25
- default: 'Nearly'
25
+ default: 'Nearly',
26
26
  },
27
27
  incorrect: {
28
28
  type: 'custom',
29
- custom: '<h1>Incorrect</h1>'
30
- }
29
+ custom: '<h1>Incorrect</h1>',
30
+ },
31
31
  },
32
32
  prompt: 'Set correct answer.',
33
33
  graph: {
34
34
  title: 'This is the title <span data-latex="">\\frac{1}{2}</span>',
35
35
  arrows: {
36
36
  left: true,
37
- right: true
37
+ right: true,
38
38
  },
39
39
  width: 500,
40
- height: 400,
41
40
  domain: { min: -5, max: 5 },
42
41
  ticks: {
43
42
  minor: 1,
44
- major: 2
43
+ major: 2,
45
44
  },
46
45
  initialElements: [
47
46
  {
48
47
  type: 'point',
49
48
  pointType: 'full',
50
- domainPosition: -1
51
- }
49
+ domainPosition: -1,
50
+ },
52
51
  ],
53
52
  maxNumberOfPoints: 20,
54
- // tickFrequency: 6,
55
- showMinorTicks: true,
56
- snapPerTick: 1,
57
53
  tickLabelOverrides: [],
58
54
  initialType: 'PF',
59
55
  exhibitOnly: false,
@@ -66,41 +62,41 @@ exports.oldModel = (id, element) => ({
66
62
  RFN: true,
67
63
  RFP: true,
68
64
  REN: true,
69
- REP: true
70
- }
71
- }
65
+ REP: true,
66
+ },
67
+ },
72
68
  });
73
69
 
74
70
  exports.model = (id, element) => ({
71
+ toolbarEditorPosition: 'bottom',
75
72
  correctResponse: [
76
73
  {
77
74
  pointType: 'full',
78
75
  type: 'point',
79
- domainPosition: 0.41666664999999997
80
- }
76
+ domainPosition: 0.41666664999999997,
77
+ },
81
78
  ],
82
79
  graph: {
83
80
  maxNumberOfPoints: 1,
84
81
  ticks: {
85
82
  major: 0.08333333,
86
- minor: 0.08333333
83
+ minor: 0.041666665,
87
84
  },
88
85
  domain: {
89
86
  min: 0,
90
- max: 1
87
+ max: 1,
91
88
  },
92
89
  width: 500,
93
90
  tickLabelOverrides: ['1/6', '1/3', '1/2', '2/3', '5/6'],
94
91
  initialElements: [],
95
92
  initialType: 'PF',
96
93
  availableTypes: {
97
- PF: true
94
+ PF: true,
98
95
  },
99
- height: 300,
100
- title: '<div></div>'
96
+ title: '<div></div>',
101
97
  },
102
98
  id,
103
99
  prompt:
104
100
  '<div>Part B:<br/><br/>On the number line, plot the probability that a card selected at random from the set of cards will have a rhombus or a rectangle.</div>',
105
- element
101
+ element,
106
102
  });
@@ -1 +1 @@
1
- <number-line pie-id="1"></number-line>
1
+ <number-line pie-id="1"></number-line>