@pie-element/inline-dropdown 8.0.1 → 8.0.2-esm.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.
package/esm/controller.js CHANGED
@@ -1,58 +1,25 @@
1
1
  import map from 'lodash/map';
2
2
  import reduce from 'lodash/reduce';
3
3
  import isEmpty from 'lodash/isEmpty';
4
- import { partialScoring, lockChoices, getShuffledChoices } from '@pie-lib/controller-utils';
4
+ import { lockChoices, getShuffledChoices, partialScoring } from '@pie-lib/controller-utils';
5
5
  import forEach from 'lodash/forEach';
6
6
 
7
- function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
8
- try {
9
- var info = gen[key](arg);
10
- var value = info.value;
11
- } catch (error) {
12
- reject(error);
13
- return;
14
- }
15
-
16
- if (info.done) {
17
- resolve(value);
18
- } else {
19
- Promise.resolve(value).then(_next, _throw);
20
- }
21
- }
7
+ function _extends() {
8
+ _extends = Object.assign || function (target) {
9
+ for (var i = 1; i < arguments.length; i++) {
10
+ var source = arguments[i];
22
11
 
23
- function _asyncToGenerator(fn) {
24
- return function () {
25
- var self = this,
26
- args = arguments;
27
- return new Promise(function (resolve, reject) {
28
- var gen = fn.apply(self, args);
29
-
30
- function _next(value) {
31
- asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
32
- }
33
-
34
- function _throw(err) {
35
- asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
12
+ for (var key in source) {
13
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
14
+ target[key] = source[key];
15
+ }
36
16
  }
17
+ }
37
18
 
38
- _next(undefined);
39
- });
19
+ return target;
40
20
  };
41
- }
42
-
43
- function _defineProperty(obj, key, value) {
44
- if (key in obj) {
45
- Object.defineProperty(obj, key, {
46
- value: value,
47
- enumerable: true,
48
- configurable: true,
49
- writable: true
50
- });
51
- } else {
52
- obj[key] = value;
53
- }
54
21
 
55
- return obj;
22
+ return _extends.apply(this, arguments);
56
23
  }
57
24
 
58
25
  var defaults = {
@@ -74,13 +41,12 @@ var defaults = {
74
41
  toolbarEditorPosition: 'bottom'
75
42
  };
76
43
 
77
- var getAllCorrectResponses = _ref => {
78
- var {
79
- choices,
80
- alternateResponse
81
- } = _ref;
44
+ const getAllCorrectResponses = ({
45
+ choices,
46
+ alternateResponse
47
+ }) => {
82
48
  alternateResponse = alternateResponse || {};
83
- var correctAnswers = {};
49
+ const correctAnswers = {};
84
50
  forEach(choices, (respArea, key) => {
85
51
  if (!correctAnswers[key]) {
86
52
  correctAnswers[key] = [];
@@ -101,11 +67,7 @@ var getAllCorrectResponses = _ref => {
101
67
  return correctAnswers;
102
68
  };
103
69
 
104
- 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; }
105
-
106
- 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; }
107
-
108
- var getFeedback = correct => {
70
+ const getFeedback = correct => {
109
71
  if (correct) {
110
72
  return 'correct';
111
73
  }
@@ -113,7 +75,7 @@ var getFeedback = correct => {
113
75
  return 'incorrect';
114
76
  };
115
77
 
116
- var normalize = question => _objectSpread(_objectSpread({}, defaults), question);
78
+ const normalize = question => _extends({}, defaults, question);
117
79
  /**
118
80
  *
119
81
  * @param {*} question
@@ -123,123 +85,110 @@ var normalize = question => _objectSpread(_objectSpread({}, defaults), question)
123
85
  */
124
86
 
125
87
  function model(question, session, env, updateSession) {
126
- return new Promise( /*#__PURE__*/function () {
127
- var _ref = _asyncToGenerator(function* (resolve) {
128
- var normalizedQuestion = normalize(question);
129
- var {
130
- value = {}
131
- } = session || {};
132
- var choices = reduce(normalizedQuestion.choices, (obj, area, key) => {
133
- obj[key] = map(area, choice => choice);
134
- return obj;
135
- }, {});
136
- var feedback = {};
137
-
138
- if (env.mode === 'evaluate') {
139
- var allCorrectResponses = getAllCorrectResponses(normalizedQuestion);
140
- var respAreaLength = Object.keys(allCorrectResponses).length;
141
- var correctResponses = 0;
142
-
143
- var _loop = function _loop(i) {
144
- var result = reduce(allCorrectResponses, (obj, choices, key) => {
145
- var answer = value && value[key] || '';
146
- var correctChoice = choices[i] || '';
147
- var isCorrect = answer && correctChoice && correctChoice === answer;
148
- obj.feedback[key] = getFeedback(isCorrect);
149
-
150
- if (isCorrect) {
151
- obj.correctResponses += 1;
152
- }
153
-
154
- return obj;
155
- }, {
156
- correctResponses: 0,
157
- feedback: {}
158
- });
159
-
160
- if (result.correctResponses >= correctResponses) {
161
- correctResponses = result.correctResponses;
162
- feedback = result.feedback;
88
+ return new Promise(async resolve => {
89
+ const normalizedQuestion = normalize(question);
90
+ const {
91
+ value = {}
92
+ } = session || {};
93
+ let choices = reduce(normalizedQuestion.choices, (obj, area, key) => {
94
+ obj[key] = map(area, choice => choice);
95
+ return obj;
96
+ }, {});
97
+ let feedback = {};
98
+
99
+ if (env.mode === 'evaluate') {
100
+ const allCorrectResponses = getAllCorrectResponses(normalizedQuestion);
101
+ const respAreaLength = Object.keys(allCorrectResponses).length;
102
+ let correctResponses = 0;
103
+
104
+ for (let i = 0; i < respAreaLength; i++) {
105
+ const result = reduce(allCorrectResponses, (obj, choices, key) => {
106
+ const answer = value && value[key] || '';
107
+ const correctChoice = choices[i] || '';
108
+ const isCorrect = answer && correctChoice && correctChoice === answer;
109
+ obj.feedback[key] = getFeedback(isCorrect);
110
+
111
+ if (isCorrect) {
112
+ obj.correctResponses += 1;
163
113
  }
164
114
 
165
- if (result.correctResponses === respAreaLength) {
166
- return "break";
167
- }
168
- };
115
+ return obj;
116
+ }, {
117
+ correctResponses: 0,
118
+ feedback: {}
119
+ });
169
120
 
170
- for (var i = 0; i < respAreaLength; i++) {
171
- var _ret = _loop(i);
121
+ if (result.correctResponses >= correctResponses) {
122
+ correctResponses = result.correctResponses;
123
+ feedback = result.feedback;
124
+ }
172
125
 
173
- if (_ret === "break") break;
126
+ if (result.correctResponses === respAreaLength) {
127
+ break;
174
128
  }
175
129
  }
130
+ }
176
131
 
177
- var lockChoiceOrder = lockChoices(normalizedQuestion, session, env);
178
-
179
- if (!lockChoiceOrder) {
180
- var keys = Object.keys(choices);
181
-
182
- var _i;
132
+ const lockChoiceOrder = lockChoices(normalizedQuestion, session, env);
183
133
 
184
- for (_i = 0; _i < keys.length; _i++) {
185
- var key = keys[_i];
186
- choices[key] = yield getShuffledChoices(choices[key], session, updateSession, 'value');
187
- }
188
- }
134
+ if (!lockChoiceOrder) {
135
+ const keys = Object.keys(choices);
136
+ let i;
189
137
 
190
- var teacherInstructions = null;
191
- var rationale = null;
192
- var choicesWillNullRationales = (Object.keys(choices) || []).reduce((acc, currentValue) => {
193
- acc[currentValue] = (choices[currentValue] || []).map(choice => _objectSpread(_objectSpread({}, choice), {}, {
194
- rationale: null
195
- }));
196
- return acc;
197
- }, {});
198
-
199
- if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {
200
- rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;
201
- teacherInstructions = normalizedQuestion.teacherInstructionsEnabled ? normalizedQuestion.teacherInstructions : null;
202
- choices = normalizedQuestion.choiceRationaleEnabled ? normalizedQuestion.choices : choicesWillNullRationales;
203
- } else {
204
- rationale = null;
205
- teacherInstructions = null;
206
- choices = choicesWillNullRationales;
138
+ for (i = 0; i < keys.length; i++) {
139
+ const key = keys[i];
140
+ choices[key] = await getShuffledChoices(choices[key], session, updateSession, 'value');
207
141
  }
142
+ }
208
143
 
209
- var out = {
210
- disabled: env.mode !== 'gather',
211
- mode: env.mode,
212
- prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,
213
- displayType: normalizedQuestion.displayType,
214
- markup: normalizedQuestion.markup,
215
- choices,
216
- feedback,
217
- responseCorrect: env.mode === 'evaluate' ? getScore(normalizedQuestion, session) === 1 : undefined,
218
- rationale,
219
- teacherInstructions,
220
- language: normalizedQuestion.language,
221
- extraCSSRules: normalizedQuestion.extraCSSRules
222
- };
223
- resolve(out);
224
- });
144
+ let teacherInstructions = null;
145
+ let rationale = null;
146
+ const choicesWillNullRationales = (Object.keys(choices) || []).reduce((acc, currentValue) => {
147
+ acc[currentValue] = (choices[currentValue] || []).map(choice => _extends({}, choice, {
148
+ rationale: null
149
+ }));
150
+ return acc;
151
+ }, {});
152
+
153
+ if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {
154
+ rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;
155
+ teacherInstructions = normalizedQuestion.teacherInstructionsEnabled ? normalizedQuestion.teacherInstructions : null;
156
+ choices = normalizedQuestion.choiceRationaleEnabled ? normalizedQuestion.choices : choicesWillNullRationales;
157
+ } else {
158
+ rationale = null;
159
+ teacherInstructions = null;
160
+ choices = choicesWillNullRationales;
161
+ }
225
162
 
226
- return function (_x) {
227
- return _ref.apply(this, arguments);
163
+ const out = {
164
+ disabled: env.mode !== 'gather',
165
+ mode: env.mode,
166
+ prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,
167
+ displayType: normalizedQuestion.displayType,
168
+ markup: normalizedQuestion.markup,
169
+ choices,
170
+ feedback,
171
+ responseCorrect: env.mode === 'evaluate' ? getScore(normalizedQuestion, session) === 1 : undefined,
172
+ rationale,
173
+ teacherInstructions,
174
+ language: normalizedQuestion.language,
175
+ extraCSSRules: normalizedQuestion.extraCSSRules
228
176
  };
229
- }());
177
+ resolve(out);
178
+ });
230
179
  }
231
- var getScore = (config, session) => {
232
- var {
180
+ const getScore = (config, session) => {
181
+ const {
233
182
  value = {}
234
183
  } = session || {};
235
- var maxScore = config && config.choices ? Object.keys(config.choices).length : 0;
236
- var allCorrectResponses = getAllCorrectResponses(config);
237
- var correctCount = 0;
184
+ const maxScore = config && config.choices ? Object.keys(config.choices).length : 0;
185
+ const allCorrectResponses = getAllCorrectResponses(config);
186
+ let correctCount = 0;
238
187
 
239
- var _loop2 = function _loop2(i) {
240
- var result = reduce(allCorrectResponses, (total, choices, key) => {
241
- var answer = value && value[key] || '';
242
- var correctChoice = choices[i] || '';
188
+ for (let i = 0; i < maxScore; i++) {
189
+ const result = reduce(allCorrectResponses, (total, choices, key) => {
190
+ const answer = value && value[key] || '';
191
+ const correctChoice = choices[i] || '';
243
192
 
244
193
  if (correctChoice && answer && correctChoice === answer) {
245
194
  return total;
@@ -253,17 +202,11 @@ var getScore = (config, session) => {
253
202
  }
254
203
 
255
204
  if (result === maxScore) {
256
- return "break";
205
+ break;
257
206
  }
258
- };
259
-
260
- for (var i = 0; i < maxScore; i++) {
261
- var _ret2 = _loop2(i);
262
-
263
- if (_ret2 === "break") break;
264
207
  }
265
208
 
266
- var str = (correctCount / maxScore).toFixed(2);
209
+ const str = (correctCount / maxScore).toFixed(2);
267
210
  return parseFloat(str);
268
211
  };
269
212
  /**
@@ -279,8 +222,7 @@ var getScore = (config, session) => {
279
222
  * `model.partialScoring`.
280
223
  */
281
224
 
282
- function outcome(model, session) {
283
- var env = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
225
+ function outcome(model, session, env = {}) {
284
226
  return new Promise(resolve => {
285
227
  if (!session || isEmpty(session)) {
286
228
  resolve({
@@ -289,25 +231,25 @@ function outcome(model, session) {
289
231
  });
290
232
  }
291
233
 
292
- var partialScoringEnabled = partialScoring.enabled(model, env);
293
- var score = getScore(model, session);
234
+ const partialScoringEnabled = partialScoring.enabled(model, env);
235
+ const score = getScore(model, session);
294
236
  resolve({
295
237
  score: partialScoringEnabled ? score : Math.floor(score),
296
238
  empty: false
297
239
  });
298
240
  });
299
241
  }
300
- var createCorrectResponseSession = (question, env) => {
242
+ const createCorrectResponseSession = (question, env) => {
301
243
  return new Promise(resolve => {
302
244
  if (env.mode !== 'evaluate' && env.role === 'instructor') {
303
- var {
245
+ const {
304
246
  choices
305
247
  } = question;
306
- var value = {};
248
+ const value = {};
307
249
 
308
250
  if (choices) {
309
251
  Object.keys(choices).forEach((key, i) => {
310
- var correctChoices = choices[key] && choices[key].filter(c => c.correct);
252
+ const correctChoices = choices[key] && choices[key].filter(c => c.correct);
311
253
  value[i] = correctChoices && correctChoices[0].value;
312
254
  });
313
255
  }
@@ -323,38 +265,36 @@ var createCorrectResponseSession = (question, env) => {
323
265
  }; // remove all html tags
324
266
 
325
267
 
326
- var getContent = html => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
268
+ const getContent = html => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
327
269
 
328
- var validate = function validate() {
329
- var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
330
- var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
331
- var {
270
+ const validate = (model = {}, config = {}) => {
271
+ const {
332
272
  markup,
333
273
  choices
334
274
  } = model;
335
- var {
275
+ const {
336
276
  maxResponseAreas,
337
277
  maxResponseAreaChoices
338
278
  } = config;
339
- var errors = {};
279
+ const errors = {};
340
280
  ['teacherInstructions', 'prompt', 'rationale'].forEach(field => {
341
281
  var _config$field;
342
282
 
343
- if ((_config$field = config[field]) !== null && _config$field !== void 0 && _config$field.required && !getContent(model[field])) {
283
+ if ((_config$field = config[field]) != null && _config$field.required && !getContent(model[field])) {
344
284
  errors[field] = 'This field is required.';
345
285
  }
346
286
  });
347
- var nbOfResponseAreas = ((markup || '').match(/\{\{(\d+)\}\}/g) || []).length;
287
+ const nbOfResponseAreas = ((markup || '').match(/\{\{(\d+)\}\}/g) || []).length;
348
288
 
349
289
  if (nbOfResponseAreas > maxResponseAreas) {
350
- errors.responseAreasError = "No more than ".concat(maxResponseAreas, " response areas should be defined.");
290
+ errors.responseAreasError = `No more than ${maxResponseAreas} response areas should be defined.`;
351
291
  } else if (nbOfResponseAreas < 1) {
352
292
  errors.responseAreasError = 'There should be defined at least 1 response area.';
353
293
  }
354
294
 
355
295
  (Object.keys(choices) || []).forEach(choiceKey => {
356
296
  if (choices[choiceKey] && choices[choiceKey].length > maxResponseAreaChoices) {
357
- errors.responseAreaChoicesError = "No more than ".concat(maxResponseAreaChoices, " choices per response area should be defined.");
297
+ errors.responseAreaChoicesError = `No more than ${maxResponseAreaChoices} choices per response area should be defined.`;
358
298
  }
359
299
  });
360
300
  return errors;
@@ -1 +1 @@
1
- {"version":3,"file":"controller.js","sources":["../../../node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js","../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js","../controller/src/defaults.js","../controller/src/utils.js","../controller/src/index.js"],"sourcesContent":["function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\n\nexport default function _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n\n _next(undefined);\n });\n };\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}","export default {\n alternateResponse: {},\n choiceRationaleEnabled: true,\n choices: {},\n disabled: false,\n displayType: 'block',\n markup: '',\n mode: 'gather',\n prompt: '',\n promptEnabled: true,\n rationale: '',\n rationaleEnabled: true,\n shuffle: true,\n studentInstructionsEnabled: true,\n teacherInstructions: '',\n teacherInstructionsEnabled: true,\n toolbarEditorPosition: 'bottom',\n};\n","import forEach from 'lodash/forEach';\n\nexport const getAllCorrectResponses = ({ choices, alternateResponse }) => {\n alternateResponse = alternateResponse || {};\n const correctAnswers = {};\n\n forEach(choices, (respArea, key) => {\n if (!correctAnswers[key]) {\n correctAnswers[key] = [];\n }\n\n if (respArea) {\n respArea.forEach((choice) => {\n if (choice.correct) {\n correctAnswers[key].push(choice.value);\n\n if (alternateResponse[key]) {\n correctAnswers[key] = [...correctAnswers[key], ...alternateResponse[key]];\n }\n }\n });\n }\n });\n\n return correctAnswers;\n};\n","import map from 'lodash/map';\nimport reduce from 'lodash/reduce';\nimport isEmpty from 'lodash/isEmpty';\nimport { lockChoices, getShuffledChoices, partialScoring } from '@pie-lib/controller-utils';\nimport defaults from './defaults';\n\nimport { getAllCorrectResponses } from './utils';\n\nconst getFeedback = (correct) => {\n if (correct) {\n return 'correct';\n }\n\n return 'incorrect';\n};\n\nexport const normalize = (question) => ({ ...defaults, ...question });\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n * @param {*} updateSession - optional - a function that will set the properties passed into it on the session.\n */\nexport function model(question, session, env, updateSession) {\n return new Promise(async (resolve) => {\n const normalizedQuestion = normalize(question);\n const { value = {} } = session || {};\n let choices = reduce(\n normalizedQuestion.choices,\n (obj, area, key) => {\n obj[key] = map(area, (choice) => choice);\n\n return obj;\n },\n {},\n );\n\n let feedback = {};\n\n if (env.mode === 'evaluate') {\n const allCorrectResponses = getAllCorrectResponses(normalizedQuestion);\n const respAreaLength = Object.keys(allCorrectResponses).length;\n let correctResponses = 0;\n\n for (let i = 0; i < respAreaLength; i++) {\n const result = reduce(\n allCorrectResponses,\n (obj, choices, key) => {\n const answer = (value && value[key]) || '';\n const correctChoice = choices[i] || '';\n const isCorrect = answer && correctChoice && correctChoice === answer;\n\n obj.feedback[key] = getFeedback(isCorrect);\n\n if (isCorrect) {\n obj.correctResponses += 1;\n }\n\n return obj;\n },\n { correctResponses: 0, feedback: {} },\n );\n\n if (result.correctResponses >= correctResponses) {\n correctResponses = result.correctResponses;\n feedback = result.feedback;\n }\n\n if (result.correctResponses === respAreaLength) {\n break;\n }\n }\n }\n\n const lockChoiceOrder = lockChoices(normalizedQuestion, session, env);\n\n if (!lockChoiceOrder) {\n const keys = Object.keys(choices);\n let i;\n\n for (i = 0; i < keys.length; i++) {\n const key = keys[i];\n\n choices[key] = await getShuffledChoices(choices[key], session, updateSession, 'value');\n }\n }\n\n let teacherInstructions = null;\n let rationale = null;\n\n const choicesWillNullRationales = (Object.keys(choices) || []).reduce((acc, currentValue) => {\n acc[currentValue] = (choices[currentValue] || []).map((choice) => ({\n ...choice,\n rationale: null,\n }));\n\n return acc;\n }, {});\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;\n teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n\n choices = normalizedQuestion.choiceRationaleEnabled ? normalizedQuestion.choices : choicesWillNullRationales;\n } else {\n rationale = null;\n teacherInstructions = null;\n choices = choicesWillNullRationales;\n }\n\n const out = {\n disabled: env.mode !== 'gather',\n mode: env.mode,\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n displayType: normalizedQuestion.displayType,\n markup: normalizedQuestion.markup,\n choices,\n feedback,\n\n responseCorrect: env.mode === 'evaluate' ? getScore(normalizedQuestion, session) === 1 : undefined,\n rationale,\n teacherInstructions,\n language: normalizedQuestion.language,\n extraCSSRules: normalizedQuestion.extraCSSRules,\n };\n\n resolve(out);\n });\n}\n\nexport const getScore = (config, session) => {\n const { value = {} } = session || {};\n const maxScore = config && config.choices ? Object.keys(config.choices).length : 0;\n const allCorrectResponses = getAllCorrectResponses(config);\n let correctCount = 0;\n\n for (let i = 0; i < maxScore; i++) {\n const result = reduce(\n allCorrectResponses,\n (total, choices, key) => {\n const answer = (value && value[key]) || '';\n const correctChoice = choices[i] || '';\n\n if (correctChoice && answer && correctChoice === answer) {\n return total;\n }\n\n return total - 1;\n },\n maxScore,\n );\n\n if (result > correctCount) {\n correctCount = result;\n }\n\n if (result === maxScore) {\n break;\n }\n }\n\n const str = (correctCount / maxScore).toFixed(2);\n\n return parseFloat(str);\n};\n\n/**\n *\n * The score is partial by default for checkbox mode, allOrNothing for radio mode.\n * To disable partial scoring for checkbox mode you either set model.partialScoring = false or env.partialScoring =\n * false. the value in `env` will override the value in `model`.\n * @param {Object} model - the main model\n * @param {boolean} model.partialScoring - is partial scoring enabled (if undefined set to to true)\n * @param {*} session\n * @param {Object} env\n * @param {boolean} env.partialScoring - is partial scoring enabled (if undefined default to true) This overrides\n * `model.partialScoring`.\n */\nexport function outcome(model, session, env = {}) {\n return new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n }\n\n const partialScoringEnabled = partialScoring.enabled(model, env);\n const score = getScore(model, session);\n\n resolve({\n score: partialScoringEnabled ? score : Math.floor(score),\n empty: false,\n });\n });\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { choices } = question;\n const value = {};\n\n if (choices) {\n Object.keys(choices).forEach((key, i) => {\n const correctChoices = choices[key] && choices[key].filter((c) => c.correct);\n\n value[i] = correctChoices && correctChoices[0].value;\n });\n }\n\n resolve({\n id: '1',\n value,\n });\n } else {\n 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 { markup, choices } = model;\n const { maxResponseAreas, maxResponseAreaChoices } = config;\n const errors = {};\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 const nbOfResponseAreas = ((markup || '').match(/\\{\\{(\\d+)\\}\\}/g) || []).length;\n\n if (nbOfResponseAreas > maxResponseAreas) {\n errors.responseAreasError = `No more than ${maxResponseAreas} response areas should be defined.`;\n } else if (nbOfResponseAreas < 1) {\n errors.responseAreasError = 'There should be defined at least 1 response area.';\n }\n\n (Object.keys(choices) || []).forEach((choiceKey) => {\n if (choices[choiceKey] && choices[choiceKey].length > maxResponseAreaChoices) {\n errors.responseAreaChoicesError = `No more than ${maxResponseAreaChoices} choices per response area should be defined.`;\n }\n });\n\n return errors;\n};\n"],"names":["alternateResponse","choiceRationaleEnabled","choices","disabled","displayType","markup","mode","prompt","promptEnabled","rationale","rationaleEnabled","shuffle","studentInstructionsEnabled","teacherInstructions","teacherInstructionsEnabled","toolbarEditorPosition","getAllCorrectResponses","correctAnswers","forEach","respArea","key","choice","correct","push","value","getFeedback","normalize","question","defaults","model","session","env","updateSession","Promise","resolve","normalizedQuestion","reduce","obj","area","map","feedback","allCorrectResponses","respAreaLength","Object","keys","length","correctResponses","i","result","answer","correctChoice","isCorrect","lockChoiceOrder","lockChoices","getShuffledChoices","choicesWillNullRationales","acc","currentValue","role","out","responseCorrect","getScore","undefined","language","extraCSSRules","config","maxScore","correctCount","total","str","toFixed","parseFloat","outcome","isEmpty","score","empty","partialScoringEnabled","partialScoring","enabled","Math","floor","createCorrectResponseSession","correctChoices","filter","c","id","getContent","html","replace","validate","maxResponseAreas","maxResponseAreaChoices","errors","field","required","nbOfResponseAreas","match","responseAreasError","choiceKey","responseAreaChoicesError"],"mappings":"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"}
1
+ {"version":3,"file":"controller.js","sources":["../controller/src/defaults.js","../controller/src/utils.js","../controller/src/index.js"],"sourcesContent":["export default {\n alternateResponse: {},\n choiceRationaleEnabled: true,\n choices: {},\n disabled: false,\n displayType: 'block',\n markup: '',\n mode: 'gather',\n prompt: '',\n promptEnabled: true,\n rationale: '',\n rationaleEnabled: true,\n shuffle: true,\n studentInstructionsEnabled: true,\n teacherInstructions: '',\n teacherInstructionsEnabled: true,\n toolbarEditorPosition: 'bottom',\n};\n","import forEach from 'lodash/forEach';\n\nexport const getAllCorrectResponses = ({ choices, alternateResponse }) => {\n alternateResponse = alternateResponse || {};\n const correctAnswers = {};\n\n forEach(choices, (respArea, key) => {\n if (!correctAnswers[key]) {\n correctAnswers[key] = [];\n }\n\n if (respArea) {\n respArea.forEach((choice) => {\n if (choice.correct) {\n correctAnswers[key].push(choice.value);\n\n if (alternateResponse[key]) {\n correctAnswers[key] = [...correctAnswers[key], ...alternateResponse[key]];\n }\n }\n });\n }\n });\n\n return correctAnswers;\n};\n","import map from 'lodash/map';\nimport reduce from 'lodash/reduce';\nimport isEmpty from 'lodash/isEmpty';\nimport { lockChoices, getShuffledChoices, partialScoring } from '@pie-lib/controller-utils';\nimport defaults from './defaults';\n\nimport { getAllCorrectResponses } from './utils';\n\nconst getFeedback = (correct) => {\n if (correct) {\n return 'correct';\n }\n\n return 'incorrect';\n};\n\nexport const normalize = (question) => ({ ...defaults, ...question });\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n * @param {*} updateSession - optional - a function that will set the properties passed into it on the session.\n */\nexport function model(question, session, env, updateSession) {\n return new Promise(async (resolve) => {\n const normalizedQuestion = normalize(question);\n const { value = {} } = session || {};\n let choices = reduce(\n normalizedQuestion.choices,\n (obj, area, key) => {\n obj[key] = map(area, (choice) => choice);\n\n return obj;\n },\n {},\n );\n\n let feedback = {};\n\n if (env.mode === 'evaluate') {\n const allCorrectResponses = getAllCorrectResponses(normalizedQuestion);\n const respAreaLength = Object.keys(allCorrectResponses).length;\n let correctResponses = 0;\n\n for (let i = 0; i < respAreaLength; i++) {\n const result = reduce(\n allCorrectResponses,\n (obj, choices, key) => {\n const answer = (value && value[key]) || '';\n const correctChoice = choices[i] || '';\n const isCorrect = answer && correctChoice && correctChoice === answer;\n\n obj.feedback[key] = getFeedback(isCorrect);\n\n if (isCorrect) {\n obj.correctResponses += 1;\n }\n\n return obj;\n },\n { correctResponses: 0, feedback: {} },\n );\n\n if (result.correctResponses >= correctResponses) {\n correctResponses = result.correctResponses;\n feedback = result.feedback;\n }\n\n if (result.correctResponses === respAreaLength) {\n break;\n }\n }\n }\n\n const lockChoiceOrder = lockChoices(normalizedQuestion, session, env);\n\n if (!lockChoiceOrder) {\n const keys = Object.keys(choices);\n let i;\n\n for (i = 0; i < keys.length; i++) {\n const key = keys[i];\n\n choices[key] = await getShuffledChoices(choices[key], session, updateSession, 'value');\n }\n }\n\n let teacherInstructions = null;\n let rationale = null;\n\n const choicesWillNullRationales = (Object.keys(choices) || []).reduce((acc, currentValue) => {\n acc[currentValue] = (choices[currentValue] || []).map((choice) => ({\n ...choice,\n rationale: null,\n }));\n\n return acc;\n }, {});\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;\n teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n\n choices = normalizedQuestion.choiceRationaleEnabled ? normalizedQuestion.choices : choicesWillNullRationales;\n } else {\n rationale = null;\n teacherInstructions = null;\n choices = choicesWillNullRationales;\n }\n\n const out = {\n disabled: env.mode !== 'gather',\n mode: env.mode,\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n displayType: normalizedQuestion.displayType,\n markup: normalizedQuestion.markup,\n choices,\n feedback,\n\n responseCorrect: env.mode === 'evaluate' ? getScore(normalizedQuestion, session) === 1 : undefined,\n rationale,\n teacherInstructions,\n language: normalizedQuestion.language,\n extraCSSRules: normalizedQuestion.extraCSSRules,\n };\n\n resolve(out);\n });\n}\n\nexport const getScore = (config, session) => {\n const { value = {} } = session || {};\n const maxScore = config && config.choices ? Object.keys(config.choices).length : 0;\n const allCorrectResponses = getAllCorrectResponses(config);\n let correctCount = 0;\n\n for (let i = 0; i < maxScore; i++) {\n const result = reduce(\n allCorrectResponses,\n (total, choices, key) => {\n const answer = (value && value[key]) || '';\n const correctChoice = choices[i] || '';\n\n if (correctChoice && answer && correctChoice === answer) {\n return total;\n }\n\n return total - 1;\n },\n maxScore,\n );\n\n if (result > correctCount) {\n correctCount = result;\n }\n\n if (result === maxScore) {\n break;\n }\n }\n\n const str = (correctCount / maxScore).toFixed(2);\n\n return parseFloat(str);\n};\n\n/**\n *\n * The score is partial by default for checkbox mode, allOrNothing for radio mode.\n * To disable partial scoring for checkbox mode you either set model.partialScoring = false or env.partialScoring =\n * false. the value in `env` will override the value in `model`.\n * @param {Object} model - the main model\n * @param {boolean} model.partialScoring - is partial scoring enabled (if undefined set to to true)\n * @param {*} session\n * @param {Object} env\n * @param {boolean} env.partialScoring - is partial scoring enabled (if undefined default to true) This overrides\n * `model.partialScoring`.\n */\nexport function outcome(model, session, env = {}) {\n return new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n }\n\n const partialScoringEnabled = partialScoring.enabled(model, env);\n const score = getScore(model, session);\n\n resolve({\n score: partialScoringEnabled ? score : Math.floor(score),\n empty: false,\n });\n });\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { choices } = question;\n const value = {};\n\n if (choices) {\n Object.keys(choices).forEach((key, i) => {\n const correctChoices = choices[key] && choices[key].filter((c) => c.correct);\n\n value[i] = correctChoices && correctChoices[0].value;\n });\n }\n\n resolve({\n id: '1',\n value,\n });\n } else {\n 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 { markup, choices } = model;\n const { maxResponseAreas, maxResponseAreaChoices } = config;\n const errors = {};\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 const nbOfResponseAreas = ((markup || '').match(/\\{\\{(\\d+)\\}\\}/g) || []).length;\n\n if (nbOfResponseAreas > maxResponseAreas) {\n errors.responseAreasError = `No more than ${maxResponseAreas} response areas should be defined.`;\n } else if (nbOfResponseAreas < 1) {\n errors.responseAreasError = 'There should be defined at least 1 response area.';\n }\n\n (Object.keys(choices) || []).forEach((choiceKey) => {\n if (choices[choiceKey] && choices[choiceKey].length > maxResponseAreaChoices) {\n errors.responseAreaChoicesError = `No more than ${maxResponseAreaChoices} choices per response area should be defined.`;\n }\n });\n\n return errors;\n};\n"],"names":["alternateResponse","choiceRationaleEnabled","choices","disabled","displayType","markup","mode","prompt","promptEnabled","rationale","rationaleEnabled","shuffle","studentInstructionsEnabled","teacherInstructions","teacherInstructionsEnabled","toolbarEditorPosition","getAllCorrectResponses","correctAnswers","forEach","respArea","key","choice","correct","push","value","getFeedback","normalize","question","defaults","model","session","env","updateSession","Promise","resolve","normalizedQuestion","reduce","obj","area","map","feedback","allCorrectResponses","respAreaLength","Object","keys","length","correctResponses","i","result","answer","correctChoice","isCorrect","lockChoiceOrder","lockChoices","getShuffledChoices","choicesWillNullRationales","acc","currentValue","role","out","responseCorrect","getScore","undefined","language","extraCSSRules","config","maxScore","correctCount","total","str","toFixed","parseFloat","outcome","isEmpty","score","empty","partialScoringEnabled","partialScoring","enabled","Math","floor","createCorrectResponseSession","correctChoices","filter","c","id","getContent","html","replace","validate","maxResponseAreas","maxResponseAreaChoices","errors","field","required","nbOfResponseAreas","match","responseAreasError","choiceKey","responseAreaChoicesError"],"mappings":"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"}