@clickview/lite 0.57.2-rc.0 → 0.57.2-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/dist/bundles.json +2 -2
  2. package/dist/css/{3918-lite-9bd35b2c4c.chunk.css → 3918-lite-88ef54ffc6.chunk.css} +3 -1
  3. package/dist/css/{1057-lite-04173a371f.chunk.css → 8849-lite-1ad0b22428.chunk.css} +2 -1
  4. package/dist/css/{lite-app-5335e8e07a.css → lite-app-560655620c.css} +1 -1
  5. package/dist/languages/en.json +1 -1
  6. package/dist/scripts/1734-f5ffd39591-lite.chunk.js +2 -0
  7. package/dist/scripts/1734-f5ffd39591-lite.chunk.js.map +1 -0
  8. package/dist/scripts/2506-aee0b1f275-lite.chunk.js +2 -0
  9. package/dist/scripts/2506-aee0b1f275-lite.chunk.js.map +1 -0
  10. package/dist/scripts/{2564-cd82320188-lite.chunk.js → 2564-98ba0d782a-lite.chunk.js} +3 -3
  11. package/dist/scripts/{2564-cd82320188-lite.chunk.js.map → 2564-98ba0d782a-lite.chunk.js.map} +1 -1
  12. package/dist/scripts/2615-e9b2938c18-lite.chunk.js +3 -0
  13. package/dist/scripts/2615-e9b2938c18-lite.chunk.js.map +1 -0
  14. package/dist/scripts/2788-86687fd69d-lite.chunk.js +2 -0
  15. package/dist/scripts/2788-86687fd69d-lite.chunk.js.map +1 -0
  16. package/dist/scripts/2820-b3d1688da0-lite.chunk.js +2 -0
  17. package/dist/scripts/2820-b3d1688da0-lite.chunk.js.map +1 -0
  18. package/dist/scripts/2978-b7bcc3eac4-lite.chunk.js +2 -0
  19. package/dist/scripts/2978-b7bcc3eac4-lite.chunk.js.map +1 -0
  20. package/dist/scripts/3391-5e26ca5ece-lite.chunk.js +2 -0
  21. package/dist/scripts/3391-5e26ca5ece-lite.chunk.js.map +1 -0
  22. package/dist/scripts/{3667-f9f546136c-lite.chunk.js → 3667-149e98454c-lite.chunk.js} +3 -3
  23. package/dist/scripts/{3667-f9f546136c-lite.chunk.js.map → 3667-149e98454c-lite.chunk.js.map} +1 -1
  24. package/dist/scripts/3918-43b95cb315-lite.chunk.js +2 -0
  25. package/dist/scripts/3918-43b95cb315-lite.chunk.js.map +1 -0
  26. package/dist/scripts/4113-d6411052c4-lite.chunk.js +2 -0
  27. package/dist/scripts/4113-d6411052c4-lite.chunk.js.map +1 -0
  28. package/dist/scripts/4137-bef0be4a57-lite.chunk.js +3 -0
  29. package/dist/scripts/4137-bef0be4a57-lite.chunk.js.map +1 -0
  30. package/dist/scripts/4266-42463e0c33-lite.chunk.js +3 -0
  31. package/dist/scripts/4266-42463e0c33-lite.chunk.js.map +1 -0
  32. package/dist/scripts/5817-84b8e83c19-lite.chunk.js +3 -0
  33. package/dist/scripts/5817-84b8e83c19-lite.chunk.js.map +1 -0
  34. package/dist/scripts/{6433-ff27a3c867-lite.chunk.js → 6433-ad3992c23a-lite.chunk.js} +2 -2
  35. package/dist/scripts/{6433-ff27a3c867-lite.chunk.js.map → 6433-ad3992c23a-lite.chunk.js.map} +1 -1
  36. package/dist/scripts/7434-34137ad94a-lite.chunk.js +2 -0
  37. package/dist/scripts/7434-34137ad94a-lite.chunk.js.map +1 -0
  38. package/dist/scripts/{7556-79099a07fc-lite.chunk.js → 7556-69f8cb3b20-lite.chunk.js} +3 -3
  39. package/dist/scripts/7556-69f8cb3b20-lite.chunk.js.map +1 -0
  40. package/dist/scripts/{8095-777a5c5ddf-lite.chunk.js → 8095-afb976fac0-lite.chunk.js} +2 -2
  41. package/dist/scripts/8095-afb976fac0-lite.chunk.js.map +1 -0
  42. package/dist/scripts/839-f8478d27f8-lite.chunk.js +2 -0
  43. package/dist/scripts/839-f8478d27f8-lite.chunk.js.map +1 -0
  44. package/dist/scripts/8489-7779fd40b3-lite.chunk.js +3 -0
  45. package/dist/scripts/8489-7779fd40b3-lite.chunk.js.map +1 -0
  46. package/dist/scripts/8849-020bfd8cdd-lite.chunk.js +2 -0
  47. package/dist/scripts/8849-020bfd8cdd-lite.chunk.js.map +1 -0
  48. package/dist/scripts/bundle-fb8200eefd.min.js +3 -0
  49. package/dist/scripts/bundle-fb8200eefd.min.js.map +1 -0
  50. package/package.json +1 -1
  51. package/dist/scripts/1057-3c48d4553a-lite.chunk.js +0 -2
  52. package/dist/scripts/1057-3c48d4553a-lite.chunk.js.map +0 -1
  53. package/dist/scripts/1683-57c0175d4e-lite.chunk.js +0 -2
  54. package/dist/scripts/1683-57c0175d4e-lite.chunk.js.map +0 -1
  55. package/dist/scripts/1734-bbca52585c-lite.chunk.js +0 -2
  56. package/dist/scripts/1734-bbca52585c-lite.chunk.js.map +0 -1
  57. package/dist/scripts/232-278263e5f8-lite.chunk.js +0 -3
  58. package/dist/scripts/232-278263e5f8-lite.chunk.js.map +0 -1
  59. package/dist/scripts/2615-90d4cdd835-lite.chunk.js +0 -3
  60. package/dist/scripts/2615-90d4cdd835-lite.chunk.js.map +0 -1
  61. package/dist/scripts/2788-013bbba554-lite.chunk.js +0 -2
  62. package/dist/scripts/2788-013bbba554-lite.chunk.js.map +0 -1
  63. package/dist/scripts/312-2458059ebb-lite.chunk.js +0 -2
  64. package/dist/scripts/312-2458059ebb-lite.chunk.js.map +0 -1
  65. package/dist/scripts/3918-2855f0da2a-lite.chunk.js +0 -2
  66. package/dist/scripts/3918-2855f0da2a-lite.chunk.js.map +0 -1
  67. package/dist/scripts/4137-f0ac17da1f-lite.chunk.js +0 -3
  68. package/dist/scripts/4137-f0ac17da1f-lite.chunk.js.map +0 -1
  69. package/dist/scripts/4654-6fedfb863f-lite.chunk.js +0 -2
  70. package/dist/scripts/4654-6fedfb863f-lite.chunk.js.map +0 -1
  71. package/dist/scripts/5817-900efca702-lite.chunk.js +0 -3
  72. package/dist/scripts/5817-900efca702-lite.chunk.js.map +0 -1
  73. package/dist/scripts/7237-86c18f2701-lite.chunk.js +0 -2
  74. package/dist/scripts/7237-86c18f2701-lite.chunk.js.map +0 -1
  75. package/dist/scripts/7434-366d4ae5e0-lite.chunk.js +0 -2
  76. package/dist/scripts/7434-366d4ae5e0-lite.chunk.js.map +0 -1
  77. package/dist/scripts/7556-79099a07fc-lite.chunk.js.map +0 -1
  78. package/dist/scripts/8095-777a5c5ddf-lite.chunk.js.map +0 -1
  79. package/dist/scripts/839-889090dc50-lite.chunk.js +0 -2
  80. package/dist/scripts/839-889090dc50-lite.chunk.js.map +0 -1
  81. package/dist/scripts/8489-6e8c4dd60f-lite.chunk.js +0 -3
  82. package/dist/scripts/8489-6e8c4dd60f-lite.chunk.js.map +0 -1
  83. package/dist/scripts/897-399a877281-lite.chunk.js +0 -2
  84. package/dist/scripts/897-399a877281-lite.chunk.js.map +0 -1
  85. package/dist/scripts/9201-899c885914-lite.chunk.js +0 -2
  86. package/dist/scripts/9201-899c885914-lite.chunk.js.map +0 -1
  87. package/dist/scripts/bundle-4b58e56927.min.js +0 -3
  88. package/dist/scripts/bundle-4b58e56927.min.js.map +0 -1
  89. /package/dist/css/{1683-lite-bdd5b6edf8.chunk.css → 2506-lite-bdd5b6edf8.chunk.css} +0 -0
  90. /package/dist/css/{7237-lite-a8e87f096f.chunk.css → 2820-lite-a8e87f096f.chunk.css} +0 -0
  91. /package/dist/scripts/{2564-cd82320188-lite.chunk.js.LICENSE.txt → 2564-98ba0d782a-lite.chunk.js.LICENSE.txt} +0 -0
  92. /package/dist/scripts/{2615-90d4cdd835-lite.chunk.js.LICENSE.txt → 2615-e9b2938c18-lite.chunk.js.LICENSE.txt} +0 -0
  93. /package/dist/scripts/{3667-f9f546136c-lite.chunk.js.LICENSE.txt → 3667-149e98454c-lite.chunk.js.LICENSE.txt} +0 -0
  94. /package/dist/scripts/{4137-f0ac17da1f-lite.chunk.js.LICENSE.txt → 4137-bef0be4a57-lite.chunk.js.LICENSE.txt} +0 -0
  95. /package/dist/scripts/{232-278263e5f8-lite.chunk.js.LICENSE.txt → 4266-42463e0c33-lite.chunk.js.LICENSE.txt} +0 -0
  96. /package/dist/scripts/{5817-900efca702-lite.chunk.js.LICENSE.txt → 5817-84b8e83c19-lite.chunk.js.LICENSE.txt} +0 -0
  97. /package/dist/scripts/{6433-ff27a3c867-lite.chunk.js.LICENSE.txt → 6433-ad3992c23a-lite.chunk.js.LICENSE.txt} +0 -0
  98. /package/dist/scripts/{7556-79099a07fc-lite.chunk.js.LICENSE.txt → 7556-69f8cb3b20-lite.chunk.js.LICENSE.txt} +0 -0
  99. /package/dist/scripts/{8489-6e8c4dd60f-lite.chunk.js.LICENSE.txt → 8489-7779fd40b3-lite.chunk.js.LICENSE.txt} +0 -0
  100. /package/dist/scripts/{bundle-4b58e56927.min.js.LICENSE.txt → bundle-fb8200eefd.min.js.LICENSE.txt} +0 -0
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[897],{79671:(e,t,n)=>{n.d(t,{n:()=>v});var r=n(32735),a=n(38750),i=n(4234),c=n(20789),o=n(11607),l=n(83914),s=n(35223);const u={incorrect:"yodaE",answer:"KpbWq",avatarContainer:"uKRg2",avatarContainerImage:"_LpCq",image:"zWcu2",previewContainer:"CSRwX",imageContainer:"TeByp"};function m(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var d=["A","B","C","D"];function v(e){var t,n,v=(t=r.useState(null),n=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,i,c,o=[],l=!0,s=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=i.call(n)).done)&&(o.push(r.value),o.length!==t);l=!0);}catch(e){s=!0,a=e}finally{try{if(!l&&null!=n.return&&(c=n.return(),Object(c)!==c))return}finally{if(s)throw a}}return o}}(t,n)||function(e,t){if(e){if("string"==typeof e)return m(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?m(e,t):void 0}}(t,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),f=v[0],g=v[1],w=!!e.interaction.actionableItems.find((function(e){var t;return!!(null===(t=e.data)||void 0===t?void 0:t.imageUrl)})),b=r.useRef(),p="sm"===e.size||w&&e.interaction.actionableItems.length>2;return r.createElement("ul",{className:"".concat(w?"row ".concat(p&&!e.isDisplayOnly?"px-lg-5 p-0":""):""," list-unstyled")},e.interaction.actionableItems.map((function(t,n){var m,v=e.getSelectedAnswer(t.id),y=null===(m=t.data)||void 0===m?void 0:m.imageUrl,E=!!t.name;function h(){e.submitted||(e.onSelectAnswer&&e.onSelectAnswer(t,!v),g(v?null:t.id))}if(e.onlyShowSelectedAnswer&&!v)return r.createElement(r.Fragment,{key:n});var N=v?"bg-blue text-white":e.unCheckedBackground,C=function(){return r.createElement(r.Fragment,null,d[n])};e.showFeedback&&(N=t.isCorrect?"bg-success text-white":"bg-danger text-white ".concat(u.incorrect),e.hideFeedbackIcons||(C=function(){return r.createElement(r.Fragment,null,t.isCorrect?r.createElement(l.x,{size:l.S.Small,svgName:s.vn.Check}):r.createElement(l.x,{size:l.S.Small,svgName:s.vn.Close}))}));var k=e.showFeedback?{}:{role:"button",tabIndex:0,onKeyDown:function(e){return"Enter"===e.key&&h()}},S="";w&&(S="col-6");var x=t.id.toString()===(null==f?void 0:f.toString())&&e.leftHandSidePortalNode&&y&&!e.submitted;return r.createElement(r.Fragment,{key:n},x&&r.createElement(a.Nq,{node:e.leftHandSidePortalNode},r.createElement(i.Z,{className:"h-100",ref:b},r.createElement("div",{className:"p-3 d-flex flex-column h-100"},r.createElement("div",{className:"flex-grow-1"},r.createElement("div",{className:"cv-image-container text-center"},r.createElement("img",{className:"img-fluid rounded",src:y,alt:t.name||d[n]})),r.createElement("div",{className:"".concat(u.answer," h6 text-center text-dark p-3")},r.createElement("span",{className:"d-inline-block ".concat(E?"me-3":""," cv-multiple-choice-bullet")},r.createElement(C,null)),E&&r.createElement("span",{className:"flex-grow-1 pe-4"},t.name))),r.createElement("div",{className:"text-end"},r.createElement(o.L,{className:"btn btn-link",onClick:function(){return g(null)}},"Close"))))),r.createElement("li",{className:"".concat(S," mb-3")},r.createElement("label",Object.assign({className:"\n d-block\n rounded-3\n shadow-sm\n position-relative\n ".concat(e.showFeedback?"":"cursor-pointer","\n ").concat(u.answer,"\n ").concat(N,"\n ").concat(w?"mb-0 h-100":"","\n "),key:n,onClick:h},k),w&&r.createElement("span",{className:"d-block position-relative ".concat(u.imageContainer)},r.createElement("span",{className:"\n ".concat(u.image,"\n position-absolute\n start-0\n end-0\n top-0\n bottom-0\n rounded-top\n bg-gray-400\n "),style:{backgroundImage:y?"url(".concat(y,")"):void 0},title:t.name||d[n]})),r.createElement("span",{className:"d-flex ".concat(E||e.isDisplayOnly?"justify-content-between":"justify-content-center"," ").concat(p?"p-2":"p-3")},r.createElement("span",{className:"d-inline-block ".concat(E?"me-3":""," cv-multiple-choice-bullet")},r.createElement(C,null)),E&&r.createElement("span",{className:"flex-grow-1 pe-4"},t.name),!e.onlyShowSelectedAnswer&&r.createElement("span",{className:"".concat(u.avatarContainer," ").concat(w?u.avatarContainerImage:"")},v&&r.createElement(c.q,{imageCdnUrl:e.imageApi,initials:e.userInitials,imageUrl:e.userAvatar,extraClasses:"border border-white"}))))))})))}v.defaultProps={size:"lg",unCheckedBackground:"bg-white"}},12892:(e,t,n)=>{n.d(t,{x:()=>l});var r=n(32735),a=n(20789),i=n(83914),c=n(35223);const o={feedback:"CBgCv",avatarContainer:"CVTEm",avatarContainerSmall:"tbPTs",avatarSmall:"GUAUz",incorrect:"ZCkyL",large:"TKjXy",small:"_2qC40"};function l(e){function t(t){e.onSelectAnswer&&e.onSelectAnswer(t)}return r.createElement("div",{className:"d-flex ".concat(e.className?e.className:""," ").concat("sm"===e.size?"mx-n1":"mx-n2")},e.interaction.actionableItems.map((function(n,l){var s=e.getSelectedAnswer(n.id),u=s?"bg-blue text-white":e.unCheckedBackground,m=function(){return r.createElement(r.Fragment,null)};e.showFeedback&&(u=n.isCorrect?"bg-success text-white":"bg-danger text-white ".concat(o.incorrect),e.hideFeedbackIcons||(m=function(){return r.createElement(r.Fragment,null,n.isCorrect?r.createElement(i.x,{size:i.S.Small,svgName:c.vn.Check}):r.createElement(i.x,{size:i.S.Small,svgName:c.vn.Close}))}));var d=e.showFeedback?{}:{role:"button",tabIndex:0,onKeyDown:function(e){return"Enter"===e.key&&t(n)}};return r.createElement("label",Object.assign({key:l,htmlFor:n.id,className:"\n rounded-3\n shadow-sm\n my-0\n position-relative\n overflow-hidden\n d-flex\n align-items-center\n justify-content-center\n ".concat("sm"===e.size?"".concat(o.small," mx-1 h5"):"".concat(o.large," mx-2 h4"),"\n ").concat(e.showFeedback?"":"cursor-pointer","\n ").concat(u)},d),r.createElement("input",{id:n.id,type:"radio",name:"multiple-choice",checked:!!s,onChange:function(){return t(n)},disabled:e.showFeedback,hidden:!0}),n.name,r.createElement("span",{className:"position-absolute p-2 ".concat(o.feedback)},r.createElement(m,null)),r.createElement("span",{className:"".concat(o.avatarContainer).concat("sm"===e.size?" ".concat(o.avatarContainerSmall):"")},s&&r.createElement(a.q,{imageCdnUrl:e.imageApi,initials:e.userInitials,imageUrl:e.userAvatar,extraClasses:"border border-white ".concat("sm"===e.size?o.avatarSmall:"")})))})))}l.defaultProps={size:"lg",unCheckedBackground:"bg-white"}},80897:(e,t,n)=>{n.d(t,{O:()=>S});var r=n(32735),a=n(20789),i=n(83140),c=n(80845),o=n(64818),l=n(69737),s=n(35561),u=n(40424),m=n(8246),d="cv-missing-word-",v=n(79671);const f="Y7ls8";var g=n(75896),w=n(12892);function b(e){return b="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},b(e)}function p(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=b(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,"string");if("object"!=b(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==b(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var y=function(){return r.createElement(r.Fragment,null)},E=p(p(p(p(p(p(p({},u.Z9.Annotation,y),u.Z9.Image,y),u.Z9.MissingWord,(function(e){var t=e.interaction.data.sentence.replace(/{([^{}]*)}/g,(function(e,t){return"{".concat(d).concat(t,"}")})).split(/{([^{}]*)}/g),n="p-2";return e.reportsStyling||(n+=" border rounded"),r.createElement("div",{className:n},t.map((function(t,n){if(!t.startsWith(d))return t;var a=t.replace(d,""),i=e.interaction.actionableItems.find((function(e){return e.order.toString()===a}));if(i){var c=e.answers.find((function(e){return e.id==i.id}));if(c){if(!e.showFeedback)return r.createElement("strong",{key:n,className:"text-info"},c.text);var o=c.status===m.N.Correct;return r.createElement(r.Fragment,{key:n},!o&&r.createElement(r.Fragment,null,r.createElement("del",{className:"text-danger"},r.createElement("strong",null,c.text))," "),r.createElement("strong",{className:"text-success"},i.name))}}})))})),u.Z9.MultipleChoice,(function(e){var t,n,a,i,c="my-2";return e.reportsStyling&&(c+=" mx-2"),r.createElement("div",{className:c},r.createElement(v.n,{interaction:e.interaction,showFeedback:e.showFeedback,getSelectedAnswer:function(t){var n=e.answers.find((function(e){return e.id==t}));return null==n?void 0:n.id},imageApi:e.imageCdnUrl,userInitials:e.anonymisedUserName?o.l.getInitialsFromFullName(e.anonymisedUserName):o.l.getInitials(null===(t=e.user)||void 0===t?void 0:t.name,null===(n=e.user)||void 0===n?void 0:n.surname),userAvatar:e.anonymisedUserName?null:null===(i=null===(a=e.user)||void 0===a?void 0:a.avatar)||void 0===i?void 0:i.url,onlyShowSelectedAnswer:!e.showAvatar,size:"sm",unCheckedBackground:e.showFeedback?"":"".concat(f," text-white"),isDisplayOnly:!0}))})),u.Z9.TrueOrFalse,(function(e){var t,n,a,i,c="justify-content-start";return e.reportsStyling&&(c="justify-content-center"),r.createElement("div",{className:"my-2"},r.createElement(w.x,{className:c,interaction:e.interaction,showFeedback:e.showFeedback,hideFeedbackIcons:!e.showAvatar,getSelectedAnswer:function(t){var n=e.answers.find((function(e){return e.id==t}));return null==n?void 0:n.text},imageApi:e.imageCdnUrl,userInitials:e.anonymisedUserName?o.l.getInitialsFromFullName(e.anonymisedUserName):o.l.getInitials(null===(t=e.user)||void 0===t?void 0:t.name,null===(n=e.user)||void 0===n?void 0:n.surname),userAvatar:e.anonymisedUserName?null:null===(i=null===(a=e.user)||void 0===a?void 0:a.avatar)||void 0===i?void 0:i.url,size:"sm",unCheckedBackground:e.showFeedback?"":"".concat(f," text-white")}))})),u.Z9.ShortAnswer,(function(e){var t=g.m.first(e.answers);if(!t)return r.createElement(r.Fragment,null);var n="rounded p-2 mb-2";return e.reportsStyling||(n+=" bg-blue text-white"),r.createElement("div",{className:n},t.text)})),u.Z9.Illustration,s.O),h=n(44526),N=n(56151),C=n(3894);const k={avatarContainer:"FEdgT"};function S(e){var t,n,s,u,m,d=E[e.interaction.typeId];if(!d)return r.createElement(r.Fragment,null);var v=(0,c.j_)(e.studentResults),f=(0,c.f6)(e.interaction.id,v),g=i.A.isInteractionCorrect(e.interaction,v);return r.createElement("div",{className:"rounded ".concat(null!==(t=e.className)&&void 0!==t?t:"")},r.createElement("div",{className:"d-flex"},!!e.showStudentDetails&&r.createElement("div",{className:"me-2"},r.createElement("div",{className:k.avatarContainer},r.createElement(a.q,{imageCdnUrl:e.imageCdnUrl,initials:e.anonymisedUserName?o.l.getInitialsFromFullName(e.anonymisedUserName):o.l.getInitials(null===(n=e.studentResults.user)||void 0===n?void 0:n.name,null===(s=e.studentResults.user)||void 0===s?void 0:s.surname),imageUrl:e.anonymisedUserName?null:null===(m=null===(u=e.studentResults.user)||void 0===u?void 0:u.avatar)||void 0===m?void 0:m.url}))),r.createElement("div",{className:"flex-grow-1"},!!e.showStudentDetails&&r.createElement(N.U,{studentResults:e.studentResults,correctness:g,anonymisedUserName:e.anonymisedUserName}),r.createElement("div",{className:"d-flex justify-content-between"},r.createElement("div",{className:"flex-grow-1 ".concat(e.responseComponentClass?e.responseComponentClass:"")},f?r.createElement(d,{interaction:e.interaction,answers:f.answers,imageCdnUrl:e.imageCdnUrl,user:e.studentResults.user,showFeedback:e.showFeedback,showAvatar:e.showAvatar,reportsStyling:e.reportsStyling}):r.createElement(l.R,null)),!e.showStudentDetails&&r.createElement(h.Y,{correctness:g})))),r.createElement(C.Z,{studentAttempt:f,correctness:g,markInteraction:e.markInteraction,markedStatus:e.markedStatus}))}},44526:(e,t,n)=>{n.d(t,{Y:()=>o});var r=n(32735),a=n(83914),i=n(28972),c=n(35223);function o(e){return r.createElement(r.Fragment,null,e.correctness===i.w.Correct&&r.createElement("div",{className:"ms-2 text-success"},r.createElement(a.x,{svgName:c.vn.Tick})),e.correctness===i.w.Incorrect&&r.createElement("div",{className:"ms-2 text-danger"},r.createElement(a.x,{svgName:c.vn.Close})))}},56151:(e,t,n)=>{n.d(t,{U:()=>c});var r=n(32735),a=n(64818),i=n(44526);function c(e){return r.createElement("div",{className:"d-flex align-items-center justify-content-between mb-2"},r.createElement("p",{className:"fw-semibold mb-0"},e.anonymisedUserName||a.l.getFullName(e.studentResults.user)),r.createElement(i.Y,{correctness:e.correctness}))}},3894:(e,t,n)=>{n.d(t,{Z:()=>l});var r=n(32735),a=n(83914),i=n(28972),c=n(8246),o=n(35223);function l(e){return e.correctness!==i.w.AwaitingMarking?r.createElement(r.Fragment,null):r.createElement("div",{className:"d-flex justify-content-end gap-2 mt-2"},r.createElement("div",{className:"d-flex flex-column justify-content-end cursor-pointer\n ".concat(e.markedStatus===c.N.Correct?"text-success":"")},r.createElement(a.x,{svgName:e.markedStatus===c.N.Correct?o.vn.CheckCircle:o.vn.CheckCircleOutline,onClick:function(){return e.markInteraction(e.studentAttempt.answers,c.N.Correct)}})),r.createElement("div",{className:"d-flex flex-column justify-content-end cursor-pointer\n ".concat(e.markedStatus===c.N.Incorrect?" text-danger":"")},r.createElement(a.x,{svgName:e.markedStatus===c.N.Incorrect?o.vn.CrossCircleFilled:o.vn.CrossCircle,onClick:function(){return e.markInteraction(e.studentAttempt.answers,c.N.Incorrect)}})))}},35561:(e,t,n)=>{n.d(t,{O:()=>i});var r=n(32735),a=n(75896);function i(e){var t=a.m.first(e.answers);if(!t)return r.createElement(r.Fragment,null);var n="rounded p-2 mb-2 w-50";return e.reportsStyling||(n+=" text-white"),r.createElement("div",{className:n},r.createElement("img",{className:"img-fluid border rounded",src:t.text,alt:"Illustrated answer to the question: ".concat(e.interaction.name)}))}},69737:(e,t,n)=>{n.d(t,{R:()=>i});var r=n(32735),a=n(23481).T.encloseNamespace("interactives.responseTypes");function i(){return r.createElement("p",{className:"p-2"},r.createElement("em",null,a("noResponse")))}},28972:(e,t,n)=>{var r;n.d(t,{w:()=>r}),function(e){e[e.Correct=0]="Correct",e[e.Incorrect=1]="Incorrect",e[e.AwaitingMarking=2]="AwaitingMarking",e[e.Answered=3]="Answered",e[e.UnAnswered=4]="UnAnswered",e[e.NotApplicable=5]="NotApplicable"}(r||(r={}))},8246:(e,t,n)=>{var r;n.d(t,{N:()=>r}),function(e){e[e.Incorrect=0]="Incorrect",e[e.Correct=1]="Correct",e[e.PendingReview=2]="PendingReview"}(r||(r={}))},83140:(e,t,n)=>{n.d(t,{A:()=>g});var r=n(28972),a=n(8246),i=n(40424);function c(e){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},c(e)}function o(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=c(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,"string");if("object"!=c(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==c(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(){return r.w.NotApplicable}function s(e,t){var n=e.actionableItems.filter((function(e){return e.isCorrect}));return n.every((function(e){return!t(e.id)}))?r.w.UnAnswered:n.every((function(e){var n;return e.name.trim().toLowerCase()===(null===(n=t(e.id))||void 0===n?void 0:n.trim().toLowerCase())}))?r.w.Correct:r.w.Incorrect}function u(e,t){return e.actionableItems.every((function(e){return!t(e.id)}))?r.w.UnAnswered:e.actionableItems.filter((function(e){return e.isCorrect})).every((function(e){var n,r=t(e.id);return(null==r?void 0:r.toString())===(null===(n=e.id)||void 0===n?void 0:n.toString())||r===e.name}))?r.w.Correct:r.w.Incorrect}function m(e,t){return function(n){var r=t.attempts.find((function(t){return t.id===e.id}));return null==r?void 0:r.answers.find((function(e){return e.id===n}))}}function d(e,t){var n=m(e,t);return u(e,(function(e){var t=n(e);return null==t?void 0:t.text}))}function v(e,t){return function(e,t){var n;return e.actionableItems.forEach((function(e){var i=t(e.id);n=i?i.status!==a.N.Correct?i.status!==a.N.Incorrect?r.w.AwaitingMarking:r.w.Incorrect:r.w.Correct:r.w.UnAnswered})),n}(e,m(e,t))}var f=o(o(o(o(o(o(o({},i.Z9.Annotation,l),i.Z9.Image,l),i.Z9.MissingWord,(function(e,t){var n=m(e,t);return s(e,(function(e){var t=n(e);return null==t?void 0:t.text}))})),i.Z9.MultipleChoice,d),i.Z9.ShortAnswer,v),i.Z9.TrueOrFalse,d),i.Z9.Illustration,v),g={notApplicable:l,awaitingMarking:function(){return r.w.AwaitingMarking},isMissingWordCorrect:s,isMultipleChoiceCorrect:u,isInteractionCorrect:function(e,t){return(0,f[e.typeId])(e,t)}}},80845:(e,t,n)=>{n.d(t,{Q:()=>s,Wn:()=>c,f6:()=>l,j_:()=>o});var r=n(75896),a=n(40424);function i(e){return e.typeId!==a.Z9.Annotation&&e.typeId!==a.Z9.Image}function c(e){return r.m.flatten(e.timepoints.map((function(e){return e.interactions})))}function o(e){return r.m.last(e.results)}function l(e,t){return r.m.findWhere(null==t?void 0:t.attempts,{id:e})}function s(e){return c(e).filter(i)}}}]);
2
- //# sourceMappingURL=897-399a877281-lite.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/897-399a877281-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/interaction-answers/multiple-choice/multiple-choice-interaction-answers.scss","file:///app/packages/libs/shared/src/components/interaction-answers/multiple-choice/MultipleChoiceInteractionAnswers.tsx","file:///app/packages/libs/shared/src/components/interaction-answers/true-or-false/true-or-false-interaction-answers.scss","file:///app/packages/libs/shared/src/components/interaction-answers/true-or-false/TrueOrFalseInteractionAnswers.tsx","file:///app/packages/libs/shared/src/components/interaction-response/response-types/MissingWordResponse.tsx","file:///app/packages/libs/shared/src/components/interaction-response/response-types/response-types.scss","file:///app/packages/libs/shared/src/components/interaction-response/response-types/ResponseComponentLookup.tsx","file:///app/packages/libs/shared/src/components/interaction-response/response-types/MultipleChoiceResponse.tsx","file:///app/packages/libs/shared/src/components/interaction-response/response-types/TrueOrFalseResponse.tsx","file:///app/packages/libs/shared/src/components/interaction-response/response-types/ShortAnswerResponse.tsx","file:///app/packages/libs/shared/src/components/interaction-response/interaction-response.scss","file:///app/packages/libs/shared/src/components/interaction-response/InteractionResponse.tsx","file:///app/packages/libs/shared/src/components/interaction-response/InteractionResponseCorrectness.tsx","file:///app/packages/libs/shared/src/components/interaction-response/InteractionStudentDetailsHeader.tsx","file:///app/packages/libs/shared/src/components/interaction-response/MarkResponse.tsx","file:///app/packages/libs/shared/src/components/interaction-response/response-types/IllustrationResponse.tsx","file:///app/packages/libs/shared/src/components/interaction-response/response-types/NoResponse.tsx","file:///app/packages/libs/shared/src/enums/InteractionCorrectness.ts","file:///app/packages/libs/shared/src/enums/InteractiveAnswerStatus.ts","file:///app/packages/libs/shared/src/utils/InteractiveCorrectnessHelper.ts","file:///app/packages/libs/shared/src/utils/InteractiveHelper.ts"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"incorrect\":\"yodaE\",\"answer\":\"KpbWq\",\"avatarContainer\":\"uKRg2\",\"avatarContainerImage\":\"_LpCq\",\"image\":\"zWcu2\",\"previewContainer\":\"CSRwX\",\"imageContainer\":\"TeByp\"};","import React from 'react';\nimport { HtmlPortalNode, InPortal } from 'react-reverse-portal';\nimport SimpleBar from 'simplebar-react';\n\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { ActionableItem, Interaction } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './multiple-choice-interaction-answers.scss';\n\nconst alphabet = [ 'A', 'B', 'C', 'D' ];\n\ninterface MultipleChoiceInteractionAnswersProps {\n interaction: Interaction;\n showFeedback: boolean;\n getSelectedAnswer: (actionableItemId: string) => string;\n imageApi: string;\n userInitials: string;\n userAvatar: string;\n submitted?: boolean;\n size?: 'sm' | 'lg';\n \n /**\n * onSelectAnswer can be omitted when showing read-only results.\n */\n onSelectAnswer?: (answer: ActionableItem, checked: boolean) => void;\n\n onlyShowSelectedAnswer?: boolean;\n\n /**\n * Will hide the tick and cross from the answer tiles\n */\n hideFeedbackIcons?: boolean;\n unCheckedBackground?: string;\n\n leftHandSidePortalNode?: HtmlPortalNode;\n\n /**\n * Used when displaying the answer in reports\n */\n isDisplayOnly?: boolean;\n}\n\nMultipleChoiceInteractionAnswers.defaultProps = {\n size: 'lg',\n unCheckedBackground: 'bg-white'\n};\n\nexport function MultipleChoiceInteractionAnswers(props: MultipleChoiceInteractionAnswersProps): JSX.Element {\n const [ previewAnswer, setPreviewAnswer ] = React.useState<string>(null);\n\n const hasImages = !!props.interaction.actionableItems.find(a => !!a.data?.imageUrl);\n\n const scrollRef = React.useRef();\n\n const small = props.size === 'sm' || (hasImages && props.interaction.actionableItems.length > 2);\n\n return (\n <ul className={`${hasImages ? `row ${small && !props.isDisplayOnly ? 'px-lg-5 p-0' : ''}` : ''} list-unstyled`}>\n {props.interaction.actionableItems.map((a, index) => {\n const answer = props.getSelectedAnswer(a.id);\n const imageUrl = a.data?.imageUrl;\n const hasText = !!a.name;\n\n function onSelectAnswer(): void {\n if (props.submitted)\n return;\n\n if (props.onSelectAnswer)\n props.onSelectAnswer(a, !answer);\n\n setPreviewAnswer(answer ? null : a.id);\n }\n\n if (props.onlyShowSelectedAnswer && !answer)\n return <React.Fragment key={index}></React.Fragment>;\n \n let className = answer ?\n 'bg-blue text-white' :\n props.unCheckedBackground;\n\n let LeftPart = () => <>{alphabet[index]}</>;\n\n if (props.showFeedback) {\n className = a.isCorrect ?\n 'bg-success text-white' :\n `bg-danger text-white ${styles.incorrect}`;\n\n if (!props.hideFeedbackIcons) {\n LeftPart = () => {\n return (\n <>\n {a.isCorrect ?\n <SvgContainer size={SvgContainerSize.Small} svgName={cvSvgLibrary.Check} /> :\n <SvgContainer size={SvgContainerSize.Small} svgName={cvSvgLibrary.Close} />}\n </>\n );\n };\n }\n }\n\n /**\n * Allow keyboard controls, but not when we show feedback\n */\n const accessibility = props.showFeedback ? {} : {\n role: 'button',\n tabIndex: 0,\n onKeyDown: (e: React.KeyboardEvent) => e.key === 'Enter' && onSelectAnswer()\n };\n\n let hasImageClass = '';\n if (hasImages) {\n hasImageClass = 'col-6';\n }\n\n const showImagePreview = a.id.toString() === previewAnswer?.toString()\n && props.leftHandSidePortalNode\n && imageUrl\n && !props.submitted;\n\n return (\n <React.Fragment key={index}>\n {showImagePreview &&\n <InPortal node={props.leftHandSidePortalNode}>\n <SimpleBar className='h-100' ref={scrollRef}>\n <div className='p-3 d-flex flex-column h-100'>\n <div className='flex-grow-1'>\n <div className='cv-image-container text-center'>\n <img\n className='img-fluid rounded'\n src={imageUrl}\n alt={a.name || alphabet[index]}\n />\n </div>\n <div className={`${styles.answer} h6 text-center text-dark p-3`}>\n <span className={`d-inline-block ${hasText ? 'me-3' : ''} cv-multiple-choice-bullet`}><LeftPart /></span>\n {hasText && <span className='flex-grow-1 pe-4'>{a.name}</span>}\n </div>\n </div>\n <div className='text-end'>\n <DivButton\n className='btn btn-link'\n onClick={() => setPreviewAnswer(null)}\n >\n Close\n </DivButton>\n </div>\n </div>\n </SimpleBar>\n </InPortal>\n }\n <li className={`${hasImageClass} mb-3`}>\n <label\n className={`\n d-block\n rounded-3\n shadow-sm\n position-relative\n ${props.showFeedback ? '' : 'cursor-pointer'}\n ${styles.answer}\n ${className}\n ${hasImages ? 'mb-0 h-100' : ''}\n `}\n key={index}\n onClick={onSelectAnswer}\n {...accessibility}\n >\n {hasImages &&\n <span className={`d-block position-relative ${styles.imageContainer}`}>\n <span\n className={`\n ${styles.image}\n position-absolute\n start-0\n end-0\n top-0\n bottom-0\n rounded-top\n bg-gray-400\n `}\n style={{ backgroundImage: imageUrl ? `url(${imageUrl})` : undefined }}\n title={a.name || alphabet[index]}\n />\n </span>\n }\n <span className={`d-flex ${hasText || props.isDisplayOnly ? 'justify-content-between' : 'justify-content-center'} ${small ? 'p-2' : 'p-3'}`}>\n <span className={`d-inline-block ${hasText ? 'me-3' : ''} cv-multiple-choice-bullet`}><LeftPart /></span>\n {hasText && <span className='flex-grow-1 pe-4'>{a.name}</span>}\n {!props.onlyShowSelectedAnswer &&\n <span className={`${styles.avatarContainer} ${hasImages ? styles.avatarContainerImage : ''}`}>\n {answer &&\n <Avatar\n imageCdnUrl={props.imageApi}\n initials={props.userInitials}\n imageUrl={props.userAvatar}\n extraClasses={'border border-white'}\n />\n }\n </span>\n }\n </span>\n </label>\n </li>\n </React.Fragment>\n );\n })}\n </ul>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"feedback\":\"CBgCv\",\"avatarContainer\":\"CVTEm\",\"avatarContainerSmall\":\"tbPTs\",\"avatarSmall\":\"GUAUz\",\"incorrect\":\"ZCkyL\",\"large\":\"TKjXy\",\"small\":\"_2qC40\"};","import React from 'react';\n\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { ActionableItem, Interaction } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './true-or-false-interaction-answers.scss';\n\ninterface TrueOrFalseInteractionAnswersProps {\n className?: string;\n interaction: Interaction;\n showFeedback: boolean;\n getSelectedAnswer: (actionableItemId: string) => string;\n imageApi: string;\n userInitials: string;\n userAvatar: string;\n size?: 'sm' | 'lg'\n \n /**\n * onSelectAnswer can be omitted when showing read-only results.\n */\n onSelectAnswer?: (answer: ActionableItem) => void;\n\n /**\n * Will hide the tick and cross from the answer tiles\n */\n hideFeedbackIcons?: boolean;\n unCheckedBackground?: string;\n}\n\nTrueOrFalseInteractionAnswers.defaultProps = {\n size: 'lg',\n unCheckedBackground: 'bg-white'\n};\n\nexport function TrueOrFalseInteractionAnswers(props: TrueOrFalseInteractionAnswersProps): JSX.Element {\n function onSelectAnswer(answer: ActionableItem): void {\n if (props.onSelectAnswer)\n props.onSelectAnswer(answer);\n }\n \n return (\n <div\n className={`d-flex ${props.className ? props.className : ''} ${props.size === 'sm' ? 'mx-n1' : 'mx-n2'}`}>\n {props.interaction.actionableItems.map((a, index) => {\n const answer = props.getSelectedAnswer(a.id);\n\n let className = answer ?\n 'bg-blue text-white' :\n props.unCheckedBackground;\n\n let LeftPart = () => <></>;\n\n if (props.showFeedback) {\n className = a.isCorrect ?\n 'bg-success text-white' :\n `bg-danger text-white ${styles.incorrect}`;\n\n if (!props.hideFeedbackIcons) {\n LeftPart = () => {\n return (\n <>\n {a.isCorrect ?\n <SvgContainer size={SvgContainerSize.Small} svgName={cvSvgLibrary.Check} /> :\n <SvgContainer size={SvgContainerSize.Small} svgName={cvSvgLibrary.Close} />}\n </>\n );\n };\n }\n }\n\n /**\n * Allow keyboard controls, but not when we show feedback\n */\n const accessibility = props.showFeedback ? {} : {\n role: 'button',\n tabIndex: 0,\n onKeyDown: (e: React.KeyboardEvent) => e.key === 'Enter' && onSelectAnswer(a)\n };\n\n return (\n <label\n key={index}\n htmlFor={a.id}\n className={`\n rounded-3\n shadow-sm\n my-0\n position-relative\n overflow-hidden\n d-flex\n align-items-center\n justify-content-center\n ${props.size === 'sm' ? `${styles.small} mx-1 h5` : `${styles.large} mx-2 h4`}\n ${props.showFeedback ? '' : 'cursor-pointer'}\n ${className}`}\n {...accessibility}\n >\n <input\n id={a.id}\n type={'radio'}\n name='multiple-choice'\n checked={!!answer}\n onChange={() => onSelectAnswer(a)}\n disabled={props.showFeedback}\n hidden\n />\n {a.name}\n <span className={`position-absolute p-2 ${styles.feedback}`}><LeftPart /></span>\n <span className={`${styles.avatarContainer}${props.size === 'sm' ? ` ${styles.avatarContainerSmall}` : ''}`}>\n {answer &&\n <Avatar\n imageCdnUrl={props.imageApi}\n initials={props.userInitials}\n imageUrl={props.userAvatar}\n extraClasses={`border border-white ${props.size === 'sm' ? styles.avatarSmall : ''}`}\n />\n }\n </span>\n </label>\n );\n })}\n </div>\n );\n}","import React from 'react';\n\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\n\nimport { ResponseComponentProps } from './ResponseComponentLookup';\n\nconst PLACEHOLDER = 'cv-missing-word-';\n\nexport function MissingWordResponse(props: ResponseComponentProps): JSX.Element {\n const cleanedUp = (props.interaction.data.sentence as string).replace(/{([^{}]*)}/g, (match: string, val: string) => {\n return `{${PLACEHOLDER}${val}}`;\n });\n\n const items = cleanedUp.split(/{([^{}]*)}/g);\n\n let className = 'p-2';\n\n if (!props.reportsStyling)\n className += ' border rounded';\n\n return (\n <div className={className}>\n {items.map((item, idx) => {\n if (!item.startsWith(PLACEHOLDER))\n return item;\n\n const order = item.replace(PLACEHOLDER, '');\n\n const actionableItem = props.interaction.actionableItems.find(a => a.order.toString() === order);\n\n if (!actionableItem)\n return;\n\n // eslint-disable-next-line\n const answer = props.answers.find(a => a.id == actionableItem.id);\n \n if (!answer)\n return;\n\n if (!props.showFeedback)\n return <strong key={idx} className='text-info'>{answer.text}</strong>;\n\n const isCorrect = answer.status === InteractiveAnswerStatus.Correct;\n\n return (\n <React.Fragment key={idx}>\n {!isCorrect && <><del className='text-danger'><strong>{answer.text}</strong></del>&nbsp;</>}\n <strong className='text-success'>{actionableItem.name}</strong>\n </React.Fragment>\n );\n })}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"uncheckedBackground\":\"Y7ls8\"};","import React from 'react';\n\nimport { IllustrationResponse } from 'libs/shared/components/interaction-response/response-types/IllustrationResponse';\nimport { Interaction, InteractionTypeId, StudentAnswer, User } from 'libs/shared/interfaces';\n\nimport { MissingWordResponse } from './MissingWordResponse';\nimport { MultipleChoiceResponse } from './MultipleChoiceResponse';\nimport { ShortAnswerResponse } from './ShortAnswerResponse';\nimport { TrueOrFalseResponse } from './TrueOrFalseResponse';\n\nexport interface ResponseComponentProps {\n interaction: Interaction;\n answers: StudentAnswer[];\n imageCdnUrl: string;\n user: User;\n showFeedback?: boolean;\n showAvatar?: boolean;\n anonymisedUserName?: string;\n reportsStyling?: boolean;\n}\nconst NoResponseRequired = () => <></>;\n\nexport const ResponseComponentLookup: {\n [typeId: number]: (props: ResponseComponentProps) => JSX.Element\n} = {\n [InteractionTypeId.Annotation]: NoResponseRequired,\n [InteractionTypeId.Image]: NoResponseRequired,\n [InteractionTypeId.MissingWord]: MissingWordResponse,\n [InteractionTypeId.MultipleChoice]: MultipleChoiceResponse,\n [InteractionTypeId.TrueOrFalse]: TrueOrFalseResponse,\n [InteractionTypeId.ShortAnswer]: ShortAnswerResponse,\n [InteractionTypeId.Illustration]: IllustrationResponse\n};","import React from 'react';\n\nimport { MultipleChoiceInteractionAnswers } from 'libs/shared/components/interaction-answers/multiple-choice/MultipleChoiceInteractionAnswers';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport { ResponseComponentProps } from './ResponseComponentLookup';\n\nimport styles from './response-types.scss';\n\nexport function MultipleChoiceResponse(props: ResponseComponentProps): JSX.Element {\n function getAnswer(id: string): string {\n // eslint-disable-next-line\n const answer = props.answers.find(a => a.id == id);\n return answer?.id;\n }\n\n let className = 'my-2';\n\n if (props.reportsStyling)\n className += ' mx-2';\n\n return (\n <div className={className}>\n <MultipleChoiceInteractionAnswers\n interaction={props.interaction}\n showFeedback={props.showFeedback}\n getSelectedAnswer={getAnswer}\n imageApi={props.imageCdnUrl}\n userInitials={props.anonymisedUserName\n ? UserHelper.getInitialsFromFullName(props.anonymisedUserName)\n : UserHelper.getInitials(props.user?.name, props.user?.surname)\n }\n userAvatar={props.anonymisedUserName ? null : props.user?.avatar?.url}\n onlyShowSelectedAnswer={!props.showAvatar}\n size='sm'\n unCheckedBackground={props.showFeedback ? '' : `${styles.uncheckedBackground} text-white`}\n isDisplayOnly\n />\n </div>\n );\n}","import React from 'react';\n\nimport { TrueOrFalseInteractionAnswers } from 'libs/shared/components/interaction-answers/true-or-false/TrueOrFalseInteractionAnswers';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport { ResponseComponentProps } from './ResponseComponentLookup';\n\nimport styles from './response-types.scss';\n\nexport function TrueOrFalseResponse(props: ResponseComponentProps): JSX.Element {\n function getAnswer(id: string): string {\n // eslint-disable-next-line\n const answer = props.answers.find(a => a.id == id);\n return answer?.text;\n }\n\n let className = 'justify-content-start';\n\n if (props.reportsStyling)\n className = 'justify-content-center';\n \n return (\n <div className='my-2'>\n <TrueOrFalseInteractionAnswers\n className={className}\n interaction={props.interaction}\n showFeedback={props.showFeedback}\n hideFeedbackIcons={!props.showAvatar}\n getSelectedAnswer={getAnswer}\n imageApi={props.imageCdnUrl}\n userInitials={props.anonymisedUserName\n ? UserHelper.getInitialsFromFullName(props.anonymisedUserName)\n : UserHelper.getInitials(props.user?.name, props.user?.surname)\n }\n userAvatar={props.anonymisedUserName ? null : props.user?.avatar?.url}\n size='sm'\n unCheckedBackground={props.showFeedback ? '' : `${styles.uncheckedBackground} text-white`}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { ResponseComponentProps } from './ResponseComponentLookup';\n\nexport function ShortAnswerResponse(props: ResponseComponentProps): JSX.Element {\n // There should only be one answer.\n const answer = ArrayHelper.first(props.answers);\n\n if (!answer)\n return <></>;\n\n let className = 'rounded p-2 mb-2';\n\n if (!props.reportsStyling)\n className += ' bg-blue text-white';\n \n return (\n <div className={className}>\n {answer.text}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"avatarContainer\":\"FEdgT\"};","import React from 'react';\n\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, StudentAnswer, StudentResults } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { getStudentAttempt, getStudentResult } from 'libs/shared/utils/InteractiveHelper';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport { NoResponse } from './response-types/NoResponse';\nimport { ResponseComponentLookup } from './response-types/ResponseComponentLookup';\nimport { InteractionResponseCorrectness } from './InteractionResponseCorrectness';\nimport { InteractionStudentDetailsHeader } from './InteractionStudentDetailsHeader';\nimport { MarkResponse } from './MarkResponse';\n\nimport styles from './interaction-response.scss';\n\n\ninterface InteractionResponseProps {\n interaction: Interaction;\n studentResults: StudentResults;\n imageCdnUrl: string;\n markInteraction: (answers: StudentAnswer[], status: InteractiveAnswerStatus) => void;\n markedStatus?: InteractiveAnswerStatus;\n showStudentDetails?: boolean;\n className?: string;\n showFeedback?: boolean;\n showAvatar?: boolean;\n anonymisedUserName?: string;\n reportsStyling?: boolean;\n responseComponentClass?: string;\n}\n\nexport function InteractionResponse(props: InteractionResponseProps): JSX.Element {\n const ResponseComponent = ResponseComponentLookup[props.interaction.typeId];\n\n if (!ResponseComponent)\n return <></>;\n\n const result = getStudentResult(props.studentResults);\n\n const studentAttempt = getStudentAttempt(props.interaction.id, result);\n\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(props.interaction, result);\n\n return (\n <div className={`rounded ${props.className ?? ''}`}>\n <div className='d-flex'>\n {!!props.showStudentDetails &&\n <div className='me-2'>\n <div className={styles.avatarContainer}>\n <Avatar\n imageCdnUrl={props.imageCdnUrl}\n initials={props.anonymisedUserName\n ? UserHelper.getInitialsFromFullName(props.anonymisedUserName)\n : UserHelper.getInitials(props.studentResults.user?.name, props.studentResults.user?.surname)\n }\n imageUrl={props.anonymisedUserName ? null : props.studentResults.user?.avatar?.url}\n />\n </div>\n </div>\n }\n <div className='flex-grow-1'>\n {!!props.showStudentDetails &&\n <InteractionStudentDetailsHeader\n studentResults={props.studentResults}\n correctness={correctness}\n anonymisedUserName={props.anonymisedUserName}\n />\n }\n <div className='d-flex justify-content-between'>\n <div className={`flex-grow-1 ${props.responseComponentClass ? props.responseComponentClass : ''}`}>\n {studentAttempt\n ? <ResponseComponent\n interaction={props.interaction}\n answers={studentAttempt.answers}\n imageCdnUrl={props.imageCdnUrl}\n user={props.studentResults.user}\n showFeedback={props.showFeedback}\n showAvatar={props.showAvatar}\n reportsStyling={props.reportsStyling}\n />\n : <NoResponse />\n }\n </div>\n {!props.showStudentDetails &&\n <InteractionResponseCorrectness correctness={correctness} />\n }\n </div>\n </div>\n </div>\n <MarkResponse\n studentAttempt={studentAttempt}\n correctness={correctness}\n markInteraction={props.markInteraction}\n markedStatus={props.markedStatus}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\ninterface InteractionResponseCorrectnessProps {\n correctness: InteractionCorrectness;\n}\n\nexport function InteractionResponseCorrectness(props: InteractionResponseCorrectnessProps): JSX.Element {\n return (\n <>\n {props.correctness === InteractionCorrectness.Correct &&\n <div className='ms-2 text-success'>\n <SvgContainer svgName={cvSvgLibrary.Tick} />\n </div>\n }\n {props.correctness === InteractionCorrectness.Incorrect &&\n <div className='ms-2 text-danger'>\n <SvgContainer svgName={cvSvgLibrary.Close} />\n </div>\n }\n </>\n );\n}","import React from 'react';\n\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { StudentResults } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport { InteractionResponseCorrectness } from './InteractionResponseCorrectness';\n\ninterface InteractionStudentDetailsProps {\n studentResults: StudentResults;\n correctness: InteractionCorrectness;\n anonymisedUserName?: string;\n}\n\nexport function InteractionStudentDetailsHeader(props: InteractionStudentDetailsProps): JSX.Element {\n return (\n <div className='d-flex align-items-center justify-content-between mb-2'>\n <p className='fw-semibold mb-0'>\n {props.anonymisedUserName || UserHelper.getFullName(props.studentResults.user)}\n </p>\n <InteractionResponseCorrectness correctness={props.correctness} />\n </div>\n );\n}","import React from 'react';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { StudentAnswer, StudentAttempt } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\ninterface MarkResponseProps {\n studentAttempt: StudentAttempt;\n correctness: InteractionCorrectness;\n markInteraction: (answers: StudentAnswer[], status: InteractiveAnswerStatus) => void;\n markedStatus?: InteractiveAnswerStatus;\n}\n\nexport function MarkResponse(props: MarkResponseProps): JSX.Element {\n if (props.correctness !== InteractionCorrectness.AwaitingMarking)\n return <></>;\n\n return (\n <div className='d-flex justify-content-end gap-2 mt-2'>\n <div className={\n `d-flex flex-column justify-content-end cursor-pointer\n ${props.markedStatus === InteractiveAnswerStatus.Correct ? 'text-success' : ''}`\n }>\n <SvgContainer\n svgName={props.markedStatus === InteractiveAnswerStatus.Correct\n ? cvSvgLibrary.CheckCircle\n : cvSvgLibrary.CheckCircleOutline\n }\n onClick={\n () => props.markInteraction(props.studentAttempt.answers, InteractiveAnswerStatus.Correct)\n }\n />\n </div>\n <div className={\n `d-flex flex-column justify-content-end cursor-pointer\n ${props.markedStatus === InteractiveAnswerStatus.Incorrect ? ' text-danger' : ''}`\n }>\n <SvgContainer\n svgName={props.markedStatus === InteractiveAnswerStatus.Incorrect\n ? cvSvgLibrary.CrossCircleFilled\n : cvSvgLibrary.CrossCircle\n }\n onClick={\n () => props.markInteraction(props.studentAttempt.answers, InteractiveAnswerStatus.Incorrect)\n }\n />\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { ResponseComponentProps } from './ResponseComponentLookup';\n\nexport function IllustrationResponse(props: ResponseComponentProps): JSX.Element {\n // There should only be one answer.\n const answer = ArrayHelper.first(props.answers);\n\n if (!answer)\n return <></>;\n\n let className = 'rounded p-2 mb-2 w-50';\n\n if (!props.reportsStyling)\n className += ' text-white';\n \n return (\n <div className={className}>\n <img\n className='img-fluid border rounded'\n src={answer.text}\n alt={`Illustrated answer to the question: ${props.interaction.name}`}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst namespace = 'interactives.responseTypes';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function NoResponse(): JSX.Element {\n return (\n <p className='p-2'><em>{getPhrase('noResponse')}</em></p>\n );\n}","export enum InteractionCorrectness {\n Correct,\n Incorrect,\n AwaitingMarking,\n \n Answered,\n UnAnswered,\n NotApplicable\n}","export enum InteractiveAnswerStatus {\n Incorrect = 0,\n Correct = 1,\n PendingReview = 2\n}","import { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, InteractionTypeId, InteractiveResult, StudentAnswer } from 'libs/shared/interfaces';\n\ntype GetStudentAnswerByActionableItemId = (id: string) => string;\n\nfunction notApplicable(): InteractionCorrectness {\n return InteractionCorrectness.NotApplicable;\n}\n\nfunction awaitingMarking(): InteractionCorrectness {\n return InteractionCorrectness.AwaitingMarking;\n}\n\nfunction isMissingWordCorrect(\n interaction: Interaction,\n getStudentAnswer: GetStudentAnswerByActionableItemId\n): InteractionCorrectness {\n const items = interaction.actionableItems.filter(a => a\n .isCorrect);\n\n if (items.every(a => !getStudentAnswer(a.id)))\n return InteractionCorrectness.UnAnswered;\n\n const correct = items.every(a => a.name.trim().toLowerCase() === getStudentAnswer(a.id)?.trim().toLowerCase());\n return correct ? InteractionCorrectness.Correct : InteractionCorrectness.Incorrect;\n}\n\nfunction isMultipleChoiceCorrect(\n interaction: Interaction,\n getStudentAnswer: GetStudentAnswerByActionableItemId\n): InteractionCorrectness {\n if (interaction.actionableItems.every(a => !getStudentAnswer(a.id)))\n return InteractionCorrectness.UnAnswered;\n \n const correctItems = interaction.actionableItems.filter(a => a.isCorrect);\n\n const correct = correctItems.every(a => {\n const studentAnswer = getStudentAnswer(a.id);\n\n /**\n * In the past we've only ever checked the answer name. But since we introduced the ability to have image interactions\n * with no question text, we've need to swap to saving the id. But past submissions still have the name\n * - Sha\n */\n return studentAnswer?.toString() === a.id?.toString() || studentAnswer === a.name;\n });\n return correct ? InteractionCorrectness.Correct : InteractionCorrectness.Incorrect;\n}\n\nfunction isMarkableAnswerMarkedCorrect(\n interaction: Interaction,\n getStudentAnswer: (id: string) => StudentAnswer\n): InteractionCorrectness {\n let correctness: InteractionCorrectness;\n\n // There should only be one actionableItem\n interaction.actionableItems.forEach(item => {\n const studentAnswer = getStudentAnswer(item.id);\n\n if (!studentAnswer) {\n correctness = InteractionCorrectness.UnAnswered;\n return;\n }\n\n if (studentAnswer.status === InteractiveAnswerStatus.Correct) {\n correctness = InteractionCorrectness.Correct;\n return;\n }\n\n if (studentAnswer.status === InteractiveAnswerStatus.Incorrect) {\n correctness = InteractionCorrectness.Incorrect;\n return;\n }\n\n correctness = InteractionCorrectness.AwaitingMarking;\n });\n\n return correctness;\n}\n\ntype IsCorrectFunction = (interaction: Interaction, result: InteractiveResult) => InteractionCorrectness;\n\nfunction getGetStudentAnswer(interaction: Interaction, result: InteractiveResult): (id: string) => StudentAnswer {\n return (id: string) => {\n const attempt = result.attempts.find(a => a.id === interaction.id);\n return attempt?.answers.find(s => s.id === id);\n };\n}\n\nfunction wrapIsMissingWordCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n\n return isMissingWordCorrect(interaction, (id: string) => {\n const answer = getStudentAnswer(id);\n return answer?.text;\n });\n}\n\nfunction wrapIsMultipleChoiceCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n\n return isMultipleChoiceCorrect(interaction, (id: string) => {\n const answer = getStudentAnswer(id);\n return answer?.text;\n });\n}\n\nfunction wrapIsMarkableAnswerMarkedCorrect(\n interaction: Interaction,\n result: InteractiveResult\n): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n return isMarkableAnswerMarkedCorrect(interaction, getStudentAnswer);\n}\n\nconst IsCorrectLookup: {[typeId: number]: IsCorrectFunction} = {\n [InteractionTypeId.Annotation]: notApplicable,\n [InteractionTypeId.Image]: notApplicable,\n [InteractionTypeId.MissingWord]: wrapIsMissingWordCorrect,\n [InteractionTypeId.MultipleChoice]: wrapIsMultipleChoiceCorrect,\n [InteractionTypeId.ShortAnswer]: wrapIsMarkableAnswerMarkedCorrect,\n [InteractionTypeId.TrueOrFalse]: wrapIsMultipleChoiceCorrect,\n [InteractionTypeId.Illustration]: wrapIsMarkableAnswerMarkedCorrect\n};\n\nfunction isInteractionCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const isCorrectFn = IsCorrectLookup[interaction.typeId];\n\n return isCorrectFn(interaction, result);\n}\n\nexport const InteractiveCorrectnessHelper = {\n notApplicable,\n awaitingMarking,\n isMissingWordCorrect,\n isMultipleChoiceCorrect,\n isInteractionCorrect\n};\n","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport {\n Interaction,\n InteractionTypeId,\n Interactive,\n InteractiveResult,\n StudentAttempt,\n StudentResults\n} from 'libs/shared/interfaces';\n\nfunction interactionRequiresAnswer(interaction: Interaction): boolean {\n return interaction.typeId !== InteractionTypeId.Annotation && interaction.typeId !== InteractionTypeId.Image;\n}\n\nexport function flattenInteractions(interactive: Interactive): Interaction[] {\n return ArrayHelper.flatten(interactive.timepoints.map(i => i.interactions));\n}\n\n/**\n * Centralised logic for using the most recent student result.\n */\nexport function getStudentResult(studentResults: StudentResults): InteractiveResult {\n return ArrayHelper.last(studentResults.results);\n}\n\nexport function getStudentAttempt(interactionId: string, result: InteractiveResult): StudentAttempt {\n return ArrayHelper.findWhere(result?.attempts, { id: interactionId });\n}\n\n/**\n * Returns a flat list of interactions on an interactive and filters out\n * those that don't require an answer (annotations and images).\n */\nexport function getInteractions(interactive: Interactive): Interaction [] {\n return flattenInteractions(interactive).filter(interactionRequiresAnswer);\n}"],"names":["alphabet","MultipleChoiceInteractionAnswers","props","previewAnswer","setPreviewAnswer","hasImages","interaction","actionableItems","find","a","data","imageUrl","scrollRef","small","size","length","className","isDisplayOnly","map","index","answer","getSelectedAnswer","id","hasText","name","onSelectAnswer","submitted","onlyShowSelectedAnswer","key","unCheckedBackground","LeftPart","showFeedback","isCorrect","hideFeedbackIcons","SvgContainer","S","svgName","accessibility","role","tabIndex","onKeyDown","e","hasImageClass","showImagePreview","toString","leftHandSidePortalNode","node","ref","src","alt","DivButton","onClick","style","backgroundImage","undefined","title","Avatar","imageCdnUrl","imageApi","initials","userInitials","userAvatar","extraClasses","defaultProps","TrueOrFalseInteractionAnswers","htmlFor","type","checked","onChange","disabled","hidden","PLACEHOLDER","NoResponseRequired","ResponseComponentLookup","items","sentence","replace","match","val","split","reportsStyling","item","idx","startsWith","order","actionableItem","answers","text","status","InteractiveAnswerStatus","anonymisedUserName","UserHelper","user","surname","avatar","url","showAvatar","ArrayHelper","IllustrationResponse","InteractionResponse","ResponseComponent","typeId","result","studentResults","studentAttempt","correctness","InteractiveCorrectnessHelper","showStudentDetails","InteractionStudentDetailsHeader","responseComponentClass","NoResponse","InteractionResponseCorrectness","MarkResponse","markInteraction","markedStatus","getPhrase","InteractionCorrectness","notApplicable","isMissingWordCorrect","getStudentAnswer","filter","every","trim","toLowerCase","isMultipleChoiceCorrect","studentAnswer","getGetStudentAnswer","attempt","attempts","s","wrapIsMultipleChoiceCorrect","wrapIsMarkableAnswerMarkedCorrect","forEach","isMarkableAnswerMarkedCorrect","IsCorrectLookup","awaitingMarking","isInteractionCorrect","isCorrectFn","interactionRequiresAnswer","flattenInteractions","interactive","timepoints","i","interactions","getStudentResult","results","getStudentAttempt","interactionId","getInteractions"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[9201],{72915:(e,t,r)=>{r.d(t,{d:()=>C});var n=r(32735),a=r(35561),s=r(40424),i=r(83914),o=r(8246),c=r(35223);function u(e){var t=e.answer;return n.createElement("div",{key:t.id,className:"".concat(function(e){switch(e){case o.N.Correct:return"bg-light-green";case o.N.Incorrect:return"bg-light-red";case o.N.PendingReview:return"bg-light-blue"}}(t.status)," rounded p-2 mb-2")},n.createElement("div",{className:"d-flex align-items-center gap-2"},t.status===o.N.Correct&&n.createElement(i.x,{svgName:c.vn.Check,className:"svg-container flex-shrink-0 text-success"}),t.status===o.N.Incorrect&&n.createElement(i.x,{svgName:c.vn.Close,className:"svg-container flex-shrink-0 text-danger"}),n.createElement("span",{className:e.textClassName},t.text)),e.children)}var l=r(75896);function m(e){return m="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},m(e)}function d(e,t,r){return(t=function(e){var t=function(e,t){if("object"!=m(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,"string");if("object"!=m(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==m(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var v=function(){return n.createElement(n.Fragment,null)},f=d(d(d(d(d(d(d({},s.Z9.Annotation,v),s.Z9.Image,v),s.Z9.MissingWord,(function(e){return e.answers.length?n.createElement("ul",{className:"list-unstyled"},e.answers.map((function(e){return n.createElement(u,{key:e.id,answer:e,textClassName:"bg-white p-1 border border-gray-300 rounded"})}))):n.createElement(n.Fragment,null)})),s.Z9.MultipleChoice,(function(e){return e.answers.length?n.createElement("ul",{className:"list-unstyled"},e.answers.map((function(e){return n.createElement("li",{key:e.id},n.createElement(u,{answer:e}))}))):n.createElement(n.Fragment,null)})),s.Z9.TrueOrFalse,(function(e){var t=l.m.first(e.answers);return t?n.createElement(u,{answer:t}):n.createElement(n.Fragment,null)})),s.Z9.ShortAnswer,(function(e){var t=l.m.first(e.answers);return t?n.createElement(u,{answer:t},e.children):n.createElement(n.Fragment,null)})),s.Z9.Illustration,a.O),g=r(20789),y=r(44526),p=r(56151),w=r(3894),h=r(69737),b=r(83140),S=r(80845),E=r(64818);const k={avatarContainer:"O7oaA"};function C(e){var t,r,a,s,i,o=f[e.interaction.typeId];if(!o)return n.createElement(n.Fragment,null);var c=(0,S.j_)(e.studentResults),u=(0,S.f6)(e.interaction.id,c),l=b.A.isInteractionCorrect(e.interaction,c);return n.createElement("div",{className:"rounded ".concat(null!==(t=e.className)&&void 0!==t?t:"")},n.createElement("div",{className:"d-flex"},!!e.showStudentDetails&&n.createElement("div",{className:"me-2"},n.createElement("div",{className:k.avatarContainer},n.createElement(g.q,{imageCdnUrl:e.imageCdnUrl,initials:e.anonymisedUserName?E.l.getInitialsFromFullName(e.anonymisedUserName):E.l.getInitials(null===(r=e.studentResults.user)||void 0===r?void 0:r.name,null===(a=e.studentResults.user)||void 0===a?void 0:a.surname),imageUrl:e.anonymisedUserName?null:null===(i=null===(s=e.studentResults.user)||void 0===s?void 0:s.avatar)||void 0===i?void 0:i.url}))),n.createElement("div",{className:"flex-grow-1"},!!e.showStudentDetails&&n.createElement(p.U,{studentResults:e.studentResults,correctness:l,anonymisedUserName:e.anonymisedUserName}),n.createElement("div",{className:"d-flex justify-content-between"},n.createElement("div",{className:"flex-grow-1 mb-2 ".concat(e.responseComponentClass?e.responseComponentClass:"")},u?n.createElement(o,{interaction:e.interaction,answers:u.answers,imageCdnUrl:e.imageCdnUrl,user:e.studentResults.user,showFeedback:e.showFeedback,showAvatar:e.showAvatar},n.createElement(w.Z,{studentAttempt:u,correctness:l,markInteraction:e.markInteraction,markedStatus:e.markedStatus})):n.createElement(h.R,null)),!e.showStudentDetails&&n.createElement(y.Y,{correctness:l})))))}},71553:(e,t,r)=>{r.d(t,{I:()=>i});var n=r(99940),a=r(62875);function s(e,t){return{currentUserId:e.id,currentCustomerId:e.customerId,dateRange:{start:t.start,end:t.end},userIds:t.userId,classroomsAndGroups:t.groupId}}var i={interactiveResultSet:function(e,t,r,i,o,c,u){return{url:"/api/domain/v2/analytics/interactives/".concat(e,"/metadata/").concat(t),key:(0,a.H)("interactive:result:set:".concat(e,":").concat(t),i),data:s(r,i),type:n.k.POST,normalize:!1,success:o,error:c,always:u}},mark:function(e,t,r,a,s,i,o){return{url:"/api/domain/v1/analytics/answers/".concat(r),key:"mark:answer:".concat(r,":").concat(a.resultId),type:n.k.PUT,data:a,normalize:!1,invalidationKeys:"interactive:result:set:".concat(e,":").concat(t),success:s,error:i,always:o}},pendingReviews:function(e){return{url:"/api/domain/v1/analytics/interactives/pending-reviews/summary",key:"interactives:pending:reviews",type:n.k.POST,data:e}},interactiveResultsReport:function(e){return{url:"{gateway}/v2/analytics/interactives/report",key:"interactive:results:report",data:e,type:n.k.POST,normalize:!1}}}},41196:(e,t,r)=>{r.d(t,{W:()=>o});var n=r(20354),a=r(71553),s=r(20768),i=r(31949);function o(e,t){var r,o=n.a.useBasicFetch(i.N.currentUser()),c=n.a.useBasicFetch(!!e&&s.b.interactiveMetadata(e)),u=n.a.useBasicFetch(!!(null===(r=c.data)||void 0===r?void 0:r.interactiveId)&&s.b.interactive(c.data.interactiveId)),l=!!o.data&&!!u.data&&!!t;return n.a.useBasicFetch(l&&a.I.interactiveResultSet(c.data.interactiveId,c.data.id,o.data,t))}},9193:(e,t,r)=>{r.d(t,{D:()=>v});var n=r(32735),a=r(70680),s=r(23481),i=r(20354),o=r(71553),c=r(39157),u=r(69883);function l(e){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},l(e)}function m(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}var d=s.T.encloseNamespace("reportsShared.dataHooks"),v=function(e,t,r){var s,v,f=(s=(0,n.useState)({}),v=2,function(e){if(Array.isArray(e))return e}(s)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,s,i,o=[],c=!0,u=!1;try{if(s=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=s.call(r)).done)&&(o.push(n.value),o.length!==t);c=!0);}catch(e){u=!0,a=e}finally{try{if(!c&&null!=r.return&&(i=r.return(),Object(i)!==i))return}finally{if(u)throw a}}return o}}(s,v)||function(e,t){if(e){if("string"==typeof e)return m(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?m(e,t):void 0}}(s,v)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),g=f[0],y=f[1],p=(0,a.I0)(),w=(0,u.Z)();return{markedAnswers:g,addMarkedAnswers:function(e,t){e.forEach((function(e){y((function(r){return Object.assign(Object.assign({},r),function(e,t,r){return(t=function(e){var t=function(e,t){if("object"!=l(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,"string");if("object"!=l(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==l(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}({},(0,c.UU)(e),Object.assign(Object.assign({},e),{status:t})))}))}))},submitMarkedAnswers:function(){var n=Object.keys(g).map((function(e){return g[e]}));if(n.length){var a=0,s=0;n.forEach((function(r){var n=r.id,a=r.resultId,s=r.questionId,l=r.status;i.a.fetch(p,o.I.mark(e,t,n,{id:n,resultId:a,questionId:s,status:l},c,null,u))}))}function c(){s++}function u(){var e,t;++a===n.length&&(e="",t=!1,0===s&&(e=d("error",{smartCount:n.length}),t=!0),s<a&&(e=d("success",{smartCount:s})+" ".concat(d("partialError",{smartCount:a-s}))),s===a&&(e=d("success",{smartCount:s})),t?w.error(e):w.success(e),y({}),r&&r())}}}}},39157:(e,t,r)=>{r.d(t,{HI:()=>d,R6:()=>u,Rt:()=>f,UU:()=>m,Zs:()=>l,nq:()=>v});var n=r(75896),a=r(94892),s=r(28972),i=r(8246),o=r(83140),c=r(80845);function u(e,t){var r={markingRequired:[],lowScore:[],highScore:[],completed:[],notCompleted:[]},s=(0,c.Q)(e).length;t.students.forEach((function(t){var i=Object.assign(Object.assign({},t),{summary:f(e,t)});i.summary.awaitingMarking?r.markingRequired.push(i):n.m.last(t.results).attempts.length===s?(r.completed.push(i),i.summary.percentCorrect>=a.i.HIGH&&r.highScore.push(i),i.summary.percentCorrect<a.i.MODERATE&&r.lowScore.push(i)):r.notCompleted.push(i)}));var i=n.m.sortBy(r.lowScore,(function(e){return e.summary.percentCorrect})),o=n.m.sortBy(r.highScore,(function(e){return e.summary.percentCorrect})).reverse();return Object.assign(Object.assign({},r),{lowScore:i,highScore:o})}function l(e,t){return(0,c.Wn)(e).find((function(e){return e.id.toString()===t.toString()}))}function m(e){return"".concat(e.questionId,":").concat(e.resultId)}function d(e,t,r){var n=(0,c.j_)(t),a=(0,c.f6)(e,n);return(null==a?void 0:a.answers.every((function(e){var t;return(null===(t=r[m(e)])||void 0===t?void 0:t.status)===i.N.Correct})))?i.N.Correct:(null==a?void 0:a.answers.every((function(e){var t;return(null===(t=r[m(e)])||void 0===t?void 0:t.status)===i.N.Incorrect})))?i.N.Incorrect:void 0}function v(e,t){var r=t.students.length,n=0,a=0,i=0,u=0,l=0;return t.students.forEach((function(t){var r=(0,c.j_)(t);if(r){l+=t.results.length;var m=o.A.isInteractionCorrect(e,r);m===s.w.Correct&&n++,m===s.w.UnAnswered&&i++,m===s.w.AwaitingMarking&&u++,m!==s.w.UnAnswered&&a++}})),{percentCorrect:r>0?n/r:0,correct:n,answered:a,unanswered:i,awaitingMarking:u,attempts:l}}function f(e,t){var r=(0,c.j_)(t),n=(0,c.Q)(e),a=n.length,i=0,u=0;n.forEach((function(e){var t=o.A.isInteractionCorrect(e,r);t===s.w.Correct&&i++,t===s.w.AwaitingMarking&&u++}));var l=a>0?i/a:0,m=new Set(n.map((function(e){return e.id}))),d=r.attempts.filter((function(e){var t;return!!m.has(null===(t=null==e?void 0:e.answers[0])||void 0===t?void 0:t.questionId)})).length;return{answered:r.attempts.length,attempts:t.results.length,unanswered:a-d,percentCorrect:l,correct:i,awaitingMarking:u}}}}]);
2
- //# sourceMappingURL=9201-899c885914-lite.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/9201-899c885914-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/components/AnswerContainer.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/ResponseItemComponentLookup.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/components/MissingWordResponse.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/components/MultipleChoiceResponse.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/components/TrueOrFalseResponse.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/components/ShortAnswerResponse.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/interaction-response-item.scss","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/InteractionResponseItem.tsx","file:///app/packages/libs/shared/src/apps/analytics/flight-requests/InteractiveResultsRequests.ts","file:///app/packages/libs/shared/src/apps/analytics/hooks/UseFetchInteractiveResults.ts","file:///app/packages/libs/shared/src/apps/analytics/hooks/UseMarkAnswers.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/InteractiveUtils.ts"],"sourcesContent":["import React from 'react';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { StudentAnswer } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\ninterface AnswerContainerProps extends React.PropsWithChildren {\n answer: StudentAnswer;\n textClassName?: string;\n}\n\nexport function AnswerContainer(props: AnswerContainerProps) {\n const { answer } = props;\n\n function getBgColour(status: InteractiveAnswerStatus) {\n switch (status) {\n case InteractiveAnswerStatus.Correct: return 'bg-light-green';\n case InteractiveAnswerStatus.Incorrect: return 'bg-light-red';\n case InteractiveAnswerStatus.PendingReview: return 'bg-light-blue';\n }\n }\n\n return (\n <div key={answer.id} className={`${getBgColour(answer.status)} rounded p-2 mb-2`}>\n <div className='d-flex align-items-center gap-2'>\n {answer.status === InteractiveAnswerStatus.Correct && <SvgContainer svgName={cvSvgLibrary.Check} className='svg-container flex-shrink-0 text-success' />}\n {answer.status === InteractiveAnswerStatus.Incorrect && <SvgContainer svgName={cvSvgLibrary.Close} className='svg-container flex-shrink-0 text-danger' />}\n <span className={props.textClassName}>{answer.text}</span>\n </div>\n {props.children}\n </div>\n );\n}","import React from 'react';\n\nimport { IllustrationResponse } from 'libs/shared/components/interaction-response/response-types/IllustrationResponse';\nimport { Interaction, InteractionTypeId, StudentAnswer, User } from 'libs/shared/interfaces';\n\nimport { MissingWordResponse } from './components/MissingWordResponse';\nimport { MultipleChoiceResponse } from './components/MultipleChoiceResponse';\nimport { ShortAnswerResponse } from './components/ShortAnswerResponse';\nimport { TrueOrFalseResponse } from './components/TrueOrFalseResponse';\n\nexport interface ResponseItemComponentProps extends React.PropsWithChildren {\n interaction: Interaction;\n answers: StudentAnswer[];\n imageCdnUrl: string;\n user: User;\n showFeedback?: boolean;\n showAvatar?: boolean;\n anonymisedUserName?: string;\n}\nconst NoResponseRequired = () => <></>;\n\nexport const ResponseItemComponentLookup: {\n [typeId: number]: (props: ResponseItemComponentProps) => JSX.Element\n} = {\n [InteractionTypeId.Annotation]: NoResponseRequired,\n [InteractionTypeId.Image]: NoResponseRequired,\n [InteractionTypeId.MissingWord]: MissingWordResponse,\n [InteractionTypeId.MultipleChoice]: MultipleChoiceResponse,\n [InteractionTypeId.TrueOrFalse]: TrueOrFalseResponse,\n [InteractionTypeId.ShortAnswer]: ShortAnswerResponse,\n [InteractionTypeId.Illustration]: IllustrationResponse\n};","import React from 'react';\n\nimport { AnswerContainer } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/components/AnswerContainer';\nimport { ResponseItemComponentProps } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/ResponseItemComponentLookup';\n\n\nexport function MissingWordResponse(props: ResponseItemComponentProps) {\n if (!props.answers.length) return <></>;\n\n return (\n <ul className='list-unstyled'>\n {props.answers.map(answer => (\n <AnswerContainer\n key={answer.id}\n answer={answer}\n textClassName='bg-white p-1 border border-gray-300 rounded'\n />\n ))}\n </ul>\n );\n}","import React from 'react';\n\nimport { AnswerContainer } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/components/AnswerContainer';\nimport { ResponseItemComponentProps } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/ResponseItemComponentLookup';\n\nexport function MultipleChoiceResponse(props: ResponseItemComponentProps) {\n if (!props.answers.length) return <></>;\n\n return (\n <ul className='list-unstyled'>\n {props.answers.map(answer => (\n <li key={answer.id}>\n <AnswerContainer answer={answer} />\n </li>\n ))}\n </ul>\n );\n}","import React from 'react';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { AnswerContainer } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/components/AnswerContainer';\nimport { ResponseItemComponentProps } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/ResponseItemComponentLookup';\n\nexport function TrueOrFalseResponse(props: ResponseItemComponentProps) {\n const answer = ArrayHelper.first(props.answers);\n\n if (!answer)\n return <></>;\n\n return (\n <AnswerContainer answer={answer} />\n );\n}","import React from 'react';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { AnswerContainer } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/components/AnswerContainer';\nimport { ResponseItemComponentProps } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/ResponseItemComponentLookup';\n\nexport function ShortAnswerResponse(props: ResponseItemComponentProps): JSX.Element {\n const answer = ArrayHelper.first(props.answers);\n\n if (!answer)\n return <></>;\n\n return (\n <AnswerContainer answer={answer}>\n {props.children}\n </AnswerContainer>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"avatarContainer\":\"O7oaA\"};","import React from 'react';\n\nimport { ResponseItemComponentLookup } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/ResponseItemComponentLookup';\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { InteractionResponseCorrectness } from 'libs/shared/components/interaction-response/InteractionResponseCorrectness';\nimport { InteractionStudentDetailsHeader } from 'libs/shared/components/interaction-response/InteractionStudentDetailsHeader';\nimport { MarkResponse } from 'libs/shared/components/interaction-response/MarkResponse';\nimport { NoResponse } from 'libs/shared/components/interaction-response/response-types/NoResponse';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, StudentAnswer, StudentResults } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { getStudentAttempt, getStudentResult } from 'libs/shared/utils/InteractiveHelper';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from './interaction-response-item.scss';\n\ninterface InteractionResponseProps {\n interaction: Interaction;\n studentResults: StudentResults;\n imageCdnUrl: string;\n markInteraction: (answers: StudentAnswer[], status: InteractiveAnswerStatus) => void;\n markedStatus?: InteractiveAnswerStatus;\n showStudentDetails?: boolean;\n className?: string;\n showFeedback?: boolean;\n showAvatar?: boolean;\n anonymisedUserName?: string;\n responseComponentClass?: string;\n}\n\nexport function InteractionResponseItem(props: InteractionResponseProps): JSX.Element {\n const ResponseItemComponent = ResponseItemComponentLookup[props.interaction.typeId];\n\n if (!ResponseItemComponent)\n return <></>;\n\n const result = getStudentResult(props.studentResults);\n\n const studentAttempt = getStudentAttempt(props.interaction.id, result);\n\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(props.interaction, result);\n\n return (\n <div className={`rounded ${props.className ?? ''}`}>\n <div className='d-flex'>\n {!!props.showStudentDetails &&\n <div className='me-2'>\n <div className={styles.avatarContainer}>\n <Avatar\n imageCdnUrl={props.imageCdnUrl}\n initials={props.anonymisedUserName\n ? UserHelper.getInitialsFromFullName(props.anonymisedUserName)\n : UserHelper.getInitials(props.studentResults.user?.name, props.studentResults.user?.surname)\n }\n imageUrl={props.anonymisedUserName ? null : props.studentResults.user?.avatar?.url}\n />\n </div>\n </div>\n }\n <div className='flex-grow-1'>\n {!!props.showStudentDetails &&\n <InteractionStudentDetailsHeader\n studentResults={props.studentResults}\n correctness={correctness}\n anonymisedUserName={props.anonymisedUserName}\n />\n }\n <div className='d-flex justify-content-between'>\n <div className={`flex-grow-1 mb-2 ${props.responseComponentClass ? props.responseComponentClass : ''}`}>\n {studentAttempt\n ? <ResponseItemComponent\n interaction={props.interaction}\n answers={studentAttempt.answers}\n imageCdnUrl={props.imageCdnUrl}\n user={props.studentResults.user}\n showFeedback={props.showFeedback}\n showAvatar={props.showAvatar}\n >\n <MarkResponse\n studentAttempt={studentAttempt}\n correctness={correctness}\n markInteraction={props.markInteraction}\n markedStatus={props.markedStatus}\n />\n </ResponseItemComponent>\n : <NoResponse />\n }\n </div>\n {!props.showStudentDetails &&\n <InteractionResponseCorrectness correctness={correctness} />\n }\n </div>\n </div>\n </div>\n </div>\n );\n}","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Flight } from 'libs/common/react/index';\n\nimport { MarkInteractiveAnswer } from 'libs/shared/apps/analytics/interfaces/MarkInteractiveAnswer';\nimport { InteractiveResultsReport } from 'libs/shared/apps/analytics/interfaces/requests/InteractiveResultsReport';\nimport { InteractivesPendingReviewsRequest } from 'libs/shared/apps/analytics/interfaces/requests/InteractivesPendingReviewsRequest';\nimport { AnalyticsRequestFilter, CurrentUser, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { getAnalyticsRequestKey } from 'libs/shared/utils/AnalyticsRequestUtils';\n\ninterface InteractiveResultFilters {\n currentUserId: string;\n currentCustomerId: string;\n dateRange?: { start: string, end: string }\n userIds?: string | string[];\n classroomsAndGroups?: string | string[];\n}\n\nfunction getInteractiveResultFilters(\n currentUser: CurrentUser,\n filter: AnalyticsRequestFilter\n): InteractiveResultFilters {\n return {\n currentUserId: currentUser.id,\n currentCustomerId: currentUser.customerId,\n dateRange: { start: filter.start, end: filter.end },\n userIds: filter.userId,\n classroomsAndGroups: filter.groupId\n };\n}\n\nexport const InteractiveResultsRequests = {\n /** \n * This endpoint returns data with a lot of duplicated ids,\n * e.g. student answers to the same question will have the same id.\n * Because of that, we don't normalize.\n */\n interactiveResultSet(\n interactiveId: string,\n interactiveMetadataId: string,\n currentUser: CurrentUser,\n filter: AnalyticsRequestFilter,\n success?: (data: InteractiveResultSet) => void,\n error?: (data: any) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `/api/domain/v2/analytics/interactives/${interactiveId}/metadata/${interactiveMetadataId}`,\n key: getAnalyticsRequestKey(`interactive:result:set:${interactiveId}:${interactiveMetadataId}`, filter),\n data: getInteractiveResultFilters(currentUser, filter),\n type: HttpVerbs.POST,\n normalize: false,\n success,\n error,\n always\n };\n },\n \n /**\n * As the response from `interactiveResultSet` isn't normalised, we need to invalidate the cache\n * to update the results data.\n */\n mark(\n interactiveId: string,\n interactiveMetadataId: string,\n answerId: string,\n data: MarkInteractiveAnswer,\n success?: () => void,\n error?: (data: any) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `/api/domain/v1/analytics/answers/${answerId}`,\n key: `mark:answer:${answerId}:${data.resultId}`,\n type: HttpVerbs.PUT,\n data,\n normalize: false,\n invalidationKeys: `interactive:result:set:${interactiveId}:${interactiveMetadataId}`,\n success,\n error,\n always\n };\n },\n\n pendingReviews(data: InteractivesPendingReviewsRequest): Flight.Request {\n return {\n url: `/api/domain/v1/analytics/interactives/pending-reviews/summary`,\n key: `interactives:pending:reviews`,\n type: HttpVerbs.POST,\n data\n };\n },\n\n interactiveResultsReport(data: InteractiveResultsReport): Flight.Request {\n return {\n url: '{gateway}/v2/analytics/interactives/report',\n key: 'interactive:results:report',\n data,\n type: HttpVerbs.POST,\n normalize: false\n };\n }\n};","import { Flight } from 'libs/common/flight';\n\nimport { InteractiveResultsRequests } from 'libs/shared/apps/analytics/flight-requests/InteractiveResultsRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { AnalyticsRequestFilter, CurrentUser, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\n\nexport function useFetchInteractiveResults(\n interactiveMetadataId: string,\n requestFilter: AnalyticsRequestFilter\n): Flight.Response<InteractiveResultSet> {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(!!interactiveMetadataId &&\n InteractiveRequests.interactiveMetadata(interactiveMetadataId));\n\n const interactive = Flight.useBasicFetch<Interactive>(!!interactiveMetadata.data?.interactiveId &&\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId));\n\n const shouldFetchResults = !!currentUser.data && !!interactive.data && (!!requestFilter);\n\n return Flight.useBasicFetch<InteractiveResultSet>(shouldFetchResults &&\n InteractiveResultsRequests.interactiveResultSet(\n interactiveMetadata.data.interactiveId,\n interactiveMetadata.data.id,\n currentUser.data,\n requestFilter\n ));\n}","import { useState } from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { InteractiveResultsRequests } from 'libs/shared/apps/analytics/flight-requests/InteractiveResultsRequests';\nimport { getMarkedAnswerId } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { StudentAnswer } from 'libs/shared/interfaces';\n\nconst getPhrase = LanguageService.encloseNamespace('reportsShared.dataHooks');\n\nexport type MarkedAnswerHash = { [id: string]: StudentAnswer };\n\n/**\n * This hook manages the storing of a marked answer hash in state and then the submitting\n * of those answers via an api call.\n */\nexport const useMarkAnswers = (interactiveId: string, interactiveMetadataId: string, onDone?: () => void) => {\n const [ markedAnswers, setMarkedAnswers ] = useState<MarkedAnswerHash>({});\n\n const dispatch = useDispatch();\n const alerts = useAlerts();\n\n function addMarkedAnswers(answers: StudentAnswer[], status: InteractiveAnswerStatus): void {\n answers.forEach(a => {\n setMarkedAnswers(m => ({ ...m, [getMarkedAnswerId(a)]: { ...a, status } }));\n });\n }\n\n function submitMarkedAnswers(): void {\n const answers = Object.keys(markedAnswers).map(key => markedAnswers[key]);\n\n if (!answers.length)\n return;\n\n let completeCount = 0;\n let successCount = 0;\n\n function onSuccess(): void {\n successCount++;\n }\n\n function onAlways(): void {\n completeCount++;\n\n if (completeCount === answers.length)\n onComplete();\n }\n\n function onComplete(): void {\n let alertMessage = '';\n let useErrorAlert = false;\n\n if (successCount === 0) {\n alertMessage = getPhrase('error', { smartCount: answers.length });\n useErrorAlert = true;\n }\n\n if (successCount < completeCount) {\n alertMessage = getPhrase('success', { smartCount: successCount })\n + ` ${getPhrase('partialError', { smartCount: completeCount - successCount })}`;\n }\n\n if (successCount === completeCount) {\n alertMessage = getPhrase('success', { smartCount: successCount });\n }\n\n useErrorAlert\n ? alerts.error(alertMessage)\n : alerts.success(alertMessage);\n\n setMarkedAnswers({});\n\n onDone && onDone();\n }\n\n answers.forEach(({ id, resultId, questionId, status }) => {\n Flight.fetch(dispatch, InteractiveResultsRequests.mark(\n interactiveId,\n interactiveMetadataId,\n id,\n { id, resultId, questionId, status },\n onSuccess,\n null,\n onAlways\n ));\n });\n }\n\n return {\n markedAnswers,\n addMarkedAnswers,\n submitMarkedAnswers\n };\n};","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { ResultsSummary } from 'libs/shared/apps/analytics/interfaces/ResultsSummary';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { ScoreThresholdDefaults } from 'libs/shared/constants/ScoreThresholds';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, StudentAnswer, StudentResults } from 'libs/shared/interfaces';\nimport { Interactive, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { flattenInteractions, getInteractions, getStudentAttempt, getStudentResult } from 'libs/shared/utils/InteractiveHelper';\n\ninterface StudentGroups {\n markingRequired: StudentResultsWithSummary[];\n lowScore: StudentResultsWithSummary[];\n highScore: StudentResultsWithSummary[];\n completed: StudentResultsWithSummary[];\n notCompleted: StudentResultsWithSummary[];\n}\n\nexport function groupStudents(interactive: Interactive, results: InteractiveResultSet): StudentGroups {\n const groups: StudentGroups = {\n markingRequired: [],\n lowScore: [],\n highScore: [],\n completed: [],\n notCompleted: []\n };\n\n const interactions = getInteractions(interactive);\n\n const numInteractions = interactions.length;\n \n results.students.forEach(s => {\n const withSummary = {\n ...s,\n summary: getStudentResultsSummary(interactive, s)\n };\n \n if (withSummary.summary.awaitingMarking) {\n groups.markingRequired.push(withSummary);\n return;\n }\n\n if (ArrayHelper.last(s.results).attempts.length === numInteractions) {\n groups.completed.push(withSummary);\n } else {\n groups.notCompleted.push(withSummary);\n return;\n }\n \n if (withSummary.summary.percentCorrect >= ScoreThresholdDefaults.HIGH)\n groups.highScore.push(withSummary);\n \n if (withSummary.summary.percentCorrect < ScoreThresholdDefaults.MODERATE)\n groups.lowScore.push(withSummary);\n });\n \n const sortedLowScore = ArrayHelper.sortBy(groups.lowScore, s => s.summary.percentCorrect);\n const sortedHighScore = ArrayHelper.sortBy(groups.highScore, s => s.summary.percentCorrect).reverse();\n \n return {\n ...groups,\n lowScore: sortedLowScore,\n highScore: sortedHighScore\n };\n}\n\nexport function getInteractionById(interactive: Interactive, interactionId: string): Interaction {\n const flattenedInteractions = flattenInteractions(interactive);\n return flattenedInteractions.find(i => i.id.toString() === interactionId.toString());\n}\n\n/**\n * We need to use the question and result ids as a list of one student's responses\n * to multiple questions will all have the same result id and a list of multiple\n * students responses to one question will all have the same questionId.\n */\nexport function getMarkedAnswerId(answer: StudentAnswer): string {\n return `${answer.questionId}:${answer.resultId}`;\n}\n\nexport function getMarkedStatus(\n interactionId: string,\n studentResults: StudentResults,\n markedAnswers: MarkedAnswerHash\n): InteractiveAnswerStatus {\n const result = getStudentResult(studentResults);\n const studentResponse = getStudentAttempt(interactionId, result);\n\n const isMarkedCorrect = studentResponse?.answers.every(a => {\n return markedAnswers[getMarkedAnswerId(a)]?.status === InteractiveAnswerStatus.Correct;\n });\n\n if (isMarkedCorrect)\n return InteractiveAnswerStatus.Correct;\n\n const isMarkedIncorrect = studentResponse?.answers.every(a => {\n return markedAnswers[getMarkedAnswerId(a)]?.status === InteractiveAnswerStatus.Incorrect;\n });\n\n if (isMarkedIncorrect)\n return InteractiveAnswerStatus.Incorrect;\n}\n\nexport function getInteractionResultsSummary(\n interaction: Interaction,\n results: InteractiveResultSet\n): ResultsSummary {\n const numStudents = results.students.length;\n let numCorrect = 0;\n let answered = 0;\n let unanswered = 0;\n let awaitingMarking = 0;\n let attempts = 0;\n\n results.students.forEach(s => {\n const result = getStudentResult(s);\n\n if (!result)\n return;\n\n attempts = attempts + s.results.length;\n\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(interaction, result);\n\n if (correctness === InteractionCorrectness.Correct)\n numCorrect++;\n\n if (correctness === InteractionCorrectness.UnAnswered)\n unanswered++;\n\n if (correctness === InteractionCorrectness.AwaitingMarking)\n awaitingMarking++;\n\n if (correctness !== InteractionCorrectness.UnAnswered)\n answered++;\n });\n\n\n const percentCorrect = numStudents > 0\n ? numCorrect / numStudents\n : 0;\n\n return {\n percentCorrect,\n correct: numCorrect,\n answered,\n unanswered,\n awaitingMarking,\n attempts\n };\n}\n\nexport function getStudentResultsSummary(interactive: Interactive, studentResults: StudentResults): ResultsSummary {\n const result = getStudentResult(studentResults);\n\n const interactions = getInteractions(interactive);\n\n const numInteractions = interactions.length;\n\n let numCorrect = 0;\n let awaitingMarking = 0;\n\n interactions.forEach(i => {\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(i, result);\n\n if (correctness === InteractionCorrectness.Correct)\n numCorrect++;\n\n if (correctness === InteractionCorrectness.AwaitingMarking)\n awaitingMarking++;\n });\n\n const percentCorrect = numInteractions > 0 ? numCorrect / numInteractions : 0;\n\n /**\n * Our interactions list has images and annotations filtered out.\n * We built a map of valid questions, so that we can calculate the unswered accurately.\n * We're doing this because of a bug that caused annotations and images to record answers in the player.\n * - Sha\n */\n const interactionIds = new Set(interactions.map(i => i.id));\n const answeredInteractions = result.attempts.filter(a => !!interactionIds.has(a?.answers[0]?.questionId)).length;\n\n return {\n answered: result.attempts.length,\n attempts: studentResults.results.length,\n unanswered: numInteractions - answeredInteractions,\n percentCorrect,\n correct: numCorrect,\n awaitingMarking\n };\n}"],"names":["AnswerContainer","props","answer","key","id","className","status","InteractiveAnswerStatus","getBgColour","SvgContainer","svgName","textClassName","text","children","NoResponseRequired","ResponseItemComponentLookup","answers","length","map","ArrayHelper","IllustrationResponse","InteractionResponseItem","ResponseItemComponent","interaction","typeId","result","studentResults","studentAttempt","correctness","InteractiveCorrectnessHelper","showStudentDetails","Avatar","imageCdnUrl","initials","anonymisedUserName","UserHelper","user","name","surname","imageUrl","avatar","url","InteractionStudentDetailsHeader","responseComponentClass","showFeedback","showAvatar","MarkResponse","markInteraction","markedStatus","NoResponse","InteractionResponseCorrectness","getInteractiveResultFilters","currentUser","filter","currentUserId","currentCustomerId","customerId","dateRange","start","end","userIds","userId","classroomsAndGroups","groupId","InteractiveResultsRequests","interactiveResultSet","interactiveId","interactiveMetadataId","success","error","always","data","type","normalize","mark","answerId","resultId","invalidationKeys","pendingReviews","interactiveResultsReport","useFetchInteractiveResults","requestFilter","interactiveMetadata","interactive","shouldFetchResults","I","getPhrase","useMarkAnswers","onDone","useState","markedAnswers","setMarkedAnswers","dispatch","alerts","addMarkedAnswers","forEach","a","m","submitMarkedAnswers","Object","keys","completeCount","successCount","questionId","onSuccess","onAlways","alertMessage","useErrorAlert","smartCount","groupStudents","results","groups","markingRequired","lowScore","highScore","completed","notCompleted","numInteractions","students","s","withSummary","summary","getStudentResultsSummary","awaitingMarking","push","attempts","percentCorrect","sortedLowScore","sortedHighScore","reverse","getInteractionById","interactionId","find","i","toString","getMarkedAnswerId","getMarkedStatus","studentResponse","every","getInteractionResultsSummary","numStudents","numCorrect","answered","unanswered","correct","interactions","interactionIds","Set","answeredInteractions","has"],"sourceRoot":""}