@pie-element/graphing-solution-set 4.3.4-next.3 → 5.0.0-beta.1
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 +0 -11
- package/configure/CHANGELOG.md +0 -11
- package/configure/lib/configure.js +289 -377
- package/configure/lib/configure.js.map +1 -1
- package/configure/lib/correct-response.js +309 -475
- package/configure/lib/correct-response.js.map +1 -1
- package/configure/lib/defaults.js +2 -4
- package/configure/lib/defaults.js.map +1 -1
- package/configure/lib/graphing-config.js +329 -363
- package/configure/lib/graphing-config.js.map +1 -1
- package/configure/lib/index.js +126 -181
- package/configure/lib/index.js.map +1 -1
- package/configure/lib/utils.js +178 -301
- package/configure/lib/utils.js.map +1 -1
- package/configure/package.json +12 -8
- package/controller/lib/defaults.js +2 -4
- package/controller/lib/defaults.js.map +1 -1
- package/controller/lib/index.js +146 -218
- package/controller/lib/index.js.map +1 -1
- package/controller/lib/utils.js +85 -142
- package/controller/lib/utils.js.map +1 -1
- package/controller/package.json +3 -3
- package/lib/index.js +120 -170
- package/lib/index.js.map +1 -1
- package/lib/main.js +261 -350
- package/lib/main.js.map +1 -1
- package/lib/utils.js +142 -231
- package/lib/utils.js.map +1 -1
- package/package.json +14 -10
- package/esm/configure.js +0 -43958
- package/esm/configure.js.map +0 -1
- package/esm/controller.js +0 -22735
- package/esm/controller.js.map +0 -1
- package/esm/element.js +0 -26572
- package/esm/element.js.map +0 -1
- package/esm/package.json +0 -3
package/controller/lib/index.js
CHANGED
|
@@ -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
|
-
|
|
69
|
-
|
|
70
|
-
|
|
40
|
+
const getAnswerCorrected = ({
|
|
41
|
+
sessionAnswers,
|
|
42
|
+
marks: correctAnswers
|
|
43
|
+
}) => {
|
|
71
44
|
sessionAnswers = sessionAnswers || [];
|
|
72
45
|
correctAnswers = correctAnswers || [];
|
|
73
|
-
|
|
74
|
-
|
|
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 [
|
|
79
|
-
}, []);
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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 [
|
|
56
|
+
return [...correctedAnswer, {
|
|
57
|
+
...answer,
|
|
89
58
|
correctness: 'missing'
|
|
90
|
-
}
|
|
59
|
+
}];
|
|
91
60
|
}
|
|
92
|
-
|
|
93
61
|
return correctedAnswer;
|
|
94
62
|
}, []);
|
|
95
|
-
return [
|
|
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
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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 =
|
|
140
|
-
correctAnswer: questionPossibleAnswers.correctAnswer
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
return possibleAnswers.reduce(
|
|
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
|
-
|
|
151
|
-
|
|
152
|
-
|
|
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
|
-
}
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
marks: marks
|
|
113
|
+
}
|
|
114
|
+
// returns array of marks, each having 'correctness' property
|
|
115
|
+
const correctedAnswer = getAnswerCorrected({
|
|
116
|
+
sessionAnswers,
|
|
117
|
+
marks
|
|
162
118
|
});
|
|
163
|
-
|
|
164
|
-
|
|
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
|
-
|
|
169
|
-
|
|
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
|
|
195
|
-
|
|
196
|
-
|
|
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(
|
|
225
|
-
|
|
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
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
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
|
-
|
|
267
|
-
answers
|
|
268
|
-
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
|
|
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
|
|
277
|
-
extraCSSRules
|
|
278
|
-
}
|
|
279
|
-
|
|
223
|
+
toolbarTools,
|
|
224
|
+
extraCSSRules
|
|
225
|
+
};
|
|
280
226
|
if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
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
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
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
|
-
|
|
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
|
-
|
|
337
|
-
|
|
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
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
293
|
+
const {
|
|
294
|
+
answers
|
|
295
|
+
} = question || {};
|
|
296
|
+
let marks = [];
|
|
359
297
|
if (answers && Object.values(answers)) {
|
|
360
|
-
|
|
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
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
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":[]}
|