@pie-element/multiple-choice 6.2.5 → 6.3.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/CHANGELOG.md +43 -0
- package/configure/CHANGELOG.md +35 -0
- package/configure/lib/defaults.js +2 -2
- package/configure/lib/defaults.js.map +1 -1
- package/configure/lib/index.js +2 -2
- package/configure/lib/main.js +88 -57
- package/configure/lib/main.js.map +1 -1
- package/configure/lib/utils.js +18 -0
- package/configure/lib/utils.js.map +1 -0
- package/configure/package.json +4 -4
- package/controller/CHANGELOG.md +24 -0
- package/controller/lib/index.js +61 -3
- package/controller/lib/index.js.map +1 -1
- package/controller/package.json +1 -1
- package/docs/pie-schema.json +1 -1
- package/docs/pie-schema.json.md +1 -1
- package/lib/choice-input.js +3 -3
- package/lib/choice.js +2 -2
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/module/configure.js +127 -66
- package/module/controller.js +46 -1
- package/module/element.js +3 -4
- package/module/index.html +1 -1
- package/module/manifest.json +3 -3
- package/module/print.html +1 -1
- package/module/print.js +3 -4
- package/package.json +6 -6
package/module/configure.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {_dll_react, _dll_prop_types, _dll_material_ui__core_styles, _dll_material_ui__core, _dll_lodash, _dll_pie_lib__render_ui, _dll_debug, _dll_react_dom} from "../../../@pie-lib/shared-module@^1.4.
|
|
2
|
-
import {_dll_pie_lib__config_ui} from "../../../@pie-lib/config-module@^1.0
|
|
3
|
-
import {_dll_pie_lib__editable_html} from "../../../@pie-lib/editable-html-module@^1.
|
|
1
|
+
import {_dll_react, _dll_prop_types, _dll_material_ui__core_styles, _dll_material_ui__core, _dll_lodash, _dll_material_ui__icons, _dll_pie_lib__render_ui, _dll_debug, _dll_react_dom} from "../../../@pie-lib/shared-module@^1.4.13/module/index.js";
|
|
2
|
+
import {_dll_pie_lib__config_ui} from "../../../@pie-lib/config-module@^1.2.0/module/index.js";
|
|
3
|
+
import {_dll_pie_lib__editable_html} from "../../../@pie-lib/editable-html-module@^1.5.0/module/index.js";
|
|
4
4
|
var lib = {};
|
|
5
5
|
Object.defineProperty(lib, "__esModule", {
|
|
6
6
|
value: true
|
|
@@ -46,6 +46,13 @@ class InsertImageEvent extends CustomEvent {
|
|
|
46
46
|
}
|
|
47
47
|
InsertImageEvent.TYPE = 'insert.image';
|
|
48
48
|
var InsertImageEvent_1 = lib.InsertImageEvent = InsertImageEvent;
|
|
49
|
+
const generateValidationMessage = config => {
|
|
50
|
+
const {minAnswerChoices, maxAnswerChoices} = config;
|
|
51
|
+
const answerChoicesMessage = `\nThere should be at least ${minAnswerChoices} ` + (maxAnswerChoices ? `and at most ${maxAnswerChoices} ` : '') + 'answer choices defined.' + '\nEvery answer choice should be non-blank and unique.';
|
|
52
|
+
const correctAnswerMessage = '\nA correct answer must be defined.';
|
|
53
|
+
const message = 'Validation requirements:' + answerChoicesMessage + correctAnswerMessage;
|
|
54
|
+
return message;
|
|
55
|
+
};
|
|
49
56
|
const React$1 = _dll_react;
|
|
50
57
|
const PropTypes = _dll_prop_types;
|
|
51
58
|
const {color: color} = _dll_pie_lib__render_ui;
|
|
@@ -55,7 +62,9 @@ const {Tooltip: Tooltip} = _dll_material_ui__core;
|
|
|
55
62
|
const {Dialog: Dialog} = _dll_material_ui__core;
|
|
56
63
|
const {DialogTitle: DialogTitle} = _dll_material_ui__core;
|
|
57
64
|
const {DialogActions: DialogActions} = _dll_material_ui__core;
|
|
65
|
+
const {Typography: Typography} = _dll_material_ui__core;
|
|
58
66
|
const {merge: merge} = _dll_lodash;
|
|
67
|
+
const {Info: Info} = _dll_material_ui__icons;
|
|
59
68
|
const EditableHtml = _dll_pie_lib__editable_html;
|
|
60
69
|
const {InputContainer: InputContainer} = _dll_pie_lib__config_ui;
|
|
61
70
|
const {ChoiceConfiguration: ChoiceConfiguration} = _dll_pie_lib__config_ui;
|
|
@@ -117,13 +126,36 @@ const styles = theme => ({
|
|
|
117
126
|
'&:focus': {
|
|
118
127
|
backgroundColor: color.disabled()
|
|
119
128
|
}
|
|
129
|
+
},
|
|
130
|
+
flexContainer: {
|
|
131
|
+
display: 'flex',
|
|
132
|
+
alignItems: 'center',
|
|
133
|
+
marginBottom: '5px'
|
|
134
|
+
},
|
|
135
|
+
titleText: {
|
|
136
|
+
fontFamily: 'Cerebri Sans',
|
|
137
|
+
fontSize: '18px',
|
|
138
|
+
lineHeight: '19px',
|
|
139
|
+
color: '#495B8F',
|
|
140
|
+
marginRight: '5px'
|
|
141
|
+
},
|
|
142
|
+
tooltip: {
|
|
143
|
+
fontSize: '12px',
|
|
144
|
+
whiteSpace: 'pre',
|
|
145
|
+
maxWidth: '500px'
|
|
146
|
+
},
|
|
147
|
+
errorText: {
|
|
148
|
+
fontSize: '12px',
|
|
149
|
+
color: 'red',
|
|
150
|
+
paddingTop: '5px'
|
|
120
151
|
}
|
|
121
152
|
});
|
|
122
153
|
const Design = withStyles(styles)(props => {
|
|
123
154
|
const {classes, model, configuration, onPromptChanged, onChoiceChanged, onRemoveChoice, onAddChoice, imageSupport, onChangeModel, onConfigurationChanged, onTeacherInstructionsChanged} = props;
|
|
124
155
|
const {prompt = {}, addChoiceButton = {}, feedback = {}, deleteChoice = {}, choiceMode = {}, choicePrefix = {}, partialScoring = {}, lockChoiceOrder = {}, teacherInstructions = {}, studentInstructions = {}, rationale = {}, accessibility = {}, scoringType = {}, sequentialChoiceLabels = {}, settingsPanelDisabled, choicesLayout, spellCheck = {}, gridColumns} = configuration || ({});
|
|
125
156
|
let {maxAnswerChoices} = configuration || ({});
|
|
126
|
-
const {limitChoicesNumber, teacherInstructionsEnabled, rationaleEnabled, accessibilityLabelsEnabled, feedbackEnabled, promptEnabled, spellCheckEnabled, choices} = model || ({});
|
|
157
|
+
const {limitChoicesNumber, teacherInstructionsEnabled, rationaleEnabled, accessibilityLabelsEnabled, feedbackEnabled, promptEnabled, spellCheckEnabled, choices, errors} = model || ({});
|
|
158
|
+
const {choicesErrors, correctResponseError, answerChoicesError} = errors || ({});
|
|
127
159
|
const nrOfColumnsAvailable = choices && choices.length ? Array.from({
|
|
128
160
|
length: choices.length
|
|
129
161
|
}, (_, i) => `${i + 1}`) : [];
|
|
@@ -147,11 +179,12 @@ const Design = withStyles(styles)(props => {
|
|
|
147
179
|
if (limitChoicesNumber) {
|
|
148
180
|
maxAnswerChoices = MAX_CHOICES;
|
|
149
181
|
}
|
|
182
|
+
const validationMessage = generateValidationMessage(configuration);
|
|
150
183
|
const Content = React$1.createElement('div', {
|
|
151
184
|
__self: undefined,
|
|
152
185
|
__source: {
|
|
153
186
|
fileName: _jsxFileName,
|
|
154
|
-
lineNumber:
|
|
187
|
+
lineNumber: 180
|
|
155
188
|
}
|
|
156
189
|
}, teacherInstructionsEnabled && React$1.createElement(InputContainer, {
|
|
157
190
|
label: teacherInstructions.label,
|
|
@@ -159,7 +192,7 @@ const Design = withStyles(styles)(props => {
|
|
|
159
192
|
__self: undefined,
|
|
160
193
|
__source: {
|
|
161
194
|
fileName: _jsxFileName,
|
|
162
|
-
lineNumber:
|
|
195
|
+
lineNumber: 182
|
|
163
196
|
}
|
|
164
197
|
}, React$1.createElement(EditableHtml, {
|
|
165
198
|
className: classes.prompt,
|
|
@@ -172,7 +205,7 @@ const Design = withStyles(styles)(props => {
|
|
|
172
205
|
__self: undefined,
|
|
173
206
|
__source: {
|
|
174
207
|
fileName: _jsxFileName,
|
|
175
|
-
lineNumber:
|
|
208
|
+
lineNumber: 186
|
|
176
209
|
}
|
|
177
210
|
})), promptEnabled && React$1.createElement(InputContainer, {
|
|
178
211
|
label: prompt.label,
|
|
@@ -180,7 +213,7 @@ const Design = withStyles(styles)(props => {
|
|
|
180
213
|
__self: undefined,
|
|
181
214
|
__source: {
|
|
182
215
|
fileName: _jsxFileName,
|
|
183
|
-
lineNumber:
|
|
216
|
+
lineNumber: 199
|
|
184
217
|
}
|
|
185
218
|
}, React$1.createElement(EditableHtml, {
|
|
186
219
|
className: classes.prompt,
|
|
@@ -194,15 +227,64 @@ const Design = withStyles(styles)(props => {
|
|
|
194
227
|
__self: undefined,
|
|
195
228
|
__source: {
|
|
196
229
|
fileName: _jsxFileName,
|
|
197
|
-
lineNumber:
|
|
230
|
+
lineNumber: 200
|
|
231
|
+
}
|
|
232
|
+
})), React$1.createElement('div', {
|
|
233
|
+
className: classes.flexContainer,
|
|
234
|
+
__self: undefined,
|
|
235
|
+
__source: {
|
|
236
|
+
fileName: _jsxFileName,
|
|
237
|
+
lineNumber: 212
|
|
238
|
+
}
|
|
239
|
+
}, React$1.createElement(Typography, {
|
|
240
|
+
className: classes.titleText,
|
|
241
|
+
__self: undefined,
|
|
242
|
+
__source: {
|
|
243
|
+
fileName: _jsxFileName,
|
|
244
|
+
lineNumber: 213
|
|
245
|
+
}
|
|
246
|
+
}, "Choices"), React$1.createElement(Tooltip, {
|
|
247
|
+
classes: {
|
|
248
|
+
tooltip: classes.tooltip
|
|
249
|
+
},
|
|
250
|
+
disableFocusListener: true,
|
|
251
|
+
disableTouchListener: true,
|
|
252
|
+
placement: 'right',
|
|
253
|
+
title: validationMessage,
|
|
254
|
+
__self: undefined,
|
|
255
|
+
__source: {
|
|
256
|
+
fileName: _jsxFileName,
|
|
257
|
+
lineNumber: 214
|
|
258
|
+
}
|
|
259
|
+
}, React$1.createElement(Info, {
|
|
260
|
+
fontSize: 'small',
|
|
261
|
+
color: 'primary',
|
|
262
|
+
__self: undefined,
|
|
263
|
+
__source: {
|
|
264
|
+
fileName: _jsxFileName,
|
|
265
|
+
lineNumber: 221
|
|
266
|
+
}
|
|
267
|
+
}))), correctResponseError && React$1.createElement('div', {
|
|
268
|
+
className: classes.errorText,
|
|
269
|
+
__self: undefined,
|
|
270
|
+
__source: {
|
|
271
|
+
fileName: _jsxFileName,
|
|
272
|
+
lineNumber: 224
|
|
198
273
|
}
|
|
199
|
-
}
|
|
274
|
+
}, correctResponseError), answerChoicesError && React$1.createElement('div', {
|
|
275
|
+
className: classes.errorText,
|
|
276
|
+
__self: undefined,
|
|
277
|
+
__source: {
|
|
278
|
+
fileName: _jsxFileName,
|
|
279
|
+
lineNumber: 225
|
|
280
|
+
}
|
|
281
|
+
}, answerChoicesError), choices.map((choice, index) => React$1.createElement('div', {
|
|
200
282
|
key: `choice-${index}`,
|
|
201
283
|
className: classes.choiceConfigurationHolder,
|
|
202
284
|
__self: undefined,
|
|
203
285
|
__source: {
|
|
204
286
|
fileName: _jsxFileName,
|
|
205
|
-
lineNumber:
|
|
287
|
+
lineNumber: 227
|
|
206
288
|
}
|
|
207
289
|
}, React$1.createElement(ChoiceConfiguration, {
|
|
208
290
|
key: index,
|
|
@@ -220,10 +302,12 @@ const Design = withStyles(styles)(props => {
|
|
|
220
302
|
noLabels: true,
|
|
221
303
|
toolbarOpts: toolbarOpts,
|
|
222
304
|
spellCheck: spellCheckEnabled,
|
|
305
|
+
error: choicesErrors && choicesErrors[choice.value] ? choicesErrors[choice.value] : null,
|
|
306
|
+
noCorrectAnswerError: correctResponseError,
|
|
223
307
|
__self: undefined,
|
|
224
308
|
__source: {
|
|
225
309
|
fileName: _jsxFileName,
|
|
226
|
-
lineNumber:
|
|
310
|
+
lineNumber: 231
|
|
227
311
|
}
|
|
228
312
|
}), rationaleEnabled && React$1.createElement(InputContainer, {
|
|
229
313
|
key: `rationale-${index}`,
|
|
@@ -232,7 +316,7 @@ const Design = withStyles(styles)(props => {
|
|
|
232
316
|
__self: undefined,
|
|
233
317
|
__source: {
|
|
234
318
|
fileName: _jsxFileName,
|
|
235
|
-
lineNumber:
|
|
319
|
+
lineNumber: 251
|
|
236
320
|
}
|
|
237
321
|
}, React$1.createElement(EditableHtml, {
|
|
238
322
|
className: classes.rationale,
|
|
@@ -248,7 +332,7 @@ const Design = withStyles(styles)(props => {
|
|
|
248
332
|
__self: undefined,
|
|
249
333
|
__source: {
|
|
250
334
|
fileName: _jsxFileName,
|
|
251
|
-
lineNumber:
|
|
335
|
+
lineNumber: 256
|
|
252
336
|
}
|
|
253
337
|
})), accessibilityLabelsEnabled && React$1.createElement(InputContainer, {
|
|
254
338
|
key: `accessibility-${index}`,
|
|
@@ -257,7 +341,7 @@ const Design = withStyles(styles)(props => {
|
|
|
257
341
|
__self: undefined,
|
|
258
342
|
__source: {
|
|
259
343
|
fileName: _jsxFileName,
|
|
260
|
-
lineNumber:
|
|
344
|
+
lineNumber: 273
|
|
261
345
|
}
|
|
262
346
|
}, React$1.createElement(EditableHtml, {
|
|
263
347
|
className: classes.accessibility,
|
|
@@ -272,13 +356,13 @@ const Design = withStyles(styles)(props => {
|
|
|
272
356
|
__self: undefined,
|
|
273
357
|
__source: {
|
|
274
358
|
fileName: _jsxFileName,
|
|
275
|
-
lineNumber:
|
|
359
|
+
lineNumber: 278
|
|
276
360
|
}
|
|
277
361
|
})))), React$1.createElement('br', {
|
|
278
362
|
__self: undefined,
|
|
279
363
|
__source: {
|
|
280
364
|
fileName: _jsxFileName,
|
|
281
|
-
lineNumber:
|
|
365
|
+
lineNumber: 295
|
|
282
366
|
}
|
|
283
367
|
}), addChoiceButton.settings && React$1.createElement(Tooltip, {
|
|
284
368
|
title: maxAnswerChoices && model.choices.length >= maxAnswerChoices ? `Only ${maxAnswerChoices} allowed maximum` : '',
|
|
@@ -288,11 +372,11 @@ const Design = withStyles(styles)(props => {
|
|
|
288
372
|
__self: undefined,
|
|
289
373
|
__source: {
|
|
290
374
|
fileName: _jsxFileName,
|
|
291
|
-
lineNumber:
|
|
375
|
+
lineNumber: 297
|
|
292
376
|
}
|
|
293
377
|
}, React$1.createElement(Button, {
|
|
294
378
|
classes: {
|
|
295
|
-
root: maxAnswerChoices && model.choices.length >= maxAnswerChoices
|
|
379
|
+
root: maxAnswerChoices && model.choices.length >= maxAnswerChoices && classes.disableButton
|
|
296
380
|
},
|
|
297
381
|
className: classes.addButton,
|
|
298
382
|
variant: "contained",
|
|
@@ -301,7 +385,7 @@ const Design = withStyles(styles)(props => {
|
|
|
301
385
|
__self: undefined,
|
|
302
386
|
__source: {
|
|
303
387
|
fileName: _jsxFileName,
|
|
304
|
-
lineNumber:
|
|
388
|
+
lineNumber: 305
|
|
305
389
|
}
|
|
306
390
|
}, addChoiceButton.label)));
|
|
307
391
|
const settingsInPanel = {
|
|
@@ -319,7 +403,7 @@ const Design = withStyles(styles)(props => {
|
|
|
319
403
|
__self: undefined,
|
|
320
404
|
__source: {
|
|
321
405
|
fileName: _jsxFileName,
|
|
322
|
-
lineNumber:
|
|
406
|
+
lineNumber: 342
|
|
323
407
|
}
|
|
324
408
|
}, settingsPanelDisabled ? Content : React$1.createElement(layout.ConfigLayout, {
|
|
325
409
|
settings: React$1.createElement(Panel, {
|
|
@@ -342,13 +426,13 @@ const Design = withStyles(styles)(props => {
|
|
|
342
426
|
__self: undefined,
|
|
343
427
|
__source: {
|
|
344
428
|
fileName: _jsxFileName,
|
|
345
|
-
lineNumber:
|
|
429
|
+
lineNumber: 348
|
|
346
430
|
}
|
|
347
431
|
}),
|
|
348
432
|
__self: undefined,
|
|
349
433
|
__source: {
|
|
350
434
|
fileName: _jsxFileName,
|
|
351
|
-
lineNumber:
|
|
435
|
+
lineNumber: 346
|
|
352
436
|
}
|
|
353
437
|
}, Content));
|
|
354
438
|
});
|
|
@@ -357,19 +441,19 @@ const InfoDialog = ({open, onCancel, onOk, title}) => React$1.createElement(Dial
|
|
|
357
441
|
__self: undefined,
|
|
358
442
|
__source: {
|
|
359
443
|
fileName: _jsxFileName,
|
|
360
|
-
lineNumber:
|
|
444
|
+
lineNumber: 385
|
|
361
445
|
}
|
|
362
446
|
}, React$1.createElement(DialogTitle, {
|
|
363
447
|
__self: undefined,
|
|
364
448
|
__source: {
|
|
365
449
|
fileName: _jsxFileName,
|
|
366
|
-
lineNumber:
|
|
450
|
+
lineNumber: 386
|
|
367
451
|
}
|
|
368
452
|
}, title), React$1.createElement(DialogActions, {
|
|
369
453
|
__self: undefined,
|
|
370
454
|
__source: {
|
|
371
455
|
fileName: _jsxFileName,
|
|
372
|
-
lineNumber:
|
|
456
|
+
lineNumber: 387
|
|
373
457
|
}
|
|
374
458
|
}, onOk && React$1.createElement(Button, {
|
|
375
459
|
onClick: onOk,
|
|
@@ -377,7 +461,7 @@ const InfoDialog = ({open, onCancel, onOk, title}) => React$1.createElement(Dial
|
|
|
377
461
|
__self: undefined,
|
|
378
462
|
__source: {
|
|
379
463
|
fileName: _jsxFileName,
|
|
380
|
-
lineNumber:
|
|
464
|
+
lineNumber: 389
|
|
381
465
|
}
|
|
382
466
|
}, "OK"), onCancel && React$1.createElement(Button, {
|
|
383
467
|
onClick: onCancel,
|
|
@@ -385,7 +469,7 @@ const InfoDialog = ({open, onCancel, onOk, title}) => React$1.createElement(Dial
|
|
|
385
469
|
__self: undefined,
|
|
386
470
|
__source: {
|
|
387
471
|
fileName: _jsxFileName,
|
|
388
|
-
lineNumber:
|
|
472
|
+
lineNumber: 394
|
|
389
473
|
}
|
|
390
474
|
}, "Cancel")));
|
|
391
475
|
InfoDialog.propTypes = {
|
|
@@ -441,12 +525,7 @@ class Main extends React$1.Component {
|
|
|
441
525
|
open: false
|
|
442
526
|
}
|
|
443
527
|
});
|
|
444
|
-
}
|
|
445
|
-
onCancel: () => this.setState({
|
|
446
|
-
dialog: {
|
|
447
|
-
open: false
|
|
448
|
-
}
|
|
449
|
-
})
|
|
528
|
+
}
|
|
450
529
|
}
|
|
451
530
|
});
|
|
452
531
|
} else {
|
|
@@ -463,35 +542,17 @@ class Main extends React$1.Component {
|
|
|
463
542
|
if (limitChoicesNumber) {
|
|
464
543
|
maxAnswerChoices = MAX_CHOICES;
|
|
465
544
|
}
|
|
466
|
-
if (maxAnswerChoices && model.choices.length
|
|
467
|
-
|
|
468
|
-
dialog: {
|
|
469
|
-
open: true,
|
|
470
|
-
message: `There can't be more than ${maxAnswerChoices} choices.`,
|
|
471
|
-
onOk: () => {
|
|
472
|
-
this.setState({
|
|
473
|
-
dialog: {
|
|
474
|
-
open: false
|
|
475
|
-
}
|
|
476
|
-
});
|
|
477
|
-
},
|
|
478
|
-
onCancel: () => this.setState({
|
|
479
|
-
dialog: {
|
|
480
|
-
open: false
|
|
481
|
-
}
|
|
482
|
-
})
|
|
483
|
-
}
|
|
484
|
-
});
|
|
485
|
-
} else {
|
|
486
|
-
model.choices.push({
|
|
487
|
-
label: '',
|
|
488
|
-
value: utils$1.firstAvailableIndex(model.choices.map(c => c.value), 0),
|
|
489
|
-
feedback: {
|
|
490
|
-
type: 'none'
|
|
491
|
-
}
|
|
492
|
-
});
|
|
493
|
-
this.props.onModelChanged(model);
|
|
545
|
+
if (maxAnswerChoices && model.choices.length >= maxAnswerChoices) {
|
|
546
|
+
return;
|
|
494
547
|
}
|
|
548
|
+
model.choices.push({
|
|
549
|
+
label: '',
|
|
550
|
+
value: utils$1.firstAvailableIndex(model.choices.map(c => c.value), 0),
|
|
551
|
+
feedback: {
|
|
552
|
+
type: 'none'
|
|
553
|
+
}
|
|
554
|
+
});
|
|
555
|
+
this.props.onModelChanged(model);
|
|
495
556
|
};
|
|
496
557
|
}
|
|
497
558
|
__init4() {
|
|
@@ -563,7 +624,7 @@ class Main extends React$1.Component {
|
|
|
563
624
|
__self: this,
|
|
564
625
|
__source: {
|
|
565
626
|
fileName: _jsxFileName,
|
|
566
|
-
lineNumber:
|
|
627
|
+
lineNumber: 542
|
|
567
628
|
}
|
|
568
629
|
}), React$1.createElement(Design, {
|
|
569
630
|
...this.props,
|
|
@@ -576,7 +637,7 @@ class Main extends React$1.Component {
|
|
|
576
637
|
__self: this,
|
|
577
638
|
__source: {
|
|
578
639
|
fileName: _jsxFileName,
|
|
579
|
-
lineNumber:
|
|
640
|
+
lineNumber: 548
|
|
580
641
|
}
|
|
581
642
|
}));
|
|
582
643
|
}
|
|
@@ -603,8 +664,8 @@ var sensibleDefaults = {
|
|
|
603
664
|
},
|
|
604
665
|
configuration: {
|
|
605
666
|
spellCheck: {
|
|
606
|
-
label:
|
|
607
|
-
settings:
|
|
667
|
+
label: 'Spellcheck',
|
|
668
|
+
settings: false,
|
|
608
669
|
enabled: true
|
|
609
670
|
},
|
|
610
671
|
choicesLayout: {
|
package/module/controller.js
CHANGED
|
@@ -20638,4 +20638,49 @@ const createCorrectResponseSession = (question, env) => {
|
|
|
20638
20638
|
});
|
|
20639
20639
|
};
|
|
20640
20640
|
|
|
20641
|
-
|
|
20641
|
+
const validate = (model = {}, config = {}) => {
|
|
20642
|
+
const { choices } = model;
|
|
20643
|
+
const { minAnswerChoices = 2, maxAnswerChoices } = config;
|
|
20644
|
+
const reversedChoices = [...choices || []].reverse();
|
|
20645
|
+
const choicesErrors = {};
|
|
20646
|
+
let hasCorrectResponse = false;
|
|
20647
|
+
|
|
20648
|
+
reversedChoices.forEach((choice, index) => {
|
|
20649
|
+
const { correct, value, label } = choice;
|
|
20650
|
+
|
|
20651
|
+
if (correct) {
|
|
20652
|
+
hasCorrectResponse = true;
|
|
20653
|
+
}
|
|
20654
|
+
|
|
20655
|
+
if (label === '' || label === '<div></div>') {
|
|
20656
|
+
choicesErrors[value] = 'Content should not be empty.';
|
|
20657
|
+
} else {
|
|
20658
|
+
const identicalAnswer = reversedChoices.slice(index + 1).some(c => c.label === label);
|
|
20659
|
+
|
|
20660
|
+
if (identicalAnswer) {
|
|
20661
|
+
choicesErrors[value] = 'Content should be unique.';
|
|
20662
|
+
}
|
|
20663
|
+
}
|
|
20664
|
+
});
|
|
20665
|
+
|
|
20666
|
+
const errors = {};
|
|
20667
|
+
const nbOfChoices = (choices || []).length;
|
|
20668
|
+
|
|
20669
|
+
if (nbOfChoices < minAnswerChoices) {
|
|
20670
|
+
errors.answerChoicesError = `There should be at least ${minAnswerChoices} choices defined.`;
|
|
20671
|
+
} else if (nbOfChoices > maxAnswerChoices) {
|
|
20672
|
+
errors.answerChoicesError = `No more than ${maxAnswerChoices} choices should be defined.`;
|
|
20673
|
+
}
|
|
20674
|
+
|
|
20675
|
+
if (!hasCorrectResponse) {
|
|
20676
|
+
errors.correctResponseError = 'No correct response defined.';
|
|
20677
|
+
}
|
|
20678
|
+
|
|
20679
|
+
if (!isEmpty_1(choicesErrors)) {
|
|
20680
|
+
errors.choicesErrors = choicesErrors;
|
|
20681
|
+
}
|
|
20682
|
+
|
|
20683
|
+
return errors;
|
|
20684
|
+
};
|
|
20685
|
+
|
|
20686
|
+
export { createCorrectResponseSession, createDefaultModel, getScore, model, normalize, outcome, validate };
|
package/module/element.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {_dll_prop_types, _dll_react_dom, _dll_react, _dll_material_ui__core_styles, _dll_pie_lib__render_ui, _dll_material_ui__core, _dll_classnames, _dll_pie_lib__correct_answer_toggle, _dll_lodash, _dll_debug} from "../../../@pie-lib/shared-module@^1.4.
|
|
2
|
-
import {_dll_pie_lib__math_rendering} from "../../../@pie-lib/math-rendering-module@^1.
|
|
1
|
+
import {_dll_prop_types, _dll_react_dom, _dll_react, _dll_material_ui__core_styles, _dll_pie_lib__render_ui, _dll_material_ui__core, _dll_classnames, _dll_pie_lib__correct_answer_toggle, _dll_lodash, _dll_debug} from "../../../@pie-lib/shared-module@^1.4.13/module/index.js";
|
|
2
|
+
import {_dll_pie_lib__math_rendering} from "../../../@pie-lib/math-rendering-module@^1.1.1/module/index.js";
|
|
3
3
|
function getDefaultExportFromCjs(x) {
|
|
4
4
|
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
|
|
5
5
|
}
|
|
@@ -34,8 +34,7 @@ var interopRequireDefault = {
|
|
|
34
34
|
"default": obj
|
|
35
35
|
};
|
|
36
36
|
}
|
|
37
|
-
module.exports = _interopRequireDefault;
|
|
38
|
-
(module.exports["default"] = module.exports, module.exports.__esModule = true);
|
|
37
|
+
(module.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports["default"] = module.exports);
|
|
39
38
|
})(interopRequireDefault);
|
|
40
39
|
getDefaultExportFromCjs(interopRequireDefault.exports);
|
|
41
40
|
var hasClass = {
|
package/module/index.html
CHANGED
package/module/manifest.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pie-element/multiple-choice",
|
|
3
|
-
"version": "6.2.
|
|
3
|
+
"version": "6.2.7",
|
|
4
4
|
"modules": [
|
|
5
5
|
{
|
|
6
6
|
"name": "@pie-lib/shared-module",
|
|
7
|
-
"version": "^1.4.
|
|
7
|
+
"version": "^1.4.13"
|
|
8
8
|
},
|
|
9
9
|
{
|
|
10
10
|
"name": "@pie-lib/math-rendering-module",
|
|
11
|
-
"version": "^1.
|
|
11
|
+
"version": "^1.1.1"
|
|
12
12
|
}
|
|
13
13
|
]
|
|
14
14
|
}
|
package/module/print.html
CHANGED
package/module/print.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {_dll_prop_types, _dll_react_dom, _dll_react, _dll_material_ui__core_styles, _dll_pie_lib__render_ui, _dll_material_ui__core, _dll_classnames, _dll_pie_lib__correct_answer_toggle, _dll_lodash, _dll_debug} from "../../../@pie-lib/shared-module@^1.4.
|
|
2
|
-
import {_dll_pie_lib__math_rendering} from "../../../@pie-lib/math-rendering-module@^1.
|
|
1
|
+
import {_dll_prop_types, _dll_react_dom, _dll_react, _dll_material_ui__core_styles, _dll_pie_lib__render_ui, _dll_material_ui__core, _dll_classnames, _dll_pie_lib__correct_answer_toggle, _dll_lodash, _dll_debug} from "../../../@pie-lib/shared-module@^1.4.13/module/index.js";
|
|
2
|
+
import {_dll_pie_lib__math_rendering} from "../../../@pie-lib/math-rendering-module@^1.1.1/module/index.js";
|
|
3
3
|
function getDefaultExportFromCjs(x) {
|
|
4
4
|
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
|
|
5
5
|
}
|
|
@@ -34,8 +34,7 @@ var interopRequireDefault = {
|
|
|
34
34
|
"default": obj
|
|
35
35
|
};
|
|
36
36
|
}
|
|
37
|
-
module.exports = _interopRequireDefault;
|
|
38
|
-
(module.exports["default"] = module.exports, module.exports.__esModule = true);
|
|
37
|
+
(module.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports["default"] = module.exports);
|
|
39
38
|
})(interopRequireDefault);
|
|
40
39
|
getDefaultExportFromCjs(interopRequireDefault.exports);
|
|
41
40
|
var hasClass = {
|
package/package.json
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pie-element/multiple-choice",
|
|
3
3
|
"repository": "pie-framework/pie-elements",
|
|
4
|
-
"version": "6.
|
|
4
|
+
"version": "6.3.0",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
8
8
|
"dependencies": {
|
|
9
9
|
"@material-ui/core": "^3.9.2",
|
|
10
|
-
"@pie-lib/config-ui": "^10.
|
|
11
|
-
"@pie-lib/correct-answer-toggle": "^2.3.
|
|
12
|
-
"@pie-lib/math-rendering": "^2.
|
|
13
|
-
"@pie-lib/render-ui": "^4.12.
|
|
10
|
+
"@pie-lib/config-ui": "^10.12.1",
|
|
11
|
+
"@pie-lib/correct-answer-toggle": "^2.3.36",
|
|
12
|
+
"@pie-lib/math-rendering": "^2.4.0",
|
|
13
|
+
"@pie-lib/render-ui": "^4.12.6",
|
|
14
14
|
"classnames": "^2.2.5",
|
|
15
15
|
"debug": "^4.1.1",
|
|
16
16
|
"enzyme-to-json": "^3.3.3",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"react-test-renderer": "^16.3.2",
|
|
22
22
|
"react-transition-group": "^2.3.1"
|
|
23
23
|
},
|
|
24
|
-
"gitHead": "
|
|
24
|
+
"gitHead": "87c4247b2cca04380c8638f88e57bba47fb6c06a",
|
|
25
25
|
"scripts": {
|
|
26
26
|
"postpublish": "../../scripts/postpublish"
|
|
27
27
|
},
|