@pie-element/image-cloze-association 3.6.18 → 3.6.20-beta.1443

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.
Files changed (57) hide show
  1. package/CHANGELOG.md +331 -0
  2. package/configure/CHANGELOG.md +310 -0
  3. package/configure/lib/defaults.js +16 -0
  4. package/configure/lib/defaults.js.map +1 -1
  5. package/configure/lib/index.js +16 -2
  6. package/configure/lib/index.js.map +1 -1
  7. package/configure/lib/root.js +42 -12
  8. package/configure/lib/root.js.map +1 -1
  9. package/configure/package.json +4 -3
  10. package/configure/src/__tests__/index.test.js +12 -15
  11. package/configure/src/defaults.js +20 -4
  12. package/configure/src/index.js +23 -3
  13. package/configure/src/root.jsx +41 -25
  14. package/controller/CHANGELOG.md +11 -0
  15. package/controller/lib/index.js +4 -3
  16. package/controller/lib/index.js.map +1 -1
  17. package/controller/lib/utils.js +2 -2
  18. package/controller/lib/utils.js.map +1 -1
  19. package/controller/package.json +2 -2
  20. package/controller/src/__tests__/index.test.js +34 -67
  21. package/controller/src/index.js +38 -26
  22. package/controller/src/utils.js +10 -9
  23. package/docs/config-schema.json +100 -0
  24. package/docs/config-schema.json.md +76 -0
  25. package/docs/demo/config.js +2 -2
  26. package/docs/demo/generate.js +21 -17
  27. package/docs/demo/session.js +1 -1
  28. package/docs/pie-schema.json +34 -1
  29. package/docs/pie-schema.json.md +24 -0
  30. package/lib/constants.js.map +1 -1
  31. package/lib/evaluation-icon.js.map +1 -1
  32. package/lib/image-container.js.map +1 -1
  33. package/lib/image-drop-target.js.map +1 -1
  34. package/lib/index.js +3 -0
  35. package/lib/index.js.map +1 -1
  36. package/lib/interactive-section.js.map +1 -1
  37. package/lib/possible-response.js.map +1 -1
  38. package/lib/possible-responses.js.map +1 -1
  39. package/lib/root.js +2 -2
  40. package/lib/root.js.map +1 -1
  41. package/lib/utils-correctness.js +3 -3
  42. package/lib/utils-correctness.js.map +1 -1
  43. package/package.json +6 -6
  44. package/src/__tests__/image-container.test.jsx +5 -5
  45. package/src/__tests__/possible-response.test.jsx +2 -2
  46. package/src/__tests__/root.test.jsx +3 -3
  47. package/src/__tests__/utils.test.js +144 -148
  48. package/src/constants.js +3 -3
  49. package/src/evaluation-icon.jsx +8 -17
  50. package/src/image-container.jsx +11 -19
  51. package/src/image-drop-target.jsx +40 -39
  52. package/src/index.js +10 -18
  53. package/src/interactive-section.jsx +15 -22
  54. package/src/possible-response.jsx +30 -23
  55. package/src/possible-responses.jsx +17 -25
  56. package/src/root.jsx +29 -69
  57. package/src/utils-correctness.js +31 -23
@@ -35,9 +35,9 @@ var _root = _interopRequireDefault(require("./root"));
35
35
 
36
36
  var _defaults = _interopRequireDefault(require("./defaults"));
37
37
 
38
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
38
+ 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; }
39
39
 
40
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
40
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
41
41
 
42
42
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
43
43
 
@@ -118,6 +118,16 @@ var ImageClozeAssociationConfigure = /*#__PURE__*/function (_HTMLElement) {
118
118
  value: function onDeleteImage(src, done) {
119
119
  this.dispatchEvent(new _pieConfigureEvents.DeleteImageEvent(src, done));
120
120
  }
121
+ }, {
122
+ key: "insertSound",
123
+ value: function insertSound(handler) {
124
+ this.dispatchEvent(new _pieConfigureEvents.InsertSoundEvent(handler));
125
+ }
126
+ }, {
127
+ key: "onDeleteSound",
128
+ value: function onDeleteSound(src, done) {
129
+ this.dispatchEvent(new _pieConfigureEvents.DeleteSoundEvent(src, done));
130
+ }
121
131
  }, {
122
132
  key: "_render",
123
133
  value: function _render() {
@@ -132,6 +142,10 @@ var ImageClozeAssociationConfigure = /*#__PURE__*/function (_HTMLElement) {
132
142
  imageSupport: {
133
143
  add: this.insertImage.bind(this),
134
144
  "delete": this.onDeleteImage.bind(this)
145
+ },
146
+ uploadSoundSupport: {
147
+ add: this.insertSound.bind(this),
148
+ "delete": this.onDeleteSound.bind(this)
135
149
  }
136
150
  });
137
151
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.js"],"names":["log","ImageClozeAssociationConfigure","_model","createDefaultModel","onModelChanged","bind","_configuration","sensibleDefaults","configuration","s","_render","c","_disableSidePanel","reset","resetValue","dispatchEvent","ModelUpdatedEvent","m","dispatchModelUpdated","config","handler","InsertImageEvent","src","done","DeleteImageEvent","element","React","createElement","Root","disableSidePanel","model","onConfigurationChanged","imageSupport","add","insertImage","onDeleteImage","ReactDOM","render","HTMLElement"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AAEA;;AACA;;AACA;;AAEA;;AACA;;;;;;;;;;AAEA,IAAMA,GAAG,GAAG,uBAAM,mCAAN,CAAZ;;IAEqBC,8B;;;;;AAMnB,4CAAc;AAAA;;AAAA;AACZ;AACA,UAAKC,MAAL,GAAcD,8BAA8B,CAACE,kBAA/B,EAAd;AACA,UAAKC,cAAL,GAAsB,MAAKA,cAAL,CAAoBC,IAApB,gDAAtB;AACA,UAAKC,cAAL,GAAsBC,qBAAiBC,aAAvC;AAJY;AAKb;;;;SAED,aAAUC,CAAV,EAAa;AACX,WAAKP,MAAL,GAAcD,8BAA8B,CAACE,kBAA/B,CAAkDM,CAAlD,CAAd;;AACA,WAAKC,OAAL;AACD;;;SAED,aAAkBC,CAAlB,EAAqB;AACnB,WAAKL,cAAL,GAAsBK,CAAtB;;AACA,WAAKD,OAAL;AACD;;;SAED,aAAqBD,CAArB,EAAwB;AACtB,WAAKG,iBAAL,GAAyBH,CAAzB;;AACA,WAAKC,OAAL;AACD;;;WAED,8BAAqBG,KAArB,EAA4B;AAC1B,UAAMC,UAAU,GAAG,CAAC,CAACD,KAArB;AAEA,WAAKE,aAAL,CAAmB,IAAIC,qCAAJ,CAAsB,KAAKd,MAA3B,EAAmCY,UAAnC,CAAnB;AACD;;;WAED,wBAAeG,CAAf,EAAkBJ,KAAlB,EAAyB;AACvB,WAAKX,MAAL,GAAce,CAAd;AACA,WAAKC,oBAAL,CAA0BL,KAA1B;;AACA,WAAKH,OAAL;AACD;;;WAED,gCAAuBS,MAAvB,EAA+B;AAC7B,WAAKb,cAAL,GAAsBa,MAAtB;;AACA,WAAKT,OAAL;AACD;AAED;AACF;AACA;AACA;;;;WACE,qBAAYU,OAAZ,EAAqB;AACnB,WAAKL,aAAL,CAAmB,IAAIM,oCAAJ,CAAqBD,OAArB,CAAnB;AACD;;;WAED,uBAAcE,GAAd,EAAmBC,IAAnB,EAAyB;AACvB,WAAKR,aAAL,CAAmB,IAAIS,oCAAJ,CAAqBF,GAArB,EAA0BC,IAA1B,CAAnB;AACD;;;WAED,mBAAU;AACRvB,MAAAA,GAAG,CAAC,SAAD,CAAH;;AACA,UAAIyB,OAAO,gBAAGC,kBAAMC,aAAN,CAAoBC,gBAApB,EAA0B;AACtCC,QAAAA,gBAAgB,EAAE,KAAKjB,iBADe;AAEtCkB,QAAAA,KAAK,EAAE,KAAK5B,MAF0B;AAGtCM,QAAAA,aAAa,EAAE,KAAKF,cAHkB;AAItCF,QAAAA,cAAc,EAAE,KAAKA,cAAL,CAAoBC,IAApB,CAAyB,IAAzB,CAJsB;AAKtC0B,QAAAA,sBAAsB,EAAE,KAAKA,sBAAL,CAA4B1B,IAA5B,CAAiC,IAAjC,CALc;AAMtC2B,QAAAA,YAAY,EAAE;AACZC,UAAAA,GAAG,EAAE,KAAKC,WAAL,CAAiB7B,IAAjB,CAAsB,IAAtB,CADO;AAEZ,oBAAQ,KAAK8B,aAAL,CAAmB9B,IAAnB,CAAwB,IAAxB;AAFI;AANwB,OAA1B,CAAd;;AAWA+B,2BAASC,MAAT,CAAgBZ,OAAhB,EAAyB,IAAzB;AACD;;;kDAvEyDa,W;;;iCAAvCrC,8B,wBACS;AAAA,MAAC6B,KAAD,uEAAS,EAAT;AAAA,yCACvBvB,qBAAiBuB,KADM,GAEvBA,KAFuB;AAAA,C","sourcesContent":["import { DeleteImageEvent, InsertImageEvent, ModelUpdatedEvent } from '@pie-framework/pie-configure-events';\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport debug from 'debug';\n\nimport Root from './root';\nimport sensibleDefaults from './defaults';\n\nconst log = debug('image-cloze-association:configure');\n\nexport default class ImageClozeAssociationConfigure extends HTMLElement {\n static createDefaultModel = (model = {}) => ({\n ...sensibleDefaults.model,\n ...model,\n });\n\n constructor() {\n super();\n this._model = ImageClozeAssociationConfigure.createDefaultModel();\n this.onModelChanged = this.onModelChanged.bind(this);\n this._configuration = sensibleDefaults.configuration;\n }\n\n set model(s) {\n this._model = ImageClozeAssociationConfigure.createDefaultModel(s);\n this._render();\n }\n\n set configuration(c) {\n this._configuration = c;\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 = m;\n this.dispatchModelUpdated(reset);\n this._render();\n }\n\n onConfigurationChanged(config) {\n this._configuration = config;\n this._render();\n }\n\n /**\n *\n * @param {done, progress, file} handler\n */\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 _render() {\n log('_render');\n let element = React.createElement(Root, {\n disableSidePanel: this._disableSidePanel,\n model: this._model,\n configuration: this._configuration,\n onModelChanged: this.onModelChanged.bind(this),\n onConfigurationChanged: this.onConfigurationChanged.bind(this),\n imageSupport: {\n add: this.insertImage.bind(this),\n delete: this.onDeleteImage.bind(this)\n }\n });\n ReactDOM.render(element, this);\n }\n}\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../src/index.js"],"names":["log","ImageClozeAssociationConfigure","_model","createDefaultModel","onModelChanged","bind","_configuration","sensibleDefaults","configuration","s","_render","c","_disableSidePanel","reset","resetValue","dispatchEvent","ModelUpdatedEvent","m","dispatchModelUpdated","config","handler","InsertImageEvent","src","done","DeleteImageEvent","InsertSoundEvent","DeleteSoundEvent","element","React","createElement","Root","disableSidePanel","model","onConfigurationChanged","imageSupport","add","insertImage","onDeleteImage","uploadSoundSupport","insertSound","onDeleteSound","ReactDOM","render","HTMLElement"],"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 debug from 'debug';\n\nimport Root from './root';\nimport sensibleDefaults from './defaults';\n\nconst log = debug('image-cloze-association:configure');\n\nexport default class ImageClozeAssociationConfigure extends HTMLElement {\n static createDefaultModel = (model = {}) => ({\n ...sensibleDefaults.model,\n ...model,\n });\n\n constructor() {\n super();\n this._model = ImageClozeAssociationConfigure.createDefaultModel();\n this.onModelChanged = this.onModelChanged.bind(this);\n this._configuration = sensibleDefaults.configuration;\n }\n\n set model(s) {\n this._model = ImageClozeAssociationConfigure.createDefaultModel(s);\n this._render();\n }\n\n set configuration(c) {\n this._configuration = c;\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 = m;\n this.dispatchModelUpdated(reset);\n this._render();\n }\n\n onConfigurationChanged(config) {\n this._configuration = config;\n this._render();\n }\n\n /**\n *\n * @param {done, progress, file} handler\n */\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(Root, {\n disableSidePanel: this._disableSidePanel,\n model: this._model,\n configuration: this._configuration,\n onModelChanged: this.onModelChanged.bind(this),\n onConfigurationChanged: this.onConfigurationChanged.bind(this),\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"}
@@ -25,15 +25,15 @@ var _react = _interopRequireDefault(require("react"));
25
25
 
26
26
  var _propTypes = _interopRequireDefault(require("prop-types"));
27
27
 
28
- var _styles = require("@material-ui/core/styles");
29
-
30
28
  var _configUi = require("@pie-lib/config-ui");
31
29
 
32
30
  var _editableHtml = _interopRequireDefault(require("@pie-lib/editable-html"));
33
31
 
34
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
32
+ var _styles = require("@material-ui/core/styles");
33
+
34
+ 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; }
35
35
 
36
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
36
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
37
37
 
38
38
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
39
39
 
@@ -74,13 +74,32 @@ var Root = /*#__PURE__*/function (_React$Component) {
74
74
  configuration = _this$props.configuration,
75
75
  onModelChanged = _this$props.onModelChanged,
76
76
  onConfigurationChanged = _this$props.onConfigurationChanged,
77
- imageSupport = _this$props.imageSupport;
77
+ imageSupport = _this$props.imageSupport,
78
+ uploadSoundSupport = _this$props.uploadSoundSupport;
78
79
 
79
80
  var _ref = configuration || {},
81
+ _ref$maxImageWidth = _ref.maxImageWidth,
82
+ maxImageWidth = _ref$maxImageWidth === void 0 ? {} : _ref$maxImageWidth,
83
+ _ref$maxImageHeight = _ref.maxImageHeight,
84
+ maxImageHeight = _ref$maxImageHeight === void 0 ? {} : _ref$maxImageHeight,
85
+ settingsPanelDisabled = _ref.settingsPanelDisabled,
86
+ _ref$spellCheck = _ref.spellCheck,
87
+ spellCheck = _ref$spellCheck === void 0 ? {} : _ref$spellCheck,
80
88
  _ref$teacherInstructi = _ref.teacherInstructions,
81
- teacherInstructions = _ref$teacherInstructi === void 0 ? {} : _ref$teacherInstructi;
82
-
89
+ teacherInstructions = _ref$teacherInstructi === void 0 ? {} : _ref$teacherInstructi,
90
+ _ref$withRubric = _ref.withRubric,
91
+ withRubric = _ref$withRubric === void 0 ? {} : _ref$withRubric;
92
+
93
+ var _ref2 = model || {},
94
+ spellCheckEnabled = _ref2.spellCheckEnabled;
95
+
96
+ var panelProperties = {
97
+ teacherInstructionsEnabled: teacherInstructions.settings && toggle(teacherInstructions.label),
98
+ spellCheckEnabled: spellCheck.settings && toggle(spellCheck.label),
99
+ rubricEnabled: (withRubric === null || withRubric === void 0 ? void 0 : withRubric.settings) && toggle(withRubric === null || withRubric === void 0 ? void 0 : withRubric.label)
100
+ };
83
101
  return /*#__PURE__*/_react["default"].createElement(_configUi.layout.ConfigLayout, {
102
+ hideSettings: settingsPanelDisabled,
84
103
  settings: /*#__PURE__*/_react["default"].createElement(Panel, {
85
104
  model: model,
86
105
  configuration: configuration,
@@ -91,9 +110,7 @@ var Root = /*#__PURE__*/function (_React$Component) {
91
110
  return onConfigurationChanged(config);
92
111
  },
93
112
  groups: {
94
- 'Properties': {
95
- teacherInstructionsEnabled: teacherInstructions.settings && toggle(teacherInstructions.label)
96
- }
113
+ Properties: panelProperties
97
114
  }
98
115
  })
99
116
  }, /*#__PURE__*/_react["default"].createElement("div", {
@@ -106,8 +123,17 @@ var Root = /*#__PURE__*/function (_React$Component) {
106
123
  markup: model.teacherInstructions || '',
107
124
  onChange: this.onTeacherInstructionsChanged,
108
125
  imageSupport: imageSupport,
109
- nonEmpty: false
110
- })), "Image cloze association"));
126
+ nonEmpty: false,
127
+ spellCheck: spellCheckEnabled,
128
+ maxImageWidth: maxImageWidth && maxImageWidth.teacherInstructions,
129
+ maxImageHeight: maxImageHeight && maxImageHeight.teacherInstructions,
130
+ uploadSoundSupport: uploadSoundSupport,
131
+ languageCharactersProps: [{
132
+ language: 'spanish'
133
+ }, {
134
+ language: 'special'
135
+ }]
136
+ })), /*#__PURE__*/_react["default"].createElement("div", null, "Image cloze association")));
111
137
  }
112
138
  }]);
113
139
  return Root;
@@ -140,6 +166,10 @@ Root.propTypes = {
140
166
  imageSupport: _propTypes["default"].shape({
141
167
  add: _propTypes["default"].func.isRequired,
142
168
  "delete": _propTypes["default"].func.isRequired
169
+ }),
170
+ uploadSoundSupport: _propTypes["default"].shape({
171
+ add: _propTypes["default"].func.isRequired,
172
+ "delete": _propTypes["default"].func.isRequired
143
173
  })
144
174
  };
145
175
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/root.jsx"],"names":["Panel","settings","toggle","Root","teacherInstructions","props","onModelChanged","model","classes","configuration","onConfigurationChanged","imageSupport","config","teacherInstructionsEnabled","label","content","promptHolder","prompt","onTeacherInstructionsChanged","React","Component","styles","theme","base","marginTop","spacing","unit","width","paddingTop","propTypes","PropTypes","object","isRequired","func","shape","add"],"mappings":"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","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport {\n settings,\n layout,\n InputContainer\n} from '@pie-lib/config-ui';\nimport EditableHtml from '@pie-lib/editable-html';\n\nconst { Panel, toggle } = settings;\n\nexport class Root extends React.Component {\n onTeacherInstructionsChanged = teacherInstructions => {\n this.props.onModelChanged({\n ...this.props.model,\n teacherInstructions\n });\n };\n\n render() {\n const { classes, model, configuration, onModelChanged, onConfigurationChanged, imageSupport } = this.props;\n const { teacherInstructions = {} } = configuration || {};\n\n return (\n <layout.ConfigLayout\n settings={\n <Panel\n model={model}\n configuration={configuration}\n onChangeModel={model => onModelChanged(model)}\n onChangeConfiguration={config => onConfigurationChanged(config)}\n groups={{\n 'Properties': {\n teacherInstructionsEnabled: teacherInstructions.settings && toggle(teacherInstructions.label),\n },\n }}\n />\n }\n >\n <div className={classes.content}>\n {model && model.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 />\n </InputContainer>\n )}\n\n Image cloze association\n </div>\n </layout.ConfigLayout>\n );\n }\n}\n\nconst styles = theme => ({\n base: {\n marginTop: theme.spacing.unit * 3\n },\n promptHolder: {\n width: '100%',\n paddingTop: theme.spacing.unit * 2\n },\n prompt: {\n paddingTop: theme.spacing.unit * 2,\n width: '100%'\n },\n});\n\nRoot.propTypes = {\n classes: PropTypes.object.isRequired,\n onModelChanged: PropTypes.func,\n onConfigurationChanged: PropTypes.func,\n model: PropTypes.object.isRequired,\n configuration: PropTypes.object.isRequired,\n imageSupport: PropTypes.shape({\n add: PropTypes.func.isRequired,\n delete: PropTypes.func.isRequired\n })\n};\n\nexport default withStyles(styles)(Root);\n"],"file":"root.js"}
1
+ {"version":3,"sources":["../src/root.jsx"],"names":["Panel","settings","toggle","Root","teacherInstructions","props","onModelChanged","model","classes","configuration","onConfigurationChanged","imageSupport","uploadSoundSupport","maxImageWidth","maxImageHeight","settingsPanelDisabled","spellCheck","withRubric","spellCheckEnabled","panelProperties","teacherInstructionsEnabled","label","rubricEnabled","config","Properties","content","promptHolder","prompt","onTeacherInstructionsChanged","language","React","Component","styles","theme","base","marginTop","spacing","unit","width","paddingTop","propTypes","PropTypes","object","isRequired","func","shape","add"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;;;;;;;;;AAEA,IAAQA,KAAR,GAA0BC,kBAA1B,CAAQD,KAAR;AAAA,IAAeE,MAAf,GAA0BD,kBAA1B,CAAeC,MAAf;;IAEaC,I;;;;;;;;;;;;;;;qHACoB,UAACC,mBAAD,EAAyB;AACtD,YAAKC,KAAL,CAAWC,cAAX,iCAA+B,MAAKD,KAAL,CAAWE,KAA1C;AAAiDH,QAAAA,mBAAmB,EAAnBA;AAAjD;AACD,K;;;;;;WAED,kBAAS;AACP,wBACE,KAAKC,KADP;AAAA,UAAQG,OAAR,eAAQA,OAAR;AAAA,UAAiBD,KAAjB,eAAiBA,KAAjB;AAAA,UAAwBE,aAAxB,eAAwBA,aAAxB;AAAA,UAAuCH,cAAvC,eAAuCA,cAAvC;AAAA,UAAuDI,sBAAvD,eAAuDA,sBAAvD;AAAA,UAA+EC,YAA/E,eAA+EA,YAA/E;AAAA,UAA6FC,kBAA7F,eAA6FA,kBAA7F;;AAEA,iBAOIH,aAAa,IAAI,EAPrB;AAAA,oCACEI,aADF;AAAA,UACEA,aADF,mCACkB,EADlB;AAAA,qCAEEC,cAFF;AAAA,UAEEA,cAFF,oCAEmB,EAFnB;AAAA,UAGEC,qBAHF,QAGEA,qBAHF;AAAA,iCAIEC,UAJF;AAAA,UAIEA,UAJF,gCAIe,EAJf;AAAA,uCAKEZ,mBALF;AAAA,UAKEA,mBALF,sCAKwB,EALxB;AAAA,iCAMEa,UANF;AAAA,UAMEA,UANF,gCAMe,EANf;;AAQA,kBAA8BV,KAAK,IAAI,EAAvC;AAAA,UAAQW,iBAAR,SAAQA,iBAAR;;AAEA,UAAMC,eAAe,GAAG;AACtBC,QAAAA,0BAA0B,EAAEhB,mBAAmB,CAACH,QAApB,IAAgCC,MAAM,CAACE,mBAAmB,CAACiB,KAArB,CAD5C;AAEtBH,QAAAA,iBAAiB,EAAEF,UAAU,CAACf,QAAX,IAAuBC,MAAM,CAACc,UAAU,CAACK,KAAZ,CAF1B;AAGtBC,QAAAA,aAAa,EAAE,CAAAL,UAAU,SAAV,IAAAA,UAAU,WAAV,YAAAA,UAAU,CAAEhB,QAAZ,KAAwBC,MAAM,CAACe,UAAD,aAACA,UAAD,uBAACA,UAAU,CAAEI,KAAb;AAHvB,OAAxB;AAMA,0BACE,gCAAC,gBAAD,CAAQ,YAAR;AACE,QAAA,YAAY,EAAEN,qBADhB;AAEE,QAAA,QAAQ,eACN,gCAAC,KAAD;AACE,UAAA,KAAK,EAAER,KADT;AAEE,UAAA,aAAa,EAAEE,aAFjB;AAGE,UAAA,aAAa,EAAE,uBAACF,KAAD;AAAA,mBAAWD,cAAc,CAACC,KAAD,CAAzB;AAAA,WAHjB;AAIE,UAAA,qBAAqB,EAAE,+BAACgB,MAAD;AAAA,mBAAYb,sBAAsB,CAACa,MAAD,CAAlC;AAAA,WAJzB;AAKE,UAAA,MAAM,EAAE;AACNC,YAAAA,UAAU,EAAEL;AADN;AALV;AAHJ,sBAcE;AAAK,QAAA,SAAS,EAAEX,OAAO,CAACiB;AAAxB,SACGlB,KAAK,IAAIA,KAAK,CAACa,0BAAf,iBACC,gCAAC,wBAAD;AAAgB,QAAA,KAAK,EAAEhB,mBAAmB,CAACiB,KAA3C;AAAkD,QAAA,SAAS,EAAEb,OAAO,CAACkB;AAArE,sBACE,gCAAC,wBAAD;AACE,QAAA,SAAS,EAAElB,OAAO,CAACmB,MADrB;AAEE,QAAA,MAAM,EAAEpB,KAAK,CAACH,mBAAN,IAA6B,EAFvC;AAGE,QAAA,QAAQ,EAAE,KAAKwB,4BAHjB;AAIE,QAAA,YAAY,EAAEjB,YAJhB;AAKE,QAAA,QAAQ,EAAE,KALZ;AAME,QAAA,UAAU,EAAEO,iBANd;AAOE,QAAA,aAAa,EAAEL,aAAa,IAAIA,aAAa,CAACT,mBAPhD;AAQE,QAAA,cAAc,EAAEU,cAAc,IAAIA,cAAc,CAACV,mBARnD;AASE,QAAA,kBAAkB,EAAEQ,kBATtB;AAUE,QAAA,uBAAuB,EAAE,CAAC;AAAEiB,UAAAA,QAAQ,EAAE;AAAZ,SAAD,EAA0B;AAAEA,UAAAA,QAAQ,EAAE;AAAZ,SAA1B;AAV3B,QADF,CAFJ,eAkBE,uEAlBF,CAdF,CADF;AAqCD;;;EA7DuBC,kBAAMC,S;;;;AAgEhC,IAAMC,MAAM,GAAG,SAATA,MAAS,CAACC,KAAD;AAAA,SAAY;AACzBC,IAAAA,IAAI,EAAE;AACJC,MAAAA,SAAS,EAAEF,KAAK,CAACG,OAAN,CAAcC,IAAd,GAAqB;AAD5B,KADmB;AAIzBX,IAAAA,YAAY,EAAE;AACZY,MAAAA,KAAK,EAAE,MADK;AAEZC,MAAAA,UAAU,EAAEN,KAAK,CAACG,OAAN,CAAcC,IAAd,GAAqB;AAFrB,KAJW;AAQzBV,IAAAA,MAAM,EAAE;AACNY,MAAAA,UAAU,EAAEN,KAAK,CAACG,OAAN,CAAcC,IAAd,GAAqB,CAD3B;AAENC,MAAAA,KAAK,EAAE;AAFD;AARiB,GAAZ;AAAA,CAAf;;AAcAnC,IAAI,CAACqC,SAAL,GAAiB;AACfhC,EAAAA,OAAO,EAAEiC,sBAAUC,MAAV,CAAiBC,UADX;AAEfrC,EAAAA,cAAc,EAAEmC,sBAAUG,IAFX;AAGflC,EAAAA,sBAAsB,EAAE+B,sBAAUG,IAHnB;AAIfrC,EAAAA,KAAK,EAAEkC,sBAAUC,MAAV,CAAiBC,UAJT;AAKflC,EAAAA,aAAa,EAAEgC,sBAAUC,MAAV,CAAiBC,UALjB;AAMfhC,EAAAA,YAAY,EAAE8B,sBAAUI,KAAV,CAAgB;AAC5BC,IAAAA,GAAG,EAAEL,sBAAUG,IAAV,CAAeD,UADQ;AAE5B,cAAQF,sBAAUG,IAAV,CAAeD;AAFK,GAAhB,CANC;AAUf/B,EAAAA,kBAAkB,EAAE6B,sBAAUI,KAAV,CAAgB;AAClCC,IAAAA,GAAG,EAAEL,sBAAUG,IAAV,CAAeD,UADc;AAElC,cAAQF,sBAAUG,IAAV,CAAeD;AAFW,GAAhB;AAVL,CAAjB;;eAgBe,wBAAWX,MAAX,EAAmB7B,IAAnB,C","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { settings, layout, InputContainer } from '@pie-lib/config-ui';\nimport EditableHtml from '@pie-lib/editable-html';\nimport { withStyles } from '@material-ui/core/styles';\n\nconst { Panel, toggle } = settings;\n\nexport class Root extends React.Component {\n onTeacherInstructionsChanged = (teacherInstructions) => {\n this.props.onModelChanged({ ...this.props.model, teacherInstructions });\n };\n\n render() {\n const { classes, model, configuration, onModelChanged, onConfigurationChanged, imageSupport, uploadSoundSupport } =\n this.props;\n const {\n maxImageWidth = {},\n maxImageHeight = {},\n settingsPanelDisabled,\n spellCheck = {},\n teacherInstructions = {},\n withRubric = {},\n } = configuration || {};\n const { spellCheckEnabled } = model || {};\n\n const panelProperties = {\n teacherInstructionsEnabled: teacherInstructions.settings && toggle(teacherInstructions.label),\n spellCheckEnabled: spellCheck.settings && toggle(spellCheck.label),\n rubricEnabled: withRubric?.settings && toggle(withRubric?.label),\n };\n\n return (\n <layout.ConfigLayout\n hideSettings={settingsPanelDisabled}\n settings={\n <Panel\n model={model}\n configuration={configuration}\n onChangeModel={(model) => onModelChanged(model)}\n onChangeConfiguration={(config) => onConfigurationChanged(config)}\n groups={{\n Properties: panelProperties,\n }}\n />\n }\n >\n <div className={classes.content}>\n {model && model.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 spellCheck={spellCheckEnabled}\n maxImageWidth={maxImageWidth && maxImageWidth.teacherInstructions}\n maxImageHeight={maxImageHeight && maxImageHeight.teacherInstructions}\n uploadSoundSupport={uploadSoundSupport}\n languageCharactersProps={[{ language: 'spanish' }, { language: 'special' }]}\n />\n </InputContainer>\n )}\n\n <div>Image cloze association</div>\n </div>\n </layout.ConfigLayout>\n );\n }\n}\n\nconst styles = (theme) => ({\n base: {\n marginTop: theme.spacing.unit * 3,\n },\n promptHolder: {\n width: '100%',\n paddingTop: theme.spacing.unit * 2,\n },\n prompt: {\n paddingTop: theme.spacing.unit * 2,\n width: '100%',\n },\n});\n\nRoot.propTypes = {\n classes: PropTypes.object.isRequired,\n onModelChanged: PropTypes.func,\n onConfigurationChanged: PropTypes.func,\n model: PropTypes.object.isRequired,\n configuration: PropTypes.object.isRequired,\n imageSupport: PropTypes.shape({\n add: PropTypes.func.isRequired,\n delete: PropTypes.func.isRequired,\n }),\n uploadSoundSupport: PropTypes.shape({\n add: PropTypes.func.isRequired,\n delete: PropTypes.func.isRequired,\n }),\n};\n\nexport default withStyles(styles)(Root);\n"],"file":"root.js"}
@@ -1,15 +1,16 @@
1
1
  {
2
2
  "name": "@pie-element/image-cloze-association-configure",
3
3
  "private": true,
4
- "version": "3.1.36",
4
+ "version": "4.4.0",
5
5
  "description": "",
6
6
  "main": "lib/index.js",
7
7
  "module": "src/index.js",
8
8
  "author": "",
9
9
  "dependencies": {
10
10
  "@material-ui/core": "^3.9.2",
11
- "@pie-framework/pie-configure-events": "^1.2.0",
12
- "@pie-lib/config-ui": "^10.10.15",
11
+ "@pie-framework/pie-configure-events": "^1.3.0",
12
+ "@pie-lib/config-ui": "12.0.0-beta.2",
13
+ "@pie-lib/editable-html": "10.0.0-beta.2",
13
14
  "debug": "^3.1.0",
14
15
  "prop-types": "^15.7.2",
15
16
  "react": "^16.8.6",
@@ -5,27 +5,26 @@ import * as React from 'react';
5
5
  import defaultValues from '../defaults';
6
6
  import { Root } from '../root';
7
7
 
8
-
9
8
  jest.mock('react-dom', () => ({
10
- render: jest.fn()
9
+ render: jest.fn(),
11
10
  }));
12
11
 
13
12
  jest.mock('@pie-lib/config-ui', () => ({
14
- FeedbackConfig: props => (<div/>),
15
- InputCheckbox: props => (<div/>),
13
+ FeedbackConfig: (props) => <div />,
14
+ InputCheckbox: (props) => <div />,
16
15
  layout: {
17
- ConfigLayout: props => <div>{props.children}</div>
16
+ ConfigLayout: (props) => <div>{props.children}</div>,
18
17
  },
19
18
  settings: {
20
- Panel: props => <div onChange={props.onChange} />,
19
+ Panel: (props) => <div onChange={props.onChange} />,
21
20
  toggle: jest.fn(),
22
- }
21
+ },
23
22
  }));
24
23
 
25
24
  export const defaultProps = {
26
25
  classes: {},
27
26
  model: {},
28
- configuration: defaultValues.configuration
27
+ configuration: defaultValues.configuration,
29
28
  };
30
29
 
31
30
  describe('Root', () => {
@@ -33,13 +32,13 @@ describe('Root', () => {
33
32
  let component;
34
33
 
35
34
  beforeEach(() => {
36
- wrapper = props => {
35
+ wrapper = (props) => {
37
36
  const configProps = {
38
37
  ...defaultProps,
39
- ...props
38
+ ...props,
40
39
  };
41
40
 
42
- return shallow(<Root { ...configProps } />);
41
+ return shallow(<Root {...configProps} />);
43
42
  };
44
43
  });
45
44
 
@@ -51,14 +50,12 @@ describe('Root', () => {
51
50
  let onModelChanged = jest.fn();
52
51
 
53
52
  component = wrapper({
54
- onModelChanged
53
+ onModelChanged,
55
54
  });
56
55
 
57
56
  component.instance().onTeacherInstructionsChanged('New Teacher Instructions');
58
57
 
59
- expect(onModelChanged).toBeCalledWith(
60
- expect.objectContaining({ teacherInstructions: 'New Teacher Instructions' })
61
- );
58
+ expect(onModelChanged).toBeCalledWith(expect.objectContaining({ teacherInstructions: 'New Teacher Instructions' }));
62
59
  });
63
60
  });
64
61
 
@@ -2,12 +2,28 @@ export default {
2
2
  model: {
3
3
  rationaleEnabled: true,
4
4
  teacherInstructionsEnabled: true,
5
- studentInstructionsEnabled: true
5
+ studentInstructionsEnabled: true,
6
6
  },
7
7
  configuration: {
8
+ maxImageWidth: {
9
+ teacherInstructions: 300,
10
+ },
11
+ maxImageHeight: {
12
+ teacherInstructions: 300,
13
+ },
14
+ settingsPanelDisabled: false,
15
+ spellCheck: {
16
+ label: 'Spellcheck',
17
+ settings: false,
18
+ enabled: true,
19
+ },
8
20
  teacherInstructions: {
9
21
  settings: true,
10
- label: 'Teacher Instructions'
11
- }
12
- }
22
+ label: 'Teacher Instructions',
23
+ },
24
+ withRubric: {
25
+ settings: false,
26
+ label: 'Add Rubric',
27
+ },
28
+ },
13
29
  };
@@ -1,4 +1,10 @@
1
- import { DeleteImageEvent, InsertImageEvent, ModelUpdatedEvent } from '@pie-framework/pie-configure-events';
1
+ import {
2
+ ModelUpdatedEvent,
3
+ DeleteImageEvent,
4
+ InsertImageEvent,
5
+ InsertSoundEvent,
6
+ DeleteSoundEvent,
7
+ } from '@pie-framework/pie-configure-events';
2
8
 
3
9
  import React from 'react';
4
10
  import ReactDOM from 'react-dom';
@@ -66,8 +72,17 @@ export default class ImageClozeAssociationConfigure extends HTMLElement {
66
72
  this.dispatchEvent(new DeleteImageEvent(src, done));
67
73
  }
68
74
 
75
+ insertSound(handler) {
76
+ this.dispatchEvent(new InsertSoundEvent(handler));
77
+ }
78
+
79
+ onDeleteSound(src, done) {
80
+ this.dispatchEvent(new DeleteSoundEvent(src, done));
81
+ }
82
+
69
83
  _render() {
70
84
  log('_render');
85
+
71
86
  let element = React.createElement(Root, {
72
87
  disableSidePanel: this._disableSidePanel,
73
88
  model: this._model,
@@ -76,9 +91,14 @@ export default class ImageClozeAssociationConfigure extends HTMLElement {
76
91
  onConfigurationChanged: this.onConfigurationChanged.bind(this),
77
92
  imageSupport: {
78
93
  add: this.insertImage.bind(this),
79
- delete: this.onDeleteImage.bind(this)
80
- }
94
+ delete: this.onDeleteImage.bind(this),
95
+ },
96
+ uploadSoundSupport: {
97
+ add: this.insertSound.bind(this),
98
+ delete: this.onDeleteSound.bind(this),
99
+ },
81
100
  });
101
+
82
102
  ReactDOM.render(element, this);
83
103
  }
84
104
  }
@@ -1,39 +1,46 @@
1
1
  import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
- import { withStyles } from '@material-ui/core/styles';
4
- import {
5
- settings,
6
- layout,
7
- InputContainer
8
- } from '@pie-lib/config-ui';
3
+ import { settings, layout, InputContainer } from '@pie-lib/config-ui';
9
4
  import EditableHtml from '@pie-lib/editable-html';
5
+ import { withStyles } from '@material-ui/core/styles';
10
6
 
11
7
  const { Panel, toggle } = settings;
12
8
 
13
9
  export class Root extends React.Component {
14
- onTeacherInstructionsChanged = teacherInstructions => {
15
- this.props.onModelChanged({
16
- ...this.props.model,
17
- teacherInstructions
18
- });
10
+ onTeacherInstructionsChanged = (teacherInstructions) => {
11
+ this.props.onModelChanged({ ...this.props.model, teacherInstructions });
19
12
  };
20
13
 
21
14
  render() {
22
- const { classes, model, configuration, onModelChanged, onConfigurationChanged, imageSupport } = this.props;
23
- const { teacherInstructions = {} } = configuration || {};
15
+ const { classes, model, configuration, onModelChanged, onConfigurationChanged, imageSupport, uploadSoundSupport } =
16
+ this.props;
17
+ const {
18
+ maxImageWidth = {},
19
+ maxImageHeight = {},
20
+ settingsPanelDisabled,
21
+ spellCheck = {},
22
+ teacherInstructions = {},
23
+ withRubric = {},
24
+ } = configuration || {};
25
+ const { spellCheckEnabled } = model || {};
26
+
27
+ const panelProperties = {
28
+ teacherInstructionsEnabled: teacherInstructions.settings && toggle(teacherInstructions.label),
29
+ spellCheckEnabled: spellCheck.settings && toggle(spellCheck.label),
30
+ rubricEnabled: withRubric?.settings && toggle(withRubric?.label),
31
+ };
24
32
 
25
33
  return (
26
34
  <layout.ConfigLayout
35
+ hideSettings={settingsPanelDisabled}
27
36
  settings={
28
37
  <Panel
29
38
  model={model}
30
39
  configuration={configuration}
31
- onChangeModel={model => onModelChanged(model)}
32
- onChangeConfiguration={config => onConfigurationChanged(config)}
40
+ onChangeModel={(model) => onModelChanged(model)}
41
+ onChangeConfiguration={(config) => onConfigurationChanged(config)}
33
42
  groups={{
34
- 'Properties': {
35
- teacherInstructionsEnabled: teacherInstructions.settings && toggle(teacherInstructions.label),
36
- },
43
+ Properties: panelProperties,
37
44
  }}
38
45
  />
39
46
  }
@@ -47,28 +54,33 @@ export class Root extends React.Component {
47
54
  onChange={this.onTeacherInstructionsChanged}
48
55
  imageSupport={imageSupport}
49
56
  nonEmpty={false}
57
+ spellCheck={spellCheckEnabled}
58
+ maxImageWidth={maxImageWidth && maxImageWidth.teacherInstructions}
59
+ maxImageHeight={maxImageHeight && maxImageHeight.teacherInstructions}
60
+ uploadSoundSupport={uploadSoundSupport}
61
+ languageCharactersProps={[{ language: 'spanish' }, { language: 'special' }]}
50
62
  />
51
63
  </InputContainer>
52
64
  )}
53
65
 
54
- Image cloze association
66
+ <div>Image cloze association</div>
55
67
  </div>
56
68
  </layout.ConfigLayout>
57
69
  );
58
70
  }
59
71
  }
60
72
 
61
- const styles = theme => ({
73
+ const styles = (theme) => ({
62
74
  base: {
63
- marginTop: theme.spacing.unit * 3
75
+ marginTop: theme.spacing.unit * 3,
64
76
  },
65
77
  promptHolder: {
66
78
  width: '100%',
67
- paddingTop: theme.spacing.unit * 2
79
+ paddingTop: theme.spacing.unit * 2,
68
80
  },
69
81
  prompt: {
70
82
  paddingTop: theme.spacing.unit * 2,
71
- width: '100%'
83
+ width: '100%',
72
84
  },
73
85
  });
74
86
 
@@ -80,8 +92,12 @@ Root.propTypes = {
80
92
  configuration: PropTypes.object.isRequired,
81
93
  imageSupport: PropTypes.shape({
82
94
  add: PropTypes.func.isRequired,
83
- delete: PropTypes.func.isRequired
84
- })
95
+ delete: PropTypes.func.isRequired,
96
+ }),
97
+ uploadSoundSupport: PropTypes.shape({
98
+ add: PropTypes.func.isRequired,
99
+ delete: PropTypes.func.isRequired,
100
+ }),
85
101
  };
86
102
 
87
103
  export default withStyles(styles)(Root);
@@ -3,6 +3,17 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [3.2.23](https://github.com/pie-framework/pie-elements/compare/@pie-element/image-cloze-association-controller@3.2.22...@pie-element/image-cloze-association-controller@3.2.23) (2022-12-07)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * update libs ([441f403](https://github.com/pie-framework/pie-elements/commit/441f403870b7bec0d61fab58b8d93dbe0ead4c32))
12
+
13
+
14
+
15
+
16
+
6
17
  ## [3.2.19](https://github.com/pie-framework/pie-elements/compare/@pie-element/image-cloze-association-controller@3.2.17...@pie-element/image-cloze-association-controller@3.2.19) (2021-11-11)
7
18
 
8
19
  **Note:** Version bump only for package @pie-element/image-cloze-association-controller
@@ -5,9 +5,10 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
+ exports.isResponseCorrect = exports.getPartialScore = exports.createCorrectResponseSession = void 0;
8
9
  exports.model = model;
10
+ exports.normalize = void 0;
9
11
  exports.outcome = outcome;
10
- exports.createCorrectResponseSession = exports.getPartialScore = exports.isResponseCorrect = exports.normalize = void 0;
11
12
 
12
13
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
14
 
@@ -21,9 +22,9 @@ var _controllerUtils = require("@pie-lib/controller-utils");
21
22
 
22
23
  var _utils = require("./utils");
23
24
 
24
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
25
+ 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; }
25
26
 
26
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
27
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
27
28
 
28
29
  var log = (0, _debug["default"])('pie-elements:image-cloze-association:controller');
29
30
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.js"],"names":["log","normalize","question","rationaleEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","model","session","env","questionNormalized","questionCamelized","Promise","resolve","out","disabled","mode","responseCorrect","getScore","undefined","role","teacherInstructions","isResponseCorrect","responses","isCorrect","totalValidResponses","forEach","value","images","length","answers","answer","containerIndex","includes","isDefaultOrAltResponseCorrect","validation","validResponse","altResponses","altResponse","getDeductionPerContainer","valid","totalStack","filter","item","incorrectStack","maxValid","ignored","slice","getPartialScore","maxResponsePerZone","responseContainers","correctAnswers","possibleResponses","all","deductionList","id","denominator","str","toFixed","parseFloat","config","isPartialScoring","partialScoring","enabled","correct","outcome","score","empty","configCamelized","createCorrectResponseSession","valid_response","container","i","v","push"],"mappings":"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","sourcesContent":["import debug from 'debug';\nimport isEmpty from 'lodash/isEmpty';\nimport { camelizeKeys } from 'humps';\nimport { partialScoring } from '@pie-lib/controller-utils';\n\nimport { getAllUniqueCorrectness } from './utils';\n\nconst log = debug('pie-elements:image-cloze-association:controller');\n\nexport const normalize = question => ({\n rationaleEnabled: true,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n ...question,\n});\n\nexport function model(question, session, env) {\n const questionNormalized = normalize(question);\n const questionCamelized = camelizeKeys(questionNormalized);\n\n return new Promise(resolve => {\n const out = {\n disabled: env.mode !== 'gather',\n mode: env.mode,\n ...questionCamelized,\n responseCorrect:\n env.mode === 'evaluate'\n ? getScore(questionCamelized, session) === 1\n : undefined,\n };\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.teacherInstructions = questionCamelized.teacherInstructionsEnabled ? questionCamelized.teacherInstructions : null;\n } else {\n out.teacherInstructions = null;\n }\n\n resolve(out);\n });\n}\n\nexport const isResponseCorrect = (responses, session) => {\n let isCorrect = true;\n let totalValidResponses = 0;\n\n if (!session || isEmpty(session)) {\n return false;\n }\n\n responses.forEach(value => totalValidResponses += (value.images || []).length);\n\n if (session.answers && totalValidResponses === session.answers.length) {\n session.answers.forEach(answer => {\n if (!(responses[answer.containerIndex].images || []).includes(answer.value)) {\n isCorrect = false;\n }\n });\n } else {\n isCorrect = false;\n }\n return isCorrect;\n};\n\n// This applies for items that don't support partial scoring.\nconst isDefaultOrAltResponseCorrect = (question, session) => {\n const { validation: { validResponse: { value }, altResponses } } = question;\n\n let isCorrect = isResponseCorrect(value, session);\n\n // Look for correct answers in alternate responses.\n if (!isCorrect && (altResponses && altResponses.length)) {\n altResponses.forEach(altResponse => {\n if (isResponseCorrect(altResponse.value, session)) {\n isCorrect = true;\n }\n });\n }\n return isCorrect;\n};\n\n// Deduct only the items that exceeded the maximum valid response per container.\nconst getDeductionPerContainer = (containerIndex, answers, valid) => {\n const totalStack = answers.filter(item => item.containerIndex === containerIndex);\n const incorrectStack = totalStack.filter(item => !item.isCorrect);\n const maxValid = (valid.value[containerIndex].images || []).length;\n\n if (totalStack.length > maxValid) {\n const ignored = totalStack.length - maxValid;\n return incorrectStack.slice(-ignored);\n }\n return [];\n};\n\nexport const getPartialScore = (question, session) => {\n const { validation: { validResponse }, maxResponsePerZone, responseContainers } = question;\n let correctAnswers = 0;\n let possibleResponses = 0;\n\n if (!session || isEmpty(session)) {\n return 0;\n }\n\n validResponse.value.forEach(value => possibleResponses += (value.images || []).length);\n\n if (session.answers && session.answers.length) {\n const all = getAllUniqueCorrectness(session.answers, validResponse.value);\n correctAnswers = all.filter(item => item.isCorrect).length;\n\n // deduction rules: https://docs.google.com/document/d/1Oprm8Qs5fg_Dwoj2pNpsfu4D63QgCZgvcqTgeaVel7I/edit\n session.answers.forEach(answer => {\n if (maxResponsePerZone > 1) {\n const deductionList = getDeductionPerContainer(answer.containerIndex, all, validResponse);\n\n if (deductionList.length) {\n deductionList.forEach(item => {\n if (item.id === answer.id) {\n correctAnswers -= 1;\n }\n });\n }\n }\n });\n } else {\n correctAnswers = 0;\n }\n // negative values will implicitly make the score equal to zero\n correctAnswers = correctAnswers < 0 ? 0 : correctAnswers;\n\n const denominator = maxResponsePerZone > 1 ? possibleResponses : responseContainers.length;\n const str = (correctAnswers / denominator).toFixed(2);\n\n return parseFloat(str);\n};\n\nconst getScore = (config, session, env = {}) => {\n const isPartialScoring = partialScoring.enabled(config, env);\n const correct = isDefaultOrAltResponseCorrect(config, session);\n\n return isPartialScoring ? getPartialScore(config, session) : (correct ? 1 : 0);\n};\n\nexport function outcome(config, session, env = {}) {\n return new Promise(resolve => {\n log('outcome...');\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n }\n\n const configCamelized = camelizeKeys(config);\n\n if (session.answers || []) {\n const score = getScore(configCamelized, session, env);\n resolve({ score });\n }\n });\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise(resolve => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { validation: { valid_response: { value } } } = question;\n const answers = [];\n\n if (value) {\n value.forEach((container, i) => {\n (container.images || []).forEach(v => {\n answers.push({\n value: v,\n containerIndex: i\n });\n });\n });\n }\n\n resolve({\n answers,\n id: '1'\n });\n } else {\n resolve(null);\n }\n });\n};\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../src/index.js"],"names":["log","normalize","question","rationaleEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","model","session","env","questionNormalized","questionCamelized","Promise","resolve","out","disabled","mode","responseCorrect","getScore","undefined","role","teacherInstructions","isResponseCorrect","responses","isCorrect","totalValidResponses","forEach","value","images","length","answers","answer","containerIndex","includes","isDefaultOrAltResponseCorrect","validation","validResponse","altResponses","altResponse","getDeductionPerContainer","valid","totalStack","filter","item","incorrectStack","maxValid","ignored","slice","getPartialScore","maxResponsePerZone","responseContainers","correctAnswers","possibleResponses","all","deductionList","id","denominator","str","toFixed","parseFloat","config","isPartialScoring","partialScoring","enabled","correct","outcome","score","empty","configCamelized","createCorrectResponseSession","valid_response","container","i","v","push"],"mappings":"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","sourcesContent":["import debug from 'debug';\nimport isEmpty from 'lodash/isEmpty';\nimport { camelizeKeys } from 'humps';\nimport { partialScoring } from '@pie-lib/controller-utils';\n\nimport { getAllUniqueCorrectness } from './utils';\n\nconst log = debug('pie-elements:image-cloze-association:controller');\n\nexport const normalize = (question) => ({\n rationaleEnabled: true,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n ...question,\n});\n\nexport function model(question, session, env) {\n const questionNormalized = normalize(question);\n const questionCamelized = camelizeKeys(questionNormalized);\n\n return new Promise((resolve) => {\n const out = {\n disabled: env.mode !== 'gather',\n mode: env.mode,\n ...questionCamelized,\n responseCorrect: env.mode === 'evaluate' ? getScore(questionCamelized, session) === 1 : undefined,\n };\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.teacherInstructions = questionCamelized.teacherInstructionsEnabled\n ? questionCamelized.teacherInstructions\n : null;\n } else {\n out.teacherInstructions = null;\n }\n\n resolve(out);\n });\n}\n\nexport const isResponseCorrect = (responses, session) => {\n let isCorrect = true;\n let totalValidResponses = 0;\n\n if (!session || isEmpty(session)) {\n return false;\n }\n\n responses.forEach((value) => (totalValidResponses += (value.images || []).length));\n\n if (session.answers && totalValidResponses === session.answers.length) {\n session.answers.forEach((answer) => {\n if (!(responses[answer.containerIndex].images || []).includes(answer.value)) {\n isCorrect = false;\n }\n });\n } else {\n isCorrect = false;\n }\n return isCorrect;\n};\n\n// This applies for items that don't support partial scoring.\nconst isDefaultOrAltResponseCorrect = (question, session) => {\n const {\n validation: {\n validResponse: { value },\n altResponses,\n },\n } = question;\n\n let isCorrect = isResponseCorrect(value, session);\n\n // Look for correct answers in alternate responses.\n if (!isCorrect && altResponses && altResponses.length) {\n altResponses.forEach((altResponse) => {\n if (isResponseCorrect(altResponse.value, session)) {\n isCorrect = true;\n }\n });\n }\n return isCorrect;\n};\n\n// Deduct only the items that exceeded the maximum valid response per container.\nconst getDeductionPerContainer = (containerIndex, answers, valid) => {\n const totalStack = answers.filter((item) => item.containerIndex === containerIndex);\n const incorrectStack = totalStack.filter((item) => !item.isCorrect);\n const maxValid = (valid.value[containerIndex].images || []).length;\n\n if (totalStack.length > maxValid) {\n const ignored = totalStack.length - maxValid;\n return incorrectStack.slice(-ignored);\n }\n return [];\n};\n\nexport const getPartialScore = (question, session) => {\n const {\n validation: { validResponse },\n maxResponsePerZone,\n responseContainers,\n } = question;\n let correctAnswers = 0;\n let possibleResponses = 0;\n\n if (!session || isEmpty(session)) {\n return 0;\n }\n\n validResponse.value.forEach((value) => (possibleResponses += (value.images || []).length));\n\n if (session.answers && session.answers.length) {\n const all = getAllUniqueCorrectness(session.answers, validResponse.value);\n correctAnswers = all.filter((item) => item.isCorrect).length;\n\n // deduction rules: https://docs.google.com/document/d/1Oprm8Qs5fg_Dwoj2pNpsfu4D63QgCZgvcqTgeaVel7I/edit\n session.answers.forEach((answer) => {\n if (maxResponsePerZone > 1) {\n const deductionList = getDeductionPerContainer(answer.containerIndex, all, validResponse);\n\n if (deductionList.length) {\n deductionList.forEach((item) => {\n if (item.id === answer.id) {\n correctAnswers -= 1;\n }\n });\n }\n }\n });\n } else {\n correctAnswers = 0;\n }\n // negative values will implicitly make the score equal to zero\n correctAnswers = correctAnswers < 0 ? 0 : correctAnswers;\n\n const denominator = maxResponsePerZone > 1 ? possibleResponses : responseContainers.length;\n const str = (correctAnswers / denominator).toFixed(2);\n\n return parseFloat(str);\n};\n\nconst getScore = (config, session, env = {}) => {\n const isPartialScoring = partialScoring.enabled(config, env);\n const correct = isDefaultOrAltResponseCorrect(config, session);\n\n return isPartialScoring ? getPartialScore(config, session) : correct ? 1 : 0;\n};\n\nexport function outcome(config, session, env = {}) {\n return new Promise((resolve) => {\n log('outcome...');\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n }\n\n const configCamelized = camelizeKeys(config);\n\n if (session.answers || []) {\n const score = getScore(configCamelized, session, env);\n resolve({ score });\n }\n });\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const {\n validation: {\n valid_response: { value },\n },\n } = question;\n const answers = [];\n\n if (value) {\n value.forEach((container, i) => {\n (container.images || []).forEach((v) => {\n answers.push({\n value: v,\n containerIndex: i,\n });\n });\n });\n }\n\n resolve({\n answers,\n id: '1',\n });\n } else {\n resolve(null);\n }\n });\n};\n"],"file":"index.js"}
@@ -9,9 +9,9 @@ exports.getAllUniqueCorrectness = void 0;
9
9
 
10
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
11
 
12
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
12
+ 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; }
13
13
 
14
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
14
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
15
15
 
16
16
  var getAllCorrectness = function getAllCorrectness(answers, responses) {
17
17
  return answers.map(function (answer) {