@pie-element/graphing-solution-set 4.3.4-next.0 → 5.0.0-beta.0

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.
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
@@ -10,241 +9,189 @@ exports.model = model;
10
9
  exports.normalize = void 0;
11
10
  exports.outcome = outcome;
12
11
  exports.validate = void 0;
13
-
14
- var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
15
-
16
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
17
-
18
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
19
-
20
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
21
-
22
12
  var _debug = _interopRequireDefault(require("debug"));
23
-
24
13
  var _cloneDeep = _interopRequireDefault(require("lodash/cloneDeep"));
25
-
26
14
  var _uniqWith = _interopRequireDefault(require("lodash/uniqWith"));
27
-
28
15
  var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
29
-
30
16
  var _defaults = _interopRequireDefault(require("./defaults"));
31
-
32
17
  var _utils = require("./utils");
18
+ const log = (0, _debug.default)('@pie-element:graphing-solution-set:controller');
19
+ const initializeGraphMap = () => ({
20
+ line: []
21
+ });
33
22
 
34
- var _excluded = ["defaultTool", "extraCSSRules", "prompt", "promptEnabled", "graph", "answers", "toolbarTools"];
35
-
36
- 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; }
37
-
38
- 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; }
39
-
40
- var log = (0, _debug["default"])('@pie-element:graphing-solution-set:controller');
41
-
42
- var initializeGraphMap = function initializeGraphMap() {
43
- return {
44
- line: []
45
- };
46
- };
47
23
  /*
48
24
  * Function to compare two marks
49
25
  * @param {Object} mark1 - first mark
50
26
  * @param {Object} mark2 - second mark
51
27
  * */
52
-
53
-
54
- var compareMarks = function compareMarks(mark1, mark2) {
28
+ const compareMarks = (mark1, mark2) => {
55
29
  // marks can be compared with equalMarks[type] function only if they have the same type;
56
30
  // if type is different, they are clearly not equal
57
31
  return !!(mark1 && mark2 && mark1.type === mark2.type && _utils.equalMarks[mark1.type] && _utils.equalMarks[mark1.type](mark1, mark2));
58
32
  };
33
+
59
34
  /*
60
35
  * Function to get the corrected answer
61
36
  * @param {Object} sessionAnswers - array of marks from session
62
37
  * @param {Object} marks - array of marks from correct answer
63
38
  * */
64
-
65
-
66
39
  exports.compareMarks = compareMarks;
67
-
68
- var getAnswerCorrected = function getAnswerCorrected(_ref) {
69
- var sessionAnswers = _ref.sessionAnswers,
70
- correctAnswers = _ref.marks;
40
+ const getAnswerCorrected = ({
41
+ sessionAnswers,
42
+ marks: correctAnswers
43
+ }) => {
71
44
  sessionAnswers = sessionAnswers || [];
72
45
  correctAnswers = correctAnswers || [];
73
- var rez = (0, _cloneDeep["default"])(sessionAnswers).reduce(function (correctedAnswer, answer) {
74
- var answerIsCorrect = correctAnswers.find(function (mark) {
75
- return compareMarks(answer, mark);
76
- });
46
+ const rez = (0, _cloneDeep.default)(sessionAnswers).reduce((correctedAnswer, answer) => {
47
+ const answerIsCorrect = correctAnswers.find(mark => compareMarks(answer, mark));
77
48
  answer.correctness = answerIsCorrect ? 'correct' : 'incorrect';
78
- return [].concat((0, _toConsumableArray2["default"])(correctedAnswer), [answer]);
79
- }, []); // add missing objects from correct answer
80
-
81
- var missingAnswers = (0, _cloneDeep["default"])(correctAnswers).reduce(function (correctedAnswer, answer) {
82
- var answerIndex = sessionAnswers.find(function (mark) {
83
- return compareMarks(answer, mark);
84
- });
85
-
49
+ return [...correctedAnswer, answer];
50
+ }, []);
51
+ // add missing objects from correct answer
52
+ const missingAnswers = (0, _cloneDeep.default)(correctAnswers).reduce((correctedAnswer, answer) => {
53
+ const answerIndex = sessionAnswers.find(mark => compareMarks(answer, mark));
86
54
  if (!answerIndex) {
87
55
  // means that corrected answer is missing from session, so we mark it as missing object
88
- return [].concat((0, _toConsumableArray2["default"])(correctedAnswer), [_objectSpread(_objectSpread({}, answer), {}, {
56
+ return [...correctedAnswer, {
57
+ ...answer,
89
58
  correctness: 'missing'
90
- })]);
59
+ }];
91
60
  }
92
-
93
61
  return correctedAnswer;
94
62
  }, []);
95
- return [].concat((0, _toConsumableArray2["default"])(rez), (0, _toConsumableArray2["default"])(missingAnswers));
63
+ return [...rez, ...missingAnswers];
96
64
  };
65
+
97
66
  /*
98
67
  * Function to get the best answer
99
68
  * @param {Object} question - question object
100
69
  * @param {Object} session - session object
101
70
  * @param {Object} env - env object
102
71
  * */
103
-
104
-
105
72
  exports.getAnswerCorrected = getAnswerCorrected;
106
-
107
- var getBestAnswer = function getBestAnswer(question, session) {
108
- var env = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
109
-
73
+ const getBestAnswer = (question, session, env = {}) => {
110
74
  // questionPossibleAnswers contains all possible answers (correct response and alternates);
111
- var _ref2 = question || {},
112
- _ref2$answers = _ref2.answers,
113
- questionPossibleAnswers = _ref2$answers === void 0 ? {} : _ref2$answers,
114
- scoringType = _ref2.scoringType;
115
-
116
- var _ref3 = session || {},
117
- answer = _ref3.answer; // filter the incomplete objects
118
-
119
-
120
- Object.entries(questionPossibleAnswers || {}).forEach(function (_ref4) {
121
- var _ref5 = (0, _slicedToArray2["default"])(_ref4, 2),
122
- key = _ref5[0],
123
- value = _ref5[1];
124
-
125
- return questionPossibleAnswers[key] = _objectSpread(_objectSpread({}, value), {}, {
126
- marks: value === null || value === void 0 ? void 0 : value.marks.filter(function (mark) {
127
- return !mark.building;
128
- })
129
- });
130
- }); // initialize answer if no values
131
-
132
- answer = answer || []; // initialize one possible answer if no values
133
-
134
- if ((0, _isEmpty["default"])(questionPossibleAnswers)) {
75
+ let {
76
+ answers: questionPossibleAnswers = {},
77
+ scoringType
78
+ } = question || {};
79
+ let {
80
+ answer
81
+ } = session || {};
82
+ // filter the incomplete objects
83
+ Object.entries(questionPossibleAnswers || {}).forEach(([key, value]) => questionPossibleAnswers[key] = {
84
+ ...value,
85
+ marks: value?.marks.filter(mark => !mark.building)
86
+ });
87
+ // initialize answer if no values
88
+ answer = answer || [];
89
+ // initialize one possible answer if no values
90
+ if ((0, _isEmpty.default)(questionPossibleAnswers)) {
135
91
  questionPossibleAnswers = {
136
92
  correctAnswer: initializeGraphMap()
137
93
  };
138
94
  } else {
139
- questionPossibleAnswers = _objectSpread({
140
- correctAnswer: questionPossibleAnswers.correctAnswer
141
- }, (0, _utils.sortedAnswers)(questionPossibleAnswers));
142
- } // student's answers without DUPLICATES
143
-
144
-
145
- var sessionAnswers = (0, _uniqWith["default"])(answer, compareMarks); // array of possible answers entries
146
-
147
- var possibleAnswers = Object.entries(questionPossibleAnswers);
148
- return possibleAnswers.reduce(function (acc, entry) {
95
+ questionPossibleAnswers = {
96
+ correctAnswer: questionPossibleAnswers.correctAnswer,
97
+ ...(0, _utils.sortedAnswers)(questionPossibleAnswers)
98
+ };
99
+ }
100
+ // student's answers without DUPLICATES
101
+ const sessionAnswers = (0, _uniqWith.default)(answer, compareMarks);
102
+ // array of possible answers entries
103
+ const possibleAnswers = Object.entries(questionPossibleAnswers);
104
+ return possibleAnswers.reduce((acc, entry) => {
149
105
  // iterating each possible answer (main + alternates)
150
- var possibleAnswerKey = entry[0];
151
- var possibleAnswer = entry[1] || {};
152
- var marks = possibleAnswer.marks;
153
-
106
+ const possibleAnswerKey = entry[0];
107
+ const possibleAnswer = entry[1] || {};
108
+ let {
109
+ marks
110
+ } = possibleAnswer;
154
111
  if (!marks || !marks.length) {
155
112
  return acc;
156
- } // returns array of marks, each having 'correctness' property
157
-
158
-
159
- var correctedAnswer = getAnswerCorrected({
160
- sessionAnswers: sessionAnswers,
161
- marks: marks
113
+ }
114
+ // returns array of marks, each having 'correctness' property
115
+ const correctedAnswer = getAnswerCorrected({
116
+ sessionAnswers,
117
+ marks
162
118
  });
163
- var correctMarks = correctedAnswer.filter(function (answer) {
164
- return answer.correctness === 'correct';
165
- }); // filter out missing objects because they do not affect the calculation of the score
119
+ const correctMarks = correctedAnswer.filter(answer => answer.correctness === 'correct');
120
+ // filter out missing objects because they do not affect the calculation of the score
166
121
  // only correct and incorrect are needed
167
-
168
- var scoredCorrectedAnswer = correctedAnswer.filter(function (answer) {
169
- return answer.correctness !== 'missing';
170
- });
171
- var maxScore = marks.length;
172
- var score = correctMarks.length; // if extra placements
173
-
122
+ const scoredCorrectedAnswer = correctedAnswer.filter(answer => answer.correctness !== 'missing');
123
+ const maxScore = marks.length;
124
+ let score = correctMarks.length;
125
+ // if extra placements
174
126
  if (scoredCorrectedAnswer.length > maxScore) {
175
127
  score -= scoredCorrectedAnswer.length - maxScore;
176
128
  }
177
-
178
129
  if (score < 0) {
179
130
  score = 0;
180
131
  }
181
-
182
132
  if (score / maxScore > acc.bestScore || !acc.foundOneSolution) {
183
133
  acc.bestScore = Math.floor(score / maxScore);
184
134
  acc.bestScoreAnswerKey = possibleAnswerKey;
185
135
  acc.answersCorrected = correctedAnswer;
186
136
  acc.foundOneSolution = true;
187
137
  }
188
-
189
138
  return acc;
190
139
  }, {
191
140
  bestScore: 0,
192
141
  bestScoreAnswerKey: null,
193
142
  // initially we just suppose all the answers are incorrect
194
- answersCorrected: (0, _cloneDeep["default"])(sessionAnswers).map(function (answer) {
195
- return _objectSpread(_objectSpread({}, answer), {}, {
196
- correctness: 'incorrect'
197
- });
198
- }),
143
+ answersCorrected: (0, _cloneDeep.default)(sessionAnswers).map(answer => ({
144
+ ...answer,
145
+ correctness: 'incorrect'
146
+ })),
199
147
  foundOneSolution: false
200
148
  });
201
149
  };
150
+
202
151
  /*
203
152
  * Constant normalize
204
153
  * @param {Object} question - question object
205
154
  * */
206
-
207
-
208
155
  exports.getBestAnswer = getBestAnswer;
156
+ const normalize = question => ({
157
+ ..._defaults.default,
158
+ ...question
159
+ });
209
160
 
210
- var normalize = function normalize(question) {
211
- return _objectSpread(_objectSpread({}, _defaults["default"]), question);
212
- };
213
161
  /*
214
162
  * Function to set model
215
163
  * @param {Object} question - question object
216
164
  * @param {Object} session - session object
217
165
  * @param {Object} env - env object
218
166
  * */
219
-
220
-
221
167
  exports.normalize = normalize;
222
-
223
168
  function model(question, session, env) {
224
- return new Promise(function (resolve) {
225
- var normalizedQuestion = normalize(question); // ensure removing of invalid answers
169
+ return new Promise(resolve => {
170
+ const normalizedQuestion = normalize(question);
171
+ // ensure removing of invalid answers
226
172
  // need this if undo redo was last operation
227
-
228
- session.answer = (0, _utils.removeInvalidAnswers)(session.answer); // console.log('normalizedQuestion', normalizedQuestion);
229
-
230
- var _ref6 = normalizedQuestion || {},
231
- defaultTool = _ref6.defaultTool,
232
- extraCSSRules = _ref6.extraCSSRules,
233
- prompt = _ref6.prompt,
234
- promptEnabled = _ref6.promptEnabled,
235
- graph = _ref6.graph,
236
- answers = _ref6.answers,
237
- toolbarTools = _ref6.toolbarTools,
238
- questionProps = (0, _objectWithoutProperties2["default"])(_ref6, _excluded);
239
-
240
- var arrows = normalizedQuestion.arrows;
241
-
242
- var _ref7 = env || {},
243
- mode = _ref7.mode,
244
- role = _ref7.role; // This is used for offering support for old models which have the property arrows: boolean
173
+ session.answer = (0, _utils.removeInvalidAnswers)(session.answer);
174
+ // console.log('normalizedQuestion', normalizedQuestion);
175
+ const {
176
+ defaultTool,
177
+ extraCSSRules,
178
+ prompt,
179
+ promptEnabled,
180
+ graph,
181
+ answers,
182
+ toolbarTools,
183
+ ...questionProps
184
+ } = normalizedQuestion || {};
185
+ let {
186
+ arrows
187
+ } = normalizedQuestion;
188
+ const {
189
+ mode,
190
+ role
191
+ } = env || {};
192
+
193
+ // This is used for offering support for old models which have the property arrows: boolean
245
194
  // Same thing is set in authoring : packages/graphing/configure/src/configure.jsx - componentDidMount
246
-
247
-
248
195
  if (typeof arrows === 'boolean') {
249
196
  if (arrows) {
250
197
  arrows = {
@@ -262,40 +209,38 @@ function model(question, session, env) {
262
209
  };
263
210
  }
264
211
  }
265
-
266
- var base = _objectSpread(_objectSpread({}, questionProps), {}, {
267
- answers: answers,
268
- arrows: arrows,
212
+ const base = {
213
+ ...questionProps,
214
+ answers,
215
+ arrows,
269
216
  defaultTool: 'line',
270
217
  disabled: env.mode !== 'gather',
271
218
  prompt: promptEnabled ? prompt : null,
272
219
  rationale: null,
273
220
  size: graph,
274
- showToggle: env.mode === 'evaluate' && !(0, _isEmpty["default"])(answers) && answers.correctAnswer && answers.correctAnswer.marks && !(0, _isEmpty["default"])(answers.correctAnswer.marks),
221
+ showToggle: env.mode === 'evaluate' && !(0, _isEmpty.default)(answers) && answers.correctAnswer && answers.correctAnswer.marks && !(0, _isEmpty.default)(answers.correctAnswer.marks),
275
222
  teacherInstructions: null,
276
- toolbarTools: toolbarTools,
277
- extraCSSRules: extraCSSRules
278
- });
279
-
223
+ toolbarTools,
224
+ extraCSSRules
225
+ };
280
226
  if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {
281
- var _ref8 = normalizedQuestion || {},
282
- rationale = _ref8.rationale,
283
- rationaleEnabled = _ref8.rationaleEnabled,
284
- teacherInstructions = _ref8.teacherInstructions,
285
- teacherInstructionsEnabled = _ref8.teacherInstructionsEnabled;
286
-
227
+ const {
228
+ rationale,
229
+ rationaleEnabled,
230
+ teacherInstructions,
231
+ teacherInstructionsEnabled
232
+ } = normalizedQuestion || {};
287
233
  base.rationale = rationaleEnabled ? rationale : null;
288
234
  base.teacherInstructions = teacherInstructionsEnabled ? teacherInstructions : null;
289
235
  }
290
-
291
236
  if (mode === 'evaluate') {
292
- if (!(0, _isEmpty["default"])(answers) && answers.correctAnswer && answers.correctAnswer.marks && !(0, _isEmpty["default"])(answers.correctAnswer.marks)) {
293
- var _getBestAnswer = getBestAnswer(normalizedQuestion, session, env),
294
- answersCorrected = _getBestAnswer.answersCorrected,
295
- bestScoreAnswerKey = _getBestAnswer.bestScoreAnswerKey,
296
- bestScore = _getBestAnswer.bestScore; // array of marks from session with 'correctness' property set
297
-
298
-
237
+ if (!(0, _isEmpty.default)(answers) && answers.correctAnswer && answers.correctAnswer.marks && !(0, _isEmpty.default)(answers.correctAnswer.marks)) {
238
+ const {
239
+ answersCorrected,
240
+ bestScoreAnswerKey,
241
+ bestScore
242
+ } = getBestAnswer(normalizedQuestion, session, env);
243
+ // array of marks from session with 'correctness' property set
299
244
  base.answersCorrected = answersCorrected;
300
245
  base.correctResponse = bestScoreAnswerKey ? (answers[bestScoreAnswerKey] || {}).marks : [];
301
246
  base.showToggle = base.showToggle && bestScore !== 1;
@@ -304,63 +249,55 @@ function model(question, session, env) {
304
249
  base.correctResponse = [];
305
250
  }
306
251
  }
307
-
308
252
  log('base: ', base);
309
253
  resolve(base);
310
254
  });
311
255
  }
256
+
312
257
  /*
313
258
  * Function to check the outcome
314
259
  * @param {Object} question - question object
315
260
  * @param {Object} session - session object
316
261
  * @param {Object} env - env object
317
262
  * */
318
-
319
-
320
- function outcome(question, session) {
321
- var env = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
322
- return new Promise(function (resolve) {
323
- if (!session || (0, _isEmpty["default"])(session)) {
263
+ function outcome(question, session, env = {}) {
264
+ return new Promise(resolve => {
265
+ if (!session || (0, _isEmpty.default)(session)) {
324
266
  resolve({
325
267
  score: 0,
326
268
  empty: true
327
269
  });
328
270
  }
329
-
330
- if (env.mode !== 'evaluate' || (0, _isEmpty["default"])(question.answers) || question.answers && question.answers.correctAnswer && (0, _isEmpty["default"])(question.answers.correctAnswer.marks)) {
271
+ if (env.mode !== 'evaluate' || (0, _isEmpty.default)(question.answers) || question.answers && question.answers.correctAnswer && (0, _isEmpty.default)(question.answers.correctAnswer.marks)) {
331
272
  resolve({
332
273
  score: 0
333
274
  });
334
275
  }
335
-
336
- var _getBestAnswer2 = getBestAnswer(question, session, env),
337
- bestScore = _getBestAnswer2.bestScore;
338
-
276
+ const {
277
+ bestScore
278
+ } = getBestAnswer(question, session, env);
339
279
  resolve({
340
280
  score: bestScore
341
281
  });
342
282
  });
343
283
  }
284
+
344
285
  /*
345
286
  * Constant to create correct response session
346
287
  * @param {Object} question - question object
347
288
  * @param {Object} env - env object
348
289
  * */
349
-
350
-
351
- var createCorrectResponseSession = function createCorrectResponseSession(question, env) {
352
- return new Promise(function (resolve) {
290
+ const createCorrectResponseSession = (question, env) => {
291
+ return new Promise(resolve => {
353
292
  if (env.mode !== 'evaluate' && env.role === 'instructor') {
354
- var _ref9 = question || {},
355
- answers = _ref9.answers;
356
-
357
- var marks = [];
358
-
293
+ const {
294
+ answers
295
+ } = question || {};
296
+ let marks = [];
359
297
  if (answers && Object.values(answers)) {
360
- var correctAnswer = answers.correctAnswer || Object.values(answers)[0] || {};
298
+ const correctAnswer = answers.correctAnswer || Object.values(answers)[0] || {};
361
299
  marks = correctAnswer.marks || [];
362
300
  }
363
-
364
301
  resolve({
365
302
  answer: marks,
366
303
  id: '1'
@@ -370,22 +307,20 @@ var createCorrectResponseSession = function createCorrectResponseSession(questio
370
307
  }
371
308
  });
372
309
  };
310
+
373
311
  /*
374
312
  * Constant to validate model before saving item
375
313
  * @param {Object} model - model object
376
314
  * */
377
-
378
-
379
315
  exports.createCorrectResponseSession = createCorrectResponseSession;
380
-
381
- var validate = function validate() {
382
- var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
383
- var answers = model.answers,
384
- gssLineData = model.gssLineData;
385
- var errors = {};
386
- var correctAnswerErrors = {};
387
- var found = false;
388
-
316
+ const validate = (model = {}) => {
317
+ const {
318
+ answers,
319
+ gssLineData
320
+ } = model;
321
+ const errors = {};
322
+ const correctAnswerErrors = {};
323
+ let found = false;
389
324
  if (gssLineData.numberOfLines === 1) {
390
325
  if (answers.correctAnswer.marks.length < 1) {
391
326
  found = true;
@@ -405,21 +340,14 @@ var validate = function validate() {
405
340
  }
406
341
  }
407
342
  }
408
-
409
- var polygon = answers.correctAnswer.marks.find(function (mark) {
410
- return mark.type === 'polygon';
411
- });
412
-
343
+ let polygon = answers.correctAnswer.marks.find(mark => mark.type === 'polygon');
413
344
  if (!found && (!gssLineData.selectedTool === 'solutionSet' || !polygon)) {
414
345
  correctAnswerErrors.correctAnswer = 'Please select a solution set for the graphing solution set item.';
415
346
  }
416
-
417
- if (!(0, _isEmpty["default"])(correctAnswerErrors)) {
347
+ if (!(0, _isEmpty.default)(correctAnswerErrors)) {
418
348
  errors.correctAnswerErrors = correctAnswerErrors;
419
349
  }
420
-
421
350
  return errors;
422
351
  };
423
-
424
352
  exports.validate = validate;
425
353
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.js"],"names":["log","initializeGraphMap","line","compareMarks","mark1","mark2","type","equalMarks","getAnswerCorrected","sessionAnswers","correctAnswers","marks","rez","reduce","correctedAnswer","answer","answerIsCorrect","find","mark","correctness","missingAnswers","answerIndex","getBestAnswer","question","session","env","answers","questionPossibleAnswers","scoringType","Object","entries","forEach","key","value","filter","building","correctAnswer","possibleAnswers","acc","entry","possibleAnswerKey","possibleAnswer","length","correctMarks","scoredCorrectedAnswer","maxScore","score","bestScore","foundOneSolution","Math","floor","bestScoreAnswerKey","answersCorrected","map","normalize","defaults","model","Promise","resolve","normalizedQuestion","defaultTool","extraCSSRules","prompt","promptEnabled","graph","toolbarTools","questionProps","arrows","mode","role","left","right","up","down","base","disabled","rationale","size","showToggle","teacherInstructions","rationaleEnabled","teacherInstructionsEnabled","correctResponse","outcome","empty","createCorrectResponseSession","values","id","validate","gssLineData","errors","correctAnswerErrors","found","numberOfLines","polygon","selectedTool"],"mappings":"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","sourcesContent":["import debug from 'debug';\nimport cloneDeep from 'lodash/cloneDeep';\nimport uniqWith from 'lodash/uniqWith';\nimport isEmpty from 'lodash/isEmpty';\nimport defaults from './defaults';\nimport { equalMarks, sortedAnswers, removeInvalidAnswers } from './utils';\n\nconst log = debug('@pie-element:graphing-solution-set:controller');\n\nconst initializeGraphMap = () => ({\n line: [],\n});\n\n/*\n * Function to compare two marks\n * @param {Object} mark1 - first mark\n * @param {Object} mark2 - second mark\n * */\nexport const compareMarks = (mark1, mark2) => {\n // marks can be compared with equalMarks[type] function only if they have the same type;\n // if type is different, they are clearly not equal\n return !!(\n mark1 &&\n mark2 &&\n mark1.type === mark2.type &&\n equalMarks[mark1.type] &&\n equalMarks[mark1.type](mark1, mark2)\n );\n};\n\n/*\n * Function to get the corrected answer\n * @param {Object} sessionAnswers - array of marks from session\n * @param {Object} marks - array of marks from correct answer\n * */\nexport const getAnswerCorrected = ({ sessionAnswers, marks: correctAnswers }) => {\n sessionAnswers = sessionAnswers || [];\n correctAnswers = correctAnswers || [];\n const rez = cloneDeep(sessionAnswers).reduce((correctedAnswer, answer) => {\n const answerIsCorrect = correctAnswers.find((mark) => compareMarks(answer, mark));\n answer.correctness = answerIsCorrect ? 'correct' : 'incorrect';\n return [...correctedAnswer, answer];\n }, []);\n // add missing objects from correct answer\n const missingAnswers = cloneDeep(correctAnswers).reduce((correctedAnswer, answer) => {\n const answerIndex = sessionAnswers.find((mark) => compareMarks(answer, mark));\n if (!answerIndex) {\n // means that corrected answer is missing from session, so we mark it as missing object\n return [...correctedAnswer, { ...answer, correctness: 'missing' }];\n }\n return correctedAnswer;\n }, []);\n return [...rez, ...missingAnswers];\n};\n\n/*\n * Function to get the best answer\n * @param {Object} question - question object\n * @param {Object} session - session object\n * @param {Object} env - env object\n * */\nexport const getBestAnswer = (question, session, env = {}) => {\n // questionPossibleAnswers contains all possible answers (correct response and alternates);\n let { answers: questionPossibleAnswers = {}, scoringType } = question || {};\n let { answer } = session || {};\n // filter the incomplete objects\n Object.entries(questionPossibleAnswers || {}).forEach(\n ([key, value]) =>\n (questionPossibleAnswers[key] = { ...value, marks: value?.marks.filter((mark) => !mark.building) }),\n );\n // initialize answer if no values\n answer = answer || [];\n // initialize one possible answer if no values\n if (isEmpty(questionPossibleAnswers)) {\n questionPossibleAnswers = { correctAnswer: initializeGraphMap() };\n } else {\n questionPossibleAnswers = {\n correctAnswer: questionPossibleAnswers.correctAnswer,\n ...sortedAnswers(questionPossibleAnswers),\n };\n }\n // student's answers without DUPLICATES\n const sessionAnswers = uniqWith(answer, compareMarks);\n // array of possible answers entries\n const possibleAnswers = Object.entries(questionPossibleAnswers);\n return possibleAnswers.reduce(\n (acc, entry) => {\n // iterating each possible answer (main + alternates)\n const possibleAnswerKey = entry[0];\n const possibleAnswer = entry[1] || {};\n let { marks } = possibleAnswer;\n if (!marks || !marks.length) {\n return acc;\n }\n // returns array of marks, each having 'correctness' property\n const correctedAnswer = getAnswerCorrected({ sessionAnswers, marks });\n const correctMarks = correctedAnswer.filter((answer) => answer.correctness === 'correct');\n // filter out missing objects because they do not affect the calculation of the score\n // only correct and incorrect are needed\n const scoredCorrectedAnswer = correctedAnswer.filter((answer) => answer.correctness !== 'missing');\n const maxScore = marks.length;\n let score = correctMarks.length;\n // if extra placements\n if (scoredCorrectedAnswer.length > maxScore) {\n score -= scoredCorrectedAnswer.length - maxScore;\n }\n if (score < 0) {\n score = 0;\n }\n if (score / maxScore > acc.bestScore || !acc.foundOneSolution) {\n acc.bestScore = Math.floor(score / maxScore);\n acc.bestScoreAnswerKey = possibleAnswerKey;\n acc.answersCorrected = correctedAnswer;\n acc.foundOneSolution = true;\n }\n return acc;\n },\n {\n bestScore: 0,\n bestScoreAnswerKey: null,\n // initially we just suppose all the answers are incorrect\n answersCorrected: cloneDeep(sessionAnswers).map((answer) => ({ ...answer, correctness: 'incorrect' })),\n foundOneSolution: false,\n },\n );\n};\n\n/*\n * Constant normalize\n * @param {Object} question - question object\n * */\nexport const normalize = (question) => ({ ...defaults, ...question });\n\n/*\n * Function to set model\n * @param {Object} question - question object\n * @param {Object} session - session object\n * @param {Object} env - env object\n * */\nexport function model(question, session, env) {\n return new Promise((resolve) => {\n const normalizedQuestion = normalize(question);\n // ensure removing of invalid answers\n // need this if undo redo was last operation\n session.answer = removeInvalidAnswers(session.answer);\n // console.log('normalizedQuestion', normalizedQuestion);\n const { defaultTool, extraCSSRules, prompt, promptEnabled, graph, answers, toolbarTools, ...questionProps } =\n normalizedQuestion || {};\n let { arrows } = normalizedQuestion;\n const { mode, role } = env || {};\n\n // This is used for offering support for old models which have the property arrows: boolean\n // Same thing is set in authoring : packages/graphing/configure/src/configure.jsx - componentDidMount\n if (typeof arrows === 'boolean') {\n if (arrows) {\n arrows = {\n left: true,\n right: true,\n up: true,\n down: true,\n };\n } else {\n arrows = {\n left: false,\n right: false,\n up: false,\n down: false,\n };\n }\n }\n\n const base = {\n ...questionProps,\n answers,\n arrows,\n defaultTool: 'line',\n disabled: env.mode !== 'gather',\n prompt: promptEnabled ? prompt : null,\n rationale: null,\n size: graph,\n showToggle:\n env.mode === 'evaluate' &&\n !isEmpty(answers) &&\n answers.correctAnswer &&\n answers.correctAnswer.marks &&\n !isEmpty(answers.correctAnswer.marks),\n teacherInstructions: null,\n toolbarTools,\n extraCSSRules,\n };\n\n if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {\n const { rationale, rationaleEnabled, teacherInstructions, teacherInstructionsEnabled } = normalizedQuestion || {};\n\n base.rationale = rationaleEnabled ? rationale : null;\n base.teacherInstructions = teacherInstructionsEnabled ? teacherInstructions : null;\n }\n\n if (mode === 'evaluate') {\n if (\n !isEmpty(answers) &&\n answers.correctAnswer &&\n answers.correctAnswer.marks &&\n !isEmpty(answers.correctAnswer.marks)\n ) {\n const { answersCorrected, bestScoreAnswerKey, bestScore } = getBestAnswer(normalizedQuestion, session, env);\n // array of marks from session with 'correctness' property set\n base.answersCorrected = answersCorrected;\n base.correctResponse = bestScoreAnswerKey ? (answers[bestScoreAnswerKey] || {}).marks : [];\n base.showToggle = base.showToggle && bestScore !== 1;\n } else {\n base.answersCorrected = (session && session.answer) || [];\n base.correctResponse = [];\n }\n }\n\n log('base: ', base);\n resolve(base);\n });\n}\n\n/*\n * Function to check the outcome\n * @param {Object} question - question object\n * @param {Object} session - session object\n * @param {Object} env - env object\n * */\nexport function outcome(question, session, env = {}) {\n return new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n }\n if (\n env.mode !== 'evaluate' ||\n isEmpty(question.answers) ||\n (question.answers && question.answers.correctAnswer && isEmpty(question.answers.correctAnswer.marks))\n ) {\n resolve({ score: 0 });\n }\n const { bestScore } = getBestAnswer(question, session, env);\n resolve({ score: bestScore });\n });\n}\n\n/*\n * Constant to create correct response session\n * @param {Object} question - question object\n * @param {Object} env - env object\n * */\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { answers } = question || {};\n let marks = [];\n if (answers && Object.values(answers)) {\n const correctAnswer = answers.correctAnswer || Object.values(answers)[0] || {};\n marks = correctAnswer.marks || [];\n }\n resolve({\n answer: marks,\n id: '1',\n });\n } else {\n resolve(null);\n }\n });\n};\n\n/*\n * Constant to validate model before saving item\n * @param {Object} model - model object\n * */\nexport const validate = (model = {}) => {\n const { answers, gssLineData } = model;\n const errors = {};\n const correctAnswerErrors = {};\n let found = false;\n if (gssLineData.numberOfLines === 1) {\n if (answers.correctAnswer.marks.length < 1) {\n found = true;\n correctAnswerErrors.correctAnswer = 'At least 1 line object should be defined.';\n } else if (answers.correctAnswer.marks.length === 1 && answers.correctAnswer.marks[0].building) {\n found = true;\n correctAnswerErrors.correctAnswer = '1 or more graph object should be correctly defined.';\n }\n } else {\n if (answers.correctAnswer.marks.length < 2) {\n found = true;\n correctAnswerErrors.correctAnswer = 'At least 2 line object should be defined.';\n } else if (answers.correctAnswer.marks.length === 2) {\n if (answers.correctAnswer.marks[0].building || answers.correctAnswer.marks[1].building) {\n found = true;\n correctAnswerErrors.correctAnswer = '1 or more graph object should be correctly defined.';\n }\n }\n }\n let polygon = answers.correctAnswer.marks.find((mark) => mark.type === 'polygon');\n if (!found && (!gssLineData.selectedTool === 'solutionSet' || !polygon)) {\n correctAnswerErrors.correctAnswer = 'Please select a solution set for the graphing solution set item.';\n }\n if (!isEmpty(correctAnswerErrors)) {\n errors.correctAnswerErrors = correctAnswerErrors;\n }\n return errors;\n};\n"],"file":"index.js"}
1
+ {"version":3,"file":"index.js","names":["_debug","_interopRequireDefault","require","_cloneDeep","_uniqWith","_isEmpty","_defaults","_utils","log","debug","initializeGraphMap","line","compareMarks","mark1","mark2","type","equalMarks","exports","getAnswerCorrected","sessionAnswers","marks","correctAnswers","rez","cloneDeep","reduce","correctedAnswer","answer","answerIsCorrect","find","mark","correctness","missingAnswers","answerIndex","getBestAnswer","question","session","env","answers","questionPossibleAnswers","scoringType","Object","entries","forEach","key","value","filter","building","isEmpty","correctAnswer","sortedAnswers","uniqWith","possibleAnswers","acc","entry","possibleAnswerKey","possibleAnswer","length","correctMarks","scoredCorrectedAnswer","maxScore","score","bestScore","foundOneSolution","Math","floor","bestScoreAnswerKey","answersCorrected","map","normalize","defaults","model","Promise","resolve","normalizedQuestion","removeInvalidAnswers","defaultTool","extraCSSRules","prompt","promptEnabled","graph","toolbarTools","questionProps","arrows","mode","role","left","right","up","down","base","disabled","rationale","size","showToggle","teacherInstructions","rationaleEnabled","teacherInstructionsEnabled","correctResponse","outcome","empty","createCorrectResponseSession","values","id","validate","gssLineData","errors","correctAnswerErrors","found","numberOfLines","polygon","selectedTool"],"sources":["../src/index.js"],"sourcesContent":["import debug from 'debug';\nimport cloneDeep from 'lodash/cloneDeep';\nimport uniqWith from 'lodash/uniqWith';\nimport isEmpty from 'lodash/isEmpty';\nimport defaults from './defaults';\nimport { equalMarks, sortedAnswers, removeInvalidAnswers } from './utils';\n\nconst log = debug('@pie-element:graphing-solution-set:controller');\n\nconst initializeGraphMap = () => ({\n line: [],\n});\n\n/*\n * Function to compare two marks\n * @param {Object} mark1 - first mark\n * @param {Object} mark2 - second mark\n * */\nexport const compareMarks = (mark1, mark2) => {\n // marks can be compared with equalMarks[type] function only if they have the same type;\n // if type is different, they are clearly not equal\n return !!(\n mark1 &&\n mark2 &&\n mark1.type === mark2.type &&\n equalMarks[mark1.type] &&\n equalMarks[mark1.type](mark1, mark2)\n );\n};\n\n/*\n * Function to get the corrected answer\n * @param {Object} sessionAnswers - array of marks from session\n * @param {Object} marks - array of marks from correct answer\n * */\nexport const getAnswerCorrected = ({ sessionAnswers, marks: correctAnswers }) => {\n sessionAnswers = sessionAnswers || [];\n correctAnswers = correctAnswers || [];\n const rez = cloneDeep(sessionAnswers).reduce((correctedAnswer, answer) => {\n const answerIsCorrect = correctAnswers.find((mark) => compareMarks(answer, mark));\n answer.correctness = answerIsCorrect ? 'correct' : 'incorrect';\n return [...correctedAnswer, answer];\n }, []);\n // add missing objects from correct answer\n const missingAnswers = cloneDeep(correctAnswers).reduce((correctedAnswer, answer) => {\n const answerIndex = sessionAnswers.find((mark) => compareMarks(answer, mark));\n if (!answerIndex) {\n // means that corrected answer is missing from session, so we mark it as missing object\n return [...correctedAnswer, { ...answer, correctness: 'missing' }];\n }\n return correctedAnswer;\n }, []);\n return [...rez, ...missingAnswers];\n};\n\n/*\n * Function to get the best answer\n * @param {Object} question - question object\n * @param {Object} session - session object\n * @param {Object} env - env object\n * */\nexport const getBestAnswer = (question, session, env = {}) => {\n // questionPossibleAnswers contains all possible answers (correct response and alternates);\n let { answers: questionPossibleAnswers = {}, scoringType } = question || {};\n let { answer } = session || {};\n // filter the incomplete objects\n Object.entries(questionPossibleAnswers || {}).forEach(\n ([key, value]) =>\n (questionPossibleAnswers[key] = { ...value, marks: value?.marks.filter((mark) => !mark.building) }),\n );\n // initialize answer if no values\n answer = answer || [];\n // initialize one possible answer if no values\n if (isEmpty(questionPossibleAnswers)) {\n questionPossibleAnswers = { correctAnswer: initializeGraphMap() };\n } else {\n questionPossibleAnswers = {\n correctAnswer: questionPossibleAnswers.correctAnswer,\n ...sortedAnswers(questionPossibleAnswers),\n };\n }\n // student's answers without DUPLICATES\n const sessionAnswers = uniqWith(answer, compareMarks);\n // array of possible answers entries\n const possibleAnswers = Object.entries(questionPossibleAnswers);\n return possibleAnswers.reduce(\n (acc, entry) => {\n // iterating each possible answer (main + alternates)\n const possibleAnswerKey = entry[0];\n const possibleAnswer = entry[1] || {};\n let { marks } = possibleAnswer;\n if (!marks || !marks.length) {\n return acc;\n }\n // returns array of marks, each having 'correctness' property\n const correctedAnswer = getAnswerCorrected({ sessionAnswers, marks });\n const correctMarks = correctedAnswer.filter((answer) => answer.correctness === 'correct');\n // filter out missing objects because they do not affect the calculation of the score\n // only correct and incorrect are needed\n const scoredCorrectedAnswer = correctedAnswer.filter((answer) => answer.correctness !== 'missing');\n const maxScore = marks.length;\n let score = correctMarks.length;\n // if extra placements\n if (scoredCorrectedAnswer.length > maxScore) {\n score -= scoredCorrectedAnswer.length - maxScore;\n }\n if (score < 0) {\n score = 0;\n }\n if (score / maxScore > acc.bestScore || !acc.foundOneSolution) {\n acc.bestScore = Math.floor(score / maxScore);\n acc.bestScoreAnswerKey = possibleAnswerKey;\n acc.answersCorrected = correctedAnswer;\n acc.foundOneSolution = true;\n }\n return acc;\n },\n {\n bestScore: 0,\n bestScoreAnswerKey: null,\n // initially we just suppose all the answers are incorrect\n answersCorrected: cloneDeep(sessionAnswers).map((answer) => ({ ...answer, correctness: 'incorrect' })),\n foundOneSolution: false,\n },\n );\n};\n\n/*\n * Constant normalize\n * @param {Object} question - question object\n * */\nexport const normalize = (question) => ({ ...defaults, ...question });\n\n/*\n * Function to set model\n * @param {Object} question - question object\n * @param {Object} session - session object\n * @param {Object} env - env object\n * */\nexport function model(question, session, env) {\n return new Promise((resolve) => {\n const normalizedQuestion = normalize(question);\n // ensure removing of invalid answers\n // need this if undo redo was last operation\n session.answer = removeInvalidAnswers(session.answer);\n // console.log('normalizedQuestion', normalizedQuestion);\n const { defaultTool, extraCSSRules, prompt, promptEnabled, graph, answers, toolbarTools, ...questionProps } =\n normalizedQuestion || {};\n let { arrows } = normalizedQuestion;\n const { mode, role } = env || {};\n\n // This is used for offering support for old models which have the property arrows: boolean\n // Same thing is set in authoring : packages/graphing/configure/src/configure.jsx - componentDidMount\n if (typeof arrows === 'boolean') {\n if (arrows) {\n arrows = {\n left: true,\n right: true,\n up: true,\n down: true,\n };\n } else {\n arrows = {\n left: false,\n right: false,\n up: false,\n down: false,\n };\n }\n }\n\n const base = {\n ...questionProps,\n answers,\n arrows,\n defaultTool: 'line',\n disabled: env.mode !== 'gather',\n prompt: promptEnabled ? prompt : null,\n rationale: null,\n size: graph,\n showToggle:\n env.mode === 'evaluate' &&\n !isEmpty(answers) &&\n answers.correctAnswer &&\n answers.correctAnswer.marks &&\n !isEmpty(answers.correctAnswer.marks),\n teacherInstructions: null,\n toolbarTools,\n extraCSSRules,\n };\n\n if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {\n const { rationale, rationaleEnabled, teacherInstructions, teacherInstructionsEnabled } = normalizedQuestion || {};\n\n base.rationale = rationaleEnabled ? rationale : null;\n base.teacherInstructions = teacherInstructionsEnabled ? teacherInstructions : null;\n }\n\n if (mode === 'evaluate') {\n if (\n !isEmpty(answers) &&\n answers.correctAnswer &&\n answers.correctAnswer.marks &&\n !isEmpty(answers.correctAnswer.marks)\n ) {\n const { answersCorrected, bestScoreAnswerKey, bestScore } = getBestAnswer(normalizedQuestion, session, env);\n // array of marks from session with 'correctness' property set\n base.answersCorrected = answersCorrected;\n base.correctResponse = bestScoreAnswerKey ? (answers[bestScoreAnswerKey] || {}).marks : [];\n base.showToggle = base.showToggle && bestScore !== 1;\n } else {\n base.answersCorrected = (session && session.answer) || [];\n base.correctResponse = [];\n }\n }\n\n log('base: ', base);\n resolve(base);\n });\n}\n\n/*\n * Function to check the outcome\n * @param {Object} question - question object\n * @param {Object} session - session object\n * @param {Object} env - env object\n * */\nexport function outcome(question, session, env = {}) {\n return new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n }\n if (\n env.mode !== 'evaluate' ||\n isEmpty(question.answers) ||\n (question.answers && question.answers.correctAnswer && isEmpty(question.answers.correctAnswer.marks))\n ) {\n resolve({ score: 0 });\n }\n const { bestScore } = getBestAnswer(question, session, env);\n resolve({ score: bestScore });\n });\n}\n\n/*\n * Constant to create correct response session\n * @param {Object} question - question object\n * @param {Object} env - env object\n * */\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { answers } = question || {};\n let marks = [];\n if (answers && Object.values(answers)) {\n const correctAnswer = answers.correctAnswer || Object.values(answers)[0] || {};\n marks = correctAnswer.marks || [];\n }\n resolve({\n answer: marks,\n id: '1',\n });\n } else {\n resolve(null);\n }\n });\n};\n\n/*\n * Constant to validate model before saving item\n * @param {Object} model - model object\n * */\nexport const validate = (model = {}) => {\n const { answers, gssLineData } = model;\n const errors = {};\n const correctAnswerErrors = {};\n let found = false;\n if (gssLineData.numberOfLines === 1) {\n if (answers.correctAnswer.marks.length < 1) {\n found = true;\n correctAnswerErrors.correctAnswer = 'At least 1 line object should be defined.';\n } else if (answers.correctAnswer.marks.length === 1 && answers.correctAnswer.marks[0].building) {\n found = true;\n correctAnswerErrors.correctAnswer = '1 or more graph object should be correctly defined.';\n }\n } else {\n if (answers.correctAnswer.marks.length < 2) {\n found = true;\n correctAnswerErrors.correctAnswer = 'At least 2 line object should be defined.';\n } else if (answers.correctAnswer.marks.length === 2) {\n if (answers.correctAnswer.marks[0].building || answers.correctAnswer.marks[1].building) {\n found = true;\n correctAnswerErrors.correctAnswer = '1 or more graph object should be correctly defined.';\n }\n }\n }\n let polygon = answers.correctAnswer.marks.find((mark) => mark.type === 'polygon');\n if (!found && (!gssLineData.selectedTool === 'solutionSet' || !polygon)) {\n correctAnswerErrors.correctAnswer = 'Please select a solution set for the graphing solution set item.';\n }\n if (!isEmpty(correctAnswerErrors)) {\n errors.correctAnswerErrors = correctAnswerErrors;\n }\n return errors;\n};\n"],"mappings":"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","ignoreList":[]}