@pie-element/categorize 8.15.1-next.1 → 8.15.1-next.10

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 (61) hide show
  1. package/configure/lib/defaults.js +207 -0
  2. package/configure/lib/defaults.js.map +1 -0
  3. package/configure/lib/design/builder.js +74 -0
  4. package/configure/lib/design/builder.js.map +1 -0
  5. package/configure/lib/design/buttons.js +127 -0
  6. package/configure/lib/design/buttons.js.map +1 -0
  7. package/configure/lib/design/categories/RowLabel.js +78 -0
  8. package/configure/lib/design/categories/RowLabel.js.map +1 -0
  9. package/configure/lib/design/categories/alternateResponses.js +293 -0
  10. package/configure/lib/design/categories/alternateResponses.js.map +1 -0
  11. package/configure/lib/design/categories/category.js +219 -0
  12. package/configure/lib/design/categories/category.js.map +1 -0
  13. package/configure/lib/design/categories/choice-preview.js +136 -0
  14. package/configure/lib/design/categories/choice-preview.js.map +1 -0
  15. package/configure/lib/design/categories/droppable-placeholder.js +187 -0
  16. package/configure/lib/design/categories/droppable-placeholder.js.map +1 -0
  17. package/configure/lib/design/categories/index.js +408 -0
  18. package/configure/lib/design/categories/index.js.map +1 -0
  19. package/configure/lib/design/choices/choice.js +297 -0
  20. package/configure/lib/design/choices/choice.js.map +1 -0
  21. package/configure/lib/design/choices/config.js +114 -0
  22. package/configure/lib/design/choices/config.js.map +1 -0
  23. package/configure/lib/design/choices/index.js +276 -0
  24. package/configure/lib/design/choices/index.js.map +1 -0
  25. package/configure/lib/design/header.js +107 -0
  26. package/configure/lib/design/header.js.map +1 -0
  27. package/configure/lib/design/index.js +538 -0
  28. package/configure/lib/design/index.js.map +1 -0
  29. package/configure/lib/design/input-header.js +166 -0
  30. package/configure/lib/design/input-header.js.map +1 -0
  31. package/configure/lib/design/utils.js +23 -0
  32. package/configure/lib/design/utils.js.map +1 -0
  33. package/configure/lib/index.js +196 -0
  34. package/configure/lib/index.js.map +1 -0
  35. package/configure/lib/main.js +88 -0
  36. package/configure/lib/main.js.map +1 -0
  37. package/configure/lib/utils.js +40 -0
  38. package/configure/lib/utils.js.map +1 -0
  39. package/controller/lib/defaults.js +31 -0
  40. package/controller/lib/defaults.js.map +1 -0
  41. package/controller/lib/index.js +484 -0
  42. package/controller/lib/index.js.map +1 -0
  43. package/controller/lib/utils.js +60 -0
  44. package/controller/lib/utils.js.map +1 -0
  45. package/lib/categorize/categories.js +193 -0
  46. package/lib/categorize/categories.js.map +1 -0
  47. package/lib/categorize/category.js +135 -0
  48. package/lib/categorize/category.js.map +1 -0
  49. package/lib/categorize/choice.js +228 -0
  50. package/lib/categorize/choice.js.map +1 -0
  51. package/lib/categorize/choices.js +162 -0
  52. package/lib/categorize/choices.js.map +1 -0
  53. package/lib/categorize/droppable-placeholder.js +111 -0
  54. package/lib/categorize/droppable-placeholder.js.map +1 -0
  55. package/lib/categorize/grid-content.js +103 -0
  56. package/lib/categorize/grid-content.js.map +1 -0
  57. package/lib/categorize/index.js +368 -0
  58. package/lib/categorize/index.js.map +1 -0
  59. package/lib/index.js +137 -0
  60. package/lib/index.js.map +1 -0
  61. package/package.json +2 -2
@@ -0,0 +1,368 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
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
+
22
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
23
+
24
+ var _react = _interopRequireDefault(require("react"));
25
+
26
+ var _propTypes = _interopRequireDefault(require("prop-types"));
27
+
28
+ var _choices = _interopRequireDefault(require("./choices"));
29
+
30
+ var _categories = _interopRequireDefault(require("./categories"));
31
+
32
+ var _correctAnswerToggle = require("@pie-lib/pie-toolbox/correct-answer-toggle");
33
+
34
+ var _styles = require("@material-ui/core/styles");
35
+
36
+ var _categorize = require("@pie-lib/pie-toolbox/categorize");
37
+
38
+ var _drag = require("@pie-lib/pie-toolbox/drag");
39
+
40
+ var _renderUi = require("@pie-lib/pie-toolbox/render-ui");
41
+
42
+ var _debug = _interopRequireDefault(require("debug"));
43
+
44
+ var _translator = _interopRequireDefault(require("@pie-lib/pie-toolbox/translator"));
45
+
46
+ var _configUi = require("@pie-lib/pie-toolbox/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) {
66
+ 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);
71
+ onAnswersChange(answers);
72
+ });
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
+
89
+ if (draggedChoice) {
90
+ log('[dropChoice] category: ', draggedChoice.categoryId, 'choice: ', draggedChoice);
91
+ } else {
92
+ log('[dropChoice] category: ', undefined, 'choice: ', undefined);
93
+ }
94
+
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
+
99
+ if (draggedChoice && maxChoicesPerCategory === 1 && answer && answer.choices && answer.choices.length === 1) {
100
+ 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
103
+ else if (draggedChoice && maxChoicesPerCategory > 1 && answer && answer.choices && answer.choices.length === maxChoicesPerCategory) {
104
+ 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({
107
+ showMaxChoiceAlert: true
108
+ });
109
+ } // treat special case when there are more choices that maxChoicesPerCategory is (testing purpose in pits)
110
+ else if (maxChoicesPerCategory !== 0 && answer && answer.choices && answer.choices.length > maxChoicesPerCategory) {
111
+ newAnswers = answers;
112
+
113
+ _this.setState({
114
+ showMaxChoiceAlert: true
115
+ });
116
+ } else {
117
+ newAnswers = draggedChoice ? (0, _categorize.moveChoiceToCategory)(draggedChoice.id, draggedChoice.categoryId, categoryId, draggedChoice.choiceIndex, answers) : _this.removeChoice(categoryId);
118
+ }
119
+
120
+ if (draggedChoice) {
121
+ onAnswersChange(newAnswers);
122
+ }
123
+ });
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
+
134
+ switch (choicePosition) {
135
+ case 'left':
136
+ flexDirection = 'row-reverse';
137
+ break;
138
+
139
+ case 'right':
140
+ flexDirection = 'row';
141
+ break;
142
+
143
+ case 'below':
144
+ flexDirection = 'column';
145
+ break;
146
+
147
+ default:
148
+ // above
149
+ flexDirection = 'column-reverse';
150
+ break;
151
+ }
152
+
153
+ return flexDirection;
154
+ });
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 = {
163
+ showCorrect: false,
164
+ showMaxChoiceAlert: false
165
+ };
166
+ return _this;
167
+ }
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
187
+ });
188
+ }
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
+ note = model.note,
203
+ showNote = model.showNote,
204
+ env = model.env,
205
+ language = model.language,
206
+ maxChoicesPerCategory = model.maxChoicesPerCategory;
207
+
208
+ var _ref3 = env || {},
209
+ mode = _ref3.mode,
210
+ role = _ref3.role;
211
+
212
+ var choicePosition = choicesPosition || 'above';
213
+ var style = {
214
+ flexDirection: this.getPositionDirection(choicePosition)
215
+ };
216
+
217
+ var _buildState = (0, _categorize.buildState)(model.categories, model.choices, showCorrect ? model.correctResponse : session.answers, model.correctResponse),
218
+ categories = _buildState.categories,
219
+ choices = _buildState.choices,
220
+ correct = _buildState.correct;
221
+
222
+ log('[render] disabled: ', model.disabled);
223
+ var rowLabels = model.rowLabels,
224
+ categoriesPerRow = model.categoriesPerRow,
225
+ correctResponse = model.correctResponse;
226
+ var nbOfRows = categories && Math.ceil(categories.length / categoriesPerRow) || 0;
227
+ var existAlternate = this.existAlternateResponse(correctResponse) || false;
228
+ var displayNote = (showCorrect || mode === 'view' && role === 'instructor') && showNote && note && existAlternate;
229
+ var alertMessage = translator.t('translation:categorize:limitMaxChoicesPerCategory', {
230
+ lng: model.language,
231
+ maxChoicesPerCategory: maxChoicesPerCategory
232
+ });
233
+ return /*#__PURE__*/_react["default"].createElement("div", {
234
+ className: classes.mainContainer
235
+ }, model.teacherInstructions && (0, _renderUi.hasText)(model.teacherInstructions) && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_renderUi.Collapsible, {
236
+ labels: {
237
+ hidden: 'Show Teacher Instructions',
238
+ visible: 'Hide Teacher Instructions'
239
+ },
240
+ className: classes.collapsible
241
+ }, /*#__PURE__*/_react["default"].createElement(_renderUi.PreviewPrompt, {
242
+ prompt: model.teacherInstructions
243
+ }))), model.prompt && /*#__PURE__*/_react["default"].createElement(_renderUi.PreviewPrompt, {
244
+ prompt: model.prompt
245
+ }), /*#__PURE__*/_react["default"].createElement(_correctAnswerToggle.CorrectAnswerToggle, {
246
+ show: showCorrect || correct === false,
247
+ toggled: showCorrect,
248
+ onToggle: this.toggleShowCorrect,
249
+ language: language
250
+ }), /*#__PURE__*/_react["default"].createElement("div", {
251
+ className: classes.categorize,
252
+ style: style
253
+ }, /*#__PURE__*/_react["default"].createElement("div", {
254
+ style: {
255
+ display: 'flex',
256
+ flex: 1
257
+ }
258
+ }, /*#__PURE__*/_react["default"].createElement(_categories["default"], {
259
+ model: model,
260
+ disabled: model.disabled,
261
+ categories: categories,
262
+ onDropChoice: this.dropChoice,
263
+ onRemoveChoice: this.removeChoice,
264
+ rowLabels: (rowLabels || []).slice(0, nbOfRows)
265
+ })), /*#__PURE__*/_react["default"].createElement(_choices["default"], {
266
+ disabled: model.disabled,
267
+ model: model,
268
+ choices: choices,
269
+ choicePosition: choicePosition,
270
+ onDropChoice: this.dropChoice,
271
+ onRemoveChoice: this.removeChoice
272
+ })), displayNote && /*#__PURE__*/_react["default"].createElement("div", {
273
+ className: classes.note,
274
+ dangerouslySetInnerHTML: {
275
+ __html: note
276
+ }
277
+ }), model.rationale && (0, _renderUi.hasText)(model.rationale) && /*#__PURE__*/_react["default"].createElement(_renderUi.Collapsible, {
278
+ labels: {
279
+ hidden: 'Show Rationale',
280
+ visible: 'Hide Rationale'
281
+ },
282
+ className: classes.collapsible
283
+ }, /*#__PURE__*/_react["default"].createElement(_renderUi.PreviewPrompt, {
284
+ prompt: model.rationale
285
+ })), model.correctness && model.feedback && !showCorrect && /*#__PURE__*/_react["default"].createElement(_renderUi.Feedback, {
286
+ correctness: model.correctness,
287
+ feedback: model.feedback
288
+ }), /*#__PURE__*/_react["default"].createElement(_configUi.AlertDialog, {
289
+ title: 'Warning',
290
+ text: alertMessage,
291
+ open: showMaxChoiceAlert,
292
+ onClose: function onClose() {
293
+ return _this2.setState({
294
+ showMaxChoiceAlert: false
295
+ });
296
+ }
297
+ }));
298
+ }
299
+ }]);
300
+ return Categorize;
301
+ }(_react["default"].Component);
302
+
303
+ exports.Categorize = Categorize;
304
+ (0, _defineProperty2["default"])(Categorize, "propTypes", {
305
+ classes: _propTypes["default"].object.isRequired,
306
+ model: _propTypes["default"].object,
307
+ session: _propTypes["default"].shape({
308
+ answers: _propTypes["default"].arrayOf(_propTypes["default"].shape({
309
+ choice: _propTypes["default"].string,
310
+ category: _propTypes["default"].string
311
+ }))
312
+ }),
313
+ onAnswersChange: _propTypes["default"].func.isRequired,
314
+ onShowCorrectToggle: _propTypes["default"].func.isRequired
315
+ });
316
+ (0, _defineProperty2["default"])(Categorize, "defaultProps", {
317
+ disabled: false
318
+ });
319
+
320
+ var CategorizeProvider = /*#__PURE__*/function (_React$Component2) {
321
+ (0, _inherits2["default"])(CategorizeProvider, _React$Component2);
322
+
323
+ var _super2 = _createSuper(CategorizeProvider);
324
+
325
+ function CategorizeProvider(props) {
326
+ var _this3;
327
+
328
+ (0, _classCallCheck2["default"])(this, CategorizeProvider);
329
+ _this3 = _super2.call(this, props);
330
+ _this3.uid = _drag.uid.generateId();
331
+ return _this3;
332
+ }
333
+
334
+ (0, _createClass2["default"])(CategorizeProvider, [{
335
+ key: "render",
336
+ value: function render() {
337
+ return /*#__PURE__*/_react["default"].createElement(_drag.uid.Provider, {
338
+ value: this.uid
339
+ }, /*#__PURE__*/_react["default"].createElement(Categorize, this.props));
340
+ }
341
+ }]);
342
+ return CategorizeProvider;
343
+ }(_react["default"].Component);
344
+
345
+ var styles = function styles(theme) {
346
+ return {
347
+ mainContainer: {
348
+ color: _renderUi.color.text(),
349
+ backgroundColor: _renderUi.color.background()
350
+ },
351
+ note: {
352
+ marginBottom: theme.spacing.unit * 2
353
+ },
354
+ categorize: {
355
+ marginBottom: theme.spacing.unit,
356
+ display: 'flex',
357
+ flexDirection: 'column'
358
+ },
359
+ collapsible: {
360
+ paddingBottom: theme.spacing.unit * 2
361
+ }
362
+ };
363
+ };
364
+
365
+ var _default = (0, _drag.withDragContext)((0, _styles.withStyles)(styles)(CategorizeProvider));
366
+
367
+ exports["default"] = _default;
368
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/categorize/index.jsx"],"names":["translator","Translator","log","Categorize","props","c","onAnswersChange","session","answers","id","categoryId","choiceIndex","draggedChoice","model","maxChoicesPerCategory","newAnswers","undefined","answer","find","category","choices","length","setState","showMaxChoiceAlert","removeChoice","showCorrect","state","onShowCorrectToggle","choicePosition","flexDirection","correctResponse","some","correctRes","alternateResponses","nextProps","nextModel","note","language","t","lng","classes","choicesPosition","showNote","env","mode","role","style","getPositionDirection","categories","correct","disabled","rowLabels","categoriesPerRow","nbOfRows","Math","ceil","existAlternate","existAlternateResponse","displayNote","alertMessage","mainContainer","teacherInstructions","hidden","visible","collapsible","prompt","toggleShowCorrect","categorize","display","flex","dropChoice","slice","__html","rationale","correctness","feedback","React","Component","PropTypes","object","isRequired","shape","arrayOf","choice","string","func","CategorizeProvider","uid","generateId","styles","theme","color","text","backgroundColor","background","marginBottom","spacing","unit","paddingBottom"],"mappings":"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","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport Choices from './choices';\nimport Categories from './categories';\nimport {CorrectAnswerToggle} from '@pie-lib/pie-toolbox/correct-answer-toggle';\nimport { withStyles } from '@material-ui/core/styles';\nimport { buildState, removeChoiceFromCategory, moveChoiceToCategory } from '@pie-lib/pie-toolbox/categorize';\nimport { withDragContext, uid } from '@pie-lib/pie-toolbox/drag';\nimport { color, Feedback, Collapsible, hasText, PreviewPrompt } from '@pie-lib/pie-toolbox/render-ui';\nimport debug from 'debug';\nimport Translator from '@pie-lib/pie-toolbox/translator';\nimport { AlertDialog } from '@pie-lib/pie-toolbox/config-ui';\nconst { translator } = Translator;\n\nconst log = debug('@pie-ui:categorize');\n\nexport class Categorize extends React.Component {\n static propTypes = {\n classes: PropTypes.object.isRequired,\n model: PropTypes.object,\n session: PropTypes.shape({\n answers: PropTypes.arrayOf(\n PropTypes.shape({\n choice: PropTypes.string,\n category: PropTypes.string,\n }),\n ),\n }),\n onAnswersChange: PropTypes.func.isRequired,\n onShowCorrectToggle: PropTypes.func.isRequired,\n };\n\n static defaultProps = {\n disabled: false,\n };\n\n constructor(props) {\n super(props);\n\n this.state = {\n showCorrect: false,\n showMaxChoiceAlert: false,\n };\n }\n\n removeChoice = (c) => {\n log('[removeChoice]: ', c);\n const { onAnswersChange, session } = this.props;\n const answers = removeChoiceFromCategory(c.id, c.categoryId, c.choiceIndex, session.answers);\n onAnswersChange(answers);\n };\n\n dropChoice = (categoryId, draggedChoice) => {\n const { session, onAnswersChange, model } = this.props;\n const { maxChoicesPerCategory = 0 } = model || {};\n const { answers = [] } = session || {};\n let newAnswers;\n if (draggedChoice) {\n log('[dropChoice] category: ', draggedChoice.categoryId, 'choice: ', draggedChoice);\n } else {\n log('[dropChoice] category: ', undefined, 'choice: ', undefined);\n }\n\n const answer = answers.find(answer => answer.category === categoryId);\n\n // treat special case to replace the existing choice with the new one when maxChoicesPerCategory = 1\n if (draggedChoice && maxChoicesPerCategory === 1 && answer && answer.choices && answer.choices.length === 1) {\n newAnswers = moveChoiceToCategory(\n draggedChoice.id,\n draggedChoice.categoryId,\n categoryId,\n draggedChoice.choiceIndex,\n answers,\n );\n newAnswers = removeChoiceFromCategory(answer.choices[0], categoryId, 0, answers)\n }\n\n // treat special case when there are as many choices as maxChoicesPerCategory is\n else if (draggedChoice && maxChoicesPerCategory > 1 && answer && answer.choices && answer.choices.length === maxChoicesPerCategory ) {\n newAnswers = draggedChoice.categoryId ? moveChoiceToCategory(\n draggedChoice.id,\n draggedChoice.categoryId,\n draggedChoice.categoryId,\n draggedChoice.choiceIndex,\n answers,\n ) : removeChoiceFromCategory(draggedChoice.id, draggedChoice.categoryId, draggedChoice.choiceIndex, answers);\n this.setState({ showMaxChoiceAlert: true })\n }\n\n // treat special case when there are more choices that maxChoicesPerCategory is (testing purpose in pits)\n else if (maxChoicesPerCategory !== 0 && answer && answer.choices && answer.choices.length > maxChoicesPerCategory) {\n newAnswers = answers;\n this.setState({ showMaxChoiceAlert: true });\n }\n else {\n newAnswers = draggedChoice\n ? moveChoiceToCategory(\n draggedChoice.id,\n draggedChoice.categoryId,\n categoryId,\n draggedChoice.choiceIndex,\n answers,\n )\n : this.removeChoice(categoryId);\n }\n\n if (draggedChoice) {\n onAnswersChange(newAnswers);\n }\n };\n\n UNSAFE_componentWillReceiveProps(nextProps) {\n const { model } = this.props;\n const { model: nextModel } = nextProps;\n\n // check if the note is the default one for prev language and change to the default one for new language\n // this check is necessary in order to diferanciate between default and authour defined note\n // and only change between languages for default ones\n if (model.note && model.language && model.language !== nextModel.language\n && model.note === translator.t('common:commonCorrectAnswerWithAlternates', { lng: model.language })) {\n model.note = translator.t('common:commonCorrectAnswerWithAlternates', { lng: nextModel.language });\n }\n\n this.setState({ showCorrect: false });\n }\n\n toggleShowCorrect = () =>\n this.setState({ showCorrect: !this.state.showCorrect }, () => {\n this.props.onShowCorrectToggle();\n });\n\n getPositionDirection = (choicePosition) => {\n let flexDirection;\n\n switch (choicePosition) {\n case 'left':\n flexDirection = 'row-reverse';\n break;\n case 'right':\n flexDirection = 'row';\n break;\n case 'below':\n flexDirection = 'column';\n break;\n default:\n // above\n flexDirection = 'column-reverse';\n break;\n }\n\n return flexDirection;\n };\n\n existAlternateResponse = (correctResponse) =>\n correctResponse?.some((correctRes) => correctRes.alternateResponses?.length > 0);\n\n render() {\n const { classes, model, session } = this.props;\n const { showCorrect, showMaxChoiceAlert } = this.state;\n const { choicesPosition, note, showNote, env, language, maxChoicesPerCategory } = model;\n const { mode, role } = env || {};\n const choicePosition = choicesPosition || 'above';\n\n const style = {\n flexDirection: this.getPositionDirection(choicePosition),\n };\n\n const { categories, choices, correct } = buildState(\n model.categories,\n model.choices,\n showCorrect ? model.correctResponse : session.answers,\n model.correctResponse,\n );\n\n log('[render] disabled: ', model.disabled);\n\n const { rowLabels, categoriesPerRow, correctResponse } = model;\n const nbOfRows = (categories && Math.ceil(categories.length / categoriesPerRow)) || 0;\n const existAlternate = this.existAlternateResponse(correctResponse) || false;\n const displayNote =\n (showCorrect || (mode === 'view' && role === 'instructor')) && showNote && note && existAlternate;\n const alertMessage = translator.t('translation:categorize:limitMaxChoicesPerCategory', { lng: model.language, maxChoicesPerCategory });\n\n return (\n <div className={classes.mainContainer}>\n {model.teacherInstructions && hasText(model.teacherInstructions) && (\n <React.Fragment>\n <Collapsible\n labels={{\n hidden: 'Show Teacher Instructions',\n visible: 'Hide Teacher Instructions',\n }}\n className={classes.collapsible}\n >\n <PreviewPrompt prompt={model.teacherInstructions} />\n </Collapsible>\n </React.Fragment>\n )}\n\n {model.prompt && <PreviewPrompt prompt={model.prompt} />}\n\n <CorrectAnswerToggle\n show={showCorrect || correct === false}\n toggled={showCorrect}\n onToggle={this.toggleShowCorrect}\n language={language}\n />\n\n <div className={classes.categorize} style={style}>\n <div style={{ display: 'flex', flex: 1 }}>\n <Categories\n model={model}\n disabled={model.disabled}\n categories={categories}\n onDropChoice={this.dropChoice}\n onRemoveChoice={this.removeChoice}\n rowLabels={(rowLabels || []).slice(0, nbOfRows)}\n />\n </div>\n <Choices\n disabled={model.disabled}\n model={model}\n choices={choices}\n choicePosition={choicePosition}\n onDropChoice={this.dropChoice}\n onRemoveChoice={this.removeChoice}\n />\n </div>\n\n {displayNote && (\n <div\n className={classes.note}\n dangerouslySetInnerHTML={{\n __html: note,\n }}\n />\n )}\n\n {model.rationale && hasText(model.rationale) && (\n <Collapsible labels={{ hidden: 'Show Rationale', visible: 'Hide Rationale' }} className={classes.collapsible}>\n <PreviewPrompt prompt={model.rationale} />\n </Collapsible>\n )}\n\n {model.correctness && model.feedback && !showCorrect && (\n <Feedback correctness={model.correctness} feedback={model.feedback} />\n )}\n <AlertDialog\n title={'Warning'}\n text={alertMessage}\n open={showMaxChoiceAlert}\n onClose={() => this.setState({ showMaxChoiceAlert: false })}\n >\n </AlertDialog>\n </div>\n );\n }\n}\n\nclass CategorizeProvider extends React.Component {\n constructor(props) {\n super(props);\n this.uid = uid.generateId();\n }\n\n render() {\n return (\n <uid.Provider value={this.uid}>\n <Categorize {...this.props} />\n </uid.Provider>\n );\n }\n}\n\nconst styles = (theme) => ({\n mainContainer: {\n color: color.text(),\n backgroundColor: color.background(),\n },\n note: {\n marginBottom: theme.spacing.unit * 2,\n },\n categorize: {\n marginBottom: theme.spacing.unit,\n display: 'flex',\n flexDirection: 'column',\n },\n collapsible: {\n paddingBottom: theme.spacing.unit * 2,\n },\n});\n\nexport default withDragContext(withStyles(styles)(CategorizeProvider));\n"],"file":"index.js"}
package/lib/index.js ADDED
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = 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 _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
15
+
16
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
17
+
18
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
19
+
20
+ var _wrapNativeSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/wrapNativeSuper"));
21
+
22
+ var _react = _interopRequireDefault(require("react"));
23
+
24
+ var _reactDom = _interopRequireDefault(require("react-dom"));
25
+
26
+ var _mathRenderingAccessible = require("@pie-lib/pie-toolbox/math-rendering-accessible");
27
+
28
+ var _piePlayerEvents = require("@pie-framework/pie-player-events");
29
+
30
+ var _categorize = _interopRequireDefault(require("./categorize"));
31
+
32
+ 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); }; }
33
+
34
+ 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; } }
35
+
36
+ var Categorize = /*#__PURE__*/function (_HTMLElement) {
37
+ (0, _inherits2["default"])(Categorize, _HTMLElement);
38
+
39
+ var _super = _createSuper(Categorize);
40
+
41
+ function Categorize() {
42
+ (0, _classCallCheck2["default"])(this, Categorize);
43
+ return _super.apply(this, arguments);
44
+ }
45
+
46
+ (0, _createClass2["default"])(Categorize, [{
47
+ key: "model",
48
+ set: function set(m) {
49
+ this._model = m;
50
+ this.eliminateBlindAnswersFromSession();
51
+ this.dispatchEvent(new _piePlayerEvents.ModelSetEvent(this.tagName.toLowerCase(), this.isComplete(), !!this._model));
52
+ this.render();
53
+ }
54
+ }, {
55
+ key: "isComplete",
56
+ value: function isComplete() {
57
+ if (!this._session) {
58
+ return false;
59
+ }
60
+
61
+ return Array.isArray(this._session.answers) && this._session.answers.length > 0;
62
+ }
63
+ }, {
64
+ key: "session",
65
+ get: function get() {
66
+ return this._session;
67
+ },
68
+ set: function set(s) {
69
+ if (s && !s.answers) {
70
+ s.answers = [];
71
+ }
72
+
73
+ this._session = s;
74
+ this.render();
75
+ }
76
+ }, {
77
+ key: "eliminateBlindAnswersFromSession",
78
+ value: function eliminateBlindAnswersFromSession() {
79
+ var _ref = this._session || {},
80
+ _ref$answers = _ref.answers,
81
+ answers = _ref$answers === void 0 ? [] : _ref$answers;
82
+
83
+ var _ref2 = this._model || {},
84
+ _ref2$choices = _ref2.choices,
85
+ choices = _ref2$choices === void 0 ? [] : _ref2$choices;
86
+
87
+ var mappedChoices = choices.map(function (c) {
88
+ return c.id;
89
+ }) || [];
90
+ var filteredAnswers = answers.map(function (answer) {
91
+ var answerChoices = (answer === null || answer === void 0 ? void 0 : answer.choices) || [];
92
+ answer.choices = answerChoices.filter(function (c) {
93
+ return mappedChoices.includes(c);
94
+ });
95
+ return answer;
96
+ });
97
+
98
+ if (filteredAnswers.length > 0) {
99
+ this.changeAnswers(filteredAnswers);
100
+ }
101
+ }
102
+ }, {
103
+ key: "changeAnswers",
104
+ value: function changeAnswers(answers) {
105
+ this._session.answers = answers;
106
+ this.dispatchEvent(new _piePlayerEvents.SessionChangedEvent(this.tagName.toLowerCase(), this.isComplete()));
107
+ this.render();
108
+ }
109
+ }, {
110
+ key: "onShowCorrectToggle",
111
+ value: function onShowCorrectToggle() {
112
+ (0, _mathRenderingAccessible.renderMath)(this);
113
+ }
114
+ }, {
115
+ key: "render",
116
+ value: function render() {
117
+ var _this = this;
118
+
119
+ if (this._model && this._session) {
120
+ var el = /*#__PURE__*/_react["default"].createElement(_categorize["default"], {
121
+ model: this._model,
122
+ session: this._session,
123
+ onAnswersChange: this.changeAnswers.bind(this),
124
+ onShowCorrectToggle: this.onShowCorrectToggle.bind(this)
125
+ });
126
+
127
+ _reactDom["default"].render(el, this, function () {
128
+ (0, _mathRenderingAccessible.renderMath)(_this);
129
+ });
130
+ }
131
+ }
132
+ }]);
133
+ return Categorize;
134
+ }( /*#__PURE__*/(0, _wrapNativeSuper2["default"])(HTMLElement));
135
+
136
+ exports["default"] = Categorize;
137
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.js"],"names":["Categorize","m","_model","eliminateBlindAnswersFromSession","dispatchEvent","ModelSetEvent","tagName","toLowerCase","isComplete","render","_session","Array","isArray","answers","length","s","choices","mappedChoices","map","c","id","filteredAnswers","answer","answerChoices","filter","includes","changeAnswers","SessionChangedEvent","el","React","createElement","CategorizeComponent","model","session","onAnswersChange","bind","onShowCorrectToggle","ReactDOM","HTMLElement"],"mappings":"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","sourcesContent":["import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { renderMath } from '@pie-lib/pie-toolbox/math-rendering-accessible';\nimport { SessionChangedEvent, ModelSetEvent } from '@pie-framework/pie-player-events';\nimport CategorizeComponent from './categorize';\n\nexport default class Categorize extends HTMLElement {\n set model(m) {\n this._model = m;\n\n this.eliminateBlindAnswersFromSession();\n this.dispatchEvent(new ModelSetEvent(this.tagName.toLowerCase(), this.isComplete(), !!this._model));\n this.render();\n }\n\n isComplete() {\n if (!this._session) {\n return false;\n }\n\n return Array.isArray(this._session.answers) && this._session.answers.length > 0;\n }\n\n set session(s) {\n if (s && !s.answers) {\n s.answers = [];\n }\n\n this._session = s;\n this.render();\n }\n\n get session() {\n return this._session;\n }\n\n eliminateBlindAnswersFromSession(){\n const { answers = [] } = this._session || {};\n const { choices = [] } = this._model || {};\n const mappedChoices = choices.map(c => c.id) || [];\n const filteredAnswers = answers.map(answer => {\n const answerChoices = answer?.choices || [];\n answer.choices = answerChoices.filter(c => mappedChoices.includes(c));\n return answer;\n })\n if(filteredAnswers.length > 0){\n this.changeAnswers(filteredAnswers);\n }\n }\n\n changeAnswers(answers) {\n this._session.answers = answers;\n\n this.dispatchEvent(new SessionChangedEvent(this.tagName.toLowerCase(), this.isComplete()));\n\n this.render();\n }\n\n onShowCorrectToggle() {\n renderMath(this);\n }\n\n render() {\n if (this._model && this._session) {\n const el = React.createElement(CategorizeComponent, {\n model: this._model,\n session: this._session,\n onAnswersChange: this.changeAnswers.bind(this),\n onShowCorrectToggle: this.onShowCorrectToggle.bind(this),\n });\n\n ReactDOM.render(el, this, () => {\n renderMath(this);\n });\n }\n }\n}\n"],"file":"index.js"}
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
7
- "version": "8.15.1-next.1+b15abe678",
7
+ "version": "8.15.1-next.10+01d65ae65",
8
8
  "description": "",
9
9
  "author": "pie framework developers",
10
10
  "license": "ISC",
@@ -20,7 +20,7 @@
20
20
  "react-dnd": "^14.0.5",
21
21
  "react-dom": "^16.8.1"
22
22
  },
23
- "gitHead": "b15abe678bf81101440641728f578317e11a58c1",
23
+ "gitHead": "01d65ae6513bc23cc56c356bfb6c158754d77c89",
24
24
  "scripts": {
25
25
  "postpublish": "../../scripts/postpublish"
26
26
  },