@pie-element/image-cloze-association 6.13.3 → 6.13.4-next.86
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/root.js +3 -3
- package/configure/lib/root.js.map +1 -1
- package/configure/package.json +2 -1
- package/configure/src/__tests__/index.test.js +1 -1
- package/configure/src/root.jsx +2 -2
- package/controller/lib/index.js +1 -1
- package/controller/lib/index.js.map +1 -1
- package/controller/package.json +1 -1
- package/controller/src/index.js +1 -1
- package/lib/evaluation-icon.js +1 -1
- package/lib/evaluation-icon.js.map +1 -1
- package/lib/image-drop-target.js +2 -2
- package/lib/image-drop-target.js.map +1 -1
- package/lib/index.js +2 -2
- package/lib/index.js.map +1 -1
- package/lib/interactive-section.js +1 -1
- package/lib/interactive-section.js.map +1 -1
- package/lib/possible-response.js +2 -2
- package/lib/possible-response.js.map +1 -1
- package/lib/possible-responses.js +2 -2
- package/lib/possible-responses.js.map +1 -1
- package/lib/root.js +5 -5
- package/lib/root.js.map +1 -1
- package/package.json +7 -3
- package/src/__tests__/index.test.js +1 -1
- package/src/evaluation-icon.jsx +1 -1
- package/src/image-drop-target.jsx +40 -38
- package/src/index.js +3 -3
- package/src/interactive-section.jsx +1 -1
- package/src/possible-response.jsx +9 -11
- package/src/possible-responses.jsx +27 -27
- package/src/root.jsx +24 -23
package/configure/lib/root.js
CHANGED
|
@@ -25,9 +25,9 @@ var _react = _interopRequireDefault(require("react"));
|
|
|
25
25
|
|
|
26
26
|
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
27
27
|
|
|
28
|
-
var _configUi = require("@pie-lib/
|
|
28
|
+
var _configUi = require("@pie-lib/config-ui");
|
|
29
29
|
|
|
30
|
-
var _editableHtml = require("@pie-lib/
|
|
30
|
+
var _editableHtml = _interopRequireDefault(require("@pie-lib/editable-html"));
|
|
31
31
|
|
|
32
32
|
var _styles = require("@material-ui/core/styles");
|
|
33
33
|
|
|
@@ -141,7 +141,7 @@ var Root = /*#__PURE__*/function (_React$Component) {
|
|
|
141
141
|
}, model && model.teacherInstructionsEnabled && /*#__PURE__*/_react["default"].createElement(_configUi.InputContainer, {
|
|
142
142
|
label: teacherInstructions.label,
|
|
143
143
|
className: classes.promptHolder
|
|
144
|
-
}, /*#__PURE__*/_react["default"].createElement(_editableHtml
|
|
144
|
+
}, /*#__PURE__*/_react["default"].createElement(_editableHtml["default"], {
|
|
145
145
|
className: classes.prompt,
|
|
146
146
|
markup: model.teacherInstructions || '',
|
|
147
147
|
onChange: this.onTeacherInstructionsChanged,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/root.jsx"],"names":["Panel","settings","toggle","dropdown","Root","teacherInstructions","props","onModelChanged","model","classes","configuration","onConfigurationChanged","imageSupport","uploadSoundSupport","baseInputConfiguration","contentDimensions","maxImageWidth","maxImageHeight","settingsPanelDisabled","spellCheck","withRubric","mathMlOptions","language","languageChoices","errors","extraCSSRules","spellCheckEnabled","teacherInstructionsError","panelProperties","teacherInstructionsEnabled","label","rubricEnabled","enabled","options","getPluginProps","config","Properties","promptHolder","prompt","onTeacherInstructionsChanged","inputConfiguration","errorText","React","Component","styles","theme","width","paddingTop","spacing","unit","marginBottom","fontSize","typography","color","palette","error","main","propTypes","PropTypes","object","isRequired","func","shape","add"],"mappings":"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
|
|
1
|
+
{"version":3,"sources":["../src/root.jsx"],"names":["Panel","settings","toggle","dropdown","Root","teacherInstructions","props","onModelChanged","model","classes","configuration","onConfigurationChanged","imageSupport","uploadSoundSupport","baseInputConfiguration","contentDimensions","maxImageWidth","maxImageHeight","settingsPanelDisabled","spellCheck","withRubric","mathMlOptions","language","languageChoices","errors","extraCSSRules","spellCheckEnabled","teacherInstructionsError","panelProperties","teacherInstructionsEnabled","label","rubricEnabled","enabled","options","getPluginProps","config","Properties","promptHolder","prompt","onTeacherInstructionsChanged","inputConfiguration","errorText","React","Component","styles","theme","width","paddingTop","spacing","unit","marginBottom","fontSize","typography","color","palette","error","main","propTypes","PropTypes","object","isRequired","func","shape","add"],"mappings":"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","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { settings, layout, InputContainer } from '@pie-lib/config-ui';\nimport EditableHtml from '@pie-lib/editable-html';\nimport { withStyles } from '@material-ui/core/styles';\n\nconst { Panel, toggle, dropdown } = settings;\n\nexport class Root extends React.Component {\n onTeacherInstructionsChanged = (teacherInstructions) => {\n this.props.onModelChanged({ ...this.props.model, teacherInstructions });\n };\n\n render() {\n const { classes, model, configuration, onModelChanged, onConfigurationChanged, imageSupport, uploadSoundSupport } =\n this.props;\n const {\n baseInputConfiguration = {},\n contentDimensions = {},\n maxImageWidth = {},\n maxImageHeight = {},\n settingsPanelDisabled,\n spellCheck = {},\n teacherInstructions = {},\n withRubric = {},\n mathMlOptions = {},\n language = {},\n languageChoices = {},\n } = configuration || {};\n const { errors = {}, extraCSSRules, spellCheckEnabled } = model || {};\n const { teacherInstructions: teacherInstructionsError } = errors;\n\n const panelProperties = {\n teacherInstructionsEnabled: teacherInstructions.settings && toggle(teacherInstructions.label),\n spellCheckEnabled: spellCheck.settings && toggle(spellCheck.label),\n rubricEnabled: withRubric?.settings && toggle(withRubric?.label),\n 'language.enabled': language.settings && toggle(language.label, true),\n language: language.settings && language.enabled && dropdown(languageChoices.label, languageChoices.options),\n };\n\n const getPluginProps = (props = {}) => ({\n ...baseInputConfiguration,\n ...props,\n });\n\n return (\n <layout.ConfigLayout\n extraCSSRules={extraCSSRules}\n dimensions={contentDimensions}\n hideSettings={settingsPanelDisabled}\n settings={\n <Panel\n model={model}\n configuration={configuration}\n onChangeModel={(model) => onModelChanged(model)}\n onChangeConfiguration={(config) => onConfigurationChanged(config)}\n groups={{\n Properties: panelProperties,\n }}\n />\n }\n >\n {model && model.teacherInstructionsEnabled && (\n <InputContainer label={teacherInstructions.label} className={classes.promptHolder}>\n <EditableHtml\n className={classes.prompt}\n markup={model.teacherInstructions || ''}\n onChange={this.onTeacherInstructionsChanged}\n imageSupport={imageSupport}\n nonEmpty={false}\n error={teacherInstructionsError}\n spellCheck={spellCheckEnabled}\n pluginProps={getPluginProps(teacherInstructions?.inputConfiguration)}\n maxImageWidth={maxImageWidth && maxImageWidth.teacherInstructions}\n maxImageHeight={maxImageHeight && maxImageHeight.teacherInstructions}\n uploadSoundSupport={uploadSoundSupport}\n languageCharactersProps={[{ language: 'spanish' }, { language: 'special' }]}\n mathMlOptions={mathMlOptions}\n />\n {teacherInstructionsError && <div className={classes.errorText}>{teacherInstructionsError}</div>}\n </InputContainer>\n )}\n\n <div>Image cloze association</div>\n </layout.ConfigLayout>\n );\n }\n}\n\nconst styles = (theme) => ({\n promptHolder: {\n width: '100%',\n paddingTop: theme.spacing.unit * 2,\n marginBottom: theme.spacing.unit * 2,\n },\n errorText: {\n fontSize: theme.typography.fontSize - 2,\n color: theme.palette.error.main,\n paddingTop: theme.spacing.unit,\n },\n});\n\nRoot.propTypes = {\n classes: PropTypes.object.isRequired,\n onModelChanged: PropTypes.func,\n onConfigurationChanged: PropTypes.func,\n model: PropTypes.object.isRequired,\n configuration: PropTypes.object.isRequired,\n imageSupport: PropTypes.shape({\n add: PropTypes.func.isRequired,\n delete: PropTypes.func.isRequired,\n }),\n uploadSoundSupport: PropTypes.shape({\n add: PropTypes.func.isRequired,\n delete: PropTypes.func.isRequired,\n }),\n};\n\nexport default withStyles(styles)(Root);\n"],"file":"root.js"}
|
package/configure/package.json
CHANGED
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
"dependencies": {
|
|
10
10
|
"@material-ui/core": "^3.9.2",
|
|
11
11
|
"@pie-framework/pie-configure-events": "^1.3.0",
|
|
12
|
-
"@pie-lib/
|
|
12
|
+
"@pie-lib/config-ui": "^11.24.0",
|
|
13
|
+
"@pie-lib/editable-html": "^11.16.0",
|
|
13
14
|
"debug": "^3.1.0",
|
|
14
15
|
"prop-types": "^15.7.2",
|
|
15
16
|
"react": "^16.8.6",
|
package/configure/src/root.jsx
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import PropTypes from 'prop-types';
|
|
3
|
-
import { settings, layout, InputContainer } from '@pie-lib/
|
|
4
|
-
import
|
|
3
|
+
import { settings, layout, InputContainer } from '@pie-lib/config-ui';
|
|
4
|
+
import EditableHtml from '@pie-lib/editable-html';
|
|
5
5
|
import { withStyles } from '@material-ui/core/styles';
|
|
6
6
|
|
|
7
7
|
const { Panel, toggle, dropdown } = settings;
|
package/controller/lib/index.js
CHANGED
|
@@ -13,7 +13,7 @@ var _debug = _interopRequireDefault(require("debug"));
|
|
|
13
13
|
|
|
14
14
|
var _humps = require("humps");
|
|
15
15
|
|
|
16
|
-
var _controllerUtils = require("@pie-lib/
|
|
16
|
+
var _controllerUtils = require("@pie-lib/controller-utils");
|
|
17
17
|
|
|
18
18
|
var _lodash = require("lodash");
|
|
19
19
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.js"],"names":["log","normalize","question","defaults","model","session","env","questionNormalized","questionCamelized","Promise","resolve","shouldIncludeCorrectResponse","mode","out","disabled","responseCorrect","getScore","undefined","validation","shuffle","possibleResponses","possible_responses","role","teacherInstructions","teacherInstructionsEnabled","rationale","isResponseCorrect","correctResponses","responses","isCorrect","totalValidResponses","forEach","value","images","length","answers","answer","index","containerIndex","indexOf","splice","keepNonEmptyResponses","filtered","filter","response","isDefaultOrAltResponseCorrect","altResponses","validResponse","altResponse","getDeductionPerContainer","valid","totalStack","item","incorrectStack","maxValid","ignored","slice","getPartialScore","maxResponsePerZone","correctAnswers","incorrectAnswers","all","deductionList","id","nonEmptyResponses","denominator","str","toFixed","parseFloat","config","isPartialScoring","partialScoring","enabled","correct","outcome","score","empty","configCamelized","createCorrectResponseSession","valid_response","container","i","v","push","getInnerText","html","replaceAll","getContent","replace","validate","errors","field","required"],"mappings":"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","sourcesContent":["import debug from 'debug';\nimport { camelizeKeys } from 'humps';\nimport { partialScoring } from '@pie-lib/pie-toolbox/controller-utils';\nimport { cloneDeep, isEmpty, shuffle } from 'lodash';\n\nimport defaults from './defaults';\nimport { getAllUniqueCorrectness } from './utils';\n\nconst log = debug('pie-elements:image-cloze-association:controller');\n\nexport const normalize = (question) => ({ ...defaults, ...question });\n\nexport const model = (question, session, env) => {\n const questionNormalized = normalize(question);\n const questionCamelized = camelizeKeys(questionNormalized);\n\n return new Promise((resolve) => {\n const shouldIncludeCorrectResponse = env.mode === 'evaluate';\n\n const out = {\n disabled: env.mode !== 'gather',\n mode: env.mode,\n ...questionCamelized,\n responseCorrect: shouldIncludeCorrectResponse ? getScore(questionCamelized, session) === 1 : undefined,\n validation: shouldIncludeCorrectResponse ? questionCamelized.validation : undefined,\n };\n\n if (questionNormalized.shuffle) {\n out.possibleResponses = shuffle(questionNormalized.possible_responses);\n }\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.teacherInstructions = questionCamelized.teacherInstructionsEnabled\n ? questionCamelized.teacherInstructions\n : null;\n out.rationale = questionCamelized.rationale ? questionCamelized.rationale : null;\n } else {\n out.teacherInstructions = null;\n out.rationale = null;\n }\n\n resolve(out);\n });\n};\n\nexport const isResponseCorrect = (correctResponses, session) => {\n const responses = cloneDeep(correctResponses);\n let isCorrect = true;\n let totalValidResponses = 0;\n\n if (!session || isEmpty(session)) {\n return false;\n }\n\n responses.forEach((value) => (totalValidResponses += (value.images || []).length));\n\n if (session.answers && totalValidResponses === session.answers.length) {\n session.answers.forEach((answer) => {\n const index = (responses[answer.containerIndex]?.images || []).indexOf(answer.value);\n\n if (index >= 0) {\n // remove response from correct responses array to ensure that duplicates are evaluated correctly\n responses[answer.containerIndex].images.splice(index, 1);\n } else {\n isCorrect = false;\n }\n });\n } else {\n isCorrect = false;\n }\n\n return isCorrect;\n};\n\n// This applies for correct responses that have empty values\nconst keepNonEmptyResponses = (responses) => {\n const filtered = responses.filter((response) => response.images && response.images.length);\n return cloneDeep(filtered);\n};\n\n// This applies for items that don't support partial scoring.\nconst isDefaultOrAltResponseCorrect = (question, session) => {\n const {\n validation: { altResponses },\n } = question;\n let {\n validation: {\n validResponse: { value },\n },\n } = question;\n\n let isCorrect = isResponseCorrect(value, session);\n\n // Look for correct answers in alternate responses.\n if (!isCorrect && altResponses && altResponses.length) {\n altResponses.forEach((altResponse) => {\n if (isResponseCorrect(altResponse.value, session)) {\n isCorrect = true;\n }\n });\n }\n return isCorrect;\n};\n\n// Deduct only the items that exceeded the maximum valid response per container.\nconst getDeductionPerContainer = (containerIndex, answers, valid) => {\n const totalStack = answers.filter((item) => item.containerIndex === containerIndex);\n const incorrectStack = totalStack.filter((item) => !item.isCorrect);\n const maxValid = (valid.value[containerIndex].images || []).length;\n\n if (totalStack.length > maxValid) {\n const ignored = totalStack.length - maxValid;\n return incorrectStack.slice(-ignored);\n }\n return [];\n};\n\nexport const getPartialScore = (question, session) => {\n const {\n validation: { validResponse },\n maxResponsePerZone,\n } = question;\n let correctAnswers = 0;\n let incorrectAnswers = 0;\n let possibleResponses = 0;\n\n if (!session || isEmpty(session)) {\n return 0;\n }\n\n validResponse.value.forEach((value) => (possibleResponses += (value.images || []).length));\n\n if (session.answers && session.answers.length) {\n const all = getAllUniqueCorrectness(session.answers, validResponse.value);\n correctAnswers = all.filter((item) => item.isCorrect).length;\n incorrectAnswers = all.filter((item) => !item.isCorrect).length;\n\n // deduction rules: https://docs.google.com/document/d/1Oprm8Qs5fg_Dwoj2pNpsfu4D63QgCZgvcqTgeaVel7I/edit\n session.answers.forEach((answer) => {\n if (maxResponsePerZone > 1) {\n const deductionList = getDeductionPerContainer(answer.containerIndex, all, validResponse);\n\n if (deductionList.length) {\n deductionList.forEach((item) => {\n if (item.id === answer.id) {\n correctAnswers -= 1;\n }\n });\n }\n }\n });\n\n if (!maxResponsePerZone || maxResponsePerZone <= 1) {\n correctAnswers -= incorrectAnswers;\n }\n } else {\n correctAnswers = 0;\n }\n // negative values will implicitly make the score equal to zero\n correctAnswers = correctAnswers < 0 ? 0 : correctAnswers;\n\n // use length of validResponse since some containers can be left empty\n const nonEmptyResponses = keepNonEmptyResponses(validResponse.value);\n const denominator = maxResponsePerZone > 1 ? possibleResponses : (nonEmptyResponses || []).length;\n const str = (correctAnswers / denominator).toFixed(2);\n\n return parseFloat(str);\n};\n\nconst getScore = (config, session, env = {}) => {\n const isPartialScoring = partialScoring.enabled(config, env);\n const correct = isDefaultOrAltResponseCorrect(config, session);\n\n return isPartialScoring ? getPartialScore(config, session) : correct ? 1 : 0;\n};\n\nexport const outcome = (config, session, env = {}) => {\n return new Promise((resolve) => {\n log('outcome...');\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n }\n\n const configCamelized = camelizeKeys(config);\n\n if (session.answers || []) {\n const score = getScore(configCamelized, session, env);\n resolve({ score });\n }\n });\n};\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const {\n validation: {\n valid_response: { value },\n },\n } = question;\n const answers = [];\n\n if (value) {\n value.forEach((container, i) => {\n (container.images || []).forEach((v) => {\n answers.push({\n value: v,\n containerIndex: i,\n });\n });\n });\n }\n\n resolve({\n answers,\n id: '1',\n });\n } else {\n resolve(null);\n }\n });\n};\n\n// remove all html tags\nconst getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');\n\n// remove all html tags except img, iframe and source tag for audio\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const errors = {};\n\n ['teacherInstructions'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n return errors;\n};\n"],"file":"index.js"}
|
|
1
|
+
{"version":3,"sources":["../src/index.js"],"names":["log","normalize","question","defaults","model","session","env","questionNormalized","questionCamelized","Promise","resolve","shouldIncludeCorrectResponse","mode","out","disabled","responseCorrect","getScore","undefined","validation","shuffle","possibleResponses","possible_responses","role","teacherInstructions","teacherInstructionsEnabled","rationale","isResponseCorrect","correctResponses","responses","isCorrect","totalValidResponses","forEach","value","images","length","answers","answer","index","containerIndex","indexOf","splice","keepNonEmptyResponses","filtered","filter","response","isDefaultOrAltResponseCorrect","altResponses","validResponse","altResponse","getDeductionPerContainer","valid","totalStack","item","incorrectStack","maxValid","ignored","slice","getPartialScore","maxResponsePerZone","correctAnswers","incorrectAnswers","all","deductionList","id","nonEmptyResponses","denominator","str","toFixed","parseFloat","config","isPartialScoring","partialScoring","enabled","correct","outcome","score","empty","configCamelized","createCorrectResponseSession","valid_response","container","i","v","push","getInnerText","html","replaceAll","getContent","replace","validate","errors","field","required"],"mappings":"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","sourcesContent":["import debug from 'debug';\nimport { camelizeKeys } from 'humps';\nimport { partialScoring } from '@pie-lib/controller-utils';\nimport { cloneDeep, isEmpty, shuffle } from 'lodash';\n\nimport defaults from './defaults';\nimport { getAllUniqueCorrectness } from './utils';\n\nconst log = debug('pie-elements:image-cloze-association:controller');\n\nexport const normalize = (question) => ({ ...defaults, ...question });\n\nexport const model = (question, session, env) => {\n const questionNormalized = normalize(question);\n const questionCamelized = camelizeKeys(questionNormalized);\n\n return new Promise((resolve) => {\n const shouldIncludeCorrectResponse = env.mode === 'evaluate';\n\n const out = {\n disabled: env.mode !== 'gather',\n mode: env.mode,\n ...questionCamelized,\n responseCorrect: shouldIncludeCorrectResponse ? getScore(questionCamelized, session) === 1 : undefined,\n validation: shouldIncludeCorrectResponse ? questionCamelized.validation : undefined,\n };\n\n if (questionNormalized.shuffle) {\n out.possibleResponses = shuffle(questionNormalized.possible_responses);\n }\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.teacherInstructions = questionCamelized.teacherInstructionsEnabled\n ? questionCamelized.teacherInstructions\n : null;\n out.rationale = questionCamelized.rationale ? questionCamelized.rationale : null;\n } else {\n out.teacherInstructions = null;\n out.rationale = null;\n }\n\n resolve(out);\n });\n};\n\nexport const isResponseCorrect = (correctResponses, session) => {\n const responses = cloneDeep(correctResponses);\n let isCorrect = true;\n let totalValidResponses = 0;\n\n if (!session || isEmpty(session)) {\n return false;\n }\n\n responses.forEach((value) => (totalValidResponses += (value.images || []).length));\n\n if (session.answers && totalValidResponses === session.answers.length) {\n session.answers.forEach((answer) => {\n const index = (responses[answer.containerIndex]?.images || []).indexOf(answer.value);\n\n if (index >= 0) {\n // remove response from correct responses array to ensure that duplicates are evaluated correctly\n responses[answer.containerIndex].images.splice(index, 1);\n } else {\n isCorrect = false;\n }\n });\n } else {\n isCorrect = false;\n }\n\n return isCorrect;\n};\n\n// This applies for correct responses that have empty values\nconst keepNonEmptyResponses = (responses) => {\n const filtered = responses.filter((response) => response.images && response.images.length);\n return cloneDeep(filtered);\n};\n\n// This applies for items that don't support partial scoring.\nconst isDefaultOrAltResponseCorrect = (question, session) => {\n const {\n validation: { altResponses },\n } = question;\n let {\n validation: {\n validResponse: { value },\n },\n } = question;\n\n let isCorrect = isResponseCorrect(value, session);\n\n // Look for correct answers in alternate responses.\n if (!isCorrect && altResponses && altResponses.length) {\n altResponses.forEach((altResponse) => {\n if (isResponseCorrect(altResponse.value, session)) {\n isCorrect = true;\n }\n });\n }\n return isCorrect;\n};\n\n// Deduct only the items that exceeded the maximum valid response per container.\nconst getDeductionPerContainer = (containerIndex, answers, valid) => {\n const totalStack = answers.filter((item) => item.containerIndex === containerIndex);\n const incorrectStack = totalStack.filter((item) => !item.isCorrect);\n const maxValid = (valid.value[containerIndex].images || []).length;\n\n if (totalStack.length > maxValid) {\n const ignored = totalStack.length - maxValid;\n return incorrectStack.slice(-ignored);\n }\n return [];\n};\n\nexport const getPartialScore = (question, session) => {\n const {\n validation: { validResponse },\n maxResponsePerZone,\n } = question;\n let correctAnswers = 0;\n let incorrectAnswers = 0;\n let possibleResponses = 0;\n\n if (!session || isEmpty(session)) {\n return 0;\n }\n\n validResponse.value.forEach((value) => (possibleResponses += (value.images || []).length));\n\n if (session.answers && session.answers.length) {\n const all = getAllUniqueCorrectness(session.answers, validResponse.value);\n correctAnswers = all.filter((item) => item.isCorrect).length;\n incorrectAnswers = all.filter((item) => !item.isCorrect).length;\n\n // deduction rules: https://docs.google.com/document/d/1Oprm8Qs5fg_Dwoj2pNpsfu4D63QgCZgvcqTgeaVel7I/edit\n session.answers.forEach((answer) => {\n if (maxResponsePerZone > 1) {\n const deductionList = getDeductionPerContainer(answer.containerIndex, all, validResponse);\n\n if (deductionList.length) {\n deductionList.forEach((item) => {\n if (item.id === answer.id) {\n correctAnswers -= 1;\n }\n });\n }\n }\n });\n\n if (!maxResponsePerZone || maxResponsePerZone <= 1) {\n correctAnswers -= incorrectAnswers;\n }\n } else {\n correctAnswers = 0;\n }\n // negative values will implicitly make the score equal to zero\n correctAnswers = correctAnswers < 0 ? 0 : correctAnswers;\n\n // use length of validResponse since some containers can be left empty\n const nonEmptyResponses = keepNonEmptyResponses(validResponse.value);\n const denominator = maxResponsePerZone > 1 ? possibleResponses : (nonEmptyResponses || []).length;\n const str = (correctAnswers / denominator).toFixed(2);\n\n return parseFloat(str);\n};\n\nconst getScore = (config, session, env = {}) => {\n const isPartialScoring = partialScoring.enabled(config, env);\n const correct = isDefaultOrAltResponseCorrect(config, session);\n\n return isPartialScoring ? getPartialScore(config, session) : correct ? 1 : 0;\n};\n\nexport const outcome = (config, session, env = {}) => {\n return new Promise((resolve) => {\n log('outcome...');\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n }\n\n const configCamelized = camelizeKeys(config);\n\n if (session.answers || []) {\n const score = getScore(configCamelized, session, env);\n resolve({ score });\n }\n });\n};\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const {\n validation: {\n valid_response: { value },\n },\n } = question;\n const answers = [];\n\n if (value) {\n value.forEach((container, i) => {\n (container.images || []).forEach((v) => {\n answers.push({\n value: v,\n containerIndex: i,\n });\n });\n });\n }\n\n resolve({\n answers,\n id: '1',\n });\n } else {\n resolve(null);\n }\n });\n};\n\n// remove all html tags\nconst getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');\n\n// remove all html tags except img, iframe and source tag for audio\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const errors = {};\n\n ['teacherInstructions'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n return errors;\n};\n"],"file":"index.js"}
|
package/controller/package.json
CHANGED
package/controller/src/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import debug from 'debug';
|
|
2
2
|
import { camelizeKeys } from 'humps';
|
|
3
|
-
import { partialScoring } from '@pie-lib/
|
|
3
|
+
import { partialScoring } from '@pie-lib/controller-utils';
|
|
4
4
|
import { cloneDeep, isEmpty, shuffle } from 'lodash';
|
|
5
5
|
|
|
6
6
|
import defaults from './defaults';
|
package/lib/evaluation-icon.js
CHANGED
|
@@ -17,7 +17,7 @@ var _Check = _interopRequireDefault(require("@material-ui/icons/Check"));
|
|
|
17
17
|
|
|
18
18
|
var _Close = _interopRequireDefault(require("@material-ui/icons/Close"));
|
|
19
19
|
|
|
20
|
-
var _renderUi = require("@pie-lib/
|
|
20
|
+
var _renderUi = require("@pie-lib/render-ui");
|
|
21
21
|
|
|
22
22
|
var getCorrectnessClass = function getCorrectnessClass(isCorrect, filled) {
|
|
23
23
|
var correctness = isCorrect ? 'correct' : 'incorrect';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/evaluation-icon.jsx"],"names":["getCorrectnessClass","isCorrect","filled","correctness","fillState","EvaluationIcon","classes","containerStyle","Icon","Check","Close","showCorrectness","undefined","icon","propTypes","PropTypes","object","bool","oneOfType","number","defaultProps","styles","correctEmpty","color","correct","correctFilled","background","backgroundColor","incorrectEmpty","incorrect","incorrectFilled"],"mappings":";;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAEA,IAAMA,mBAAmB,GAAG,SAAtBA,mBAAsB,CAACC,SAAD,EAAYC,MAAZ,EAAuB;AACjD,MAAMC,WAAW,GAAGF,SAAS,GAAG,SAAH,GAAe,WAA5C;AACA,MAAMG,SAAS,GAAGF,MAAM,GAAG,QAAH,GAAc,OAAtC;AAEA,mBAAUC,WAAV,SAAwBC,SAAxB;AACD,CALD;;AAOA,IAAMC,cAAc,GAAG,SAAjBA,cAAiB,OAAoD;AAAA,MAAjDC,OAAiD,QAAjDA,OAAiD;AAAA,MAAxCC,cAAwC,QAAxCA,cAAwC;AAAA,MAAxBN,SAAwB,QAAxBA,SAAwB;AAAA,MAAbC,MAAa,QAAbA,MAAa;AACzE,MAAMM,IAAI,GAAGP,SAAS,GAAGQ,iBAAH,GAAWC,iBAAjC;AACA,MAAMC,eAAe,GAAGV,SAAS,KAAKW,SAAtC;AACA,MAAMT,WAAW,GAAGQ,eAAe,GAAGX,mBAAmB,CAACC,SAAD,EAAYC,MAAZ,CAAtB,GAA4C,EAA/E;AAEA,SAAOS,eAAe,gBAAG,gCAAC,IAAD;AAAM,IAAA,SAAS,YAAKL,OAAO,CAACO,IAAb,cAAqBP,OAAO,CAACH,WAAD,CAA5B,CAAf;AAA4D,IAAA,KAAK,EAAEI;AAAnE,IAAH,GAA2F,IAAjH;AACD,CAND;;AAQAF,cAAc,CAACS,SAAf,GAA2B;AACzBR,EAAAA,OAAO,EAAES,sBAAUC,MADM;AAEzBT,EAAAA,cAAc,EAAEQ,sBAAUC,MAFD;AAGzBd,EAAAA,MAAM,EAAEa,sBAAUE,IAHO;AAIzBhB,EAAAA,SAAS,EAAEc,sBAAUG,SAAV,CAAoB,CAACH,sBAAUE,IAAX,EAAiBF,sBAAUI,MAA3B,CAApB;AAJc,CAA3B;AAOAd,cAAc,CAACe,YAAf,GAA8B;AAC5Bd,EAAAA,OAAO,EAAE,EADmB;AAE5BC,EAAAA,cAAc,EAAE,EAFY;AAG5BL,EAAAA,MAAM,EAAE,KAHoB;AAI5BD,EAAAA,SAAS,EAAEW;AAJiB,CAA9B;;AAOA,IAAMS,MAAM,GAAG,SAATA,MAAS;AAAA,SAAO;AACpBC,IAAAA,YAAY,EAAE;AACZC,MAAAA,KAAK,EAAEA,gBAAMC,OAAN;AADK,KADM;AAIpBC,IAAAA,aAAa,EAAE;AACbF,MAAAA,KAAK,EAAEA,gBAAMG,UAAN,EADM;AAEbC,MAAAA,eAAe,EAAEJ,gBAAMC,OAAN;AAFJ,KAJK;AAQpBI,IAAAA,cAAc,EAAE;AACdL,MAAAA,KAAK,EAAEA,gBAAMM,SAAN;AADO,KARI;AAWpBC,IAAAA,eAAe,EAAE;AACfP,MAAAA,KAAK,EAAEA,gBAAMG,UAAN,EADQ;AAEfC,MAAAA,eAAe,EAAEJ,gBAAMM,SAAN;AAFF;AAXG,GAAP;AAAA,CAAf;;eAiBe,sBAAWR,MAAX,EAAmBhB,cAAnB,C","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core';\nimport Check from '@material-ui/icons/Check';\nimport Close from '@material-ui/icons/Close';\nimport { color } from '@pie-lib/
|
|
1
|
+
{"version":3,"sources":["../src/evaluation-icon.jsx"],"names":["getCorrectnessClass","isCorrect","filled","correctness","fillState","EvaluationIcon","classes","containerStyle","Icon","Check","Close","showCorrectness","undefined","icon","propTypes","PropTypes","object","bool","oneOfType","number","defaultProps","styles","correctEmpty","color","correct","correctFilled","background","backgroundColor","incorrectEmpty","incorrect","incorrectFilled"],"mappings":";;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAEA,IAAMA,mBAAmB,GAAG,SAAtBA,mBAAsB,CAACC,SAAD,EAAYC,MAAZ,EAAuB;AACjD,MAAMC,WAAW,GAAGF,SAAS,GAAG,SAAH,GAAe,WAA5C;AACA,MAAMG,SAAS,GAAGF,MAAM,GAAG,QAAH,GAAc,OAAtC;AAEA,mBAAUC,WAAV,SAAwBC,SAAxB;AACD,CALD;;AAOA,IAAMC,cAAc,GAAG,SAAjBA,cAAiB,OAAoD;AAAA,MAAjDC,OAAiD,QAAjDA,OAAiD;AAAA,MAAxCC,cAAwC,QAAxCA,cAAwC;AAAA,MAAxBN,SAAwB,QAAxBA,SAAwB;AAAA,MAAbC,MAAa,QAAbA,MAAa;AACzE,MAAMM,IAAI,GAAGP,SAAS,GAAGQ,iBAAH,GAAWC,iBAAjC;AACA,MAAMC,eAAe,GAAGV,SAAS,KAAKW,SAAtC;AACA,MAAMT,WAAW,GAAGQ,eAAe,GAAGX,mBAAmB,CAACC,SAAD,EAAYC,MAAZ,CAAtB,GAA4C,EAA/E;AAEA,SAAOS,eAAe,gBAAG,gCAAC,IAAD;AAAM,IAAA,SAAS,YAAKL,OAAO,CAACO,IAAb,cAAqBP,OAAO,CAACH,WAAD,CAA5B,CAAf;AAA4D,IAAA,KAAK,EAAEI;AAAnE,IAAH,GAA2F,IAAjH;AACD,CAND;;AAQAF,cAAc,CAACS,SAAf,GAA2B;AACzBR,EAAAA,OAAO,EAAES,sBAAUC,MADM;AAEzBT,EAAAA,cAAc,EAAEQ,sBAAUC,MAFD;AAGzBd,EAAAA,MAAM,EAAEa,sBAAUE,IAHO;AAIzBhB,EAAAA,SAAS,EAAEc,sBAAUG,SAAV,CAAoB,CAACH,sBAAUE,IAAX,EAAiBF,sBAAUI,MAA3B,CAApB;AAJc,CAA3B;AAOAd,cAAc,CAACe,YAAf,GAA8B;AAC5Bd,EAAAA,OAAO,EAAE,EADmB;AAE5BC,EAAAA,cAAc,EAAE,EAFY;AAG5BL,EAAAA,MAAM,EAAE,KAHoB;AAI5BD,EAAAA,SAAS,EAAEW;AAJiB,CAA9B;;AAOA,IAAMS,MAAM,GAAG,SAATA,MAAS;AAAA,SAAO;AACpBC,IAAAA,YAAY,EAAE;AACZC,MAAAA,KAAK,EAAEA,gBAAMC,OAAN;AADK,KADM;AAIpBC,IAAAA,aAAa,EAAE;AACbF,MAAAA,KAAK,EAAEA,gBAAMG,UAAN,EADM;AAEbC,MAAAA,eAAe,EAAEJ,gBAAMC,OAAN;AAFJ,KAJK;AAQpBI,IAAAA,cAAc,EAAE;AACdL,MAAAA,KAAK,EAAEA,gBAAMM,SAAN;AADO,KARI;AAWpBC,IAAAA,eAAe,EAAE;AACfP,MAAAA,KAAK,EAAEA,gBAAMG,UAAN,EADQ;AAEfC,MAAAA,eAAe,EAAEJ,gBAAMM,SAAN;AAFF;AAXG,GAAP;AAAA,CAAf;;eAiBe,sBAAWR,MAAX,EAAmBhB,cAAnB,C","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core';\nimport Check from '@material-ui/icons/Check';\nimport Close from '@material-ui/icons/Close';\nimport { color } from '@pie-lib/render-ui';\n\nconst getCorrectnessClass = (isCorrect, filled) => {\n const correctness = isCorrect ? 'correct' : 'incorrect';\n const fillState = filled ? 'Filled' : 'Empty';\n\n return `${correctness}${fillState}`;\n};\n\nconst EvaluationIcon = ({ classes, containerStyle, isCorrect, filled }) => {\n const Icon = isCorrect ? Check : Close;\n const showCorrectness = isCorrect !== undefined;\n const correctness = showCorrectness ? getCorrectnessClass(isCorrect, filled) : '';\n\n return showCorrectness ? <Icon className={`${classes.icon} ${classes[correctness]}`} style={containerStyle} /> : null;\n};\n\nEvaluationIcon.propTypes = {\n classes: PropTypes.object,\n containerStyle: PropTypes.object,\n filled: PropTypes.bool,\n isCorrect: PropTypes.oneOfType([PropTypes.bool, PropTypes.number]),\n};\n\nEvaluationIcon.defaultProps = {\n classes: {},\n containerStyle: {},\n filled: false,\n isCorrect: undefined,\n};\n\nconst styles = () => ({\n correctEmpty: {\n color: color.correct(),\n },\n correctFilled: {\n color: color.background(),\n backgroundColor: color.correct(),\n },\n incorrectEmpty: {\n color: color.incorrect(),\n },\n incorrectFilled: {\n color: color.background(),\n backgroundColor: color.incorrect(),\n },\n});\n\nexport default withStyles(styles)(EvaluationIcon);\n"],"file":"evaluation-icon.js"}
|
package/lib/image-drop-target.js
CHANGED
|
@@ -25,11 +25,11 @@ var _react = _interopRequireDefault(require("react"));
|
|
|
25
25
|
|
|
26
26
|
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
27
27
|
|
|
28
|
-
var _drag = require("@pie-lib/
|
|
28
|
+
var _drag = require("@pie-lib/drag");
|
|
29
29
|
|
|
30
30
|
var _styles = require("@material-ui/core/styles");
|
|
31
31
|
|
|
32
|
-
var _renderUi = require("@pie-lib/
|
|
32
|
+
var _renderUi = require("@pie-lib/render-ui");
|
|
33
33
|
|
|
34
34
|
var _classnames = _interopRequireDefault(require("classnames"));
|
|
35
35
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/image-drop-target.jsx"],"names":["ImageDropTarget","shouldHaveSmallPadding","e","preventDefault","dropContainer","addEventListener","handleTouchStart","passive","removeEventListener","props","answers","canDrag","classes","containerStyle","draggingElement","onDragAnswerBegin","onDragAnswerEnd","showDashedBorder","responseAreaFill","responseContainerPadding","imageDropTargetPadding","connectDropTarget","answerChoiceTransparency","maxResponsePerZone","isOver","state","isDraggingElement","id","containerClasses","responseContainer","responseContainerDashed","responseContainerActive","updatedContainerStyle","padding","backgroundColor","ref","length","dropContainerResponsesHeight","getBoundingClientRect","height","map","answer","React","Component","propTypes","PropTypes","object","array","bool","isRequired","func","onDrop","string","number","defaultProps","styles","display","flexWrap","dragOverContainer","color","background","pointerEvents","width","position","boxSizing","border","text","Styled","tileSource","hover","monitor","shallow","drop","item","getItem","c","types","response","connect","dropTarget","dragItem"],"mappings":"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","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { DropTarget } from '@pie-lib/pie-toolbox/drag';\nimport { withStyles } from '@material-ui/core/styles';\nimport { color } from '@pie-lib/pie-toolbox/render-ui';\nimport cx from 'classnames';\n\nimport PossibleResponse from './possible-response';\nimport c from './constants';\n\nclass ImageDropTarget extends React.Component {\n state = {\n shouldHaveSmallPadding: false,\n }\n\n componentDidMount() {\n if (this.dropContainer) {\n this.dropContainer.addEventListener('touchstart', this.handleTouchStart, { passive: false });\n }\n }\n\n componentWillUnmount() {\n if (this.dropContainer) {\n this.dropContainer.removeEventListener('touchstart', this.handleTouchStart);\n }\n }\n\n handleTouchStart = (e) => {\n e.preventDefault();\n };\n\n render() {\n const {\n answers,\n canDrag,\n classes,\n containerStyle,\n draggingElement,\n onDragAnswerBegin,\n onDragAnswerEnd,\n showDashedBorder,\n responseAreaFill,\n responseContainerPadding,\n imageDropTargetPadding,\n connectDropTarget,\n answerChoiceTransparency,\n maxResponsePerZone,\n isOver,\n } = this.props;\n const { shouldHaveSmallPadding } = this.state;\n const isDraggingElement = !!draggingElement.id;\n\n const containerClasses = cx(classes.responseContainer, isOver && classes.isOver, {\n [classes.responseContainerDashed]: showDashedBorder && !isDraggingElement,\n [classes.responseContainerActive]: isDraggingElement,\n });\n\n const updatedContainerStyle = {\n padding: maxResponsePerZone === 1 ? '0' : responseContainerPadding,\n ...containerStyle,\n ...(responseAreaFill && !isDraggingElement && { backgroundColor: responseAreaFill })\n };\n\n return connectDropTarget(\n <div\n ref={(ref) => { this.dropContainer = ref; }}\n className={containerClasses}\n style={updatedContainerStyle}\n >\n {answers.length ? (\n <div\n className={classes.answers}\n ref={ref => {\n this.dropContainerResponsesHeight = ref?.getBoundingClientRect().height;\n }}\n >\n {answers.map((answer) => (\n <PossibleResponse\n key={answer.id}\n data={answer}\n canDrag={canDrag}\n onDragBegin={() => onDragAnswerBegin(answer)}\n onDragEnd={onDragAnswerEnd}\n answerChoiceTransparency={answerChoiceTransparency}\n containerStyle={{\n padding: imageDropTargetPadding\n ? imageDropTargetPadding\n : shouldHaveSmallPadding\n ? '2px'\n : '6px 10px',\n }}\n />\n ))}\n </div>\n ) : null}\n </div>,\n );\n }\n}\n\nImageDropTarget.propTypes = {\n answer: PropTypes.object,\n answers: PropTypes.array,\n canDrag: PropTypes.bool.isRequired,\n classes: PropTypes.object,\n containerStyle: PropTypes.object.isRequired,\n draggingElement: PropTypes.object.isRequired,\n onDragAnswerBegin: PropTypes.func.isRequired,\n onDragAnswerEnd: PropTypes.func.isRequired,\n onDrop: PropTypes.func.isRequired,\n connectDropTarget: PropTypes.func.isRequired,\n showDashedBorder: PropTypes.bool,\n responseAreaFill: PropTypes.string,\n answerChoiceTransparency: PropTypes.bool,\n isOver: PropTypes.bool,\n responseContainerPadding: PropTypes.string,\n imageDropTargetPadding: PropTypes.string,\n maxResponsePerZone: PropTypes.number,\n};\n\nImageDropTarget.defaultProps = {\n answer: {},\n classes: {},\n responseContainerPadding: '10px',\n};\n\nconst styles = () => ({\n answers: {\n display: 'flex',\n flexWrap: 'wrap',\n },\n dragOverContainer: {\n backgroundColor: color.background(),\n pointerEvents: 'none',\n width: 'fit-content',\n },\n responseContainer: {\n position: 'absolute',\n boxSizing: 'border-box'\n },\n responseContainerActive: {\n border: `2px solid ${color.text()}`,\n backgroundColor: 'rgba(230, 242, 252, .8)',\n },\n responseContainerDashed: {\n border: `2px dashed ${color.text()}`,\n },\n isOver: {\n border: '1px solid rgb(158, 158, 158)',\n backgroundColor: 'rgb(224, 224, 224)',\n }\n});\n\nconst Styled = withStyles(styles)(ImageDropTarget);\n\nconst tileSource = {\n hover(props, monitor) {\n monitor.isOver({ shallow: true });\n },\n drop(props, monitor) {\n const item = monitor.getItem();\n props.onDrop(item);\n },\n};\n\nexport default DropTarget(c.types.response, tileSource, (connect, monitor) => ({\n connectDropTarget: connect.dropTarget(),\n isOver: monitor.isOver(),\n dragItem: monitor.getItem(),\n}))(Styled);\n"],"file":"image-drop-target.js"}
|
|
1
|
+
{"version":3,"sources":["../src/image-drop-target.jsx"],"names":["ImageDropTarget","shouldHaveSmallPadding","e","preventDefault","dropContainer","addEventListener","handleTouchStart","passive","removeEventListener","props","answers","canDrag","classes","containerStyle","draggingElement","onDragAnswerBegin","onDragAnswerEnd","showDashedBorder","responseAreaFill","responseContainerPadding","imageDropTargetPadding","connectDropTarget","answerChoiceTransparency","maxResponsePerZone","isOver","state","isDraggingElement","id","containerClasses","responseContainer","responseContainerDashed","responseContainerActive","updatedContainerStyle","padding","backgroundColor","ref","length","dropContainerResponsesHeight","getBoundingClientRect","height","map","answer","React","Component","propTypes","PropTypes","object","array","bool","isRequired","func","onDrop","string","number","defaultProps","styles","display","flexWrap","dragOverContainer","color","background","pointerEvents","width","position","boxSizing","border","text","Styled","tileSource","hover","monitor","shallow","drop","item","getItem","c","types","response","connect","dropTarget","dragItem"],"mappings":"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","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { DropTarget } from '@pie-lib/drag';\nimport { withStyles } from '@material-ui/core/styles';\nimport { color } from '@pie-lib/render-ui';\nimport cx from 'classnames';\n\nimport PossibleResponse from './possible-response';\nimport c from './constants';\n\nclass ImageDropTarget extends React.Component {\n state = {\n shouldHaveSmallPadding: false,\n };\n\n componentDidMount() {\n if (this.dropContainer) {\n this.dropContainer.addEventListener('touchstart', this.handleTouchStart, { passive: false });\n }\n }\n\n componentWillUnmount() {\n if (this.dropContainer) {\n this.dropContainer.removeEventListener('touchstart', this.handleTouchStart);\n }\n }\n\n handleTouchStart = (e) => {\n e.preventDefault();\n };\n\n render() {\n const {\n answers,\n canDrag,\n classes,\n containerStyle,\n draggingElement,\n onDragAnswerBegin,\n onDragAnswerEnd,\n showDashedBorder,\n responseAreaFill,\n responseContainerPadding,\n imageDropTargetPadding,\n connectDropTarget,\n answerChoiceTransparency,\n maxResponsePerZone,\n isOver,\n } = this.props;\n const { shouldHaveSmallPadding } = this.state;\n const isDraggingElement = !!draggingElement.id;\n\n const containerClasses = cx(classes.responseContainer, isOver && classes.isOver, {\n [classes.responseContainerDashed]: showDashedBorder && !isDraggingElement,\n [classes.responseContainerActive]: isDraggingElement,\n });\n\n const updatedContainerStyle = {\n padding: maxResponsePerZone === 1 ? '0' : responseContainerPadding,\n ...containerStyle,\n ...(responseAreaFill && !isDraggingElement && { backgroundColor: responseAreaFill }),\n };\n\n return connectDropTarget(\n <div\n ref={(ref) => {\n this.dropContainer = ref;\n }}\n className={containerClasses}\n style={updatedContainerStyle}\n >\n {answers.length ? (\n <div\n className={classes.answers}\n ref={(ref) => {\n this.dropContainerResponsesHeight = ref?.getBoundingClientRect().height;\n }}\n >\n {answers.map((answer) => (\n <PossibleResponse\n key={answer.id}\n data={answer}\n canDrag={canDrag}\n onDragBegin={() => onDragAnswerBegin(answer)}\n onDragEnd={onDragAnswerEnd}\n answerChoiceTransparency={answerChoiceTransparency}\n containerStyle={{\n padding: imageDropTargetPadding\n ? imageDropTargetPadding\n : shouldHaveSmallPadding\n ? '2px'\n : '6px 10px',\n }}\n />\n ))}\n </div>\n ) : null}\n </div>,\n );\n }\n}\n\nImageDropTarget.propTypes = {\n answer: PropTypes.object,\n answers: PropTypes.array,\n canDrag: PropTypes.bool.isRequired,\n classes: PropTypes.object,\n containerStyle: PropTypes.object.isRequired,\n draggingElement: PropTypes.object.isRequired,\n onDragAnswerBegin: PropTypes.func.isRequired,\n onDragAnswerEnd: PropTypes.func.isRequired,\n onDrop: PropTypes.func.isRequired,\n connectDropTarget: PropTypes.func.isRequired,\n showDashedBorder: PropTypes.bool,\n responseAreaFill: PropTypes.string,\n answerChoiceTransparency: PropTypes.bool,\n isOver: PropTypes.bool,\n responseContainerPadding: PropTypes.string,\n imageDropTargetPadding: PropTypes.string,\n maxResponsePerZone: PropTypes.number,\n};\n\nImageDropTarget.defaultProps = {\n answer: {},\n classes: {},\n responseContainerPadding: '10px',\n};\n\nconst styles = () => ({\n answers: {\n display: 'flex',\n flexWrap: 'wrap',\n },\n dragOverContainer: {\n backgroundColor: color.background(),\n pointerEvents: 'none',\n width: 'fit-content',\n },\n responseContainer: {\n position: 'absolute',\n boxSizing: 'border-box',\n },\n responseContainerActive: {\n border: `2px solid ${color.text()}`,\n backgroundColor: 'rgba(230, 242, 252, .8)',\n },\n responseContainerDashed: {\n border: `2px dashed ${color.text()}`,\n },\n isOver: {\n border: '1px solid rgb(158, 158, 158)',\n backgroundColor: 'rgb(224, 224, 224)',\n },\n});\n\nconst Styled = withStyles(styles)(ImageDropTarget);\n\nconst tileSource = {\n hover(props, monitor) {\n monitor.isOver({ shallow: true });\n },\n drop(props, monitor) {\n const item = monitor.getItem();\n props.onDrop(item);\n },\n};\n\nexport default DropTarget(c.types.response, tileSource, (connect, monitor) => ({\n connectDropTarget: connect.dropTarget(),\n isOver: monitor.isOver(),\n dragItem: monitor.getItem(),\n}))(Styled);\n"],"file":"image-drop-target.js"}
|
package/lib/index.js
CHANGED
|
@@ -23,9 +23,9 @@ var _react = _interopRequireDefault(require("react"));
|
|
|
23
23
|
|
|
24
24
|
var _reactDom = _interopRequireDefault(require("react-dom"));
|
|
25
25
|
|
|
26
|
-
var _mathRendering = require("@pie-lib/
|
|
26
|
+
var _mathRendering = require("@pie-lib/math-rendering");
|
|
27
27
|
|
|
28
|
-
var _renderUi = require("@pie-lib/
|
|
28
|
+
var _renderUi = require("@pie-lib/render-ui");
|
|
29
29
|
|
|
30
30
|
var _piePlayerEvents = require("@pie-framework/pie-player-events");
|
|
31
31
|
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.js"],"names":["ImageClozeAssociation","m","_model","dispatchEvent","ModelSetEvent","tagName","toLowerCase","isComplete","_render","autoplayAudioEnabled","completeAudioEnabled","elementContext","audioComplete","audio","querySelector","isInsidePrompt","closest","_session","answers","Array","isArray","length","s","data","selector","SessionChangedEvent","info","document","createElement","id","Object","assign","style","position","top","width","height","display","justifyContent","alignItems","background","zIndex","cursor","img","src","EnableAudioAutoplayImage","alt","appendChild","observer","MutationObserver","mutationsList","forEach","mutation","type","_createAudioInfoToast","container","enableAudio","play","removeChild","removeEventListener","setTimeout","paused","addEventListener","handlePlaying","handleEnded","_audio","_handlePlaying","_handleEnded","_enableAudio","disconnect","observe","childList","subtree","el","React","ImageClozeAssociationComponent","model","session","updateAnswer","bind","ReactDOM","render","HTMLElement"],"mappings":"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","sourcesContent":["import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { renderMath } from '@pie-lib/pie-toolbox/math-rendering';\nimport { EnableAudioAutoplayImage } from '@pie-lib/pie-toolbox/render-ui';\nimport { ModelSetEvent, SessionChangedEvent } from '@pie-framework/pie-player-events';\n\nimport ImageClozeAssociationComponent from './root';\n\nexport default class ImageClozeAssociation extends HTMLElement {\n set model(m) {\n this._model = m;\n\n this.dispatchEvent(new ModelSetEvent(this.tagName.toLowerCase(), this.isComplete(), !!this._model));\n this._render();\n }\n\n isComplete() {\n const { autoplayAudioEnabled, completeAudioEnabled } = this._model || {};\n const elementContext = this;\n\n // check audio completion if audio settings are enabled and audio actually exists\n if (autoplayAudioEnabled && completeAudioEnabled && !this.audioComplete) {\n if (elementContext) {\n const audio = elementContext.querySelector('audio');\n const isInsidePrompt = audio && audio.closest('#preview-prompt');\n\n // only require audio completion if audio exists and is inside the prompt\n if (audio && isInsidePrompt) {\n return false;\n }\n }\n }\n\n if (!this._session || !this._session.answers) {\n return false;\n }\n\n if (!Array.isArray(this._session.answers)) {\n return false;\n }\n\n return Array.isArray(this._session.answers) && this._session.answers.length > 0;\n }\n\n set session(s) {\n if (s && !s.answers) {\n s.answers = [];\n }\n\n this._session = s;\n this._render();\n }\n\n get session() {\n return this._session;\n }\n\n updateAnswer(data) {\n this._session.answers = data;\n this._session.selector = 'Mouse';\n\n this.dispatchEvent(new SessionChangedEvent(this.tagName.toLowerCase(), this.isComplete()));\n\n this._render();\n }\n\n _createAudioInfoToast() {\n const info = document.createElement('div');\n info.id = 'play-audio-info';\n\n Object.assign(info.style, {\n position: 'absolute',\n top: 0,\n width: '100%',\n height: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n background: 'white',\n zIndex: '1000',\n cursor: 'pointer'\n });\n\n const img = document.createElement('img');\n img.src = EnableAudioAutoplayImage;\n img.alt = 'Click anywhere to enable audio autoplay';\n img.width = 500;\n img.height = 300;\n\n info.appendChild(img);\n return info;\n }\n\n connectedCallback() {\n this._render();\n\n // Observation: audio in Chrome will have the autoplay attribute,\n // while other browsers will not have the autoplay attribute and will need a user interaction to play the audio\n // This workaround fixes the issue of audio being cached and played on any user interaction in Safari and Firefox\n const observer = new MutationObserver((mutationsList, observer) => {\n mutationsList.forEach((mutation) => {\n if (mutation.type === 'childList') {\n const audio = this.querySelector('audio');\n const isInsidePrompt = audio && audio.closest('#preview-prompt');\n\n if (!this._model) return;\n if (!this._model.autoplayAudioEnabled) return;\n if (audio && !isInsidePrompt) return;\n if (!audio) return;\n\n const info = this._createAudioInfoToast();\n const container = this.querySelector('#main-container');\n const enableAudio = () => {\n if (this.querySelector('#play-audio-info')) {\n audio.play();\n container.removeChild(info);\n }\n\n document.removeEventListener('click', enableAudio);\n };\n\n // if the audio is paused, it means the user has not interacted with the page yet and the audio will not play\n // FIX FOR SAFARI: play with a slight delay to check if autoplay was blocked\n setTimeout(() => {\n if (audio.paused && !this.querySelector('#play-audio-info')) {\n // add info message as a toast to enable audio playback\n container.appendChild(info);\n document.addEventListener('click', enableAudio);\n } else {\n document.removeEventListener('click', enableAudio);\n }\n }, 500);\n\n // we need to listen for the playing event to remove the toast in case the audio plays because of re-rendering\n const handlePlaying = () => {\n const info = this.querySelector('#play-audio-info');\n\n if (info) {\n container.removeChild(info);\n }\n\n audio.removeEventListener('playing', handlePlaying);\n };\n\n audio.addEventListener('playing', handlePlaying);\n\n // we need to listen for the ended event to update the isComplete state\n const handleEnded = () => {\n this.audioComplete = true;\n this.dispatchEvent(new SessionChangedEvent(this.tagName.toLowerCase(), this.isComplete()));\n\n audio.removeEventListener('ended', handleEnded);\n };\n\n audio.addEventListener('ended', handleEnded);\n\n // store references to remove later\n this._audio = audio;\n this._handlePlaying = handlePlaying;\n this._handleEnded = handleEnded;\n this._enableAudio = enableAudio;\n\n observer.disconnect();\n }\n });\n });\n\n observer.observe(this, { childList: true, subtree: true });\n }\n\n disconnectedCallback() {\n document.removeEventListener('click', this._enableAudio);\n\n if (this._audio) {\n this._audio.removeEventListener('playing', this._handlePlaying);\n this._audio.removeEventListener('ended', this._handleEnded);\n this._audio = null;\n }\n }\n\n _render() {\n if (this._model && this._session) {\n const el = React.createElement(ImageClozeAssociationComponent, {\n model: this._model,\n session: this._session,\n updateAnswer: this.updateAnswer.bind(this),\n });\n\n ReactDOM.render(el, this, () => {\n renderMath(this);\n });\n }\n }\n}\n"],"file":"index.js"}
|
|
1
|
+
{"version":3,"sources":["../src/index.js"],"names":["ImageClozeAssociation","m","_model","dispatchEvent","ModelSetEvent","tagName","toLowerCase","isComplete","_render","autoplayAudioEnabled","completeAudioEnabled","elementContext","audioComplete","audio","querySelector","isInsidePrompt","closest","_session","answers","Array","isArray","length","s","data","selector","SessionChangedEvent","info","document","createElement","id","Object","assign","style","position","top","width","height","display","justifyContent","alignItems","background","zIndex","cursor","img","src","EnableAudioAutoplayImage","alt","appendChild","observer","MutationObserver","mutationsList","forEach","mutation","type","_createAudioInfoToast","container","enableAudio","play","removeChild","removeEventListener","setTimeout","paused","addEventListener","handlePlaying","handleEnded","_audio","_handlePlaying","_handleEnded","_enableAudio","disconnect","observe","childList","subtree","el","React","ImageClozeAssociationComponent","model","session","updateAnswer","bind","ReactDOM","render","HTMLElement"],"mappings":"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","sourcesContent":["import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { renderMath } from '@pie-lib/math-rendering';\nimport { EnableAudioAutoplayImage } from '@pie-lib/render-ui';\nimport { ModelSetEvent, SessionChangedEvent } from '@pie-framework/pie-player-events';\n\nimport ImageClozeAssociationComponent from './root';\n\nexport default class ImageClozeAssociation extends HTMLElement {\n set model(m) {\n this._model = m;\n\n this.dispatchEvent(new ModelSetEvent(this.tagName.toLowerCase(), this.isComplete(), !!this._model));\n this._render();\n }\n\n isComplete() {\n const { autoplayAudioEnabled, completeAudioEnabled } = this._model || {};\n const elementContext = this;\n\n // check audio completion if audio settings are enabled and audio actually exists\n if (autoplayAudioEnabled && completeAudioEnabled && !this.audioComplete) {\n if (elementContext) {\n const audio = elementContext.querySelector('audio');\n const isInsidePrompt = audio && audio.closest('#preview-prompt');\n\n // only require audio completion if audio exists and is inside the prompt\n if (audio && isInsidePrompt) {\n return false;\n }\n }\n }\n\n if (!this._session || !this._session.answers) {\n return false;\n }\n\n if (!Array.isArray(this._session.answers)) {\n return false;\n }\n\n return Array.isArray(this._session.answers) && this._session.answers.length > 0;\n }\n\n set session(s) {\n if (s && !s.answers) {\n s.answers = [];\n }\n\n this._session = s;\n this._render();\n }\n\n get session() {\n return this._session;\n }\n\n updateAnswer(data) {\n this._session.answers = data;\n this._session.selector = 'Mouse';\n\n this.dispatchEvent(new SessionChangedEvent(this.tagName.toLowerCase(), this.isComplete()));\n\n this._render();\n }\n\n _createAudioInfoToast() {\n const info = document.createElement('div');\n info.id = 'play-audio-info';\n\n Object.assign(info.style, {\n position: 'absolute',\n top: 0,\n width: '100%',\n height: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n background: 'white',\n zIndex: '1000',\n cursor: 'pointer',\n });\n\n const img = document.createElement('img');\n img.src = EnableAudioAutoplayImage;\n img.alt = 'Click anywhere to enable audio autoplay';\n img.width = 500;\n img.height = 300;\n\n info.appendChild(img);\n return info;\n }\n\n connectedCallback() {\n this._render();\n\n // Observation: audio in Chrome will have the autoplay attribute,\n // while other browsers will not have the autoplay attribute and will need a user interaction to play the audio\n // This workaround fixes the issue of audio being cached and played on any user interaction in Safari and Firefox\n const observer = new MutationObserver((mutationsList, observer) => {\n mutationsList.forEach((mutation) => {\n if (mutation.type === 'childList') {\n const audio = this.querySelector('audio');\n const isInsidePrompt = audio && audio.closest('#preview-prompt');\n\n if (!this._model) return;\n if (!this._model.autoplayAudioEnabled) return;\n if (audio && !isInsidePrompt) return;\n if (!audio) return;\n\n const info = this._createAudioInfoToast();\n const container = this.querySelector('#main-container');\n const enableAudio = () => {\n if (this.querySelector('#play-audio-info')) {\n audio.play();\n container.removeChild(info);\n }\n\n document.removeEventListener('click', enableAudio);\n };\n\n // if the audio is paused, it means the user has not interacted with the page yet and the audio will not play\n // FIX FOR SAFARI: play with a slight delay to check if autoplay was blocked\n setTimeout(() => {\n if (audio.paused && !this.querySelector('#play-audio-info')) {\n // add info message as a toast to enable audio playback\n container.appendChild(info);\n document.addEventListener('click', enableAudio);\n } else {\n document.removeEventListener('click', enableAudio);\n }\n }, 500);\n\n // we need to listen for the playing event to remove the toast in case the audio plays because of re-rendering\n const handlePlaying = () => {\n const info = this.querySelector('#play-audio-info');\n\n if (info) {\n container.removeChild(info);\n }\n\n audio.removeEventListener('playing', handlePlaying);\n };\n\n audio.addEventListener('playing', handlePlaying);\n\n // we need to listen for the ended event to update the isComplete state\n const handleEnded = () => {\n this.audioComplete = true;\n this.dispatchEvent(new SessionChangedEvent(this.tagName.toLowerCase(), this.isComplete()));\n\n audio.removeEventListener('ended', handleEnded);\n };\n\n audio.addEventListener('ended', handleEnded);\n\n // store references to remove later\n this._audio = audio;\n this._handlePlaying = handlePlaying;\n this._handleEnded = handleEnded;\n this._enableAudio = enableAudio;\n\n observer.disconnect();\n }\n });\n });\n\n observer.observe(this, { childList: true, subtree: true });\n }\n\n disconnectedCallback() {\n document.removeEventListener('click', this._enableAudio);\n\n if (this._audio) {\n this._audio.removeEventListener('playing', this._handlePlaying);\n this._audio.removeEventListener('ended', this._handleEnded);\n this._audio = null;\n }\n }\n\n _render() {\n if (this._model && this._session) {\n const el = React.createElement(ImageClozeAssociationComponent, {\n model: this._model,\n session: this._session,\n updateAnswer: this.updateAnswer.bind(this),\n });\n\n ReactDOM.render(el, this, () => {\n renderMath(this);\n });\n }\n }\n}\n"],"file":"index.js"}
|
|
@@ -25,7 +25,7 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
|
25
25
|
|
|
26
26
|
var _core = require("@material-ui/core");
|
|
27
27
|
|
|
28
|
-
var _renderUi = require("@pie-lib/
|
|
28
|
+
var _renderUi = require("@pie-lib/render-ui");
|
|
29
29
|
|
|
30
30
|
var _evaluationIcon = _interopRequireDefault(require("./evaluation-icon"));
|
|
31
31
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/interactive-section.jsx"],"names":["InteractiveSection","props","classes","responseCorrect","styleProp","undefined","choicePosition","flexDirection","children","uiStyle","classname","getClassname","possibilityListPosition","style","getPositionDirection","evaluationStyle","display","margin","marginTop","React","Component","propTypes","PropTypes","object","oneOfType","element","array","isRequired","bool","number","defaultProps","styles","theme","baseInteractiveStyle","spacing","unit","width","interactiveDefault","border","color","disabled","interactiveCorrect","correct","interactiveIncorrect","incorrect"],"mappings":"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","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core';\nimport { color } from '@pie-lib/
|
|
1
|
+
{"version":3,"sources":["../src/interactive-section.jsx"],"names":["InteractiveSection","props","classes","responseCorrect","styleProp","undefined","choicePosition","flexDirection","children","uiStyle","classname","getClassname","possibilityListPosition","style","getPositionDirection","evaluationStyle","display","margin","marginTop","React","Component","propTypes","PropTypes","object","oneOfType","element","array","isRequired","bool","number","defaultProps","styles","theme","baseInteractiveStyle","spacing","unit","width","interactiveDefault","border","color","disabled","interactiveCorrect","correct","interactiveIncorrect","incorrect"],"mappings":"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","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core';\nimport { color } from '@pie-lib/render-ui';\n\nimport EvaluationIcon from './evaluation-icon';\n\nclass InteractiveSection extends React.Component {\n getClassname() {\n const { classes, responseCorrect } = this.props;\n let styleProp;\n\n switch (responseCorrect) {\n case undefined:\n styleProp = 'interactiveDefault';\n break;\n case true:\n styleProp = 'interactiveCorrect';\n break;\n default:\n styleProp = 'interactiveIncorrect';\n break;\n }\n return classes[styleProp];\n }\n\n getPositionDirection(choicePosition) {\n let flexDirection;\n\n switch (choicePosition) {\n case 'left':\n flexDirection = 'row-reverse';\n break;\n case 'right':\n flexDirection = 'row';\n break;\n case 'top':\n flexDirection = 'column-reverse';\n break;\n default:\n // bottom\n flexDirection = 'column';\n break;\n }\n\n return flexDirection;\n }\n\n render() {\n const { children, responseCorrect, uiStyle } = this.props;\n const classname = this.getClassname();\n const { possibilityListPosition = 'bottom' } = uiStyle || {};\n const style = { flexDirection: this.getPositionDirection(possibilityListPosition) };\n const evaluationStyle = {\n display: 'flex',\n margin: '0 auto',\n marginTop: -14,\n };\n\n return (\n <div className={classname} style={style}>\n <EvaluationIcon containerStyle={evaluationStyle} filled isCorrect={responseCorrect} />\n {children}\n </div>\n );\n }\n}\n\nInteractiveSection.propTypes = {\n classes: PropTypes.object,\n children: PropTypes.oneOfType([PropTypes.element, PropTypes.array]).isRequired,\n responseCorrect: PropTypes.oneOfType([PropTypes.bool, PropTypes.number]),\n uiStyle: PropTypes.object,\n};\n\nInteractiveSection.defaultProps = {\n classes: {},\n responseCorrect: undefined,\n};\n\nconst styles = (theme) => {\n const baseInteractiveStyle = {\n marginTop: theme.spacing.unit * 2,\n display: 'flex',\n width: 'fit-content',\n };\n\n return {\n interactiveDefault: {\n ...baseInteractiveStyle,\n border: `1px solid ${color.disabled()}`,\n },\n interactiveCorrect: {\n ...baseInteractiveStyle,\n border: `2px solid ${color.correct()}`,\n },\n interactiveIncorrect: {\n ...baseInteractiveStyle,\n border: `2px solid ${color.incorrect()}`,\n },\n };\n};\n\nexport default withStyles(styles)(InteractiveSection);\n"],"file":"interactive-section.js"}
|
package/lib/possible-response.js
CHANGED
|
@@ -29,9 +29,9 @@ var _classnames = _interopRequireDefault(require("classnames"));
|
|
|
29
29
|
|
|
30
30
|
var _styles = require("@material-ui/core/styles");
|
|
31
31
|
|
|
32
|
-
var _drag = require("@pie-lib/
|
|
32
|
+
var _drag = require("@pie-lib/drag");
|
|
33
33
|
|
|
34
|
-
var _renderUi = require("@pie-lib/
|
|
34
|
+
var _renderUi = require("@pie-lib/render-ui");
|
|
35
35
|
|
|
36
36
|
var _reactDom = _interopRequireDefault(require("react-dom"));
|
|
37
37
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/possible-response.jsx"],"names":["PossibleResponse","clearTimeout","longPressTimer","e","preventDefault","setTimeout","startDrag","props","connectDragSource","disabled","rootRef","addEventListener","handleTouchStart","passive","handleTouchEnd","handleTouchMove","removeEventListener","classes","containerStyle","data","answerChoiceTransparency","isCorrect","evaluationStyle","fontSize","position","bottom","right","correctnessClass","undefined","imgRegex","containsImage","test","value","containerClassNames","base","textAnswerChoiceStyle","promptClassNames","span","hiddenSpan","hidden","ref","ReactDOM","findDOMNode","React","Component","propTypes","canDrag","PropTypes","bool","isRequired","object","func","onDragBegin","onDragEnd","defaultProps","styles","backgroundColor","color","white","border","borderDark","display","alignItems","justifyContent","minHeight","width","pointerEvents","padding","margin","transparent","baseCorrect","correct","baseIncorrect","incorrect","background","visibility","Styled","tileSource","beginDrag","id","containerIndex","endDrag","c","types","response","connect","monitor","dragSource","isDragging"],"mappings":"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","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { withStyles } from '@material-ui/core/styles';\nimport { DragSource } from '@pie-lib/pie-toolbox/drag';\nimport { color } from '@pie-lib/pie-toolbox/render-ui';\nimport ReactDOM from 'react-dom';\n\nimport EvaluationIcon from './evaluation-icon';\nimport c from './constants';\nimport StaticHTMLSpan from './static-html-span';\n\nexport class PossibleResponse extends React.Component {\n handleTouchEnd = () => {\n clearTimeout(this.longPressTimer);\n };\n\n handleTouchMove = () => {\n clearTimeout(this.longPressTimer);\n };\n\n handleTouchStart = (e) => {\n e.preventDefault();\n this.longPressTimer = setTimeout(() => {\n this.startDrag();\n }, 500); // start drag after 500ms (touch and hold duration) for chromebooks and other touch devices\n };\n\n componentDidMount() {\n if (this.rootRef) {\n this.rootRef.addEventListener('touchstart', this.handleTouchStart, { passive: false });\n this.rootRef.addEventListener('touchend', this.handleTouchEnd);\n this.rootRef.addEventListener('touchmove', this.handleTouchMove);\n }\n }\n\n componentWillUnmount() {\n if (this.rootRef) {\n this.rootRef.removeEventListener('touchstart', this.handleTouchStart);\n this.rootRef.removeEventListener('touchend', this.handleTouchEnd);\n this.rootRef.removeEventListener('touchmove', this.handleTouchMove);\n }\n }\n\n startDrag = () => {\n const { connectDragSource, disabled } = this.props;\n if (!disabled) {\n connectDragSource(this.rootRef);\n }\n };\n\n render() {\n const { classes, connectDragSource, containerStyle, data, answerChoiceTransparency } = this.props;\n const { isCorrect } = data || {};\n const evaluationStyle = {\n fontSize: 14,\n position: 'absolute',\n bottom: '3px',\n right: '3px',\n };\n const correctnessClass = isCorrect === true ? 'baseCorrect' : isCorrect === false ? 'baseIncorrect' : undefined;\n\n const imgRegex = /<img[^>]+src=\"([^\">]+)\"/;\n const containsImage = imgRegex.test(data.value);\n\n const containerClassNames = classNames([\n classes.base,\n {\n [classes.answerChoiceTransparency]: answerChoiceTransparency,\n [classes[correctnessClass]]: !!correctnessClass,\n [classes.textAnswerChoiceStyle]: !containsImage,\n },\n ]);\n\n const promptClassNames = classNames([\n classes.span,\n { [classes.hiddenSpan]: data.hidden },\n ]);\n\n return connectDragSource(\n <div\n className={containerClassNames}\n style={containerStyle}\n ref={(ref) => {\n //eslint-disable-next-line\n this.rootRef = ReactDOM.findDOMNode(ref);\n }}>\n <StaticHTMLSpan html={data.value} className={promptClassNames}/>\n <EvaluationIcon isCorrect={data.isCorrect} containerStyle={evaluationStyle}/>\n </div>,\n );\n }\n}\n\nPossibleResponse.propTypes = {\n canDrag: PropTypes.bool.isRequired,\n classes: PropTypes.object,\n connectDragSource: PropTypes.func,\n containerStyle: PropTypes.object,\n data: PropTypes.object.isRequired,\n onDragBegin: PropTypes.func.isRequired,\n onDragEnd: PropTypes.func.isRequired,\n answerChoiceTransparency: PropTypes.bool,\n};\n\nPossibleResponse.defaultProps = {\n classes: {},\n connectDragSource: () => {},\n containerStyle: {},\n};\n\nconst styles = () => ({\n base: {\n position: 'relative',\n backgroundColor: color.white(),\n border: `1px solid ${color.borderDark()}`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '28px',\n width: 'fit-content',\n '& span img':{\n // Added for touch devices, for image content.\n // This will prevent the context menu from appearing and not allowing other interactions with the image.\n // If interactions with the image in the token will be requested we should handle only the context Menu.\n pointerEvents: 'none',\n }\n },\n textAnswerChoiceStyle: {\n padding: '0 10px',\n margin: '4px 6px !important',\n },\n answerChoiceTransparency: {\n border: 'none',\n backgroundColor: `${color.transparent()}`,\n\n '&:hover': {\n border: `1px solid ${color.borderDark()}`,\n },\n },\n baseCorrect: {\n border: `2px solid ${color.correct()} !important`,\n },\n baseIncorrect: {\n border: `2px solid ${color.incorrect()} !important`,\n },\n span: {\n backgroundColor: color.background(),\n },\n hiddenSpan: {\n visibility: 'hidden',\n },\n});\n\nconst Styled = withStyles(styles)(PossibleResponse);\n\nconst tileSource = {\n canDrag(props) {\n const { canDrag } = props;\n return canDrag;\n },\n beginDrag(props) {\n const {\n data,\n data: { id, value, containerIndex },\n onDragBegin,\n } = props;\n onDragBegin(data);\n return {\n id,\n value,\n containerIndex,\n };\n },\n endDrag(props) {\n props.onDragEnd();\n },\n};\n\nexport default DragSource(c.types.response, tileSource, (connect, monitor) => ({\n connectDragSource: connect.dragSource(),\n isDragging: monitor.isDragging(),\n}))(Styled);\n"],"file":"possible-response.js"}
|
|
1
|
+
{"version":3,"sources":["../src/possible-response.jsx"],"names":["PossibleResponse","clearTimeout","longPressTimer","e","preventDefault","setTimeout","startDrag","props","connectDragSource","disabled","rootRef","addEventListener","handleTouchStart","passive","handleTouchEnd","handleTouchMove","removeEventListener","classes","containerStyle","data","answerChoiceTransparency","isCorrect","evaluationStyle","fontSize","position","bottom","right","correctnessClass","undefined","imgRegex","containsImage","test","value","containerClassNames","base","textAnswerChoiceStyle","promptClassNames","span","hiddenSpan","hidden","ref","ReactDOM","findDOMNode","React","Component","propTypes","canDrag","PropTypes","bool","isRequired","object","func","onDragBegin","onDragEnd","defaultProps","styles","backgroundColor","color","white","border","borderDark","display","alignItems","justifyContent","minHeight","width","pointerEvents","padding","margin","transparent","baseCorrect","correct","baseIncorrect","incorrect","background","visibility","Styled","tileSource","beginDrag","id","containerIndex","endDrag","c","types","response","connect","monitor","dragSource","isDragging"],"mappings":"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","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { withStyles } from '@material-ui/core/styles';\nimport { DragSource } from '@pie-lib/drag';\nimport { color } from '@pie-lib/render-ui';\nimport ReactDOM from 'react-dom';\n\nimport EvaluationIcon from './evaluation-icon';\nimport c from './constants';\nimport StaticHTMLSpan from './static-html-span';\n\nexport class PossibleResponse extends React.Component {\n handleTouchEnd = () => {\n clearTimeout(this.longPressTimer);\n };\n\n handleTouchMove = () => {\n clearTimeout(this.longPressTimer);\n };\n\n handleTouchStart = (e) => {\n e.preventDefault();\n this.longPressTimer = setTimeout(() => {\n this.startDrag();\n }, 500); // start drag after 500ms (touch and hold duration) for chromebooks and other touch devices\n };\n\n componentDidMount() {\n if (this.rootRef) {\n this.rootRef.addEventListener('touchstart', this.handleTouchStart, { passive: false });\n this.rootRef.addEventListener('touchend', this.handleTouchEnd);\n this.rootRef.addEventListener('touchmove', this.handleTouchMove);\n }\n }\n\n componentWillUnmount() {\n if (this.rootRef) {\n this.rootRef.removeEventListener('touchstart', this.handleTouchStart);\n this.rootRef.removeEventListener('touchend', this.handleTouchEnd);\n this.rootRef.removeEventListener('touchmove', this.handleTouchMove);\n }\n }\n\n startDrag = () => {\n const { connectDragSource, disabled } = this.props;\n if (!disabled) {\n connectDragSource(this.rootRef);\n }\n };\n\n render() {\n const { classes, connectDragSource, containerStyle, data, answerChoiceTransparency } = this.props;\n const { isCorrect } = data || {};\n const evaluationStyle = {\n fontSize: 14,\n position: 'absolute',\n bottom: '3px',\n right: '3px',\n };\n const correctnessClass = isCorrect === true ? 'baseCorrect' : isCorrect === false ? 'baseIncorrect' : undefined;\n\n const imgRegex = /<img[^>]+src=\"([^\">]+)\"/;\n const containsImage = imgRegex.test(data.value);\n\n const containerClassNames = classNames([\n classes.base,\n {\n [classes.answerChoiceTransparency]: answerChoiceTransparency,\n [classes[correctnessClass]]: !!correctnessClass,\n [classes.textAnswerChoiceStyle]: !containsImage,\n },\n ]);\n\n const promptClassNames = classNames([classes.span, { [classes.hiddenSpan]: data.hidden }]);\n\n return connectDragSource(\n <div\n className={containerClassNames}\n style={containerStyle}\n ref={(ref) => {\n //eslint-disable-next-line\n this.rootRef = ReactDOM.findDOMNode(ref);\n }}\n >\n <StaticHTMLSpan html={data.value} className={promptClassNames} />\n <EvaluationIcon isCorrect={data.isCorrect} containerStyle={evaluationStyle} />\n </div>,\n );\n }\n}\n\nPossibleResponse.propTypes = {\n canDrag: PropTypes.bool.isRequired,\n classes: PropTypes.object,\n connectDragSource: PropTypes.func,\n containerStyle: PropTypes.object,\n data: PropTypes.object.isRequired,\n onDragBegin: PropTypes.func.isRequired,\n onDragEnd: PropTypes.func.isRequired,\n answerChoiceTransparency: PropTypes.bool,\n};\n\nPossibleResponse.defaultProps = {\n classes: {},\n connectDragSource: () => {},\n containerStyle: {},\n};\n\nconst styles = () => ({\n base: {\n position: 'relative',\n backgroundColor: color.white(),\n border: `1px solid ${color.borderDark()}`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '28px',\n width: 'fit-content',\n '& span img': {\n // Added for touch devices, for image content.\n // This will prevent the context menu from appearing and not allowing other interactions with the image.\n // If interactions with the image in the token will be requested we should handle only the context Menu.\n pointerEvents: 'none',\n },\n },\n textAnswerChoiceStyle: {\n padding: '0 10px',\n margin: '4px 6px !important',\n },\n answerChoiceTransparency: {\n border: 'none',\n backgroundColor: `${color.transparent()}`,\n\n '&:hover': {\n border: `1px solid ${color.borderDark()}`,\n },\n },\n baseCorrect: {\n border: `2px solid ${color.correct()} !important`,\n },\n baseIncorrect: {\n border: `2px solid ${color.incorrect()} !important`,\n },\n span: {\n backgroundColor: color.background(),\n },\n hiddenSpan: {\n visibility: 'hidden',\n },\n});\n\nconst Styled = withStyles(styles)(PossibleResponse);\n\nconst tileSource = {\n canDrag(props) {\n const { canDrag } = props;\n return canDrag;\n },\n beginDrag(props) {\n const {\n data,\n data: { id, value, containerIndex },\n onDragBegin,\n } = props;\n onDragBegin(data);\n return {\n id,\n value,\n containerIndex,\n };\n },\n endDrag(props) {\n props.onDragEnd();\n },\n};\n\nexport default DragSource(c.types.response, tileSource, (connect, monitor) => ({\n connectDragSource: connect.dragSource(),\n isDragging: monitor.isDragging(),\n}))(Styled);\n"],"file":"possible-response.js"}
|
|
@@ -13,9 +13,9 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
|
13
13
|
|
|
14
14
|
var _core = require("@material-ui/core");
|
|
15
15
|
|
|
16
|
-
var _renderUi = require("@pie-lib/
|
|
16
|
+
var _renderUi = require("@pie-lib/render-ui");
|
|
17
17
|
|
|
18
|
-
var _drag = require("@pie-lib/
|
|
18
|
+
var _drag = require("@pie-lib/drag");
|
|
19
19
|
|
|
20
20
|
var _possibleResponse = _interopRequireDefault(require("./possible-response"));
|
|
21
21
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/possible-responses.jsx"],"names":["PossibleResponses","canDrag","classes","data","onAnswerRemove","onDragBegin","onDragEnd","answerChoiceTransparency","customStyle","isVertical","minHeight","base","pool","map","item","id","margin","propTypes","PropTypes","bool","isRequired","object","array","func","number","defaultProps","styles","theme","backgroundColor","color","background","padding","spacing","unit","display","alignItems","width"],"mappings":";;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AAEA;;AAEA,IAAMA,iBAAiB,GAAG,SAApBA,iBAAoB;AAAA,MACxBC,OADwB,QACxBA,OADwB;AAAA,MAExBC,OAFwB,QAExBA,OAFwB;AAAA,MAGxBC,IAHwB,QAGxBA,IAHwB;AAAA,MAIxBC,cAJwB,QAIxBA,cAJwB;AAAA,MAKxBC,WALwB,QAKxBA,WALwB;AAAA,MAMxBC,SANwB,QAMxBA,SANwB;AAAA,MAOxBC,wBAPwB,QAOxBA,wBAPwB;AAAA,MAQxBC,WARwB,QAQxBA,WARwB;AAAA,MASxBC,UATwB,QASxBA,UATwB;AAAA,MAUxBC,SAVwB,QAUxBA,SAVwB;AAAA,
|
|
1
|
+
{"version":3,"sources":["../src/possible-responses.jsx"],"names":["PossibleResponses","canDrag","classes","data","onAnswerRemove","onDragBegin","onDragEnd","answerChoiceTransparency","customStyle","isVertical","minHeight","base","pool","map","item","id","margin","propTypes","PropTypes","bool","isRequired","object","array","func","number","defaultProps","styles","theme","backgroundColor","color","background","padding","spacing","unit","display","alignItems","width"],"mappings":";;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AAEA;;AAEA,IAAMA,iBAAiB,GAAG,SAApBA,iBAAoB;AAAA,MACxBC,OADwB,QACxBA,OADwB;AAAA,MAExBC,OAFwB,QAExBA,OAFwB;AAAA,MAGxBC,IAHwB,QAGxBA,IAHwB;AAAA,MAIxBC,cAJwB,QAIxBA,cAJwB;AAAA,MAKxBC,WALwB,QAKxBA,WALwB;AAAA,MAMxBC,SANwB,QAMxBA,SANwB;AAAA,MAOxBC,wBAPwB,QAOxBA,wBAPwB;AAAA,MAQxBC,WARwB,QAQxBA,WARwB;AAAA,MASxBC,UATwB,QASxBA,UATwB;AAAA,MAUxBC,SAVwB,QAUxBA,SAVwB;AAAA,sBAYxB;AAAK,IAAA,SAAS,EAAER,OAAO,CAACS,IAAxB;AAA8B,IAAA,KAAK,EAAEH;AAArC,kBACE,gCAAC,6BAAD;AACE,IAAA,OAAO,EAAEN,OAAO,CAACU,IADnB;AAEE,IAAA,QAAQ,EAAE,CAACX,OAFb;AAGE,IAAA,cAAc,EAAEG,cAHlB;AAIE,IAAA,cAAc,EAAEK,UAJlB;AAKE,IAAA,SAAS,EAAEC;AALb,KAOG,CAACP,IAAI,IAAI,EAAT,EAAaU,GAAb,CAAiB,UAACC,IAAD;AAAA,wBAChB,gCAAC,4BAAD;AACE,MAAA,OAAO,EAAEb,OADX;AAEE,MAAA,GAAG,EAAEa,IAAI,CAACC,EAFZ;AAGE,MAAA,IAAI,EAAED,IAHR;AAIE,MAAA,WAAW,EAAET,WAJf;AAKE,MAAA,SAAS,EAAEC,SALb;AAME,MAAA,wBAAwB,EAAEC,wBAN5B;AAOE,MAAA,cAAc,EAAE;AAAES,QAAAA,MAAM,EAAE;AAAV;AAPlB,MADgB;AAAA,GAAjB,CAPH,CADF,CAZwB;AAAA,CAA1B;;AAmCAhB,iBAAiB,CAACiB,SAAlB,GAA8B;AAC5BhB,EAAAA,OAAO,EAAEiB,sBAAUC,IAAV,CAAeC,UADI;AAE5BlB,EAAAA,OAAO,EAAEgB,sBAAUG,MAFS;AAG5BlB,EAAAA,IAAI,EAAEe,sBAAUI,KAAV,CAAgBF,UAHM;AAI5BhB,EAAAA,cAAc,EAAEc,sBAAUK,IAAV,CAAeH,UAJH;AAK5Bf,EAAAA,WAAW,EAAEa,sBAAUK,IAAV,CAAeH,UALA;AAM5Bd,EAAAA,SAAS,EAAEY,sBAAUK,IAAV,CAAeH,UANE;AAO5Bb,EAAAA,wBAAwB,EAAEW,sBAAUC,IAPR;AAQ5BX,EAAAA,WAAW,EAAEU,sBAAUG,MARK;AAS5BZ,EAAAA,UAAU,EAAES,sBAAUC,IATM;AAU5BT,EAAAA,SAAS,EAAEQ,sBAAUM;AAVO,CAA9B;AAaAxB,iBAAiB,CAACyB,YAAlB,GAAiC;AAC/BvB,EAAAA,OAAO,EAAE;AADsB,CAAjC;;AAIA,IAAMwB,MAAM,GAAG,SAATA,MAAS,CAACC,KAAD;AAAA,SAAY;AACzBhB,IAAAA,IAAI,EAAE;AACJiB,MAAAA,eAAe,EAAEC,gBAAMC,UAAN,EADb;AAEJC,MAAAA,OAAO,EAAEJ,KAAK,CAACK,OAAN,CAAcC,IAAd,GAAqB,CAF1B;AAGJC,MAAAA,OAAO,EAAE,MAHL;AAIJC,MAAAA,UAAU,EAAE,QAJR;AAKJC,MAAAA,KAAK,EAAE;AALH;AADmB,GAAZ;AAAA,CAAf;;eAUe,sBAAWV,MAAX,EAAmB1B,iBAAnB,C","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core';\nimport { color } from '@pie-lib/render-ui';\nimport { ICADroppablePlaceholder } from '@pie-lib/drag';\n\nimport PossibleResponse from './possible-response';\n\nconst PossibleResponses = ({\n canDrag,\n classes,\n data,\n onAnswerRemove,\n onDragBegin,\n onDragEnd,\n answerChoiceTransparency,\n customStyle,\n isVertical,\n minHeight,\n}) => (\n <div className={classes.base} style={customStyle}>\n <ICADroppablePlaceholder\n classes={classes.pool}\n disabled={!canDrag}\n onRemoveAnswer={onAnswerRemove}\n isVerticalPool={isVertical}\n minHeight={minHeight}\n >\n {(data || []).map((item) => (\n <PossibleResponse\n canDrag={canDrag}\n key={item.id}\n data={item}\n onDragBegin={onDragBegin}\n onDragEnd={onDragEnd}\n answerChoiceTransparency={answerChoiceTransparency}\n containerStyle={{ margin: '4px' }}\n />\n ))}\n </ICADroppablePlaceholder>\n </div>\n);\n\nPossibleResponses.propTypes = {\n canDrag: PropTypes.bool.isRequired,\n classes: PropTypes.object,\n data: PropTypes.array.isRequired,\n onAnswerRemove: PropTypes.func.isRequired,\n onDragBegin: PropTypes.func.isRequired,\n onDragEnd: PropTypes.func.isRequired,\n answerChoiceTransparency: PropTypes.bool,\n customStyle: PropTypes.object,\n isVertical: PropTypes.bool,\n minHeight: PropTypes.number,\n};\n\nPossibleResponses.defaultProps = {\n classes: {},\n};\n\nconst styles = (theme) => ({\n base: {\n backgroundColor: color.background(),\n padding: theme.spacing.unit * 2,\n display: 'flex',\n alignItems: 'center',\n width: 'fit-content',\n },\n});\n\nexport default withStyles(styles)(PossibleResponses);\n"],"file":"possible-responses.js"}
|
package/lib/root.js
CHANGED
|
@@ -29,19 +29,19 @@ var _react = _interopRequireDefault(require("react"));
|
|
|
29
29
|
|
|
30
30
|
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
31
31
|
|
|
32
|
-
var _drag = require("@pie-lib/
|
|
32
|
+
var _drag = require("@pie-lib/drag");
|
|
33
33
|
|
|
34
34
|
var _reactTransitionGroup = require("react-transition-group");
|
|
35
35
|
|
|
36
|
-
var _renderUi = require("@pie-lib/
|
|
36
|
+
var _renderUi = require("@pie-lib/render-ui");
|
|
37
37
|
|
|
38
38
|
var _styles = require("@material-ui/core/styles");
|
|
39
39
|
|
|
40
40
|
var _NotInterested = _interopRequireDefault(require("@material-ui/icons/NotInterested"));
|
|
41
41
|
|
|
42
|
-
var _correctAnswerToggle = require("@pie-lib/
|
|
42
|
+
var _correctAnswerToggle = _interopRequireDefault(require("@pie-lib/correct-answer-toggle"));
|
|
43
43
|
|
|
44
|
-
var _translator = _interopRequireDefault(require("@pie-lib/
|
|
44
|
+
var _translator = _interopRequireDefault(require("@pie-lib/translator"));
|
|
45
45
|
|
|
46
46
|
var _groupBy = _interopRequireDefault(require("lodash/groupBy"));
|
|
47
47
|
|
|
@@ -418,7 +418,7 @@ var ImageClozeAssociationComponent = /*#__PURE__*/function (_React$Component) {
|
|
|
418
418
|
customAudioButton: customAudioButton
|
|
419
419
|
}), /*#__PURE__*/_react["default"].createElement(_renderUi.PreviewPrompt, {
|
|
420
420
|
prompt: stimulus
|
|
421
|
-
}), /*#__PURE__*/_react["default"].createElement(_correctAnswerToggle
|
|
421
|
+
}), /*#__PURE__*/_react["default"].createElement(_correctAnswerToggle["default"], {
|
|
422
422
|
show: showToggle,
|
|
423
423
|
toggled: showCorrect,
|
|
424
424
|
onToggle: this.toggleCorrect,
|
package/lib/root.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/root.jsx"],"names":["translator","Translator","generateId","Math","random","toString","substring","Date","getTime","styles","theme","main","color","text","backgroundColor","background","position","maxWidth","height","teacherInstructions","marginBottom","spacing","unit","rationale","marginTop","ImageClozeAssociationComponent","props","draggingElement","setState","id","value","possibleResponses","answer","filter","response","responseContainerIndex","duplicateResponses","model","updateAnswer","state","answers","maxResponsePerZone","answersToStore","answersInThisContainer","answersInOtherContainers","forEach","a","containerIndex","push","length","shiftedItem","shift","maxResponsePerZoneWarning","Array","isArray","undefined","filterPossibleAnswers","shouldNotPushInPossibleResponses","showCorrect","responseContainers","session","possibleResponsesWithIds","map","item","index","groupedAnswers","limitedAnswers","grp","slice","possibleResponsesFiltered","find","classes","disabled","extraCSSRules","image","responseAreaFill","stimulus","responseCorrect","validation","prompt","autoplayAudioEnabled","showDashedBorder","mode","language","uiStyle","answerChoiceTransparency","responseContainerPadding","imageDropTargetPadding","fontSizeFactor","customAudioButton","isEvaluateMode","showToggle","possibilityListPosition","isVertical","validResponse","correctAnswers","showRationale","showTeacherInstructions","container","i","images","v","isCorrect","warningMessage","t","lng","count","answersToShow","sharedImageProps","onAnswerSelect","handleOnAnswerSelect","onDragAnswerBegin","beginDrag","onDragAnswerEnd","handleOnDragEnd","renderImage","renderPossibleResponses","handleOnAnswerRemove","minWidth","width","hidden","visible","toggleCorrect","React","Component","WarningInfo","warning","margin","padding","display","alignItems","message","paddingLeft","userSelect","__html","propTypes","PropTypes","string","object","isRequired","func","defaultProps","StyledComponent"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAGA;;AACA;;AACA;;AACA;;;;;;;;;;AAJA,IAAQA,UAAR,GAAuBC,sBAAvB,CAAQD,UAAR;;AAMA,IAAME,UAAU,GAAG,SAAbA,UAAa;AAAA,SAAMC,IAAI,CAACC,MAAL,GAAcC,QAAd,CAAuB,EAAvB,EAA2BC,SAA3B,CAAqC,CAArC,IAA0C,IAAIC,IAAJ,GAAWC,OAAX,GAAqBH,QAArB,CAA8B,EAA9B,CAAhD;AAAA,CAAnB;;AAEA,IAAMI,MAAM,GAAG,SAATA,MAAS,CAACC,KAAD;AAAA,SAAY;AACzBC,IAAAA,IAAI,EAAE;AACJC,MAAAA,KAAK,EAAEA,gBAAMC,IAAN,EADH;AAEJC,MAAAA,eAAe,EAAEF,gBAAMG,UAAN,EAFb;AAGJC,MAAAA,QAAQ,EAAE,UAHN;AAIJ,eAAS;AACPC,QAAAA,QAAQ,EAAE,MADH;AAEPC,QAAAA,MAAM,EAAE;AAFD;AAJL,KADmB;AAUzBC,IAAAA,mBAAmB,EAAE;AACnBC,MAAAA,YAAY,EAAEV,KAAK,CAACW,OAAN,CAAcC,IAAd,GAAqB;AADhB,KAVI;AAazBC,IAAAA,SAAS,EAAE;AACTC,MAAAA,SAAS,EAAEd,KAAK,CAACW,OAAN,CAAcC,IAAd,GAAqB;AADvB;AAbc,GAAZ;AAAA,CAAf;;IAkBaG,8B;;;;;AACX,0CAAYC,KAAZ,EAAmB;AAAA;;AAAA;AACjB,8BAAMA,KAAN;AADiB,kGAwCP,UAACC,eAAD,EAAqB;AAC/B,YAAKC,QAAL,CAAc;AACZD,QAAAA,eAAe,EAAfA;AADY,OAAd;AAGD,KA5CkB;AAAA,wGA8CD,YAAM;AACtB,YAAKC,QAAL,CAAc;AACZD,QAAAA,eAAe,EAAE;AAAEE,UAAAA,EAAE,EAAE,EAAN;AAAUC,UAAAA,KAAK,EAAE;AAAjB;AADL,OAAd;AAGD,KAlDkB;AAAA,8GAoDK,UAACC,iBAAD,EAAoBC,MAApB;AAAA,aACtBD,iBAAiB,CAACE,MAAlB,CAAyB,UAAAC,QAAQ;AAAA,eAAIA,QAAQ,CAACJ,KAAT,KAAmBE,MAAM,CAACF,KAA9B;AAAA,OAAjC,CADsB;AAAA,KApDL;AAAA,6GAuDI,UAACE,MAAD,EAASG,sBAAT,EAAoC;AACzD,wBAGI,MAAKT,KAHT;AAAA,UACWU,kBADX,eACEC,KADF,CACWD,kBADX;AAAA,UAEEE,YAFF,eAEEA,YAFF;AAIA,wBAAwC,MAAKC,KAA7C;AAAA,UAAQC,OAAR,eAAQA,OAAR;AAAA,UAAiBC,kBAAjB,eAAiBA,kBAAjB;AACA,UAAMV,iBAAN,GAA4B,MAAKQ,KAAjC,CAAMR,iBAAN;AACA,UAAIW,cAAJ;AAEA,UAAMC,sBAAsB,GAAG,EAA/B;AACA,UAAMC,wBAAwB,GAAG,EAAjC;AAEAJ,MAAAA,OAAO,CAACK,OAAR,CAAgB,UAACC,CAAD,EAAO;AACrB,YAAIA,CAAC,CAACC,cAAF,KAAqBZ,sBAAzB,EAAiD;AAC/CQ,UAAAA,sBAAsB,CAACK,IAAvB,CAA4BF,CAA5B;AACD,SAFD,MAEO;AACLF,UAAAA,wBAAwB,CAACI,IAAzB,CAA8BF,CAA9B;AACD;AACF,OAND;;AAQA,UAAIL,kBAAkB,KAAKE,sBAAsB,CAACM,MAAlD,EAA0D;AACxD,YAAMC,WAAW,GAAGP,sBAAsB,CAAC,CAAD,CAA1C;;AACA,YAAIF,kBAAkB,KAAK,CAA3B,EAA8B;AAC5BE,UAAAA,sBAAsB,CAACQ,KAAvB,GAD4B,CACI;AACjC,SAFD,MAEO;AACL,gBAAKvB,QAAL,CAAc;AAAEwB,YAAAA,yBAAyB,EAAE;AAA7B,WAAd;;AACA;AACD,SAPuD,CASxD;;;AACA,YAAI,CAAChB,kBAAL,EAAyB;AACvBL,UAAAA,iBAAiB,GAAGsB,KAAK,CAACC,OAAN,CAAcvB,iBAAd,IAAmCA,iBAAnC,GAAuD,EAA3E;AAEAA,UAAAA,iBAAiB,CAACiB,IAAlB,iCACKE,WADL;AAEEH,YAAAA,cAAc,EAAEQ,SAFlB;AAGE1B,YAAAA,EAAE,EAAEqB,WAAW,CAACrB,EAAZ,IAAkB3B,UAAU;AAHlC;AAKD,SAlBuD,CAoBxD;AACA;AACA;AACA;AACA;;;AACAwC,QAAAA,cAAc,aACTC,sBADS,sCAITC,wBAAwB,CAACX,MAAzB,CAAgC,UAACa,CAAD;AAAA,iBAAQV,kBAAkB,GAAG,IAAH,GAAUU,CAAC,CAAChB,KAAF,KAAYE,MAAM,CAACF,KAAvD;AAAA,SAAhC,CAJS,IAIuF;AAJvF,wCAMPE,MANO;AAOVe,UAAAA,cAAc,EAAEZ;AAPN,WAQNC,kBAAkB,GAAG;AAAEP,UAAAA,EAAE,EAAE3B,UAAU;AAAhB,SAAH,GAA0B,EARtC,GAAd;AAWD,OApCD,MAoCO;AACL;AACA;AACA;AACA;AACAwC,QAAAA,cAAc,iDAGTF,OAAO,CAACP,MAAR,CAAe,UAACa,CAAD;AAAA,iBAAQV,kBAAkB,GAAGU,CAAC,CAACjB,EAAF,KAASG,MAAM,CAACH,EAAnB,GAAwBiB,CAAC,CAAChB,KAAF,KAAYE,MAAM,CAACF,KAArE;AAAA,SAAf,CAHS,oCAKPE,MALO;AAMVe,UAAAA,cAAc,EAAEZ;AANN,WAONC,kBAAkB,GAAG;AAAEP,UAAAA,EAAE,EAAE3B,UAAU;AAAhB,SAAH,GAA0B,EAPtC,GAAd;AAUD;;AACD,YAAK0B,QAAL,CAAc;AACZwB,QAAAA,yBAAyB,EAAE,KADf;AAEZZ,QAAAA,OAAO,EAAEE,cAFG;AAGZX,QAAAA,iBAAiB,EACf;AACAK,QAAAA,kBAAkB,GAAGL,iBAAH,GAAuB,MAAKyB,qBAAL,CAA2BzB,iBAA3B,EAA8CC,MAA9C;AAL/B,OAAd;;AAOAM,MAAAA,YAAY,CAACI,cAAD,CAAZ;AACD,KAvIkB;AAAA,6GAyII,UAACV,MAAD,EAAY;AACjC,yBAGI,MAAKN,KAHT;AAAA,UACWU,kBADX,gBACEC,KADF,CACWD,kBADX;AAAA,UAEEE,YAFF,gBAEEA,YAFF;AAIA,yBAAuC,MAAKC,KAA5C;AAAA,UAAQC,OAAR,gBAAQA,OAAR;AAAA,UAAiBT,iBAAjB,gBAAiBA,iBAAjB;AACA,UAAMW,cAAc,GAAGF,OAAO,CAACP,MAAR,CAAe,UAACa,CAAD;AAAA,eAAOA,CAAC,CAACjB,EAAF,KAASG,MAAM,CAACH,EAAvB;AAAA,OAAf,CAAvB;AACA,UAAM4B,gCAAgC,GAAGzB,MAAM,CAACe,cAAP,KAA0BQ,SAAnE,CAPiC,CAO6C;;AAE9E,YAAK3B,QAAL,CAAc;AACZwB,QAAAA,yBAAyB,EAAE,KADf;AAEZZ,QAAAA,OAAO,EAAEE,cAFG;AAGZ;AACAX,QAAAA,iBAAiB,EACfK,kBAAkB,IAAIqB,gCAAtB,GACI1B,iBADJ,iDAGOA,iBAHP,oCAKSC,MALT;AAMMe,UAAAA,cAAc,EAAEQ;AANtB;AALU,OAAd;;AAeAjB,MAAAA,YAAY,CAACI,cAAD,CAAZ;AACD,KAlKkB;AAAA,sGAoKH,UAACgB,WAAD;AAAA,aAAiB,MAAK9B,QAAL,CAAc;AAAE8B,QAAAA,WAAW,EAAXA;AAAF,OAAd,CAAjB;AAAA,KApKG;AAEjB,uBAGIhC,KAHJ,CACEW,KADF;AAAA,QACWN,kBADX,gBACWA,iBADX;AAAA,QAC8B4B,kBAD9B,gBAC8BA,kBAD9B;AAAA,QACkDvB,mBADlD,gBACkDA,kBADlD;AAAA,QACsEK,mBADtE,gBACsEA,kBADtE;AAAA,QAEEmB,OAFF,GAGIlC,KAHJ,CAEEkC,OAFF;;AAIA,eAAkBA,OAAO,IAAI,EAA7B;AAAA,QAAMpB,QAAN,QAAMA,OAAN,CANiB,CAOjB;;;AACA,QAAMqB,wBAAwB,GAAG,CAAC9B,kBAAiB,IAAI,EAAtB,EAA0B+B,GAA1B,CAA8B,UAACC,IAAD,EAAOC,KAAP;AAAA,aAAkB;AAC/ElC,QAAAA,KAAK,EAAEiC,IADwE;AAE/ElC,QAAAA,EAAE,YAAKmC,KAAL;AAF6E,OAAlB;AAAA,KAA9B,CAAjC;;AAKA,QAAIC,cAAc,GAAG,yBAAQzB,QAAO,IAAI,EAAnB,EAAuB,gBAAvB,CAArB,CAbiB,CAcjB;;AACA,QAAI0B,cAAc,GAAG,yBAAQD,cAAR,EAAwB,UAACE,GAAD;AAAA,aAASA,GAAG,CAACC,KAAJ,CAAU,EAAE3B,mBAAkB,IAAI,CAAxB,CAAV,CAAT;AAAA,KAAxB,CAArB;AACAD,IAAAA,QAAO,GAAG0B,cAAc,CACtB;AADsB,KAErBJ,GAFO,CAEH,UAAC9B,MAAD,EAASgC,KAAT;AAAA,6CAAyBhC,MAAzB;AAAiCH,QAAAA,EAAE,YAAKmC,KAAL;AAAnC;AAAA,KAFG,EAGR;AAHQ,KAIP/B,MAJO,CAIA,UAACD,MAAD;AAAA,aAAYA,MAAM,CAACe,cAAP,GAAwBY,kBAAkB,CAACV,MAAvD;AAAA,KAJA,CAAV;AAMA,QAAMoB,yBAAyB,GAAGR,wBAAwB,CAAC5B,MAAzB,CAChC,UAACC,QAAD;AAAA,aAAc,CAACM,QAAO,CAAC8B,IAAR,CAAa,UAACtC,MAAD;AAAA,eAAYA,MAAM,CAACF,KAAP,KAAiBI,QAAQ,CAACJ,KAAtC;AAAA,OAAb,CAAf;AAAA,KADgC,CAAlC;AAGA,UAAKS,KAAL,GAAa;AACXC,MAAAA,OAAO,EAAEA,QAAO,IAAI,EADT;AAEXb,MAAAA,eAAe,EAAE;AAAEE,QAAAA,EAAE,EAAE,EAAN;AAAUC,QAAAA,KAAK,EAAE;AAAjB,OAFN;AAGXC,MAAAA,iBAAiB,EAAEK,mBAAkB,GAAGyB,wBAAH,GAA8BQ,yBAHxD;AAIX;AACAV,MAAAA,kBAAkB,EAAE,CAACA,kBAAkB,IAAI,EAAvB,EAA2BG,GAA3B,CAA+B,UAACC,IAAD,EAAOC,KAAP;AAAA;AACjDA,UAAAA,KAAK,EAALA;AADiD,WAE9CD,IAF8C;AAGjDlC,UAAAA,EAAE,YAAKmC,KAAL;AAH+C;AAAA,OAA/B,CALT;AAUXvB,MAAAA,kBAAkB,EAAEA,mBAAkB,IAAI,CAV/B;AAWXiB,MAAAA,WAAW,EAAE;AAXF,KAAb;AAzBiB;AAsClB;;;;WAgID,kBAAS;AAAA;;AACP,yBAyBI,KAAKhC,KAzBT;AAAA,UACE6C,OADF,gBACEA,OADF;AAAA,4CAEElC,KAFF;AAAA,UAGImC,QAHJ,sBAGIA,QAHJ;AAAA,UAIIpC,kBAJJ,sBAIIA,kBAJJ;AAAA,UAKIqC,aALJ,sBAKIA,aALJ;AAAA,UAMIC,KANJ,sBAMIA,KANJ;AAAA,UAOIC,gBAPJ,sBAOIA,gBAPJ;AAAA,UAQIC,QARJ,sBAQIA,QARJ;AAAA,UASIC,eATJ,sBASIA,eATJ;AAAA,UAUIC,UAVJ,sBAUIA,UAVJ;AAAA,UAWI3D,mBAXJ,sBAWIA,mBAXJ;AAAA,UAYI4D,MAZJ,sBAYIA,MAZJ;AAAA,UAaIC,oBAbJ,sBAaIA,oBAbJ;AAAA,UAcIC,gBAdJ,sBAcIA,gBAdJ;AAAA,UAeIC,IAfJ,sBAeIA,IAfJ;AAAA,UAgBI3D,SAhBJ,sBAgBIA,SAhBJ;AAAA,UAiBI4D,QAjBJ,sBAiBIA,QAjBJ;AAAA,qDAkBIC,OAlBJ;AAAA,UAkBIA,OAlBJ,sCAkBc,EAlBd;AAAA,UAmBIC,wBAnBJ,sBAmBIA,wBAnBJ;AAAA,UAoBIC,wBApBJ,sBAoBIA,wBApBJ;AAAA,UAqBIC,sBArBJ,sBAqBIA,sBArBJ;AAAA,UAsBIC,cAtBJ,sBAsBIA,cAtBJ;AAAA,UAuBIC,iBAvBJ,sBAuBIA,iBAvBJ;AA0BA,yBAQI,KAAKlD,KART;AAAA,UACEC,OADF,gBACEA,OADF;AAAA,UAEEb,eAFF,gBAEEA,eAFF;AAAA,UAGEI,iBAHF,gBAGEA,iBAHF;AAAA,UAIE4B,kBAJF,gBAIEA,kBAJF;AAAA,UAKElB,kBALF,gBAKEA,kBALF;AAAA,UAMEW,yBANF,gBAMEA,yBANF;AAAA,UAOEM,WAPF,gBAOEA,WAPF;AASA,UAAMgC,cAAc,GAAGR,IAAI,KAAK,UAAhC;AACA,UAAMS,UAAU,GAAGD,cAAc,IAAI,CAACb,eAAtC;;AACA,kBAA+CO,OAAO,IAAI,EAA1D;AAAA,wCAAQQ,uBAAR;AAAA,UAAQA,uBAAR,sCAAkC,QAAlC;;AACA,UAAMC,UAAU,GAAGD,uBAAuB,KAAK,MAA5B,IAAsCA,uBAAuB,KAAK,OAArF;;AAEA,kBAA0Bd,UAAU,IAAI,EAAxC;AAAA,UAAQgB,aAAR,SAAQA,aAAR;;AACA,UAAMC,cAAc,GAAG,EAAvB;AACA,UAAMC,aAAa,GAAGzE,SAAS,KAAK,uBAAQA,SAAR,KAAsB,wBAASA,SAAT,CAA3B,CAA/B;AACA,UAAM0E,uBAAuB,GAAG9E,mBAAmB,KAAK,uBAAQA,mBAAR,KAAgC,wBAASA,mBAAT,CAArC,CAAnD;;AAEA,UAAI2E,aAAJ,EAAmB;AACjB,SAACA,aAAa,CAAChE,KAAd,IAAuB,EAAxB,EAA4Be,OAA5B,CAAoC,UAACqD,SAAD,EAAYC,CAAZ,EAAkB;AACpD,WAACD,SAAS,CAACE,MAAV,IAAoB,EAArB,EAAyBvD,OAAzB,CAAiC,UAACwD,CAAD,EAAO;AACtCN,YAAAA,cAAc,CAAC/C,IAAf,CAAoB;AAClBlB,cAAAA,KAAK,EAAEuE,CADW;AAElBtD,cAAAA,cAAc,EAAEoD,CAFE;AAGlBG,cAAAA,SAAS,EAAE;AAHO,aAApB;AAKD,WAND;AAOD,SARD;AASD;;AAED,UAAMC,cAAc,GAAGvG,UAAU,CAACwG,CAAX,CAAa,0CAAb,EAAyD;AAC9EC,QAAAA,GAAG,EAAEtB,QADyE;AAE9EuB,QAAAA,KAAK,EAAEjE;AAFuE,OAAzD,CAAvB;AAKA,UAAIkE,aAAa,GACf9B,eAAe,KAAKtB,SAApB,GAAgC,6CAAsBf,OAAtB,EAA+BsC,UAA/B,EAA2C1C,kBAA3C,CAAhC,GAAiGI,OADnG;;AAGA,UAAIqC,eAAe,KAAK,KAApB,IAA6BpC,kBAAkB,KAAK,CAAxD,EAA2D;AACzDkE,QAAAA,aAAa,iDAAOA,aAAP,uCAAyB,4CAAqBA,aAArB,EAAoC7B,UAApC,CAAzB,EAAb;AACD;;AAED,UAAM8B,gBAAgB,GAAG;AACvBjF,QAAAA,eAAe,EAAfA,eADuB;AAEvBS,QAAAA,kBAAkB,EAAlBA,kBAFuB;AAGvBsC,QAAAA,KAAK,EAALA,KAHuB;AAIvBmC,QAAAA,cAAc,EAAE,KAAKC,oBAJE;AAKvBC,QAAAA,iBAAiB,EAAE,KAAKC,SALD;AAMvBC,QAAAA,eAAe,EAAE,KAAKC,eANC;AAOvBvD,QAAAA,kBAAkB,EAAlBA,kBAPuB;AAQvBsB,QAAAA,gBAAgB,EAAhBA,gBARuB;AASvBN,QAAAA,gBAAgB,EAAhBA,gBATuB;AAUvBW,QAAAA,wBAAwB,EAAxBA,wBAVuB;AAWvBC,QAAAA,sBAAsB,EAAtBA,sBAXuB;AAYvB9C,QAAAA,kBAAkB,EAAlBA;AAZuB,OAAzB;;AAeA,UAAM0E,WAAW,GAAG,SAAdA,WAAc;AAAA,4BAClB,gCAAC,0BAAD,gCACMP,gBADN;AAEE,UAAA,OAAO,EAAElD,WAAW,IAAIiC,UAAf,GAA4B,KAA5B,GAAoC,CAACnB,QAFhD;AAGE,UAAA,OAAO,EAAEd,WAAW,IAAIiC,UAAf,GAA4BI,cAA5B,GAA6CY,aAHxD;AAIE,UAAA,wBAAwB,EACtB,EAAEjD,WAAW,IAAIiC,UAAjB,IAA+BN,wBAA/B,GAA0D9B;AAL9D,WADkB;AAAA,OAApB;;AAWA,UAAM6D,uBAAuB,GAAG,SAA1BA,uBAA0B,GAAM;AACpC,YAAI1D,WAAW,IAAIiC,UAAnB,EAA+B,OAAO,IAAP;AAE/B,4BACE,gCAAC,iBAAD,CAAO,QAAP,QACGvC,yBAAyB,iBAAI,gCAAC,WAAD;AAAa,UAAA,OAAO,EAAEmD;AAAtB,UADhC,eAEE,gCAAC,8BAAD;AACE,UAAA,OAAO,EAAE,CAAC/B,QADZ;AAEE,UAAA,IAAI,EAAEzC,iBAFR;AAGE,UAAA,cAAc,EAAE,MAAI,CAACsF,oBAHvB;AAIE,UAAA,WAAW,EAAE,MAAI,CAACL,SAJpB;AAKE,UAAA,SAAS,EAAE,MAAI,CAACE,eALlB;AAME,UAAA,wBAAwB,EAAE7B,wBAN5B;AAOE,UAAA,WAAW,EAAE;AACXiC,YAAAA,QAAQ,EAAEzB,UAAU,GAAG,OAAH,GAAa,CAAAnB,KAAK,SAAL,IAAAA,KAAK,WAAL,YAAAA,KAAK,CAAE6C,KAAP,KAAgB;AADtC,WAPf;AAUE,UAAA,UAAU,EAAE1B,UAVd;AAWE,UAAA,SAAS,EAAEA,UAAU,GAAGnB,KAAH,aAAGA,KAAH,uBAAGA,KAAK,CAAExD,MAAV,GAAmBqC;AAX1C,UAFF,CADF;AAkBD,OArBD;;AAuBA,0BACE,gCAAC,kBAAD;AAAU,QAAA,aAAa,EAAEkB,aAAzB;AAAwC,QAAA,EAAE,EAAE,gBAA5C;AAA8D,QAAA,SAAS,EAAEF,OAAO,CAAC5D,IAAjF;AAAuF,QAAA,cAAc,EAAE6E;AAAvG,SACGS,uBAAuB,iBACtB,gCAAC,qBAAD;AACE,QAAA,SAAS,EAAE1B,OAAO,CAACpD,mBADrB;AAEE,QAAA,MAAM,EAAE;AACNqG,UAAAA,MAAM,EAAE,2BADF;AAENC,UAAAA,OAAO,EAAE;AAFH;AAFV,sBAOE,gCAAC,uBAAD;AAAe,QAAA,MAAM,EAAEtG;AAAvB,QAPF,CAFJ,eAaE,gCAAC,uBAAD;AACE,QAAA,SAAS,EAAC,QADZ;AAEE,QAAA,MAAM,EAAE4D,MAFV;AAGE,QAAA,oBAAoB,EAAEC,oBAHxB;AAIE,QAAA,iBAAiB,EAAES;AAJrB,QAbF,eAoBE,gCAAC,uBAAD;AAAe,QAAA,MAAM,EAAEb;AAAvB,QApBF,eAsBE,gCAAC,wCAAD;AACE,QAAA,IAAI,EAAEe,UADR;AAEE,QAAA,OAAO,EAAEjC,WAFX;AAGE,QAAA,QAAQ,EAAE,KAAKgE,aAHjB;AAIE,QAAA,QAAQ,EAAEvC;AAJZ,QAtBF,eA6BE,gCAAC,8BAAD;AACE,QAAA,eAAe,EAAEzB,WAAW,IAAIiC,UAAf,GAA4B,IAA5B,GAAmCd,eADtD;AAEE,QAAA,OAAO,EAAEO;AAFX,SAIG+B,WAAW,EAJd,EAKGC,uBAAuB,EAL1B,CA7BF,EAqCGpB,aAAa,iBACZ,gCAAC,qBAAD;AACE,QAAA,SAAS,EAAEzB,OAAO,CAAChD,SADrB;AAEE,QAAA,MAAM,EAAE;AACNiG,UAAAA,MAAM,EAAE,gBADF;AAENC,UAAAA,OAAO,EAAE;AAFH;AAFV,sBAOE,gCAAC,uBAAD;AAAe,QAAA,MAAM,EAAElG;AAAvB,QAPF,CAtCJ,CADF;AAmDD;;;EAjViDoG,kBAAMC,S;;;AAoV1D,IAAMC,WAAW,GAAG,wBAAW,UAACnH,KAAD;AAAA,SAAY;AACzCoH,IAAAA,OAAO,EAAE;AACPC,MAAAA,MAAM,cAAOrH,KAAK,CAACW,OAAN,CAAcC,IAAd,GAAqB,CAA5B,OADC;AAEPR,MAAAA,eAAe,EAAE,SAFV;AAGPkH,MAAAA,OAAO,EAAEtH,KAAK,CAACW,OAAN,CAAcC,IAHhB;AAIP2G,MAAAA,OAAO,EAAE,MAJF;AAKPC,MAAAA,UAAU,EAAE,QALL;AAMP,eAAS;AACPhH,QAAAA,MAAM,EAAE;AADD,OANF;AASP,cAAQ;AACN8G,QAAAA,OAAO,EAAE,KADH;AAEND,QAAAA,MAAM,EAAE;AAFF;AATD,KADgC;AAezCI,IAAAA,OAAO,EAAE;AACPC,MAAAA,WAAW,EAAE1H,KAAK,CAACW,OAAN,CAAcC,IAAd,GAAqB,CAD3B;AAEP+G,MAAAA,UAAU,EAAE;AAFL;AAfgC,GAAZ;AAAA,CAAX,EAmBhB;AAAA,MAAG9D,OAAH,SAAGA,OAAH;AAAA,MAAY4D,OAAZ,SAAYA,OAAZ;AAAA,sBACF,gCAAC,qCAAD,qBACE,gCAAC,mCAAD;AAAe,IAAA,UAAU,EAAE,IAA3B;AAAiC,IAAA,GAAG,EAAC,IAArC;AAA0C,IAAA,OAAO,EAAE;AAAnD,kBACE;AAAK,IAAA,GAAG,EAAC,OAAT;AAAiB,IAAA,SAAS,EAAE5D,OAAO,CAACuD;AAApC,kBACE,gCAAC,yBAAD;AAAmB,IAAA,KAAK,EAAE,WAA1B;AAAuC,IAAA,QAAQ,EAAE;AAAjD,IADF,eAEE;AAAM,IAAA,SAAS,EAAEvD,OAAO,CAAC4D,OAAzB;AAAkC,IAAA,uBAAuB,EAAE;AAAEG,MAAAA,MAAM,EAAEH;AAAV;AAA3D,IAFF,CADF,CADF,CADE;AAAA,CAnBgB,CAApB;AA8BAN,WAAW,CAACU,SAAZ,GAAwB;AACtBJ,EAAAA,OAAO,EAAEK,sBAAUC,MADG;AAEtBlE,EAAAA,OAAO,EAAEiE,sBAAUE,MAAV,CAAiBC;AAFJ,CAAxB;AAKAlH,8BAA8B,CAAC8G,SAA/B,GAA2C;AACzChE,EAAAA,OAAO,EAAEiE,sBAAUE,MADsB;AAEzCrG,EAAAA,KAAK,EAAEmG,sBAAUE,MAAV,CAAiBC,UAFiB;AAGzC/E,EAAAA,OAAO,EAAE4E,sBAAUE,MAHsB;AAIzCpG,EAAAA,YAAY,EAAEkG,sBAAUI,IAAV,CAAeD;AAJY,CAA3C;AAOAlH,8BAA8B,CAACoH,YAA/B,GAA8C;AAC5CtE,EAAAA,OAAO,EAAE;AADmC,CAA9C;AAIA,IAAMuE,eAAe,GAAG,wBAAWrI,MAAX,EAAmBgB,8BAAnB,CAAxB;;eAEe,2BAAgBqH,eAAhB,C","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withDragContext } from '@pie-lib/pie-toolbox/drag';\nimport { CSSTransition, TransitionGroup } from 'react-transition-group';\nimport { color, Collapsible, PreviewPrompt, UiLayout, hasText, hasMedia } from '@pie-lib/pie-toolbox/render-ui';\nimport { withStyles } from '@material-ui/core/styles';\nimport NotInterestedIcon from '@material-ui/icons/NotInterested';\nimport { CorrectAnswerToggle } from '@pie-lib/pie-toolbox/correct-answer-toggle';\nimport Translator from '@pie-lib/pie-toolbox/translator';\nimport groupBy from 'lodash/groupBy';\nimport flatMap from 'lodash/flatMap';\n\nconst { translator } = Translator;\nimport Image from './image-container';\nimport InteractiveSection from './interactive-section';\nimport PossibleResponses from './possible-responses';\nimport { getUnansweredAnswers, getAnswersCorrectness } from './utils-correctness';\n\nconst generateId = () => Math.random().toString(36).substring(2) + new Date().getTime().toString(36);\n\nconst styles = (theme) => ({\n main: {\n color: color.text(),\n backgroundColor: color.background(),\n position: 'relative',\n '& img': {\n maxWidth: '100%',\n height: 'auto',\n }\n },\n teacherInstructions: {\n marginBottom: theme.spacing.unit * 2,\n },\n rationale: {\n marginTop: theme.spacing.unit * 2,\n },\n});\n\nexport class ImageClozeAssociationComponent extends React.Component {\n constructor(props) {\n super(props);\n const {\n model: { possibleResponses, responseContainers, duplicateResponses, maxResponsePerZone },\n session,\n } = props;\n let { answers } = session || {};\n // set id for each possible response\n const possibleResponsesWithIds = (possibleResponses || []).map((item, index) => ({\n value: item,\n id: `${index}`,\n }));\n\n let groupedAnswers = groupBy(answers || [], 'containerIndex');\n // keep only last maxResponsePerZone answers for each zone\n let limitedAnswers = flatMap(groupedAnswers, (grp) => grp.slice(-(maxResponsePerZone || 1)));\n answers = limitedAnswers\n // set id for each answer\n .map((answer, index) => ({ ...answer, id: `${index}` }))\n // return only answer which have a valid container index\n .filter((answer) => answer.containerIndex < responseContainers.length);\n\n const possibleResponsesFiltered = possibleResponsesWithIds.filter(\n (response) => !answers.find((answer) => answer.value === response.value),\n );\n this.state = {\n answers: answers || [],\n draggingElement: { id: '', value: '' },\n possibleResponses: duplicateResponses ? possibleResponsesWithIds : possibleResponsesFiltered,\n // set id for each response containers\n responseContainers: (responseContainers || []).map((item, index) => ({\n index,\n ...item,\n id: `${index}`,\n })),\n maxResponsePerZone: maxResponsePerZone || 1,\n showCorrect: false,\n };\n }\n\n beginDrag = (draggingElement) => {\n this.setState({\n draggingElement,\n });\n };\n\n handleOnDragEnd = () => {\n this.setState({\n draggingElement: { id: '', value: '' },\n });\n };\n\n filterPossibleAnswers = (possibleResponses, answer) =>\n possibleResponses.filter(response => response.value !== answer.value);\n\n handleOnAnswerSelect = (answer, responseContainerIndex) => {\n const {\n model: { duplicateResponses },\n updateAnswer,\n } = this.props;\n const { answers, maxResponsePerZone } = this.state;\n let { possibleResponses } = this.state;\n let answersToStore;\n\n const answersInThisContainer = [];\n const answersInOtherContainers = [];\n\n answers.forEach((a) => {\n if (a.containerIndex === responseContainerIndex) {\n answersInThisContainer.push(a);\n } else {\n answersInOtherContainers.push(a);\n }\n });\n\n if (maxResponsePerZone === answersInThisContainer.length) {\n const shiftedItem = answersInThisContainer[0];\n if (maxResponsePerZone === 1) {\n answersInThisContainer.shift(); // FIFO\n } else {\n this.setState({ maxResponsePerZoneWarning: true });\n return;\n }\n\n // if duplicates are not allowed, make sure to put the shifted value back in possible responses\n if (!duplicateResponses) {\n possibleResponses = Array.isArray(possibleResponses) ? possibleResponses : [];\n\n possibleResponses.push({\n ...shiftedItem,\n containerIndex: undefined,\n id: shiftedItem.id || generateId(),\n });\n }\n\n // answers will be:\n // + shifted answers for the current container\n // + if duplicatesAllowed, all the other answers from other containers\n // else: all the answers from other containers that are not having the same value\n // + new answer\n answersToStore = [\n ...answersInThisContainer, // shifted\n // TODO allow duplicates case Question: should we remove answer from a container if dragged to another container?\n // if yes, this should do it: add a.id !== answer.id instead of 'true'\n ...answersInOtherContainers.filter((a) => (duplicateResponses ? true : a.value !== answer.value)), // un-shifted\n {\n ...answer,\n containerIndex: responseContainerIndex,\n ...(duplicateResponses ? { id: generateId() } : {}),\n },\n ];\n } else {\n // answers will be:\n // + if duplicatesAllowed, all the other answers, except the one that was dragged\n // else: all the answers that are not having the same value\n // + new answer\n answersToStore = [\n // TODO allow duplicates case Question: should we remove answer from a container if dragged to another container?\n // if yes, this should do it: add a.id !== answer.id instead of 'true'\n ...answers.filter((a) => (duplicateResponses ? a.id !== answer.id : a.value !== answer.value)),\n {\n ...answer,\n containerIndex: responseContainerIndex,\n ...(duplicateResponses ? { id: generateId() } : {}),\n },\n ];\n }\n this.setState({\n maxResponsePerZoneWarning: false,\n answers: answersToStore,\n possibleResponses:\n // for single response per container remove answer from possible responses\n duplicateResponses ? possibleResponses : this.filterPossibleAnswers(possibleResponses, answer),\n });\n updateAnswer(answersToStore);\n };\n\n handleOnAnswerRemove = (answer) => {\n const {\n model: { duplicateResponses },\n updateAnswer,\n } = this.props;\n const { answers, possibleResponses } = this.state;\n const answersToStore = answers.filter((a) => a.id !== answer.id);\n const shouldNotPushInPossibleResponses = answer.containerIndex === undefined; // don't duplicate possible responses\n\n this.setState({\n maxResponsePerZoneWarning: false,\n answers: answersToStore,\n // push back into possible responses the removed answer if responses cannot be duplicated\n possibleResponses:\n duplicateResponses || shouldNotPushInPossibleResponses\n ? possibleResponses\n : [\n ...possibleResponses,\n {\n ...answer,\n containerIndex: undefined,\n },\n ],\n });\n updateAnswer(answersToStore);\n };\n\n toggleCorrect = (showCorrect) => this.setState({ showCorrect });\n\n render() {\n const {\n classes,\n model: {\n disabled,\n duplicateResponses,\n extraCSSRules,\n image,\n responseAreaFill,\n stimulus,\n responseCorrect,\n validation,\n teacherInstructions,\n prompt,\n autoplayAudioEnabled,\n showDashedBorder,\n mode,\n rationale,\n language,\n uiStyle = {},\n answerChoiceTransparency,\n responseContainerPadding,\n imageDropTargetPadding,\n fontSizeFactor,\n customAudioButton\n },\n } = this.props;\n const {\n answers,\n draggingElement,\n possibleResponses,\n responseContainers,\n maxResponsePerZone,\n maxResponsePerZoneWarning,\n showCorrect,\n } = this.state;\n const isEvaluateMode = mode === 'evaluate';\n const showToggle = isEvaluateMode && !responseCorrect;\n const { possibilityListPosition = 'bottom' } = uiStyle || {};\n const isVertical = possibilityListPosition === 'left' || possibilityListPosition === 'right';\n\n const { validResponse } = validation || {};\n const correctAnswers = [];\n const showRationale = rationale && (hasText(rationale) || hasMedia(rationale));\n const showTeacherInstructions = teacherInstructions && (hasText(teacherInstructions) || hasMedia(teacherInstructions));\n\n if (validResponse) {\n (validResponse.value || []).forEach((container, i) => {\n (container.images || []).forEach((v) => {\n correctAnswers.push({\n value: v,\n containerIndex: i,\n isCorrect: true\n });\n });\n });\n }\n\n const warningMessage = translator.t('imageClozeAssociation.reachedLimit_other', {\n lng: language,\n count: maxResponsePerZone,\n });\n\n let answersToShow =\n responseCorrect !== undefined ? getAnswersCorrectness(answers, validation, duplicateResponses) : answers;\n\n if (responseCorrect === false && maxResponsePerZone === 1) {\n answersToShow = [...answersToShow, ...getUnansweredAnswers(answersToShow, validation)];\n }\n\n const sharedImageProps = {\n draggingElement,\n duplicateResponses,\n image,\n onAnswerSelect: this.handleOnAnswerSelect,\n onDragAnswerBegin: this.beginDrag,\n onDragAnswerEnd: this.handleOnDragEnd,\n responseContainers,\n showDashedBorder,\n responseAreaFill,\n responseContainerPadding,\n imageDropTargetPadding,\n maxResponsePerZone,\n };\n\n const renderImage = () => (\n <Image\n {...sharedImageProps}\n canDrag={showCorrect && showToggle ? false : !disabled}\n answers={showCorrect && showToggle ? correctAnswers : answersToShow}\n answerChoiceTransparency={\n !(showCorrect && showToggle) ? answerChoiceTransparency : undefined\n }\n />\n );\n\n const renderPossibleResponses = () => {\n if (showCorrect && showToggle) return null;\n\n return (\n <React.Fragment>\n {maxResponsePerZoneWarning && <WarningInfo message={warningMessage} />}\n <PossibleResponses\n canDrag={!disabled}\n data={possibleResponses}\n onAnswerRemove={this.handleOnAnswerRemove}\n onDragBegin={this.beginDrag}\n onDragEnd={this.handleOnDragEnd}\n answerChoiceTransparency={answerChoiceTransparency}\n customStyle={{\n minWidth: isVertical ? '130px' : image?.width || 'fit-content',\n }}\n isVertical={isVertical}\n minHeight={isVertical ? image?.height : undefined}\n />\n </React.Fragment>\n );\n };\n\n return (\n <UiLayout extraCSSRules={extraCSSRules} id={'main-container'} className={classes.main} fontSizeFactor={fontSizeFactor}>\n {showTeacherInstructions && (\n <Collapsible\n className={classes.teacherInstructions}\n labels={{\n hidden: 'Show Teacher Instructions',\n visible: 'Hide Teacher Instructions',\n }}\n >\n <PreviewPrompt prompt={teacherInstructions} />\n </Collapsible>\n )}\n\n <PreviewPrompt\n className=\"prompt\"\n prompt={prompt}\n autoplayAudioEnabled={autoplayAudioEnabled}\n customAudioButton={customAudioButton}\n />\n\n <PreviewPrompt prompt={stimulus} />\n\n <CorrectAnswerToggle\n show={showToggle}\n toggled={showCorrect}\n onToggle={this.toggleCorrect}\n language={language}\n />\n\n <InteractiveSection\n responseCorrect={showCorrect && showToggle ? true : responseCorrect}\n uiStyle={uiStyle}\n >\n {renderImage()}\n {renderPossibleResponses()}\n </InteractiveSection>\n\n {showRationale && (\n <Collapsible\n className={classes.rationale}\n labels={{\n hidden: 'Show Rationale',\n visible: 'Hide Rationale',\n }}\n >\n <PreviewPrompt prompt={rationale} />\n </Collapsible>\n )}\n </UiLayout>\n );\n }\n}\n\nconst WarningInfo = withStyles((theme) => ({\n warning: {\n margin: `0 ${theme.spacing.unit * 2}px`,\n backgroundColor: '#dddddd',\n padding: theme.spacing.unit,\n display: 'flex',\n alignItems: 'center',\n '& svg': {\n height: '30px',\n },\n '& h1': {\n padding: '0px',\n margin: '0px',\n },\n },\n message: {\n paddingLeft: theme.spacing.unit / 2,\n userSelect: 'none',\n },\n}))(({ classes, message }) => (\n <TransitionGroup>\n <CSSTransition classNames={'fb'} key=\"fb\" timeout={300}>\n <div key=\"panel\" className={classes.warning}>\n <NotInterestedIcon color={'secondary'} fontSize={'small'} />\n <span className={classes.message} dangerouslySetInnerHTML={{ __html: message }} />\n </div>\n </CSSTransition>\n </TransitionGroup>\n));\n\nWarningInfo.propTypes = {\n message: PropTypes.string,\n classes: PropTypes.object.isRequired,\n};\n\nImageClozeAssociationComponent.propTypes = {\n classes: PropTypes.object,\n model: PropTypes.object.isRequired,\n session: PropTypes.object,\n updateAnswer: PropTypes.func.isRequired,\n};\n\nImageClozeAssociationComponent.defaultProps = {\n classes: {},\n};\n\nconst StyledComponent = withStyles(styles)(ImageClozeAssociationComponent);\n\nexport default withDragContext(StyledComponent);\n"],"file":"root.js"}
|
|
1
|
+
{"version":3,"sources":["../src/root.jsx"],"names":["translator","Translator","generateId","Math","random","toString","substring","Date","getTime","styles","theme","main","color","text","backgroundColor","background","position","maxWidth","height","teacherInstructions","marginBottom","spacing","unit","rationale","marginTop","ImageClozeAssociationComponent","props","draggingElement","setState","id","value","possibleResponses","answer","filter","response","responseContainerIndex","duplicateResponses","model","updateAnswer","state","answers","maxResponsePerZone","answersToStore","answersInThisContainer","answersInOtherContainers","forEach","a","containerIndex","push","length","shiftedItem","shift","maxResponsePerZoneWarning","Array","isArray","undefined","filterPossibleAnswers","shouldNotPushInPossibleResponses","showCorrect","responseContainers","session","possibleResponsesWithIds","map","item","index","groupedAnswers","limitedAnswers","grp","slice","possibleResponsesFiltered","find","classes","disabled","extraCSSRules","image","responseAreaFill","stimulus","responseCorrect","validation","prompt","autoplayAudioEnabled","showDashedBorder","mode","language","uiStyle","answerChoiceTransparency","responseContainerPadding","imageDropTargetPadding","fontSizeFactor","customAudioButton","isEvaluateMode","showToggle","possibilityListPosition","isVertical","validResponse","correctAnswers","showRationale","showTeacherInstructions","container","i","images","v","isCorrect","warningMessage","t","lng","count","answersToShow","sharedImageProps","onAnswerSelect","handleOnAnswerSelect","onDragAnswerBegin","beginDrag","onDragAnswerEnd","handleOnDragEnd","renderImage","renderPossibleResponses","handleOnAnswerRemove","minWidth","width","hidden","visible","toggleCorrect","React","Component","WarningInfo","warning","margin","padding","display","alignItems","message","paddingLeft","userSelect","__html","propTypes","PropTypes","string","object","isRequired","func","defaultProps","StyledComponent"],"mappings":"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","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withDragContext } from '@pie-lib/drag';\nimport { CSSTransition, TransitionGroup } from 'react-transition-group';\nimport { color, Collapsible, PreviewPrompt, UiLayout, hasText, hasMedia } from '@pie-lib/render-ui';\nimport { withStyles } from '@material-ui/core/styles';\nimport NotInterestedIcon from '@material-ui/icons/NotInterested';\nimport CorrectAnswerToggle from '@pie-lib/correct-answer-toggle';\nimport Translator from '@pie-lib/translator';\nimport groupBy from 'lodash/groupBy';\nimport flatMap from 'lodash/flatMap';\n\nconst { translator } = Translator;\nimport Image from './image-container';\nimport InteractiveSection from './interactive-section';\nimport PossibleResponses from './possible-responses';\nimport { getUnansweredAnswers, getAnswersCorrectness } from './utils-correctness';\n\nconst generateId = () => Math.random().toString(36).substring(2) + new Date().getTime().toString(36);\n\nconst styles = (theme) => ({\n main: {\n color: color.text(),\n backgroundColor: color.background(),\n position: 'relative',\n '& img': {\n maxWidth: '100%',\n height: 'auto',\n },\n },\n teacherInstructions: {\n marginBottom: theme.spacing.unit * 2,\n },\n rationale: {\n marginTop: theme.spacing.unit * 2,\n },\n});\n\nexport class ImageClozeAssociationComponent extends React.Component {\n constructor(props) {\n super(props);\n const {\n model: { possibleResponses, responseContainers, duplicateResponses, maxResponsePerZone },\n session,\n } = props;\n let { answers } = session || {};\n // set id for each possible response\n const possibleResponsesWithIds = (possibleResponses || []).map((item, index) => ({\n value: item,\n id: `${index}`,\n }));\n\n let groupedAnswers = groupBy(answers || [], 'containerIndex');\n // keep only last maxResponsePerZone answers for each zone\n let limitedAnswers = flatMap(groupedAnswers, (grp) => grp.slice(-(maxResponsePerZone || 1)));\n answers = limitedAnswers\n // set id for each answer\n .map((answer, index) => ({ ...answer, id: `${index}` }))\n // return only answer which have a valid container index\n .filter((answer) => answer.containerIndex < responseContainers.length);\n\n const possibleResponsesFiltered = possibleResponsesWithIds.filter(\n (response) => !answers.find((answer) => answer.value === response.value),\n );\n this.state = {\n answers: answers || [],\n draggingElement: { id: '', value: '' },\n possibleResponses: duplicateResponses ? possibleResponsesWithIds : possibleResponsesFiltered,\n // set id for each response containers\n responseContainers: (responseContainers || []).map((item, index) => ({\n index,\n ...item,\n id: `${index}`,\n })),\n maxResponsePerZone: maxResponsePerZone || 1,\n showCorrect: false,\n };\n }\n\n beginDrag = (draggingElement) => {\n this.setState({\n draggingElement,\n });\n };\n\n handleOnDragEnd = () => {\n this.setState({\n draggingElement: { id: '', value: '' },\n });\n };\n\n filterPossibleAnswers = (possibleResponses, answer) =>\n possibleResponses.filter((response) => response.value !== answer.value);\n\n handleOnAnswerSelect = (answer, responseContainerIndex) => {\n const {\n model: { duplicateResponses },\n updateAnswer,\n } = this.props;\n const { answers, maxResponsePerZone } = this.state;\n let { possibleResponses } = this.state;\n let answersToStore;\n\n const answersInThisContainer = [];\n const answersInOtherContainers = [];\n\n answers.forEach((a) => {\n if (a.containerIndex === responseContainerIndex) {\n answersInThisContainer.push(a);\n } else {\n answersInOtherContainers.push(a);\n }\n });\n\n if (maxResponsePerZone === answersInThisContainer.length) {\n const shiftedItem = answersInThisContainer[0];\n if (maxResponsePerZone === 1) {\n answersInThisContainer.shift(); // FIFO\n } else {\n this.setState({ maxResponsePerZoneWarning: true });\n return;\n }\n\n // if duplicates are not allowed, make sure to put the shifted value back in possible responses\n if (!duplicateResponses) {\n possibleResponses = Array.isArray(possibleResponses) ? possibleResponses : [];\n\n possibleResponses.push({\n ...shiftedItem,\n containerIndex: undefined,\n id: shiftedItem.id || generateId(),\n });\n }\n\n // answers will be:\n // + shifted answers for the current container\n // + if duplicatesAllowed, all the other answers from other containers\n // else: all the answers from other containers that are not having the same value\n // + new answer\n answersToStore = [\n ...answersInThisContainer, // shifted\n // TODO allow duplicates case Question: should we remove answer from a container if dragged to another container?\n // if yes, this should do it: add a.id !== answer.id instead of 'true'\n ...answersInOtherContainers.filter((a) => (duplicateResponses ? true : a.value !== answer.value)), // un-shifted\n {\n ...answer,\n containerIndex: responseContainerIndex,\n ...(duplicateResponses ? { id: generateId() } : {}),\n },\n ];\n } else {\n // answers will be:\n // + if duplicatesAllowed, all the other answers, except the one that was dragged\n // else: all the answers that are not having the same value\n // + new answer\n answersToStore = [\n // TODO allow duplicates case Question: should we remove answer from a container if dragged to another container?\n // if yes, this should do it: add a.id !== answer.id instead of 'true'\n ...answers.filter((a) => (duplicateResponses ? a.id !== answer.id : a.value !== answer.value)),\n {\n ...answer,\n containerIndex: responseContainerIndex,\n ...(duplicateResponses ? { id: generateId() } : {}),\n },\n ];\n }\n this.setState({\n maxResponsePerZoneWarning: false,\n answers: answersToStore,\n possibleResponses:\n // for single response per container remove answer from possible responses\n duplicateResponses ? possibleResponses : this.filterPossibleAnswers(possibleResponses, answer),\n });\n updateAnswer(answersToStore);\n };\n\n handleOnAnswerRemove = (answer) => {\n const {\n model: { duplicateResponses },\n updateAnswer,\n } = this.props;\n const { answers, possibleResponses } = this.state;\n const answersToStore = answers.filter((a) => a.id !== answer.id);\n const shouldNotPushInPossibleResponses = answer.containerIndex === undefined; // don't duplicate possible responses\n\n this.setState({\n maxResponsePerZoneWarning: false,\n answers: answersToStore,\n // push back into possible responses the removed answer if responses cannot be duplicated\n possibleResponses:\n duplicateResponses || shouldNotPushInPossibleResponses\n ? possibleResponses\n : [\n ...possibleResponses,\n {\n ...answer,\n containerIndex: undefined,\n },\n ],\n });\n updateAnswer(answersToStore);\n };\n\n toggleCorrect = (showCorrect) => this.setState({ showCorrect });\n\n render() {\n const {\n classes,\n model: {\n disabled,\n duplicateResponses,\n extraCSSRules,\n image,\n responseAreaFill,\n stimulus,\n responseCorrect,\n validation,\n teacherInstructions,\n prompt,\n autoplayAudioEnabled,\n showDashedBorder,\n mode,\n rationale,\n language,\n uiStyle = {},\n answerChoiceTransparency,\n responseContainerPadding,\n imageDropTargetPadding,\n fontSizeFactor,\n customAudioButton,\n },\n } = this.props;\n const {\n answers,\n draggingElement,\n possibleResponses,\n responseContainers,\n maxResponsePerZone,\n maxResponsePerZoneWarning,\n showCorrect,\n } = this.state;\n const isEvaluateMode = mode === 'evaluate';\n const showToggle = isEvaluateMode && !responseCorrect;\n const { possibilityListPosition = 'bottom' } = uiStyle || {};\n const isVertical = possibilityListPosition === 'left' || possibilityListPosition === 'right';\n\n const { validResponse } = validation || {};\n const correctAnswers = [];\n const showRationale = rationale && (hasText(rationale) || hasMedia(rationale));\n const showTeacherInstructions =\n teacherInstructions && (hasText(teacherInstructions) || hasMedia(teacherInstructions));\n\n if (validResponse) {\n (validResponse.value || []).forEach((container, i) => {\n (container.images || []).forEach((v) => {\n correctAnswers.push({\n value: v,\n containerIndex: i,\n isCorrect: true,\n });\n });\n });\n }\n\n const warningMessage = translator.t('imageClozeAssociation.reachedLimit_other', {\n lng: language,\n count: maxResponsePerZone,\n });\n\n let answersToShow =\n responseCorrect !== undefined ? getAnswersCorrectness(answers, validation, duplicateResponses) : answers;\n\n if (responseCorrect === false && maxResponsePerZone === 1) {\n answersToShow = [...answersToShow, ...getUnansweredAnswers(answersToShow, validation)];\n }\n\n const sharedImageProps = {\n draggingElement,\n duplicateResponses,\n image,\n onAnswerSelect: this.handleOnAnswerSelect,\n onDragAnswerBegin: this.beginDrag,\n onDragAnswerEnd: this.handleOnDragEnd,\n responseContainers,\n showDashedBorder,\n responseAreaFill,\n responseContainerPadding,\n imageDropTargetPadding,\n maxResponsePerZone,\n };\n\n const renderImage = () => (\n <Image\n {...sharedImageProps}\n canDrag={showCorrect && showToggle ? false : !disabled}\n answers={showCorrect && showToggle ? correctAnswers : answersToShow}\n answerChoiceTransparency={!(showCorrect && showToggle) ? answerChoiceTransparency : undefined}\n />\n );\n\n const renderPossibleResponses = () => {\n if (showCorrect && showToggle) return null;\n\n return (\n <React.Fragment>\n {maxResponsePerZoneWarning && <WarningInfo message={warningMessage} />}\n <PossibleResponses\n canDrag={!disabled}\n data={possibleResponses}\n onAnswerRemove={this.handleOnAnswerRemove}\n onDragBegin={this.beginDrag}\n onDragEnd={this.handleOnDragEnd}\n answerChoiceTransparency={answerChoiceTransparency}\n customStyle={{\n minWidth: isVertical ? '130px' : image?.width || 'fit-content',\n }}\n isVertical={isVertical}\n minHeight={isVertical ? image?.height : undefined}\n />\n </React.Fragment>\n );\n };\n\n return (\n <UiLayout\n extraCSSRules={extraCSSRules}\n id={'main-container'}\n className={classes.main}\n fontSizeFactor={fontSizeFactor}\n >\n {showTeacherInstructions && (\n <Collapsible\n className={classes.teacherInstructions}\n labels={{\n hidden: 'Show Teacher Instructions',\n visible: 'Hide Teacher Instructions',\n }}\n >\n <PreviewPrompt prompt={teacherInstructions} />\n </Collapsible>\n )}\n\n <PreviewPrompt\n className=\"prompt\"\n prompt={prompt}\n autoplayAudioEnabled={autoplayAudioEnabled}\n customAudioButton={customAudioButton}\n />\n\n <PreviewPrompt prompt={stimulus} />\n\n <CorrectAnswerToggle\n show={showToggle}\n toggled={showCorrect}\n onToggle={this.toggleCorrect}\n language={language}\n />\n\n <InteractiveSection responseCorrect={showCorrect && showToggle ? true : responseCorrect} uiStyle={uiStyle}>\n {renderImage()}\n {renderPossibleResponses()}\n </InteractiveSection>\n\n {showRationale && (\n <Collapsible\n className={classes.rationale}\n labels={{\n hidden: 'Show Rationale',\n visible: 'Hide Rationale',\n }}\n >\n <PreviewPrompt prompt={rationale} />\n </Collapsible>\n )}\n </UiLayout>\n );\n }\n}\n\nconst WarningInfo = withStyles((theme) => ({\n warning: {\n margin: `0 ${theme.spacing.unit * 2}px`,\n backgroundColor: '#dddddd',\n padding: theme.spacing.unit,\n display: 'flex',\n alignItems: 'center',\n '& svg': {\n height: '30px',\n },\n '& h1': {\n padding: '0px',\n margin: '0px',\n },\n },\n message: {\n paddingLeft: theme.spacing.unit / 2,\n userSelect: 'none',\n },\n}))(({ classes, message }) => (\n <TransitionGroup>\n <CSSTransition classNames={'fb'} key=\"fb\" timeout={300}>\n <div key=\"panel\" className={classes.warning}>\n <NotInterestedIcon color={'secondary'} fontSize={'small'} />\n <span className={classes.message} dangerouslySetInnerHTML={{ __html: message }} />\n </div>\n </CSSTransition>\n </TransitionGroup>\n));\n\nWarningInfo.propTypes = {\n message: PropTypes.string,\n classes: PropTypes.object.isRequired,\n};\n\nImageClozeAssociationComponent.propTypes = {\n classes: PropTypes.object,\n model: PropTypes.object.isRequired,\n session: PropTypes.object,\n updateAnswer: PropTypes.func.isRequired,\n};\n\nImageClozeAssociationComponent.defaultProps = {\n classes: {},\n};\n\nconst StyledComponent = withStyles(styles)(ImageClozeAssociationComponent);\n\nexport default withDragContext(StyledComponent);\n"],"file":"root.js"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pie-element/image-cloze-association",
|
|
3
|
-
"version": "6.13.
|
|
3
|
+
"version": "6.13.4-next.86+260752f06",
|
|
4
4
|
"description": "",
|
|
5
5
|
"repository": "pie-framework/pie-elements",
|
|
6
6
|
"publishConfig": {
|
|
@@ -10,7 +10,11 @@
|
|
|
10
10
|
"@material-ui/core": "^3.9.3",
|
|
11
11
|
"@material-ui/icons": "^3.0.1",
|
|
12
12
|
"@pie-framework/pie-player-events": "^0.1.0",
|
|
13
|
-
"@pie-lib/
|
|
13
|
+
"@pie-lib/correct-answer-toggle": "^2.20.0",
|
|
14
|
+
"@pie-lib/drag": "^2.17.0",
|
|
15
|
+
"@pie-lib/math-rendering": "^3.17.0",
|
|
16
|
+
"@pie-lib/render-ui": "^4.30.0",
|
|
17
|
+
"@pie-lib/translator": "^2.18.0",
|
|
14
18
|
"classnames": "^2.2.6",
|
|
15
19
|
"humps": "^2.0.1",
|
|
16
20
|
"prop-types": "^15.6.1",
|
|
@@ -19,7 +23,7 @@
|
|
|
19
23
|
},
|
|
20
24
|
"author": "pie framework developers",
|
|
21
25
|
"license": "ISC",
|
|
22
|
-
"gitHead": "
|
|
26
|
+
"gitHead": "260752f06b5e03f581d3a2533a3007e567d7655a",
|
|
23
27
|
"scripts": {
|
|
24
28
|
"postpublish": "../../scripts/postpublish"
|
|
25
29
|
},
|
|
@@ -4,7 +4,7 @@ import { ModelSetEvent, SessionChangedEvent } from '@pie-framework/pie-player-ev
|
|
|
4
4
|
import ImageClozeAssociation from '../index';
|
|
5
5
|
import { ImageClozeAssociationComponent } from '../root';
|
|
6
6
|
|
|
7
|
-
jest.mock('@pie-lib/
|
|
7
|
+
jest.mock('@pie-lib/math-rendering', () => ({ renderMath: jest.fn() }));
|
|
8
8
|
|
|
9
9
|
describe('image-cloze-association', () => {
|
|
10
10
|
describe('renders', () => {
|
package/src/evaluation-icon.jsx
CHANGED
|
@@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
|
|
|
3
3
|
import { withStyles } from '@material-ui/core';
|
|
4
4
|
import Check from '@material-ui/icons/Check';
|
|
5
5
|
import Close from '@material-ui/icons/Close';
|
|
6
|
-
import { color } from '@pie-lib/
|
|
6
|
+
import { color } from '@pie-lib/render-ui';
|
|
7
7
|
|
|
8
8
|
const getCorrectnessClass = (isCorrect, filled) => {
|
|
9
9
|
const correctness = isCorrect ? 'correct' : 'incorrect';
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import PropTypes from 'prop-types';
|
|
3
|
-
import { DropTarget } from '@pie-lib/
|
|
3
|
+
import { DropTarget } from '@pie-lib/drag';
|
|
4
4
|
import { withStyles } from '@material-ui/core/styles';
|
|
5
|
-
import { color } from '@pie-lib/
|
|
5
|
+
import { color } from '@pie-lib/render-ui';
|
|
6
6
|
import cx from 'classnames';
|
|
7
7
|
|
|
8
8
|
import PossibleResponse from './possible-response';
|
|
@@ -11,7 +11,7 @@ import c from './constants';
|
|
|
11
11
|
class ImageDropTarget extends React.Component {
|
|
12
12
|
state = {
|
|
13
13
|
shouldHaveSmallPadding: false,
|
|
14
|
-
}
|
|
14
|
+
};
|
|
15
15
|
|
|
16
16
|
componentDidMount() {
|
|
17
17
|
if (this.dropContainer) {
|
|
@@ -58,42 +58,44 @@ class ImageDropTarget extends React.Component {
|
|
|
58
58
|
const updatedContainerStyle = {
|
|
59
59
|
padding: maxResponsePerZone === 1 ? '0' : responseContainerPadding,
|
|
60
60
|
...containerStyle,
|
|
61
|
-
...(responseAreaFill && !isDraggingElement && { backgroundColor: responseAreaFill })
|
|
61
|
+
...(responseAreaFill && !isDraggingElement && { backgroundColor: responseAreaFill }),
|
|
62
62
|
};
|
|
63
63
|
|
|
64
64
|
return connectDropTarget(
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
65
|
+
<div
|
|
66
|
+
ref={(ref) => {
|
|
67
|
+
this.dropContainer = ref;
|
|
68
|
+
}}
|
|
69
|
+
className={containerClasses}
|
|
70
|
+
style={updatedContainerStyle}
|
|
71
|
+
>
|
|
72
|
+
{answers.length ? (
|
|
73
|
+
<div
|
|
74
|
+
className={classes.answers}
|
|
75
|
+
ref={(ref) => {
|
|
76
|
+
this.dropContainerResponsesHeight = ref?.getBoundingClientRect().height;
|
|
77
|
+
}}
|
|
78
|
+
>
|
|
79
|
+
{answers.map((answer) => (
|
|
80
|
+
<PossibleResponse
|
|
81
|
+
key={answer.id}
|
|
82
|
+
data={answer}
|
|
83
|
+
canDrag={canDrag}
|
|
84
|
+
onDragBegin={() => onDragAnswerBegin(answer)}
|
|
85
|
+
onDragEnd={onDragAnswerEnd}
|
|
86
|
+
answerChoiceTransparency={answerChoiceTransparency}
|
|
87
|
+
containerStyle={{
|
|
88
|
+
padding: imageDropTargetPadding
|
|
89
|
+
? imageDropTargetPadding
|
|
90
|
+
: shouldHaveSmallPadding
|
|
91
|
+
? '2px'
|
|
92
|
+
: '6px 10px',
|
|
93
|
+
}}
|
|
94
|
+
/>
|
|
95
|
+
))}
|
|
96
|
+
</div>
|
|
97
|
+
) : null}
|
|
98
|
+
</div>,
|
|
97
99
|
);
|
|
98
100
|
}
|
|
99
101
|
}
|
|
@@ -136,7 +138,7 @@ const styles = () => ({
|
|
|
136
138
|
},
|
|
137
139
|
responseContainer: {
|
|
138
140
|
position: 'absolute',
|
|
139
|
-
boxSizing: 'border-box'
|
|
141
|
+
boxSizing: 'border-box',
|
|
140
142
|
},
|
|
141
143
|
responseContainerActive: {
|
|
142
144
|
border: `2px solid ${color.text()}`,
|
|
@@ -148,7 +150,7 @@ const styles = () => ({
|
|
|
148
150
|
isOver: {
|
|
149
151
|
border: '1px solid rgb(158, 158, 158)',
|
|
150
152
|
backgroundColor: 'rgb(224, 224, 224)',
|
|
151
|
-
}
|
|
153
|
+
},
|
|
152
154
|
});
|
|
153
155
|
|
|
154
156
|
const Styled = withStyles(styles)(ImageDropTarget);
|
package/src/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import ReactDOM from 'react-dom';
|
|
3
|
-
import { renderMath } from '@pie-lib/
|
|
4
|
-
import { EnableAudioAutoplayImage } from '@pie-lib/
|
|
3
|
+
import { renderMath } from '@pie-lib/math-rendering';
|
|
4
|
+
import { EnableAudioAutoplayImage } from '@pie-lib/render-ui';
|
|
5
5
|
import { ModelSetEvent, SessionChangedEvent } from '@pie-framework/pie-player-events';
|
|
6
6
|
|
|
7
7
|
import ImageClozeAssociationComponent from './root';
|
|
@@ -78,7 +78,7 @@ export default class ImageClozeAssociation extends HTMLElement {
|
|
|
78
78
|
alignItems: 'center',
|
|
79
79
|
background: 'white',
|
|
80
80
|
zIndex: '1000',
|
|
81
|
-
cursor: 'pointer'
|
|
81
|
+
cursor: 'pointer',
|
|
82
82
|
});
|
|
83
83
|
|
|
84
84
|
const img = document.createElement('img');
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import PropTypes from 'prop-types';
|
|
3
3
|
import { withStyles } from '@material-ui/core';
|
|
4
|
-
import { color } from '@pie-lib/
|
|
4
|
+
import { color } from '@pie-lib/render-ui';
|
|
5
5
|
|
|
6
6
|
import EvaluationIcon from './evaluation-icon';
|
|
7
7
|
|
|
@@ -2,8 +2,8 @@ import React from 'react';
|
|
|
2
2
|
import PropTypes from 'prop-types';
|
|
3
3
|
import classNames from 'classnames';
|
|
4
4
|
import { withStyles } from '@material-ui/core/styles';
|
|
5
|
-
import { DragSource } from '@pie-lib/
|
|
6
|
-
import { color } from '@pie-lib/
|
|
5
|
+
import { DragSource } from '@pie-lib/drag';
|
|
6
|
+
import { color } from '@pie-lib/render-ui';
|
|
7
7
|
import ReactDOM from 'react-dom';
|
|
8
8
|
|
|
9
9
|
import EvaluationIcon from './evaluation-icon';
|
|
@@ -72,10 +72,7 @@ export class PossibleResponse extends React.Component {
|
|
|
72
72
|
},
|
|
73
73
|
]);
|
|
74
74
|
|
|
75
|
-
const promptClassNames = classNames([
|
|
76
|
-
classes.span,
|
|
77
|
-
{ [classes.hiddenSpan]: data.hidden },
|
|
78
|
-
]);
|
|
75
|
+
const promptClassNames = classNames([classes.span, { [classes.hiddenSpan]: data.hidden }]);
|
|
79
76
|
|
|
80
77
|
return connectDragSource(
|
|
81
78
|
<div
|
|
@@ -84,9 +81,10 @@ export class PossibleResponse extends React.Component {
|
|
|
84
81
|
ref={(ref) => {
|
|
85
82
|
//eslint-disable-next-line
|
|
86
83
|
this.rootRef = ReactDOM.findDOMNode(ref);
|
|
87
|
-
}}
|
|
88
|
-
|
|
89
|
-
<
|
|
84
|
+
}}
|
|
85
|
+
>
|
|
86
|
+
<StaticHTMLSpan html={data.value} className={promptClassNames} />
|
|
87
|
+
<EvaluationIcon isCorrect={data.isCorrect} containerStyle={evaluationStyle} />
|
|
90
88
|
</div>,
|
|
91
89
|
);
|
|
92
90
|
}
|
|
@@ -119,12 +117,12 @@ const styles = () => ({
|
|
|
119
117
|
justifyContent: 'center',
|
|
120
118
|
minHeight: '28px',
|
|
121
119
|
width: 'fit-content',
|
|
122
|
-
'& span img':{
|
|
120
|
+
'& span img': {
|
|
123
121
|
// Added for touch devices, for image content.
|
|
124
122
|
// This will prevent the context menu from appearing and not allowing other interactions with the image.
|
|
125
123
|
// If interactions with the image in the token will be requested we should handle only the context Menu.
|
|
126
124
|
pointerEvents: 'none',
|
|
127
|
-
}
|
|
125
|
+
},
|
|
128
126
|
},
|
|
129
127
|
textAnswerChoiceStyle: {
|
|
130
128
|
padding: '0 10px',
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import PropTypes from 'prop-types';
|
|
3
3
|
import { withStyles } from '@material-ui/core';
|
|
4
|
-
import { color } from '@pie-lib/
|
|
5
|
-
import { ICADroppablePlaceholder } from '@pie-lib/
|
|
4
|
+
import { color } from '@pie-lib/render-ui';
|
|
5
|
+
import { ICADroppablePlaceholder } from '@pie-lib/drag';
|
|
6
6
|
|
|
7
7
|
import PossibleResponse from './possible-response';
|
|
8
8
|
|
|
@@ -16,30 +16,30 @@ const PossibleResponses = ({
|
|
|
16
16
|
answerChoiceTransparency,
|
|
17
17
|
customStyle,
|
|
18
18
|
isVertical,
|
|
19
|
-
minHeight
|
|
20
|
-
}) =>
|
|
21
|
-
|
|
22
|
-
<
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
19
|
+
minHeight,
|
|
20
|
+
}) => (
|
|
21
|
+
<div className={classes.base} style={customStyle}>
|
|
22
|
+
<ICADroppablePlaceholder
|
|
23
|
+
classes={classes.pool}
|
|
24
|
+
disabled={!canDrag}
|
|
25
|
+
onRemoveAnswer={onAnswerRemove}
|
|
26
|
+
isVerticalPool={isVertical}
|
|
27
|
+
minHeight={minHeight}
|
|
28
|
+
>
|
|
29
|
+
{(data || []).map((item) => (
|
|
30
|
+
<PossibleResponse
|
|
31
|
+
canDrag={canDrag}
|
|
32
|
+
key={item.id}
|
|
33
|
+
data={item}
|
|
34
|
+
onDragBegin={onDragBegin}
|
|
35
|
+
onDragEnd={onDragEnd}
|
|
36
|
+
answerChoiceTransparency={answerChoiceTransparency}
|
|
37
|
+
containerStyle={{ margin: '4px' }}
|
|
38
|
+
/>
|
|
39
|
+
))}
|
|
40
|
+
</ICADroppablePlaceholder>
|
|
41
|
+
</div>
|
|
42
|
+
);
|
|
43
43
|
|
|
44
44
|
PossibleResponses.propTypes = {
|
|
45
45
|
canDrag: PropTypes.bool.isRequired,
|
|
@@ -51,7 +51,7 @@ PossibleResponses.propTypes = {
|
|
|
51
51
|
answerChoiceTransparency: PropTypes.bool,
|
|
52
52
|
customStyle: PropTypes.object,
|
|
53
53
|
isVertical: PropTypes.bool,
|
|
54
|
-
minHeight: PropTypes.number
|
|
54
|
+
minHeight: PropTypes.number,
|
|
55
55
|
};
|
|
56
56
|
|
|
57
57
|
PossibleResponses.defaultProps = {
|
package/src/root.jsx
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import PropTypes from 'prop-types';
|
|
3
|
-
import { withDragContext } from '@pie-lib/
|
|
3
|
+
import { withDragContext } from '@pie-lib/drag';
|
|
4
4
|
import { CSSTransition, TransitionGroup } from 'react-transition-group';
|
|
5
|
-
import { color, Collapsible, PreviewPrompt, UiLayout, hasText, hasMedia } from '@pie-lib/
|
|
5
|
+
import { color, Collapsible, PreviewPrompt, UiLayout, hasText, hasMedia } from '@pie-lib/render-ui';
|
|
6
6
|
import { withStyles } from '@material-ui/core/styles';
|
|
7
7
|
import NotInterestedIcon from '@material-ui/icons/NotInterested';
|
|
8
|
-
import
|
|
9
|
-
import Translator from '@pie-lib/
|
|
8
|
+
import CorrectAnswerToggle from '@pie-lib/correct-answer-toggle';
|
|
9
|
+
import Translator from '@pie-lib/translator';
|
|
10
10
|
import groupBy from 'lodash/groupBy';
|
|
11
11
|
import flatMap from 'lodash/flatMap';
|
|
12
12
|
|
|
@@ -26,7 +26,7 @@ const styles = (theme) => ({
|
|
|
26
26
|
'& img': {
|
|
27
27
|
maxWidth: '100%',
|
|
28
28
|
height: 'auto',
|
|
29
|
-
}
|
|
29
|
+
},
|
|
30
30
|
},
|
|
31
31
|
teacherInstructions: {
|
|
32
32
|
marginBottom: theme.spacing.unit * 2,
|
|
@@ -90,7 +90,7 @@ export class ImageClozeAssociationComponent extends React.Component {
|
|
|
90
90
|
};
|
|
91
91
|
|
|
92
92
|
filterPossibleAnswers = (possibleResponses, answer) =>
|
|
93
|
-
possibleResponses.filter(response => response.value !== answer.value);
|
|
93
|
+
possibleResponses.filter((response) => response.value !== answer.value);
|
|
94
94
|
|
|
95
95
|
handleOnAnswerSelect = (answer, responseContainerIndex) => {
|
|
96
96
|
const {
|
|
@@ -191,12 +191,12 @@ export class ImageClozeAssociationComponent extends React.Component {
|
|
|
191
191
|
duplicateResponses || shouldNotPushInPossibleResponses
|
|
192
192
|
? possibleResponses
|
|
193
193
|
: [
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
194
|
+
...possibleResponses,
|
|
195
|
+
{
|
|
196
|
+
...answer,
|
|
197
|
+
containerIndex: undefined,
|
|
198
|
+
},
|
|
199
|
+
],
|
|
200
200
|
});
|
|
201
201
|
updateAnswer(answersToStore);
|
|
202
202
|
};
|
|
@@ -227,7 +227,7 @@ export class ImageClozeAssociationComponent extends React.Component {
|
|
|
227
227
|
responseContainerPadding,
|
|
228
228
|
imageDropTargetPadding,
|
|
229
229
|
fontSizeFactor,
|
|
230
|
-
customAudioButton
|
|
230
|
+
customAudioButton,
|
|
231
231
|
},
|
|
232
232
|
} = this.props;
|
|
233
233
|
const {
|
|
@@ -247,7 +247,8 @@ export class ImageClozeAssociationComponent extends React.Component {
|
|
|
247
247
|
const { validResponse } = validation || {};
|
|
248
248
|
const correctAnswers = [];
|
|
249
249
|
const showRationale = rationale && (hasText(rationale) || hasMedia(rationale));
|
|
250
|
-
const showTeacherInstructions =
|
|
250
|
+
const showTeacherInstructions =
|
|
251
|
+
teacherInstructions && (hasText(teacherInstructions) || hasMedia(teacherInstructions));
|
|
251
252
|
|
|
252
253
|
if (validResponse) {
|
|
253
254
|
(validResponse.value || []).forEach((container, i) => {
|
|
@@ -255,7 +256,7 @@ export class ImageClozeAssociationComponent extends React.Component {
|
|
|
255
256
|
correctAnswers.push({
|
|
256
257
|
value: v,
|
|
257
258
|
containerIndex: i,
|
|
258
|
-
isCorrect: true
|
|
259
|
+
isCorrect: true,
|
|
259
260
|
});
|
|
260
261
|
});
|
|
261
262
|
});
|
|
@@ -293,9 +294,7 @@ export class ImageClozeAssociationComponent extends React.Component {
|
|
|
293
294
|
{...sharedImageProps}
|
|
294
295
|
canDrag={showCorrect && showToggle ? false : !disabled}
|
|
295
296
|
answers={showCorrect && showToggle ? correctAnswers : answersToShow}
|
|
296
|
-
answerChoiceTransparency={
|
|
297
|
-
!(showCorrect && showToggle) ? answerChoiceTransparency : undefined
|
|
298
|
-
}
|
|
297
|
+
answerChoiceTransparency={!(showCorrect && showToggle) ? answerChoiceTransparency : undefined}
|
|
299
298
|
/>
|
|
300
299
|
);
|
|
301
300
|
|
|
@@ -323,7 +322,12 @@ export class ImageClozeAssociationComponent extends React.Component {
|
|
|
323
322
|
};
|
|
324
323
|
|
|
325
324
|
return (
|
|
326
|
-
<UiLayout
|
|
325
|
+
<UiLayout
|
|
326
|
+
extraCSSRules={extraCSSRules}
|
|
327
|
+
id={'main-container'}
|
|
328
|
+
className={classes.main}
|
|
329
|
+
fontSizeFactor={fontSizeFactor}
|
|
330
|
+
>
|
|
327
331
|
{showTeacherInstructions && (
|
|
328
332
|
<Collapsible
|
|
329
333
|
className={classes.teacherInstructions}
|
|
@@ -352,10 +356,7 @@ export class ImageClozeAssociationComponent extends React.Component {
|
|
|
352
356
|
language={language}
|
|
353
357
|
/>
|
|
354
358
|
|
|
355
|
-
<InteractiveSection
|
|
356
|
-
responseCorrect={showCorrect && showToggle ? true : responseCorrect}
|
|
357
|
-
uiStyle={uiStyle}
|
|
358
|
-
>
|
|
359
|
+
<InteractiveSection responseCorrect={showCorrect && showToggle ? true : responseCorrect} uiStyle={uiStyle}>
|
|
359
360
|
{renderImage()}
|
|
360
361
|
{renderPossibleResponses()}
|
|
361
362
|
</InteractiveSection>
|