@pie-element/categorize 11.1.0 → 11.2.0-mui-update.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/configure/CHANGELOG.md +66 -0
  3. package/configure/lib/defaults.js +2 -5
  4. package/configure/lib/defaults.js.map +1 -1
  5. package/configure/lib/design/builder.js +15 -33
  6. package/configure/lib/design/builder.js.map +1 -1
  7. package/configure/lib/design/buttons.js +44 -95
  8. package/configure/lib/design/buttons.js.map +1 -1
  9. package/configure/lib/design/categories/RowLabel.js +32 -45
  10. package/configure/lib/design/categories/RowLabel.js.map +1 -1
  11. package/configure/lib/design/categories/alternateResponses.js +102 -251
  12. package/configure/lib/design/categories/alternateResponses.js.map +1 -1
  13. package/configure/lib/design/categories/category.js +138 -208
  14. package/configure/lib/design/categories/category.js.map +1 -1
  15. package/configure/lib/design/categories/choice-preview.js +59 -126
  16. package/configure/lib/design/categories/choice-preview.js.map +1 -1
  17. package/configure/lib/design/categories/droppable-placeholder.js +76 -165
  18. package/configure/lib/design/categories/droppable-placeholder.js.map +1 -1
  19. package/configure/lib/design/categories/index.js +199 -384
  20. package/configure/lib/design/categories/index.js.map +1 -1
  21. package/configure/lib/design/choices/choice.js +160 -263
  22. package/configure/lib/design/choices/choice.js.map +1 -1
  23. package/configure/lib/design/choices/config.js +46 -98
  24. package/configure/lib/design/choices/config.js.map +1 -1
  25. package/configure/lib/design/choices/index.js +152 -236
  26. package/configure/lib/design/choices/index.js.map +1 -1
  27. package/configure/lib/design/header.js +62 -111
  28. package/configure/lib/design/header.js.map +1 -1
  29. package/configure/lib/design/index.js +632 -476
  30. package/configure/lib/design/index.js.map +1 -1
  31. package/configure/lib/design/input-header.js +97 -149
  32. package/configure/lib/design/input-header.js.map +1 -1
  33. package/configure/lib/design/utils.js +4 -15
  34. package/configure/lib/design/utils.js.map +1 -1
  35. package/configure/lib/index.js +120 -183
  36. package/configure/lib/index.js.map +1 -1
  37. package/configure/lib/main.js +31 -74
  38. package/configure/lib/main.js.map +1 -1
  39. package/configure/lib/utils.js +22 -32
  40. package/configure/lib/utils.js.map +1 -1
  41. package/configure/package.json +15 -14
  42. package/controller/CHANGELOG.md +54 -0
  43. package/controller/lib/defaults.js +2 -5
  44. package/controller/lib/defaults.js.map +1 -1
  45. package/controller/lib/index.js +238 -315
  46. package/controller/lib/index.js.map +1 -1
  47. package/controller/lib/utils.js +40 -31
  48. package/controller/lib/utils.js.map +1 -1
  49. package/controller/package.json +5 -5
  50. package/lib/categorize/categories.js +110 -164
  51. package/lib/categorize/categories.js.map +1 -1
  52. package/lib/categorize/category.js +72 -122
  53. package/lib/categorize/category.js.map +1 -1
  54. package/lib/categorize/choice.js +116 -245
  55. package/lib/categorize/choice.js.map +1 -1
  56. package/lib/categorize/choices.js +66 -131
  57. package/lib/categorize/choices.js.map +1 -1
  58. package/lib/categorize/droppable-placeholder.js +49 -103
  59. package/lib/categorize/droppable-placeholder.js.map +1 -1
  60. package/lib/categorize/grid-content.js +39 -87
  61. package/lib/categorize/grid-content.js.map +1 -1
  62. package/lib/categorize/index.js +341 -316
  63. package/lib/categorize/index.js.map +1 -1
  64. package/lib/index.js +286 -271
  65. package/lib/index.js.map +1 -1
  66. package/package.json +16 -13
  67. package/LICENSE.md +0 -5
@@ -1,388 +1,413 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
- exports["default"] = exports.Categorize = void 0;
9
-
10
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
-
12
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
13
-
14
- var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
15
-
16
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
17
-
18
- var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
19
-
20
- var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
21
-
7
+ exports.default = exports.Categorize = void 0;
8
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
22
9
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
23
-
24
10
  var _react = _interopRequireDefault(require("react"));
25
-
26
11
  var _propTypes = _interopRequireDefault(require("prop-types"));
27
-
28
- var _choices = _interopRequireDefault(require("./choices"));
29
-
30
- var _categories = _interopRequireDefault(require("./categories"));
31
-
12
+ var _debug = _interopRequireDefault(require("debug"));
13
+ var _styles = require("@mui/material/styles");
14
+ var _core = require("@dnd-kit/core");
32
15
  var _correctAnswerToggle = _interopRequireDefault(require("@pie-lib/correct-answer-toggle"));
33
-
34
- var _styles = require("@material-ui/core/styles");
35
-
36
16
  var _categorize = require("@pie-lib/categorize");
37
-
38
17
  var _drag = require("@pie-lib/drag");
39
-
40
18
  var _renderUi = require("@pie-lib/render-ui");
41
-
42
- var _debug = _interopRequireDefault(require("debug"));
43
-
19
+ var _mathRendering = require("@pie-lib/math-rendering");
44
20
  var _translator = _interopRequireDefault(require("@pie-lib/translator"));
45
-
46
21
  var _configUi = require("@pie-lib/config-ui");
47
-
48
- 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); }; }
49
-
50
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
51
-
52
- var translator = _translator["default"].translator;
53
- var log = (0, _debug["default"])('@pie-ui:categorize');
54
-
55
- var Categorize = /*#__PURE__*/function (_React$Component) {
56
- (0, _inherits2["default"])(Categorize, _React$Component);
57
-
58
- var _super = _createSuper(Categorize);
59
-
60
- function Categorize(props) {
61
- var _this;
62
-
63
- (0, _classCallCheck2["default"])(this, Categorize);
64
- _this = _super.call(this, props);
65
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "removeChoice", function (c) {
22
+ var _choices = _interopRequireDefault(require("./choices"));
23
+ var _choice = _interopRequireDefault(require("./choice"));
24
+ var _categories = _interopRequireDefault(require("./categories"));
25
+ const {
26
+ translator
27
+ } = _translator.default;
28
+ const log = (0, _debug.default)('@pie-ui:categorize');
29
+ class DragPreviewWrapper extends _react.default.Component {
30
+ constructor(...args) {
31
+ super(...args);
32
+ (0, _defineProperty2.default)(this, "containerRef", /*#__PURE__*/_react.default.createRef());
33
+ }
34
+ componentDidMount() {
35
+ if (this.containerRef.current) {
36
+ console.log('Rendering math in drag preview wrapper');
37
+ (0, _mathRendering.renderMath)(this.containerRef.current);
38
+ }
39
+ }
40
+ render() {
41
+ return /*#__PURE__*/_react.default.createElement("div", {
42
+ ref: this.containerRef
43
+ }, this.props.children);
44
+ }
45
+ }
46
+ class Categorize extends _react.default.Component {
47
+ constructor(props) {
48
+ super(props);
49
+ (0, _defineProperty2.default)(this, "removeChoice", c => {
66
50
  log('[removeChoice]: ', c);
67
- var _this$props = _this.props,
68
- onAnswersChange = _this$props.onAnswersChange,
69
- session = _this$props.session;
70
- var answers = (0, _categorize.removeChoiceFromCategory)(c.id, c.categoryId, c.choiceIndex, session.answers);
51
+ const {
52
+ onAnswersChange,
53
+ session
54
+ } = this.props;
55
+ const answers = (0, _categorize.removeChoiceFromCategory)(c.id, c.categoryId, c.choiceIndex, session.answers);
71
56
  onAnswersChange(answers);
72
57
  });
73
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "dropChoice", function (categoryId, draggedChoice) {
74
- var _this$props2 = _this.props,
75
- session = _this$props2.session,
76
- onAnswersChange = _this$props2.onAnswersChange,
77
- model = _this$props2.model;
78
-
79
- var _ref = model || {},
80
- _ref$maxChoicesPerCat = _ref.maxChoicesPerCategory,
81
- maxChoicesPerCategory = _ref$maxChoicesPerCat === void 0 ? 0 : _ref$maxChoicesPerCat;
82
-
83
- var _ref2 = session || {},
84
- _ref2$answers = _ref2.answers,
85
- answers = _ref2$answers === void 0 ? [] : _ref2$answers;
86
-
87
- var newAnswers;
88
-
58
+ (0, _defineProperty2.default)(this, "dropChoice", (categoryId, draggedChoice) => {
59
+ const {
60
+ session,
61
+ onAnswersChange,
62
+ model
63
+ } = this.props;
64
+ const {
65
+ maxChoicesPerCategory = 0
66
+ } = model || {};
67
+ const {
68
+ answers = []
69
+ } = session || {};
70
+ let newAnswers;
89
71
  if (draggedChoice) {
90
72
  log('[dropChoice] category: ', draggedChoice.categoryId, 'choice: ', draggedChoice);
91
73
  } else {
92
74
  log('[dropChoice] category: ', undefined, 'choice: ', undefined);
93
75
  }
76
+ const answer = answers.find(answer => answer.category === categoryId);
94
77
 
95
- var answer = answers.find(function (answer) {
96
- return answer.category === categoryId;
97
- }); // treat special case to replace the existing choice with the new one when maxChoicesPerCategory = 1
98
-
78
+ // treat special case to replace the existing choice with the new one when maxChoicesPerCategory = 1
99
79
  if (draggedChoice && maxChoicesPerCategory === 1 && answer && answer.choices && answer.choices.length === 1) {
100
80
  newAnswers = (0, _categorize.moveChoiceToCategory)(draggedChoice.id, draggedChoice.categoryId, categoryId, draggedChoice.choiceIndex, answers);
101
81
  newAnswers = (0, _categorize.removeChoiceFromCategory)(answer.choices[0], categoryId, 0, answers);
102
- } // treat special case when there are as many choices as maxChoicesPerCategory is
82
+ }
83
+
84
+ // treat special case when there are as many choices as maxChoicesPerCategory is
103
85
  else if (draggedChoice && maxChoicesPerCategory > 1 && answer && answer.choices && answer.choices.length === maxChoicesPerCategory) {
104
86
  newAnswers = draggedChoice.categoryId ? (0, _categorize.moveChoiceToCategory)(draggedChoice.id, draggedChoice.categoryId, draggedChoice.categoryId, draggedChoice.choiceIndex, answers) : (0, _categorize.removeChoiceFromCategory)(draggedChoice.id, draggedChoice.categoryId, draggedChoice.choiceIndex, answers);
105
-
106
- _this.setState({
87
+ this.setState({
107
88
  showMaxChoiceAlert: true
108
89
  });
109
- } // treat special case when there are more choices that maxChoicesPerCategory is (testing purpose in pits)
90
+ }
91
+
92
+ // treat special case when there are more choices that maxChoicesPerCategory is (testing purpose in pits)
110
93
  else if (maxChoicesPerCategory !== 0 && answer && answer.choices && answer.choices.length > maxChoicesPerCategory) {
111
94
  newAnswers = answers;
112
-
113
- _this.setState({
95
+ this.setState({
114
96
  showMaxChoiceAlert: true
115
97
  });
116
98
  } else {
117
- newAnswers = draggedChoice ? (0, _categorize.moveChoiceToCategory)(draggedChoice.id, draggedChoice.categoryId, categoryId, draggedChoice.choiceIndex, answers) : _this.removeChoice(categoryId);
99
+ newAnswers = draggedChoice ? (0, _categorize.moveChoiceToCategory)(draggedChoice.id, draggedChoice.categoryId, categoryId, draggedChoice.choiceIndex, answers) : this.removeChoice(categoryId);
118
100
  }
119
-
120
101
  if (draggedChoice) {
121
102
  onAnswersChange(newAnswers);
122
103
  }
123
104
  });
124
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "toggleShowCorrect", function () {
125
- return _this.setState({
126
- showCorrect: !_this.state.showCorrect
127
- }, function () {
128
- _this.props.onShowCorrectToggle();
129
- });
130
- });
131
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "getPositionDirection", function (choicePosition) {
132
- var flexDirection;
133
-
105
+ (0, _defineProperty2.default)(this, "toggleShowCorrect", () => this.setState({
106
+ showCorrect: !this.state.showCorrect
107
+ }, () => {
108
+ this.props.onShowCorrectToggle();
109
+ }));
110
+ (0, _defineProperty2.default)(this, "getPositionDirection", choicePosition => {
111
+ let flexDirection;
134
112
  switch (choicePosition) {
135
113
  case 'left':
136
114
  flexDirection = 'row-reverse';
137
115
  break;
138
-
139
116
  case 'right':
140
117
  flexDirection = 'row';
141
118
  break;
142
-
143
119
  case 'below':
144
120
  flexDirection = 'column';
145
121
  break;
146
-
147
122
  default:
148
123
  // above
149
124
  flexDirection = 'column-reverse';
150
125
  break;
151
126
  }
152
-
153
127
  return flexDirection;
154
128
  });
155
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "existAlternateResponse", function (correctResponse) {
156
- return correctResponse === null || correctResponse === void 0 ? void 0 : correctResponse.some(function (correctRes) {
157
- var _correctRes$alternate;
158
-
159
- return ((_correctRes$alternate = correctRes.alternateResponses) === null || _correctRes$alternate === void 0 ? void 0 : _correctRes$alternate.length) > 0;
160
- });
161
- });
162
- _this.state = {
129
+ (0, _defineProperty2.default)(this, "existAlternateResponse", correctResponse => correctResponse?.some(correctRes => correctRes.alternateResponses?.length > 0));
130
+ this.state = {
163
131
  showCorrect: false,
164
132
  showMaxChoiceAlert: false
165
133
  };
166
- return _this;
167
134
  }
168
-
169
- (0, _createClass2["default"])(Categorize, [{
170
- key: "UNSAFE_componentWillReceiveProps",
171
- value: function UNSAFE_componentWillReceiveProps(nextProps) {
172
- var model = this.props.model;
173
- var nextModel = nextProps.model; // check if the note is the default one for prev language and change to the default one for new language
174
- // this check is necessary in order to diferanciate between default and authour defined note
175
- // and only change between languages for default ones
176
-
177
- if (model.note && model.language && model.language !== nextModel.language && model.note === translator.t('common:commonCorrectAnswerWithAlternates', {
178
- lng: model.language
179
- })) {
180
- model.note = translator.t('common:commonCorrectAnswerWithAlternates', {
181
- lng: nextModel.language
182
- });
183
- }
184
-
185
- this.setState({
186
- showCorrect: false
135
+ UNSAFE_componentWillReceiveProps(nextProps) {
136
+ const {
137
+ model
138
+ } = this.props;
139
+ const {
140
+ model: nextModel
141
+ } = nextProps;
142
+
143
+ // check if the note is the default one for prev language and change to the default one for new language
144
+ // this check is necessary in order to diferanciate between default and authour defined note
145
+ // and only change between languages for default ones
146
+ if (model.note && model.language && model.language !== nextModel.language && model.note === translator.t('common:commonCorrectAnswerWithAlternates', {
147
+ lng: model.language
148
+ })) {
149
+ model.note = translator.t('common:commonCorrectAnswerWithAlternates', {
150
+ lng: nextModel.language
187
151
  });
188
152
  }
189
- }, {
190
- key: "render",
191
- value: function render() {
192
- var _this2 = this;
193
-
194
- var _this$props3 = this.props,
195
- classes = _this$props3.classes,
196
- model = _this$props3.model,
197
- session = _this$props3.session;
198
- var _this$state = this.state,
199
- showCorrect = _this$state.showCorrect,
200
- showMaxChoiceAlert = _this$state.showMaxChoiceAlert;
201
- var choicesPosition = model.choicesPosition,
202
- extraCSSRules = model.extraCSSRules,
203
- note = model.note,
204
- showNote = model.showNote,
205
- env = model.env,
206
- language = model.language,
207
- maxChoicesPerCategory = model.maxChoicesPerCategory,
208
- autoplayAudioEnabled = model.autoplayAudioEnabled,
209
- customAudioButton = model.customAudioButton;
210
-
211
- var _ref3 = env || {},
212
- mode = _ref3.mode,
213
- role = _ref3.role;
214
-
215
- var choicePosition = choicesPosition || 'above';
216
- var style = {
217
- flexDirection: this.getPositionDirection(choicePosition),
218
- gap: '8px'
219
- };
220
-
221
- var _buildState = (0, _categorize.buildState)(model.categories, model.choices, showCorrect ? model.correctResponse : session.answers, model.correctResponse),
222
- categories = _buildState.categories,
223
- choices = _buildState.choices,
224
- correct = _buildState.correct;
225
-
226
- log('[render] disabled: ', model.disabled);
227
- var rowLabels = model.rowLabels,
228
- categoriesPerRow = model.categoriesPerRow,
229
- correctResponse = model.correctResponse,
230
- fontSizeFactor = model.fontSizeFactor;
231
- var nbOfRows = categories && Math.ceil(categories.length / categoriesPerRow) || 0;
232
- var existAlternate = this.existAlternateResponse(correctResponse) || false;
233
- var displayNote = (showCorrect || mode === 'view' && role === 'instructor') && showNote && note && existAlternate;
234
- var alertMessage = translator.t('translation:categorize:limitMaxChoicesPerCategory', {
235
- lng: model.language,
236
- maxChoicesPerCategory: maxChoicesPerCategory
237
- });
238
- var alertTitle = translator.t('common:warning', {
239
- lng: model.language
240
- });
241
- var onCloseText = translator.t('common:cancel', {
242
- lng: model.language
243
- });
244
- var showRationale = model.rationale && ((0, _renderUi.hasText)(model.rationale) || (0, _renderUi.hasMedia)(model.rationale));
245
- var showTeacherInstructions = model.teacherInstructions && ((0, _renderUi.hasText)(model.teacherInstructions) || (0, _renderUi.hasMedia)(model.teacherInstructions));
246
- return /*#__PURE__*/_react["default"].createElement(_renderUi.UiLayout, {
247
- extraCSSRules: extraCSSRules,
248
- id: 'main-container',
249
- className: classes.mainContainer,
250
- fontSizeFactor: fontSizeFactor
251
- }, showTeacherInstructions && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_renderUi.Collapsible, {
252
- labels: {
253
- hidden: 'Show Teacher Instructions',
254
- visible: 'Hide Teacher Instructions'
255
- },
256
- className: classes.collapsible
257
- }, /*#__PURE__*/_react["default"].createElement(_renderUi.PreviewPrompt, {
258
- prompt: model.teacherInstructions
259
- }))), model.prompt && /*#__PURE__*/_react["default"].createElement(_renderUi.PreviewPrompt, {
260
- prompt: model.prompt,
261
- autoplayAudioEnabled: autoplayAudioEnabled,
262
- customAudioButton: customAudioButton
263
- }), /*#__PURE__*/_react["default"].createElement(_correctAnswerToggle["default"], {
264
- show: showCorrect || correct === false,
265
- toggled: showCorrect,
266
- onToggle: this.toggleShowCorrect,
267
- language: language
268
- }), /*#__PURE__*/_react["default"].createElement("div", {
269
- className: classes.categorize,
270
- style: style
271
- }, /*#__PURE__*/_react["default"].createElement("div", {
272
- style: {
273
- display: 'flex',
274
- flex: 1
275
- }
276
- }, /*#__PURE__*/_react["default"].createElement(_categories["default"], {
277
- model: model,
278
- disabled: model.disabled,
279
- categories: categories,
280
- onDropChoice: this.dropChoice,
281
- onRemoveChoice: this.removeChoice,
282
- rowLabels: (rowLabels || []).slice(0, nbOfRows)
283
- })), /*#__PURE__*/_react["default"].createElement(_choices["default"], {
284
- disabled: model.disabled,
285
- model: model,
286
- choices: choices,
287
- choicePosition: choicePosition,
288
- onDropChoice: this.dropChoice,
289
- onRemoveChoice: this.removeChoice
290
- })), displayNote && /*#__PURE__*/_react["default"].createElement("div", {
291
- className: classes.note,
292
- dangerouslySetInnerHTML: {
293
- __html: note
294
- }
295
- }), showRationale && /*#__PURE__*/_react["default"].createElement(_renderUi.Collapsible, {
296
- labels: {
297
- hidden: 'Show Rationale',
298
- visible: 'Hide Rationale'
299
- },
300
- className: classes.collapsible
301
- }, /*#__PURE__*/_react["default"].createElement(_renderUi.PreviewPrompt, {
302
- prompt: model.rationale
303
- })), model.correctness && model.feedback && !showCorrect && /*#__PURE__*/_react["default"].createElement(_renderUi.Feedback, {
304
- correctness: model.correctness,
305
- feedback: model.feedback
306
- }), /*#__PURE__*/_react["default"].createElement(_configUi.AlertDialog, {
307
- title: alertTitle,
308
- text: alertMessage,
309
- open: showMaxChoiceAlert,
310
- onCloseText: onCloseText,
311
- onClose: function onClose() {
312
- return _this2.setState({
313
- showMaxChoiceAlert: false
314
- });
315
- }
316
- }));
317
- }
318
- }]);
319
- return Categorize;
320
- }(_react["default"].Component);
321
-
153
+ this.setState({
154
+ showCorrect: false
155
+ });
156
+ }
157
+ render() {
158
+ const {
159
+ model,
160
+ session
161
+ } = this.props;
162
+ const {
163
+ showCorrect,
164
+ showMaxChoiceAlert
165
+ } = this.state;
166
+ const {
167
+ choicesPosition,
168
+ extraCSSRules,
169
+ note,
170
+ showNote,
171
+ env,
172
+ language,
173
+ maxChoicesPerCategory,
174
+ autoplayAudioEnabled,
175
+ customAudioButton
176
+ } = model;
177
+ const {
178
+ mode,
179
+ role
180
+ } = env || {};
181
+ const choicePosition = choicesPosition || 'above';
182
+ const style = {
183
+ flexDirection: this.getPositionDirection(choicePosition),
184
+ gap: '8px'
185
+ };
186
+ const {
187
+ categories,
188
+ choices,
189
+ correct
190
+ } = (0, _categorize.buildState)(model.categories, model.choices, showCorrect ? model.correctResponse : session.answers, model.correctResponse);
191
+ log('[render] disabled: ', model.disabled);
192
+ const {
193
+ rowLabels,
194
+ categoriesPerRow,
195
+ correctResponse,
196
+ fontSizeFactor
197
+ } = model;
198
+ const nbOfRows = categories && Math.ceil(categories.length / categoriesPerRow) || 0;
199
+ const existAlternate = this.existAlternateResponse(correctResponse) || false;
200
+ const displayNote = (showCorrect || mode === 'view' && role === 'instructor') && showNote && note && existAlternate;
201
+ const alertMessage = translator.t('translation:categorize:limitMaxChoicesPerCategory', {
202
+ lng: model.language,
203
+ maxChoicesPerCategory
204
+ });
205
+ const alertTitle = translator.t('common:warning', {
206
+ lng: model.language
207
+ });
208
+ const onCloseText = translator.t('common:cancel', {
209
+ lng: model.language
210
+ });
211
+ const showRationale = model.rationale && ((0, _renderUi.hasText)(model.rationale) || (0, _renderUi.hasMedia)(model.rationale));
212
+ const showTeacherInstructions = model.teacherInstructions && ((0, _renderUi.hasText)(model.teacherInstructions) || (0, _renderUi.hasMedia)(model.teacherInstructions));
213
+ return /*#__PURE__*/_react.default.createElement(StyledUiLayout, {
214
+ extraCSSRules: extraCSSRules,
215
+ id: 'main-container',
216
+ fontSizeFactor: fontSizeFactor
217
+ }, showTeacherInstructions && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(StyledCollapsible, {
218
+ labels: {
219
+ hidden: 'Show Teacher Instructions',
220
+ visible: 'Hide Teacher Instructions'
221
+ }
222
+ }, /*#__PURE__*/_react.default.createElement(_renderUi.PreviewPrompt, {
223
+ prompt: model.teacherInstructions
224
+ }))), model.prompt && /*#__PURE__*/_react.default.createElement(_renderUi.PreviewPrompt, {
225
+ prompt: model.prompt,
226
+ autoplayAudioEnabled: autoplayAudioEnabled,
227
+ customAudioButton: customAudioButton
228
+ }), /*#__PURE__*/_react.default.createElement(_correctAnswerToggle.default, {
229
+ show: showCorrect || correct === false,
230
+ toggled: showCorrect,
231
+ onToggle: this.toggleShowCorrect,
232
+ language: language
233
+ }), /*#__PURE__*/_react.default.createElement(StyledCategorize, {
234
+ style: style
235
+ }, /*#__PURE__*/_react.default.createElement("div", {
236
+ style: {
237
+ display: 'flex',
238
+ flex: 1
239
+ }
240
+ }, /*#__PURE__*/_react.default.createElement(_categories.default, {
241
+ model: model,
242
+ disabled: model.disabled,
243
+ categories: categories,
244
+ onDropChoice: this.dropChoice,
245
+ onRemoveChoice: this.removeChoice,
246
+ rowLabels: (rowLabels || []).slice(0, nbOfRows)
247
+ })), /*#__PURE__*/_react.default.createElement(_choices.default, {
248
+ disabled: model.disabled,
249
+ model: model,
250
+ choices: choices,
251
+ choicePosition: choicePosition,
252
+ onDropChoice: this.dropChoice,
253
+ onRemoveChoice: this.removeChoice
254
+ })), displayNote && /*#__PURE__*/_react.default.createElement(StyledNote, {
255
+ dangerouslySetInnerHTML: {
256
+ __html: note
257
+ }
258
+ }), showRationale && /*#__PURE__*/_react.default.createElement(StyledCollapsible, {
259
+ labels: {
260
+ hidden: 'Show Rationale',
261
+ visible: 'Hide Rationale'
262
+ }
263
+ }, /*#__PURE__*/_react.default.createElement(_renderUi.PreviewPrompt, {
264
+ prompt: model.rationale
265
+ })), model.correctness && model.feedback && !showCorrect && /*#__PURE__*/_react.default.createElement(_renderUi.Feedback, {
266
+ correctness: model.correctness,
267
+ feedback: model.feedback
268
+ }), /*#__PURE__*/_react.default.createElement(_configUi.AlertDialog, {
269
+ title: alertTitle,
270
+ text: alertMessage,
271
+ open: showMaxChoiceAlert,
272
+ onCloseText: onCloseText,
273
+ onClose: () => this.setState({
274
+ showMaxChoiceAlert: false
275
+ })
276
+ }));
277
+ }
278
+ }
322
279
  exports.Categorize = Categorize;
323
- (0, _defineProperty2["default"])(Categorize, "propTypes", {
324
- classes: _propTypes["default"].object.isRequired,
325
- model: _propTypes["default"].object,
326
- session: _propTypes["default"].shape({
327
- answers: _propTypes["default"].arrayOf(_propTypes["default"].shape({
328
- choice: _propTypes["default"].string,
329
- category: _propTypes["default"].string
280
+ (0, _defineProperty2.default)(Categorize, "propTypes", {
281
+ model: _propTypes.default.object,
282
+ session: _propTypes.default.shape({
283
+ answers: _propTypes.default.arrayOf(_propTypes.default.shape({
284
+ choice: _propTypes.default.string,
285
+ category: _propTypes.default.string
330
286
  }))
331
287
  }),
332
- onAnswersChange: _propTypes["default"].func.isRequired,
333
- onShowCorrectToggle: _propTypes["default"].func.isRequired
288
+ onAnswersChange: _propTypes.default.func.isRequired,
289
+ onShowCorrectToggle: _propTypes.default.func.isRequired,
290
+ pauseMathObserver: _propTypes.default.func,
291
+ resumeMathObserver: _propTypes.default.func
334
292
  });
335
- (0, _defineProperty2["default"])(Categorize, "defaultProps", {
293
+ (0, _defineProperty2.default)(Categorize, "defaultProps", {
336
294
  disabled: false
337
295
  });
338
-
339
- var CategorizeProvider = /*#__PURE__*/function (_React$Component2) {
340
- (0, _inherits2["default"])(CategorizeProvider, _React$Component2);
341
-
342
- var _super2 = _createSuper(CategorizeProvider);
343
-
344
- function CategorizeProvider(props) {
345
- var _this3;
346
-
347
- (0, _classCallCheck2["default"])(this, CategorizeProvider);
348
- _this3 = _super2.call(this, props);
349
- _this3.uid = _drag.uid.generateId();
350
- return _this3;
296
+ class CategorizeProvider extends _react.default.Component {
297
+ constructor(props) {
298
+ super(props);
299
+ (0, _defineProperty2.default)(this, "onDragStart", event => {
300
+ const {
301
+ active
302
+ } = event;
303
+ const {
304
+ pauseMathObserver
305
+ } = this.props;
306
+ if (pauseMathObserver) {
307
+ pauseMathObserver();
308
+ }
309
+ if (active?.data?.current) {
310
+ this.setState({
311
+ activeDragItem: active.data.current
312
+ });
313
+ }
314
+ });
315
+ (0, _defineProperty2.default)(this, "onDragEnd", event => {
316
+ const {
317
+ active,
318
+ over
319
+ } = event;
320
+ const {
321
+ resumeMathObserver
322
+ } = this.props;
323
+ this.setState({
324
+ activeDragItem: null
325
+ });
326
+ if (resumeMathObserver) {
327
+ resumeMathObserver();
328
+ }
329
+ if (!over || !active) {
330
+ return;
331
+ }
332
+ const draggedItem = active.data.current;
333
+ if (draggedItem && draggedItem.type === 'choice') {
334
+ const choiceData = {
335
+ id: draggedItem.id,
336
+ categoryId: draggedItem.categoryId,
337
+ choiceIndex: draggedItem.choiceIndex,
338
+ value: draggedItem.value,
339
+ itemType: draggedItem.itemType
340
+ };
341
+ if (over.id === 'choices-board') {
342
+ if (this.categorizeRef && this.categorizeRef.removeChoice && draggedItem.categoryId) {
343
+ this.categorizeRef.removeChoice(choiceData);
344
+ }
345
+ } else {
346
+ const categoryId = over.id;
347
+ if (this.categorizeRef && this.categorizeRef.dropChoice) {
348
+ this.categorizeRef.dropChoice(categoryId, choiceData);
349
+ }
350
+ }
351
+ }
352
+ });
353
+ (0, _defineProperty2.default)(this, "renderDragOverlay", () => {
354
+ const {
355
+ activeDragItem
356
+ } = this.state;
357
+ const {
358
+ model
359
+ } = this.props;
360
+ if (!activeDragItem) return null;
361
+ if (activeDragItem.type === 'choice') {
362
+ const choice = model.choices?.find(c => c.id === activeDragItem.id);
363
+ if (choice) {
364
+ return /*#__PURE__*/_react.default.createElement(_choice.default, (0, _extends2.default)({
365
+ key: choice.id,
366
+ id: choice.id
367
+ }, choice));
368
+ }
369
+ }
370
+ return null;
371
+ });
372
+ this.uid = _drag.uid.generateId();
373
+ this.state = {
374
+ activeDragItem: null
375
+ };
351
376
  }
352
-
353
- (0, _createClass2["default"])(CategorizeProvider, [{
354
- key: "render",
355
- value: function render() {
356
- return /*#__PURE__*/_react["default"].createElement(_drag.uid.Provider, {
357
- value: this.uid
358
- }, /*#__PURE__*/_react["default"].createElement(Categorize, this.props));
359
- }
360
- }]);
361
- return CategorizeProvider;
362
- }(_react["default"].Component);
363
-
364
- var styles = function styles(theme) {
365
- return {
366
- mainContainer: {
367
- color: _renderUi.color.text(),
368
- backgroundColor: _renderUi.color.background(),
369
- position: 'relative'
370
- },
371
- note: {
372
- marginBottom: theme.spacing.unit * 2
373
- },
374
- categorize: {
375
- marginBottom: theme.spacing.unit,
376
- display: 'flex',
377
- flexDirection: 'column'
378
- },
379
- collapsible: {
380
- paddingBottom: theme.spacing.unit * 2
381
- }
382
- };
383
- };
384
-
385
- var _default = (0, _drag.withDragContext)((0, _styles.withStyles)(styles)(CategorizeProvider));
386
-
387
- exports["default"] = _default;
377
+ render() {
378
+ return /*#__PURE__*/_react.default.createElement(_drag.DragProvider, {
379
+ onDragStart: this.onDragStart,
380
+ onDragEnd: this.onDragEnd
381
+ }, /*#__PURE__*/_react.default.createElement(_drag.uid.Provider, {
382
+ value: this.uid
383
+ }, /*#__PURE__*/_react.default.createElement(Categorize, (0, _extends2.default)({
384
+ ref: ref => this.categorizeRef = ref
385
+ }, this.props)), /*#__PURE__*/_react.default.createElement(_core.DragOverlay, null, /*#__PURE__*/_react.default.createElement(DragPreviewWrapper, null, this.renderDragOverlay()))));
386
+ }
387
+ }
388
+ const StyledUiLayout = (0, _styles.styled)(_renderUi.UiLayout)(({
389
+ theme
390
+ }) => ({
391
+ color: _renderUi.color.text(),
392
+ backgroundColor: _renderUi.color.background(),
393
+ position: 'relative'
394
+ }));
395
+ const StyledNote = (0, _styles.styled)('div')(({
396
+ theme
397
+ }) => ({
398
+ marginBottom: theme.spacing(2)
399
+ }));
400
+ const StyledCategorize = (0, _styles.styled)('div')(({
401
+ theme
402
+ }) => ({
403
+ marginBottom: theme.spacing(1),
404
+ display: 'flex',
405
+ flexDirection: 'column'
406
+ }));
407
+ const StyledCollapsible = (0, _styles.styled)(_renderUi.Collapsible)(({
408
+ theme
409
+ }) => ({
410
+ paddingBottom: theme.spacing(2)
411
+ }));
412
+ var _default = exports.default = CategorizeProvider;
388
413
  //# sourceMappingURL=index.js.map