@pie-element/number-line 5.11.2 → 5.11.3-next.1016

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/CHANGELOG.md +189 -0
  2. package/configure/CHANGELOG.md +142 -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 +9 -2
  6. package/configure/lib/card-bar.js.map +1 -1
  7. package/configure/lib/defaults.js +7 -1
  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 +40 -7
  12. package/configure/lib/index.js.map +1 -1
  13. package/configure/lib/main.js +90 -15
  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 +3 -3
  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 +3 -3
  26. package/controller/CHANGELOG.md +32 -0
  27. package/controller/lib/defaults.js +0 -3
  28. package/controller/lib/defaults.js.map +1 -1
  29. package/controller/lib/index.js +89 -9
  30. package/controller/lib/index.js.map +1 -1
  31. package/controller/package.json +1 -1
  32. package/docs/config-schema.json +16 -0
  33. package/docs/config-schema.json.md +12 -0
  34. package/docs/demo/generate.js +2 -4
  35. package/docs/pie-schema.json +29 -1
  36. package/docs/pie-schema.json.md +23 -0
  37. package/lib/data-converter.js +1 -1
  38. package/lib/data-converter.js.map +1 -1
  39. package/lib/draggable/index.js +1 -1
  40. package/lib/index.js +16 -5
  41. package/lib/index.js.map +1 -1
  42. package/lib/number-line/colors.js +1 -1
  43. package/lib/number-line/feedback.js.map +1 -1
  44. package/lib/number-line/graph/elements/line.js +3 -3
  45. package/lib/number-line/graph/elements/line.js.map +1 -1
  46. package/lib/number-line/graph/elements/point.js +1 -1
  47. package/lib/number-line/graph/elements/point.js.map +1 -1
  48. package/lib/number-line/graph/elements/ray.js +12 -5
  49. package/lib/number-line/graph/elements/ray.js.map +1 -1
  50. package/lib/number-line/graph/index.js +6 -4
  51. package/lib/number-line/graph/index.js.map +1 -1
  52. package/lib/number-line/graph/stacks.js +1 -1
  53. package/lib/number-line/graph/stacks.js.map +1 -1
  54. package/lib/number-line/graph/tick-utils.js +11 -7
  55. package/lib/number-line/graph/tick-utils.js.map +1 -1
  56. package/lib/number-line/graph/ticks.js +58 -14
  57. package/lib/number-line/graph/ticks.js.map +1 -1
  58. package/lib/number-line/index.js +10 -9
  59. package/lib/number-line/index.js.map +1 -1
  60. package/lib/number-line/point-chooser/index.js +1 -1
  61. package/lib/number-line/point-chooser/index.js.map +1 -1
  62. package/lib/number-line/transitions/fade.js.map +1 -1
  63. package/package.json +5 -5
  64. package/module/configure.js +0 -1335
  65. package/module/controller.js +0 -22387
  66. package/module/demo.js +0 -134
  67. package/module/element.js +0 -10272
  68. package/module/index.html +0 -16
  69. package/module/manifest.json +0 -14
@@ -2,15 +2,19 @@
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;
14
18
 
15
19
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
16
20
 
@@ -36,11 +40,17 @@ var _feedback = require("@pie-lib/feedback");
36
40
 
37
41
  var _controllerUtils = require("@pie-lib/controller-utils");
38
42
 
43
+ var math = _interopRequireWildcard(require("mathjs"));
44
+
39
45
  var _defaults = _interopRequireDefault(require("./defaults"));
40
46
 
41
- 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; }
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; }
42
52
 
43
- 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; }
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; }
44
54
 
45
55
  var score = function score(number) {
46
56
  return {
@@ -275,7 +285,31 @@ function createDefaultModel() {
275
285
  return !v;
276
286
  }));
277
287
  });
278
- }
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 labelStep = _model$graph.labelStep,
295
+ _model$graph$ticks = _model$graph.ticks,
296
+ ticks = _model$graph$ticks === void 0 ? {} : _model$graph$ticks;
297
+ var minor = ticks.minor,
298
+ major = ticks.major;
299
+
300
+ if (labelStep && typeof labelStep === 'string' && labelStep.match(/^[1-9][0-9]*\/[1-9][0-9]*$/g)) {
301
+ model.graph.fraction = true; // update the ticks frequency and label value to match the label step if needed
302
+
303
+ var step = math.evaluate(labelStep);
304
+
305
+ if (step !== major) {
306
+ ticks.major = step;
307
+ ticks.minor = step / (major / minor);
308
+ }
309
+ }
310
+
311
+ return model;
312
+ };
279
313
 
280
314
  function model(question, session, env) {
281
315
  if (!question) {
@@ -284,7 +318,8 @@ function model(question, session, env) {
284
318
 
285
319
  return new Promise( /*#__PURE__*/function () {
286
320
  var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(resolve, reject) {
287
- var normalizedQuestion, graph, evaluateMode, correctResponse, corrected, correctness, exhibitOnly, disabled, fb;
321
+ var normalizedQuestion, _updateTicks, graph, evaluateMode, correctResponse, corrected, correctness, exhibitOnly, disabled, fb;
322
+
288
323
  return _regenerator["default"].wrap(function _callee$(_context) {
289
324
  while (1) {
290
325
  switch (_context.prev = _context.next) {
@@ -294,7 +329,7 @@ function model(question, session, env) {
294
329
 
295
330
  case 2:
296
331
  normalizedQuestion = _context.sent;
297
- graph = normalizedQuestion.graph;
332
+ _updateTicks = updateTicks(normalizedQuestion), graph = _updateTicks.graph;
298
333
 
299
334
  if (graph) {
300
335
  evaluateMode = env.mode === 'evaluate';
@@ -354,4 +389,49 @@ var createCorrectResponseSession = function createCorrectResponseSession(questio
354
389
  };
355
390
 
356
391
  exports.createCorrectResponseSession = createCorrectResponseSession;
392
+
393
+ var validate = function validate() {
394
+ var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
395
+ var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
396
+
397
+ // TODO: add configurable validation props after authoring is updated
398
+ var _ref2 = model || {},
399
+ graph = _ref2.graph,
400
+ correctResponse = _ref2.correctResponse;
401
+
402
+ var _ref3 = graph || {},
403
+ width = _ref3.width,
404
+ domain = _ref3.domain,
405
+ maxNumberOfPoints = _ref3.maxNumberOfPoints;
406
+
407
+ var _ref4 = domain || {},
408
+ min = _ref4.min,
409
+ max = _ref4.max;
410
+
411
+ var errors = {};
412
+
413
+ if (width < 200 || width > 800) {
414
+ errors.widthError = 'Width should be a value between 200 and 800.';
415
+ }
416
+
417
+ if (min < -100000 || min > 10000 || max < -100000 || max > 10000) {
418
+ errors.domainError = 'Min and max must both be in the range [-100000, 10000].';
419
+ }
420
+
421
+ if (min >= max) {
422
+ errors.maxError = 'Max must be greater than min.';
423
+ }
424
+
425
+ if (maxNumberOfPoints < 1 || maxNumberOfPoints > 20) {
426
+ errors.pointsError = 'Max number of elements should be between 1 and 20.';
427
+ }
428
+
429
+ if (correctResponse && correctResponse.length === 0) {
430
+ errors.correctResponseError = 'The correct answer should include at least one number line object.';
431
+ }
432
+
433
+ return errors;
434
+ };
435
+
436
+ exports.validate = validate;
357
437
  //# 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","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","reject","Error","normalizedQuestion","evaluateMode","mode","exhibitOnly","disabled","fb","undefined","then","feedbackMessage","prompt","type","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 : 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(\n accumulateAnswer(model.correctResponse),\n 0\n );\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(\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\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\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\n const { graph } = normalizedQuestion;\n\n if (graph) {\n const evaluateMode = env.mode === 'evaluate';\n\n const correctResponse = cloneDeep(normalizedQuestion.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, 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 &&\n ['unanswered', 'correct'].indexOf(correctness) === -1 &&\n normalizedQuestion.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","labelStep","ticks","minor","major","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","domain","maxNumberOfPoints","min","max","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(\n accumulateAnswer(model.correctResponse),\n 0\n );\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(\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\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: { labelStep, ticks = {}} = {}} = model;\n const { minor, major } = ticks;\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 =\n evaluateMode &&\n 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 &&\n ['unanswered', 'correct'].indexOf(correctness) === -1 &&\n normalizedQuestion.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\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.17",
4
+ "version": "4.3.24",
5
5
  "description": "Controller logic for @pie-ui/number-line",
6
6
  "keywords": [
7
7
  "pie",
@@ -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
@@ -50,9 +50,6 @@ exports.oldModel = (id, element) => ({
50
50
  }
51
51
  ],
52
52
  maxNumberOfPoints: 20,
53
- // tickFrequency: 6,
54
- showMinorTicks: true,
55
- snapPerTick: 1,
56
53
  tickLabelOverrides: [],
57
54
  initialType: 'PF',
58
55
  exhibitOnly: false,
@@ -71,6 +68,7 @@ exports.oldModel = (id, element) => ({
71
68
  });
72
69
 
73
70
  exports.model = (id, element) => ({
71
+ toolbarEditorPosition: 'bottom',
74
72
  correctResponse: [
75
73
  {
76
74
  pointType: 'full',
@@ -82,7 +80,7 @@ exports.model = (id, element) => ({
82
80
  maxNumberOfPoints: 1,
83
81
  ticks: {
84
82
  major: 0.08333333,
85
- minor: 0.08333333
83
+ minor: 0.041666665,
86
84
  },
87
85
  domain: {
88
86
  min: 0,
@@ -618,6 +618,11 @@
618
618
  }
619
619
  },
620
620
  "title": "initialElements"
621
+ },
622
+ "labelStep": {
623
+ "description": "Indicates the fractional step between 2 labeled ticks",
624
+ "type": "string",
625
+ "title": "labelStep"
621
626
  }
622
627
  },
623
628
  "required": [
@@ -627,6 +632,7 @@
627
632
  "exhibitOnly",
628
633
  "initialElements",
629
634
  "initialType",
635
+ "labelStep",
630
636
  "maxNumberOfPoints",
631
637
  "tick",
632
638
  "width"
@@ -637,6 +643,21 @@
637
643
  "type": "string",
638
644
  "title": "prompt"
639
645
  },
646
+ "spellCheckEnabled": {
647
+ "description": "Indicates if spellcheck is enabled for the author. Default value is true",
648
+ "type": "boolean",
649
+ "title": "spellCheckEnabled"
650
+ },
651
+ "toolbarEditorPosition": {
652
+ "description": "Indicates the editor's toolbar position which can be 'bottom' or 'top'",
653
+ "default": ": 'bottom'",
654
+ "enum": [
655
+ "bottom",
656
+ "top"
657
+ ],
658
+ "type": "string",
659
+ "title": "toolbarEditorPosition"
660
+ },
640
661
  "id": {
641
662
  "description": "Identifier to identify the Pie Element in html markup, Must be unique within a pie item config.",
642
663
  "type": "string",
@@ -653,7 +674,8 @@
653
674
  "element",
654
675
  "graph",
655
676
  "id",
656
- "partialScoring"
677
+ "partialScoring",
678
+ "spellCheckEnabled"
657
679
  ],
658
680
  "definitions": {
659
681
  "ConfigureProp": {
@@ -1316,6 +1338,11 @@
1316
1338
  }
1317
1339
  },
1318
1340
  "title": "initialElements"
1341
+ },
1342
+ "labelStep": {
1343
+ "description": "Indicates the fractional step between 2 labeled ticks",
1344
+ "type": "string",
1345
+ "title": "labelStep"
1319
1346
  }
1320
1347
  },
1321
1348
  "required": [
@@ -1325,6 +1352,7 @@
1325
1352
  "exhibitOnly",
1326
1353
  "initialElements",
1327
1354
  "initialType",
1355
+ "labelStep",
1328
1356
  "maxNumberOfPoints",
1329
1357
  "tick",
1330
1358
  "width"
@@ -136,10 +136,29 @@ Indicates if ray with empty point and positive direction is available
136
136
 
137
137
  Array that returns responses
138
138
 
139
+ ## `labelStep` (string, required)
140
+
141
+ Indicates the fractional step between 2 labeled ticks
142
+
139
143
  # `prompt` (string)
140
144
 
141
145
  The question prompt or item stem
142
146
 
147
+ # `spellCheckEnabled` (boolean, required)
148
+
149
+ Indicates if spellcheck is enabled for the author. Default value is true
150
+
151
+ # `toolbarEditorPosition` (string, enum)
152
+
153
+ Indicates the editor's toolbar position which can be 'bottom' or 'top'
154
+
155
+ This element must be one of the following enum values:
156
+
157
+ * `bottom`
158
+ * `top`
159
+
160
+ Default: `": 'bottom'"`
161
+
143
162
  # `id` (string, required)
144
163
 
145
164
  Identifier to identify the Pie Element in html markup, Must be unique within a pie item config.
@@ -428,6 +447,10 @@ Indicates if ray with empty point and positive direction is available
428
447
 
429
448
  Array that returns responses
430
449
 
450
+ ### `labelStep` (string, required)
451
+
452
+ Indicates the fractional step between 2 labeled ticks
453
+
431
454
  ## `Arrows` (object)
432
455
 
433
456
  Properties of the `Arrows` object:
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.toGraphFormat = exports.toSessionFormat = exports.switchPosition = exports.switchGraphLine = exports.lineIsSwitched = void 0;
6
+ exports.toSessionFormat = exports.toGraphFormat = exports.switchPosition = exports.switchGraphLine = exports.lineIsSwitched = void 0;
7
7
 
8
8
  var lineIsSwitched = function lineIsSwitched(line) {
9
9
  var position = line.position;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/data-converter.js"],"names":["lineIsSwitched","line","position","left","right","switchGraphLine","newRightPoint","leftPoint","newLeftPoint","rightPoint","switchPosition","type","p","newRight","newLeft","toSessionFormat","gf","pointType","domainPosition","size","direction","toGraphFormat","sf"],"mappings":"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","sourcesContent":["export const lineIsSwitched = (line) => {\n let { position } = line;\n return position.left > position.right;\n}\n\nexport const switchGraphLine = (line) => {\n\n let { position } = line;\n\n if (position.left < position.right) {\n return line;\n }\n\n let { leftPoint: newRightPoint, rightPoint: newLeftPoint } = line;\n\n return {\n leftPoint: newLeftPoint,\n rightPoint: newRightPoint,\n position: switchPosition(position),\n type: 'line'\n }\n}\n\nexport const switchPosition = (p) => {\n let { left: newRight, right: newLeft } = p;\n return { left: newLeft, right: newRight };\n}\n\nexport const toSessionFormat = (gf) => {\n if (gf.type === 'point') {\n return {\n type: 'point',\n pointType: gf.pointType,\n domainPosition: gf.position\n }\n } else if (gf.type === 'line') {\n return {\n type: 'line',\n size: gf.position.right - gf.position.left,\n domainPosition: gf.position.left,\n leftPoint: gf.leftPoint,\n rightPoint: gf.rightPoint\n }\n } else if (gf.type === 'ray') {\n return {\n type: 'ray',\n domainPosition: gf.position,\n pointType: gf.pointType,\n direction: gf.direction\n }\n }\n}\n\nexport const toGraphFormat = (sf) => {\n if (sf.type === 'point') {\n return {\n type: 'point',\n pointType: sf.pointType,\n position: sf.domainPosition\n }\n } else if (sf.type === 'line') {\n return {\n type: 'line',\n position: {\n left: sf.domainPosition,\n right: sf.domainPosition + sf.size\n },\n leftPoint: sf.leftPoint,\n rightPoint: sf.rightPoint\n }\n } else if (sf.type === 'ray') {\n return {\n type: 'ray',\n position: sf.domainPosition,\n pointType: sf.pointType,\n direction: sf.direction\n }\n }\n}"],"file":"data-converter.js"}
1
+ {"version":3,"sources":["../src/data-converter.js"],"names":["lineIsSwitched","line","position","left","right","switchGraphLine","newRightPoint","leftPoint","newLeftPoint","rightPoint","switchPosition","type","p","newRight","newLeft","toSessionFormat","gf","pointType","domainPosition","size","direction","toGraphFormat","sf"],"mappings":"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","sourcesContent":["export const lineIsSwitched = (line) => {\n let { position } = line;\n return position.left > position.right;\n}\n\nexport const switchGraphLine = (line) => {\n\n let { position } = line;\n\n if (position.left < position.right) {\n return line;\n }\n\n let { leftPoint: newRightPoint, rightPoint: newLeftPoint } = line;\n\n return {\n leftPoint: newLeftPoint,\n rightPoint: newRightPoint,\n position: switchPosition(position),\n type: 'line'\n }\n}\n\nexport const switchPosition = (p) => {\n let { left: newRight, right: newLeft } = p;\n return { left: newLeft, right: newRight };\n}\n\nexport const toSessionFormat = (gf) => {\n if (gf.type === 'point') {\n return {\n type: 'point',\n pointType: gf.pointType,\n domainPosition: gf.position\n }\n } else if (gf.type === 'line') {\n return {\n type: 'line',\n size: gf.position.right - gf.position.left,\n domainPosition: gf.position.left,\n leftPoint: gf.leftPoint,\n rightPoint: gf.rightPoint\n }\n } else if (gf.type === 'ray') {\n return {\n type: 'ray',\n domainPosition: gf.position,\n pointType: gf.pointType,\n direction: gf.direction\n }\n }\n}\n\nexport const toGraphFormat = (sf) => {\n if (sf.type === 'point') {\n return {\n type: 'point',\n pointType: sf.pointType,\n position: sf.domainPosition\n }\n } else if (sf.type === 'line') {\n return {\n type: 'line',\n position: {\n left: sf.domainPosition,\n right: sf.domainPosition + sf.size\n },\n leftPoint: sf.leftPoint,\n rightPoint: sf.rightPoint\n }\n } else if (sf.type === 'ray') {\n return {\n type: 'ray',\n position: sf.domainPosition,\n pointType: sf.pointType,\n direction: sf.direction\n }\n }\n}"],"file":"data-converter.js"}
@@ -23,7 +23,7 @@ var _reactDraggable = _interopRequireDefault(require("react-draggable"));
23
23
 
24
24
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
25
25
 
26
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
26
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
27
27
 
28
28
  var LocalDraggable = /*#__PURE__*/function (_Draggable) {
29
29
  (0, _inherits2["default"])(LocalDraggable, _Draggable);
package/lib/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
4
-
5
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
6
4
 
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
7
7
  Object.defineProperty(exports, "__esModule", {
8
8
  value: true
9
9
  });
@@ -19,7 +19,7 @@ Object.defineProperty(exports, "NumberLineComponent", {
19
19
  return _numberLine["default"];
20
20
  }
21
21
  });
22
- exports.tickUtils = exports.pointChooser = exports.dataConverter = exports["default"] = void 0;
22
+ exports.tickUtils = exports.pointChooser = exports["default"] = exports.dataConverter = void 0;
23
23
 
24
24
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
25
25
 
@@ -57,9 +57,13 @@ var _cloneDeep = _interopRequireDefault(require("lodash/cloneDeep"));
57
57
 
58
58
  var _mathRendering = require("@pie-lib/math-rendering");
59
59
 
60
+ 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); }
61
+
62
+ 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; }
63
+
60
64
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
61
65
 
62
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
66
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
63
67
 
64
68
  var NumberLine = /*#__PURE__*/function (_HTMLElement) {
65
69
  (0, _inherits2["default"])(NumberLine, _HTMLElement);
@@ -84,6 +88,9 @@ var NumberLine = /*#__PURE__*/function (_HTMLElement) {
84
88
  }
85
89
  }, {
86
90
  key: "session",
91
+ get: function get() {
92
+ return this._session;
93
+ },
87
94
  set: function set(s) {
88
95
  this._session = s;
89
96
 
@@ -188,7 +195,7 @@ var NumberLine = /*#__PURE__*/function (_HTMLElement) {
188
195
  }, {
189
196
  key: "_applyInitialElements",
190
197
  value: function _applyInitialElements() {
191
- if (this._model && this._model.graph && this._model.graph.initialElements && this._session && !this._session.answer) {
198
+ if (this._model && this._model.graph && this._model.graph.initialElements && this._session && (!this._session.answer || !this._session.answer.length)) {
192
199
  this._session.answer = (0, _cloneDeep["default"])(this._model.graph.initialElements);
193
200
  }
194
201
  }
@@ -199,6 +206,10 @@ var NumberLine = /*#__PURE__*/function (_HTMLElement) {
199
206
 
200
207
  try {
201
208
  if (this._model && this._session) {
209
+ if (!this._session.answer) {
210
+ this._applyInitialElements();
211
+ }
212
+
202
213
  var answer = (this._session.answer || []).map(dataConverter.toGraphFormat);
203
214
  var model = (0, _cloneDeep["default"])(this._model);
204
215
  model.correctResponse = model.correctResponse && model.correctResponse.map(dataConverter.toGraphFormat);
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.js"],"names":["NumberLine","m","_model","_applyInitialElements","_render","dispatch","s","_session","answer","length","type","dispatchEvent","CustomEvent","bubbles","detail","complete","isComplete","data","push","dispatchSessionChanged","index","el","position","Error","left","right","update","splice","indices","filter","v","some","d","pop","graph","initialElements","map","toGraphFormat","model","correctResponse","props","onAddElement","addElement","bind","onMoveElement","moveElement","onDeleteElements","deleteElements","onUndoElement","undoElement","onClearElements","clearElements","React","createElement","RootComponent","ReactDOM","render","e","HTMLElement"],"mappings":"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","sourcesContent":["import * as dataConverter from './data-converter';\nimport * as pointChooser from './number-line/point-chooser';\nimport * as tickUtils from './number-line/graph/tick-utils';\n\nimport {\n lineIsSwitched,\n switchGraphLine,\n toGraphFormat,\n toSessionFormat\n} from './data-converter';\n\nimport Graph from './number-line/graph';\nimport NumberLineComponent from './number-line';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport RootComponent from './number-line';\nimport cloneDeep from 'lodash/cloneDeep';\nimport { renderMath } from '@pie-lib/math-rendering';\n\n//Expose some additional modules for configuration\nexport { Graph, NumberLineComponent, tickUtils, dataConverter, pointChooser };\n\nexport default class NumberLine extends HTMLElement {\n constructor() {\n super();\n }\n\n set model(m) {\n this._model = m;\n this._applyInitialElements();\n this._render();\n this.dispatch('model-set');\n }\n\n set session(s) {\n this._session = s;\n this._applyInitialElements();\n this._render();\n }\n\n connectedCallback() {\n this._render();\n }\n\n isComplete() {\n return this._session ? (this._session.answer || []).length > 0 : false;\n }\n\n dispatch(type) {\n this.dispatchEvent(\n new CustomEvent(type, {\n bubbles: true,\n detail: {\n complete: this.isComplete()\n }\n })\n );\n }\n\n dispatchSessionChanged() {\n this.dispatch('session-changed');\n }\n\n addElement(data) {\n if (!this._session) {\n return;\n }\n\n this._session.answer = this._session.answer || [];\n this._session.answer.push(toSessionFormat(data));\n this.dispatchSessionChanged();\n this._render();\n }\n\n moveElement(index, el, position) {\n let answer = this._session.answer[index];\n\n if (!answer) {\n throw new Error('cant find element at index: ', index);\n }\n\n if (el.type === 'line' && position.left === position.right) {\n this._render();\n return;\n }\n\n //set the new position\n el.position = position;\n\n let update =\n el.type === 'line' && lineIsSwitched(el) ? switchGraphLine(el) : el;\n\n this._session.answer.splice(index, 1, toSessionFormat(update));\n\n this.dispatchSessionChanged();\n this._render();\n }\n\n deleteElements(indices) {\n this._session.answer = this._session.answer.filter((v, index) => {\n return !indices.some(d => d === index);\n });\n this.dispatchSessionChanged();\n this._render();\n }\n\n undoElement() {\n this._session.answer.pop();\n this.dispatchSessionChanged();\n this._render();\n }\n\n clearElements() {\n this._session.answer = [];\n this.dispatchSessionChanged();\n this._render();\n }\n\n _applyInitialElements() {\n if (\n this._model &&\n this._model.graph &&\n this._model.graph.initialElements &&\n this._session &&\n !this._session.answer\n ) {\n this._session.answer = cloneDeep(this._model.graph.initialElements);\n }\n }\n\n _render() {\n try {\n if (this._model && this._session) {\n let answer = (this._session.answer || []).map(toGraphFormat);\n let model = cloneDeep(this._model);\n model.correctResponse =\n model.correctResponse && model.correctResponse.map(toGraphFormat);\n\n let props = {\n model,\n answer,\n onAddElement: this.addElement.bind(this),\n onMoveElement: this.moveElement.bind(this),\n onDeleteElements: this.deleteElements.bind(this),\n onUndoElement: this.undoElement.bind(this),\n onClearElements: this.clearElements.bind(this)\n };\n\n let el = React.createElement(RootComponent, props);\n ReactDOM.render(el, this, () => {\n renderMath(this);\n });\n }\n } catch (e) {\n throw e;\n }\n }\n}\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../src/index.js"],"names":["NumberLine","m","_model","_applyInitialElements","_render","dispatch","_session","s","answer","length","type","dispatchEvent","CustomEvent","bubbles","detail","complete","isComplete","data","push","dispatchSessionChanged","index","el","position","Error","left","right","update","splice","indices","filter","v","some","d","pop","graph","initialElements","map","toGraphFormat","model","correctResponse","props","onAddElement","addElement","bind","onMoveElement","moveElement","onDeleteElements","deleteElements","onUndoElement","undoElement","onClearElements","clearElements","React","createElement","RootComponent","ReactDOM","render","e","HTMLElement"],"mappings":"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","sourcesContent":["import * as dataConverter from './data-converter';\nimport * as pointChooser from './number-line/point-chooser';\nimport * as tickUtils from './number-line/graph/tick-utils';\n\nimport {\n lineIsSwitched,\n switchGraphLine,\n toGraphFormat,\n toSessionFormat\n} from './data-converter';\n\nimport Graph from './number-line/graph';\nimport NumberLineComponent from './number-line';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport RootComponent from './number-line';\nimport cloneDeep from 'lodash/cloneDeep';\nimport { renderMath } from '@pie-lib/math-rendering';\n\n//Expose some additional modules for configuration\nexport { Graph, NumberLineComponent, tickUtils, dataConverter, pointChooser };\n\nexport default class NumberLine extends HTMLElement {\n constructor() {\n super();\n }\n\n set model(m) {\n this._model = m;\n this._applyInitialElements();\n this._render();\n this.dispatch('model-set');\n }\n\n set session(s) {\n this._session = s;\n this._applyInitialElements();\n this._render();\n }\n\n get session() {\n return this._session;\n }\n\n connectedCallback() {\n this._render();\n }\n\n isComplete() {\n return this._session ? (this._session.answer || []).length > 0 : false;\n }\n\n dispatch(type) {\n this.dispatchEvent(\n new CustomEvent(type, {\n bubbles: true,\n detail: {\n complete: this.isComplete()\n }\n })\n );\n }\n\n dispatchSessionChanged() {\n this.dispatch('session-changed');\n }\n\n addElement(data) {\n if (!this._session) {\n return;\n }\n\n this._session.answer = this._session.answer || [];\n this._session.answer.push(toSessionFormat(data));\n this.dispatchSessionChanged();\n this._render();\n }\n\n moveElement(index, el, position) {\n let answer = this._session.answer[index];\n\n if (!answer) {\n throw new Error('cant find element at index: ', index);\n }\n\n if (el.type === 'line' && position.left === position.right) {\n this._render();\n return;\n }\n\n //set the new position\n el.position = position;\n\n let update =\n el.type === 'line' && lineIsSwitched(el) ? switchGraphLine(el) : el;\n\n this._session.answer.splice(index, 1, toSessionFormat(update));\n\n this.dispatchSessionChanged();\n this._render();\n }\n\n deleteElements(indices) {\n this._session.answer = this._session.answer.filter((v, index) => {\n return !indices.some(d => d === index);\n });\n this.dispatchSessionChanged();\n this._render();\n }\n\n undoElement() {\n this._session.answer.pop();\n this.dispatchSessionChanged();\n this._render();\n }\n\n clearElements() {\n this._session.answer = [];\n this.dispatchSessionChanged();\n this._render();\n }\n\n _applyInitialElements() {\n if (\n this._model &&\n this._model.graph &&\n this._model.graph.initialElements &&\n this._session &&\n (!this._session.answer || !this._session.answer.length)\n ) {\n this._session.answer = cloneDeep(this._model.graph.initialElements);\n }\n }\n\n _render() {\n try {\n if (this._model && this._session) {\n if (!this._session.answer) {\n this._applyInitialElements();\n }\n\n let answer = (this._session.answer || []).map(toGraphFormat);\n let model = cloneDeep(this._model);\n model.correctResponse =\n model.correctResponse && model.correctResponse.map(toGraphFormat);\n\n let props = {\n model,\n answer,\n onAddElement: this.addElement.bind(this),\n onMoveElement: this.moveElement.bind(this),\n onDeleteElements: this.deleteElements.bind(this),\n onUndoElement: this.undoElement.bind(this),\n onClearElements: this.clearElements.bind(this)\n };\n\n let el = React.createElement(RootComponent, props);\n\n ReactDOM.render(el, this, () => {\n renderMath(this);\n });\n }\n } catch (e) {\n throw e;\n }\n }\n}\n"],"file":"index.js"}
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.incorrect = exports.correct = exports.selected = void 0;
6
+ exports.selected = exports.incorrect = exports.correct = void 0;
7
7
 
8
8
  var _renderUi = require("@pie-lib/render-ui");
9
9
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/number-line/feedback.jsx"],"names":["getIcon","t","NothingSubmitted","Correct","Incorrect","PartiallyCorrect","ShowRationale","undefined","Feedback","props","classes","type","className","feedback","Icon","width","message","__html","propTypes","PropTypes","number","string","object","isRequired","styles","marginTop","backgroundColor","padding","display","alignItems","height","margin","paddingLeft","userSelect","correct","color","incorrect"],"mappings":";;;;;;;;;AAAA;;AAOA;;AACA;;AAEA;;AACA;;AACA;;AACA;;AAEA,IAAIA,OAAO,GAAG,SAAVA,OAAU,CAAAC,CAAC,EAAI;AACjB,UAAQA,CAAR;AACE,SAAK,YAAL;AACE,aAAOC,uBAAP;;AACF,SAAK,SAAL;AACE,aAAOC,cAAP;;AACF,SAAK,WAAL;AACE,aAAOC,gBAAP;;AACF,SAAK,SAAL;AACE,aAAOC,uBAAP;;AACF,SAAK,MAAL;AACE,aAAOC,oBAAP;;AACF;AACE,aAAOC,SAAP;AAZJ;AAcD,CAfD;;AAiBA,IAAMC,QAAQ,GAAG,SAAXA,QAAW,CAAAC,KAAK,EAAI;AAAA,MAChBC,OADgB,GACED,KADF,CAChBC,OADgB;AAAA,MACPC,IADO,GACEF,KADF,CACPE,IADO;AAExB,MAAIC,SAAS,GAAG,4BAAWF,OAAO,CAACC,IAAD,CAAlB,EAA0BD,OAAO,CAACG,QAAlC,CAAhB;AACA,MAAIC,IAAI,GAAGd,OAAO,CAACS,KAAK,CAACE,IAAP,CAAlB;AAEA,sBACE,gCAAC,qCAAD,qBACE,gCAAC,mCAAD;AAAe,IAAA,UAAU,EAAE,IAA3B;AAAiC,IAAA,GAAG,EAAC,IAArC;AAA0C,IAAA,OAAO,EAAE;AAAnD,kBACE;AAAK,IAAA,GAAG,EAAC,OAAT;AAAiB,IAAA,SAAS,EAAEC,SAA5B;AAAuC,IAAA,KAAK,EAAE;AAAEG,MAAAA,KAAK,EAAEN,KAAK,CAACM;AAAf;AAA9C,kBACE,gCAAC,IAAD;AAAM,IAAA,OAAO,EAAC,OAAd;AAAsB,IAAA,KAAK,EAAC;AAA5B,IADF,eAEE;AACE,IAAA,SAAS,EAAEL,OAAO,CAACM,OADrB;AAEE,IAAA,uBAAuB,EAAE;AAAEC,MAAAA,MAAM,EAAER,KAAK,CAACO;AAAhB;AAF3B,IAFF,CADF,CADF,CADF;AAaD,CAlBD;;AAoBAR,QAAQ,CAACU,SAAT,GAAqB;AACnBH,EAAAA,KAAK,EAAEI,sBAAUC,MADE;AAEnBJ,EAAAA,OAAO,EAAEG,sBAAUE,MAFA;AAGnBX,EAAAA,OAAO,EAAES,sBAAUG,MAAV,CAAiBC,UAHP;AAInBZ,EAAAA,IAAI,EAAEQ,sBAAUE;AAJG,CAArB;AAOA,IAAMG,MAAM,GAAG;AACbX,EAAAA,QAAQ,EAAE;AACRY,IAAAA,SAAS,EAAE,MADH;AAERC,IAAAA,eAAe,EAAE,SAFT;AAGRC,IAAAA,OAAO,EAAE,MAHD;AAIRC,IAAAA,OAAO,EAAE,MAJD;AAKRC,IAAAA,UAAU,EAAE,QALJ;AAMR,aAAS;AACPC,MAAAA,MAAM,EAAE;AADD,KAND;AASR,YAAQ;AACNH,MAAAA,OAAO,EAAE,KADH;AAENI,MAAAA,MAAM,EAAE;AAFF;AATA,GADG;AAebf,EAAAA,OAAO,EAAE;AACPgB,IAAAA,WAAW,EAAE,KADN;AAEPC,IAAAA,UAAU,EAAE;AAFL,GAfI;AAmBbC,EAAAA,OAAO,EAAE;AACPR,IAAAA,eAAe,EAAES,gBAAMD,OAAN;AADV,GAnBI;AAsBbE,EAAAA,SAAS,EAAE;AACTV,IAAAA,eAAe,EAAES,gBAAMC,SAAN;AADR;AAtBE,CAAf;;eA2Be,0BAAYZ,MAAZ,EAAoBhB,QAApB,C","sourcesContent":["import {\n Correct,\n Incorrect,\n NothingSubmitted,\n PartiallyCorrect,\n ShowRationale\n} from '@pie-lib/icons';\nimport PropTypes from 'prop-types';\nimport { color } from '@pie-lib/render-ui';\n\nimport React from 'react';\nimport { TransitionGroup, CSSTransition } from 'react-transition-group';\nimport classNames from 'classnames';\nimport injectSheet from 'react-jss';\n\nlet getIcon = t => {\n switch (t) {\n case 'unanswered':\n return NothingSubmitted;\n case 'correct':\n return Correct;\n case 'incorrect':\n return Incorrect;\n case 'partial':\n return PartiallyCorrect;\n case 'info':\n return ShowRationale;\n default:\n return undefined;\n }\n};\n\nconst Feedback = props => {\n const { classes, type } = props;\n let className = classNames(classes[type], classes.feedback);\n let Icon = getIcon(props.type);\n\n return (\n <TransitionGroup>\n <CSSTransition classNames={'fb'} key=\"fb\" timeout={300}>\n <div key=\"panel\" className={className} style={{ width: props.width }}>\n <Icon iconSet=\"emoji\" shape=\"square\" />\n <span\n className={classes.message}\n dangerouslySetInnerHTML={{ __html: props.message }}\n />\n </div>\n </CSSTransition>\n </TransitionGroup>\n );\n};\n\nFeedback.propTypes = {\n width: PropTypes.number,\n message: PropTypes.string,\n classes: PropTypes.object.isRequired,\n type: PropTypes.string\n};\n\nconst styles = {\n feedback: {\n marginTop: '10px',\n backgroundColor: '#dddddd',\n padding: '10px',\n display: 'flex',\n alignItems: 'center',\n '& svg': {\n height: '30px'\n },\n '& h1': {\n padding: '0px',\n margin: '0px'\n }\n },\n message: {\n paddingLeft: '5px',\n userSelect: 'none'\n },\n correct: {\n backgroundColor: color.correct()\n },\n incorrect: {\n backgroundColor: color.incorrect()\n }\n};\n\nexport default injectSheet(styles)(Feedback);\n"],"file":"feedback.js"}
1
+ {"version":3,"sources":["../../src/number-line/feedback.jsx"],"names":["getIcon","t","NothingSubmitted","Correct","Incorrect","PartiallyCorrect","ShowRationale","undefined","Feedback","props","classes","type","className","feedback","Icon","width","message","__html","propTypes","PropTypes","number","string","object","isRequired","styles","marginTop","backgroundColor","padding","display","alignItems","height","margin","paddingLeft","userSelect","correct","color","incorrect"],"mappings":";;;;;;;;;AAAA;;AAOA;;AACA;;AAEA;;AACA;;AACA;;AACA;;AAEA,IAAIA,OAAO,GAAG,SAAVA,OAAU,CAAAC,CAAC,EAAI;AACjB,UAAQA,CAAR;AACE,SAAK,YAAL;AACE,aAAOC,uBAAP;;AACF,SAAK,SAAL;AACE,aAAOC,cAAP;;AACF,SAAK,WAAL;AACE,aAAOC,gBAAP;;AACF,SAAK,SAAL;AACE,aAAOC,uBAAP;;AACF,SAAK,MAAL;AACE,aAAOC,oBAAP;;AACF;AACE,aAAOC,SAAP;AAZJ;AAcD,CAfD;;AAiBA,IAAMC,QAAQ,GAAG,SAAXA,QAAW,CAAAC,KAAK,EAAI;AACxB,MAAQC,OAAR,GAA0BD,KAA1B,CAAQC,OAAR;AAAA,MAAiBC,IAAjB,GAA0BF,KAA1B,CAAiBE,IAAjB;AACA,MAAIC,SAAS,GAAG,4BAAWF,OAAO,CAACC,IAAD,CAAlB,EAA0BD,OAAO,CAACG,QAAlC,CAAhB;AACA,MAAIC,IAAI,GAAGd,OAAO,CAACS,KAAK,CAACE,IAAP,CAAlB;AAEA,sBACE,gCAAC,qCAAD,qBACE,gCAAC,mCAAD;AAAe,IAAA,UAAU,EAAE,IAA3B;AAAiC,IAAA,GAAG,EAAC,IAArC;AAA0C,IAAA,OAAO,EAAE;AAAnD,kBACE;AAAK,IAAA,GAAG,EAAC,OAAT;AAAiB,IAAA,SAAS,EAAEC,SAA5B;AAAuC,IAAA,KAAK,EAAE;AAAEG,MAAAA,KAAK,EAAEN,KAAK,CAACM;AAAf;AAA9C,kBACE,gCAAC,IAAD;AAAM,IAAA,OAAO,EAAC,OAAd;AAAsB,IAAA,KAAK,EAAC;AAA5B,IADF,eAEE;AACE,IAAA,SAAS,EAAEL,OAAO,CAACM,OADrB;AAEE,IAAA,uBAAuB,EAAE;AAAEC,MAAAA,MAAM,EAAER,KAAK,CAACO;AAAhB;AAF3B,IAFF,CADF,CADF,CADF;AAaD,CAlBD;;AAoBAR,QAAQ,CAACU,SAAT,GAAqB;AACnBH,EAAAA,KAAK,EAAEI,sBAAUC,MADE;AAEnBJ,EAAAA,OAAO,EAAEG,sBAAUE,MAFA;AAGnBX,EAAAA,OAAO,EAAES,sBAAUG,MAAV,CAAiBC,UAHP;AAInBZ,EAAAA,IAAI,EAAEQ,sBAAUE;AAJG,CAArB;AAOA,IAAMG,MAAM,GAAG;AACbX,EAAAA,QAAQ,EAAE;AACRY,IAAAA,SAAS,EAAE,MADH;AAERC,IAAAA,eAAe,EAAE,SAFT;AAGRC,IAAAA,OAAO,EAAE,MAHD;AAIRC,IAAAA,OAAO,EAAE,MAJD;AAKRC,IAAAA,UAAU,EAAE,QALJ;AAMR,aAAS;AACPC,MAAAA,MAAM,EAAE;AADD,KAND;AASR,YAAQ;AACNH,MAAAA,OAAO,EAAE,KADH;AAENI,MAAAA,MAAM,EAAE;AAFF;AATA,GADG;AAebf,EAAAA,OAAO,EAAE;AACPgB,IAAAA,WAAW,EAAE,KADN;AAEPC,IAAAA,UAAU,EAAE;AAFL,GAfI;AAmBbC,EAAAA,OAAO,EAAE;AACPR,IAAAA,eAAe,EAAES,gBAAMD,OAAN;AADV,GAnBI;AAsBbE,EAAAA,SAAS,EAAE;AACTV,IAAAA,eAAe,EAAES,gBAAMC,SAAN;AADR;AAtBE,CAAf;;eA2Be,0BAAYZ,MAAZ,EAAoBhB,QAApB,C","sourcesContent":["import {\n Correct,\n Incorrect,\n NothingSubmitted,\n PartiallyCorrect,\n ShowRationale\n} from '@pie-lib/icons';\nimport PropTypes from 'prop-types';\nimport { color } from '@pie-lib/render-ui';\n\nimport React from 'react';\nimport { TransitionGroup, CSSTransition } from 'react-transition-group';\nimport classNames from 'classnames';\nimport injectSheet from 'react-jss';\n\nlet getIcon = t => {\n switch (t) {\n case 'unanswered':\n return NothingSubmitted;\n case 'correct':\n return Correct;\n case 'incorrect':\n return Incorrect;\n case 'partial':\n return PartiallyCorrect;\n case 'info':\n return ShowRationale;\n default:\n return undefined;\n }\n};\n\nconst Feedback = props => {\n const { classes, type } = props;\n let className = classNames(classes[type], classes.feedback);\n let Icon = getIcon(props.type);\n\n return (\n <TransitionGroup>\n <CSSTransition classNames={'fb'} key=\"fb\" timeout={300}>\n <div key=\"panel\" className={className} style={{ width: props.width }}>\n <Icon iconSet=\"emoji\" shape=\"square\" />\n <span\n className={classes.message}\n dangerouslySetInnerHTML={{ __html: props.message }}\n />\n </div>\n </CSSTransition>\n </TransitionGroup>\n );\n};\n\nFeedback.propTypes = {\n width: PropTypes.number,\n message: PropTypes.string,\n classes: PropTypes.object.isRequired,\n type: PropTypes.string\n};\n\nconst styles = {\n feedback: {\n marginTop: '10px',\n backgroundColor: '#dddddd',\n padding: '10px',\n display: 'flex',\n alignItems: 'center',\n '& svg': {\n height: '30px'\n },\n '& h1': {\n padding: '0px',\n margin: '0px'\n }\n },\n message: {\n paddingLeft: '5px',\n userSelect: 'none'\n },\n correct: {\n backgroundColor: color.correct()\n },\n incorrect: {\n backgroundColor: color.incorrect()\n }\n};\n\nexport default injectSheet(styles)(Feedback);\n"],"file":"feedback.js"}