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