@pie-element/drag-in-the-blank 4.4.1 → 4.4.2-next.120

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.
@@ -38,27 +38,40 @@ GripIcon.propTypes = {
38
38
  var BlankContent = (0, _styles.withStyles)(function (theme) {
39
39
  return {
40
40
  choice: {
41
- border: "solid 0px ".concat(theme.palette.primary.main)
42
- },
43
- disabled: {}
44
- };
45
- })(function (props) {
46
- var connectDragSource = props.connectDragSource,
47
- choice = props.choice,
48
- onClick = props.onClick,
49
- onRemoveChoice = props.onRemoveChoice;
50
- return connectDragSource( /*#__PURE__*/_react["default"].createElement("div", {
51
- style: {
52
41
  display: 'inline-flex',
53
42
  minWidth: '178px',
54
43
  minHeight: '36px',
55
44
  background: '#FFF',
56
- border: '1px solid #C0C3CF',
57
45
  boxSizing: 'border-box',
58
46
  borderRadius: '3px',
59
47
  overflow: 'hidden',
60
48
  position: 'relative',
61
- padding: '8px 35px 8px 35px'
49
+ padding: '8px 35px 8px 35px',
50
+ cursor: 'grab'
51
+ },
52
+ deleteIcon: {
53
+ position: 'absolute',
54
+ top: '6px',
55
+ right: '0',
56
+ color: '#9B9B9B',
57
+ zIndex: 2,
58
+ '& :hover': {
59
+ cursor: 'pointer',
60
+ color: '#000000'
61
+ }
62
+ }
63
+ };
64
+ })(function (props) {
65
+ var classes = props.classes,
66
+ connectDragSource = props.connectDragSource,
67
+ choice = props.choice,
68
+ onClick = props.onClick,
69
+ onRemoveChoice = props.onRemoveChoice,
70
+ error = props.error;
71
+ return connectDragSource( /*#__PURE__*/_react["default"].createElement("div", {
72
+ className: classes.choice,
73
+ style: {
74
+ border: "1px solid ".concat(error ? 'red' : '#C0C3CF')
62
75
  },
63
76
  onClick: onClick
64
77
  }, /*#__PURE__*/_react["default"].createElement(GripIcon, {
@@ -74,13 +87,7 @@ var BlankContent = (0, _styles.withStyles)(function (theme) {
74
87
  __html: choice.value
75
88
  }
76
89
  }), /*#__PURE__*/_react["default"].createElement(_Delete["default"], {
77
- style: {
78
- position: 'absolute',
79
- top: '6px',
80
- right: '0',
81
- color: '#9B9B9B',
82
- zIndex: 2
83
- },
90
+ className: classes.deleteIcon,
84
91
  onClick: function onClick(e) {
85
92
  e.preventDefault();
86
93
  e.stopPropagation();
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/choice.jsx"],"names":["GripIcon","style","margin","propTypes","PropTypes","object","BlankContent","theme","choice","border","palette","primary","main","disabled","props","connectDragSource","onClick","onRemoveChoice","display","minWidth","minHeight","background","boxSizing","borderRadius","overflow","position","padding","top","left","color","zIndex","__html","value","right","e","preventDefault","stopPropagation","tileSource","canDrag","alert","beginDrag","id","targetId","instanceId","connect","monitor","dragSource","isDragging"],"mappings":"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","sourcesContent":["import React from 'react';\nimport MoreVert from '@material-ui/icons/MoreVert';\nimport Delete from '@material-ui/icons/Delete';\nimport { DragSource } from 'react-dnd';\nimport { withStyles } from '@material-ui/core/styles';\nimport { choiceIsEmpty } from './markupUtils';\nimport PropTypes from 'prop-types';\n\nconst GripIcon = ({ style }) => {\n return (\n <span style={style}>\n <MoreVert\n style={{\n margin: '0 -16px',\n }}\n />\n <MoreVert />\n </span>\n );\n};\n\nGripIcon.propTypes = {\n style: PropTypes.object,\n};\n\nexport const BlankContent = withStyles((theme) => ({\n choice: {\n border: `solid 0px ${theme.palette.primary.main}`,\n },\n disabled: {},\n}))((props) => {\n const { connectDragSource, choice, onClick, onRemoveChoice } = props;\n\n return connectDragSource(\n <div\n style={{\n display: 'inline-flex',\n minWidth: '178px',\n minHeight: '36px',\n background: '#FFF',\n border: '1px solid #C0C3CF',\n boxSizing: 'border-box',\n borderRadius: '3px',\n overflow: 'hidden',\n position: 'relative',\n padding: '8px 35px 8px 35px',\n }}\n onClick={onClick}\n >\n <GripIcon\n style={{\n position: 'absolute',\n top: '6px',\n left: '15px',\n color: '#9B9B9B',\n zIndex: 2,\n }}\n />\n <span\n dangerouslySetInnerHTML={{\n __html: choice.value,\n }}\n />\n <Delete\n style={{\n position: 'absolute',\n top: '6px',\n right: '0',\n color: '#9B9B9B',\n zIndex: 2,\n }}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n\n onRemoveChoice(e);\n }}\n />\n </div>,\n );\n});\n\nexport const tileSource = {\n canDrag(props) {\n if (choiceIsEmpty(props.choice)) {\n alert('You need to define a value for an answer choice before it can be associated with a response area.');\n return false;\n }\n\n return !props.disabled;\n },\n beginDrag(props) {\n return {\n id: props.targetId,\n value: props.choice,\n instanceId: props.instanceId,\n };\n },\n};\n\nexport default DragSource('drag-in-the-blank-choice', tileSource, (connect, monitor) => ({\n connectDragSource: connect.dragSource(),\n isDragging: monitor.isDragging(),\n}))(BlankContent);\n"],"file":"choice.js"}
1
+ {"version":3,"sources":["../src/choice.jsx"],"names":["GripIcon","style","margin","propTypes","PropTypes","object","BlankContent","theme","choice","display","minWidth","minHeight","background","boxSizing","borderRadius","overflow","position","padding","cursor","deleteIcon","top","right","color","zIndex","props","classes","connectDragSource","onClick","onRemoveChoice","error","border","left","__html","value","e","preventDefault","stopPropagation","tileSource","canDrag","alert","disabled","beginDrag","id","targetId","instanceId","connect","monitor","dragSource","isDragging"],"mappings":";;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAEA,IAAMA,QAAQ,GAAG,SAAXA,QAAW,OAAe;AAAA,MAAZC,KAAY,QAAZA,KAAY;AAC9B,sBACE;AAAM,IAAA,KAAK,EAAEA;AAAb,kBACE,gCAAC,oBAAD;AAAU,IAAA,KAAK,EAAE;AAAEC,MAAAA,MAAM,EAAE;AAAV;AAAjB,IADF,eAEE,gCAAC,oBAAD,OAFF,CADF;AAMD,CAPD;;AASAF,QAAQ,CAACG,SAAT,GAAqB;AACnBF,EAAAA,KAAK,EAAEG,sBAAUC;AADE,CAArB;AAIO,IAAMC,YAAY,GAAG,wBAAW,UAACC,KAAD;AAAA,SAAY;AACjDC,IAAAA,MAAM,EAAE;AACNC,MAAAA,OAAO,EAAE,aADH;AAENC,MAAAA,QAAQ,EAAE,OAFJ;AAGNC,MAAAA,SAAS,EAAE,MAHL;AAINC,MAAAA,UAAU,EAAE,MAJN;AAKNC,MAAAA,SAAS,EAAE,YALL;AAMNC,MAAAA,YAAY,EAAE,KANR;AAONC,MAAAA,QAAQ,EAAE,QAPJ;AAQNC,MAAAA,QAAQ,EAAE,UARJ;AASNC,MAAAA,OAAO,EAAE,mBATH;AAUNC,MAAAA,MAAM,EAAE;AAVF,KADyC;AAajDC,IAAAA,UAAU,EAAE;AACVH,MAAAA,QAAQ,EAAE,UADA;AAEVI,MAAAA,GAAG,EAAE,KAFK;AAGVC,MAAAA,KAAK,EAAE,GAHG;AAIVC,MAAAA,KAAK,EAAE,SAJG;AAKVC,MAAAA,MAAM,EAAE,CALE;AAOV,kBAAY;AACVL,QAAAA,MAAM,EAAE,SADE;AAEVI,QAAAA,KAAK,EAAE;AAFG;AAPF;AAbqC,GAAZ;AAAA,CAAX,EAyBxB,UAACE,KAAD,EAAW;AACb,MAAQC,OAAR,GAA+ED,KAA/E,CAAQC,OAAR;AAAA,MAAiBC,iBAAjB,GAA+EF,KAA/E,CAAiBE,iBAAjB;AAAA,MAAoClB,MAApC,GAA+EgB,KAA/E,CAAoChB,MAApC;AAAA,MAA4CmB,OAA5C,GAA+EH,KAA/E,CAA4CG,OAA5C;AAAA,MAAqDC,cAArD,GAA+EJ,KAA/E,CAAqDI,cAArD;AAAA,MAAqEC,KAArE,GAA+EL,KAA/E,CAAqEK,KAArE;AAEA,SAAOH,iBAAiB,eACtB;AAAK,IAAA,SAAS,EAAED,OAAO,CAACjB,MAAxB;AAAgC,IAAA,KAAK,EAAE;AAAEsB,MAAAA,MAAM,sBAAeD,KAAK,GAAG,KAAH,GAAW,SAA/B;AAAR,KAAvC;AAA6F,IAAA,OAAO,EAAEF;AAAtG,kBACE,gCAAC,QAAD;AACE,IAAA,KAAK,EAAE;AACLX,MAAAA,QAAQ,EAAE,UADL;AAELI,MAAAA,GAAG,EAAE,KAFA;AAGLW,MAAAA,IAAI,EAAE,MAHD;AAILT,MAAAA,KAAK,EAAE,SAJF;AAKLC,MAAAA,MAAM,EAAE;AALH;AADT,IADF,eAWE;AAAM,IAAA,uBAAuB,EAAE;AAAES,MAAAA,MAAM,EAAExB,MAAM,CAACyB;AAAjB;AAA/B,IAXF,eAaE,gCAAC,kBAAD;AACE,IAAA,SAAS,EAAER,OAAO,CAACN,UADrB;AAEE,IAAA,OAAO,EAAE,iBAACe,CAAD,EAAO;AACdA,MAAAA,CAAC,CAACC,cAAF;AACAD,MAAAA,CAAC,CAACE,eAAF;AAEAR,MAAAA,cAAc,CAACM,CAAD,CAAd;AACD;AAPH,IAbF,CADsB,CAAxB;AAyBD,CArD2B,CAArB;;AAuDA,IAAMG,UAAU,GAAG;AACxBC,EAAAA,OADwB,mBAChBd,KADgB,EACT;AACb,QAAI,gCAAcA,KAAK,CAAChB,MAApB,CAAJ,EAAiC;AAC/B+B,MAAAA,KAAK,CAAC,mGAAD,CAAL;AACA,aAAO,KAAP;AACD;;AAED,WAAO,CAACf,KAAK,CAACgB,QAAd;AACD,GARuB;AASxBC,EAAAA,SATwB,qBASdjB,KATc,EASP;AACf,WAAO;AACLkB,MAAAA,EAAE,EAAElB,KAAK,CAACmB,QADL;AAELV,MAAAA,KAAK,EAAET,KAAK,CAAChB,MAFR;AAGLoC,MAAAA,UAAU,EAAEpB,KAAK,CAACoB;AAHb,KAAP;AAKD;AAfuB,CAAnB;;;eAkBQ,0BAAW,0BAAX,EAAuCP,UAAvC,EAAmD,UAACQ,OAAD,EAAUC,OAAV;AAAA,SAAuB;AACvFpB,IAAAA,iBAAiB,EAAEmB,OAAO,CAACE,UAAR,EADoE;AAEvFC,IAAAA,UAAU,EAAEF,OAAO,CAACE,UAAR;AAF2E,GAAvB;AAAA,CAAnD,EAGX1C,YAHW,C","sourcesContent":["import React from 'react';\nimport MoreVert from '@material-ui/icons/MoreVert';\nimport Delete from '@material-ui/icons/Delete';\nimport { DragSource } from 'react-dnd';\nimport { withStyles } from '@material-ui/core/styles';\nimport { choiceIsEmpty } from './markupUtils';\nimport PropTypes from 'prop-types';\n\nconst GripIcon = ({ style }) => {\n return (\n <span style={style}>\n <MoreVert style={{ margin: '0 -16px' }} />\n <MoreVert />\n </span>\n );\n};\n\nGripIcon.propTypes = {\n style: PropTypes.object,\n};\n\nexport const BlankContent = withStyles((theme) => ({\n choice: {\n display: 'inline-flex',\n minWidth: '178px',\n minHeight: '36px',\n background: '#FFF',\n boxSizing: 'border-box',\n borderRadius: '3px',\n overflow: 'hidden',\n position: 'relative',\n padding: '8px 35px 8px 35px',\n cursor: 'grab',\n },\n deleteIcon: {\n position: 'absolute',\n top: '6px',\n right: '0',\n color: '#9B9B9B',\n zIndex: 2,\n\n '& :hover': {\n cursor: 'pointer',\n color: '#000000',\n },\n },\n}))((props) => {\n const { classes, connectDragSource, choice, onClick, onRemoveChoice, error } = props;\n\n return connectDragSource(\n <div className={classes.choice} style={{ border: `1px solid ${error ? 'red' : '#C0C3CF'}` }} onClick={onClick}>\n <GripIcon\n style={{\n position: 'absolute',\n top: '6px',\n left: '15px',\n color: '#9B9B9B',\n zIndex: 2,\n }}\n />\n\n <span dangerouslySetInnerHTML={{ __html: choice.value }} />\n\n <Delete\n className={classes.deleteIcon}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n\n onRemoveChoice(e);\n }}\n />\n </div>,\n );\n});\n\nexport const tileSource = {\n canDrag(props) {\n if (choiceIsEmpty(props.choice)) {\n alert('You need to define a value for an answer choice before it can be associated with a response area.');\n return false;\n }\n\n return !props.disabled;\n },\n beginDrag(props) {\n return {\n id: props.targetId,\n value: props.choice,\n instanceId: props.instanceId,\n };\n },\n};\n\nexport default DragSource('drag-in-the-blank-choice', tileSource, (connect, monitor) => ({\n connectDragSource: connect.dragSource(),\n isDragging: monitor.isDragging(),\n}))(BlankContent);\n"],"file":"choice.js"}
@@ -43,11 +43,7 @@ var _markupUtils = require("./markupUtils");
43
43
 
44
44
  var _styles = require("@material-ui/core/styles");
45
45
 
46
- var _Dialog = _interopRequireDefault(require("@material-ui/core/Dialog"));
47
-
48
- var _DialogTitle = _interopRequireDefault(require("@material-ui/core/DialogTitle"));
49
-
50
- var _DialogActions = _interopRequireDefault(require("@material-ui/core/DialogActions"));
46
+ var _configUi = require("@pie-lib/config-ui");
51
47
 
52
48
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
53
49
 
@@ -59,24 +55,6 @@ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Re
59
55
 
60
56
  window.renMath = _mathRendering.renderMath;
61
57
 
62
- var InfoDialog = function InfoDialog(_ref) {
63
- var open = _ref.open,
64
- title = _ref.title,
65
- onOk = _ref.onOk;
66
- return /*#__PURE__*/_react["default"].createElement(_Dialog["default"], {
67
- open: open
68
- }, /*#__PURE__*/_react["default"].createElement(_DialogTitle["default"], null, title || ''), /*#__PURE__*/_react["default"].createElement(_DialogActions["default"], null, onOk && /*#__PURE__*/_react["default"].createElement(_Button["default"], {
69
- onClick: onOk,
70
- color: "primary"
71
- }, "OK")));
72
- };
73
-
74
- InfoDialog.propTypes = {
75
- open: _propTypes["default"].bool,
76
- onOk: _propTypes["default"].func,
77
- title: _propTypes["default"].string
78
- };
79
-
80
58
  var styles = function styles(theme) {
81
59
  return {
82
60
  design: {
@@ -87,10 +65,15 @@ var styles = function styles(theme) {
87
65
  display: 'flex',
88
66
  flexWrap: 'wrap',
89
67
  justifyContent: 'space-evenly',
90
- padding: '20px 0 0 0',
68
+ margin: "".concat(theme.spacing.unit, "px 0"),
91
69
  '& > *': {
92
- marginBottom: '20px'
70
+ margin: theme.spacing.unit
93
71
  }
72
+ },
73
+ errorText: {
74
+ fontSize: theme.typography.fontSize - 2,
75
+ color: 'red',
76
+ paddingBottom: theme.spacing.unit * 2
94
77
  }
95
78
  };
96
79
  };
@@ -111,9 +94,7 @@ var Choices = /*#__PURE__*/function (_React$Component) {
111
94
 
112
95
  _this = _super.call.apply(_super, [this].concat(args));
113
96
  (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "state", {
114
- dialog: {
115
- open: false
116
- }
97
+ showWarning: false
117
98
  });
118
99
  (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "rerenderMath", function () {
119
100
  //eslint-disable-next-line
@@ -143,31 +124,17 @@ var Choices = /*#__PURE__*/function (_React$Component) {
143
124
  }
144
125
 
145
126
  _this.setState({
146
- dialog: {
147
- open: true,
148
- message: 'Identical answer choices are not allowed and the changes will be discarded',
149
- onOk: function onOk() {
150
- return _this.setState({
151
- dialog: {
152
- open: false
153
- }
154
- });
155
- }
156
- }
127
+ showWarning: true
157
128
  });
158
129
 
159
130
  return;
160
131
  }
161
132
 
162
- var newChoices = choices ? choices.map(function (c) {
163
- if (c.id === key) {
164
- return _objectSpread(_objectSpread({}, c), {}, {
165
- value: val
166
- });
167
- }
168
-
169
- return c;
170
- }) : [];
133
+ var newChoices = (choices === null || choices === void 0 ? void 0 : choices.map(function (choice) {
134
+ return choice.id === key ? _objectSpread(_objectSpread({}, choice), {}, {
135
+ value: val
136
+ }) : choice;
137
+ })) || [];
171
138
 
172
139
  if ((0, _markupUtils.choiceIsEmpty)({
173
140
  value: val
@@ -229,12 +196,12 @@ var Choices = /*#__PURE__*/function (_React$Component) {
229
196
  }]));
230
197
  });
231
198
  });
232
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleChoiceRemove", function (id) {
199
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onChoiceRemove", function (id) {
233
200
  var _this$props3 = _this.props,
234
201
  onChange = _this$props3.onChange,
235
202
  choices = _this$props3.model.choices;
236
- var newChoices = choices.filter(function (c) {
237
- return c.id !== id;
203
+ var newChoices = (choices || []).filter(function (choice) {
204
+ return choice.id !== id;
238
205
  });
239
206
  onChange(newChoices);
240
207
  });
@@ -284,22 +251,19 @@ var Choices = /*#__PURE__*/function (_React$Component) {
284
251
 
285
252
  var _this$state = this.state,
286
253
  focusedEl = _this$state.focusedEl,
287
- dialog = _this$state.dialog;
254
+ showWarning = _this$state.showWarning;
288
255
  var _this$props5 = this.props,
289
256
  classes = _this$props5.classes,
290
257
  duplicates = _this$props5.duplicates,
291
- toolbarOpts = _this$props5.toolbarOpts,
258
+ error = _this$props5.error,
292
259
  maxChoices = _this$props5.maxChoices,
293
260
  choices = _this$props5.model.choices,
261
+ toolbarOpts = _this$props5.toolbarOpts,
294
262
  uploadSoundSupport = _this$props5.uploadSoundSupport;
295
263
  var visibleChoices = this.getVisibleChoices() || [];
296
264
  return /*#__PURE__*/_react["default"].createElement("div", {
297
265
  className: classes.design
298
- }, /*#__PURE__*/_react["default"].createElement(InfoDialog, {
299
- open: dialog.open,
300
- title: dialog.message,
301
- onOk: dialog.onOk
302
- }), /*#__PURE__*/_react["default"].createElement(_Button["default"], {
266
+ }, /*#__PURE__*/_react["default"].createElement(_Button["default"], {
303
267
  className: classes.addButton,
304
268
  variant: "contained",
305
269
  color: "primary",
@@ -307,55 +271,63 @@ var Choices = /*#__PURE__*/function (_React$Component) {
307
271
  disabled: maxChoices && choices && maxChoices === choices.length
308
272
  }, "Add Choice"), /*#__PURE__*/_react["default"].createElement("div", {
309
273
  className: classes.altChoices
310
- }, visibleChoices.map(function (c, index) {
311
- if (focusedEl === c.id) {
312
- return /*#__PURE__*/_react["default"].createElement("div", {
313
- key: index,
314
- style: {
315
- minWidth: '100%',
316
- zIndex: '100'
317
- }
318
- }, /*#__PURE__*/_react["default"].createElement(_editableHtml["default"], {
319
- ref: function ref(_ref2) {
320
- return _this2.focusedNodeRef = _ref2;
321
- },
322
- className: classes.prompt,
323
- markup: c.value,
324
- pluginProps: {
325
- video: {
326
- disabled: true
327
- },
328
- audio: {
329
- disabled: true
330
- }
331
- },
332
- onChange: function onChange(val) {
333
- return _this2.onChoiceChanged(c.value, val, c.id);
334
- },
335
- onDone: function onDone() {
336
- _this2.setState({
337
- focusedEl: undefined
338
- });
274
+ }, visibleChoices.map(function (choice, index) {
275
+ return focusedEl === choice.id ? /*#__PURE__*/_react["default"].createElement("div", {
276
+ key: index,
277
+ style: {
278
+ minWidth: '100%',
279
+ zIndex: '100'
280
+ }
281
+ }, /*#__PURE__*/_react["default"].createElement(_editableHtml["default"], {
282
+ ref: function ref(_ref) {
283
+ return _this2.focusedNodeRef = _ref;
284
+ },
285
+ className: classes.prompt,
286
+ markup: choice.value,
287
+ pluginProps: {
288
+ video: {
289
+ disabled: true
339
290
  },
340
- disableUnderline: true,
341
- toolbarOpts: toolbarOpts,
342
- uploadSoundSupport: uploadSoundSupport
343
- }));
344
- }
345
-
346
- return /*#__PURE__*/_react["default"].createElement(_choice["default"], {
291
+ audio: {
292
+ disabled: true
293
+ }
294
+ },
295
+ onChange: function onChange(val) {
296
+ return _this2.onChoiceChanged(choice.value, val, choice.id);
297
+ },
298
+ onDone: function onDone() {
299
+ _this2.setState({
300
+ focusedEl: undefined
301
+ });
302
+ },
303
+ disableUnderline: true,
304
+ toolbarOpts: toolbarOpts,
305
+ uploadSoundSupport: uploadSoundSupport
306
+ })) : /*#__PURE__*/_react["default"].createElement(_choice["default"], {
347
307
  key: index,
348
308
  duplicates: duplicates,
349
309
  targetId: "0",
350
- choice: c,
310
+ choice: choice,
311
+ error: error,
351
312
  onClick: function onClick() {
352
- return _this2.onChoiceFocus(c.id);
313
+ return _this2.onChoiceFocus(choice.id);
353
314
  },
354
315
  onRemoveChoice: function onRemoveChoice() {
355
- return _this2.handleChoiceRemove(c.id);
316
+ return _this2.onChoiceRemove(choice.id);
356
317
  }
357
318
  });
358
- })));
319
+ })), error && /*#__PURE__*/_react["default"].createElement("div", {
320
+ className: classes.errorText
321
+ }, error), /*#__PURE__*/_react["default"].createElement(_configUi.AlertDialog, {
322
+ open: showWarning,
323
+ title: "Warning",
324
+ text: "Identical answer choices are not allowed and the changes will be discarded.",
325
+ onConfirm: function onConfirm() {
326
+ return _this2.setState({
327
+ showWarning: false
328
+ });
329
+ }
330
+ }));
359
331
  }
360
332
  }]);
361
333
  return Choices;
@@ -364,6 +336,7 @@ var Choices = /*#__PURE__*/function (_React$Component) {
364
336
  exports.Choices = Choices;
365
337
  (0, _defineProperty2["default"])(Choices, "propTypes", {
366
338
  duplicates: _propTypes["default"].bool,
339
+ error: _propTypes["default"].string,
367
340
  model: _propTypes["default"].object.isRequired,
368
341
  onChange: _propTypes["default"].func.isRequired,
369
342
  classes: _propTypes["default"].object.isRequired,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/choices.jsx"],"names":["window","renMath","renderMath","InfoDialog","open","title","onOk","propTypes","PropTypes","bool","func","string","styles","theme","design","marginTop","spacing","unit","altChoices","alignItems","display","flexWrap","justifyContent","padding","marginBottom","Choices","dialog","domNode","ReactDOM","findDOMNode","prevValue","val","key","props","onChange","model","choices","correctResponse","alternateResponses","duplicatedValue","find","c","value","id","newChoices","filter","setState","message","map","usedForResponse","Object","keys","forEach","responseKey","values","alternate","indexOf","alert","newChoicesWithoutTheEmptyOne","choice","focusedEl","oldChoices","length","duplicates","v","rerenderMath","focusedNodeRef","focus","state","classes","toolbarOpts","maxChoices","uploadSoundSupport","visibleChoices","getVisibleChoices","addButton","onAddChoice","index","minWidth","zIndex","ref","prompt","video","disabled","audio","onChoiceChanged","undefined","onChoiceFocus","handleChoiceRemove","React","Component","object","isRequired","number","Styled"],"mappings":"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","sourcesContent":["import React from 'react';\nimport ReactDOM from 'react-dom';\nimport PropTypes from 'prop-types';\nimport EditableHtml from '@pie-lib/editable-html';\nimport { renderMath } from '@pie-lib/math-rendering';\nimport find from 'lodash/find';\nimport Button from '@material-ui/core/Button';\nimport Choice from './choice';\nimport { choiceIsEmpty } from './markupUtils';\nimport { withStyles } from '@material-ui/core/styles';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport DialogActions from '@material-ui/core/DialogActions';\n\nwindow.renMath = renderMath;\n\nconst InfoDialog = ({ open, title, onOk }) => (\n <Dialog open={open}>\n <DialogTitle>{title || ''}</DialogTitle>\n <DialogActions>\n {onOk && (\n <Button onClick={onOk} color=\"primary\">\n OK\n </Button>\n )}\n </DialogActions>\n </Dialog>\n);\n\nInfoDialog.propTypes = {\n open: PropTypes.bool,\n onOk: PropTypes.func,\n title: PropTypes.string,\n};\n\nconst styles = (theme) => ({\n design: {\n marginTop: theme.spacing.unit * 2,\n },\n altChoices: {\n alignItems: 'flex-start',\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'space-evenly',\n padding: '20px 0 0 0',\n '& > *': {\n marginBottom: '20px',\n },\n },\n});\n\nexport class Choices extends React.Component {\n static propTypes = {\n duplicates: PropTypes.bool,\n model: PropTypes.object.isRequired,\n onChange: PropTypes.func.isRequired,\n classes: PropTypes.object.isRequired,\n toolbarOpts: PropTypes.object,\n maxChoices: PropTypes.number,\n uploadSoundSupport: PropTypes.object,\n };\n\n state = {\n dialog: {\n open: false,\n },\n };\n\n componentDidMount() {\n this.rerenderMath();\n }\n\n componentDidUpdate() {\n this.rerenderMath();\n\n if (this.focusedNodeRef) {\n this.focusedNodeRef.focus('end');\n }\n }\n\n rerenderMath = () => {\n //eslint-disable-next-line\n const domNode = ReactDOM.findDOMNode(this);\n\n renderMath(domNode);\n };\n\n onChoiceChanged = (prevValue, val, key) => {\n const { onChange, model } = this.props;\n const { choices, correctResponse, alternateResponses } = model;\n const duplicatedValue = (choices || []).find((c) => c.value === val && c.id !== key);\n\n // discard the new added choice or the changes if the choice would be a duplicate to one that already exists\n if (duplicatedValue) {\n if (prevValue === '') {\n // remove the new added choice from choices\n const newChoices = (choices || []).filter((c) => c.id !== key);\n\n onChange(newChoices);\n }\n\n this.setState({\n dialog: {\n open: true,\n message: 'Identical answer choices are not allowed and the changes will be discarded',\n onOk: () => this.setState({ dialog: { open: false } }),\n },\n });\n\n return;\n }\n\n const newChoices = choices\n ? choices.map((c) => {\n if (c.id === key) {\n return { ...c, value: val };\n }\n\n return c;\n })\n : [];\n\n if (choiceIsEmpty({ value: val })) {\n // if the edited content is empty, its usage has to be searched in the correct response definitions\n let usedForResponse = false;\n\n if (correctResponse) {\n Object.keys(correctResponse).forEach((responseKey) => {\n if (correctResponse[responseKey] === key) {\n usedForResponse = true;\n }\n });\n }\n\n if (alternateResponses) {\n Object.values(alternateResponses).forEach((alternate) => {\n if (alternate.indexOf(key) >= 0) {\n usedForResponse = true;\n }\n });\n }\n\n if (usedForResponse) {\n alert('Answer choices cannot be blank.');\n } else {\n if (!choiceIsEmpty({ value: prevValue })) {\n // if the previous value was not empty, it means that the choice can be deleted\n const newChoicesWithoutTheEmptyOne = newChoices.filter((choice) => choice.id !== key);\n\n onChange(newChoicesWithoutTheEmptyOne);\n } else {\n onChange(newChoices);\n }\n }\n } else {\n onChange(newChoices);\n }\n };\n\n onChoiceFocus = (id) =>\n this.setState({\n focusedEl: id,\n });\n\n onAddChoice = () => {\n const {\n model: { choices: oldChoices },\n onChange,\n } = this.props;\n\n this.setState(\n {\n focusedEl: `${oldChoices.length}`,\n },\n () => {\n onChange([\n ...oldChoices,\n {\n id: `${oldChoices.length}`,\n value: '',\n },\n ]);\n },\n );\n };\n\n handleChoiceRemove = (id) => {\n const {\n onChange,\n model: { choices },\n } = this.props;\n const newChoices = choices.filter((c) => c.id !== id);\n\n onChange(newChoices);\n };\n\n getVisibleChoices = () => {\n const {\n duplicates,\n model: { choices, correctResponse },\n } = this.props;\n\n if (!choices) {\n return [];\n }\n\n if (duplicates) {\n return choices;\n }\n\n // if duplicates not allowed, remove the choices that are used to define the correct response\n return choices.filter((choice) => !find(correctResponse, (v) => v === choice.id));\n };\n\n render() {\n const { focusedEl, dialog } = this.state;\n const {\n classes,\n duplicates,\n toolbarOpts,\n maxChoices,\n model: { choices },\n uploadSoundSupport,\n } = this.props;\n const visibleChoices = this.getVisibleChoices() || [];\n\n return (\n <div className={classes.design}>\n <InfoDialog open={dialog.open} title={dialog.message} onOk={dialog.onOk} />\n <Button\n className={classes.addButton}\n variant=\"contained\"\n color=\"primary\"\n onClick={this.onAddChoice}\n disabled={maxChoices && choices && maxChoices === choices.length}\n >\n Add Choice\n </Button>\n <div className={classes.altChoices}>\n {visibleChoices.map((c, index) => {\n if (focusedEl === c.id) {\n return (\n <div\n key={index}\n style={{\n minWidth: '100%',\n zIndex: '100',\n }}\n >\n <EditableHtml\n ref={(ref) => (this.focusedNodeRef = ref)}\n className={classes.prompt}\n markup={c.value}\n pluginProps={{\n video: {\n disabled: true,\n },\n audio: {\n disabled: true,\n },\n }}\n onChange={(val) => this.onChoiceChanged(c.value, val, c.id)}\n onDone={() => {\n this.setState({\n focusedEl: undefined,\n });\n }}\n disableUnderline\n toolbarOpts={toolbarOpts}\n uploadSoundSupport={uploadSoundSupport}\n />\n </div>\n );\n }\n\n return (\n <Choice\n key={index}\n duplicates={duplicates}\n targetId=\"0\"\n choice={c}\n onClick={() => this.onChoiceFocus(c.id)}\n onRemoveChoice={() => this.handleChoiceRemove(c.id)}\n />\n );\n })}\n </div>\n </div>\n );\n }\n}\n\nconst Styled = withStyles(styles)(Choices);\n\nexport default Styled;\n"],"file":"choices.js"}
1
+ {"version":3,"sources":["../src/choices.jsx"],"names":["window","renMath","renderMath","styles","theme","design","marginTop","spacing","unit","altChoices","alignItems","display","flexWrap","justifyContent","margin","errorText","fontSize","typography","color","paddingBottom","Choices","showWarning","domNode","ReactDOM","findDOMNode","prevValue","val","key","props","onChange","model","choices","correctResponse","alternateResponses","duplicatedValue","find","c","value","id","newChoices","filter","setState","map","choice","usedForResponse","Object","keys","forEach","responseKey","values","alternate","indexOf","alert","newChoicesWithoutTheEmptyOne","focusedEl","oldChoices","length","duplicates","v","rerenderMath","focusedNodeRef","focus","state","classes","error","maxChoices","toolbarOpts","uploadSoundSupport","visibleChoices","getVisibleChoices","addButton","onAddChoice","index","minWidth","zIndex","ref","prompt","video","disabled","audio","onChoiceChanged","undefined","onChoiceFocus","onChoiceRemove","React","Component","PropTypes","bool","string","object","isRequired","func","number","Styled"],"mappings":"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","sourcesContent":["import React from 'react';\nimport ReactDOM from 'react-dom';\nimport PropTypes from 'prop-types';\nimport EditableHtml from '@pie-lib/editable-html';\nimport { renderMath } from '@pie-lib/math-rendering';\nimport find from 'lodash/find';\nimport Button from '@material-ui/core/Button';\nimport Choice from './choice';\nimport { choiceIsEmpty } from './markupUtils';\nimport { withStyles } from '@material-ui/core/styles';\nimport { AlertDialog } from '@pie-lib/config-ui';\n\nwindow.renMath = renderMath;\n\nconst styles = (theme) => ({\n design: {\n marginTop: theme.spacing.unit * 2,\n },\n altChoices: {\n alignItems: 'flex-start',\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'space-evenly',\n margin: `${theme.spacing.unit}px 0`,\n\n '& > *': {\n margin: theme.spacing.unit,\n },\n },\n errorText: {\n fontSize: theme.typography.fontSize - 2,\n color: 'red',\n paddingBottom: theme.spacing.unit * 2,\n },\n});\n\nexport class Choices extends React.Component {\n static propTypes = {\n duplicates: PropTypes.bool,\n error: PropTypes.string,\n model: PropTypes.object.isRequired,\n onChange: PropTypes.func.isRequired,\n classes: PropTypes.object.isRequired,\n toolbarOpts: PropTypes.object,\n maxChoices: PropTypes.number,\n uploadSoundSupport: PropTypes.object,\n };\n\n state = { showWarning: false };\n\n componentDidMount() {\n this.rerenderMath();\n }\n\n componentDidUpdate() {\n this.rerenderMath();\n\n if (this.focusedNodeRef) {\n this.focusedNodeRef.focus('end');\n }\n }\n\n rerenderMath = () => {\n //eslint-disable-next-line\n const domNode = ReactDOM.findDOMNode(this);\n\n renderMath(domNode);\n };\n\n onChoiceChanged = (prevValue, val, key) => {\n const { onChange, model } = this.props;\n const { choices, correctResponse, alternateResponses } = model;\n const duplicatedValue = (choices || []).find((c) => c.value === val && c.id !== key);\n\n // discard the new added choice or the changes if the choice would be a duplicate to one that already exists\n if (duplicatedValue) {\n if (prevValue === '') {\n // remove the new added choice from choices\n const newChoices = (choices || []).filter((c) => c.id !== key);\n\n onChange(newChoices);\n }\n\n this.setState({ showWarning: true });\n\n return;\n }\n\n const newChoices = choices?.map((choice) => (choice.id === key ? { ...choice, value: val } : choice)) || [];\n\n if (choiceIsEmpty({ value: val })) {\n // if the edited content is empty, its usage has to be searched in the correct response definitions\n let usedForResponse = false;\n\n if (correctResponse) {\n Object.keys(correctResponse).forEach((responseKey) => {\n if (correctResponse[responseKey] === key) {\n usedForResponse = true;\n }\n });\n }\n\n if (alternateResponses) {\n Object.values(alternateResponses).forEach((alternate) => {\n if (alternate.indexOf(key) >= 0) {\n usedForResponse = true;\n }\n });\n }\n\n if (usedForResponse) {\n alert('Answer choices cannot be blank.');\n } else {\n if (!choiceIsEmpty({ value: prevValue })) {\n // if the previous value was not empty, it means that the choice can be deleted\n const newChoicesWithoutTheEmptyOne = newChoices.filter((choice) => choice.id !== key);\n\n onChange(newChoicesWithoutTheEmptyOne);\n } else {\n onChange(newChoices);\n }\n }\n } else {\n onChange(newChoices);\n }\n };\n\n onChoiceFocus = (id) =>\n this.setState({\n focusedEl: id,\n });\n\n onAddChoice = () => {\n const {\n model: { choices: oldChoices },\n onChange,\n } = this.props;\n\n this.setState(\n {\n focusedEl: `${oldChoices.length}`,\n },\n () => {\n onChange([\n ...oldChoices,\n {\n id: `${oldChoices.length}`,\n value: '',\n },\n ]);\n },\n );\n };\n\n onChoiceRemove = (id) => {\n const {\n onChange,\n model: { choices },\n } = this.props;\n const newChoices = (choices || []).filter((choice) => choice.id !== id);\n\n onChange(newChoices);\n };\n\n getVisibleChoices = () => {\n const {\n duplicates,\n model: { choices, correctResponse },\n } = this.props;\n\n if (!choices) {\n return [];\n }\n\n if (duplicates) {\n return choices;\n }\n\n // if duplicates not allowed, remove the choices that are used to define the correct response\n return choices.filter((choice) => !find(correctResponse, (v) => v === choice.id));\n };\n\n render() {\n const { focusedEl, showWarning } = this.state;\n const {\n classes,\n duplicates,\n error,\n maxChoices,\n model: { choices },\n toolbarOpts,\n uploadSoundSupport,\n } = this.props;\n const visibleChoices = this.getVisibleChoices() || [];\n\n return (\n <div className={classes.design}>\n <Button\n className={classes.addButton}\n variant=\"contained\"\n color=\"primary\"\n onClick={this.onAddChoice}\n disabled={maxChoices && choices && maxChoices === choices.length}\n >\n Add Choice\n </Button>\n\n <div className={classes.altChoices}>\n {visibleChoices.map((choice, index) =>\n focusedEl === choice.id ? (\n <div\n key={index}\n style={{\n minWidth: '100%',\n zIndex: '100',\n }}\n >\n <EditableHtml\n ref={(ref) => (this.focusedNodeRef = ref)}\n className={classes.prompt}\n markup={choice.value}\n pluginProps={{\n video: {\n disabled: true,\n },\n audio: {\n disabled: true,\n },\n }}\n onChange={(val) => this.onChoiceChanged(choice.value, val, choice.id)}\n onDone={() => {\n this.setState({\n focusedEl: undefined,\n });\n }}\n disableUnderline\n toolbarOpts={toolbarOpts}\n uploadSoundSupport={uploadSoundSupport}\n />\n </div>\n ) : (\n <Choice\n key={index}\n duplicates={duplicates}\n targetId=\"0\"\n choice={choice}\n error={error}\n onClick={() => this.onChoiceFocus(choice.id)}\n onRemoveChoice={() => this.onChoiceRemove(choice.id)}\n />\n ),\n )}\n </div>\n {error && <div className={classes.errorText}>{error}</div>}\n\n <AlertDialog\n open={showWarning}\n title=\"Warning\"\n text=\"Identical answer choices are not allowed and the changes will be discarded.\"\n onConfirm={() => this.setState({ showWarning: false })}\n />\n </div>\n );\n }\n}\n\nconst Styled = withStyles(styles)(Choices);\n\nexport default Styled;\n"],"file":"choices.js"}
@@ -50,6 +50,7 @@ var _default = {
50
50
  settings: true,
51
51
  label: 'Rationale'
52
52
  },
53
+ settingsPanelDisabled: false,
53
54
  teacherInstructions: {
54
55
  settings: true,
55
56
  label: 'Teacher Instructions'
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/defaults.js"],"names":["model","disabled","mode","prompt","markup","choices","choicesPosition","correctResponse","duplicates","rationaleEnabled","promptEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","toolbarEditorPosition","configuration","spellCheck","label","settings","enabled","lockChoiceOrder","partialScoring","rationale","teacherInstructions","minChoices","maxResponseAreas","maxImageWidth","maxImageHeight","withRubric"],"mappings":";;;;;;eAAe;AACbA,EAAAA,KAAK,EAAE;AACLC,IAAAA,QAAQ,EAAE,KADL;AAELC,IAAAA,IAAI,EAAE,QAFD;AAGLC,IAAAA,MAAM,EAAE,yCAHH;AAILC,IAAAA,MAAM,EAAE,EAJH;AAKLC,IAAAA,OAAO,EAAE,EALJ;AAMLC,IAAAA,eAAe,EAAE,OANZ;AAOLC,IAAAA,eAAe,EAAE,EAPZ;AAQLC,IAAAA,UAAU,EAAE,IARP;AASLC,IAAAA,gBAAgB,EAAE,IATb;AAULC,IAAAA,aAAa,EAAE,IAVV;AAWLC,IAAAA,0BAA0B,EAAE,IAXvB;AAYLC,IAAAA,0BAA0B,EAAE,IAZvB;AAaLC,IAAAA,qBAAqB,EAAE;AAblB,GADM;AAgBbC,EAAAA,aAAa,EAAE;AACbC,IAAAA,UAAU,EAAE;AACVC,MAAAA,KAAK,EAAE,YADG;AAEVC,MAAAA,QAAQ,EAAE,KAFA;AAGVC,MAAAA,OAAO,EAAE;AAHC,KADC;AAMbZ,IAAAA,eAAe,EAAE;AACfW,MAAAA,QAAQ,EAAE,IADK;AAEfD,MAAAA,KAAK,EAAE;AAFQ,KANJ;AAUbb,IAAAA,MAAM,EAAE;AACNc,MAAAA,QAAQ,EAAE,IADJ;AAEND,MAAAA,KAAK,EAAE;AAFD,KAVK;AAcbR,IAAAA,UAAU,EAAE;AACVS,MAAAA,QAAQ,EAAE,IADA;AAEVD,MAAAA,KAAK,EAAE;AAFG,KAdC;AAkBbG,IAAAA,eAAe,EAAE;AACfF,MAAAA,QAAQ,EAAE,IADK;AAEfD,MAAAA,KAAK,EAAE;AAFQ,KAlBJ;AAsBbI,IAAAA,cAAc,EAAE;AACdH,MAAAA,QAAQ,EAAE,KADI;AAEdD,MAAAA,KAAK,EAAE;AAFO,KAtBH;AA0BbK,IAAAA,SAAS,EAAE;AACTJ,MAAAA,QAAQ,EAAE,IADD;AAETD,MAAAA,KAAK,EAAE;AAFE,KA1BE;AA8BbM,IAAAA,mBAAmB,EAAE;AACnBL,MAAAA,QAAQ,EAAE,IADS;AAEnBD,MAAAA,KAAK,EAAE;AAFY,KA9BR;AAkCbO,IAAAA,UAAU,EAAE,CAlCC;AAmCbC,IAAAA,gBAAgB,EAAE,EAnCL;AAoCbC,IAAAA,aAAa,EAAE;AACbH,MAAAA,mBAAmB,EAAE,GADR;AAEbnB,MAAAA,MAAM,EAAE,GAFK;AAGbkB,MAAAA,SAAS,EAAE;AAHE,KApCF;AAyCbK,IAAAA,cAAc,EAAE;AACdJ,MAAAA,mBAAmB,EAAE,GADP;AAEdnB,MAAAA,MAAM,EAAE,GAFM;AAGdkB,MAAAA,SAAS,EAAE;AAHG,KAzCH;AA8CbM,IAAAA,UAAU,EAAE;AACVV,MAAAA,QAAQ,EAAE,KADA;AAEVD,MAAAA,KAAK,EAAE;AAFG;AA9CC;AAhBF,C","sourcesContent":["export default {\n model: {\n disabled: false,\n mode: 'gather',\n prompt: 'Use the inputs to complete the sentence',\n markup: '',\n choices: [],\n choicesPosition: 'below',\n correctResponse: {},\n duplicates: true,\n rationaleEnabled: true,\n promptEnabled: true,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n toolbarEditorPosition: 'bottom',\n },\n configuration: {\n spellCheck: {\n label: 'Spellcheck',\n settings: false,\n enabled: true,\n },\n choicesPosition: {\n settings: true,\n label: 'Choices Position',\n },\n prompt: {\n settings: true,\n label: 'Prompt',\n },\n duplicates: {\n settings: true,\n label: 'Duplicates',\n },\n lockChoiceOrder: {\n settings: true,\n label: 'Lock Choice Order',\n },\n partialScoring: {\n settings: false,\n label: 'Allow Partial Scoring',\n },\n rationale: {\n settings: true,\n label: 'Rationale',\n },\n teacherInstructions: {\n settings: true,\n label: 'Teacher Instructions',\n },\n minChoices: 2,\n maxResponseAreas: 10,\n maxImageWidth: {\n teacherInstructions: 300,\n prompt: 300,\n rationale: 300,\n },\n maxImageHeight: {\n teacherInstructions: 300,\n prompt: 300,\n rationale: 300,\n },\n withRubric: {\n settings: false,\n label: 'Add Rubric',\n },\n },\n};\n"],"file":"defaults.js"}
1
+ {"version":3,"sources":["../src/defaults.js"],"names":["model","disabled","mode","prompt","markup","choices","choicesPosition","correctResponse","duplicates","rationaleEnabled","promptEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","toolbarEditorPosition","configuration","spellCheck","label","settings","enabled","lockChoiceOrder","partialScoring","rationale","settingsPanelDisabled","teacherInstructions","minChoices","maxResponseAreas","maxImageWidth","maxImageHeight","withRubric"],"mappings":";;;;;;eAAe;AACbA,EAAAA,KAAK,EAAE;AACLC,IAAAA,QAAQ,EAAE,KADL;AAELC,IAAAA,IAAI,EAAE,QAFD;AAGLC,IAAAA,MAAM,EAAE,yCAHH;AAILC,IAAAA,MAAM,EAAE,EAJH;AAKLC,IAAAA,OAAO,EAAE,EALJ;AAMLC,IAAAA,eAAe,EAAE,OANZ;AAOLC,IAAAA,eAAe,EAAE,EAPZ;AAQLC,IAAAA,UAAU,EAAE,IARP;AASLC,IAAAA,gBAAgB,EAAE,IATb;AAULC,IAAAA,aAAa,EAAE,IAVV;AAWLC,IAAAA,0BAA0B,EAAE,IAXvB;AAYLC,IAAAA,0BAA0B,EAAE,IAZvB;AAaLC,IAAAA,qBAAqB,EAAE;AAblB,GADM;AAgBbC,EAAAA,aAAa,EAAE;AACbC,IAAAA,UAAU,EAAE;AACVC,MAAAA,KAAK,EAAE,YADG;AAEVC,MAAAA,QAAQ,EAAE,KAFA;AAGVC,MAAAA,OAAO,EAAE;AAHC,KADC;AAMbZ,IAAAA,eAAe,EAAE;AACfW,MAAAA,QAAQ,EAAE,IADK;AAEfD,MAAAA,KAAK,EAAE;AAFQ,KANJ;AAUbb,IAAAA,MAAM,EAAE;AACNc,MAAAA,QAAQ,EAAE,IADJ;AAEND,MAAAA,KAAK,EAAE;AAFD,KAVK;AAcbR,IAAAA,UAAU,EAAE;AACVS,MAAAA,QAAQ,EAAE,IADA;AAEVD,MAAAA,KAAK,EAAE;AAFG,KAdC;AAkBbG,IAAAA,eAAe,EAAE;AACfF,MAAAA,QAAQ,EAAE,IADK;AAEfD,MAAAA,KAAK,EAAE;AAFQ,KAlBJ;AAsBbI,IAAAA,cAAc,EAAE;AACdH,MAAAA,QAAQ,EAAE,KADI;AAEdD,MAAAA,KAAK,EAAE;AAFO,KAtBH;AA0BbK,IAAAA,SAAS,EAAE;AACTJ,MAAAA,QAAQ,EAAE,IADD;AAETD,MAAAA,KAAK,EAAE;AAFE,KA1BE;AA8BbM,IAAAA,qBAAqB,EAAE,KA9BV;AA+BbC,IAAAA,mBAAmB,EAAE;AACnBN,MAAAA,QAAQ,EAAE,IADS;AAEnBD,MAAAA,KAAK,EAAE;AAFY,KA/BR;AAmCbQ,IAAAA,UAAU,EAAE,CAnCC;AAoCbC,IAAAA,gBAAgB,EAAE,EApCL;AAqCbC,IAAAA,aAAa,EAAE;AACbH,MAAAA,mBAAmB,EAAE,GADR;AAEbpB,MAAAA,MAAM,EAAE,GAFK;AAGbkB,MAAAA,SAAS,EAAE;AAHE,KArCF;AA0CbM,IAAAA,cAAc,EAAE;AACdJ,MAAAA,mBAAmB,EAAE,GADP;AAEdpB,MAAAA,MAAM,EAAE,GAFM;AAGdkB,MAAAA,SAAS,EAAE;AAHG,KA1CH;AA+CbO,IAAAA,UAAU,EAAE;AACVX,MAAAA,QAAQ,EAAE,KADA;AAEVD,MAAAA,KAAK,EAAE;AAFG;AA/CC;AAhBF,C","sourcesContent":["export default {\n model: {\n disabled: false,\n mode: 'gather',\n prompt: 'Use the inputs to complete the sentence',\n markup: '',\n choices: [],\n choicesPosition: 'below',\n correctResponse: {},\n duplicates: true,\n rationaleEnabled: true,\n promptEnabled: true,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n toolbarEditorPosition: 'bottom',\n },\n configuration: {\n spellCheck: {\n label: 'Spellcheck',\n settings: false,\n enabled: true,\n },\n choicesPosition: {\n settings: true,\n label: 'Choices Position',\n },\n prompt: {\n settings: true,\n label: 'Prompt',\n },\n duplicates: {\n settings: true,\n label: 'Duplicates',\n },\n lockChoiceOrder: {\n settings: true,\n label: 'Lock Choice Order',\n },\n partialScoring: {\n settings: false,\n label: 'Allow Partial Scoring',\n },\n rationale: {\n settings: true,\n label: 'Rationale',\n },\n settingsPanelDisabled: false,\n teacherInstructions: {\n settings: true,\n label: 'Teacher Instructions',\n },\n minChoices: 2,\n maxResponseAreas: 10,\n maxImageWidth: {\n teacherInstructions: 300,\n prompt: 300,\n rationale: 300,\n },\n maxImageHeight: {\n teacherInstructions: 300,\n prompt: 300,\n rationale: 300,\n },\n withRubric: {\n settings: false,\n label: 'Add Rubric',\n },\n },\n};\n"],"file":"defaults.js"}
@@ -68,9 +68,9 @@ var DragInTheBlank = /*#__PURE__*/function (_HTMLElement) {
68
68
 
69
69
  (0, _createClass2["default"])(DragInTheBlank, [{
70
70
  key: "model",
71
- set: function set(s) {
72
- var formModel = _objectSpread(_objectSpread({}, s), {}, {
73
- markup: "<span>".concat(s.markup || _defaults2["default"].model.markup, "</span>")
71
+ set: function set(m) {
72
+ var formModel = _objectSpread(_objectSpread({}, m), {}, {
73
+ markup: "<span>".concat(m.markup || _defaults2["default"].model.markup, "</span>")
74
74
  });
75
75
 
76
76
  this._model = DragInTheBlank.prepareModel(formModel);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.js"],"names":["log","DragInTheBlank","_model","prepareModel","_configuration","sensibleDefaults","configuration","onModelChanged","bind","onConfigurationChanged","s","formModel","markup","model","_render","c","_disableSidePanel","reset","resetValue","dispatchEvent","ModelUpdatedEvent","m","dispatchModelUpdated","handler","InsertImageEvent","src","done","DeleteImageEvent","InsertSoundEvent","DeleteSoundEvent","element","React","createElement","Main","disableSidePanel","imageSupport","add","insertImage","onDeleteImage","uploadSoundSupport","insertSound","onDeleteSound","ReactDOM","render","HTMLElement","joinedObj","slateMarkup","choices","correctResponse","processedMarkup"],"mappings":"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","sourcesContent":["import {\n ModelUpdatedEvent,\n DeleteImageEvent,\n InsertImageEvent,\n InsertSoundEvent,\n DeleteSoundEvent,\n} from '@pie-framework/pie-configure-events';\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport Main from './main';\nimport debug from 'debug';\nimport defaults from 'lodash/defaults';\n\nimport sensibleDefaults from './defaults';\nimport { processMarkup, createSlateMarkup } from './markupUtils';\n\nconst log = debug('multiple-choice:configure');\n\nexport default class DragInTheBlank extends HTMLElement {\n static prepareModel = (model = {}) => {\n const joinedObj = {\n ...sensibleDefaults.model,\n ...model,\n };\n const slateMarkup =\n model.slateMarkup || createSlateMarkup(joinedObj.markup, joinedObj.choices, joinedObj.correctResponse);\n const processedMarkup = processMarkup(slateMarkup);\n\n return {\n ...joinedObj,\n slateMarkup,\n markup: processedMarkup.markup,\n correctResponse: processedMarkup.correctResponse,\n };\n };\n\n constructor() {\n super();\n this._model = DragInTheBlank.prepareModel();\n this._configuration = sensibleDefaults.configuration;\n this.onModelChanged = this.onModelChanged.bind(this);\n this.onConfigurationChanged = this.onConfigurationChanged.bind(this);\n }\n\n set model(s) {\n const formModel = {\n ...s,\n markup: `<span>${s.markup || sensibleDefaults.model.markup}</span>`,\n };\n\n this._model = DragInTheBlank.prepareModel(formModel);\n this._render();\n }\n\n set configuration(c) {\n this._configuration = defaults(c, sensibleDefaults.configuration);\n this._render();\n }\n\n set disableSidePanel(s) {\n this._disableSidePanel = s;\n this._render();\n }\n\n dispatchModelUpdated(reset) {\n const resetValue = !!reset;\n\n this.dispatchEvent(new ModelUpdatedEvent(this._model, resetValue));\n }\n\n onModelChanged(m, reset) {\n this._model = DragInTheBlank.prepareModel(m);\n this._render();\n this.dispatchModelUpdated(reset);\n }\n\n onConfigurationChanged(c) {\n this._configuration = c;\n this._render();\n }\n\n /** @param {done, progress, file} handler */\n insertImage(handler) {\n this.dispatchEvent(new InsertImageEvent(handler));\n }\n\n onDeleteImage(src, done) {\n this.dispatchEvent(new DeleteImageEvent(src, done));\n }\n\n insertSound(handler) {\n this.dispatchEvent(new InsertSoundEvent(handler));\n }\n\n onDeleteSound(src, done) {\n this.dispatchEvent(new DeleteSoundEvent(src, done));\n }\n\n _render() {\n log('_render');\n let element = React.createElement(Main, {\n model: this._model,\n configuration: this._configuration,\n onModelChanged: this.onModelChanged,\n onConfigurationChanged: this.onConfigurationChanged,\n disableSidePanel: this._disableSidePanel,\n imageSupport: {\n add: this.insertImage.bind(this),\n delete: this.onDeleteImage.bind(this),\n },\n uploadSoundSupport: {\n add: this.insertSound.bind(this),\n delete: this.onDeleteSound.bind(this),\n },\n });\n ReactDOM.render(element, this);\n }\n}\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../src/index.js"],"names":["log","DragInTheBlank","_model","prepareModel","_configuration","sensibleDefaults","configuration","onModelChanged","bind","onConfigurationChanged","m","formModel","markup","model","_render","c","s","_disableSidePanel","reset","resetValue","dispatchEvent","ModelUpdatedEvent","dispatchModelUpdated","handler","InsertImageEvent","src","done","DeleteImageEvent","InsertSoundEvent","DeleteSoundEvent","element","React","createElement","Main","disableSidePanel","imageSupport","add","insertImage","onDeleteImage","uploadSoundSupport","insertSound","onDeleteSound","ReactDOM","render","HTMLElement","joinedObj","slateMarkup","choices","correctResponse","processedMarkup"],"mappings":"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","sourcesContent":["import {\n ModelUpdatedEvent,\n DeleteImageEvent,\n InsertImageEvent,\n InsertSoundEvent,\n DeleteSoundEvent,\n} from '@pie-framework/pie-configure-events';\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport Main from './main';\nimport debug from 'debug';\nimport defaults from 'lodash/defaults';\n\nimport sensibleDefaults from './defaults';\nimport { processMarkup, createSlateMarkup } from './markupUtils';\n\nconst log = debug('multiple-choice:configure');\n\nexport default class DragInTheBlank extends HTMLElement {\n static prepareModel = (model = {}) => {\n const joinedObj = {\n ...sensibleDefaults.model,\n ...model,\n };\n const slateMarkup =\n model.slateMarkup || createSlateMarkup(joinedObj.markup, joinedObj.choices, joinedObj.correctResponse);\n const processedMarkup = processMarkup(slateMarkup);\n\n return {\n ...joinedObj,\n slateMarkup,\n markup: processedMarkup.markup,\n correctResponse: processedMarkup.correctResponse,\n };\n };\n\n constructor() {\n super();\n this._model = DragInTheBlank.prepareModel();\n this._configuration = sensibleDefaults.configuration;\n this.onModelChanged = this.onModelChanged.bind(this);\n this.onConfigurationChanged = this.onConfigurationChanged.bind(this);\n }\n\n set model(m) {\n const formModel = {\n ...m,\n markup: `<span>${m.markup || sensibleDefaults.model.markup}</span>`,\n };\n\n this._model = DragInTheBlank.prepareModel(formModel);\n this._render();\n }\n\n set configuration(c) {\n this._configuration = defaults(c, sensibleDefaults.configuration);\n this._render();\n }\n\n set disableSidePanel(s) {\n this._disableSidePanel = s;\n this._render();\n }\n\n dispatchModelUpdated(reset) {\n const resetValue = !!reset;\n\n this.dispatchEvent(new ModelUpdatedEvent(this._model, resetValue));\n }\n\n onModelChanged(m, reset) {\n this._model = DragInTheBlank.prepareModel(m);\n this._render();\n this.dispatchModelUpdated(reset);\n }\n\n onConfigurationChanged(c) {\n this._configuration = c;\n this._render();\n }\n\n /** @param {done, progress, file} handler */\n insertImage(handler) {\n this.dispatchEvent(new InsertImageEvent(handler));\n }\n\n onDeleteImage(src, done) {\n this.dispatchEvent(new DeleteImageEvent(src, done));\n }\n\n insertSound(handler) {\n this.dispatchEvent(new InsertSoundEvent(handler));\n }\n\n onDeleteSound(src, done) {\n this.dispatchEvent(new DeleteSoundEvent(src, done));\n }\n\n _render() {\n log('_render');\n\n let element = React.createElement(Main, {\n model: this._model,\n configuration: this._configuration,\n onModelChanged: this.onModelChanged,\n onConfigurationChanged: this.onConfigurationChanged,\n disableSidePanel: this._disableSidePanel,\n imageSupport: {\n add: this.insertImage.bind(this),\n delete: this.onDeleteImage.bind(this),\n },\n uploadSoundSupport: {\n add: this.insertSound.bind(this),\n delete: this.onDeleteSound.bind(this),\n },\n });\n\n ReactDOM.render(element, this);\n }\n}\n"],"file":"index.js"}
@@ -102,19 +102,19 @@ var styles = function styles(theme) {
102
102
  },
103
103
  text: {
104
104
  fontFamily: 'Cerebri Sans',
105
- fontSize: '16px',
105
+ fontSize: theme.typography.fontSize + 2,
106
106
  lineHeight: '19px',
107
107
  color: '#495B8F'
108
108
  },
109
109
  tooltip: {
110
- fontSize: '12px',
110
+ fontSize: theme.typography.fontSize - 2,
111
111
  whiteSpace: 'pre',
112
112
  maxWidth: '500px'
113
113
  },
114
114
  errorText: {
115
- fontSize: '12px',
115
+ fontSize: theme.typography.fontSize - 2,
116
116
  color: 'red',
117
- padding: '5px 0'
117
+ paddingTop: theme.spacing.unit
118
118
  },
119
119
  flexContainer: {
120
120
  display: 'flex',
@@ -214,6 +214,7 @@ var Main = /*#__PURE__*/function (_React$Component) {
214
214
  choicesPosition = _ref$choicesPosition === void 0 ? {} : _ref$choicesPosition,
215
215
  _ref$spellCheck = _ref.spellCheck,
216
216
  spellCheck = _ref$spellCheck === void 0 ? {} : _ref$spellCheck,
217
+ settingsPanelDisabled = _ref.settingsPanelDisabled,
217
218
  maxChoices = _ref.maxChoices,
218
219
  maxResponseAreas = _ref.maxResponseAreas,
219
220
  _ref$maxImageWidth = _ref.maxImageWidth,
@@ -228,32 +229,37 @@ var Main = /*#__PURE__*/function (_React$Component) {
228
229
  promptEnabled = _ref2.promptEnabled,
229
230
  teacherInstructionsEnabled = _ref2.teacherInstructionsEnabled,
230
231
  spellCheckEnabled = _ref2.spellCheckEnabled,
231
- errors = _ref2.errors,
232
- rubricEnabled = _ref2.rubricEnabled;
233
-
234
- var toolbarOpts = {};
232
+ toolbarEditorPosition = _ref2.toolbarEditorPosition,
233
+ errors = _ref2.errors;
235
234
 
236
235
  var _ref3 = errors || {},
237
236
  responseAreasError = _ref3.responseAreasError,
238
- choicesError = _ref3.choicesError;
237
+ choicesError = _ref3.choicesError,
238
+ correctResponseError = _ref3.correctResponseError;
239
239
 
240
240
  var validationMessage = (0, _utils.generateValidationMessage)(configuration);
241
241
  var defaultImageMaxWidth = maxImageWidth && maxImageWidth.prompt;
242
242
  var defaultImageMaxHeight = maxImageHeight && maxImageHeight.prompt;
243
-
244
- switch (model.toolbarEditorPosition) {
245
- case 'top':
246
- toolbarOpts.position = 'top';
247
- break;
248
-
249
- default:
250
- toolbarOpts.position = 'bottom';
251
- break;
252
- }
253
-
243
+ var toolbarOpts = {
244
+ position: toolbarEditorPosition === 'top' ? 'top' : 'bottom'
245
+ };
246
+ var panelSettings = {
247
+ partialScoring: partialScoring.settings && toggle(partialScoring.label),
248
+ duplicates: duplicates.settings && toggle(duplicates.label),
249
+ lockChoiceOrder: lockChoiceOrder.settings && toggle(lockChoiceOrder.label),
250
+ choicesPosition: choicesPosition.settings && dropdown(choicesPosition.label, ['above', 'below', 'left', 'right'])
251
+ };
252
+ var panelProperties = {
253
+ teacherInstructionsEnabled: teacherInstructions.settings && toggle(teacherInstructions.label),
254
+ rationaleEnabled: rationale.settings && toggle(rationale.label),
255
+ spellCheckEnabled: spellCheck.settings && toggle(spellCheck.label),
256
+ promptEnabled: prompt.settings && toggle(prompt.label),
257
+ rubricEnabled: (withRubric === null || withRubric === void 0 ? void 0 : withRubric.settings) && toggle(withRubric === null || withRubric === void 0 ? void 0 : withRubric.label)
258
+ };
254
259
  return /*#__PURE__*/_react["default"].createElement("div", {
255
260
  className: classes.design
256
261
  }, /*#__PURE__*/_react["default"].createElement(_configUi.layout.ConfigLayout, {
262
+ hideSettings: settingsPanelDisabled,
257
263
  settings: /*#__PURE__*/_react["default"].createElement(Panel, {
258
264
  model: model,
259
265
  configuration: configuration,
@@ -264,19 +270,8 @@ var Main = /*#__PURE__*/function (_React$Component) {
264
270
  return onConfigurationChanged(configuration, true);
265
271
  },
266
272
  groups: {
267
- Settings: {
268
- partialScoring: partialScoring.settings && toggle(partialScoring.label),
269
- duplicates: duplicates.settings && toggle(duplicates.label),
270
- lockChoiceOrder: lockChoiceOrder.settings && toggle(lockChoiceOrder.label),
271
- choicesPosition: choicesPosition.settings && dropdown(choicesPosition.label, ['above', 'below', 'left', 'right'])
272
- },
273
- Properties: {
274
- teacherInstructionsEnabled: teacherInstructions.settings && toggle(teacherInstructions.label),
275
- rationaleEnabled: rationale.settings && toggle(rationale.label),
276
- spellCheckEnabled: spellCheck.settings && toggle(spellCheck.label),
277
- promptEnabled: prompt.settings && toggle(prompt.label),
278
- rubricEnabled: (withRubric === null || withRubric === void 0 ? void 0 : withRubric.settings) && toggle(withRubric === null || withRubric === void 0 ? void 0 : withRubric.label)
279
- }
273
+ Settings: panelSettings,
274
+ Properties: panelProperties
280
275
  }
281
276
  })
282
277
  }, /*#__PURE__*/_react["default"].createElement("div", null, teacherInstructionsEnabled && /*#__PURE__*/_react["default"].createElement(_configUi.InputContainer, {
@@ -336,11 +331,7 @@ var Main = /*#__PURE__*/function (_React$Component) {
336
331
  style: {
337
332
  marginLeft: '5px'
338
333
  }
339
- }))), responseAreasError && /*#__PURE__*/_react["default"].createElement("div", {
340
- className: classes.errorText
341
- }, responseAreasError), choicesError && /*#__PURE__*/_react["default"].createElement("div", {
342
- className: classes.errorText
343
- }, choicesError), /*#__PURE__*/_react["default"].createElement(_editableHtml["default"], {
334
+ }))), /*#__PURE__*/_react["default"].createElement(_editableHtml["default"], {
344
335
  activePlugins: _editableHtml.ALL_PLUGINS,
345
336
  responseAreaProps: {
346
337
  type: 'drag-in-the-blank',
@@ -356,6 +347,7 @@ var Main = /*#__PURE__*/function (_React$Component) {
356
347
  disableImageAlignmentButtons: true,
357
348
  nonEmpty: false,
358
349
  disableUnderline: true,
350
+ error: responseAreasError || correctResponseError,
359
351
  toolbarOpts: toolbarOpts,
360
352
  spellCheck: spellCheckEnabled,
361
353
  uploadSoundSupport: uploadSoundSupport,
@@ -364,9 +356,14 @@ var Main = /*#__PURE__*/function (_React$Component) {
364
356
  }, {
365
357
  language: 'special'
366
358
  }]
367
- }), /*#__PURE__*/_react["default"].createElement(_choices["default"], {
359
+ }), responseAreasError && /*#__PURE__*/_react["default"].createElement("div", {
360
+ className: classes.errorText
361
+ }, responseAreasError), correctResponseError && /*#__PURE__*/_react["default"].createElement("div", {
362
+ className: classes.errorText
363
+ }, correctResponseError), /*#__PURE__*/_react["default"].createElement(_choices["default"], {
368
364
  model: model,
369
365
  duplicates: model.duplicates,
366
+ error: choicesError,
370
367
  onChange: this.onResponsesChanged,
371
368
  toolbarOpts: toolbarOpts,
372
369
  maxChoices: maxChoices,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/main.jsx"],"names":["dropdown","settings","toggle","Panel","styles","theme","promptHolder","width","paddingBottom","spacing","unit","marginBottom","prompt","paddingTop","markup","minHeight","design","choiceConfiguration","switchElement","justifyContent","margin","addButton","text","fontFamily","fontSize","lineHeight","color","tooltip","whiteSpace","maxWidth","errorText","padding","flexContainer","display","alignItems","Main","newVal","props","onModelChanged","model","rationale","teacherInstructions","slateMarkup","choices","correctResponse","domNode","ReactDOM","findDOMNode","classes","configuration","onConfigurationChanged","imageSupport","uploadSoundSupport","duplicates","partialScoring","lockChoiceOrder","choicesPosition","spellCheck","maxChoices","maxResponseAreas","maxImageWidth","maxImageHeight","withRubric","rationaleEnabled","promptEnabled","teacherInstructionsEnabled","spellCheckEnabled","errors","rubricEnabled","toolbarOpts","responseAreasError","choicesError","validationMessage","defaultImageMaxWidth","defaultImageMaxHeight","toolbarEditorPosition","position","onModelChange","Settings","label","Properties","onTeacherInstructionsChanged","language","onPromptChanged","marginLeft","ALL_PLUGINS","type","options","onMarkupChanged","onResponsesChanged","onRationaleChanged","React","Component","PropTypes","object","isRequired","disableSidePanel","bool","func","shape","add","Styled"],"mappings":"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","sourcesContent":["import React from 'react';\nimport ReactDOM from 'react-dom';\nimport PropTypes from 'prop-types';\nimport EditableHtml, { ALL_PLUGINS } from '@pie-lib/editable-html';\nimport { InputContainer, layout, settings } from '@pie-lib/config-ui';\nimport { withDragContext } from '@pie-lib/drag';\nimport { renderMath } from '@pie-lib/math-rendering';\nimport { withStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport Info from '@material-ui/icons/Info';\nimport Tooltip from '@material-ui/core/Tooltip';\n\nimport Choices from './choices';\nimport { createSlateMarkup } from './markupUtils';\nimport { generateValidationMessage } from '../utils';\nconst { dropdown, toggle, Panel } = settings;\n\nconst styles = (theme) => ({\n promptHolder: {\n width: '100%',\n paddingBottom: theme.spacing.unit * 2,\n marginBottom: theme.spacing.unit * 2,\n },\n prompt: {\n paddingTop: theme.spacing.unit * 2,\n width: '100%',\n },\n markup: {\n minHeight: '235px',\n paddingTop: theme.spacing.unit * 2,\n width: '100%',\n '& [data-slate-editor=\"true\"]': {\n minHeight: '235px',\n },\n },\n design: {\n paddingTop: theme.spacing.unit * 3,\n },\n choiceConfiguration: {\n paddingTop: theme.spacing.unit * 2,\n paddingBottom: theme.spacing.unit * 2,\n },\n switchElement: {\n justifyContent: 'space-between',\n margin: 0,\n },\n addButton: {\n float: 'right',\n },\n text: {\n fontFamily: 'Cerebri Sans',\n fontSize: '16px',\n lineHeight: '19px',\n color: '#495B8F',\n },\n tooltip: {\n fontSize: '12px',\n whiteSpace: 'pre',\n maxWidth: '500px',\n },\n errorText: {\n fontSize: '12px',\n color: 'red',\n padding: '5px 0',\n },\n flexContainer: {\n display: 'flex',\n alignItems: 'end',\n },\n});\n\nexport class Main extends React.Component {\n static propTypes = {\n configuration: PropTypes.object.isRequired,\n model: PropTypes.object.isRequired,\n disableSidePanel: PropTypes.bool,\n onModelChanged: PropTypes.func.isRequired,\n onConfigurationChanged: PropTypes.func.isRequired,\n classes: PropTypes.object.isRequired,\n imageSupport: PropTypes.shape({\n add: PropTypes.func.isRequired,\n delete: PropTypes.func.isRequired,\n }),\n };\n\n state = {};\n\n componentDidUpdate() {\n // eslint-disable-next-line\n const domNode = ReactDOM.findDOMNode(this);\n\n renderMath(domNode);\n }\n\n onModelChange = (newVal) => {\n this.props.onModelChanged({\n ...this.props.model,\n ...newVal,\n });\n };\n\n onPromptChanged = (prompt) => {\n this.props.onModelChanged({\n ...this.props.model,\n prompt,\n });\n };\n\n onRationaleChanged = (rationale) => {\n this.props.onModelChanged({\n ...this.props.model,\n rationale,\n });\n };\n\n onTeacherInstructionsChanged = (teacherInstructions) => {\n this.props.onModelChanged({\n ...this.props.model,\n teacherInstructions,\n });\n };\n\n onMarkupChanged = (slateMarkup) => {\n this.props.onModelChanged({\n ...this.props.model,\n slateMarkup,\n });\n };\n\n onResponsesChanged = (choices) => {\n const {\n model: { correctResponse, markup },\n } = this.props;\n const slateMarkup = createSlateMarkup(markup, choices, correctResponse);\n\n this.props.onModelChanged({\n ...this.props.model,\n slateMarkup,\n choices,\n });\n };\n\n render() {\n const { classes, model, configuration, onConfigurationChanged, imageSupport, uploadSoundSupport } = this.props;\n const {\n duplicates = {},\n prompt = {},\n partialScoring = {},\n lockChoiceOrder = {},\n rationale = {},\n teacherInstructions = {},\n choicesPosition = {},\n spellCheck = {},\n maxChoices,\n maxResponseAreas,\n maxImageWidth = {},\n maxImageHeight = {},\n withRubric = {},\n } = configuration || {};\n const { rationaleEnabled, promptEnabled, teacherInstructionsEnabled, spellCheckEnabled, errors, rubricEnabled } =\n model || {};\n const toolbarOpts = {};\n\n const { responseAreasError, choicesError } = errors || {};\n const validationMessage = generateValidationMessage(configuration);\n\n const defaultImageMaxWidth = maxImageWidth && maxImageWidth.prompt;\n const defaultImageMaxHeight = maxImageHeight && maxImageHeight.prompt;\n\n switch (model.toolbarEditorPosition) {\n case 'top':\n toolbarOpts.position = 'top';\n break;\n default:\n toolbarOpts.position = 'bottom';\n break;\n }\n return (\n <div className={classes.design}>\n <layout.ConfigLayout\n settings={\n <Panel\n model={model}\n configuration={configuration}\n onChangeModel={(model) => this.onModelChange(model)}\n onChangeConfiguration={(configuration) => onConfigurationChanged(configuration, true)}\n groups={{\n Settings: {\n partialScoring: partialScoring.settings && toggle(partialScoring.label),\n duplicates: duplicates.settings && toggle(duplicates.label),\n lockChoiceOrder: lockChoiceOrder.settings && toggle(lockChoiceOrder.label),\n choicesPosition:\n choicesPosition.settings && dropdown(choicesPosition.label, ['above', 'below', 'left', 'right']),\n },\n Properties: {\n teacherInstructionsEnabled: teacherInstructions.settings && toggle(teacherInstructions.label),\n rationaleEnabled: rationale.settings && toggle(rationale.label),\n spellCheckEnabled: spellCheck.settings && toggle(spellCheck.label),\n promptEnabled: prompt.settings && toggle(prompt.label),\n rubricEnabled: withRubric?.settings && toggle(withRubric?.label),\n },\n }}\n />\n }\n >\n <div>\n {teacherInstructionsEnabled && (\n <InputContainer label={teacherInstructions.label} className={classes.promptHolder}>\n <EditableHtml\n className={classes.prompt}\n markup={model.teacherInstructions || ''}\n onChange={this.onTeacherInstructionsChanged}\n imageSupport={imageSupport}\n nonEmpty={false}\n toolbarOpts={toolbarOpts}\n spellCheck={spellCheckEnabled}\n maxImageWidth={(maxImageWidth && maxImageWidth.teacherInstructions) || defaultImageMaxWidth}\n maxImageHeight={(maxImageHeight && maxImageHeight.teacherInstructions) || defaultImageMaxHeight}\n uploadSoundSupport={uploadSoundSupport}\n languageCharactersProps={[{ language: 'spanish' }, { language: 'special' }]}\n />\n </InputContainer>\n )}\n {promptEnabled && (\n <InputContainer label={prompt.label} className={classes.promptHolder}>\n <EditableHtml\n className={classes.prompt}\n markup={model.prompt}\n onChange={this.onPromptChanged}\n imageSupport={imageSupport}\n nonEmpty={false}\n disableUnderline\n toolbarOpts={toolbarOpts}\n spellCheck={spellCheckEnabled}\n maxImageWidth={defaultImageMaxWidth}\n maxImageHeight={defaultImageMaxHeight}\n uploadSoundSupport={uploadSoundSupport}\n languageCharactersProps={[{ language: 'spanish' }, { language: 'special' }]}\n />\n </InputContainer>\n )}\n <div className={classes.flexContainer}>\n <Typography className={classes.text}>Define Template, Choices, and Correct Responses</Typography>\n <Tooltip\n classes={{ tooltip: classes.tooltip }}\n disableFocusListener\n disableTouchListener\n placement={'right'}\n title={validationMessage}\n >\n <Info fontSize={'small'} color={'primary'} style={{ marginLeft: '5px' }} />\n </Tooltip>\n </div>\n {responseAreasError && <div className={classes.errorText}>{responseAreasError}</div>}\n {choicesError && <div className={classes.errorText}>{choicesError}</div>}\n <EditableHtml\n activePlugins={ALL_PLUGINS}\n responseAreaProps={{\n type: 'drag-in-the-blank',\n options: {\n duplicates: model.duplicates,\n },\n maxResponseAreas: maxResponseAreas,\n }}\n className={classes.markup}\n markup={model.slateMarkup}\n onChange={this.onMarkupChanged}\n imageSupport={imageSupport}\n disableImageAlignmentButtons={true}\n nonEmpty={false}\n disableUnderline\n toolbarOpts={toolbarOpts}\n spellCheck={spellCheckEnabled}\n uploadSoundSupport={uploadSoundSupport}\n languageCharactersProps={[{ language: 'spanish' }, { language: 'special' }]}\n />\n <Choices\n model={model}\n duplicates={model.duplicates}\n onChange={this.onResponsesChanged}\n toolbarOpts={toolbarOpts}\n maxChoices={maxChoices}\n uploadSoundSupport={uploadSoundSupport}\n />\n {rationaleEnabled && (\n <InputContainer label={rationale.label} className={classes.promptHolder}>\n <EditableHtml\n className={classes.prompt}\n markup={model.rationale || ''}\n onChange={this.onRationaleChanged}\n imageSupport={imageSupport}\n toolbarOpts={toolbarOpts}\n spellCheck={spellCheckEnabled}\n maxImageWidth={(maxImageWidth && maxImageWidth.rationale) || defaultImageMaxWidth}\n maxImageHeight={(maxImageHeight && maxImageHeight.rationale) || defaultImageMaxHeight}\n uploadSoundSupport={uploadSoundSupport}\n languageCharactersProps={[{ language: 'spanish' }, { language: 'special' }]}\n />\n </InputContainer>\n )}\n </div>\n </layout.ConfigLayout>\n </div>\n );\n }\n}\n\nconst Styled = withStyles(styles)(Main);\n\nexport default withDragContext(Styled);\n"],"file":"main.js"}
1
+ {"version":3,"sources":["../src/main.jsx"],"names":["dropdown","settings","toggle","Panel","styles","theme","promptHolder","width","paddingBottom","spacing","unit","marginBottom","prompt","paddingTop","markup","minHeight","design","choiceConfiguration","switchElement","justifyContent","margin","addButton","text","fontFamily","fontSize","typography","lineHeight","color","tooltip","whiteSpace","maxWidth","errorText","flexContainer","display","alignItems","Main","newVal","props","onModelChanged","model","rationale","teacherInstructions","slateMarkup","choices","correctResponse","domNode","ReactDOM","findDOMNode","classes","configuration","onConfigurationChanged","imageSupport","uploadSoundSupport","duplicates","partialScoring","lockChoiceOrder","choicesPosition","spellCheck","settingsPanelDisabled","maxChoices","maxResponseAreas","maxImageWidth","maxImageHeight","withRubric","rationaleEnabled","promptEnabled","teacherInstructionsEnabled","spellCheckEnabled","toolbarEditorPosition","errors","responseAreasError","choicesError","correctResponseError","validationMessage","defaultImageMaxWidth","defaultImageMaxHeight","toolbarOpts","position","panelSettings","label","panelProperties","rubricEnabled","onModelChange","Settings","Properties","onTeacherInstructionsChanged","language","onPromptChanged","marginLeft","ALL_PLUGINS","type","options","onMarkupChanged","onResponsesChanged","onRationaleChanged","React","Component","PropTypes","object","isRequired","disableSidePanel","bool","func","shape","add","Styled"],"mappings":"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","sourcesContent":["import React from 'react';\nimport ReactDOM from 'react-dom';\nimport PropTypes from 'prop-types';\nimport EditableHtml, { ALL_PLUGINS } from '@pie-lib/editable-html';\nimport { InputContainer, layout, settings } from '@pie-lib/config-ui';\nimport { withDragContext } from '@pie-lib/drag';\nimport { renderMath } from '@pie-lib/math-rendering';\nimport { withStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport Info from '@material-ui/icons/Info';\nimport Tooltip from '@material-ui/core/Tooltip';\n\nimport Choices from './choices';\nimport { createSlateMarkup } from './markupUtils';\nimport { generateValidationMessage } from '../utils';\nconst { dropdown, toggle, Panel } = settings;\n\nconst styles = (theme) => ({\n promptHolder: {\n width: '100%',\n paddingBottom: theme.spacing.unit * 2,\n marginBottom: theme.spacing.unit * 2,\n },\n prompt: {\n paddingTop: theme.spacing.unit * 2,\n width: '100%',\n },\n markup: {\n minHeight: '235px',\n paddingTop: theme.spacing.unit * 2,\n width: '100%',\n '& [data-slate-editor=\"true\"]': {\n minHeight: '235px',\n },\n },\n design: {\n paddingTop: theme.spacing.unit * 3,\n },\n choiceConfiguration: {\n paddingTop: theme.spacing.unit * 2,\n paddingBottom: theme.spacing.unit * 2,\n },\n switchElement: {\n justifyContent: 'space-between',\n margin: 0,\n },\n addButton: {\n float: 'right',\n },\n text: {\n fontFamily: 'Cerebri Sans',\n fontSize: theme.typography.fontSize + 2,\n lineHeight: '19px',\n color: '#495B8F',\n },\n tooltip: {\n fontSize: theme.typography.fontSize - 2,\n whiteSpace: 'pre',\n maxWidth: '500px',\n },\n errorText: {\n fontSize: theme.typography.fontSize - 2,\n color: 'red',\n paddingTop: theme.spacing.unit,\n },\n flexContainer: {\n display: 'flex',\n alignItems: 'end',\n },\n});\n\nexport class Main extends React.Component {\n static propTypes = {\n configuration: PropTypes.object.isRequired,\n model: PropTypes.object.isRequired,\n disableSidePanel: PropTypes.bool,\n onModelChanged: PropTypes.func.isRequired,\n onConfigurationChanged: PropTypes.func.isRequired,\n classes: PropTypes.object.isRequired,\n imageSupport: PropTypes.shape({\n add: PropTypes.func.isRequired,\n delete: PropTypes.func.isRequired,\n }),\n };\n\n state = {};\n\n componentDidUpdate() {\n // eslint-disable-next-line\n const domNode = ReactDOM.findDOMNode(this);\n\n renderMath(domNode);\n }\n\n onModelChange = (newVal) => {\n this.props.onModelChanged({\n ...this.props.model,\n ...newVal,\n });\n };\n\n onPromptChanged = (prompt) => {\n this.props.onModelChanged({\n ...this.props.model,\n prompt,\n });\n };\n\n onRationaleChanged = (rationale) => {\n this.props.onModelChanged({\n ...this.props.model,\n rationale,\n });\n };\n\n onTeacherInstructionsChanged = (teacherInstructions) => {\n this.props.onModelChanged({\n ...this.props.model,\n teacherInstructions,\n });\n };\n\n onMarkupChanged = (slateMarkup) => {\n this.props.onModelChanged({\n ...this.props.model,\n slateMarkup,\n });\n };\n\n onResponsesChanged = (choices) => {\n const {\n model: { correctResponse, markup },\n } = this.props;\n const slateMarkup = createSlateMarkup(markup, choices, correctResponse);\n\n this.props.onModelChanged({\n ...this.props.model,\n slateMarkup,\n choices,\n });\n };\n\n render() {\n const { classes, model, configuration, onConfigurationChanged, imageSupport, uploadSoundSupport } = this.props;\n const {\n duplicates = {},\n prompt = {},\n partialScoring = {},\n lockChoiceOrder = {},\n rationale = {},\n teacherInstructions = {},\n choicesPosition = {},\n spellCheck = {},\n settingsPanelDisabled,\n maxChoices,\n maxResponseAreas,\n maxImageWidth = {},\n maxImageHeight = {},\n withRubric = {},\n } = configuration || {};\n const {\n rationaleEnabled,\n promptEnabled,\n teacherInstructionsEnabled,\n spellCheckEnabled,\n toolbarEditorPosition,\n errors,\n } = model || {};\n\n const { responseAreasError, choicesError, correctResponseError } = errors || {};\n const validationMessage = generateValidationMessage(configuration);\n\n const defaultImageMaxWidth = maxImageWidth && maxImageWidth.prompt;\n const defaultImageMaxHeight = maxImageHeight && maxImageHeight.prompt;\n\n const toolbarOpts = {\n position: toolbarEditorPosition === 'top' ? 'top' : 'bottom',\n };\n\n const panelSettings = {\n partialScoring: partialScoring.settings && toggle(partialScoring.label),\n duplicates: duplicates.settings && toggle(duplicates.label),\n lockChoiceOrder: lockChoiceOrder.settings && toggle(lockChoiceOrder.label),\n choicesPosition: choicesPosition.settings && dropdown(choicesPosition.label, ['above', 'below', 'left', 'right']),\n };\n\n const panelProperties = {\n teacherInstructionsEnabled: teacherInstructions.settings && toggle(teacherInstructions.label),\n rationaleEnabled: rationale.settings && toggle(rationale.label),\n spellCheckEnabled: spellCheck.settings && toggle(spellCheck.label),\n promptEnabled: prompt.settings && toggle(prompt.label),\n rubricEnabled: withRubric?.settings && toggle(withRubric?.label),\n };\n\n return (\n <div className={classes.design}>\n <layout.ConfigLayout\n hideSettings={settingsPanelDisabled}\n settings={\n <Panel\n model={model}\n configuration={configuration}\n onChangeModel={(model) => this.onModelChange(model)}\n onChangeConfiguration={(configuration) => onConfigurationChanged(configuration, true)}\n groups={{\n Settings: panelSettings,\n Properties: panelProperties,\n }}\n />\n }\n >\n <div>\n {teacherInstructionsEnabled && (\n <InputContainer label={teacherInstructions.label} className={classes.promptHolder}>\n <EditableHtml\n className={classes.prompt}\n markup={model.teacherInstructions || ''}\n onChange={this.onTeacherInstructionsChanged}\n imageSupport={imageSupport}\n nonEmpty={false}\n toolbarOpts={toolbarOpts}\n spellCheck={spellCheckEnabled}\n maxImageWidth={(maxImageWidth && maxImageWidth.teacherInstructions) || defaultImageMaxWidth}\n maxImageHeight={(maxImageHeight && maxImageHeight.teacherInstructions) || defaultImageMaxHeight}\n uploadSoundSupport={uploadSoundSupport}\n languageCharactersProps={[{ language: 'spanish' }, { language: 'special' }]}\n />\n </InputContainer>\n )}\n\n {promptEnabled && (\n <InputContainer label={prompt.label} className={classes.promptHolder}>\n <EditableHtml\n className={classes.prompt}\n markup={model.prompt}\n onChange={this.onPromptChanged}\n imageSupport={imageSupport}\n nonEmpty={false}\n disableUnderline\n toolbarOpts={toolbarOpts}\n spellCheck={spellCheckEnabled}\n maxImageWidth={defaultImageMaxWidth}\n maxImageHeight={defaultImageMaxHeight}\n uploadSoundSupport={uploadSoundSupport}\n languageCharactersProps={[{ language: 'spanish' }, { language: 'special' }]}\n />\n </InputContainer>\n )}\n\n <div className={classes.flexContainer}>\n <Typography className={classes.text}>Define Template, Choices, and Correct Responses</Typography>\n <Tooltip\n classes={{ tooltip: classes.tooltip }}\n disableFocusListener\n disableTouchListener\n placement={'right'}\n title={validationMessage}\n >\n <Info fontSize={'small'} color={'primary'} style={{ marginLeft: '5px' }} />\n </Tooltip>\n </div>\n\n <EditableHtml\n activePlugins={ALL_PLUGINS}\n responseAreaProps={{\n type: 'drag-in-the-blank',\n options: {\n duplicates: model.duplicates,\n },\n maxResponseAreas: maxResponseAreas,\n }}\n className={classes.markup}\n markup={model.slateMarkup}\n onChange={this.onMarkupChanged}\n imageSupport={imageSupport}\n disableImageAlignmentButtons={true}\n nonEmpty={false}\n disableUnderline\n error={responseAreasError || correctResponseError}\n toolbarOpts={toolbarOpts}\n spellCheck={spellCheckEnabled}\n uploadSoundSupport={uploadSoundSupport}\n languageCharactersProps={[{ language: 'spanish' }, { language: 'special' }]}\n />\n {responseAreasError && <div className={classes.errorText}>{responseAreasError}</div>}\n {correctResponseError && <div className={classes.errorText}>{correctResponseError}</div>}\n\n <Choices\n model={model}\n duplicates={model.duplicates}\n error={choicesError}\n onChange={this.onResponsesChanged}\n toolbarOpts={toolbarOpts}\n maxChoices={maxChoices}\n uploadSoundSupport={uploadSoundSupport}\n />\n\n {rationaleEnabled && (\n <InputContainer label={rationale.label} className={classes.promptHolder}>\n <EditableHtml\n className={classes.prompt}\n markup={model.rationale || ''}\n onChange={this.onRationaleChanged}\n imageSupport={imageSupport}\n toolbarOpts={toolbarOpts}\n spellCheck={spellCheckEnabled}\n maxImageWidth={(maxImageWidth && maxImageWidth.rationale) || defaultImageMaxWidth}\n maxImageHeight={(maxImageHeight && maxImageHeight.rationale) || defaultImageMaxHeight}\n uploadSoundSupport={uploadSoundSupport}\n languageCharactersProps={[{ language: 'spanish' }, { language: 'special' }]}\n />\n </InputContainer>\n )}\n </div>\n </layout.ConfigLayout>\n </div>\n );\n }\n}\n\nconst Styled = withStyles(styles)(Main);\n\nexport default withDragContext(Styled);\n"],"file":"main.js"}
@@ -8,9 +8,9 @@
8
8
  "@material-ui/core": "^3.9.2",
9
9
  "@material-ui/icons": "^3.0.1",
10
10
  "@pie-framework/pie-configure-events": "^1.3.0",
11
- "@pie-lib/config-ui": "^11.1.4",
12
- "@pie-lib/drag": "^2.0.4",
13
- "@pie-lib/editable-html": "^9.3.0",
11
+ "@pie-lib/config-ui": "^11.2.0",
12
+ "@pie-lib/drag": "^2.0.5",
13
+ "@pie-lib/editable-html": "^9.4.0",
14
14
  "@pie-lib/math-rendering": "^2.5.1",
15
15
  "debug": "^3.1.0",
16
16
  "lodash": "^4.17.15",
@@ -236,9 +236,12 @@ var createCorrectResponseSession = function createCorrectResponseSession(questio
236
236
  exports.createCorrectResponseSession = createCorrectResponseSession;
237
237
 
238
238
  var validate = function validate() {
239
+ var _Object$values;
240
+
239
241
  var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
240
242
  var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
241
243
  var choices = model.choices,
244
+ correctResponse = model.correctResponse,
242
245
  markup = model.markup;
243
246
  var _config$minChoices = config.minChoices,
244
247
  minChoices = _config$minChoices === void 0 ? 2 : _config$minChoices,
@@ -247,6 +250,13 @@ var validate = function validate() {
247
250
  var errors = {};
248
251
  var nbOfResponseAreas = ((markup || '').match(/\{\{(\d+)\}\}/g) || []).length;
249
252
  var nbOfChoices = (choices || []).length;
253
+ var emptyResponseAreas = (_Object$values = Object.values(correctResponse)) === null || _Object$values === void 0 ? void 0 : _Object$values.filter(function (response) {
254
+ return !response;
255
+ });
256
+
257
+ if (emptyResponseAreas.length) {
258
+ errors.correctResponseError = 'There should be a choice defined for each response area.';
259
+ }
250
260
 
251
261
  if (nbOfResponseAreas > maxResponseAreas) {
252
262
  errors.responseAreasError = "No more than ".concat(maxResponseAreas, " response areas should be defined.");
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.js"],"names":["normalize","question","rationaleEnabled","promptEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","model","session","env","updateSession","Promise","resolve","normalizedQuestion","feedback","mode","responses","allCorrectResponses","possibleResponses","numberOfPossibleResponses","correctResponses","undefined","value","i","result","obj","choices","key","answer","filter","choice","lockChoiceOrder","out","prompt","disabled","responseCorrect","getScore","role","rationale","teacherInstructions","config","maxScore","Object","keys","correctResponse","length","correctCount","total","str","toFixed","parseFloat","outcome","partialScoringEnabled","partialScoring","enabled","score","empty","createCorrectResponseSession","id","validate","markup","minChoices","maxChoices","maxResponseAreas","errors","nbOfResponseAreas","match","nbOfChoices","responseAreasError","choicesError"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;;;;;AAEO,IAAMA,SAAS,GAAG,SAAZA,SAAY,CAACC,QAAD;AAAA;AACvBC,IAAAA,gBAAgB,EAAE,IADK;AAEvBC,IAAAA,aAAa,EAAE,IAFQ;AAGvBC,IAAAA,0BAA0B,EAAE,IAHL;AAIvBC,IAAAA,0BAA0B,EAAE;AAJL,KAKpBJ,QALoB;AAAA,CAAlB;AAQP;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AACO,SAASK,KAAT,CAAeL,QAAf,EAAyBM,OAAzB,EAAkCC,GAAlC,EAAuCC,aAAvC,EAAsD;AAC3D,SAAO,IAAIC,OAAJ;AAAA,6FAAY,iBAAOC,OAAP;AAAA;AAAA;AAAA;AAAA;AAAA;AACXC,cAAAA,kBADW,GACUZ,SAAS,CAACC,QAAD,CADnB;AAEbY,cAAAA,QAFa,GAEF,EAFE;;AAIjB,kBAAIL,GAAG,CAACM,IAAJ,KAAa,UAAjB,EAA6B;AAAA;AAC3B,sBAAMC,SAAS,GAAG,mCAAuBH,kBAAvB,KAA8C,EAAhE;AACA,sBAAMI,mBAAmB,GAAGD,SAAS,CAACE,iBAAtC;AACA,sBAAMC,yBAAyB,GAAGH,SAAS,CAACG,yBAAV,IAAuC,CAAzE;AACA,sBAAIC,gBAAgB,GAAGC,SAAvB;;AACA,8BAAkBb,OAAO,IAAI,EAA7B;AAAA,sBAAQc,KAAR,SAAQA,KAAR;;AAL2B,6CAOlBC,CAPkB;AAQzB,wBAAMC,MAAM,GAAG,wBACbP,mBADa,EAEb,UAACQ,GAAD,EAAMC,OAAN,EAAeC,GAAf,EAAuB;AACrB,0BAAMC,MAAM,GAAIN,KAAK,IAAIA,KAAK,CAACK,GAAD,CAAf,IAAyB,EAAxC;AAEAF,sBAAAA,GAAG,CAACX,QAAJ,CAAaa,GAAb,IAAoBD,OAAO,CAACH,CAAD,CAAP,KAAeK,MAAnC;;AAEA,0BAAIH,GAAG,CAACX,QAAJ,CAAaa,GAAb,CAAJ,EAAuB;AACrBF,wBAAAA,GAAG,CAACL,gBAAJ,IAAwB,CAAxB;AACD;;AAED,6BAAOK,GAAP;AACD,qBAZY,EAab;AAAEL,sBAAAA,gBAAgB,EAAE,CAApB;AAAuBN,sBAAAA,QAAQ,EAAE;AAAjC,qBAba,CAAf;;AAgBA,wBAAIM,gBAAgB,KAAKC,SAArB,IAAkCG,MAAM,CAACJ,gBAAP,GAA0BA,gBAAhE,EAAkF;AAChFA,sBAAAA,gBAAgB,GAAGI,MAAM,CAACJ,gBAA1B;AACAN,sBAAAA,QAAQ,GAAGU,MAAM,CAACV,QAAlB;AACD;;AAED,wBAAIU,MAAM,CAACJ,gBAAP,KAA4BD,yBAAhC,EAA2D;AACzD;AACD;AA/BwB;;AAO3B,uBAAK,IAAII,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGJ,yBAApB,EAA+CI,CAAC,EAAhD,EAAoD;AAAA,qCAA3CA,CAA2C;;AAAA,0CAuBhD;AAEH;AAhC0B;AAiC5B;;AAEGG,cAAAA,OAvCa,GAuCHb,kBAAkB,CAACa,OAAnB,IAA8Bb,kBAAkB,CAACa,OAAnB,CAA2BG,MAA3B,CAAkC,UAACC,MAAD;AAAA,uBAAY,CAAC,0BAAcA,MAAd,CAAb;AAAA,eAAlC,CAvC3B;AAyCXC,cAAAA,eAzCW,GAyCO,kCAAYlB,kBAAZ,EAAgCL,OAAhC,EAAyCC,GAAzC,CAzCP;;AAAA,kBA2CZsB,eA3CY;AAAA;AAAA;AAAA;;AAAA;AAAA,qBA4CC,yCAAmBL,OAAnB,EAA4BlB,OAA5B,EAAqCE,aAArC,EAAoD,IAApD,CA5CD;;AAAA;AA4CfgB,cAAAA,OA5Ce;;AAAA;AA+CXM,cAAAA,GA/CW,mCAgDZnB,kBAhDY;AAiDfoB,gBAAAA,MAAM,EAAEpB,kBAAkB,CAACT,aAAnB,GAAmCS,kBAAkB,CAACoB,MAAtD,GAA+D,IAjDxD;AAkDfP,gBAAAA,OAAO,EAAPA,OAlDe;AAmDfZ,gBAAAA,QAAQ,EAARA,QAnDe;AAoDfC,gBAAAA,IAAI,EAAEN,GAAG,CAACM,IApDK;AAqDfmB,gBAAAA,QAAQ,EAAEzB,GAAG,CAACM,IAAJ,KAAa,QArDR;AAsDfoB,gBAAAA,eAAe,EAAE1B,GAAG,CAACM,IAAJ,KAAa,UAAb,GAA0BqB,QAAQ,CAACvB,kBAAD,EAAqBL,OAArB,CAAR,KAA0C,CAApE,GAAwEa;AAtD1E;;AAyDjB,kBAAIZ,GAAG,CAAC4B,IAAJ,KAAa,YAAb,KAA8B5B,GAAG,CAACM,IAAJ,KAAa,MAAb,IAAuBN,GAAG,CAACM,IAAJ,KAAa,UAAlE,CAAJ,EAAmF;AACjFiB,gBAAAA,GAAG,CAACM,SAAJ,GAAgBzB,kBAAkB,CAACV,gBAAnB,GAAsCU,kBAAkB,CAACyB,SAAzD,GAAqE,IAArF;AACAN,gBAAAA,GAAG,CAACO,mBAAJ,GAA0B1B,kBAAkB,CAACR,0BAAnB,GACtBQ,kBAAkB,CAAC0B,mBADG,GAEtB,IAFJ;AAGD,eALD,MAKO;AACLP,gBAAAA,GAAG,CAACM,SAAJ,GAAgB,IAAhB;AACAN,gBAAAA,GAAG,CAACO,mBAAJ,GAA0B,IAA1B;AACD;;AAED3B,cAAAA,OAAO,CAACoB,GAAD,CAAP;;AAnEiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAAZ;;AAAA;AAAA;AAAA;AAAA,MAAP;AAqED;;AAEM,IAAMI,QAAQ,GAAG,SAAXA,QAAW,CAACI,MAAD,EAAShC,OAAT,EAAqB;AAC3C,MAAMQ,SAAS,GAAG,mCAAuBwB,MAAvB,CAAlB;AACA,MAAMvB,mBAAmB,GAAGD,SAAS,CAACE,iBAAtC;AACA,MAAMuB,QAAQ,GAAGC,MAAM,CAACC,IAAP,CAAYH,MAAM,CAACI,eAAnB,EAAoCC,MAArD;AACA,MAAM1B,yBAAyB,GAAGH,SAAS,CAACG,yBAAV,IAAuC,CAAzE;AACA,MAAI2B,YAAY,GAAG,CAAnB;;AACA,cAAkBtC,OAAO,IAAI,EAA7B;AAAA,MAAQc,KAAR,SAAQA,KAAR;;AAN2C,+BAQlCC,CARkC;AASzC,QAAMC,MAAM,GAAG,wBACbP,mBADa,EAEb,UAAC8B,KAAD,EAAQrB,OAAR,EAAiBC,GAAjB,EAAyB;AACvB,UAAMC,MAAM,GAAIN,KAAK,IAAIA,KAAK,CAACK,GAAD,CAAf,IAAyB,EAAxC;;AAEA,UAAID,OAAO,CAACH,CAAD,CAAP,KAAeK,MAAnB,EAA2B;AACzB,eAAOmB,KAAP;AACD;;AAED,aAAOA,KAAK,GAAG,CAAf;AACD,KAVY,EAWbN,QAXa,CAAf;;AAcA,QAAIjB,MAAM,GAAGsB,YAAb,EAA2B;AACzBA,MAAAA,YAAY,GAAGtB,MAAf;AACD;;AAED,QAAIA,MAAM,KAAKiB,QAAf,EAAyB;AACvB;AACD;AA7BwC;;AAQ3C,OAAK,IAAIlB,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGJ,yBAApB,EAA+CI,CAAC,EAAhD,EAAoD;AAAA,uBAA3CA,CAA2C;;AAAA,2BAoBhD;AAEH;;AAED,MAAMyB,GAAG,GAAGP,QAAQ,GAAG,CAACK,YAAY,GAAGL,QAAhB,EAA0BQ,OAA1B,CAAkC,CAAlC,CAAH,GAA0C,CAA9D;AAEA,SAAOC,UAAU,CAACF,GAAD,CAAjB;AACD,CAnCM;AAqCP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AACO,SAASG,OAAT,CAAiB5C,KAAjB,EAAwBC,OAAxB,EAA2C;AAAA,MAAVC,GAAU,uEAAJ,EAAI;AAChD,SAAO,IAAIE,OAAJ,CAAY,UAACC,OAAD,EAAa;AAC9B,QAAMwC,qBAAqB,GAAGC,gCAAeC,OAAf,CAAuB/C,KAAvB,EAA8BE,GAA9B,CAA9B;;AACA,QAAM8C,KAAK,GAAGnB,QAAQ,CAAC7B,KAAD,EAAQC,OAAR,CAAtB;AAEAI,IAAAA,OAAO,CAAC;AACN2C,MAAAA,KAAK,EAAEH,qBAAqB,GAAGG,KAAH,GAAWA,KAAK,KAAK,CAAV,GAAc,CAAd,GAAkB,CADnD;AAENC,MAAAA,KAAK,EAAE,CAAChD,OAAD,IAAY,yBAAQA,OAAR;AAFb,KAAD,CAAP;AAID,GARM,CAAP;AASD;;AAEM,IAAMiD,4BAA4B,GAAG,SAA/BA,4BAA+B,CAACvD,QAAD,EAAWO,GAAX,EAAmB;AAC7D,SAAO,IAAIE,OAAJ,CAAY,UAACC,OAAD,EAAa;AAC9B,QAAIH,GAAG,CAACM,IAAJ,KAAa,UAAb,IAA2BN,GAAG,CAAC4B,IAAJ,KAAa,YAA5C,EAA0D;AACxDzB,MAAAA,OAAO,CAAC;AACNU,QAAAA,KAAK,EAAEpB,QAAQ,CAAC0C,eADV;AAENc,QAAAA,EAAE,EAAE;AAFE,OAAD,CAAP;AAID,KALD,MAKO;AACL9C,MAAAA,OAAO,CAAC,IAAD,CAAP;AACD;AACF,GATM,CAAP;AAUD,CAXM;;;;AAaA,IAAM+C,QAAQ,GAAG,SAAXA,QAAW,GAA6B;AAAA,MAA5BpD,KAA4B,uEAApB,EAAoB;AAAA,MAAhBiC,MAAgB,uEAAP,EAAO;AACnD,MAAQd,OAAR,GAA4BnB,KAA5B,CAAQmB,OAAR;AAAA,MAAiBkC,MAAjB,GAA4BrD,KAA5B,CAAiBqD,MAAjB;AACA,2BAAyDpB,MAAzD,CAAQqB,UAAR;AAAA,MAAQA,UAAR,mCAAqB,CAArB;AAAA,MAAwBC,UAAxB,GAAyDtB,MAAzD,CAAwBsB,UAAxB;AAAA,MAAoCC,gBAApC,GAAyDvB,MAAzD,CAAoCuB,gBAApC;AACA,MAAMC,MAAM,GAAG,EAAf;AAEA,MAAMC,iBAAiB,GAAG,CAAC,CAACL,MAAM,IAAI,EAAX,EAAeM,KAAf,CAAqB,gBAArB,KAA0C,EAA3C,EAA+CrB,MAAzE;AACA,MAAMsB,WAAW,GAAG,CAACzC,OAAO,IAAI,EAAZ,EAAgBmB,MAApC;;AAEA,MAAIoB,iBAAiB,GAAGF,gBAAxB,EAA0C;AACxCC,IAAAA,MAAM,CAACI,kBAAP,0BAA4CL,gBAA5C;AACD,GAFD,MAEO,IAAIE,iBAAiB,GAAG,CAAxB,EAA2B;AAChCD,IAAAA,MAAM,CAACI,kBAAP,GAA4B,mDAA5B;AACD;;AAED,MAAID,WAAW,GAAGN,UAAlB,EAA8B;AAC5BG,IAAAA,MAAM,CAACK,YAAP,sCAAkDR,UAAlD;AACD,GAFD,MAEO,IAAIM,WAAW,GAAGL,UAAlB,EAA8B;AACnCE,IAAAA,MAAM,CAACK,YAAP,0BAAsCP,UAAtC;AACD;;AAED,SAAOE,MAAP;AACD,CArBM","sourcesContent":["import reduce from 'lodash/reduce';\nimport isEmpty from 'lodash/isEmpty';\nimport { getAllCorrectResponses, choiceIsEmpty } from './utils';\nimport { lockChoices, getShuffledChoices, partialScoring } from '@pie-lib/controller-utils';\n\nexport const normalize = (question) => ({\n rationaleEnabled: true,\n promptEnabled: true,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n ...question,\n});\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n * @param {*} updateSession - optional - a function that will set the properties passed into it on the session.\n */\nexport function model(question, session, env, updateSession) {\n return new Promise(async (resolve) => {\n const normalizedQuestion = normalize(question);\n let feedback = {};\n\n if (env.mode === 'evaluate') {\n const responses = getAllCorrectResponses(normalizedQuestion) || {};\n const allCorrectResponses = responses.possibleResponses;\n const numberOfPossibleResponses = responses.numberOfPossibleResponses || 0;\n let correctResponses = undefined;\n const { value } = session || {};\n\n for (let i = 0; i < numberOfPossibleResponses; i++) {\n const result = reduce(\n allCorrectResponses,\n (obj, choices, key) => {\n const answer = (value && value[key]) || '';\n\n obj.feedback[key] = choices[i] === answer;\n\n if (obj.feedback[key]) {\n obj.correctResponses += 1;\n }\n\n return obj;\n },\n { correctResponses: 0, feedback: {} },\n );\n\n if (correctResponses === undefined || result.correctResponses > correctResponses) {\n correctResponses = result.correctResponses;\n feedback = result.feedback;\n }\n\n if (result.correctResponses === numberOfPossibleResponses) {\n break;\n }\n }\n }\n\n let choices = normalizedQuestion.choices && normalizedQuestion.choices.filter((choice) => !choiceIsEmpty(choice));\n\n const lockChoiceOrder = lockChoices(normalizedQuestion, session, env);\n\n if (!lockChoiceOrder) {\n choices = await getShuffledChoices(choices, session, updateSession, 'id');\n }\n\n const out = {\n ...normalizedQuestion,\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n choices,\n feedback,\n mode: env.mode,\n disabled: env.mode !== 'gather',\n responseCorrect: env.mode === 'evaluate' ? getScore(normalizedQuestion, session) === 1 : undefined,\n };\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n resolve(out);\n });\n}\n\nexport const getScore = (config, session) => {\n const responses = getAllCorrectResponses(config);\n const allCorrectResponses = responses.possibleResponses;\n const maxScore = Object.keys(config.correctResponse).length;\n const numberOfPossibleResponses = responses.numberOfPossibleResponses || 0;\n let correctCount = 0;\n const { value } = session || {};\n\n for (let i = 0; i < numberOfPossibleResponses; i++) {\n const result = reduce(\n allCorrectResponses,\n (total, choices, key) => {\n const answer = (value && value[key]) || '';\n\n if (choices[i] === answer) {\n return total;\n }\n\n return total - 1;\n },\n maxScore,\n );\n\n if (result > correctCount) {\n correctCount = result;\n }\n\n if (result === maxScore) {\n break;\n }\n }\n\n const str = maxScore ? (correctCount / maxScore).toFixed(2) : 0;\n\n return parseFloat(str);\n};\n\n/**\n *\n * The score is partial by default for checkbox mode, allOrNothing for radio mode.\n * To disable partial scoring for checkbox mode you either set model.partialScoring = false or env.partialScoring =\n * false. the value in `env` will override the value in `model`.\n * @param {Object} model - the main model\n * @param {boolean} model.partialScoring - is partial scoring enabled (if undefined set to to true)\n * @param {*} session\n * @param {Object} env\n * @param {boolean} env.partialScoring - is partial scoring enabled (if undefined default to true) This overrides\n * `model.partialScoring`.\n */\nexport function outcome(model, session, env = {}) {\n return new Promise((resolve) => {\n const partialScoringEnabled = partialScoring.enabled(model, env);\n const score = getScore(model, session);\n\n resolve({\n score: partialScoringEnabled ? score : score === 1 ? 1 : 0,\n empty: !session || isEmpty(session),\n });\n });\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n resolve({\n value: question.correctResponse,\n id: '1',\n });\n } else {\n resolve(null);\n }\n });\n};\n\nexport const validate = (model = {}, config = {}) => {\n const { choices, markup } = model;\n const { minChoices = 2, maxChoices, maxResponseAreas } = config;\n const errors = {};\n\n const nbOfResponseAreas = ((markup || '').match(/\\{\\{(\\d+)\\}\\}/g) || []).length;\n const nbOfChoices = (choices || []).length;\n\n if (nbOfResponseAreas > maxResponseAreas) {\n errors.responseAreasError = `No more than ${maxResponseAreas} response areas should be defined.`;\n } else if (nbOfResponseAreas < 1) {\n errors.responseAreasError = 'There should be at least 1 response area defined.';\n }\n\n if (nbOfChoices < minChoices) {\n errors.choicesError = `There should be at least ${minChoices} tokens defined.`;\n } else if (nbOfChoices > maxChoices) {\n errors.choicesError = `No more than ${maxChoices} tokens should be defined.`;\n }\n\n return errors;\n};\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../src/index.js"],"names":["normalize","question","rationaleEnabled","promptEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","model","session","env","updateSession","Promise","resolve","normalizedQuestion","feedback","mode","responses","allCorrectResponses","possibleResponses","numberOfPossibleResponses","correctResponses","undefined","value","i","result","obj","choices","key","answer","filter","choice","lockChoiceOrder","out","prompt","disabled","responseCorrect","getScore","role","rationale","teacherInstructions","config","maxScore","Object","keys","correctResponse","length","correctCount","total","str","toFixed","parseFloat","outcome","partialScoringEnabled","partialScoring","enabled","score","empty","createCorrectResponseSession","id","validate","markup","minChoices","maxChoices","maxResponseAreas","errors","nbOfResponseAreas","match","nbOfChoices","emptyResponseAreas","values","response","correctResponseError","responseAreasError","choicesError"],"mappings":"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","sourcesContent":["import reduce from 'lodash/reduce';\nimport isEmpty from 'lodash/isEmpty';\nimport { getAllCorrectResponses, choiceIsEmpty } from './utils';\nimport { lockChoices, getShuffledChoices, partialScoring } from '@pie-lib/controller-utils';\n\nexport const normalize = (question) => ({\n rationaleEnabled: true,\n promptEnabled: true,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n ...question,\n});\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n * @param {*} updateSession - optional - a function that will set the properties passed into it on the session.\n */\nexport function model(question, session, env, updateSession) {\n return new Promise(async (resolve) => {\n const normalizedQuestion = normalize(question);\n let feedback = {};\n\n if (env.mode === 'evaluate') {\n const responses = getAllCorrectResponses(normalizedQuestion) || {};\n const allCorrectResponses = responses.possibleResponses;\n const numberOfPossibleResponses = responses.numberOfPossibleResponses || 0;\n let correctResponses = undefined;\n const { value } = session || {};\n\n for (let i = 0; i < numberOfPossibleResponses; i++) {\n const result = reduce(\n allCorrectResponses,\n (obj, choices, key) => {\n const answer = (value && value[key]) || '';\n\n obj.feedback[key] = choices[i] === answer;\n\n if (obj.feedback[key]) {\n obj.correctResponses += 1;\n }\n\n return obj;\n },\n { correctResponses: 0, feedback: {} },\n );\n\n if (correctResponses === undefined || result.correctResponses > correctResponses) {\n correctResponses = result.correctResponses;\n feedback = result.feedback;\n }\n\n if (result.correctResponses === numberOfPossibleResponses) {\n break;\n }\n }\n }\n\n let choices = normalizedQuestion.choices && normalizedQuestion.choices.filter((choice) => !choiceIsEmpty(choice));\n\n const lockChoiceOrder = lockChoices(normalizedQuestion, session, env);\n\n if (!lockChoiceOrder) {\n choices = await getShuffledChoices(choices, session, updateSession, 'id');\n }\n\n const out = {\n ...normalizedQuestion,\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n choices,\n feedback,\n mode: env.mode,\n disabled: env.mode !== 'gather',\n responseCorrect: env.mode === 'evaluate' ? getScore(normalizedQuestion, session) === 1 : undefined,\n };\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n resolve(out);\n });\n}\n\nexport const getScore = (config, session) => {\n const responses = getAllCorrectResponses(config);\n const allCorrectResponses = responses.possibleResponses;\n const maxScore = Object.keys(config.correctResponse).length;\n const numberOfPossibleResponses = responses.numberOfPossibleResponses || 0;\n let correctCount = 0;\n const { value } = session || {};\n\n for (let i = 0; i < numberOfPossibleResponses; i++) {\n const result = reduce(\n allCorrectResponses,\n (total, choices, key) => {\n const answer = (value && value[key]) || '';\n\n if (choices[i] === answer) {\n return total;\n }\n\n return total - 1;\n },\n maxScore,\n );\n\n if (result > correctCount) {\n correctCount = result;\n }\n\n if (result === maxScore) {\n break;\n }\n }\n\n const str = maxScore ? (correctCount / maxScore).toFixed(2) : 0;\n\n return parseFloat(str);\n};\n\n/**\n *\n * The score is partial by default for checkbox mode, allOrNothing for radio mode.\n * To disable partial scoring for checkbox mode you either set model.partialScoring = false or env.partialScoring =\n * false. the value in `env` will override the value in `model`.\n * @param {Object} model - the main model\n * @param {boolean} model.partialScoring - is partial scoring enabled (if undefined set to to true)\n * @param {*} session\n * @param {Object} env\n * @param {boolean} env.partialScoring - is partial scoring enabled (if undefined default to true) This overrides\n * `model.partialScoring`.\n */\nexport function outcome(model, session, env = {}) {\n return new Promise((resolve) => {\n const partialScoringEnabled = partialScoring.enabled(model, env);\n const score = getScore(model, session);\n\n resolve({\n score: partialScoringEnabled ? score : score === 1 ? 1 : 0,\n empty: !session || isEmpty(session),\n });\n });\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n resolve({\n value: question.correctResponse,\n id: '1',\n });\n } else {\n resolve(null);\n }\n });\n};\n\nexport const validate = (model = {}, config = {}) => {\n const { choices, correctResponse, markup } = model;\n const { minChoices = 2, maxChoices, maxResponseAreas } = config;\n const errors = {};\n\n const nbOfResponseAreas = ((markup || '').match(/\\{\\{(\\d+)\\}\\}/g) || []).length;\n const nbOfChoices = (choices || []).length;\n const emptyResponseAreas = Object.values(correctResponse)?.filter((response) => !response);\n\n if (emptyResponseAreas.length) {\n errors.correctResponseError = 'There should be a choice defined for each response area.';\n }\n\n if (nbOfResponseAreas > maxResponseAreas) {\n errors.responseAreasError = `No more than ${maxResponseAreas} response areas should be defined.`;\n } else if (nbOfResponseAreas < 1) {\n errors.responseAreasError = 'There should be at least 1 response area defined.';\n }\n\n if (nbOfChoices < minChoices) {\n errors.choicesError = `There should be at least ${minChoices} tokens defined.`;\n } else if (nbOfChoices > maxChoices) {\n errors.choicesError = `No more than ${maxChoices} tokens should be defined.`;\n }\n\n return errors;\n};\n"],"file":"index.js"}
@@ -51,6 +51,11 @@
51
51
  }
52
52
  }
53
53
  },
54
+ "settingsPanelDisabled": {
55
+ "description": "Indicates if the settings panel is not available",
56
+ "type": "boolean",
57
+ "title": "settingsPanelDisabled"
58
+ },
54
59
  "spellCheck": {
55
60
  "title": "ConfigureProp",
56
61
  "type": "object",
@@ -38,6 +38,10 @@ Indicates if the item has to be displayed in the Settings Panel
38
38
 
39
39
  Indicates the label for the item that has to be displayed in the Settings Panel
40
40
 
41
+ # `settingsPanelDisabled` (boolean)
42
+
43
+ Indicates if the settings panel is not available
44
+
41
45
  # `spellCheck` (object)
42
46
 
43
47
  Properties of the `spellCheck` object:
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "access": "public"
5
5
  },
6
6
  "repository": "pie-framework/pie-elements",
7
- "version": "4.4.1",
7
+ "version": "4.4.2-next.120+851bb10e8",
8
8
  "description": "",
9
9
  "scripts": {
10
10
  "test": "echo \"Error: no test specified\" && exit 1",
@@ -14,7 +14,7 @@
14
14
  "@material-ui/core": "^3.9.2",
15
15
  "@pie-framework/pie-player-events": "^0.1.0",
16
16
  "@pie-lib/correct-answer-toggle": "^2.3.47",
17
- "@pie-lib/mask-markup": "^1.12.20",
17
+ "@pie-lib/mask-markup": "^1.12.21",
18
18
  "@pie-lib/math-rendering": "^2.5.1",
19
19
  "@pie-lib/render-ui": "^4.13.7",
20
20
  "classnames": "^2.2.5",
@@ -25,7 +25,7 @@
25
25
  },
26
26
  "author": "",
27
27
  "license": "ISC",
28
- "gitHead": "4b3c97b360f5c94d400b37d3b900fd42ef8e4f1c",
28
+ "gitHead": "851bb10e8e0f8605c2c39f4f5c64cf689a6c6e1e",
29
29
  "main": "lib/index.js",
30
30
  "module": "src/index.js"
31
31
  }