@pie-element/ebsr 7.0.25 → 8.1.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 +37 -0
- package/configure/CHANGELOG.md +37 -0
- package/configure/lib/defaults.js +12 -0
- package/configure/lib/defaults.js.map +1 -1
- package/configure/package.json +3 -3
- package/configure/src/defaults.js +12 -0
- package/docs/config-schema.json +212 -0
- package/docs/config-schema.json.md +165 -1
- package/docs/pie-schema.json +88 -0
- package/docs/pie-schema.json.md +68 -0
- package/package.json +3 -3
- package/module/configure.js +0 -477
- package/module/controller.js +0 -20811
- package/module/demo.js +0 -77
- package/module/element.js +0 -2164
- package/module/index.html +0 -21
- package/module/manifest.json +0 -14
- package/module/print-demo.js +0 -115
- package/module/print.html +0 -18
- package/module/print.js +0 -2188
package/docs/pie-schema.json
CHANGED
|
@@ -494,6 +494,68 @@
|
|
|
494
494
|
"title": "label"
|
|
495
495
|
}
|
|
496
496
|
}
|
|
497
|
+
},
|
|
498
|
+
"minAnswerChoices": {
|
|
499
|
+
"description": "Minimum number of answer choices",
|
|
500
|
+
"type": "number",
|
|
501
|
+
"title": "minAnswerChoices"
|
|
502
|
+
},
|
|
503
|
+
"maxAnswerChoices": {
|
|
504
|
+
"description": "Maximum number of answer choices",
|
|
505
|
+
"type": "number",
|
|
506
|
+
"title": "maxAnswerChoices"
|
|
507
|
+
},
|
|
508
|
+
"maxImageWidth": {
|
|
509
|
+
"title": "ConfigureMaxImageDimensionsProp",
|
|
510
|
+
"type": "object",
|
|
511
|
+
"properties": {
|
|
512
|
+
"teacherInstructions": {
|
|
513
|
+
"description": "Indicates the max dimension for images in teacher instructions",
|
|
514
|
+
"type": "number",
|
|
515
|
+
"title": "teacherInstructions"
|
|
516
|
+
},
|
|
517
|
+
"prompt": {
|
|
518
|
+
"description": "Indicates the max dimension for images in prompt - this is also the default dimension for all other input fields if it's not specified",
|
|
519
|
+
"type": "number",
|
|
520
|
+
"title": "prompt"
|
|
521
|
+
},
|
|
522
|
+
"rationale": {
|
|
523
|
+
"description": "Indicates the max dimension for images in rationale",
|
|
524
|
+
"type": "number",
|
|
525
|
+
"title": "rationale"
|
|
526
|
+
},
|
|
527
|
+
"choices": {
|
|
528
|
+
"description": "Indicates the max dimension for images in choices",
|
|
529
|
+
"type": "number",
|
|
530
|
+
"title": "choices"
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
},
|
|
534
|
+
"maxImageHeight": {
|
|
535
|
+
"title": "ConfigureMaxImageDimensionsProp",
|
|
536
|
+
"type": "object",
|
|
537
|
+
"properties": {
|
|
538
|
+
"teacherInstructions": {
|
|
539
|
+
"description": "Indicates the max dimension for images in teacher instructions",
|
|
540
|
+
"type": "number",
|
|
541
|
+
"title": "teacherInstructions"
|
|
542
|
+
},
|
|
543
|
+
"prompt": {
|
|
544
|
+
"description": "Indicates the max dimension for images in prompt - this is also the default dimension for all other input fields if it's not specified",
|
|
545
|
+
"type": "number",
|
|
546
|
+
"title": "prompt"
|
|
547
|
+
},
|
|
548
|
+
"rationale": {
|
|
549
|
+
"description": "Indicates the max dimension for images in rationale",
|
|
550
|
+
"type": "number",
|
|
551
|
+
"title": "rationale"
|
|
552
|
+
},
|
|
553
|
+
"choices": {
|
|
554
|
+
"description": "Indicates the max dimension for images in choices",
|
|
555
|
+
"type": "number",
|
|
556
|
+
"title": "choices"
|
|
557
|
+
}
|
|
558
|
+
}
|
|
497
559
|
}
|
|
498
560
|
}
|
|
499
561
|
},
|
|
@@ -513,6 +575,32 @@
|
|
|
513
575
|
}
|
|
514
576
|
}
|
|
515
577
|
},
|
|
578
|
+
"ConfigureMaxImageDimensionsProp": {
|
|
579
|
+
"title": "ConfigureMaxImageDimensionsProp",
|
|
580
|
+
"type": "object",
|
|
581
|
+
"properties": {
|
|
582
|
+
"teacherInstructions": {
|
|
583
|
+
"description": "Indicates the max dimension for images in teacher instructions",
|
|
584
|
+
"type": "number",
|
|
585
|
+
"title": "teacherInstructions"
|
|
586
|
+
},
|
|
587
|
+
"prompt": {
|
|
588
|
+
"description": "Indicates the max dimension for images in prompt - this is also the default dimension for all other input fields if it's not specified",
|
|
589
|
+
"type": "number",
|
|
590
|
+
"title": "prompt"
|
|
591
|
+
},
|
|
592
|
+
"rationale": {
|
|
593
|
+
"description": "Indicates the max dimension for images in rationale",
|
|
594
|
+
"type": "number",
|
|
595
|
+
"title": "rationale"
|
|
596
|
+
},
|
|
597
|
+
"choices": {
|
|
598
|
+
"description": "Indicates the max dimension for images in choices",
|
|
599
|
+
"type": "number",
|
|
600
|
+
"title": "choices"
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
},
|
|
516
604
|
"Part": {
|
|
517
605
|
"title": "Part",
|
|
518
606
|
"type": "object",
|
package/docs/pie-schema.json.md
CHANGED
|
@@ -370,6 +370,54 @@ Indicates if the item has to be displayed in the Settings Panel
|
|
|
370
370
|
|
|
371
371
|
Indicates the label for the item that has to be displayed in the Settings Panel
|
|
372
372
|
|
|
373
|
+
### `minAnswerChoices` (number)
|
|
374
|
+
|
|
375
|
+
Minimum number of answer choices
|
|
376
|
+
|
|
377
|
+
### `maxAnswerChoices` (number)
|
|
378
|
+
|
|
379
|
+
Maximum number of answer choices
|
|
380
|
+
|
|
381
|
+
### `maxImageWidth` (object)
|
|
382
|
+
|
|
383
|
+
Properties of the `maxImageWidth` object:
|
|
384
|
+
|
|
385
|
+
#### `teacherInstructions` (number)
|
|
386
|
+
|
|
387
|
+
Indicates the max dimension for images in teacher instructions
|
|
388
|
+
|
|
389
|
+
#### `prompt` (number)
|
|
390
|
+
|
|
391
|
+
Indicates the max dimension for images in prompt - this is also the default dimension for all other input fields if it's not specified
|
|
392
|
+
|
|
393
|
+
#### `rationale` (number)
|
|
394
|
+
|
|
395
|
+
Indicates the max dimension for images in rationale
|
|
396
|
+
|
|
397
|
+
#### `choices` (number)
|
|
398
|
+
|
|
399
|
+
Indicates the max dimension for images in choices
|
|
400
|
+
|
|
401
|
+
### `maxImageHeight` (object)
|
|
402
|
+
|
|
403
|
+
Properties of the `maxImageHeight` object:
|
|
404
|
+
|
|
405
|
+
#### `teacherInstructions` (number)
|
|
406
|
+
|
|
407
|
+
Indicates the max dimension for images in teacher instructions
|
|
408
|
+
|
|
409
|
+
#### `prompt` (number)
|
|
410
|
+
|
|
411
|
+
Indicates the max dimension for images in prompt - this is also the default dimension for all other input fields if it's not specified
|
|
412
|
+
|
|
413
|
+
#### `rationale` (number)
|
|
414
|
+
|
|
415
|
+
Indicates the max dimension for images in rationale
|
|
416
|
+
|
|
417
|
+
#### `choices` (number)
|
|
418
|
+
|
|
419
|
+
Indicates the max dimension for images in choices
|
|
420
|
+
|
|
373
421
|
## `ConfigureProp` (object)
|
|
374
422
|
|
|
375
423
|
Properties of the `ConfigureProp` object:
|
|
@@ -382,6 +430,26 @@ Indicates if the item has to be displayed in the Settings Panel
|
|
|
382
430
|
|
|
383
431
|
Indicates the label for the item that has to be displayed in the Settings Panel
|
|
384
432
|
|
|
433
|
+
## `ConfigureMaxImageDimensionsProp` (object)
|
|
434
|
+
|
|
435
|
+
Properties of the `ConfigureMaxImageDimensionsProp` object:
|
|
436
|
+
|
|
437
|
+
### `teacherInstructions` (number)
|
|
438
|
+
|
|
439
|
+
Indicates the max dimension for images in teacher instructions
|
|
440
|
+
|
|
441
|
+
### `prompt` (number)
|
|
442
|
+
|
|
443
|
+
Indicates the max dimension for images in prompt - this is also the default dimension for all other input fields if it's not specified
|
|
444
|
+
|
|
445
|
+
### `rationale` (number)
|
|
446
|
+
|
|
447
|
+
Indicates the max dimension for images in rationale
|
|
448
|
+
|
|
449
|
+
### `choices` (number)
|
|
450
|
+
|
|
451
|
+
Indicates the max dimension for images in choices
|
|
452
|
+
|
|
385
453
|
## `Part` (object)
|
|
386
454
|
|
|
387
455
|
Properties of the `Part` object:
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pie-element/ebsr",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "8.1.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"repository": "pie-framework/pie-elements",
|
|
6
6
|
"publishConfig": {
|
|
7
7
|
"access": "public"
|
|
8
8
|
},
|
|
9
9
|
"dependencies": {
|
|
10
|
-
"@pie-element/multiple-choice": "^
|
|
10
|
+
"@pie-element/multiple-choice": "^7.1.0",
|
|
11
11
|
"@pie-framework/pie-player-events": "^0.1.0",
|
|
12
12
|
"classnames": "^2.2.5",
|
|
13
13
|
"debug": "^4.1.1",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
},
|
|
16
16
|
"author": "pie framework developers",
|
|
17
17
|
"license": "ISC",
|
|
18
|
-
"gitHead": "
|
|
18
|
+
"gitHead": "9b55e36b358084c7a96a08bad969f4856d6802da",
|
|
19
19
|
"scripts": {
|
|
20
20
|
"postpublish": "../../scripts/postpublish"
|
|
21
21
|
},
|
package/module/configure.js
DELETED
|
@@ -1,477 +0,0 @@
|
|
|
1
|
-
import {_dll_react, _dll_prop_types, _dll_material_ui__core_styles, _dll_lodash, _dll_react_dom} from "../../../@pie-lib/shared-module@^1.4.19/module/index.js";
|
|
2
|
-
import MultipleChoiceConfigure from '@pie-element/multiple-choice/configure/lib';
|
|
3
|
-
import {_dll_pie_lib__config_ui} from "../../../@pie-lib/config-module@^1.3.1/module/index.js";
|
|
4
|
-
var lib = {};
|
|
5
|
-
Object.defineProperty(lib, "__esModule", {
|
|
6
|
-
value: true
|
|
7
|
-
});
|
|
8
|
-
class ModelUpdatedEvent extends CustomEvent {
|
|
9
|
-
constructor(update, reset = false) {
|
|
10
|
-
super(ModelUpdatedEvent.TYPE, {
|
|
11
|
-
bubbles: true,
|
|
12
|
-
detail: {
|
|
13
|
-
update,
|
|
14
|
-
reset
|
|
15
|
-
}
|
|
16
|
-
});
|
|
17
|
-
this.update = update;
|
|
18
|
-
this.reset = reset;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
ModelUpdatedEvent.TYPE = 'model.updated';
|
|
22
|
-
var ModelUpdatedEvent_1 = lib.ModelUpdatedEvent = ModelUpdatedEvent;
|
|
23
|
-
class DeleteImageEvent extends CustomEvent {
|
|
24
|
-
constructor(src, done) {
|
|
25
|
-
super(DeleteImageEvent.TYPE, {
|
|
26
|
-
bubbles: true,
|
|
27
|
-
detail: {
|
|
28
|
-
src,
|
|
29
|
-
done
|
|
30
|
-
}
|
|
31
|
-
});
|
|
32
|
-
this.src = src;
|
|
33
|
-
this.done = done;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
DeleteImageEvent.TYPE = 'delete.image';
|
|
37
|
-
lib.DeleteImageEvent = DeleteImageEvent;
|
|
38
|
-
class InsertImageEvent extends CustomEvent {
|
|
39
|
-
constructor(handler) {
|
|
40
|
-
super(InsertImageEvent.TYPE, {
|
|
41
|
-
bubbles: true,
|
|
42
|
-
detail: handler
|
|
43
|
-
});
|
|
44
|
-
this.handler = handler;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
InsertImageEvent.TYPE = 'insert.image';
|
|
48
|
-
lib.InsertImageEvent = InsertImageEvent;
|
|
49
|
-
const React$1 = _dll_react;
|
|
50
|
-
const PropTypes = _dll_prop_types;
|
|
51
|
-
const {withStyles: withStyles} = _dll_material_ui__core_styles;
|
|
52
|
-
const {settings: settings} = _dll_pie_lib__config_ui;
|
|
53
|
-
const {layout: layout} = _dll_pie_lib__config_ui;
|
|
54
|
-
const _jsxFileName = "/home/circleci/repo/packages/ebsr/configure/src/main.jsx";
|
|
55
|
-
const {Panel, toggle, radio, dropdown} = settings;
|
|
56
|
-
const styles = theme => ({
|
|
57
|
-
design: {
|
|
58
|
-
paddingTop: theme.spacing.unit * 3
|
|
59
|
-
},
|
|
60
|
-
part: {
|
|
61
|
-
display: 'flex',
|
|
62
|
-
flexDirection: 'column',
|
|
63
|
-
padding: '16px 0 32px'
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
class Main extends React$1.Component {
|
|
67
|
-
constructor(...args) {
|
|
68
|
-
super(...args);
|
|
69
|
-
Main.prototype.__init.call(this);
|
|
70
|
-
Main.prototype.__init2.call(this);
|
|
71
|
-
}
|
|
72
|
-
static __initStatic() {
|
|
73
|
-
this.propTypes = {
|
|
74
|
-
classes: PropTypes.object,
|
|
75
|
-
configuration: PropTypes.object,
|
|
76
|
-
model: PropTypes.object,
|
|
77
|
-
onModelChanged: PropTypes.func,
|
|
78
|
-
onConfigurationChanged: PropTypes.func
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
__init() {
|
|
82
|
-
this.removeExtraChoices = choices => {
|
|
83
|
-
let correctFound = false;
|
|
84
|
-
return (choices || []).map(choice => {
|
|
85
|
-
if (correctFound) {
|
|
86
|
-
choice.correct = false;
|
|
87
|
-
return choice;
|
|
88
|
-
}
|
|
89
|
-
if (choice.correct) {
|
|
90
|
-
correctFound = true;
|
|
91
|
-
}
|
|
92
|
-
return choice;
|
|
93
|
-
});
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
__init2() {
|
|
97
|
-
this.onModelChanged = (model, key) => {
|
|
98
|
-
const {onModelChanged} = this.props;
|
|
99
|
-
if (key === 'partA.choiceMode' && model.partA.choiceMode === 'radio') {
|
|
100
|
-
model.partA.choices = this.removeExtraChoices(model.partA.choices);
|
|
101
|
-
return onModelChanged(model, true);
|
|
102
|
-
}
|
|
103
|
-
if (key === 'partB.choiceMode' && model.partB.choiceMode === 'radio') {
|
|
104
|
-
model.partB.choices = this.removeExtraChoices(model.partB.choices);
|
|
105
|
-
return onModelChanged(model, true);
|
|
106
|
-
}
|
|
107
|
-
return onModelChanged(model);
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
render() {
|
|
111
|
-
const {classes, model, configuration, onConfigurationChanged} = this.props;
|
|
112
|
-
const {partLabelType, partA: modelPartA, partB: modelPartB} = model;
|
|
113
|
-
const {partA, partB, partialScoring, scoringType, ...generalConfiguration} = configuration;
|
|
114
|
-
const {feedback: feedbackA = {}, choiceMode: choiceModeA = {}, choicePrefix: choicePrefixA = {}, lockChoiceOrder: lockChoiceOrderA = {}, prompt: promptA = {}, teacherInstructions: teacherInstructionsA = {}, studentInstructions: studentInstructionsA = {}, choicesLayout: choicesLayoutA = {}, gridColumns: gridColumnsA = {}, rationale: rationaleA = {}, spellCheck: spellCheckA = {}} = partA || ({});
|
|
115
|
-
const {feedback: feedbackB = {}, choiceMode: choiceModeB = {}, choicePrefix: choicePrefixB = {}, lockChoiceOrder: lockChoiceOrderB = {}, prompt: promptB = {}, teacherInstructions: teacherInstructionsB = {}, studentInstructions: studentInstructionsB = {}, choicesLayout: choicesLayoutB = {}, gridColumns: gridColumnsB = {}, rationale: rationaleB = {}, spellCheck: spellCheckB = {}} = partB || ({});
|
|
116
|
-
const type = partLabelType || 'Numbers';
|
|
117
|
-
const typeIsNumber = type === 'Numbers';
|
|
118
|
-
const firstPart = `Part ${typeIsNumber ? '1' : 'A'}`;
|
|
119
|
-
const secondPart = `Part ${typeIsNumber ? '2' : 'B'}`;
|
|
120
|
-
const nrOfColumnsAvailable = {
|
|
121
|
-
partA: modelPartA.choices && modelPartA.choices.length ? Array.from({
|
|
122
|
-
length: modelPartA.choices.length
|
|
123
|
-
}, (_, i) => `${i + 1}`) : [],
|
|
124
|
-
partB: modelPartB.choices && modelPartB.choices.length ? Array.from({
|
|
125
|
-
length: modelPartB.choices.length
|
|
126
|
-
}, (_, i) => `${i + 1}`) : []
|
|
127
|
-
};
|
|
128
|
-
return React$1.createElement('div', {
|
|
129
|
-
className: classes.design,
|
|
130
|
-
__self: this,
|
|
131
|
-
__source: {
|
|
132
|
-
fileName: _jsxFileName,
|
|
133
|
-
lineNumber: 110
|
|
134
|
-
}
|
|
135
|
-
}, React$1.createElement(layout.ConfigLayout, {
|
|
136
|
-
settings: React$1.createElement(Panel, {
|
|
137
|
-
model: model,
|
|
138
|
-
onChangeModel: this.onModelChanged,
|
|
139
|
-
configuration: configuration,
|
|
140
|
-
onChangeConfiguration: onConfigurationChanged,
|
|
141
|
-
groups: {
|
|
142
|
-
'Settings for both': {
|
|
143
|
-
partLabels: generalConfiguration.partLabels.settings && toggle(generalConfiguration.partLabels.label),
|
|
144
|
-
partLabelType: model.partLabels && dropdown('', ['Numbers', 'Letters']),
|
|
145
|
-
partialScoring: partialScoring.settings && toggle(partialScoring.label),
|
|
146
|
-
scoringType: scoringType.settings && radio(scoringType.label, ['auto', 'rubric'])
|
|
147
|
-
},
|
|
148
|
-
[`Settings ${firstPart}`]: {
|
|
149
|
-
'partA.choiceMode': choiceModeA.settings && radio(choiceModeA.label, ['checkbox', 'radio']),
|
|
150
|
-
'partA.choicePrefix': choicePrefixA.settings && radio(choicePrefixA.label, ['numbers', 'letters']),
|
|
151
|
-
'partA.lockChoiceOrder': lockChoiceOrderA.settings && toggle(lockChoiceOrderA.label),
|
|
152
|
-
'partA.choicesLayout': choicesLayoutA.settings && dropdown(choicesLayoutA.label, ['vertical', 'grid', 'horizontal']),
|
|
153
|
-
'partA.gridColumns': choicesLayoutA.settings && modelPartA.choicesLayout === 'grid' && nrOfColumnsAvailable.partA.length > 0 && dropdown(gridColumnsA.label, nrOfColumnsAvailable.partA)
|
|
154
|
-
},
|
|
155
|
-
[`Properties ${firstPart}`]: {
|
|
156
|
-
'partA.feedbackEnabled': feedbackA.settings && toggle(feedbackA.label),
|
|
157
|
-
'partA.promptEnabled': promptA.settings && toggle(promptA.label),
|
|
158
|
-
'partA.teacherInstructionsEnabled': teacherInstructionsA.settings && toggle(teacherInstructionsA.label),
|
|
159
|
-
'partA.studentInstructionsEnabled': studentInstructionsA.settings && toggle(studentInstructionsA.label),
|
|
160
|
-
'partA.rationaleEnabled': rationaleA.settings && toggle(rationaleA.label),
|
|
161
|
-
'partA.spellCheckEnabled': spellCheckA.settings && toggle(spellCheckA.label)
|
|
162
|
-
},
|
|
163
|
-
[`Settings ${secondPart}`]: {
|
|
164
|
-
'partB.choiceMode': choiceModeB.settings && radio(choiceModeB.label, ['checkbox', 'radio']),
|
|
165
|
-
'partB.choicePrefix': choicePrefixB.settings && radio(choicePrefixB.label, ['numbers', 'letters']),
|
|
166
|
-
'partB.lockChoiceOrder': lockChoiceOrderB.settings && toggle(lockChoiceOrderB.label),
|
|
167
|
-
'partB.choicesLayout': choicesLayoutB.settings && dropdown(choicesLayoutB.label, ['vertical', 'grid', 'horizontal']),
|
|
168
|
-
'partB.gridColumns': choicesLayoutB.settings && modelPartB.choicesLayout === 'grid' && nrOfColumnsAvailable.partB.length > 0 && dropdown(gridColumnsB.label, nrOfColumnsAvailable.partB)
|
|
169
|
-
},
|
|
170
|
-
[`Properties ${secondPart}`]: {
|
|
171
|
-
'partB.feedbackEnabled': feedbackB.settings && toggle(feedbackB.label),
|
|
172
|
-
'partB.promptEnabled': promptB.settings && toggle(promptB.label),
|
|
173
|
-
'partB.teacherInstructionsEnabled': teacherInstructionsB.settings && toggle(teacherInstructionsB.label),
|
|
174
|
-
'partB.studentInstructionsEnabled': studentInstructionsB.settings && toggle(studentInstructionsB.label),
|
|
175
|
-
'partB.rationaleEnabled': rationaleB.settings && toggle(rationaleB.label),
|
|
176
|
-
'partB.spellCheckEnabled': spellCheckB.settings && toggle(spellCheckB.label)
|
|
177
|
-
}
|
|
178
|
-
},
|
|
179
|
-
__self: this,
|
|
180
|
-
__source: {
|
|
181
|
-
fileName: _jsxFileName,
|
|
182
|
-
lineNumber: 113
|
|
183
|
-
}
|
|
184
|
-
}),
|
|
185
|
-
__self: this,
|
|
186
|
-
__source: {
|
|
187
|
-
fileName: _jsxFileName,
|
|
188
|
-
lineNumber: 111
|
|
189
|
-
}
|
|
190
|
-
}, React$1.createElement('div', {
|
|
191
|
-
__self: this,
|
|
192
|
-
__source: {
|
|
193
|
-
fileName: _jsxFileName,
|
|
194
|
-
lineNumber: 200
|
|
195
|
-
}
|
|
196
|
-
}, React$1.createElement('div', {
|
|
197
|
-
className: classes.part,
|
|
198
|
-
__self: this,
|
|
199
|
-
__source: {
|
|
200
|
-
fileName: _jsxFileName,
|
|
201
|
-
lineNumber: 201
|
|
202
|
-
}
|
|
203
|
-
}, model.partLabels && React$1.createElement('p', {
|
|
204
|
-
__self: this,
|
|
205
|
-
__source: {
|
|
206
|
-
fileName: _jsxFileName,
|
|
207
|
-
lineNumber: 202
|
|
208
|
-
}
|
|
209
|
-
}, firstPart), React$1.createElement('ebsr-multiple-choice-configure', {
|
|
210
|
-
id: "A",
|
|
211
|
-
key: "partA",
|
|
212
|
-
ref: ref => {
|
|
213
|
-
if (ref) {
|
|
214
|
-
this.partA = ref;
|
|
215
|
-
this.partA._model = {
|
|
216
|
-
...this.props.model.partA,
|
|
217
|
-
errors: this.props.model.errors && this.props.model.errors.partA || ({})
|
|
218
|
-
};
|
|
219
|
-
this.partA.configuration = {
|
|
220
|
-
...partA,
|
|
221
|
-
...generalConfiguration
|
|
222
|
-
};
|
|
223
|
-
}
|
|
224
|
-
},
|
|
225
|
-
__self: this,
|
|
226
|
-
__source: {
|
|
227
|
-
fileName: _jsxFileName,
|
|
228
|
-
lineNumber: 203
|
|
229
|
-
}
|
|
230
|
-
})), React$1.createElement('div', {
|
|
231
|
-
className: classes.part,
|
|
232
|
-
__self: this,
|
|
233
|
-
__source: {
|
|
234
|
-
fileName: _jsxFileName,
|
|
235
|
-
lineNumber: 223
|
|
236
|
-
}
|
|
237
|
-
}, model.partLabels && React$1.createElement('p', {
|
|
238
|
-
__self: this,
|
|
239
|
-
__source: {
|
|
240
|
-
fileName: _jsxFileName,
|
|
241
|
-
lineNumber: 224
|
|
242
|
-
}
|
|
243
|
-
}, secondPart), React$1.createElement('ebsr-multiple-choice-configure', {
|
|
244
|
-
id: "B",
|
|
245
|
-
key: "partB",
|
|
246
|
-
ref: ref => {
|
|
247
|
-
if (ref) {
|
|
248
|
-
this.partB = ref;
|
|
249
|
-
this.partB._model = {
|
|
250
|
-
...this.props.model.partB,
|
|
251
|
-
errors: this.props.model.errors && this.props.model.errors.partB || ({})
|
|
252
|
-
};
|
|
253
|
-
this.partB.configuration = {
|
|
254
|
-
...partB,
|
|
255
|
-
...generalConfiguration
|
|
256
|
-
};
|
|
257
|
-
}
|
|
258
|
-
},
|
|
259
|
-
__self: this,
|
|
260
|
-
__source: {
|
|
261
|
-
fileName: _jsxFileName,
|
|
262
|
-
lineNumber: 225
|
|
263
|
-
}
|
|
264
|
-
})))));
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
Main.__initStatic();
|
|
268
|
-
const Styled = withStyles(styles)(Main);
|
|
269
|
-
const {cloneDeep: cloneDeep} = _dll_lodash;
|
|
270
|
-
const defaultConfig = {
|
|
271
|
-
addChoiceButton: {
|
|
272
|
-
settings: true,
|
|
273
|
-
label: 'Add a Choice'
|
|
274
|
-
},
|
|
275
|
-
choiceMode: {
|
|
276
|
-
settings: true,
|
|
277
|
-
label: 'Response Type'
|
|
278
|
-
},
|
|
279
|
-
choicePrefix: {
|
|
280
|
-
settings: true,
|
|
281
|
-
label: 'Choice Labels'
|
|
282
|
-
},
|
|
283
|
-
deleteChoice: {
|
|
284
|
-
settings: true
|
|
285
|
-
},
|
|
286
|
-
feedback: {
|
|
287
|
-
settings: true,
|
|
288
|
-
label: 'Feedback'
|
|
289
|
-
},
|
|
290
|
-
lockChoiceOrder: {
|
|
291
|
-
settings: true,
|
|
292
|
-
label: 'Lock Choice Order'
|
|
293
|
-
},
|
|
294
|
-
prompt: {
|
|
295
|
-
settings: true,
|
|
296
|
-
label: 'Prompt'
|
|
297
|
-
},
|
|
298
|
-
rationale: {
|
|
299
|
-
settings: true,
|
|
300
|
-
label: 'Rationale'
|
|
301
|
-
},
|
|
302
|
-
studentInstructions: {
|
|
303
|
-
settings: false,
|
|
304
|
-
label: 'Student Instructions'
|
|
305
|
-
},
|
|
306
|
-
teacherInstructions: {
|
|
307
|
-
settings: true,
|
|
308
|
-
label: 'Teacher Instructions'
|
|
309
|
-
},
|
|
310
|
-
choicesLayout: {
|
|
311
|
-
settings: false,
|
|
312
|
-
label: 'Choices Layout'
|
|
313
|
-
},
|
|
314
|
-
gridColumns: {
|
|
315
|
-
label: 'Grid columns'
|
|
316
|
-
},
|
|
317
|
-
spellCheck: {
|
|
318
|
-
label: 'Spellcheck',
|
|
319
|
-
settings: false,
|
|
320
|
-
enabled: true
|
|
321
|
-
}
|
|
322
|
-
};
|
|
323
|
-
const partModel = base => ({
|
|
324
|
-
choiceMode: 'radio',
|
|
325
|
-
choices: [],
|
|
326
|
-
choicePrefix: 'numbers',
|
|
327
|
-
prompt: 'Prompt',
|
|
328
|
-
rationaleEnabled: true,
|
|
329
|
-
feedbackEnabled: true,
|
|
330
|
-
promptEnabled: true,
|
|
331
|
-
teacherInstructions: '',
|
|
332
|
-
rationale: '',
|
|
333
|
-
teacherInstructionsEnabled: true,
|
|
334
|
-
studentInstructionsEnabled: true,
|
|
335
|
-
spellCheckEnabled: true,
|
|
336
|
-
choicesLayout: 'vertical',
|
|
337
|
-
gridColumns: '2',
|
|
338
|
-
...base
|
|
339
|
-
});
|
|
340
|
-
var sensibleDefaults = {
|
|
341
|
-
model: {
|
|
342
|
-
partLabels: true,
|
|
343
|
-
partLabelType: 'Letters',
|
|
344
|
-
partialScoring: false,
|
|
345
|
-
partA: partModel({
|
|
346
|
-
prompt: 'Prompt A'
|
|
347
|
-
}),
|
|
348
|
-
partB: partModel({
|
|
349
|
-
prompt: 'Prompt B'
|
|
350
|
-
})
|
|
351
|
-
},
|
|
352
|
-
configuration: {
|
|
353
|
-
partialScoring: {
|
|
354
|
-
label: 'Allow Partial Scoring',
|
|
355
|
-
settings: false
|
|
356
|
-
},
|
|
357
|
-
scoringType: {
|
|
358
|
-
settings: false,
|
|
359
|
-
label: 'Scoring Type'
|
|
360
|
-
},
|
|
361
|
-
partA: cloneDeep(defaultConfig),
|
|
362
|
-
partB: cloneDeep(defaultConfig),
|
|
363
|
-
partLabels: {
|
|
364
|
-
settings: true,
|
|
365
|
-
label: 'Part Labels'
|
|
366
|
-
},
|
|
367
|
-
settingsPanelDisabled: true
|
|
368
|
-
}
|
|
369
|
-
};
|
|
370
|
-
const React = _dll_react;
|
|
371
|
-
const ReactDOM = _dll_react_dom;
|
|
372
|
-
const {defaults: defaults} = _dll_lodash;
|
|
373
|
-
const MODEL_UPDATED = ModelUpdatedEvent_1.TYPE;
|
|
374
|
-
const MC_TAG_NAME = 'ebsr-multiple-choice-configure';
|
|
375
|
-
class EbsrMCConfigure extends MultipleChoiceConfigure {}
|
|
376
|
-
const defineMultipleChoice = () => {
|
|
377
|
-
if (!customElements.get(MC_TAG_NAME)) {
|
|
378
|
-
customElements.define(MC_TAG_NAME, EbsrMCConfigure);
|
|
379
|
-
}
|
|
380
|
-
};
|
|
381
|
-
defineMultipleChoice();
|
|
382
|
-
const prepareCustomizationObject = (config, model) => {
|
|
383
|
-
const configuration = defaults(config, sensibleDefaults.configuration);
|
|
384
|
-
configuration.settingsPanelDisabled = true;
|
|
385
|
-
return {
|
|
386
|
-
configuration,
|
|
387
|
-
model
|
|
388
|
-
};
|
|
389
|
-
};
|
|
390
|
-
const {model: modelDefault} = sensibleDefaults || ({});
|
|
391
|
-
class EbsrConfigure extends HTMLElement {
|
|
392
|
-
static __initStatic() {
|
|
393
|
-
this.createDefaultModel = ({partA = {}, partB = {}, ...model} = {}, defaults = modelDefault) => ({
|
|
394
|
-
...defaults,
|
|
395
|
-
...model,
|
|
396
|
-
partA: {
|
|
397
|
-
...defaults.partA,
|
|
398
|
-
...partA,
|
|
399
|
-
choicesLayout: partA.choicesLayout || partA.verticalMode === false && 'horizontal' || defaults.partA.choicesLayout
|
|
400
|
-
},
|
|
401
|
-
partB: {
|
|
402
|
-
...defaults.partB,
|
|
403
|
-
...partB,
|
|
404
|
-
choicesLayout: partB.choicesLayout || partB.verticalMode === false && 'horizontal' || defaults.partB.choicesLayout
|
|
405
|
-
}
|
|
406
|
-
});
|
|
407
|
-
}
|
|
408
|
-
constructor() {
|
|
409
|
-
super();
|
|
410
|
-
EbsrConfigure.prototype.__init.call(this);
|
|
411
|
-
EbsrConfigure.prototype.__init2.call(this);
|
|
412
|
-
this._model = EbsrConfigure.createDefaultModel();
|
|
413
|
-
this._configuration = sensibleDefaults.configuration;
|
|
414
|
-
this.onConfigurationChanged = this.onConfigurationChanged.bind(this);
|
|
415
|
-
}
|
|
416
|
-
set model(m) {
|
|
417
|
-
this._model = EbsrConfigure.createDefaultModel(m, this._model);
|
|
418
|
-
this._render();
|
|
419
|
-
}
|
|
420
|
-
dispatchModelUpdated(reset) {
|
|
421
|
-
const resetValue = !!reset;
|
|
422
|
-
this.dispatchEvent(new ModelUpdatedEvent_1(this._model, resetValue));
|
|
423
|
-
}
|
|
424
|
-
__init() {
|
|
425
|
-
this.onModelChanged = (m, reset) => {
|
|
426
|
-
this._model = EbsrConfigure.createDefaultModel(m, this._model);
|
|
427
|
-
this.dispatchModelUpdated(reset);
|
|
428
|
-
this._render();
|
|
429
|
-
};
|
|
430
|
-
}
|
|
431
|
-
set configuration(c) {
|
|
432
|
-
const info = prepareCustomizationObject(c, this._model);
|
|
433
|
-
this._configuration = info.configuration;
|
|
434
|
-
this._render();
|
|
435
|
-
}
|
|
436
|
-
onConfigurationChanged(c) {
|
|
437
|
-
this._configuration = prepareCustomizationObject(c, this._model).configuration;
|
|
438
|
-
if (this._model) {
|
|
439
|
-
this.onModelChanged(this._model);
|
|
440
|
-
}
|
|
441
|
-
this._render();
|
|
442
|
-
}
|
|
443
|
-
__init2() {
|
|
444
|
-
this.onModelUpdated = e => {
|
|
445
|
-
if (e.target === this) {
|
|
446
|
-
return;
|
|
447
|
-
}
|
|
448
|
-
e.preventDefault();
|
|
449
|
-
e.stopImmediatePropagation();
|
|
450
|
-
const id = e.target && e.target.getAttribute('id');
|
|
451
|
-
if (id) {
|
|
452
|
-
if (e.update) {
|
|
453
|
-
this._model[`part${id}`] = e.update;
|
|
454
|
-
}
|
|
455
|
-
this.dispatchEvent(new ModelUpdatedEvent_1(this._model));
|
|
456
|
-
}
|
|
457
|
-
};
|
|
458
|
-
}
|
|
459
|
-
connectedCallback() {
|
|
460
|
-
this.addEventListener(MODEL_UPDATED, this.onModelUpdated);
|
|
461
|
-
this._render();
|
|
462
|
-
}
|
|
463
|
-
disconnectedCallback() {
|
|
464
|
-
this.removeEventListener(MODEL_UPDATED, this.onModelUpdated);
|
|
465
|
-
}
|
|
466
|
-
_render() {
|
|
467
|
-
let element = React.createElement(Styled, {
|
|
468
|
-
model: this._model,
|
|
469
|
-
configuration: this._configuration,
|
|
470
|
-
onModelChanged: this.onModelChanged,
|
|
471
|
-
onConfigurationChanged: this.onConfigurationChanged
|
|
472
|
-
});
|
|
473
|
-
ReactDOM.render(element, this);
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
EbsrConfigure.__initStatic();
|
|
477
|
-
export {EbsrConfigure as default};
|