@pie-element/multiple-choice 6.1.9 → 6.1.10
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 +8 -0
- package/configure/CHANGELOG.md +8 -0
- package/configure/lib/defaults.js +3 -6
- package/configure/lib/defaults.js.map +1 -1
- package/configure/lib/main.js +122 -21
- package/configure/lib/main.js.map +1 -1
- package/configure/package.json +4 -4
- package/docs/config-schema.json +10 -0
- package/docs/config-schema.json.md +8 -0
- package/module/configure.js +151 -44
- package/module/element.js +174 -2395
- package/module/index.html +1 -1
- package/module/manifest.json +3 -3
- package/module/print.html +1 -1
- package/module/print.js +174 -2395
- package/package.json +3 -3
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.2.
|
|
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.0.
|
|
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.2.16/module/index.js";
|
|
2
|
+
import {_dll_pie_lib__config_ui} from "../../../@pie-lib/config-module@^1.0.17/module/index.js";
|
|
3
|
+
import {_dll_pie_lib__editable_html} from "../../../@pie-lib/editable-html-module@^1.0.17/module/index.js";
|
|
4
4
|
var lib = {};
|
|
5
5
|
Object.defineProperty(lib, "__esModule", {
|
|
6
6
|
value: true
|
|
@@ -52,6 +52,9 @@ const {color: color} = _dll_pie_lib__render_ui;
|
|
|
52
52
|
const {withStyles: withStyles} = _dll_material_ui__core_styles;
|
|
53
53
|
const {Button: Button} = _dll_material_ui__core;
|
|
54
54
|
const {Tooltip: Tooltip} = _dll_material_ui__core;
|
|
55
|
+
const {Dialog: Dialog} = _dll_material_ui__core;
|
|
56
|
+
const {DialogTitle: DialogTitle} = _dll_material_ui__core;
|
|
57
|
+
const {DialogActions: DialogActions} = _dll_material_ui__core;
|
|
55
58
|
const {merge: merge} = _dll_lodash;
|
|
56
59
|
const EditableHtml = _dll_pie_lib__editable_html;
|
|
57
60
|
const {InputContainer: InputContainer} = _dll_pie_lib__config_ui;
|
|
@@ -118,8 +121,9 @@ const styles = theme => ({
|
|
|
118
121
|
});
|
|
119
122
|
const Design = withStyles(styles)(props => {
|
|
120
123
|
const {classes, model, configuration, onPromptChanged, onChoiceChanged, onRemoveChoice, onAddChoice, imageSupport, onChangeModel, onConfigurationChanged, onTeacherInstructionsChanged} = props;
|
|
121
|
-
const {prompt = {}, addChoiceButton = {},
|
|
122
|
-
|
|
124
|
+
const {prompt = {}, addChoiceButton = {}, feedback = {}, deleteChoice = {}, choiceMode = {}, choicePrefix = {}, partialScoring = {}, lockChoiceOrder = {}, teacherInstructions = {}, studentInstructions = {}, rationale = {}, accessibility = {}, scoringType = {}, sequentialChoiceLabels = {}, settingsPanelDisabled, choicesLayout, gridColumns} = configuration || ({});
|
|
125
|
+
let {maxAnswerChoices} = configuration || ({});
|
|
126
|
+
const {limitChoicesNumber, teacherInstructionsEnabled, rationaleEnabled, accessibilityLabelsEnabled, feedbackEnabled, promptEnabled, choices} = model || ({});
|
|
123
127
|
const nrOfColumnsAvailable = choices && choices.length ? Array.from({
|
|
124
128
|
length: choices.length
|
|
125
129
|
}, (_, i) => `${i + 1}`) : [];
|
|
@@ -140,11 +144,14 @@ const Design = withStyles(styles)(props => {
|
|
|
140
144
|
toolbarOpts.position = 'bottom';
|
|
141
145
|
break;
|
|
142
146
|
}
|
|
147
|
+
if (limitChoicesNumber && !maxAnswerChoices) {
|
|
148
|
+
maxAnswerChoices = MAX_CHOICES;
|
|
149
|
+
}
|
|
143
150
|
const Content = React$1.createElement('div', {
|
|
144
151
|
__self: undefined,
|
|
145
152
|
__source: {
|
|
146
153
|
fileName: _jsxFileName,
|
|
147
|
-
lineNumber:
|
|
154
|
+
lineNumber: 149
|
|
148
155
|
}
|
|
149
156
|
}, teacherInstructionsEnabled && React$1.createElement(InputContainer, {
|
|
150
157
|
label: teacherInstructions.label,
|
|
@@ -152,7 +159,7 @@ const Design = withStyles(styles)(props => {
|
|
|
152
159
|
__self: undefined,
|
|
153
160
|
__source: {
|
|
154
161
|
fileName: _jsxFileName,
|
|
155
|
-
lineNumber:
|
|
162
|
+
lineNumber: 151
|
|
156
163
|
}
|
|
157
164
|
}, React$1.createElement(EditableHtml, {
|
|
158
165
|
className: classes.prompt,
|
|
@@ -164,7 +171,7 @@ const Design = withStyles(styles)(props => {
|
|
|
164
171
|
__self: undefined,
|
|
165
172
|
__source: {
|
|
166
173
|
fileName: _jsxFileName,
|
|
167
|
-
lineNumber:
|
|
174
|
+
lineNumber: 155
|
|
168
175
|
}
|
|
169
176
|
})), promptEnabled && React$1.createElement(InputContainer, {
|
|
170
177
|
label: prompt.label,
|
|
@@ -172,7 +179,7 @@ const Design = withStyles(styles)(props => {
|
|
|
172
179
|
__self: undefined,
|
|
173
180
|
__source: {
|
|
174
181
|
fileName: _jsxFileName,
|
|
175
|
-
lineNumber:
|
|
182
|
+
lineNumber: 167
|
|
176
183
|
}
|
|
177
184
|
}, React$1.createElement(EditableHtml, {
|
|
178
185
|
className: classes.prompt,
|
|
@@ -185,7 +192,7 @@ const Design = withStyles(styles)(props => {
|
|
|
185
192
|
__self: undefined,
|
|
186
193
|
__source: {
|
|
187
194
|
fileName: _jsxFileName,
|
|
188
|
-
lineNumber:
|
|
195
|
+
lineNumber: 168
|
|
189
196
|
}
|
|
190
197
|
})), model.choices.map((choice, index) => React$1.createElement('div', {
|
|
191
198
|
key: `choice-${index}`,
|
|
@@ -193,7 +200,7 @@ const Design = withStyles(styles)(props => {
|
|
|
193
200
|
__self: undefined,
|
|
194
201
|
__source: {
|
|
195
202
|
fileName: _jsxFileName,
|
|
196
|
-
lineNumber:
|
|
203
|
+
lineNumber: 180
|
|
197
204
|
}
|
|
198
205
|
}, React$1.createElement(ChoiceConfiguration, {
|
|
199
206
|
key: index,
|
|
@@ -213,7 +220,7 @@ const Design = withStyles(styles)(props => {
|
|
|
213
220
|
__self: undefined,
|
|
214
221
|
__source: {
|
|
215
222
|
fileName: _jsxFileName,
|
|
216
|
-
lineNumber:
|
|
223
|
+
lineNumber: 184
|
|
217
224
|
}
|
|
218
225
|
}), rationaleEnabled && React$1.createElement(InputContainer, {
|
|
219
226
|
key: `rationale-${index}`,
|
|
@@ -222,7 +229,7 @@ const Design = withStyles(styles)(props => {
|
|
|
222
229
|
__self: undefined,
|
|
223
230
|
__source: {
|
|
224
231
|
fileName: _jsxFileName,
|
|
225
|
-
lineNumber:
|
|
232
|
+
lineNumber: 201
|
|
226
233
|
}
|
|
227
234
|
}, React$1.createElement(EditableHtml, {
|
|
228
235
|
className: classes.rationale,
|
|
@@ -237,7 +244,7 @@ const Design = withStyles(styles)(props => {
|
|
|
237
244
|
__self: undefined,
|
|
238
245
|
__source: {
|
|
239
246
|
fileName: _jsxFileName,
|
|
240
|
-
lineNumber:
|
|
247
|
+
lineNumber: 206
|
|
241
248
|
}
|
|
242
249
|
})), accessibilityLabelsEnabled && React$1.createElement(InputContainer, {
|
|
243
250
|
key: `accessibility-${index}`,
|
|
@@ -246,7 +253,7 @@ const Design = withStyles(styles)(props => {
|
|
|
246
253
|
__self: undefined,
|
|
247
254
|
__source: {
|
|
248
255
|
fileName: _jsxFileName,
|
|
249
|
-
lineNumber:
|
|
256
|
+
lineNumber: 222
|
|
250
257
|
}
|
|
251
258
|
}, React$1.createElement(EditableHtml, {
|
|
252
259
|
className: classes.accessibility,
|
|
@@ -260,27 +267,27 @@ const Design = withStyles(styles)(props => {
|
|
|
260
267
|
__self: undefined,
|
|
261
268
|
__source: {
|
|
262
269
|
fileName: _jsxFileName,
|
|
263
|
-
lineNumber:
|
|
270
|
+
lineNumber: 227
|
|
264
271
|
}
|
|
265
272
|
})))), React$1.createElement('br', {
|
|
266
273
|
__self: undefined,
|
|
267
274
|
__source: {
|
|
268
275
|
fileName: _jsxFileName,
|
|
269
|
-
lineNumber:
|
|
276
|
+
lineNumber: 243
|
|
270
277
|
}
|
|
271
278
|
}), addChoiceButton.settings && React$1.createElement(Tooltip, {
|
|
272
|
-
title:
|
|
279
|
+
title: maxAnswerChoices && model.choices.length >= maxAnswerChoices ? `Only ${maxAnswerChoices} allowed maximum` : '',
|
|
273
280
|
classes: {
|
|
274
281
|
tooltip: classes.tooltip
|
|
275
282
|
},
|
|
276
283
|
__self: undefined,
|
|
277
284
|
__source: {
|
|
278
285
|
fileName: _jsxFileName,
|
|
279
|
-
lineNumber:
|
|
286
|
+
lineNumber: 245
|
|
280
287
|
}
|
|
281
288
|
}, React$1.createElement(Button, {
|
|
282
289
|
classes: {
|
|
283
|
-
root:
|
|
290
|
+
root: maxAnswerChoices && model.choices.length >= maxAnswerChoices ? classes.disableButton : undefined
|
|
284
291
|
},
|
|
285
292
|
className: classes.addButton,
|
|
286
293
|
variant: "contained",
|
|
@@ -289,7 +296,7 @@ const Design = withStyles(styles)(props => {
|
|
|
289
296
|
__self: undefined,
|
|
290
297
|
__source: {
|
|
291
298
|
fileName: _jsxFileName,
|
|
292
|
-
lineNumber:
|
|
299
|
+
lineNumber: 246
|
|
293
300
|
}
|
|
294
301
|
}, addChoiceButton.label)));
|
|
295
302
|
const settingsInPanel = {
|
|
@@ -297,7 +304,6 @@ const Design = withStyles(styles)(props => {
|
|
|
297
304
|
'sequentialChoiceLabels.enabled': sequentialChoiceLabels.settings && toggle(sequentialChoiceLabels.label, true),
|
|
298
305
|
choicePrefix: choicePrefix.settings && radio(choicePrefix.label, ['numbers', 'letters']),
|
|
299
306
|
partialScoring: partialScoring.settings && toggle(partialScoring.label),
|
|
300
|
-
limitChoicesNumber: limitChoicesNumber.settings && toggle(limitChoicesNumber.label),
|
|
301
307
|
lockChoiceOrder: lockChoiceOrder.settings && toggle(lockChoiceOrder.label),
|
|
302
308
|
feedbackEnabled: feedback.settings && toggle(feedback.label),
|
|
303
309
|
choicesLayout: choicesLayout.settings && dropdown(choicesLayout.label, ['vertical', 'grid', 'horizontal']),
|
|
@@ -308,7 +314,7 @@ const Design = withStyles(styles)(props => {
|
|
|
308
314
|
__self: undefined,
|
|
309
315
|
__source: {
|
|
310
316
|
fileName: _jsxFileName,
|
|
311
|
-
lineNumber:
|
|
317
|
+
lineNumber: 284
|
|
312
318
|
}
|
|
313
319
|
}, settingsPanelDisabled ? Content : React$1.createElement(layout.ConfigLayout, {
|
|
314
320
|
settings: React$1.createElement(Panel, {
|
|
@@ -330,16 +336,58 @@ const Design = withStyles(styles)(props => {
|
|
|
330
336
|
__self: undefined,
|
|
331
337
|
__source: {
|
|
332
338
|
fileName: _jsxFileName,
|
|
333
|
-
lineNumber:
|
|
339
|
+
lineNumber: 290
|
|
334
340
|
}
|
|
335
341
|
}),
|
|
336
342
|
__self: undefined,
|
|
337
343
|
__source: {
|
|
338
344
|
fileName: _jsxFileName,
|
|
339
|
-
lineNumber:
|
|
345
|
+
lineNumber: 288
|
|
340
346
|
}
|
|
341
347
|
}, Content));
|
|
342
348
|
});
|
|
349
|
+
const InfoDialog = ({open, onCancel, onOk, title}) => React$1.createElement(Dialog, {
|
|
350
|
+
open: open,
|
|
351
|
+
__self: undefined,
|
|
352
|
+
__source: {
|
|
353
|
+
fileName: _jsxFileName,
|
|
354
|
+
lineNumber: 325
|
|
355
|
+
}
|
|
356
|
+
}, React$1.createElement(DialogTitle, {
|
|
357
|
+
__self: undefined,
|
|
358
|
+
__source: {
|
|
359
|
+
fileName: _jsxFileName,
|
|
360
|
+
lineNumber: 326
|
|
361
|
+
}
|
|
362
|
+
}, title), React$1.createElement(DialogActions, {
|
|
363
|
+
__self: undefined,
|
|
364
|
+
__source: {
|
|
365
|
+
fileName: _jsxFileName,
|
|
366
|
+
lineNumber: 327
|
|
367
|
+
}
|
|
368
|
+
}, onOk && React$1.createElement(Button, {
|
|
369
|
+
onClick: onOk,
|
|
370
|
+
color: "primary",
|
|
371
|
+
__self: undefined,
|
|
372
|
+
__source: {
|
|
373
|
+
fileName: _jsxFileName,
|
|
374
|
+
lineNumber: 329
|
|
375
|
+
}
|
|
376
|
+
}, "OK"), onCancel && React$1.createElement(Button, {
|
|
377
|
+
onClick: onCancel,
|
|
378
|
+
color: "primary",
|
|
379
|
+
__self: undefined,
|
|
380
|
+
__source: {
|
|
381
|
+
fileName: _jsxFileName,
|
|
382
|
+
lineNumber: 334
|
|
383
|
+
}
|
|
384
|
+
}, "Cancel")));
|
|
385
|
+
InfoDialog.propTypes = {
|
|
386
|
+
open: PropTypes.bool,
|
|
387
|
+
onCancel: PropTypes.func,
|
|
388
|
+
onOk: PropTypes.func,
|
|
389
|
+
title: PropTypes.string
|
|
390
|
+
};
|
|
343
391
|
class Main extends React$1.Component {
|
|
344
392
|
constructor(...args) {
|
|
345
393
|
super(...args);
|
|
@@ -349,10 +397,12 @@ class Main extends React$1.Component {
|
|
|
349
397
|
Main.prototype.__init4.call(this);
|
|
350
398
|
Main.prototype.__init5.call(this);
|
|
351
399
|
Main.prototype.__init6.call(this);
|
|
400
|
+
Main.prototype.__init7.call(this);
|
|
352
401
|
}
|
|
353
402
|
static __initStatic() {
|
|
354
403
|
this.propTypes = {
|
|
355
404
|
model: PropTypes.object.isRequired,
|
|
405
|
+
configuration: PropTypes.object.isRequired,
|
|
356
406
|
disableSidePanel: PropTypes.bool,
|
|
357
407
|
onModelChanged: PropTypes.func.isRequired,
|
|
358
408
|
onConfigurationChanged: PropTypes.func.isRequired,
|
|
@@ -364,16 +414,65 @@ class Main extends React$1.Component {
|
|
|
364
414
|
};
|
|
365
415
|
}
|
|
366
416
|
__init() {
|
|
367
|
-
this.
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
417
|
+
this.state = {
|
|
418
|
+
dialog: {
|
|
419
|
+
open: false
|
|
420
|
+
}
|
|
371
421
|
};
|
|
372
422
|
}
|
|
373
423
|
__init2() {
|
|
424
|
+
this.onRemoveChoice = index => {
|
|
425
|
+
const {model, configuration} = this.props;
|
|
426
|
+
const {minAnswerChoices} = configuration || ({});
|
|
427
|
+
if (minAnswerChoices && model.choices.length === minAnswerChoices) {
|
|
428
|
+
this.setState({
|
|
429
|
+
dialog: {
|
|
430
|
+
open: true,
|
|
431
|
+
message: `There can't be less than ${minAnswerChoices} choices.`,
|
|
432
|
+
onOk: () => {
|
|
433
|
+
this.setState({
|
|
434
|
+
dialog: {
|
|
435
|
+
open: false
|
|
436
|
+
}
|
|
437
|
+
});
|
|
438
|
+
},
|
|
439
|
+
onCancel: () => this.setState({
|
|
440
|
+
dialog: {
|
|
441
|
+
open: false
|
|
442
|
+
}
|
|
443
|
+
})
|
|
444
|
+
}
|
|
445
|
+
});
|
|
446
|
+
} else {
|
|
447
|
+
model.choices.splice(index, 1);
|
|
448
|
+
this.props.onModelChanged(model);
|
|
449
|
+
}
|
|
450
|
+
};
|
|
451
|
+
}
|
|
452
|
+
__init3() {
|
|
374
453
|
this.onAddChoice = () => {
|
|
375
|
-
const {model} = this.props;
|
|
376
|
-
|
|
454
|
+
const {model, configuration} = this.props;
|
|
455
|
+
const {maxAnswerChoices} = configuration || ({});
|
|
456
|
+
if (maxAnswerChoices && model.choices.length === maxAnswerChoices) {
|
|
457
|
+
this.setState({
|
|
458
|
+
dialog: {
|
|
459
|
+
open: true,
|
|
460
|
+
message: `There can't be more than ${maxAnswerChoices} choices.`,
|
|
461
|
+
onOk: () => {
|
|
462
|
+
this.setState({
|
|
463
|
+
dialog: {
|
|
464
|
+
open: false
|
|
465
|
+
}
|
|
466
|
+
});
|
|
467
|
+
},
|
|
468
|
+
onCancel: () => this.setState({
|
|
469
|
+
dialog: {
|
|
470
|
+
open: false
|
|
471
|
+
}
|
|
472
|
+
})
|
|
473
|
+
}
|
|
474
|
+
});
|
|
475
|
+
} else {
|
|
377
476
|
model.choices.push({
|
|
378
477
|
label: '',
|
|
379
478
|
value: utils$1.firstAvailableIndex(model.choices.map(c => c.value), 0),
|
|
@@ -385,7 +484,7 @@ class Main extends React$1.Component {
|
|
|
385
484
|
}
|
|
386
485
|
};
|
|
387
486
|
}
|
|
388
|
-
|
|
487
|
+
__init4() {
|
|
389
488
|
this.onChoiceChanged = (index, choice) => {
|
|
390
489
|
const {model} = this.props;
|
|
391
490
|
if (choice.correct && model.choiceMode === 'radio') {
|
|
@@ -399,7 +498,7 @@ class Main extends React$1.Component {
|
|
|
399
498
|
this.props.onModelChanged(model);
|
|
400
499
|
};
|
|
401
500
|
}
|
|
402
|
-
|
|
501
|
+
__init5() {
|
|
403
502
|
this.onPromptChanged = prompt => {
|
|
404
503
|
this.props.onModelChanged({
|
|
405
504
|
...this.props.model,
|
|
@@ -407,7 +506,7 @@ class Main extends React$1.Component {
|
|
|
407
506
|
});
|
|
408
507
|
};
|
|
409
508
|
}
|
|
410
|
-
|
|
509
|
+
__init6() {
|
|
411
510
|
this.onTeacherInstructionsChanged = teacherInstructions => {
|
|
412
511
|
this.props.onModelChanged({
|
|
413
512
|
...this.props.model,
|
|
@@ -415,7 +514,7 @@ class Main extends React$1.Component {
|
|
|
415
514
|
});
|
|
416
515
|
};
|
|
417
516
|
}
|
|
418
|
-
|
|
517
|
+
__init7() {
|
|
419
518
|
this.onModelChanged = (model, key) => {
|
|
420
519
|
const {onModelChanged} = this.props;
|
|
421
520
|
switch (key) {
|
|
@@ -445,7 +544,18 @@ class Main extends React$1.Component {
|
|
|
445
544
|
};
|
|
446
545
|
}
|
|
447
546
|
render() {
|
|
448
|
-
|
|
547
|
+
const {dialog} = this.state;
|
|
548
|
+
return React$1.createElement(React$1.Fragment, null, React$1.createElement(InfoDialog, {
|
|
549
|
+
open: dialog.open,
|
|
550
|
+
title: dialog.message,
|
|
551
|
+
onCancel: dialog.onCancel,
|
|
552
|
+
onOk: dialog.onOk,
|
|
553
|
+
__self: this,
|
|
554
|
+
__source: {
|
|
555
|
+
fileName: _jsxFileName,
|
|
556
|
+
lineNumber: 505
|
|
557
|
+
}
|
|
558
|
+
}), React$1.createElement(Design, {
|
|
449
559
|
...this.props,
|
|
450
560
|
onChangeModel: this.onModelChanged,
|
|
451
561
|
onRemoveChoice: this.onRemoveChoice,
|
|
@@ -456,9 +566,9 @@ class Main extends React$1.Component {
|
|
|
456
566
|
__self: this,
|
|
457
567
|
__source: {
|
|
458
568
|
fileName: _jsxFileName,
|
|
459
|
-
lineNumber:
|
|
569
|
+
lineNumber: 511
|
|
460
570
|
}
|
|
461
|
-
});
|
|
571
|
+
}));
|
|
462
572
|
}
|
|
463
573
|
}
|
|
464
574
|
Main.__initStatic();
|
|
@@ -475,7 +585,6 @@ var sensibleDefaults = {
|
|
|
475
585
|
feedbackEnabled: true,
|
|
476
586
|
promptEnabled: true,
|
|
477
587
|
rationaleEnabled: true,
|
|
478
|
-
limitChoicesNumber: true,
|
|
479
588
|
teacherInstructionsEnabled: true,
|
|
480
589
|
studentInstructionsEnabled: true,
|
|
481
590
|
toolbarEditorPosition: 'bottom',
|
|
@@ -495,10 +604,6 @@ var sensibleDefaults = {
|
|
|
495
604
|
settings: true,
|
|
496
605
|
label: 'Add a Choice'
|
|
497
606
|
},
|
|
498
|
-
limitChoicesNumber: {
|
|
499
|
-
settings: true,
|
|
500
|
-
label: 'Limit choices to 9'
|
|
501
|
-
},
|
|
502
607
|
choiceMode: {
|
|
503
608
|
settings: true,
|
|
504
609
|
label: 'Response Type'
|
|
@@ -549,7 +654,9 @@ var sensibleDefaults = {
|
|
|
549
654
|
toolbarEditorPosition: {
|
|
550
655
|
settings: false,
|
|
551
656
|
label: 'Toolbar Editor Position'
|
|
552
|
-
}
|
|
657
|
+
},
|
|
658
|
+
minAnswerChoices: 2,
|
|
659
|
+
maxAnswerChoices: 5
|
|
553
660
|
}
|
|
554
661
|
};
|
|
555
662
|
const React = _dll_react;
|