@pie-element/image-cloze-association 6.11.7-next.6 → 6.11.7
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/CHANGELOG.md +18 -0
- package/configure/CHANGELOG.md +14 -0
- package/configure/package.json +2 -2
- package/controller/CHANGELOG.md +15 -0
- package/controller/lib/index.js +2 -2
- package/controller/lib/index.js.map +1 -1
- package/controller/package.json +2 -2
- package/controller/src/index.js +2 -2
- package/lib/image-container.js +1 -2
- package/lib/image-container.js.map +1 -1
- package/lib/possible-response.js +69 -11
- package/lib/possible-response.js.map +1 -1
- package/lib/root.js +4 -2
- package/lib/root.js.map +1 -1
- package/package.json +3 -3
- package/src/image-container.jsx +1 -1
- package/src/possible-response.jsx +48 -3
- package/src/root.jsx +5 -3
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,24 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [6.11.7](https://github.com/pie-framework/pie-elements/compare/@pie-element/image-cloze-association@6.11.6...@pie-element/image-cloze-association@6.11.7) (2025-06-05)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Bug Fixes
|
|
10
|
+
|
|
11
|
+
* update pie-lib/pie-toolbox PD-4888, PD-3542, PD-4873, PD-4679 ([9c3bdef](https://github.com/pie-framework/pie-elements/commit/9c3bdef1b68f128ecc6338ef74f25fb74c482aa6))
|
|
12
|
+
* **image-cloze-association:** remove confusing alt text PD-5046 ([40d202c](https://github.com/pie-framework/pie-elements/commit/40d202c250fda457667de2daa9bbd9100e4c0a20))
|
|
13
|
+
* **match:** add has media verid for rationale and teacher instr pie-elements PD-3756 ([7d1f431](https://github.com/pie-framework/pie-elements/commit/7d1f4310e128ac9312859c96ad5c87300aa336c3))
|
|
14
|
+
* update pie-lib pie-toolbox PD-3756 and revert changes for PD-4810 ([1e3030b](https://github.com/pie-framework/pie-elements/commit/1e3030bfdb13d0cce7b54ce0e9a109446c5ec2a2))
|
|
15
|
+
* update pie-lib-pie-toolbox PD-4810 ([6c81afc](https://github.com/pie-framework/pie-elements/commit/6c81afc6a8ad41e001bafb0bd1563164e9f32a10))
|
|
16
|
+
* update pie-lib-pie-toolbox PD-4810 ([0f9dd82](https://github.com/pie-framework/pie-elements/commit/0f9dd827c474e87770fd3bd146d870dd77d296df))
|
|
17
|
+
* **image-cloze-association:** fix drag gesture on tablet and chromebook to have longer press PD-4888 ([1a39466](https://github.com/pie-framework/pie-elements/commit/1a394663f22261f4fba0c31d81b5a7b628bc096e))
|
|
18
|
+
* add validation for audio content PD-4123 ([f0ce3f1](https://github.com/pie-framework/pie-elements/commit/f0ce3f19a12fd4cfe2d2159ca4af801d866dc8a9))
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
6
24
|
## [6.11.6](https://github.com/pie-framework/pie-elements/compare/@pie-element/image-cloze-association@6.11.5...@pie-element/image-cloze-association@6.11.6) (2025-05-22)
|
|
7
25
|
|
|
8
26
|
|
package/configure/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,20 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [6.4.7](https://github.com/pie-framework/pie-elements/compare/@pie-element/image-cloze-association-configure@6.4.6...@pie-element/image-cloze-association-configure@6.4.7) (2025-06-05)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Bug Fixes
|
|
10
|
+
|
|
11
|
+
* update pie-lib pie-toolbox PD-3756 and revert changes for PD-4810 ([1e3030b](https://github.com/pie-framework/pie-elements/commit/1e3030bfdb13d0cce7b54ce0e9a109446c5ec2a2))
|
|
12
|
+
* update pie-lib-pie-toolbox PD-4810 ([6c81afc](https://github.com/pie-framework/pie-elements/commit/6c81afc6a8ad41e001bafb0bd1563164e9f32a10))
|
|
13
|
+
* update pie-lib-pie-toolbox PD-4810 ([0f9dd82](https://github.com/pie-framework/pie-elements/commit/0f9dd827c474e87770fd3bd146d870dd77d296df))
|
|
14
|
+
* update pie-lib/pie-toolbox PD-4888, PD-3542, PD-4873, PD-4679 ([9c3bdef](https://github.com/pie-framework/pie-elements/commit/9c3bdef1b68f128ecc6338ef74f25fb74c482aa6))
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
6
20
|
## [6.4.6](https://github.com/pie-framework/pie-elements/compare/@pie-element/image-cloze-association-configure@6.4.5...@pie-element/image-cloze-association-configure@6.4.6) (2025-05-22)
|
|
7
21
|
|
|
8
22
|
|
package/configure/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pie-element/image-cloze-association-configure",
|
|
3
3
|
"private": true,
|
|
4
|
-
"version": "6.4.
|
|
4
|
+
"version": "6.4.7",
|
|
5
5
|
"description": "",
|
|
6
6
|
"main": "lib/index.js",
|
|
7
7
|
"module": "src/index.js",
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"dependencies": {
|
|
10
10
|
"@material-ui/core": "^3.9.2",
|
|
11
11
|
"@pie-framework/pie-configure-events": "^1.3.0",
|
|
12
|
-
"@pie-lib/pie-toolbox": "2.17.
|
|
12
|
+
"@pie-lib/pie-toolbox": "2.17.6",
|
|
13
13
|
"debug": "^3.1.0",
|
|
14
14
|
"prop-types": "^15.7.2",
|
|
15
15
|
"react": "^16.8.6",
|
package/controller/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,21 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [5.1.7](https://github.com/pie-framework/pie-elements/compare/@pie-element/image-cloze-association-controller@5.1.6...@pie-element/image-cloze-association-controller@5.1.7) (2025-06-05)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Bug Fixes
|
|
10
|
+
|
|
11
|
+
* add validation for audio content PD-4123 ([f0ce3f1](https://github.com/pie-framework/pie-elements/commit/f0ce3f19a12fd4cfe2d2159ca4af801d866dc8a9))
|
|
12
|
+
* update pie-lib pie-toolbox PD-3756 and revert changes for PD-4810 ([1e3030b](https://github.com/pie-framework/pie-elements/commit/1e3030bfdb13d0cce7b54ce0e9a109446c5ec2a2))
|
|
13
|
+
* update pie-lib-pie-toolbox PD-4810 ([6c81afc](https://github.com/pie-framework/pie-elements/commit/6c81afc6a8ad41e001bafb0bd1563164e9f32a10))
|
|
14
|
+
* update pie-lib-pie-toolbox PD-4810 ([0f9dd82](https://github.com/pie-framework/pie-elements/commit/0f9dd827c474e87770fd3bd146d870dd77d296df))
|
|
15
|
+
* update pie-lib/pie-toolbox PD-4888, PD-3542, PD-4873, PD-4679 ([9c3bdef](https://github.com/pie-framework/pie-elements/commit/9c3bdef1b68f128ecc6338ef74f25fb74c482aa6))
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
6
21
|
## [5.1.6](https://github.com/pie-framework/pie-elements/compare/@pie-element/image-cloze-association-controller@5.1.5...@pie-element/image-cloze-association-controller@5.1.6) (2025-05-22)
|
|
7
22
|
|
|
8
23
|
|
package/controller/lib/index.js
CHANGED
|
@@ -265,11 +265,11 @@ exports.createCorrectResponseSession = createCorrectResponseSession;
|
|
|
265
265
|
|
|
266
266
|
var getInnerText = function getInnerText(html) {
|
|
267
267
|
return (html || '').replaceAll(/<[^>]*>/g, '');
|
|
268
|
-
}; // remove all html tags except img and
|
|
268
|
+
}; // remove all html tags except img, iframe and source tag for audio
|
|
269
269
|
|
|
270
270
|
|
|
271
271
|
var getContent = function getContent(html) {
|
|
272
|
-
return (html || '').replace(/(<(?!img|iframe)([^>]+)>)/gi, '');
|
|
272
|
+
return (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
|
|
273
273
|
};
|
|
274
274
|
|
|
275
275
|
var validate = function validate() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.js"],"names":["log","normalize","question","defaults","model","session","env","questionNormalized","questionCamelized","Promise","resolve","shouldIncludeCorrectResponse","mode","role","out","disabled","responseCorrect","getScore","undefined","validation","shuffle","possibleResponses","possible_responses","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' || (env.role === 'instructor' && env.mode === 'view');\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 and iframe\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe)([^>]+)>)/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","role","out","disabled","responseCorrect","getScore","undefined","validation","shuffle","possibleResponses","possible_responses","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' || (env.role === 'instructor' && env.mode === 'view');\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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pie-element/image-cloze-association-controller",
|
|
3
3
|
"private": true,
|
|
4
|
-
"version": "5.1.
|
|
4
|
+
"version": "5.1.7",
|
|
5
5
|
"description": "",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"test": "echo \"Error: no test specified\" && exit 1"
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"main": "lib/index.js",
|
|
12
12
|
"module": "src/index.js",
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@pie-lib/pie-toolbox": "2.17.
|
|
14
|
+
"@pie-lib/pie-toolbox": "2.17.6",
|
|
15
15
|
"debug": "^4.1.1",
|
|
16
16
|
"humps": "^2.0.1",
|
|
17
17
|
"lodash": "^4.17.15"
|
package/controller/src/index.js
CHANGED
|
@@ -224,8 +224,8 @@ export const createCorrectResponseSession = (question, env) => {
|
|
|
224
224
|
// remove all html tags
|
|
225
225
|
const getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');
|
|
226
226
|
|
|
227
|
-
// remove all html tags except img and
|
|
228
|
-
const getContent = (html) => (html || '').replace(/(<(?!img|iframe)([^>]+)>)/gi, '');
|
|
227
|
+
// remove all html tags except img, iframe and source tag for audio
|
|
228
|
+
const getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
|
|
229
229
|
|
|
230
230
|
export const validate = (model = {}, config = {}) => {
|
|
231
231
|
const errors = {};
|
package/lib/image-container.js
CHANGED
|
@@ -73,8 +73,7 @@ var ImageContainer = /*#__PURE__*/function (_Component) {
|
|
|
73
73
|
}, /*#__PURE__*/_react["default"].createElement("img", {
|
|
74
74
|
src: src,
|
|
75
75
|
height: height,
|
|
76
|
-
width: width
|
|
77
|
-
alt: 'Image not found'
|
|
76
|
+
width: width
|
|
78
77
|
}), (responseContainers || []).map(function (r, i) {
|
|
79
78
|
var rHeight = r.height.replace('%', '') / 100 * height;
|
|
80
79
|
var rWidth = r.width.replace('%', '') / 100 * width;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/image-container.jsx"],"names":["ImageContainer","props","answers","canDrag","classes","draggingElement","image","height","src","width","onAnswerSelect","onDragAnswerBegin","onDragAnswerEnd","responseContainers","showDashedBorder","responseAreaFill","answerChoiceTransparency","responseContainerPadding","imageDropTargetPadding","maxResponsePerZone","base","map","r","i","rHeight","replace","rWidth","rLeft","x","rTop","y","answersParsed","filter","a","containerIndex","index","left","top","id","item","Component","propTypes","PropTypes","array","isRequired","bool","object","shape","func","string","number","defaultProps","styles","theme","margin","spacing","unit","position"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AAEA;;;;;;;;;;IAEMA,c;;;;;;;;;;;;WACJ,kBAAS;AACP,wBAgBI,KAAKC,KAhBT;AAAA,UACEC,OADF,eACEA,OADF;AAAA,UAEEC,OAFF,eAEEA,OAFF;AAAA,UAGEC,OAHF,eAGEA,OAHF;AAAA,UAIEC,eAJF,eAIEA,eAJF;AAAA,0CAKEC,KALF;AAAA,yDAKkC,EALlC;AAAA,UAKWC,MALX,qBAKWA,MALX;AAAA,UAKmBC,GALnB,qBAKmBA,GALnB;AAAA,UAKwBC,KALxB,qBAKwBA,KALxB;AAAA,UAMEC,cANF,eAMEA,cANF;AAAA,UAOEC,iBAPF,eAOEA,iBAPF;AAAA,UAQEC,eARF,eAQEA,eARF;AAAA,UASEC,kBATF,eASEA,kBATF;AAAA,UAUEC,gBAVF,eAUEA,gBAVF;AAAA,UAWEC,gBAXF,eAWEA,gBAXF;AAAA,UAYEC,wBAZF,eAYEA,wBAZF;AAAA,UAaEC,wBAbF,eAaEA,wBAbF;AAAA,UAcEC,sBAdF,eAcEA,sBAdF;AAAA,UAeEC,kBAfF,eAeEA,kBAfF;AAkBA,0BACE;AAAK,QAAA,SAAS,EAAEf,OAAO,CAACgB;AAAxB,sBACE;AAAK,QAAA,GAAG,EAAEZ,GAAV;AAAe,QAAA,MAAM,EAAED,MAAvB;AAA+B,QAAA,KAAK,EAAEE
|
|
1
|
+
{"version":3,"sources":["../src/image-container.jsx"],"names":["ImageContainer","props","answers","canDrag","classes","draggingElement","image","height","src","width","onAnswerSelect","onDragAnswerBegin","onDragAnswerEnd","responseContainers","showDashedBorder","responseAreaFill","answerChoiceTransparency","responseContainerPadding","imageDropTargetPadding","maxResponsePerZone","base","map","r","i","rHeight","replace","rWidth","rLeft","x","rTop","y","answersParsed","filter","a","containerIndex","index","left","top","id","item","Component","propTypes","PropTypes","array","isRequired","bool","object","shape","func","string","number","defaultProps","styles","theme","margin","spacing","unit","position"],"mappings":"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","sourcesContent":["import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core';\n\nimport ImageDropTarget from './image-drop-target';\n\nclass ImageContainer extends Component {\n render() {\n const {\n answers,\n canDrag,\n classes,\n draggingElement,\n image: { height, src, width } = {},\n onAnswerSelect,\n onDragAnswerBegin,\n onDragAnswerEnd,\n responseContainers,\n showDashedBorder,\n responseAreaFill,\n answerChoiceTransparency,\n responseContainerPadding,\n imageDropTargetPadding,\n maxResponsePerZone,\n } = this.props;\n\n return (\n <div className={classes.base}>\n <img src={src} height={height} width={width} />\n\n {(responseContainers || []).map((r, i) => {\n const rHeight = (r.height.replace('%', '') / 100) * height;\n const rWidth = (r.width.replace('%', '') / 100) * width;\n const rLeft = (r.x / 100) * width;\n const rTop = (r.y / 100) * height;\n const answersParsed = answers.filter((a) => a.containerIndex === r.index);\n\n return (\n <ImageDropTarget\n answers={answersParsed}\n canDrag={canDrag}\n containerStyle={{\n height: rHeight,\n width: rWidth,\n left: rLeft,\n top: rTop,\n }}\n key={r.id + i}\n draggingElement={draggingElement}\n onDrop={(item) => onAnswerSelect(item, r.index)}\n onDragAnswerBegin={onDragAnswerBegin}\n onDragAnswerEnd={onDragAnswerEnd}\n showDashedBorder={showDashedBorder}\n responseAreaFill={responseAreaFill}\n answerChoiceTransparency={answerChoiceTransparency}\n responseContainerPadding={responseContainerPadding}\n imageDropTargetPadding={imageDropTargetPadding}\n maxResponsePerZone={maxResponsePerZone}\n />\n );\n })}\n </div>\n );\n }\n}\n\nImageContainer.propTypes = {\n answers: PropTypes.array.isRequired,\n canDrag: PropTypes.bool.isRequired,\n classes: PropTypes.object,\n draggingElement: PropTypes.shape({}).isRequired,\n image: PropTypes.object.isRequired,\n onAnswerSelect: PropTypes.func.isRequired,\n onDragAnswerBegin: PropTypes.func.isRequired,\n onDragAnswerEnd: PropTypes.func.isRequired,\n responseContainers: PropTypes.array.isRequired,\n showDashedBorder: PropTypes.bool,\n answerChoiceTransparency: PropTypes.bool,\n responseAreaFill: PropTypes.string,\n responseContainerPadding: PropTypes.string,\n imageDropTargetPadding: PropTypes.string,\n maxResponsePerZone: PropTypes.number,\n};\n\nImageContainer.defaultProps = {\n classes: {},\n};\n\nconst styles = (theme) => ({\n base: {\n margin: theme.spacing.unit * 2,\n position: 'relative',\n width: 'fit-content',\n },\n});\n\nexport default withStyles(styles)(ImageContainer);\n"],"file":"image-container.js"}
|
package/lib/possible-response.js
CHANGED
|
@@ -7,18 +7,20 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
7
7
|
});
|
|
8
8
|
exports["default"] = exports.PossibleResponse = void 0;
|
|
9
9
|
|
|
10
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
11
|
-
|
|
12
10
|
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
13
11
|
|
|
14
12
|
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
15
13
|
|
|
14
|
+
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
|
|
15
|
+
|
|
16
16
|
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
17
17
|
|
|
18
18
|
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
|
19
19
|
|
|
20
20
|
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
21
21
|
|
|
22
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
23
|
+
|
|
22
24
|
var _react = _interopRequireDefault(require("react"));
|
|
23
25
|
|
|
24
26
|
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
@@ -31,6 +33,8 @@ var _drag = require("@pie-lib/pie-toolbox/drag");
|
|
|
31
33
|
|
|
32
34
|
var _renderUi = require("@pie-lib/pie-toolbox/render-ui");
|
|
33
35
|
|
|
36
|
+
var _reactDom = _interopRequireDefault(require("react-dom"));
|
|
37
|
+
|
|
34
38
|
var _evaluationIcon = _interopRequireDefault(require("./evaluation-icon"));
|
|
35
39
|
|
|
36
40
|
var _constants = _interopRequireDefault(require("./constants"));
|
|
@@ -47,21 +51,71 @@ var PossibleResponse = /*#__PURE__*/function (_React$Component) {
|
|
|
47
51
|
var _super = _createSuper(PossibleResponse);
|
|
48
52
|
|
|
49
53
|
function PossibleResponse() {
|
|
54
|
+
var _this;
|
|
55
|
+
|
|
50
56
|
(0, _classCallCheck2["default"])(this, PossibleResponse);
|
|
51
|
-
|
|
57
|
+
|
|
58
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
59
|
+
args[_key] = arguments[_key];
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
_this = _super.call.apply(_super, [this].concat(args));
|
|
63
|
+
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleTouchEnd", function () {
|
|
64
|
+
clearTimeout(_this.longPressTimer);
|
|
65
|
+
});
|
|
66
|
+
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleTouchMove", function () {
|
|
67
|
+
clearTimeout(_this.longPressTimer);
|
|
68
|
+
});
|
|
69
|
+
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleTouchStart", function (e) {
|
|
70
|
+
e.preventDefault();
|
|
71
|
+
_this.longPressTimer = setTimeout(function () {
|
|
72
|
+
_this.startDrag();
|
|
73
|
+
}, 500); // start drag after 500ms (touch and hold duration) for chromebooks and other touch devices
|
|
74
|
+
});
|
|
75
|
+
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "startDrag", function () {
|
|
76
|
+
var _this$props = _this.props,
|
|
77
|
+
connectDragSource = _this$props.connectDragSource,
|
|
78
|
+
disabled = _this$props.disabled;
|
|
79
|
+
|
|
80
|
+
if (!disabled) {
|
|
81
|
+
connectDragSource(_this.rootRef);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
return _this;
|
|
52
85
|
}
|
|
53
86
|
|
|
54
87
|
(0, _createClass2["default"])(PossibleResponse, [{
|
|
88
|
+
key: "componentDidMount",
|
|
89
|
+
value: function componentDidMount() {
|
|
90
|
+
if (this.rootRef) {
|
|
91
|
+
this.rootRef.addEventListener('touchstart', this.handleTouchStart, {
|
|
92
|
+
passive: false
|
|
93
|
+
});
|
|
94
|
+
this.rootRef.addEventListener('touchend', this.handleTouchEnd);
|
|
95
|
+
this.rootRef.addEventListener('touchmove', this.handleTouchMove);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}, {
|
|
99
|
+
key: "componentWillUnmount",
|
|
100
|
+
value: function componentWillUnmount() {
|
|
101
|
+
if (this.rootRef) {
|
|
102
|
+
this.rootRef.removeEventListener('touchstart', this.handleTouchStart);
|
|
103
|
+
this.rootRef.removeEventListener('touchend', this.handleTouchEnd);
|
|
104
|
+
this.rootRef.removeEventListener('touchmove', this.handleTouchMove);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}, {
|
|
55
108
|
key: "render",
|
|
56
109
|
value: function render() {
|
|
57
|
-
var _ref2
|
|
110
|
+
var _ref2,
|
|
111
|
+
_this2 = this;
|
|
58
112
|
|
|
59
|
-
var _this$
|
|
60
|
-
classes = _this$
|
|
61
|
-
connectDragSource = _this$
|
|
62
|
-
containerStyle = _this$
|
|
63
|
-
data = _this$
|
|
64
|
-
answerChoiceTransparency = _this$
|
|
113
|
+
var _this$props2 = this.props,
|
|
114
|
+
classes = _this$props2.classes,
|
|
115
|
+
connectDragSource = _this$props2.connectDragSource,
|
|
116
|
+
containerStyle = _this$props2.containerStyle,
|
|
117
|
+
data = _this$props2.data,
|
|
118
|
+
answerChoiceTransparency = _this$props2.answerChoiceTransparency;
|
|
65
119
|
|
|
66
120
|
var _ref = data || {},
|
|
67
121
|
isCorrect = _ref.isCorrect;
|
|
@@ -79,7 +133,11 @@ var PossibleResponse = /*#__PURE__*/function (_React$Component) {
|
|
|
79
133
|
var promptClassNames = (0, _classnames["default"])([classes.span, (0, _defineProperty2["default"])({}, classes.hiddenSpan, data.hidden)]);
|
|
80
134
|
return connectDragSource( /*#__PURE__*/_react["default"].createElement("div", {
|
|
81
135
|
className: containerClassNames,
|
|
82
|
-
style: containerStyle
|
|
136
|
+
style: containerStyle,
|
|
137
|
+
ref: function ref(_ref4) {
|
|
138
|
+
//eslint-disable-next-line
|
|
139
|
+
_this2.rootRef = _reactDom["default"].findDOMNode(_ref4);
|
|
140
|
+
}
|
|
83
141
|
}, /*#__PURE__*/_react["default"].createElement(_staticHtmlSpan["default"], {
|
|
84
142
|
html: data.value,
|
|
85
143
|
className: promptClassNames
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/possible-response.jsx"],"names":["PossibleResponse","props","classes","connectDragSource","containerStyle","data","answerChoiceTransparency","isCorrect","evaluationStyle","fontSize","position","bottom","right","correctnessClass","undefined","imgRegex","containsImage","test","value","containerClassNames","base","textAnswerChoiceStyle","promptClassNames","span","hiddenSpan","hidden","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';\n\nimport EvaluationIcon from './evaluation-icon';\nimport c from './constants';\nimport StaticHTMLSpan from './static-html-span';\n\nexport class PossibleResponse extends React.Component {\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 className={containerClassNames} style={containerStyle}>\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/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"}
|
package/lib/root.js
CHANGED
|
@@ -323,6 +323,8 @@ var ImageClozeAssociationComponent = /*#__PURE__*/function (_React$Component) {
|
|
|
323
323
|
validResponse = _ref3.validResponse;
|
|
324
324
|
|
|
325
325
|
var correctAnswers = [];
|
|
326
|
+
var showRationale = rationale && ((0, _renderUi.hasText)(rationale) || (0, _renderUi.hasMedia)(rationale));
|
|
327
|
+
var showTeacherInstructions = teacherInstructions && ((0, _renderUi.hasText)(teacherInstructions) || (0, _renderUi.hasMedia)(teacherInstructions));
|
|
326
328
|
|
|
327
329
|
if (validResponse) {
|
|
328
330
|
(validResponse.value || []).forEach(function (container, i) {
|
|
@@ -393,7 +395,7 @@ var ImageClozeAssociationComponent = /*#__PURE__*/function (_React$Component) {
|
|
|
393
395
|
id: 'main-container',
|
|
394
396
|
className: classes.main,
|
|
395
397
|
fontSizeFactor: fontSizeFactor
|
|
396
|
-
},
|
|
398
|
+
}, showTeacherInstructions && /*#__PURE__*/_react["default"].createElement(_renderUi.Collapsible, {
|
|
397
399
|
className: classes.teacherInstructions,
|
|
398
400
|
labels: {
|
|
399
401
|
hidden: 'Show Teacher Instructions',
|
|
@@ -416,7 +418,7 @@ var ImageClozeAssociationComponent = /*#__PURE__*/function (_React$Component) {
|
|
|
416
418
|
}), /*#__PURE__*/_react["default"].createElement(_interactiveSection["default"], {
|
|
417
419
|
responseCorrect: showCorrect && showToggle ? true : responseCorrect,
|
|
418
420
|
uiStyle: uiStyle
|
|
419
|
-
}, renderImage(), renderPossibleResponses()),
|
|
421
|
+
}, renderImage(), renderPossibleResponses()), showRationale && /*#__PURE__*/_react["default"].createElement(_renderUi.Collapsible, {
|
|
420
422
|
className: classes.rationale,
|
|
421
423
|
labels: {
|
|
422
424
|
hidden: 'Show Rationale',
|
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","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","groupBy","grp","slice","flatMap","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","container","i","images","v","isCorrect","warningMessage","t","lng","count","answersToShow","sharedImageProps","onAnswerSelect","handleOnAnswerSelect","onDragAnswerBegin","beginDrag","onDragAnswerEnd","handleOnDragEnd","renderImage","renderPossibleResponses","handleOnAnswerRemove","minWidth","width","height","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/pie-toolbox/drag';\nimport { CSSTransition, TransitionGroup } from 'react-transition-group';\nimport { color, Collapsible, PreviewPrompt, UiLayout, hasText } 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';\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';\nimport _ from 'lodash';\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 },\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 answers = _(answers || [])\n .groupBy('containerIndex')\n // keep only last maxResponsePerZone answers for each zone\n .map((grp) => grp.slice(-(maxResponsePerZone || 1)))\n .flatMap()\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 .value();\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\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 {teacherInstructions && hasText(teacherInstructions) && (\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 {rationale && hasText(rationale) && (\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","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","groupBy","grp","slice","flatMap","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","height","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/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';\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';\nimport _ from 'lodash';\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 },\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 answers = _(answers || [])\n .groupBy('containerIndex')\n // keep only last maxResponsePerZone answers for each zone\n .map((grp) => grp.slice(-(maxResponsePerZone || 1)))\n .flatMap()\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 .value();\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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pie-element/image-cloze-association",
|
|
3
|
-
"version": "6.11.7
|
|
3
|
+
"version": "6.11.7",
|
|
4
4
|
"description": "",
|
|
5
5
|
"repository": "pie-framework/pie-elements",
|
|
6
6
|
"publishConfig": {
|
|
@@ -10,7 +10,7 @@
|
|
|
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/pie-toolbox": "2.17.
|
|
13
|
+
"@pie-lib/pie-toolbox": "2.17.6",
|
|
14
14
|
"classnames": "^2.2.6",
|
|
15
15
|
"humps": "^2.0.1",
|
|
16
16
|
"prop-types": "^15.6.1",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
},
|
|
20
20
|
"author": "pie framework developers",
|
|
21
21
|
"license": "ISC",
|
|
22
|
-
"gitHead": "
|
|
22
|
+
"gitHead": "148a29a55830c59e50e390d512b19d730e3d1663",
|
|
23
23
|
"scripts": {
|
|
24
24
|
"postpublish": "../../scripts/postpublish"
|
|
25
25
|
},
|
package/src/image-container.jsx
CHANGED
|
@@ -26,7 +26,7 @@ class ImageContainer extends Component {
|
|
|
26
26
|
|
|
27
27
|
return (
|
|
28
28
|
<div className={classes.base}>
|
|
29
|
-
<img src={src} height={height} width={width}
|
|
29
|
+
<img src={src} height={height} width={width} />
|
|
30
30
|
|
|
31
31
|
{(responseContainers || []).map((r, i) => {
|
|
32
32
|
const rHeight = (r.height.replace('%', '') / 100) * height;
|
|
@@ -4,12 +4,51 @@ import classNames from 'classnames';
|
|
|
4
4
|
import { withStyles } from '@material-ui/core/styles';
|
|
5
5
|
import { DragSource } from '@pie-lib/pie-toolbox/drag';
|
|
6
6
|
import { color } from '@pie-lib/pie-toolbox/render-ui';
|
|
7
|
+
import ReactDOM from 'react-dom';
|
|
7
8
|
|
|
8
9
|
import EvaluationIcon from './evaluation-icon';
|
|
9
10
|
import c from './constants';
|
|
10
11
|
import StaticHTMLSpan from './static-html-span';
|
|
11
12
|
|
|
12
13
|
export class PossibleResponse extends React.Component {
|
|
14
|
+
handleTouchEnd = () => {
|
|
15
|
+
clearTimeout(this.longPressTimer);
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
handleTouchMove = () => {
|
|
19
|
+
clearTimeout(this.longPressTimer);
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
handleTouchStart = (e) => {
|
|
23
|
+
e.preventDefault();
|
|
24
|
+
this.longPressTimer = setTimeout(() => {
|
|
25
|
+
this.startDrag();
|
|
26
|
+
}, 500); // start drag after 500ms (touch and hold duration) for chromebooks and other touch devices
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
componentDidMount() {
|
|
30
|
+
if (this.rootRef) {
|
|
31
|
+
this.rootRef.addEventListener('touchstart', this.handleTouchStart, { passive: false });
|
|
32
|
+
this.rootRef.addEventListener('touchend', this.handleTouchEnd);
|
|
33
|
+
this.rootRef.addEventListener('touchmove', this.handleTouchMove);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
componentWillUnmount() {
|
|
38
|
+
if (this.rootRef) {
|
|
39
|
+
this.rootRef.removeEventListener('touchstart', this.handleTouchStart);
|
|
40
|
+
this.rootRef.removeEventListener('touchend', this.handleTouchEnd);
|
|
41
|
+
this.rootRef.removeEventListener('touchmove', this.handleTouchMove);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
startDrag = () => {
|
|
46
|
+
const { connectDragSource, disabled } = this.props;
|
|
47
|
+
if (!disabled) {
|
|
48
|
+
connectDragSource(this.rootRef);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
|
|
13
52
|
render() {
|
|
14
53
|
const { classes, connectDragSource, containerStyle, data, answerChoiceTransparency } = this.props;
|
|
15
54
|
const { isCorrect } = data || {};
|
|
@@ -39,9 +78,15 @@ export class PossibleResponse extends React.Component {
|
|
|
39
78
|
]);
|
|
40
79
|
|
|
41
80
|
return connectDragSource(
|
|
42
|
-
<div
|
|
43
|
-
|
|
44
|
-
|
|
81
|
+
<div
|
|
82
|
+
className={containerClassNames}
|
|
83
|
+
style={containerStyle}
|
|
84
|
+
ref={(ref) => {
|
|
85
|
+
//eslint-disable-next-line
|
|
86
|
+
this.rootRef = ReactDOM.findDOMNode(ref);
|
|
87
|
+
}}>
|
|
88
|
+
<StaticHTMLSpan html={data.value} className={promptClassNames}/>
|
|
89
|
+
<EvaluationIcon isCorrect={data.isCorrect} containerStyle={evaluationStyle}/>
|
|
45
90
|
</div>,
|
|
46
91
|
);
|
|
47
92
|
}
|
package/src/root.jsx
CHANGED
|
@@ -2,7 +2,7 @@ import React from 'react';
|
|
|
2
2
|
import PropTypes from 'prop-types';
|
|
3
3
|
import { withDragContext } from '@pie-lib/pie-toolbox/drag';
|
|
4
4
|
import { CSSTransition, TransitionGroup } from 'react-transition-group';
|
|
5
|
-
import { color, Collapsible, PreviewPrompt, UiLayout, hasText } from '@pie-lib/pie-toolbox/render-ui';
|
|
5
|
+
import { color, Collapsible, PreviewPrompt, UiLayout, hasText, hasMedia } from '@pie-lib/pie-toolbox/render-ui';
|
|
6
6
|
import { withStyles } from '@material-ui/core/styles';
|
|
7
7
|
import NotInterestedIcon from '@material-ui/icons/NotInterested';
|
|
8
8
|
import { CorrectAnswerToggle } from '@pie-lib/pie-toolbox/correct-answer-toggle';
|
|
@@ -243,6 +243,8 @@ export class ImageClozeAssociationComponent extends React.Component {
|
|
|
243
243
|
|
|
244
244
|
const { validResponse } = validation || {};
|
|
245
245
|
const correctAnswers = [];
|
|
246
|
+
const showRationale = rationale && (hasText(rationale) || hasMedia(rationale));
|
|
247
|
+
const showTeacherInstructions = teacherInstructions && (hasText(teacherInstructions) || hasMedia(teacherInstructions));
|
|
246
248
|
|
|
247
249
|
if (validResponse) {
|
|
248
250
|
(validResponse.value || []).forEach((container, i) => {
|
|
@@ -319,7 +321,7 @@ export class ImageClozeAssociationComponent extends React.Component {
|
|
|
319
321
|
|
|
320
322
|
return (
|
|
321
323
|
<UiLayout extraCSSRules={extraCSSRules} id={'main-container'} className={classes.main} fontSizeFactor={fontSizeFactor}>
|
|
322
|
-
{
|
|
324
|
+
{showTeacherInstructions && (
|
|
323
325
|
<Collapsible
|
|
324
326
|
className={classes.teacherInstructions}
|
|
325
327
|
labels={{
|
|
@@ -355,7 +357,7 @@ export class ImageClozeAssociationComponent extends React.Component {
|
|
|
355
357
|
{renderPossibleResponses()}
|
|
356
358
|
</InteractiveSection>
|
|
357
359
|
|
|
358
|
-
{
|
|
360
|
+
{showRationale && (
|
|
359
361
|
<Collapsible
|
|
360
362
|
className={classes.rationale}
|
|
361
363
|
labels={{
|