@pie-element/multiple-choice 13.2.2-next.1 → 13.2.2
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.json +1972 -0
- package/CHANGELOG.md +2727 -0
- package/LICENSE.md +5 -0
- package/PRINT.md +35 -0
- package/README.md +56 -0
- package/choice.png +0 -0
- package/configure/CHANGELOG.json +1387 -0
- package/configure/CHANGELOG.md +2074 -0
- package/configure/lib/defaults.js +203 -0
- package/configure/lib/defaults.js.map +1 -0
- package/configure/lib/index.js +202 -0
- package/configure/lib/index.js.map +1 -0
- package/configure/lib/main.js +484 -0
- package/configure/lib/main.js.map +1 -0
- package/configure/lib/utils.js +18 -0
- package/configure/lib/utils.js.map +1 -0
- package/configure/package.json +22 -0
- package/controller/CHANGELOG.json +527 -0
- package/controller/CHANGELOG.md +1405 -0
- package/controller/lib/defaults.js +33 -0
- package/controller/lib/defaults.js.map +1 -0
- package/controller/lib/index.js +288 -0
- package/controller/lib/index.js.map +1 -0
- package/controller/lib/utils.js +15 -0
- package/controller/lib/utils.js.map +1 -0
- package/controller/package.json +15 -0
- package/docs/config-schema.json +2993 -0
- package/docs/config-schema.json.md +2217 -0
- package/docs/demo/config.js +8 -0
- package/docs/demo/generate.js +61 -0
- package/docs/demo/index.html +1 -0
- package/docs/demo/session.js +7 -0
- package/docs/pie-schema.json +1332 -0
- package/docs/pie-schema.json.md +1015 -0
- package/lib/choice-input.js +377 -0
- package/lib/choice-input.js.map +1 -0
- package/lib/choice.js +192 -0
- package/lib/choice.js.map +1 -0
- package/lib/feedback-tick.js +134 -0
- package/lib/feedback-tick.js.map +1 -0
- package/lib/index.js +402 -0
- package/lib/index.js.map +1 -0
- package/lib/main.js +63 -0
- package/lib/main.js.map +1 -0
- package/lib/multiple-choice.js +397 -0
- package/lib/multiple-choice.js.map +1 -0
- package/lib/print.js +94 -0
- package/lib/print.js.map +1 -0
- package/lib/session-updater.js +37 -0
- package/lib/session-updater.js.map +1 -0
- package/module/configure.js +1 -0
- package/module/controller.js +3045 -0
- package/module/demo.js +86 -0
- package/module/element.js +1 -0
- package/module/index.html +21 -0
- package/module/manifest.json +14 -0
- package/module/print-demo.js +124 -0
- package/module/print.html +18 -0
- package/module/print.js +1 -0
- package/package.json +29 -90
- package/configure.js +0 -2
- package/controller.js +0 -1
- package/dist/author/defaults.d.ts +0 -205
- package/dist/author/defaults.js +0 -151
- package/dist/author/index.d.ts +0 -26
- package/dist/author/index.js +0 -119
- package/dist/author/main.d.ts +0 -34
- package/dist/author/main.js +0 -287
- package/dist/author/utils.d.ts +0 -9
- package/dist/author/utils.js +0 -7
- package/dist/browser/Radio-D9xGO4mD.js +0 -9572
- package/dist/browser/Radio-D9xGO4mD.js.map +0 -1
- package/dist/browser/author/index.js +0 -39745
- package/dist/browser/author/index.js.map +0 -1
- package/dist/browser/controller/index.js +0 -199
- package/dist/browser/controller/index.js.map +0 -1
- package/dist/browser/delivery/index.js +0 -251
- package/dist/browser/delivery/index.js.map +0 -1
- package/dist/browser/dist-nl5urzAW.js +0 -107
- package/dist/browser/dist-nl5urzAW.js.map +0 -1
- package/dist/browser/main-D2qC-1Hm.js +0 -2440
- package/dist/browser/main-D2qC-1Hm.js.map +0 -1
- package/dist/browser/multiple-choice.css +0 -2
- package/dist/browser/print/index.js +0 -43
- package/dist/browser/print/index.js.map +0 -1
- package/dist/controller/defaults.d.ts +0 -35
- package/dist/controller/defaults.js +0 -29
- package/dist/controller/index.d.ts +0 -65
- package/dist/controller/index.js +0 -124
- package/dist/controller/utils.d.ts +0 -10
- package/dist/controller/utils.js +0 -8
- package/dist/delivery/choice-input.d.ts +0 -44
- package/dist/delivery/choice-input.js +0 -272
- package/dist/delivery/choice.d.ts +0 -20
- package/dist/delivery/choice.js +0 -105
- package/dist/delivery/feedback-tick.d.ts +0 -20
- package/dist/delivery/feedback-tick.js +0 -104
- package/dist/delivery/index.d.ts +0 -37
- package/dist/delivery/index.js +0 -214
- package/dist/delivery/main.d.ts +0 -31
- package/dist/delivery/main.js +0 -51
- package/dist/delivery/multiple-choice.d.ts +0 -61
- package/dist/delivery/multiple-choice.js +0 -244
- package/dist/delivery/session-updater.d.ts +0 -10
- package/dist/delivery/session-updater.js +0 -9
- package/dist/index.d.ts +0 -1
- package/dist/index.iife.d.ts +0 -8
- package/dist/index.iife.js +0 -148
- package/dist/index.js +0 -2
- package/dist/node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.js +0 -16
- package/dist/print/index.d.ts +0 -15
- package/dist/print/index.js +0 -43
- package/dist/runtime-support.d.ts +0 -12
- package/dist/runtime-support.js +0 -12
package/lib/main.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = void 0;
|
|
8
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
9
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
10
|
+
var _react = _interopRequireDefault(require("react"));
|
|
11
|
+
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
12
|
+
var _renderUi = require("@pie-lib/render-ui");
|
|
13
|
+
var _multipleChoice = _interopRequireDefault(require("./multiple-choice"));
|
|
14
|
+
class Main extends _react.default.Component {
|
|
15
|
+
render() {
|
|
16
|
+
const {
|
|
17
|
+
model,
|
|
18
|
+
onChoiceChanged,
|
|
19
|
+
session,
|
|
20
|
+
onShowCorrectToggle,
|
|
21
|
+
options,
|
|
22
|
+
baseHeadingLevel,
|
|
23
|
+
includeSrHeading
|
|
24
|
+
} = this.props;
|
|
25
|
+
const {
|
|
26
|
+
extraCSSRules,
|
|
27
|
+
fontSizeFactor
|
|
28
|
+
} = model;
|
|
29
|
+
|
|
30
|
+
// model.partLabel is a property used for ebsr
|
|
31
|
+
return /*#__PURE__*/_react.default.createElement(_renderUi.PreviewLayout, {
|
|
32
|
+
extraCSSRules: extraCSSRules,
|
|
33
|
+
fontSizeFactor: fontSizeFactor,
|
|
34
|
+
classes: {}
|
|
35
|
+
}, /*#__PURE__*/_react.default.createElement(_multipleChoice.default, (0, _extends2.default)({}, model, {
|
|
36
|
+
options: options,
|
|
37
|
+
session: session,
|
|
38
|
+
onChoiceChanged: onChoiceChanged,
|
|
39
|
+
onShowCorrectToggle: onShowCorrectToggle,
|
|
40
|
+
baseHeadingLevel: baseHeadingLevel,
|
|
41
|
+
includeSrHeading: includeSrHeading
|
|
42
|
+
})));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
(0, _defineProperty2.default)(Main, "propTypes", {
|
|
46
|
+
model: _propTypes.default.object,
|
|
47
|
+
session: _propTypes.default.object,
|
|
48
|
+
options: _propTypes.default.object,
|
|
49
|
+
onChoiceChanged: _propTypes.default.func,
|
|
50
|
+
onShowCorrectToggle: _propTypes.default.func,
|
|
51
|
+
extraCSSRules: _propTypes.default.shape({
|
|
52
|
+
names: _propTypes.default.arrayOf(_propTypes.default.string),
|
|
53
|
+
rules: _propTypes.default.string
|
|
54
|
+
}),
|
|
55
|
+
baseHeadingLevel: _propTypes.default.number,
|
|
56
|
+
includeSrHeading: _propTypes.default.bool
|
|
57
|
+
});
|
|
58
|
+
(0, _defineProperty2.default)(Main, "defaultProps", {
|
|
59
|
+
model: {},
|
|
60
|
+
session: {}
|
|
61
|
+
});
|
|
62
|
+
var _default = exports.default = Main;
|
|
63
|
+
//# sourceMappingURL=main.js.map
|
package/lib/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","names":["_react","_interopRequireDefault","require","_propTypes","_renderUi","_multipleChoice","Main","React","Component","render","model","onChoiceChanged","session","onShowCorrectToggle","options","baseHeadingLevel","includeSrHeading","props","extraCSSRules","fontSizeFactor","default","createElement","PreviewLayout","classes","_extends2","_defineProperty2","PropTypes","object","func","shape","names","arrayOf","string","rules","number","bool","_default","exports"],"sources":["../src/main.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { PreviewLayout } from '@pie-lib/render-ui';\nimport MultipleChoice from './multiple-choice';\n\nclass Main extends React.Component {\n static propTypes = {\n model: PropTypes.object,\n session: PropTypes.object,\n options: PropTypes.object,\n onChoiceChanged: PropTypes.func,\n onShowCorrectToggle: PropTypes.func,\n extraCSSRules: PropTypes.shape({\n names: PropTypes.arrayOf(PropTypes.string),\n rules: PropTypes.string,\n }),\n baseHeadingLevel: PropTypes.number,\n includeSrHeading: PropTypes.bool,\n };\n\n static defaultProps = {\n model: {},\n session: {},\n };\n\n render() {\n const { model, onChoiceChanged, session, onShowCorrectToggle, options, baseHeadingLevel, includeSrHeading } = this.props;\n const { extraCSSRules, fontSizeFactor } = model;\n\n // model.partLabel is a property used for ebsr\n return (\n <PreviewLayout extraCSSRules={extraCSSRules} fontSizeFactor={fontSizeFactor} classes={{}}>\n <MultipleChoice\n {...model}\n options={options}\n session={session}\n onChoiceChanged={onChoiceChanged}\n onShowCorrectToggle={onShowCorrectToggle}\n baseHeadingLevel={baseHeadingLevel}\n includeSrHeading={includeSrHeading}\n />\n </PreviewLayout>\n );\n }\n}\n\nexport default Main;\n"],"mappings":";;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,UAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,SAAA,GAAAF,OAAA;AACA,IAAAG,eAAA,GAAAJ,sBAAA,CAAAC,OAAA;AAEA,MAAMI,IAAI,SAASC,cAAK,CAACC,SAAS,CAAC;EAoBjCC,MAAMA,CAAA,EAAG;IACP,MAAM;MAAEC,KAAK;MAAEC,eAAe;MAAEC,OAAO;MAAEC,mBAAmB;MAAEC,OAAO;MAAEC,gBAAgB;MAAEC;IAAiB,CAAC,GAAG,IAAI,CAACC,KAAK;IACxH,MAAM;MAAEC,aAAa;MAAEC;IAAe,CAAC,GAAGT,KAAK;;IAE/C;IACA,oBACEV,MAAA,CAAAoB,OAAA,CAAAC,aAAA,CAACjB,SAAA,CAAAkB,aAAa;MAACJ,aAAa,EAAEA,aAAc;MAACC,cAAc,EAAEA,cAAe;MAACI,OAAO,EAAE,CAAC;IAAE,gBACvFvB,MAAA,CAAAoB,OAAA,CAAAC,aAAA,CAAChB,eAAA,CAAAe,OAAc,MAAAI,SAAA,CAAAJ,OAAA,MACTV,KAAK;MACTI,OAAO,EAAEA,OAAQ;MACjBF,OAAO,EAAEA,OAAQ;MACjBD,eAAe,EAAEA,eAAgB;MACjCE,mBAAmB,EAAEA,mBAAoB;MACzCE,gBAAgB,EAAEA,gBAAiB;MACnCC,gBAAgB,EAAEA;IAAiB,EACpC,CACY,CAAC;EAEpB;AACF;AAAC,IAAAS,gBAAA,CAAAL,OAAA,EAvCKd,IAAI,eACW;EACjBI,KAAK,EAAEgB,kBAAS,CAACC,MAAM;EACvBf,OAAO,EAAEc,kBAAS,CAACC,MAAM;EACzBb,OAAO,EAAEY,kBAAS,CAACC,MAAM;EACzBhB,eAAe,EAAEe,kBAAS,CAACE,IAAI;EAC/Bf,mBAAmB,EAAEa,kBAAS,CAACE,IAAI;EACnCV,aAAa,EAAEQ,kBAAS,CAACG,KAAK,CAAC;IAC7BC,KAAK,EAAEJ,kBAAS,CAACK,OAAO,CAACL,kBAAS,CAACM,MAAM,CAAC;IAC1CC,KAAK,EAAEP,kBAAS,CAACM;EACnB,CAAC,CAAC;EACFjB,gBAAgB,EAAEW,kBAAS,CAACQ,MAAM;EAClClB,gBAAgB,EAAEU,kBAAS,CAACS;AAC9B,CAAC;AAAA,IAAAV,gBAAA,CAAAL,OAAA,EAbGd,IAAI,kBAec;EACpBI,KAAK,EAAE,CAAC,CAAC;EACTE,OAAO,EAAE,CAAC;AACZ,CAAC;AAAA,IAAAwB,QAAA,GAAAC,OAAA,CAAAjB,OAAA,GAuBYd,IAAI","ignoreList":[]}
|
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = exports.MultipleChoice = void 0;
|
|
8
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
9
|
+
var _react = _interopRequireDefault(require("react"));
|
|
10
|
+
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
11
|
+
var _correctAnswerToggle = _interopRequireDefault(require("@pie-lib/correct-answer-toggle"));
|
|
12
|
+
var _classnames = _interopRequireDefault(require("classnames"));
|
|
13
|
+
var _styles = require("@mui/material/styles");
|
|
14
|
+
var _Box = _interopRequireDefault(require("@mui/material/Box"));
|
|
15
|
+
var _renderUi = require("@pie-lib/render-ui");
|
|
16
|
+
var _translator = _interopRequireDefault(require("@pie-lib/translator"));
|
|
17
|
+
var _choice = _interopRequireDefault(require("./choice"));
|
|
18
|
+
const {
|
|
19
|
+
translator
|
|
20
|
+
} = _translator.default;
|
|
21
|
+
const MainContainer = (0, _styles.styled)(_Box.default)({
|
|
22
|
+
color: _renderUi.color.text(),
|
|
23
|
+
backgroundColor: _renderUi.color.background(),
|
|
24
|
+
'& *': {
|
|
25
|
+
'-webkit-font-smoothing': 'antialiased'
|
|
26
|
+
},
|
|
27
|
+
position: 'relative',
|
|
28
|
+
// remove border from legend tags inside main to override the OT default styles
|
|
29
|
+
'& legend': {
|
|
30
|
+
border: 'none !important'
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
const PartLabel = (0, _styles.styled)('h2')(({
|
|
34
|
+
theme
|
|
35
|
+
}) => ({
|
|
36
|
+
display: 'block',
|
|
37
|
+
fontSize: 'inherit',
|
|
38
|
+
margin: '0',
|
|
39
|
+
fontWeight: 'normal',
|
|
40
|
+
paddingBottom: theme.spacing(2)
|
|
41
|
+
}));
|
|
42
|
+
const TeacherInstructions = (0, _styles.styled)(_Box.default)(({
|
|
43
|
+
theme
|
|
44
|
+
}) => ({
|
|
45
|
+
marginBottom: theme.spacing(2)
|
|
46
|
+
}));
|
|
47
|
+
const HorizontalLayout = (0, _styles.styled)(_Box.default)({
|
|
48
|
+
display: 'flex',
|
|
49
|
+
flexDirection: 'row',
|
|
50
|
+
flexWrap: 'wrap'
|
|
51
|
+
});
|
|
52
|
+
const GridLayout = (0, _styles.styled)(_Box.default)({
|
|
53
|
+
display: 'grid'
|
|
54
|
+
});
|
|
55
|
+
const StyledFieldset = (0, _styles.styled)('fieldset')({
|
|
56
|
+
border: '0px',
|
|
57
|
+
padding: '0.01em 0 0 0',
|
|
58
|
+
margin: '0px',
|
|
59
|
+
minWidth: '0px'
|
|
60
|
+
});
|
|
61
|
+
const SrOnly = (0, _styles.styled)('h3')({
|
|
62
|
+
position: 'absolute',
|
|
63
|
+
left: '-10000px',
|
|
64
|
+
top: 'auto',
|
|
65
|
+
width: '1px',
|
|
66
|
+
height: '1px',
|
|
67
|
+
overflow: 'hidden'
|
|
68
|
+
});
|
|
69
|
+
const ErrorText = (0, _styles.styled)('div')(({
|
|
70
|
+
theme
|
|
71
|
+
}) => ({
|
|
72
|
+
fontSize: theme.typography.fontSize - 2,
|
|
73
|
+
color: theme.palette.error.main,
|
|
74
|
+
paddingTop: theme.spacing(1)
|
|
75
|
+
}));
|
|
76
|
+
class MultipleChoice extends _react.default.Component {
|
|
77
|
+
constructor(props) {
|
|
78
|
+
super(props);
|
|
79
|
+
// handleChange was added for accessibility. Please see comments and videos from PD-2441.
|
|
80
|
+
(0, _defineProperty2.default)(this, "handleChange", event => {
|
|
81
|
+
const {
|
|
82
|
+
value,
|
|
83
|
+
checked
|
|
84
|
+
} = event.target;
|
|
85
|
+
const {
|
|
86
|
+
maxSelections,
|
|
87
|
+
onChoiceChanged,
|
|
88
|
+
session
|
|
89
|
+
} = this.props;
|
|
90
|
+
if (session.value && session.value.length >= maxSelections) {
|
|
91
|
+
// show/hide max selections error when user select/deselect an answer
|
|
92
|
+
this.setState({
|
|
93
|
+
maxSelectionsErrorState: checked
|
|
94
|
+
});
|
|
95
|
+
if (checked) {
|
|
96
|
+
// prevent selecting more answers
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
onChoiceChanged({
|
|
101
|
+
value,
|
|
102
|
+
selected: checked,
|
|
103
|
+
selector: 'Mouse'
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
(0, _defineProperty2.default)(this, "onToggle", () => {
|
|
107
|
+
if (this.props.mode === 'evaluate') {
|
|
108
|
+
this.setState({
|
|
109
|
+
showCorrect: !this.state.showCorrect
|
|
110
|
+
}, () => {
|
|
111
|
+
if (this.props.onShowCorrectToggle) {
|
|
112
|
+
this.props.onShowCorrectToggle();
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
(0, _defineProperty2.default)(this, "getCorrectness", (choice = {}) => {
|
|
118
|
+
const isCorrect = choice.correct;
|
|
119
|
+
const isChecked = this.isSelected(choice.value);
|
|
120
|
+
if (this.state.showCorrect) {
|
|
121
|
+
return isCorrect ? 'correct' : undefined;
|
|
122
|
+
}
|
|
123
|
+
if (isCorrect) {
|
|
124
|
+
if (isChecked) {
|
|
125
|
+
// A correct answer is selected: marked with a green checkmark
|
|
126
|
+
return 'correct';
|
|
127
|
+
} else {
|
|
128
|
+
// A correct answer is NOT selected: marked with an orange X
|
|
129
|
+
return 'incorrect';
|
|
130
|
+
}
|
|
131
|
+
} else {
|
|
132
|
+
if (isChecked) {
|
|
133
|
+
// An incorrect answer is selected: marked with an orange X
|
|
134
|
+
return 'incorrect';
|
|
135
|
+
} else {
|
|
136
|
+
// An incorrect answer is NOT selected: not marked
|
|
137
|
+
return undefined;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
this.state = {
|
|
142
|
+
showCorrect: this.props.options && this.props.alwaysShowCorrect || false,
|
|
143
|
+
maxSelectionsErrorState: false
|
|
144
|
+
};
|
|
145
|
+
this.onToggle = this.onToggle.bind(this);
|
|
146
|
+
|
|
147
|
+
// Unique radio `name` attribute per instance, so separate MultipleChoice
|
|
148
|
+
// instances (e.g. Part A and Part B inside EBSR, or two EBSRs on the same
|
|
149
|
+
// page) are always treated as independent radio groups by the browser,
|
|
150
|
+
// regardless of any label-related model settings or bundle deduplication.
|
|
151
|
+
this.groupName = `mc-group-${Math.random().toString(36).slice(2, 10)}`;
|
|
152
|
+
}
|
|
153
|
+
isSelected(value) {
|
|
154
|
+
const sessionValue = this.props.session && this.props.session.value;
|
|
155
|
+
return sessionValue && sessionValue.indexOf && sessionValue.indexOf(value) >= 0;
|
|
156
|
+
}
|
|
157
|
+
UNSAFE_componentWillReceiveProps(nextProps) {
|
|
158
|
+
if (!nextProps.correctResponse && this.state.showCorrect !== false) {
|
|
159
|
+
this.setState({
|
|
160
|
+
showCorrect: false
|
|
161
|
+
}, () => {
|
|
162
|
+
if (this.props.onShowCorrectToggle) {
|
|
163
|
+
this.props.onShowCorrectToggle();
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
if (nextProps.options && nextProps.alwaysShowCorrect && this.state.showCorrect !== true) {
|
|
168
|
+
this.setState({
|
|
169
|
+
showCorrect: true
|
|
170
|
+
}, () => {
|
|
171
|
+
if (this.props.onShowCorrectToggle) {
|
|
172
|
+
this.props.onShowCorrectToggle();
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
indexToSymbol(index) {
|
|
178
|
+
if (this.props.keyMode === 'numbers') {
|
|
179
|
+
return `${index + 1}`;
|
|
180
|
+
}
|
|
181
|
+
if (this.props.keyMode === 'letters') {
|
|
182
|
+
return String.fromCharCode(97 + index).toUpperCase();
|
|
183
|
+
}
|
|
184
|
+
return '';
|
|
185
|
+
}
|
|
186
|
+
getChecked(choice) {
|
|
187
|
+
// check for print context: options prop is passed from print.js and alwaysShowCorrect is true
|
|
188
|
+
const isPrintMode = this.props.options && this.props.alwaysShowCorrect;
|
|
189
|
+
if (isPrintMode) {
|
|
190
|
+
return choice.correct || false;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// evaluate mode with show correct toggled
|
|
194
|
+
const isEvaluateMode = this.state.showCorrect && this.props.mode === 'evaluate';
|
|
195
|
+
if (isEvaluateMode) {
|
|
196
|
+
return choice.correct || false;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// default behavior: show what the user has selected
|
|
200
|
+
return this.isSelected(choice.value);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// renderHeading function was added for accessibility.
|
|
204
|
+
renderHeading() {
|
|
205
|
+
const {
|
|
206
|
+
mode,
|
|
207
|
+
choiceMode,
|
|
208
|
+
includeSrHeading,
|
|
209
|
+
baseHeadingLevel,
|
|
210
|
+
partLabel
|
|
211
|
+
} = this.props;
|
|
212
|
+
|
|
213
|
+
// When a part label is present the item is an EBSR part — the SR heading
|
|
214
|
+
// is provided by the EBSR element, not here.
|
|
215
|
+
const shouldRenderSrHeading = !partLabel && includeSrHeading !== false;
|
|
216
|
+
if (!shouldRenderSrHeading || mode !== 'gather') {
|
|
217
|
+
return null;
|
|
218
|
+
}
|
|
219
|
+
const clampedLevel = baseHeadingLevel ? Math.min(6, baseHeadingLevel) : 2;
|
|
220
|
+
const HeadingTag = SrOnly.withComponent(`h${clampedLevel}`);
|
|
221
|
+
const label = choiceMode === 'radio' ? 'Multiple Choice Question' : 'Multiple Select Question';
|
|
222
|
+
return /*#__PURE__*/_react.default.createElement(HeadingTag, null, label);
|
|
223
|
+
}
|
|
224
|
+
render() {
|
|
225
|
+
const {
|
|
226
|
+
mode,
|
|
227
|
+
disabled,
|
|
228
|
+
className,
|
|
229
|
+
choices = [],
|
|
230
|
+
choiceMode,
|
|
231
|
+
gridColumns,
|
|
232
|
+
partLabel,
|
|
233
|
+
prompt,
|
|
234
|
+
responseCorrect,
|
|
235
|
+
teacherInstructions,
|
|
236
|
+
alwaysShowCorrect,
|
|
237
|
+
animationsDisabled,
|
|
238
|
+
language,
|
|
239
|
+
isSelectionButtonBelow,
|
|
240
|
+
minSelections,
|
|
241
|
+
maxSelections,
|
|
242
|
+
autoplayAudioEnabled,
|
|
243
|
+
session,
|
|
244
|
+
customAudioButton,
|
|
245
|
+
options,
|
|
246
|
+
baseHeadingLevel
|
|
247
|
+
} = this.props;
|
|
248
|
+
const {
|
|
249
|
+
showCorrect,
|
|
250
|
+
maxSelectionsErrorState
|
|
251
|
+
} = this.state;
|
|
252
|
+
const isEvaluateMode = mode === 'evaluate';
|
|
253
|
+
const showCorrectAnswerToggle = isEvaluateMode && !responseCorrect;
|
|
254
|
+
const columnsStyle = gridColumns > 1 ? {
|
|
255
|
+
gridTemplateColumns: `repeat(${gridColumns}, 1fr)`
|
|
256
|
+
} : undefined;
|
|
257
|
+
const selections = session.value && session.value.length || 0;
|
|
258
|
+
|
|
259
|
+
// Heading levels are optional and only applied when baseHeadingLevel is provided.
|
|
260
|
+
const getContentHeadingLevel = () => {
|
|
261
|
+
if (!baseHeadingLevel) return undefined;
|
|
262
|
+
// SR heading (rendered or external) sits at baseHeadingLevel.
|
|
263
|
+
// Content is always one below that; part label (EBSR) sits between them.
|
|
264
|
+
let offset = 1; // content default: baseHeadingLevel + 1
|
|
265
|
+
if (partLabel) offset += 1; // part label at base + 1, content pushed to base + 2
|
|
266
|
+
return Math.min(6, baseHeadingLevel + offset);
|
|
267
|
+
};
|
|
268
|
+
const contentHeadingLevel = getContentHeadingLevel();
|
|
269
|
+
const transformPrompt = html => html && contentHeadingLevel ? (0, _renderUi.transformDataHeadings)(html, contentHeadingLevel) : html;
|
|
270
|
+
const teacherInstructionsDiv = /*#__PURE__*/_react.default.createElement(_renderUi.PreviewPrompt, {
|
|
271
|
+
tagName: "div",
|
|
272
|
+
className: "prompt",
|
|
273
|
+
defaultClassName: "teacher-instructions",
|
|
274
|
+
prompt: teacherInstructions
|
|
275
|
+
});
|
|
276
|
+
const getMultipleChoiceMinSelectionErrorMessage = () => {
|
|
277
|
+
if (minSelections && maxSelections) {
|
|
278
|
+
return minSelections === maxSelections ? translator.t('translation:multipleChoice:minmaxSelections_equal', {
|
|
279
|
+
lng: language,
|
|
280
|
+
minSelections
|
|
281
|
+
}) : translator.t('translation:multipleChoice:minmaxSelections_range', {
|
|
282
|
+
lng: language,
|
|
283
|
+
minSelections,
|
|
284
|
+
maxSelections
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
if (minSelections) {
|
|
288
|
+
return translator.t('translation:multipleChoice:minSelections', {
|
|
289
|
+
lng: language,
|
|
290
|
+
minSelections
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
return '';
|
|
294
|
+
};
|
|
295
|
+
const LayoutComponent = this.props.choicesLayout === 'grid' ? GridLayout : this.props.choicesLayout === 'horizontal' ? HorizontalLayout : _Box.default;
|
|
296
|
+
return /*#__PURE__*/_react.default.createElement(MainContainer, {
|
|
297
|
+
id: 'main-container',
|
|
298
|
+
className: (0, _classnames.default)(className, 'multiple-choice')
|
|
299
|
+
}, partLabel && /*#__PURE__*/_react.default.createElement(PartLabel, {
|
|
300
|
+
as: baseHeadingLevel ? `h${Math.min(6, baseHeadingLevel + 1)}` : 'h2'
|
|
301
|
+
}, partLabel), this.renderHeading(), teacherInstructions && /*#__PURE__*/_react.default.createElement(TeacherInstructions, null, !animationsDisabled ? /*#__PURE__*/_react.default.createElement(_renderUi.Collapsible, {
|
|
302
|
+
labels: {
|
|
303
|
+
hidden: 'Show Teacher Instructions',
|
|
304
|
+
visible: 'Hide Teacher Instructions'
|
|
305
|
+
}
|
|
306
|
+
}, teacherInstructionsDiv) : teacherInstructionsDiv), /*#__PURE__*/_react.default.createElement(StyledFieldset, {
|
|
307
|
+
role: choiceMode === 'radio' ? 'radiogroup' : 'group'
|
|
308
|
+
}, /*#__PURE__*/_react.default.createElement(_renderUi.PreviewPrompt, {
|
|
309
|
+
className: "prompt",
|
|
310
|
+
defaultClassName: "prompt",
|
|
311
|
+
prompt: transformPrompt(prompt),
|
|
312
|
+
tagName: 'legend',
|
|
313
|
+
autoplayAudioEnabled: autoplayAudioEnabled,
|
|
314
|
+
customAudioButton: customAudioButton
|
|
315
|
+
}), !(options && alwaysShowCorrect) && /*#__PURE__*/_react.default.createElement(_correctAnswerToggle.default, {
|
|
316
|
+
show: showCorrectAnswerToggle,
|
|
317
|
+
toggled: showCorrect,
|
|
318
|
+
onToggle: this.onToggle.bind(this),
|
|
319
|
+
language: language
|
|
320
|
+
}), /*#__PURE__*/_react.default.createElement(LayoutComponent, {
|
|
321
|
+
style: columnsStyle
|
|
322
|
+
}, choices.map((choice, index) => /*#__PURE__*/_react.default.createElement(_choice.default, {
|
|
323
|
+
choicesLayout: this.props.choicesLayout,
|
|
324
|
+
selectedAnswerBackgroundColor: this.props.selectedAnswerBackgroundColor,
|
|
325
|
+
selectedAnswerStrokeColor: this.props.selectedAnswerStrokeColor,
|
|
326
|
+
selectedAnswerStrokeWidth: this.props.selectedAnswerStrokeWidth,
|
|
327
|
+
hoverAnswerBackgroundColor: this.props.hoverAnswerBackgroundColor,
|
|
328
|
+
hoverAnswerStrokeColor: this.props.hoverAnswerStrokeColor,
|
|
329
|
+
hoverAnswerStrokeWidth: this.props.hoverAnswerStrokeWidth,
|
|
330
|
+
gridColumns: gridColumns,
|
|
331
|
+
key: `choice-${index}`,
|
|
332
|
+
choice: choice,
|
|
333
|
+
index: index,
|
|
334
|
+
choicesLength: choices.length,
|
|
335
|
+
showCorrect: showCorrect,
|
|
336
|
+
isEvaluateMode: isEvaluateMode,
|
|
337
|
+
choiceMode: choiceMode,
|
|
338
|
+
disabled: disabled,
|
|
339
|
+
tagName: this.groupName,
|
|
340
|
+
onChoiceChanged: this.handleChange,
|
|
341
|
+
hideTick: choice.hideTick,
|
|
342
|
+
checked: this.getChecked(choice),
|
|
343
|
+
correctness: isEvaluateMode ? this.getCorrectness(choice) : undefined,
|
|
344
|
+
displayKey: this.indexToSymbol(index),
|
|
345
|
+
isSelectionButtonBelow: isSelectionButtonBelow
|
|
346
|
+
})))), choiceMode === 'checkbox' && selections < minSelections && /*#__PURE__*/_react.default.createElement(ErrorText, null, getMultipleChoiceMinSelectionErrorMessage()), choiceMode === 'checkbox' && maxSelectionsErrorState && /*#__PURE__*/_react.default.createElement(ErrorText, null, translator.t(`translation:multipleChoice:maxSelections_${maxSelections === 1 ? 'one' : 'other'}`, {
|
|
347
|
+
lng: language,
|
|
348
|
+
maxSelections
|
|
349
|
+
})));
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
exports.MultipleChoice = MultipleChoice;
|
|
353
|
+
(0, _defineProperty2.default)(MultipleChoice, "propTypes", {
|
|
354
|
+
className: _propTypes.default.string,
|
|
355
|
+
mode: _propTypes.default.oneOf(['gather', 'view', 'evaluate']),
|
|
356
|
+
choiceMode: _propTypes.default.oneOf(['radio', 'checkbox']),
|
|
357
|
+
keyMode: _propTypes.default.oneOf(['numbers', 'letters', 'none']),
|
|
358
|
+
choices: _propTypes.default.array,
|
|
359
|
+
partLabel: _propTypes.default.string,
|
|
360
|
+
prompt: _propTypes.default.string,
|
|
361
|
+
teacherInstructions: _propTypes.default.string,
|
|
362
|
+
session: _propTypes.default.object,
|
|
363
|
+
disabled: _propTypes.default.bool,
|
|
364
|
+
onChoiceChanged: _propTypes.default.func,
|
|
365
|
+
responseCorrect: _propTypes.default.bool,
|
|
366
|
+
correctResponse: _propTypes.default.array,
|
|
367
|
+
choicesLayout: _propTypes.default.oneOf(['vertical', 'grid', 'horizontal']),
|
|
368
|
+
gridColumns: _propTypes.default.string,
|
|
369
|
+
alwaysShowCorrect: _propTypes.default.bool,
|
|
370
|
+
animationsDisabled: _propTypes.default.bool,
|
|
371
|
+
language: _propTypes.default.string,
|
|
372
|
+
selectedAnswerBackgroundColor: _propTypes.default.string,
|
|
373
|
+
selectedAnswerStrokeColor: _propTypes.default.string,
|
|
374
|
+
selectedAnswerStrokeWidth: _propTypes.default.string,
|
|
375
|
+
hoverAnswerBackgroundColor: _propTypes.default.string,
|
|
376
|
+
hoverAnswerStrokeColor: _propTypes.default.string,
|
|
377
|
+
hoverAnswerStrokeWidth: _propTypes.default.string,
|
|
378
|
+
onShowCorrectToggle: _propTypes.default.func,
|
|
379
|
+
isSelectionButtonBelow: _propTypes.default.bool,
|
|
380
|
+
minSelections: _propTypes.default.number,
|
|
381
|
+
maxSelections: _propTypes.default.number,
|
|
382
|
+
autoplayAudioEnabled: _propTypes.default.bool,
|
|
383
|
+
customAudioButton: {
|
|
384
|
+
playImage: _propTypes.default.string,
|
|
385
|
+
pauseImage: _propTypes.default.string
|
|
386
|
+
},
|
|
387
|
+
options: _propTypes.default.object,
|
|
388
|
+
baseHeadingLevel: _propTypes.default.number,
|
|
389
|
+
includeSrHeading: _propTypes.default.bool
|
|
390
|
+
});
|
|
391
|
+
MultipleChoice.defaultProps = {
|
|
392
|
+
session: {
|
|
393
|
+
value: []
|
|
394
|
+
}
|
|
395
|
+
};
|
|
396
|
+
var _default = exports.default = MultipleChoice;
|
|
397
|
+
//# sourceMappingURL=multiple-choice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multiple-choice.js","names":["_react","_interopRequireDefault","require","_propTypes","_correctAnswerToggle","_classnames","_styles","_Box","_renderUi","_translator","_choice","translator","Translator","MainContainer","styled","Box","color","text","backgroundColor","background","position","border","PartLabel","theme","display","fontSize","margin","fontWeight","paddingBottom","spacing","TeacherInstructions","marginBottom","HorizontalLayout","flexDirection","flexWrap","GridLayout","StyledFieldset","padding","minWidth","SrOnly","left","top","width","height","overflow","ErrorText","typography","palette","error","main","paddingTop","MultipleChoice","React","Component","constructor","props","_defineProperty2","default","event","value","checked","target","maxSelections","onChoiceChanged","session","length","setState","maxSelectionsErrorState","selected","selector","mode","showCorrect","state","onShowCorrectToggle","choice","isCorrect","correct","isChecked","isSelected","undefined","options","alwaysShowCorrect","onToggle","bind","groupName","Math","random","toString","slice","sessionValue","indexOf","UNSAFE_componentWillReceiveProps","nextProps","correctResponse","indexToSymbol","index","keyMode","String","fromCharCode","toUpperCase","getChecked","isPrintMode","isEvaluateMode","renderHeading","choiceMode","includeSrHeading","baseHeadingLevel","partLabel","shouldRenderSrHeading","clampedLevel","min","HeadingTag","withComponent","label","createElement","render","disabled","className","choices","gridColumns","prompt","responseCorrect","teacherInstructions","animationsDisabled","language","isSelectionButtonBelow","minSelections","autoplayAudioEnabled","customAudioButton","showCorrectAnswerToggle","columnsStyle","gridTemplateColumns","selections","getContentHeadingLevel","offset","contentHeadingLevel","transformPrompt","html","transformDataHeadings","teacherInstructionsDiv","PreviewPrompt","tagName","defaultClassName","getMultipleChoiceMinSelectionErrorMessage","t","lng","LayoutComponent","choicesLayout","id","classNames","as","Collapsible","labels","hidden","visible","role","show","toggled","style","map","selectedAnswerBackgroundColor","selectedAnswerStrokeColor","selectedAnswerStrokeWidth","hoverAnswerBackgroundColor","hoverAnswerStrokeColor","hoverAnswerStrokeWidth","key","choicesLength","handleChange","hideTick","correctness","getCorrectness","displayKey","exports","PropTypes","string","oneOf","array","object","bool","func","number","playImage","pauseImage","defaultProps","_default"],"sources":["../src/multiple-choice.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport CorrectAnswerToggle from '@pie-lib/correct-answer-toggle';\nimport classNames from 'classnames';\nimport { styled } from '@mui/material/styles';\nimport Box from '@mui/material/Box';\nimport { color, Collapsible, PreviewPrompt, transformDataHeadings } from '@pie-lib/render-ui';\nimport Translator from '@pie-lib/translator';\n\nimport Choice from './choice';\n\nconst { translator } = Translator;\n\nconst MainContainer = styled(Box)({\n color: color.text(),\n backgroundColor: color.background(),\n '& *': {\n '-webkit-font-smoothing': 'antialiased',\n },\n position: 'relative',\n // remove border from legend tags inside main to override the OT default styles\n '& legend': {\n border: 'none !important',\n },\n});\n\nconst PartLabel = styled('h2')(({ theme }) => ({\n display: 'block',\n fontSize: 'inherit',\n margin: '0',\n fontWeight: 'normal',\n paddingBottom: theme.spacing(2),\n}));\n\nconst TeacherInstructions = styled(Box)(({ theme }) => ({\n marginBottom: theme.spacing(2),\n}));\n\nconst HorizontalLayout = styled(Box)({\n display: 'flex',\n flexDirection: 'row',\n flexWrap: 'wrap',\n});\n\nconst GridLayout = styled(Box)({\n display: 'grid',\n});\n\nconst StyledFieldset = styled('fieldset')({\n border: '0px',\n padding: '0.01em 0 0 0',\n margin: '0px',\n minWidth: '0px',\n});\n\nconst SrOnly = styled('h3')({\n position: 'absolute',\n left: '-10000px',\n top: 'auto',\n width: '1px',\n height: '1px',\n overflow: 'hidden',\n});\n\nconst ErrorText = styled('div')(({ theme }) => ({\n fontSize: theme.typography.fontSize - 2,\n color: theme.palette.error.main,\n paddingTop: theme.spacing(1),\n}));\n\nexport class MultipleChoice extends React.Component {\n static propTypes = {\n className: PropTypes.string,\n mode: PropTypes.oneOf(['gather', 'view', 'evaluate']),\n choiceMode: PropTypes.oneOf(['radio', 'checkbox']),\n keyMode: PropTypes.oneOf(['numbers', 'letters', 'none']),\n choices: PropTypes.array,\n partLabel: PropTypes.string,\n prompt: PropTypes.string,\n teacherInstructions: PropTypes.string,\n session: PropTypes.object,\n disabled: PropTypes.bool,\n onChoiceChanged: PropTypes.func,\n responseCorrect: PropTypes.bool,\n correctResponse: PropTypes.array,\n choicesLayout: PropTypes.oneOf(['vertical', 'grid', 'horizontal']),\n gridColumns: PropTypes.string,\n alwaysShowCorrect: PropTypes.bool,\n animationsDisabled: PropTypes.bool,\n language: PropTypes.string,\n selectedAnswerBackgroundColor: PropTypes.string,\n selectedAnswerStrokeColor: PropTypes.string,\n selectedAnswerStrokeWidth: PropTypes.string,\n hoverAnswerBackgroundColor: PropTypes.string,\n hoverAnswerStrokeColor: PropTypes.string,\n hoverAnswerStrokeWidth: PropTypes.string,\n onShowCorrectToggle: PropTypes.func,\n isSelectionButtonBelow: PropTypes.bool,\n minSelections: PropTypes.number,\n maxSelections: PropTypes.number,\n autoplayAudioEnabled: PropTypes.bool,\n customAudioButton: {\n playImage: PropTypes.string,\n pauseImage: PropTypes.string,\n },\n options: PropTypes.object,\n baseHeadingLevel: PropTypes.number,\n includeSrHeading: PropTypes.bool,\n };\n\n constructor(props) {\n super(props);\n\n this.state = {\n showCorrect: (this.props.options && this.props.alwaysShowCorrect) || false,\n maxSelectionsErrorState: false,\n };\n\n this.onToggle = this.onToggle.bind(this);\n\n // Unique radio `name` attribute per instance, so separate MultipleChoice\n // instances (e.g. Part A and Part B inside EBSR, or two EBSRs on the same\n // page) are always treated as independent radio groups by the browser,\n // regardless of any label-related model settings or bundle deduplication.\n this.groupName = `mc-group-${Math.random().toString(36).slice(2, 10)}`;\n }\n\n isSelected(value) {\n const sessionValue = this.props.session && this.props.session.value;\n\n return sessionValue && sessionValue.indexOf && sessionValue.indexOf(value) >= 0;\n }\n\n // handleChange was added for accessibility. Please see comments and videos from PD-2441.\n handleChange = (event) => {\n const { value, checked } = event.target;\n const { maxSelections, onChoiceChanged, session } = this.props;\n\n if (session.value && session.value.length >= maxSelections) {\n // show/hide max selections error when user select/deselect an answer\n this.setState({ maxSelectionsErrorState: checked });\n\n if (checked) {\n // prevent selecting more answers\n return;\n }\n }\n\n onChoiceChanged({ value, selected: checked, selector: 'Mouse' });\n };\n\n onToggle = () => {\n if (this.props.mode === 'evaluate') {\n this.setState({ showCorrect: !this.state.showCorrect }, () => {\n if (this.props.onShowCorrectToggle) {\n this.props.onShowCorrectToggle();\n }\n });\n }\n };\n\n UNSAFE_componentWillReceiveProps(nextProps) {\n if (!nextProps.correctResponse && this.state.showCorrect !== false) {\n this.setState({ showCorrect: false }, () => {\n if (this.props.onShowCorrectToggle) {\n this.props.onShowCorrectToggle();\n }\n });\n }\n\n if (nextProps.options && nextProps.alwaysShowCorrect && this.state.showCorrect !== true) {\n this.setState({ showCorrect: true }, () => {\n if (this.props.onShowCorrectToggle) {\n this.props.onShowCorrectToggle();\n }\n });\n }\n }\n\n indexToSymbol(index) {\n if (this.props.keyMode === 'numbers') {\n return `${index + 1}`;\n }\n\n if (this.props.keyMode === 'letters') {\n return String.fromCharCode(97 + index).toUpperCase();\n }\n\n return '';\n }\n\n getCorrectness = (choice = {}) => {\n const isCorrect = choice.correct;\n const isChecked = this.isSelected(choice.value);\n\n if (this.state.showCorrect) {\n return isCorrect ? 'correct' : undefined;\n }\n\n if (isCorrect) {\n if (isChecked) {\n // A correct answer is selected: marked with a green checkmark\n return 'correct';\n } else {\n // A correct answer is NOT selected: marked with an orange X\n return 'incorrect';\n }\n } else {\n if (isChecked) {\n // An incorrect answer is selected: marked with an orange X\n return 'incorrect';\n } else {\n // An incorrect answer is NOT selected: not marked\n return undefined;\n }\n }\n };\n\n getChecked(choice) {\n // check for print context: options prop is passed from print.js and alwaysShowCorrect is true\n const isPrintMode = this.props.options && this.props.alwaysShowCorrect;\n\n if (isPrintMode) {\n return choice.correct || false;\n }\n\n // evaluate mode with show correct toggled\n const isEvaluateMode = this.state.showCorrect && this.props.mode === 'evaluate';\n\n if (isEvaluateMode) {\n return choice.correct || false;\n }\n\n // default behavior: show what the user has selected\n return this.isSelected(choice.value);\n }\n\n // renderHeading function was added for accessibility.\n renderHeading() {\n const { mode, choiceMode, includeSrHeading, baseHeadingLevel, partLabel } = this.props;\n\n // When a part label is present the item is an EBSR part — the SR heading\n // is provided by the EBSR element, not here.\n const shouldRenderSrHeading = !partLabel && includeSrHeading !== false;\n\n if (!shouldRenderSrHeading || mode !== 'gather') {\n return null;\n }\n\n const clampedLevel = baseHeadingLevel ? Math.min(6, baseHeadingLevel) : 2;\n const HeadingTag = SrOnly.withComponent(`h${clampedLevel}`);\n const label = choiceMode === 'radio' ? 'Multiple Choice Question' : 'Multiple Select Question';\n\n return <HeadingTag>{label}</HeadingTag>;\n }\n\n render() {\n const {\n mode,\n disabled,\n className,\n choices = [],\n choiceMode,\n gridColumns,\n partLabel,\n prompt,\n responseCorrect,\n teacherInstructions,\n alwaysShowCorrect,\n animationsDisabled,\n language,\n isSelectionButtonBelow,\n minSelections,\n maxSelections,\n autoplayAudioEnabled,\n session,\n customAudioButton,\n options,\n baseHeadingLevel,\n } = this.props;\n const { showCorrect, maxSelectionsErrorState } = this.state;\n const isEvaluateMode = mode === 'evaluate';\n const showCorrectAnswerToggle = isEvaluateMode && !responseCorrect;\n const columnsStyle = gridColumns > 1 ? { gridTemplateColumns: `repeat(${gridColumns}, 1fr)` } : undefined;\n const selections = (session.value && session.value.length) || 0;\n\n // Heading levels are optional and only applied when baseHeadingLevel is provided.\n const getContentHeadingLevel = () => {\n if (!baseHeadingLevel) return undefined;\n // SR heading (rendered or external) sits at baseHeadingLevel.\n // Content is always one below that; part label (EBSR) sits between them.\n let offset = 1; // content default: baseHeadingLevel + 1\n if (partLabel) offset += 1; // part label at base + 1, content pushed to base + 2\n return Math.min(6, baseHeadingLevel + offset);\n };\n const contentHeadingLevel = getContentHeadingLevel();\n const transformPrompt = (html) => (html && contentHeadingLevel) ? transformDataHeadings(html, contentHeadingLevel) : html;\n\n const teacherInstructionsDiv = (\n <PreviewPrompt\n tagName=\"div\"\n className=\"prompt\"\n defaultClassName=\"teacher-instructions\"\n prompt={teacherInstructions}\n />\n );\n\n const getMultipleChoiceMinSelectionErrorMessage = () => {\n if (minSelections && maxSelections) {\n return minSelections === maxSelections\n ? translator.t('translation:multipleChoice:minmaxSelections_equal', { lng: language, minSelections })\n : translator.t('translation:multipleChoice:minmaxSelections_range', {\n lng: language,\n minSelections,\n maxSelections,\n });\n }\n\n if (minSelections) {\n return translator.t('translation:multipleChoice:minSelections', { lng: language, minSelections });\n }\n\n return '';\n };\n\n const LayoutComponent = this.props.choicesLayout === 'grid'\n ? GridLayout\n : this.props.choicesLayout === 'horizontal'\n ? HorizontalLayout\n : Box;\n\n return (\n <MainContainer id={'main-container'} className={classNames(className, 'multiple-choice')}>\n {partLabel && <PartLabel as={baseHeadingLevel ? `h${Math.min(6, baseHeadingLevel + 1)}` : 'h2'}>{partLabel}</PartLabel>}\n\n {this.renderHeading()}\n\n {teacherInstructions && (\n <TeacherInstructions>\n {!animationsDisabled ? (\n <Collapsible\n labels={{\n hidden: 'Show Teacher Instructions',\n visible: 'Hide Teacher Instructions',\n }}\n >\n {teacherInstructionsDiv}\n </Collapsible>\n ) : (\n teacherInstructionsDiv\n )}\n </TeacherInstructions>\n )}\n\n <StyledFieldset role={choiceMode === 'radio' ? 'radiogroup' : 'group'}>\n <PreviewPrompt\n className=\"prompt\"\n defaultClassName=\"prompt\"\n prompt={transformPrompt(prompt)}\n tagName={'legend'}\n autoplayAudioEnabled={autoplayAudioEnabled}\n customAudioButton={customAudioButton}\n />\n\n {!(options && alwaysShowCorrect) && (\n <CorrectAnswerToggle\n show={showCorrectAnswerToggle}\n toggled={showCorrect}\n onToggle={this.onToggle.bind(this)}\n language={language}\n />\n )}\n\n <LayoutComponent style={columnsStyle}>\n {choices.map((choice, index) => (\n <Choice\n choicesLayout={this.props.choicesLayout}\n selectedAnswerBackgroundColor={this.props.selectedAnswerBackgroundColor}\n selectedAnswerStrokeColor={this.props.selectedAnswerStrokeColor}\n selectedAnswerStrokeWidth={this.props.selectedAnswerStrokeWidth}\n hoverAnswerBackgroundColor={this.props.hoverAnswerBackgroundColor}\n hoverAnswerStrokeColor={this.props.hoverAnswerStrokeColor}\n hoverAnswerStrokeWidth={this.props.hoverAnswerStrokeWidth}\n gridColumns={gridColumns}\n key={`choice-${index}`}\n choice={choice}\n index={index}\n choicesLength={choices.length}\n showCorrect={showCorrect}\n isEvaluateMode={isEvaluateMode}\n choiceMode={choiceMode}\n disabled={disabled}\n tagName={this.groupName}\n onChoiceChanged={this.handleChange}\n hideTick={choice.hideTick}\n checked={this.getChecked(choice)}\n correctness={isEvaluateMode ? this.getCorrectness(choice) : undefined}\n displayKey={this.indexToSymbol(index)}\n isSelectionButtonBelow={isSelectionButtonBelow}\n />\n ))}\n </LayoutComponent>\n </StyledFieldset>\n\n {choiceMode === 'checkbox' && selections < minSelections && (\n <ErrorText>{getMultipleChoiceMinSelectionErrorMessage()}</ErrorText>\n )}\n {choiceMode === 'checkbox' && maxSelectionsErrorState && (\n <ErrorText>\n {translator.t(`translation:multipleChoice:maxSelections_${maxSelections === 1 ? 'one' : 'other'}`, {\n lng: language,\n maxSelections,\n })}\n </ErrorText>\n )}\n </MainContainer>\n );\n }\n}\n\nMultipleChoice.defaultProps = {\n session: {\n value: [],\n },\n};\n\nexport default MultipleChoice;\n"],"mappings":"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","ignoreList":[]}
|
package/lib/print.js
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = void 0;
|
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
|
9
|
+
var _client = require("react-dom/client");
|
|
10
|
+
var _lodashEs = require("lodash-es");
|
|
11
|
+
var _main = _interopRequireDefault(require("./main"));
|
|
12
|
+
var _mathRendering = require("@pie-lib/math-rendering");
|
|
13
|
+
var _debug = _interopRequireDefault(require("debug"));
|
|
14
|
+
const log = (0, _debug.default)('pie-element:multiple-choice:print');
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Live in same package as main element - so we can access some of the shared comps!
|
|
18
|
+
*
|
|
19
|
+
* - update pslb to build print if src/print.js is there
|
|
20
|
+
* - update demo el
|
|
21
|
+
* - get configure/controller building
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
const preparePrintModel = (model, opts) => {
|
|
25
|
+
const instr = opts.role === 'instructor';
|
|
26
|
+
model.prompt = model.promptEnabled !== false ? model.prompt : undefined;
|
|
27
|
+
model.teacherInstructions = instr && model.teacherInstructionsEnabled !== false ? model.teacherInstructions : undefined;
|
|
28
|
+
model.showTeacherInstructions = instr;
|
|
29
|
+
model.alwaysShowCorrect = instr;
|
|
30
|
+
model.mode = instr ? 'evaluate' : model.mode;
|
|
31
|
+
model.disabled = true;
|
|
32
|
+
model.animationsDisabled = true;
|
|
33
|
+
model.lockChoiceOrder = true;
|
|
34
|
+
model.choicesLayout = model.choicesLayout || 'vertical';
|
|
35
|
+
const choices = (0, _lodashEs.cloneDeep)(model.choices);
|
|
36
|
+
model.choices = choices.map(c => {
|
|
37
|
+
c.rationale = instr && model.rationaleEnabled !== false ? c.rationale : undefined;
|
|
38
|
+
c.hideTick = instr;
|
|
39
|
+
c.feedback = undefined;
|
|
40
|
+
return c;
|
|
41
|
+
});
|
|
42
|
+
model.keyMode = model.choicePrefix || 'letters';
|
|
43
|
+
return model;
|
|
44
|
+
};
|
|
45
|
+
class MultipleChoicePrint extends HTMLElement {
|
|
46
|
+
constructor() {
|
|
47
|
+
super();
|
|
48
|
+
this._options = null;
|
|
49
|
+
this._model = null;
|
|
50
|
+
this._session = [];
|
|
51
|
+
this._root = null;
|
|
52
|
+
this._rerender = (0, _lodashEs.debounce)(() => {
|
|
53
|
+
if (this._model && this._session) {
|
|
54
|
+
const printModel = preparePrintModel(this._model, this._options);
|
|
55
|
+
const element = this._options && /*#__PURE__*/_react.default.createElement(_main.default, {
|
|
56
|
+
model: printModel,
|
|
57
|
+
session: {},
|
|
58
|
+
options: this._options
|
|
59
|
+
});
|
|
60
|
+
if (!this._root) {
|
|
61
|
+
this._root = (0, _client.createRoot)(this);
|
|
62
|
+
}
|
|
63
|
+
this._root.render(element);
|
|
64
|
+
// Use double requestAnimationFrame so React has committed to the DOM before we render math
|
|
65
|
+
requestAnimationFrame(() => {
|
|
66
|
+
requestAnimationFrame(() => {
|
|
67
|
+
log('render complete - render math');
|
|
68
|
+
(0, _mathRendering.renderMath)(this);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
} else {
|
|
72
|
+
log('skip');
|
|
73
|
+
}
|
|
74
|
+
}, 50, {
|
|
75
|
+
leading: false,
|
|
76
|
+
trailing: true
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
set options(o) {
|
|
80
|
+
this._options = o;
|
|
81
|
+
}
|
|
82
|
+
set model(s) {
|
|
83
|
+
this._model = s;
|
|
84
|
+
this._rerender();
|
|
85
|
+
}
|
|
86
|
+
connectedCallback() {}
|
|
87
|
+
disconnectedCallback() {
|
|
88
|
+
if (this._root) {
|
|
89
|
+
this._root.unmount();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
exports.default = MultipleChoicePrint;
|
|
94
|
+
//# sourceMappingURL=print.js.map
|
package/lib/print.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"print.js","names":["_react","_interopRequireDefault","require","_client","_lodashEs","_main","_mathRendering","_debug","log","debug","preparePrintModel","model","opts","instr","role","prompt","promptEnabled","undefined","teacherInstructions","teacherInstructionsEnabled","showTeacherInstructions","alwaysShowCorrect","mode","disabled","animationsDisabled","lockChoiceOrder","choicesLayout","choices","cloneDeep","map","c","rationale","rationaleEnabled","hideTick","feedback","keyMode","choicePrefix","MultipleChoicePrint","HTMLElement","constructor","_options","_model","_session","_root","_rerender","debounce","printModel","element","React","createElement","Main","session","options","createRoot","render","requestAnimationFrame","renderMath","leading","trailing","o","s","connectedCallback","disconnectedCallback","unmount","exports","default"],"sources":["../src/print.js"],"sourcesContent":["import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { cloneDeep, debounce } from 'lodash-es';\nimport Main from './main';\nimport { renderMath } from '@pie-lib/math-rendering';\nimport debug from 'debug';\n\nconst log = debug('pie-element:multiple-choice:print');\n\n/**\n * Live in same package as main element - so we can access some of the shared comps!\n *\n * - update pslb to build print if src/print.js is there\n * - update demo el\n * - get configure/controller building\n */\n\nconst preparePrintModel = (model, opts) => {\n const instr = opts.role === 'instructor';\n\n model.prompt = model.promptEnabled !== false ? model.prompt : undefined;\n model.teacherInstructions =\n instr && model.teacherInstructionsEnabled !== false ? model.teacherInstructions : undefined;\n model.showTeacherInstructions = instr;\n model.alwaysShowCorrect = instr;\n model.mode = instr ? 'evaluate' : model.mode;\n\n model.disabled = true;\n model.animationsDisabled = true;\n model.lockChoiceOrder = true;\n model.choicesLayout = model.choicesLayout || 'vertical';\n\n const choices = cloneDeep(model.choices);\n\n model.choices = choices.map((c) => {\n c.rationale = instr && model.rationaleEnabled !== false ? c.rationale : undefined;\n c.hideTick = instr;\n c.feedback = undefined;\n return c;\n });\n\n model.keyMode = model.choicePrefix || 'letters';\n\n return model;\n};\n\nexport default class MultipleChoicePrint extends HTMLElement {\n constructor() {\n super();\n this._options = null;\n this._model = null;\n this._session = [];\n this._root = null;\n this._rerender = debounce(\n () => {\n if (this._model && this._session) {\n const printModel = preparePrintModel(this._model, this._options);\n\n const element =\n this._options &&\n React.createElement(Main, {\n model: printModel,\n session: {},\n options: this._options,\n });\n\n if (!this._root) {\n this._root = createRoot(this);\n }\n this._root.render(element);\n // Use double requestAnimationFrame so React has committed to the DOM before we render math\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n log('render complete - render math');\n renderMath(this);\n });\n });\n } else {\n log('skip');\n }\n },\n 50,\n { leading: false, trailing: true },\n );\n }\n set options(o) {\n this._options = o;\n }\n\n set model(s) {\n this._model = s;\n this._rerender();\n }\n\n connectedCallback() {}\n\n disconnectedCallback() {\n if (this._root) {\n this._root.unmount();\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|