@pie-element/inline-dropdown 8.3.4-next.3 → 9.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/configure/lib/defaults.js +2 -3
- package/configure/lib/defaults.js.map +1 -1
- package/configure/lib/index.js +111 -185
- package/configure/lib/index.js.map +1 -1
- package/configure/lib/inline-dropdown-toolbar.js +364 -482
- package/configure/lib/inline-dropdown-toolbar.js.map +1 -1
- package/configure/lib/main.js +457 -597
- package/configure/lib/main.js.map +1 -1
- package/configure/lib/markupUtils.js +20 -39
- package/configure/lib/markupUtils.js.map +1 -1
- package/configure/lib/response-area.js +33 -84
- package/configure/lib/response-area.js.map +1 -1
- package/configure/lib/utils.js +11 -22
- package/configure/lib/utils.js.map +1 -1
- package/configure/package.json +11 -9
- package/controller/lib/defaults.js +2 -3
- package/controller/lib/defaults.js.map +1 -1
- package/controller/lib/index.js +156 -290
- package/controller/lib/index.js.map +1 -1
- package/controller/lib/utils.js +8 -15
- package/controller/lib/utils.js.map +1 -1
- package/controller/package.json +2 -2
- package/lib/index.js +65 -110
- package/lib/index.js.map +1 -1
- package/lib/inline-dropdown.js +148 -220
- package/lib/inline-dropdown.js.map +1 -1
- package/package.json +12 -10
- package/esm/configure.js +0 -24594
- package/esm/configure.js.map +0 -1
- package/esm/controller.js +0 -3944
- package/esm/controller.js.map +0 -1
- package/esm/element.js +0 -9587
- package/esm/element.js.map +0 -1
- package/esm/package.json +0 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"defaults.js","names":["alternateResponse","choiceRationaleEnabled","choices","disabled","displayType","markup","mode","prompt","promptEnabled","rationale","rationaleEnabled","shuffle","studentInstructionsEnabled","teacherInstructions","teacherInstructionsEnabled","toolbarEditorPosition"],"sources":["../src/defaults.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"],"mappings":";;;;;;iCAAe;EACbA,iBAAiB,EAAE,CAAC,CAAC;EACrBC,sBAAsB,EAAE,IAAI;EAC5BC,OAAO,EAAE,CAAC,CAAC;EACXC,QAAQ,EAAE,KAAK;EACfC,WAAW,EAAE,OAAO;EACpBC,MAAM,EAAE,EAAE;EACVC,IAAI,EAAE,QAAQ;EACdC,MAAM,EAAE,EAAE;EACVC,aAAa,EAAE,IAAI;EACnBC,SAAS,EAAE,EAAE;EACbC,gBAAgB,EAAE,IAAI;EACtBC,OAAO,EAAE,IAAI;EACbC,0BAA0B,EAAE,IAAI;EAChCC,mBAAmB,EAAE,EAAE;EACvBC,0BAA0B,EAAE,IAAI;EAChCC,qBAAqB,EAAE;AACzB,CAAC","ignoreList":[]}
|
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,40 +9,23 @@ exports.model = model;
|
|
|
10
9
|
exports.normalize = void 0;
|
|
11
10
|
exports.outcome = outcome;
|
|
12
11
|
exports.validate = void 0;
|
|
13
|
-
|
|
14
|
-
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
15
|
-
|
|
16
|
-
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
17
|
-
|
|
18
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
19
|
-
|
|
20
12
|
var _map = _interopRequireDefault(require("lodash/map"));
|
|
21
|
-
|
|
22
13
|
var _reduce = _interopRequireDefault(require("lodash/reduce"));
|
|
23
|
-
|
|
24
14
|
var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
|
|
25
|
-
|
|
26
15
|
var _controllerUtils = require("@pie-lib/controller-utils");
|
|
27
|
-
|
|
28
16
|
var _defaults = _interopRequireDefault(require("./defaults"));
|
|
29
|
-
|
|
30
17
|
var _utils = require("./utils");
|
|
31
|
-
|
|
32
|
-
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; }
|
|
33
|
-
|
|
34
|
-
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; }
|
|
35
|
-
|
|
36
|
-
var getFeedback = function getFeedback(correct) {
|
|
18
|
+
const getFeedback = correct => {
|
|
37
19
|
if (correct) {
|
|
38
20
|
return 'correct';
|
|
39
21
|
}
|
|
40
|
-
|
|
41
22
|
return 'incorrect';
|
|
42
23
|
};
|
|
24
|
+
const normalize = question => ({
|
|
25
|
+
..._defaults.default,
|
|
26
|
+
...question
|
|
27
|
+
});
|
|
43
28
|
|
|
44
|
-
var normalize = function normalize(question) {
|
|
45
|
-
return _objectSpread(_objectSpread({}, _defaults["default"]), question);
|
|
46
|
-
};
|
|
47
29
|
/**
|
|
48
30
|
*
|
|
49
31
|
* @param {*} question
|
|
@@ -51,235 +33,137 @@ var normalize = function normalize(question) {
|
|
|
51
33
|
* @param {*} env
|
|
52
34
|
* @param {*} updateSession - optional - a function that will set the properties passed into it on the session.
|
|
53
35
|
*/
|
|
54
|
-
|
|
55
|
-
|
|
56
36
|
exports.normalize = normalize;
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
break;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
allCorrectResponses = (0, _utils.getAllCorrectResponses)(normalizedQuestion);
|
|
83
|
-
respAreaLength = Object.keys(allCorrectResponses).length;
|
|
84
|
-
correctResponses = 0;
|
|
85
|
-
|
|
86
|
-
_loop = function _loop(i) {
|
|
87
|
-
var result = (0, _reduce["default"])(allCorrectResponses, function (obj, choices, key) {
|
|
88
|
-
var answer = value && value[key] || '';
|
|
89
|
-
var correctChoice = choices[i] || '';
|
|
90
|
-
var isCorrect = answer && correctChoice && correctChoice === answer;
|
|
91
|
-
obj.feedback[key] = getFeedback(isCorrect);
|
|
92
|
-
|
|
93
|
-
if (isCorrect) {
|
|
94
|
-
obj.correctResponses += 1;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
return obj;
|
|
98
|
-
}, {
|
|
99
|
-
correctResponses: 0,
|
|
100
|
-
feedback: {}
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
if (result.correctResponses >= correctResponses) {
|
|
104
|
-
correctResponses = result.correctResponses;
|
|
105
|
-
feedback = result.feedback;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
if (result.correctResponses === respAreaLength) {
|
|
109
|
-
return "break";
|
|
110
|
-
}
|
|
111
|
-
};
|
|
112
|
-
|
|
113
|
-
i = 0;
|
|
114
|
-
|
|
115
|
-
case 10:
|
|
116
|
-
if (!(i < respAreaLength)) {
|
|
117
|
-
_context.next = 17;
|
|
118
|
-
break;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
_ret = _loop(i);
|
|
122
|
-
|
|
123
|
-
if (!(_ret === "break")) {
|
|
124
|
-
_context.next = 14;
|
|
125
|
-
break;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
return _context.abrupt("break", 17);
|
|
129
|
-
|
|
130
|
-
case 14:
|
|
131
|
-
i++;
|
|
132
|
-
_context.next = 10;
|
|
133
|
-
break;
|
|
134
|
-
|
|
135
|
-
case 17:
|
|
136
|
-
lockChoiceOrder = (0, _controllerUtils.lockChoices)(normalizedQuestion, session, env);
|
|
137
|
-
|
|
138
|
-
if (lockChoiceOrder) {
|
|
139
|
-
_context.next = 33;
|
|
140
|
-
break;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
shuffledValues = {};
|
|
144
|
-
keys = Object.keys(choices);
|
|
145
|
-
|
|
146
|
-
us = function us(part) {
|
|
147
|
-
return function (id, element, update) {
|
|
148
|
-
return new Promise(function (resolve) {
|
|
149
|
-
shuffledValues[part] = update.shuffledValues;
|
|
150
|
-
resolve();
|
|
151
|
-
});
|
|
152
|
-
};
|
|
153
|
-
};
|
|
154
|
-
|
|
155
|
-
_i = 0;
|
|
156
|
-
|
|
157
|
-
case 23:
|
|
158
|
-
if (!(_i < keys.length)) {
|
|
159
|
-
_context.next = 32;
|
|
160
|
-
break;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
key = keys[_i];
|
|
164
|
-
storedValues = session === null || session === void 0 ? void 0 : (_session$shuffledValu = session.shuffledValues) === null || _session$shuffledValu === void 0 ? void 0 : _session$shuffledValu[key];
|
|
165
|
-
_context.next = 28;
|
|
166
|
-
return (0, _controllerUtils.getShuffledChoices)(choices[key], // the shuffledValues structure was updated to an object like { choice_key: [] }
|
|
167
|
-
// and we need to override shuffledValues if it's not an array
|
|
168
|
-
{
|
|
169
|
-
shuffledValues: Array.isArray(storedValues) ? storedValues : []
|
|
170
|
-
}, us(key), 'value');
|
|
171
|
-
|
|
172
|
-
case 28:
|
|
173
|
-
choices[key] = _context.sent;
|
|
174
|
-
|
|
175
|
-
case 29:
|
|
176
|
-
_i++;
|
|
177
|
-
_context.next = 23;
|
|
178
|
-
break;
|
|
179
|
-
|
|
180
|
-
case 32:
|
|
181
|
-
if (!(0, _isEmpty["default"])(shuffledValues)) {
|
|
182
|
-
if (session && updateSession && typeof updateSession === 'function') {
|
|
183
|
-
updateSession(session.id, session.element, {
|
|
184
|
-
shuffledValues: shuffledValues
|
|
185
|
-
})["catch"](function (e) {
|
|
186
|
-
// eslint-disable-next-line no-console
|
|
187
|
-
console.error('update session failed', e);
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
case 33:
|
|
193
|
-
teacherInstructions = null;
|
|
194
|
-
rationale = null;
|
|
195
|
-
choicesWillNullRationales = (Object.keys(choices) || []).reduce(function (acc, currentValue) {
|
|
196
|
-
acc[currentValue] = (choices[currentValue] || []).map(function (choice) {
|
|
197
|
-
return _objectSpread(_objectSpread({}, choice), {}, {
|
|
198
|
-
rationale: null
|
|
199
|
-
});
|
|
200
|
-
});
|
|
201
|
-
return acc;
|
|
202
|
-
}, {});
|
|
203
|
-
|
|
204
|
-
if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {
|
|
205
|
-
rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;
|
|
206
|
-
teacherInstructions = normalizedQuestion.teacherInstructionsEnabled ? normalizedQuestion.teacherInstructions : null;
|
|
207
|
-
choices = normalizedQuestion.choiceRationaleEnabled ? normalizedQuestion.choices : choicesWillNullRationales;
|
|
208
|
-
} else {
|
|
209
|
-
rationale = null;
|
|
210
|
-
teacherInstructions = null;
|
|
211
|
-
choices = choicesWillNullRationales;
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
out = {
|
|
215
|
-
disabled: env.mode !== 'gather',
|
|
216
|
-
mode: env.mode,
|
|
217
|
-
prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,
|
|
218
|
-
displayType: normalizedQuestion.displayType,
|
|
219
|
-
markup: normalizedQuestion.markup,
|
|
220
|
-
choices: choices,
|
|
221
|
-
feedback: feedback,
|
|
222
|
-
responseCorrect: env.mode === 'evaluate' ? getScore(normalizedQuestion, session) === 1 : undefined,
|
|
223
|
-
rationale: rationale,
|
|
224
|
-
teacherInstructions: teacherInstructions,
|
|
225
|
-
language: normalizedQuestion.language,
|
|
226
|
-
extraCSSRules: normalizedQuestion.extraCSSRules
|
|
227
|
-
};
|
|
228
|
-
resolve(out);
|
|
229
|
-
|
|
230
|
-
case 39:
|
|
231
|
-
case "end":
|
|
232
|
-
return _context.stop();
|
|
233
|
-
}
|
|
37
|
+
async function model(question, session, env, updateSession) {
|
|
38
|
+
const normalizedQuestion = normalize(question);
|
|
39
|
+
const {
|
|
40
|
+
value = {}
|
|
41
|
+
} = session || {};
|
|
42
|
+
let choices = (0, _reduce.default)(normalizedQuestion.choices, (obj, area, key) => {
|
|
43
|
+
obj[key] = (0, _map.default)(area, choice => choice);
|
|
44
|
+
return obj;
|
|
45
|
+
}, {});
|
|
46
|
+
let feedback = {};
|
|
47
|
+
if (env.mode === 'evaluate') {
|
|
48
|
+
const allCorrectResponses = (0, _utils.getAllCorrectResponses)(normalizedQuestion);
|
|
49
|
+
const respAreaLength = Object.keys(allCorrectResponses).length;
|
|
50
|
+
let correctResponses = 0;
|
|
51
|
+
for (let i = 0; i < respAreaLength; i++) {
|
|
52
|
+
const result = (0, _reduce.default)(allCorrectResponses, (obj, choices, key) => {
|
|
53
|
+
const answer = value && value[key] || '';
|
|
54
|
+
const correctChoice = choices[i] || '';
|
|
55
|
+
const isCorrect = answer && correctChoice && correctChoice === answer;
|
|
56
|
+
obj.feedback[key] = getFeedback(isCorrect);
|
|
57
|
+
if (isCorrect) {
|
|
58
|
+
obj.correctResponses += 1;
|
|
234
59
|
}
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
60
|
+
return obj;
|
|
61
|
+
}, {
|
|
62
|
+
correctResponses: 0,
|
|
63
|
+
feedback: {}
|
|
64
|
+
});
|
|
65
|
+
if (result.correctResponses >= correctResponses) {
|
|
66
|
+
correctResponses = result.correctResponses;
|
|
67
|
+
feedback = result.feedback;
|
|
68
|
+
}
|
|
69
|
+
if (result.correctResponses === respAreaLength) {
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const lockChoiceOrder = (0, _controllerUtils.lockChoices)(normalizedQuestion, session, env);
|
|
75
|
+
if (!lockChoiceOrder) {
|
|
76
|
+
const shuffledValues = {};
|
|
77
|
+
const keys = Object.keys(choices);
|
|
78
|
+
const us = part => (id, element, update) => {
|
|
79
|
+
return new Promise(resolve => {
|
|
80
|
+
shuffledValues[part] = update.shuffledValues;
|
|
81
|
+
resolve();
|
|
82
|
+
});
|
|
240
83
|
};
|
|
241
|
-
|
|
84
|
+
let i;
|
|
85
|
+
for (i = 0; i < keys.length; i++) {
|
|
86
|
+
const key = keys[i];
|
|
87
|
+
const storedValues = session?.shuffledValues?.[key];
|
|
88
|
+
choices[key] = await (0, _controllerUtils.getShuffledChoices)(choices[key],
|
|
89
|
+
// the shuffledValues structure was updated to an object like { choice_key: [] }
|
|
90
|
+
// and we need to override shuffledValues if it's not an array
|
|
91
|
+
{
|
|
92
|
+
shuffledValues: Array.isArray(storedValues) ? storedValues : []
|
|
93
|
+
}, us(key), 'value');
|
|
94
|
+
}
|
|
95
|
+
if (!(0, _isEmpty.default)(shuffledValues)) {
|
|
96
|
+
if (session && updateSession && typeof updateSession === 'function') {
|
|
97
|
+
updateSession(session.id, session.element, {
|
|
98
|
+
shuffledValues
|
|
99
|
+
}).catch(e => {
|
|
100
|
+
// eslint-disable-next-line no-console
|
|
101
|
+
console.error('update session failed', e);
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
let teacherInstructions = null;
|
|
107
|
+
let rationale = null;
|
|
108
|
+
const choicesWillNullRationales = (Object.keys(choices) || []).reduce((acc, currentValue) => {
|
|
109
|
+
acc[currentValue] = (choices[currentValue] || []).map(choice => ({
|
|
110
|
+
...choice,
|
|
111
|
+
rationale: null
|
|
112
|
+
}));
|
|
113
|
+
return acc;
|
|
114
|
+
}, {});
|
|
115
|
+
if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {
|
|
116
|
+
rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;
|
|
117
|
+
teacherInstructions = normalizedQuestion.teacherInstructionsEnabled ? normalizedQuestion.teacherInstructions : null;
|
|
118
|
+
choices = normalizedQuestion.choiceRationaleEnabled ? normalizedQuestion.choices : choicesWillNullRationales;
|
|
119
|
+
} else {
|
|
120
|
+
rationale = null;
|
|
121
|
+
teacherInstructions = null;
|
|
122
|
+
choices = choicesWillNullRationales;
|
|
123
|
+
}
|
|
124
|
+
const out = {
|
|
125
|
+
disabled: env.mode !== 'gather',
|
|
126
|
+
mode: env.mode,
|
|
127
|
+
prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,
|
|
128
|
+
displayType: normalizedQuestion.displayType,
|
|
129
|
+
markup: normalizedQuestion.markup,
|
|
130
|
+
choices,
|
|
131
|
+
feedback,
|
|
132
|
+
responseCorrect: env.mode === 'evaluate' ? getScore(normalizedQuestion, session) === 1 : undefined,
|
|
133
|
+
rationale,
|
|
134
|
+
teacherInstructions,
|
|
135
|
+
language: normalizedQuestion.language,
|
|
136
|
+
extraCSSRules: normalizedQuestion.extraCSSRules
|
|
137
|
+
};
|
|
138
|
+
return out;
|
|
242
139
|
}
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
var result = (0, _reduce["default"])(allCorrectResponses, function (total, choices, key) {
|
|
255
|
-
var answer = value && value[key] || '';
|
|
256
|
-
var correctChoice = choices[i] || '';
|
|
257
|
-
|
|
140
|
+
const getScore = (config, session) => {
|
|
141
|
+
const {
|
|
142
|
+
value = {}
|
|
143
|
+
} = session || {};
|
|
144
|
+
const maxScore = config && config.choices ? Object.keys(config.choices).length : 0;
|
|
145
|
+
const allCorrectResponses = (0, _utils.getAllCorrectResponses)(config);
|
|
146
|
+
let correctCount = 0;
|
|
147
|
+
for (let i = 0; i < maxScore; i++) {
|
|
148
|
+
const result = (0, _reduce.default)(allCorrectResponses, (total, choices, key) => {
|
|
149
|
+
const answer = value && value[key] || '';
|
|
150
|
+
const correctChoice = choices[i] || '';
|
|
258
151
|
if (correctChoice && answer && correctChoice === answer) {
|
|
259
152
|
return total;
|
|
260
153
|
}
|
|
261
|
-
|
|
262
154
|
return total - 1;
|
|
263
155
|
}, maxScore);
|
|
264
|
-
|
|
265
156
|
if (result > correctCount) {
|
|
266
157
|
correctCount = result;
|
|
267
158
|
}
|
|
268
|
-
|
|
269
159
|
if (result === maxScore) {
|
|
270
|
-
|
|
160
|
+
break;
|
|
271
161
|
}
|
|
272
|
-
};
|
|
273
|
-
|
|
274
|
-
for (var i = 0; i < maxScore; i++) {
|
|
275
|
-
var _ret2 = _loop2(i);
|
|
276
|
-
|
|
277
|
-
if (_ret2 === "break") break;
|
|
278
162
|
}
|
|
279
|
-
|
|
280
|
-
var str = (correctCount / maxScore).toFixed(2);
|
|
163
|
+
const str = (correctCount / maxScore).toFixed(2);
|
|
281
164
|
return parseFloat(str);
|
|
282
165
|
};
|
|
166
|
+
|
|
283
167
|
/**
|
|
284
168
|
*
|
|
285
169
|
* The score is partial by default for checkbox mode, allOrNothing for radio mode.
|
|
@@ -292,97 +176,79 @@ var getScore = function getScore(config, session) {
|
|
|
292
176
|
* @param {boolean} env.partialScoring - is partial scoring enabled (if undefined default to true) This overrides
|
|
293
177
|
* `model.partialScoring`.
|
|
294
178
|
*/
|
|
295
|
-
|
|
296
|
-
|
|
297
179
|
exports.getScore = getScore;
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
return new Promise(function (resolve) {
|
|
302
|
-
if (!session || (0, _isEmpty["default"])(session)) {
|
|
180
|
+
function outcome(model, session, env = {}) {
|
|
181
|
+
return new Promise(resolve => {
|
|
182
|
+
if (!session || (0, _isEmpty.default)(session)) {
|
|
303
183
|
resolve({
|
|
304
184
|
score: 0,
|
|
305
185
|
empty: true
|
|
306
186
|
});
|
|
307
187
|
}
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
var score = getScore(model, session);
|
|
188
|
+
const partialScoringEnabled = _controllerUtils.partialScoring.enabled(model, env);
|
|
189
|
+
const score = getScore(model, session);
|
|
312
190
|
resolve({
|
|
313
191
|
score: partialScoringEnabled ? score : Math.floor(score),
|
|
314
192
|
empty: false
|
|
315
193
|
});
|
|
316
194
|
});
|
|
317
195
|
}
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
return new Promise(function (resolve) {
|
|
196
|
+
const createCorrectResponseSession = (question, env) => {
|
|
197
|
+
return new Promise(resolve => {
|
|
321
198
|
if (env.mode !== 'evaluate' && env.role === 'instructor') {
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
199
|
+
const {
|
|
200
|
+
choices
|
|
201
|
+
} = question;
|
|
202
|
+
const value = {};
|
|
325
203
|
if (choices) {
|
|
326
|
-
Object.keys(choices).forEach(
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
});
|
|
330
|
-
_value[i] = correctChoices && correctChoices[0].value;
|
|
204
|
+
Object.keys(choices).forEach((key, i) => {
|
|
205
|
+
const correctChoices = choices[key] && choices[key].filter(c => c.correct);
|
|
206
|
+
value[i] = correctChoices && correctChoices[0].value;
|
|
331
207
|
});
|
|
332
208
|
}
|
|
333
|
-
|
|
334
209
|
resolve({
|
|
335
210
|
id: '1',
|
|
336
|
-
value
|
|
211
|
+
value
|
|
337
212
|
});
|
|
338
213
|
} else {
|
|
339
214
|
resolve(null);
|
|
340
215
|
}
|
|
341
216
|
});
|
|
342
|
-
}; // remove all html tags
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
exports.createCorrectResponseSession = createCorrectResponseSession;
|
|
346
|
-
|
|
347
|
-
var getInnerText = function getInnerText(html) {
|
|
348
|
-
return (html || '').replaceAll(/<[^>]*>/g, '');
|
|
349
|
-
}; // remove all html tags except img, iframe and source tag for audio
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
var getContent = function getContent(html) {
|
|
353
|
-
return (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
|
|
354
217
|
};
|
|
355
218
|
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
219
|
+
// remove all html tags
|
|
220
|
+
exports.createCorrectResponseSession = createCorrectResponseSession;
|
|
221
|
+
const getInnerText = html => (html || '').replaceAll(/<[^>]*>/g, '');
|
|
222
|
+
|
|
223
|
+
// remove all html tags except img, iframe and source tag for audio
|
|
224
|
+
const getContent = html => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
|
|
225
|
+
const validate = (model = {}, config = {}) => {
|
|
226
|
+
const {
|
|
227
|
+
markup,
|
|
228
|
+
choices
|
|
229
|
+
} = model;
|
|
230
|
+
const {
|
|
231
|
+
maxResponseAreas,
|
|
232
|
+
maxResponseAreaChoices
|
|
233
|
+
} = config;
|
|
234
|
+
const errors = {};
|
|
235
|
+
['teacherInstructions', 'prompt', 'rationale'].forEach(field => {
|
|
236
|
+
if (config[field]?.required && !getContent(model[field])) {
|
|
368
237
|
errors[field] = 'This field is required.';
|
|
369
238
|
}
|
|
370
239
|
});
|
|
371
|
-
|
|
372
|
-
|
|
240
|
+
const nbOfResponseAreas = ((markup || '').match(/\{\{(\d+)\}\}/g) || []).length;
|
|
373
241
|
if (nbOfResponseAreas > maxResponseAreas) {
|
|
374
|
-
errors.responseAreasError =
|
|
242
|
+
errors.responseAreasError = `No more than ${maxResponseAreas} response areas should be defined.`;
|
|
375
243
|
} else if (nbOfResponseAreas < 1) {
|
|
376
244
|
errors.responseAreasError = 'There should be defined at least 1 response area.';
|
|
377
245
|
}
|
|
378
|
-
|
|
379
|
-
(Object.keys(choices) || []).forEach(function (choiceKey) {
|
|
246
|
+
(Object.keys(choices) || []).forEach(choiceKey => {
|
|
380
247
|
if (choices[choiceKey] && choices[choiceKey].length > maxResponseAreaChoices) {
|
|
381
|
-
errors.responseAreaChoicesError =
|
|
248
|
+
errors.responseAreaChoicesError = `No more than ${maxResponseAreaChoices} choices per response area should be defined.`;
|
|
382
249
|
}
|
|
383
250
|
});
|
|
384
251
|
return errors;
|
|
385
252
|
};
|
|
386
|
-
|
|
387
253
|
exports.validate = validate;
|
|
388
254
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.js"],"names":["getFeedback","correct","normalize","question","defaults","model","session","env","updateSession","Promise","resolve","normalizedQuestion","value","choices","obj","area","key","choice","feedback","mode","allCorrectResponses","respAreaLength","Object","keys","length","correctResponses","i","result","answer","correctChoice","isCorrect","lockChoiceOrder","shuffledValues","us","part","id","element","update","storedValues","Array","isArray","e","console","error","teacherInstructions","rationale","choicesWillNullRationales","reduce","acc","currentValue","map","role","rationaleEnabled","teacherInstructionsEnabled","choiceRationaleEnabled","out","disabled","prompt","promptEnabled","displayType","markup","responseCorrect","getScore","undefined","language","extraCSSRules","config","maxScore","correctCount","total","str","toFixed","parseFloat","outcome","score","empty","partialScoringEnabled","partialScoring","enabled","Math","floor","createCorrectResponseSession","forEach","correctChoices","filter","c","getInnerText","html","replaceAll","getContent","replace","validate","maxResponseAreas","maxResponseAreaChoices","errors","field","required","nbOfResponseAreas","match","responseAreasError","choiceKey","responseAreaChoicesError"],"mappings":"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","sourcesContent":["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 shuffledValues = {};\n const keys = Object.keys(choices);\n\n const us = (part) => (id, element, update) => {\n return new Promise((resolve) => {\n shuffledValues[part] = update.shuffledValues;\n resolve();\n });\n };\n\n let i;\n\n for (i = 0; i < keys.length; i++) {\n const key = keys[i];\n const storedValues = session?.shuffledValues?.[key];\n\n choices[key] = await getShuffledChoices(\n choices[key],\n // the shuffledValues structure was updated to an object like { choice_key: [] }\n // and we need to override shuffledValues if it's not an array\n { shuffledValues: Array.isArray(storedValues) ? storedValues : [] },\n us(key),\n 'value',\n );\n }\n\n if (!isEmpty(shuffledValues)) {\n if (session && updateSession && typeof updateSession === 'function') {\n updateSession(session.id, session.element, {\n shuffledValues,\n }).catch((e) => {\n // eslint-disable-next-line no-console\n console.error('update session failed', e);\n });\n }\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"],"file":"index.js"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["_map","_interopRequireDefault","require","_reduce","_isEmpty","_controllerUtils","_defaults","_utils","getFeedback","correct","normalize","question","defaults","exports","model","session","env","updateSession","normalizedQuestion","value","choices","reduce","obj","area","key","map","choice","feedback","mode","allCorrectResponses","getAllCorrectResponses","respAreaLength","Object","keys","length","correctResponses","i","result","answer","correctChoice","isCorrect","lockChoiceOrder","lockChoices","shuffledValues","us","part","id","element","update","Promise","resolve","storedValues","getShuffledChoices","Array","isArray","isEmpty","catch","e","console","error","teacherInstructions","rationale","choicesWillNullRationales","acc","currentValue","role","rationaleEnabled","teacherInstructionsEnabled","choiceRationaleEnabled","out","disabled","prompt","promptEnabled","displayType","markup","responseCorrect","getScore","undefined","language","extraCSSRules","config","maxScore","correctCount","total","str","toFixed","parseFloat","outcome","score","empty","partialScoringEnabled","partialScoring","enabled","Math","floor","createCorrectResponseSession","forEach","correctChoices","filter","c","getInnerText","html","replaceAll","getContent","replace","validate","maxResponseAreas","maxResponseAreaChoices","errors","field","required","nbOfResponseAreas","match","responseAreasError","choiceKey","responseAreaChoicesError"],"sources":["../src/index.js"],"sourcesContent":["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 async function model(question, session, env, updateSession) {\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 shuffledValues = {};\n const keys = Object.keys(choices);\n\n const us = (part) => (id, element, update) => {\n return new Promise((resolve) => {\n shuffledValues[part] = update.shuffledValues;\n resolve();\n });\n };\n\n let i;\n\n for (i = 0; i < keys.length; i++) {\n const key = keys[i];\n const storedValues = session?.shuffledValues?.[key];\n\n choices[key] = await getShuffledChoices(\n choices[key],\n // the shuffledValues structure was updated to an object like { choice_key: [] }\n // and we need to override shuffledValues if it's not an array\n { shuffledValues: Array.isArray(storedValues) ? storedValues : [] },\n us(key),\n 'value',\n );\n }\n\n if (!isEmpty(shuffledValues)) {\n if (session && updateSession && typeof updateSession === 'function') {\n updateSession(session.id, session.element, {\n shuffledValues,\n }).catch((e) => {\n // eslint-disable-next-line no-console\n console.error('update session failed', e);\n });\n }\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 return out;\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"],"mappings":"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","ignoreList":[]}
|