@pie-element/categorize 7.7.2-beta.3 → 7.7.2-beta.4

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 (59) hide show
  1. package/configure/lib/defaults.js +113 -0
  2. package/configure/lib/defaults.js.map +1 -0
  3. package/configure/lib/design/builder.js +62 -0
  4. package/configure/lib/design/builder.js.map +1 -0
  5. package/configure/lib/design/buttons.js +105 -0
  6. package/configure/lib/design/buttons.js.map +1 -0
  7. package/configure/lib/design/categories/RowLabel.js +61 -0
  8. package/configure/lib/design/categories/RowLabel.js.map +1 -0
  9. package/configure/lib/design/categories/alternateResponses.js +242 -0
  10. package/configure/lib/design/categories/alternateResponses.js.map +1 -0
  11. package/configure/lib/design/categories/category.js +175 -0
  12. package/configure/lib/design/categories/category.js.map +1 -0
  13. package/configure/lib/design/categories/choice-preview.js +98 -0
  14. package/configure/lib/design/categories/choice-preview.js.map +1 -0
  15. package/configure/lib/design/categories/droppable-placeholder.js +155 -0
  16. package/configure/lib/design/categories/droppable-placeholder.js.map +1 -0
  17. package/configure/lib/design/categories/index.js +338 -0
  18. package/configure/lib/design/categories/index.js.map +1 -0
  19. package/configure/lib/design/choices/choice.js +243 -0
  20. package/configure/lib/design/choices/choice.js.map +1 -0
  21. package/configure/lib/design/choices/config.js +113 -0
  22. package/configure/lib/design/choices/config.js.map +1 -0
  23. package/configure/lib/design/choices/index.js +234 -0
  24. package/configure/lib/design/choices/index.js.map +1 -0
  25. package/configure/lib/design/header.js +83 -0
  26. package/configure/lib/design/header.js.map +1 -0
  27. package/configure/lib/design/index.js +430 -0
  28. package/configure/lib/design/index.js.map +1 -0
  29. package/configure/lib/design/input-header.js +138 -0
  30. package/configure/lib/design/input-header.js.map +1 -0
  31. package/configure/lib/index.js +115 -0
  32. package/configure/lib/index.js.map +1 -0
  33. package/configure/lib/main.js +72 -0
  34. package/configure/lib/main.js.map +1 -0
  35. package/configure/lib/utils.js +25 -0
  36. package/configure/lib/utils.js.map +1 -0
  37. package/controller/lib/defaults.js +29 -0
  38. package/controller/lib/defaults.js.map +1 -0
  39. package/controller/lib/index.js +363 -0
  40. package/controller/lib/index.js.map +1 -0
  41. package/controller/lib/utils.js +49 -0
  42. package/controller/lib/utils.js.map +1 -0
  43. package/lib/categorize/categories.js +141 -0
  44. package/lib/categorize/categories.js.map +1 -0
  45. package/lib/categorize/category.js +106 -0
  46. package/lib/categorize/category.js.map +1 -0
  47. package/lib/categorize/choice.js +189 -0
  48. package/lib/categorize/choice.js.map +1 -0
  49. package/lib/categorize/choices.js +131 -0
  50. package/lib/categorize/choices.js.map +1 -0
  51. package/lib/categorize/droppable-placeholder.js +86 -0
  52. package/lib/categorize/droppable-placeholder.js.map +1 -0
  53. package/lib/categorize/grid-content.js +78 -0
  54. package/lib/categorize/grid-content.js.map +1 -0
  55. package/lib/categorize/index.js +275 -0
  56. package/lib/categorize/index.js.map +1 -0
  57. package/lib/index.js +87 -0
  58. package/lib/index.js.map +1 -0
  59. package/package.json +2 -2
@@ -0,0 +1,363 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.outcome = exports.normalize = exports.model = exports.getTotalScore = exports.getPartialScore = exports.getCorrectness = exports.createDefaultModel = exports.createCorrectResponseSession = void 0;
8
+ Object.defineProperty(exports, "score", {
9
+ enumerable: true,
10
+ get: function get() {
11
+ return _categorize.score;
12
+ }
13
+ });
14
+ exports.validate = void 0;
15
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
16
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
17
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
18
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
19
+ var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
20
+ var _categorize = require("@pie-lib/categorize");
21
+ var _feedback = require("@pie-lib/feedback");
22
+ var _utils = require("./utils");
23
+ var _controllerUtils = require("@pie-lib/controller-utils");
24
+ var _defaults = _interopRequireDefault(require("./defaults"));
25
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
26
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } // eslint-disable-next-line no-console
27
+ var getPartialScore = function getPartialScore(correctResponse, builtCategories) {
28
+ // in the resulted best scenario we make a sum with all the correct responses
29
+ // and all the placements
30
+ var _builtCategories$redu = builtCategories.reduce(function (acc, _ref) {
31
+ var _ref$choices = _ref.choices,
32
+ choices = _ref$choices === void 0 ? [] : _ref$choices;
33
+ return {
34
+ placements: acc.placements + choices.length,
35
+ score: acc.score + choices.filter(function (ch) {
36
+ return ch.correct;
37
+ }).length
38
+ };
39
+ }, {
40
+ placements: 0,
41
+ score: 0
42
+ }),
43
+ placements = _builtCategories$redu.placements,
44
+ score = _builtCategories$redu.score;
45
+
46
+ // in the correct response, we make a sum of the max possible score
47
+ var _correctResponse$redu = correctResponse.reduce(function (acc, _ref2) {
48
+ var choices = _ref2.choices;
49
+ return {
50
+ maxScore: acc.maxScore + choices.length
51
+ };
52
+ }, {
53
+ maxScore: 0
54
+ }),
55
+ maxScore = _correctResponse$redu.maxScore;
56
+
57
+ // if there are any extra placements, we subtract from the obtained score
58
+ var extraPlacements = placements > maxScore ? placements - maxScore : 0;
59
+ var totalScore = (score - extraPlacements) / maxScore;
60
+ return totalScore < 0 ? 0 : parseFloat(totalScore.toFixed(2));
61
+ };
62
+ exports.getPartialScore = getPartialScore;
63
+ var getAlternates = function getAlternates(correctResponse) {
64
+ return correctResponse.map(function (c) {
65
+ return c.alternateResponses;
66
+ }).filter(function (alternate) {
67
+ return alternate;
68
+ });
69
+ };
70
+ var getTotalScore = function getTotalScore(question, session, env) {
71
+ if (!session) {
72
+ return 0;
73
+ }
74
+ if (Object.keys(session).length === 0) {
75
+ return 0;
76
+ }
77
+ var _ref3 = question || {},
78
+ categories = _ref3.categories,
79
+ choices = _ref3.choices;
80
+ var _ref4 = question || {},
81
+ correctResponse = _ref4.correctResponse;
82
+ var _ref5 = session || {},
83
+ answers = _ref5.answers;
84
+ answers = answers || [];
85
+ correctResponse = correctResponse || [];
86
+
87
+ // this function is used in pie-ui/categorize as well, in order to get the best scenario
88
+ // so we get the best scenario and calculate the score
89
+ var _buildState = (0, _categorize.buildState)(categories, choices, answers, correctResponse),
90
+ builtCategories = _buildState.categories,
91
+ correct = _buildState.correct;
92
+ var alternates = getAlternates(correctResponse);
93
+ var enabled = _controllerUtils.partialScoring.enabled(question, env);
94
+
95
+ // if there are any alternates, there will be no partial scoring!
96
+ if (enabled && !alternates.length) {
97
+ // we apply partial scoring
98
+ return getPartialScore(correctResponse, builtCategories);
99
+ }
100
+
101
+ // else we apply dichotomous
102
+ return correct ? 1 : 0;
103
+ };
104
+ exports.getTotalScore = getTotalScore;
105
+ var getCorrectness = function getCorrectness(question, session, env) {
106
+ return new Promise(function (resolve) {
107
+ if (env.mode === 'evaluate') {
108
+ var _score = getTotalScore(question, session, env);
109
+ if (_score === 1) {
110
+ resolve('correct');
111
+ } else if (_score === 0) {
112
+ resolve('incorrect');
113
+ } else {
114
+ resolve('partially-correct');
115
+ }
116
+ } else {
117
+ resolve(undefined);
118
+ }
119
+ });
120
+ };
121
+ exports.getCorrectness = getCorrectness;
122
+ var createDefaultModel = function createDefaultModel() {
123
+ var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
124
+ return new Promise(function (resolve) {
125
+ resolve(_objectSpread(_objectSpread({}, _defaults["default"]), model));
126
+ });
127
+ };
128
+ exports.createDefaultModel = createDefaultModel;
129
+ var normalize = function normalize(question) {
130
+ return _objectSpread(_objectSpread({}, _defaults["default"]), question);
131
+ };
132
+
133
+ /**
134
+ *
135
+ * @param {*} question
136
+ * @param {*} session
137
+ * @param {*} env
138
+ * @param {*} updateSession - optional - a function that will set the properties passed into it on the session.
139
+ */
140
+ exports.normalize = normalize;
141
+ var model = function model(question, session, env, updateSession) {
142
+ return new Promise( /*#__PURE__*/function () {
143
+ var _ref6 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(resolve) {
144
+ var normalizedQuestion, answerCorrectness, _ref7, mode, role, categories, categoriesPerRow, choicesLabel, choicesPosition, correctResponse, feedback, feedbackEnabled, promptEnabled, prompt, rowLabels, rationaleEnabled, rationale, note, teacherInstructionsEnabled, teacherInstructions, choices, fb, lockChoiceOrder, filteredCorrectResponse, alternates, out;
145
+ return _regenerator["default"].wrap(function _callee$(_context) {
146
+ while (1) switch (_context.prev = _context.next) {
147
+ case 0:
148
+ normalizedQuestion = normalize(question);
149
+ _context.next = 3;
150
+ return getCorrectness(normalizedQuestion, session, env);
151
+ case 3:
152
+ answerCorrectness = _context.sent;
153
+ _ref7 = env || {}, mode = _ref7.mode, role = _ref7.role;
154
+ categories = normalizedQuestion.categories, categoriesPerRow = normalizedQuestion.categoriesPerRow, choicesLabel = normalizedQuestion.choicesLabel, choicesPosition = normalizedQuestion.choicesPosition, correctResponse = normalizedQuestion.correctResponse, feedback = normalizedQuestion.feedback, feedbackEnabled = normalizedQuestion.feedbackEnabled, promptEnabled = normalizedQuestion.promptEnabled, prompt = normalizedQuestion.prompt, rowLabels = normalizedQuestion.rowLabels, rationaleEnabled = normalizedQuestion.rationaleEnabled, rationale = normalizedQuestion.rationale, note = normalizedQuestion.note, teacherInstructionsEnabled = normalizedQuestion.teacherInstructionsEnabled, teacherInstructions = normalizedQuestion.teacherInstructions;
155
+ choices = normalizedQuestion.choices;
156
+ lockChoiceOrder = (0, _controllerUtils.lockChoices)(normalizedQuestion, session, env);
157
+ filteredCorrectResponse = correctResponse.map(function (response) {
158
+ var filteredChoices = (response.choices || []).filter(function (choice) {
159
+ return choice !== 'null';
160
+ });
161
+ return _objectSpread(_objectSpread({}, response), {}, {
162
+ choices: filteredChoices
163
+ });
164
+ });
165
+ if (!(mode === 'evaluate' && feedbackEnabled)) {
166
+ _context.next = 13;
167
+ break;
168
+ }
169
+ _context.next = 12;
170
+ return (0, _feedback.getFeedbackForCorrectness)(answerCorrectness, feedback);
171
+ case 12:
172
+ fb = _context.sent;
173
+ case 13:
174
+ if (lockChoiceOrder) {
175
+ _context.next = 17;
176
+ break;
177
+ }
178
+ _context.next = 16;
179
+ return (0, _controllerUtils.getShuffledChoices)(choices, session, updateSession, 'id');
180
+ case 16:
181
+ choices = _context.sent;
182
+ case 17:
183
+ alternates = getAlternates(filteredCorrectResponse);
184
+ out = {
185
+ categories: categories || [],
186
+ categoriesPerRow: categoriesPerRow || 2,
187
+ correctness: answerCorrectness,
188
+ choices: choices || [],
189
+ choicesLabel: choicesLabel || '',
190
+ choicesPosition: choicesPosition,
191
+ disabled: mode !== 'gather',
192
+ feedback: fb,
193
+ lockChoiceOrder: lockChoiceOrder,
194
+ prompt: promptEnabled ? prompt : null,
195
+ rowLabels: rowLabels,
196
+ note: note,
197
+ env: env,
198
+ showNote: alternates && alternates.length > 0,
199
+ correctResponse: mode === 'evaluate' ? filteredCorrectResponse : undefined
200
+ };
201
+ if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {
202
+ out.rationale = rationaleEnabled ? rationale : null;
203
+ out.teacherInstructions = teacherInstructionsEnabled ? teacherInstructions : null;
204
+ } else {
205
+ out.rationale = null;
206
+ out.teacherInstructions = null;
207
+ }
208
+ resolve(out);
209
+ case 21:
210
+ case "end":
211
+ return _context.stop();
212
+ }
213
+ }, _callee);
214
+ }));
215
+ return function (_x) {
216
+ return _ref6.apply(this, arguments);
217
+ };
218
+ }());
219
+ };
220
+ exports.model = model;
221
+ var outcome = function outcome(question, session, env) {
222
+ if (env.mode !== 'evaluate') {
223
+ return Promise.reject(new Error('Can not call outcome when mode is not evaluate'));
224
+ } else {
225
+ return new Promise(function (resolve) {
226
+ resolve({
227
+ score: getTotalScore(question, session, env),
228
+ empty: !session || (0, _isEmpty["default"])(session)
229
+ });
230
+ });
231
+ }
232
+ };
233
+ exports.outcome = outcome;
234
+ var createCorrectResponseSession = function createCorrectResponseSession(question, env) {
235
+ return new Promise(function (resolve) {
236
+ var _ref8 = env || {},
237
+ mode = _ref8.mode,
238
+ role = _ref8.role;
239
+ if (mode !== 'evaluate' && role === 'instructor') {
240
+ var correctResponse = question.correctResponse;
241
+ resolve({
242
+ answers: correctResponse,
243
+ id: 1
244
+ });
245
+ } else {
246
+ return resolve(null);
247
+ }
248
+ });
249
+ };
250
+ exports.createCorrectResponseSession = createCorrectResponseSession;
251
+ var validate = function validate() {
252
+ var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
253
+ var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
254
+ var categories = model.categories,
255
+ choices = model.choices,
256
+ correctResponse = model.correctResponse;
257
+ var _config$minChoices = config.minChoices,
258
+ minChoices = _config$minChoices === void 0 ? 1 : _config$minChoices,
259
+ _config$maxChoices = config.maxChoices,
260
+ maxChoices = _config$maxChoices === void 0 ? 15 : _config$maxChoices,
261
+ _config$minCategories = config.minCategories,
262
+ minCategories = _config$minCategories === void 0 ? 1 : _config$minCategories,
263
+ _config$maxCategories = config.maxCategories,
264
+ maxCategories = _config$maxCategories === void 0 ? 12 : _config$maxCategories,
265
+ _config$maxLengthPerC = config.maxLengthPerChoice,
266
+ maxLengthPerChoice = _config$maxLengthPerC === void 0 ? 300 : _config$maxLengthPerC,
267
+ _config$maxLengthPerC2 = config.maxLengthPerCategory,
268
+ maxLengthPerCategory = _config$maxLengthPerC2 === void 0 ? 150 : _config$maxLengthPerC2;
269
+ var reversedChoices = (0, _toConsumableArray2["default"])(choices || []).reverse();
270
+ var errors = {};
271
+ var choicesErrors = {};
272
+ var categoriesErrors = {};
273
+ (categories || []).forEach(function (category) {
274
+ var id = category.id,
275
+ label = category.label;
276
+ var parsedLabel = label.replace(/<(?:.|\n)*?>/gm, '');
277
+ if (parsedLabel.length > maxLengthPerCategory) {
278
+ categoriesErrors[id] = "Category labels should be no more than ".concat(maxLengthPerCategory, " characters long.");
279
+ }
280
+ });
281
+ (reversedChoices || []).forEach(function (choice, index) {
282
+ var id = choice.id,
283
+ content = choice.content;
284
+ var parsedContent = content.replace(/<(?:.|\n)*?>/gm, '');
285
+ if (parsedContent.length > maxLengthPerChoice) {
286
+ choicesErrors[id] = "Tokens should be no more than ".concat(maxLengthPerChoice, " characters long.");
287
+ }
288
+ if (content === '' || content === '<div></div>') {
289
+ choicesErrors[id] = 'Tokens should not be empty.';
290
+ } else {
291
+ var identicalAnswer = reversedChoices.slice(index + 1).some(function (c) {
292
+ return c.content === content;
293
+ });
294
+ if (identicalAnswer) {
295
+ choicesErrors[id] = 'Tokens content should be unique.';
296
+ }
297
+ }
298
+ });
299
+ var nbOfCategories = (categories || []).length;
300
+ var nbOfChoices = (choices || []).length;
301
+ if (nbOfCategories > maxCategories) {
302
+ errors.categoriesError = "No more than ".concat(maxCategories, " categories should be defined.");
303
+ } else if (nbOfCategories < minCategories) {
304
+ errors.categoriesError = "There should be at least ".concat(minCategories, " category defined.");
305
+ }
306
+ if (nbOfChoices < minChoices) {
307
+ errors.choicesError = "There should be at least ".concat(minChoices, " choices defined.");
308
+ } else if (nbOfChoices > maxChoices) {
309
+ errors.choicesError = "No more than ".concat(maxChoices, " choices should be defined.");
310
+ }
311
+ if (nbOfChoices && nbOfCategories) {
312
+ var hasAssociations = false;
313
+ (correctResponse || []).forEach(function (response) {
314
+ var _response$choices = response.choices,
315
+ choices = _response$choices === void 0 ? [] : _response$choices,
316
+ _response$alternateRe = response.alternateResponses,
317
+ alternateResponses = _response$alternateRe === void 0 ? [] : _response$alternateRe;
318
+ if (choices.length) {
319
+ hasAssociations = true;
320
+ } else {
321
+ alternateResponses.forEach(function (alternate) {
322
+ if ((alternate || []).length) {
323
+ hasAssociations = true;
324
+ }
325
+ });
326
+ }
327
+ });
328
+ var duplicateAlternateIndex = -1;
329
+ var duplicateCategory = '';
330
+ (correctResponse || []).forEach(function (response) {
331
+ var _response$choices2 = response.choices,
332
+ choices = _response$choices2 === void 0 ? [] : _response$choices2,
333
+ _response$alternateRe2 = response.alternateResponses,
334
+ alternateResponses = _response$alternateRe2 === void 0 ? [] : _response$alternateRe2,
335
+ category = response.category;
336
+ if (duplicateAlternateIndex === -1) {
337
+ duplicateAlternateIndex = (0, _utils.isCorrectResponseDuplicated)(choices, alternateResponses);
338
+ if (duplicateAlternateIndex === -1) {
339
+ duplicateAlternateIndex = (0, _utils.isAlternateDuplicated)(alternateResponses);
340
+ }
341
+ duplicateCategory = category;
342
+ }
343
+ });
344
+ if (duplicateAlternateIndex > -1) {
345
+ errors.duplicateAlternate = {
346
+ index: duplicateAlternateIndex,
347
+ category: duplicateCategory
348
+ };
349
+ }
350
+ if (!hasAssociations) {
351
+ errors.associationError = 'At least one token should be assigned to at least one category.';
352
+ }
353
+ }
354
+ if (!(0, _isEmpty["default"])(choicesErrors)) {
355
+ errors.choicesErrors = choicesErrors;
356
+ }
357
+ if (!(0, _isEmpty["default"])(categoriesErrors)) {
358
+ errors.categoriesErrors = categoriesErrors;
359
+ }
360
+ return errors;
361
+ };
362
+ exports.validate = validate;
363
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["_isEmpty","_interopRequireDefault","require","_categorize","_feedback","_utils","_controllerUtils","_defaults","ownKeys","object","enumerableOnly","keys","Object","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","target","i","arguments","length","source","forEach","key","_defineProperty2","getOwnPropertyDescriptors","defineProperties","defineProperty","getPartialScore","correctResponse","builtCategories","_builtCategories$redu","reduce","acc","_ref","_ref$choices","choices","placements","score","ch","correct","_correctResponse$redu","_ref2","maxScore","extraPlacements","totalScore","parseFloat","toFixed","exports","getAlternates","map","c","alternateResponses","alternate","getTotalScore","question","session","env","_ref3","categories","_ref4","_ref5","answers","_buildState","buildState","alternates","enabled","partialScoring","getCorrectness","Promise","resolve","mode","undefined","createDefaultModel","model","defaults","normalize","updateSession","_ref6","_asyncToGenerator2","_regenerator","mark","_callee","normalizedQuestion","answerCorrectness","_ref7","role","categoriesPerRow","choicesLabel","choicesPosition","feedback","feedbackEnabled","promptEnabled","prompt","rowLabels","rationaleEnabled","rationale","note","teacherInstructionsEnabled","teacherInstructions","fb","lockChoiceOrder","filteredCorrectResponse","out","wrap","_callee$","_context","prev","next","sent","lockChoices","response","filteredChoices","choice","getFeedbackForCorrectness","getShuffledChoices","correctness","disabled","showNote","stop","_x","outcome","reject","Error","empty","isEmpty","createCorrectResponseSession","_ref8","id","validate","config","_config$minChoices","minChoices","_config$maxChoices","maxChoices","_config$minCategories","minCategories","_config$maxCategories","maxCategories","_config$maxLengthPerC","maxLengthPerChoice","_config$maxLengthPerC2","maxLengthPerCategory","reversedChoices","_toConsumableArray2","reverse","errors","choicesErrors","categoriesErrors","category","label","parsedLabel","replace","concat","index","content","parsedContent","identicalAnswer","slice","some","nbOfCategories","nbOfChoices","categoriesError","choicesError","hasAssociations","_response$choices","_response$alternateRe","duplicateAlternateIndex","duplicateCategory","_response$choices2","_response$alternateRe2","isCorrectResponseDuplicated","isAlternateDuplicated","duplicateAlternate","associationError"],"sources":["../src/index.js"],"sourcesContent":["import isEmpty from 'lodash/isEmpty';\nimport { buildState, score } from '@pie-lib/categorize';\nimport { getFeedbackForCorrectness } from '@pie-lib/feedback';\nimport { isAlternateDuplicated, isCorrectResponseDuplicated } from './utils';\nimport { lockChoices, getShuffledChoices, partialScoring } from '@pie-lib/controller-utils';\nimport defaults from './defaults';\n\n// eslint-disable-next-line no-console\n\nexport { score };\n\nexport const getPartialScore = (correctResponse, builtCategories) => {\n // in the resulted best scenario we make a sum with all the correct responses\n // and all the placements\n const { placements, score } = builtCategories.reduce(\n (acc, { choices = [] }) => ({\n placements: acc.placements + choices.length,\n score: acc.score + choices.filter((ch) => ch.correct).length,\n }),\n { placements: 0, score: 0 },\n );\n\n // in the correct response, we make a sum of the max possible score\n const { maxScore } = correctResponse.reduce(\n (acc, { choices }) => ({\n maxScore: acc.maxScore + choices.length,\n }),\n { maxScore: 0 },\n );\n\n // if there are any extra placements, we subtract from the obtained score\n const extraPlacements = placements > maxScore ? placements - maxScore : 0;\n const totalScore = (score - extraPlacements) / maxScore;\n\n return totalScore < 0 ? 0 : parseFloat(totalScore.toFixed(2));\n};\n\nconst getAlternates = (correctResponse) =>\n correctResponse.map((c) => c.alternateResponses).filter((alternate) => alternate);\n\nexport const getTotalScore = (question, session, env) => {\n if (!session) {\n return 0;\n }\n\n if (Object.keys(session).length === 0) {\n return 0;\n }\n const { categories, choices } = question || {};\n let { correctResponse } = question || {};\n let { answers } = session || {};\n answers = answers || [];\n correctResponse = correctResponse || [];\n\n // this function is used in pie-ui/categorize as well, in order to get the best scenario\n // so we get the best scenario and calculate the score\n const { categories: builtCategories, correct } = buildState(categories, choices, answers, correctResponse);\n\n const alternates = getAlternates(correctResponse);\n const enabled = partialScoring.enabled(question, env);\n\n // if there are any alternates, there will be no partial scoring!\n if (enabled && !alternates.length) {\n // we apply partial scoring\n return getPartialScore(correctResponse, builtCategories);\n }\n\n // else we apply dichotomous\n return correct ? 1 : 0;\n};\n\nexport const getCorrectness = (question, session, env) => {\n return new Promise((resolve) => {\n if (env.mode === 'evaluate') {\n const score = getTotalScore(question, session, env);\n if (score === 1) {\n resolve('correct');\n } else if (score === 0) {\n resolve('incorrect');\n } else {\n resolve('partially-correct');\n }\n } else {\n resolve(undefined);\n }\n });\n};\n\nexport const createDefaultModel = (model = {}) =>\n new Promise((resolve) => {\n resolve({\n ...defaults,\n ...model,\n });\n });\n\nexport const normalize = (question) => ({\n ...defaults,\n ...question,\n});\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n * @param {*} updateSession - optional - a function that will set the properties passed into it on the session.\n */\nexport const model = (question, session, env, updateSession) =>\n new Promise(async (resolve) => {\n const normalizedQuestion = normalize(question);\n const answerCorrectness = await getCorrectness(normalizedQuestion, session, env);\n\n const { mode, role } = env || {};\n\n const {\n categories,\n categoriesPerRow,\n choicesLabel,\n choicesPosition,\n correctResponse,\n feedback,\n feedbackEnabled,\n promptEnabled,\n prompt,\n rowLabels,\n rationaleEnabled,\n rationale,\n note,\n teacherInstructionsEnabled,\n teacherInstructions,\n } = normalizedQuestion;\n let { choices } = normalizedQuestion;\n let fb;\n\n const lockChoiceOrder = lockChoices(normalizedQuestion, session, env);\n\n const filteredCorrectResponse = correctResponse.map((response) => {\n const filteredChoices = (response.choices || []).filter((choice) => choice !== 'null');\n return { ...response, choices: filteredChoices };\n });\n\n if (mode === 'evaluate' && feedbackEnabled) {\n fb = await getFeedbackForCorrectness(answerCorrectness, feedback);\n }\n\n if (!lockChoiceOrder) {\n choices = await getShuffledChoices(choices, session, updateSession, 'id');\n }\n\n const alternates = getAlternates(filteredCorrectResponse);\n const out = {\n categories: categories || [],\n categoriesPerRow: categoriesPerRow || 2,\n correctness: answerCorrectness,\n choices: choices || [],\n choicesLabel: choicesLabel || '',\n choicesPosition,\n disabled: mode !== 'gather',\n feedback: fb,\n lockChoiceOrder,\n prompt: promptEnabled ? prompt : null,\n rowLabels,\n note,\n env,\n showNote: alternates && alternates.length > 0,\n correctResponse: mode === 'evaluate' ? filteredCorrectResponse : undefined,\n };\n\n if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {\n out.rationale = rationaleEnabled ? rationale : null;\n out.teacherInstructions = teacherInstructionsEnabled ? teacherInstructions : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n resolve(out);\n });\n\nexport const outcome = (question, session, env) => {\n if (env.mode !== 'evaluate') {\n return Promise.reject(new Error('Can not call outcome when mode is not evaluate'));\n } else {\n return new Promise((resolve) => {\n resolve({\n score: getTotalScore(question, session, env),\n empty: !session || isEmpty(session),\n });\n });\n }\n};\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n const { mode, role } = env || {};\n\n if (mode !== 'evaluate' && role === 'instructor') {\n const { correctResponse } = question;\n\n resolve({ answers: correctResponse, id: 1 });\n } else {\n return resolve(null);\n }\n });\n};\n\nexport const validate = (model = {}, config = {}) => {\n const { categories, choices, correctResponse } = model;\n const { minChoices = 1, maxChoices = 15, minCategories = 1, maxCategories = 12, maxLengthPerChoice = 300, maxLengthPerCategory = 150 } = config;\n const reversedChoices = [ ...choices || []].reverse();\n const errors = {};\n const choicesErrors = {};\n const categoriesErrors = {};\n\n (categories || []).forEach((category) => {\n const {id, label} = category;\n const parsedLabel = label.replace(/<(?:.|\\n)*?>/gm, '');\n if (parsedLabel.length > maxLengthPerCategory){\n categoriesErrors[id] = `Category labels should be no more than ${maxLengthPerCategory} characters long.`;\n }\n });\n\n (reversedChoices || []).forEach((choice, index) => {\n const { id, content } = choice;\n const parsedContent = content.replace(/<(?:.|\\n)*?>/gm, '');\n if (parsedContent.length > maxLengthPerChoice){\n choicesErrors[id] = `Tokens should be no more than ${maxLengthPerChoice} characters long.`;\n }\n if (content === '' || content === '<div></div>') {\n choicesErrors[id] = 'Tokens should not be empty.';\n } else {\n const identicalAnswer = reversedChoices.slice(index + 1).some(c => c.content === content);\n\n if (identicalAnswer) {\n choicesErrors[id] = 'Tokens content should be unique.';\n }\n }\n });\n\n const nbOfCategories = (categories || []).length;\n const nbOfChoices = (choices || []).length;\n\n if (nbOfCategories > maxCategories) {\n errors.categoriesError = `No more than ${maxCategories} categories should be defined.`;\n } else if (nbOfCategories < minCategories) {\n errors.categoriesError = `There should be at least ${minCategories} category defined.`;\n }\n\n if (nbOfChoices < minChoices) {\n errors.choicesError = `There should be at least ${minChoices} choices defined.`;\n } else if (nbOfChoices > maxChoices) {\n errors.choicesError = `No more than ${maxChoices} choices should be defined.`;\n }\n\n if (nbOfChoices && nbOfCategories) {\n let hasAssociations = false;\n\n (correctResponse || []).forEach(response => {\n const { choices = [], alternateResponses = [] } = response;\n\n if (choices.length) {\n hasAssociations = true;\n } else {\n alternateResponses.forEach(alternate => {\n if ((alternate || []).length) {\n hasAssociations = true;\n }\n });\n }\n });\n\n let duplicateAlternateIndex = -1;\n let duplicateCategory = '';\n (correctResponse || []).forEach(response => {\n const { choices = [], alternateResponses = [], category } = response;\n if (duplicateAlternateIndex === -1) {\n duplicateAlternateIndex = isCorrectResponseDuplicated(choices,alternateResponses);\n if (duplicateAlternateIndex === -1) {\n duplicateAlternateIndex = isAlternateDuplicated(alternateResponses);\n }\n duplicateCategory = category;\n }\n });\n\n if (duplicateAlternateIndex > -1) {\n errors.duplicateAlternate = {index:duplicateAlternateIndex, category:duplicateCategory};\n }\n\n if (!hasAssociations) {\n errors.associationError = 'At least one token should be assigned to at least one category.';\n }\n }\n\n if (!isEmpty(choicesErrors)) {\n errors.choicesErrors = choicesErrors;\n }\n\n if (!isEmpty(categoriesErrors)) {\n errors.categoriesErrors = categoriesErrors;\n }\n return errors;\n};\n"],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.multiplePlacements = exports.isCorrectResponseDuplicated = exports.isAlternateDuplicated = void 0;
8
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
+ // used in configure too, for consistency modify it there too
10
+ var multiplePlacements = {
11
+ enabled: 'Yes',
12
+ disabled: 'No',
13
+ perChoice: 'Set Per Choice'
14
+ };
15
+
16
+ // used to validate the config
17
+ exports.multiplePlacements = multiplePlacements;
18
+ var isCorrectResponseDuplicated = function isCorrectResponseDuplicated(choices, alternate) {
19
+ if (choices.length < 1 || alternate.length < 1) {
20
+ return -1;
21
+ }
22
+ var stringChoices = JSON.stringify(choices.sort());
23
+ var stringAlternate = alternate.reduce(function (total, current) {
24
+ return current.length > 0 ? [].concat((0, _toConsumableArray2["default"])(total), [JSON.stringify(current.sort())]) : total;
25
+ }, []);
26
+ var foundIndexDuplicate = stringAlternate.findIndex(function (alternate) {
27
+ return alternate.length && alternate === stringChoices;
28
+ });
29
+ return foundIndexDuplicate;
30
+ };
31
+ exports.isCorrectResponseDuplicated = isCorrectResponseDuplicated;
32
+ var isAlternateDuplicated = function isAlternateDuplicated(alternate) {
33
+ if (alternate.length <= 1) {
34
+ return -1;
35
+ }
36
+ var elementSet = new Set();
37
+ var stringAlternate = alternate.reduce(function (total, current) {
38
+ return current.length > 0 ? [].concat((0, _toConsumableArray2["default"])(total), [JSON.stringify(current.sort())]) : total;
39
+ }, []);
40
+ for (var i = 0; i < stringAlternate.length; i++) {
41
+ if (elementSet.has(stringAlternate[i]) && stringAlternate[i]) {
42
+ return i;
43
+ }
44
+ elementSet.add(stringAlternate[i]);
45
+ }
46
+ return -1;
47
+ };
48
+ exports.isAlternateDuplicated = isAlternateDuplicated;
49
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","names":["multiplePlacements","enabled","disabled","perChoice","exports","isCorrectResponseDuplicated","choices","alternate","length","stringChoices","JSON","stringify","sort","stringAlternate","reduce","total","current","concat","_toConsumableArray2","foundIndexDuplicate","findIndex","isAlternateDuplicated","elementSet","Set","i","has","add"],"sources":["../src/utils.js"],"sourcesContent":["// used in configure too, for consistency modify it there too\nexport const multiplePlacements = { enabled: 'Yes', disabled: 'No', perChoice: 'Set Per Choice' };\n\n// used to validate the config\nexport const isCorrectResponseDuplicated = (choices,alternate) => {\n if (choices.length < 1 || alternate.length < 1){\n return -1;\n }\n const stringChoices = JSON.stringify(choices.sort());\n const stringAlternate = alternate.reduce((total, current) => current.length > 0 ? [...total, JSON.stringify(current.sort())] : total, []);\n const foundIndexDuplicate = stringAlternate.findIndex(alternate => alternate.length && alternate === stringChoices);\n return foundIndexDuplicate;\n};\n\nexport const isAlternateDuplicated = (alternate) => {\n if (alternate.length <= 1){\n return -1;\n }\n const elementSet = new Set();\n const stringAlternate = alternate.reduce((total, current) => current.length > 0 ? [...total, JSON.stringify(current.sort())] : total, []);\n for (let i = 0; i < stringAlternate.length; i++) {\n if (elementSet.has(stringAlternate[i]) && stringAlternate[i]) {\n return i;\n }\n elementSet.add(stringAlternate[i]);\n }\n\n return -1;\n};\n"],"mappings":";;;;;;;;AAAA;AACO,IAAMA,kBAAkB,GAAG;EAAEC,OAAO,EAAE,KAAK;EAAEC,QAAQ,EAAE,IAAI;EAAEC,SAAS,EAAE;AAAiB,CAAC;;AAEjG;AAAAC,OAAA,CAAAJ,kBAAA,GAAAA,kBAAA;AACO,IAAMK,2BAA2B,GAAG,SAA9BA,2BAA2BA,CAAIC,OAAO,EAACC,SAAS,EAAK;EAC9D,IAAID,OAAO,CAACE,MAAM,GAAG,CAAC,IAAID,SAAS,CAACC,MAAM,GAAG,CAAC,EAAC;IAC3C,OAAO,CAAC,CAAC;EACb;EACA,IAAMC,aAAa,GAAIC,IAAI,CAACC,SAAS,CAACL,OAAO,CAACM,IAAI,CAAC,CAAC,CAAC;EACrD,IAAMC,eAAe,GAAGN,SAAS,CAACO,MAAM,CAAC,UAACC,KAAK,EAAEC,OAAO;IAAA,OAAKA,OAAO,CAACR,MAAM,GAAG,CAAC,MAAAS,MAAA,KAAAC,mBAAA,aAAOH,KAAK,IAAEL,IAAI,CAACC,SAAS,CAACK,OAAO,CAACJ,IAAI,CAAC,CAAC,CAAC,KAAIG,KAAK;EAAA,GAAE,EAAE,CAAC;EACzI,IAAMI,mBAAmB,GAAGN,eAAe,CAACO,SAAS,CAAC,UAAAb,SAAS;IAAA,OAAIA,SAAS,CAACC,MAAM,IAAKD,SAAS,KAAKE,aAAa;EAAA,EAAC;EACpH,OAAOU,mBAAmB;AAC9B,CAAC;AAACf,OAAA,CAAAC,2BAAA,GAAAA,2BAAA;AAEK,IAAMgB,qBAAqB,GAAG,SAAxBA,qBAAqBA,CAAId,SAAS,EAAK;EAChD,IAAIA,SAAS,CAACC,MAAM,IAAI,CAAC,EAAC;IACtB,OAAO,CAAC,CAAC;EACb;EACA,IAAMc,UAAU,GAAG,IAAIC,GAAG,CAAC,CAAC;EAC5B,IAAMV,eAAe,GAAGN,SAAS,CAACO,MAAM,CAAC,UAACC,KAAK,EAAEC,OAAO;IAAA,OAAKA,OAAO,CAACR,MAAM,GAAG,CAAC,MAAAS,MAAA,KAAAC,mBAAA,aAAOH,KAAK,IAAEL,IAAI,CAACC,SAAS,CAACK,OAAO,CAACJ,IAAI,CAAC,CAAC,CAAC,KAAIG,KAAK;EAAA,GAAE,EAAE,CAAC;EACzI,KAAK,IAAIS,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGX,eAAe,CAACL,MAAM,EAAEgB,CAAC,EAAE,EAAE;IAC7C,IAAIF,UAAU,CAACG,GAAG,CAACZ,eAAe,CAACW,CAAC,CAAC,CAAC,IAAIX,eAAe,CAACW,CAAC,CAAC,EAAE;MAC1D,OAAOA,CAAC;IACZ;IACAF,UAAU,CAACI,GAAG,CAACb,eAAe,CAACW,CAAC,CAAC,CAAC;EACtC;EAEA,OAAO,CAAC,CAAC;AACb,CAAC;AAACpB,OAAA,CAAAiB,qBAAA,GAAAA,qBAAA"}
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.Categories = void 0;
9
+ Object.defineProperty(exports, "CategoryType", {
10
+ enumerable: true,
11
+ get: function get() {
12
+ return _category.CategoryType;
13
+ }
14
+ });
15
+ exports["default"] = void 0;
16
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
17
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
18
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
19
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
20
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
21
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
22
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
23
+ var _react = _interopRequireDefault(require("react"));
24
+ var _propTypes = _interopRequireDefault(require("prop-types"));
25
+ var _styles = require("@material-ui/core/styles");
26
+ var _Typography = _interopRequireDefault(require("@material-ui/core/Typography"));
27
+ var _renderUi = require("@pie-lib/render-ui");
28
+ var _chunk = _interopRequireDefault(require("lodash/chunk"));
29
+ var _gridContent = _interopRequireDefault(require("./grid-content"));
30
+ var _category = _interopRequireWildcard(require("./category"));
31
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
32
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
33
+ 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); }; }
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
+ var Categories = /*#__PURE__*/function (_React$Component) {
36
+ (0, _inherits2["default"])(Categories, _React$Component);
37
+ var _super = _createSuper(Categories);
38
+ function Categories() {
39
+ (0, _classCallCheck2["default"])(this, Categories);
40
+ return _super.apply(this, arguments);
41
+ }
42
+ (0, _createClass2["default"])(Categories, [{
43
+ key: "render",
44
+ value: function render() {
45
+ var _this$props = this.props,
46
+ classes = _this$props.classes,
47
+ categories = _this$props.categories,
48
+ model = _this$props.model,
49
+ disabled = _this$props.disabled,
50
+ _onDropChoice = _this$props.onDropChoice,
51
+ onRemoveChoice = _this$props.onRemoveChoice;
52
+ var categoriesPerRow = model.categoriesPerRow;
53
+
54
+ // split categories into an array of arrays (inner array),
55
+ // where each inner array represents how many categories should be displayed on one row
56
+ var chunkedCategories = (0, _chunk["default"])(categories, categoriesPerRow);
57
+ return /*#__PURE__*/_react["default"].createElement(_gridContent["default"], {
58
+ columns: categoriesPerRow,
59
+ className: classes.categories,
60
+ rows: Math.ceil(categories.length / categoriesPerRow) * 2
61
+ }, chunkedCategories.map(function (cat, rowIndex) {
62
+ var items = [];
63
+
64
+ // for each inner array of categories, create a row with category titles
65
+ cat.forEach(function (c, columnIndex) {
66
+ items.push( /*#__PURE__*/_react["default"].createElement(_Typography["default"], {
67
+ className: classes.label,
68
+ key: "category-label-".concat(rowIndex, "-").concat(columnIndex)
69
+ }, /*#__PURE__*/_react["default"].createElement("span", {
70
+ dangerouslySetInnerHTML: {
71
+ __html: c.label
72
+ }
73
+ })));
74
+ });
75
+
76
+ // if the last row has less categories than max on a row, fill the spaces with divs
77
+ items = items.concat(Array(categoriesPerRow - cat.length).fill( /*#__PURE__*/_react["default"].createElement("div", null)).map(function (value, index) {
78
+ return /*#__PURE__*/_react["default"].createElement("div", {
79
+ key: "fill-space-".concat(index)
80
+ });
81
+ }));
82
+
83
+ // for each inner array of categories, create a row with category containers
84
+ cat.forEach(function (c, columnIndex) {
85
+ items.push( /*#__PURE__*/_react["default"].createElement(_category["default"], (0, _extends2["default"])({
86
+ onDropChoice: function onDropChoice(h) {
87
+ return _onDropChoice(c.id, h);
88
+ },
89
+ onRemoveChoice: onRemoveChoice,
90
+ disabled: disabled,
91
+ className: classes.category,
92
+ key: "category-element-".concat(rowIndex, "-").concat(columnIndex)
93
+ }, c)));
94
+ });
95
+
96
+ // if the last row has less categories than max on a row, fill the spaces with divs
97
+ items = items.concat(Array(categoriesPerRow - cat.length).fill( /*#__PURE__*/_react["default"].createElement("div", null)).map(function (value, index) {
98
+ return /*#__PURE__*/_react["default"].createElement("div", {
99
+ key: "fill-space-final-".concat(index)
100
+ });
101
+ }));
102
+ return items;
103
+ }));
104
+ }
105
+ }]);
106
+ return Categories;
107
+ }(_react["default"].Component);
108
+ exports.Categories = Categories;
109
+ (0, _defineProperty2["default"])(Categories, "propTypes", {
110
+ classes: _propTypes["default"].object.isRequired,
111
+ categories: _propTypes["default"].arrayOf(_propTypes["default"].shape(_category.CategoryType)),
112
+ model: _propTypes["default"].shape({
113
+ categoriesPerRow: _propTypes["default"].number
114
+ }),
115
+ disabled: _propTypes["default"].bool,
116
+ onDropChoice: _propTypes["default"].func.isRequired,
117
+ onRemoveChoice: _propTypes["default"].func.isRequired
118
+ });
119
+ (0, _defineProperty2["default"])(Categories, "defaultProps", {
120
+ model: {
121
+ categoriesPerRow: 1
122
+ }
123
+ });
124
+ var styles = function styles(theme) {
125
+ return {
126
+ categories: {
127
+ flex: 1,
128
+ padding: '8px'
129
+ },
130
+ label: {
131
+ color: _renderUi.color.text(),
132
+ backgroundColor: _renderUi.color.background(),
133
+ fontSize: theme.typography.fontSize,
134
+ textAlign: 'center',
135
+ paddingTop: theme.spacing.unit
136
+ }
137
+ };
138
+ };
139
+ var _default = (0, _styles.withStyles)(styles)(Categories);
140
+ exports["default"] = _default;
141
+ //# sourceMappingURL=categories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"categories.js","names":["_react","_interopRequireDefault","require","_propTypes","_styles","_Typography","_renderUi","_chunk","_gridContent","_category","_interopRequireWildcard","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","_typeof","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","result","NewTarget","constructor","Reflect","construct","arguments","apply","_possibleConstructorReturn2","sham","Proxy","Boolean","valueOf","e","Categories","_React$Component","_inherits2","_super","_classCallCheck2","_createClass2","value","render","_this$props","props","classes","categories","model","disabled","onDropChoice","onRemoveChoice","categoriesPerRow","chunkedCategories","chunk","createElement","columns","className","rows","Math","ceil","length","map","cat","rowIndex","items","forEach","c","columnIndex","push","label","concat","dangerouslySetInnerHTML","__html","Array","fill","index","_extends2","h","id","category","React","Component","exports","_defineProperty2","PropTypes","object","isRequired","arrayOf","shape","CategoryType","number","bool","func","styles","theme","flex","padding","color","text","backgroundColor","background","fontSize","typography","textAlign","paddingTop","spacing","unit","_default","withStyles"],"sources":["../../src/categorize/categories.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport { color } from '@pie-lib/render-ui';\n\nimport chunk from 'lodash/chunk';\n\nimport GridContent from './grid-content';\nimport Category, { CategoryType } from './category';\n\nexport { CategoryType };\n\nexport class Categories extends React.Component {\n static propTypes = {\n classes: PropTypes.object.isRequired,\n categories: PropTypes.arrayOf(PropTypes.shape(CategoryType)),\n model: PropTypes.shape({\n categoriesPerRow: PropTypes.number,\n }),\n disabled: PropTypes.bool,\n onDropChoice: PropTypes.func.isRequired,\n onRemoveChoice: PropTypes.func.isRequired,\n };\n\n static defaultProps = {\n model: {\n categoriesPerRow: 1,\n },\n };\n\n render() {\n const { classes, categories, model, disabled, onDropChoice, onRemoveChoice } = this.props;\n const { categoriesPerRow } = model;\n\n // split categories into an array of arrays (inner array),\n // where each inner array represents how many categories should be displayed on one row\n const chunkedCategories = chunk(categories, categoriesPerRow);\n\n return (\n <GridContent\n columns={categoriesPerRow}\n className={classes.categories}\n rows={Math.ceil(categories.length / categoriesPerRow) * 2}\n >\n {chunkedCategories.map((cat, rowIndex) => {\n let items = [];\n\n // for each inner array of categories, create a row with category titles\n cat.forEach((c, columnIndex) => {\n items.push(\n <Typography className={classes.label} key={`category-label-${rowIndex}-${columnIndex}`}>\n <span dangerouslySetInnerHTML={{ __html: c.label }} />\n </Typography>,\n );\n });\n\n // if the last row has less categories than max on a row, fill the spaces with divs\n items = items.concat(Array(categoriesPerRow - cat.length).fill(<div/>).map((value,index) => <div key={`fill-space-${index}`} />));\n\n // for each inner array of categories, create a row with category containers\n cat.forEach((c, columnIndex) => {\n items.push(\n <Category\n onDropChoice={(h) => onDropChoice(c.id, h)}\n onRemoveChoice={onRemoveChoice}\n disabled={disabled}\n className={classes.category}\n key={`category-element-${rowIndex}-${columnIndex}`}\n {...c}\n />,\n );\n });\n\n // if the last row has less categories than max on a row, fill the spaces with divs\n items = items.concat(Array(categoriesPerRow - cat.length).fill(<div/>).map((value,index) =><div key={`fill-space-final-${index}`} />));\n\n return items;\n })}\n </GridContent>\n );\n }\n}\n\nconst styles = (theme) => ({\n categories: {\n flex: 1,\n padding: '8px'\n },\n label: {\n color: color.text(),\n backgroundColor: color.background(),\n fontSize: theme.typography.fontSize,\n textAlign: 'center',\n paddingTop: theme.spacing.unit,\n },\n});\nexport default withStyles(styles)(Categories);\n"],"mappings":"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"}