@pie-element/categorize 7.3.1-next.8 → 7.3.1-next.88
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.
- package/configure/lib/defaults.js +6 -1
- package/configure/lib/defaults.js.map +1 -1
- package/configure/lib/design/builder.js.map +1 -1
- package/configure/lib/design/buttons.js.map +1 -1
- package/configure/lib/design/categories/alternateResponses.js +9 -1
- package/configure/lib/design/categories/alternateResponses.js.map +1 -1
- package/configure/lib/design/categories/category.js +18 -3
- package/configure/lib/design/categories/category.js.map +1 -1
- package/configure/lib/design/categories/choice-preview.js.map +1 -1
- package/configure/lib/design/categories/droppable-placeholder.js.map +1 -1
- package/configure/lib/design/categories/index.js +3 -1
- package/configure/lib/design/categories/index.js.map +1 -1
- package/configure/lib/design/choices/choice.js.map +1 -1
- package/configure/lib/design/choices/config.js +1 -78
- package/configure/lib/design/choices/config.js.map +1 -1
- package/configure/lib/design/choices/index.js +0 -2
- package/configure/lib/design/choices/index.js.map +1 -1
- package/configure/lib/design/header.js.map +1 -1
- package/configure/lib/design/index.js +8 -4
- package/configure/lib/design/index.js.map +1 -1
- package/configure/lib/design/input-header.js.map +1 -1
- package/configure/lib/index.js.map +1 -1
- package/configure/lib/main.js.map +1 -1
- package/configure/lib/utils.js.map +1 -1
- package/configure/package.json +3 -3
- package/controller/lib/defaults.js.map +1 -1
- package/controller/lib/index.js +61 -6
- package/controller/lib/index.js.map +1 -1
- package/controller/lib/utils.js +39 -2
- package/controller/lib/utils.js.map +1 -1
- package/docs/config-schema.json +21 -0
- package/docs/config-schema.json.md +17 -1
- package/docs/demo/config.js +2 -2
- package/docs/demo/generate.js +2 -3
- package/docs/demo/index.html +1 -1
- package/docs/pie-schema.json.md +1 -1
- package/lib/categorize/categories.js +10 -2
- package/lib/categorize/categories.js.map +1 -1
- package/lib/categorize/category.js.map +1 -1
- package/lib/categorize/choice.js.map +1 -1
- package/lib/categorize/choices.js +16 -7
- package/lib/categorize/choices.js.map +1 -1
- package/lib/categorize/droppable-placeholder.js +4 -2
- package/lib/categorize/droppable-placeholder.js.map +1 -1
- package/lib/categorize/grid-content.js.map +1 -1
- package/lib/categorize/index.js +35 -15
- package/lib/categorize/index.js.map +1 -1
- package/lib/index.js.map +1 -1
- package/package.json +3 -3
package/controller/lib/index.js
CHANGED
|
@@ -28,6 +28,8 @@ var _categorize = require("@pie-lib/categorize");
|
|
|
28
28
|
|
|
29
29
|
var _feedback = require("@pie-lib/feedback");
|
|
30
30
|
|
|
31
|
+
var _utils = require("./utils");
|
|
32
|
+
|
|
31
33
|
var _controllerUtils = require("@pie-lib/controller-utils");
|
|
32
34
|
|
|
33
35
|
var _defaults = _interopRequireDefault(require("./defaults"));
|
|
@@ -309,24 +311,47 @@ var validate = function validate() {
|
|
|
309
311
|
correctResponse = model.correctResponse;
|
|
310
312
|
var _config$minChoices = config.minChoices,
|
|
311
313
|
minChoices = _config$minChoices === void 0 ? 1 : _config$minChoices,
|
|
312
|
-
maxChoices = config.maxChoices,
|
|
313
|
-
|
|
314
|
+
_config$maxChoices = config.maxChoices,
|
|
315
|
+
maxChoices = _config$maxChoices === void 0 ? 15 : _config$maxChoices,
|
|
316
|
+
_config$minCategories = config.minCategories,
|
|
317
|
+
minCategories = _config$minCategories === void 0 ? 1 : _config$minCategories,
|
|
318
|
+
_config$maxCategories = config.maxCategories,
|
|
319
|
+
maxCategories = _config$maxCategories === void 0 ? 12 : _config$maxCategories,
|
|
320
|
+
_config$maxLengthPerC = config.maxLengthPerChoice,
|
|
321
|
+
maxLengthPerChoice = _config$maxLengthPerC === void 0 ? 300 : _config$maxLengthPerC,
|
|
322
|
+
_config$maxLengthPerC2 = config.maxLengthPerCategory,
|
|
323
|
+
maxLengthPerCategory = _config$maxLengthPerC2 === void 0 ? 150 : _config$maxLengthPerC2;
|
|
314
324
|
var reversedChoices = (0, _toConsumableArray2["default"])(choices || []).reverse();
|
|
315
325
|
var errors = {};
|
|
316
326
|
var choicesErrors = {};
|
|
327
|
+
var categoriesErrors = {};
|
|
328
|
+
categories.forEach(function (category) {
|
|
329
|
+
var id = category.id,
|
|
330
|
+
label = category.label;
|
|
331
|
+
var parsedLabel = label.replace(/<(?:.|\n)*?>/gm, '');
|
|
332
|
+
|
|
333
|
+
if (parsedLabel.length > maxLengthPerCategory) {
|
|
334
|
+
categoriesErrors[id] = "Category labels should be no more than ".concat(maxLengthPerCategory, " characters long.");
|
|
335
|
+
}
|
|
336
|
+
});
|
|
317
337
|
reversedChoices.forEach(function (choice, index) {
|
|
318
338
|
var id = choice.id,
|
|
319
339
|
content = choice.content;
|
|
340
|
+
var parsedContent = content.replace(/<(?:.|\n)*?>/gm, '');
|
|
341
|
+
|
|
342
|
+
if (parsedContent.length > maxLengthPerChoice) {
|
|
343
|
+
choicesErrors[id] = "Tokens should be no more than ".concat(maxLengthPerChoice, " characters long.");
|
|
344
|
+
}
|
|
320
345
|
|
|
321
346
|
if (content === '' || content === '<div></div>') {
|
|
322
|
-
choicesErrors[id] = '
|
|
347
|
+
choicesErrors[id] = 'Tokens should not be empty.';
|
|
323
348
|
} else {
|
|
324
349
|
var identicalAnswer = reversedChoices.slice(index + 1).some(function (c) {
|
|
325
350
|
return c.content === content;
|
|
326
351
|
});
|
|
327
352
|
|
|
328
353
|
if (identicalAnswer) {
|
|
329
|
-
choicesErrors[id] = '
|
|
354
|
+
choicesErrors[id] = 'Tokens content should be unique.';
|
|
330
355
|
}
|
|
331
356
|
}
|
|
332
357
|
});
|
|
@@ -335,8 +360,8 @@ var validate = function validate() {
|
|
|
335
360
|
|
|
336
361
|
if (nbOfCategories > maxCategories) {
|
|
337
362
|
errors.categoriesError = "No more than ".concat(maxCategories, " categories should be defined.");
|
|
338
|
-
} else if (nbOfCategories <
|
|
339
|
-
errors.categoriesError =
|
|
363
|
+
} else if (nbOfCategories < minCategories) {
|
|
364
|
+
errors.categoriesError = "There should be at least ".concat(minCategories, " category defined.");
|
|
340
365
|
}
|
|
341
366
|
|
|
342
367
|
if (nbOfChoices < minChoices) {
|
|
@@ -363,6 +388,32 @@ var validate = function validate() {
|
|
|
363
388
|
});
|
|
364
389
|
}
|
|
365
390
|
});
|
|
391
|
+
var duplicateAlternateIndex = -1;
|
|
392
|
+
var duplicateCategory = '';
|
|
393
|
+
(correctResponse || []).forEach(function (response) {
|
|
394
|
+
var _response$choices2 = response.choices,
|
|
395
|
+
choices = _response$choices2 === void 0 ? [] : _response$choices2,
|
|
396
|
+
_response$alternateRe2 = response.alternateResponses,
|
|
397
|
+
alternateResponses = _response$alternateRe2 === void 0 ? [] : _response$alternateRe2,
|
|
398
|
+
category = response.category;
|
|
399
|
+
|
|
400
|
+
if (duplicateAlternateIndex === -1) {
|
|
401
|
+
duplicateAlternateIndex = (0, _utils.isCorrectResponseDuplicated)(choices, alternateResponses);
|
|
402
|
+
|
|
403
|
+
if (duplicateAlternateIndex === -1) {
|
|
404
|
+
duplicateAlternateIndex = (0, _utils.isAlternateDuplicated)(alternateResponses);
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
duplicateCategory = category;
|
|
408
|
+
}
|
|
409
|
+
});
|
|
410
|
+
|
|
411
|
+
if (duplicateAlternateIndex > -1) {
|
|
412
|
+
errors.duplicateAlternate = {
|
|
413
|
+
index: duplicateAlternateIndex,
|
|
414
|
+
category: duplicateCategory
|
|
415
|
+
};
|
|
416
|
+
}
|
|
366
417
|
|
|
367
418
|
if (!hasAssociations) {
|
|
368
419
|
errors.associationError = 'At least one token should be assigned to at least one category.';
|
|
@@ -373,6 +424,10 @@ var validate = function validate() {
|
|
|
373
424
|
errors.choicesErrors = choicesErrors;
|
|
374
425
|
}
|
|
375
426
|
|
|
427
|
+
if (!(0, _isEmpty["default"])(categoriesErrors)) {
|
|
428
|
+
errors.categoriesErrors = categoriesErrors;
|
|
429
|
+
}
|
|
430
|
+
|
|
376
431
|
return errors;
|
|
377
432
|
};
|
|
378
433
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.js"],"names":["getPartialScore","correctResponse","builtCategories","reduce","acc","choices","placements","length","score","filter","ch","correct","maxScore","extraPlacements","totalScore","parseFloat","toFixed","getAlternates","map","c","alternateResponses","alternate","getTotalScore","question","session","env","Object","keys","categories","answers","alternates","enabled","partialScoring","getCorrectness","Promise","resolve","mode","undefined","createDefaultModel","model","defaults","normalize","updateSession","normalizedQuestion","answerCorrectness","role","categoriesPerRow","choicesLabel","choicesPosition","feedback","feedbackEnabled","promptEnabled","prompt","removeTilesAfterPlacing","rowLabels","rationaleEnabled","rationale","note","teacherInstructionsEnabled","teacherInstructions","lockChoiceOrder","filteredCorrectResponse","response","filteredChoices","choice","fb","out","correctness","disabled","showNote","outcome","reject","Error","empty","createCorrectResponseSession","id","validate","config","minChoices","maxChoices","maxCategories","reversedChoices","reverse","errors","choicesErrors","forEach","index","content","identicalAnswer","slice","some","nbOfCategories","nbOfChoices","categoriesError","choicesError","hasAssociations","associationError"],"mappings":"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","sourcesContent":["import isEmpty from 'lodash/isEmpty';\nimport { buildState, score } from '@pie-lib/categorize';\nimport { getFeedbackForCorrectness } from '@pie-lib/feedback';\nimport {\n lockChoices,\n getShuffledChoices,\n partialScoring,\n} 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 => correctResponse\n .map((c) => c.alternateResponses)\n .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(\n categories,\n choices,\n answers,\n correctResponse\n );\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 removeTilesAfterPlacing,\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(\n answerCorrectness,\n feedback\n );\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 removeTilesAfterPlacing,\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\n ? teacherInstructions\n : 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(\n new Error('Can not call outcome when mode is not evaluate')\n );\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, maxCategories } = config;\n const reversedChoices = [ ...choices || []].reverse();\n const errors = {};\n const choicesErrors = {};\n\n reversedChoices.forEach((choice, index) => {\n const { id, content } = choice;\n\n if (content === '' || content === '<div></div>') {\n choicesErrors[id] = 'Content 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] = '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 < 1) {\n errors.categoriesError = 'There should be at least 1 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 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 return errors;\n};\n"],"file":"index.js"}
|
|
1
|
+
{"version":3,"sources":["../src/index.js"],"names":["getPartialScore","correctResponse","builtCategories","reduce","acc","choices","placements","length","score","filter","ch","correct","maxScore","extraPlacements","totalScore","parseFloat","toFixed","getAlternates","map","c","alternateResponses","alternate","getTotalScore","question","session","env","Object","keys","categories","answers","alternates","enabled","partialScoring","getCorrectness","Promise","resolve","mode","undefined","createDefaultModel","model","defaults","normalize","updateSession","normalizedQuestion","answerCorrectness","role","categoriesPerRow","choicesLabel","choicesPosition","feedback","feedbackEnabled","promptEnabled","prompt","removeTilesAfterPlacing","rowLabels","rationaleEnabled","rationale","note","teacherInstructionsEnabled","teacherInstructions","lockChoiceOrder","filteredCorrectResponse","response","filteredChoices","choice","fb","out","correctness","disabled","showNote","outcome","reject","Error","empty","createCorrectResponseSession","id","validate","config","minChoices","maxChoices","minCategories","maxCategories","maxLengthPerChoice","maxLengthPerCategory","reversedChoices","reverse","errors","choicesErrors","categoriesErrors","forEach","category","label","parsedLabel","replace","index","content","parsedContent","identicalAnswer","slice","some","nbOfCategories","nbOfChoices","categoriesError","choicesError","hasAssociations","duplicateAlternateIndex","duplicateCategory","duplicateAlternate","associationError"],"mappings":"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","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 removeTilesAfterPlacing,\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 removeTilesAfterPlacing,\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"],"file":"index.js"}
|
package/controller/lib/utils.js
CHANGED
|
@@ -3,12 +3,49 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.multiplePlacements = void 0;
|
|
6
|
+
exports.multiplePlacements = exports.isCorrectResponseDuplicated = exports.isAlternateDuplicated = void 0;
|
|
7
7
|
// used in configure too, for consistency modify it there too
|
|
8
8
|
var multiplePlacements = {
|
|
9
9
|
enabled: 'Yes',
|
|
10
10
|
disabled: 'No',
|
|
11
11
|
perChoice: 'Set Per Choice'
|
|
12
|
-
};
|
|
12
|
+
}; // used to validate the config
|
|
13
|
+
|
|
13
14
|
exports.multiplePlacements = multiplePlacements;
|
|
15
|
+
|
|
16
|
+
var isCorrectResponseDuplicated = function isCorrectResponseDuplicated(choices, alternate) {
|
|
17
|
+
var stringChoices = JSON.stringify(choices.sort());
|
|
18
|
+
var stringAlternate = alternate.filter(function (alternate) {
|
|
19
|
+
return alternate.length > 0;
|
|
20
|
+
}).map(function (alternate) {
|
|
21
|
+
return JSON.stringify(alternate.sort());
|
|
22
|
+
});
|
|
23
|
+
var foundIndexDuplicate = stringAlternate.findIndex(function (alternate) {
|
|
24
|
+
return alternate.length && alternate === stringChoices;
|
|
25
|
+
});
|
|
26
|
+
return foundIndexDuplicate;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
exports.isCorrectResponseDuplicated = isCorrectResponseDuplicated;
|
|
30
|
+
|
|
31
|
+
var isAlternateDuplicated = function isAlternateDuplicated(alternate) {
|
|
32
|
+
var elementSet = new Set();
|
|
33
|
+
var stringAlternate = alternate.filter(function (alternate) {
|
|
34
|
+
return alternate.length > 0;
|
|
35
|
+
}).map(function (alternate) {
|
|
36
|
+
return JSON.stringify(alternate.sort());
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
for (var i = 0; i < stringAlternate.length; i++) {
|
|
40
|
+
if (elementSet.has(stringAlternate[i]) && stringAlternate[i]) {
|
|
41
|
+
return i;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
elementSet.add(stringAlternate[i]);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return -1;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
exports.isAlternateDuplicated = isAlternateDuplicated;
|
|
14
51
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils.js"],"names":["multiplePlacements","enabled","disabled","perChoice"],"mappings":";;;;;;AAAA;AACO,IAAMA,kBAAkB,GAAG;AAAEC,EAAAA,OAAO,EAAE,KAAX;AAAkBC,EAAAA,QAAQ,EAAE,IAA5B;AAAkCC,EAAAA,SAAS,EAAE;AAA7C,CAA3B","sourcesContent":["// used in configure too, for consistency modify it there too\nexport const multiplePlacements = { enabled: 'Yes', disabled: 'No', perChoice: 'Set Per Choice' };\n"],"file":"utils.js"}
|
|
1
|
+
{"version":3,"sources":["../src/utils.js"],"names":["multiplePlacements","enabled","disabled","perChoice","isCorrectResponseDuplicated","choices","alternate","stringChoices","JSON","stringify","sort","stringAlternate","filter","length","map","foundIndexDuplicate","findIndex","isAlternateDuplicated","elementSet","Set","i","has","add"],"mappings":";;;;;;AAAA;AACO,IAAMA,kBAAkB,GAAG;AAAEC,EAAAA,OAAO,EAAE,KAAX;AAAkBC,EAAAA,QAAQ,EAAE,IAA5B;AAAkCC,EAAAA,SAAS,EAAE;AAA7C,CAA3B,C,CAEP;;;;AACO,IAAMC,2BAA2B,GAAG,SAA9BA,2BAA8B,CAACC,OAAD,EAASC,SAAT,EAAuB;AAC9D,MAAMC,aAAa,GAAIC,IAAI,CAACC,SAAL,CAAeJ,OAAO,CAACK,IAAR,EAAf,CAAvB;AACA,MAAMC,eAAe,GAAGL,SAAS,CAACM,MAAV,CAAiB,UAAAN,SAAS;AAAA,WAAIA,SAAS,CAACO,MAAV,GAAmB,CAAvB;AAAA,GAA1B,EAAoDC,GAApD,CAAwD,UAACR,SAAD;AAAA,WAAeE,IAAI,CAACC,SAAL,CAAeH,SAAS,CAACI,IAAV,EAAf,CAAf;AAAA,GAAxD,CAAxB;AACA,MAAMK,mBAAmB,GAAGJ,eAAe,CAACK,SAAhB,CAA0B,UAAAV,SAAS;AAAA,WAAIA,SAAS,CAACO,MAAV,IAAqBP,SAAS,KAAKC,aAAvC;AAAA,GAAnC,CAA5B;AACA,SAAOQ,mBAAP;AACH,CALM;;;;AAOA,IAAME,qBAAqB,GAAG,SAAxBA,qBAAwB,CAACX,SAAD,EAAe;AAChD,MAAMY,UAAU,GAAG,IAAIC,GAAJ,EAAnB;AACA,MAAMR,eAAe,GAAGL,SAAS,CAACM,MAAV,CAAiB,UAAAN,SAAS;AAAA,WAAEA,SAAS,CAACO,MAAV,GAAmB,CAArB;AAAA,GAA1B,EAAkDC,GAAlD,CAAsD,UAACR,SAAD;AAAA,WAAeE,IAAI,CAACC,SAAL,CAAeH,SAAS,CAACI,IAAV,EAAf,CAAf;AAAA,GAAtD,CAAxB;;AACA,OAAK,IAAIU,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGT,eAAe,CAACE,MAApC,EAA4CO,CAAC,EAA7C,EAAiD;AAC7C,QAAIF,UAAU,CAACG,GAAX,CAAeV,eAAe,CAACS,CAAD,CAA9B,KAAsCT,eAAe,CAACS,CAAD,CAAzD,EAA8D;AAC1D,aAAOA,CAAP;AACH;;AACDF,IAAAA,UAAU,CAACI,GAAX,CAAeX,eAAe,CAACS,CAAD,CAA9B;AACH;;AAED,SAAO,CAAC,CAAR;AACH,CAXM","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 const stringChoices = JSON.stringify(choices.sort());\n const stringAlternate = alternate.filter(alternate => alternate.length > 0).map((alternate) => JSON.stringify(alternate.sort()));\n const foundIndexDuplicate = stringAlternate.findIndex(alternate => alternate.length && alternate === stringChoices);\n return foundIndexDuplicate;\n};\n\nexport const isAlternateDuplicated = (alternate) => {\n const elementSet = new Set();\n const stringAlternate = alternate.filter(alternate=>alternate.length > 0).map((alternate) => JSON.stringify(alternate.sort()));\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"],"file":"utils.js"}
|
package/docs/config-schema.json
CHANGED
|
@@ -109,11 +109,32 @@
|
|
|
109
109
|
"type": "number",
|
|
110
110
|
"title": "maxChoices"
|
|
111
111
|
},
|
|
112
|
+
"choicesPosition": {
|
|
113
|
+
"title": "ConfigureProp",
|
|
114
|
+
"type": "object",
|
|
115
|
+
"properties": {
|
|
116
|
+
"settings": {
|
|
117
|
+
"description": "Indicates if the item has to be displayed in the Settings Panel",
|
|
118
|
+
"type": "boolean",
|
|
119
|
+
"title": "settings"
|
|
120
|
+
},
|
|
121
|
+
"label": {
|
|
122
|
+
"description": "Indicates the label for the item that has to be displayed in the Settings Panel",
|
|
123
|
+
"type": "string",
|
|
124
|
+
"title": "label"
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
},
|
|
112
128
|
"maxCategories": {
|
|
113
129
|
"description": "Maximum number of categories",
|
|
114
130
|
"type": "number",
|
|
115
131
|
"title": "maxCategories"
|
|
116
132
|
},
|
|
133
|
+
"minCategoriesPerRow": {
|
|
134
|
+
"description": "Minimum value of categories per row",
|
|
135
|
+
"type": "number",
|
|
136
|
+
"title": "minCategoriesPerRow"
|
|
137
|
+
},
|
|
117
138
|
"maxImageWidth": {
|
|
118
139
|
"title": "ConfigureMaxImageDimensionsProp",
|
|
119
140
|
"type": "object",
|
|
@@ -82,10 +82,26 @@ Minimum number of choices
|
|
|
82
82
|
|
|
83
83
|
Maximum number of choices
|
|
84
84
|
|
|
85
|
+
# `choicesPosition` (object)
|
|
86
|
+
|
|
87
|
+
Properties of the `choicesPosition` object:
|
|
88
|
+
|
|
89
|
+
## `settings` (boolean)
|
|
90
|
+
|
|
91
|
+
Indicates if the item has to be displayed in the Settings Panel
|
|
92
|
+
|
|
93
|
+
## `label` (string)
|
|
94
|
+
|
|
95
|
+
Indicates the label for the item that has to be displayed in the Settings Panel
|
|
96
|
+
|
|
85
97
|
# `maxCategories` (number)
|
|
86
98
|
|
|
87
99
|
Maximum number of categories
|
|
88
100
|
|
|
101
|
+
# `minCategoriesPerRow` (number)
|
|
102
|
+
|
|
103
|
+
Minimum value of categories per row
|
|
104
|
+
|
|
89
105
|
# `maxImageWidth` (object)
|
|
90
106
|
|
|
91
107
|
Properties of the `maxImageWidth` object:
|
|
@@ -216,4 +232,4 @@ Indicates the max dimension for images in row labels
|
|
|
216
232
|
|
|
217
233
|
### `categoryLabel` (number)
|
|
218
234
|
|
|
219
|
-
Indicates the max dimension for images in category labels
|
|
235
|
+
Indicates the max dimension for images in category labels
|
package/docs/demo/config.js
CHANGED
package/docs/demo/generate.js
CHANGED
|
@@ -36,8 +36,7 @@ const E234 = {
|
|
|
36
36
|
categoriesPerRow: 2,
|
|
37
37
|
rationale:
|
|
38
38
|
'<p>Traditional equipment must be carried on board or shipped from Earth. 3D-printed equipment can be built on demand or rebuilt if it gets lost or broken.</p>',
|
|
39
|
-
prompt:
|
|
40
|
-
'<p>Drag <span class="relative-emphasis">two</span> phrases into each of the categories.</p>',
|
|
39
|
+
prompt: '<p>Drag <span class="relative-emphasis">two</span> phrases into each of the categories.</p>',
|
|
41
40
|
partialScoring: true,
|
|
42
41
|
correctResponse: [
|
|
43
42
|
{
|
|
@@ -339,5 +338,5 @@ exports.model = (id, element) => ({
|
|
|
339
338
|
teacherInstructionsEnabled: true,
|
|
340
339
|
studentInstructionsEnabled: true,
|
|
341
340
|
toolbarEditorPosition: 'bottom',
|
|
342
|
-
rubricEnabled: false
|
|
341
|
+
rubricEnabled: false,
|
|
343
342
|
});
|
package/docs/demo/index.html
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
<categorize-element pie-id="1"></categorize-element>
|
|
1
|
+
<categorize-element pie-id="1"></categorize-element>
|
package/docs/pie-schema.json.md
CHANGED
|
@@ -96,7 +96,11 @@ var Categories = /*#__PURE__*/function (_React$Component) {
|
|
|
96
96
|
})));
|
|
97
97
|
}); // if the last row has less categories than max on a row, fill the spaces with divs
|
|
98
98
|
|
|
99
|
-
items = items.concat(Array(categoriesPerRow - cat.length).fill( /*#__PURE__*/_react["default"].createElement("div", null))
|
|
99
|
+
items = items.concat(Array(categoriesPerRow - cat.length).fill( /*#__PURE__*/_react["default"].createElement("div", null)).map(function (value, index) {
|
|
100
|
+
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
101
|
+
key: "fill-space-".concat(index)
|
|
102
|
+
});
|
|
103
|
+
})); // for each inner array of categories, create a row with category containers
|
|
100
104
|
|
|
101
105
|
cat.forEach(function (c, columnIndex) {
|
|
102
106
|
items.push( /*#__PURE__*/_react["default"].createElement(_category["default"], (0, _extends2["default"])({
|
|
@@ -110,7 +114,11 @@ var Categories = /*#__PURE__*/function (_React$Component) {
|
|
|
110
114
|
}, c)));
|
|
111
115
|
}); // if the last row has less categories than max on a row, fill the spaces with divs
|
|
112
116
|
|
|
113
|
-
items = items.concat(Array(categoriesPerRow - cat.length).fill( /*#__PURE__*/_react["default"].createElement("div", null)))
|
|
117
|
+
items = items.concat(Array(categoriesPerRow - cat.length).fill( /*#__PURE__*/_react["default"].createElement("div", null)).map(function (value, index) {
|
|
118
|
+
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
119
|
+
key: "fill-space-final-".concat(index)
|
|
120
|
+
});
|
|
121
|
+
}));
|
|
114
122
|
return items;
|
|
115
123
|
}));
|
|
116
124
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/categorize/categories.jsx"],"names":["Categories","props","classes","categories","model","disabled","onDropChoice","onRemoveChoice","categoriesPerRow","chunkedCategories","Math","ceil","length","map","cat","rowIndex","items","forEach","c","columnIndex","push","label","__html","concat","Array","fill","h","id","category","React","Component","PropTypes","object","isRequired","arrayOf","shape","CategoryType","number","bool","func","styles","theme","flex","color","text","backgroundColor","background","fontSize","typography","textAlign","paddingTop","spacing","unit"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AAEA;;AAEA;;AACA;;;;;;;;;;IAIaA,U;;;;;;;;;;;;WAkBX,kBAAS;AACP,
|
|
1
|
+
{"version":3,"sources":["../../src/categorize/categories.jsx"],"names":["Categories","props","classes","categories","model","disabled","onDropChoice","onRemoveChoice","categoriesPerRow","chunkedCategories","Math","ceil","length","map","cat","rowIndex","items","forEach","c","columnIndex","push","label","__html","concat","Array","fill","value","index","h","id","category","React","Component","PropTypes","object","isRequired","arrayOf","shape","CategoryType","number","bool","func","styles","theme","flex","color","text","backgroundColor","background","fontSize","typography","textAlign","paddingTop","spacing","unit"],"mappings":"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","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 },\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"],"file":"categories.js"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/categorize/category.jsx"],"names":["CategoryType","id","PropTypes","string","isRequired","categoryId","Category","props","classes","className","choices","disabled","onDropChoice","onRemoveChoice","correct","names","category","placeholderNames","placeholder","incorrect","map","c","index","React","Component","bool","object","func","styles","theme","border","color","minHeight","padding","spacing","unit","borderRadius","gridColumnGap","gridRowGap","display","flexWrap","justifyContent","alignItems","alignContent","flexDirection"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;;;;;AAEO,IAAMA,YAAY,GAAG;AAC1BC,EAAAA,EAAE,EAAEC,sBAAUC,MAAV,CAAiBC,UADK;AAE1BC,EAAAA,UAAU,EAAEH,sBAAUC;AAFI,CAArB;;;IAKMG,Q;;;;;;;;;;;;WAYX,kBAAS;AACP,
|
|
1
|
+
{"version":3,"sources":["../../src/categorize/category.jsx"],"names":["CategoryType","id","PropTypes","string","isRequired","categoryId","Category","props","classes","className","choices","disabled","onDropChoice","onRemoveChoice","correct","names","category","placeholderNames","placeholder","incorrect","map","c","index","React","Component","bool","object","func","styles","theme","border","color","minHeight","padding","spacing","unit","borderRadius","gridColumnGap","gridRowGap","display","flexWrap","justifyContent","alignItems","alignContent","flexDirection"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;;;;;AAEO,IAAMA,YAAY,GAAG;AAC1BC,EAAAA,EAAE,EAAEC,sBAAUC,MAAV,CAAiBC,UADK;AAE1BC,EAAAA,UAAU,EAAEH,sBAAUC;AAFI,CAArB;;;IAKMG,Q;;;;;;;;;;;;WAYX,kBAAS;AACP,wBAAkG,KAAKC,KAAvG;AAAA,UAAQC,OAAR,eAAQA,OAAR;AAAA,UAAiBC,SAAjB,eAAiBA,SAAjB;AAAA,4CAA4BC,OAA5B;AAAA,UAA4BA,OAA5B,oCAAsC,EAAtC;AAAA,UAA0CC,QAA1C,eAA0CA,QAA1C;AAAA,UAAoDC,YAApD,eAAoDA,YAApD;AAAA,UAAkEC,cAAlE,eAAkEA,cAAlE;AAAA,UAAkFZ,EAAlF,eAAkFA,EAAlF;AAAA,UAAsFa,OAAtF,eAAsFA,OAAtF;AAEA,UAAMC,KAAK,GAAG,4BAAWP,OAAO,CAACQ,QAAnB,EAA6BP,SAA7B,CAAd;AACA,UAAMQ,gBAAgB,GAAG,4BAAWT,OAAO,CAACU,WAAnB,EAAgCJ,OAAO,KAAK,KAAZ,IAAqBN,OAAO,CAACW,SAA7D,CAAzB;AAEA,0BACE;AAAK,QAAA,SAAS,EAAEJ;AAAhB,sBACE,gCAAC,gCAAD;AAAa,QAAA,YAAY,EAAEH,YAA3B;AAAyC,QAAA,QAAQ,EAAED,QAAnD;AAA6D,QAAA,SAAS,EAAEM;AAAxE,SACGP,OAAO,CAACU,GAAR,CAAY,UAACC,CAAD,EAAIC,KAAJ;AAAA,4BACX,gCAAC,kBAAD;AACE,UAAA,cAAc,EAAET,cADlB;AAEE,UAAA,QAAQ,EAAEF,QAFZ;AAGE,UAAA,GAAG,EAAEW,KAHP;AAIE,UAAA,WAAW,EAAEA,KAJf;AAKE,UAAA,UAAU,EAAErB;AALd,WAMMoB,CANN,EADW;AAAA,OAAZ,CADH,CADF,CADF;AAgBD;;;EAlC2BE,kBAAMC,S;;;iCAAvBlB,Q,+CAENN,Y;AACHS,EAAAA,SAAS,EAAEP,sBAAUC,M;AACrBQ,EAAAA,QAAQ,EAAET,sBAAUuB,I;AACpBjB,EAAAA,OAAO,EAAEN,sBAAUwB,MAAV,CAAiBtB,U;AAC1BQ,EAAAA,YAAY,EAAEV,sBAAUyB,I;AACxBd,EAAAA,cAAc,EAAEX,sBAAUyB;;iCAPjBrB,Q,kBAUW,E;;AA2BxB,IAAMsB,MAAM,GAAG,SAATA,MAAS,CAACC,KAAD;AAAA,SAAY;AACzBV,IAAAA,SAAS,EAAE;AACTW,MAAAA,MAAM,sBAAeC,gBAAMZ,SAAN,EAAf;AADG,KADc;AAIzBD,IAAAA,WAAW,EAAE;AACXc,MAAAA,SAAS,EAAE,MADA;AAEXC,MAAAA,OAAO,EAAEJ,KAAK,CAACK,OAAN,CAAcC,IAAd,GAAqB,CAFnB;AAGXC,MAAAA,YAAY,EAAEP,KAAK,CAACK,OAAN,CAAcC,IAAd,GAAqB,CAHxB;AAIXE,MAAAA,aAAa,EAAE,CAJJ;AAKXC,MAAAA,UAAU,EAAE,CALD;AAMXC,MAAAA,OAAO,EAAE,MANE;AAOXC,MAAAA,QAAQ,EAAE,MAPC;AAQXC,MAAAA,cAAc,EAAE,QARL;AASXC,MAAAA,UAAU,EAAE,QATD;AAUXC,MAAAA,YAAY,EAAE;AAVH,KAJY;AAgBzB3B,IAAAA,QAAQ,EAAE;AACRuB,MAAAA,OAAO,EAAE,MADD;AAERK,MAAAA,aAAa,EAAE;AAFP;AAhBe,GAAZ;AAAA,CAAf;;eAsBe,wBAAWhB,MAAX,EAAmBtB,QAAnB,C","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport classNames from 'classnames';\nimport Choice from './choice';\nimport PlaceHolder from './droppable-placeholder';\nimport { color } from '@pie-lib/render-ui';\n\nexport const CategoryType = {\n id: PropTypes.string.isRequired,\n categoryId: PropTypes.string,\n};\n\nexport class Category extends React.Component {\n static propTypes = {\n ...CategoryType,\n className: PropTypes.string,\n disabled: PropTypes.bool,\n classes: PropTypes.object.isRequired,\n onDropChoice: PropTypes.func,\n onRemoveChoice: PropTypes.func,\n };\n\n static defaultProps = {};\n\n render() {\n const { classes, className, choices = [], disabled, onDropChoice, onRemoveChoice, id, correct } = this.props;\n\n const names = classNames(classes.category, className);\n const placeholderNames = classNames(classes.placeholder, correct === false && classes.incorrect);\n\n return (\n <div className={names}>\n <PlaceHolder onDropChoice={onDropChoice} disabled={disabled} className={placeholderNames}>\n {choices.map((c, index) => (\n <Choice\n onRemoveChoice={onRemoveChoice}\n disabled={disabled}\n key={index}\n choiceIndex={index}\n categoryId={id}\n {...c}\n />\n ))}\n </PlaceHolder>\n </div>\n );\n }\n}\n\nconst styles = (theme) => ({\n incorrect: {\n border: `solid 2px ${color.incorrect()}`,\n },\n placeholder: {\n minHeight: '80px',\n padding: theme.spacing.unit / 2,\n borderRadius: theme.spacing.unit / 2,\n gridColumnGap: 0,\n gridRowGap: 0,\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'center',\n alignItems: 'center',\n alignContent: 'flex-start',\n },\n category: {\n display: 'flex',\n flexDirection: 'column',\n },\n});\n\nexport default withStyles(styles)(Category);\n"],"file":"category.js"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/categorize/choice.jsx"],"names":["log","ChoiceType","content","PropTypes","string","isRequired","id","Layout","props","classes","className","isDragging","disabled","correct","rootNames","choice","dragging","cardNames","card","root","cardRoot","__html","React","Component","object","bool","styles","theme","direction","cursor","width","border","color","incorrect","borderRadius","text","backgroundColor","background","fontSize","typography","paddingBottom","spacing","unit","opacity","Styled","Choice","connectDragSource","extraStyle","margin","func","spec","canDrag","beginDrag","out","categoryId","choiceIndex","endDrag","monitor","didDrop","item","getItem","onRemoveChoice","DraggableChoice","uid","connect","dragSource","withUid"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;;;;;AAEA,IAAMA,GAAG,GAAG,uBAAM,2BAAN,CAAZ;AAEO,IAAMC,UAAU,GAAG;AACxBC,EAAAA,OAAO,EAAEC,sBAAUC,MAAV,CAAiBC,UADF;AAExBC,EAAAA,EAAE,EAAEH,sBAAUC;AAFU,CAAnB;;;IAKMG,M;;;;;;;;;;;;WASX,kBAAS;AACP,
|
|
1
|
+
{"version":3,"sources":["../../src/categorize/choice.jsx"],"names":["log","ChoiceType","content","PropTypes","string","isRequired","id","Layout","props","classes","className","isDragging","disabled","correct","rootNames","choice","dragging","cardNames","card","root","cardRoot","__html","React","Component","object","bool","styles","theme","direction","cursor","width","border","color","incorrect","borderRadius","text","backgroundColor","background","fontSize","typography","paddingBottom","spacing","unit","opacity","Styled","Choice","connectDragSource","extraStyle","margin","func","spec","canDrag","beginDrag","out","categoryId","choiceIndex","endDrag","monitor","didDrop","item","getItem","onRemoveChoice","DraggableChoice","uid","connect","dragSource","withUid"],"mappings":"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","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport classNames from 'classnames';\nimport { DragSource } from 'react-dnd';\nimport { uid } from '@pie-lib/drag';\nimport Card from '@material-ui/core/Card';\nimport CardContent from '@material-ui/core/CardContent';\nimport { color } from '@pie-lib/render-ui';\nimport debug from 'debug';\n\nconst log = debug('@pie-ui:categorize:choice');\n\nexport const ChoiceType = {\n content: PropTypes.string.isRequired,\n id: PropTypes.string,\n};\n\nexport class Layout extends React.Component {\n static propTypes = {\n ...ChoiceType,\n classes: PropTypes.object.isRequired,\n className: PropTypes.string,\n disabled: PropTypes.bool,\n correct: PropTypes.bool,\n };\n static defaultProps = {};\n render() {\n const { classes, className, content, isDragging, disabled, correct } = this.props;\n\n const rootNames = classNames(\n correct === true && 'correct',\n correct === false && 'incorrect',\n classes.choice,\n isDragging && classes.dragging,\n disabled && classes.disabled,\n className,\n );\n const cardNames = classNames(classes.card);\n return (\n <div className={rootNames}>\n <Card className={cardNames}>\n <CardContent classes={{ root: classes.cardRoot }} dangerouslySetInnerHTML={{ __html: content }} />\n </Card>\n </div>\n );\n }\n}\n\nconst styles = (theme) => ({\n choice: {\n direction: 'initial',\n cursor: 'pointer',\n width: '100%',\n '&.correct': {\n border: `solid 2px ${color.correct()}`,\n },\n '&.incorrect': {\n border: `solid 2px ${color.incorrect()}`,\n },\n borderRadius: '6px',\n },\n cardRoot: {\n color: color.text(),\n backgroundColor: color.background(),\n fontSize: theme.typography.fontSize + 2,\n '&:last-child': {\n paddingBottom: theme.spacing.unit * 2,\n },\n borderRadius: '4px',\n border: '1px solid',\n },\n disabled: {\n cursor: 'not-allowed',\n opacity: '0.6',\n },\n dragging: {\n cursor: 'move',\n },\n card: {\n color: color.text(),\n backgroundColor: color.background(),\n width: '100%',\n },\n});\n\nconst Styled = withStyles(styles)(Layout);\n\nexport class Choice extends React.Component {\n static propTypes = {\n ...ChoiceType,\n extraStyle: PropTypes.object,\n connectDragSource: PropTypes.func.isRequired,\n };\n\n render() {\n const { connectDragSource, id, content, disabled, isDragging, correct, extraStyle } = this.props;\n\n return connectDragSource(\n <div style={{ margin: '4px', ...extraStyle }}>\n <Styled id={id} content={content} disabled={disabled} correct={correct} isDragging={isDragging} />\n </div>,\n );\n }\n}\n\nexport const spec = {\n canDrag: (props) => !props.disabled,\n beginDrag: (props) => {\n const out = {\n id: props.id,\n categoryId: props.categoryId,\n choiceIndex: props.choiceIndex,\n };\n log('[beginDrag] out:', out);\n return out;\n },\n endDrag: (props, monitor) => {\n if (!monitor.didDrop()) {\n const item = monitor.getItem();\n if (item.categoryId) {\n log('wasnt droppped - what to do?');\n props.onRemoveChoice(item);\n }\n }\n },\n};\n\nconst DraggableChoice = DragSource(\n ({ uid }) => uid,\n spec,\n (connect, monitor) => ({\n connectDragSource: connect.dragSource(),\n isDragging: monitor.isDragging(),\n }),\n)(Choice);\n\nexport default uid.withUid(DraggableChoice);\n"],"file":"choice.js"}
|
|
@@ -37,6 +37,8 @@ var _styles = require("@material-ui/core/styles");
|
|
|
37
37
|
|
|
38
38
|
var _choice = _interopRequireWildcard(require("./choice"));
|
|
39
39
|
|
|
40
|
+
var _droppablePlaceholder = _interopRequireDefault(require("./droppable-placeholder"));
|
|
41
|
+
|
|
40
42
|
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); }
|
|
41
43
|
|
|
42
44
|
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; }
|
|
@@ -68,6 +70,8 @@ var Choices = /*#__PURE__*/function (_React$Component) {
|
|
|
68
70
|
choices = _this$props$choices === void 0 ? [] : _this$props$choices,
|
|
69
71
|
model = _this$props.model,
|
|
70
72
|
disabled = _this$props.disabled,
|
|
73
|
+
onDropChoice = _this$props.onDropChoice,
|
|
74
|
+
onRemoveChoice = _this$props.onRemoveChoice,
|
|
71
75
|
choicePosition = _this$props.choicePosition;
|
|
72
76
|
var style = {
|
|
73
77
|
textAlign: 'center'
|
|
@@ -79,15 +83,20 @@ var Choices = /*#__PURE__*/function (_React$Component) {
|
|
|
79
83
|
|
|
80
84
|
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
81
85
|
className: classes.wrapper
|
|
86
|
+
}, /*#__PURE__*/_react["default"].createElement(_droppablePlaceholder["default"], {
|
|
87
|
+
onDropChoice: onDropChoice,
|
|
88
|
+
onRemoveChoice: onRemoveChoice,
|
|
89
|
+
disabled: disabled,
|
|
90
|
+
style: {
|
|
91
|
+
background: 'none'
|
|
92
|
+
},
|
|
93
|
+
choiceBoard: true
|
|
82
94
|
}, model.choicesLabel && model.choicesLabel !== '' && /*#__PURE__*/_react["default"].createElement("div", {
|
|
83
95
|
className: classes.labelHolder,
|
|
84
96
|
dangerouslySetInnerHTML: {
|
|
85
97
|
__html: model.choicesLabel
|
|
86
98
|
}
|
|
87
|
-
}),
|
|
88
|
-
className: classes.choices,
|
|
89
|
-
style: style
|
|
90
|
-
}, choices.map(function (c, index) {
|
|
99
|
+
}), choices.map(function (c, index) {
|
|
91
100
|
return c.empty ? /*#__PURE__*/_react["default"].createElement(Blank, {
|
|
92
101
|
key: index
|
|
93
102
|
}) : /*#__PURE__*/_react["default"].createElement(_choice["default"], (0, _extends2["default"])({
|
|
@@ -128,14 +137,14 @@ var styles = function styles(theme) {
|
|
|
128
137
|
return {
|
|
129
138
|
wrapper: {
|
|
130
139
|
flex: 1,
|
|
131
|
-
padding: theme.spacing.unit
|
|
140
|
+
padding: theme.spacing.unit,
|
|
141
|
+
touchAction: 'none'
|
|
132
142
|
},
|
|
133
143
|
choices: {
|
|
134
144
|
padding: theme.spacing.unit / 2,
|
|
135
145
|
display: 'flex',
|
|
136
146
|
justifyContent: 'center',
|
|
137
|
-
alignItems: 'center'
|
|
138
|
-
flexWrap: 'wrap'
|
|
147
|
+
alignItems: 'center'
|
|
139
148
|
},
|
|
140
149
|
labelHolder: {
|
|
141
150
|
margin: '0 auto',
|