@clickview/lite 0.70.1-dev.5 → 0.70.1-dev.6

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 (136) hide show
  1. package/dist/bundles.json +1 -1
  2. package/dist/css/{9583-lite-9eda71423d.chunk.css → 3878-lite-877e596a24.chunk.css} +3 -0
  3. package/dist/css/{5797-lite-1dfd2c337d.chunk.css → 5099-lite-7d7c063e62.chunk.css} +3 -0
  4. package/dist/css/{8191-lite-ee877f2ecd.chunk.css → 6984-lite-53c3fa4d18.chunk.css} +3 -0
  5. package/dist/css/{8723-lite-676baa8218.chunk.css → 7103-lite-ee0c975440.chunk.css} +3 -0
  6. package/dist/css/{7783-lite-1dfd2c337d.chunk.css → 7394-lite-7d7c063e62.chunk.css} +3 -0
  7. package/dist/css/7502-lite-9b2ed5bd56.chunk.css +4 -0
  8. package/dist/css/{5721-lite-9eda71423d.chunk.css → 7548-lite-877e596a24.chunk.css} +3 -0
  9. package/dist/css/{549-lite-b49bde8e4d.chunk.css → 7657-lite-ad909396f3.chunk.css} +3 -1
  10. package/dist/css/{6783-lite-e85973335b.chunk.css → 829-lite-27b58d07b3.chunk.css} +3 -0
  11. package/dist/css/{5635-lite-ee877f2ecd.chunk.css → 9673-lite-53c3fa4d18.chunk.css} +3 -0
  12. package/dist/scripts/1107-0fb4769540-lite.chunk.js +2 -0
  13. package/dist/scripts/1107-0fb4769540-lite.chunk.js.map +1 -0
  14. package/dist/scripts/1437-658ad1fe2b-lite.chunk.js +2 -0
  15. package/dist/scripts/1437-658ad1fe2b-lite.chunk.js.map +1 -0
  16. package/dist/scripts/1710-ef798f1e0d-lite.chunk.js +2 -0
  17. package/dist/scripts/1710-ef798f1e0d-lite.chunk.js.map +1 -0
  18. package/dist/scripts/2024-4fec8f175b-lite.chunk.js +2 -0
  19. package/dist/scripts/2024-4fec8f175b-lite.chunk.js.map +1 -0
  20. package/dist/scripts/2435-a846651e83-lite.chunk.js +2 -0
  21. package/dist/scripts/2435-a846651e83-lite.chunk.js.map +1 -0
  22. package/dist/scripts/2809-84ce060e14-lite.chunk.js +2 -0
  23. package/dist/scripts/2809-84ce060e14-lite.chunk.js.map +1 -0
  24. package/dist/scripts/3878-45fd0861cc-lite.chunk.js +2 -0
  25. package/dist/scripts/3878-45fd0861cc-lite.chunk.js.map +1 -0
  26. package/dist/scripts/4096-c834372efb-lite.chunk.js +2 -0
  27. package/dist/scripts/4096-c834372efb-lite.chunk.js.map +1 -0
  28. package/dist/scripts/4456-ada4977b41-lite.chunk.js +2 -0
  29. package/dist/scripts/4456-ada4977b41-lite.chunk.js.map +1 -0
  30. package/dist/scripts/4806-a05a2a3012-lite.chunk.js +2 -0
  31. package/dist/scripts/4806-a05a2a3012-lite.chunk.js.map +1 -0
  32. package/dist/scripts/5099-297f8cd028-lite.chunk.js +2 -0
  33. package/dist/scripts/5099-297f8cd028-lite.chunk.js.map +1 -0
  34. package/dist/scripts/5829-903613bbf0-lite.chunk.js +3 -0
  35. package/dist/scripts/5829-903613bbf0-lite.chunk.js.map +1 -0
  36. package/dist/scripts/5925-937fec8a93-lite.chunk.js +2 -0
  37. package/dist/scripts/5925-937fec8a93-lite.chunk.js.map +1 -0
  38. package/dist/scripts/6459-ac139cb154-lite.chunk.js +2 -0
  39. package/dist/scripts/6459-ac139cb154-lite.chunk.js.map +1 -0
  40. package/dist/scripts/6629-4edaed39c8-lite.chunk.js +3 -0
  41. package/dist/scripts/6629-4edaed39c8-lite.chunk.js.map +1 -0
  42. package/dist/scripts/6984-9d8b378bcc-lite.chunk.js +2 -0
  43. package/dist/scripts/6984-9d8b378bcc-lite.chunk.js.map +1 -0
  44. package/dist/scripts/7103-ef79582538-lite.chunk.js +2 -0
  45. package/dist/scripts/7103-ef79582538-lite.chunk.js.map +1 -0
  46. package/dist/scripts/7394-5448807e14-lite.chunk.js +2 -0
  47. package/dist/scripts/7394-5448807e14-lite.chunk.js.map +1 -0
  48. package/dist/scripts/7502-78b085caad-lite.chunk.js +2 -0
  49. package/dist/scripts/7502-78b085caad-lite.chunk.js.map +1 -0
  50. package/dist/scripts/7548-5eb0d3b7a0-lite.chunk.js +2 -0
  51. package/dist/scripts/7548-5eb0d3b7a0-lite.chunk.js.map +1 -0
  52. package/dist/scripts/7593-cc4e09c847-lite.chunk.js +2 -0
  53. package/dist/scripts/7593-cc4e09c847-lite.chunk.js.map +1 -0
  54. package/dist/scripts/7657-e302fda4f2-lite.chunk.js +2 -0
  55. package/dist/scripts/7657-e302fda4f2-lite.chunk.js.map +1 -0
  56. package/dist/scripts/8057-431c6be34c-lite.chunk.js +2 -0
  57. package/dist/scripts/8057-431c6be34c-lite.chunk.js.map +1 -0
  58. package/dist/scripts/8224-b9b5d3b1a5-lite.chunk.js +2 -0
  59. package/dist/scripts/8224-b9b5d3b1a5-lite.chunk.js.map +1 -0
  60. package/dist/scripts/829-aff9937989-lite.chunk.js +3 -0
  61. package/dist/scripts/829-aff9937989-lite.chunk.js.map +1 -0
  62. package/dist/scripts/{9250-ec244ab17a-lite.chunk.js → 8723-708f2373d6-lite.chunk.js} +3 -3
  63. package/dist/scripts/{9250-ec244ab17a-lite.chunk.js.map → 8723-708f2373d6-lite.chunk.js.map} +1 -1
  64. package/dist/scripts/8960-c159492ba3-lite.chunk.js +2 -0
  65. package/dist/scripts/8960-c159492ba3-lite.chunk.js.map +1 -0
  66. package/dist/scripts/9673-8a2740611a-lite.chunk.js +2 -0
  67. package/dist/scripts/9673-8a2740611a-lite.chunk.js.map +1 -0
  68. package/dist/scripts/9882-f1a9cc55ec-lite.chunk.js +2 -0
  69. package/dist/scripts/9882-f1a9cc55ec-lite.chunk.js.map +1 -0
  70. package/dist/scripts/{bundle-d2cf17c78d.min.js → bundle-5a89651ec2.min.js} +3 -3
  71. package/dist/scripts/{bundle-d2cf17c78d.min.js.map → bundle-5a89651ec2.min.js.map} +1 -1
  72. package/package.json +1 -1
  73. package/dist/css/7428-lite-e2d7497beb.chunk.css +0 -8
  74. package/dist/scripts/1565-ba78a2a25c-lite.chunk.js +0 -2
  75. package/dist/scripts/1565-ba78a2a25c-lite.chunk.js.map +0 -1
  76. package/dist/scripts/2024-abf6cf1842-lite.chunk.js +0 -2
  77. package/dist/scripts/2024-abf6cf1842-lite.chunk.js.map +0 -1
  78. package/dist/scripts/2072-50b656cb3b-lite.chunk.js +0 -2
  79. package/dist/scripts/2072-50b656cb3b-lite.chunk.js.map +0 -1
  80. package/dist/scripts/2574-02faf4a2d2-lite.chunk.js +0 -2
  81. package/dist/scripts/2574-02faf4a2d2-lite.chunk.js.map +0 -1
  82. package/dist/scripts/396-2ffc09cc70-lite.chunk.js +0 -2
  83. package/dist/scripts/396-2ffc09cc70-lite.chunk.js.map +0 -1
  84. package/dist/scripts/4377-001a8ee263-lite.chunk.js +0 -2
  85. package/dist/scripts/4377-001a8ee263-lite.chunk.js.map +0 -1
  86. package/dist/scripts/4806-c2dce3650d-lite.chunk.js +0 -2
  87. package/dist/scripts/4806-c2dce3650d-lite.chunk.js.map +0 -1
  88. package/dist/scripts/4948-30af9a446d-lite.chunk.js +0 -2
  89. package/dist/scripts/4948-30af9a446d-lite.chunk.js.map +0 -1
  90. package/dist/scripts/549-2d591052e3-lite.chunk.js +0 -2
  91. package/dist/scripts/549-2d591052e3-lite.chunk.js.map +0 -1
  92. package/dist/scripts/5635-6e2559f04d-lite.chunk.js +0 -2
  93. package/dist/scripts/5635-6e2559f04d-lite.chunk.js.map +0 -1
  94. package/dist/scripts/5679-80c1d8434e-lite.chunk.js +0 -2
  95. package/dist/scripts/5679-80c1d8434e-lite.chunk.js.map +0 -1
  96. package/dist/scripts/5721-2141ed4fb6-lite.chunk.js +0 -2
  97. package/dist/scripts/5721-2141ed4fb6-lite.chunk.js.map +0 -1
  98. package/dist/scripts/5797-f84ce545b9-lite.chunk.js +0 -2
  99. package/dist/scripts/5797-f84ce545b9-lite.chunk.js.map +0 -1
  100. package/dist/scripts/581-fe733617bd-lite.chunk.js +0 -2
  101. package/dist/scripts/581-fe733617bd-lite.chunk.js.map +0 -1
  102. package/dist/scripts/5829-689f5be5d1-lite.chunk.js +0 -3
  103. package/dist/scripts/5829-689f5be5d1-lite.chunk.js.map +0 -1
  104. package/dist/scripts/6046-5652117548-lite.chunk.js +0 -2
  105. package/dist/scripts/6046-5652117548-lite.chunk.js.map +0 -1
  106. package/dist/scripts/6629-910e316a83-lite.chunk.js +0 -3
  107. package/dist/scripts/6629-910e316a83-lite.chunk.js.map +0 -1
  108. package/dist/scripts/6783-7efd15103a-lite.chunk.js +0 -3
  109. package/dist/scripts/6783-7efd15103a-lite.chunk.js.map +0 -1
  110. package/dist/scripts/7064-f5e8bc71bc-lite.chunk.js +0 -2
  111. package/dist/scripts/7064-f5e8bc71bc-lite.chunk.js.map +0 -1
  112. package/dist/scripts/7428-546d62999f-lite.chunk.js +0 -2
  113. package/dist/scripts/7428-546d62999f-lite.chunk.js.map +0 -1
  114. package/dist/scripts/7482-9016f79093-lite.chunk.js +0 -2
  115. package/dist/scripts/7482-9016f79093-lite.chunk.js.map +0 -1
  116. package/dist/scripts/7757-9b72774917-lite.chunk.js +0 -2
  117. package/dist/scripts/7757-9b72774917-lite.chunk.js.map +0 -1
  118. package/dist/scripts/7783-18da4064c0-lite.chunk.js +0 -2
  119. package/dist/scripts/7783-18da4064c0-lite.chunk.js.map +0 -1
  120. package/dist/scripts/8191-ff27deee6c-lite.chunk.js +0 -2
  121. package/dist/scripts/8191-ff27deee6c-lite.chunk.js.map +0 -1
  122. package/dist/scripts/8672-094d54cbbd-lite.chunk.js +0 -2
  123. package/dist/scripts/8672-094d54cbbd-lite.chunk.js.map +0 -1
  124. package/dist/scripts/8723-c3aaa1643a-lite.chunk.js +0 -2
  125. package/dist/scripts/8723-c3aaa1643a-lite.chunk.js.map +0 -1
  126. package/dist/scripts/9583-3b2623e754-lite.chunk.js +0 -2
  127. package/dist/scripts/9583-3b2623e754-lite.chunk.js.map +0 -1
  128. /package/dist/css/{4377-lite-856c02f000.chunk.css → 1107-lite-856c02f000.chunk.css} +0 -0
  129. /package/dist/css/{581-lite-a1cdc302ab.chunk.css → 1437-lite-a1cdc302ab.chunk.css} +0 -0
  130. /package/dist/css/{7757-lite-856c02f000.chunk.css → 4456-lite-856c02f000.chunk.css} +0 -0
  131. /package/dist/css/{9250-lite-37216d4207.chunk.css → 8723-lite-37216d4207.chunk.css} +0 -0
  132. /package/dist/scripts/{5829-689f5be5d1-lite.chunk.js.LICENSE.txt → 5829-903613bbf0-lite.chunk.js.LICENSE.txt} +0 -0
  133. /package/dist/scripts/{6629-910e316a83-lite.chunk.js.LICENSE.txt → 6629-4edaed39c8-lite.chunk.js.LICENSE.txt} +0 -0
  134. /package/dist/scripts/{6783-7efd15103a-lite.chunk.js.LICENSE.txt → 829-aff9937989-lite.chunk.js.LICENSE.txt} +0 -0
  135. /package/dist/scripts/{9250-ec244ab17a-lite.chunk.js.LICENSE.txt → 8723-708f2373d6-lite.chunk.js.LICENSE.txt} +0 -0
  136. /package/dist/scripts/{bundle-d2cf17c78d.min.js.LICENSE.txt → bundle-5a89651ec2.min.js.LICENSE.txt} +0 -0
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[4806],{34079:(e,t,n)=>{n.d(t,{O:()=>s});var r=n(32735),a=n(23481),i=n(40782),c=n(36532),o=a.T.encloseNamespace("interactives.pendingIndicator");function l(e){var t="d-flex align-items-center h-100";return t+=e.showLabel?" justify-content-between":" justify-content-center",e.className&&(t+=" ".concat(e.className)),t}function s(e){var t=function(){return r.createElement("div",{className:l(e)},!!e.showLabel&&r.createElement("em",null,o("pending")),r.createElement(i.O,null))};return e.title?r.createElement(c.u,{title:e.title,spanHack:!0,spanHackClassName:e.tooltipClassName||"h-100 w-100 d-flex align-items-center"},r.createElement(t,null)):r.createElement(t,null)}},84806:(e,t,n)=>{n.d(t,{Ju:()=>R,bB:()=>B,l8:()=>H,R7:()=>j,lE:()=>_,Fx:()=>L});var r=n(32735),a=n(23481),i=n(75896),c=n(34079),o=n(26136),l=n(39157),s=n(97364),u=n(40782),d=n(80845),m=n(26378),f=n(71151),v=n(93264),g=n(84120);function w(e){return e.duration?r.createElement(r.Fragment,null,e.interactive.timepoints.map((function(t,n){if(!t.interactions.length)return r.createElement(r.Fragment,null);var a,i,c=(a=t,i=e.selectedInteraction,a.interactions.find((function(e){return e.id===i.id}))||a.interactions[0]),o=c.id===e.selectedInteraction.id,l=o?g.w.getTypeInfo(c.typeId).bgClassName:"bg-gray-500",s=t.visibleAt/1e3/e.duration*100;return r.createElement("div",{key:n,className:"".concat("Wf1bl"," text-center"),style:{left:"".concat(s,"%")}},r.createElement("div",{className:"".concat("Fpm49"," ").concat(l)}),!!o&&r.createElement("div",null,v.T.ToDisplayDuration(t.visibleAt)))}))):r.createElement(r.Fragment,null)}var p=n(86572);var h=a.T.encloseNamespace("shared.interactionResultsSummary");function y(e){var t,n=r.useMemo((function(){return(0,l.nq)(e.interaction,e.results)}),[e.interaction,e.results]);return r.createElement("div",{className:"px-1 pt-1"},r.createElement("div",{className:"d-flex"},r.createElement(p.y,{interaction:e.interaction,iconClassName:"flex-shrink-0"})),r.createElement("div",{className:"my-4 ".concat("FCXQd")},r.createElement(w,{interactive:e.interactive,duration:(t=e.interactiveMetadata,t._parentClip?t._parentClip.endTime-t._parentClip.startTime:t._parentVideo.duration?t._parentVideo.duration/1e3:0),selectedInteraction:e.interaction})),r.createElement("div",{className:"row pt-1 pb-2"},r.createElement("div",{className:"col-6 pe-1"},r.createElement("div",{className:"bg-light rounded p-2 h-100"},!n.awaitingMarking&&r.createElement("div",{className:"d-flex align-items-center justify-content-between"},r.createElement("strong",null,h("correctlyAnswered")),r.createElement(u.O,{percentage:n.percentCorrect,layout:u.I.LabelOnly})),!!n.awaitingMarking&&r.createElement("div",{className:"d-flex align-items-center justify-content-center"},r.createElement("strong",null,r.createElement("em",null,h("pending")))))),r.createElement("div",{className:"col-6 ps-1"},r.createElement("div",{className:"bg-light rounded h-100 p-2 d-flex align-items-center justify-content-between"},r.createElement("strong",null,h("unanswered")),r.createElement("span",null,n.unanswered)))))}var E=r.forwardRef((function(e,t){var n=e.interaction,a=e.interactive,i=e.interactiveMetadata,c=e.results,o=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var a=0;for(r=Object.getOwnPropertySymbols(e);a<r.length;a++)t.indexOf(r[a])<0&&Object.prototype.propertyIsEnumerable.call(e,r[a])&&(n[r[a]]=e[r[a]])}return n}(e,["interaction","interactive","interactiveMetadata","results"]);return r.createElement("div",{className:"popover-lg"},r.createElement(f.Z,Object.assign({id:"interaction-results-summary-".concat(n.id),ref:t},o),r.createElement(f.Z.Body,null,r.createElement(y,{interaction:n,interactive:a,interactiveMetadata:i,results:c}))))})),b=n(19912);function C(e){var t;return r.createElement(m.Z,{trigger:(null===(t=e.results.students)||void 0===t?void 0:t.length)?"click":null,placement:"bottom",overlay:r.createElement(E,{interaction:e.interaction,interactive:e.interactive,interactiveMetadata:e.interactiveMetadata,results:e.results}),rootClose:!0},r.createElement("div",{className:"text-center h-100\n d-flex align-items-center justify-content-center\n ".concat(b.Z.interactionHeaderCellInner),onMouseEnter:e.onMouseEnter,onMouseLeave:e.onMouseLeave},r.createElement("div",{className:"p-1 position-relative"},e.interactionNumber)))}var N=n(83914),I=n(28972),M=n(83140),k=n(35223);function A(e){var t="".concat(b.Z.resultsCellInner," h-100 position-relative");return e===I.w.Correct&&(t+=" ".concat(b.Z.correct)),e===I.w.Incorrect&&(t+=" ".concat(b.Z.incorrect," text-danger")),e===I.w.AwaitingMarking&&(t+=" ".concat(b.Z.awaitingMarking)),e===I.w.UnAnswered&&(t+=" ".concat(b.Z.unanswered," text-warning")),t}function S(e){var t=M.A.isInteractionCorrect(e.interaction,(0,d.j_)(e.studentResults)),n=function(e){return e===I.w.Correct?k.vn.Check:e===I.w.Incorrect?k.vn.Close:e===I.w.UnAnswered?k.vn.Minus:void 0}(t);return r.createElement("div",{className:A(t)},!!n&&r.createElement(N.x,{svgName:n}),t===I.w.AwaitingMarking&&r.createElement(c.O,null))}var O=a.T.encloseNamespace("shared.studentResultsTable"),R=60;function x(e){var t;return r.createElement("div",{className:"d-flex align-items-center p-2 h-100 ".concat(null!==(t=e.className)&&void 0!==t?t:"")},e.children)}function Z(e){return r.createElement(x,{className:e.column.isSorted&&"fw-bold"},O(e.phraseKey))}function j(e,t,n){var a,i=!!(null===(a=e.students)||void 0===a?void 0:a.length);return r.useMemo((function(){return[{id:"name",Header:function(e){var t=e.column;return r.createElement(Z,{column:t,phraseKey:"name"})},accessor:function(e){return e},Cell:function(e){var a=e.value;return r.createElement(x,null,r.createElement("span",{className:"text-truncate"},(0,o.B2)((0,o.DV)(a,t),n)))},disableSortBy:!i},{Header:function(e){var t=e.column;return r.createElement(Z,{column:t,phraseKey:"unanswered"})},accessor:"summary.unanswered",sortType:"basic",sortDescFirst:!0,disableSortBy:!i,Cell:function(e){var t=e.value;return r.createElement(x,null,t)}},{Header:function(e){var t=e.column;return r.createElement(Z,{column:t,phraseKey:"score"})},accessor:"summary",id:"score",Cell:function(e){var t=e.value;return t.awaitingMarking?r.createElement(x,null,r.createElement(c.O,{title:O("markingRequired"),className:"flex-grow-1",showLabel:!0})):r.createElement(x,null,"".concat(t.correct,"/").concat(t.answered+t.unanswered))},width:125,sortDescFirst:!0,disableSortBy:!i},{Header:function(e){var t=e.column;return r.createElement(Z,{column:t,phraseKey:"percentage"})},accessor:"summary",id:"percentage",Cell:function(e){var t=e.value;return t.awaitingMarking?r.createElement(x,null,r.createElement(c.O,{title:O("markingRequired"),className:"flex-grow-1",showLabel:!0})):r.createElement(x,null,r.createElement(u.O,{percentage:t.percentCorrect,layout:u.I.LabelBefore,className:"flex-grow-1"}))},width:125,sortDescFirst:!0,disableSortBy:!i}]}),[n,i])}function _(e,t,n,a,i){return r.useMemo((function(){return(0,d.Q)(e).map((function(i,c){return{Header:function(){return r.createElement(C,{interaction:i,results:n,interactive:e,interactiveMetadata:t,interactionNumber:c+1,onMouseEnter:function(){return a(c)},onMouseLeave:function(){return a(null)}})},accessor:"results",id:i.id,disableSortBy:!0,width:R,Cell:function(e){var t=e.row.original;return r.createElement(S,{interaction:i,studentResults:t})}}}))}),[i])}function L(e,t,n,a,c,u){return r.useMemo((function(){var n=[];if(t.students.forEach((function(t){var r=(0,l.Rt)(e,t);u&&(0,s.C)(u,r)||n.push(Object.assign(Object.assign({},t),{summary:r}))})),"user"===(null==c?void 0:c.id)){var r=i.m.sortBy(n,(function(e){return(0,o.B2)(e.user,a)}));return c.desc?r.reverse():r}if("summary.unanswered"===(null==c?void 0:c.id)){var d=i.m.sortBy(n,(function(e){return e.summary.unanswered}));return c.desc?d.reverse():d}if("score"===(null==c?void 0:c.id)||"percentage"===(null==c?void 0:c.id)){var m=i.m.sortBy(n,(function(e){return e.summary.awaitingMarking?-1:e.summary.percentCorrect}));return c.desc?m.reverse():m}return n}),[n,c,a,u])}function B(e,t){if(e){var n=e.querySelectorAll(".".concat(b.Z.resultsRow));null==n||n.forEach((function(e){e.childNodes.forEach((function(e,n){e.classList.remove(b.Z.highlightColumn),n===t&&e.classList.add(b.Z.highlightColumn)}))}))}}function H(e,t){if(e){var n=e.querySelectorAll(".".concat(b.Z.resultsRow));null==n||n.forEach((function(e,n){e.classList.remove(b.Z.highlightResultsRow),n===t&&e.classList.add(b.Z.highlightResultsRow)}))}}},39157:(e,t,n)=>{n.d(t,{HI:()=>m,R6:()=>s,Rt:()=>v,UU:()=>d,Zs:()=>u,nq:()=>f});var r=n(75896),a=n(94892),i=n(28972),c=n(8246),o=n(83140),l=n(80845);function s(e,t,n){var i={markingRequired:[],lowScore:[],highScore:[],completed:[],notCompleted:[]},c=(0,l.Q)(e).length;t.students.forEach((function(t){var o=Object.assign(Object.assign({},t),{summary:v(e,t)});o.summary.awaitingMarking?i.markingRequired.push(o):r.m.last(t.results).attempts.length===c?(i.completed.push(o),o.summary.percentCorrect>=((null==n?void 0:n.HIGH)||a.i.HIGH)&&i.highScore.push(o),o.summary.percentCorrect<((null==n?void 0:n.MODERATE)||a.i.MODERATE)&&i.lowScore.push(o)):i.notCompleted.push(o)}));var o=r.m.sortBy(i.lowScore,(function(e){return e.summary.percentCorrect})),s=r.m.sortBy(i.highScore,(function(e){return-e.summary.percentCorrect}));return Object.assign(Object.assign({},i),{lowScore:o,highScore:s})}function u(e,t){return(0,l.Wn)(e).find((function(e){return e.id.toString()===t.toString()}))}function d(e){return"".concat(e.questionId,":").concat(e.resultId)}function m(e,t,n){var r=(0,l.j_)(t),a=(0,l.f6)(e,r);return(null==a?void 0:a.answers.every((function(e){var t;return(null===(t=n[d(e)])||void 0===t?void 0:t.status)===c.N.Correct})))?c.N.Correct:(null==a?void 0:a.answers.every((function(e){var t;return(null===(t=n[d(e)])||void 0===t?void 0:t.status)===c.N.Incorrect})))?c.N.Incorrect:void 0}function f(e,t){var n=t.students.length,r=0,a=0,c=0,s=0,u=0;return t.students.forEach((function(t){var n=(0,l.j_)(t);if(n){u+=t.results.length;var d=o.A.isInteractionCorrect(e,n);d===i.w.Correct&&r++,d===i.w.UnAnswered&&c++,d===i.w.AwaitingMarking&&s++,d!==i.w.UnAnswered&&a++}})),{percentCorrect:n>0?r/n:0,correct:r,answered:a,unanswered:c,awaitingMarking:s,attempts:u}}function v(e,t){var n=(0,l.j_)(t),r=(0,l.Q)(e),a=r.length,c=0,s=0;r.forEach((function(e){var t=o.A.isInteractionCorrect(e,n);t===i.w.Correct&&c++,t===i.w.AwaitingMarking&&s++}));var u=a>0?c/a:0,d=new Set(r.map((function(e){return e.id}))),m=n.attempts.filter((function(e){var t;return!!d.has(null===(t=null==e?void 0:e.answers[0])||void 0===t?void 0:t.questionId)})).length;return{answered:n.attempts.length,attempts:t.results.length,unanswered:a-m,percentCorrect:u,correct:c,awaitingMarking:s}}},97364:(e,t,n)=>{n.d(t,{C:()=>i,P:()=>a});var r=n(94892);function a(e,t){switch(e){case"score_desc":return[{id:t,desc:!0}];case"score_asc":return[{id:t,desc:!1}];default:return[]}}function i(e,t){return"marking_required"===e&&!t.awaitingMarking||"helping_hand"===e&&t.percentCorrect>=r.T.HIGH||"not_completed"===e&&!t.unanswered}},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(38129);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){if("object"!=c(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=c(n))return n;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 d(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 m(e,t){var n=d(e,t);return u(e,(function(e){var t=n(e);return null==t?void 0:t.text}))}function f(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,d(e,t))}var v=o(o(o(o(o(o(o({},i.Z9.Annotation,l),i.Z9.Image,l),i.Z9.MissingWord,(function(e,t){var n=d(e,t);return s(e,(function(e){var t=n(e);return null==t?void 0:t.text}))})),i.Z9.MultipleChoice,m),i.Z9.ShortAnswer,f),i.Z9.TrueOrFalse,m),i.Z9.Illustration,f),g={notApplicable:l,awaitingMarking:function(){return r.w.AwaitingMarking},isMissingWordCorrect:s,isMultipleChoiceCorrect:u,isInteractionCorrect:function(e,t){return(0,v[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(38129);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)}},19912:(e,t,n)=>{n.d(t,{Z:()=>r});const r={header:"hnMke",row:"ILLa_",fixedTable:"_fdpt",interactionHeaderCellOuter:"kjXYB",hasResults:"M4qgr",interactionHeaderCellInner:"cnFvB",resultsCellOuter:"bdzRb",correct:"xANR6",incorrect:"_44sb",awaitingMarking:"eQ9sh",unanswered:"xRUK8",highlightColumn:"f9Zqr",resultsCellInner:"LAFwi",highlightResultsRow:"TwwLO",resultsRow:"xZ5iP"}}}]);
2
- //# sourceMappingURL=4806-c2dce3650d-lite.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/4806-c2dce3650d-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/analytics/components/pending-indicator/PendingIndicator.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/interactions-bar/InteractionsBar.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/interactions-bar/interactions-bar.scss","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/interaction-results-summary/InteractionResultsSummary.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/interaction-results-summary/interaction-results-summary.scss","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/InteractionHeaderCell.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/StudentResultCell.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/StudentResultsTableUtils.tsx","file:///app/packages/libs/shared/src/apps/analytics/utils/InteractiveUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/StudentTableUtils.ts","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","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/student-results-table.scss"],"sourcesContent":["import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { PercentageIndicator } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\n\nconst namespace = 'interactives.pendingIndicator';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getClassName(props: PendingIndicatorProps): string {\n let className = 'd-flex align-items-center h-100';\n\n className += props.showLabel ? ' justify-content-between' : ' justify-content-center';\n\n if (props.className)\n className += ` ${props.className}`;\n\n return className;\n}\n\ninterface PendingIndicatorProps {\n title?: string;\n className?: string;\n showLabel?: boolean;\n tooltipClassName?: string;\n}\n\nexport function PendingIndicator(props: PendingIndicatorProps): JSX.Element {\n const Indicator = () => (\n <div className={getClassName(props)}>\n {!!props.showLabel &&\n <em>{getPhrase('pending')}</em>\n }\n <PercentageIndicator />\n </div>\n );\n\n if (!props.title)\n return <Indicator />;\n\n return (\n <Tooltip title={props.title} spanHack spanHackClassName={props.tooltipClassName || 'h-100 w-100 d-flex align-items-center'}>\n <Indicator />\n </Tooltip>\n );\n}","import React from 'react';\n\nimport { Interaction, Interactive, Timepoint } from 'libs/shared/interfaces';\nimport { DurationHelper } from 'libs/shared/utils/DurationHelper';\nimport { InteractionTypeHelper } from 'libs/shared/utils/interaction-type-helper/InteractionTypeHelper';\n\nimport styles from './interactions-bar.scss';\n\nfunction getInteraction(timepoint: Timepoint, selectedInteraction: Interaction): Interaction {\n return timepoint.interactions.find(i => i.id === selectedInteraction.id) || timepoint.interactions[0];\n}\n\ninterface InteractionBarProps {\n interactive: Interactive;\n duration: number;\n selectedInteraction: Interaction;\n}\n\nexport function InteractionsBar(props: InteractionBarProps): React.ReactElement {\n if (!props.duration)\n return <></>;\n\n return (\n <>\n {props.interactive.timepoints.map((t, i) => {\n if (!t.interactions.length)\n return <></>;\n\n const interaction = getInteraction(t, props.selectedInteraction);\n const isSelected = interaction.id === props.selectedInteraction.id;\n\n const bgClassName = isSelected ? (InteractionTypeHelper.getTypeInfo(interaction.typeId)).bgClassName : 'bg-gray-500';\n\n const left = ((t.visibleAt / 1000) / props.duration) * 100;\n\n return (\n <div\n key={i}\n className={`${styles.container} text-center`}\n style={{ left: `${left}%` }}\n >\n <div className={`${styles.interaction} ${bgClassName}`} />\n {!!isSelected &&\n <div>\n {DurationHelper.ToDisplayDuration(t.visibleAt)}\n </div>\n }\n </div>\n );\n })}\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"container\":\"Wf1bl\",\"interaction\":\"Fpm49\"};","import React from 'react';\nimport { Popover } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InteractionsBar } from 'libs/shared/apps/analytics/components/student-results/interactions-bar/InteractionsBar';\nimport { getInteractionResultsSummary } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { PercentageIndicator, PercentageIndicatorLayout } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Interaction, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\n\nimport styles from './interaction-results-summary.scss';\n\nconst namespace = 'shared.interactionResultsSummary';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getDuration(interactiveMetadata: InteractiveMetadata): number {\n if (interactiveMetadata._parentClip)\n return interactiveMetadata._parentClip.endTime - interactiveMetadata._parentClip.startTime;\n\n if (!interactiveMetadata._parentVideo.duration)\n return 0;\n\n return interactiveMetadata._parentVideo.duration / 1000;\n}\n\ninterface InteractionResultsSummaryProps {\n interaction: Interaction;\n interactive: Interactive;\n interactiveMetadata: InteractiveMetadata;\n results: InteractiveResultSet;\n}\n\nfunction InteractionResultsSummary(props: InteractionResultsSummaryProps): JSX.Element {\n const summary = React.useMemo(\n () => getInteractionResultsSummary(props.interaction, props.results),\n [ props.interaction, props.results ]\n );\n\n return (\n <div className='px-1 pt-1'>\n <div className='d-flex'>\n <InteractionLabel\n interaction={props.interaction}\n iconClassName='flex-shrink-0'\n />\n </div>\n <div className={`my-4 ${styles.bar}`}>\n <InteractionsBar\n interactive={props.interactive}\n duration={getDuration(props.interactiveMetadata)}\n selectedInteraction={props.interaction}\n />\n </div>\n <div className='row pt-1 pb-2'>\n <div className='col-6 pe-1'>\n <div className='bg-light rounded p-2 h-100'>\n {!summary.awaitingMarking &&\n <div className='d-flex align-items-center justify-content-between'>\n <strong>{getPhrase('correctlyAnswered')}</strong>\n <PercentageIndicator\n percentage={summary.percentCorrect}\n layout={PercentageIndicatorLayout.LabelOnly}\n />\n </div>\n }\n {!!summary.awaitingMarking &&\n <div className='d-flex align-items-center justify-content-center'>\n <strong>\n <em>{getPhrase('pending')}</em>\n </strong>\n </div>\n }\n </div>\n </div>\n <div className='col-6 ps-1'>\n <div className='bg-light rounded h-100 p-2 d-flex align-items-center justify-content-between'>\n <strong>{getPhrase('unanswered')}</strong>\n <span>{summary.unanswered}</span>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nconst InteractionResultsSummaryPopover = React.forwardRef((\n { interaction, interactive, interactiveMetadata, results, ...popoverProps }: InteractionResultsSummaryProps,\n ref: React.MutableRefObject<HTMLElement>\n) => {\n return (\n <div className='popover-lg'>\n <Popover\n id={`interaction-results-summary-${interaction.id}`}\n ref={ref as any}\n {...popoverProps}\n >\n <Popover.Body>\n <InteractionResultsSummary\n interaction={interaction}\n interactive={interactive}\n interactiveMetadata={interactiveMetadata}\n results={results}\n />\n </Popover.Body>\n </Popover>\n </div>\n );\n});\n\nexport { InteractionResultsSummaryPopover as InteractionResultsSummary };","// extracted by mini-css-extract-plugin\nexport default {\"bar\":\"FCXQd\"};","import React from 'react';\nimport { OverlayTrigger } from 'react-bootstrap';\n\nimport { InteractionResultsSummary } from 'libs/shared/apps/analytics/components/student-results/interaction-results-summary/InteractionResultsSummary';\nimport { Interaction, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\n\nimport styles from './student-results-table.scss';\n\ninterface InteractionHeaderCellProps {\n interaction: Interaction;\n results: InteractiveResultSet;\n interactionNumber: number;\n interactive: Interactive;\n interactiveMetadata: InteractiveMetadata;\n onMouseEnter?: () => void;\n onMouseLeave?: () => void;\n}\n\nexport function InteractionHeaderCell(props: InteractionHeaderCellProps): JSX.Element {\n return (\n <OverlayTrigger\n trigger={props.results.students?.length ? 'click' : null}\n placement='bottom'\n overlay={\n <InteractionResultsSummary\n interaction={props.interaction}\n interactive={props.interactive}\n interactiveMetadata={props.interactiveMetadata}\n results={props.results}\n />\n }\n rootClose\n >\n <div\n className={\n `text-center h-100\n d-flex align-items-center justify-content-center\n ${styles.interactionHeaderCellInner}`\n }\n onMouseEnter={props.onMouseEnter}\n onMouseLeave={props.onMouseLeave}\n >\n <div className='p-1 position-relative'>\n {props.interactionNumber}\n </div>\n </div>\n </OverlayTrigger>\n );\n}","import React from 'react';\n\nimport { PendingIndicator } from 'libs/shared/apps/analytics/components/pending-indicator/PendingIndicator';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { Interaction, StudentResults } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { getStudentResult } from 'libs/shared/utils/InteractiveHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './student-results-table.scss';\n\nfunction getSvgName(correctness: InteractionCorrectness): string {\n if (correctness === InteractionCorrectness.Correct)\n return cvSvgLibrary.Check;\n\n if (correctness === InteractionCorrectness.Incorrect)\n return cvSvgLibrary.Close;\n\n if (correctness === InteractionCorrectness.UnAnswered)\n return cvSvgLibrary.Minus;\n\n return;\n}\n\nfunction getClassName(correctness: InteractionCorrectness): string {\n let className = `${styles.resultsCellInner} h-100 position-relative`;\n\n if (correctness === InteractionCorrectness.Correct)\n className += ` ${styles.correct}`;\n\n if (correctness === InteractionCorrectness.Incorrect)\n className += ` ${styles.incorrect} text-danger`;\n\n if (correctness === InteractionCorrectness.AwaitingMarking)\n className += ` ${styles.awaitingMarking}`;\n\n if (correctness === InteractionCorrectness.UnAnswered)\n className += ` ${styles.unanswered} text-warning`;\n\n return className;\n}\n\ninterface StudentResultCellProps {\n interaction: Interaction;\n studentResults: StudentResults;\n}\n\nexport function StudentResultCell(props: StudentResultCellProps): JSX.Element {\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(\n props.interaction,\n getStudentResult(props.studentResults)\n );\n\n const svgName = getSvgName(correctness);\n\n return (\n <div className={getClassName(correctness)}>\n {!!svgName && <SvgContainer svgName={svgName} />}\n {correctness === InteractionCorrectness.AwaitingMarking &&\n <PendingIndicator />\n }\n </div>\n );\n}","import React from 'react';\nimport { CellProps, Column, ColumnInstance, SortingRule } from 'react-table';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { PendingIndicator } from 'libs/shared/apps/analytics/components/pending-indicator/PendingIndicator';\nimport { AnonSessions } from 'libs/shared/apps/analytics/hooks/UseAnonSessions';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { anonymiseUserName, getUserOrAnonSession } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { getStudentResultsSummary } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { FilterStudentsBy, shouldFilterStudent } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { PercentageIndicator, PercentageIndicatorLayout } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { getInteractions } from 'libs/shared/utils/InteractiveHelper';\n\nimport { InteractionHeaderCell } from './InteractionHeaderCell';\nimport { StudentResultCell } from './StudentResultCell';\n\nimport styles from './student-results-table.scss';\n\nconst namespace = 'shared.studentResultsTable';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const RESULTS_COL_WIDTH = 60;\n\ninterface CellWrapperProps {\n className?: string;\n}\n\nfunction CellWrapper(props: React.PropsWithChildren<CellWrapperProps>): JSX.Element {\n return (\n <div className={`d-flex align-items-center p-2 h-100 ${props.className ?? ''}`}>\n {props.children}\n </div>\n );\n}\n\ninterface HeaderCellProps {\n column: ColumnInstance<StudentResultsWithSummary>;\n phraseKey: string;\n}\n\nfunction HeaderCell(props: HeaderCellProps): JSX.Element {\n return (\n <CellWrapper className={props.column.isSorted && 'fw-bold'}>\n {getPhrase(props.phraseKey)}\n </CellWrapper>\n );\n}\n\nexport function useGetFixedColumns(\n results: InteractiveResultSet,\n anonSessions: AnonSessions,\n anonymiseUsers: boolean\n): Column<StudentResultsWithSummary>[] {\n const hasResults = !!results.students?.length;\n\n return React.useMemo(() => {\n const cols: Column<StudentResultsWithSummary>[] = [\n {\n id: 'name',\n Header: ({ column }) => <HeaderCell column={column} phraseKey='name' />,\n accessor: (u: StudentResultsWithSummary) => u,\n Cell: ({ value }: CellProps<StudentResultsWithSummary, StudentResultsWithSummary>) => (\n <CellWrapper>\n <span className='text-truncate'>{anonymiseUserName(getUserOrAnonSession(value, anonSessions), anonymiseUsers)}</span>\n </CellWrapper>\n ),\n disableSortBy: !hasResults\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='unanswered' />,\n accessor: 'summary.unanswered' as keyof StudentResultsWithSummary,\n sortType: 'basic', // Default is 'alphanumeric' which would treat the numbers as strings\n sortDescFirst: true,\n disableSortBy: !hasResults,\n Cell: ({ value }: CellProps<StudentResultsWithSummary, any>) => <CellWrapper>{value}</CellWrapper>\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='score' />,\n accessor: 'summary',\n id: 'score',\n Cell: ({ value }) => {\n if (value.awaitingMarking) {\n return (\n <CellWrapper>\n <PendingIndicator\n title={getPhrase('markingRequired')}\n className='flex-grow-1'\n showLabel\n />\n </CellWrapper>\n );\n }\n\n return (\n <CellWrapper>\n {`${value.correct}/${value.answered + value.unanswered}`}\n </CellWrapper>\n );\n },\n width: 125,\n sortDescFirst: true,\n disableSortBy: !hasResults\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='percentage' />,\n accessor: 'summary',\n id: 'percentage',\n Cell: ({ value }) => {\n if (value.awaitingMarking) {\n return (\n <CellWrapper>\n <PendingIndicator\n title={getPhrase('markingRequired')}\n className='flex-grow-1'\n showLabel\n />\n </CellWrapper>\n );\n }\n\n return (\n <CellWrapper>\n <PercentageIndicator\n percentage={value.percentCorrect}\n layout={PercentageIndicatorLayout.LabelBefore}\n className='flex-grow-1'\n />\n </CellWrapper>\n );\n },\n width: 125,\n sortDescFirst: true,\n disableSortBy: !hasResults\n }\n ];\n\n return cols;\n }, [ anonymiseUsers, hasResults ]);\n}\n\n/**\n * Returns memoized table columns. To trigger a recalculation, toggle the value of `refreshData`.\n */\nexport function useGetResultColumns(\n interactive: Interactive,\n interactiveMetadata: InteractiveMetadata,\n results: InteractiveResultSet,\n onColumnHover: (index?: number) => void,\n refreshData: boolean\n): Column<StudentResultsWithSummary>[] {\n return React.useMemo(() => {\n const interactions = getInteractions(interactive);\n\n return interactions.map((interaction, index) => {\n const col: Column<StudentResultsWithSummary> = {\n Header: () => {\n return (\n <InteractionHeaderCell\n interaction={interaction}\n results={results}\n interactive={interactive}\n interactiveMetadata={interactiveMetadata}\n interactionNumber={index + 1}\n onMouseEnter={() => onColumnHover(index)}\n onMouseLeave={() => onColumnHover(null)}\n />\n );\n },\n accessor: 'results',\n /**\n * `onSelectStudentResponse` in `StudentResultsTable` expects the column id to the interaction id\n */\n id: interaction.id,\n disableSortBy: true,\n width: RESULTS_COL_WIDTH,\n Cell: ({ row: { original: studentResults } }) => (\n <StudentResultCell interaction={interaction} studentResults={studentResults} />\n )\n };\n return col;\n });\n }, [refreshData]);\n}\n\n/**\n * Returns memoized table data. To trigger a recalculation, toggle the value of `refreshData`.\n */\nexport function useGetResultsTableData(\n interactive: Interactive,\n results: InteractiveResultSet,\n refreshData: boolean,\n anonymiseUsers: boolean,\n sortBy?: SortingRule<StudentResultsWithSummary>,\n filterBy?: FilterStudentsBy\n): StudentResultsWithSummary[] {\n return React.useMemo(() => {\n const students: StudentResultsWithSummary[] = [];\n\n results.students.forEach(s => {\n const summary = getStudentResultsSummary(interactive, s);\n\n if (filterBy && shouldFilterStudent(filterBy, summary)) return;\n\n students.push({ ...s, summary });\n });\n\n if (sortBy?.id === 'user') {\n const sorted = ArrayHelper.sortBy(students, student => anonymiseUserName(student.user, anonymiseUsers));\n\n return sortBy.desc ? sorted.reverse() : sorted;\n }\n\n if (sortBy?.id === 'summary.unanswered') {\n const sorted = ArrayHelper.sortBy(students, student => student.summary.unanswered);\n\n return sortBy.desc ? sorted.reverse() : sorted;\n }\n\n if (sortBy?.id === 'score' || sortBy?.id === 'percentage') {\n const sorted = ArrayHelper.sortBy(students, student => {\n if (student.summary.awaitingMarking)\n return -1;\n\n return student.summary.percentCorrect;\n });\n\n return sortBy.desc ? sorted.reverse() : sorted;\n }\n\n return students;\n }, [ refreshData, sortBy, anonymiseUsers, filterBy ]);\n}\n\nexport function highlightColumns(tableEl: HTMLElement, highlightIndex?: number): void {\n if (!tableEl)\n return;\n\n const rows = tableEl.querySelectorAll(`.${styles.resultsRow}`);\n\n rows?.forEach(row => {\n row.childNodes.forEach((col: HTMLElement, colIdx: number) => {\n col.classList.remove(styles.highlightColumn);\n\n if (colIdx === highlightIndex)\n col.classList.add(styles.highlightColumn);\n });\n });\n}\n\nexport function highlightRows(tableEl: HTMLElement, highlightIndex?: number): void {\n if (!tableEl)\n return;\n\n const rows = tableEl.querySelectorAll(`.${styles.resultsRow}`);\n\n rows?.forEach((row, rowIdx) => {\n row.classList.remove(styles.highlightResultsRow);\n\n if (rowIdx === highlightIndex)\n row.classList.add(styles.highlightResultsRow);\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, ScoreThresholds } 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(\n interactive: Interactive,\n results: InteractiveResultSet,\n scoreThreshold?: ScoreThresholds\n): 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 >= (scoreThreshold?.HIGH || ScoreThresholdDefaults.HIGH))\n groups.highScore.push(withSummary);\n \n if (withSummary.summary.percentCorrect < (scoreThreshold?.MODERATE || 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);\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}","import { SortingRule } from 'react-table';\n\nimport { ResultsSummary } from 'libs/shared/apps/analytics/interfaces/ResultsSummary';\nimport { ScoreThresholdInsights } from 'libs/shared/constants/ScoreThresholds';\n\nexport type SortStudentsBy = 'score_desc' | 'score_asc';\n\nexport function getSortStudents(sortBy: SortStudentsBy, id: string): SortingRule<any>[] {\n switch (sortBy) {\n case 'score_desc': return [{ id, desc: true }];\n case 'score_asc': return [{ id, desc: false }];\n default: return [];\n }\n}\n\nexport type FilterStudentsBy = 'not_completed' | 'marking_required' | 'helping_hand';\n\nexport function shouldFilterStudent(filter: FilterStudentsBy, summary: ResultsSummary): boolean {\n if (filter === 'marking_required' && !summary.awaitingMarking)\n return true;\n\n if (filter === 'helping_hand' && summary.percentCorrect >= ScoreThresholdInsights.HIGH)\n return true;\n\n if (filter === 'not_completed' && !summary.unanswered)\n return true;\n \n return false;\n}\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}","// extracted by mini-css-extract-plugin\nexport default {\"header\":\"hnMke\",\"row\":\"ILLa_\",\"fixedTable\":\"_fdpt\",\"interactionHeaderCellOuter\":\"kjXYB\",\"hasResults\":\"M4qgr\",\"interactionHeaderCellInner\":\"cnFvB\",\"resultsCellOuter\":\"bdzRb\",\"correct\":\"xANR6\",\"incorrect\":\"_44sb\",\"awaitingMarking\":\"eQ9sh\",\"unanswered\":\"xRUK8\",\"highlightColumn\":\"f9Zqr\",\"resultsCellInner\":\"LAFwi\",\"highlightResultsRow\":\"TwwLO\",\"resultsRow\":\"xZ5iP\"};"],"names":["getPhrase","getClassName","props","className","showLabel","PendingIndicator","Indicator","title","spanHack","spanHackClassName","tooltipClassName","InteractionsBar","duration","interactive","timepoints","map","t","i","interactions","length","timepoint","selectedInteraction","interaction","find","id","isSelected","bgClassName","InteractionTypeHelper","typeId","left","visibleAt","key","style","DurationHelper","LanguageService","InteractionResultsSummary","interactiveMetadata","summary","results","InteractionLabel","iconClassName","_parentClip","endTime","startTime","_parentVideo","awaitingMarking","PercentageIndicator","percentage","percentCorrect","layout","unanswered","InteractionResultsSummaryPopover","ref","popoverProps","Popover","InteractionHeaderCell","OverlayTrigger","trigger","students","placement","overlay","rootClose","onMouseEnter","onMouseLeave","interactionNumber","correctness","InteractionCorrectness","StudentResultCell","InteractiveCorrectnessHelper","studentResults","svgName","getSvgName","SvgContainer","RESULTS_COL_WIDTH","CellWrapper","children","HeaderCell","column","isSorted","phraseKey","useGetFixedColumns","anonSessions","anonymiseUsers","hasResults","Header","accessor","u","Cell","value","disableSortBy","sortType","sortDescFirst","correct","answered","width","useGetResultColumns","onColumnHover","refreshData","index","row","original","useGetResultsTableData","sortBy","filterBy","forEach","s","push","sorted","ArrayHelper","student","user","desc","reverse","highlightColumns","tableEl","highlightIndex","rows","querySelectorAll","childNodes","col","colIdx","classList","remove","add","highlightRows","rowIdx","groupStudents","scoreThreshold","groups","markingRequired","lowScore","highScore","completed","notCompleted","numInteractions","withSummary","getStudentResultsSummary","attempts","HIGH","MODERATE","sortedLowScore","sortedHighScore","getInteractionById","interactionId","toString","getMarkedAnswerId","answer","questionId","resultId","getMarkedStatus","markedAnswers","result","studentResponse","answers","every","a","status","getInteractionResultsSummary","numStudents","numCorrect","interactionIds","Set","answeredInteractions","filter","has","getSortStudents","shouldFilterStudent","InteractiveAnswerStatus","notApplicable","isMissingWordCorrect","getStudentAnswer","items","actionableItems","isCorrect","name","trim","toLowerCase","isMultipleChoiceCorrect","studentAnswer","getGetStudentAnswer","attempt","wrapIsMultipleChoiceCorrect","text","wrapIsMarkableAnswerMarkedCorrect","item","isMarkableAnswerMarkedCorrect","IsCorrectLookup","isInteractionCorrect","isCorrectFn","interactionRequiresAnswer","flattenInteractions","getStudentResult","getStudentAttempt","getInteractions"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[4948],{39157:(e,t,n)=>{n.d(t,{HI:()=>d,R6:()=>o,Rt:()=>g,UU:()=>m,Zs:()=>u,nq:()=>p});var r=n(75896),a=n(94892),s=n(28972),i=n(8246),c=n(83140),l=n(80845);function o(e,t,n){var s={markingRequired:[],lowScore:[],highScore:[],completed:[],notCompleted:[]},i=(0,l.Q)(e).length;t.students.forEach((function(t){var c=Object.assign(Object.assign({},t),{summary:g(e,t)});c.summary.awaitingMarking?s.markingRequired.push(c):r.m.last(t.results).attempts.length===i?(s.completed.push(c),c.summary.percentCorrect>=((null==n?void 0:n.HIGH)||a.i.HIGH)&&s.highScore.push(c),c.summary.percentCorrect<((null==n?void 0:n.MODERATE)||a.i.MODERATE)&&s.lowScore.push(c)):s.notCompleted.push(c)}));var c=r.m.sortBy(s.lowScore,(function(e){return e.summary.percentCorrect})),o=r.m.sortBy(s.highScore,(function(e){return-e.summary.percentCorrect}));return Object.assign(Object.assign({},s),{lowScore:c,highScore:o})}function u(e,t){return(0,l.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,n){var r=(0,l.j_)(t),a=(0,l.f6)(e,r);return(null==a?void 0:a.answers.every((function(e){var t;return(null===(t=n[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=n[m(e)])||void 0===t?void 0:t.status)===i.N.Incorrect})))?i.N.Incorrect:void 0}function p(e,t){var n=t.students.length,r=0,a=0,i=0,o=0,u=0;return t.students.forEach((function(t){var n=(0,l.j_)(t);if(n){u+=t.results.length;var m=c.A.isInteractionCorrect(e,n);m===s.w.Correct&&r++,m===s.w.UnAnswered&&i++,m===s.w.AwaitingMarking&&o++,m!==s.w.UnAnswered&&a++}})),{percentCorrect:n>0?r/n:0,correct:r,answered:a,unanswered:i,awaitingMarking:o,attempts:u}}function g(e,t){var n=(0,l.j_)(t),r=(0,l.Q)(e),a=r.length,i=0,o=0;r.forEach((function(e){var t=c.A.isInteractionCorrect(e,n);t===s.w.Correct&&i++,t===s.w.AwaitingMarking&&o++}));var u=a>0?i/a:0,m=new Set(r.map((function(e){return e.id}))),d=n.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:n.attempts.length,attempts:t.results.length,unanswered:a-d,percentCorrect:u,correct:i,awaitingMarking:o}}},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:()=>v});var r=n(28972),a=n(8246),s=n(38129);function i(e){return i="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},i(e)}function c(e,t,n){return(t=function(e){var t=function(e){if("object"!=i(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=i(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==i(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 o(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 p(e,t){return function(e,t){var n;return e.actionableItems.forEach((function(e){var s=t(e.id);n=s?s.status!==a.N.Correct?s.status!==a.N.Incorrect?r.w.AwaitingMarking:r.w.Incorrect:r.w.Correct:r.w.UnAnswered})),n}(e,m(e,t))}var g=c(c(c(c(c(c(c({},s.Z9.Annotation,l),s.Z9.Image,l),s.Z9.MissingWord,(function(e,t){var n=m(e,t);return o(e,(function(e){var t=n(e);return null==t?void 0:t.text}))})),s.Z9.MultipleChoice,d),s.Z9.ShortAnswer,p),s.Z9.TrueOrFalse,d),s.Z9.Illustration,p),v={notApplicable:l,awaitingMarking:function(){return r.w.AwaitingMarking},isMissingWordCorrect:o,isMultipleChoiceCorrect:u,isInteractionCorrect:function(e,t){return(0,g[e.typeId])(e,t)}}},80845:(e,t,n)=>{n.d(t,{Q:()=>o,Wn:()=>i,f6:()=>l,j_:()=>c});var r=n(75896),a=n(38129);function s(e){return e.typeId!==a.Z9.Annotation&&e.typeId!==a.Z9.Image}function i(e){return r.m.flatten(e.timepoints.map((function(e){return e.interactions})))}function c(e){return r.m.last(e.results)}function l(e,t){return r.m.findWhere(null==t?void 0:t.attempts,{id:e})}function o(e){return i(e).filter(s)}},54948:(e,t,n)=>{n.d(t,{m:()=>le});var r=n(32735),a=n(23481),s=n(84621),i=n(21976),c=n(70072),l=n(83345),o=n(35223);const u={tealChart:"lZZf0",grayChart:"wJQc4"};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){return function(e){if(Array.isArray(e))return g(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||p(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function p(e,t){if(e){if("string"==typeof e)return g(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)?g(e,t):void 0}}function g(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 v="shared.insightAverageAttempts",f=a.T.encloseNamespace(v);function h(e){var t,n,a=function(){var t=e.students.reduce((function(e,t){var n,r,a,s=t.summary.attempts.toString();return s in e||Object.assign(e,(n={},a=0,(r=function(e){var t=function(e){if("object"!=m(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.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+""}(r=s))in n?Object.defineProperty(n,r,{value:a,enumerable:!0,configurable:!0,writable:!0}):n[r]=a,n)),e[s]++,e}),{});return Object.keys(t).length?t:{0:0}}(),g=Math.max.apply(Math,d(Object.keys(a).map((function(e){return a[e]})))),h=Object.keys(a).reduce((function(e,t){return a[t]===g?[].concat(d(e),[t]):e}),[]),y=(t=0===a[0],{categories:Object.keys(a),series:[{type:"column",color:a[0]?"#EAEAEA":"#40C2BB",borderRadius:4,dataLabels:{enabled:!t,style:c.d,inside:!1,overflow:"allow",crop:!1},data:Object.keys(a).map((function(e){var n=0!==g&&a[e]===g;return{className:"".concat(t?u.grayChart:u.tealChart," ").concat(a[e]!==g&&0!==a[e]?"opacity-25":""),borderWidth:n?2:0,borderColor:n?"black":"",y:a[e]}}))}]});return r.createElement(s.L,{title:f("title"),svgName:o.vn.Refresh,svgClassName:"bg-light-purple text-purple"},r.createElement("p",null,h.length?r.createElement(l.x,{namespace:v,phrase:"averageAttempts",options:{smartCount:(n=Object.entries(a).reduce((function(e,t){var n,r,a=(r=2,function(e){if(Array.isArray(e))return e}(n=t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,s,i,c=[],l=!0,o=!1;try{if(s=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=s.call(n)).done)&&(c.push(r.value),c.length!==t);l=!0);}catch(e){o=!0,a=e}finally{try{if(!l&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(o)throw a}}return c}}(n,r)||p(n,r)||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.")}()),s=a[0],i=a[1];return e.totalAttempts+=+s*i,e.totalUsers+=i,e}),{totalAttempts:0,totalUsers:0}),0===n.totalUsers?0:Math.round(n.totalAttempts/n.totalUsers*100)/100)}}):r.createElement(l.x,{namespace:v,phrase:"noAttempts"})),r.createElement("div",{className:"mt-auto"},r.createElement(i.x,{label:f("attempts"),chartData:y})))}var y=n(75896);const b={redChart:"G7zOw",yellowChart:"k34mm",greenChart:"vBneA",blueChart:"RPTWm",grayChart:"k4JFZ",borderDark:"LWor3"};var E="shared.insightAverageScore",k=a.T.encloseNamespace(E);function A(e){return r.createElement(s.L,{title:k("title"),svgName:o.vn.Analytics,svgClassName:"bg-light-orange text-orange"},r.createElement("p",null,e.students.length?r.createElement(l.x,{namespace:E,phrase:"averageScore",options:(c=e.students.map((function(e){return e.summary.percentCorrect})),u=c.reduce((function(e,t){return e+t}),0)/c.length,m=y.m.last(y.m.last(e.students).results).attempts.length,{averageScore:Math.round(m*u),totalQuestions:m,averagePercentage:(100*u).toFixed(1)})}):r.createElement(l.x,{namespace:E,phrase:"noAnswers"})),r.createElement(i.x,{label:"".concat(k("studentScores")," (%)"),chartData:(t=Array(11).fill(0),n=e.students.reduce((function(e,t){return e[Math.floor(10*t.summary.percentCorrect)]++,e}),t),a=["0","10","20","30","40","50","60","70","80","90","100"],{categories:a,series:[{type:"column",color:"#4E9ACE",borderRadius:4,data:n.map((function(e,t){var n=Number(a[t]);return{className:"".concat(function(e,t){return 0===t?b.grayChart:e<50?b.redChart:e<70?b.yellowChart:e<90?b.greenChart:b.blueChart}(n,e)),y:e}}))}]})}));var t,n,a,c,u,m}var w=n(98551),C=n(26136),N=a.T.encloseNamespace("shared.insightCompletedStudents");function S(e){return r.createElement(s.L,{title:N("title"),svgName:o.vn.Flag,svgClassName:"bg-light-indigo text-indigo",count:e.students.length},r.createElement(w.y,{students:e.students.map((function(t){return Object.assign(Object.assign({},(0,C.DV)(t,e.anonSessions)),{percentage:t.summary.percentCorrect})})),imageCdnUrl:e.imageCdnUrl,imageUrl:e.imageUrl,description:N("completedStudents"),appLink:e.resultsAppLink,appLinkText:N("viewAll"),anonymiseUsers:e.anonymiseUsers}))}var I=n(51870),L=n(39157),U=n(15611),j=n(86572),O=n(40782),M=n(80845),x="shared.insightEasiestQuestion",q=a.T.encloseNamespace(x);function R(e){var t,n=r.useMemo((function(){return t=e.interactive,n=e.results,r=(0,M.Q)(t).map((function(e){return Object.assign(Object.assign({},e),{resultsSummary:(0,L.nq)(e,n)})})).filter((function(e){return!!e.resultsSummary.answered&&!e.resultsSummary.awaitingMarking})),a=y.m.sortBy(r,(function(e){return e.resultsSummary.percentCorrect})),y.m.last(a);var t,n,r,a}),[e.results.students.length]);return r.createElement(s.L,{title:q("title"),svgName:o.vn.StarOutline,svgClassName:"bg-light-blue text-blue"},r.createElement("div",{className:"d-flex align-items-center"},r.createElement(O.O,{percentage:null===(t=null==n?void 0:n.resultsSummary)||void 0===t?void 0:t.percentCorrect,layout:O.I.LabelInside}),n?r.createElement("div",{className:"d-flex ms-2"},r.createElement(j.y,{interaction:n,iconClassName:"flex-shrink-0"})):r.createElement("span",{className:"ms-2"},q("noAnswers"))),n&&r.createElement(U.F,{appLink:Object.assign(Object.assign({},e.questionsAppLink),{params:Object.assign(Object.assign({},e.questionsAppLink.params),{sortBy:"score_desc"})}),className:"text-info"},r.createElement(l.x,{namespace:x,phrase:"viewQuestions"})))}var T="shared.insightHardestQuestion",_=a.T.encloseNamespace(T);function B(e){var t,n=r.useMemo((function(){return t=e.interactive,n=e.results,r=(0,M.Q)(t).map((function(e){return Object.assign(Object.assign({},e),{resultsSummary:(0,L.nq)(e,n)})})).filter((function(e){return!!e.resultsSummary.answered&&!e.resultsSummary.awaitingMarking})),a=y.m.sortBy(r,(function(e){return e.resultsSummary.percentCorrect})),y.m.first(a);var t,n,r,a}),[e.results.students.length]);return r.createElement(s.L,{title:_("title"),svgName:o.vn.QuestionMark,svgClassName:"bg-light-orange text-orange"},r.createElement("div",{className:"d-flex align-items-center"},r.createElement(O.O,{percentage:null===(t=null==n?void 0:n.resultsSummary)||void 0===t?void 0:t.percentCorrect,layout:O.I.LabelInside}),n?r.createElement("div",{className:"d-flex ms-2"},r.createElement(j.y,{interaction:n,iconClassName:"flex-shrink-0"})):r.createElement("span",{className:"ms-2"},_("noAnswers"))),n&&r.createElement(U.F,{appLink:Object.assign(Object.assign({},e.questionsAppLink),{params:Object.assign(Object.assign({},e.questionsAppLink.params),{sortBy:"score_asc"})}),className:"text-info"},r.createElement(l.x,{namespace:T,phrase:"viewQuestions"})))}var W=n(50916),H=a.T.encloseNamespace("shared.insightHighScoringStudents");function P(e){return r.createElement(s.L,{title:H("title"),svgName:o.vn.Trophy,svgClassName:"bg-light-teal text-teal",count:e.students.length},r.createElement(w.y,{students:e.students.map((function(t){return Object.assign(Object.assign({},(0,C.DV)(t,e.anonSessions)),{percentage:t.summary.percentCorrect})})),imageCdnUrl:e.imageCdnUrl,imageUrl:e.greenChartImageUrl,description:H(e.completed.length?"noStudents":"highScore"),appLink:Object.assign(Object.assign({},e.resultsAppLink),{params:Object.assign(Object.assign({},e.resultsAppLink.params),{sortBy:"score_desc"})}),appLinkText:H("viewByHighest"),anonymiseUsers:e.anonymiseUsers}))}var Z=a.T.encloseNamespace("shared.insightLowScoringStudents");function D(e){return r.createElement(s.L,{title:Z("title"),svgName:o.vn.Hand,svgClassName:"bg-light-red text-red",count:e.students.length},r.createElement(w.y,{students:e.students.map((function(t){return Object.assign(Object.assign({},(0,C.DV)(t,e.anonSessions)),{percentage:t.summary.percentCorrect})})),imageCdnUrl:e.imageCdnUrl,imageUrl:e.completed.length?e.heartImageUrl:e.redChartImageUrl,description:Z(e.completed.length?"doingWell":"lowScore"),appLink:Object.assign(Object.assign({},e.resultsAppLink),{params:Object.assign(Object.assign({},e.resultsAppLink.params),{sortBy:"score_asc"})}),appLinkText:Z("viewByLowest"),anonymiseUsers:e.anonymiseUsers}))}var Q=a.T.encloseNamespace("shared.insightMarkingRequired");function F(e){return r.createElement(s.L,{title:Q("title"),svgName:o.vn.Hand,svgClassName:"bg-light-blue text-blue",count:e.students.length},r.createElement(w.y,{students:e.students,imageCdnUrl:e.imageCdnUrl,imageUrl:e.imageUrl,description:Q("studentsRequireMarking"),appLink:Object.assign(Object.assign({},e.resultsAppLink),{params:{filterBy:"marking_required"}}),appLinkText:Q("viewAll"),anonymiseUsers:e.anonymiseUsers}))}function V(e){return function(e){if(Array.isArray(e))return G(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return G(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)?G(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function G(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 J=a.T.encloseNamespace("shared.insightNotCompletedStudents");function z(e){var t,n,a,i=(t=e.markingRequiredStudents.map((function(e){return null==e?void 0:e.user.id})),n=e.completedStudents.map((function(e){return null==e?void 0:e.user.id})),a=e.classroomStudents.filter((function(e){return!t.includes(e.id)&&!n.includes(e.id)})),y.m.uniq([].concat(V(e.notCompletedStudents.map((function(e){return e.user}))),V(a)),"id"));return r.createElement(s.L,{title:J("title"),svgName:o.vn.Puzzle,svgClassName:"bg-light-teal text-teal",count:i.length},r.createElement(w.y,{students:i,imageCdnUrl:e.imageCdnUrl,imageUrl:e.imageUrl,description:J("completed"),appLink:Object.assign(Object.assign({},e.resultsAppLink),{params:"not_completed"}),appLinkText:J("viewAll"),anonymiseUsers:e.anonymiseUsers}))}var $=n(94892),K=n(37802),X=n(99742),Y=n(91693),ee=n(38279),te="lite.insightsMask";function ne(e){return r.createElement("div",{className:"".concat(e.requiresMarking&&ee.Z.mask," position-relative")},r.createElement("div",{className:e.requiresMarking?"position-absolute top-0":""},e.children),r.createElement("div",{className:e.requiresMarking?"".concat(ee.Z.backdrop," d-flex flex-column align-items-center justify-content-start py-5"):""},!!e.requiresMarking&&r.createElement("div",{className:"text-center w-50"},r.createElement("img",{src:X.W.Insights.MARKING_RESPONSES,className:"mb-3",width:288}),r.createElement("h2",{className:"h3 mb-3"},r.createElement(l.x,{namespace:te,phrase:"markHeading"})),r.createElement("p",{className:"mb-3"},r.createElement(l.x,{namespace:te,phrase:"markDescription"})),r.createElement(Y.h,{svgName:o.vn.Check,className:"btn btn-dark mb-3",appLink:Object.assign(Object.assign({},e.appLink),{params:Object.assign(Object.assign({},e.appLink.params),{filterBy:"marking_required"})})},r.createElement(l.x,{namespace:te,phrase:"markResponses",options:{smartCount:e.requiresMarking}})),r.createElement("button",{className:"btn btn-link d-block p-0 mx-auto",onClick:e.hideMarkingRequiredMask},r.createElement(l.x,{namespace:te,phrase:"seeIncomplete"})))))}var re=n(53214);const ae={partialInsights:"pG0Jh"};function se(){return r.createElement("div",null,r.createElement("h2",{className:"h4 w-25 partial-loading-background"}," "),r.createElement("div",{className:"row g-3 mb-5"},r.createElement("div",{className:"col-6"},r.createElement("div",{className:"".concat(ae.partialInsights," rounded partial-loading-background")})),r.createElement("div",{className:"col-6"},r.createElement("div",{className:"".concat(ae.partialInsights," rounded partial-loading-background")}))),r.createElement("h2",{className:"h4 w-25 partial-loading-background"}," "),r.createElement("div",{className:"row g-3 mb-5"},r.createElement("div",{className:"col-6"},r.createElement("div",{className:"".concat(ae.partialInsights," rounded partial-loading-background")})),r.createElement("div",{className:"col-6"},r.createElement("div",{className:"".concat(ae.partialInsights," rounded partial-loading-background")})),r.createElement("div",{className:"col-6"},r.createElement("div",{className:"".concat(ae.partialInsights," rounded partial-loading-background")})),r.createElement("div",{className:"col-6"},r.createElement("div",{className:"".concat(ae.partialInsights," rounded partial-loading-background")}))),r.createElement("h2",{className:"h4 w-25 partial-loading-background"}," "),r.createElement("div",{className:"row g-3 mb-5"},r.createElement("div",{className:"col-6"},r.createElement("div",{className:"".concat(ae.partialInsights," rounded partial-loading-background")})),r.createElement("div",{className:"col-6"},r.createElement("div",{className:"".concat(ae.partialInsights," rounded partial-loading-background")})),r.createElement("div",{className:"col-6"},r.createElement("div",{className:"".concat(ae.partialInsights," rounded partial-loading-background")})),r.createElement("div",{className:"col-6"},r.createElement("div",{className:"".concat(ae.partialInsights," rounded partial-loading-background")}))))}function ie(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 ce="insights.interactiveInsightsOverview";function le(e){var t,n,a,s,i=(a=r.useState(!1),s=2,function(e){if(Array.isArray(e))return e}(a)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,s,i,c=[],l=!0,o=!1;try{if(s=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=s.call(n)).done)&&(c.push(r.value),c.length!==t);l=!0);}catch(e){o=!0,a=e}finally{try{if(!l&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(o)throw a}}return c}}(a,s)||function(e,t){if(e){if("string"==typeof e)return ie(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)?ie(e,t):void 0}}(a,s)||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.")}()),c=i[0],o=i[1],u=(0,K.r)(null).hasShareFlowV2,m=e.hasDataLoaded&&(0,L.R6)(e.interactive,e.results,$.T);return r.createElement(r.Fragment,null,!e.hasDataLoaded&&r.createElement(se,null),e.hasDataLoaded&&r.createElement(re.u,{video:e.interactiveMetadata,hasShared:e.hasShared,hasShareFlowV2:u,shareId:e.shareId},r.createElement("section",{className:"mb-5"},r.createElement("h2",{className:"h4"},r.createElement(l.x,{namespace:ce,phrase:"studentResponses"}),r.createElement("span",null,": ",e.results.students.length,e.classroomStudents?"/".concat(e.classroomStudents.data.length):"")),r.createElement("div",{className:"row g-3"},r.createElement("div",{className:"col"},r.createElement(F,{imageUrl:X.W.Insights.SPEECH_BUBBLE_ASTERISK,resultsAppLink:e.interactiveInsightsAppLinks.resultsAppLink,imageCdnUrl:e.config.imageCdnUrl,students:(n=m.markingRequired,n.map((function(t){return(0,C.DV)(t,e.anonSessions)}))),anonymiseUsers:e.anonymiseUsers})),e.classroomFilterOnly&&r.createElement("div",{className:"col"},r.createElement(z,{markingRequiredStudents:m.markingRequired,completedStudents:m.completed,notCompletedStudents:m.notCompleted,classroomStudents:e.classroomStudents.data,imageCdnUrl:e.config.imageCdnUrl,imageUrl:X.W.Insights.JIGSAW,resultsAppLink:e.interactiveInsightsAppLinks.resultsAppLink,anonymiseUsers:e.anonymiseUsers})),r.createElement("div",{className:"col"},r.createElement(S,{students:m.completed,imageCdnUrl:e.config.imageCdnUrl,imageUrl:X.W.Insights.AVATAR,resultsAppLink:e.interactiveInsightsAppLinks.resultsAppLink,anonymiseUsers:e.anonymiseUsers,anonSessions:e.anonSessions})))),r.createElement(ne,{requiresMarking:!c&&m.markingRequired.length,appLink:e.interactiveInsightsAppLinks.resultsAppLink,hideMarkingRequiredMask:function(){return o(!0)}},r.createElement("section",{className:"mb-5"},r.createElement("h2",{className:"h4"},r.createElement(l.x,{namespace:ce,phrase:"studentsPerformance"})),r.createElement("div",{className:"row g-3"},r.createElement("div",{className:"col-6"},r.createElement(D,{redChartImageUrl:X.W.Insights.RED_CHART,heartImageUrl:X.W.Insights.SPEECH_BUBBLE_HEART,resultsAppLink:e.interactiveInsightsAppLinks.resultsAppLink,imageCdnUrl:e.config.imageCdnUrl,students:m.lowScore,completed:m.completed,anonymiseUsers:e.anonymiseUsers,anonSessions:e.anonSessions})),r.createElement("div",{className:"col-6"},r.createElement(P,{greenChartImageUrl:X.W.Insights.GREEN_CHART,resultsAppLink:e.interactiveInsightsAppLinks.resultsAppLink,imageCdnUrl:e.config.imageCdnUrl,students:m.highScore,completed:m.completed,anonymiseUsers:e.anonymiseUsers,anonSessions:e.anonSessions})),r.createElement("div",{className:"col-6"},r.createElement(B,{interactive:e.interactive,interactiveMetadata:e.interactiveMetadata,results:e.results,questionsAppLink:e.interactiveInsightsAppLinks.questionsAppLink})),r.createElement("div",{className:"col-6"},r.createElement(R,{interactive:e.interactive,interactiveMetadata:e.interactiveMetadata,results:e.results,questionsAppLink:e.interactiveInsightsAppLinks.questionsAppLink})))),r.createElement("section",{className:"mb-5"},r.createElement("h2",{className:"h4"},r.createElement(l.x,{namespace:ce,phrase:"classPerformance"})),r.createElement("div",{className:"row g-3"},r.createElement("div",{className:"col-6"},r.createElement(A,{students:m.completed})),r.createElement("div",{className:"col-6"},r.createElement(h,{students:m.completed})),r.createElement("div",{className:"col-6"},r.createElement(I.i,{osCount:null===(t=e.videoViews)||void 0===t?void 0:t.osCount})),r.createElement("div",{className:"col-6"},r.createElement(W.b,{engagement:e.aggregateEngagement,heatmapAppLink:e.interactiveInsightsAppLinks.heatmapAppLink})))))))}}}]);
2
- //# sourceMappingURL=4948-30af9a446d-lite.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/4948-30af9a446d-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/analytics/utils/InteractiveUtils.ts","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","file:///app/packages/libs/shared/src/apps/analytics/components/insights/average-attempts/insight-average-attempts.scss","file:///app/packages/libs/shared/src/apps/analytics/components/insights/average-attempts/InsightAverageAttempts.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/average-score/insight-average-score.scss","file:///app/packages/libs/shared/src/apps/analytics/components/insights/average-score/InsightAverageScore.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/completed-students/InsightCompletedStudents.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/easiest-question/InsightEasiestQuestion.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/hardest-question/InsightHardestQuestion.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/high-scoring-students/InsightHighScoringStudents.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/low-scoring-students/InsightLowScoringStudents.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/marking-required/InsightMarkingRequired.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/not-completed-students/InsightNotCompletedStudents.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/insights-mask/InsightsMarkingRequiredMask.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/interactive-insights-overview/partial-loading/partial-interactive-insights-overview.scss","file:///app/packages/projects/lite/src/apps/my-shares/components/interactive-insights-overview/partial-loading/PartialInteractiveInsightsOverview.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/interactive-insights-overview/InteractiveInsightsOverview.tsx"],"sourcesContent":["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, ScoreThresholds } 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(\n interactive: Interactive,\n results: InteractiveResultSet,\n scoreThreshold?: ScoreThresholds\n): 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 >= (scoreThreshold?.HIGH || ScoreThresholdDefaults.HIGH))\n groups.highScore.push(withSummary);\n \n if (withSummary.summary.percentCorrect < (scoreThreshold?.MODERATE || 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);\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}","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}","// extracted by mini-css-extract-plugin\nexport default {\"tealChart\":\"lZZf0\",\"grayChart\":\"wJQc4\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightChart } from 'libs/shared/apps/analytics/components/insight-chart/InsightChart';\nimport { CHART_FONT_STYLES } from 'libs/shared/apps/analytics/constants/ChartStyles';\nimport { ChartData } from 'libs/shared/apps/analytics/interfaces/ChartData';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './insight-average-attempts.scss';\n\nconst namespace = 'shared.insightAverageAttempts';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightAverageAttemptsProps {\n students: StudentResultsWithSummary[];\n}\n\nexport function InsightAverageAttempts(props: InsightAverageAttemptsProps) {\n const categoriesData = getCategoriesData();\n const highestAttemptsCount = getHighestAttemptsCount();\n const averageAttempts = getAverageAttempts();\n const chartData = getChartData();\n\n function getCategoriesData() {\n const categoriesData = props.students.reduce((acc, student) => {\n const attemptsCategory = student.summary.attempts.toString();\n\n if (!(attemptsCategory in acc)) {\n Object.assign(acc, { [attemptsCategory]: 0 });\n }\n\n acc[attemptsCategory]++;\n\n return acc;\n }, {} as HashObject);\n return Object.keys(categoriesData).length ? categoriesData : { 0: 0 };\n }\n\n function getHighestAttemptsCount() {\n return Math.max(...Object.keys(categoriesData).map(category => categoriesData[category]));\n }\n\n function getAverageAttempts(): number[] {\n return Object.keys(categoriesData).reduce((acc, category) => {\n const userCount = categoriesData[category];\n return userCount === highestAttemptsCount ? [ ...acc, category ] : acc;\n }, []);\n }\n\n function calculateAverage() {\n const total = Object.entries(categoriesData).reduce(\n (acc, [ attemptsCount, usersCount ]) => {\n acc.totalAttempts += +attemptsCount * usersCount;\n acc.totalUsers += usersCount;\n return acc;\n },\n { totalAttempts: 0, totalUsers: 0 }\n );\n\n return total.totalUsers === 0 ? 0 : Math.round(total.totalAttempts / total.totalUsers * 100) / 100;\n }\n\n function getChartData(): ChartData {\n const noAttempts = categoriesData[0] === 0;\n\n return {\n categories: Object.keys(categoriesData),\n series: [{\n type: 'column',\n color: categoriesData[0] ? '#EAEAEA' : '#40C2BB',\n borderRadius: 4,\n dataLabels: {\n enabled: !noAttempts,\n style: CHART_FONT_STYLES,\n inside: false,\n overflow: 'allow',\n crop: false\n },\n data: Object.keys(categoriesData).map(category => {\n const highestCount = highestAttemptsCount !== 0 && categoriesData[category] === highestAttemptsCount;\n\n return {\n className: `${noAttempts ? styles.grayChart : styles.tealChart} ${categoriesData[category] !== highestAttemptsCount && categoriesData[category] !== 0 ? 'opacity-25' : ''}`,\n borderWidth: highestCount ? 2 : 0,\n borderColor: highestCount ? 'black' : '',\n y: categoriesData[category]\n };\n })\n }]\n };\n }\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Refresh}\n svgClassName='bg-light-purple text-purple'\n >\n <p>\n {averageAttempts.length\n ? <Text namespace={namespace} phrase='averageAttempts' options={{ smartCount: calculateAverage() }} />\n : <Text namespace={namespace} phrase='noAttempts' />\n }\n </p>\n\n <div className='mt-auto'>\n <InsightChart label={getPhrase('attempts')} chartData={chartData} />\n </div>\n </InsightCard>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"redChart\":\"G7zOw\",\"yellowChart\":\"k34mm\",\"greenChart\":\"vBneA\",\"blueChart\":\"RPTWm\",\"grayChart\":\"k4JFZ\",\"borderDark\":\"LWor3\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightChart } from 'libs/shared/apps/analytics/components/insight-chart/InsightChart';\nimport { ChartData } from 'libs/shared/apps/analytics/interfaces/ChartData';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './insight-average-score.scss';\n\nconst namespace = 'shared.insightAverageScore';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\n\ninterface InsightAverageScoreProps {\n students: StudentResultsWithSummary[];\n}\n\nexport function InsightAverageScore(props: InsightAverageScoreProps) {\n function getChartData(): ChartData {\n const scoreCount = Array(11).fill(0);\n const scorePercentageData = props.students.reduce((acc, value) => {\n const scoreIndex = Math.floor(value.summary.percentCorrect * 10);\n acc[scoreIndex]++;\n\n return acc;\n }, scoreCount);\n\n const PERCENTAGES = [ '0', '10', '20', '30', '40', '50', '60', '70', '80', '90', '100' ];\n\n return {\n categories: PERCENTAGES,\n series: [{\n type: 'column',\n color: '#4E9ACE',\n borderRadius: 4,\n data: scorePercentageData.map((score, index) => {\n const percentageCategory = Number(PERCENTAGES[index]);\n\n const getChartColour = (percentage: number, score: number) => {\n if (score === 0)\n return styles.grayChart;\n if (percentage < 50)\n return styles.redChart;\n if (percentage < 70)\n return styles.yellowChart;\n if (percentage < 90)\n return styles.greenChart;\n\n return styles.blueChart;\n };\n\n return {\n className: `${getChartColour(percentageCategory, score)}`,\n y: score\n };\n })\n }]\n };\n }\n\n function getAverageNumbers() {\n const averageScores = props.students.map(student => student.summary.percentCorrect);\n const averagePercentage = averageScores.reduce((a, b) => a + b, 0) / averageScores.length;\n const totalQuestions = ArrayHelper.last(\n ArrayHelper.last(props.students).results\n ).attempts.length;\n\n return {\n averageScore: Math.round(totalQuestions * averagePercentage),\n totalQuestions,\n averagePercentage: (averagePercentage * 100).toFixed(1)\n };\n }\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Analytics}\n svgClassName='bg-light-orange text-orange'\n >\n <p>\n {props.students.length\n ? <Text namespace={namespace} phrase='averageScore' options={getAverageNumbers()} />\n : <Text namespace={namespace} phrase='noAnswers' />\n }\n </p>\n\n <InsightChart label={`${getPhrase('studentScores')} (%)`} chartData={getChartData()} />\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { AnonSessions } from 'libs/shared/apps/analytics/hooks/UseAnonSessions';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { getUserOrAnonSession } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightCompletedStudents';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightCompletedStudentsProps {\n students: StudentResultsWithSummary[];\n imageCdnUrl: string;\n imageUrl: string;\n resultsAppLink: Core.AppLink;\n anonymiseUsers: boolean;\n anonSessions?: AnonSessions;\n}\n\nexport function InsightCompletedStudents(props: InsightCompletedStudentsProps) {\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Flag}\n svgClassName='bg-light-indigo text-indigo'\n count={props.students.length}\n >\n <InsightStudentList\n students={props.students.map(student => {\n return { ...getUserOrAnonSession(student, props.anonSessions), percentage: student.summary.percentCorrect };\n })}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.imageUrl}\n description={getPhrase('completedStudents')}\n appLink={props.resultsAppLink}\n appLinkText={getPhrase('viewAll')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InteractionWithResultsSummary } from 'libs/shared/apps/analytics/interfaces/InteractionWithResultsSummary';\nimport { getInteractionResultsSummary } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { PercentageIndicator, PercentageIndicatorLayout } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { getInteractions } from 'libs/shared/utils/InteractiveHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightEasiestQuestion';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightEasiestQuestionProps {\n interactive: Interactive;\n interactiveMetadata: InteractiveMetadata;\n results: InteractiveResultSet;\n questionsAppLink: Core.AppLink;\n}\n\nexport function InsightEasiestQuestion(props: InsightEasiestQuestionProps) {\n const easiestQuestion = React.useMemo(\n () => getEasiestQuestion(props.interactive, props.results),\n [props.results.students.length]\n );\n\n function getEasiestQuestion(interactive: Interactive, results: InteractiveResultSet): InteractionWithResultsSummary {\n const interactions: InteractionWithResultsSummary[] = getInteractions(interactive).map(i => ({\n ...i,\n resultsSummary: getInteractionResultsSummary(i, results)\n }));\n\n const answeredInteractions = interactions.filter(i =>\n !!i.resultsSummary.answered && !i.resultsSummary.awaitingMarking);\n\n const sortedInteractions = ArrayHelper.sortBy(\n answeredInteractions,\n i => i.resultsSummary.percentCorrect\n );\n\n return ArrayHelper.last(sortedInteractions);\n }\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.StarOutline}\n svgClassName='bg-light-blue text-blue'\n >\n <div className='d-flex align-items-center'>\n <PercentageIndicator\n percentage={easiestQuestion?.resultsSummary?.percentCorrect}\n layout={PercentageIndicatorLayout.LabelInside}\n />\n {easiestQuestion\n ? <div className='d-flex ms-2'>\n <InteractionLabel interaction={easiestQuestion} iconClassName='flex-shrink-0' />\n </div>\n : <span className='ms-2'>{getPhrase('noAnswers')}</span>\n }\n </div>\n\n {easiestQuestion && (\n <AppLink\n appLink={{\n ...props.questionsAppLink,\n params: {\n ...props.questionsAppLink.params as HashObject,\n sortBy: 'score_desc'\n }\n }}\n className='text-info'>\n <Text namespace={namespace} phrase='viewQuestions' />\n </AppLink>\n )}\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InteractionWithResultsSummary } from 'libs/shared/apps/analytics/interfaces/InteractionWithResultsSummary';\nimport { getInteractionResultsSummary } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { PercentageIndicator, PercentageIndicatorLayout } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { getInteractions } from 'libs/shared/utils/InteractiveHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightHardestQuestion';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightHardestQuestionProps {\n interactive: Interactive;\n interactiveMetadata: InteractiveMetadata;\n results: InteractiveResultSet;\n questionsAppLink: Core.AppLink;\n}\n\nexport function InsightHardestQuestion(props: InsightHardestQuestionProps) {\n const hardestQuestion = React.useMemo(\n () => getHardestQuestion(props.interactive, props.results),\n [props.results.students.length]\n );\n\n function getHardestQuestion(interactive: Interactive, results: InteractiveResultSet): InteractionWithResultsSummary {\n const interactions: InteractionWithResultsSummary[] = getInteractions(interactive).map(i => ({\n ...i,\n resultsSummary: getInteractionResultsSummary(i, results)\n }));\n\n const answeredInteractions = interactions.filter(i =>\n !!i.resultsSummary.answered && !i.resultsSummary.awaitingMarking);\n\n const sortedInteractions = ArrayHelper.sortBy(\n answeredInteractions,\n i => i.resultsSummary.percentCorrect\n );\n\n return ArrayHelper.first(sortedInteractions);\n }\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.QuestionMark}\n svgClassName='bg-light-orange text-orange'\n >\n <div className='d-flex align-items-center'>\n <PercentageIndicator\n percentage={hardestQuestion?.resultsSummary?.percentCorrect}\n layout={PercentageIndicatorLayout.LabelInside}\n />\n {hardestQuestion\n ? <div className='d-flex ms-2'>\n <InteractionLabel interaction={hardestQuestion} iconClassName='flex-shrink-0' />\n </div>\n : <span className='ms-2'>{getPhrase('noAnswers')}</span>\n }\n </div>\n\n {hardestQuestion && (\n <AppLink\n appLink={{\n ...props.questionsAppLink,\n params: {\n ...props.questionsAppLink.params as HashObject,\n sortBy: 'score_asc'\n }\n }}\n className='text-info'\n >\n <Text namespace={namespace} phrase='viewQuestions' />\n </AppLink>\n )}\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { AnonSessions } from 'libs/shared/apps/analytics/hooks/UseAnonSessions';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { getUserOrAnonSession } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightHighScoringStudents';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightHighScoringStudentsProps {\n students: StudentResultsWithSummary[];\n imageCdnUrl: string;\n greenChartImageUrl: string;\n resultsAppLink: Core.AppLink;\n completed: StudentResultsWithSummary[];\n anonymiseUsers?: boolean;\n anonSessions?: AnonSessions;\n}\n\nexport function InsightHighScoringStudents(props: InsightHighScoringStudentsProps) {\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Trophy}\n svgClassName='bg-light-teal text-teal'\n count={props.students.length}\n >\n <InsightStudentList\n students={props.students.map(student => {\n return { ...getUserOrAnonSession(student, props.anonSessions), percentage: student.summary.percentCorrect };\n })}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.greenChartImageUrl}\n description={getPhrase(props.completed.length ? 'noStudents' : 'highScore')}\n appLink={{\n ...props.resultsAppLink,\n params: {\n ...props.resultsAppLink.params as HashObject,\n sortBy: 'score_desc'\n }\n }}\n appLinkText={getPhrase('viewByHighest')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { AnonSessions } from 'libs/shared/apps/analytics/hooks/UseAnonSessions';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { getUserOrAnonSession } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightLowScoringStudents';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightLowScoringStudentsProps {\n students: StudentResultsWithSummary[];\n imageCdnUrl: string;\n redChartImageUrl: string;\n heartImageUrl: string;\n resultsAppLink: Core.AppLink;\n completed: StudentResultsWithSummary[];\n anonymiseUsers: boolean;\n anonSessions?: AnonSessions;\n}\n\nexport function InsightLowScoringStudents(props: InsightLowScoringStudentsProps) {\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Hand}\n svgClassName='bg-light-red text-red'\n count={props.students.length}\n >\n <InsightStudentList\n students={props.students.map(student => {\n return { ...getUserOrAnonSession(student, props.anonSessions), percentage: student.summary.percentCorrect };\n })}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.completed.length ? props.heartImageUrl : props.redChartImageUrl}\n description={getPhrase(props.completed.length ? 'doingWell' : 'lowScore')}\n appLink={{\n ...props.resultsAppLink,\n params: {\n ...props.resultsAppLink.params as HashObject,\n sortBy: 'score_asc'\n }\n }}\n appLinkText={getPhrase('viewByLowest')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { UserOrAnonSession } from 'libs/shared/apps/analytics/interfaces/UserOrAnonSession';\nimport { FilterStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\n\nconst namespace = 'shared.insightMarkingRequired';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\n\ninterface InsightMarkingRequiredProps {\n students: UserOrAnonSession[];\n imageCdnUrl: string;\n imageUrl: string;\n resultsAppLink: Core.AppLink;\n anonymiseUsers: boolean;\n}\n\nexport function InsightMarkingRequired(props: InsightMarkingRequiredProps) {\n const markingRequiredFilter: FilterStudentsBy = 'marking_required';\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Hand}\n svgClassName='bg-light-blue text-blue'\n count={props.students.length}\n >\n <InsightStudentList\n students={props.students}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.imageUrl}\n description={getPhrase('studentsRequireMarking')}\n appLink={{\n ...props.resultsAppLink,\n params: {\n filterBy: markingRequiredFilter\n }\n }}\n appLinkText={getPhrase('viewAll')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { FilterStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { User } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightNotCompletedStudents';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightNotCompletedStudentsProps {\n markingRequiredStudents: StudentResultsWithSummary[];\n completedStudents: StudentResultsWithSummary[];\n notCompletedStudents: StudentResultsWithSummary[];\n classroomStudents: User[];\n imageCdnUrl: string;\n imageUrl: string;\n resultsAppLink: Core.AppLink;\n anonymiseUsers: boolean;\n}\n\nexport function InsightNotCompletedStudents(props: InsightNotCompletedStudentsProps) {\n const notCompletedStudents = getNotCompletedStudents();\n \n function getNotCompletedStudents() {\n const markingRequiredStudentIds = props.markingRequiredStudents.map(student => student?.user.id);\n const completedStudentIds = props.completedStudents.map(student => student?.user.id);\n \n const notStartedStudents = props.classroomStudents.filter(student => {\n return !markingRequiredStudentIds.includes(student.id) &&\n !completedStudentIds.includes(student.id);\n });\n \n return ArrayHelper.uniq([\n ...props.notCompletedStudents.map(student => student.user),\n ...notStartedStudents\n ], 'id');\n }\n \n const notCompletedFilter: FilterStudentsBy = 'not_completed';\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Puzzle}\n svgClassName='bg-light-teal text-teal'\n count={notCompletedStudents.length}\n >\n <InsightStudentList\n students={notCompletedStudents}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.imageUrl}\n description={getPhrase('completed')}\n appLink={{\n ...props.resultsAppLink,\n params: notCompletedFilter\n }}\n appLinkText={getPhrase('viewAll')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { FilterStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport styles from './insights-mask.scss';\n\nconst namespace = 'lite.insightsMask';\n\ninterface InsightsMarkingRequiredMaskProps extends React.PropsWithChildren {\n requiresMarking: number;\n appLink: Core.AppLink;\n hideMarkingRequiredMask: () => void;\n}\n\nexport function InsightsMarkingRequiredMask(props: InsightsMarkingRequiredMaskProps) {\n const filterBy: FilterStudentsBy = 'marking_required';\n\n return (\n <div className={`${props.requiresMarking && styles.mask} position-relative`}>\n <div className={props.requiresMarking ? 'position-absolute top-0' : ''}>{props.children}</div>\n <div\n className={props.requiresMarking ? `${styles.backdrop} d-flex flex-column align-items-center justify-content-start py-5` : ''}\n >\n {!!props.requiresMarking && (\n <div className='text-center w-50'>\n <img src={ImageUrls.Insights.MARKING_RESPONSES} className='mb-3' width={288} />\n <h2 className='h3 mb-3'><Text namespace={namespace} phrase='markHeading' /></h2>\n <p className='mb-3'><Text namespace={namespace} phrase='markDescription' /></p>\n <IconButton\n svgName={cvSvgLibrary.Check}\n className='btn btn-dark mb-3'\n appLink={{\n ...props.appLink,\n params: {\n ...props.appLink.params as HashObject,\n filterBy\n }\n }}\n >\n <Text namespace={namespace} phrase='markResponses' options={{ smartCount: props.requiresMarking }} />\n </IconButton>\n <button className='btn btn-link d-block p-0 mx-auto' onClick={props.hideMarkingRequiredMask}><Text namespace={namespace} phrase='seeIncomplete' /></button>\n </div>\n )}\n </div>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialInsights\":\"pG0Jh\"};","import React from 'react';\n\nimport styles from './partial-interactive-insights-overview.scss';\n\nexport function PartialInteractiveInsightsOverview() {\n return (\n <div>\n <h2 className='h4 w-25 partial-loading-background'>&nbsp;</h2>\n <div className='row g-3 mb-5'>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n </div>\n\n <h2 className='h4 w-25 partial-loading-background'>&nbsp;</h2>\n <div className='row g-3 mb-5'>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n </div>\n\n <h2 className='h4 w-25 partial-loading-background'>&nbsp;</h2>\n <div className='row g-3 mb-5'>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { InsightAverageAttempts } from 'libs/shared/apps/analytics/components/insights/average-attempts/InsightAverageAttempts';\nimport { InsightAverageScore } from 'libs/shared/apps/analytics/components/insights/average-score/InsightAverageScore';\nimport { InsightCompletedStudents } from 'libs/shared/apps/analytics/components/insights/completed-students/InsightCompletedStudents';\nimport { InsightDevices } from 'libs/shared/apps/analytics/components/insights/devices/InsightDevices';\nimport { InsightEasiestQuestion } from 'libs/shared/apps/analytics/components/insights/easiest-question/InsightEasiestQuestion';\nimport { InsightHardestQuestion } from 'libs/shared/apps/analytics/components/insights/hardest-question/InsightHardestQuestion';\nimport { InsightHeatmap } from 'libs/shared/apps/analytics/components/insights/heatmap/InsightHeatmap';\nimport { InsightHighScoringStudents } from 'libs/shared/apps/analytics/components/insights/high-scoring-students/InsightHighScoringStudents';\nimport { InsightLowScoringStudents } from 'libs/shared/apps/analytics/components/insights/low-scoring-students/InsightLowScoringStudents';\nimport { InsightMarkingRequired } from 'libs/shared/apps/analytics/components/insights/marking-required/InsightMarkingRequired';\nimport { InsightNotCompletedStudents } from 'libs/shared/apps/analytics/components/insights/not-completed-students/InsightNotCompletedStudents';\nimport { AnonSessions } from 'libs/shared/apps/analytics/hooks/UseAnonSessions';\nimport { BaseAnalyticsEventResponse } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { UserOrAnonSession } from 'libs/shared/apps/analytics/interfaces/UserOrAnonSession';\nimport { getUserOrAnonSession } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { groupStudents } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ScoreThresholdInsights } from 'libs/shared/constants/ScoreThresholds';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { BasePaginatedCollection, Config, Engagement, Interactive, InteractiveMetadata, InteractiveResultSet, User } from 'libs/shared/interfaces';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport { InsightsMarkingRequiredMask } from 'apps/my-shares/components/insights-mask/InsightsMarkingRequiredMask';\nimport { InsightsShareMask } from 'apps/my-shares/components/insights-mask/InsightsShareMask';\nimport { PartialInteractiveInsightsOverview } from 'apps/my-shares/components/interactive-insights-overview/partial-loading/PartialInteractiveInsightsOverview';\n\nconst namespace = 'insights.interactiveInsightsOverview';\n\ninterface InteractiveInsightsOverviewProps {\n interactive: Interactive;\n results: InteractiveResultSet;\n interactiveMetadata: InteractiveMetadata;\n videoViews: BaseAnalyticsEventResponse;\n classroomStudents: BasePaginatedCollection<User>;\n aggregateEngagement: Engagement\n interactiveInsightsAppLinks: HashObject;\n classroomFilterOnly?: boolean;\n config: Config;\n params: HashObject;\n anonymiseUsers: boolean;\n hasShared: boolean;\n hasDataLoaded: boolean;\n shareId?: string;\n anonSessions?: AnonSessions;\n}\n\nexport function InteractiveInsightsOverview(props: InteractiveInsightsOverviewProps) {\n const [ hideMarkingRequiredMask, setHideMarkingRequiredMask ] = React.useState(false);\n\n const { hasShareFlowV2 } = useSettings(null);\n\n const studentGroups = props.hasDataLoaded && groupStudents(props.interactive, props.results, ScoreThresholdInsights);\n\n function getUsers(studentResult: StudentResultsWithSummary[]): UserOrAnonSession[] {\n return studentResult.map(student => getUserOrAnonSession(student, props.anonSessions));\n }\n\n return (\n <>\n {!props.hasDataLoaded && <PartialInteractiveInsightsOverview />}\n\n {props.hasDataLoaded &&\n <InsightsShareMask\n video={props.interactiveMetadata}\n hasShared={props.hasShared}\n hasShareFlowV2={hasShareFlowV2}\n shareId={props.shareId}\n >\n <section className='mb-5'>\n <h2 className='h4'>\n <Text namespace={namespace} phrase='studentResponses' />\n <span>: {props.results.students.length}{props.classroomStudents ? `/${props.classroomStudents.data.length}` : ''}</span>\n </h2>\n <div className='row g-3'>\n <div className='col'>\n <InsightMarkingRequired\n imageUrl={ImageUrls.Insights.SPEECH_BUBBLE_ASTERISK}\n resultsAppLink={props.interactiveInsightsAppLinks.resultsAppLink}\n imageCdnUrl={props.config.imageCdnUrl}\n students={getUsers(studentGroups.markingRequired)}\n anonymiseUsers={props.anonymiseUsers}\n />\n </div>\n {props.classroomFilterOnly && (\n <div className='col'>\n <InsightNotCompletedStudents\n markingRequiredStudents={studentGroups.markingRequired}\n completedStudents={studentGroups.completed}\n notCompletedStudents={studentGroups.notCompleted}\n classroomStudents={props.classroomStudents.data}\n imageCdnUrl={props.config.imageCdnUrl}\n imageUrl={ImageUrls.Insights.JIGSAW}\n resultsAppLink={props.interactiveInsightsAppLinks.resultsAppLink}\n anonymiseUsers={props.anonymiseUsers}\n />\n </div>\n )}\n <div className='col'>\n <InsightCompletedStudents\n students={studentGroups.completed}\n imageCdnUrl={props.config.imageCdnUrl}\n imageUrl={ImageUrls.Insights.AVATAR}\n resultsAppLink={props.interactiveInsightsAppLinks.resultsAppLink}\n anonymiseUsers={props.anonymiseUsers}\n anonSessions={props.anonSessions}\n />\n </div>\n </div>\n </section>\n <InsightsMarkingRequiredMask\n requiresMarking={!hideMarkingRequiredMask && studentGroups.markingRequired.length}\n appLink={props.interactiveInsightsAppLinks.resultsAppLink}\n hideMarkingRequiredMask={() => setHideMarkingRequiredMask(true)}\n >\n <section className='mb-5'>\n <h2 className='h4'>\n <Text namespace={namespace} phrase='studentsPerformance' />\n </h2>\n <div className='row g-3'>\n <div className='col-6'>\n <InsightLowScoringStudents\n redChartImageUrl={ImageUrls.Insights.RED_CHART}\n heartImageUrl={ImageUrls.Insights.SPEECH_BUBBLE_HEART}\n resultsAppLink={props.interactiveInsightsAppLinks.resultsAppLink}\n imageCdnUrl={props.config.imageCdnUrl}\n students={studentGroups.lowScore}\n completed={studentGroups.completed}\n anonymiseUsers={props.anonymiseUsers}\n anonSessions={props.anonSessions}\n />\n </div>\n <div className='col-6'>\n <InsightHighScoringStudents\n greenChartImageUrl={ImageUrls.Insights.GREEN_CHART}\n resultsAppLink={props.interactiveInsightsAppLinks.resultsAppLink}\n imageCdnUrl={props.config.imageCdnUrl}\n students={studentGroups.highScore}\n completed={studentGroups.completed}\n anonymiseUsers={props.anonymiseUsers}\n anonSessions={props.anonSessions}\n />\n </div>\n <div className='col-6'>\n <InsightHardestQuestion\n interactive={props.interactive}\n interactiveMetadata={props.interactiveMetadata}\n results={props.results}\n questionsAppLink={props.interactiveInsightsAppLinks.questionsAppLink}\n />\n </div>\n <div className='col-6'>\n <InsightEasiestQuestion\n interactive={props.interactive}\n interactiveMetadata={props.interactiveMetadata}\n results={props.results}\n questionsAppLink={props.interactiveInsightsAppLinks.questionsAppLink}\n />\n </div>\n </div>\n </section>\n <section className='mb-5'>\n <h2 className='h4'>\n <Text namespace={namespace} phrase='classPerformance' />\n </h2>\n <div className='row g-3'>\n <div className='col-6'>\n <InsightAverageScore\n students={studentGroups.completed}\n />\n </div>\n <div className='col-6'>\n <InsightAverageAttempts\n students={studentGroups.completed}\n />\n </div>\n <div className='col-6'>\n <InsightDevices\n osCount={props.videoViews?.osCount}\n />\n </div>\n <div className='col-6'>\n <InsightHeatmap\n engagement={props.aggregateEngagement}\n heatmapAppLink={props.interactiveInsightsAppLinks.heatmapAppLink}\n />\n </div>\n </div>\n </section>\n </InsightsMarkingRequiredMask>\n </InsightsShareMask>\n }\n </>\n );\n}"],"names":["groupStudents","interactive","results","scoreThreshold","groups","markingRequired","lowScore","highScore","completed","notCompleted","numInteractions","length","students","forEach","s","withSummary","summary","getStudentResultsSummary","awaitingMarking","push","attempts","percentCorrect","HIGH","MODERATE","sortedLowScore","sortedHighScore","getInteractionById","interactionId","find","i","id","toString","getMarkedAnswerId","answer","questionId","resultId","getMarkedStatus","studentResults","markedAnswers","result","studentResponse","answers","every","a","status","getInteractionResultsSummary","interaction","numStudents","numCorrect","answered","unanswered","correctness","correct","interactions","interactionIds","Set","map","answeredInteractions","filter","has","InteractionCorrectness","InteractiveAnswerStatus","notApplicable","isMissingWordCorrect","getStudentAnswer","items","actionableItems","isCorrect","name","trim","toLowerCase","isMultipleChoiceCorrect","studentAnswer","getGetStudentAnswer","attempt","wrapIsMultipleChoiceCorrect","text","wrapIsMarkableAnswerMarkedCorrect","item","isMarkableAnswerMarkedCorrect","IsCorrectLookup","InteractiveCorrectnessHelper","isInteractionCorrect","isCorrectFn","typeId","interactionRequiresAnswer","flattenInteractions","timepoints","getStudentResult","getStudentAttempt","getInteractions","namespace","getPhrase","LanguageService","InsightAverageAttempts","props","noAttempts","total","categoriesData","reduce","acc","student","attemptsCategory","Object","assign","keys","getCategoriesData","highestAttemptsCount","Math","max","category","averageAttempts","chartData","categories","series","type","color","borderRadius","dataLabels","enabled","style","inside","overflow","crop","data","highestCount","className","borderWidth","borderColor","y","InsightCard","title","svgName","svgClassName","Text","phrase","options","smartCount","entries","attemptsCount","usersCount","totalAttempts","totalUsers","round","InsightChart","label","InsightAverageScore","averageScores","averagePercentage","b","totalQuestions","ArrayHelper","averageScore","toFixed","scoreCount","Array","fill","scorePercentageData","value","floor","PERCENTAGES","score","index","percentageCategory","Number","percentage","getChartColour","InsightCompletedStudents","count","InsightStudentList","anonSessions","imageCdnUrl","imageUrl","description","appLink","resultsAppLink","appLinkText","anonymiseUsers","InsightEasiestQuestion","easiestQuestion","resultsSummary","sortedInteractions","PercentageIndicator","layout","InteractionLabel","iconClassName","AppLink","questionsAppLink","params","sortBy","InsightHardestQuestion","hardestQuestion","InsightHighScoringStudents","greenChartImageUrl","InsightLowScoringStudents","heartImageUrl","redChartImageUrl","InsightMarkingRequired","filterBy","InsightNotCompletedStudents","markingRequiredStudentIds","completedStudentIds","notStartedStudents","notCompletedStudents","markingRequiredStudents","user","completedStudents","classroomStudents","includes","InsightsMarkingRequiredMask","requiresMarking","children","src","ImageUrls","width","IconButton","onClick","hideMarkingRequiredMask","PartialInteractiveInsightsOverview","InteractiveInsightsOverview","studentResult","setHideMarkingRequiredMask","hasShareFlowV2","useSettings","studentGroups","hasDataLoaded","InsightsShareMask","video","interactiveMetadata","hasShared","shareId","interactiveInsightsAppLinks","config","classroomFilterOnly","InsightDevices","osCount","videoViews","InsightHeatmap","engagement","aggregateEngagement","heatmapAppLink"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[549],{70376:(e,t,a)=>{a.d(t,{W:()=>s});var n=a(32735),r=a(91967);function i(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,n=Array(t);a<t;a++)n[a]=e[a];return n}var o=5e3;function s(e){var t,a,s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:o,l=(t=n.useState(!1),a=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var n,r,i,o,s=[],l=!0,c=!1;try{if(i=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;l=!1}else for(;!(l=(n=i.call(a)).done)&&(s.push(n.value),s.length!==t);l=!0);}catch(e){c=!0,r=e}finally{try{if(!l&&null!=a.return&&(o=a.return(),Object(o)!==o))return}finally{if(c)throw r}}return s}}(t,a)||function(e,t){if(e){if("string"==typeof e)return i(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?i(e,t):void 0}}(t,a)||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.")}()),c=l[0],u=l[1],d=n.useRef(null),m=function(){u((function(e){return!e})),d.current=window.setTimeout(m,s)};return n.useEffect((function(){d.current=window.setTimeout(m,s)}),[]),n.useEffect((function(){r.q.isFunction(e)&&e()}),[c]),function(){return window.clearTimeout(d.current)}}},5255:(e,t,a)=>{a.d(t,{Y:()=>s});var n=a(70376),r=a(20354),i=a(30439);function o(e){return o="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},o(e)}function s(e){var t,a=r.a.useGetFetch(),s=e&&i.o.getAnonSessions(e),l=r.a.useBasicFetch(s);return(0,n.W)((function(){return a(s)}),5e3),(null===(t=l.data)||void 0===t?void 0:t.length)?l.data.reduce((function(e,t){return Object.assign(Object.assign({},e),(a={},n=t.sessionId,r=t,(n=function(e){var t=function(e){if("object"!=o(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var a=t.call(e,"string");if("object"!=o(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==o(t)?t:t+""}(n))in a?Object.defineProperty(a,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):a[n]=r,a));var a,n,r}),{}):{}}},94644:(e,t,a)=>{a.d(t,{r:()=>u});var n=a(50242),r=a(81886),i=a(67058),o=a(14553),s=a(49267),l=a(49075),c={notFound:i.d,forbidden:{rating:o.q,yearLevel:o.q,region:s.a,privacy:o.q},badRequest:l._,internalServerError:l._};function u(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e){var i;i="number"==typeof e?e:e.status;var o=Object.assign(Object.assign({},c),t);i&&r.Q.Ry.isStatusCodeError(i)&&(i!==n.o.InternalServer?i!==n.o.NotFound?i!==n.o.Forbidden?a.badRequest||r.Q.Ry.throw(new o.badRequest):a.forbidden||r.Q.Ry.throw(new o.forbidden.privacy):a.notFound||r.Q.Ry.throw(new o.notFound):a.internalServerError||r.Q.Ry.throw(new l._))}}},17913:(e,t,a)=>{a.d(t,{u:()=>o});var n=a(97395),r=a(110),i=a(62875),o={individualEngagement:function(e,t,a,r){var o=Object.assign({objectId:e},t);return a&&(o.sharerId=a),r&&(o.includeAnonViews=!0),{url:n._.urlBuilder("{gateway}/v1/analytics/heat-map",o),key:(0,i.H)("engagement:".concat(e,":").concat(r),t,a),formatData:function(e){var t;return Object.assign(Object.assign({},e),{data:null===(t=e.data)||void 0===t?void 0:t.map((function(e){var t;return Object.assign(Object.assign({},e),{heatMap:null!==(t=e.heatMap)&&void 0!==t?t:[]})}))})},normalize:!1}},aggregateEngagement:function(e,t,a,r){var o=Object.assign({objectId:e},t);return a&&(o.sharerId=a),r&&(o.includeAnonViews=!0),{url:n._.urlBuilder("{gateway}/v1/analytics/heat-map/aggregations",o),key:(0,i.H)("aggregate:engagement:".concat(e,":").concat(r),t,a),formatData:function(e){var t;return Object.assign(Object.assign({},e),{heatMap:null!==(t=e.heatMap)&&void 0!==t?t:[]})},normalize:!1}},views:function(e,t,a,o){var s=Object.assign(Object.assign({},e),{timeOffset:r.O.getTimezoneOffset()});return t&&(s.objectId=t),a&&(s.sharerId=a),o&&(s.includeAnonViews=!0),{url:n._.urlBuilder("{gateway}/v1/analytics/video-views",s),key:(0,i.H)("video:views:".concat(t,":").concat(o),e,a),normalize:!1}}}},39902:(e,t,a)=>{a.d(t,{F:()=>v,f:()=>m});var n=a(32735),r=a(20354),i=a(75896);function o(e){return function(e){if(Array.isArray(e))return l(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||s(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function s(e,t){if(e){if("string"==typeof e)return l(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?l(e,t):void 0}}function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,n=Array(t);a<t;a++)n[a]=e[a];return n}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 u(e,t,a){return(t=function(e){var t=function(e){if("object"!=c(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var a=t.call(e,"string");if("object"!=c(a))return a;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:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}var d=50;function m(e,t){var a=i.m.chunk(e,d).map((function(e){return t(i.m.uniq(e))})),n=r.a.useBasicFetchAll(a),o=i.m.flatten(n.data),s=n.data.length?o.reduce((function(e,t){return Object.assign(Object.assign({},e),u({},t.id,t))}),{}):null;return{itemsArr:o,items:s,isFetching:n.isFetching}}function v(e,t,a){var l,m,v,f,g=a||function(e){return"object"===c(e)?e.id:e},h=n.useRef(new Set),p=(v=n.useState([]),f=2,function(e){if(Array.isArray(e))return e}(v)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var n,r,i,o,s=[],l=!0,c=!1;try{if(i=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;l=!1}else for(;!(l=(n=i.call(a)).done)&&(s.push(n.value),s.length!==t);l=!0);}catch(e){c=!0,r=e}finally{try{if(!l&&null!=a.return&&(o=a.return(),Object(o)!==o))return}finally{if(c)throw r}}return s}}(v,f)||s(v,f)||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.")}()),y=p[0],b=p[1];n.useEffect((function(){if(null==e?void 0:e.length){var a=[];e.forEach((function(e){var t=g(e);h.current.has(t)||(a.push(e),h.current.add(t))})),a.length&&b((function(e){return[].concat(o(e),o(i.m.chunk(a,d).map(t)))}))}}),[null==e?void 0:e.length]);var E=r.a.useBasicFetchAll(y),w=i.m.flatten(E.data),I=E.data.length?w.reduce((function(e,t){return Object.assign(Object.assign({},e),u({},g(t),t))}),{}):null;return{hasFirstRequestCompleted:!!(null===(m=null===(l=E.responses)||void 0===l?void 0:l[0])||void 0===m?void 0:m.hasCompleted),itemsArr:w,items:I,isFetching:E.isFetching}}},91286:(e,t,a)=>{a.d(t,{v:()=>o});var n=a(32735),r=a(94644);function i(e){return e.map((function(e){return e.statusCode})).join(":")}function o(e,t,a){var o=Array.isArray(e)?e:[e];(0,n.useEffect)((function(){o.forEach((function(e){(0,r.r)(e.statusCode,t,a)}))}),[i(o),t,a])}},50782:(e,t,a)=>{a.d(t,{R:()=>I});var n=a(32735),r=a(82602),i=a(20354),o=a(74901),s=a(40003),l=a(30439),c=a(65853),u=a(64249),d=a(91693),m=a(83345),v=a(39151),f=a(1666),g=a(31949),h=a(17913),p=a(37802),y=a(35223),b=a(86099),E=a(24758),w="insights.shareInfo";function I(e){var t,a,I,A,S,j=i.a.useBasicFetch(v.L.config()),O=(0,p.r)(null).publicInteractiveAttempts,N=Object.assign(Object.assign({},(0,s.wO)((0,s.Hb)(),e.dateRangeAppLinkParams)),(0,o.K)(e.audienceAppLinkParams)),k=i.a.useBasicFetch(g.N.currentUser()),F=i.a.useBasicFetch(e.video&&l.o.getShareLinkByObjectId(e.video.id)),C=i.a.useBasicFetch(e.video&&l.o.getSentDirectShareByObjectId(e.video.id)),U=i.a.useBasicFetch((null===(t=k.data)||void 0===t?void 0:t.customerId)&&u.I.getDirectShareRecipientsRequest(k.data.customerId,C.data)),L=i.a.useBasicFetch(k.data&&e.video&&h.u.views(N,e.video.id,k.data.id,O)),R=i.a.useBasicFetch(e.video&&l.o.getPrivacy(e.video.id)),B=i.a.useBasicFetch((null===(a=k.data)||void 0===a?void 0:a.isAuthenticated)&&f.h.yearGroups(k.data.customerId)),T=F.hasCompleted&&!F.data&&C.hasCompleted&&!C.data,P=F.hasCompleted&&F.data||C.hasCompleted&&C.data&&(!F.data||R.data)&&(!F.data||B.data)&&U.data&&L.data,x=F.data&&R.data&&B.data&&c.R.getIconAndText({entity:e.video,entityTypeId:e.video.typeId,hasStudentExp:!1,isPasswordProtected:F.data.isPasswordProtected,linkExpireDate:F.data.linkExpireDate,privacy:R.data,status:F.data.status,yearGroups:B.data}),V=n.useMemo((function(){var e;return null===(e=L.data)||void 0===e?void 0:e.data.reduce((function(e,t){return t.count+e}),0)}),[L.data]),M=(null===(I=C.data)||void 0===I?void 0:I.dateCreated)||(null===(A=F.data)||void 0===A?void 0:A.dateCreated);return n.createElement("div",{className:"mb-4"},P&&n.createElement(n.Fragment,null,n.createElement("h2",{className:"h4"},n.createElement(m.x,{namespace:w,phrase:"shareInfo"})),n.createElement("div",{className:"d-flex border p-3 rounded-3 align-items-center justify-content-between"},n.createElement("div",{className:"d-flex align-items-center gap-2"},n.createElement(E.A,{shareRecipients:U.data,imageCdnUrl:null===(S=j.data)||void 0===S?void 0:S.imageCdnUrl,hasShareLink:!!F.data,maxAvatars:4,shareLinkText:null==x?void 0:x.text}),"·",n.createElement("p",{className:"mb-0"},(0,r.WU)(M)),!!V&&n.createElement(n.Fragment,null,"·",n.createElement("p",{className:"mb-0"},n.createElement(m.x,{namespace:w,phrase:"views",options:{smartCount:V}})))),n.createElement(d.h,{appLink:(0,b.YK)(e.video),svgName:y.vn.Share,className:"btn btn-outline-dark"},n.createElement(m.x,{namespace:w,phrase:"share"})))),!T&&!P&&n.createElement(n.Fragment,null,n.createElement("div",{className:"h4 partial-loading-background w-25"}," "),n.createElement("div",{className:"p-3 rounded partial-loading-background"},n.createElement("p",{className:"mb-1"}," "))))}},96049:(e,t,a)=>{a.r(t),a.d(t,{VideoInsightsOverviewView:()=>X});var n=a(32735),r=a(23481),i=a(2948),o=a(20354),s=a(75896),l=a(51870),c=a(50916),u=a(84621),d=a(98551),m=a(35223),v=r.T.encloseNamespace("shared.insightStudentsNotWatched");function f(e){var t,a=(null===(t=e.students)||void 0===t?void 0:t.filter((function(t){var a;return!(null===(a=e.watchedIds)||void 0===a?void 0:a.includes(t.id))})))||[];return n.createElement(u.L,{title:v("title"),svgName:m.vn.Puzzle,svgClassName:"bg-light-teal text-teal"},n.createElement(d.y,{students:a,imageCdnUrl:e.imageCdnUrl,imageUrl:e.imageUrl,description:v("studentsDisplay"),anonymiseUsers:e.anonymiseUsers}))}var g=r.T.encloseNamespace("shared.insightStudentsWatched");function h(e){return n.createElement(u.L,{title:g("title"),svgName:m.vn.Flag,svgClassName:"bg-light-indigo text-indigo",count:e.students.length},n.createElement(d.y,{students:e.students,imageCdnUrl:e.imageCdnUrl,imageUrl:e.imageUrl,description:g("studentsDisplay"),appLink:e.heatmapAppLink,appLinkText:g("viewAll"),anonymiseUsers:e.anonymiseUsers}))}var p=a(5255),y=a(26025),b=a(26136),E=a(74901),w=a(40003),I=a(30439),A=a(83345),S=a(38143),j=a(4594),O=a(16714),N=a(39151),k=a(31949),F=a(17913),C=a(39902),U=a(91286),L=a(93322),R=a(22902),B=a(79612),T=a(37802),P=a(31908),x=a(99742),V=a(88630),M=a(53936),_=a(53214),q=a(10447),D=a(50782);const H={partialInsights:"qm6HY"};function W(){return n.createElement("div",null,n.createElement("h2",{className:"h4 w-25 partial-loading-background"}," "),n.createElement("div",{className:"row g-3 mb-5"},n.createElement("div",{className:"col-12"},n.createElement("div",{className:"".concat(H.partialInsights," rounded partial-loading-background")}))),n.createElement("h2",{className:"h4 w-25 partial-loading-background"}," "),n.createElement("div",{className:"row g-3 mb-5"},n.createElement("div",{className:"col-6"},n.createElement("div",{className:"".concat(H.partialInsights," rounded partial-loading-background")})),n.createElement("div",{className:"col-6"},n.createElement("div",{className:"".concat(H.partialInsights," rounded partial-loading-background")}))))}var z=a(14070),G=a(97291);function Q(e){return function(e){if(Array.isArray(e))return $(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||Y(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Y(e,t){if(e){if("string"==typeof e)return $(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?$(e,t):void 0}}function $(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,n=Array(t);a<t;a++)n[a]=e[a];return n}var K="insights.videoInsightsOverview",J=r.T.encloseNamespace(K);function X(e){var t,a,r,u,d,m,v,g,H=(v=(0,i.D)(S.g.ANONYMISE_USERS),g=1,function(e){if(Array.isArray(e))return e}(v)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var n,r,i,o,s=[],l=!0,c=!1;try{if(i=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;l=!1}else for(;!(l=(n=i.call(a)).done)&&(s.push(n.value),s.length!==t);l=!0);}catch(e){c=!0,r=e}finally{try{if(!l&&null!=a.return&&(o=a.return(),Object(o)!==o))return}finally{if(c)throw r}}return s}}(v,g)||Y(v,g)||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.")}())[0];(0,L.F)();var $=(0,T.r)(null),X=$.hasClassrooms,Z=$.hasShareFlowV2,ee=(0,R.T)().hasPermissions,te=(0,T.r)(null).publicInteractiveAttempts,ae=o.a.useBasicFetch(k.N.currentUser()),ne=o.a.useBasicFetch(N.L.config()),re=P.M.getVideoRequest(e.videoId,e.typeId),ie=o.a.useBasicFetch(re),oe=y.B.getAudienceAppLinkParams(),se=y.B.getDateRangeAppLinkParams(),le=Object.assign(Object.assign({},(0,w.wO)((0,w.Hb)(),se)),(0,E.K)(oe));(0,B.M)({title:ie.data?J("pageTitle",{video:null===(t=ie.data)||void 0===t?void 0:t.name}):null}),(0,U.v)(ie);var ce=o.a.useBasicFetch(ae.data&&F.u.aggregateEngagement(e.videoId,le,ae.data.id,te)),ue=1===(null===(a=oe.classrooms)||void 0===a?void 0:a.length)&&!(null===(r=oe.classroomGroups)||void 0===r?void 0:r.length),de=o.a.useBasicFetch(ue&&V.F.getClassroomStudents(s.m.first(oe.classrooms))),me=(0,C.f)((null===(u=ce.data)||void 0===u?void 0:u.userIds)||[],(function(e){return I.o.getRecipientsById(e,ae.data.customerId)})),ve=o.a.useBasicFetch(ae.data&&F.u.views(le,e.videoId,ae.data.id,te)),fe=(0,p.Y)(e.shareId),ge=!!e.shareId;function he(){var e,t,a,n,r;if(!(null===(e=ce.data)||void 0===e?void 0:e.userIds)&&!(null===(t=ce.data)||void 0===t?void 0:t.sessionIds))return[];var i=null!==(a=me.itemsArr)&&void 0!==a?a:[],o=(null===(r=null===(n=ce.data)||void 0===n?void 0:n.sessionIds)||void 0===r?void 0:r.map((function(e){return(0,b.jP)(e,fe)})))||[];return[].concat(Q(i),Q(o))}var pe=ae.data&&ne.data&&ie.data&&ce.data&&(!ue||de.data),ye=Object.assign(Object.assign(Object.assign({},oe),se),{shareId:e.shareId}),be=function(e,t,a){return{heatmapAppLink:{application:G.O.INSIGHTS,action:t===j.E.Clip?z.e.Insights.CLIP_HEATMAP:z.e.Insights.VIDEO_HEATMAP,args:[e],params:a}}}(e.videoId,e.typeId,ye);return n.createElement("div",{className:"px-3"},n.createElement(M.j,{video:ie.data,dateRangeAppLinkParams:se,tabs:function(){var e,t,a;return(null===(e=ie.data)||void 0===e?void 0:e.typeId)===j.E.Clip?(0,q.$o)(null===(t=ie.data)||void 0===t?void 0:t.id,"insights",ye):(0,q.$6)(null===(a=ie.data)||void 0===a?void 0:a.id,"insights",ye)}(),hasAnalytics:ee(O.C.ViewCustomerAnalytics),analyticsWebUrl:null===(d=ne.data)||void 0===d?void 0:d.analyticsWebUrl,hasShareFlowV2:Z,shareId:e.shareId}),n.createElement(D.R,{audienceAppLinkParams:oe,dateRangeAppLinkParams:se,video:ie.data}),!pe&&n.createElement(W,null),pe&&n.createElement(_.u,{video:ie.data,hasShared:ge,hasShareFlowV2:Z,shareId:e.shareId},n.createElement("section",{className:"mb-5"},n.createElement("h2",{className:"h4"},n.createElement(A.x,{namespace:K,phrase:"studentViewing"}),n.createElement("span",null,": ",he().length,de.data?"/".concat(de.data.data.length):"")),n.createElement("div",{className:"row g-3"},ue&&n.createElement("div",{className:"col-12 col-md"},n.createElement(f,{students:de.data.data,watchedIds:ce.data.userIds,imageCdnUrl:ne.data.imageCdnUrl,heatmapAppLink:be.heatmapAppLink,imageUrl:x.W.Insights.AVATAR,anonymiseUsers:H})),n.createElement("div",{className:"col-12 col-md"},n.createElement(h,{students:he(),imageCdnUrl:ne.data.imageCdnUrl,heatmapAppLink:be.heatmapAppLink,imageUrl:x.W.Insights.AVATAR,anonymiseUsers:H})))),n.createElement("section",{className:"mb-5"},n.createElement("h2",{className:"h4"},n.createElement(A.x,{namespace:K,phrase:X?"classEngagement":"engagement"})),n.createElement("div",{className:"row g-3"},n.createElement("div",{className:"col-12 col-md-6"},n.createElement(l.i,{osCount:null===(m=ve.data)||void 0===m?void 0:m.osCount})),n.createElement("div",{className:"col-12 col-md-6"},n.createElement(c.b,{engagement:ce.data,heatmapAppLink:be.heatmapAppLink}))))))}}}]);
2
- //# sourceMappingURL=549-2d591052e3-lite.chunk.js.map