@pie-element/hotspot 6.6.1 → 6.6.2-next.2

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.
@@ -10,7 +10,8 @@ var _default = {
10
10
  imageUrl: '',
11
11
  shapes: {
12
12
  rectangles: [],
13
- polygons: []
13
+ polygons: [],
14
+ circles: []
14
15
  },
15
16
  multipleCorrect: true,
16
17
  partialScoring: false,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/defaults.js"],"names":["prompt","toolbarEditorPosition","imageUrl","shapes","rectangles","polygons","multipleCorrect","partialScoring","dimensions","height","width","hotspotColor","hotspotList","outlineColor","outlineList","promptEnabled","rationaleEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","strokeWidth"],"mappings":";;;;;;eAAe;AACbA,EAAAA,MAAM,EAAE,EADK;AAEbC,EAAAA,qBAAqB,EAAE,QAFV;AAGbC,EAAAA,QAAQ,EAAE,EAHG;AAIbC,EAAAA,MAAM,EAAE;AACNC,IAAAA,UAAU,EAAE,EADN;AAENC,IAAAA,QAAQ,EAAE;AAFJ,GAJK;AAQbC,EAAAA,eAAe,EAAE,IARJ;AASbC,EAAAA,cAAc,EAAE,KATH;AAUbC,EAAAA,UAAU,EAAE;AACVC,IAAAA,MAAM,EAAE,CADE;AAEVC,IAAAA,KAAK,EAAE;AAFG,GAVC;AAcbC,EAAAA,YAAY,EAAE,2BAdD;AAebC,EAAAA,WAAW,EAAE,CAAC,2BAAD,CAfA;AAgBbC,EAAAA,YAAY,EAAE,MAhBD;AAiBbC,EAAAA,WAAW,EAAE,CAAC,MAAD,CAjBA;AAkBbC,EAAAA,aAAa,EAAE,IAlBF;AAmBbC,EAAAA,gBAAgB,EAAE,IAnBL;AAoBbC,EAAAA,0BAA0B,EAAE,IApBf;AAqBbC,EAAAA,0BAA0B,EAAE,IArBf;AAsBbC,EAAAA,WAAW,EAAE;AAtBA,C","sourcesContent":["export default {\n prompt: '',\n toolbarEditorPosition: 'bottom',\n imageUrl: '',\n shapes: {\n rectangles: [],\n polygons: [],\n },\n multipleCorrect: true,\n partialScoring: false,\n dimensions: {\n height: 0,\n width: 0,\n },\n hotspotColor: 'rgba(137, 183, 244, 0.25)',\n hotspotList: ['rgba(137, 183, 244, 0.25)'],\n outlineColor: 'blue',\n outlineList: ['blue'],\n promptEnabled: true,\n rationaleEnabled: true,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n strokeWidth: 5,\n};\n"],"file":"defaults.js"}
1
+ {"version":3,"sources":["../src/defaults.js"],"names":["prompt","toolbarEditorPosition","imageUrl","shapes","rectangles","polygons","circles","multipleCorrect","partialScoring","dimensions","height","width","hotspotColor","hotspotList","outlineColor","outlineList","promptEnabled","rationaleEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","strokeWidth"],"mappings":";;;;;;eAAe;AACbA,EAAAA,MAAM,EAAE,EADK;AAEbC,EAAAA,qBAAqB,EAAE,QAFV;AAGbC,EAAAA,QAAQ,EAAE,EAHG;AAIbC,EAAAA,MAAM,EAAE;AACNC,IAAAA,UAAU,EAAE,EADN;AAENC,IAAAA,QAAQ,EAAE,EAFJ;AAGNC,IAAAA,OAAO,EAAE;AAHH,GAJK;AASbC,EAAAA,eAAe,EAAE,IATJ;AAUbC,EAAAA,cAAc,EAAE,KAVH;AAWbC,EAAAA,UAAU,EAAE;AACVC,IAAAA,MAAM,EAAE,CADE;AAEVC,IAAAA,KAAK,EAAE;AAFG,GAXC;AAebC,EAAAA,YAAY,EAAE,2BAfD;AAgBbC,EAAAA,WAAW,EAAE,CAAC,2BAAD,CAhBA;AAiBbC,EAAAA,YAAY,EAAE,MAjBD;AAkBbC,EAAAA,WAAW,EAAE,CAAC,MAAD,CAlBA;AAmBbC,EAAAA,aAAa,EAAE,IAnBF;AAoBbC,EAAAA,gBAAgB,EAAE,IApBL;AAqBbC,EAAAA,0BAA0B,EAAE,IArBf;AAsBbC,EAAAA,0BAA0B,EAAE,IAtBf;AAuBbC,EAAAA,WAAW,EAAE;AAvBA,C","sourcesContent":["export default {\n prompt: '',\n toolbarEditorPosition: 'bottom',\n imageUrl: '',\n shapes: {\n rectangles: [],\n polygons: [],\n circles: [],\n },\n multipleCorrect: true,\n partialScoring: false,\n dimensions: {\n height: 0,\n width: 0,\n },\n hotspotColor: 'rgba(137, 183, 244, 0.25)',\n hotspotList: ['rgba(137, 183, 244, 0.25)'],\n outlineColor: 'blue',\n outlineList: ['blue'],\n promptEnabled: true,\n rationaleEnabled: true,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n strokeWidth: 5,\n};\n"],"file":"defaults.js"}
@@ -28,7 +28,8 @@ var _utils = require("./utils");
28
28
  var _defaults = _interopRequireDefault(require("./defaults"));
29
29
 
30
30
  var _excluded = ["index"],
31
- _excluded2 = ["index"];
31
+ _excluded2 = ["index"],
32
+ _excluded3 = ["index"];
32
33
 
33
34
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
34
35
 
@@ -56,7 +57,8 @@ function model(question, session, env) {
56
57
 
57
58
  var _ref = shapes || {},
58
59
  rectangles = _ref.rectangles,
59
- polygons = _ref.polygons;
60
+ polygons = _ref.polygons,
61
+ circles = _ref.circles;
60
62
 
61
63
  return new Promise(function (resolve) {
62
64
  var out = {
@@ -81,6 +83,12 @@ function model(question, session, env) {
81
83
  var index = _ref3.index,
82
84
  polyProps = (0, _objectWithoutProperties2["default"])(_ref3, _excluded2);
83
85
  return _objectSpread({}, polyProps);
86
+ }),
87
+ // eslint-disable-next-line no-unused-vars
88
+ circles: (circles || []).map(function (_ref4) {
89
+ var index = _ref4.index,
90
+ circleProps = (0, _objectWithoutProperties2["default"])(_ref4, _excluded3);
91
+ return _objectSpread({}, circleProps);
84
92
  })
85
93
  }),
86
94
  responseCorrect: env.mode === 'evaluate' ? (0, _utils.isResponseCorrect)(normalizedQuestion, session) : undefined
@@ -113,10 +121,10 @@ exports.createDefaultModel = createDefaultModel;
113
121
  var getScore = function getScore(config, session) {
114
122
  var env = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
115
123
 
116
- var _ref4 = session || {},
117
- answers = _ref4.answers;
124
+ var _ref5 = session || {},
125
+ answers = _ref5.answers;
118
126
 
119
- if (!config.shapes || !config.shapes.rectangles && !config.shapes.polygons) {
127
+ if (!config.shapes || !config.shapes.rectangles && !config.shapes.polygons && !config.shapes.circles) {
120
128
  return 0;
121
129
  }
122
130
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.js"],"names":["log","normalize","question","defaults","model","session","env","normalizedQuestion","imageUrl","dimensions","hotspotColor","multipleCorrect","outlineColor","partialScoring","prompt","shapes","language","rectangles","polygons","Promise","resolve","out","disabled","mode","map","index","rectProps","polyProps","responseCorrect","undefined","role","rationale","rationaleEnabled","teacherInstructions","teacherInstructionsEnabled","promptEnabled","strokeWidth","createDefaultModel","getScore","config","answers","circles","partialScoringEnabled","enabled","correctAnswers","selectedChoices","choices","correctChoices","filter","choice","correct","forEach","shape","selected","answer","id","correctlySelected","extraAnswers","length","total","str","toFixed","parseFloat","outcome","score","empty","returnShapesCorrect","i","push","createCorrectResponseSession","rectangleCorrect","polygonsCorrect","circlesCorrect","validate","minShapes","maxShapes","maxSelections","errors","allShapes","Object","values","reduce","acc","nbOfSelections","nbOfShapes","shapesError","selectionsError"],"mappings":"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","sourcesContent":["import debug from 'debug';\nimport isEmpty from 'lodash/isEmpty';\nimport { partialScoring } from '@pie-lib/pie-toolbox/controller-utils';\n\nimport { isResponseCorrect } from './utils';\n\nimport defaults from './defaults';\n\nconst log = debug('pie-elements:hotspot:controller');\n\nexport const normalize = (question) => ({\n ...defaults,\n ...question,\n});\n\nexport function model(question, session, env) {\n const normalizedQuestion = normalize(question);\n const {\n imageUrl,\n dimensions,\n hotspotColor,\n multipleCorrect,\n outlineColor,\n partialScoring,\n prompt,\n shapes,\n language,\n } = normalizedQuestion;\n const { rectangles, polygons } = shapes || {};\n\n return new Promise((resolve) => {\n const out = {\n disabled: env.mode !== 'gather',\n mode: env.mode,\n dimensions,\n imageUrl,\n outlineColor,\n hotspotColor,\n multipleCorrect,\n partialScoring,\n language,\n shapes: {\n ...shapes,\n // eslint-disable-next-line no-unused-vars\n rectangles: (rectangles || []).map(({ index, ...rectProps }) => ({ ...rectProps })),\n // eslint-disable-next-line no-unused-vars\n polygons: (polygons || []).map(({ index, ...polyProps }) => ({ ...polyProps })),\n },\n responseCorrect: env.mode === 'evaluate' ? isResponseCorrect(normalizedQuestion, session) : undefined,\n };\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n out.prompt = normalizedQuestion.promptEnabled ? prompt : null;\n out.strokeWidth = normalizedQuestion.strokeWidth;\n\n // console.log(out);\n resolve(out);\n });\n}\n\nexport const createDefaultModel = (model = {}) =>\n new Promise((resolve) => {\n resolve({\n ...defaults,\n ...model,\n });\n });\n\nconst getScore = (config, session, env = {}) => {\n const { answers } = session || {};\n\n if (!config.shapes || (!config.shapes.rectangles && !config.shapes.polygons)) {\n return 0;\n }\n\n const { shapes: { rectangles = [], polygons = [], circles = [] } = {} } = config;\n const partialScoringEnabled = partialScoring.enabled(config, env);\n\n if (!partialScoringEnabled) {\n return isResponseCorrect(config, session) ? 1 : 0;\n }\n\n let correctAnswers = 0;\n let selectedChoices = 0;\n\n const choices = [...rectangles, ...polygons, ...circles];\n\n const correctChoices = choices.filter((choice) => choice.correct);\n\n choices.forEach((shape) => {\n const selected = answers && answers.filter((answer) => answer.id === shape.id)[0];\n const correctlySelected = shape.correct && selected;\n\n if (selected) {\n selectedChoices += 1;\n }\n\n if (correctlySelected) {\n correctAnswers += 1;\n }\n });\n\n const extraAnswers = selectedChoices > correctChoices.length ? selectedChoices - correctChoices.length : 0;\n\n const total = correctChoices.length === 0 ? 1 : correctChoices.length;\n const str = ((correctAnswers - extraAnswers) / total).toFixed(2);\n\n return str < 0 ? 0 : parseFloat(str);\n};\n\nexport function outcome(config, session, env = {}) {\n return new Promise((resolve) => {\n log('outcome...');\n\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n }\n\n if (session.answers) {\n const score = getScore(config, session, env);\n resolve({ score });\n } else {\n resolve({ score: 0, empty: true });\n }\n });\n}\n\nconst returnShapesCorrect = (shapes) => {\n let answers = [];\n\n shapes.forEach((i) => {\n const { correct, id } = i;\n if (correct) {\n answers.push({ id });\n }\n });\n return answers;\n};\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { shapes: { rectangles = [], circles = [], polygons = {} } = {} } = question;\n\n const rectangleCorrect = returnShapesCorrect(rectangles);\n const polygonsCorrect = returnShapesCorrect(polygons);\n const circlesCorrect = returnShapesCorrect(circles);\n\n resolve({\n answers: [...rectangleCorrect, ...polygonsCorrect, ...circlesCorrect],\n id: '1',\n });\n } else {\n resolve(null);\n }\n });\n};\n\nexport const validate = (model = {}, config = {}) => {\n const { shapes } = model;\n const { minShapes = 2, maxShapes, maxSelections } = config;\n const errors = {};\n\n const allShapes = Object.values(shapes || {}).reduce((acc, shape) => [...acc, ...shape], []);\n\n const nbOfSelections = (allShapes || []).reduce((acc, shape) => (shape.correct ? acc + 1 : acc), 0);\n\n const nbOfShapes = (allShapes || []).length;\n\n if (nbOfShapes < minShapes) {\n errors.shapesError = `There should be at least ${minShapes} shapes defined.`;\n } else if (nbOfShapes > maxShapes) {\n errors.shapesError = `No more than ${maxShapes} shapes should be defined.`;\n }\n\n if (nbOfSelections < 1) {\n errors.selectionsError = 'There should be at least 1 shape selected.';\n } else if (nbOfSelections > maxSelections) {\n errors.selectionsError = `No more than ${maxSelections} shapes should be selected.`;\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","normalizedQuestion","imageUrl","dimensions","hotspotColor","multipleCorrect","outlineColor","partialScoring","prompt","shapes","language","rectangles","polygons","circles","Promise","resolve","out","disabled","mode","map","index","rectProps","polyProps","circleProps","responseCorrect","undefined","role","rationale","rationaleEnabled","teacherInstructions","teacherInstructionsEnabled","promptEnabled","strokeWidth","createDefaultModel","getScore","config","answers","partialScoringEnabled","enabled","correctAnswers","selectedChoices","choices","correctChoices","filter","choice","correct","forEach","shape","selected","answer","id","correctlySelected","extraAnswers","length","total","str","toFixed","parseFloat","outcome","score","empty","returnShapesCorrect","i","push","createCorrectResponseSession","rectangleCorrect","polygonsCorrect","circlesCorrect","validate","minShapes","maxShapes","maxSelections","errors","allShapes","Object","values","reduce","acc","nbOfSelections","nbOfShapes","shapesError","selectionsError"],"mappings":"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","sourcesContent":["import debug from 'debug';\nimport isEmpty from 'lodash/isEmpty';\nimport { partialScoring } from '@pie-lib/pie-toolbox/controller-utils';\n\nimport { isResponseCorrect } from './utils';\n\nimport defaults from './defaults';\n\nconst log = debug('pie-elements:hotspot:controller');\n\nexport const normalize = (question) => ({\n ...defaults,\n ...question,\n});\n\nexport function model(question, session, env) {\n const normalizedQuestion = normalize(question);\n const {\n imageUrl,\n dimensions,\n hotspotColor,\n multipleCorrect,\n outlineColor,\n partialScoring,\n prompt,\n shapes,\n language,\n } = normalizedQuestion;\n const { rectangles, polygons, circles } = shapes || {};\n\n return new Promise((resolve) => {\n const out = {\n disabled: env.mode !== 'gather',\n mode: env.mode,\n dimensions,\n imageUrl,\n outlineColor,\n hotspotColor,\n multipleCorrect,\n partialScoring,\n language,\n shapes: {\n ...shapes,\n // eslint-disable-next-line no-unused-vars\n rectangles: (rectangles || []).map(({ index, ...rectProps }) => ({ ...rectProps })),\n // eslint-disable-next-line no-unused-vars\n polygons: (polygons || []).map(({ index, ...polyProps }) => ({ ...polyProps })),\n // eslint-disable-next-line no-unused-vars\n circles: (circles || []).map(({ index, ...circleProps }) => ({ ...circleProps })),\n },\n responseCorrect: env.mode === 'evaluate' ? isResponseCorrect(normalizedQuestion, session) : undefined,\n };\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n out.prompt = normalizedQuestion.promptEnabled ? prompt : null;\n out.strokeWidth = normalizedQuestion.strokeWidth;\n\n // console.log(out);\n resolve(out);\n });\n}\n\nexport const createDefaultModel = (model = {}) =>\n new Promise((resolve) => {\n resolve({\n ...defaults,\n ...model,\n });\n });\n\nconst getScore = (config, session, env = {}) => {\n const { answers } = session || {};\n\n if (!config.shapes || (!config.shapes.rectangles && !config.shapes.polygons && !config.shapes.circles)) {\n return 0;\n }\n\n const { shapes: { rectangles = [], polygons = [], circles = [] } = {} } = config;\n const partialScoringEnabled = partialScoring.enabled(config, env);\n\n if (!partialScoringEnabled) {\n return isResponseCorrect(config, session) ? 1 : 0;\n }\n\n let correctAnswers = 0;\n let selectedChoices = 0;\n\n const choices = [...rectangles, ...polygons, ...circles];\n\n const correctChoices = choices.filter((choice) => choice.correct);\n\n choices.forEach((shape) => {\n const selected = answers && answers.filter((answer) => answer.id === shape.id)[0];\n const correctlySelected = shape.correct && selected;\n\n if (selected) {\n selectedChoices += 1;\n }\n\n if (correctlySelected) {\n correctAnswers += 1;\n }\n });\n\n const extraAnswers = selectedChoices > correctChoices.length ? selectedChoices - correctChoices.length : 0;\n\n const total = correctChoices.length === 0 ? 1 : correctChoices.length;\n const str = ((correctAnswers - extraAnswers) / total).toFixed(2);\n\n return str < 0 ? 0 : parseFloat(str);\n};\n\nexport function outcome(config, session, env = {}) {\n return new Promise((resolve) => {\n log('outcome...');\n\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n }\n\n if (session.answers) {\n const score = getScore(config, session, env);\n resolve({ score });\n } else {\n resolve({ score: 0, empty: true });\n }\n });\n}\n\nconst returnShapesCorrect = (shapes) => {\n let answers = [];\n\n shapes.forEach((i) => {\n const { correct, id } = i;\n if (correct) {\n answers.push({ id });\n }\n });\n return answers;\n};\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { shapes: { rectangles = [], circles = [], polygons = {} } = {} } = question;\n\n const rectangleCorrect = returnShapesCorrect(rectangles);\n const polygonsCorrect = returnShapesCorrect(polygons);\n const circlesCorrect = returnShapesCorrect(circles);\n\n resolve({\n answers: [...rectangleCorrect, ...polygonsCorrect, ...circlesCorrect],\n id: '1',\n });\n } else {\n resolve(null);\n }\n });\n};\n\nexport const validate = (model = {}, config = {}) => {\n const { shapes } = model;\n const { minShapes = 2, maxShapes, maxSelections } = config;\n const errors = {};\n\n const allShapes = Object.values(shapes || {}).reduce((acc, shape) => [...acc, ...shape], []);\n\n const nbOfSelections = (allShapes || []).reduce((acc, shape) => (shape.correct ? acc + 1 : acc), 0);\n\n const nbOfShapes = (allShapes || []).length;\n\n if (nbOfShapes < minShapes) {\n errors.shapesError = `There should be at least ${minShapes} shapes defined.`;\n } else if (nbOfShapes > maxShapes) {\n errors.shapesError = `No more than ${maxShapes} shapes should be defined.`;\n }\n\n if (nbOfSelections < 1) {\n errors.selectionsError = 'There should be at least 1 shape selected.';\n } else if (nbOfSelections > maxSelections) {\n errors.selectionsError = `No more than ${maxSelections} shapes should be selected.`;\n }\n\n return errors;\n};\n"],"file":"index.js"}
@@ -26,8 +26,9 @@ exports.getCorrectResponse = getCorrectResponse;
26
26
  var isResponseCorrect = function isResponseCorrect(question, session) {
27
27
  var _question$shapes = question.shapes,
28
28
  rectangles = _question$shapes.rectangles,
29
- polygons = _question$shapes.polygons;
30
- var choices = [].concat((0, _toConsumableArray2["default"])(rectangles), (0, _toConsumableArray2["default"])(polygons));
29
+ polygons = _question$shapes.polygons,
30
+ circles = _question$shapes.circles;
31
+ var choices = [].concat((0, _toConsumableArray2["default"])(rectangles), (0, _toConsumableArray2["default"])(polygons), (0, _toConsumableArray2["default"])(circles));
31
32
  var correctResponseIds = getCorrectResponse(choices);
32
33
 
33
34
  if (!session || (0, _isEmpty["default"])(session)) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils.js"],"names":["getCorrectResponse","choices","filter","c","correct","map","id","sort","isResponseCorrect","question","session","shapes","rectangles","polygons","correctResponseIds","answers","length","answerIds","a"],"mappings":";;;;;;;;;;;AAAA;;AACA;;AAEO,IAAMA,kBAAkB,GAAG,SAArBA,kBAAqB,CAACC,OAAD;AAAA,SAChCA,OAAO,CACJC,MADH,CACU,UAACC,CAAD;AAAA,WAAOA,CAAC,CAACC,OAAT;AAAA,GADV,EAEGC,GAFH,CAEO,UAACF,CAAD;AAAA,WAAOA,CAAC,CAACG,EAAT;AAAA,GAFP,EAGGC,IAHH,EADgC;AAAA,CAA3B;;;;AAMA,IAAMC,iBAAiB,GAAG,SAApBA,iBAAoB,CAACC,QAAD,EAAWC,OAAX,EAAuB;AACtD,yBAEID,QAFJ,CACEE,MADF;AAAA,MACYC,UADZ,oBACYA,UADZ;AAAA,MACwBC,QADxB,oBACwBA,QADxB;AAGA,MAAMZ,OAAO,iDAAOW,UAAP,uCAAsBC,QAAtB,EAAb;AACA,MAAIC,kBAAkB,GAAGd,kBAAkB,CAACC,OAAD,CAA3C;;AAEA,MAAI,CAACS,OAAD,IAAY,yBAAQA,OAAR,CAAhB,EAAkC;AAChC,WAAO,KAAP;AACD;;AAED,MAAIA,OAAO,CAACK,OAAR,IAAmBL,OAAO,CAACK,OAAR,CAAgBC,MAAvC,EAA+C;AAC7C,QAAIC,SAAS,GAAG,CAACP,OAAO,CAACK,OAAR,IAAmB,EAApB,EAAwBV,GAAxB,CAA4B,UAACa,CAAD;AAAA,aAAOA,CAAC,CAACZ,EAAT;AAAA,KAA5B,CAAhB;AAEA,WAAO,yBAAQW,SAAS,CAACV,IAAV,EAAR,EAA0BO,kBAA1B,CAAP;AACD,GAJD,MAIO,IAAI,EAAEA,kBAAkB,IAAIA,kBAAkB,CAACE,MAA3C,CAAJ,EAAwD;AAC7D,WAAO,IAAP;AACD;;AAED,SAAO,KAAP;AACD,CApBM","sourcesContent":["import isEqual from 'lodash/isEqual';\nimport isEmpty from 'lodash/isEmpty';\n\nexport const getCorrectResponse = (choices) =>\n choices\n .filter((c) => c.correct)\n .map((c) => c.id)\n .sort();\n\nexport const isResponseCorrect = (question, session) => {\n const {\n shapes: { rectangles, polygons },\n } = question;\n const choices = [...rectangles, ...polygons];\n let correctResponseIds = getCorrectResponse(choices);\n\n if (!session || isEmpty(session)) {\n return false;\n }\n\n if (session.answers && session.answers.length) {\n let answerIds = (session.answers || []).map((a) => a.id);\n\n return isEqual(answerIds.sort(), correctResponseIds);\n } else if (!(correctResponseIds && correctResponseIds.length)) {\n return true;\n }\n\n return false;\n};\n"],"file":"utils.js"}
1
+ {"version":3,"sources":["../src/utils.js"],"names":["getCorrectResponse","choices","filter","c","correct","map","id","sort","isResponseCorrect","question","session","shapes","rectangles","polygons","circles","correctResponseIds","answers","length","answerIds","a"],"mappings":";;;;;;;;;;;AAAA;;AACA;;AAEO,IAAMA,kBAAkB,GAAG,SAArBA,kBAAqB,CAACC,OAAD;AAAA,SAChCA,OAAO,CACJC,MADH,CACU,UAACC,CAAD;AAAA,WAAOA,CAAC,CAACC,OAAT;AAAA,GADV,EAEGC,GAFH,CAEO,UAACF,CAAD;AAAA,WAAOA,CAAC,CAACG,EAAT;AAAA,GAFP,EAGGC,IAHH,EADgC;AAAA,CAA3B;;;;AAMA,IAAMC,iBAAiB,GAAG,SAApBA,iBAAoB,CAACC,QAAD,EAAWC,OAAX,EAAuB;AACtD,yBAEID,QAFJ,CACEE,MADF;AAAA,MACYC,UADZ,oBACYA,UADZ;AAAA,MACwBC,QADxB,oBACwBA,QADxB;AAAA,MACkCC,OADlC,oBACkCA,OADlC;AAGA,MAAMb,OAAO,iDAAOW,UAAP,uCAAsBC,QAAtB,uCAAmCC,OAAnC,EAAb;AACA,MAAIC,kBAAkB,GAAGf,kBAAkB,CAACC,OAAD,CAA3C;;AAEA,MAAI,CAACS,OAAD,IAAY,yBAAQA,OAAR,CAAhB,EAAkC;AAChC,WAAO,KAAP;AACD;;AAED,MAAIA,OAAO,CAACM,OAAR,IAAmBN,OAAO,CAACM,OAAR,CAAgBC,MAAvC,EAA+C;AAC7C,QAAIC,SAAS,GAAG,CAACR,OAAO,CAACM,OAAR,IAAmB,EAApB,EAAwBX,GAAxB,CAA4B,UAACc,CAAD;AAAA,aAAOA,CAAC,CAACb,EAAT;AAAA,KAA5B,CAAhB;AAEA,WAAO,yBAAQY,SAAS,CAACX,IAAV,EAAR,EAA0BQ,kBAA1B,CAAP;AACD,GAJD,MAIO,IAAI,EAAEA,kBAAkB,IAAIA,kBAAkB,CAACE,MAA3C,CAAJ,EAAwD;AAC7D,WAAO,IAAP;AACD;;AAED,SAAO,KAAP;AACD,CApBM","sourcesContent":["import isEqual from 'lodash/isEqual';\nimport isEmpty from 'lodash/isEmpty';\n\nexport const getCorrectResponse = (choices) =>\n choices\n .filter((c) => c.correct)\n .map((c) => c.id)\n .sort();\n\nexport const isResponseCorrect = (question, session) => {\n const {\n shapes: { rectangles, polygons, circles },\n } = question;\n const choices = [...rectangles, ...polygons, ...circles];\n let correctResponseIds = getCorrectResponse(choices);\n\n if (!session || isEmpty(session)) {\n return false;\n }\n\n if (session.answers && session.answers.length) {\n let answerIds = (session.answers || []).map((a) => a.id);\n\n return isEqual(answerIds.sort(), correctResponseIds);\n } else if (!(correctResponseIds && correctResponseIds.length)) {\n return true;\n }\n\n return false;\n};\n"],"file":"utils.js"}
@@ -34,6 +34,12 @@ describe('controller', () => {
34
34
  correct: true,
35
35
  },
36
36
  ],
37
+ circles: [
38
+ {
39
+ id: '5',
40
+ correct: true,
41
+ },
42
+ ],
37
43
  },
38
44
  multipleCorrect: true,
39
45
  partialScoring: false,
@@ -115,14 +121,14 @@ describe('controller', () => {
115
121
 
116
122
  it('returns score of 1 (partialScoring: false, answers in order)', async () => {
117
123
  const result = await outcome(question, {
118
- answers: [{ id: '1' }, { id: '4' }],
124
+ answers: [{ id: '1' }, { id: '4' }, { id: '5' }],
119
125
  });
120
126
  expect(result.score).toEqual(1);
121
127
  });
122
128
 
123
129
  it('returns score of 1 (partialScoring: false, answers not in order)', async () => {
124
130
  const result = await outcome(question, {
125
- answers: [{ id: '4' }, { id: '1' }],
131
+ answers: [{ id: '5' }, { id: '4' }, { id: '1' }],
126
132
  });
127
133
  expect(result.score).toEqual(1);
128
134
  });
@@ -153,91 +159,91 @@ describe('controller', () => {
153
159
  expect(result.score).toEqual(0);
154
160
  });
155
161
 
156
- it('returns a score of 0.25 for 1/4 correct answers and 0 incorrect answers', async () => {
162
+ it('returns a score of 0.2 for 1/5 correct answers and 0 incorrect answers', async () => {
157
163
  const result = await outcome(question, {
158
- answers: [{ id: '2' }, { id: '5' }],
164
+ answers: [{ id: '1' }],
159
165
  });
160
- expect(result.score).toEqual(0.25);
166
+ expect(result.score).toEqual(0.2);
161
167
  });
162
168
 
163
- it('returns a score of 0.25, even if answers are not in order', async () => {
169
+ it('returns a score of 0.2, even if answers are not in order', async () => {
164
170
  const result = await outcome(question, {
165
- answers: [{ id: '5' }, { id: '2' }],
171
+ answers: [{ id: '1' }],
166
172
  });
167
- expect(result.score).toEqual(0.25);
173
+ expect(result.score).toEqual(0.2);
168
174
  });
169
175
 
170
- it('returns a score of 0.5 for 2/4 correct answers and 0 incorrect answers', async () => {
176
+ it('returns a score of 0.6 for 2/5 correct answers and 0 incorrect answers', async () => {
171
177
  const result = await outcome(question, { answers: [{ id: '5' }, { id: '4' }] });
172
- expect(result.score).toEqual(0.5);
178
+ expect(result.score).toEqual(0.6);
173
179
  });
174
180
 
175
- it('returns a score of 0.75 for 3/4 correct answers and 0 incorrect answers', async () => {
181
+ it('returns a score of 0.8 for 3/5 correct answers and 0 incorrect answers', async () => {
176
182
  const result = await outcome(question, { answers: [{ id: '1' }, { id: '5' }, { id: '4' }] });
177
- expect(result.score).toEqual(0.75);
183
+ expect(result.score).toEqual(0.8);
178
184
  });
179
185
 
180
- it('returns a score of 1 for 4/4 correct answers and 0 incorrect answers', async () => {
186
+ it('returns a score of 1 for 4/5 correct answers and 0 incorrect answers', async () => {
181
187
  const result = await outcome(question, {
182
188
  answers: [{ id: '1' }, { id: '4' }, { id: '5' }, { id: '6' }],
183
189
  });
184
190
  expect(result.score).toEqual(1);
185
191
  });
186
192
 
187
- it('returns a score of 0.25 for 1/4 correct answers and 2 incorrect answers', async () => {
193
+ it('returns a score of 0.2 for 1/5 correct answers and 2 incorrect answers', async () => {
188
194
  const result = await outcome(question, {
189
195
  answers: [{ id: '1' }, { id: '2' }, { id: '3' }],
190
196
  });
191
- expect(result.score).toEqual(0.25);
197
+ expect(result.score).toEqual(0.2);
192
198
  });
193
199
 
194
- it('returns a score of 0.5 for 2/4 correct answers and 2 incorrect answers', async () => {
200
+ it('returns a score of 0.4 for 2/5 correct answers and 2 incorrect answers', async () => {
195
201
  const result = await outcome(question, {
196
202
  answers: [{ id: '1' }, { id: '4' }, { id: '2' }, { id: '3' }],
197
203
  });
198
- expect(result.score).toEqual(0.5);
204
+ expect(result.score).toEqual(0.4);
199
205
  });
200
206
 
201
- it('returns a score of 0.5 for 2/4 correct answers and 2 incorrect answers', async () => {
207
+ it('returns a score of 0.4 for 2/5 correct answers and 2 incorrect answers', async () => {
202
208
  const result = await outcome(question, {
203
209
  answers: [{ id: '1' }, { id: '4' }, { id: '2' }, { id: '3' }],
204
210
  });
205
- expect(result.score).toEqual(0.5);
211
+ expect(result.score).toEqual(0.4);
206
212
  });
207
213
 
208
- it('returns a score of 0.75 for 3/4 correct answers and 1 incorrect answer', async () => {
214
+ it('returns a score of 0.6 for 3/5 correct answers and 1 incorrect answer', async () => {
209
215
  const result = await outcome(question, {
210
216
  answers: [{ id: '6' }, { id: '4' }, { id: '1' }, { id: '3' }],
211
217
  });
212
- expect(result.score).toEqual(0.75);
218
+ expect(result.score).toEqual(0.6);
213
219
  });
214
220
 
215
- it('returns a score of 0.75 for 3/4 correct answers and 1 incorrect answer', async () => {
221
+ it('returns a score of 0.6 for 3/5 correct answers and 1 incorrect answer', async () => {
216
222
  const result = await outcome(question, {
217
223
  answers: [{ id: '6' }, { id: '4' }, { id: '1' }, { id: '3' }],
218
224
  });
219
- expect(result.score).toEqual(0.75);
225
+ expect(result.score).toEqual(0.6);
220
226
  });
221
227
 
222
- it('returns a score of 0.5 for 3/4 correct answers and 2 incorrect answer', async () => {
228
+ it('returns a score of 0.6 for 3/5 correct answers and 2 incorrect answer', async () => {
223
229
  const result = await outcome(question, {
224
230
  answers: [{ id: '6' }, { id: '4' }, { id: '2' }, { id: '3' }, { id: '1' }],
225
231
  });
226
- expect(result.score).toEqual(0.5);
232
+ expect(result.score).toEqual(0.6);
227
233
  });
228
234
 
229
- it('returns a score of 0.75 for 4/4 correct answers and 1 incorrect answer', async () => {
235
+ it('returns a score of 0.8 for 3/5 correct answers and 1 incorrect answer', async () => {
230
236
  const result = await outcome(question, {
231
237
  answers: [{ id: '6' }, { id: '4' }, { id: '2' }, { id: '5' }, { id: '1' }],
232
238
  });
233
- expect(result.score).toEqual(0.75);
239
+ expect(result.score).toEqual(0.8);
234
240
  });
235
241
 
236
- it('returns a score of 0.5 for 4/4 correct answers and 2 incorrect answers', async () => {
242
+ it('returns a score of 0.6 for 3/5 correct answers and 2 incorrect answers', async () => {
237
243
  const result = await outcome(question, {
238
244
  answers: [{ id: '6' }, { id: '4' }, { id: '2' }, { id: '5' }, { id: '1' }, { id: '3' }],
239
245
  });
240
- expect(result.score).toEqual(0.5);
246
+ expect(result.score).toEqual(0.6);
241
247
  });
242
248
  });
243
249
 
@@ -352,7 +358,7 @@ describe('controller', () => {
352
358
  mode: 'gather',
353
359
  role: 'instructor',
354
360
  });
355
- expect(sess).toEqual({ answers: [{ id: '1' }, { id: '4' }], id: '1' });
361
+ expect(sess).toEqual({ answers: [{ id: '1' }, { id: '4' }, { id: '5' }], id: '1' });
356
362
  });
357
363
 
358
364
  it('returns null env is student', async () => {
@@ -5,6 +5,7 @@ export default {
5
5
  shapes: {
6
6
  rectangles: [],
7
7
  polygons: [],
8
+ circles: [],
8
9
  },
9
10
  multipleCorrect: true,
10
11
  partialScoring: false,
@@ -26,7 +26,7 @@ export function model(question, session, env) {
26
26
  shapes,
27
27
  language,
28
28
  } = normalizedQuestion;
29
- const { rectangles, polygons } = shapes || {};
29
+ const { rectangles, polygons, circles } = shapes || {};
30
30
 
31
31
  return new Promise((resolve) => {
32
32
  const out = {
@@ -45,6 +45,8 @@ export function model(question, session, env) {
45
45
  rectangles: (rectangles || []).map(({ index, ...rectProps }) => ({ ...rectProps })),
46
46
  // eslint-disable-next-line no-unused-vars
47
47
  polygons: (polygons || []).map(({ index, ...polyProps }) => ({ ...polyProps })),
48
+ // eslint-disable-next-line no-unused-vars
49
+ circles: (circles || []).map(({ index, ...circleProps }) => ({ ...circleProps })),
48
50
  },
49
51
  responseCorrect: env.mode === 'evaluate' ? isResponseCorrect(normalizedQuestion, session) : undefined,
50
52
  };
@@ -78,7 +80,7 @@ export const createDefaultModel = (model = {}) =>
78
80
  const getScore = (config, session, env = {}) => {
79
81
  const { answers } = session || {};
80
82
 
81
- if (!config.shapes || (!config.shapes.rectangles && !config.shapes.polygons)) {
83
+ if (!config.shapes || (!config.shapes.rectangles && !config.shapes.polygons && !config.shapes.circles)) {
82
84
  return 0;
83
85
  }
84
86
 
@@ -9,9 +9,9 @@ export const getCorrectResponse = (choices) =>
9
9
 
10
10
  export const isResponseCorrect = (question, session) => {
11
11
  const {
12
- shapes: { rectangles, polygons },
12
+ shapes: { rectangles, polygons, circles },
13
13
  } = question;
14
- const choices = [...rectangles, ...polygons];
14
+ const choices = [...rectangles, ...polygons, ...circles];
15
15
  let correctResponseIds = getCorrectResponse(choices);
16
16
 
17
17
  if (!session || isEmpty(session)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pie-element/hotspot",
3
- "version": "6.6.1",
3
+ "version": "6.6.2-next.2+37c47ad03",
4
4
  "description": "",
5
5
  "repository": "pie-framework/pie-elements",
6
6
  "publishConfig": {
@@ -18,7 +18,7 @@
18
18
  },
19
19
  "author": "pie framework developers",
20
20
  "license": "ISC",
21
- "gitHead": "96b02afbc7ab4112eb8213c47e5513adf60c80fe",
21
+ "gitHead": "37c47ad039789cb7eee68973215cd8a9f5c84716",
22
22
  "scripts": {
23
23
  "postpublish": "../../scripts/postpublish"
24
24
  },