@pie-element/charting 10.0.1-next.0 → 10.0.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.
@@ -0,0 +1,442 @@
1
+ import debug from 'debug';
2
+ import isEqual from 'lodash/isEqual';
3
+ import isEmpty from 'lodash/isEmpty';
4
+ import pick from 'lodash/pick';
5
+ import { partialScoring } from '@pie-lib/controller-utils';
6
+
7
+ function _objectWithoutPropertiesLoose(source, excluded) {
8
+ if (source == null) return {};
9
+ var target = {};
10
+ var sourceKeys = Object.keys(source);
11
+ var key, i;
12
+
13
+ for (i = 0; i < sourceKeys.length; i++) {
14
+ key = sourceKeys[i];
15
+ if (excluded.indexOf(key) >= 0) continue;
16
+ target[key] = source[key];
17
+ }
18
+
19
+ return target;
20
+ }
21
+
22
+ function _objectWithoutProperties(source, excluded) {
23
+ if (source == null) return {};
24
+ var target = _objectWithoutPropertiesLoose(source, excluded);
25
+ var key, i;
26
+
27
+ if (Object.getOwnPropertySymbols) {
28
+ var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
29
+
30
+ for (i = 0; i < sourceSymbolKeys.length; i++) {
31
+ key = sourceSymbolKeys[i];
32
+ if (excluded.indexOf(key) >= 0) continue;
33
+ if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
34
+ target[key] = source[key];
35
+ }
36
+ }
37
+
38
+ return target;
39
+ }
40
+
41
+ function _defineProperty(obj, key, value) {
42
+ if (key in obj) {
43
+ Object.defineProperty(obj, key, {
44
+ value: value,
45
+ enumerable: true,
46
+ configurable: true,
47
+ writable: true
48
+ });
49
+ } else {
50
+ obj[key] = value;
51
+ }
52
+
53
+ return obj;
54
+ }
55
+
56
+ /**
57
+ * NOTE: There's no functionality described for graphTitle,
58
+ * rationale, scoringType, studentInstructions, teacherInstructions
59
+ * so there's no implementation (they are only added in model)
60
+ */
61
+ var defaults = {
62
+ addCategoryEnabled: true,
63
+ changeAddCategoryEnabled: false,
64
+ changeEditableEnabled: false,
65
+ changeInteractiveEnabled: false,
66
+ chartType: 'lineCross',
67
+ correctAnswer: {},
68
+ data: [],
69
+ domain: {},
70
+ graph: {
71
+ width: 480,
72
+ height: 480
73
+ },
74
+ prompt: '',
75
+ promptEnabled: true,
76
+ range: {
77
+ label: '',
78
+ max: 1,
79
+ min: 0,
80
+ labelStep: 1
81
+ },
82
+ rationale: '',
83
+ rationaleEnabled: true,
84
+ scoringType: 'all or nothing',
85
+ studentInstructionsEnabled: true,
86
+ studentNewCategoryDefaultLabel: 'New Category',
87
+ teacherInstructions: '',
88
+ teacherInstructionsEnabled: true,
89
+ title: ''
90
+ };
91
+
92
+ var _excluded = ["deletable"],
93
+ _excluded2 = ["correctness"];
94
+
95
+ 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; }
96
+
97
+ 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) { _defineProperty(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; }
98
+ var log = debug('@pie-element:graphing:controller');
99
+
100
+ var lowerCase = string => (string || '').toLowerCase();
101
+
102
+ var checkLabelsEquality = (givenAnswerLabel, correctAnswerLabel) => lowerCase(givenAnswerLabel) === lowerCase(correctAnswerLabel);
103
+ var setCorrectness = (answers, partialScoring) => answers ? answers.map(answer => _objectSpread(_objectSpread({}, answer), {}, {
104
+ correctness: {
105
+ value: partialScoring ? 'incorrect' : 'correct',
106
+ label: partialScoring ? 'incorrect' : 'correct'
107
+ }
108
+ })) : [];
109
+ var normalize = question => _objectSpread(_objectSpread({}, defaults), question);
110
+ var getScore = function getScore(question, session) {
111
+ var env = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
112
+ var {
113
+ correctAnswer,
114
+ data: initialData = [],
115
+ scoringType
116
+ } = question;
117
+ var correctResponses = [];
118
+ var isPartialScoring = partialScoring.enabled({
119
+ partialScoring: scoringType !== undefined ? scoringType === 'partial scoring' : scoringType
120
+ }, env);
121
+ var {
122
+ data: correctAnswers = []
123
+ } = correctAnswer || {};
124
+ var defaultAnswers = filterCategories(initialData);
125
+ var answers = setCorrectness(session && session.answer || defaultAnswers, isPartialScoring);
126
+ var result = 0;
127
+
128
+ if (isPartialScoring) {
129
+ // if score type is "partial scoring"
130
+ // maxScore is calculated based on the correct response
131
+ // score is calculated based on the given response
132
+ var maxScore = 0;
133
+ var _score = 0;
134
+
135
+ var scoreForLabelAndValueEditable = (answer, corrAnswer) => {
136
+ var {
137
+ value,
138
+ label,
139
+ index
140
+ } = answer;
141
+ var valueIsCorrect = value === corrAnswer.value;
142
+ var labelIsCorrect = checkLabelsEquality(label, corrAnswer.label);
143
+ maxScore += 2;
144
+
145
+ if (valueIsCorrect) {
146
+ _score += 1;
147
+ answer.correctness.value = 'correct';
148
+ }
149
+
150
+ if (labelIsCorrect) {
151
+ _score += 1;
152
+ answer.correctness.label = 'correct';
153
+ }
154
+
155
+ if (valueIsCorrect && labelIsCorrect) {
156
+ correctResponses.push({
157
+ label: label,
158
+ index: index
159
+ });
160
+ }
161
+ }; // if given answer has more categories than the correct answers, the "extra" will be ignored
162
+
163
+
164
+ correctAnswers.forEach((corrAnswer, index) => {
165
+ var defaultAnswer = defaultAnswers[index];
166
+ var answer = answers[index]; // if there is a corresponding category at the same position in the given answer
167
+
168
+ if (answer) {
169
+ // if there is a corresponding category at the same position in the default answer
170
+ if (defaultAnswer) {
171
+ // if category's label (in default answer) was not editable
172
+ // it means that this category values only one point (only the value can be changed)
173
+ if (!defaultAnswer.editable && answer.interactive) {
174
+ maxScore += 1;
175
+
176
+ if (answer.value === corrAnswer.value) {
177
+ _score += 1;
178
+ answer.correctness.value = 'correct';
179
+ correctResponses.push({
180
+ label: answer.label,
181
+ index: index
182
+ });
183
+ }
184
+
185
+ answer.correctness.label = 'correct'; // if category's label (in default answer) was editable
186
+ // it means that this category values 2 points (both label and value can be changed)
187
+ } else if (defaultAnswer.editable && answer.interactive) {
188
+ scoreForLabelAndValueEditable(answer, corrAnswer);
189
+ } else if (!answer.interactive) {
190
+ answer.correctness.value = 'correct';
191
+ answer.correctness.label = 'correct';
192
+ correctResponses.push({
193
+ label: answer.label,
194
+ index: index
195
+ });
196
+ }
197
+ } else {
198
+ // if there is not a corresponding category at the same position in the default answer
199
+ scoreForLabelAndValueEditable(answer, corrAnswer);
200
+ }
201
+ } else {
202
+ // if there is not a corresponding category at the same position in the given answer
203
+ // it means that the given answer has less categories than the correct answer
204
+ maxScore += 2;
205
+ }
206
+ });
207
+ result = maxScore ? _score / maxScore : 0;
208
+ } else {
209
+ // all-or-nothing scoring: overall score is 1 only if lengths and all values/labels match
210
+ result = correctAnswers.length === answers.length ? 1 : 0; // regardless of overall result, mark each answer individually for user feedback
211
+
212
+ answers = answers.map((answer, index) => {
213
+ var correctAnswer = correctAnswers[index];
214
+ var valueIsCorrect = correctAnswer ? answer.value === correctAnswer.value : false;
215
+ var labelIsCorrect = correctAnswer ? lowerCase(answer.label) === lowerCase(correctAnswer.label) : false;
216
+
217
+ if (!valueIsCorrect || !labelIsCorrect) {
218
+ result = 0;
219
+ }
220
+
221
+ if (valueIsCorrect && labelIsCorrect) {
222
+ correctResponses.push({
223
+ label: answer.label,
224
+ index
225
+ });
226
+ }
227
+
228
+ return _objectSpread(_objectSpread({}, answer), {}, {
229
+ correctness: {
230
+ value: valueIsCorrect ? 'correct' : 'incorrect',
231
+ label: labelIsCorrect ? 'correct' : 'incorrect'
232
+ }
233
+ });
234
+ });
235
+ }
236
+
237
+ var score = {
238
+ score: parseFloat(result.toFixed(2)),
239
+ answers
240
+ };
241
+
242
+ if (env.extraProps && env.extraProps.correctResponseEnabled) {
243
+ score.correctResponses = correctResponses;
244
+ }
245
+
246
+ return score;
247
+ }; // eslint-disable-next-line no-unused-vars
248
+
249
+ var filterCategories = categories => categories ? categories.map(_ref => {
250
+ var rest = _objectWithoutProperties(_ref, _excluded);
251
+
252
+ return rest;
253
+ }) : [];
254
+ function model(question, session, env) {
255
+ return new Promise(resolve => {
256
+ var normalizedQuestion = normalize(question);
257
+ var {
258
+ addCategoryEnabled,
259
+ chartType,
260
+ data,
261
+ domain,
262
+ graph,
263
+ prompt,
264
+ promptEnabled,
265
+ range,
266
+ rationale,
267
+ title,
268
+ rationaleEnabled,
269
+ teacherInstructions,
270
+ teacherInstructionsEnabled,
271
+ correctAnswer,
272
+ scoringType,
273
+ studentNewCategoryDefaultLabel,
274
+ language,
275
+ extraCSSRules
276
+ } = normalizedQuestion;
277
+ var correctInfo = {
278
+ correctness: 'incorrect',
279
+ score: '0%'
280
+ };
281
+ var base = {
282
+ addCategoryEnabled,
283
+ chartType,
284
+ data: filterCategories(data),
285
+ domain,
286
+ graph,
287
+ prompt: promptEnabled ? prompt : null,
288
+ range,
289
+ rationale,
290
+ title,
291
+ size: graph,
292
+ showToggle: false,
293
+ correctness: correctInfo,
294
+ disabled: env.mode !== 'gather',
295
+ scoringType,
296
+ studentNewCategoryDefaultLabel,
297
+ language,
298
+ env,
299
+ extraCSSRules
300
+ };
301
+ var scoreObject = getScore(normalizedQuestion, session, env);
302
+ var answers = filterCategories(scoreObject.answers);
303
+
304
+ if (env.mode === 'view') {
305
+ // eslint-disable-next-line no-unused-vars
306
+ base.correctedAnswer = answers.map(_ref2 => {
307
+ var rest = _objectWithoutProperties(_ref2, _excluded2);
308
+
309
+ return _objectSpread(_objectSpread({}, rest), {}, {
310
+ interactive: false
311
+ });
312
+ });
313
+ base.addCategoryEnabled = false;
314
+ }
315
+
316
+ if (env.mode === 'evaluate') {
317
+ var _correctAnswer$data;
318
+
319
+ base.correctedAnswer = answers;
320
+ base.correctAnswer = correctAnswer;
321
+ base.showToggle = !!(correctAnswer !== null && correctAnswer !== void 0 && (_correctAnswer$data = correctAnswer.data) !== null && _correctAnswer$data !== void 0 && _correctAnswer$data.length) && scoreObject.score !== 1;
322
+ base.addCategoryEnabled = false;
323
+ base.showKeyLegend = true;
324
+ }
325
+
326
+ if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {
327
+ base.rationale = rationaleEnabled ? rationale : null;
328
+ base.teacherInstructions = teacherInstructionsEnabled ? teacherInstructions : null;
329
+ } else {
330
+ base.rationale = null;
331
+ base.teacherInstructions = null;
332
+ }
333
+
334
+ log('base: ', base);
335
+ resolve(base);
336
+ });
337
+ }
338
+ function outcome(model, session, env) {
339
+ return new Promise(resolve => {
340
+ var scoreObject = getScore(model, session, env);
341
+ var result = {
342
+ score: scoreObject.score,
343
+ empty: !session || isEmpty(session)
344
+ };
345
+
346
+ if (env.extraProps && env.extraProps.correctResponseEnabled) {
347
+ result.extraProps = {
348
+ correctResponse: scoreObject.correctResponses
349
+ };
350
+ }
351
+
352
+ resolve(result);
353
+ });
354
+ }
355
+ var createCorrectResponseSession = (question, env) => {
356
+ return new Promise(resolve => {
357
+ if (env.mode !== 'evaluate' && env.role === 'instructor') {
358
+ var {
359
+ correctAnswer
360
+ } = question;
361
+ var answers = correctAnswer && correctAnswer.data; // for IBX preview mode
362
+
363
+ if (env.mode === 'gather') {
364
+ var {
365
+ data
366
+ } = question;
367
+ answers = (correctAnswer && correctAnswer.data || []).map((answer, index) => {
368
+ return _objectSpread(_objectSpread({}, data[index]), answer);
369
+ });
370
+ }
371
+
372
+ resolve({
373
+ answer: answers,
374
+ id: '1'
375
+ });
376
+ } else {
377
+ return resolve(null);
378
+ }
379
+ });
380
+ }; // remove all html tags
381
+
382
+ var getInnerText = html => (html || '').replaceAll(/<[^>]*>/g, ''); // remove all html tags except img, iframe and source tag for audio
383
+
384
+
385
+ var getContent = html => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
386
+
387
+ var validate = function validate() {
388
+ var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
389
+ var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
390
+ var {
391
+ correctAnswer,
392
+ data
393
+ } = model || {};
394
+ var {
395
+ data: correctData
396
+ } = correctAnswer || {};
397
+ var categories = correctData || [];
398
+ var errors = {};
399
+ var correctAnswerErrors = {};
400
+ var categoryErrors = {};
401
+ ['teacherInstructions', 'prompt', 'rationale'].forEach(field => {
402
+ var _config$field;
403
+
404
+ if ((_config$field = config[field]) !== null && _config$field !== void 0 && _config$field.required && !getContent(model[field])) {
405
+ errors[field] = 'This field is required.';
406
+ }
407
+ });
408
+ categories.forEach((category, index) => {
409
+ var {
410
+ label
411
+ } = category;
412
+
413
+ if (!getInnerText(label)) {
414
+ categoryErrors[index] = 'Content should not be empty. ';
415
+ } else {
416
+ var identicalAnswer = categories.some((c, i) => c.label === label && index !== i);
417
+
418
+ if (identicalAnswer) {
419
+ categoryErrors[index] = 'Category names should be unique. ';
420
+ }
421
+ }
422
+ });
423
+
424
+ if (categories.length < 1 || categories.length > 20) {
425
+ correctAnswerErrors.categoriesError = 'The correct answer should include between 1 and 20 categories.';
426
+ } else if (isEqual(data.map(category => pick(category, 'value', 'label')), correctData.map(category => pick(category, 'value', 'label')))) {
427
+ correctAnswerErrors.identicalError = 'Correct answer should not be identical to the chart’s initial state';
428
+ }
429
+
430
+ if (!isEmpty(categoryErrors)) {
431
+ errors.categoryErrors = categoryErrors;
432
+ }
433
+
434
+ if (!isEmpty(correctAnswerErrors)) {
435
+ errors.correctAnswerErrors = correctAnswerErrors;
436
+ }
437
+
438
+ return errors;
439
+ };
440
+
441
+ export { checkLabelsEquality, createCorrectResponseSession, filterCategories, getScore, model, normalize, outcome, setCorrectness, validate };
442
+ //# sourceMappingURL=controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller.js","sources":["../../../node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","../../../node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js","../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js","../controller/src/defaults.js","../controller/src/index.js"],"sourcesContent":["export default function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}","import objectWithoutPropertiesLoose from \"./objectWithoutPropertiesLoose.js\";\nexport default function _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}","export default function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}","/**\n * NOTE: There's no functionality described for graphTitle,\n * rationale, scoringType, studentInstructions, teacherInstructions\n * so there's no implementation (they are only added in model)\n */\n\nexport default {\n addCategoryEnabled: true,\n changeAddCategoryEnabled: false,\n changeEditableEnabled: false,\n changeInteractiveEnabled: false,\n chartType: 'lineCross',\n correctAnswer: {},\n data: [],\n domain: {},\n graph: { width: 480, height: 480 },\n prompt: '',\n promptEnabled: true,\n range: { label: '', max: 1, min: 0, labelStep: 1 },\n rationale: '',\n rationaleEnabled: true,\n scoringType: 'all or nothing',\n studentInstructionsEnabled: true,\n studentNewCategoryDefaultLabel: 'New Category',\n teacherInstructions: '',\n teacherInstructionsEnabled: true,\n title: '',\n};\n","import debug from 'debug';\nimport isEqual from 'lodash/isEqual';\nimport isEmpty from 'lodash/isEmpty';\nimport pick from 'lodash/pick';\nimport defaults from './defaults';\n\nimport { partialScoring } from '@pie-lib/controller-utils';\n\nconst log = debug('@pie-element:graphing:controller');\n\nconst lowerCase = (string) => (string || '').toLowerCase();\n\nexport const checkLabelsEquality = (givenAnswerLabel, correctAnswerLabel) =>\n lowerCase(givenAnswerLabel) === lowerCase(correctAnswerLabel);\n\nexport const setCorrectness = (answers, partialScoring) =>\n answers\n ? answers.map((answer) => ({\n ...answer,\n correctness: {\n value: partialScoring ? 'incorrect' : 'correct',\n label: partialScoring ? 'incorrect' : 'correct',\n },\n }))\n : [];\n\nexport const normalize = (question) => ({ ...defaults, ...question });\n\nexport const getScore = (question, session, env = {}) => {\n const { correctAnswer, data: initialData = [], scoringType } = question;\n let correctResponses = [];\n\n const isPartialScoring = partialScoring.enabled(\n { partialScoring: scoringType !== undefined ? scoringType === 'partial scoring' : scoringType },\n env,\n );\n\n const { data: correctAnswers = [] } = correctAnswer || {};\n const defaultAnswers = filterCategories(initialData);\n\n let answers = setCorrectness((session && session.answer) || defaultAnswers, isPartialScoring);\n\n let result = 0;\n\n if (isPartialScoring) {\n // if score type is \"partial scoring\"\n // maxScore is calculated based on the correct response\n // score is calculated based on the given response\n let maxScore = 0;\n let score = 0;\n\n const scoreForLabelAndValueEditable = (answer, corrAnswer) => {\n const { value, label, index } = answer;\n const valueIsCorrect = value === corrAnswer.value;\n const labelIsCorrect = checkLabelsEquality(label, corrAnswer.label);\n maxScore += 2;\n\n if (valueIsCorrect) {\n score += 1;\n answer.correctness.value = 'correct';\n }\n\n if (labelIsCorrect) {\n score += 1;\n answer.correctness.label = 'correct';\n }\n\n if (valueIsCorrect && labelIsCorrect) {\n correctResponses.push({ label: label, index: index });\n }\n };\n\n // if given answer has more categories than the correct answers, the \"extra\" will be ignored\n correctAnswers.forEach((corrAnswer, index) => {\n const defaultAnswer = defaultAnswers[index];\n const answer = answers[index];\n\n // if there is a corresponding category at the same position in the given answer\n if (answer) {\n // if there is a corresponding category at the same position in the default answer\n if (defaultAnswer) {\n // if category's label (in default answer) was not editable\n // it means that this category values only one point (only the value can be changed)\n if (!defaultAnswer.editable && answer.interactive) {\n maxScore += 1;\n\n if (answer.value === corrAnswer.value) {\n score += 1;\n answer.correctness.value = 'correct';\n correctResponses.push({ label: answer.label, index: index });\n }\n answer.correctness.label = 'correct';\n\n // if category's label (in default answer) was editable\n // it means that this category values 2 points (both label and value can be changed)\n } else if (defaultAnswer.editable && answer.interactive) {\n scoreForLabelAndValueEditable(answer, corrAnswer);\n } else if (!answer.interactive) {\n answer.correctness.value = 'correct';\n answer.correctness.label = 'correct';\n correctResponses.push({ label: answer.label, index: index });\n }\n } else {\n // if there is not a corresponding category at the same position in the default answer\n scoreForLabelAndValueEditable(answer, corrAnswer);\n }\n } else {\n // if there is not a corresponding category at the same position in the given answer\n // it means that the given answer has less categories than the correct answer\n maxScore += 2;\n }\n });\n\n result = maxScore ? score / maxScore : 0;\n } else {\n // all-or-nothing scoring: overall score is 1 only if lengths and all values/labels match\n result = correctAnswers.length === answers.length ? 1 : 0;\n\n // regardless of overall result, mark each answer individually for user feedback\n answers = answers.map((answer, index) => {\n const correctAnswer = correctAnswers[index];\n const valueIsCorrect = correctAnswer ? answer.value === correctAnswer.value : false;\n const labelIsCorrect = correctAnswer ? lowerCase(answer.label) === lowerCase(correctAnswer.label) : false;\n\n if (!valueIsCorrect || !labelIsCorrect) {\n result = 0;\n }\n\n if (valueIsCorrect && labelIsCorrect) {\n correctResponses.push({ label: answer.label, index });\n }\n\n return {\n ...answer,\n correctness: {\n value: valueIsCorrect ? 'correct' : 'incorrect',\n label: labelIsCorrect ? 'correct' : 'incorrect',\n },\n };\n });\n }\n\n const score = {\n score: parseFloat(result.toFixed(2)),\n answers,\n };\n\n if (env.extraProps && env.extraProps.correctResponseEnabled) {\n score.correctResponses = correctResponses;\n }\n\n return score;\n};\n\n// eslint-disable-next-line no-unused-vars\nexport const filterCategories = (categories) => (categories ? categories.map(({ deletable, ...rest }) => rest) : []);\n\nexport function model(question, session, env) {\n return new Promise((resolve) => {\n const normalizedQuestion = normalize(question);\n const {\n addCategoryEnabled,\n chartType,\n data,\n domain,\n graph,\n prompt,\n promptEnabled,\n range,\n rationale,\n title,\n rationaleEnabled,\n teacherInstructions,\n teacherInstructionsEnabled,\n correctAnswer,\n scoringType,\n studentNewCategoryDefaultLabel,\n language,\n extraCSSRules,\n } = normalizedQuestion;\n\n const correctInfo = { correctness: 'incorrect', score: '0%' };\n\n const base = {\n addCategoryEnabled,\n chartType,\n data: filterCategories(data),\n domain,\n graph,\n prompt: promptEnabled ? prompt : null,\n range,\n rationale,\n title,\n size: graph,\n showToggle: false,\n correctness: correctInfo,\n disabled: env.mode !== 'gather',\n scoringType,\n studentNewCategoryDefaultLabel,\n language,\n env,\n extraCSSRules,\n };\n\n const scoreObject = getScore(normalizedQuestion, session, env);\n const answers = filterCategories(scoreObject.answers);\n\n if (env.mode === 'view') {\n // eslint-disable-next-line no-unused-vars\n base.correctedAnswer = answers.map(({ correctness, ...rest }) => {\n return { ...rest, interactive: false };\n });\n\n base.addCategoryEnabled = false;\n }\n\n if (env.mode === 'evaluate') {\n base.correctedAnswer = answers;\n base.correctAnswer = correctAnswer;\n base.showToggle = !!correctAnswer?.data?.length && scoreObject.score !== 1;\n base.addCategoryEnabled = false;\n base.showKeyLegend = true;\n }\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n base.rationale = rationaleEnabled ? rationale : null;\n base.teacherInstructions = teacherInstructionsEnabled ? teacherInstructions : null;\n } else {\n base.rationale = null;\n base.teacherInstructions = null;\n }\n\n log('base: ', base);\n resolve(base);\n });\n}\n\nexport function outcome(model, session, env) {\n return new Promise((resolve) => {\n const scoreObject = getScore(model, session, env);\n const result = {\n score: scoreObject.score,\n empty: !session || isEmpty(session),\n };\n if (env.extraProps && env.extraProps.correctResponseEnabled) {\n result.extraProps = { correctResponse: scoreObject.correctResponses };\n }\n resolve(result);\n });\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { correctAnswer } = question;\n\n let answers = correctAnswer && correctAnswer.data;\n\n // for IBX preview mode\n if (env.mode === 'gather') {\n const { data } = question;\n\n answers = ((correctAnswer && correctAnswer.data) || []).map((answer, index) => {\n return {\n ...data[index],\n ...answer,\n };\n });\n }\n\n resolve({\n answer: answers,\n id: '1',\n });\n } else {\n return resolve(null);\n }\n });\n};\n\n// remove all html tags\nconst getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');\n\n// remove all html tags except img, iframe and source tag for audio\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const { correctAnswer, data } = model || {};\n const { data: correctData } = correctAnswer || {};\n const categories = correctData || [];\n\n const errors = {};\n const correctAnswerErrors = {};\n const categoryErrors = {};\n\n ['teacherInstructions', 'prompt', 'rationale'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n categories.forEach((category, index) => {\n const { label } = category;\n\n if (!getInnerText(label)) {\n categoryErrors[index] = 'Content should not be empty. ';\n } else {\n const identicalAnswer = categories.some((c, i) => c.label === label && index !== i);\n\n if (identicalAnswer) {\n categoryErrors[index] = 'Category names should be unique. ';\n }\n }\n });\n\n if (categories.length < 1 || categories.length > 20) {\n correctAnswerErrors.categoriesError = 'The correct answer should include between 1 and 20 categories.';\n } else if (\n isEqual(\n data.map((category) => pick(category, 'value', 'label')),\n correctData.map((category) => pick(category, 'value', 'label')),\n )\n ) {\n correctAnswerErrors.identicalError = 'Correct answer should not be identical to the chart’s initial state';\n }\n\n if (!isEmpty(categoryErrors)) {\n errors.categoryErrors = categoryErrors;\n }\n\n if (!isEmpty(correctAnswerErrors)) {\n errors.correctAnswerErrors = correctAnswerErrors;\n }\n\n return errors;\n};\n"],"names":["objectWithoutPropertiesLoose","addCategoryEnabled","changeAddCategoryEnabled","changeEditableEnabled","changeInteractiveEnabled","chartType","correctAnswer","data","domain","graph","width","height","prompt","promptEnabled","range","label","max","min","labelStep","rationale","rationaleEnabled","scoringType","studentInstructionsEnabled","studentNewCategoryDefaultLabel","teacherInstructions","teacherInstructionsEnabled","title","log","debug","lowerCase","string","toLowerCase","checkLabelsEquality","givenAnswerLabel","correctAnswerLabel","setCorrectness","answers","partialScoring","map","answer","correctness","value","normalize","question","defaults","getScore","session","env","initialData","correctResponses","isPartialScoring","enabled","undefined","correctAnswers","defaultAnswers","filterCategories","result","maxScore","score","scoreForLabelAndValueEditable","corrAnswer","index","valueIsCorrect","labelIsCorrect","push","forEach","defaultAnswer","editable","interactive","length","parseFloat","toFixed","extraProps","correctResponseEnabled","categories","rest","model","Promise","resolve","normalizedQuestion","language","extraCSSRules","correctInfo","base","size","showToggle","disabled","mode","scoreObject","correctedAnswer","showKeyLegend","role","outcome","empty","isEmpty","correctResponse","createCorrectResponseSession","id","getInnerText","html","replaceAll","getContent","replace","validate","config","correctData","errors","correctAnswerErrors","categoryErrors","field","required","category","identicalAnswer","some","c","i","categoriesError","isEqual","pick","identicalError"],"mappings":"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"}