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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/dist/bundles.json +2 -2
  2. package/dist/css/{3918-lite-9bd35b2c4c.chunk.css → 3918-lite-88ef54ffc6.chunk.css} +3 -1
  3. package/dist/css/{1057-lite-04173a371f.chunk.css → 8849-lite-1ad0b22428.chunk.css} +2 -1
  4. package/dist/css/{lite-app-5335e8e07a.css → lite-app-560655620c.css} +1 -1
  5. package/dist/languages/en.json +1 -1
  6. package/dist/scripts/1734-f5ffd39591-lite.chunk.js +2 -0
  7. package/dist/scripts/1734-f5ffd39591-lite.chunk.js.map +1 -0
  8. package/dist/scripts/2506-aee0b1f275-lite.chunk.js +2 -0
  9. package/dist/scripts/2506-aee0b1f275-lite.chunk.js.map +1 -0
  10. package/dist/scripts/{2564-cd82320188-lite.chunk.js → 2564-98ba0d782a-lite.chunk.js} +3 -3
  11. package/dist/scripts/{2564-cd82320188-lite.chunk.js.map → 2564-98ba0d782a-lite.chunk.js.map} +1 -1
  12. package/dist/scripts/2615-e9b2938c18-lite.chunk.js +3 -0
  13. package/dist/scripts/2615-e9b2938c18-lite.chunk.js.map +1 -0
  14. package/dist/scripts/2788-86687fd69d-lite.chunk.js +2 -0
  15. package/dist/scripts/2788-86687fd69d-lite.chunk.js.map +1 -0
  16. package/dist/scripts/2820-b3d1688da0-lite.chunk.js +2 -0
  17. package/dist/scripts/2820-b3d1688da0-lite.chunk.js.map +1 -0
  18. package/dist/scripts/2978-b7bcc3eac4-lite.chunk.js +2 -0
  19. package/dist/scripts/2978-b7bcc3eac4-lite.chunk.js.map +1 -0
  20. package/dist/scripts/3391-5e26ca5ece-lite.chunk.js +2 -0
  21. package/dist/scripts/3391-5e26ca5ece-lite.chunk.js.map +1 -0
  22. package/dist/scripts/{3667-f9f546136c-lite.chunk.js → 3667-149e98454c-lite.chunk.js} +3 -3
  23. package/dist/scripts/{3667-f9f546136c-lite.chunk.js.map → 3667-149e98454c-lite.chunk.js.map} +1 -1
  24. package/dist/scripts/3918-43b95cb315-lite.chunk.js +2 -0
  25. package/dist/scripts/3918-43b95cb315-lite.chunk.js.map +1 -0
  26. package/dist/scripts/4113-d6411052c4-lite.chunk.js +2 -0
  27. package/dist/scripts/4113-d6411052c4-lite.chunk.js.map +1 -0
  28. package/dist/scripts/4137-bef0be4a57-lite.chunk.js +3 -0
  29. package/dist/scripts/4137-bef0be4a57-lite.chunk.js.map +1 -0
  30. package/dist/scripts/4266-42463e0c33-lite.chunk.js +3 -0
  31. package/dist/scripts/4266-42463e0c33-lite.chunk.js.map +1 -0
  32. package/dist/scripts/5817-84b8e83c19-lite.chunk.js +3 -0
  33. package/dist/scripts/5817-84b8e83c19-lite.chunk.js.map +1 -0
  34. package/dist/scripts/{6433-ff27a3c867-lite.chunk.js → 6433-ad3992c23a-lite.chunk.js} +2 -2
  35. package/dist/scripts/{6433-ff27a3c867-lite.chunk.js.map → 6433-ad3992c23a-lite.chunk.js.map} +1 -1
  36. package/dist/scripts/7434-34137ad94a-lite.chunk.js +2 -0
  37. package/dist/scripts/7434-34137ad94a-lite.chunk.js.map +1 -0
  38. package/dist/scripts/{7556-79099a07fc-lite.chunk.js → 7556-69f8cb3b20-lite.chunk.js} +3 -3
  39. package/dist/scripts/7556-69f8cb3b20-lite.chunk.js.map +1 -0
  40. package/dist/scripts/{8095-777a5c5ddf-lite.chunk.js → 8095-afb976fac0-lite.chunk.js} +2 -2
  41. package/dist/scripts/8095-afb976fac0-lite.chunk.js.map +1 -0
  42. package/dist/scripts/839-f8478d27f8-lite.chunk.js +2 -0
  43. package/dist/scripts/839-f8478d27f8-lite.chunk.js.map +1 -0
  44. package/dist/scripts/8489-7779fd40b3-lite.chunk.js +3 -0
  45. package/dist/scripts/8489-7779fd40b3-lite.chunk.js.map +1 -0
  46. package/dist/scripts/8849-020bfd8cdd-lite.chunk.js +2 -0
  47. package/dist/scripts/8849-020bfd8cdd-lite.chunk.js.map +1 -0
  48. package/dist/scripts/bundle-fb8200eefd.min.js +3 -0
  49. package/dist/scripts/bundle-fb8200eefd.min.js.map +1 -0
  50. package/package.json +1 -1
  51. package/dist/scripts/1057-3c48d4553a-lite.chunk.js +0 -2
  52. package/dist/scripts/1057-3c48d4553a-lite.chunk.js.map +0 -1
  53. package/dist/scripts/1683-57c0175d4e-lite.chunk.js +0 -2
  54. package/dist/scripts/1683-57c0175d4e-lite.chunk.js.map +0 -1
  55. package/dist/scripts/1734-bbca52585c-lite.chunk.js +0 -2
  56. package/dist/scripts/1734-bbca52585c-lite.chunk.js.map +0 -1
  57. package/dist/scripts/232-278263e5f8-lite.chunk.js +0 -3
  58. package/dist/scripts/232-278263e5f8-lite.chunk.js.map +0 -1
  59. package/dist/scripts/2615-90d4cdd835-lite.chunk.js +0 -3
  60. package/dist/scripts/2615-90d4cdd835-lite.chunk.js.map +0 -1
  61. package/dist/scripts/2788-013bbba554-lite.chunk.js +0 -2
  62. package/dist/scripts/2788-013bbba554-lite.chunk.js.map +0 -1
  63. package/dist/scripts/312-2458059ebb-lite.chunk.js +0 -2
  64. package/dist/scripts/312-2458059ebb-lite.chunk.js.map +0 -1
  65. package/dist/scripts/3918-2855f0da2a-lite.chunk.js +0 -2
  66. package/dist/scripts/3918-2855f0da2a-lite.chunk.js.map +0 -1
  67. package/dist/scripts/4137-f0ac17da1f-lite.chunk.js +0 -3
  68. package/dist/scripts/4137-f0ac17da1f-lite.chunk.js.map +0 -1
  69. package/dist/scripts/4654-6fedfb863f-lite.chunk.js +0 -2
  70. package/dist/scripts/4654-6fedfb863f-lite.chunk.js.map +0 -1
  71. package/dist/scripts/5817-900efca702-lite.chunk.js +0 -3
  72. package/dist/scripts/5817-900efca702-lite.chunk.js.map +0 -1
  73. package/dist/scripts/7237-86c18f2701-lite.chunk.js +0 -2
  74. package/dist/scripts/7237-86c18f2701-lite.chunk.js.map +0 -1
  75. package/dist/scripts/7434-366d4ae5e0-lite.chunk.js +0 -2
  76. package/dist/scripts/7434-366d4ae5e0-lite.chunk.js.map +0 -1
  77. package/dist/scripts/7556-79099a07fc-lite.chunk.js.map +0 -1
  78. package/dist/scripts/8095-777a5c5ddf-lite.chunk.js.map +0 -1
  79. package/dist/scripts/839-889090dc50-lite.chunk.js +0 -2
  80. package/dist/scripts/839-889090dc50-lite.chunk.js.map +0 -1
  81. package/dist/scripts/8489-6e8c4dd60f-lite.chunk.js +0 -3
  82. package/dist/scripts/8489-6e8c4dd60f-lite.chunk.js.map +0 -1
  83. package/dist/scripts/897-399a877281-lite.chunk.js +0 -2
  84. package/dist/scripts/897-399a877281-lite.chunk.js.map +0 -1
  85. package/dist/scripts/9201-899c885914-lite.chunk.js +0 -2
  86. package/dist/scripts/9201-899c885914-lite.chunk.js.map +0 -1
  87. package/dist/scripts/bundle-4b58e56927.min.js +0 -3
  88. package/dist/scripts/bundle-4b58e56927.min.js.map +0 -1
  89. /package/dist/css/{1683-lite-bdd5b6edf8.chunk.css → 2506-lite-bdd5b6edf8.chunk.css} +0 -0
  90. /package/dist/css/{7237-lite-a8e87f096f.chunk.css → 2820-lite-a8e87f096f.chunk.css} +0 -0
  91. /package/dist/scripts/{2564-cd82320188-lite.chunk.js.LICENSE.txt → 2564-98ba0d782a-lite.chunk.js.LICENSE.txt} +0 -0
  92. /package/dist/scripts/{2615-90d4cdd835-lite.chunk.js.LICENSE.txt → 2615-e9b2938c18-lite.chunk.js.LICENSE.txt} +0 -0
  93. /package/dist/scripts/{3667-f9f546136c-lite.chunk.js.LICENSE.txt → 3667-149e98454c-lite.chunk.js.LICENSE.txt} +0 -0
  94. /package/dist/scripts/{4137-f0ac17da1f-lite.chunk.js.LICENSE.txt → 4137-bef0be4a57-lite.chunk.js.LICENSE.txt} +0 -0
  95. /package/dist/scripts/{232-278263e5f8-lite.chunk.js.LICENSE.txt → 4266-42463e0c33-lite.chunk.js.LICENSE.txt} +0 -0
  96. /package/dist/scripts/{5817-900efca702-lite.chunk.js.LICENSE.txt → 5817-84b8e83c19-lite.chunk.js.LICENSE.txt} +0 -0
  97. /package/dist/scripts/{6433-ff27a3c867-lite.chunk.js.LICENSE.txt → 6433-ad3992c23a-lite.chunk.js.LICENSE.txt} +0 -0
  98. /package/dist/scripts/{7556-79099a07fc-lite.chunk.js.LICENSE.txt → 7556-69f8cb3b20-lite.chunk.js.LICENSE.txt} +0 -0
  99. /package/dist/scripts/{8489-6e8c4dd60f-lite.chunk.js.LICENSE.txt → 8489-7779fd40b3-lite.chunk.js.LICENSE.txt} +0 -0
  100. /package/dist/scripts/{bundle-4b58e56927.min.js.LICENSE.txt → bundle-fb8200eefd.min.js.LICENSE.txt} +0 -0
@@ -0,0 +1,3 @@
1
+ /*! For license information please see 2615-e9b2938c18-lite.chunk.js.LICENSE.txt */
2
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[2615],{39157:(t,e,r)=>{r.d(e,{HI:()=>h,R6:()=>s,Rt:()=>d,UU:()=>f,Zs:()=>l,nq:()=>p});var n=r(75896),o=r(94892),i=r(28972),a=r(8246),c=r(83140),u=r(80845);function s(t,e,r){var i={markingRequired:[],lowScore:[],highScore:[],completed:[],notCompleted:[]},a=(0,u.Q)(t).length;e.students.forEach((function(e){var c=Object.assign(Object.assign({},e),{summary:d(t,e)});c.summary.awaitingMarking?i.markingRequired.push(c):n.m.last(e.results).attempts.length===a?(i.completed.push(c),c.summary.percentCorrect>=(r.HIGH||o.i.HIGH)&&i.highScore.push(c),c.summary.percentCorrect<(r.MODERATE||o.i.MODERATE)&&i.lowScore.push(c)):i.notCompleted.push(c)}));var c=n.m.sortBy(i.lowScore,(function(t){return t.summary.percentCorrect})),s=n.m.sortBy(i.highScore,(function(t){return-t.summary.percentCorrect}));return Object.assign(Object.assign({},i),{lowScore:c,highScore:s})}function l(t,e){return(0,u.Wn)(t).find((function(t){return t.id.toString()===e.toString()}))}function f(t){return"".concat(t.questionId,":").concat(t.resultId)}function h(t,e,r){var n=(0,u.j_)(e),o=(0,u.f6)(t,n);return(null==o?void 0:o.answers.every((function(t){var e;return(null===(e=r[f(t)])||void 0===e?void 0:e.status)===a.N.Correct})))?a.N.Correct:(null==o?void 0:o.answers.every((function(t){var e;return(null===(e=r[f(t)])||void 0===e?void 0:e.status)===a.N.Incorrect})))?a.N.Incorrect:void 0}function p(t,e){var r=e.students.length,n=0,o=0,a=0,s=0,l=0;return e.students.forEach((function(e){var r=(0,u.j_)(e);if(r){l+=e.results.length;var f=c.A.isInteractionCorrect(t,r);f===i.w.Correct&&n++,f===i.w.UnAnswered&&a++,f===i.w.AwaitingMarking&&s++,f!==i.w.UnAnswered&&o++}})),{percentCorrect:r>0?n/r:0,correct:n,answered:o,unanswered:a,awaitingMarking:s,attempts:l}}function d(t,e){var r=(0,u.j_)(e),n=(0,u.Q)(t),o=n.length,a=0,s=0;n.forEach((function(t){var e=c.A.isInteractionCorrect(t,r);e===i.w.Correct&&a++,e===i.w.AwaitingMarking&&s++}));var l=o>0?a/o:0,f=new Set(n.map((function(t){return t.id}))),h=r.attempts.filter((function(t){var e;return!!f.has(null===(e=null==t?void 0:t.answers[0])||void 0===e?void 0:e.questionId)})).length;return{answered:r.attempts.length,attempts:e.results.length,unanswered:o-h,percentCorrect:l,correct:a,awaitingMarking:s}}},32615:(t,e,r)=>{r.r(e),r.d(e,{InteractiveEditSuggestedResponse:()=>E});var n=r(32735),o=r(23481),i=r(44704),a=r(20354),c=r(39157),u=r(86572),s=r(9111),l=r(13876),f=r(83345),h=r(20768),p=r(69883);function d(t){return d="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},d(t)}function v(){v=function(){return e};var t,e={},r=Object.prototype,n=r.hasOwnProperty,o=Object.defineProperty||function(t,e,r){t[e]=r.value},i="function"==typeof Symbol?Symbol:{},a=i.iterator||"@@iterator",c=i.asyncIterator||"@@asyncIterator",u=i.toStringTag||"@@toStringTag";function s(t,e,r){return Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{s({},"")}catch(t){s=function(t,e,r){return t[e]=r}}function l(t,e,r,n){var i=e&&e.prototype instanceof w?e:w,a=Object.create(i.prototype),c=new N(n||[]);return o(a,"_invoke",{value:j(t,r,c)}),a}function f(t,e,r){try{return{type:"normal",arg:t.call(e,r)}}catch(t){return{type:"throw",arg:t}}}e.wrap=l;var h="suspendedStart",p="suspendedYield",y="executing",m="completed",g={};function w(){}function b(){}function E(){}var I={};s(I,a,(function(){return this}));var S=Object.getPrototypeOf,A=S&&S(S(M([])));A&&A!==r&&n.call(A,a)&&(I=A);var C=E.prototype=w.prototype=Object.create(I);function x(t){["next","throw","return"].forEach((function(e){s(t,e,(function(t){return this._invoke(e,t)}))}))}function k(t,e){function r(o,i,a,c){var u=f(t[o],t,i);if("throw"!==u.type){var s=u.arg,l=s.value;return l&&"object"==d(l)&&n.call(l,"__await")?e.resolve(l.__await).then((function(t){r("next",t,a,c)}),(function(t){r("throw",t,a,c)})):e.resolve(l).then((function(t){s.value=t,a(s)}),(function(t){return r("throw",t,a,c)}))}c(u.arg)}var i;o(this,"_invoke",{value:function(t,n){function o(){return new e((function(e,o){r(t,n,e,o)}))}return i=i?i.then(o,o):o()}})}function j(e,r,n){var o=h;return function(i,a){if(o===y)throw Error("Generator is already running");if(o===m){if("throw"===i)throw a;return{value:t,done:!0}}for(n.method=i,n.arg=a;;){var c=n.delegate;if(c){var u=L(c,n);if(u){if(u===g)continue;return u}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(o===h)throw o=m,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);o=y;var s=f(e,r,n);if("normal"===s.type){if(o=n.done?m:p,s.arg===g)continue;return{value:s.arg,done:n.done}}"throw"===s.type&&(o=m,n.method="throw",n.arg=s.arg)}}}function L(e,r){var n=r.method,o=e.iterator[n];if(o===t)return r.delegate=null,"throw"===n&&e.iterator.return&&(r.method="return",r.arg=t,L(e,r),"throw"===r.method)||"return"!==n&&(r.method="throw",r.arg=new TypeError("The iterator does not provide a '"+n+"' method")),g;var i=f(o,e.iterator,r.arg);if("throw"===i.type)return r.method="throw",r.arg=i.arg,r.delegate=null,g;var a=i.arg;return a?a.done?(r[e.resultName]=a.value,r.next=e.nextLoc,"return"!==r.method&&(r.method="next",r.arg=t),r.delegate=null,g):a:(r.method="throw",r.arg=new TypeError("iterator result is not an object"),r.delegate=null,g)}function O(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function _(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function N(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(O,this),this.reset(!0)}function M(e){if(e||""===e){var r=e[a];if(r)return r.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var o=-1,i=function r(){for(;++o<e.length;)if(n.call(e,o))return r.value=e[o],r.done=!1,r;return r.value=t,r.done=!0,r};return i.next=i}}throw new TypeError(d(e)+" is not iterable")}return b.prototype=E,o(C,"constructor",{value:E,configurable:!0}),o(E,"constructor",{value:b,configurable:!0}),b.displayName=s(E,u,"GeneratorFunction"),e.isGeneratorFunction=function(t){var e="function"==typeof t&&t.constructor;return!!e&&(e===b||"GeneratorFunction"===(e.displayName||e.name))},e.mark=function(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,E):(t.__proto__=E,s(t,u,"GeneratorFunction")),t.prototype=Object.create(C),t},e.awrap=function(t){return{__await:t}},x(k.prototype),s(k.prototype,c,(function(){return this})),e.AsyncIterator=k,e.async=function(t,r,n,o,i){void 0===i&&(i=Promise);var a=new k(l(t,r,n,o),i);return e.isGeneratorFunction(r)?a:a.next().then((function(t){return t.done?t.value:a.next()}))},x(C),s(C,u,"Generator"),s(C,a,(function(){return this})),s(C,"toString",(function(){return"[object Generator]"})),e.keys=function(t){var e=Object(t),r=[];for(var n in e)r.push(n);return r.reverse(),function t(){for(;r.length;){var n=r.pop();if(n in e)return t.value=n,t.done=!1,t}return t.done=!0,t}},e.values=M,N.prototype={constructor:N,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=t,this.done=!1,this.delegate=null,this.method="next",this.arg=t,this.tryEntries.forEach(_),!e)for(var r in this)"t"===r.charAt(0)&&n.call(this,r)&&!isNaN(+r.slice(1))&&(this[r]=t)},stop:function(){this.done=!0;var t=this.tryEntries[0].completion;if("throw"===t.type)throw t.arg;return this.rval},dispatchException:function(e){if(this.done)throw e;var r=this;function o(n,o){return c.type="throw",c.arg=e,r.next=n,o&&(r.method="next",r.arg=t),!!o}for(var i=this.tryEntries.length-1;i>=0;--i){var a=this.tryEntries[i],c=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var u=n.call(a,"catchLoc"),s=n.call(a,"finallyLoc");if(u&&s){if(this.prev<a.catchLoc)return o(a.catchLoc,!0);if(this.prev<a.finallyLoc)return o(a.finallyLoc)}else if(u){if(this.prev<a.catchLoc)return o(a.catchLoc,!0)}else{if(!s)throw Error("try statement without catch or finally");if(this.prev<a.finallyLoc)return o(a.finallyLoc)}}}},abrupt:function(t,e){for(var r=this.tryEntries.length-1;r>=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev<o.finallyLoc){var i=o;break}}i&&("break"===t||"continue"===t)&&i.tryLoc<=e&&e<=i.finallyLoc&&(i=null);var a=i?i.completion:{};return a.type=t,a.arg=e,i?(this.method="next",this.next=i.finallyLoc,g):this.complete(a)},complete:function(t,e){if("throw"===t.type)throw t.arg;return"break"===t.type||"continue"===t.type?this.next=t.arg:"return"===t.type?(this.rval=this.arg=t.arg,this.method="return",this.next="end"):"normal"===t.type&&e&&(this.next=e),g},finish:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),_(r),g}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;_(r)}return o}}throw Error("illegal catch attempt")},delegateYield:function(e,r,n){return this.delegate={iterator:M(e),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=t),g}},e}function y(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,i,a,c=[],u=!0,s=!1;try{if(i=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;u=!1}else for(;!(u=(n=i.call(r)).done)&&(c.push(n.value),c.length!==e);u=!0);}catch(t){s=!0,o=t}finally{try{if(!u&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(s)throw o}}return c}}(t,e)||function(t,e){if(t){if("string"==typeof t)return m(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?m(t,e):void 0}}(t,e)||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.")}()}function m(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}var g=function(t,e,r,n){return new(r||(r=Promise))((function(o,i){function a(t){try{u(n.next(t))}catch(t){i(t)}}function c(t){try{u(n.throw(t))}catch(t){i(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(a,c)}u((n=n.apply(t,e||[])).next())}))},w="shared.interactiveEditSuggestedResponse",b=o.T.encloseNamespace(w);function E(t){var e,r,o=(0,p.Z)(),d=(0,i.useGetFetchAsync)(),m=y(n.useState(!1),2),E=m[0],I=m[1],S=a.a.useBasicFetch(h.b.interactiveMetadata(t.interactiveId)),A=a.a.useBasicFetch((null===(e=S.data)||void 0===e?void 0:e.interactiveId)&&h.b.interactive(S.data.interactiveId)),C=A.data&&(0,c.Zs)(A.data,t.interactionId),x=y(n.useState(null===(r=C.data)||void 0===r?void 0:r.suggestedResponse),2),k=x[0],j=x[1];return n.createElement(s.G,{title:b(k?"edit":"create"),closePopup:t.closePopup},n.createElement("div",{className:"mb-3"},n.createElement(u.y,{interaction:C})),n.createElement("label",{htmlFor:"suggestedResponse",className:"form-label"},n.createElement(f.x,{namespace:w,phrase:"label"}),":"),n.createElement("textarea",{id:"suggestedResponse",className:"form-control w-100 mb-3",placeholder:b("placeholder"),onChange:function(t){return j(t.target.value)},value:k,rows:4}),n.createElement(l.u,null,n.createElement(l.u.Cancel,{onClick:t.closePopup}),n.createElement(l.u.Submit,{variant:"dark",text:b("save"),onClick:function(){return g(this,void 0,void 0,v().mark((function e(){var r;return v().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=Object.assign(Object.assign({},C),{actionableItems:[{name:"Answer"}],data:{suggestedResponse:k}}),I(!0),e.prev=2,e.next=5,d(h.b.updateInteraction(r));case 5:o.success(b("suggestedResponseSuccess")),t.closePopup(),e.next=12;break;case 9:e.prev=9,e.t0=e.catch(2),o.error(b("suggestedResponseError"));case 12:return e.prev=12,I(!1),e.finish(12);case 15:case"end":return e.stop()}}),e,null,[[2,9,12,15]])})))},showSpinner:E})))}},94892:(t,e,r)=>{r.d(e,{T:()=>o,i:()=>n});var n={HIGH:.75,MODERATE:.5},o={HIGH:.7,MODERATE:.7}},28972:(t,e,r)=>{var n;r.d(e,{w:()=>n}),function(t){t[t.Correct=0]="Correct",t[t.Incorrect=1]="Incorrect",t[t.AwaitingMarking=2]="AwaitingMarking",t[t.Answered=3]="Answered",t[t.UnAnswered=4]="UnAnswered",t[t.NotApplicable=5]="NotApplicable"}(n||(n={}))},8246:(t,e,r)=>{var n;r.d(e,{N:()=>n}),function(t){t[t.Incorrect=0]="Incorrect",t[t.Correct=1]="Correct",t[t.PendingReview=2]="PendingReview"}(n||(n={}))},83140:(t,e,r)=>{r.d(e,{A:()=>v});var n=r(28972),o=r(8246),i=r(40424);function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function c(t,e,r){return(e=function(t){var e=function(t,e){if("object"!=a(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var n=r.call(t,"string");if("object"!=a(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==a(e)?e:e+""}(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function u(){return n.w.NotApplicable}function s(t,e){var r=t.actionableItems.filter((function(t){return t.isCorrect}));return r.every((function(t){return!e(t.id)}))?n.w.UnAnswered:r.every((function(t){var r;return t.name.trim().toLowerCase()===(null===(r=e(t.id))||void 0===r?void 0:r.trim().toLowerCase())}))?n.w.Correct:n.w.Incorrect}function l(t,e){return t.actionableItems.every((function(t){return!e(t.id)}))?n.w.UnAnswered:t.actionableItems.filter((function(t){return t.isCorrect})).every((function(t){var r,n=e(t.id);return(null==n?void 0:n.toString())===(null===(r=t.id)||void 0===r?void 0:r.toString())||n===t.name}))?n.w.Correct:n.w.Incorrect}function f(t,e){return function(r){var n=e.attempts.find((function(e){return e.id===t.id}));return null==n?void 0:n.answers.find((function(t){return t.id===r}))}}function h(t,e){var r=f(t,e);return l(t,(function(t){var e=r(t);return null==e?void 0:e.text}))}function p(t,e){return function(t,e){var r;return t.actionableItems.forEach((function(t){var i=e(t.id);r=i?i.status!==o.N.Correct?i.status!==o.N.Incorrect?n.w.AwaitingMarking:n.w.Incorrect:n.w.Correct:n.w.UnAnswered})),r}(t,f(t,e))}var d=c(c(c(c(c(c(c({},i.Z9.Annotation,u),i.Z9.Image,u),i.Z9.MissingWord,(function(t,e){var r=f(t,e);return s(t,(function(t){var e=r(t);return null==e?void 0:e.text}))})),i.Z9.MultipleChoice,h),i.Z9.ShortAnswer,p),i.Z9.TrueOrFalse,h),i.Z9.Illustration,p),v={notApplicable:u,awaitingMarking:function(){return n.w.AwaitingMarking},isMissingWordCorrect:s,isMultipleChoiceCorrect:l,isInteractionCorrect:function(t,e){return(0,d[t.typeId])(t,e)}}},80845:(t,e,r)=>{r.d(e,{Q:()=>s,Wn:()=>a,f6:()=>u,j_:()=>c});var n=r(75896),o=r(40424);function i(t){return t.typeId!==o.Z9.Annotation&&t.typeId!==o.Z9.Image}function a(t){return n.m.flatten(t.timepoints.map((function(t){return t.interactions})))}function c(t){return n.m.last(t.results)}function u(t,e){return n.m.findWhere(null==e?void 0:e.attempts,{id:t})}function s(t){return a(t).filter(i)}}}]);
3
+ //# sourceMappingURL=2615-e9b2938c18-lite.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/2615-e9b2938c18-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/apps/analytics/views/interactive-edit-suggested-response/InteractiveEditSuggestedResponse.tsx","file:///app/packages/libs/shared/src/constants/ScoreThresholds.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"],"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}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useGetFetchAsync } from 'libs/common/react/flight';\nimport { Flight } from 'libs/common/react/index';\n\nimport { getInteractionById } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { Popup, PopupProps } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { Interaction, Interactive, InteractiveMetadata } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.interactiveEditSuggestedResponse';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractiveEditSuggestedResponseProps extends PopupProps {\n interactiveId: string;\n interactionId: string;\n}\n\nexport function InteractiveEditSuggestedResponse(props: InteractiveEditSuggestedResponseProps) {\n const alert = useAlerts();\n const fetchAsync = useGetFetchAsync();\n\n const [ showSpinner, setShowSpinner ] = React.useState(false);\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n InteractiveRequests.interactiveMetadata(props.interactiveId)\n );\n const interactive = Flight.useBasicFetch<Interactive>(interactiveMetadata.data?.interactiveId &&\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId));\n\n const interaction = interactive.data && getInteractionById(interactive.data, props.interactionId);\n \n const [ suggestedResponse, setSuggestedResponse ] = React.useState(interaction.data?.suggestedResponse);\n\n async function submitSuggestedResponse() {\n const data: Interaction = {\n ...interaction,\n actionableItems: [{ name: 'Answer' }],\n data: { suggestedResponse }\n };\n\n setShowSpinner(true);\n\n try {\n await fetchAsync(InteractiveRequests.updateInteraction(data));\n\n alert.success(getPhrase('suggestedResponseSuccess'));\n\n props.closePopup();\n } catch {\n alert.error(getPhrase('suggestedResponseError'));\n } finally {\n setShowSpinner(false);\n }\n }\n\n return (\n <Popup\n title={getPhrase(!suggestedResponse ? 'create' : 'edit')}\n closePopup={props.closePopup}\n >\n <div className='mb-3'>\n <InteractionLabel interaction={interaction} />\n </div>\n\n <label htmlFor='suggestedResponse' className='form-label'>\n <Text namespace={namespace} phrase='label' />:\n </label>\n\n <textarea\n id='suggestedResponse'\n className='form-control w-100 mb-3'\n placeholder={getPhrase('placeholder')}\n onChange={e => setSuggestedResponse(e.target.value)}\n value={suggestedResponse}\n rows={4}\n />\n\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.closePopup} />\n <PopupButtons.Submit\n variant='dark'\n text={getPhrase('save')}\n onClick={submitSuggestedResponse}\n showSpinner={showSpinner}\n />\n </PopupButtons>\n </Popup>\n );\n}","export interface ScoreThresholds {\n HIGH: number;\n MODERATE: number;\n}\n\nexport const ScoreThresholdDefaults: ScoreThresholds = {\n HIGH: 0.75,\n MODERATE: 0.5\n};\n\nexport const ScoreThresholdInsights: ScoreThresholds = {\n HIGH: 0.7,\n MODERATE: 0.7\n};","export enum InteractionCorrectness {\n Correct,\n Incorrect,\n AwaitingMarking,\n \n Answered,\n UnAnswered,\n NotApplicable\n}","export enum InteractiveAnswerStatus {\n Incorrect = 0,\n Correct = 1,\n PendingReview = 2\n}","import { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, InteractionTypeId, InteractiveResult, StudentAnswer } from 'libs/shared/interfaces';\n\ntype GetStudentAnswerByActionableItemId = (id: string) => string;\n\nfunction notApplicable(): InteractionCorrectness {\n return InteractionCorrectness.NotApplicable;\n}\n\nfunction awaitingMarking(): InteractionCorrectness {\n return InteractionCorrectness.AwaitingMarking;\n}\n\nfunction isMissingWordCorrect(\n interaction: Interaction,\n getStudentAnswer: GetStudentAnswerByActionableItemId\n): InteractionCorrectness {\n const items = interaction.actionableItems.filter(a => a\n .isCorrect);\n\n if (items.every(a => !getStudentAnswer(a.id)))\n return InteractionCorrectness.UnAnswered;\n\n const correct = items.every(a => a.name.trim().toLowerCase() === getStudentAnswer(a.id)?.trim().toLowerCase());\n return correct ? InteractionCorrectness.Correct : InteractionCorrectness.Incorrect;\n}\n\nfunction isMultipleChoiceCorrect(\n interaction: Interaction,\n getStudentAnswer: GetStudentAnswerByActionableItemId\n): InteractionCorrectness {\n if (interaction.actionableItems.every(a => !getStudentAnswer(a.id)))\n return InteractionCorrectness.UnAnswered;\n \n const correctItems = interaction.actionableItems.filter(a => a.isCorrect);\n\n const correct = correctItems.every(a => {\n const studentAnswer = getStudentAnswer(a.id);\n\n /**\n * In the past we've only ever checked the answer name. But since we introduced the ability to have image interactions\n * with no question text, we've need to swap to saving the id. But past submissions still have the name\n * - Sha\n */\n return studentAnswer?.toString() === a.id?.toString() || studentAnswer === a.name;\n });\n return correct ? InteractionCorrectness.Correct : InteractionCorrectness.Incorrect;\n}\n\nfunction isMarkableAnswerMarkedCorrect(\n interaction: Interaction,\n getStudentAnswer: (id: string) => StudentAnswer\n): InteractionCorrectness {\n let correctness: InteractionCorrectness;\n\n // There should only be one actionableItem\n interaction.actionableItems.forEach(item => {\n const studentAnswer = getStudentAnswer(item.id);\n\n if (!studentAnswer) {\n correctness = InteractionCorrectness.UnAnswered;\n return;\n }\n\n if (studentAnswer.status === InteractiveAnswerStatus.Correct) {\n correctness = InteractionCorrectness.Correct;\n return;\n }\n\n if (studentAnswer.status === InteractiveAnswerStatus.Incorrect) {\n correctness = InteractionCorrectness.Incorrect;\n return;\n }\n\n correctness = InteractionCorrectness.AwaitingMarking;\n });\n\n return correctness;\n}\n\ntype IsCorrectFunction = (interaction: Interaction, result: InteractiveResult) => InteractionCorrectness;\n\nfunction getGetStudentAnswer(interaction: Interaction, result: InteractiveResult): (id: string) => StudentAnswer {\n return (id: string) => {\n const attempt = result.attempts.find(a => a.id === interaction.id);\n return attempt?.answers.find(s => s.id === id);\n };\n}\n\nfunction wrapIsMissingWordCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n\n return isMissingWordCorrect(interaction, (id: string) => {\n const answer = getStudentAnswer(id);\n return answer?.text;\n });\n}\n\nfunction wrapIsMultipleChoiceCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n\n return isMultipleChoiceCorrect(interaction, (id: string) => {\n const answer = getStudentAnswer(id);\n return answer?.text;\n });\n}\n\nfunction wrapIsMarkableAnswerMarkedCorrect(\n interaction: Interaction,\n result: InteractiveResult\n): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n return isMarkableAnswerMarkedCorrect(interaction, getStudentAnswer);\n}\n\nconst IsCorrectLookup: {[typeId: number]: IsCorrectFunction} = {\n [InteractionTypeId.Annotation]: notApplicable,\n [InteractionTypeId.Image]: notApplicable,\n [InteractionTypeId.MissingWord]: wrapIsMissingWordCorrect,\n [InteractionTypeId.MultipleChoice]: wrapIsMultipleChoiceCorrect,\n [InteractionTypeId.ShortAnswer]: wrapIsMarkableAnswerMarkedCorrect,\n [InteractionTypeId.TrueOrFalse]: wrapIsMultipleChoiceCorrect,\n [InteractionTypeId.Illustration]: wrapIsMarkableAnswerMarkedCorrect\n};\n\nfunction isInteractionCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const isCorrectFn = IsCorrectLookup[interaction.typeId];\n\n return isCorrectFn(interaction, result);\n}\n\nexport const InteractiveCorrectnessHelper = {\n notApplicable,\n awaitingMarking,\n isMissingWordCorrect,\n isMultipleChoiceCorrect,\n isInteractionCorrect\n};\n","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport {\n Interaction,\n InteractionTypeId,\n Interactive,\n InteractiveResult,\n StudentAttempt,\n StudentResults\n} from 'libs/shared/interfaces';\n\nfunction interactionRequiresAnswer(interaction: Interaction): boolean {\n return interaction.typeId !== InteractionTypeId.Annotation && interaction.typeId !== InteractionTypeId.Image;\n}\n\nexport function flattenInteractions(interactive: Interactive): Interaction[] {\n return ArrayHelper.flatten(interactive.timepoints.map(i => i.interactions));\n}\n\n/**\n * Centralised logic for using the most recent student result.\n */\nexport function getStudentResult(studentResults: StudentResults): InteractiveResult {\n return ArrayHelper.last(studentResults.results);\n}\n\nexport function getStudentAttempt(interactionId: string, result: InteractiveResult): StudentAttempt {\n return ArrayHelper.findWhere(result?.attempts, { id: interactionId });\n}\n\n/**\n * Returns a flat list of interactions on an interactive and filters out\n * those that don't require an answer (annotations and images).\n */\nexport function getInteractions(interactive: Interactive): Interaction [] {\n return flattenInteractions(interactive).filter(interactionRequiresAnswer);\n}"],"names":["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","namespace","getPhrase","InteractiveEditSuggestedResponse","props","alert","fetchAsync","useGetFetchAsync","showSpinner","setShowSpinner","interactiveMetadata","interactiveId","data","suggestedResponse","setSuggestedResponse","title","closePopup","className","htmlFor","phrase","placeholder","onChange","e","target","value","rows","onClick","variant","text","actionableItems","name","success","error","ScoreThresholdDefaults","ScoreThresholdInsights","InteractionCorrectness","InteractiveAnswerStatus","notApplicable","isMissingWordCorrect","getStudentAnswer","items","isCorrect","trim","toLowerCase","isMultipleChoiceCorrect","studentAnswer","getGetStudentAnswer","attempt","wrapIsMultipleChoiceCorrect","wrapIsMarkableAnswerMarkedCorrect","item","isMarkableAnswerMarkedCorrect","IsCorrectLookup","InteractiveCorrectnessHelper","isInteractionCorrect","isCorrectFn","typeId","interactionRequiresAnswer","flattenInteractions","timepoints","getStudentResult","getStudentAttempt","getInteractions"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[2788],{26025:(e,t,r)=>{r.d(t,{B:()=>o});var a=r(1048),n=r(75795),o={getAudienceAppLinkParams:function(){var e=n.O.getCurrentRoute().appLink,t=a.t.isObject(e.params)?e.params:{},r=t.users,o=t.classrooms,c=t.classroomGroups,s=function(e){var r=t[e];if(r)return Array.isArray(r)?r:[r]},i={};return r&&(i.users=s("users")),o&&(i.classrooms=s("classrooms")),c&&(i.classroomGroups=s("classroomGroups")),i},getDateRangeAppLinkParams:function(){var e=n.O.getCurrentRoute().appLink,t=a.t.isObject(e.params)?e.params:{},r=t.from,o=t.to,c=t.rangeName,s={};return r&&(s.from=r),o&&(s.to=o),c&&(s.rangeName=c),s}}},26136:(e,t,r)=>{r.d(t,{B:()=>o});var a=r(76198),n=r(64818);function o(e,t){return t?(0,a._8)(function(e){var t=+"".concat(e.id).concat(Math.floor((new Date).getMinutes()/5));return{dictionaries:[a.O9,a.yd],separator:" ",length:2,style:"capital",seed:t}}(e)):n.l.getFullName(e)}},74901:(e,t,r)=>{function a(e){return function(e){if(Array.isArray(e))return n(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 n(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?n(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 n(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,a=Array(t);r<t;r++)a[r]=e[r];return a}r.d(t,{K:()=>o});var o=function(e){var t=[],r=[];return e.users&&t.push.apply(t,a(e.users)),e.classrooms&&r.push.apply(r,a(e.classrooms)),e.classroomGroups&&r.push.apply(r,a(e.classroomGroups)),{userId:t,groupId:r}}},40003:(e,t,r)=>{r.d(t,{Hb:()=>d,NG:()=>g,W5:()=>m,eO:()=>p,nG:()=>l,wO:()=>v,zn:()=>i});var a=r(23481),n=r(110),o=r(57266),c=a.T.encloseNamespace("shared.analyticsUtils");function s(e){var t=n.O.convertDateToUTC(e);return n.O.format(t,"YYYY-MM-DDTHH:mm:ss")}function i(){return new Date(2021,0,1)}function l(){return new Date}function u(e){return e.find((function(e){return!!e.default}))}function m(e,t){if(t)return e.find((function(e){return e.name===t}))}function d(){var e=i(),t=(new Date).getFullYear(),r=t===e.getFullYear();return[{name:c("today"),startDate:new Date,endDate:new Date},{name:c("thisMonth"),startDate:new Date(t,(new Date).getMonth(),1),endDate:new Date},{name:c("lastThreeMonths"),startDate:new Date(t,(new Date).getMonth()-2,1),endDate:new Date},{name:c("lastSixMonths"),startDate:new Date(t,(new Date).getMonth()-5,1),endDate:new Date},{name:c("thisYear"),startDate:new Date(t,0,1),endDate:new Date},{name:c("lastYear"),startDate:new Date(t-1,0,1),endDate:new Date(t,0,0),disabled:r,tooltip:r?c("lastYearDisabled"):""},{name:c("allTime"),startDate:n.O.subtract(new Date,5,"years"),endDate:new Date,default:!0}]}function f(e){return n.O.format(e,"YYYY-MM-DD")}function p(e){return e.name?{rangeName:e.name}:{from:f(e.startDate),to:f(e.endDate)}}function g(e,t){var r=t.to,a=t.from,c=t.rangeName,s=m(e,c);if(s)return a||r?void o.e.updateParams(p(s),{replace:!0,merge:!0,keysToRemove:["from","to"]}):s;var d=u(e);if(a&&r&&n.O.isValid(a)&&n.O.isValid(r)){var f=!0,g=n.O.convertDateToUTC(new Date(a)),v=n.O.convertDateToUTC(new Date(r));n.O.isBefore(g,i(),"day")&&(g=i(),f=!1),n.O.isAfter(v,l(),"day")&&(v=l(),f=!1),n.O.isAfter(g,v)&&(g=d.startDate,v=d.endDate,f=!1);var y={startDate:g,endDate:v,name:f?c:""};if(f)return y;o.e.updateParams(p(y),{replace:!0,merge:!0,keysToRemove:["rangeName"]})}else o.e.updateParams(p(d),{replace:!0,merge:!0,keysToRemove:["rangeName"]})}function v(e,t){var r=function(e){return s(n.O.startOf(e,"day"))},a=function(e){return s(n.O.endOf(e,"day"))},o=m(e,t.rangeName);if(o)return{start:r(f(o.startDate)),end:a(f(o.endDate))};if(t.from&&t.to)return{start:r(t.from),end:a(t.to)};var c=u(e);return{start:r(f(c.startDate)),end:a(f(c.endDate))}}},1568:(e,t,r)=>{r.r(t),r.d(t,{GenerateInteractiveResultsReportView:()=>R});var a=r(32735),n=r(23481),o=r(2948),c=r(20354),s=r(110),i=r(48258),l=r(71553),u=r(41196),m=r(26025),d=r(74901),f=r(40003),p=r(2606),g=r(9111),v=r(13876),y=r(83345),D=r(38143),h=r(28972),b=r(20768),w=r(31949),O=r(69883),A=r(83140),I=r(80845),E=r(64818);function k(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var a,n,o,c,s=[],i=!0,l=!1;try{if(o=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;i=!1}else for(;!(i=(a=o.call(r)).done)&&(s.push(a.value),s.length!==t);i=!0);}catch(e){l=!0,n=e}finally{try{if(!i&&null!=r.return&&(c=r.return(),Object(c)!==c))return}finally{if(l)throw n}}return s}}(e,t)||function(e,t){if(e){if("string"==typeof e)return C(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?C(e,t):void 0}}(e,t)||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.")}()}function C(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,a=Array(t);r<t;r++)a[r]=e[r];return a}var T="shared.generateReport",M=n.T.encloseNamespace(T);function N(e){var t=s.O.convertUTCToLocal(e).toString();return s.O.format(t,"Do MMMM YYYY")}function R(e){var t,r,n=k((0,o.D)(D.g.ANONYMISE_USERS),1)[0],s=(0,O.Z)(),C=c.a.useGetFetchAsync(),R=m.B.getAudienceAppLinkParams(),L=m.B.getDateRangeAppLinkParams(),S=(0,f.wO)((0,f.Hb)(),L),j=k(a.useState(!1),2),P=j[0],Y=j[1],G=c.a.useBasicFetch(w.N.currentUser()),x=c.a.useBasicFetch(b.b.interactiveMetadata(e.interactiveId)),H=c.a.useBasicFetch((null===(t=x.data)||void 0===t?void 0:t.interactiveId)?b.b.interactive(x.data.interactiveId):null),F=(0,u.W)(e.interactiveId,Object.assign(Object.assign({},S),(0,d.K)(R))),B=(0,I.Q)(H.data),Z=(0,i.Fx)(H.data,F.data,!1,n);return a.createElement(y.D.Provider,{value:T},a.createElement(g.G,{title:M("title"),showLoadingSpinner:!G.hasCompleted,closePopup:e.closePopup},a.createElement(a.Fragment,null,a.createElement("p",null,a.createElement(y.x,{phrase:"description"})),a.createElement("p",null,a.createElement(y.x,{phrase:"dateRange",options:{dateFrom:N(S.start),dateTo:N(S.end)}})),a.createElement("p",null,a.createElement(y.x,{phrase:"emailDescription",options:{email:null===(r=G.data)||void 0===r?void 0:r.email}})),a.createElement(v.u,null,a.createElement(v.u.Cancel,{onClick:e.closePopup}),a.createElement(v.u.Submit,{variant:"dark",onClick:function(){Y(!0);var t={interactiveName:x.data.name,userId:G.data.id,customerId:G.data.customerId,questions:B.map((function(e){return e.name})),rows:Z.map((function(e){return{name:E.l.getFullName(e.user),unanswered:e.summary.unanswered,percentage:(0,p.DV)((0,p.Ki)(e.summary.percentCorrect)),correct:e.summary.correct,totalQuestions:e.summary.answered+e.summary.unanswered,results:B.map((function(t){switch(A.A.isInteractionCorrect(t,(0,I.j_)(e))){case h.w.Correct:return M("correct");case h.w.Incorrect:return M("incorrect");case h.w.NotApplicable:return"-";case h.w.AwaitingMarking:return M("awaitingMarking");case h.w.UnAnswered:case h.w.Answered:default:return""}}))}}))};C(l.I.interactiveResultsReport(t)).then((function(){s.success(M("success"))})).catch((function(){s.error(M("error"))})).finally(e.closePopup)},text:M("generateReport"),showSpinner:P})))))}},40782:(e,t,r)=>{r.d(t,{I:()=>a,O:()=>i});var a,n=r(32735),o=r(2606),c=r(62712);function s(e){var t=n.useCallback((function(t){if(t){var r=t.r.baseVal.value,a=2*Math.PI*r,n=a-e.percentage*a;t.style.strokeDasharray="".concat(a," ").concat(a),t.style.strokeDashoffset=n.toString()}}),[e.percentage]);return n.createElement("svg",null,n.createElement("circle",{r:(0,o.pu)(e.size),className:c.Z.backgroundCircle}),!(0,o.zR)(e.percentage)&&n.createElement("circle",{ref:t,r:(0,o.pu)(e.size),className:(0,o.V4)(e.percentage,e.scoreThresholds)}))}function i(e){var t,r=(0,o.Ki)(e.percentage),i=e.layout===a.LabelInside?o.Mk.Large:o.Mk.Small,l=e.customLabel||(0,o.DV)(r);return e.layout===a.LabelOnly?n.createElement("span",{className:(0,o.IA)(r)},l):n.createElement("div",{className:"d-flex align-items-center justify-content-between ".concat(null!==(t=e.className)&&void 0!==t?t:"")},e.layout===a.LabelBefore&&n.createElement("span",{className:"me-2"},l),n.createElement("div",{className:(0,o.tw)(i,r)},n.createElement(s,{percentage:r,size:i,scoreThresholds:e.scoreThresholds}),e.layout===a.LabelInside&&n.createElement("span",{className:c.Z.centredPercentageText},l)))}!function(e){e.CircleOnly="circle_only",e.LabelOnly="label_only",e.LabelBefore="label_before",e.LabelInside="label_inside"}(a||(a={})),i.defaultProps={layout:a.CircleOnly}},2606:(e,t,r)=>{r.d(t,{DV:()=>g,IA:()=>d,Ki:()=>p,Mk:()=>a,V4:()=>m,pu:()=>u,tw:()=>f,zR:()=>v});var a,n=r(94892),o=r(62712),c=2,s=5.8,i=.2,l=.36;function u(e){var t=e===a.Large?s:c,r=e===a.Large?l:i;return"".concat(t/2-2*r,"rem")}function m(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:n.i;return e>=t.HIGH?o.Z.circleSuccess:e>=t.MODERATE?o.Z.circleWarning:o.Z.circleDanger}function d(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:n.i;return e>=t.HIGH?"text-success":e>=t.MODERATE?"text-warning":"text-danger"}function f(e,t){var r="d-inline-block ".concat(o.Z.circleContainer);return e===a.Large&&(r+=" ".concat(o.Z.lgCircleContainer)),v(t)&&(r+=" ".concat(o.Z.pendingCircle)),r}function p(e){if(!v(e))return+e.toFixed(2)}function g(e){return v(e)?"--%":"".concat(Math.round(100*e),"%")}function v(e){return"number"!=typeof e}!function(e){e.Small="small",e.Large="large"}(a||(a={}))},94892:(e,t,r)=>{r.d(t,{T:()=>n,i:()=>a});var a={HIGH:.75,MODERATE:.5},n={HIGH:.7,MODERATE:.7}},62875:(e,t,r)=>{function a(e,t,r){var a="".concat(e,":").concat(t.start,":").concat(t.end),n=Array.isArray(t.userId)?t.userId.sort().join(":"):t.userId,o=Array.isArray(t.groupId)?t.groupId.sort().join(":"):t.groupId;return n&&(a+=":".concat(n)),o&&(a+=":".concat(o)),r&&(a+=":".concat(r)),a}r.d(t,{H:()=>a})},57266:(e,t,r)=>{r.d(t,{e:()=>c});var a=r(81886),n=r(1048),o=r(75795),c={updateParams:function(e,t){var r=o.O.getCurrentRoute().appLink,c="string"==typeof r.params?a.Q.Ab.DeserializeQueryParams(r.params):r.params;t.keysToRemove&&(c=n.t.omit(c,t.keysToRemove));var s=(null==t?void 0:t.merge)?Object.assign(Object.assign({},c),e):e,i=Object.assign(Object.assign({},r),{params:s});n.t.isEqual(r,i)||a.Q.C$.trigger(i,n.t.omit(t,["merge","keysToRemove"]))}}},62712:(e,t,r)=>{r.d(t,{Z:()=>a});const a={circleContainer:"p8Vgz",backgroundCircle:"asGGE",circleSuccess:"PXLNj",circleWarning:"ZckRN",circleDanger:"slBRg",lgCircleContainer:"N8KCI",pendingCircle:"DKrcq",centredPercentageText:"tpmLR"}}}]);
2
+ //# sourceMappingURL=2788-86687fd69d-lite.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/2788-86687fd69d-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/analytics/utils/AnalyticsFilterUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/AnonymiseUserUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/AudienceUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/DateRangeUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/views/generate-report/GenerateInteractiveResultsReportView.tsx","file:///app/packages/libs/shared/src/components/percentage-indicator/PercentageIndicator.tsx","file:///app/packages/libs/shared/src/components/percentage-indicator/PercentageIndicatorUtils.ts","file:///app/packages/libs/shared/src/constants/ScoreThresholds.ts","file:///app/packages/libs/shared/src/utils/AnalyticsRequestUtils.ts","file:///app/packages/libs/shared/src/utils/AppRouteHelper.ts","file:///app/packages/libs/shared/src/components/percentage-indicator/percentage-indicator.scss"],"sourcesContent":["import { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AudienceQueryParams } from 'libs/shared/apps/analytics/interfaces/AudienceQueryParams';\nimport { DateRangeQueryParams } from 'libs/shared/apps/analytics/interfaces/DateRangeQueryParams';\nimport { ContextService } from 'libs/shared/services/ContextService';\n\nexport const AnalyticsFilterHelper = {\n getAudienceAppLinkParams: () => {\n const { appLink } = ContextService.getCurrentRoute();\n const params = ObjectHelper.isObject(appLink.params) ? appLink.params as HashObject : {};\n const { users, classrooms, classroomGroups } = params;\n\n const getParam = (key: keyof AudienceQueryParams) => {\n const param = params[key];\n\n if (!param)\n return;\n\n return Array.isArray(param) ? param : [param];\n };\n\n const audienceFilters: AudienceQueryParams = {};\n\n if (users)\n audienceFilters.users = getParam('users');\n\n if (classrooms)\n audienceFilters.classrooms = getParam('classrooms');\n\n if (classroomGroups)\n audienceFilters.classroomGroups = getParam('classroomGroups');\n\n return audienceFilters;\n },\n getDateRangeAppLinkParams: () => {\n const { appLink } = ContextService.getCurrentRoute();\n const params = ObjectHelper.isObject(appLink.params) ? appLink.params as HashObject : {};\n const { from, to, rangeName } = params;\n\n const dateRangeFilters: DateRangeQueryParams = {};\n\n if (from)\n dateRangeFilters.from = from;\n\n if (to)\n dateRangeFilters.to = to;\n\n if (rangeName)\n dateRangeFilters.rangeName = rangeName;\n\n return dateRangeFilters;\n }\n};","import { animals, colors, Config as UniqueNamesConfig, uniqueNamesGenerator } from 'unique-names-generator';\n\nimport { User } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\n\nfunction getUniqueNamesConfig(user: User): UniqueNamesConfig {\n /**\n * Generate a seed that is unique to each user but changes every 5 minutes.\n * \n * We use a seed so that if the same user's name is anonymised multiple times\n * in quick succession (e.g. multiple renders), the same name will be returned each time.\n * \n * We change the seed every 5 minutes so that students don't always have the same name.\n */\n const seed = +`${user.id}${Math.floor((new Date()).getMinutes() / 5)}`;\n\n return {\n dictionaries: [ colors, animals ],\n separator: ' ',\n length: 2,\n style: 'capital',\n seed\n };\n}\n\nexport function anonymiseUserName(user: User, shouldAnonymise: boolean): string {\n if (!shouldAnonymise)\n return UserHelper.getFullName(user);\n\n return uniqueNamesGenerator(getUniqueNamesConfig(user));\n}\n","import { AudienceQueryParams } from 'libs/shared/apps/analytics/interfaces/AudienceQueryParams';\n\nexport const getAudienceParams = (queryParams: AudienceQueryParams) => {\n const userId: string[] = [];\n const groupId: string[] = [];\n\n if (queryParams.users)\n userId.push(...queryParams.users);\n\n if (queryParams.classrooms)\n groupId.push(...queryParams.classrooms);\n\n if (queryParams.classroomGroups)\n groupId.push(...queryParams.classroomGroups);\n return {\n userId,\n groupId\n };\n};","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { DateRangeQueryParams } from 'libs/shared/apps/analytics/interfaces/DateRangeQueryParams';\nimport { FilterQueryParams } from 'libs/shared/apps/analytics/interfaces/FilterQueryParams';\nimport { DateRange } from 'libs/shared/interfaces';\nimport { AppRouteHelper } from 'libs/shared/utils/AppRouteHelper';\n\nconst namespace = 'shared.analyticsUtils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function convertDateToUtcDateTimeString(date: Date): string {\n const utc = DateHelper.convertDateToUTC(date);\n return DateHelper.format(utc, 'YYYY-MM-DDTHH:mm:ss');\n}\n\nexport function getMinDate(): Date {\n return new Date(2021, 0, 1);\n}\n\nexport function getMaxDate(): Date {\n return new Date();\n}\n\nexport function getDefaultDateRange(dateRangePresetss: DateRange[]): DateRange {\n return dateRangePresetss.find(range => !!range.default);\n}\n\nexport function getPresetRangeByName(dateRangePresetss: DateRange[], rangeName: string): DateRange | undefined {\n if (!rangeName)\n return;\n\n const presets = dateRangePresetss;\n \n return presets.find(p => p.name === rangeName);\n}\n\nexport function getGenericDateRangePresets(): DateRange[] {\n const minDate = getMinDate();\n const currentYear = (new Date()).getFullYear();\n\n const isMinDateThisYear = currentYear === minDate.getFullYear();\n\n return [\n {\n name: getPhrase('today'),\n startDate: new Date(),\n endDate: new Date()\n },\n {\n name: getPhrase('thisMonth'),\n startDate: new Date(currentYear, new Date().getMonth(), 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastThreeMonths'),\n startDate: new Date(currentYear, new Date().getMonth() - 2, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastSixMonths'),\n startDate: new Date(currentYear, new Date().getMonth() - 5, 1),\n endDate: new Date(),\n default: true\n },\n {\n name: getPhrase('thisYear'),\n startDate: new Date(currentYear, 0, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastYear'),\n startDate: new Date(currentYear - 1, 0, 1),\n endDate: new Date(currentYear, 0, 0),\n disabled: isMinDateThisYear,\n tooltip: isMinDateThisYear ? getPhrase('lastYearDisabled') : ''\n }\n ];\n}\n\nexport function getInsightsDateRangePresets(): DateRange[] {\n const minDate = getMinDate();\n const currentYear = (new Date()).getFullYear();\n\n const isMinDateThisYear = currentYear === minDate.getFullYear();\n\n return [\n {\n name: getPhrase('today'),\n startDate: new Date(),\n endDate: new Date()\n },\n {\n name: getPhrase('thisMonth'),\n startDate: new Date(currentYear, new Date().getMonth(), 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastThreeMonths'),\n startDate: new Date(currentYear, new Date().getMonth() - 2, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastSixMonths'),\n startDate: new Date(currentYear, new Date().getMonth() - 5, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('thisYear'),\n startDate: new Date(currentYear, 0, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastYear'),\n startDate: new Date(currentYear - 1, 0, 1),\n endDate: new Date(currentYear, 0, 0),\n disabled: isMinDateThisYear,\n tooltip: isMinDateThisYear ? getPhrase('lastYearDisabled') : ''\n },\n {\n name: getPhrase('allTime'),\n startDate: DateHelper.subtract(new Date(), 5, 'years'),\n endDate: new Date(),\n default: true\n }\n ];\n}\n\nexport function formatDateQueryParam(date: Date): string {\n return DateHelper.format(date, 'YYYY-MM-DD');\n}\n\nexport function getRouteQueryParams(dateRange: DateRange): DateRangeQueryParams {\n if (dateRange.name)\n return { rangeName: dateRange.name };\n\n return {\n from: formatDateQueryParam(dateRange.startDate),\n to: formatDateQueryParam(dateRange.endDate)\n };\n}\n\nexport function useGetDateRangeFromQueryParams(\n dateRangePresets: DateRange[],\n dateRangeQueryParams: DateRangeQueryParams\n): DateRange | null {\n const { to, from, rangeName } = dateRangeQueryParams;\n \n const presetRange = getPresetRangeByName(dateRangePresets, rangeName);\n\n if (presetRange) {\n if (!from && !to)\n return presetRange;\n\n /**\n * If a rangeName has been set, we don't use to and from so we remove them from the url params.\n */\n AppRouteHelper.updateParams(\n getRouteQueryParams(presetRange),\n { replace: true, merge: true, keysToRemove: [ 'from', 'to' ]}\n );\n return;\n }\n\n const defaultDateRange = getDefaultDateRange(dateRangePresets);\n\n /**\n * If a param is missing, or one of them isn't a valid date, short-circuit the logic below.\n */\n if (!from || !to || !DateHelper.isValid(from) || !DateHelper.isValid(to)) {\n AppRouteHelper.updateParams(\n getRouteQueryParams(defaultDateRange),\n { replace: true, merge: true, keysToRemove: ['rangeName']}\n );\n return;\n }\n\n let initialDateRangeValid = true;\n\n let startDate = DateHelper.convertDateToUTC(new Date(from));\n let endDate = DateHelper.convertDateToUTC(new Date(to));\n\n if (DateHelper.isBefore(startDate, getMinDate(), 'day')) {\n startDate = getMinDate();\n initialDateRangeValid = false;\n }\n\n if (DateHelper.isAfter(endDate, getMaxDate(), 'day')) {\n endDate = getMaxDate();\n initialDateRangeValid = false;\n }\n\n if (DateHelper.isAfter(startDate, endDate)) {\n startDate = defaultDateRange.startDate;\n endDate = defaultDateRange.endDate;\n initialDateRangeValid = false;\n }\n\n const dateRange: DateRange = { startDate, endDate, name: initialDateRangeValid ? rangeName : '' };\n\n if (initialDateRangeValid)\n return dateRange;\n\n /**\n * If one or both of the date params were invalid, we trigger a route update.\n */\n AppRouteHelper.updateParams(getRouteQueryParams(dateRange), { replace: true, merge: true, keysToRemove: ['rangeName']});\n}\n\nexport function getStartEndParams(\n dateRangePresetss: DateRange[],\n filterParams: FilterQueryParams\n): { start: string; end: string } {\n const getStartDate = (date: string) => convertDateToUtcDateTimeString(DateHelper.startOf(date, 'day'));\n const getEndDate = (date: string) => convertDateToUtcDateTimeString(DateHelper.endOf(date, 'day'));\n\n const presetRange = getPresetRangeByName(dateRangePresetss, filterParams.rangeName);\n\n /**\n * If the user has chosen a preset range, lookup the start and end dates as they won't be\n * in the query params.\n */\n if (presetRange)\n return {\n start: getStartDate(formatDateQueryParam(presetRange.startDate)),\n end: getEndDate(formatDateQueryParam(presetRange.endDate))\n };\n\n /**\n * If they have chosen a custom date range, use their chosen start and end dates.\n */\n if (filterParams.from && filterParams.to)\n return {\n start: getStartDate(filterParams.from),\n end: getEndDate(filterParams.to)\n };\n\n /**\n * The below should never be hit\n */\n const defaultRange = getDefaultDateRange(dateRangePresetss);\n\n return {\n start: getStartDate(formatDateQueryParam(defaultRange.startDate)),\n end: getEndDate(formatDateQueryParam(defaultRange.endDate))\n };\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { useGetResultsTableData } from 'libs/shared/apps/analytics/components/student-results/student-results-table/StudentResultsTableUtils';\nimport { InteractiveResultsRequests } from 'libs/shared/apps/analytics/flight-requests/InteractiveResultsRequests';\nimport { useFetchInteractiveResults } from 'libs/shared/apps/analytics/hooks/UseFetchInteractiveResults';\nimport { InteractiveResultsReport } from 'libs/shared/apps/analytics/interfaces/requests/InteractiveResultsReport';\nimport { AnalyticsFilterHelper } from 'libs/shared/apps/analytics/utils/AnalyticsFilterUtils';\nimport { getAudienceParams } from 'libs/shared/apps/analytics/utils/AudienceUtils';\nimport { getInsightsDateRangePresets, getStartEndParams } from 'libs/shared/apps/analytics/utils/DateRangeUtils';\nimport { getFormattedPercentage, getPercentageToFixed } from 'libs/shared/components/percentage-indicator/PercentageIndicatorUtils';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { CurrentUser, Interactive, InteractiveMetadata, PopupViewProps } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { getInteractions, getStudentResult } from 'libs/shared/utils/InteractiveHelper';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nconst namespace = 'shared.generateReport';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getReportFriendlyDate(date: string): string {\n const localDate = DateHelper.convertUTCToLocal(date).toString();\n return DateHelper.format(localDate, 'Do MMMM YYYY');\n}\n\ninterface GenerateInteractiveResultsReportViewProps extends PopupViewProps {\n interactiveId: string;\n}\n\nexport function GenerateInteractiveResultsReportView(props: GenerateInteractiveResultsReportViewProps): JSX.Element {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n const alerts = useAlerts();\n const fetchAsync = Flight.useGetFetchAsync();\n\n const audienceAppLinkParams = AnalyticsFilterHelper.getAudienceAppLinkParams();\n const dateRangeAppLinkParams = AnalyticsFilterHelper.getDateRangeAppLinkParams();\n const startEndParams = getStartEndParams(getInsightsDateRangePresets(), dateRangeAppLinkParams);\n\n const [ showSpinner, setShowSpinner ] = React.useState(false);\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n InteractiveRequests.interactiveMetadata(props.interactiveId)\n );\n const interactive = Flight.useBasicFetch<Interactive>(interactiveMetadata.data?.interactiveId ?\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId) : null);\n const results = useFetchInteractiveResults(props.interactiveId, {\n ...startEndParams,\n ...getAudienceParams(audienceAppLinkParams)\n });\n\n const interactions = getInteractions(interactive.data);\n\n const answerData = useGetResultsTableData(interactive.data, results.data, false, anonymiseUsers);\n\n function onClickGenerate(): void {\n setShowSpinner(true);\n\n const body: InteractiveResultsReport = {\n interactiveName: interactiveMetadata.data.name,\n userId: currentUser.data.id,\n customerId: currentUser.data.customerId,\n questions: interactions.map(i => i.name),\n rows: answerData.map(answer => {\n return {\n name: UserHelper.getFullName(answer.user),\n unanswered: answer.summary.unanswered,\n percentage: getFormattedPercentage(getPercentageToFixed(answer.summary.percentCorrect)),\n correct: answer.summary.correct,\n totalQuestions: answer.summary.answered + answer.summary.unanswered,\n results: interactions.map(interaction => {\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(\n interaction,\n getStudentResult(answer)\n );\n\n switch (correctness) {\n case InteractionCorrectness.Correct:\n return getPhrase('correct');\n\n case InteractionCorrectness.Incorrect:\n return getPhrase('incorrect');\n\n case InteractionCorrectness.NotApplicable:\n return '-';\n\n case InteractionCorrectness.AwaitingMarking:\n return getPhrase('awaitingMarking');\n\n case InteractionCorrectness.UnAnswered:\n case InteractionCorrectness.Answered:\n default:\n return '';\n }\n })\n };\n })\n };\n\n fetchAsync(InteractiveResultsRequests.interactiveResultsReport(body))\n .then(() => {\n alerts.success(getPhrase('success'));\n })\n .catch(() => {\n alerts.error(getPhrase('error'));\n })\n .finally(props.closePopup);\n }\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <Popup\n title={getPhrase('title')}\n showLoadingSpinner={!currentUser.hasCompleted}\n closePopup={props.closePopup}\n >\n <>\n <p>\n <Text phrase='description' />\n </p>\n <p>\n <Text phrase='dateRange' options={({\n dateFrom: getReportFriendlyDate(startEndParams.start),\n dateTo: getReportFriendlyDate(startEndParams.end)\n })} />\n </p>\n <p>\n <Text phrase='emailDescription' options={({ email: currentUser.data?.email })} />\n </p>\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.closePopup} />\n <PopupButtons.Submit\n variant='dark'\n onClick={onClickGenerate}\n text={getPhrase('generateReport')}\n showSpinner={showSpinner}\n />\n </PopupButtons>\n </>\n </Popup>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\n\nimport { ScoreThresholds } from 'libs/shared/constants/ScoreThresholds';\n\nimport {\n getCircleClassName,\n getCircleContainerClassName,\n getCircleRadius,\n getColouredLabelClassName,\n getFormattedPercentage,\n getPercentageToFixed,\n isPending,\n ProgressCircleSize\n} from './PercentageIndicatorUtils';\n\nimport styles from './percentage-indicator.scss';\n\ninterface ProgressCircleProps {\n size: ProgressCircleSize;\n scoreThresholds?: ScoreThresholds;\n percentage?: number;\n}\n\nfunction ProgressCircle(props: ProgressCircleProps): JSX.Element {\n const ref = React.useCallback((circle: SVGCircleElement) => {\n if (!circle)\n return;\n \n const radius = circle.r.baseVal.value;\n const circumference = 2 * Math.PI * radius;\n const offset = circumference - props.percentage * circumference;\n \n circle.style.strokeDasharray = `${circumference} ${circumference}`;\n circle.style.strokeDashoffset = offset.toString();\n }, [props.percentage]);\n\n return (\n <svg>\n <circle r={getCircleRadius(props.size)} className={styles.backgroundCircle} />\n {!isPending(props.percentage) &&\n <circle\n ref={ref}\n r={getCircleRadius(props.size)}\n className={getCircleClassName(props.percentage, props.scoreThresholds)}\n />\n }\n </svg>\n );\n}\n\nexport enum PercentageIndicatorLayout {\n CircleOnly = 'circle_only',\n LabelOnly = 'label_only',\n LabelBefore = 'label_before',\n LabelInside = 'label_inside'\n}\n\ninterface PercentageIndicatorProps {\n layout: PercentageIndicatorLayout;\n percentage?: number; // Between 0 and 1 or undefined for pending\n className?: string;\n customLabel?: string;\n scoreThresholds?: ScoreThresholds;\n}\n\nPercentageIndicator.defaultProps = {\n layout: PercentageIndicatorLayout.CircleOnly\n};\n\nexport function PercentageIndicator(props: PercentageIndicatorProps): JSX.Element {\n const percentageToFixed = getPercentageToFixed(props.percentage);\n\n const size = props.layout === PercentageIndicatorLayout.LabelInside\n ? ProgressCircleSize.Large\n : ProgressCircleSize.Small;\n\n const label = props.customLabel || getFormattedPercentage(percentageToFixed);\n\n if (props.layout === PercentageIndicatorLayout.LabelOnly)\n return (\n <span className={getColouredLabelClassName(percentageToFixed)}>\n {label}\n </span>\n );\n\n return (\n <div className={`d-flex align-items-center justify-content-between ${props.className ?? ''}`}>\n {props.layout === PercentageIndicatorLayout.LabelBefore &&\n <span className='me-2'>\n {label}\n </span>\n }\n <div className={getCircleContainerClassName(size, percentageToFixed)}>\n <ProgressCircle percentage={percentageToFixed} size={size} scoreThresholds={props.scoreThresholds} />\n {props.layout === PercentageIndicatorLayout.LabelInside &&\n <span className={styles.centredPercentageText}>\n {label}\n </span>\n }\n </div>\n </div>\n );\n}","import { ScoreThresholdDefaults, ScoreThresholds } from 'libs/shared/constants/ScoreThresholds';\n\nimport styles from './percentage-indicator.scss';\n\n/**\n * Values for width and strokeWidth are taken from progress-circle.scss.\n * If either are changed, they must be updated in both places.\n */\nconst CIRCLE_WIDTH = 2; // rem\nconst CIRCLE_WIDTH_LG = 5.8; // rem\nconst CIRCLE_STROKE_WIDTH = 0.2; // rem\nconst CIRCLE_STROKE_WIDTH_LG = 0.36; // rem\n \nexport enum ProgressCircleSize {\n Small = 'small',\n Large = 'large'\n}\n\n/**\n * radius = width / 2 - strokeWidth * 2\n */\nexport function getCircleRadius(size: ProgressCircleSize): string {\n const width = size === ProgressCircleSize.Large ? CIRCLE_WIDTH_LG : CIRCLE_WIDTH;\n const strokeWidth = size === ProgressCircleSize.Large ? CIRCLE_STROKE_WIDTH_LG : CIRCLE_STROKE_WIDTH;\n return `${width / 2 - strokeWidth * 2}rem`;\n}\n \nexport function getCircleClassName(\n percentage: number,\n scoreThresholds: ScoreThresholds = ScoreThresholdDefaults\n): string {\n if (percentage >= scoreThresholds.HIGH)\n return styles.circleSuccess;\n \n if (percentage >= scoreThresholds.MODERATE)\n return styles.circleWarning;\n \n return styles.circleDanger;\n}\n \nexport function getColouredLabelClassName(\n percentage: number,\n scoreThresholds: ScoreThresholds = ScoreThresholdDefaults\n): string {\n if (percentage >= scoreThresholds.HIGH)\n return 'text-success';\n \n if (percentage >= scoreThresholds.MODERATE)\n return 'text-warning';\n \n return 'text-danger';\n}\n \nexport function getCircleContainerClassName(size: ProgressCircleSize, percentage?: number): string {\n let className = `d-inline-block ${styles.circleContainer}`;\n \n if (size === ProgressCircleSize.Large)\n className += ` ${styles.lgCircleContainer}`;\n\n if (isPending(percentage))\n className += ` ${styles.pendingCircle}`;\n \n return className;\n}\n\nexport function getPercentageToFixed(percentage?: number): number | undefined {\n if (isPending(percentage))\n return;\n \n return +percentage.toFixed(2);\n}\n \nexport function getFormattedPercentage(percentage?: number): string {\n if (isPending(percentage))\n return `--%`;\n\n return `${Math.round(percentage * 100)}%`;\n}\n\nexport function isPending(percentage?: number): boolean {\n return typeof percentage !== 'number';\n}","export interface ScoreThresholds {\n HIGH: number;\n MODERATE: number;\n}\n\nexport const ScoreThresholdDefaults: ScoreThresholds = {\n HIGH: 0.75,\n MODERATE: 0.5\n};\n\nexport const ScoreThresholdInsights: ScoreThresholds = {\n HIGH: 0.7,\n MODERATE: 0.7\n};","import { AnalyticsRequestFilter } from 'libs/shared/interfaces';\n\nexport function getAnalyticsRequestKey(baseKey: string, filter: AnalyticsRequestFilter, sharerId?: string): string {\n let key = `${baseKey}:${filter.start}:${filter.end}`;\n\n const userIdKey = Array.isArray(filter.userId) ? filter.userId.sort().join(':') : filter.userId;\n const groupIdKey = Array.isArray(filter.groupId) ? filter.groupId.sort().join(':') : filter.groupId;\n\n if (userIdKey)\n key += `:${userIdKey}`;\n\n if (groupIdKey)\n key += `:${groupIdKey}`;\n\n if (sharerId)\n key += `:${sharerId}`;\n\n return key;\n}","import { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { ContextService } from 'libs/shared/services/ContextService';\n\ninterface UpdateParamsOptions extends Core.AppLinkOptions {\n merge?: boolean;\n keysToRemove?: string[]\n}\n\nexport const AppRouteHelper = {\n /**\n * Utility to update the params on the current appRoute.\n * \n * This is built on top of ContextService rather than build into AppLink\n * as we will generally only want to update params on appRoutes, not appLinks.\n */\n updateParams(params: HashObject, options?: UpdateParamsOptions): void {\n const { appLink } = ContextService.getCurrentRoute();\n\n let currentParams = typeof(appLink.params) === 'string'\n ? Core.LocationUtils.DeserializeQueryParams(appLink.params)\n : appLink.params as HashObject;\n\n if (options.keysToRemove)\n currentParams = ObjectHelper.omit(currentParams, options.keysToRemove);\n\n const updatedParams = options?.merge\n ? { ...currentParams, ...params }\n : params;\n\n const updatedAppLink = {\n ...appLink,\n params: updatedParams\n };\n\n /**\n * This prevents us pointlessly re-triggering if we're already on the right applink.\n */\n if (ObjectHelper.isEqual(appLink, updatedAppLink))\n return;\n \n Core.AppLinkHelper.trigger(updatedAppLink, ObjectHelper.omit(options, [ 'merge', 'keysToRemove' ]));\n }\n};","// extracted by mini-css-extract-plugin\nexport default {\"circleContainer\":\"p8Vgz\",\"backgroundCircle\":\"asGGE\",\"circleSuccess\":\"PXLNj\",\"circleWarning\":\"ZckRN\",\"circleDanger\":\"slBRg\",\"lgCircleContainer\":\"N8KCI\",\"pendingCircle\":\"DKrcq\",\"centredPercentageText\":\"tpmLR\"};"],"names":["AnalyticsFilterHelper","getAudienceAppLinkParams","appLink","params","users","classrooms","classroomGroups","getParam","key","param","Array","isArray","audienceFilters","getDateRangeAppLinkParams","from","to","rangeName","dateRangeFilters","anonymiseUserName","user","shouldAnonymise","seed","id","Math","floor","Date","getMinutes","dictionaries","separator","length","style","getUniqueNamesConfig","getAudienceParams","queryParams","userId","groupId","push","getPhrase","convertDateToUtcDateTimeString","date","utc","getMinDate","getMaxDate","getDefaultDateRange","dateRangePresetss","find","range","getPresetRangeByName","p","name","getInsightsDateRangePresets","minDate","currentYear","getFullYear","isMinDateThisYear","startDate","endDate","getMonth","disabled","tooltip","default","formatDateQueryParam","getRouteQueryParams","dateRange","useGetDateRangeFromQueryParams","dateRangePresets","dateRangeQueryParams","presetRange","replace","merge","keysToRemove","defaultDateRange","initialDateRangeValid","getStartEndParams","filterParams","getStartDate","getEndDate","start","end","defaultRange","namespace","getReportFriendlyDate","localDate","toString","GenerateInteractiveResultsReportView","props","anonymiseUsers","alerts","fetchAsync","audienceAppLinkParams","dateRangeAppLinkParams","startEndParams","showSpinner","setShowSpinner","currentUser","interactiveMetadata","interactiveId","interactive","data","results","interactions","answerData","value","title","showLoadingSpinner","hasCompleted","closePopup","phrase","options","dateFrom","dateTo","email","onClick","variant","body","interactiveName","customerId","questions","map","i","rows","answer","unanswered","summary","percentage","percentCorrect","correct","totalQuestions","answered","interaction","I","then","success","error","text","PercentageIndicatorLayout","ProgressCircle","ref","circle","radius","r","baseVal","circumference","PI","offset","strokeDasharray","strokeDashoffset","size","className","scoreThresholds","PercentageIndicator","percentageToFixed","layout","LabelInside","label","customLabel","LabelOnly","LabelBefore","defaultProps","CircleOnly","ProgressCircleSize","CIRCLE_WIDTH","CIRCLE_WIDTH_LG","CIRCLE_STROKE_WIDTH","CIRCLE_STROKE_WIDTH_LG","getCircleRadius","width","Large","strokeWidth","getCircleClassName","HIGH","MODERATE","getColouredLabelClassName","getCircleContainerClassName","isPending","getPercentageToFixed","toFixed","getFormattedPercentage","round","ScoreThresholdDefaults","ScoreThresholdInsights","getAnalyticsRequestKey","baseKey","filter","sharerId","userIdKey","sort","join","groupIdKey","AppRouteHelper","updateParams","currentParams","updatedParams","updatedAppLink"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[2820],{62875:(e,t,a)=>{function n(e,t,a){var n="".concat(e,":").concat(t.start,":").concat(t.end),i=Array.isArray(t.userId)?t.userId.sort().join(":"):t.userId,r=Array.isArray(t.groupId)?t.groupId.sort().join(":"):t.groupId;return i&&(n+=":".concat(i)),r&&(n+=":".concat(r)),a&&(n+=":".concat(a)),n}a.d(t,{H:()=>n})},36511:(e,t,a)=>{a.d(t,{I:()=>i});var n=a(40424);function i(e){switch(e){case n.R.Pink:return"pink";case n.R.Orange:return"orange";case n.R.Green:return"green";case n.R.Blue:return"blue";case n.R.Purple:return"purple";case n.R.Indigo:return"indigo";default:return"pink"}}},95121:(e,t,a)=>{a.r(t),a.d(t,{ClassroomOverviewView:()=>S});var n=a(32735),i=a(23481),r=a(20354),s=a(49935),c=a(71020),l=a(5062),o=a(31949),d=a(79967),u=a(79612),m=a(99742),p=a(14070),v=a(97291),g=a(64208),h=a(88630),f=a(22602),E=a(64071),I=a(70835),b=a(23120),C=a(82202),w=a(63153),y=i.T.encloseNamespace("lite.insightsList");function S(e){var t,a,i=r.a.useGetFetch(),S=(0,d.k)(),O=r.a.useBasicFetch(o.N.currentUser()),k=r.a.useBasicFetch(O.data&&h.F.getClassroom(e.classroomId,O.data.id)),N=null===(a=null===(t=k.data)||void 0===t?void 0:t._integrations)||void 0===a?void 0:a.rostered,R=(0,g.aH)({recipientGroupId:[e.classroomId]},!0),j=R.sentShares,A=R.sharedObjects,L=R.shareRecipients,T=R.interactivesPendingReview,x=R.isFetching,H=R.showPartialLoading,M=R.nextCursor,V=R.hasMore,F=R.fetchNext,U=R.imageCdnUrl,D=R.dependencies;(0,u.M)({title:y("insights")});var _=(0,b.j)(S,{classrooms:[e.classroomId]});return O.data&&k.data?n.createElement(f.R,{activeTab:"overview",classroom:k.data,currentUser:O.data,onTogglePin:function(e,t,a){if(!N){var n=e?h.F.pinClassroom:h.F.unpinClassroom;i(n(k.data,t,a))}},isRostered:N},H?n.createElement(C.N,null):j.length?n.createElement(n.Fragment,null,n.createElement(I.G,{sentShares:j,sharedObjects:A,shareRecipients:L,interactivesPendingReviews:T,getObjectAppLink:w.Q,getObjectActions:_,imageCdnUrl:U,groupByDateShared:!0,dependencies:D,breakpoints:S,hideViews:!0}),(V||x)&&n.createElement(c._,{isFetching:x,fetchNext:F,nextCursor:M})):n.createElement(E.i,{appLink:{application:v.O.DASHBOARD,action:p.e.Dashboard.HOME},imageUrl:m.W.EmptyStates.Share.SHARED_WITH_ME})):n.createElement("div",{className:"px-3"},n.createElement("div",{className:"mb-1 partial-loading-background"}),n.createElement("div",{className:"pb-3"},n.createElement(s.b2,{numItems:2})),n.createElement("div",{className:"pb-2"},n.createElement(l.Z,null)))}},64071:(e,t,a)=>{a.d(t,{i:()=>c});var n=a(32735),i=a(23481),r=a(23232),s=i.T.encloseNamespace("insights.insightsListEmptyState");function c(e){return n.createElement(r.u,null,n.createElement(r.u.Image,{src:e.imageUrl,size:"small"}),n.createElement(r.u.Heading,null,s(e.useInteractiveCopy?"interactivesHeading":"genericHeading")),n.createElement(r.u.Info,null,s(e.useInteractiveCopy?"interactivesInfo":"genericInfo")),!!e.appLink&&n.createElement(r.u.Cta,{appLink:e.appLink,text:s("cta")}))}},70835:(e,t,a)=>{a.d(t,{G:()=>O});var n=a(32735),i=a(95834),r=a(69674),s=a(82602),c=a(23481),l=a(75896),o=a(110),d=a(65858),u=a(29024),m=a(40391),p=a(64249),v=a(83657),g=a(36848),h=a(83914),f=a(83345),E=a(4594),I=a(85063),b=a(35223),C=a(31908),w="insights.insightsListTable",y=c.T.encloseNamespace(w);function S(e){var t;if(e.type===I.y.ShareLink||!(null===(t=null==e?void 0:e.recipients)||void 0===t?void 0:t.length))return e.dateCreated;var a=e.recipients.map((function(e){return e.dateShared}));return a.sort((function(e,t){return o.O.isSame(e,t)?0:o.O.isAfter(e,t)?1:-2})),a.length?l.m.last(a):""}var O=n.memo((function(e){var t,a,c,l,o,O,k,N,R,j,A,L=(t=e.sentShares,a=e.sharedObjects,c=e.shareRecipients,l=e.interactivesPendingReviews,o=e.dependencies,n.useMemo((function(){var e=[];return t.forEach((function(t){var n,i,r=a.find((function(e){return e.id===t.objectId})),s=null;if(t.type===I.y.DirectShare&&(s=[],null===(n=t.recipients)||void 0===n||n.forEach((function(e){var t=c.find((function(t){return t.id===e.id}));t&&s.push(t)}))),r){var o=r.typeId===E.E.Interactive&&(null==l?void 0:l.find((function(e){return e.interactiveId===r.interactiveId})));e.push({share:t,sharedObject:r,shareRecipients:s,dateShared:S(t),viewCount:null!==(i=t.viewCount)&&void 0!==i?i:0,pendingReview:null==o?void 0:o.pendingReviewCount})}})),e}),o));return n.createElement(n.Fragment,null,n.createElement(r.i,{columns:(O=e.getObjectAppLink,k=e.getObjectActions,N=e.imageCdnUrl,R=e.breakpoints,j=e.hideViews,A=R&&(R.xs||R.sm||R.md),[{Header:y("title"),accessor:"sharedObject",id:"image",Cell:function(e){var t=e.value;return n.createElement("div",{className:"w-100"},n.createElement(u.k,{object:t,appLink:O(t),showVideoMetadata:!0,locationContext:d.LZ.SharedByMe}))},minWidth:140,maxWidth:30},{accessor:"sharedObject",id:"name",Cell:function(e){var t,a,i=e.value,r=e.row,s=e.data;if(i.name){if(C.M.isVideoType(i)&&!(null===(t=C.M.getCanBeConsumed(i))||void 0===t?void 0:t.canNavigate))return n.createElement("span",{className:"clamp-2"},i.name);var c=null===(a=s[r.index])||void 0===a?void 0:a.pendingReview;return n.createElement("div",null,n.createElement(g.F,{appLink:O(i),className:"clamp-2",analyticsData:{id:i.id,name:i.name},analyticsOptions:{entity:p.I.getAnalyticsEntity(i.type),actionType:d.Vw.Click,location:d.LZ.SharedByMe}},i.name),!!c&&n.createElement("div",{className:"bg-light-ultramarine text-ultramarine fw-semibold font-size-sm rounded-pill w-fit mt-1 px-2"},n.createElement(f.x,{namespace:w,phrase:"requireMarking",options:{count:c}})))}return n.createElement("span",null,n.createElement(f.x,{namespace:w,phrase:"videoUnavailable"}))},width:80},{Header:y("sharedTo"),accessor:"shareRecipients",Cell:function(e){var t=e.value;return t?t.length?n.createElement(m.Kh,{recipients:t,imageCdnUrl:N,maxAvatars:A?1:2}):n.createElement(m.m9,null):n.createElement(m.Ad,null)},width:30},!j&&{Header:y("views"),accessor:"share",Cell:function(e){var t=e.value;return n.createElement("div",{className:"d-flex align-items-center"},n.createElement(h.x,{svgName:b.vn.User}),n.createElement("span",null,t.accessedCount,t.totalAccessible?"/".concat(t.totalAccessible):""))},width:30},!A&&{Header:y("shared"),id:"dateShared",accessor:function(e){return(0,s.WU)(e.dateShared)},width:40},{accessor:"sharedObject",id:"actions",Cell:function(e){var t=e.value;return n.createElement(v.e,{actions:k(t),className:"w-100 justify-content-end align-items-center gap-2",actionsDropdownClassName:"bg-transparent",dropdownToggleSvgSize:h.S.Standard})},width:40}].filter(Boolean)),data:L,theme:i.J}))}))},23120:(e,t,a)=>{a.d(t,{j:()=>u,w:()=>m});var n=a(32735),i=a(23481),r=a(4594),s=a(35223),c=a(31908),l=a(14070),o=a(97291),d=i.T.encloseNamespace("lite.insightsList");function u(e,t){var a=e.xs||e.sm||e.md,i=JSON.stringify(t);return n.useCallback((function(e){return function(e,t,a){var n,i;c.M.isVideo(e)&&(n="video",i={application:o.O.INSIGHTS,action:l.e.Insights.VIDEO_OVERVIEW,args:[e.id]}),c.M.isInteractive(e)&&(n="interactive",i={application:o.O.INSIGHTS,action:l.e.Insights.INTERACTIVE_OVERVIEW,args:[e.id]}),c.M.isClip(e)&&(n="clip",i={application:o.O.INSIGHTS,action:l.e.Insights.CLIP_OVERVIEW,args:[e.id]}),e.typeId===r.E.Series&&(n="series"),e.typeId===r.E.Playlist&&(n="playlist");var u=[{label:d("editShareSettings"),appLink:{application:o.O.DEFAULT,action:l.e.Default.SHARE,args:[e.id],params:{entityType:n}}}];if(c.M.isVideoType(e)){if(!c.M.getCanBeConsumed(e).canConsume)return[];u.unshift({label:d("viewInsights"),className:"btn btn-outline-dark",button:!a,svgName:s.vn.Chart,appLink:Object.assign(Object.assign({},i),{params:t})})}return u}(e,t,a)}),[a,i])}function m(e){var t=null==e?void 0:e.typeId;return t?"string"==typeof t?[+t]:(null==e?void 0:e.typeId.map((function(e){return+e})))||[]:[]}}}]);
2
+ //# sourceMappingURL=2820-b3d1688da0-lite.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/2820-b3d1688da0-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/utils/AnalyticsRequestUtils.ts","file:///app/packages/libs/shared/src/utils/GroupHelper.ts","file:///app/packages/projects/lite/src/apps/classrooms/views/classroom-overview/ClassroomOverviewView.tsx","file:///app/packages/projects/lite/src/apps/insights/components/insights-list/empty-state/InsightsListEmptyState.tsx","file:///app/packages/projects/lite/src/apps/insights/components/insights-list/table/InsightsListTableUtils.tsx","file:///app/packages/projects/lite/src/apps/insights/components/insights-list/table/InsightsListTable.tsx","file:///app/packages/projects/lite/src/apps/insights/views/insights-list/InsightsListViewUtils.tsx"],"sourcesContent":["import { AnalyticsRequestFilter } from 'libs/shared/interfaces';\n\nexport function getAnalyticsRequestKey(baseKey: string, filter: AnalyticsRequestFilter, sharerId?: string): string {\n let key = `${baseKey}:${filter.start}:${filter.end}`;\n\n const userIdKey = Array.isArray(filter.userId) ? filter.userId.sort().join(':') : filter.userId;\n const groupIdKey = Array.isArray(filter.groupId) ? filter.groupId.sort().join(':') : filter.groupId;\n\n if (userIdKey)\n key += `:${userIdKey}`;\n\n if (groupIdKey)\n key += `:${groupIdKey}`;\n\n if (sharerId)\n key += `:${sharerId}`;\n\n return key;\n}","import { ButtonProps } from 'react-bootstrap';\n\nimport { ClassroomGroupColour } from 'libs/shared/interfaces';\n\nexport function mapColourToBsVariant(groupColour: ClassroomGroupColour): ButtonProps['variant'] {\n switch (groupColour) {\n case ClassroomGroupColour.Pink:\n return 'pink';\n case ClassroomGroupColour.Orange:\n return 'orange';\n case ClassroomGroupColour.Green:\n return 'green';\n case ClassroomGroupColour.Blue:\n return 'blue';\n case ClassroomGroupColour.Purple:\n return 'purple';\n case ClassroomGroupColour.Indigo:\n return 'indigo';\n default:\n return 'pink';\n }\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { PartialBreadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { PartialPillTabSelector } from 'libs/shared/components/pill-tab-selector/partial-loading/PartialPillTabSelector';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Classroom, CurrentUser } from 'libs/shared/interfaces';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useSharesTable } from 'shared/hooks/useSharesTable';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { ClassroomLayout } from 'apps/classrooms/layouts/ClassroomLayout';\nimport { InsightsListEmptyState } from 'apps/insights/components/insights-list/empty-state/InsightsListEmptyState';\nimport { InsightsListTable } from 'apps/insights/components/insights-list/table/InsightsListTable';\nimport { useGetInsightsObjectActions } from 'apps/insights/views/insights-list/InsightsListViewUtils';\nimport { PartialSharedByMeTable } from 'apps/share/views/shared-by-me/partial-loading/PartialSharedByMeTable';\nimport { getObjectAppLink } from 'apps/share/views/shared-by-me/SharedByMeViewUtils';\n\nconst namespace = 'lite.insightsList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ClassroomOverviewViewProps {\n classroomId: string;\n}\n\nexport function ClassroomOverviewView(props: ClassroomOverviewViewProps) {\n const fetch = Flight.useGetFetch();\n\n const breakpoints = useBreakpoints();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const classroom = Flight.useBasicFetch<Classroom>(currentUser.data &&\n ClassroomRequests.getClassroom(props.classroomId, currentUser.data.id));\n\n const isRostered = classroom.data?._integrations?.rostered;\n\n const {\n sentShares,\n sharedObjects,\n shareRecipients,\n interactivesPendingReview,\n isFetching,\n showPartialLoading,\n nextCursor,\n hasMore,\n fetchNext,\n imageCdnUrl,\n dependencies\n } = useSharesTable({ recipientGroupId: [props.classroomId]}, true);\n\n useSetPageMetadata({ title: getPhrase('insights') });\n\n const getSharedObjectActions = useGetInsightsObjectActions(breakpoints, { classrooms: [props.classroomId]});\n\n function onTogglePin(shouldPin: boolean, onSuccess: () => void, onError: () => void): void {\n if (isRostered)\n return;\n const request = shouldPin\n ? ClassroomRequests.pinClassroom\n : ClassroomRequests.unpinClassroom;\n\n fetch(request(classroom.data, onSuccess, onError));\n }\n\n const classroomDataLoaded = currentUser.data && classroom.data;\n\n if (!classroomDataLoaded)\n return (\n <div className='px-3'>\n <div className={`mb-1 partial-loading-background`} />\n\n <div className='pb-3'>\n <PartialBreadcrumbs numItems={2} />\n </div>\n\n <div className='pb-2'>\n <PartialPillTabSelector />\n </div>\n </div>\n );\n\n return (\n <ClassroomLayout\n activeTab='overview'\n classroom={classroom.data}\n currentUser={currentUser.data}\n onTogglePin={onTogglePin}\n isRostered={isRostered}\n >\n {(() => {\n if (showPartialLoading)\n return <PartialSharedByMeTable />;\n\n if (!sentShares.length)\n return (\n <InsightsListEmptyState\n appLink={{ application: AppChannels.DASHBOARD, action: Actions.Dashboard.HOME }}\n imageUrl={ImageUrls.EmptyStates.Share.SHARED_WITH_ME}\n />\n );\n\n return (\n <>\n <InsightsListTable\n sentShares={sentShares}\n sharedObjects={sharedObjects}\n shareRecipients={shareRecipients}\n interactivesPendingReviews={interactivesPendingReview}\n getObjectAppLink={getObjectAppLink}\n getObjectActions={getSharedObjectActions}\n imageCdnUrl={imageCdnUrl}\n groupByDateShared\n dependencies={dependencies}\n breakpoints={breakpoints}\n hideViews\n />\n {(hasMore || isFetching) &&\n <InfiniteScrollFooter isFetching={isFetching} fetchNext={fetchNext} nextCursor={nextCursor} />\n }\n </>\n );\n })()}\n </ClassroomLayout>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\n\nconst namespace = 'insights.insightsListEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightsListEmptyStateProps {\n imageUrl: string;\n appLink?: Core.AppLink;\n useInteractiveCopy?: boolean;\n}\n\nexport function InsightsListEmptyState(props: InsightsListEmptyStateProps): JSX.Element {\n return (\n <EmptyState>\n <EmptyState.Image src={props.imageUrl} size='small'/>\n <EmptyState.Heading>\n {getPhrase(props.useInteractiveCopy ? 'interactivesHeading' : 'genericHeading')}\n </EmptyState.Heading>\n <EmptyState.Info>{getPhrase(props.useInteractiveCopy ? 'interactivesInfo' : 'genericInfo')}</EmptyState.Info>\n {!!props.appLink &&\n <EmptyState.Cta appLink={props.appLink} text={getPhrase('cta')} />\n }\n </EmptyState>\n );\n}","import React from 'react';\nimport { Column } from 'react-table';\nimport { format as formatDate } from 'timeago.js';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { InteractivesPendingReviews } from 'libs/shared/apps/analytics/interfaces/response/InteractivesPendingReviewsResponse';\nimport { SharedObjectImage } from 'libs/shared/apps/share/components/shared-object-image/SharedObjectImage';\nimport {\n AnonymousSharedToAvatar,\n SharedLinkAvatar,\n SharedToAvatarList\n} from 'libs/shared/apps/share/components/shared-to-avatar-list/SharedToAvatarList';\nimport { SharableEntity, ShareViewHelper } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { ActionOptions, Actions } from 'libs/shared/components/actions/Actions';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ShareType } from 'libs/shared/enums/ShareType';\nimport { Breakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { BaseObject, InteractiveMetadata, UnionShareObject } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst namespace = 'insights.insightsListTable';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getDateShared(share: UnionShareObject): string {\n if (share.type === ShareType.ShareLink || !share?.recipients?.length)\n return share.dateCreated;\n\n const datesShared = share.recipients.map(r => r.dateShared);\n\n datesShared.sort((date1, date2) => {\n if (DateHelper.isSame(date1, date2))\n return 0;\n\n return DateHelper.isAfter(date1, date2) ? 1 : -2;\n });\n\n\n if (!datesShared.length)\n return '';\n\n return ArrayHelper.last(datesShared);\n}\n\ninterface SharedByMeTableData {\n share: UnionShareObject;\n sharedObject: SharableEntity;\n dateShared: string;\n shareRecipients?: BaseObject[];\n viewCount: number;\n pendingReview: number;\n}\n\nexport function getColumns(\n getObjectAppLink: (object: BaseObject) => Core.AppLink,\n getObjectActions: (object: BaseObject) => ActionOptions[],\n imageCdnUrl: string,\n breakpoints?: Breakpoints,\n hideViews?: boolean\n): Column<SharedByMeTableData>[] {\n const isMobile = breakpoints && (breakpoints.xs || breakpoints.sm || breakpoints.md);\n\n const columns: Column<SharedByMeTableData>[] = [\n {\n Header: getPhrase('title'),\n accessor: 'sharedObject',\n id: 'image',\n Cell: ({ value }) => (\n <div className='w-100'>\n <SharedObjectImage\n object={value}\n appLink={getObjectAppLink(value)}\n showVideoMetadata\n locationContext={LocationContext.SharedByMe}\n />\n </div>\n ),\n minWidth: 140,\n maxWidth: 30\n },\n {\n accessor: 'sharedObject',\n id: 'name',\n Cell: ({ value, row, data }) => {\n if (value.name) {\n if (VideoHelper.isVideoType(value) && !VideoHelper.getCanBeConsumed(value)?.canNavigate) {\n return (\n <span className='clamp-2'>\n {value.name}\n </span>\n );\n }\n\n const pendingReview = data[row.index]?.pendingReview;\n\n return (\n <div>\n <AppLink\n appLink={getObjectAppLink(value)}\n className='clamp-2'\n analyticsData={{ id: value.id, name: value.name }}\n analyticsOptions={{\n entity: ShareViewHelper.getAnalyticsEntity(value.type),\n actionType: UserAction.Click,\n location: LocationContext.SharedByMe\n }}\n >\n {value.name}\n </AppLink>\n \n {!!pendingReview && (\n <div className='bg-light-ultramarine text-ultramarine fw-semibold font-size-sm rounded-pill w-fit mt-1 px-2'>\n <Text namespace={namespace} phrase='requireMarking' options={{ count: pendingReview }} />\n </div>\n )}\n </div>\n );\n }\n\n return <span><Text namespace={namespace} phrase='videoUnavailable' /></span>;\n },\n width: 80\n },\n {\n Header: getPhrase('sharedTo'),\n accessor: 'shareRecipients',\n Cell: ({ value }) => {\n if (!value)\n return <SharedLinkAvatar />;\n\n if (!value.length)\n return <AnonymousSharedToAvatar />;\n\n return <SharedToAvatarList recipients={value} imageCdnUrl={imageCdnUrl} maxAvatars={isMobile ? 1 : 2} />;\n },\n width: 30\n },\n !hideViews && {\n Header: getPhrase('views'),\n accessor: 'share',\n Cell: ({ value }) => {\n return (\n <div className='d-flex align-items-center'>\n <SvgContainer svgName={cvSvgLibrary.User} />\n <span>{value.accessedCount}{value.totalAccessible ? `/${value.totalAccessible}` : ''}</span>\n </div>\n );\n },\n width: 30\n },\n !isMobile && {\n Header: getPhrase('shared'),\n id: 'dateShared',\n accessor: s => formatDate(s.dateShared),\n width: 40\n },\n {\n accessor: 'sharedObject',\n id: 'actions',\n Cell: ({ value }) => (\n <Actions\n actions={getObjectActions(value)}\n className='w-100 justify-content-end align-items-center gap-2'\n actionsDropdownClassName='bg-transparent'\n dropdownToggleSvgSize={SvgContainerSize.Standard}\n />\n ),\n width: 40\n }\n ];\n\n return columns.filter((Boolean));\n}\n\nexport function useGetData(\n sentShares: UnionShareObject[],\n sharedObjects: BaseObject[],\n shareRecipients: BaseObject[],\n interactivesPendingReviews: InteractivesPendingReviews[],\n dependencies: any[]\n): SharedByMeTableData[] {\n return React.useMemo(() => {\n const tableData: SharedByMeTableData[] = [];\n\n sentShares.forEach(s => {\n const sharedObject = sharedObjects.find(o => o.id === s.objectId);\n\n let recipients: BaseObject[] | null = null;\n\n if (s.type === ShareType.DirectShare) {\n recipients = [];\n\n s.recipients?.forEach(r => {\n const recipient = shareRecipients.find(s => s.id === r.id);\n\n if (recipient)\n recipients.push(recipient);\n });\n }\n\n // Skip if we don't have access to the shared object (e.g. if it's been deleted)\n if (sharedObject) {\n const pendingReview = sharedObject.typeId === MasterType.Interactive && interactivesPendingReviews?.find(\n pendingReview => pendingReview.interactiveId === (sharedObject as InteractiveMetadata).interactiveId\n );\n\n tableData.push({\n share: s,\n sharedObject,\n shareRecipients: recipients,\n dateShared: getDateShared(s),\n viewCount: s.viewCount ?? 0,\n pendingReview: pendingReview?.pendingReviewCount\n });\n }\n });\n\n return tableData;\n }, dependencies);\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { InteractivesPendingReviews } from 'libs/shared/apps/analytics/interfaces/response/InteractivesPendingReviewsResponse';\nimport { SHARES_TABLE_THEME } from 'libs/shared/apps/share/constants/TableTheme';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { Table } from 'libs/shared/components/table/Table';\nimport { Breakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { BaseObject, UnionShareObject } from 'libs/shared/interfaces';\n\nimport { getColumns, useGetData } from './InsightsListTableUtils';\n\ninterface InsightsListTableProps {\n sentShares: UnionShareObject[];\n sharedObjects: BaseObject[];\n shareRecipients: BaseObject[];\n interactivesPendingReviews: InteractivesPendingReviews[];\n getObjectAppLink: (object: BaseObject) => Core.AppLink;\n getObjectActions: (object: BaseObject) => ActionOptions[];\n imageCdnUrl: string;\n groupByDateShared?: boolean;\n showStatus?: boolean;\n showViewCount?: boolean;\n dependencies?: any[];\n breakpoints?: Breakpoints;\n hideViews?: boolean\n}\n\nfunction InsightsListTableMemo(props: InsightsListTableProps): JSX.Element {\n const data = useGetData(\n props.sentShares,\n props.sharedObjects,\n props.shareRecipients,\n props.interactivesPendingReviews,\n props.dependencies\n );\n\n return (\n <>\n <Table\n columns={getColumns(\n props.getObjectAppLink,\n props.getObjectActions,\n props.imageCdnUrl,\n props.breakpoints,\n props.hideViews\n )}\n data={data}\n theme={SHARES_TABLE_THEME}\n />\n </>\n );\n}\n\nexport const InsightsListTable = React.memo(InsightsListTableMemo);","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 { AudienceQueryParams } from 'libs/shared/apps/analytics/interfaces/AudienceQueryParams';\nimport { SharableEntityType } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { Breakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { BaseObject } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\n\nconst namespace = 'lite.insightsList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getInsightsObjectActions(\n sharedObject: BaseObject,\n audienceParams: AudienceQueryParams,\n isMobile: boolean\n): ActionOptions[] {\n let entityType: SharableEntityType;\n let insightsAppLink: Core.AppLink;\n\n if (VideoHelper.isVideo(sharedObject)) {\n entityType = 'video';\n insightsAppLink = {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.VIDEO_OVERVIEW,\n args: [sharedObject.id]\n };\n }\n\n if (VideoHelper.isInteractive(sharedObject)) {\n entityType = 'interactive';\n insightsAppLink = {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_OVERVIEW,\n args: [sharedObject.id]\n };\n }\n\n if (VideoHelper.isClip(sharedObject)) {\n entityType = 'clip';\n insightsAppLink = {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.CLIP_OVERVIEW,\n args: [sharedObject.id]\n };\n }\n\n if (sharedObject.typeId === MasterType.Series)\n entityType = 'series';\n\n if (sharedObject.typeId === MasterType.Playlist)\n entityType = 'playlist';\n\n \n const insightObjectActions: ActionOptions[] = [\n {\n label: getPhrase('editShareSettings'),\n appLink: {\n application: AppChannels.DEFAULT,\n action: Actions.Default.SHARE,\n args: [sharedObject.id],\n params: { entityType }\n }\n }\n ];\n\n if (VideoHelper.isVideoType(sharedObject)) {\n const { canConsume } = VideoHelper.getCanBeConsumed(sharedObject);\n\n if (!canConsume)\n return [];\n\n insightObjectActions.unshift({\n label: getPhrase('viewInsights'),\n className: 'btn btn-outline-dark',\n button: !isMobile,\n svgName: cvSvgLibrary.Chart,\n appLink: { ...insightsAppLink, params: audienceParams }\n });\n }\n\n return insightObjectActions;\n}\n\nexport function useGetInsightsObjectActions(\n breakpoints: Breakpoints,\n audienceParams?: AudienceQueryParams\n): ((object: BaseObject) => ActionOptions[]) | null {\n const isMobile = breakpoints.xs || breakpoints.sm || breakpoints.md;\n const audienceParamsKey = JSON.stringify(audienceParams);\n\n return React.useCallback(\n (object: BaseObject) => getInsightsObjectActions(\n object,\n audienceParams,\n isMobile\n ),\n [ isMobile, audienceParamsKey ]\n );\n}\n\n\nexport function getTypeIdParams(params: HashObject): MasterType[] {\n const typeIdParams = params?.typeId;\n\n if (!typeIdParams) return [];\n\n if (typeof typeIdParams === 'string')\n return [+typeIdParams];\n\n return params?.typeId.map((typeId: MasterType) => +typeId) || [];\n}"],"names":["getAnalyticsRequestKey","baseKey","filter","sharerId","key","start","end","userIdKey","Array","isArray","userId","sort","join","groupIdKey","groupId","mapColourToBsVariant","groupColour","getPhrase","ClassroomOverviewView","props","fetch","breakpoints","currentUser","classroom","data","classroomId","id","isRostered","_integrations","rostered","recipientGroupId","sentShares","sharedObjects","shareRecipients","interactivesPendingReview","isFetching","showPartialLoading","nextCursor","hasMore","fetchNext","imageCdnUrl","dependencies","title","getSharedObjectActions","classrooms","activeTab","onTogglePin","shouldPin","onSuccess","onError","request","length","interactivesPendingReviews","getObjectAppLink","getObjectActions","groupByDateShared","hideViews","appLink","application","action","imageUrl","className","numItems","InsightsListEmptyState","src","size","useInteractiveCopy","text","namespace","LanguageService","getDateShared","share","type","ShareType","recipients","dateCreated","datesShared","map","r","dateShared","date1","date2","DateHelper","ArrayHelper","InsightsListTable","isMobile","tableData","forEach","s","sharedObject","find","o","objectId","recipient","push","pendingReview","typeId","MasterType","interactiveId","viewCount","pendingReviewCount","Table","columns","xs","sm","md","Header","accessor","Cell","value","SharedObjectImage","object","showVideoMetadata","locationContext","minWidth","maxWidth","row","name","VideoHelper","canNavigate","index","AppLink","analyticsData","analyticsOptions","entity","ShareViewHelper","actionType","location","Text","phrase","options","count","width","SharedToAvatarList","maxAvatars","SvgContainer","svgName","accessedCount","totalAccessible","Actions","actions","actionsDropdownClassName","dropdownToggleSvgSize","S","Boolean","theme","useGetInsightsObjectActions","audienceParams","audienceParamsKey","JSON","stringify","entityType","insightsAppLink","args","insightObjectActions","label","params","canConsume","unshift","button","getInsightsObjectActions","getTypeIdParams","typeIdParams"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[2978],{9570:(e,t,r)=>{r.d(t,{d:()=>C});var n=r(32735),a=r(40424),s=r(23481),i=r(75896),o=r(83914),c=r(8246),u=r(35223);function l(e){var t=e.answer;return n.createElement("div",{key:t.id,className:"".concat(function(e){switch(e){case c.N.Correct:return"bg-light-green";case c.N.Incorrect:return"bg-light-red";case c.N.PendingReview:return"bg-light-blue"}}(t.status)," rounded p-2 mb-2")},n.createElement("div",{className:"d-flex align-items-center gap-2"},t.status===c.N.Correct&&n.createElement(o.x,{svgName:u.vn.Check,className:"svg-container flex-shrink-0 text-success"}),t.status===c.N.Incorrect&&n.createElement(o.x,{svgName:u.vn.Close,className:"svg-container flex-shrink-0 text-danger"}),!e.customAnswer&&n.createElement("span",{className:e.textClassName},t.text)),e.children)}var m=s.T.encloseNamespace("shared.interactionResponses");function d(e){return d="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},d(e)}function v(e,t,r){return(t=function(e){var t=function(e,t){if("object"!=d(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,"string");if("object"!=d(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==d(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var f=function(){return n.createElement(n.Fragment,null)},g=v(v(v(v(v(v(v({},a.Z9.Annotation,f),a.Z9.Image,f),a.Z9.MissingWord,(function(e){return e.answers.length?n.createElement("ul",{className:"list-unstyled"},e.answers.map((function(e){return n.createElement(l,{key:e.id,answer:e,textClassName:"bg-white p-1 border border-gray-300 rounded"})}))):n.createElement(n.Fragment,null)})),a.Z9.MultipleChoice,(function(e){return e.answers.length?n.createElement("ul",{className:"list-unstyled"},e.answers.map((function(e){return n.createElement("li",{key:e.id},n.createElement(l,{answer:e}))}))):n.createElement(n.Fragment,null)})),a.Z9.TrueOrFalse,(function(e){var t=i.m.first(e.answers);return t?n.createElement(l,{answer:t}):n.createElement(n.Fragment,null)})),a.Z9.ShortAnswer,(function(e){var t=i.m.first(e.answers);return t?n.createElement(l,{answer:t},e.children):n.createElement(n.Fragment,null)})),a.Z9.Illustration,(function(e){var t=i.m.first(e.answers);return t?n.createElement(l,{answer:t,customAnswer:!0},n.createElement("div",{className:"ratio ratio-16x9"},n.createElement("img",{className:"img-fluid bg-white border rounded h-100 w-100",src:t.text,alt:"".concat(m("illustrationAlt"),": ").concat(e.interaction.name)})),e.children):n.createElement(n.Fragment,null)})),y=r(20789),p=r(44526),w=r(56151),h=r(3894),b=r(69737),E=r(83140),S=r(80845),k=r(64818);const I={avatarContainer:"O7oaA"};function C(e){var t,r,a,s,i,o=g[e.interaction.typeId];if(!o)return n.createElement(n.Fragment,null);var c=(0,S.j_)(e.studentResults),u=(0,S.f6)(e.interaction.id,c),l=E.A.isInteractionCorrect(e.interaction,c);return n.createElement("div",{className:"rounded ".concat(null!==(t=e.className)&&void 0!==t?t:"")},n.createElement("div",{className:"d-flex"},!!e.showStudentDetails&&n.createElement("div",{className:"me-2"},n.createElement("div",{className:I.avatarContainer},n.createElement(y.q,{imageCdnUrl:e.imageCdnUrl,initials:e.anonymisedUserName?k.l.getInitialsFromFullName(e.anonymisedUserName):k.l.getInitials(null===(r=e.studentResults.user)||void 0===r?void 0:r.name,null===(a=e.studentResults.user)||void 0===a?void 0:a.surname),imageUrl:e.anonymisedUserName?null:null===(i=null===(s=e.studentResults.user)||void 0===s?void 0:s.avatar)||void 0===i?void 0:i.url}))),n.createElement("div",{className:"flex-grow-1"},!!e.showStudentDetails&&n.createElement(w.U,{studentResults:e.studentResults,correctness:l,anonymisedUserName:e.anonymisedUserName}),n.createElement("div",{className:"d-flex justify-content-between"},n.createElement("div",{className:"flex-grow-1 mb-2 ".concat(e.responseComponentClass?e.responseComponentClass:"")},u?n.createElement(o,{interaction:e.interaction,answers:u.answers,imageCdnUrl:e.imageCdnUrl,user:e.studentResults.user,showFeedback:e.showFeedback,showAvatar:e.showAvatar},n.createElement(h.Z,{studentAttempt:u,correctness:l,markInteraction:e.markInteraction,markedStatus:e.markedStatus})):n.createElement(b.R,null)),!e.showStudentDetails&&n.createElement(p.Y,{correctness:l})))))}},71553:(e,t,r)=>{r.d(t,{I:()=>i});var n=r(99940),a=r(62875);function s(e,t){return{currentUserId:e.id,currentCustomerId:e.customerId,dateRange:{start:t.start,end:t.end},userIds:t.userId,classroomsAndGroups:t.groupId}}var i={interactiveResultSet:function(e,t,r,i,o,c,u){return{url:"/api/domain/v2/analytics/interactives/".concat(e,"/metadata/").concat(t),key:(0,a.H)("interactive:result:set:".concat(e,":").concat(t),i),data:s(r,i),type:n.k.POST,normalize:!1,success:o,error:c,always:u}},mark:function(e,t,r,a,s,i,o){return{url:"/api/domain/v1/analytics/answers/".concat(r),key:"mark:answer:".concat(r,":").concat(a.resultId),type:n.k.PUT,data:a,normalize:!1,invalidationKeys:"interactive:result:set:".concat(e,":").concat(t),success:s,error:i,always:o}},pendingReviews:function(e){return{url:"/api/domain/v1/analytics/interactives/pending-reviews/summary",key:"interactives:pending:reviews",type:n.k.POST,data:e}},interactiveResultsReport:function(e){return{url:"{gateway}/v2/analytics/interactives/report",key:"interactive:results:report",data:e,type:n.k.POST,normalize:!1}}}},41196:(e,t,r)=>{r.d(t,{W:()=>o});var n=r(20354),a=r(71553),s=r(20768),i=r(31949);function o(e,t){var r,o=n.a.useBasicFetch(i.N.currentUser()),c=n.a.useBasicFetch(!!e&&s.b.interactiveMetadata(e)),u=n.a.useBasicFetch(!!(null===(r=c.data)||void 0===r?void 0:r.interactiveId)&&s.b.interactive(c.data.interactiveId)),l=!!o.data&&!!u.data&&!!t;return n.a.useBasicFetch(l&&a.I.interactiveResultSet(c.data.interactiveId,c.data.id,o.data,t))}},9193:(e,t,r)=>{r.d(t,{D:()=>v});var n=r(32735),a=r(70680),s=r(23481),i=r(20354),o=r(71553),c=r(39157),u=r(69883);function l(e){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},l(e)}function m(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}var d=s.T.encloseNamespace("reportsShared.dataHooks"),v=function(e,t,r){var s,v,f=(s=(0,n.useState)({}),v=2,function(e){if(Array.isArray(e))return e}(s)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,s,i,o=[],c=!0,u=!1;try{if(s=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=s.call(r)).done)&&(o.push(n.value),o.length!==t);c=!0);}catch(e){u=!0,a=e}finally{try{if(!c&&null!=r.return&&(i=r.return(),Object(i)!==i))return}finally{if(u)throw a}}return o}}(s,v)||function(e,t){if(e){if("string"==typeof e)return m(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?m(e,t):void 0}}(s,v)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),g=f[0],y=f[1],p=(0,a.I0)(),w=(0,u.Z)();return{markedAnswers:g,addMarkedAnswers:function(e,t){e.forEach((function(e){y((function(r){return Object.assign(Object.assign({},r),function(e,t,r){return(t=function(e){var t=function(e,t){if("object"!=l(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,"string");if("object"!=l(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==l(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}({},(0,c.UU)(e),Object.assign(Object.assign({},e),{status:t})))}))}))},submitMarkedAnswers:function(){var n=Object.keys(g).map((function(e){return g[e]}));if(n.length){var a=0,s=0;n.forEach((function(r){var n=r.id,a=r.resultId,s=r.questionId,l=r.status;i.a.fetch(p,o.I.mark(e,t,n,{id:n,resultId:a,questionId:s,status:l},c,null,u))}))}function c(){s++}function u(){var e,t;++a===n.length&&(e="",t=!1,0===s&&(e=d("error",{smartCount:n.length}),t=!0),s<a&&(e=d("success",{smartCount:s})+" ".concat(d("partialError",{smartCount:a-s}))),s===a&&(e=d("success",{smartCount:s})),t?w.error(e):w.success(e),y({}),r&&r())}}}}},39157:(e,t,r)=>{r.d(t,{HI:()=>d,R6:()=>u,Rt:()=>f,UU:()=>m,Zs:()=>l,nq:()=>v});var n=r(75896),a=r(94892),s=r(28972),i=r(8246),o=r(83140),c=r(80845);function u(e,t,r){var s={markingRequired:[],lowScore:[],highScore:[],completed:[],notCompleted:[]},i=(0,c.Q)(e).length;t.students.forEach((function(t){var o=Object.assign(Object.assign({},t),{summary:f(e,t)});o.summary.awaitingMarking?s.markingRequired.push(o):n.m.last(t.results).attempts.length===i?(s.completed.push(o),o.summary.percentCorrect>=(r.HIGH||a.i.HIGH)&&s.highScore.push(o),o.summary.percentCorrect<(r.MODERATE||a.i.MODERATE)&&s.lowScore.push(o)):s.notCompleted.push(o)}));var o=n.m.sortBy(s.lowScore,(function(e){return e.summary.percentCorrect})),u=n.m.sortBy(s.highScore,(function(e){return-e.summary.percentCorrect}));return Object.assign(Object.assign({},s),{lowScore:o,highScore:u})}function l(e,t){return(0,c.Wn)(e).find((function(e){return e.id.toString()===t.toString()}))}function m(e){return"".concat(e.questionId,":").concat(e.resultId)}function d(e,t,r){var n=(0,c.j_)(t),a=(0,c.f6)(e,n);return(null==a?void 0:a.answers.every((function(e){var t;return(null===(t=r[m(e)])||void 0===t?void 0:t.status)===i.N.Correct})))?i.N.Correct:(null==a?void 0:a.answers.every((function(e){var t;return(null===(t=r[m(e)])||void 0===t?void 0:t.status)===i.N.Incorrect})))?i.N.Incorrect:void 0}function v(e,t){var r=t.students.length,n=0,a=0,i=0,u=0,l=0;return t.students.forEach((function(t){var r=(0,c.j_)(t);if(r){l+=t.results.length;var m=o.A.isInteractionCorrect(e,r);m===s.w.Correct&&n++,m===s.w.UnAnswered&&i++,m===s.w.AwaitingMarking&&u++,m!==s.w.UnAnswered&&a++}})),{percentCorrect:r>0?n/r:0,correct:n,answered:a,unanswered:i,awaitingMarking:u,attempts:l}}function f(e,t){var r=(0,c.j_)(t),n=(0,c.Q)(e),a=n.length,i=0,u=0;n.forEach((function(e){var t=o.A.isInteractionCorrect(e,r);t===s.w.Correct&&i++,t===s.w.AwaitingMarking&&u++}));var l=a>0?i/a:0,m=new Set(n.map((function(e){return e.id}))),d=r.attempts.filter((function(e){var t;return!!m.has(null===(t=null==e?void 0:e.answers[0])||void 0===t?void 0:t.questionId)})).length;return{answered:r.attempts.length,attempts:t.results.length,unanswered:a-d,percentCorrect:l,correct:i,awaitingMarking:u}}}}]);
2
+ //# sourceMappingURL=2978-b7bcc3eac4-lite.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/2978-b7bcc3eac4-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/components/AnswerContainer.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/components/IllustrationResponse.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/ResponseItemComponentLookup.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/components/MissingWordResponse.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/components/MultipleChoiceResponse.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/components/TrueOrFalseResponse.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/components/ShortAnswerResponse.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/interaction-response-item.scss","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/InteractionResponseItem.tsx","file:///app/packages/libs/shared/src/apps/analytics/flight-requests/InteractiveResultsRequests.ts","file:///app/packages/libs/shared/src/apps/analytics/hooks/UseFetchInteractiveResults.ts","file:///app/packages/libs/shared/src/apps/analytics/hooks/UseMarkAnswers.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/InteractiveUtils.ts"],"sourcesContent":["import React from 'react';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { StudentAnswer } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\ninterface AnswerContainerProps extends React.PropsWithChildren {\n answer: StudentAnswer;\n textClassName?: string;\n customAnswer?: boolean;\n}\n\nexport function AnswerContainer(props: AnswerContainerProps) {\n const { answer } = props;\n\n function getBgColour(status: InteractiveAnswerStatus) {\n switch (status) {\n case InteractiveAnswerStatus.Correct: return 'bg-light-green';\n case InteractiveAnswerStatus.Incorrect: return 'bg-light-red';\n case InteractiveAnswerStatus.PendingReview: return 'bg-light-blue';\n }\n }\n\n return (\n <div key={answer.id} className={`${getBgColour(answer.status)} rounded p-2 mb-2`}>\n <div className='d-flex align-items-center gap-2'>\n {answer.status === InteractiveAnswerStatus.Correct && <SvgContainer svgName={cvSvgLibrary.Check} className='svg-container flex-shrink-0 text-success' />}\n {answer.status === InteractiveAnswerStatus.Incorrect && <SvgContainer svgName={cvSvgLibrary.Close} className='svg-container flex-shrink-0 text-danger' />}\n {!props.customAnswer && <span className={props.textClassName}>{answer.text}</span>}\n </div>\n {props.children}\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { AnswerContainer } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/components/AnswerContainer';\nimport { ResponseItemComponentProps } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/ResponseItemComponentLookup';\n\nconst namespace = 'shared.interactionResponses';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function IllustrationResponse(props: ResponseItemComponentProps): JSX.Element {\n const answer = ArrayHelper.first(props.answers);\n\n if (!answer)\n return <></>;\n\n return (\n <AnswerContainer answer={answer} customAnswer>\n <div className='ratio ratio-16x9'>\n <img\n className='img-fluid bg-white border rounded h-100 w-100'\n src={answer.text}\n alt={`${getPhrase('illustrationAlt')}: ${props.interaction.name}`}\n />\n </div>\n {props.children}\n </AnswerContainer>\n );\n}","import React from 'react';\n\nimport { Interaction, InteractionTypeId, StudentAnswer, User } from 'libs/shared/interfaces';\n\nimport { IllustrationResponse } from './components/IllustrationResponse';\nimport { MissingWordResponse } from './components/MissingWordResponse';\nimport { MultipleChoiceResponse } from './components/MultipleChoiceResponse';\nimport { ShortAnswerResponse } from './components/ShortAnswerResponse';\nimport { TrueOrFalseResponse } from './components/TrueOrFalseResponse';\n\nexport interface ResponseItemComponentProps extends React.PropsWithChildren {\n interaction: Interaction;\n answers: StudentAnswer[];\n imageCdnUrl: string;\n user: User;\n showFeedback?: boolean;\n showAvatar?: boolean;\n anonymisedUserName?: string;\n}\nconst NoResponseRequired = () => <></>;\n\nexport const ResponseItemComponentLookup: {\n [typeId: number]: (props: ResponseItemComponentProps) => JSX.Element\n} = {\n [InteractionTypeId.Annotation]: NoResponseRequired,\n [InteractionTypeId.Image]: NoResponseRequired,\n [InteractionTypeId.MissingWord]: MissingWordResponse,\n [InteractionTypeId.MultipleChoice]: MultipleChoiceResponse,\n [InteractionTypeId.TrueOrFalse]: TrueOrFalseResponse,\n [InteractionTypeId.ShortAnswer]: ShortAnswerResponse,\n [InteractionTypeId.Illustration]: IllustrationResponse\n};","import React from 'react';\n\nimport { AnswerContainer } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/components/AnswerContainer';\nimport { ResponseItemComponentProps } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/ResponseItemComponentLookup';\n\n\nexport function MissingWordResponse(props: ResponseItemComponentProps) {\n if (!props.answers.length) return <></>;\n\n return (\n <ul className='list-unstyled'>\n {props.answers.map(answer => (\n <AnswerContainer\n key={answer.id}\n answer={answer}\n textClassName='bg-white p-1 border border-gray-300 rounded'\n />\n ))}\n </ul>\n );\n}","import React from 'react';\n\nimport { AnswerContainer } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/components/AnswerContainer';\nimport { ResponseItemComponentProps } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/ResponseItemComponentLookup';\n\nexport function MultipleChoiceResponse(props: ResponseItemComponentProps) {\n if (!props.answers.length) return <></>;\n\n return (\n <ul className='list-unstyled'>\n {props.answers.map(answer => (\n <li key={answer.id}>\n <AnswerContainer answer={answer} />\n </li>\n ))}\n </ul>\n );\n}","import React from 'react';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { AnswerContainer } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/components/AnswerContainer';\nimport { ResponseItemComponentProps } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/ResponseItemComponentLookup';\n\nexport function TrueOrFalseResponse(props: ResponseItemComponentProps) {\n const answer = ArrayHelper.first(props.answers);\n\n if (!answer)\n return <></>;\n\n return (\n <AnswerContainer answer={answer} />\n );\n}","import React from 'react';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { AnswerContainer } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/components/AnswerContainer';\nimport { ResponseItemComponentProps } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/ResponseItemComponentLookup';\n\nexport function ShortAnswerResponse(props: ResponseItemComponentProps): JSX.Element {\n const answer = ArrayHelper.first(props.answers);\n\n if (!answer)\n return <></>;\n\n return (\n <AnswerContainer answer={answer}>\n {props.children}\n </AnswerContainer>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"avatarContainer\":\"O7oaA\"};","import React from 'react';\n\nimport { ResponseItemComponentLookup } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/ResponseItemComponentLookup';\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { InteractionResponseCorrectness } from 'libs/shared/components/interaction-response/InteractionResponseCorrectness';\nimport { InteractionStudentDetailsHeader } from 'libs/shared/components/interaction-response/InteractionStudentDetailsHeader';\nimport { MarkResponse } from 'libs/shared/components/interaction-response/MarkResponse';\nimport { NoResponse } from 'libs/shared/components/interaction-response/response-types/NoResponse';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, StudentAnswer, StudentResults } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { getStudentAttempt, getStudentResult } from 'libs/shared/utils/InteractiveHelper';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from './interaction-response-item.scss';\n\ninterface InteractionResponseProps {\n interaction: Interaction;\n studentResults: StudentResults;\n imageCdnUrl: string;\n markInteraction: (answers: StudentAnswer[], status: InteractiveAnswerStatus) => void;\n markedStatus?: InteractiveAnswerStatus;\n showStudentDetails?: boolean;\n className?: string;\n showFeedback?: boolean;\n showAvatar?: boolean;\n anonymisedUserName?: string;\n responseComponentClass?: string;\n}\n\nexport function InteractionResponseItem(props: InteractionResponseProps): JSX.Element {\n const ResponseItemComponent = ResponseItemComponentLookup[props.interaction.typeId];\n\n if (!ResponseItemComponent)\n return <></>;\n\n const result = getStudentResult(props.studentResults);\n\n const studentAttempt = getStudentAttempt(props.interaction.id, result);\n\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(props.interaction, result);\n\n return (\n <div className={`rounded ${props.className ?? ''}`}>\n <div className='d-flex'>\n {!!props.showStudentDetails &&\n <div className='me-2'>\n <div className={styles.avatarContainer}>\n <Avatar\n imageCdnUrl={props.imageCdnUrl}\n initials={props.anonymisedUserName\n ? UserHelper.getInitialsFromFullName(props.anonymisedUserName)\n : UserHelper.getInitials(props.studentResults.user?.name, props.studentResults.user?.surname)\n }\n imageUrl={props.anonymisedUserName ? null : props.studentResults.user?.avatar?.url}\n />\n </div>\n </div>\n }\n <div className='flex-grow-1'>\n {!!props.showStudentDetails &&\n <InteractionStudentDetailsHeader\n studentResults={props.studentResults}\n correctness={correctness}\n anonymisedUserName={props.anonymisedUserName}\n />\n }\n <div className='d-flex justify-content-between'>\n <div className={`flex-grow-1 mb-2 ${props.responseComponentClass ? props.responseComponentClass : ''}`}>\n {studentAttempt\n ? <ResponseItemComponent\n interaction={props.interaction}\n answers={studentAttempt.answers}\n imageCdnUrl={props.imageCdnUrl}\n user={props.studentResults.user}\n showFeedback={props.showFeedback}\n showAvatar={props.showAvatar}\n >\n <MarkResponse\n studentAttempt={studentAttempt}\n correctness={correctness}\n markInteraction={props.markInteraction}\n markedStatus={props.markedStatus}\n />\n </ResponseItemComponent>\n : <NoResponse />\n }\n </div>\n {!props.showStudentDetails &&\n <InteractionResponseCorrectness correctness={correctness} />\n }\n </div>\n </div>\n </div>\n </div>\n );\n}","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Flight } from 'libs/common/react/index';\n\nimport { MarkInteractiveAnswer } from 'libs/shared/apps/analytics/interfaces/MarkInteractiveAnswer';\nimport { InteractiveResultsReport } from 'libs/shared/apps/analytics/interfaces/requests/InteractiveResultsReport';\nimport { InteractivesPendingReviewsRequest } from 'libs/shared/apps/analytics/interfaces/requests/InteractivesPendingReviewsRequest';\nimport { AnalyticsRequestFilter, CurrentUser, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { getAnalyticsRequestKey } from 'libs/shared/utils/AnalyticsRequestUtils';\n\ninterface InteractiveResultFilters {\n currentUserId: string;\n currentCustomerId: string;\n dateRange?: { start: string, end: string }\n userIds?: string | string[];\n classroomsAndGroups?: string | string[];\n}\n\nfunction getInteractiveResultFilters(\n currentUser: CurrentUser,\n filter: AnalyticsRequestFilter\n): InteractiveResultFilters {\n return {\n currentUserId: currentUser.id,\n currentCustomerId: currentUser.customerId,\n dateRange: { start: filter.start, end: filter.end },\n userIds: filter.userId,\n classroomsAndGroups: filter.groupId\n };\n}\n\nexport const InteractiveResultsRequests = {\n /** \n * This endpoint returns data with a lot of duplicated ids,\n * e.g. student answers to the same question will have the same id.\n * Because of that, we don't normalize.\n */\n interactiveResultSet(\n interactiveId: string,\n interactiveMetadataId: string,\n currentUser: CurrentUser,\n filter: AnalyticsRequestFilter,\n success?: (data: InteractiveResultSet) => void,\n error?: (data: any) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `/api/domain/v2/analytics/interactives/${interactiveId}/metadata/${interactiveMetadataId}`,\n key: getAnalyticsRequestKey(`interactive:result:set:${interactiveId}:${interactiveMetadataId}`, filter),\n data: getInteractiveResultFilters(currentUser, filter),\n type: HttpVerbs.POST,\n normalize: false,\n success,\n error,\n always\n };\n },\n \n /**\n * As the response from `interactiveResultSet` isn't normalised, we need to invalidate the cache\n * to update the results data.\n */\n mark(\n interactiveId: string,\n interactiveMetadataId: string,\n answerId: string,\n data: MarkInteractiveAnswer,\n success?: () => void,\n error?: (data: any) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `/api/domain/v1/analytics/answers/${answerId}`,\n key: `mark:answer:${answerId}:${data.resultId}`,\n type: HttpVerbs.PUT,\n data,\n normalize: false,\n invalidationKeys: `interactive:result:set:${interactiveId}:${interactiveMetadataId}`,\n success,\n error,\n always\n };\n },\n\n pendingReviews(data: InteractivesPendingReviewsRequest): Flight.Request {\n return {\n url: `/api/domain/v1/analytics/interactives/pending-reviews/summary`,\n key: `interactives:pending:reviews`,\n type: HttpVerbs.POST,\n data\n };\n },\n\n interactiveResultsReport(data: InteractiveResultsReport): Flight.Request {\n return {\n url: '{gateway}/v2/analytics/interactives/report',\n key: 'interactive:results:report',\n data,\n type: HttpVerbs.POST,\n normalize: false\n };\n }\n};","import { Flight } from 'libs/common/flight';\n\nimport { InteractiveResultsRequests } from 'libs/shared/apps/analytics/flight-requests/InteractiveResultsRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { AnalyticsRequestFilter, CurrentUser, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\n\nexport function useFetchInteractiveResults(\n interactiveMetadataId: string,\n requestFilter: AnalyticsRequestFilter\n): Flight.Response<InteractiveResultSet> {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(!!interactiveMetadataId &&\n InteractiveRequests.interactiveMetadata(interactiveMetadataId));\n\n const interactive = Flight.useBasicFetch<Interactive>(!!interactiveMetadata.data?.interactiveId &&\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId));\n\n const shouldFetchResults = !!currentUser.data && !!interactive.data && (!!requestFilter);\n\n return Flight.useBasicFetch<InteractiveResultSet>(shouldFetchResults &&\n InteractiveResultsRequests.interactiveResultSet(\n interactiveMetadata.data.interactiveId,\n interactiveMetadata.data.id,\n currentUser.data,\n requestFilter\n ));\n}","import { useState } from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { InteractiveResultsRequests } from 'libs/shared/apps/analytics/flight-requests/InteractiveResultsRequests';\nimport { getMarkedAnswerId } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { StudentAnswer } from 'libs/shared/interfaces';\n\nconst getPhrase = LanguageService.encloseNamespace('reportsShared.dataHooks');\n\nexport type MarkedAnswerHash = { [id: string]: StudentAnswer };\n\n/**\n * This hook manages the storing of a marked answer hash in state and then the submitting\n * of those answers via an api call.\n */\nexport const useMarkAnswers = (interactiveId: string, interactiveMetadataId: string, onDone?: () => void) => {\n const [ markedAnswers, setMarkedAnswers ] = useState<MarkedAnswerHash>({});\n\n const dispatch = useDispatch();\n const alerts = useAlerts();\n\n function addMarkedAnswers(answers: StudentAnswer[], status: InteractiveAnswerStatus): void {\n answers.forEach(a => {\n setMarkedAnswers(m => ({ ...m, [getMarkedAnswerId(a)]: { ...a, status } }));\n });\n }\n\n function submitMarkedAnswers(): void {\n const answers = Object.keys(markedAnswers).map(key => markedAnswers[key]);\n\n if (!answers.length)\n return;\n\n let completeCount = 0;\n let successCount = 0;\n\n function onSuccess(): void {\n successCount++;\n }\n\n function onAlways(): void {\n completeCount++;\n\n if (completeCount === answers.length)\n onComplete();\n }\n\n function onComplete(): void {\n let alertMessage = '';\n let useErrorAlert = false;\n\n if (successCount === 0) {\n alertMessage = getPhrase('error', { smartCount: answers.length });\n useErrorAlert = true;\n }\n\n if (successCount < completeCount) {\n alertMessage = getPhrase('success', { smartCount: successCount })\n + ` ${getPhrase('partialError', { smartCount: completeCount - successCount })}`;\n }\n\n if (successCount === completeCount) {\n alertMessage = getPhrase('success', { smartCount: successCount });\n }\n\n useErrorAlert\n ? alerts.error(alertMessage)\n : alerts.success(alertMessage);\n\n setMarkedAnswers({});\n\n onDone && onDone();\n }\n\n answers.forEach(({ id, resultId, questionId, status }) => {\n Flight.fetch(dispatch, InteractiveResultsRequests.mark(\n interactiveId,\n interactiveMetadataId,\n id,\n { id, resultId, questionId, status },\n onSuccess,\n null,\n onAlways\n ));\n });\n }\n\n return {\n markedAnswers,\n addMarkedAnswers,\n submitMarkedAnswers\n };\n};","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { ResultsSummary } from 'libs/shared/apps/analytics/interfaces/ResultsSummary';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { ScoreThresholdDefaults, 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}"],"names":["AnswerContainer","props","answer","key","id","className","status","InteractiveAnswerStatus","getBgColour","SvgContainer","svgName","customAnswer","textClassName","text","children","getPhrase","LanguageService","NoResponseRequired","ResponseItemComponentLookup","answers","length","map","ArrayHelper","src","alt","interaction","name","InteractionResponseItem","ResponseItemComponent","typeId","result","studentResults","studentAttempt","correctness","InteractiveCorrectnessHelper","showStudentDetails","Avatar","imageCdnUrl","initials","anonymisedUserName","UserHelper","user","surname","imageUrl","avatar","url","InteractionStudentDetailsHeader","responseComponentClass","showFeedback","showAvatar","MarkResponse","markInteraction","markedStatus","NoResponse","InteractionResponseCorrectness","getInteractiveResultFilters","currentUser","filter","currentUserId","currentCustomerId","customerId","dateRange","start","end","userIds","userId","classroomsAndGroups","groupId","InteractiveResultsRequests","interactiveResultSet","interactiveId","interactiveMetadataId","success","error","always","data","type","normalize","mark","answerId","resultId","invalidationKeys","pendingReviews","interactiveResultsReport","useFetchInteractiveResults","requestFilter","interactiveMetadata","interactive","shouldFetchResults","I","useMarkAnswers","onDone","useState","markedAnswers","setMarkedAnswers","dispatch","alerts","addMarkedAnswers","forEach","a","m","submitMarkedAnswers","Object","keys","completeCount","successCount","questionId","onSuccess","onAlways","alertMessage","useErrorAlert","smartCount","groupStudents","results","scoreThreshold","groups","markingRequired","lowScore","highScore","completed","notCompleted","numInteractions","students","s","withSummary","summary","getStudentResultsSummary","awaitingMarking","push","attempts","percentCorrect","HIGH","MODERATE","sortedLowScore","sortedHighScore","getInteractionById","interactionId","find","i","toString","getMarkedAnswerId","getMarkedStatus","studentResponse","every","getInteractionResultsSummary","numStudents","numCorrect","answered","unanswered","correct","interactions","interactionIds","Set","answeredInteractions","has"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[3391],{71553:(e,t,n)=>{n.d(t,{I:()=>l});var a=n(99940),r=n(62875);function i(e,t){return{currentUserId:e.id,currentCustomerId:e.customerId,dateRange:{start:t.start,end:t.end},userIds:t.userId,classroomsAndGroups:t.groupId}}var l={interactiveResultSet:function(e,t,n,l,c,s,o){return{url:"/api/domain/v2/analytics/interactives/".concat(e,"/metadata/").concat(t),key:(0,r.H)("interactive:result:set:".concat(e,":").concat(t),l),data:i(n,l),type:a.k.POST,normalize:!1,success:c,error:s,always:o}},mark:function(e,t,n,r,i,l,c){return{url:"/api/domain/v1/analytics/answers/".concat(n),key:"mark:answer:".concat(n,":").concat(r.resultId),type:a.k.PUT,data:r,normalize:!1,invalidationKeys:"interactive:result:set:".concat(e,":").concat(t),success:i,error:l,always:c}},pendingReviews:function(e){return{url:"/api/domain/v1/analytics/interactives/pending-reviews/summary",key:"interactives:pending:reviews",type:a.k.POST,data:e}},interactiveResultsReport:function(e){return{url:"{gateway}/v2/analytics/interactives/report",key:"interactive:results:report",data:e,type:a.k.POST,normalize:!1}}}},40391:(e,t,n)=>{n.d(t,{m9:()=>E,Ad:()=>b,Kh:()=>C});var a=n(32735),r=n(23481),i=n(75896),l=n(20789),c=n(18995),s=n(60376),o=n(83914),u=n(36532),m=n(4594),d=n(36511),v=n(35223),f=n(64818);const p={avatarContainer:"ByxQa"};var g=r.T.encloseNamespace("reportsShare.sharedToAvatarList");function h(e){var t=i.m.countBy(e,"typeId"),n=t[m.E.User],a=t[m.E.Classroom],r=t[m.E.ClassroomGroup];return n&&a&&r?g("classroomsGroupsAndUsers",{userCount:n,classroomCount:a,groupCount:r}):n&&a?g("classroomsAndUsers",{userCount:n,classroomCount:a}):n&&r?g("groupsAndUsers",{userCount:n,groupCount:r}):a&&r?g("classroomsAndGroups",{classroomCount:a,groupCount:r}):n?g("users",{userCount:n}):a?g("classrooms",{classroomCount:a}):r?g("groups",{groupCount:r}):void 0}function y(e){var t,n,r,i,c,g=(null===(t=e.item)||void 0===t?void 0:t.typeId)===m.E.User&&e.item,h=(null===(n=e.item)||void 0===n?void 0:n.typeId)===m.E.Classroom&&e.item,y=(null===(r=e.item)||void 0===r?void 0:r.typeId)===m.E.ClassroomGroup&&e.item,E="d-flex justify-content-center align-items-center text-white rounded-circle h-100 w-100";return a.createElement("div",{className:"".concat(p.avatarContainer," position-relative d-inline-block")},a.createElement("div",{className:"".concat(p.avatarWrapper," position-absolute w-100 h-100 bg-white rounded-circle"),style:{left:"".concat(-15*e.index,"%"),zIndex:e.maxAvatars-e.index}},!!g&&a.createElement(u.u,{title:"".concat(g.name," ").concat(g.surname),spanHack:!0,spanHackClassName:"h-100 w-100"},a.createElement(l.q,{imageUrl:null===(i=g.avatar)||void 0===i?void 0:i.url,imageCdnUrl:e.imageCdnUrl,initials:f.l.getInitials(g.name,g.surname)})),!!h&&a.createElement(u.u,{title:h.name,spanHack:!0,spanHackClassName:"h-100 w-100"},a.createElement("div",{className:E},a.createElement(s.f,{svgName:v.vn.Classrooms,svgSize:o.S.Large,variant:"teal"}))),!!y&&a.createElement(u.u,{title:y.name,spanHack:!0,spanHackClassName:"h-100 w-100"},a.createElement("div",{className:E},a.createElement(s.f,{svgName:v.vn.Group,variant:(0,d.I)(null===(c=y.metadata)||void 0===c?void 0:c.colour)})))))}function E(){return a.createElement("div",{className:p.avatarContainer},a.createElement(u.u,{title:g("anonymous"),spanHack:!0,spanHackClassName:"bg-light text-dark d-flex justify-content-center align-items-center rounded-circle h-100 w-100"},a.createElement(o.x,{svgName:v.vn.Anonymous})))}function b(){return a.createElement("div",{className:p.avatarContainer},a.createElement(u.u,{title:g("sharedLink"),spanHack:!0,spanHackClassName:"bg-light text-dark d-flex justify-content-center align-items-center rounded-circle h-100 w-100"},a.createElement(o.x,{svgName:v.vn.Link})))}function C(e){return a.createElement("div",null,a.createElement(c.e,Object.assign({},e,{items:e.recipients,avatarItem:y,avatarContainerClassname:p.avatarContainer,getHiddenTooltip:h})))}C.defaultProps={maxAvatars:5}},18995:(e,t,n)=>{n.d(t,{e:()=>c});var a=n(32735),r=n(23481),i=n(36532),l=r.T.encloseNamespace("shared.avatarList");function c(e){var t=e.items.length>e.maxAvatars?e.items.slice(0,e.maxAvatars-1):e.items,n=e.items.length>t.length?e.items.slice(e.maxAvatars-1):[],r=e.avatarItem,c=n.length;return 0===t.length?a.createElement(a.Fragment,null):a.createElement("div",null,t.map((function(t,n){return a.createElement("div",{className:"".concat(e.avatarContainerClassname||""," position-relative d-inline-block"),key:t.id},a.createElement("div",{className:"position-absolute w-100 h-100 bg-white rounded-circle",style:{left:"".concat(-15*n,"%"),zIndex:e.maxAvatars-n}},a.createElement(r,{item:t,imageCdnUrl:e.imageCdnUrl,index:n,maxAvatars:e.maxAvatars})))})),!!n.length&&a.createElement("div",{className:"".concat(e.avatarContainerClassname||""," position-relative d-inline-block")},a.createElement("div",{className:"position-absolute w-100 h-100 bg-white rounded-circle",style:{left:"".concat(-15*t.length,"%"),zIndex:e.maxAvatars-t.length}},a.createElement(i.u,{title:e.getHiddenTooltip?e.getHiddenTooltip(n):e.roleToDisplay?l("staff"===e.roleToDisplay?"staff":"student",{count:c,smartCount:c}):l("users",{count:c,smartCount:c}),spanHack:!0,spanHackClassName:"h-100 w-100"},a.createElement("div",{className:"d-flex justify-content-center align-items-center border border-dark rounded-circle h-100 w-100 ".concat(e.numberClassname||"")},"+".concat(n.length))))))}c.defaultProps={maxAvatars:5}},39902:(e,t,n)=>{n.d(t,{f:()=>s});var a=n(32735),r=n(70680),i=n(20354);function l(e,t){if(e){if("string"==typeof e)return c(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)?c(e,t):void 0}}function c(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}function s(e,t){var n,s,o=(n=a.useState([]),s=2,function(e){if(Array.isArray(e))return e}(n)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,i,l,c=[],s=!0,o=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(a=i.call(n)).done)&&(c.push(a.value),c.length!==t);s=!0);}catch(e){o=!0,r=e}finally{try{if(!s&&null!=n.return&&(l=n.return(),Object(l)!==l))return}finally{if(o)throw r}}return c}}(n,s)||l(n,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.")}()),u=o[0],m=o[1];a.useEffect((function(){if(null==e?void 0:e.length){var t=function(e){return function(e){if(Array.isArray(e))return c(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||l(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.")}()}(u);t.push([]),e.forEach((function(e){t.find((function(t){return t.find((function(t){return t===e}))}))||t[t.length-1].push(e)})),m(t.filter((function(e){return e.length})))}}),[e?e.join(","):null]);var d=(0,r.I0)(),v=(0,r.v9)((function(e){return e}));if(a.useEffect((function(){u.forEach((function(e){var n=t(e);i.a.getResponse(v,n.key).shouldFetch&&i.a.fetch(d,n)}))}),[null==u?void 0:u.length]),!(null==u?void 0:u.length))return{items:null,isFetching:!1};var f={},p={};return u.forEach((function(e,n){var a=t(e),r=i.a.getResponse(v,a.key);p[n]=r,r.data&&r.data.forEach((function(e){return f[e.id]=e}))})),{items:Object.keys(p).some((function(e){return!!p[e].data}))?f:null,isFetching:!!Object.keys(p).some((function(e){return p[e].isFetching}))}}},70227:(e,t,n)=>{n.d(t,{c:()=>i});var a=n(97395),r=n(4594),i={getObjectUrl:function(e,t){var n=e.analyticsWebUrl;if(n){var i="";switch(t.typeId){case r.E.Video:i="/videos/".concat(t.id,"/overview");break;case r.E.Clip:i="/clips/".concat(t.id,"/overview");break;case r.E.Interactive:i="/interactives/".concat(t.id,"/overview")}if(i)return a._.safeUrlConcat(n,i)}}}},63153:(e,t,n)=>{n.d(t,{Q:()=>y,U:()=>C});var a=n(32735),r=n(23481),i=n(20354),l=n(28400),c=n(83914),s=n(36532),o=n(4594),u=n(39151),m=n(70227),d=n(35223),v=n(31908),f=n(14070),p=n(97291),g=n(82431),h=r.T.encloseNamespace("liteShare.sharedByMe");function y(e){return v.M.isInteractive(e)?{application:p.O.INTERACTIVES,action:f.e.Interactives.VIEW_INTERACTIVE,args:[e.id,l.m.slugify(e.name)]}:v.M.isClip(e)?{application:p.O.CLIPS,action:f.e.Clips.PLAY_CLIP,args:[e.id,l.m.slugify(e.name)]}:v.M.isVideo(e)?{application:p.O.VIDEOS,action:f.e.Videos.PLAY_VIDEO,args:[e.id,l.m.slugify(e.name)]}:e.typeId===o.E.Playlist?{application:p.O.PLAYLISTS,action:f.e.Playlists.PLAYLIST,args:[e.id,l.m.slugify(e.name)]}:e.typeId===o.E.Series?g.j.getSeriesAppLink(e):void 0}function E(e,t){return{label:h("editShareSettings"),appLink:{application:p.O.DEFAULT,action:f.e.Default.SHARE,args:[e.id],params:{entityType:t}}}}function b(e){return a.createElement(s.u,{title:e.label,spanHack:!0},a.createElement("a",{href:e.url,target:"_blank"},a.createElement(c.x,{svgName:d.vn.Chart})))}function C(e){var t=i.a.useBasicFetch(u.L.config()),n=e.xs||e.sm;return a.useCallback((function(e){return function(e,t,n){var r,i="viewUsage";if(v.M.isVideo(e)&&(r="video"),v.M.isInteractive(e)&&(r="interactive",i="viewResults"),v.M.isClip(e)&&(r="clip"),e.typeId===o.E.Series&&(r="series"),e.typeId===o.E.Playlist&&(r="playlist"),v.M.isVideoType(e)&&!v.M.getCanBeConsumed(e).canConsume)return[];var l=[E(e,r)],c=m.c.getObjectUrl(t,e);return c&&l.push({label:n?h(i):function(){return a.createElement(b,{label:h(i),url:c})},className:"btn btn-link",button:!n,href:c,openInNewTab:!0}),l}(e,t.data,n)}),[n])}},82202:(e,t,n)=>{n.d(t,{N:()=>c});var a=n(32735);const r={imageColumn:"uIOaA",nameColumn:"Nta2B",sharedToColumn:"XTJBC",dateSharedColumn:"HdARK",actionsColumn:"DXyZw",heading:"XZ6o7",image:"MolfU",name:"MM43m",avatar:"EboYM",date:"by_XM",actions:"_S2M_"};function i(){return a.createElement("div",{className:"d-flex striped-row rounded"},a.createElement("div",{className:"d-flex align-items-center justify-content-center p-2 ".concat(r.imageColumn)},a.createElement("div",{className:"partial-loading-background rounded w-100 ".concat(r.image)})),a.createElement("div",{className:"d-flex align-items-center p-2 ".concat(r.nameColumn)},a.createElement("div",{className:"partial-loading-background w-75 ".concat(r.name)})),a.createElement("div",{className:"d-flex align-items-center p-2 ".concat(r.sharedToColumn)},a.createElement("div",{className:"partial-loading-background ".concat(r.avatar)})),a.createElement("div",{className:"d-none d-md-flex align-items-center p-2 ".concat(r.dateSharedColumn)},a.createElement("div",{className:"partial-loading-background ".concat(r.date)})),a.createElement("div",{className:"d-flex align-items-center justify-content-end p-2 ".concat(r.actionsColumn)},a.createElement("div",{className:"partial-loading-background rounded me-2 ".concat(r.actions)})))}function l(e){return a.createElement("div",{className:"d-flex mb-1"},a.createElement("div",{className:"".concat(r.imageColumn," p-2")},a.createElement("div",{className:"partial-loading-background ".concat(r.heading)})),a.createElement("div",{className:"".concat(r.nameColumn," p-2")}," "),a.createElement("div",{className:"".concat(r.sharedToColumn," p-2")},e.fullHeader?a.createElement("div",{className:"partial-loading-background ".concat(r.heading)}):a.createElement(a.Fragment,null," ")),a.createElement("div",{className:"".concat(r.dateSharedColumn," p-2 d-none d-md-flex")},e.fullHeader?a.createElement("div",{className:"partial-loading-background ".concat(r.heading)}):a.createElement(a.Fragment,null," ")),a.createElement("div",{className:"".concat(r.actionsColumn," p-2")}," "))}function c(){return a.createElement(a.Fragment,null,a.createElement("div",{className:"mb-3"},a.createElement(l,{fullHeader:!0}),a.createElement("div",{className:"striped-list no-full-width"},a.createElement(i,null),a.createElement(i,null),a.createElement(i,null))),a.createElement("div",{className:"mb-3"},a.createElement(l,null),a.createElement("div",{className:"striped-list no-full-width"},a.createElement(i,null),a.createElement(i,null),a.createElement(i,null),a.createElement(i,null))),a.createElement("div",{className:"mb-3"},a.createElement(l,null),a.createElement("div",{className:"striped-list no-full-width"},a.createElement(i,null),a.createElement(i,null),a.createElement(i,null),a.createElement(i,null),a.createElement(i,null),a.createElement(i,null),a.createElement(i,null),a.createElement(i,null),a.createElement(i,null),a.createElement(i,null))))}},64208:(e,t,n)=>{n.d(t,{aH:()=>E});var a=n(32735),r=n(20354),i=n(75896),l=n(71553),c=n(30439),s=n(4594),o=n(39151),u=n(31949),m=n(39902),d=n(60115),v=n(85063),f={getDirectShares:function(e){var t;return null!==(t=null==e?void 0:e.filter((function(e){return e.type===v.y.DirectShare})))&&void 0!==t?t:[]},getRecipientIds:function(e){return i.m.uniq(i.m.flatten(f.getDirectShares(e).map((function(e){var t;return null!==(t=e.recipients)&&void 0!==t?t:[]}))),"id").map((function(e){return e.id}))}};function p(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,i,l,c=[],s=!0,o=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(a=i.call(n)).done)&&(c.push(a.value),c.length!==t);s=!0);}catch(e){o=!0,r=e}finally{try{if(!s&&null!=n.return&&(l=n.return(),Object(l)!==l))return}finally{if(o)throw r}}return c}}(e,t)||g(e,t)||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.")}()}function g(e,t){if(e){if("string"==typeof e)return h(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)?h(e,t):void 0}}function h(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}function y(e){return e.items?Object.values(e.items):[]}function E(e,t){var n,v,E=r.a.useGetFetch(),b=r.a.useBasicFetch(u.N.currentUser()),C=function(t){return c.o.sentShare(Object.assign({cursor:t},e))},I=function(e){return E(C(e))},N=(0,d.K)(C,I),k=N.items,w=N.hasMore,S=N.isFetching,A=N.nextCursor,x=i.m.uniq(null!==(n=null==k?void 0:k.map((function(e){return e.objectId})))&&void 0!==n?n:[]),T=(0,m.f)(x,(function(e){return c.o.sharedObjectsById(e)})),j=f.getRecipientIds(k),O=(0,m.f)(j,(function(e){return c.o.getRecipientsById(e,b.data.customerId)})),U=r.a.useBasicFetch(o.L.config()),H=function(e,t,n,r,i){var l=p(a.useState(t),2),c=l[0],s=l[1],o=p(a.useState(r),2),u=o[0],m=o[1];return a.useEffect((function(){t&&s(!0)}),[t]),a.useEffect((function(){r&&m(!0)}),[r]),!(e&&!e.length)&&(!e||!c||n.length&&!u||!i.data)}(k,!!T.items,j,!!O.items,U),F=JSON.stringify(e),L=S||T.isFetching||O.isFetching,M=y(T),R=y(O),P=t&&(null==M?void 0:M.length)&&M.reduce((function(e,t){if(t.typeId!==s.E.Interactive)return e;var n,a=t;return[].concat(function(e){if(Array.isArray(e))return h(e)}(n=e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(n)||g(n)||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.")}(),[{metadataId:a.id,interactiveId:a.interactiveId}])}),[]),B=r.a.useBasicFetch(t&&!!T.items&&b.data&&l.I.pendingReviews({interactives:P,filters:{currentCustomerId:b.data.customerId,currentUserId:b.data.id}})),_=[L,F,B.isFetching];return{sentShares:k,sharedObjects:M,shareRecipients:R,interactivesPendingReview:B.data,isFetching:L,showPartialLoading:H,nextCursor:A,hasMore:w,fetchNext:I,imageCdnUrl:null===(v=U.data)||void 0===v?void 0:v.imageCdnUrl,dependencies:_}}}}]);
2
+ //# sourceMappingURL=3391-5e26ca5ece-lite.chunk.js.map