@pie-element/hotspot 5.4.3-next.41 → 5.4.3-next.54
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/configure/lib/button.js.map +1 -1
- package/configure/lib/defaults.js.map +1 -1
- package/configure/lib/hotspot-container.js.map +1 -1
- package/configure/lib/hotspot-drawable.js.map +1 -1
- package/configure/lib/hotspot-palette.js.map +1 -1
- package/configure/lib/hotspot-polygon.js.map +1 -1
- package/configure/lib/hotspot-rectangle.js.map +1 -1
- package/configure/lib/index.js.map +1 -1
- package/configure/lib/root.js +1 -1
- package/configure/lib/root.js.map +1 -1
- package/configure/lib/upload-control.js.map +1 -1
- package/configure/lib/utils.js.map +1 -1
- package/configure/src/__tests__/hotspot-container.test.js +98 -71
- package/configure/src/__tests__/hotspot-drawable.test.js +48 -49
- package/configure/src/__tests__/index.test.js +28 -51
- package/configure/src/__tests__/root.test.js +162 -82
- package/configure/src/__tests__/utils.test.js +112 -98
- package/configure/src/button.jsx +4 -4
- package/configure/src/defaults.js +16 -20
- package/configure/src/hotspot-container.jsx +72 -89
- package/configure/src/hotspot-drawable.jsx +55 -55
- package/configure/src/hotspot-palette.jsx +12 -25
- package/configure/src/hotspot-polygon.jsx +20 -22
- package/configure/src/hotspot-rectangle.jsx +5 -15
- package/configure/src/index.js +20 -20
- package/configure/src/root.jsx +38 -67
- package/configure/src/upload-control.jsx +9 -20
- package/configure/src/utils.js +35 -28
- package/controller/lib/defaults.js.map +1 -1
- package/controller/lib/index.js.map +1 -1
- package/controller/lib/utils.js.map +1 -1
- package/controller/src/__tests__/index.test.js +29 -50
- package/controller/src/defaults.js +4 -8
- package/controller/src/index.js +22 -34
- package/controller/src/utils.js +9 -6
- package/docs/config-schema.json.md +1 -1
- package/docs/demo/config.js +2 -2
- package/docs/demo/generate.js +49 -37
- package/docs/demo/session.js +2 -2
- package/docs/pie-schema.json.md +1 -1
- package/lib/hotspot/container.js.map +1 -1
- package/lib/hotspot/icons.js.map +1 -1
- package/lib/hotspot/image.js.map +1 -1
- package/lib/hotspot/index.js.map +1 -1
- package/lib/hotspot/polygon.js.map +1 -1
- package/lib/hotspot/rectangle.js.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/session-updater.js.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/container.test.jsx +57 -43
- package/src/__tests__/image.test.jsx +2 -2
- package/src/__tests__/polygon.test.jsx +31 -20
- package/src/__tests__/rectangle.test.jsx +22 -18
- package/src/__tests__/session-updater.test.jsx +22 -31
- package/src/hotspot/container.jsx +20 -23
- package/src/hotspot/icons.js +4 -2
- package/src/hotspot/image.jsx +4 -8
- package/src/hotspot/index.jsx +27 -47
- package/src/hotspot/polygon.jsx +13 -18
- package/src/hotspot/rectangle.jsx +11 -16
- package/src/index.js +5 -18
- package/src/session-updater.js +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.js"],"names":["log","normalize","question","promptEnabled","rationaleEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","strokeWidth","model","session","env","normalizedQuestion","imageUrl","dimensions","hotspotColor","multipleCorrect","outlineColor","partialScoring","prompt","shapes","rectangles","polygons","Promise","resolve","out","disabled","mode","map","index","rectProps","polyProps","responseCorrect","undefined","role","rationale","teacherInstructions","createDefaultModel","defaults","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","validate","minShapes","maxShapes","maxSelections","errors","allShapes","Object","values","reduce","acc","nbOfSelections","nbOfShapes","shapesError","selectionsError"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AAEA;;AAEA;;;;;;;;;AAEA,IAAMA,GAAG,GAAG,uBAAM,iCAAN,CAAZ;;AAEO,IAAMC,SAAS,GAAG,SAAZA,SAAY,CAAAC,QAAQ;AAAA;AAC/BC,IAAAA,aAAa,EAAE,IADgB;AAE/BC,IAAAA,gBAAgB,EAAE,IAFa;AAG/BC,IAAAA,0BAA0B,EAAE,IAHG;AAI/BC,IAAAA,0BAA0B,EAAE,IAJG;AAK/BC,IAAAA,WAAW,EAAE;AALkB,KAM5BL,QAN4B;AAAA,CAA1B;;;;AASA,SAASM,KAAT,CAAeN,QAAf,EAAyBO,OAAzB,EAAkCC,GAAlC,EAAuC;AAC5C,MAAMC,kBAAkB,GAAGV,SAAS,CAACC,QAAD,CAApC;AACA,MACEU,QADF,GASID,kBATJ,CACEC,QADF;AAAA,MAEEC,UAFF,GASIF,kBATJ,CAEEE,UAFF;AAAA,MAGEC,YAHF,GASIH,kBATJ,CAGEG,YAHF;AAAA,MAIEC,eAJF,GASIJ,kBATJ,CAIEI,eAJF;AAAA,MAKEC,YALF,GASIL,kBATJ,CAKEK,YALF;AAAA,MAMEC,cANF,GASIN,kBATJ,CAMEM,cANF;AAAA,MAOEC,MAPF,GASIP,kBATJ,CAOEO,MAPF;AAAA,MAQEC,MARF,GASIR,kBATJ,CAQEQ,MARF;;AAUA,aAAiCA,MAAM,IAAI,EAA3C;AAAA,MAAQC,UAAR,QAAQA,UAAR;AAAA,MAAoBC,QAApB,QAAoBA,QAApB;;AAEA,SAAO,IAAIC,OAAJ,CAAY,UAAAC,OAAO,EAAI;AAC5B,QAAMC,GAAG,GAAG;AACVC,MAAAA,QAAQ,EAAEf,GAAG,CAACgB,IAAJ,KAAa,QADb;AAEVA,MAAAA,IAAI,EAAEhB,GAAG,CAACgB,IAFA;AAGVb,MAAAA,UAAU,EAAVA,UAHU;AAIVD,MAAAA,QAAQ,EAARA,QAJU;AAKVI,MAAAA,YAAY,EAAZA,YALU;AAMVF,MAAAA,YAAY,EAAZA,YANU;AAOVC,MAAAA,eAAe,EAAfA,eAPU;AAQVE,MAAAA,cAAc,EAAdA,cARU;AASVE,MAAAA,MAAM,kCACDA,MADC;AAEJ;AACAC,QAAAA,UAAU,EAAE,CAACA,UAAU,IAAI,EAAf,EAAmBO,GAAnB,CAAuB;AAAA,cAAGC,KAAH,SAAGA,KAAH;AAAA,cAAaC,SAAb;AAAA,mCAAmCA,SAAnC;AAAA,SAAvB,CAHR;AAIJ;AACAR,QAAAA,QAAQ,EAAE,CAACA,QAAQ,IAAI,EAAb,EAAiBM,GAAjB,CAAqB;AAAA,cAAGC,KAAH,SAAGA,KAAH;AAAA,cAAaE,SAAb;AAAA,mCAAmCA,SAAnC;AAAA,SAArB;AALN,QATI;AAgBVC,MAAAA,eAAe,EACbrB,GAAG,CAACgB,IAAJ,KAAa,UAAb,GACI,8BAAkBf,kBAAlB,EAAsCF,OAAtC,CADJ,GAEIuB;AAnBI,KAAZ;;AAsBA,QAAItB,GAAG,CAACuB,IAAJ,KAAa,YAAb,KAA8BvB,GAAG,CAACgB,IAAJ,KAAa,MAAb,IAAuBhB,GAAG,CAACgB,IAAJ,KAAa,UAAlE,CAAJ,EAAmF;AACjFF,MAAAA,GAAG,CAACU,SAAJ,GAAgBvB,kBAAkB,CAACP,gBAAnB,GAAsCO,kBAAkB,CAACuB,SAAzD,GAAqE,IAArF;AACAV,MAAAA,GAAG,CAACW,mBAAJ,GAA0BxB,kBAAkB,CAACN,0BAAnB,GAAgDM,kBAAkB,CAACwB,mBAAnE,GAAyF,IAAnH;AACD,KAHD,MAGO;AACLX,MAAAA,GAAG,CAACU,SAAJ,GAAgB,IAAhB;AACAV,MAAAA,GAAG,CAACW,mBAAJ,GAA0B,IAA1B;AACD;;AAEDX,IAAAA,GAAG,CAACN,MAAJ,GAAaP,kBAAkB,CAACR,aAAnB,GAAmCe,MAAnC,GAA4C,IAAzD;AACAM,IAAAA,GAAG,CAACjB,WAAJ,GAAkBI,kBAAkB,CAACJ,WAArC,CAhC4B,CAkC5B;;AACAgB,IAAAA,OAAO,CAACC,GAAD,CAAP;AACD,GApCM,CAAP;AAqCD;;AAEM,IAAMY,kBAAkB,GAAG,SAArBA,kBAAqB;AAAA,MAAC5B,KAAD,uEAAS,EAAT;AAAA,SAChC,IAAIc,OAAJ,CAAY,UAAAC,OAAO,EAAI;AACrBA,IAAAA,OAAO,iCACFc,oBADE,GAEF7B,KAFE,EAAP;AAID,GALD,CADgC;AAAA,CAA3B;;;;AAQP,IAAM8B,QAAQ,GAAG,SAAXA,QAAW,CAACC,MAAD,EAAS9B,OAAT,EAA+B;AAAA,MAAbC,GAAa,uEAAP,EAAO;;AAC9C,cAAoBD,OAAO,IAAI,EAA/B;AAAA,MAAQ+B,OAAR,SAAQA,OAAR;;AAEA,MAAI,CAACD,MAAM,CAACpB,MAAR,IAAmB,CAACoB,MAAM,CAACpB,MAAP,CAAcC,UAAf,IAA6B,CAACmB,MAAM,CAACpB,MAAP,CAAcE,QAAnE,EAA8E;AAC5E,WAAO,CAAP;AACD;;AAED,uBAA4DkB,MAA5D,CAAQpB,MAAR;AAAA,+CAAqD,EAArD;AAAA,6CAAkBC,UAAlB;AAAA,MAAkBA,UAAlB,sCAA+B,EAA/B;AAAA,6CAAmCC,QAAnC;AAAA,MAAmCA,QAAnC,sCAA8C,EAA9C;;AACA,MAAMoB,qBAAqB,GAAGxB,gCAAeyB,OAAf,CAAuBH,MAAvB,EAA+B7B,GAA/B,CAA9B;;AAEA,MAAI,CAAC+B,qBAAL,EAA4B;AAC1B,WAAO,8BAAkBF,MAAlB,EAA0B9B,OAA1B,IAAqC,CAArC,GAAyC,CAAhD;AACD;;AAED,MAAIkC,cAAc,GAAG,CAArB;AACA,MAAIC,eAAe,GAAG,CAAtB;AAEA,MAAMC,OAAO,iDAAOzB,UAAP,uCAAsBC,QAAtB,EAAb;AAEA,MAAMyB,cAAc,GAAGD,OAAO,CAACE,MAAR,CAAe,UAAAC,MAAM;AAAA,WAAIA,MAAM,CAACC,OAAX;AAAA,GAArB,CAAvB;AAEAJ,EAAAA,OAAO,CAACK,OAAR,CAAgB,UAAAC,KAAK,EAAI;AACvB,QAAMC,QAAQ,GAAGZ,OAAO,IAAIA,OAAO,CAACO,MAAR,CAAe,UAAAM,MAAM;AAAA,aAAIA,MAAM,CAACC,EAAP,KAAcH,KAAK,CAACG,EAAxB;AAAA,KAArB,EAAiD,CAAjD,CAA5B;AACA,QAAMC,iBAAiB,GAAGJ,KAAK,CAACF,OAAN,IAAiBG,QAA3C;;AAEA,QAAGA,QAAH,EAAa;AACXR,MAAAA,eAAe,IAAG,CAAlB;AACD;;AAED,QAAIW,iBAAJ,EAAuB;AACrBZ,MAAAA,cAAc,IAAI,CAAlB;AACD;AACF,GAXD;AAaA,MAAMa,YAAY,GAAGZ,eAAe,GAAGE,cAAc,CAACW,MAAjC,GAA0Cb,eAAe,GAAGE,cAAc,CAACW,MAA3E,GAAoF,CAAzG;AAEA,MAAMC,KAAK,GAAGZ,cAAc,CAACW,MAAf,KAA0B,CAA1B,GAA8B,CAA9B,GAAkCX,cAAc,CAACW,MAA/D;AACA,MAAME,GAAG,GAAG,CAAC,CAAChB,cAAc,GAAGa,YAAlB,IAAkCE,KAAnC,EAA0CE,OAA1C,CAAkD,CAAlD,CAAZ;AAEA,SAAOD,GAAG,GAAG,CAAN,GAAU,CAAV,GAAcE,UAAU,CAACF,GAAD,CAA/B;AACD,CAxCD;;AA0CO,SAASG,OAAT,CAAiBvB,MAAjB,EAAyB9B,OAAzB,EAA4C;AAAA,MAAVC,GAAU,uEAAJ,EAAI;AACjD,SAAO,IAAIY,OAAJ,CAAY,UAAAC,OAAO,EAAI;AAC5BvB,IAAAA,GAAG,CAAC,YAAD,CAAH;;AAEA,QAAI,CAACS,OAAD,IAAY,yBAAQA,OAAR,CAAhB,EAAkC;AAChCc,MAAAA,OAAO,CAAC;AAAEwC,QAAAA,KAAK,EAAE,CAAT;AAAYC,QAAAA,KAAK,EAAE;AAAnB,OAAD,CAAP;AACD;;AAED,QAAIvD,OAAO,CAAC+B,OAAZ,EAAqB;AACnB,UAAMuB,KAAK,GAAGzB,QAAQ,CAACC,MAAD,EAAS9B,OAAT,EAAkBC,GAAlB,CAAtB;AACAa,MAAAA,OAAO,CAAC;AAAEwC,QAAAA,KAAK,EAALA;AAAF,OAAD,CAAP;AACD,KAHD,MAGO;AACLxC,MAAAA,OAAO,CAAC;AAACwC,QAAAA,KAAK,EAAE,CAAR;AAAWC,QAAAA,KAAK,EAAE;AAAlB,OAAD,CAAP;AACD;AACF,GAbM,CAAP;AAcD;;AAED,IAAMC,mBAAmB,GAAG,SAAtBA,mBAAsB,CAAC9C,MAAD,EAAY;AACtC,MAAIqB,OAAO,GAAG,EAAd;AAEArB,EAAAA,MAAM,CAAC+B,OAAP,CAAe,UAAAgB,CAAC,EAAI;AAClB,QAAQjB,OAAR,GAAwBiB,CAAxB,CAAQjB,OAAR;AAAA,QAAiBK,EAAjB,GAAwBY,CAAxB,CAAiBZ,EAAjB;;AACA,QAAIL,OAAJ,EAAa;AACXT,MAAAA,OAAO,CAAC2B,IAAR,CAAa;AAAEb,QAAAA,EAAE,EAAFA;AAAF,OAAb;AACD;AACF,GALD;AAMA,SAAOd,OAAP;AACD,CAVD;;AAYO,IAAM4B,4BAA4B,GAAG,SAA/BA,4BAA+B,CAAClE,QAAD,EAAWQ,GAAX,EAAmB;AAC7D,SAAO,IAAIY,OAAJ,CAAY,UAAAC,OAAO,EAAI;AAC5B,QAAIb,GAAG,CAACgB,IAAJ,KAAa,UAAb,IAA2BhB,GAAG,CAACuB,IAAJ,KAAa,YAA5C,EAA0D;AACxD,6BAA4D/B,QAA5D,CAAQiB,MAAR;AAAA,uDAAqD,EAArD;AAAA,mDAAkBC,UAAlB;AAAA,UAAkBA,UAAlB,sCAA+B,EAA/B;AAAA,mDAAmCC,QAAnC;AAAA,UAAmCA,QAAnC,sCAA8C,EAA9C;AAEA,UAAMgD,gBAAgB,GAAGJ,mBAAmB,CAAC7C,UAAD,CAA5C;AACA,UAAMkD,eAAe,GAAGL,mBAAmB,CAAC5C,QAAD,CAA3C;AAEAE,MAAAA,OAAO,CAAC;AACNiB,QAAAA,OAAO,gDACF6B,gBADE,uCAEFC,eAFE,EADD;AAKNhB,QAAAA,EAAE,EAAE;AALE,OAAD,CAAP;AAOD,KAbD,MAaO;AACL/B,MAAAA,OAAO,CAAC,IAAD,CAAP;AACD;AACF,GAjBM,CAAP;AAkBD,CAnBM;;;;AAqBA,IAAMgD,QAAQ,GAAG,SAAXA,QAAW,GAA6B;AAAA,MAA5B/D,KAA4B,uEAApB,EAAoB;AAAA,MAAhB+B,MAAgB,uEAAP,EAAO;AACnD,MAAQpB,MAAR,GAAmBX,KAAnB,CAAQW,MAAR;AACA,0BAAoDoB,MAApD,CAAQiC,SAAR;AAAA,MAAQA,SAAR,kCAAoB,CAApB;AAAA,MAAuBC,SAAvB,GAAoDlC,MAApD,CAAuBkC,SAAvB;AAAA,MAAkCC,aAAlC,GAAoDnC,MAApD,CAAkCmC,aAAlC;AACA,MAAMC,MAAM,GAAG,EAAf;AAEA,MAAMC,SAAS,GAAGC,MAAM,CAACC,MAAP,CAAc3D,MAAM,IAAI,EAAxB,EAA4B4D,MAA5B,CAAmC,UAACC,GAAD,EAAM7B,KAAN;AAAA,yDAAoB6B,GAApB,uCAA4B7B,KAA5B;AAAA,GAAnC,EAAuE,EAAvE,CAAlB;AAEA,MAAM8B,cAAc,GAAG,CAACL,SAAS,IAAI,EAAd,EAAkBG,MAAlB,CAAyB,UAACC,GAAD,EAAM7B,KAAN;AAAA,WAAgBA,KAAK,CAACF,OAAN,GAAgB+B,GAAG,GAAG,CAAtB,GAA0BA,GAA1C;AAAA,GAAzB,EAAwE,CAAxE,CAAvB;AAEA,MAAME,UAAU,GAAG,CAACN,SAAS,IAAI,EAAd,EAAkBnB,MAArC;;AAEA,MAAIyB,UAAU,GAAGV,SAAjB,EAA4B;AAC1BG,IAAAA,MAAM,CAACQ,WAAP,sCAAiDX,SAAjD;AACD,GAFD,MAEO,IAAIU,UAAU,GAAGT,SAAjB,EAA4B;AACjCE,IAAAA,MAAM,CAACQ,WAAP,0BAAqCV,SAArC;AACD;;AAED,MAAIQ,cAAc,GAAG,CAArB,EAAwB;AACtBN,IAAAA,MAAM,CAACS,eAAP,GAAyB,4CAAzB;AACD,GAFD,MAEO,IAAIH,cAAc,GAAGP,aAArB,EAAoC;AACzCC,IAAAA,MAAM,CAACS,eAAP,0BAAyCV,aAAzC;AACD;;AAED,SAAOC,MAAP;AACD,CAxBM","sourcesContent":["import debug from 'debug';\nimport isEmpty from 'lodash/isEmpty';\nimport { partialScoring } from '@pie-lib/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 promptEnabled: true,\n rationaleEnabled: true,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n strokeWidth: 5,\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 } = 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 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:\n env.mode === 'evaluate'\n ? isResponseCorrect(normalizedQuestion, session)\n : 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 ? normalizedQuestion.teacherInstructions : 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 = [] } = {} } = 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];\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 = [], polygons = {} } = {} } = question;\n\n const rectangleCorrect = returnShapesCorrect(rectangles);\n const polygonsCorrect = returnShapesCorrect(polygons);\n\n resolve({\n answers: [\n ...rectangleCorrect,\n ...polygonsCorrect\n ],\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","promptEnabled","rationaleEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","strokeWidth","model","session","env","normalizedQuestion","imageUrl","dimensions","hotspotColor","multipleCorrect","outlineColor","partialScoring","prompt","shapes","rectangles","polygons","Promise","resolve","out","disabled","mode","map","index","rectProps","polyProps","responseCorrect","undefined","role","rationale","teacherInstructions","createDefaultModel","defaults","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","validate","minShapes","maxShapes","maxSelections","errors","allShapes","Object","values","reduce","acc","nbOfSelections","nbOfShapes","shapesError","selectionsError"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AAEA;;AAEA;;;;;;;;;AAEA,IAAMA,GAAG,GAAG,uBAAM,iCAAN,CAAZ;;AAEO,IAAMC,SAAS,GAAG,SAAZA,SAAY,CAACC,QAAD;AAAA;AACvBC,IAAAA,aAAa,EAAE,IADQ;AAEvBC,IAAAA,gBAAgB,EAAE,IAFK;AAGvBC,IAAAA,0BAA0B,EAAE,IAHL;AAIvBC,IAAAA,0BAA0B,EAAE,IAJL;AAKvBC,IAAAA,WAAW,EAAE;AALU,KAMpBL,QANoB;AAAA,CAAlB;;;;AASA,SAASM,KAAT,CAAeN,QAAf,EAAyBO,OAAzB,EAAkCC,GAAlC,EAAuC;AAC5C,MAAMC,kBAAkB,GAAGV,SAAS,CAACC,QAAD,CAApC;AACA,MAAQU,QAAR,GACED,kBADF,CAAQC,QAAR;AAAA,MAAkBC,UAAlB,GACEF,kBADF,CAAkBE,UAAlB;AAAA,MAA8BC,YAA9B,GACEH,kBADF,CAA8BG,YAA9B;AAAA,MAA4CC,eAA5C,GACEJ,kBADF,CAA4CI,eAA5C;AAAA,MAA6DC,YAA7D,GACEL,kBADF,CAA6DK,YAA7D;AAAA,MAA2EC,cAA3E,GACEN,kBADF,CAA2EM,cAA3E;AAAA,MAA2FC,MAA3F,GACEP,kBADF,CAA2FO,MAA3F;AAAA,MAAmGC,MAAnG,GACER,kBADF,CAAmGQ,MAAnG;;AAEA,aAAiCA,MAAM,IAAI,EAA3C;AAAA,MAAQC,UAAR,QAAQA,UAAR;AAAA,MAAoBC,QAApB,QAAoBA,QAApB;;AAEA,SAAO,IAAIC,OAAJ,CAAY,UAACC,OAAD,EAAa;AAC9B,QAAMC,GAAG,GAAG;AACVC,MAAAA,QAAQ,EAAEf,GAAG,CAACgB,IAAJ,KAAa,QADb;AAEVA,MAAAA,IAAI,EAAEhB,GAAG,CAACgB,IAFA;AAGVb,MAAAA,UAAU,EAAVA,UAHU;AAIVD,MAAAA,QAAQ,EAARA,QAJU;AAKVI,MAAAA,YAAY,EAAZA,YALU;AAMVF,MAAAA,YAAY,EAAZA,YANU;AAOVC,MAAAA,eAAe,EAAfA,eAPU;AAQVE,MAAAA,cAAc,EAAdA,cARU;AASVE,MAAAA,MAAM,kCACDA,MADC;AAEJ;AACAC,QAAAA,UAAU,EAAE,CAACA,UAAU,IAAI,EAAf,EAAmBO,GAAnB,CAAuB;AAAA,cAAGC,KAAH,SAAGA,KAAH;AAAA,cAAaC,SAAb;AAAA,mCAAmCA,SAAnC;AAAA,SAAvB,CAHR;AAIJ;AACAR,QAAAA,QAAQ,EAAE,CAACA,QAAQ,IAAI,EAAb,EAAiBM,GAAjB,CAAqB;AAAA,cAAGC,KAAH,SAAGA,KAAH;AAAA,cAAaE,SAAb;AAAA,mCAAmCA,SAAnC;AAAA,SAArB;AALN,QATI;AAgBVC,MAAAA,eAAe,EAAErB,GAAG,CAACgB,IAAJ,KAAa,UAAb,GAA0B,8BAAkBf,kBAAlB,EAAsCF,OAAtC,CAA1B,GAA2EuB;AAhBlF,KAAZ;;AAmBA,QAAItB,GAAG,CAACuB,IAAJ,KAAa,YAAb,KAA8BvB,GAAG,CAACgB,IAAJ,KAAa,MAAb,IAAuBhB,GAAG,CAACgB,IAAJ,KAAa,UAAlE,CAAJ,EAAmF;AACjFF,MAAAA,GAAG,CAACU,SAAJ,GAAgBvB,kBAAkB,CAACP,gBAAnB,GAAsCO,kBAAkB,CAACuB,SAAzD,GAAqE,IAArF;AACAV,MAAAA,GAAG,CAACW,mBAAJ,GAA0BxB,kBAAkB,CAACN,0BAAnB,GACtBM,kBAAkB,CAACwB,mBADG,GAEtB,IAFJ;AAGD,KALD,MAKO;AACLX,MAAAA,GAAG,CAACU,SAAJ,GAAgB,IAAhB;AACAV,MAAAA,GAAG,CAACW,mBAAJ,GAA0B,IAA1B;AACD;;AAEDX,IAAAA,GAAG,CAACN,MAAJ,GAAaP,kBAAkB,CAACR,aAAnB,GAAmCe,MAAnC,GAA4C,IAAzD;AACAM,IAAAA,GAAG,CAACjB,WAAJ,GAAkBI,kBAAkB,CAACJ,WAArC,CA/B8B,CAiC9B;;AACAgB,IAAAA,OAAO,CAACC,GAAD,CAAP;AACD,GAnCM,CAAP;AAoCD;;AAEM,IAAMY,kBAAkB,GAAG,SAArBA,kBAAqB;AAAA,MAAC5B,KAAD,uEAAS,EAAT;AAAA,SAChC,IAAIc,OAAJ,CAAY,UAACC,OAAD,EAAa;AACvBA,IAAAA,OAAO,iCACFc,oBADE,GAEF7B,KAFE,EAAP;AAID,GALD,CADgC;AAAA,CAA3B;;;;AAQP,IAAM8B,QAAQ,GAAG,SAAXA,QAAW,CAACC,MAAD,EAAS9B,OAAT,EAA+B;AAAA,MAAbC,GAAa,uEAAP,EAAO;;AAC9C,cAAoBD,OAAO,IAAI,EAA/B;AAAA,MAAQ+B,OAAR,SAAQA,OAAR;;AAEA,MAAI,CAACD,MAAM,CAACpB,MAAR,IAAmB,CAACoB,MAAM,CAACpB,MAAP,CAAcC,UAAf,IAA6B,CAACmB,MAAM,CAACpB,MAAP,CAAcE,QAAnE,EAA8E;AAC5E,WAAO,CAAP;AACD;;AAED,uBAA4DkB,MAA5D,CAAQpB,MAAR;AAAA,+CAAqD,EAArD;AAAA,6CAAkBC,UAAlB;AAAA,MAAkBA,UAAlB,sCAA+B,EAA/B;AAAA,6CAAmCC,QAAnC;AAAA,MAAmCA,QAAnC,sCAA8C,EAA9C;;AACA,MAAMoB,qBAAqB,GAAGxB,gCAAeyB,OAAf,CAAuBH,MAAvB,EAA+B7B,GAA/B,CAA9B;;AAEA,MAAI,CAAC+B,qBAAL,EAA4B;AAC1B,WAAO,8BAAkBF,MAAlB,EAA0B9B,OAA1B,IAAqC,CAArC,GAAyC,CAAhD;AACD;;AAED,MAAIkC,cAAc,GAAG,CAArB;AACA,MAAIC,eAAe,GAAG,CAAtB;AAEA,MAAMC,OAAO,iDAAOzB,UAAP,uCAAsBC,QAAtB,EAAb;AAEA,MAAMyB,cAAc,GAAGD,OAAO,CAACE,MAAR,CAAe,UAACC,MAAD;AAAA,WAAYA,MAAM,CAACC,OAAnB;AAAA,GAAf,CAAvB;AAEAJ,EAAAA,OAAO,CAACK,OAAR,CAAgB,UAACC,KAAD,EAAW;AACzB,QAAMC,QAAQ,GAAGZ,OAAO,IAAIA,OAAO,CAACO,MAAR,CAAe,UAACM,MAAD;AAAA,aAAYA,MAAM,CAACC,EAAP,KAAcH,KAAK,CAACG,EAAhC;AAAA,KAAf,EAAmD,CAAnD,CAA5B;AACA,QAAMC,iBAAiB,GAAGJ,KAAK,CAACF,OAAN,IAAiBG,QAA3C;;AAEA,QAAIA,QAAJ,EAAc;AACZR,MAAAA,eAAe,IAAI,CAAnB;AACD;;AAED,QAAIW,iBAAJ,EAAuB;AACrBZ,MAAAA,cAAc,IAAI,CAAlB;AACD;AACF,GAXD;AAaA,MAAMa,YAAY,GAAGZ,eAAe,GAAGE,cAAc,CAACW,MAAjC,GAA0Cb,eAAe,GAAGE,cAAc,CAACW,MAA3E,GAAoF,CAAzG;AAEA,MAAMC,KAAK,GAAGZ,cAAc,CAACW,MAAf,KAA0B,CAA1B,GAA8B,CAA9B,GAAkCX,cAAc,CAACW,MAA/D;AACA,MAAME,GAAG,GAAG,CAAC,CAAChB,cAAc,GAAGa,YAAlB,IAAkCE,KAAnC,EAA0CE,OAA1C,CAAkD,CAAlD,CAAZ;AAEA,SAAOD,GAAG,GAAG,CAAN,GAAU,CAAV,GAAcE,UAAU,CAACF,GAAD,CAA/B;AACD,CAxCD;;AA0CO,SAASG,OAAT,CAAiBvB,MAAjB,EAAyB9B,OAAzB,EAA4C;AAAA,MAAVC,GAAU,uEAAJ,EAAI;AACjD,SAAO,IAAIY,OAAJ,CAAY,UAACC,OAAD,EAAa;AAC9BvB,IAAAA,GAAG,CAAC,YAAD,CAAH;;AAEA,QAAI,CAACS,OAAD,IAAY,yBAAQA,OAAR,CAAhB,EAAkC;AAChCc,MAAAA,OAAO,CAAC;AAAEwC,QAAAA,KAAK,EAAE,CAAT;AAAYC,QAAAA,KAAK,EAAE;AAAnB,OAAD,CAAP;AACD;;AAED,QAAIvD,OAAO,CAAC+B,OAAZ,EAAqB;AACnB,UAAMuB,KAAK,GAAGzB,QAAQ,CAACC,MAAD,EAAS9B,OAAT,EAAkBC,GAAlB,CAAtB;AACAa,MAAAA,OAAO,CAAC;AAAEwC,QAAAA,KAAK,EAALA;AAAF,OAAD,CAAP;AACD,KAHD,MAGO;AACLxC,MAAAA,OAAO,CAAC;AAAEwC,QAAAA,KAAK,EAAE,CAAT;AAAYC,QAAAA,KAAK,EAAE;AAAnB,OAAD,CAAP;AACD;AACF,GAbM,CAAP;AAcD;;AAED,IAAMC,mBAAmB,GAAG,SAAtBA,mBAAsB,CAAC9C,MAAD,EAAY;AACtC,MAAIqB,OAAO,GAAG,EAAd;AAEArB,EAAAA,MAAM,CAAC+B,OAAP,CAAe,UAACgB,CAAD,EAAO;AACpB,QAAQjB,OAAR,GAAwBiB,CAAxB,CAAQjB,OAAR;AAAA,QAAiBK,EAAjB,GAAwBY,CAAxB,CAAiBZ,EAAjB;;AACA,QAAIL,OAAJ,EAAa;AACXT,MAAAA,OAAO,CAAC2B,IAAR,CAAa;AAAEb,QAAAA,EAAE,EAAFA;AAAF,OAAb;AACD;AACF,GALD;AAMA,SAAOd,OAAP;AACD,CAVD;;AAYO,IAAM4B,4BAA4B,GAAG,SAA/BA,4BAA+B,CAAClE,QAAD,EAAWQ,GAAX,EAAmB;AAC7D,SAAO,IAAIY,OAAJ,CAAY,UAACC,OAAD,EAAa;AAC9B,QAAIb,GAAG,CAACgB,IAAJ,KAAa,UAAb,IAA2BhB,GAAG,CAACuB,IAAJ,KAAa,YAA5C,EAA0D;AACxD,6BAA4D/B,QAA5D,CAAQiB,MAAR;AAAA,uDAAqD,EAArD;AAAA,mDAAkBC,UAAlB;AAAA,UAAkBA,UAAlB,sCAA+B,EAA/B;AAAA,mDAAmCC,QAAnC;AAAA,UAAmCA,QAAnC,sCAA8C,EAA9C;AAEA,UAAMgD,gBAAgB,GAAGJ,mBAAmB,CAAC7C,UAAD,CAA5C;AACA,UAAMkD,eAAe,GAAGL,mBAAmB,CAAC5C,QAAD,CAA3C;AAEAE,MAAAA,OAAO,CAAC;AACNiB,QAAAA,OAAO,gDAAM6B,gBAAN,uCAA2BC,eAA3B,EADD;AAENhB,QAAAA,EAAE,EAAE;AAFE,OAAD,CAAP;AAID,KAVD,MAUO;AACL/B,MAAAA,OAAO,CAAC,IAAD,CAAP;AACD;AACF,GAdM,CAAP;AAeD,CAhBM;;;;AAkBA,IAAMgD,QAAQ,GAAG,SAAXA,QAAW,GAA6B;AAAA,MAA5B/D,KAA4B,uEAApB,EAAoB;AAAA,MAAhB+B,MAAgB,uEAAP,EAAO;AACnD,MAAQpB,MAAR,GAAmBX,KAAnB,CAAQW,MAAR;AACA,0BAAoDoB,MAApD,CAAQiC,SAAR;AAAA,MAAQA,SAAR,kCAAoB,CAApB;AAAA,MAAuBC,SAAvB,GAAoDlC,MAApD,CAAuBkC,SAAvB;AAAA,MAAkCC,aAAlC,GAAoDnC,MAApD,CAAkCmC,aAAlC;AACA,MAAMC,MAAM,GAAG,EAAf;AAEA,MAAMC,SAAS,GAAGC,MAAM,CAACC,MAAP,CAAc3D,MAAM,IAAI,EAAxB,EAA4B4D,MAA5B,CAAmC,UAACC,GAAD,EAAM7B,KAAN;AAAA,yDAAoB6B,GAApB,uCAA4B7B,KAA5B;AAAA,GAAnC,EAAuE,EAAvE,CAAlB;AAEA,MAAM8B,cAAc,GAAG,CAACL,SAAS,IAAI,EAAd,EAAkBG,MAAlB,CAAyB,UAACC,GAAD,EAAM7B,KAAN;AAAA,WAAiBA,KAAK,CAACF,OAAN,GAAgB+B,GAAG,GAAG,CAAtB,GAA0BA,GAA3C;AAAA,GAAzB,EAA0E,CAA1E,CAAvB;AAEA,MAAME,UAAU,GAAG,CAACN,SAAS,IAAI,EAAd,EAAkBnB,MAArC;;AAEA,MAAIyB,UAAU,GAAGV,SAAjB,EAA4B;AAC1BG,IAAAA,MAAM,CAACQ,WAAP,sCAAiDX,SAAjD;AACD,GAFD,MAEO,IAAIU,UAAU,GAAGT,SAAjB,EAA4B;AACjCE,IAAAA,MAAM,CAACQ,WAAP,0BAAqCV,SAArC;AACD;;AAED,MAAIQ,cAAc,GAAG,CAArB,EAAwB;AACtBN,IAAAA,MAAM,CAACS,eAAP,GAAyB,4CAAzB;AACD,GAFD,MAEO,IAAIH,cAAc,GAAGP,aAArB,EAAoC;AACzCC,IAAAA,MAAM,CAACS,eAAP,0BAAyCV,aAAzC;AACD;;AAED,SAAOC,MAAP;AACD,CAxBM","sourcesContent":["import debug from 'debug';\nimport isEmpty from 'lodash/isEmpty';\nimport { partialScoring } from '@pie-lib/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 promptEnabled: true,\n rationaleEnabled: true,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n strokeWidth: 5,\n ...question,\n});\n\nexport function model(question, session, env) {\n const normalizedQuestion = normalize(question);\n const { imageUrl, dimensions, hotspotColor, multipleCorrect, outlineColor, partialScoring, prompt, shapes } =\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 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 = [] } = {} } = 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];\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 = [], polygons = {} } = {} } = question;\n\n const rectangleCorrect = returnShapesCorrect(rectangles);\n const polygonsCorrect = returnShapesCorrect(polygons);\n\n resolve({\n answers: [...rectangleCorrect, ...polygonsCorrect],\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 +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,
|
|
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"}
|
|
@@ -41,20 +41,17 @@ describe('controller', () => {
|
|
|
41
41
|
});
|
|
42
42
|
|
|
43
43
|
describe('outcome partialScoring test', () => {
|
|
44
|
-
|
|
45
|
-
describe('hanging controller', ()=> {
|
|
46
|
-
|
|
44
|
+
describe('hanging controller', () => {
|
|
47
45
|
it('doesnt hang if answers is missing', async () => {
|
|
48
|
-
const response = await outcome({}, {id:
|
|
49
|
-
expect(response).toEqual({score: 0, empty: true});
|
|
46
|
+
const response = await outcome({}, { id: '1' }, {});
|
|
47
|
+
expect(response).toEqual({ score: 0, empty: true });
|
|
50
48
|
});
|
|
51
49
|
|
|
52
50
|
it('doesnt hang if the rest is missing', async () => {
|
|
53
|
-
const response = await outcome({}, {id:
|
|
54
|
-
expect(response).toEqual({score: 0 });
|
|
51
|
+
const response = await outcome({}, { id: '1', answers: {} }, {});
|
|
52
|
+
expect(response).toEqual({ score: 0 });
|
|
55
53
|
});
|
|
56
|
-
|
|
57
|
-
})
|
|
54
|
+
});
|
|
58
55
|
|
|
59
56
|
beforeEach(() => {
|
|
60
57
|
const rectangles = question.shapes.rectangles.concat({
|
|
@@ -72,11 +69,7 @@ describe('controller', () => {
|
|
|
72
69
|
|
|
73
70
|
const assertOutcome = (message, extra, sessionValue, env, expected) => {
|
|
74
71
|
it(message, async () => {
|
|
75
|
-
const result = await outcome(
|
|
76
|
-
{ ...question, ...extra },
|
|
77
|
-
sessionValue,
|
|
78
|
-
env
|
|
79
|
-
);
|
|
72
|
+
const result = await outcome({ ...question, ...extra }, sessionValue, env);
|
|
80
73
|
expect(result).toEqual(expect.objectContaining(expected));
|
|
81
74
|
});
|
|
82
75
|
};
|
|
@@ -86,7 +79,7 @@ describe('controller', () => {
|
|
|
86
79
|
{ partialScoring: true },
|
|
87
80
|
{ answers: [{ id: '2' }] },
|
|
88
81
|
{ mode: 'evaluate' },
|
|
89
|
-
{ score: 0 }
|
|
82
|
+
{ score: 0 },
|
|
90
83
|
);
|
|
91
84
|
|
|
92
85
|
assertOutcome(
|
|
@@ -94,7 +87,7 @@ describe('controller', () => {
|
|
|
94
87
|
{ partialScoring: false },
|
|
95
88
|
{ answers: [{ id: '2' }] },
|
|
96
89
|
{ mode: 'evaluate' },
|
|
97
|
-
{ score: 0 }
|
|
90
|
+
{ score: 0 },
|
|
98
91
|
);
|
|
99
92
|
|
|
100
93
|
assertOutcome(
|
|
@@ -102,7 +95,7 @@ describe('controller', () => {
|
|
|
102
95
|
{ partialScoring: false },
|
|
103
96
|
{ answers: [{ id: '2' }] },
|
|
104
97
|
{ mode: 'evaluate', partialScoring: true },
|
|
105
|
-
{ score: 0 }
|
|
98
|
+
{ score: 0 },
|
|
106
99
|
);
|
|
107
100
|
|
|
108
101
|
assertOutcome(
|
|
@@ -110,7 +103,7 @@ describe('controller', () => {
|
|
|
110
103
|
{ partialScoring: true },
|
|
111
104
|
{ answers: [{ id: '2' }] },
|
|
112
105
|
{ mode: 'evaluate', partialScoring: false },
|
|
113
|
-
{ score: 0 }
|
|
106
|
+
{ score: 0 },
|
|
114
107
|
);
|
|
115
108
|
});
|
|
116
109
|
|
|
@@ -136,13 +129,16 @@ describe('controller', () => {
|
|
|
136
129
|
|
|
137
130
|
describe('partial scoring', () => {
|
|
138
131
|
beforeEach(() => {
|
|
139
|
-
const rectangles = question.shapes.rectangles.concat(
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
132
|
+
const rectangles = question.shapes.rectangles.concat(
|
|
133
|
+
{
|
|
134
|
+
id: '5',
|
|
135
|
+
correct: true,
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
id: '6',
|
|
139
|
+
correct: true,
|
|
140
|
+
},
|
|
141
|
+
);
|
|
146
142
|
question = {
|
|
147
143
|
...question,
|
|
148
144
|
partialScoring: true,
|
|
@@ -172,13 +168,12 @@ describe('controller', () => {
|
|
|
172
168
|
});
|
|
173
169
|
|
|
174
170
|
it('returns a score of 0.5 for 2/4 correct answers and 0 incorrect answers', async () => {
|
|
175
|
-
const result = await outcome(question, { answers: [{ id: '5' }, { id: '4'}] });
|
|
171
|
+
const result = await outcome(question, { answers: [{ id: '5' }, { id: '4' }] });
|
|
176
172
|
expect(result.score).toEqual(0.5);
|
|
177
173
|
});
|
|
178
174
|
|
|
179
|
-
|
|
180
175
|
it('returns a score of 0.75 for 3/4 correct answers and 0 incorrect answers', async () => {
|
|
181
|
-
const result = await outcome(question, { answers: [{ id: '1' }, { id: '5' }, { id: '4'}] });
|
|
176
|
+
const result = await outcome(question, { answers: [{ id: '1' }, { id: '5' }, { id: '4' }] });
|
|
182
177
|
expect(result.score).toEqual(0.75);
|
|
183
178
|
});
|
|
184
179
|
|
|
@@ -247,9 +242,7 @@ describe('controller', () => {
|
|
|
247
242
|
});
|
|
248
243
|
|
|
249
244
|
const returnOutcome = (session) => {
|
|
250
|
-
it(`returns empty: true when session is ${JSON.stringify(
|
|
251
|
-
session
|
|
252
|
-
)}`, async () => {
|
|
245
|
+
it(`returns empty: true when session is ${JSON.stringify(session)}`, async () => {
|
|
253
246
|
const result = await outcome(question, session);
|
|
254
247
|
expect(result).toEqual({ score: 0, empty: true });
|
|
255
248
|
});
|
|
@@ -298,15 +291,9 @@ describe('controller', () => {
|
|
|
298
291
|
|
|
299
292
|
it('returns shapes', () => {
|
|
300
293
|
expect(result.shapes.rectangles).toEqual(
|
|
301
|
-
expect.arrayContaining([
|
|
302
|
-
{ id: '1', correct: true },
|
|
303
|
-
{ id: '2' },
|
|
304
|
-
{ id: '3' },
|
|
305
|
-
])
|
|
306
|
-
);
|
|
307
|
-
expect(result.shapes.polygons).toEqual(
|
|
308
|
-
expect.arrayContaining([{ id: '4', correct: true }])
|
|
294
|
+
expect.arrayContaining([{ id: '1', correct: true }, { id: '2' }, { id: '3' }]),
|
|
309
295
|
);
|
|
296
|
+
expect(result.shapes.polygons).toEqual(expect.arrayContaining([{ id: '4', correct: true }]));
|
|
310
297
|
});
|
|
311
298
|
|
|
312
299
|
it('does not return responseCorrect', () => {
|
|
@@ -336,15 +323,9 @@ describe('controller', () => {
|
|
|
336
323
|
|
|
337
324
|
it('returns choices w/ correct', () => {
|
|
338
325
|
expect(result.shapes.rectangles).toEqual(
|
|
339
|
-
expect.arrayContaining([
|
|
340
|
-
{ id: '1', correct: true },
|
|
341
|
-
{ id: '2' },
|
|
342
|
-
{ id: '3' },
|
|
343
|
-
])
|
|
344
|
-
);
|
|
345
|
-
expect(result.shapes.polygons).toEqual(
|
|
346
|
-
expect.arrayContaining([{ id: '4', correct: true }])
|
|
326
|
+
expect.arrayContaining([{ id: '1', correct: true }, { id: '2' }, { id: '3' }]),
|
|
347
327
|
);
|
|
328
|
+
expect(result.shapes.polygons).toEqual(expect.arrayContaining([{ id: '4', correct: true }]));
|
|
348
329
|
});
|
|
349
330
|
|
|
350
331
|
it('returns is response correct', () => {
|
|
@@ -355,9 +336,7 @@ describe('controller', () => {
|
|
|
355
336
|
|
|
356
337
|
describe('isResponseCorrect', () => {
|
|
357
338
|
const returnIsResponseCorect = (session) => {
|
|
358
|
-
it(`response is not correct if session is ${JSON.stringify(
|
|
359
|
-
session
|
|
360
|
-
)}`, () => {
|
|
339
|
+
it(`response is not correct if session is ${JSON.stringify(session)}`, () => {
|
|
361
340
|
expect(isResponseCorrect(question, session)).toEqual(false);
|
|
362
341
|
});
|
|
363
342
|
};
|
|
@@ -3,20 +3,16 @@ export default {
|
|
|
3
3
|
imageUrl: '',
|
|
4
4
|
shapes: {
|
|
5
5
|
rectangles: [],
|
|
6
|
-
polygons: []
|
|
6
|
+
polygons: [],
|
|
7
7
|
},
|
|
8
8
|
multipleCorrect: true,
|
|
9
9
|
partialScoring: false,
|
|
10
10
|
dimensions: {
|
|
11
11
|
height: 0,
|
|
12
|
-
width: 0
|
|
12
|
+
width: 0,
|
|
13
13
|
},
|
|
14
14
|
hotspotColor: 'rgba(137, 183, 244, 0.65)',
|
|
15
|
-
hotspotList: [
|
|
16
|
-
'rgba(137, 183, 244, 0.65)'
|
|
17
|
-
],
|
|
15
|
+
hotspotList: ['rgba(137, 183, 244, 0.65)'],
|
|
18
16
|
outlineColor: 'blue',
|
|
19
|
-
outlineList: [
|
|
20
|
-
'blue'
|
|
21
|
-
]
|
|
17
|
+
outlineList: ['blue'],
|
|
22
18
|
};
|
package/controller/src/index.js
CHANGED
|
@@ -8,7 +8,7 @@ import defaults from './defaults';
|
|
|
8
8
|
|
|
9
9
|
const log = debug('pie-elements:hotspot:controller');
|
|
10
10
|
|
|
11
|
-
export const normalize = question => ({
|
|
11
|
+
export const normalize = (question) => ({
|
|
12
12
|
promptEnabled: true,
|
|
13
13
|
rationaleEnabled: true,
|
|
14
14
|
teacherInstructionsEnabled: true,
|
|
@@ -19,19 +19,11 @@ export const normalize = question => ({
|
|
|
19
19
|
|
|
20
20
|
export function model(question, session, env) {
|
|
21
21
|
const normalizedQuestion = normalize(question);
|
|
22
|
-
const {
|
|
23
|
-
|
|
24
|
-
dimensions,
|
|
25
|
-
hotspotColor,
|
|
26
|
-
multipleCorrect,
|
|
27
|
-
outlineColor,
|
|
28
|
-
partialScoring,
|
|
29
|
-
prompt,
|
|
30
|
-
shapes
|
|
31
|
-
} = normalizedQuestion;
|
|
22
|
+
const { imageUrl, dimensions, hotspotColor, multipleCorrect, outlineColor, partialScoring, prompt, shapes } =
|
|
23
|
+
normalizedQuestion;
|
|
32
24
|
const { rectangles, polygons } = shapes || {};
|
|
33
25
|
|
|
34
|
-
return new Promise(resolve => {
|
|
26
|
+
return new Promise((resolve) => {
|
|
35
27
|
const out = {
|
|
36
28
|
disabled: env.mode !== 'gather',
|
|
37
29
|
mode: env.mode,
|
|
@@ -46,17 +38,16 @@ export function model(question, session, env) {
|
|
|
46
38
|
// eslint-disable-next-line no-unused-vars
|
|
47
39
|
rectangles: (rectangles || []).map(({ index, ...rectProps }) => ({ ...rectProps })),
|
|
48
40
|
// eslint-disable-next-line no-unused-vars
|
|
49
|
-
polygons: (polygons || []).map(({ index, ...polyProps }) => ({ ...polyProps }))
|
|
41
|
+
polygons: (polygons || []).map(({ index, ...polyProps }) => ({ ...polyProps })),
|
|
50
42
|
},
|
|
51
|
-
responseCorrect:
|
|
52
|
-
env.mode === 'evaluate'
|
|
53
|
-
? isResponseCorrect(normalizedQuestion, session)
|
|
54
|
-
: undefined
|
|
43
|
+
responseCorrect: env.mode === 'evaluate' ? isResponseCorrect(normalizedQuestion, session) : undefined,
|
|
55
44
|
};
|
|
56
45
|
|
|
57
46
|
if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {
|
|
58
47
|
out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;
|
|
59
|
-
out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled
|
|
48
|
+
out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled
|
|
49
|
+
? normalizedQuestion.teacherInstructions
|
|
50
|
+
: null;
|
|
60
51
|
} else {
|
|
61
52
|
out.rationale = null;
|
|
62
53
|
out.teacherInstructions = null;
|
|
@@ -71,7 +62,7 @@ export function model(question, session, env) {
|
|
|
71
62
|
}
|
|
72
63
|
|
|
73
64
|
export const createDefaultModel = (model = {}) =>
|
|
74
|
-
new Promise(resolve => {
|
|
65
|
+
new Promise((resolve) => {
|
|
75
66
|
resolve({
|
|
76
67
|
...defaults,
|
|
77
68
|
...model,
|
|
@@ -97,14 +88,14 @@ const getScore = (config, session, env = {}) => {
|
|
|
97
88
|
|
|
98
89
|
const choices = [...rectangles, ...polygons];
|
|
99
90
|
|
|
100
|
-
const correctChoices = choices.filter(choice => choice.correct);
|
|
91
|
+
const correctChoices = choices.filter((choice) => choice.correct);
|
|
101
92
|
|
|
102
|
-
choices.forEach(shape => {
|
|
103
|
-
const selected = answers && answers.filter(answer => answer.id === shape.id)[0];
|
|
93
|
+
choices.forEach((shape) => {
|
|
94
|
+
const selected = answers && answers.filter((answer) => answer.id === shape.id)[0];
|
|
104
95
|
const correctlySelected = shape.correct && selected;
|
|
105
96
|
|
|
106
|
-
if(selected) {
|
|
107
|
-
selectedChoices +=1;
|
|
97
|
+
if (selected) {
|
|
98
|
+
selectedChoices += 1;
|
|
108
99
|
}
|
|
109
100
|
|
|
110
101
|
if (correctlySelected) {
|
|
@@ -121,7 +112,7 @@ const getScore = (config, session, env = {}) => {
|
|
|
121
112
|
};
|
|
122
113
|
|
|
123
114
|
export function outcome(config, session, env = {}) {
|
|
124
|
-
return new Promise(resolve => {
|
|
115
|
+
return new Promise((resolve) => {
|
|
125
116
|
log('outcome...');
|
|
126
117
|
|
|
127
118
|
if (!session || isEmpty(session)) {
|
|
@@ -132,7 +123,7 @@ export function outcome(config, session, env = {}) {
|
|
|
132
123
|
const score = getScore(config, session, env);
|
|
133
124
|
resolve({ score });
|
|
134
125
|
} else {
|
|
135
|
-
resolve({score: 0, empty: true})
|
|
126
|
+
resolve({ score: 0, empty: true });
|
|
136
127
|
}
|
|
137
128
|
});
|
|
138
129
|
}
|
|
@@ -140,7 +131,7 @@ export function outcome(config, session, env = {}) {
|
|
|
140
131
|
const returnShapesCorrect = (shapes) => {
|
|
141
132
|
let answers = [];
|
|
142
133
|
|
|
143
|
-
shapes.forEach(i => {
|
|
134
|
+
shapes.forEach((i) => {
|
|
144
135
|
const { correct, id } = i;
|
|
145
136
|
if (correct) {
|
|
146
137
|
answers.push({ id });
|
|
@@ -150,7 +141,7 @@ const returnShapesCorrect = (shapes) => {
|
|
|
150
141
|
};
|
|
151
142
|
|
|
152
143
|
export const createCorrectResponseSession = (question, env) => {
|
|
153
|
-
return new Promise(resolve => {
|
|
144
|
+
return new Promise((resolve) => {
|
|
154
145
|
if (env.mode !== 'evaluate' && env.role === 'instructor') {
|
|
155
146
|
const { shapes: { rectangles = [], polygons = {} } = {} } = question;
|
|
156
147
|
|
|
@@ -158,11 +149,8 @@ export const createCorrectResponseSession = (question, env) => {
|
|
|
158
149
|
const polygonsCorrect = returnShapesCorrect(polygons);
|
|
159
150
|
|
|
160
151
|
resolve({
|
|
161
|
-
answers: [
|
|
162
|
-
|
|
163
|
-
...polygonsCorrect
|
|
164
|
-
],
|
|
165
|
-
id: '1'
|
|
152
|
+
answers: [...rectangleCorrect, ...polygonsCorrect],
|
|
153
|
+
id: '1',
|
|
166
154
|
});
|
|
167
155
|
} else {
|
|
168
156
|
resolve(null);
|
|
@@ -177,7 +165,7 @@ export const validate = (model = {}, config = {}) => {
|
|
|
177
165
|
|
|
178
166
|
const allShapes = Object.values(shapes || {}).reduce((acc, shape) => [...acc, ...shape], []);
|
|
179
167
|
|
|
180
|
-
const nbOfSelections = (allShapes || []).reduce((acc, shape) => shape.correct ? acc + 1 : acc, 0);
|
|
168
|
+
const nbOfSelections = (allShapes || []).reduce((acc, shape) => (shape.correct ? acc + 1 : acc), 0);
|
|
181
169
|
|
|
182
170
|
const nbOfShapes = (allShapes || []).length;
|
|
183
171
|
|
package/controller/src/utils.js
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import isEqual from 'lodash/isEqual';
|
|
2
2
|
import isEmpty from 'lodash/isEmpty';
|
|
3
3
|
|
|
4
|
-
export const getCorrectResponse = (choices) =>
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
export const getCorrectResponse = (choices) =>
|
|
5
|
+
choices
|
|
6
|
+
.filter((c) => c.correct)
|
|
7
|
+
.map((c) => c.id)
|
|
8
|
+
.sort();
|
|
8
9
|
|
|
9
10
|
export const isResponseCorrect = (question, session) => {
|
|
10
|
-
const {
|
|
11
|
+
const {
|
|
12
|
+
shapes: { rectangles, polygons },
|
|
13
|
+
} = question;
|
|
11
14
|
const choices = [...rectangles, ...polygons];
|
|
12
15
|
let correctResponseIds = getCorrectResponse(choices);
|
|
13
16
|
|
|
@@ -16,7 +19,7 @@ export const isResponseCorrect = (question, session) => {
|
|
|
16
19
|
}
|
|
17
20
|
|
|
18
21
|
if (session.answers && session.answers.length) {
|
|
19
|
-
let answerIds = (session.answers || []).map(a => a.id);
|
|
22
|
+
let answerIds = (session.answers || []).map((a) => a.id);
|
|
20
23
|
|
|
21
24
|
return isEqual(answerIds.sort(), correctResponseIds);
|
|
22
25
|
} else if (!(correctResponseIds && correctResponseIds.length)) {
|
package/docs/demo/config.js
CHANGED
package/docs/demo/generate.js
CHANGED
|
@@ -4,13 +4,10 @@ exports.model = (id, element) => ({
|
|
|
4
4
|
disabled: false,
|
|
5
5
|
mode: 'gather',
|
|
6
6
|
dimensions: { height: 291, width: 410 },
|
|
7
|
-
imageUrl:
|
|
7
|
+
imageUrl:
|
|
8
|
+
'https://store-images.s-microsoft.com/image/apps.2544.13768621950225582.167ba0c8-6eb8-47bb-96fe-278c89bf0dc9.ea440c13-fd1d-4705-b62c-9bfd9054b8b3?w=672&h=378&q=80&mode=letterbox&background=%23FFE4E4E4&format=jpg',
|
|
8
9
|
hotspotColor: 'rgba(137, 183, 244, 0.65)',
|
|
9
|
-
hotspotList: [
|
|
10
|
-
'rgba(137, 183, 244, 0.65)',
|
|
11
|
-
'rgba(217, 30, 24, 0.65)',
|
|
12
|
-
'rgba(254, 241, 96, 0.65)'
|
|
13
|
-
],
|
|
10
|
+
hotspotList: ['rgba(137, 183, 244, 0.65)', 'rgba(217, 30, 24, 0.65)', 'rgba(254, 241, 96, 0.65)'],
|
|
14
11
|
outlineColor: 'blue',
|
|
15
12
|
outlineList: ['blue', 'red', 'yellow'],
|
|
16
13
|
multipleCorrect: true,
|
|
@@ -22,48 +19,63 @@ exports.model = (id, element) => ({
|
|
|
22
19
|
width: 130,
|
|
23
20
|
x: 1,
|
|
24
21
|
y: 1,
|
|
25
|
-
correct: true
|
|
26
|
-
},
|
|
22
|
+
correct: true,
|
|
23
|
+
},
|
|
24
|
+
{
|
|
27
25
|
id: 'd41',
|
|
28
26
|
height: 140,
|
|
29
27
|
width: 130,
|
|
30
28
|
x: 140,
|
|
31
|
-
y: 1
|
|
32
|
-
},
|
|
29
|
+
y: 1,
|
|
30
|
+
},
|
|
31
|
+
{
|
|
33
32
|
id: 'aaaa42',
|
|
34
33
|
height: 140,
|
|
35
34
|
width: 130,
|
|
36
35
|
x: 280,
|
|
37
|
-
y: 1
|
|
38
|
-
}
|
|
36
|
+
y: 1,
|
|
37
|
+
},
|
|
38
|
+
],
|
|
39
|
+
polygons: [
|
|
40
|
+
{
|
|
41
|
+
// triangle
|
|
42
|
+
id: '3',
|
|
43
|
+
points: [
|
|
44
|
+
{ x: 65, y: 148 },
|
|
45
|
+
{ x: 1, y: 288 },
|
|
46
|
+
{ y: 288, x: 129 },
|
|
47
|
+
],
|
|
48
|
+
correct: true,
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
// triangle
|
|
52
|
+
id: 'g74',
|
|
53
|
+
points: [
|
|
54
|
+
{ y: 151, x: 141 },
|
|
55
|
+
{ y: 289, x: 205 },
|
|
56
|
+
{ x: 269, y: 151 },
|
|
57
|
+
],
|
|
58
|
+
correct: false,
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
// hexagon
|
|
62
|
+
id: 'j35',
|
|
63
|
+
points: [
|
|
64
|
+
{ x: 300, y: 150 },
|
|
65
|
+
{ x: 279, y: 220 },
|
|
66
|
+
{ x: 300, y: 289 },
|
|
67
|
+
{ x: 386, y: 289 },
|
|
68
|
+
{ x: 407, y: 220 },
|
|
69
|
+
{ x: 386, y: 150 },
|
|
70
|
+
],
|
|
71
|
+
correct: false,
|
|
72
|
+
},
|
|
39
73
|
],
|
|
40
|
-
polygons: [{
|
|
41
|
-
// triangle
|
|
42
|
-
id: '3',
|
|
43
|
-
points: [{ x: 65, y: 148 }, { x: 1, y: 288 }, { y: 288, x: 129 }],
|
|
44
|
-
correct: true
|
|
45
|
-
}, {
|
|
46
|
-
// triangle
|
|
47
|
-
id: 'g74',
|
|
48
|
-
points: [{ y: 151, x: 141 }, { y: 289, x: 205 }, { x: 269, y: 151 }],
|
|
49
|
-
correct: false
|
|
50
|
-
}, {
|
|
51
|
-
// hexagon
|
|
52
|
-
id: 'j35',
|
|
53
|
-
points: [
|
|
54
|
-
{ x: 300, y: 150 },
|
|
55
|
-
{ x: 279, y: 220 },
|
|
56
|
-
{ x: 300, y: 289 },
|
|
57
|
-
{ x: 386, y: 289 },
|
|
58
|
-
{ x: 407, y: 220 },
|
|
59
|
-
{ x: 386, y: 150 }
|
|
60
|
-
],
|
|
61
|
-
correct: false
|
|
62
|
-
}]
|
|
63
74
|
},
|
|
64
75
|
rationale: null,
|
|
65
76
|
teacherInstructions: null,
|
|
66
77
|
toolbarEditorPosition: 'bottom',
|
|
67
|
-
prompt:
|
|
68
|
-
|
|
78
|
+
prompt:
|
|
79
|
+
'<div><audio controls="controls" src="https://storage.googleapis.com/pie-prod-221718-assets/audio/77f3f61e-5f2d-425f-80a5-fb814dfa5e4c"></audio><br><br>Choose ALL of the words with the long /o/ sound.</div>',
|
|
80
|
+
rubricEnabled: false,
|
|
69
81
|
});
|
package/docs/demo/session.js
CHANGED
package/docs/pie-schema.json.md
CHANGED