@pie-element/ebsr 12.3.4-next.3 → 13.0.0-beta.0

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.
Files changed (101) hide show
  1. package/configure/lib/defaults.js +23 -36
  2. package/configure/lib/defaults.js.map +1 -1
  3. package/configure/lib/index.js +114 -202
  4. package/configure/lib/index.js.map +1 -1
  5. package/configure/lib/main.js +188 -271
  6. package/configure/lib/main.js.map +1 -1
  7. package/configure/node_modules/@pie-element/multiple-choice/CHANGELOG.json +1972 -0
  8. package/configure/node_modules/@pie-element/multiple-choice/CHANGELOG.md +4213 -0
  9. package/configure/node_modules/@pie-element/multiple-choice/PRINT.md +35 -0
  10. package/configure/node_modules/@pie-element/multiple-choice/README.md +56 -0
  11. package/configure/node_modules/@pie-element/multiple-choice/choice.png +0 -0
  12. package/configure/node_modules/@pie-element/multiple-choice/configure/CHANGELOG.json +1387 -0
  13. package/configure/node_modules/@pie-element/multiple-choice/configure/CHANGELOG.md +3351 -0
  14. package/configure/node_modules/@pie-element/multiple-choice/configure/lib/__tests__/root.test.js +248 -0
  15. package/configure/node_modules/@pie-element/multiple-choice/configure/lib/defaults.js +200 -0
  16. package/configure/node_modules/@pie-element/multiple-choice/configure/lib/defaults.js.map +1 -0
  17. package/configure/node_modules/@pie-element/multiple-choice/configure/lib/index.js +211 -0
  18. package/configure/node_modules/@pie-element/multiple-choice/configure/lib/index.js.map +1 -0
  19. package/configure/node_modules/@pie-element/multiple-choice/configure/lib/main.js +477 -0
  20. package/configure/node_modules/@pie-element/multiple-choice/configure/lib/main.js.map +1 -0
  21. package/configure/node_modules/@pie-element/multiple-choice/configure/lib/utils.js +18 -0
  22. package/configure/node_modules/@pie-element/multiple-choice/configure/lib/utils.js.map +1 -0
  23. package/configure/node_modules/@pie-element/multiple-choice/configure/package.json +22 -0
  24. package/configure/node_modules/@pie-element/multiple-choice/controller/CHANGELOG.json +527 -0
  25. package/configure/node_modules/@pie-element/multiple-choice/controller/CHANGELOG.md +2316 -0
  26. package/configure/node_modules/@pie-element/multiple-choice/controller/lib/__tests__/index.test.js +520 -0
  27. package/configure/node_modules/@pie-element/multiple-choice/controller/lib/__tests__/utils.test.js +8 -0
  28. package/configure/node_modules/@pie-element/multiple-choice/controller/lib/defaults.js +33 -0
  29. package/configure/node_modules/@pie-element/multiple-choice/controller/lib/defaults.js.map +1 -0
  30. package/configure/node_modules/@pie-element/multiple-choice/controller/lib/index.js +251 -0
  31. package/configure/node_modules/@pie-element/multiple-choice/controller/lib/index.js.map +1 -0
  32. package/configure/node_modules/@pie-element/multiple-choice/controller/lib/utils.js +16 -0
  33. package/configure/node_modules/@pie-element/multiple-choice/controller/lib/utils.js.map +1 -0
  34. package/configure/node_modules/@pie-element/multiple-choice/controller/package.json +15 -0
  35. package/configure/node_modules/@pie-element/multiple-choice/docs/config-schema.json +2993 -0
  36. package/configure/node_modules/@pie-element/multiple-choice/docs/config-schema.json.md +2217 -0
  37. package/configure/node_modules/@pie-element/multiple-choice/docs/demo/config.js +8 -0
  38. package/configure/node_modules/@pie-element/multiple-choice/docs/demo/generate.js +61 -0
  39. package/configure/node_modules/@pie-element/multiple-choice/docs/demo/index.html +1 -0
  40. package/configure/node_modules/@pie-element/multiple-choice/docs/demo/pie.manifest.json +11 -0
  41. package/configure/node_modules/@pie-element/multiple-choice/docs/demo/session.js +7 -0
  42. package/configure/node_modules/@pie-element/multiple-choice/docs/pie-schema.json +1332 -0
  43. package/configure/node_modules/@pie-element/multiple-choice/docs/pie-schema.json.md +1015 -0
  44. package/configure/node_modules/@pie-element/multiple-choice/lib/__tests__/choice-input-test.js +117 -0
  45. package/configure/node_modules/@pie-element/multiple-choice/lib/__tests__/index-test.js +151 -0
  46. package/configure/node_modules/@pie-element/multiple-choice/lib/__tests__/key-events-test.js +95 -0
  47. package/configure/node_modules/@pie-element/multiple-choice/lib/__tests__/multiple-choice-test.js +223 -0
  48. package/configure/node_modules/@pie-element/multiple-choice/lib/__tests__/session-updater-test.js +70 -0
  49. package/configure/node_modules/@pie-element/multiple-choice/lib/choice-input.js +370 -0
  50. package/configure/node_modules/@pie-element/multiple-choice/lib/choice-input.js.map +1 -0
  51. package/configure/node_modules/@pie-element/multiple-choice/lib/choice.js +197 -0
  52. package/configure/node_modules/@pie-element/multiple-choice/lib/choice.js.map +1 -0
  53. package/configure/node_modules/@pie-element/multiple-choice/lib/feedback-tick.js +130 -0
  54. package/configure/node_modules/@pie-element/multiple-choice/lib/feedback-tick.js.map +1 -0
  55. package/configure/node_modules/@pie-element/multiple-choice/lib/index.js +292 -0
  56. package/configure/node_modules/@pie-element/multiple-choice/lib/index.js.map +1 -0
  57. package/configure/node_modules/@pie-element/multiple-choice/lib/main.js +54 -0
  58. package/configure/node_modules/@pie-element/multiple-choice/lib/main.js.map +1 -0
  59. package/configure/node_modules/@pie-element/multiple-choice/lib/multiple-choice.js +386 -0
  60. package/configure/node_modules/@pie-element/multiple-choice/lib/multiple-choice.js.map +1 -0
  61. package/configure/node_modules/@pie-element/multiple-choice/lib/print.js +92 -0
  62. package/configure/node_modules/@pie-element/multiple-choice/lib/print.js.map +1 -0
  63. package/configure/node_modules/@pie-element/multiple-choice/lib/session-updater.js +37 -0
  64. package/configure/node_modules/@pie-element/multiple-choice/lib/session-updater.js.map +1 -0
  65. package/configure/node_modules/@pie-element/multiple-choice/package.json +39 -0
  66. package/configure/package.json +9 -6
  67. package/configure/src/__tests__/index.test.js +99 -108
  68. package/configure/src/index.js +13 -6
  69. package/configure/src/main.jsx +14 -18
  70. package/controller/lib/defaults.js +20 -32
  71. package/controller/lib/defaults.js.map +1 -1
  72. package/controller/lib/index.js +224 -349
  73. package/controller/lib/index.js.map +1 -1
  74. package/controller/lib/utils.js +4 -18
  75. package/controller/lib/utils.js.map +1 -1
  76. package/controller/package.json +3 -3
  77. package/lib/index.js +113 -181
  78. package/lib/index.js.map +1 -1
  79. package/lib/print.js +120 -204
  80. package/lib/print.js.map +1 -1
  81. package/package.json +5 -13
  82. package/src/__tests__/index.test.js +18 -5
  83. package/configure/src/__tests__/__snapshots__/index.test.js.snap +0 -83
  84. package/esm/configure.js +0 -12003
  85. package/esm/configure.js.map +0 -1
  86. package/esm/controller.js +0 -3358
  87. package/esm/controller.js.map +0 -1
  88. package/esm/element.js +0 -2203
  89. package/esm/element.js.map +0 -1
  90. package/esm/package.json +0 -3
  91. package/esm/print.js +0 -4092
  92. package/esm/print.js.map +0 -1
  93. package/module/configure.js +0 -1
  94. package/module/controller.js +0 -6469
  95. package/module/demo.js +0 -77
  96. package/module/element.js +0 -1
  97. package/module/index.html +0 -21
  98. package/module/manifest.json +0 -14
  99. package/module/print-demo.js +0 -115
  100. package/module/print.html +0 -18
  101. package/module/print.js +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.js"],"names":["translator","Translator","prepareChoice","model","env","defaultFeedback","choice","out","label","value","role","mode","rationale","rationaleEnabled","correct","feedbackEnabled","feedbackType","feedback","type","parsePart","part","key","session","Object","assign","incorrect","choices","map","disabled","complete","min","filter","c","length","responseCorrect","undefined","normalizePart","base","choicesLayout","verticalMode","normalize","partA","partB","language","question","defaults","updateSession","normalizedQuestion","shuffledValues","us","id","element","update","Promise","resolve","partASession","partALockChoiceOrder","partAChoices","partBChoices","partBSession","partBLockChoiceOrder","e","console","error","partLabels","partLabel","t","lng","index","partLabelType","teacherInstructions","teacherInstructionsEnabled","prompt","promptEnabled","extraCSSRules","createDefaultModel","isCorrect","getScore","config","sessionPart","partialScoringEnabled","maxScore","sessionPartValue","chosen","find","v","correctAndNotChosen","incorrectAndChosen","correctChoices","reduce","total","parseFloat","toFixed","outcome","score","scoreA","scoreB","empty","partialScoring","enabled","max","returnPartCorrect","answers","forEach","i","push","createCorrectResponseSession","partACorrect","partBCorrect","getInnerText","html","replaceAll","getContent","replace","validatePart","minAnswerChoices","maxAnswerChoices","reversedChoices","reverse","errors","choicesErrors","rationaleErrors","hasCorrectResponse","field","required","identicalAnswer","slice","some","nbOfChoices","answerChoices","correctResponse","validate","partAConfig","partBConfig","partAErrors","partBErrors"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;;;AAEA,IAAQA,UAAR,GAAuBC,sBAAvB,CAAQD,UAAR;;AAEA,IAAME,aAAa,GAAG,SAAhBA,aAAgB,CAACC,KAAD,EAAQC,GAAR,EAAaC,eAAb;AAAA,SAAiC,UAACC,MAAD,EAAY;AACjE,QAAMC,GAAG,GAAG;AACVC,MAAAA,KAAK,EAAEF,MAAM,CAACE,KADJ;AAEVC,MAAAA,KAAK,EAAEH,MAAM,CAACG;AAFJ,KAAZ;;AAKA,QAAIL,GAAG,CAACM,IAAJ,KAAa,YAAb,KAA8BN,GAAG,CAACO,IAAJ,KAAa,MAAb,IAAuBP,GAAG,CAACO,IAAJ,KAAa,UAAlE,CAAJ,EAAmF;AACjFJ,MAAAA,GAAG,CAACK,SAAJ,GAAgBT,KAAK,CAACU,gBAAN,GAAyBP,MAAM,CAACM,SAAhC,GAA4C,IAA5D;AACD,KAFD,MAEO;AACLL,MAAAA,GAAG,CAACK,SAAJ,GAAgB,IAAhB;AACD;;AAED,QAAIR,GAAG,CAACO,IAAJ,KAAa,UAAjB,EAA6B;AAC3BJ,MAAAA,GAAG,CAACO,OAAJ,GAAc,CAAC,CAACR,MAAM,CAACQ,OAAvB;;AAEA,UAAIX,KAAK,CAACY,eAAV,EAA2B;AACzB,YAAMC,YAAY,GAAIV,MAAM,CAACW,QAAP,IAAmBX,MAAM,CAACW,QAAP,CAAgBC,IAApC,IAA6C,MAAlE;;AAEA,YAAIF,YAAY,KAAK,SAArB,EAAgC;AAC9BT,UAAAA,GAAG,CAACU,QAAJ,GAAeZ,eAAe,CAACC,MAAM,CAACQ,OAAP,GAAiB,SAAjB,GAA6B,WAA9B,CAA9B;AACD,SAFD,MAEO,IAAIE,YAAY,KAAK,QAArB,EAA+B;AACpCT,UAAAA,GAAG,CAACU,QAAJ,GAAeX,MAAM,CAACW,QAAP,CAAgBR,KAA/B;AACD;AACF;AACF;;AAED,WAAOF,GAAP;AACD,GA3BqB;AAAA,CAAtB;;AA6BA,IAAMY,SAAS,GAAG,SAAZA,SAAY,CAACC,IAAD,EAAOC,GAAP,EAAYC,OAAZ,EAAqBlB,GAArB,EAA6B;AAC7C,MAAMC,eAAe,GAAGkB,MAAM,CAACC,MAAP,CAAc;AAAEV,IAAAA,OAAO,EAAE,SAAX;AAAsBW,IAAAA,SAAS,EAAE;AAAjC,GAAd,EAA8DL,IAAI,CAACf,eAAnE,CAAxB;AAEA,MAAIqB,OAAO,GAAGN,IAAI,CAACM,OAAL,GAAeN,IAAI,CAACM,OAAL,CAAaC,GAAb,CAAiBzB,aAAa,CAACkB,IAAD,EAAOhB,GAAP,EAAYC,eAAZ,CAA9B,CAAf,GAA6E,EAA3F;AAEA,yCACKe,IADL;AAEEM,IAAAA,OAAO,EAAPA,OAFF;AAGEE,IAAAA,QAAQ,EAAExB,GAAG,CAACO,IAAJ,KAAa,QAHzB;AAIEkB,IAAAA,QAAQ,EAAE;AACRC,MAAAA,GAAG,EAAEV,IAAI,CAACM,OAAL,CAAaK,MAAb,CAAoB,UAACC,CAAD;AAAA,eAAOA,CAAC,CAAClB,OAAT;AAAA,OAApB,EAAsCmB;AADnC,KAJZ;AAOEC,IAAAA,eAAe,EAAE9B,GAAG,CAACO,IAAJ,KAAa,UAAb,GAA0B,8BAAkBS,IAAlB,EAAwBC,GAAxB,EAA6BC,OAA7B,CAA1B,GAAkEa;AAPrF;AASD,CAdD;;AAgBA,IAAMC,aAAa,GAAG,SAAhBA,aAAgB,CAACjC,KAAD,EAAQkC,IAAR;AAAA,uDACjBA,IADiB,GAEjBlC,KAFiB;AAGpBmC,IAAAA,aAAa,EAAEnC,KAAK,CAACmC,aAAN,IAAwBnC,KAAK,CAACoC,YAAN,KAAuB,KAAvB,IAAgC,YAAxD,IAAyE;AAHpE;AAAA,CAAtB;;AAMO,IAAMC,SAAS,GAAG,SAAZA,SAAY;AAAA,wBAAGC,KAAH;AAAA,MAAGA,KAAH,2BAAW,EAAX;AAAA,wBAAeC,KAAf;AAAA,MAAeA,KAAf,2BAAuB,EAAvB;AAAA,MAA2BC,QAA3B,QAA2BA,QAA3B;AAAA,MAAwCC,QAAxC;AAAA,uDACpBC,oBADoB,GAEpBD,QAFoB;AAGvBH,IAAAA,KAAK,EAAEL,aAAa,CAACK,KAAD,kCAAaI,qBAASJ,KAAtB;AAA6BE,MAAAA,QAAQ,EAARA;AAA7B,OAHG;AAIvBD,IAAAA,KAAK,EAAEN,aAAa,CAACM,KAAD,kCAAaG,qBAASH,KAAtB;AAA6BC,MAAAA,QAAQ,EAARA;AAA7B;AAJG;AAAA,CAAlB;AAOP;AACA;AACA;AACA;AACA;AACA;AACA;;;;;SACsBxC,K;;;;;yFAAf,iBAAqByC,QAArB,EAA+BtB,OAA/B,EAAwClB,GAAxC,EAA6C0C,aAA7C;AAAA;;AAAA;AAAA;AAAA;AAAA;AACCC,YAAAA,kBADD,GACsBP,SAAS,CAACI,QAAD,CAD/B;AAECH,YAAAA,KAFD,GAEStB,SAAS,CAAC4B,kBAAkB,CAACN,KAApB,EAA2B,OAA3B,EAAoCnB,OAApC,EAA6ClB,GAA7C,CAFlB;AAGCsC,YAAAA,KAHD,GAGSvB,SAAS,CAAC4B,kBAAkB,CAACL,KAApB,EAA2B,OAA3B,EAAoCpB,OAApC,EAA6ClB,GAA7C,CAHlB;AAKC4C,YAAAA,cALD,GAKkB,EALlB;;AAOCC,YAAAA,EAPD,GAOM,SAALA,EAAK,CAAC7B,IAAD;AAAA,qBAAU,UAAC8B,EAAD,EAAKC,OAAL,EAAcC,MAAd;AAAA,uBACnB,IAAIC,OAAJ,CAAY,UAACC,OAAD,EAAa;AACvBN,kBAAAA,cAAc,CAAC5B,IAAD,CAAd,GAAuBgC,MAAM,CAACJ,cAA9B;AACAM,kBAAAA,OAAO;AACR,iBAHD,CADmB;AAAA,eAAV;AAAA,aAPN;;AAaCC,YAAAA,YAbD,GAagB,qBAAIjC,OAAJ,EAAa,aAAb,CAbhB;AAcCkC,YAAAA,oBAdD,GAcwB,kCAAYT,kBAAkB,CAACN,KAA/B,EAAsCc,YAAtC,EAAoDnD,GAApD,CAdxB;AAAA,oBAgB6BqC,KAAK,IAAI,EAhBtC,EAgBYgB,YAhBZ,SAgBG/B,OAhBH;AAAA,oBAiB6BgB,KAAK,IAAI,EAjBtC,EAiBYgB,YAjBZ,SAiBGhC,OAjBH;;AAAA,kBAmBD,CAAC8B,oBAAD,IAAyBC,YAAzB,IAAyCA,YAAY,CAACxB,MAnBrD;AAAA;AAAA;AAAA;;AAAA;AAAA,mBAoBmB,yCACpBwB,YADoB,EAEpB;AAAET,cAAAA,cAAc,EAAE,CAAC1B,OAAO,CAAC0B,cAAR,IAA0B,EAA3B,EAA+BP;AAAjD,aAFoB,EAGpBQ,EAAE,CAAC,OAAD,CAHkB,EAIpB,OAJoB,CApBnB;;AAAA;AAoBHR,YAAAA,KAAK,CAACf,OApBH;;AAAA;AA4BCiC,YAAAA,YA5BD,GA4BgB,qBAAIrC,OAAJ,EAAa,aAAb,CA5BhB;AA6BCsC,YAAAA,oBA7BD,GA6BwB,kCAAYb,kBAAkB,CAACL,KAA/B,EAAsCiB,YAAtC,EAAoDvD,GAApD,CA7BxB;;AAAA,kBA+BD,CAACwD,oBAAD,IAAyBF,YAAzB,IAAyCA,YAAY,CAACzB,MA/BrD;AAAA;AAAA;AAAA;;AAAA;AAAA,mBAgCmB,yCACpByB,YADoB,EAEpB;AAAEV,cAAAA,cAAc,EAAE,CAAC1B,OAAO,CAAC0B,cAAR,IAA0B,EAA3B,EAA+BN;AAAjD,aAFoB,EAGpBO,EAAE,CAAC,OAAD,CAHkB,EAIpB,OAJoB,CAhCnB;;AAAA;AAgCHP,YAAAA,KAAK,CAAChB,OAhCH;;AAAA;AAwCL,gBAAI,CAAC,yBAAQsB,cAAR,CAAL,EAA8B;AAC5B,kBAAIF,aAAa,IAAI,OAAOA,aAAP,KAAyB,UAA9C,EAA0D;AACxDA,gBAAAA,aAAa,CAACxB,OAAO,CAAC4B,EAAT,EAAa5B,OAAO,CAAC6B,OAArB,EAA8B;AACzCH,kBAAAA,cAAc,EAAdA;AADyC,iBAA9B,CAAb,UAES,UAACa,CAAD,EAAO;AACd;AACAC,kBAAAA,OAAO,CAACC,KAAR,CAAc,uBAAd,EAAuCF,CAAvC;AACD,iBALD;AAMD;AACF;;AAED,gBAAId,kBAAkB,CAACiB,UAAvB,EAAmC;AAC3BrB,cAAAA,QAD2B,GAChBI,kBAAkB,CAACJ,QADH;AAEjCF,cAAAA,KAAK,CAACwB,SAAN,GAAkBjE,UAAU,CAACkE,CAAX,CAAa,WAAb,EAA0B;AAC1CC,gBAAAA,GAAG,EAAExB,QADqC;AAE1CyB,gBAAAA,KAAK,EAAErB,kBAAkB,CAACsB,aAAnB,KAAqC,SAArC,GAAiD,GAAjD,GAAuD;AAFpB,eAA1B,CAAlB;AAIA3B,cAAAA,KAAK,CAACuB,SAAN,GAAkBjE,UAAU,CAACkE,CAAX,CAAa,WAAb,EAA0B;AAC1CC,gBAAAA,GAAG,EAAExB,QADqC;AAE1CyB,gBAAAA,KAAK,EAAErB,kBAAkB,CAACsB,aAAnB,KAAqC,SAArC,GAAiD,GAAjD,GAAuD;AAFpB,eAA1B,CAAlB;AAID,aAVD,MAUO;AACL5B,cAAAA,KAAK,CAACwB,SAAN,GAAkB9B,SAAlB;AACAO,cAAAA,KAAK,CAACuB,SAAN,GAAkB9B,SAAlB;AACD;;AAED,gBAAI/B,GAAG,CAACM,IAAJ,KAAa,YAAb,KAA8BN,GAAG,CAACO,IAAJ,KAAa,MAAb,IAAuBP,GAAG,CAACO,IAAJ,KAAa,UAAlE,CAAJ,EAAmF;AACjF8B,cAAAA,KAAK,CAAC6B,mBAAN,GAA4BvB,kBAAkB,CAACN,KAAnB,CAAyB8B,0BAAzB,GACxBxB,kBAAkB,CAACN,KAAnB,CAAyB6B,mBADD,GAExB,IAFJ;AAGA5B,cAAAA,KAAK,CAAC4B,mBAAN,GAA4BvB,kBAAkB,CAACL,KAAnB,CAAyB6B,0BAAzB,GACxBxB,kBAAkB,CAACL,KAAnB,CAAyB4B,mBADD,GAExB,IAFJ;AAGD,aAPD,MAOO;AACL7B,cAAAA,KAAK,CAAC6B,mBAAN,GAA4B,IAA5B;AACA5B,cAAAA,KAAK,CAAC4B,mBAAN,GAA4B,IAA5B;AACD;;AAED7B,YAAAA,KAAK,CAAC+B,MAAN,GAAezB,kBAAkB,CAACN,KAAnB,CAAyBgC,aAAzB,GAAyC1B,kBAAkB,CAACN,KAAnB,CAAyB+B,MAAlE,GAA2E,IAA1F;AACA9B,YAAAA,KAAK,CAAC8B,MAAN,GAAezB,kBAAkB,CAACL,KAAnB,CAAyB+B,aAAzB,GAAyC1B,kBAAkB,CAACL,KAAnB,CAAyB8B,MAAlE,GAA2E,IAA1F;AA/EK,6CAiFE,IAAInB,OAAJ,CAAY,UAACC,OAAD,EAAa;AAC9BA,cAAAA,OAAO,CAAC;AACN1B,gBAAAA,QAAQ,EAAExB,GAAG,CAACO,IAAJ,KAAa,QADjB;AAENA,gBAAAA,IAAI,EAAEP,GAAG,CAACO,IAFJ;AAGN+D,gBAAAA,aAAa,EAAE3B,kBAAkB,CAAC2B,aAH5B;AAINjC,gBAAAA,KAAK,EAALA,KAJM;AAKNC,gBAAAA,KAAK,EAALA;AALM,eAAD,CAAP;AAOD,aARM,CAjFF;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,G;;;;AA4FA,IAAMiC,kBAAkB,GAAG,SAArBA,kBAAqB;AAAA,MAACxE,KAAD,uEAAS,EAAT;AAAA,SAChC,IAAIkD,OAAJ,CAAY,UAACC,OAAD,EAAa;AACvBA,IAAAA,OAAO,iCACFT,oBADE,GAEF1C,KAFE,EAAP;AAID,GALD,CADgC;AAAA,CAA3B;;;;AAQP,IAAMyE,SAAS,GAAG,SAAZA,SAAY,CAAC5C,CAAD;AAAA,SAAOA,CAAC,CAAClB,OAAF,KAAc,IAArB;AAAA,CAAlB;;AAEA,IAAM+D,QAAQ,GAAG,SAAXA,QAAW,CAACC,MAAD,EAASC,WAAT,EAAsB1D,GAAtB,EAA2B2D,qBAA3B,EAAqD;AACpE,cAA0BF,MAAM,IAAIA,MAAM,CAACzD,GAAD,CAAjB,IAA2B,EAApD;AAAA,4BAAQK,OAAR;AAAA,MAAQA,OAAR,8BAAkB,EAAlB;;AACA,MAAMuD,QAAQ,GAAGvD,OAAO,CAACO,MAAzB;;AACA,cAAoC8C,WAAW,IAAI,EAAnD;AAAA,MAAeG,gBAAf,SAAQzE,KAAR;;AAEA,MAAM0E,MAAM,GAAG,SAATA,MAAS,CAACnD,CAAD;AAAA,WAAO,CAAC,CAAC,CAACkD,gBAAgB,IAAI,EAArB,EAAyBE,IAAzB,CAA8B,UAACC,CAAD;AAAA,aAAOA,CAAC,KAAKrD,CAAC,CAACvB,KAAf;AAAA,KAA9B,CAAT;AAAA,GAAf;;AACA,MAAM6E,mBAAmB,GAAG,SAAtBA,mBAAsB,CAACtD,CAAD;AAAA,WAAO4C,SAAS,CAAC5C,CAAD,CAAT,IAAgB,CAACmD,MAAM,CAACnD,CAAD,CAA9B;AAAA,GAA5B;;AACA,MAAMuD,kBAAkB,GAAG,SAArBA,kBAAqB,CAACvD,CAAD;AAAA,WAAO,CAAC4C,SAAS,CAAC5C,CAAD,CAAV,IAAiBmD,MAAM,CAACnD,CAAD,CAA9B;AAAA,GAA3B;;AACA,MAAMwD,cAAc,GAAG9D,OAAO,CAAC+D,MAAR,CAAe,UAACC,KAAD,EAAQpF,MAAR,EAAmB;AACvD,QAAIgF,mBAAmB,CAAChF,MAAD,CAAnB,IAA+BiF,kBAAkB,CAACjF,MAAD,CAArD,EAA+D;AAC7D,aAAOoF,KAAK,GAAG,CAAf;AACD,KAFD,MAEO;AACL,aAAOA,KAAP;AACD;AACF,GANsB,EAMpBhE,OAAO,CAACO,MANY,CAAvB,CARoE,CAgBpE;;AACA,MAAI,CAAC+C,qBAAD,IAA0BQ,cAAc,GAAGP,QAA/C,EAAyD;AACvD,WAAO,CAAP;AACD;;AAED,SAAOU,UAAU,CAACV,QAAQ,GAAG,CAACO,cAAc,GAAGP,QAAlB,EAA4BW,OAA5B,CAAoC,CAApC,CAAH,GAA4C,CAArD,CAAjB;AACD,CAtBD;;AAwBO,SAASC,OAAT,CAAiBf,MAAjB,EAAyBxD,OAAzB,EAAkClB,GAAlC,EAAuC;AAC5C,SAAO,IAAIiD,OAAJ,CAAY,UAACC,OAAD,EAAa;AAC9B,gBAAkBhC,OAAO,IAAI,EAA7B;AAAA,QAAQb,KAAR,SAAQA,KAAR;;AAEA,QAAI,CAACa,OAAD,IAAY,CAACb,KAAjB,EAAwB;AACtB6C,MAAAA,OAAO,CAAC;AAAEwC,QAAAA,KAAK,EAAE,CAAT;AAAYC,QAAAA,MAAM,EAAE,CAApB;AAAuBC,QAAAA,MAAM,EAAE,CAA/B;AAAkCC,QAAAA,KAAK,EAAE;AAAzC,OAAD,CAAP;AACD;;AAED,QAAIxF,KAAJ,EAAW;AACT,kBAAyBA,KAAK,IAAI,EAAlC;AAAA,UAAQgC,KAAR,SAAQA,KAAR;AAAA,UAAeC,KAAf,SAAeA,KAAf;;AAEA,UAAMsC,qBAAqB,GAAGkB,gCAAeC,OAAf,CAAuBrB,MAAvB,EAA+B1E,GAA/B,CAA9B;;AAEA,UAAM2F,MAAM,GAAGlB,QAAQ,CAACC,MAAD,EAASrC,KAAT,EAAgB,OAAhB,EAAyBuC,qBAAzB,CAAvB;AACA,UAAMgB,MAAM,GAAGnB,QAAQ,CAACC,MAAD,EAASpC,KAAT,EAAgB,OAAhB,EAAyBsC,qBAAzB,CAAvB;;AAEA,UAAI,CAACA,qBAAL,EAA4B;AAC1B;AACA;AACA1B,QAAAA,OAAO,CAAC;AAAEwC,UAAAA,KAAK,EAAEC,MAAM,KAAK,CAAX,IAAgBC,MAAM,KAAK,CAA3B,GAA+B,CAA/B,GAAmC,CAA5C;AAA+CD,UAAAA,MAAM,EAANA,MAA/C;AAAuDC,UAAAA,MAAM,EAANA,MAAvD;AAA+DI,UAAAA,GAAG,EAAE;AAApE,SAAD,CAAP;AACD,OAJD,MAIO;AACL;AACA,YAAIL,MAAM,KAAK,CAAf,EAAkB;AAChB,cAAIC,MAAM,KAAK,CAAf,EAAkB;AAChB;AACA1C,YAAAA,OAAO,CAAC;AAAEwC,cAAAA,KAAK,EAAE,CAAT;AAAYC,cAAAA,MAAM,EAANA,MAAZ;AAAoBC,cAAAA,MAAM,EAANA,MAApB;AAA4BI,cAAAA,GAAG,EAAE;AAAjC,aAAD,CAAP;AACD,WAHD,MAGO;AACL;AACA9C,YAAAA,OAAO,CAAC;AAAEwC,cAAAA,KAAK,EAAE,CAAT;AAAYC,cAAAA,MAAM,EAANA,MAAZ;AAAoBC,cAAAA,MAAM,EAANA,MAApB;AAA4BI,cAAAA,GAAG,EAAE;AAAjC,aAAD,CAAP;AACD;AACF,SARD,MAQO;AACL;AACA9C,UAAAA,OAAO,CAAC;AAAEwC,YAAAA,KAAK,EAAE,CAAT;AAAYC,YAAAA,MAAM,EAANA,MAAZ;AAAoBC,YAAAA,MAAM,EAANA,MAApB;AAA4BI,YAAAA,GAAG,EAAE;AAAjC,WAAD,CAAP;AACD;AACF;AACF;AACF,GAnCM,CAAP;AAoCD;;AAED,IAAMC,iBAAiB,GAAG,SAApBA,iBAAoB,CAAC3E,OAAD,EAAa;AACrC,MAAI4E,OAAO,GAAG,EAAd;AAEA5E,EAAAA,OAAO,CAAC6E,OAAR,CAAgB,UAACC,CAAD,EAAO;AACrB,QAAQ1F,OAAR,GAA2B0F,CAA3B,CAAQ1F,OAAR;AAAA,QAAiBL,KAAjB,GAA2B+F,CAA3B,CAAiB/F,KAAjB;;AACA,QAAIK,OAAJ,EAAa;AACXwF,MAAAA,OAAO,CAACG,IAAR,CAAahG,KAAb;AACD;AACF,GALD;AAMA,SAAO6F,OAAP;AACD,CAVD;;AAYO,IAAMI,4BAA4B,GAAG,SAA/BA,4BAA+B,CAAC9D,QAAD,EAAWxC,GAAX,EAAmB;AAC7D,SAAO,IAAIiD,OAAJ,CAAY,UAACC,OAAD,EAAa;AAC9B,QAAIlD,GAAG,CAACO,IAAJ,KAAa,UAAb,IAA2BP,GAAG,CAACM,IAAJ,KAAa,YAA5C,EAA0D;AACxD,UAAQ+B,KAAR,GAAyBG,QAAzB,CAAQH,KAAR;AAAA,UAAeC,KAAf,GAAyBE,QAAzB,CAAeF,KAAf;AAEA,UAAMiE,YAAY,GAAGN,iBAAiB,CAAC5D,KAAK,CAACf,OAAP,CAAtC;AACA,UAAMkF,YAAY,GAAGP,iBAAiB,CAAC3D,KAAK,CAAChB,OAAP,CAAtC;AAEA4B,MAAAA,OAAO,CAAC;AACN7C,QAAAA,KAAK,EAAE;AACLgC,UAAAA,KAAK,EAAE;AACLS,YAAAA,EAAE,EAAE,OADC;AAELzC,YAAAA,KAAK,EAAEkG;AAFF,WADF;AAKLjE,UAAAA,KAAK,EAAE;AACLQ,YAAAA,EAAE,EAAE,OADC;AAELzC,YAAAA,KAAK,EAAEmG;AAFF;AALF,SADD;AAWN1D,QAAAA,EAAE,EAAE;AAXE,OAAD,CAAP;AAaD,KAnBD,MAmBO;AACLI,MAAAA,OAAO,CAAC,IAAD,CAAP;AACD;AACF,GAvBM,CAAP;AAwBD,CAzBM,C,CA2BP;;;;;AACA,IAAMuD,YAAY,GAAG,SAAfA,YAAe,CAACC,IAAD;AAAA,SAAU,CAACA,IAAI,IAAI,EAAT,EAAaC,UAAb,CAAwB,UAAxB,EAAoC,EAApC,CAAV;AAAA,CAArB,C,CAEA;;;AACA,IAAMC,UAAU,GAAG,SAAbA,UAAa,CAACF,IAAD;AAAA,SAAU,CAACA,IAAI,IAAI,EAAT,EAAaG,OAAb,CAAqB,oCAArB,EAA2D,EAA3D,CAAV;AAAA,CAAnB;;AAEA,IAAMC,YAAY,GAAG,SAAfA,YAAe,GAA6B;AAAA,MAA5B/G,KAA4B,uEAApB,EAAoB;AAAA,MAAhB2E,MAAgB,uEAAP,EAAO;AAChD,MAAQpD,OAAR,GAAoBvB,KAApB,CAAQuB,OAAR;AACA,8BAAmDoD,MAAnD,CAAQqC,gBAAR;AAAA,MAAQA,gBAAR,sCAA2B,CAA3B;AAAA,MAA8BC,gBAA9B,GAAmDtC,MAAnD,CAA8BsC,gBAA9B;AACA,MAAMC,eAAe,GAAG,oCAAK3F,OAAO,IAAI,EAAhB,EAAqB4F,OAArB,EAAxB;AACA,MAAMC,MAAM,GAAG,EAAf;AACA,MAAMC,aAAa,GAAG,EAAtB;AACA,MAAMC,eAAe,GAAG,EAAxB;AACA,MAAIC,kBAAkB,GAAG,KAAzB;AAEA,GAAC,qBAAD,EAAwB,QAAxB,EAAkCnB,OAAlC,CAA0C,UAACoB,KAAD,EAAW;AAAA;;AACnD,QAAI,iBAAA7C,MAAM,CAAC6C,KAAD,CAAN,wDAAeC,QAAf,IAA2B,CAACZ,UAAU,CAAC7G,KAAK,CAACwH,KAAD,CAAN,CAA1C,EAA0D;AACxDJ,MAAAA,MAAM,CAACI,KAAD,CAAN,GAAgB,yBAAhB;AACD;AACF,GAJD;AAMAN,EAAAA,eAAe,CAACd,OAAhB,CAAwB,UAACjG,MAAD,EAAS8D,KAAT,EAAmB;AAAA;;AACzC,QAAQtD,OAAR,GAA6CR,MAA7C,CAAQQ,OAAR;AAAA,QAAiBL,KAAjB,GAA6CH,MAA7C,CAAiBG,KAAjB;AAAA,QAAwBD,KAAxB,GAA6CF,MAA7C,CAAwBE,KAAxB;AAAA,QAA+BI,SAA/B,GAA6CN,MAA7C,CAA+BM,SAA/B;;AAEA,QAAIE,OAAJ,EAAa;AACX4G,MAAAA,kBAAkB,GAAG,IAArB;AACD;;AAED,QAAI,CAACV,UAAU,CAACxG,KAAD,CAAf,EAAwB;AACtBgH,MAAAA,aAAa,CAAC/G,KAAD,CAAb,GAAuB,8BAAvB;AACD,KAFD,MAEO;AACL,UAAMoH,eAAe,GAAGR,eAAe,CAACS,KAAhB,CAAsB1D,KAAK,GAAG,CAA9B,EAAiC2D,IAAjC,CAAsC,UAAC/F,CAAD;AAAA,eAAOA,CAAC,CAACxB,KAAF,KAAYA,KAAnB;AAAA,OAAtC,CAAxB;;AAEA,UAAIqH,eAAJ,EAAqB;AACnBL,QAAAA,aAAa,CAAC/G,KAAD,CAAb,GAAuB,2BAAvB;AACD;AACF;;AAED,QAAI,qBAAAqE,MAAM,CAAClE,SAAP,gEAAkBgH,QAAlB,IAA8B,CAACZ,UAAU,CAACpG,SAAD,CAA7C,EAA0D;AACxD6G,MAAAA,eAAe,CAAChH,KAAD,CAAf,GAAyB,yBAAzB;AACD;AACF,GApBD;AAsBA,MAAMuH,WAAW,GAAG,CAACtG,OAAO,IAAI,EAAZ,EAAgBO,MAApC;;AAEA,MAAI+F,WAAW,GAAGb,gBAAlB,EAAoC;AAClCI,IAAAA,MAAM,CAACU,aAAP,sCAAmDd,gBAAnD;AACD,GAFD,MAEO,IAAIa,WAAW,GAAGZ,gBAAlB,EAAoC;AACzCG,IAAAA,MAAM,CAACU,aAAP,0BAAuCb,gBAAvC;AACD;;AAED,MAAI,CAACM,kBAAL,EAAyB;AACvBH,IAAAA,MAAM,CAACW,eAAP,GAAyB,8BAAzB;AACD;;AAED,MAAI,CAAC,yBAAQV,aAAR,CAAL,EAA6B;AAC3BD,IAAAA,MAAM,CAAC7F,OAAP,GAAiB8F,aAAjB;AACD;;AAED,MAAI,CAAC,yBAAQC,eAAR,CAAL,EAA+B;AAC7BF,IAAAA,MAAM,CAAC3G,SAAP,GAAmB6G,eAAnB;AACD;;AAED,SAAOF,MAAP;AACD,CA1DD;;AA4DO,IAAMY,QAAQ,GAAG,SAAXA,QAAW,GAA6B;AAAA,MAA5BhI,KAA4B,uEAApB,EAAoB;AAAA,MAAhB2E,MAAgB,uEAAP,EAAO;;AACnD,cAAyB3E,KAAK,IAAI,EAAlC;AAAA,MAAQsC,KAAR,SAAQA,KAAR;AAAA,MAAeC,KAAf,SAAeA,KAAf;;AACA,cAAmDoC,MAAM,IAAI,EAA7D;AAAA,MAAesD,WAAf,SAAQ3F,KAAR;AAAA,MAAmC4F,WAAnC,SAA4B3F,KAA5B;;AAEA,MAAM4F,WAAW,GAAGpB,YAAY,CAACzE,KAAD,EAAQ2F,WAAR,CAAhC;AACA,MAAMG,WAAW,GAAGrB,YAAY,CAACxE,KAAD,EAAQ2F,WAAR,CAAhC;AAEA,SAAO;AAAE5F,IAAAA,KAAK,EAAE6F,WAAT;AAAsB5F,IAAAA,KAAK,EAAE6F;AAA7B,GAAP;AACD,CARM","sourcesContent":["import defaults from './defaults';\nimport { lockChoices, getShuffledChoices, partialScoring } from '@pie-lib/controller-utils';\nimport { isResponseCorrect } from './utils';\nimport get from 'lodash/get';\nimport isEmpty from 'lodash/isEmpty';\nimport Translator from '@pie-lib/translator';\n\nconst { translator } = Translator;\n\nconst prepareChoice = (model, env, defaultFeedback) => (choice) => {\n const out = {\n label: choice.label,\n value: choice.value,\n };\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.rationale = model.rationaleEnabled ? choice.rationale : null;\n } else {\n out.rationale = null;\n }\n\n if (env.mode === 'evaluate') {\n out.correct = !!choice.correct;\n\n if (model.feedbackEnabled) {\n const feedbackType = (choice.feedback && choice.feedback.type) || 'none';\n\n if (feedbackType === 'default') {\n out.feedback = defaultFeedback[choice.correct ? 'correct' : 'incorrect'];\n } else if (feedbackType === 'custom') {\n out.feedback = choice.feedback.value;\n }\n }\n }\n\n return out;\n};\n\nconst parsePart = (part, key, session, env) => {\n const defaultFeedback = Object.assign({ correct: 'Correct', incorrect: 'Incorrect' }, part.defaultFeedback);\n\n let choices = part.choices ? part.choices.map(prepareChoice(part, env, defaultFeedback)) : [];\n\n return {\n ...part,\n choices,\n disabled: env.mode !== 'gather',\n complete: {\n min: part.choices.filter((c) => c.correct).length,\n },\n responseCorrect: env.mode === 'evaluate' ? isResponseCorrect(part, key, session) : undefined,\n };\n};\n\nconst normalizePart = (model, base) => ({\n ...base,\n ...model,\n choicesLayout: model.choicesLayout || (model.verticalMode === false && 'horizontal') || 'vertical',\n});\n\nexport const normalize = ({ partA = {}, partB = {}, language, ...question }) => ({\n ...defaults,\n ...question,\n partA: normalizePart(partA, { ...defaults.partA, language }),\n partB: normalizePart(partB, { ...defaults.partB, language }),\n});\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n * @param {*} updateSession - optional - a function that will set the properties passed into it on the session.\n */\nexport async function model(question, session, env, updateSession) {\n const normalizedQuestion = normalize(question);\n const partA = parsePart(normalizedQuestion.partA, 'partA', session, env);\n const partB = parsePart(normalizedQuestion.partB, 'partB', session, env);\n\n const shuffledValues = {};\n\n const us = (part) => (id, element, update) =>\n new Promise((resolve) => {\n shuffledValues[part] = update.shuffledValues;\n resolve();\n });\n\n const partASession = get(session, 'value.partA');\n const partALockChoiceOrder = lockChoices(normalizedQuestion.partA, partASession, env);\n\n const { choices: partAChoices } = partA || {};\n const { choices: partBChoices } = partB || {};\n\n if (!partALockChoiceOrder && partAChoices && partAChoices.length) {\n partA.choices = await getShuffledChoices(\n partAChoices,\n { shuffledValues: (session.shuffledValues || {}).partA },\n us('partA'),\n 'value',\n );\n }\n\n const partBSession = get(session, 'value.partB');\n const partBLockChoiceOrder = lockChoices(normalizedQuestion.partB, partBSession, env);\n\n if (!partBLockChoiceOrder && partBChoices && partBChoices.length) {\n partB.choices = await getShuffledChoices(\n partBChoices,\n { shuffledValues: (session.shuffledValues || {}).partB },\n us('partB'),\n 'value',\n );\n }\n\n if (!isEmpty(shuffledValues)) {\n if (updateSession && typeof updateSession === 'function') {\n updateSession(session.id, session.element, {\n shuffledValues,\n }).catch((e) => {\n // eslint-disable-next-line no-console\n console.error('update session failed', e);\n });\n }\n }\n\n if (normalizedQuestion.partLabels) {\n const language = normalizedQuestion.language;\n partA.partLabel = translator.t('ebsr.part', {\n lng: language,\n index: normalizedQuestion.partLabelType === 'Letters' ? 'A' : '1',\n });\n partB.partLabel = translator.t('ebsr.part', {\n lng: language,\n index: normalizedQuestion.partLabelType === 'Letters' ? 'B' : '2',\n });\n } else {\n partA.partLabel = undefined;\n partB.partLabel = undefined;\n }\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n partA.teacherInstructions = normalizedQuestion.partA.teacherInstructionsEnabled\n ? normalizedQuestion.partA.teacherInstructions\n : null;\n partB.teacherInstructions = normalizedQuestion.partB.teacherInstructionsEnabled\n ? normalizedQuestion.partB.teacherInstructions\n : null;\n } else {\n partA.teacherInstructions = null;\n partB.teacherInstructions = null;\n }\n\n partA.prompt = normalizedQuestion.partA.promptEnabled ? normalizedQuestion.partA.prompt : null;\n partB.prompt = normalizedQuestion.partB.promptEnabled ? normalizedQuestion.partB.prompt : null;\n\n return new Promise((resolve) => {\n resolve({\n disabled: env.mode !== 'gather',\n mode: env.mode,\n extraCSSRules: normalizedQuestion.extraCSSRules,\n partA,\n partB,\n });\n });\n}\n\nexport const createDefaultModel = (model = {}) =>\n new Promise((resolve) => {\n resolve({\n ...defaults,\n ...model,\n });\n });\n\nconst isCorrect = (c) => c.correct === true;\n\nconst getScore = (config, sessionPart, key, partialScoringEnabled) => {\n const { choices = [] } = (config && config[key]) || {};\n const maxScore = choices.length;\n const { value: sessionPartValue } = sessionPart || {};\n\n const chosen = (c) => !!(sessionPartValue || []).find((v) => v === c.value);\n const correctAndNotChosen = (c) => isCorrect(c) && !chosen(c);\n const incorrectAndChosen = (c) => !isCorrect(c) && chosen(c);\n const correctChoices = choices.reduce((total, choice) => {\n if (correctAndNotChosen(choice) || incorrectAndChosen(choice)) {\n return total - 1;\n } else {\n return total;\n }\n }, choices.length);\n\n // determine score for a part\n if (!partialScoringEnabled && correctChoices < maxScore) {\n return 0;\n }\n\n return parseFloat(maxScore ? (correctChoices / maxScore).toFixed(2) : 0);\n};\n\nexport function outcome(config, session, env) {\n return new Promise((resolve) => {\n const { value } = session || {};\n\n if (!session || !value) {\n resolve({ score: 0, scoreA: 0, scoreB: 0, empty: true });\n }\n\n if (value) {\n const { partA, partB } = value || {};\n\n const partialScoringEnabled = partialScoring.enabled(config, env);\n\n const scoreA = getScore(config, partA, 'partA', partialScoringEnabled);\n const scoreB = getScore(config, partB, 'partB', partialScoringEnabled);\n\n if (!partialScoringEnabled) {\n // The EBSR item is worth 1 point\n // That point is awarded if and only if both parts are fully correct, otherwise no points are awarded\n resolve({ score: scoreA === 1 && scoreB === 1 ? 1 : 0, scoreA, scoreB, max: 1 });\n } else {\n // The EBSR item is worth 2 points\n if (scoreA === 1) {\n if (scoreB === 1) {\n // If Part A and Part B are both correct, 2 points are awarded\n resolve({ score: 2, scoreA, scoreB, max: 2 });\n } else {\n // If Part A is correct and part B is incorrect, 1 point is awarded\n resolve({ score: 1, scoreA, scoreB, max: 2 });\n }\n } else {\n // For all other combinations, no points are awarded\n resolve({ score: 0, scoreA, scoreB, max: 2 });\n }\n }\n }\n });\n}\n\nconst returnPartCorrect = (choices) => {\n let answers = [];\n\n choices.forEach((i) => {\n const { correct, value } = i;\n if (correct) {\n answers.push(value);\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 { partA, partB } = question;\n\n const partACorrect = returnPartCorrect(partA.choices);\n const partBCorrect = returnPartCorrect(partB.choices);\n\n resolve({\n value: {\n partA: {\n id: 'partA',\n value: partACorrect,\n },\n partB: {\n id: 'partB',\n value: partBCorrect,\n },\n },\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\nconst validatePart = (model = {}, config = {}) => {\n const { choices } = model;\n const { minAnswerChoices = 2, maxAnswerChoices } = config;\n const reversedChoices = [...(choices || [])].reverse();\n const errors = {};\n const choicesErrors = {};\n const rationaleErrors = {};\n let hasCorrectResponse = false;\n\n ['teacherInstructions', 'prompt'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n reversedChoices.forEach((choice, index) => {\n const { correct, value, label, rationale } = choice;\n\n if (correct) {\n hasCorrectResponse = true;\n }\n\n if (!getContent(label)) {\n choicesErrors[value] = 'Content should not be empty.';\n } else {\n const identicalAnswer = reversedChoices.slice(index + 1).some((c) => c.label === label);\n\n if (identicalAnswer) {\n choicesErrors[value] = 'Content should be unique.';\n }\n }\n\n if (config.rationale?.required && !getContent(rationale)) {\n rationaleErrors[value] = 'This field is required.';\n }\n });\n\n const nbOfChoices = (choices || []).length;\n\n if (nbOfChoices < minAnswerChoices) {\n errors.answerChoices = `There should be at least ${minAnswerChoices} choices defined.`;\n } else if (nbOfChoices > maxAnswerChoices) {\n errors.answerChoices = `No more than ${maxAnswerChoices} choices should be defined.`;\n }\n\n if (!hasCorrectResponse) {\n errors.correctResponse = 'No correct response defined.';\n }\n\n if (!isEmpty(choicesErrors)) {\n errors.choices = choicesErrors;\n }\n\n if (!isEmpty(rationaleErrors)) {\n errors.rationale = rationaleErrors;\n }\n\n return errors;\n};\n\nexport const validate = (model = {}, config = {}) => {\n const { partA, partB } = model || {};\n const { partA: partAConfig, partB: partBConfig } = config || {};\n\n const partAErrors = validatePart(partA, partAConfig);\n const partBErrors = validatePart(partB, partBConfig);\n\n return { partA: partAErrors, partB: partBErrors };\n};\n"],"file":"index.js"}
1
+ {"version":3,"file":"index.js","names":["_defaults","_interopRequireDefault","require","_controllerUtils","_utils","_get","_isEmpty","_translator","translator","Translator","prepareChoice","model","env","defaultFeedback","choice","out","label","value","role","mode","rationale","rationaleEnabled","correct","feedbackEnabled","feedbackType","feedback","type","parsePart","part","key","session","Object","assign","incorrect","choices","map","disabled","complete","min","filter","c","length","responseCorrect","isResponseCorrect","undefined","normalizePart","base","choicesLayout","verticalMode","normalize","partA","partB","language","question","defaults","exports","updateSession","normalizedQuestion","shuffledValues","us","id","element","update","Promise","resolve","partASession","get","partALockChoiceOrder","lockChoices","partAChoices","partBChoices","getShuffledChoices","partBSession","partBLockChoiceOrder","isEmpty","catch","e","console","error","partLabels","partLabel","t","lng","index","partLabelType","teacherInstructions","teacherInstructionsEnabled","prompt","promptEnabled","extraCSSRules","createDefaultModel","isCorrect","getScore","config","sessionPart","partialScoringEnabled","maxScore","sessionPartValue","chosen","find","v","correctAndNotChosen","incorrectAndChosen","correctChoices","reduce","total","parseFloat","toFixed","outcome","score","scoreA","scoreB","empty","partialScoring","enabled","max","returnPartCorrect","answers","forEach","i","push","createCorrectResponseSession","partACorrect","partBCorrect","getInnerText","html","replaceAll","getContent","replace","validatePart","minAnswerChoices","maxAnswerChoices","reversedChoices","reverse","errors","choicesErrors","rationaleErrors","hasCorrectResponse","field","required","identicalAnswer","slice","some","nbOfChoices","answerChoices","correctResponse","validate","partAConfig","partBConfig","partAErrors","partBErrors"],"sources":["../src/index.js"],"sourcesContent":["import defaults from './defaults';\nimport { lockChoices, getShuffledChoices, partialScoring } from '@pie-lib/controller-utils';\nimport { isResponseCorrect } from './utils';\nimport get from 'lodash/get';\nimport isEmpty from 'lodash/isEmpty';\nimport Translator from '@pie-lib/translator';\n\nconst { translator } = Translator;\n\nconst prepareChoice = (model, env, defaultFeedback) => (choice) => {\n const out = {\n label: choice.label,\n value: choice.value,\n };\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.rationale = model.rationaleEnabled ? choice.rationale : null;\n } else {\n out.rationale = null;\n }\n\n if (env.mode === 'evaluate') {\n out.correct = !!choice.correct;\n\n if (model.feedbackEnabled) {\n const feedbackType = (choice.feedback && choice.feedback.type) || 'none';\n\n if (feedbackType === 'default') {\n out.feedback = defaultFeedback[choice.correct ? 'correct' : 'incorrect'];\n } else if (feedbackType === 'custom') {\n out.feedback = choice.feedback.value;\n }\n }\n }\n\n return out;\n};\n\nconst parsePart = (part, key, session, env) => {\n const defaultFeedback = Object.assign({ correct: 'Correct', incorrect: 'Incorrect' }, part.defaultFeedback);\n\n let choices = part.choices ? part.choices.map(prepareChoice(part, env, defaultFeedback)) : [];\n\n return {\n ...part,\n choices,\n disabled: env.mode !== 'gather',\n complete: {\n min: part.choices.filter((c) => c.correct).length,\n },\n responseCorrect: env.mode === 'evaluate' ? isResponseCorrect(part, key, session) : undefined,\n };\n};\n\nconst normalizePart = (model, base) => ({\n ...base,\n ...model,\n choicesLayout: model.choicesLayout || (model.verticalMode === false && 'horizontal') || 'vertical',\n});\n\nexport const normalize = ({ partA = {}, partB = {}, language, ...question }) => ({\n ...defaults,\n ...question,\n partA: normalizePart(partA, { ...defaults.partA, language }),\n partB: normalizePart(partB, { ...defaults.partB, language }),\n});\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n * @param {*} updateSession - optional - a function that will set the properties passed into it on the session.\n */\nexport async function model(question, session, env, updateSession) {\n const normalizedQuestion = normalize(question);\n const partA = parsePart(normalizedQuestion.partA, 'partA', session, env);\n const partB = parsePart(normalizedQuestion.partB, 'partB', session, env);\n\n const shuffledValues = {};\n\n const us = (part) => (id, element, update) =>\n new Promise((resolve) => {\n shuffledValues[part] = update.shuffledValues;\n resolve();\n });\n\n const partASession = get(session, 'value.partA');\n const partALockChoiceOrder = lockChoices(normalizedQuestion.partA, partASession, env);\n\n const { choices: partAChoices } = partA || {};\n const { choices: partBChoices } = partB || {};\n\n if (!partALockChoiceOrder && partAChoices && partAChoices.length) {\n partA.choices = await getShuffledChoices(\n partAChoices,\n { shuffledValues: (session.shuffledValues || {}).partA },\n us('partA'),\n 'value',\n );\n }\n\n const partBSession = get(session, 'value.partB');\n const partBLockChoiceOrder = lockChoices(normalizedQuestion.partB, partBSession, env);\n\n if (!partBLockChoiceOrder && partBChoices && partBChoices.length) {\n partB.choices = await getShuffledChoices(\n partBChoices,\n { shuffledValues: (session.shuffledValues || {}).partB },\n us('partB'),\n 'value',\n );\n }\n\n if (!isEmpty(shuffledValues)) {\n if (updateSession && typeof updateSession === 'function') {\n updateSession(session.id, session.element, {\n shuffledValues,\n }).catch((e) => {\n // eslint-disable-next-line no-console\n console.error('update session failed', e);\n });\n }\n }\n\n if (normalizedQuestion.partLabels) {\n const language = normalizedQuestion.language;\n partA.partLabel = translator.t('ebsr.part', {\n lng: language,\n index: normalizedQuestion.partLabelType === 'Letters' ? 'A' : '1',\n });\n partB.partLabel = translator.t('ebsr.part', {\n lng: language,\n index: normalizedQuestion.partLabelType === 'Letters' ? 'B' : '2',\n });\n } else {\n partA.partLabel = undefined;\n partB.partLabel = undefined;\n }\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n partA.teacherInstructions = normalizedQuestion.partA.teacherInstructionsEnabled\n ? normalizedQuestion.partA.teacherInstructions\n : null;\n partB.teacherInstructions = normalizedQuestion.partB.teacherInstructionsEnabled\n ? normalizedQuestion.partB.teacherInstructions\n : null;\n } else {\n partA.teacherInstructions = null;\n partB.teacherInstructions = null;\n }\n\n partA.prompt = normalizedQuestion.partA.promptEnabled ? normalizedQuestion.partA.prompt : null;\n partB.prompt = normalizedQuestion.partB.promptEnabled ? normalizedQuestion.partB.prompt : null;\n\n return new Promise((resolve) => {\n resolve({\n disabled: env.mode !== 'gather',\n mode: env.mode,\n extraCSSRules: normalizedQuestion.extraCSSRules,\n partA,\n partB,\n });\n });\n}\n\nexport const createDefaultModel = (model = {}) =>\n new Promise((resolve) => {\n resolve({\n ...defaults,\n ...model,\n });\n });\n\nconst isCorrect = (c) => c.correct === true;\n\nconst getScore = (config, sessionPart, key, partialScoringEnabled) => {\n const { choices = [] } = (config && config[key]) || {};\n const maxScore = choices.length;\n const { value: sessionPartValue } = sessionPart || {};\n\n const chosen = (c) => !!(sessionPartValue || []).find((v) => v === c.value);\n const correctAndNotChosen = (c) => isCorrect(c) && !chosen(c);\n const incorrectAndChosen = (c) => !isCorrect(c) && chosen(c);\n const correctChoices = choices.reduce((total, choice) => {\n if (correctAndNotChosen(choice) || incorrectAndChosen(choice)) {\n return total - 1;\n } else {\n return total;\n }\n }, choices.length);\n\n // determine score for a part\n if (!partialScoringEnabled && correctChoices < maxScore) {\n return 0;\n }\n\n return parseFloat(maxScore ? (correctChoices / maxScore).toFixed(2) : 0);\n};\n\nexport function outcome(config, session, env) {\n return new Promise((resolve) => {\n const { value } = session || {};\n\n if (!session || !value) {\n resolve({ score: 0, scoreA: 0, scoreB: 0, empty: true });\n }\n\n if (value) {\n const { partA, partB } = value || {};\n\n const partialScoringEnabled = partialScoring.enabled(config, env);\n\n const scoreA = getScore(config, partA, 'partA', partialScoringEnabled);\n const scoreB = getScore(config, partB, 'partB', partialScoringEnabled);\n\n if (!partialScoringEnabled) {\n // The EBSR item is worth 1 point\n // That point is awarded if and only if both parts are fully correct, otherwise no points are awarded\n resolve({ score: scoreA === 1 && scoreB === 1 ? 1 : 0, scoreA, scoreB, max: 1 });\n } else {\n // The EBSR item is worth 2 points\n if (scoreA === 1) {\n if (scoreB === 1) {\n // If Part A and Part B are both correct, 2 points are awarded\n resolve({ score: 2, scoreA, scoreB, max: 2 });\n } else {\n // If Part A is correct and part B is incorrect, 1 point is awarded\n resolve({ score: 1, scoreA, scoreB, max: 2 });\n }\n } else {\n // For all other combinations, no points are awarded\n resolve({ score: 0, scoreA, scoreB, max: 2 });\n }\n }\n }\n });\n}\n\nconst returnPartCorrect = (choices) => {\n let answers = [];\n\n choices.forEach((i) => {\n const { correct, value } = i;\n if (correct) {\n answers.push(value);\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 { partA, partB } = question;\n\n const partACorrect = returnPartCorrect(partA.choices);\n const partBCorrect = returnPartCorrect(partB.choices);\n\n resolve({\n value: {\n partA: {\n id: 'partA',\n value: partACorrect,\n },\n partB: {\n id: 'partB',\n value: partBCorrect,\n },\n },\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\nconst validatePart = (model = {}, config = {}) => {\n const { choices } = model;\n const { minAnswerChoices = 2, maxAnswerChoices } = config;\n const reversedChoices = [...(choices || [])].reverse();\n const errors = {};\n const choicesErrors = {};\n const rationaleErrors = {};\n let hasCorrectResponse = false;\n\n ['teacherInstructions', 'prompt'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n reversedChoices.forEach((choice, index) => {\n const { correct, value, label, rationale } = choice;\n\n if (correct) {\n hasCorrectResponse = true;\n }\n\n if (!getContent(label)) {\n choicesErrors[value] = 'Content should not be empty.';\n } else {\n const identicalAnswer = reversedChoices.slice(index + 1).some((c) => c.label === label);\n\n if (identicalAnswer) {\n choicesErrors[value] = 'Content should be unique.';\n }\n }\n\n if (config.rationale?.required && !getContent(rationale)) {\n rationaleErrors[value] = 'This field is required.';\n }\n });\n\n const nbOfChoices = (choices || []).length;\n\n if (nbOfChoices < minAnswerChoices) {\n errors.answerChoices = `There should be at least ${minAnswerChoices} choices defined.`;\n } else if (nbOfChoices > maxAnswerChoices) {\n errors.answerChoices = `No more than ${maxAnswerChoices} choices should be defined.`;\n }\n\n if (!hasCorrectResponse) {\n errors.correctResponse = 'No correct response defined.';\n }\n\n if (!isEmpty(choicesErrors)) {\n errors.choices = choicesErrors;\n }\n\n if (!isEmpty(rationaleErrors)) {\n errors.rationale = rationaleErrors;\n }\n\n return errors;\n};\n\nexport const validate = (model = {}, config = {}) => {\n const { partA, partB } = model || {};\n const { partA: partAConfig, partB: partBConfig } = config || {};\n\n const partAErrors = validatePart(partA, partAConfig);\n const partBErrors = validatePart(partB, partBConfig);\n\n return { partA: partAErrors, partB: partBErrors };\n};\n"],"mappings":"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","ignoreList":[]}
@@ -1,33 +1,19 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.isResponseCorrect = exports.getCorrectResponse = void 0;
9
-
10
8
  var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
11
-
12
- var getCorrectResponse = function getCorrectResponse(choices) {
13
- return choices && choices.filter(function (c) {
14
- return c.correct;
15
- }).map(function (c) {
16
- return c.value;
17
- }).sort();
18
- };
19
-
9
+ const getCorrectResponse = choices => choices && choices.filter(c => c.correct).map(c => c.value).sort();
20
10
  exports.getCorrectResponse = getCorrectResponse;
21
-
22
- var isResponseCorrect = function isResponseCorrect(question, key, session) {
23
- var correctResponse = getCorrectResponse(question.choices);
24
-
11
+ const isResponseCorrect = (question, key, session) => {
12
+ let correctResponse = getCorrectResponse(question.choices);
25
13
  if (session && session.value) {
26
- return (0, _isEqual["default"])((session.value[key].value || []).sort(), correctResponse);
14
+ return (0, _isEqual.default)((session.value[key].value || []).sort(), correctResponse);
27
15
  }
28
-
29
16
  return false;
30
17
  };
31
-
32
18
  exports.isResponseCorrect = isResponseCorrect;
33
19
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils.js"],"names":["getCorrectResponse","choices","filter","c","correct","map","value","sort","isResponseCorrect","question","key","session","correctResponse"],"mappings":";;;;;;;;;AAAA;;AAEO,IAAMA,kBAAkB,GAAG,SAArBA,kBAAqB,CAACC,OAAD;AAAA,SAChCA,OAAO,IACPA,OAAO,CACJC,MADH,CACU,UAACC,CAAD;AAAA,WAAOA,CAAC,CAACC,OAAT;AAAA,GADV,EAEGC,GAFH,CAEO,UAACF,CAAD;AAAA,WAAOA,CAAC,CAACG,KAAT;AAAA,GAFP,EAGGC,IAHH,EAFgC;AAAA,CAA3B;;;;AAOA,IAAMC,iBAAiB,GAAG,SAApBA,iBAAoB,CAACC,QAAD,EAAWC,GAAX,EAAgBC,OAAhB,EAA4B;AAC3D,MAAIC,eAAe,GAAGZ,kBAAkB,CAACS,QAAQ,CAACR,OAAV,CAAxC;;AAEA,MAAIU,OAAO,IAAIA,OAAO,CAACL,KAAvB,EAA8B;AAC5B,WAAO,yBAAQ,CAACK,OAAO,CAACL,KAAR,CAAcI,GAAd,EAAmBJ,KAAnB,IAA4B,EAA7B,EAAiCC,IAAjC,EAAR,EAAiDK,eAAjD,CAAP;AACD;;AAED,SAAO,KAAP;AACD,CARM","sourcesContent":["import isEqual from 'lodash/isEqual';\n\nexport const getCorrectResponse = (choices) =>\n choices &&\n choices\n .filter((c) => c.correct)\n .map((c) => c.value)\n .sort();\n\nexport const isResponseCorrect = (question, key, session) => {\n let correctResponse = getCorrectResponse(question.choices);\n\n if (session && session.value) {\n return isEqual((session.value[key].value || []).sort(), correctResponse);\n }\n\n return false;\n};\n"],"file":"utils.js"}
1
+ {"version":3,"file":"utils.js","names":["_isEqual","_interopRequireDefault","require","getCorrectResponse","choices","filter","c","correct","map","value","sort","exports","isResponseCorrect","question","key","session","correctResponse","isEqual"],"sources":["../src/utils.js"],"sourcesContent":["import isEqual from 'lodash/isEqual';\n\nexport const getCorrectResponse = (choices) =>\n choices &&\n choices\n .filter((c) => c.correct)\n .map((c) => c.value)\n .sort();\n\nexport const isResponseCorrect = (question, key, session) => {\n let correctResponse = getCorrectResponse(question.choices);\n\n if (session && session.value) {\n return isEqual((session.value[key].value || []).sort(), correctResponse);\n }\n\n return false;\n};\n"],"mappings":";;;;;;;AAAA,IAAAA,QAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEO,MAAMC,kBAAkB,GAAIC,OAAO,IACxCA,OAAO,IACPA,OAAO,CACJC,MAAM,CAAEC,CAAC,IAAKA,CAAC,CAACC,OAAO,CAAC,CACxBC,GAAG,CAAEF,CAAC,IAAKA,CAAC,CAACG,KAAK,CAAC,CACnBC,IAAI,CAAC,CAAC;AAACC,OAAA,CAAAR,kBAAA,GAAAA,kBAAA;AAEL,MAAMS,iBAAiB,GAAGA,CAACC,QAAQ,EAAEC,GAAG,EAAEC,OAAO,KAAK;EAC3D,IAAIC,eAAe,GAAGb,kBAAkB,CAACU,QAAQ,CAACT,OAAO,CAAC;EAE1D,IAAIW,OAAO,IAAIA,OAAO,CAACN,KAAK,EAAE;IAC5B,OAAO,IAAAQ,gBAAO,EAAC,CAACF,OAAO,CAACN,KAAK,CAACK,GAAG,CAAC,CAACL,KAAK,IAAI,EAAE,EAAEC,IAAI,CAAC,CAAC,EAAEM,eAAe,CAAC;EAC1E;EAEA,OAAO,KAAK;AACd,CAAC;AAACL,OAAA,CAAAC,iBAAA,GAAAA,iBAAA","ignoreList":[]}
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "name": "@pie-element/ebsr-controller",
3
3
  "private": true,
4
- "version": "9.3.3",
4
+ "version": "10.0.0-beta.0",
5
5
  "description": "",
6
6
  "scripts": {
7
7
  "test": "echo \"Error: no test specified\" && exit 1"
8
8
  },
9
9
  "dependencies": {
10
- "@pie-lib/controller-utils": "0.22.2",
11
- "@pie-lib/translator": "2.23.1",
10
+ "@pie-lib/controller-utils": "0.22.4-next.0",
11
+ "@pie-lib/translator": "2.23.3-next.0",
12
12
  "lodash": "^4.17.15"
13
13
  },
14
14
  "author": "",
package/lib/index.js CHANGED
@@ -1,214 +1,146 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
- exports.isSessionComplete = exports["default"] = void 0;
9
-
10
- var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
11
-
12
- var _wrapNativeSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/wrapNativeSuper"));
13
-
7
+ exports.isSessionComplete = exports.default = void 0;
14
8
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
-
16
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
17
-
18
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
19
-
20
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
21
-
22
- var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
23
-
24
- var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
25
-
26
9
  var _piePlayerEvents = require("@pie-framework/pie-player-events");
27
-
28
10
  var _multipleChoice = _interopRequireDefault(require("@pie-element/multiple-choice"));
29
-
30
11
  var _get = _interopRequireDefault(require("lodash/get"));
31
-
32
12
  var _debug = _interopRequireDefault(require("debug"));
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; }
35
-
36
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
37
-
38
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
39
-
40
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
41
-
42
- var SESSION_CHANGED = _piePlayerEvents.SessionChangedEvent.TYPE;
43
- var MC_TAG_NAME = 'ebsr-multiple-choice';
44
- var log = (0, _debug["default"])('pie-elements:ebsr');
45
-
46
- var EbsrMC = /*#__PURE__*/function (_MultipleChoice) {
47
- (0, _inherits2["default"])(EbsrMC, _MultipleChoice);
48
-
49
- var _super = _createSuper(EbsrMC);
50
-
51
- function EbsrMC() {
52
- (0, _classCallCheck2["default"])(this, EbsrMC);
53
- return _super.apply(this, arguments);
54
- }
55
-
56
- return (0, _createClass2["default"])(EbsrMC);
57
- }(_multipleChoice["default"]);
58
-
59
- var defineMultipleChoice = function defineMultipleChoice() {
13
+ const SESSION_CHANGED = _piePlayerEvents.SessionChangedEvent.TYPE;
14
+ const MC_TAG_NAME = 'ebsr-multiple-choice';
15
+ const log = (0, _debug.default)('pie-elements:ebsr');
16
+ class EbsrMC extends _multipleChoice.default {}
17
+ const defineMultipleChoice = () => {
60
18
  if (!customElements.get(MC_TAG_NAME)) {
61
19
  customElements.define(MC_TAG_NAME, EbsrMC);
62
20
  }
63
21
  };
64
-
65
22
  defineMultipleChoice();
66
-
67
- var isNonEmptyArray = function isNonEmptyArray(a) {
68
- return Array.isArray(a) && a.length > 0;
69
- };
70
-
71
- var isSessionComplete = function isSessionComplete(session) {
72
- var a = (0, _get["default"])(session, 'value.partA.value');
73
- var b = (0, _get["default"])(session, 'value.partB.value');
23
+ const isNonEmptyArray = a => Array.isArray(a) && a.length > 0;
24
+ const isSessionComplete = session => {
25
+ const a = (0, _get.default)(session, 'value.partA.value');
26
+ const b = (0, _get.default)(session, 'value.partB.value');
74
27
  return isNonEmptyArray(a) && isNonEmptyArray(b);
75
28
  };
76
-
77
29
  exports.isSessionComplete = isSessionComplete;
78
-
79
- var Ebsr = /*#__PURE__*/function (_HTMLElement) {
80
- (0, _inherits2["default"])(Ebsr, _HTMLElement);
81
-
82
- var _super2 = _createSuper(Ebsr);
83
-
84
- function Ebsr() {
85
- var _this;
86
-
87
- (0, _classCallCheck2["default"])(this, Ebsr);
88
- _this = _super2.call(this);
89
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onSessionUpdated", function (e) {
90
- if (e.target === (0, _assertThisInitialized2["default"])(_this)) {
30
+ class Ebsr extends HTMLElement {
31
+ constructor() {
32
+ super();
33
+ (0, _defineProperty2.default)(this, "onSessionUpdated", e => {
34
+ if (e.target === this) {
91
35
  return;
92
36
  }
93
-
94
37
  e.preventDefault();
95
38
  e.stopImmediatePropagation();
96
- var id = e.target.getAttribute('id');
97
-
39
+ const id = e.target.getAttribute('id');
98
40
  if (id) {
99
- var key = "part".concat(id.toUpperCase());
100
-
41
+ const key = `part${id.toUpperCase()}`;
101
42
  if (e.update) {
102
- _this._model[key] = e.update;
103
- } //TODO: accessing a private property here. The session event should contain the update in future to prevent this.
104
-
105
-
106
- _this.dispatchSessionChanged(e.srcElement._session, key);
43
+ this._model[key] = e.update;
44
+ }
45
+ //TODO: accessing a private property here. The session event should contain the update in future to prevent this.
46
+ this.dispatchSessionChanged(e.srcElement._session, key);
107
47
  }
108
48
  });
109
- _this._model = {};
110
- _this._session = {};
111
- return _this;
49
+ this._model = {};
50
+ this._session = {};
112
51
  }
113
-
114
- (0, _createClass2["default"])(Ebsr, [{
115
- key: "model",
116
- set: function set(m) {
117
- var _this2 = this;
118
-
119
- this._model = m;
120
- customElements.whenDefined(MC_TAG_NAME).then(function () {
121
- _this2.setPartModel(_this2.partA, 'partA');
122
-
123
- _this2.setPartModel(_this2.partB, 'partB');
124
- });
125
- }
126
- }, {
127
- key: "session",
128
- get: function get() {
129
- return this._session;
130
- },
131
- set: function set(s) {
132
- var _this3 = this;
133
-
134
- this._session = s;
135
- customElements.whenDefined(MC_TAG_NAME).then(function () {
136
- _this3.setPartSession(_this3.partA, 'partA');
137
-
138
- _this3.setPartSession(_this3.partB, 'partB');
139
- });
140
- }
141
- }, {
142
- key: "setPartModel",
143
- value: function setPartModel(part, key) {
144
- if (this._model && this._model[key] && part) {
145
- var mode = this._model.mode;
146
- part.model = _objectSpread(_objectSpread({}, this._model[key]), {}, {
147
- mode: mode,
148
- keyMode: this._model[key].choicePrefix
149
- });
150
- }
151
- }
152
- }, {
153
- key: "setPartSession",
154
- value: function setPartSession(part, key) {
155
- if (this._session && this._model && part) {
156
- var value = this._session.value;
157
- part.session = value && value[key] ? value[key] : {
158
- id: key
159
- };
160
- }
161
- }
162
- }, {
163
- key: "dispatchSessionChanged",
164
- value: function dispatchSessionChanged(partSession, key) {
165
- this._session.value = _objectSpread(_objectSpread({}, this._session.value), {}, (0, _defineProperty2["default"])({}, key, partSession));
166
- log('[onSessionChanged] session: ', this._session);
167
- var complete = isSessionComplete(this._session);
168
- this.dispatchEvent(new _piePlayerEvents.SessionChangedEvent(this.tagName.toLowerCase(), complete));
169
- }
170
- }, {
171
- key: "partA",
172
- get: function get() {
173
- return this.querySelector("".concat(MC_TAG_NAME, "#a"));
174
- }
175
- }, {
176
- key: "partB",
177
- get: function get() {
178
- return this.querySelector("".concat(MC_TAG_NAME, "#b"));
179
- }
180
- }, {
181
- key: "connectedCallback",
182
- value: function connectedCallback() {
183
- this._render();
184
-
185
- this.addEventListener(SESSION_CHANGED, this.onSessionUpdated);
52
+ set model(m) {
53
+ this._model = m;
54
+ customElements.whenDefined(MC_TAG_NAME).then(() => {
55
+ this.setPartModel(this.partA, 'partA');
56
+ this.setPartModel(this.partB, 'partB');
57
+ });
58
+ }
59
+ set session(s) {
60
+ this._session = s;
61
+ customElements.whenDefined(MC_TAG_NAME).then(() => {
62
+ this.setPartSession(this.partA, 'partA');
63
+ this.setPartSession(this.partB, 'partB');
64
+ });
65
+ }
66
+ get session() {
67
+ return this._session;
68
+ }
69
+ setPartModel(part, key) {
70
+ if (this._model && this._model[key] && part) {
71
+ const {
72
+ mode
73
+ } = this._model;
74
+ part.model = {
75
+ ...this._model[key],
76
+ mode,
77
+ keyMode: this._model[key].choicePrefix
78
+ };
186
79
  }
187
- }, {
188
- key: "disconnectedCallback",
189
- value: function disconnectedCallback() {
190
- this.removeEventListener(SESSION_CHANGED, this.onSessionUpdated);
80
+ }
81
+ setPartSession(part, key) {
82
+ if (this._session && this._model && part) {
83
+ const {
84
+ value
85
+ } = this._session;
86
+ part.session = value && value[key] ? value[key] : {
87
+ id: key
88
+ };
191
89
  }
192
- }, {
193
- key: "_render",
194
- value: function _render() {
195
- var _this$_model, _this$_model$extraCSS;
196
-
197
- this.ariaLabel = 'Two-Part Question';
198
- this.role = 'region';
199
- this.innerHTML = "\n <style>\n .srOnly {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n left: -10000px;\n top: auto;\n }\n ".concat((_this$_model = this._model) === null || _this$_model === void 0 ? void 0 : (_this$_model$extraCSS = _this$_model.extraCSSRules) === null || _this$_model$extraCSS === void 0 ? void 0 : _this$_model$extraCSS.rules, "\n </style>\n <h2 class=\"srOnly\">Two-Part Question</h2>\n <").concat(MC_TAG_NAME, " id=\"a\"></").concat(MC_TAG_NAME, ">\n <").concat(MC_TAG_NAME, " id=\"b\"></").concat(MC_TAG_NAME, ">\n "); // when item is re-rendered (due to connectedCallback), if the custom element is already defined,
200
- // we need to set the model and session, otherwise the setters are not reached again
201
-
202
- if (customElements.get(MC_TAG_NAME)) {
203
- this.setPartModel(this.partA, 'partA');
204
- this.setPartModel(this.partB, 'partB');
205
- this.setPartSession(this.partA, 'partA');
206
- this.setPartSession(this.partB, 'partB');
90
+ }
91
+ dispatchSessionChanged(partSession, key) {
92
+ this._session.value = {
93
+ ...this._session.value,
94
+ [key]: partSession
95
+ };
96
+ log('[onSessionChanged] session: ', this._session);
97
+ const complete = isSessionComplete(this._session);
98
+ this.dispatchEvent(new _piePlayerEvents.SessionChangedEvent(this.tagName.toLowerCase(), complete));
99
+ }
100
+ get partA() {
101
+ return this.querySelector(`${MC_TAG_NAME}#a`);
102
+ }
103
+ get partB() {
104
+ return this.querySelector(`${MC_TAG_NAME}#b`);
105
+ }
106
+ connectedCallback() {
107
+ this._render();
108
+ this.addEventListener(SESSION_CHANGED, this.onSessionUpdated);
109
+ }
110
+ disconnectedCallback() {
111
+ this.removeEventListener(SESSION_CHANGED, this.onSessionUpdated);
112
+ }
113
+ _render() {
114
+ this.ariaLabel = 'Two-Part Question';
115
+ this.role = 'region';
116
+ this.innerHTML = `
117
+ <style>
118
+ .srOnly {
119
+ position: absolute;
120
+ width: 1px;
121
+ height: 1px;
122
+ padding: 0;
123
+ margin: -1px;
124
+ overflow: hidden;
125
+ left: -10000px;
126
+ top: auto;
207
127
  }
128
+ ${this._model?.extraCSSRules?.rules}
129
+ </style>
130
+ <h2 class="srOnly">Two-Part Question</h2>
131
+ <${MC_TAG_NAME} id="a"></${MC_TAG_NAME}>
132
+ <${MC_TAG_NAME} id="b"></${MC_TAG_NAME}>
133
+ `;
134
+
135
+ // when item is re-rendered (due to connectedCallback), if the custom element is already defined,
136
+ // we need to set the model and session, otherwise the setters are not reached again
137
+ if (customElements.get(MC_TAG_NAME)) {
138
+ this.setPartModel(this.partA, 'partA');
139
+ this.setPartModel(this.partB, 'partB');
140
+ this.setPartSession(this.partA, 'partA');
141
+ this.setPartSession(this.partB, 'partB');
208
142
  }
209
- }]);
210
- return Ebsr;
211
- }( /*#__PURE__*/(0, _wrapNativeSuper2["default"])(HTMLElement));
212
-
213
- exports["default"] = Ebsr;
143
+ }
144
+ }
145
+ exports.default = Ebsr;
214
146
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.js"],"names":["SESSION_CHANGED","SessionChangedEvent","TYPE","MC_TAG_NAME","log","EbsrMC","MultipleChoice","defineMultipleChoice","customElements","get","define","isNonEmptyArray","a","Array","isArray","length","isSessionComplete","session","b","Ebsr","e","target","preventDefault","stopImmediatePropagation","id","getAttribute","key","toUpperCase","update","_model","dispatchSessionChanged","srcElement","_session","m","whenDefined","then","setPartModel","partA","partB","s","setPartSession","part","mode","model","keyMode","choicePrefix","value","partSession","complete","dispatchEvent","tagName","toLowerCase","querySelector","_render","addEventListener","onSessionUpdated","removeEventListener","ariaLabel","role","innerHTML","extraCSSRules","rules","HTMLElement"],"mappings":"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","sourcesContent":["import { SessionChangedEvent } from '@pie-framework/pie-player-events';\nimport MultipleChoice from '@pie-element/multiple-choice';\nimport get from 'lodash/get';\nimport debug from 'debug';\n\nconst SESSION_CHANGED = SessionChangedEvent.TYPE;\nconst MC_TAG_NAME = 'ebsr-multiple-choice';\nconst log = debug('pie-elements:ebsr');\n\nclass EbsrMC extends MultipleChoice {}\n\nconst defineMultipleChoice = () => {\n if (!customElements.get(MC_TAG_NAME)) {\n customElements.define(MC_TAG_NAME, EbsrMC);\n }\n};\n\ndefineMultipleChoice();\n\nconst isNonEmptyArray = (a) => Array.isArray(a) && a.length > 0;\n\nexport const isSessionComplete = (session) => {\n const a = get(session, 'value.partA.value');\n const b = get(session, 'value.partB.value');\n\n return isNonEmptyArray(a) && isNonEmptyArray(b);\n};\n\nexport default class Ebsr extends HTMLElement {\n constructor() {\n super();\n this._model = {};\n this._session = {};\n }\n\n onSessionUpdated = (e) => {\n if (e.target === this) {\n return;\n }\n\n e.preventDefault();\n e.stopImmediatePropagation();\n\n const id = e.target.getAttribute('id');\n\n if (id) {\n const key = `part${id.toUpperCase()}`;\n\n if (e.update) {\n this._model[key] = e.update;\n }\n //TODO: accessing a private property here. The session event should contain the update in future to prevent this.\n this.dispatchSessionChanged(e.srcElement._session, key);\n }\n };\n\n set model(m) {\n this._model = m;\n\n customElements.whenDefined(MC_TAG_NAME).then(() => {\n this.setPartModel(this.partA, 'partA');\n this.setPartModel(this.partB, 'partB');\n });\n }\n\n set session(s) {\n this._session = s;\n\n customElements.whenDefined(MC_TAG_NAME).then(() => {\n this.setPartSession(this.partA, 'partA');\n this.setPartSession(this.partB, 'partB');\n });\n }\n\n get session() {\n return this._session;\n }\n\n setPartModel(part, key) {\n if (this._model && this._model[key] && part) {\n const { mode } = this._model;\n\n part.model = {\n ...this._model[key],\n mode,\n keyMode: this._model[key].choicePrefix,\n };\n }\n }\n\n setPartSession(part, key) {\n if (this._session && this._model && part) {\n const { value } = this._session;\n part.session = value && value[key] ? value[key] : { id: key };\n }\n }\n\n dispatchSessionChanged(partSession, key) {\n this._session.value = {\n ...this._session.value,\n [key]: partSession,\n };\n\n log('[onSessionChanged] session: ', this._session);\n const complete = isSessionComplete(this._session);\n this.dispatchEvent(new SessionChangedEvent(this.tagName.toLowerCase(), complete));\n }\n\n get partA() {\n return this.querySelector(`${MC_TAG_NAME}#a`);\n }\n\n get partB() {\n return this.querySelector(`${MC_TAG_NAME}#b`);\n }\n\n connectedCallback() {\n this._render();\n this.addEventListener(SESSION_CHANGED, this.onSessionUpdated);\n }\n\n disconnectedCallback() {\n this.removeEventListener(SESSION_CHANGED, this.onSessionUpdated);\n }\n\n _render() {\n this.ariaLabel = 'Two-Part Question';\n this.role = 'region';\n this.innerHTML = `\n <style>\n .srOnly {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n left: -10000px;\n top: auto;\n }\n ${this._model?.extraCSSRules?.rules}\n </style>\n <h2 class=\"srOnly\">Two-Part Question</h2>\n <${MC_TAG_NAME} id=\"a\"></${MC_TAG_NAME}>\n <${MC_TAG_NAME} id=\"b\"></${MC_TAG_NAME}>\n `;\n\n // when item is re-rendered (due to connectedCallback), if the custom element is already defined,\n // we need to set the model and session, otherwise the setters are not reached again\n if (customElements.get(MC_TAG_NAME)) {\n this.setPartModel(this.partA, 'partA');\n this.setPartModel(this.partB, 'partB');\n this.setPartSession(this.partA, 'partA');\n this.setPartSession(this.partB, 'partB');\n }\n }\n}\n"],"file":"index.js"}
1
+ {"version":3,"file":"index.js","names":["_piePlayerEvents","require","_multipleChoice","_interopRequireDefault","_get","_debug","SESSION_CHANGED","SessionChangedEvent","TYPE","MC_TAG_NAME","log","debug","EbsrMC","MultipleChoice","defineMultipleChoice","customElements","get","define","isNonEmptyArray","a","Array","isArray","length","isSessionComplete","session","b","exports","Ebsr","HTMLElement","constructor","_defineProperty2","default","e","target","preventDefault","stopImmediatePropagation","id","getAttribute","key","toUpperCase","update","_model","dispatchSessionChanged","srcElement","_session","model","m","whenDefined","then","setPartModel","partA","partB","s","setPartSession","part","mode","keyMode","choicePrefix","value","partSession","complete","dispatchEvent","tagName","toLowerCase","querySelector","connectedCallback","_render","addEventListener","onSessionUpdated","disconnectedCallback","removeEventListener","ariaLabel","role","innerHTML","extraCSSRules","rules"],"sources":["../src/index.js"],"sourcesContent":["import { SessionChangedEvent } from '@pie-framework/pie-player-events';\nimport MultipleChoice from '@pie-element/multiple-choice';\nimport get from 'lodash/get';\nimport debug from 'debug';\n\nconst SESSION_CHANGED = SessionChangedEvent.TYPE;\nconst MC_TAG_NAME = 'ebsr-multiple-choice';\nconst log = debug('pie-elements:ebsr');\n\nclass EbsrMC extends MultipleChoice {}\n\nconst defineMultipleChoice = () => {\n if (!customElements.get(MC_TAG_NAME)) {\n customElements.define(MC_TAG_NAME, EbsrMC);\n }\n};\n\ndefineMultipleChoice();\n\nconst isNonEmptyArray = (a) => Array.isArray(a) && a.length > 0;\n\nexport const isSessionComplete = (session) => {\n const a = get(session, 'value.partA.value');\n const b = get(session, 'value.partB.value');\n\n return isNonEmptyArray(a) && isNonEmptyArray(b);\n};\n\nexport default class Ebsr extends HTMLElement {\n constructor() {\n super();\n this._model = {};\n this._session = {};\n }\n\n onSessionUpdated = (e) => {\n if (e.target === this) {\n return;\n }\n\n e.preventDefault();\n e.stopImmediatePropagation();\n\n const id = e.target.getAttribute('id');\n\n if (id) {\n const key = `part${id.toUpperCase()}`;\n\n if (e.update) {\n this._model[key] = e.update;\n }\n //TODO: accessing a private property here. The session event should contain the update in future to prevent this.\n this.dispatchSessionChanged(e.srcElement._session, key);\n }\n };\n\n set model(m) {\n this._model = m;\n\n customElements.whenDefined(MC_TAG_NAME).then(() => {\n this.setPartModel(this.partA, 'partA');\n this.setPartModel(this.partB, 'partB');\n });\n }\n\n set session(s) {\n this._session = s;\n\n customElements.whenDefined(MC_TAG_NAME).then(() => {\n this.setPartSession(this.partA, 'partA');\n this.setPartSession(this.partB, 'partB');\n });\n }\n\n get session() {\n return this._session;\n }\n\n setPartModel(part, key) {\n if (this._model && this._model[key] && part) {\n const { mode } = this._model;\n\n part.model = {\n ...this._model[key],\n mode,\n keyMode: this._model[key].choicePrefix,\n };\n }\n }\n\n setPartSession(part, key) {\n if (this._session && this._model && part) {\n const { value } = this._session;\n part.session = value && value[key] ? value[key] : { id: key };\n }\n }\n\n dispatchSessionChanged(partSession, key) {\n this._session.value = {\n ...this._session.value,\n [key]: partSession,\n };\n\n log('[onSessionChanged] session: ', this._session);\n const complete = isSessionComplete(this._session);\n this.dispatchEvent(new SessionChangedEvent(this.tagName.toLowerCase(), complete));\n }\n\n get partA() {\n return this.querySelector(`${MC_TAG_NAME}#a`);\n }\n\n get partB() {\n return this.querySelector(`${MC_TAG_NAME}#b`);\n }\n\n connectedCallback() {\n this._render();\n this.addEventListener(SESSION_CHANGED, this.onSessionUpdated);\n }\n\n disconnectedCallback() {\n this.removeEventListener(SESSION_CHANGED, this.onSessionUpdated);\n }\n\n _render() {\n this.ariaLabel = 'Two-Part Question';\n this.role = 'region';\n this.innerHTML = `\n <style>\n .srOnly {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n left: -10000px;\n top: auto;\n }\n ${this._model?.extraCSSRules?.rules}\n </style>\n <h2 class=\"srOnly\">Two-Part Question</h2>\n <${MC_TAG_NAME} id=\"a\"></${MC_TAG_NAME}>\n <${MC_TAG_NAME} id=\"b\"></${MC_TAG_NAME}>\n `;\n\n // when item is re-rendered (due to connectedCallback), if the custom element is already defined,\n // we need to set the model and session, otherwise the setters are not reached again\n if (customElements.get(MC_TAG_NAME)) {\n this.setPartModel(this.partA, 'partA');\n this.setPartModel(this.partB, 'partB');\n this.setPartSession(this.partA, 'partA');\n this.setPartSession(this.partB, 'partB');\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}