@pie-element/number-line 5.11.2 → 5.11.3-next.1008
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +189 -0
- package/configure/CHANGELOG.md +142 -0
- package/configure/lib/arrows.js +3 -3
- package/configure/lib/arrows.js.map +1 -1
- package/configure/lib/card-bar.js +9 -2
- package/configure/lib/card-bar.js.map +1 -1
- package/configure/lib/defaults.js +7 -1
- package/configure/lib/defaults.js.map +1 -1
- package/configure/lib/domain.js +3 -3
- package/configure/lib/domain.js.map +1 -1
- package/configure/lib/index.js +40 -7
- package/configure/lib/index.js.map +1 -1
- package/configure/lib/main.js +90 -15
- package/configure/lib/main.js.map +1 -1
- package/configure/lib/number-text-field.js +4 -4
- package/configure/lib/number-text-field.js.map +1 -1
- package/configure/lib/point-config.js +3 -3
- package/configure/lib/point-config.js.map +1 -1
- package/configure/lib/size.js +2 -2
- package/configure/lib/size.js.map +1 -1
- package/configure/lib/ticks.js +8 -4
- package/configure/lib/ticks.js.map +1 -1
- package/configure/lib/utils.js +14 -0
- package/configure/lib/utils.js.map +1 -0
- package/configure/package.json +3 -3
- package/controller/CHANGELOG.md +32 -0
- package/controller/lib/defaults.js +0 -3
- package/controller/lib/defaults.js.map +1 -1
- package/controller/lib/index.js +89 -9
- package/controller/lib/index.js.map +1 -1
- package/controller/package.json +1 -1
- package/docs/config-schema.json +16 -0
- package/docs/config-schema.json.md +12 -0
- package/docs/demo/generate.js +2 -4
- package/docs/pie-schema.json +29 -1
- package/docs/pie-schema.json.md +23 -0
- package/lib/data-converter.js +1 -1
- package/lib/data-converter.js.map +1 -1
- package/lib/draggable/index.js +1 -1
- package/lib/index.js +16 -5
- package/lib/index.js.map +1 -1
- package/lib/number-line/colors.js +1 -1
- package/lib/number-line/feedback.js.map +1 -1
- package/lib/number-line/graph/elements/line.js +3 -3
- package/lib/number-line/graph/elements/line.js.map +1 -1
- package/lib/number-line/graph/elements/point.js +1 -1
- package/lib/number-line/graph/elements/point.js.map +1 -1
- package/lib/number-line/graph/elements/ray.js +12 -5
- package/lib/number-line/graph/elements/ray.js.map +1 -1
- package/lib/number-line/graph/index.js +6 -4
- package/lib/number-line/graph/index.js.map +1 -1
- package/lib/number-line/graph/stacks.js +1 -1
- package/lib/number-line/graph/stacks.js.map +1 -1
- package/lib/number-line/graph/tick-utils.js +11 -7
- package/lib/number-line/graph/tick-utils.js.map +1 -1
- package/lib/number-line/graph/ticks.js +58 -14
- package/lib/number-line/graph/ticks.js.map +1 -1
- package/lib/number-line/index.js +10 -9
- package/lib/number-line/index.js.map +1 -1
- package/lib/number-line/point-chooser/index.js +1 -1
- package/lib/number-line/point-chooser/index.js.map +1 -1
- package/lib/number-line/transitions/fade.js.map +1 -1
- package/package.json +5 -5
- package/module/configure.js +0 -1335
- package/module/controller.js +0 -22387
- package/module/demo.js +0 -134
- package/module/element.js +0 -10272
- package/module/index.html +0 -16
- package/module/manifest.json +0 -14
package/controller/lib/index.js
CHANGED
|
@@ -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.
|
|
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.
|
|
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
|
|
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]
|
|
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 =
|
|
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"}
|
package/controller/package.json
CHANGED
package/docs/config-schema.json
CHANGED
|
@@ -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
|
package/docs/demo/generate.js
CHANGED
|
@@ -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.
|
|
83
|
+
minor: 0.041666665,
|
|
86
84
|
},
|
|
87
85
|
domain: {
|
|
88
86
|
min: 0,
|
package/docs/pie-schema.json
CHANGED
|
@@ -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"
|
package/docs/pie-schema.json.md
CHANGED
|
@@ -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:
|
package/lib/data-converter.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.
|
|
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":";;;;;;;AAAO,IAAMA,cAAc,GAAG,SAAjBA,cAAiB,CAACC,IAAD,EAAU;
|
|
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"}
|
package/lib/draggable/index.js
CHANGED
|
@@ -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 {
|
|
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
|
|
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 {
|
|
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","
|
|
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"}
|
|
@@ -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;
|
|
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"}
|