@pie-element/math-templated 5.0.1-next.0 → 5.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,367 @@
1
+ import debug from 'debug';
2
+ import isEmpty from 'lodash/isEmpty';
3
+ import Translator from '@pie-lib/translator';
4
+ import * as mv from '@pie-framework/math-validation';
5
+ import { partialScoring } from '@pie-lib/controller-utils';
6
+
7
+ function ownKeys(object, enumerableOnly) {
8
+ var keys = Object.keys(object);
9
+
10
+ if (Object.getOwnPropertySymbols) {
11
+ var symbols = Object.getOwnPropertySymbols(object);
12
+ enumerableOnly && (symbols = symbols.filter(function (sym) {
13
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
14
+ })), keys.push.apply(keys, symbols);
15
+ }
16
+
17
+ return keys;
18
+ }
19
+
20
+ function _objectSpread2(target) {
21
+ for (var i = 1; i < arguments.length; i++) {
22
+ var source = null != arguments[i] ? arguments[i] : {};
23
+ i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {
24
+ _defineProperty(target, key, source[key]);
25
+ }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {
26
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
27
+ });
28
+ }
29
+
30
+ return target;
31
+ }
32
+
33
+ function _defineProperty(obj, key, value) {
34
+ if (key in obj) {
35
+ Object.defineProperty(obj, key, {
36
+ value: value,
37
+ enumerable: true,
38
+ configurable: true,
39
+ writable: true
40
+ });
41
+ } else {
42
+ obj[key] = value;
43
+ }
44
+
45
+ return obj;
46
+ }
47
+
48
+ // Should be exactly the same as configure/defaults.js
49
+ var defaults = {
50
+ model: {
51
+ allowTrailingZerosDefault: false,
52
+ equationEditor: '8',
53
+ ignoreOrderDefault: false,
54
+ markup: '',
55
+ playerSpellCheckEnabled: true,
56
+ prompt: '',
57
+ promptEnabled: true,
58
+ rationale: '',
59
+ rationaleEnabled: true,
60
+ responses: {},
61
+ spellCheckEnabled: true,
62
+ teacherInstructions: '',
63
+ teacherInstructionsEnabled: true,
64
+ toolbarEditorPosition: 'bottom',
65
+ validationDefault: 'literal'
66
+ },
67
+ configuration: {}
68
+ };
69
+
70
+ var {
71
+ translator
72
+ } = Translator;
73
+ var log = debug('@pie-element:math-templated:controller');
74
+
75
+ var getFeedback = value => value ? 'correct' : 'incorrect';
76
+
77
+ var getContent = html => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
78
+
79
+ var getIsAnswerCorrect = (correctResponse, answerItem) => {
80
+ var answerCorrect = false;
81
+
82
+ var opts = _objectSpread2({
83
+ mode: correctResponse.validation || defaults.validationDefault
84
+ }, correctResponse.validation === 'literal' && {
85
+ literal: {
86
+ allowTrailingZeros: correctResponse.allowTrailingZeros || false,
87
+ ignoreOrder: correctResponse.ignoreOrder || false
88
+ }
89
+ });
90
+
91
+ if (!answerCorrect) {
92
+ var acceptedValues = [correctResponse.answer, ...Object.values(correctResponse.alternates || {})];
93
+
94
+ try {
95
+ for (var value of acceptedValues) {
96
+ answerCorrect = mv.latexEqual(answerItem.value, value, opts);
97
+ if (answerCorrect) break;
98
+ }
99
+ } catch (e) {
100
+ log('Parse failure when evaluating math', e, correctResponse, answerItem);
101
+ answerCorrect = false;
102
+ }
103
+ }
104
+
105
+ return answerCorrect;
106
+ };
107
+
108
+ var getResponseCorrectness = (question, sessionResponse) => {
109
+ var correctResponses = question.responses;
110
+
111
+ if (!sessionResponse) {
112
+ return {
113
+ correctness: 'unanswered',
114
+ score: 0,
115
+ correct: false
116
+ };
117
+ } else {
118
+ var correctAnswers = 0;
119
+ var score = 0;
120
+ var correctResponsesCount = Object.keys(correctResponses || {}).length;
121
+ Object.keys(correctResponses).forEach(responseId => {
122
+ var answerItem = sessionResponse['r' + responseId];
123
+ var correctResponse = correctResponses[responseId] || {};
124
+ var answerCorrect = getIsAnswerCorrect(correctResponse, answerItem);
125
+
126
+ if (answerCorrect) {
127
+ correctAnswers++;
128
+ }
129
+ });
130
+ var fullyCorrect = correctAnswers === correctResponsesCount; // partial credit scoring: each correct answer is worth 1 / total answers point
131
+ // dichotomous scoring: for credit to be awarded, a correct answer must be entered for every response area
132
+
133
+ score = (correctAnswers / Object.keys(correctResponses).length).toFixed(2);
134
+ return {
135
+ correctness: getFeedback(fullyCorrect),
136
+ score: correctAnswers > 0 ? score : 0,
137
+ correct: fullyCorrect
138
+ };
139
+ }
140
+ };
141
+
142
+ var getCorrectness = (question, env, session) => {
143
+ if (env.mode === 'evaluate') {
144
+ return getResponseCorrectness(question, session && session.answers);
145
+ }
146
+ };
147
+ var getPartialScore = (question, session) => {
148
+ if (!session || isEmpty(session)) {
149
+ return 0;
150
+ }
151
+
152
+ return 1;
153
+ };
154
+ var outcome = (question, session, env) => new Promise(resolve => {
155
+ if (!session || isEmpty(session)) {
156
+ resolve({
157
+ score: 0,
158
+ empty: true
159
+ });
160
+ }
161
+
162
+ var partialScoringEnabled = partialScoring.enabled(question, env);
163
+ session = normalizeSession(session);
164
+
165
+ if (env.mode !== 'evaluate') {
166
+ resolve({
167
+ score: undefined,
168
+ completed: undefined
169
+ });
170
+ } else {
171
+ var correctness = getCorrectness(question, env, session);
172
+ var score = correctness.score;
173
+ resolve({
174
+ score: partialScoringEnabled ? score : score === 1 ? 1 : 0
175
+ });
176
+ }
177
+ });
178
+ var createDefaultModel = function createDefaultModel() {
179
+ var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
180
+ var {
181
+ validationDefault,
182
+ allowTrailingZerosDefault,
183
+ ignoreOrderDefault,
184
+ responses = {}
185
+ } = model;
186
+ var updatedResponses = Object.keys(responses).reduce((acc, responseId) => {
187
+ var correctResponse = responses[responseId];
188
+ acc[responseId] = _objectSpread2(_objectSpread2({}, correctResponse), {}, {
189
+ validation: correctResponse.validation || validationDefault,
190
+ allowTrailingZeros: correctResponse.allowTrailingZeros || allowTrailingZerosDefault,
191
+ ignoreOrder: correctResponse.ignoreOrder || ignoreOrderDefault
192
+ });
193
+ return acc;
194
+ }, {});
195
+ return _objectSpread2(_objectSpread2(_objectSpread2({}, defaults.model), model), {}, {
196
+ responses: updatedResponses
197
+ });
198
+ };
199
+ var normalizeSession = s => _objectSpread2({}, s);
200
+
201
+ var getTextFromHTML = html => (html || '').replace(/<\/?[^>]+(>|$)/g, '');
202
+
203
+ var prepareVal = html => getTextFromHTML(html).trim();
204
+ var model = (question, session, env) => {
205
+ return new Promise(resolve => {
206
+ session = session || {};
207
+ var normalizedQuestion = createDefaultModel(question);
208
+ var correctness = getCorrectness(normalizedQuestion, env, session);
209
+ var {
210
+ responses,
211
+ language
212
+ } = normalizedQuestion;
213
+ var {
214
+ note
215
+ } = normalizedQuestion;
216
+ var showNote = false; // check if there is at least one alternate response or if the validation for at least one response is not literal
217
+
218
+ Object.keys(responses).forEach(responseId => {
219
+ var correctResponse = responses[responseId] || {};
220
+
221
+ if (correctResponse.alternates && Object.keys(correctResponse.alternates).length > 0) {
222
+ showNote = true;
223
+ } else if (correctResponse.validation !== 'literal') {
224
+ showNote = true;
225
+ }
226
+ });
227
+
228
+ if (!note) {
229
+ note = translator.t('mathInline.primaryCorrectWithAlternates', {
230
+ lng: language
231
+ });
232
+ }
233
+
234
+ var out = {
235
+ prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,
236
+ markup: normalizedQuestion.markup,
237
+ responses: env.mode === 'gather' ? null : normalizedQuestion.responses,
238
+ language: normalizedQuestion.language,
239
+ equationEditor: normalizedQuestion.equationEditor,
240
+ customKeys: normalizedQuestion.customKeys,
241
+ disabled: env.mode !== 'gather',
242
+ view: env.mode === 'view',
243
+ correctness,
244
+ env,
245
+ extraCSSRules: normalizedQuestion.extraCSSRules
246
+ };
247
+ var {
248
+ answers = {}
249
+ } = session || {};
250
+ var feedback = {};
251
+
252
+ if (env.mode === 'evaluate') {
253
+ Object.keys(responses).forEach(responseId => {
254
+ var answerItem = answers['r' + responseId];
255
+ var correctResponse = responses[responseId];
256
+ feedback[responseId] = getIsAnswerCorrect(correctResponse, answerItem);
257
+ });
258
+ }
259
+
260
+ if (env.mode === 'evaluate') {
261
+ out.correctResponse = {};
262
+ out.showNote = showNote;
263
+ out.note = note;
264
+ out.feedback = feedback;
265
+ } else {
266
+ out.responses = {};
267
+ out.showNote = false;
268
+ }
269
+
270
+ if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {
271
+ out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;
272
+ out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled ? normalizedQuestion.teacherInstructions : null;
273
+ } else {
274
+ out.rationale = null;
275
+ out.teacherInstructions = null;
276
+ }
277
+
278
+ log('out: ', out);
279
+ resolve(out);
280
+ });
281
+ };
282
+ var createCorrectResponseSession = (question, env) => new Promise(resolve => {
283
+ if (env.mode !== 'evaluate' && env.role === 'instructor') {
284
+ var correctResponse = Object.keys(question.responses).reduce((acc, responseId) => {
285
+ acc['r' + responseId] = {
286
+ value: question.responses[responseId].answer
287
+ };
288
+ return acc;
289
+ }, {});
290
+ resolve({
291
+ id: '1',
292
+ answers: correctResponse
293
+ });
294
+ } else {
295
+ resolve(null);
296
+ }
297
+ });
298
+ var validate = function validate() {
299
+ var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
300
+ var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
301
+ var {
302
+ responses,
303
+ markup
304
+ } = model;
305
+ var {
306
+ maxResponseAreas
307
+ } = config;
308
+ var responsesErrors = {};
309
+ var errors = {};
310
+ ['teacherInstructions', 'prompt', 'rationale'].forEach(field => {
311
+ var _config$field;
312
+
313
+ if ((_config$field = config[field]) !== null && _config$field !== void 0 && _config$field.required && !getContent(model[field])) {
314
+ errors[field] = 'This field is required.';
315
+ }
316
+ });
317
+ Object.entries(responses || {}).forEach((_ref, index) => {
318
+ var [key, response] = _ref;
319
+ var {
320
+ answer
321
+ } = response;
322
+ var reversedAlternates = [...Object.entries(response.alternates || {})].reverse();
323
+ var alternatesErrors = {};
324
+ var responseError = {};
325
+
326
+ if (answer === '') {
327
+ responseError.answer = 'Content should not be empty.';
328
+ }
329
+
330
+ reversedAlternates.forEach((_ref2, index) => {
331
+ var [key, value] = _ref2;
332
+
333
+ if (value === '') {
334
+ alternatesErrors[key] = 'Content should not be empty.';
335
+ } else {
336
+ var identicalAnswer = answer === value || reversedAlternates.slice(index + 1).some(_ref3 => {
337
+ var [, val] = _ref3;
338
+ return val === value;
339
+ });
340
+
341
+ if (identicalAnswer) {
342
+ alternatesErrors[key] = 'Content should be unique.';
343
+ }
344
+ }
345
+ });
346
+
347
+ if (!isEmpty(responseError) || !isEmpty(alternatesErrors)) {
348
+ responsesErrors[index] = _objectSpread2(_objectSpread2({}, responseError), alternatesErrors);
349
+ }
350
+ });
351
+ var nbOfResponseAreas = (markup.match(/\{\{(\d+)\}\}/g) || []).length;
352
+
353
+ if (nbOfResponseAreas > maxResponseAreas) {
354
+ errors.responseAreas = "No more than ".concat(maxResponseAreas, " response areas should be defined.");
355
+ } else if (nbOfResponseAreas < 1) {
356
+ errors.responseAreas = 'There should be at least 1 response area defined.';
357
+ }
358
+
359
+ if (!isEmpty(responsesErrors)) {
360
+ errors.responses = responsesErrors;
361
+ }
362
+
363
+ return errors;
364
+ };
365
+
366
+ export { createCorrectResponseSession, createDefaultModel, getCorrectness, getPartialScore, model, normalizeSession, outcome, prepareVal, validate };
367
+ //# sourceMappingURL=controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller.js","sources":["../controller/src/defaults.js","../controller/src/index.js"],"sourcesContent":["// Should be exactly the same as configure/defaults.js\nexport default {\n model: {\n allowTrailingZerosDefault: false,\n equationEditor: '8',\n ignoreOrderDefault: false,\n markup: '',\n playerSpellCheckEnabled: true,\n prompt: '',\n promptEnabled: true,\n rationale: '',\n rationaleEnabled: true,\n responses: {},\n spellCheckEnabled: true,\n teacherInstructions: '',\n teacherInstructionsEnabled: true,\n toolbarEditorPosition: 'bottom',\n validationDefault: 'literal',\n },\n configuration: {},\n};\n","import debug from 'debug';\nimport isEmpty from 'lodash/isEmpty';\nimport Translator from '@pie-lib/translator';\nimport * as mv from '@pie-framework/math-validation';\n\nimport defaults from './defaults';\nimport { partialScoring } from '@pie-lib/controller-utils';\n\nconst { translator } = Translator;\nconst log = debug('@pie-element:math-templated:controller');\n\nconst getFeedback = (value) => (value ? 'correct' : 'incorrect');\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nconst getIsAnswerCorrect = (correctResponse, answerItem) => {\n let answerCorrect = false;\n\n const opts = {\n mode: correctResponse.validation || defaults.validationDefault,\n ...(correctResponse.validation === 'literal' && {\n literal: {\n allowTrailingZeros: correctResponse.allowTrailingZeros || false,\n ignoreOrder: correctResponse.ignoreOrder || false,\n },\n }),\n };\n\n if (!answerCorrect) {\n const acceptedValues = [correctResponse.answer, ...Object.values(correctResponse.alternates || {})];\n\n try {\n for (const value of acceptedValues) {\n answerCorrect = mv.latexEqual(answerItem.value, value, opts);\n if (answerCorrect) break;\n }\n } catch (e) {\n log('Parse failure when evaluating math', e, correctResponse, answerItem);\n answerCorrect = false;\n }\n }\n\n return answerCorrect;\n};\n\nconst getResponseCorrectness = (question, sessionResponse) => {\n const correctResponses = question.responses;\n\n if (!sessionResponse) {\n return {\n correctness: 'unanswered',\n score: 0,\n correct: false,\n };\n } else {\n let correctAnswers = 0;\n let score = 0;\n const correctResponsesCount = Object.keys(correctResponses || {}).length;\n\n Object.keys(correctResponses).forEach((responseId) => {\n const answerItem = sessionResponse['r' + responseId];\n const correctResponse = correctResponses[responseId] || {};\n\n const answerCorrect = getIsAnswerCorrect(correctResponse, answerItem);\n if (answerCorrect) {\n correctAnswers++;\n }\n });\n\n const fullyCorrect = correctAnswers === correctResponsesCount;\n\n // partial credit scoring: each correct answer is worth 1 / total answers point\n // dichotomous scoring: for credit to be awarded, a correct answer must be entered for every response area\n score = (correctAnswers / Object.keys(correctResponses).length).toFixed(2);\n\n return {\n correctness: getFeedback(fullyCorrect),\n score: correctAnswers > 0 ? score : 0,\n correct: fullyCorrect,\n };\n }\n};\n\nexport const getCorrectness = (question, env, session) => {\n if (env.mode === 'evaluate') {\n return getResponseCorrectness(question, session && session.answers);\n }\n};\n\nexport const getPartialScore = (question, session) => {\n if (!session || isEmpty(session)) {\n return 0;\n }\n\n return 1;\n};\n\nexport const outcome = (question, session, env) =>\n new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n }\n const partialScoringEnabled = partialScoring.enabled(question, env);\n session = normalizeSession(session);\n\n if (env.mode !== 'evaluate') {\n resolve({ score: undefined, completed: undefined });\n } else {\n const correctness = getCorrectness(question, env, session, true);\n const score = correctness.score;\n\n resolve({ score: partialScoringEnabled ? score : score === 1 ? 1 : 0 });\n }\n });\n\nexport const createDefaultModel = (model = {}) => {\n const { validationDefault, allowTrailingZerosDefault, ignoreOrderDefault, responses = {} } = model;\n\n const updatedResponses = Object.keys(responses).reduce((acc, responseId) => {\n const correctResponse = responses[responseId];\n\n acc[responseId] = {\n ...correctResponse,\n validation: correctResponse.validation || validationDefault,\n allowTrailingZeros: correctResponse.allowTrailingZeros || allowTrailingZerosDefault,\n ignoreOrder: correctResponse.ignoreOrder || ignoreOrderDefault,\n };\n\n return acc;\n }, {});\n\n return {\n ...defaults.model,\n ...model,\n responses: updatedResponses,\n };\n};\n\nexport const normalizeSession = (s) => ({ ...s });\n\nconst getTextFromHTML = (html) => (html || '').replace(/<\\/?[^>]+(>|$)/g, '');\n\nexport const prepareVal = (html) => getTextFromHTML(html).trim();\n\nexport const model = (question, session, env) => {\n return new Promise((resolve) => {\n session = session || {};\n const normalizedQuestion = createDefaultModel(question);\n const correctness = getCorrectness(normalizedQuestion, env, session);\n const { responses, language } = normalizedQuestion;\n let { note } = normalizedQuestion;\n let showNote = false;\n\n // check if there is at least one alternate response or if the validation for at least one response is not literal\n Object.keys(responses).forEach((responseId) => {\n const correctResponse = responses[responseId] || {};\n if (correctResponse.alternates && Object.keys(correctResponse.alternates).length > 0) {\n showNote = true;\n } else if (correctResponse.validation !== 'literal') {\n showNote = true;\n }\n });\n\n if (!note) {\n note = translator.t('mathInline.primaryCorrectWithAlternates', { lng: language });\n }\n\n const out = {\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n markup: normalizedQuestion.markup,\n responses: env.mode === 'gather' ? null : normalizedQuestion.responses,\n language: normalizedQuestion.language,\n equationEditor: normalizedQuestion.equationEditor,\n customKeys: normalizedQuestion.customKeys,\n disabled: env.mode !== 'gather',\n view: env.mode === 'view',\n correctness,\n env,\n extraCSSRules: normalizedQuestion.extraCSSRules,\n };\n\n const { answers = {} } = session || {};\n let feedback = {};\n\n if (env.mode === 'evaluate') {\n Object.keys(responses).forEach((responseId) => {\n const answerItem = answers['r' + responseId];\n const correctResponse = responses[responseId];\n feedback[responseId] = getIsAnswerCorrect(correctResponse, answerItem);\n });\n }\n\n if (env.mode === 'evaluate') {\n out.correctResponse = {};\n out.showNote = showNote;\n out.note = note;\n out.feedback = feedback;\n } else {\n out.responses = {};\n out.showNote = false;\n }\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n log('out: ', out);\n resolve(out);\n });\n};\n\nexport const createCorrectResponseSession = (question, env) =>\n new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const correctResponse = Object.keys(question.responses).reduce((acc, responseId) => {\n acc['r' + responseId] = { value: question.responses[responseId].answer };\n return acc;\n }, {});\n\n resolve({ id: '1', answers: correctResponse });\n } else {\n resolve(null);\n }\n });\n\nexport const validate = (model = {}, config = {}) => {\n const { responses, markup } = model;\n const { maxResponseAreas } = config;\n const responsesErrors = {};\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 Object.entries(responses || {}).forEach(([key, response], index) => {\n const { answer } = response;\n const reversedAlternates = [...Object.entries(response.alternates || {})].reverse();\n const alternatesErrors = {};\n const responseError = {};\n\n if (answer === '') {\n responseError.answer = 'Content should not be empty.';\n }\n\n reversedAlternates.forEach(([key, value], index) => {\n if (value === '') {\n alternatesErrors[key] = 'Content should not be empty.';\n } else {\n const identicalAnswer =\n answer === value || reversedAlternates.slice(index + 1).some(([, val]) => val === value);\n\n if (identicalAnswer) {\n alternatesErrors[key] = 'Content should be unique.';\n }\n }\n });\n\n if (!isEmpty(responseError) || !isEmpty(alternatesErrors)) {\n responsesErrors[index] = { ...responseError, ...alternatesErrors };\n }\n });\n\n const nbOfResponseAreas = (markup.match(/\\{\\{(\\d+)\\}\\}/g) || []).length;\n\n if (nbOfResponseAreas > maxResponseAreas) {\n errors.responseAreas = `No more than ${maxResponseAreas} response areas should be defined.`;\n } else if (nbOfResponseAreas < 1) {\n errors.responseAreas = 'There should be at least 1 response area defined.';\n }\n\n if (!isEmpty(responsesErrors)) {\n errors.responses = responsesErrors;\n }\n\n return errors;\n};\n"],"names":["model","allowTrailingZerosDefault","equationEditor","ignoreOrderDefault","markup","playerSpellCheckEnabled","prompt","promptEnabled","rationale","rationaleEnabled","responses","spellCheckEnabled","teacherInstructions","teacherInstructionsEnabled","toolbarEditorPosition","validationDefault","configuration","translator","Translator","log","debug","getFeedback","value","getContent","html","replace","getIsAnswerCorrect","correctResponse","answerItem","answerCorrect","opts","_objectSpread","mode","validation","defaults","literal","allowTrailingZeros","ignoreOrder","acceptedValues","answer","Object","values","alternates","mv","latexEqual","e","getResponseCorrectness","question","sessionResponse","correctResponses","correctness","score","correct","correctAnswers","correctResponsesCount","keys","length","forEach","responseId","fullyCorrect","toFixed","getCorrectness","env","session","answers","getPartialScore","isEmpty","outcome","Promise","resolve","empty","partialScoringEnabled","partialScoring","enabled","normalizeSession","undefined","completed","createDefaultModel","updatedResponses","reduce","acc","s","getTextFromHTML","prepareVal","trim","normalizedQuestion","language","note","showNote","t","lng","out","customKeys","disabled","view","extraCSSRules","feedback","role","createCorrectResponseSession","id","validate","config","maxResponseAreas","responsesErrors","errors","field","required","entries","index","key","response","reversedAlternates","reverse","alternatesErrors","responseError","identicalAnswer","slice","some","val","nbOfResponseAreas","match","responseAreas"],"mappings":"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"}
package/package.json CHANGED
@@ -4,30 +4,38 @@
4
4
  "access": "public"
5
5
  },
6
6
  "repository": "pie-framework/pie-elements",
7
- "version": "5.0.1-next.0+17e3b6c8d",
7
+ "version": "5.0.1",
8
8
  "description": "",
9
9
  "dependencies": {
10
10
  "@material-ui/core": "^3.9.2",
11
11
  "@pie-framework/pie-player-events": "^0.1.0",
12
- "@pie-lib/correct-answer-toggle": "^2.21.0",
13
- "@pie-lib/mask-markup": "^1.29.0",
14
- "@pie-lib/math-input": "^6.27.0",
15
- "@pie-lib/math-rendering": "^3.18.0",
16
- "@pie-lib/render-ui": "^4.31.0",
12
+ "@pie-lib/correct-answer-toggle": "^2.22.0",
13
+ "@pie-lib/mask-markup": "^1.30.0",
14
+ "@pie-lib/math-input": "^6.28.0",
15
+ "@pie-lib/math-rendering": "^3.19.0",
16
+ "@pie-lib/render-ui": "^4.32.0",
17
17
  "prop-types": "^15.6.1",
18
18
  "react": "^16.8.1",
19
19
  "react-dom": "^16.8.1"
20
20
  },
21
21
  "author": "",
22
22
  "license": "ISC",
23
- "gitHead": "17e3b6c8d7cd3ad6a2698703e595dc03d51b9df9",
23
+ "gitHead": "d82bdaf60534197ec8675bb5ebba1ad314075e58",
24
24
  "scripts": {
25
25
  "postpublish": "../../scripts/postpublish"
26
26
  },
27
27
  "main": "lib/index.js",
28
28
  "module": "src/index.js",
29
29
  "exports": {
30
- ".": "./src/index.js",
31
- "./print": "./src/print.js"
30
+ "./configure": {
31
+ "import": "./esm/configure.js",
32
+ "require": "./configure/lib/index.js",
33
+ "default": "./esm/configure.js"
34
+ },
35
+ "./controller": {
36
+ "import": "./esm/controller.js",
37
+ "require": "./controller/lib/index.js",
38
+ "default": "./esm/controller.js"
39
+ }
32
40
  }
33
41
  }
@@ -1 +0,0 @@
1
- import{_dll_react as e,_dll_prop_types as t,_dll_material_ui__core as n,_dll_material_ui__core_styles as a,_dll_material_ui__icons as o,_dll_pie_lib__render_ui as s,_dll_lodash as i,_dll_debug as l,_dll_react_dom as r}from"../../../@pie-lib/shared-module@^1.14.0/module/index.js";import{_dll_pie_lib__config_ui as p}from"../../../@pie-lib/config-module@^2.19.0/module/index.js";import{_dll_pie_lib__editable_html as d}from"../../../@pie-lib/editable-html-module@^5.6.0/module/index.js";import{_dll_pie_lib__math_toolbar as c}from"../../../@pie-lib/math-edit-module@^2.4.0/module/index.js";var h={};Object.defineProperty(h,"__esModule",{value:!0});class u extends CustomEvent{constructor(e,t=!1){super(u.TYPE,{bubbles:!0,detail:{update:e,reset:t}}),this.update=e,this.reset=t}}u.TYPE="model.updated";var g=h.ModelUpdatedEvent=u;class m extends CustomEvent{constructor(e,t){super(m.TYPE,{bubbles:!0,detail:{src:e,done:t}}),this.src=e,this.done=t}}m.TYPE="delete.image";var b=h.DeleteImageEvent=m;class _ extends CustomEvent{constructor(e){super(_.TYPE,{bubbles:!0,detail:e}),this.handler=e}}_.TYPE="insert.image";var C=h.InsertImageEvent=_;class y extends CustomEvent{constructor(e,t){super(y.TYPE,{bubbles:!0,detail:{src:e,done:t}}),this.src=e,this.done=t}}y.TYPE="delete.sound";var E=h.DeleteSoundEvent=y;class f extends CustomEvent{constructor(e){super(f.TYPE,{bubbles:!0,detail:e}),this.handler=e}}f.TYPE="insert.sound";var S=h.InsertSoundEvent=f;const v=e,w=t,{Card:x}=n,{CardContent:A}=n,{Button:T}=n,{FormControlLabel:I}=n,{Typography:k}=n,{InputLabel:R}=n,{Checkbox:M}=n,{Select:N}=n,{MenuItem:O}=n,{IconButton:P}=n,{withStyles:K}=a,{Delete:D}=o,{color:q}=s,{InputContainer:j}=p,{MathToolbar:B}=c;class L extends v.Component{static __initStatic(){this.propTypes={classes:w.object.isRequired,defaultResponse:w.bool,error:w.object,mode:w.oneOfType([w.string,w.number]),onResponseChange:w.func.isRequired,onResponseDone:w.func.isRequired,response:w.object.isRequired,cIgnoreOrder:w.object.isRequired,cAllowTrailingZeros:w.object.isRequired,responseKey:w.number.isRequired}}static __initStatic2(){this.defaultProps={defaultResponse:!1,mode:"8"}}constructor(e){super(e),L.prototype.__init.call(this),L.prototype.__init2.call(this),L.prototype.__init3.call(this),L.prototype.__init4.call(this),L.prototype.__init5.call(this),L.prototype.__init6.call(this),L.prototype.__init7.call(this),L.prototype.__init8.call(this),L.prototype.__init9.call(this),L.prototype.__init10.call(this),L.prototype.__init11.call(this);const{response:{alternates:t}={}}=e||{},n=Object.keys(t||{}).length;this.state={alternateIdCounter:n+1,showKeypad:{openCount:0,main:!1}}}__init(){this.onChange=e=>t=>{const{response:n,onResponseChange:a,responseKey:o}=this.props,s={...n};s[e]=t.target.value,a(s,o)}}__init2(){this.onConfigChanged=e=>t=>{const{response:n,onResponseChange:a,responseKey:o}=this.props,s={...n};s[e]=t.target.checked,a(s,o)}}__init3(){this.onLiteralOptionsChange=e=>()=>{const{response:t,onResponseChange:n,responseKey:a}=this.props,o={...t};o[e]=!t[e],n(o,a)}}__init4(){this.onAnswerChange=e=>{const{response:t,onResponseChange:n,responseKey:a}=this.props,o={...t};o.answer=e,n(o,a)}}__init5(){this.onAlternateAnswerChange=e=>t=>{const{response:n,onResponseChange:a,responseKey:o}=this.props,s={...n};s.alternates[e]=t,a(s,o)}}__init6(){this.onAddAlternate=()=>{const{response:e,onResponseChange:t,responseKey:n}=this.props,{alternateIdCounter:a}=this.state,o={...e};o.alternates||(o.alternates={}),o.alternates[a]="",t(o,n),this.setState({alternateIdCounter:a+1})}}__init7(){this.onRemoveAlternate=e=>()=>{const{response:t,onResponseChange:n,responseKey:a}=this.props,o={...t};delete o.alternates[e],n(o,a),this.setState((t=>({showKeypad:{...t.showKeypad,openCount:t.showKeypad[e]?t.showKeypad.openCount-1:t.showKeypad.openCount}})))}}__init8(){this.onDone=()=>{const{onResponseDone:e}=this.props;this.setState((e=>({showKeypad:{...e.showKeypad,openCount:e.showKeypad.openCount-1,main:!1}}))),e()}}__init9(){this.onFocus=()=>{this.setState((e=>({showKeypad:{...e.showKeypad,openCount:e.showKeypad.main?e.showKeypad.openCount:e.showKeypad.openCount+1,main:!0}})))}}__init10(){this.onAlternateFocus=e=>()=>{this.setState((t=>({showKeypad:{...t.showKeypad,openCount:t.showKeypad[e]?t.showKeypad.openCount:t.showKeypad.openCount+1,[e]:!0}})))}}__init11(){this.onAlternateDone=e=>()=>{this.setState((t=>({showKeypad:{...t.showKeypad,openCount:t.showKeypad.openCount-1,[e]:!1}})))}}render(){const{classes:e,mode:t,responseKey:n,response:a,cAllowTrailingZeros:o,cIgnoreOrder:s,error:i}=this.props,{showKeypad:l}=this.state,{validation:r,answer:p,alternates:d,ignoreOrder:c,allowTrailingZeros:h}=a,u=Object.keys(d||{}).length>0,g={editor:e.responseEditor,mathToolbar:e.mathToolbar},m={minHeight:(l.openCount>0?430:230)+"px"},b=`R ${parseInt(n)+1}`;return v.createElement(x,{className:e.responseContainer,style:m},v.createElement(A,{className:e.cardContent},v.createElement("div",{className:e.titleBar},v.createElement(k,{className:e.title,component:"div"},"Response for ",v.createElement("div",{className:e.responseBox},b)),v.createElement(j,{label:"Validation",className:e.selectContainer},v.createElement(N,{className:e.select,onChange:this.onChange("validation"),value:r||"literal"},v.createElement(O,{value:"literal"},"Literal Validation"),v.createElement(O,{value:"symbolic"},"Symbolic Validation")))),"literal"===r&&v.createElement("div",{className:e.flexContainer},o.enabled&&v.createElement(I,{label:o.label,control:v.createElement(M,{className:e.customColor,checked:h,onChange:this.onLiteralOptionsChange("allowTrailingZeros")})}),s.enabled&&v.createElement(I,{label:s.label,control:v.createElement(M,{className:e.customColor,checked:c,onChange:this.onLiteralOptionsChange("ignoreOrder")})})),v.createElement("div",{className:e.inputContainer},v.createElement(R,null,"Correct Answer"),v.createElement(B,{keypadMode:t,classNames:g,controlledKeypad:!0,showKeypad:l.main,latex:p||"",onChange:this.onAnswerChange,onFocus:this.onFocus,onDone:this.onDone,error:i&&i.answer}),i&&i.answer?v.createElement("div",{className:e.errorText},i.answer):null),u&&Object.keys(d).map(((n,a)=>v.createElement("div",{className:e.inputContainer,key:n},v.createElement(R,null,"Alternate",Object.keys(d).length>1?` ${a+1}`:""),v.createElement("div",{className:e.alternateBar},v.createElement(B,{classNames:g,controlledKeypad:!0,keypadMode:t,showKeypad:l[n]||!1,latex:d[n]||"",onChange:this.onAlternateAnswerChange(n),onFocus:this.onAlternateFocus(n),onDone:this.onAlternateDone(n),error:i&&i[n]}),v.createElement(P,{className:e.removeAlternateButton,onClick:this.onRemoveAlternate(n)},v.createElement(D,null))),i&&i[n]?v.createElement("div",{className:e.errorText},i[n]):null))),v.createElement(T,{className:e.alternateButton,type:"primary",onClick:this.onAddAlternate},"ADD ALTERNATE")))}}L.__initStatic(),L.__initStatic2();var H=K((e=>({responseContainer:{marginBottom:2.5*e.spacing.unit,width:"100%",minWidth:"548px",border:`1px solid ${e.palette.grey[700]}`,display:"flex",flexDirection:"column",justifyContent:"space-between"},cardContent:{paddingBottom:2*e.spacing.unit+"px !important"},title:{fontWeight:700,fontSize:"1.2rem",flex:3},selectContainer:{flex:2},inputContainer:{marginBottom:2*e.spacing.unit},titleBar:{display:"flex",alignItems:"center",justifyContent:"space-between"},responseEditor:{display:"flex",alignItems:"center",justifyContent:"center",width:"100%",minWidth:"500px",maxWidth:"900px",height:"auto",minHeight:"40px"},mathToolbar:{width:"100%"},alternateButton:{border:`1px solid ${e.palette.grey.A100}`},removeAlternateButton:{marginLeft:e.spacing.unit},errorText:{fontSize:e.typography.fontSize-2,color:e.palette.error.main,paddingTop:e.spacing.unit},responseBox:{background:e.palette.grey.A100,color:e.palette.grey.A700,display:"inline",minWidth:"50px",padding:"8px",border:"1px solid #C0C3CF"},alternateBar:{display:"flex",justifyContent:"space-between",alignItems:"center"},customColor:{color:`${q.tertiary()} !important`}})))(L);const Z="imes|riangle|an|heta|herefore",$="throot|parallel|cong|approx|eq|e|sim",W=new RegExp(`(\\t(?!${Z}))|(\\n(?!${$}))|(\\\\t(?!${Z}))|(\\\\n(?!${$}))`,"g"),z=e=>e.replace(W,"").replace(/\\"/g,'"').replace(/\\\//g,"/"),F=e=>{const t=((e="")=>{const t=document.createElement("div");return t.innerHTML=e.trim(),t})(z(e||"")||"");return t.querySelectorAll('[data-type="math_templated"]').forEach((e=>e.replaceWith(`{{${e.dataset.index}}}`))),t.innerHTML},Y=/\{\{(\d+)\}\}/g,G=(e,t)=>e?z(e).replace(Y,((e,n)=>{const a=function(e){let t,n=e[0],a=1;for(;a<e.length;){const o=e[a],s=e[a+1];if(a+=2,("optionalAccess"===o||"optionalCall"===o)&&null==n)return;"access"===o||"optionalAccess"===o?(t=n,n=s(n)):"call"!==o&&"optionalCall"!==o||(n=s(((...e)=>n.call(t,...e))),t=void 0)}return n}([t,"access",e=>e[n],"optionalAccess",e=>e.answer])||"";return`<span data-type="math_templated" data-index="${n}" data-value="${a}"></span>`})):"",U=e,V=t,{withStyles:J}=a,{Typography:Q}=n,{Select:X}=n,{MenuItem:ee}=n,{Tooltip:te}=n,{Info:ne}=o,{cloneDeep:ae}=i,{pick:oe}=i,{throttle:se}=i,{InputContainer:ie}=p,{settings:le}=p,{layout:re}=p,{dropdown:pe}=p,de=d,{ALL_PLUGINS:ce}=d;function he(e){let t,n=e[0],a=1;for(;a<e.length;){const o=e[a],s=e[a+1];if(a+=2,("optionalAccess"===o||"optionalCall"===o)&&null==n)return;"access"===o||"optionalAccess"===o?(t=n,n=s(n)):"call"!==o&&"optionalCall"!==o||(n=s(((...e)=>n.call(t,...e))),t=void 0)}return n}const{Panel:ue,toggle:ge}=le;class me extends U.Component{constructor(...e){super(...e),me.prototype.__init.call(this),me.prototype.__init2.call(this),me.prototype.__init3.call(this),me.prototype.__init4.call(this),me.prototype.__init5.call(this),me.prototype.__init6.call(this),me.prototype.__init7.call(this),me.prototype.__init8.call(this),me.prototype.__init9.call(this)}static __initStatic(){this.propTypes={model:V.object.isRequired,configuration:V.object.isRequired,classes:V.object.isRequired,onModelChanged:V.func.isRequired,onConfigurationChanged:V.func.isRequired,imageSupport:V.shape({add:V.func.isRequired,delete:V.func.isRequired}),uploadSoundSupport:V.object}}__init(){this.state={}}componentDidMount(){const{model:{slateMarkup:e}}=this.props;this.setState({markup:e})}__init2(){this.handleChange=(e,t)=>{const{onModelChanged:n,model:a}=this.props,o=ae(a);o[e]=t,n(o)}}__init3(){this.onResponseChange=(e,t)=>{const{model:n,onModelChanged:a}=this.props,o={...n};o.responses[t]=e,a(o)}}__init4(){this.onResponseDone=()=>{const{model:e,onModelChanged:t}=this.props;t({...e,slateMarkup:G(e.markup,e.responses)})}}__init5(){this.onChangeResponse=(e,t)=>{const{model:n,onModelChanged:a}=this.props,{responses:o}=n;o[e]?o[e][0].answer=t||"":o[e]=[{answer:t||"",id:"response"+e,allowSpaces:!0}],a({...n,responses:o})}}__init6(){this.onResponsesChanged=e=>{this.props.onModelChanged({...this.props.model,responses:e})}}__init7(){this.onChange=e=>{const{model:{responses:t,validationDefault:n,allowTrailingZerosDefault:a,ignoreOrderDefault:o},onModelChanged:s}=this.props,i={},l=(e=>{const t=document.createElement("div");return t.innerHTML=e.trim(),t})(e);l.querySelectorAll('[data-type="math_templated"]').forEach(((e,s)=>{const{value:l,index:r}=e.dataset;l||(e.dataset.value=""),i[s]=t[r]||{allowSpaces:!0,validation:n||"symbolic",allowTrailingZeros:a||!1,ignoreOrder:o||!1,answer:"",alternates:{}},e.dataset.index=s.toString()})),console.log("newResponses",i);const r=F(e);this.setState({cachedResponses:void 0},(()=>s({...this.props.model,slateMarkup:l.innerHTML,responses:i,markup:r})))}}__init8(){this.onHandleAreaChange=se((e=>{const{model:{responses:t},onModelChanged:n}=this.props,{cachedResponses:a}=this.state;if(!e)return;const o=t?ae(t):{},s=a?ae(a):{};e.forEach((e=>{const t=e.data.get("index");!o[t]&&s[t]?(Object.assign(o,oe(s,t)),s.hasOwnProperty(t)&&delete s[t]):(Object.assign(s,oe(o,t)),o.hasOwnProperty(t)&&delete o[t])})),this.setState({cachedResponses:s},(()=>n({...this.props.model,responses:o})))}),500,{trailing:!1,leading:!0})}__init9(){this.onBlur=e=>{const{relatedTarget:t,currentTarget:n}=e||{},a=function e(t,n=0){if(!t||n>=16)return null;const a=t.offsetParent;return a?"tooltip"===a.getAttribute("role")?a:e(a,n+1):null}(t),o=a?function e(t,n=0){if(!t||n>=4)return null;const a=he([t,"optionalAccess",e=>e.children,"optionalAccess",e=>e[0]]);return a?a.attributes&&a.attributes["data-keypad"]?a:e(a,n+1):null}(a):null;t&&n&&he([o,"optionalAccess",e=>e.attributes,"access",e=>e["data-keypad"]])||this.setState({activeAnswerBlock:""})}}render(){const{classes:e,configuration:t,imageSupport:n,model:a,onConfigurationChanged:o,onModelChanged:s,uploadSoundSupport:i}=this.props,{baseInputConfiguration:l={},contentDimensions:r={},prompt:p={},rationale:d={},settingsPanelDisabled:c,teacherInstructions:h={},language:u={},languageChoices:g={},spellCheck:m={},playerSpellCheck:b={},maxImageWidth:_={},maxImageHeight:C={},mathMlOptions:y={},template:E={},editSource:f={},ignoreOrder:S={},allowTrailingZeros:v={},partialScoring:w={},maxResponseAreas:x}=t||{},{errors:A,extraCSSRules:T,promptEnabled:I,rationaleEnabled:k,spellCheckEnabled:R,teacherInstructionsEnabled:M,toolbarEditorPosition:N,responses:O,equationEditor:P}=a||{},{prompt:K,rationale:D,responseAreas:q,teacherInstructions:j,responses:B={}}=A||{},L=(e=>{const{maxResponseAreas:t}=e;return"Validation requirements:\nCorrect answers should not be blank.\nEach answer defined for a response area should be unique.\nThere should be at least 1 "+(t?`and at most ${t} `:"")+"response area"+(t?"s":"")+" defined."})(t),Z={"language.enabled":u.settings&&ge(u.label,!0),language:u.settings&&u.enabled&&pe(g.label,g.options)},$={teacherInstructionsEnabled:h.settings&&ge(h.label),rationaleEnabled:d.settings&&ge(d.label),promptEnabled:p.settings&&ge(p.label),spellCheckEnabled:m.settings&&ge(m.label),playerSpellCheckEnabled:b.settings&&ge(b.label),"editSource.enabled":he([f,"optionalAccess",e=>e.settings])&&ge(f.label,!0),partialScoring:w.settings&&ge(w.label)},W=_&&_.prompt,z=C&&C.prompt,F={position:"top"===N?"top":"bottom"},Y=(e={},t={})=>({...t,...e});return U.createElement(re.ConfigLayout,{extraCSSRules:T,dimensions:r,hideSettings:c,settings:U.createElement(ue,{model:a,configuration:t,onChangeModel:e=>s(e),onChangeConfiguration:o,groups:{Settings:Z,Properties:$}})},M&&U.createElement(ie,{label:h.label,className:e.promptHolder},U.createElement(de,{className:e.prompt,markup:a.teacherInstructions||"",onChange:e=>this.handleChange("teacherInstructions",e),imageSupport:n,nonEmpty:!1,error:j,toolbarOpts:F,pluginProps:Y(he([h,"optionalAccess",e=>e.inputConfiguration]),l),spellCheck:R,maxImageWidth:_&&_.teacherInstructions||W,maxImageHeight:C&&C.teacherInstructions||z,uploadSoundSupport:i,languageCharactersProps:[{language:"spanish"},{language:"special"}],mathMlOptions:y}),j&&U.createElement("div",{className:e.errorText},j)),I&&U.createElement(ie,{label:p.label,className:e.promptHolder},U.createElement(de,{className:e.prompt,markup:a.prompt,onChange:e=>this.handleChange("prompt",e),imageSupport:n,nonEmpty:!1,disableUnderline:!0,error:K,toolbarOpts:F,pluginProps:Y(he([h,"optionalAccess",e=>e.inputConfiguration]),l),spellCheck:R,maxImageWidth:W,maxImageHeight:z,uploadSoundSupport:i,languageCharactersProps:[{language:"spanish"},{language:"special"}],mathMlOptions:y}),K&&U.createElement("div",{className:e.errorText},K)),U.createElement("div",{className:e.tooltipContainer},U.createElement(Q,{className:e.title,component:"div"},"Response Template"),U.createElement(te,{classes:{tooltip:e.tooltip},disableFocusListener:!0,disableTouchListener:!0,placement:"right",title:L},U.createElement(ne,{fontSize:"small",color:"primary"}))),U.createElement(de,{activePlugins:ce,toolbarOpts:{position:"top"},spellCheck:R,pluginProps:Y(he([E,"optionalAccess",e=>e.inputConfiguration]),l),responseAreaProps:{type:"math-templated",respAreaToolbar:null,error:()=>B,onHandleAreaChange:this.onHandleAreaChange,maxResponseAreas:x},className:e.markup,markup:a.slateMarkup,onChange:this.onChange,imageSupport:n,disableImageAlignmentButtons:!0,onBlur:this.onBlur,disabled:!1,highlightShape:!1,error:q,uploadSoundSupport:i,languageCharactersProps:[{language:"spanish"},{language:"special"}],mathMlOptions:y}),q&&U.createElement("div",{className:e.responseAreaError},q),U.createElement(Q,{className:e.title},"Define Response"),U.createElement(ie,{label:"Response Template Equation Editor",className:e.selectContainer},U.createElement(X,{className:e.select,onChange:e=>this.handleChange("equationEditor",e.target.value),value:P},U.createElement(ee,{value:"non-negative-integers"},"Numeric - Non-Negative Integers"),U.createElement(ee,{value:"integers"},"Numeric - Integers"),U.createElement(ee,{value:"decimals"},"Numeric - Decimals"),U.createElement(ee,{value:"fractions"},"Numeric - Fractions"),U.createElement(ee,{value:1},"Grade 1 - 2"),U.createElement(ee,{value:3},"Grade 3 - 5"),U.createElement(ee,{value:6},"Grade 6 - 7"),U.createElement(ee,{value:8},"Grade 8 - HS"),U.createElement(ee,{value:"geometry"},"Geometry"),U.createElement(ee,{value:"advanced-algebra"},"Advanced Algebra"),U.createElement(ee,{value:"statistics"},"Statistics"),U.createElement(ee,{value:"item-authoring"},"Item Authoring"))),Object.keys(O||{}).map(((e,t)=>{const n=O[t];return n?U.createElement(H,{key:t,responseKey:t,mode:P,response:n,onResponseChange:this.onResponseChange,onResponseDone:this.onResponseDone,index:t,cIgnoreOrder:S,cAllowTrailingZeros:v,error:B&&B[t]}):null})),k&&U.createElement(ie,{label:d.label,className:e.promptHolder},U.createElement(de,{className:e.prompt,markup:a.rationale||"",onChange:e=>this.handleChange("rationale",e),imageSupport:n,nonEmpty:!1,error:D,toolbarOpts:F,pluginProps:Y(he([d,"optionalAccess",e=>e.inputConfiguration]),{...l,math:{controlledKeypadMode:!1}}),spellCheck:R,maxImageWidth:_&&_.rationale||W,maxImageHeight:C&&C.rationale||z,uploadSoundSupport:i,languageCharactersProps:[{language:"spanish"},{language:"special"}],mathMlOptions:y}),D&&U.createElement("div",{className:e.errorText},D)))}}me.__initStatic();var be=J((e=>({promptHolder:{width:"100%",paddingTop:2*e.spacing.unit,marginBottom:2*e.spacing.unit},prompt:{width:"100%"},errorText:{color:e.palette.error.main,fontSize:"0.75rem",marginTop:e.spacing.unit},responseAreaError:{color:e.palette.error.main,fontSize:"0.75rem",marginBottom:e.spacing.unit},markup:{width:"100%",marginTop:2*e.spacing.unit,marginBottom:3*e.spacing.unit},selectContainer:{width:"100%",marginTop:2*e.spacing.unit},select:{width:"100%"},title:{fontSize:1.25*e.typography.fontSize,fontWeight:"bold"},tooltipContainer:{display:"flex",alignItems:"center",gap:"8px"},tooltip:{fontSize:e.typography.fontSize-2,whiteSpace:"pre",maxWidth:"500px"}})))(me),_e={allowTrailingZerosDefault:!1,equationEditor:"8",ignoreOrderDefault:!1,markup:"",playerSpellCheckEnabled:!0,prompt:"",promptEnabled:!0,rationale:"",rationaleEnabled:!0,responses:{},spellCheckEnabled:!0,teacherInstructions:"",teacherInstructionsEnabled:!0,toolbarEditorPosition:"bottom",validationDefault:"literal"},Ce={ignoreOrder:{settings:!1,label:"Ignore Order",enabled:!0},allowTrailingZeros:{settings:!1,label:"Allow Trailing Zeros",enabled:!0},partialScoring:{settings:!0,label:"Allow Partial Scoring"},baseInputConfiguration:{html:{disabled:!0},audio:{disabled:!1},video:{disabled:!1},image:{disabled:!1},h3:{disabled:!0},blockquote:{disabled:!0},textAlign:{disabled:!0},showParagraphs:{disabled:!1},separateParagraphs:{disabled:!0}},prompt:{label:"Prompt",settings:!0,inputConfiguration:{audio:{disabled:!1},video:{disabled:!1},image:{disabled:!1}},required:!1},spellCheck:{label:"Spellcheck",settings:!1,enabled:!0},editSource:{label:"Edit Source",settings:!1,enabled:!1},playerSpellCheck:{label:"Student Spellcheck",settings:!0,enabled:!0},teacherInstructions:{settings:!0,label:"Teacher Instructions",inputConfiguration:{audio:{disabled:!1},video:{disabled:!1},image:{disabled:!1}},required:!1},rationale:{settings:!0,label:"Rationale",inputConfiguration:{audio:{disabled:!1},video:{disabled:!1},image:{disabled:!1}},required:!1},template:{inputConfiguration:{audio:{disabled:!1},video:{disabled:!1},image:{disabled:!1}}},maxImageWidth:{teacherInstructions:300,prompt:300,rationale:300},maxImageHeight:{teacherInstructions:300,prompt:300,rationale:300},mathMlOptions:{mmlOutput:!1,mmlEditing:!1},language:{settings:!1,label:"Specify Language",enabled:!1},languageChoices:{label:"Language Choices",options:[]},maxResponseAreas:10};const ye=e,Ee=r,fe=l,{defaults:Se}=i,{isArray:ve}=i;function we(e){let t,n=e[0],a=1;for(;a<e.length;){const o=e[a],s=e[a+1];if(a+=2,("optionalAccess"===o||"optionalCall"===o)&&null==n)return;"access"===o||"optionalAccess"===o?(t=n,n=s(n)):"call"!==o&&"optionalCall"!==o||(n=s(((...e)=>n.call(t,...e))),t=void 0)}return n}const xe=fe("math-templated:configure");class Ae extends HTMLElement{static __initStatic(){this.prepareModel=(e={})=>{const{validationDefault:t,allowTrailingZerosDefault:n,ignoreOrderDefault:a,responses:o={}}=e,s=Object.keys(o).reduce(((e,s)=>{const i=o[s];return e[s]={...i,validation:i.validation||t,allowTrailingZeros:i.allowTrailingZeros||n,ignoreOrder:i.ignoreOrder||a},e}),{}),i={..._e,...e,responses:s},l=i.slateMarkup||G(i.markup,i.responses),r=F(l);return i.responses&&Object.keys(i.responses).forEach((e=>{ve(i.responses[e])&&(i.responses[e]=(i.responses[e]||[]).map(((e,t)=>e.answer?e:(xe('Choice does not contain "answer" property, which is required.',e),{answer:`${t}`,...e}))))})),{...i,slateMarkup:l,markup:r}}}constructor(){super(),this._model=Ae.prepareModel(),this._configuration=Ce,this.onModelChanged=this.onModelChanged.bind(this),this.onConfigurationChanged=this.onConfigurationChanged.bind(this)}set model(e){this._model=Ae.prepareModel(e),this._render()}set configuration(e){this._configuration=Se(e,Ce),we([e,"access",e=>e.language,"optionalAccess",e=>e.enabled])?we([e,"access",e=>e.languageChoices,"optionalAccess",e=>e.options,"optionalAccess",e=>e.length])&&(this._model.language=e.languageChoices.options[0].value):e.language.settings&&this._model.language?(this._configuration.language.enabled=!0,this._configuration.languageChoices.options&&this._configuration.languageChoices.options.length||(this._configuration.languageChoices.options=[]),this._configuration.languageChoices.options.find((e=>e.value===this._model.language))||this._configuration.languageChoices.options.push({value:this._model.language,label:this._model.language})):delete this._model.language,this._render()}set disableSidePanel(e){this._disableSidePanel=e,this._render()}dispatchModelUpdated(e){const t=!!e;this.dispatchEvent(new g(this._model,t))}onModelChanged(e,t){this._model=Ae.prepareModel(e),this._render(),this.dispatchModelUpdated(t)}onConfigurationChanged(e){this._configuration=e,this._render()}insertImage(e){this.dispatchEvent(new C(e))}onDeleteImage(e,t){this.dispatchEvent(new b(e,t))}insertSound(e){this.dispatchEvent(new S(e))}onDeleteSound(e,t){this.dispatchEvent(new E(e,t))}_render(){xe("_render");let e=ye.createElement(be,{model:this._model,configuration:this._configuration,onModelChanged:this.onModelChanged,onConfigurationChanged:this.onConfigurationChanged,disableSidePanel:this._disableSidePanel,imageSupport:{add:this.insertImage.bind(this),delete:this.onDeleteImage.bind(this)},uploadSoundSupport:{add:this.insertSound.bind(this),delete:this.onDeleteSound.bind(this)}});Ee.render(e,this)}}Ae.__initStatic();export{Ae as default};