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