@clickview/lite 0.64.0-rc.0 → 0.64.0-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 (147) hide show
  1. package/dist/bundles.json +1 -1
  2. package/dist/css/{7153-lite-0cc5db0db7.chunk.css → 2962-lite-2002c62a24.chunk.css} +0 -1
  3. package/dist/css/{1857-lite-324255d395.chunk.css → 6173-lite-911f35513f.chunk.css} +0 -1
  4. package/dist/css/{2083-lite-6cb1775e12.chunk.css → 7324-lite-238bd550b7.chunk.css} +0 -1
  5. package/dist/css/{9013-lite-620f218839.chunk.css → 9013-lite-3c31b606c5.chunk.css} +2 -2
  6. package/dist/languages/en.json +1 -1
  7. package/dist/scripts/1216-899540dc73-lite.chunk.js +2 -0
  8. package/dist/scripts/1216-899540dc73-lite.chunk.js.map +1 -0
  9. package/dist/scripts/1820-b572681b3a-lite.chunk.js +2 -0
  10. package/dist/scripts/1820-b572681b3a-lite.chunk.js.map +1 -0
  11. package/dist/scripts/{2056-84f388df20-lite.chunk.js → 2056-a9e8d17a46-lite.chunk.js} +3 -3
  12. package/dist/scripts/2056-a9e8d17a46-lite.chunk.js.map +1 -0
  13. package/dist/scripts/229-ac9f12e165-lite.chunk.js +2 -0
  14. package/dist/scripts/229-ac9f12e165-lite.chunk.js.map +1 -0
  15. package/dist/scripts/{2564-65e3fc9619-lite.chunk.js → 2564-f5628d4e56-lite.chunk.js} +3 -3
  16. package/dist/scripts/{2564-65e3fc9619-lite.chunk.js.map → 2564-f5628d4e56-lite.chunk.js.map} +1 -1
  17. package/dist/scripts/2712-a851ddc3c3-lite.chunk.js +2 -0
  18. package/dist/scripts/2712-a851ddc3c3-lite.chunk.js.map +1 -0
  19. package/dist/scripts/{2788-eca70707c6-lite.chunk.js → 2788-c8ae3be73f-lite.chunk.js} +1 -1
  20. package/dist/scripts/2788-c8ae3be73f-lite.chunk.js.map +1 -0
  21. package/dist/scripts/{7153-0ed8513e59-lite.chunk.js → 2962-7f2e4412f0-lite.chunk.js} +2 -2
  22. package/dist/scripts/{7153-0ed8513e59-lite.chunk.js.map → 2962-7f2e4412f0-lite.chunk.js.map} +1 -1
  23. package/dist/scripts/2988-b602b64344-lite.chunk.js +2 -0
  24. package/dist/scripts/2988-b602b64344-lite.chunk.js.map +1 -0
  25. package/dist/scripts/3180-c1f065183d-lite.chunk.js +2 -0
  26. package/dist/scripts/3180-c1f065183d-lite.chunk.js.map +1 -0
  27. package/dist/scripts/3549-111225ff0e-lite.chunk.js +2 -0
  28. package/dist/scripts/3549-111225ff0e-lite.chunk.js.map +1 -0
  29. package/dist/scripts/4591-f78fa6c784-lite.chunk.js +2 -0
  30. package/dist/scripts/4591-f78fa6c784-lite.chunk.js.map +1 -0
  31. package/dist/scripts/4667-5101904582-lite.chunk.js +2 -0
  32. package/dist/scripts/4667-5101904582-lite.chunk.js.map +1 -0
  33. package/dist/scripts/{5056-6057435479-lite.chunk.js → 5056-65c739468f-lite.chunk.js} +1 -1
  34. package/dist/scripts/5056-65c739468f-lite.chunk.js.map +1 -0
  35. package/dist/scripts/5157-e38b666fce-lite.chunk.js +2 -0
  36. package/dist/scripts/5157-e38b666fce-lite.chunk.js.map +1 -0
  37. package/dist/scripts/5201-98ee21febb-lite.chunk.js +2 -0
  38. package/dist/scripts/5201-98ee21febb-lite.chunk.js.map +1 -0
  39. package/dist/scripts/5595-79068997ce-lite.chunk.js +2 -0
  40. package/dist/scripts/5595-79068997ce-lite.chunk.js.map +1 -0
  41. package/dist/scripts/5770-f88f6d9c00-lite.chunk.js +2 -0
  42. package/dist/scripts/5770-f88f6d9c00-lite.chunk.js.map +1 -0
  43. package/dist/scripts/5896-60133bfdad-lite.chunk.js +3 -0
  44. package/dist/scripts/5896-60133bfdad-lite.chunk.js.map +1 -0
  45. package/dist/scripts/6173-7f9939c29e-lite.chunk.js +3 -0
  46. package/dist/scripts/6173-7f9939c29e-lite.chunk.js.map +1 -0
  47. package/dist/scripts/6181-9d7668c9e4-lite.chunk.js +3 -0
  48. package/dist/scripts/6181-9d7668c9e4-lite.chunk.js.map +1 -0
  49. package/dist/scripts/6455-37039eb687-lite.chunk.js +2 -0
  50. package/dist/scripts/6455-37039eb687-lite.chunk.js.map +1 -0
  51. package/dist/scripts/6623-84b33c6856-lite.chunk.js +3 -0
  52. package/dist/scripts/6623-84b33c6856-lite.chunk.js.map +1 -0
  53. package/dist/scripts/6919-0f2cef64e5-lite.chunk.js +2 -0
  54. package/dist/scripts/6919-0f2cef64e5-lite.chunk.js.map +1 -0
  55. package/dist/scripts/7267-1f5006c9c5-lite.chunk.js +2 -0
  56. package/dist/scripts/7267-1f5006c9c5-lite.chunk.js.map +1 -0
  57. package/dist/scripts/{2083-7daacf0112-lite.chunk.js → 7324-ee20e73ac1-lite.chunk.js} +2 -2
  58. package/dist/scripts/{2083-7daacf0112-lite.chunk.js.map → 7324-ee20e73ac1-lite.chunk.js.map} +1 -1
  59. package/dist/scripts/7434-fef3ea4e89-lite.chunk.js +2 -0
  60. package/dist/scripts/7434-fef3ea4e89-lite.chunk.js.map +1 -0
  61. package/dist/scripts/7443-4866d0c9ab-lite.chunk.js +3 -0
  62. package/dist/scripts/7443-4866d0c9ab-lite.chunk.js.map +1 -0
  63. package/dist/scripts/8416-7d71a55a14-lite.chunk.js +2 -0
  64. package/dist/scripts/8416-7d71a55a14-lite.chunk.js.map +1 -0
  65. package/dist/scripts/8465-01b0f72699-lite.chunk.js +2 -0
  66. package/dist/scripts/8465-01b0f72699-lite.chunk.js.map +1 -0
  67. package/dist/scripts/8722-a9eac1941c-lite.chunk.js +2 -0
  68. package/dist/scripts/8722-a9eac1941c-lite.chunk.js.map +1 -0
  69. package/dist/scripts/9013-6fcc58f028-lite.chunk.js +2 -0
  70. package/dist/scripts/9013-6fcc58f028-lite.chunk.js.map +1 -0
  71. package/dist/scripts/9264-998d93d1c2-lite.chunk.js +2 -0
  72. package/dist/scripts/9264-998d93d1c2-lite.chunk.js.map +1 -0
  73. package/dist/scripts/9894-0fba5cf702-lite.chunk.js +3 -0
  74. package/dist/scripts/9894-0fba5cf702-lite.chunk.js.map +1 -0
  75. package/dist/scripts/bundle-2e839958ca.min.js +3 -0
  76. package/dist/scripts/bundle-2e839958ca.min.js.map +1 -0
  77. package/package.json +1 -1
  78. package/dist/scripts/1755-462bcd99e9-lite.chunk.js +0 -2
  79. package/dist/scripts/1755-462bcd99e9-lite.chunk.js.map +0 -1
  80. package/dist/scripts/180-6c4779f6ab-lite.chunk.js +0 -2
  81. package/dist/scripts/180-6c4779f6ab-lite.chunk.js.map +0 -1
  82. package/dist/scripts/1820-3b5d0a340d-lite.chunk.js +0 -2
  83. package/dist/scripts/1820-3b5d0a340d-lite.chunk.js.map +0 -1
  84. package/dist/scripts/1857-d3af9d98eb-lite.chunk.js +0 -3
  85. package/dist/scripts/1857-d3af9d98eb-lite.chunk.js.map +0 -1
  86. package/dist/scripts/2056-84f388df20-lite.chunk.js.map +0 -1
  87. package/dist/scripts/229-900e650427-lite.chunk.js +0 -2
  88. package/dist/scripts/229-900e650427-lite.chunk.js.map +0 -1
  89. package/dist/scripts/2788-eca70707c6-lite.chunk.js.map +0 -1
  90. package/dist/scripts/3180-22edf4c9fc-lite.chunk.js +0 -2
  91. package/dist/scripts/3180-22edf4c9fc-lite.chunk.js.map +0 -1
  92. package/dist/scripts/3549-30d3b1cd05-lite.chunk.js +0 -2
  93. package/dist/scripts/3549-30d3b1cd05-lite.chunk.js.map +0 -1
  94. package/dist/scripts/3776-0027340c98-lite.chunk.js +0 -2
  95. package/dist/scripts/3776-0027340c98-lite.chunk.js.map +0 -1
  96. package/dist/scripts/4591-3e8dddd0e9-lite.chunk.js +0 -2
  97. package/dist/scripts/4591-3e8dddd0e9-lite.chunk.js.map +0 -1
  98. package/dist/scripts/4667-f3882f2379-lite.chunk.js +0 -2
  99. package/dist/scripts/4667-f3882f2379-lite.chunk.js.map +0 -1
  100. package/dist/scripts/5056-6057435479-lite.chunk.js.map +0 -1
  101. package/dist/scripts/5157-ad13101a6e-lite.chunk.js +0 -2
  102. package/dist/scripts/5157-ad13101a6e-lite.chunk.js.map +0 -1
  103. package/dist/scripts/5201-7d3867d027-lite.chunk.js +0 -2
  104. package/dist/scripts/5201-7d3867d027-lite.chunk.js.map +0 -1
  105. package/dist/scripts/5595-10e586779d-lite.chunk.js +0 -2
  106. package/dist/scripts/5595-10e586779d-lite.chunk.js.map +0 -1
  107. package/dist/scripts/5896-5d2f32c59e-lite.chunk.js +0 -3
  108. package/dist/scripts/5896-5d2f32c59e-lite.chunk.js.map +0 -1
  109. package/dist/scripts/6181-50a39979ec-lite.chunk.js +0 -3
  110. package/dist/scripts/6181-50a39979ec-lite.chunk.js.map +0 -1
  111. package/dist/scripts/6455-2f45be17cf-lite.chunk.js +0 -2
  112. package/dist/scripts/6455-2f45be17cf-lite.chunk.js.map +0 -1
  113. package/dist/scripts/6623-ebbffb59b3-lite.chunk.js +0 -3
  114. package/dist/scripts/6623-ebbffb59b3-lite.chunk.js.map +0 -1
  115. package/dist/scripts/6919-cb2de57c2e-lite.chunk.js +0 -2
  116. package/dist/scripts/6919-cb2de57c2e-lite.chunk.js.map +0 -1
  117. package/dist/scripts/7267-c2d30dd339-lite.chunk.js +0 -2
  118. package/dist/scripts/7267-c2d30dd339-lite.chunk.js.map +0 -1
  119. package/dist/scripts/7434-c34ca23a21-lite.chunk.js +0 -2
  120. package/dist/scripts/7434-c34ca23a21-lite.chunk.js.map +0 -1
  121. package/dist/scripts/7443-7c72de0cb9-lite.chunk.js +0 -3
  122. package/dist/scripts/7443-7c72de0cb9-lite.chunk.js.map +0 -1
  123. package/dist/scripts/8022-0656cce655-lite.chunk.js +0 -2
  124. package/dist/scripts/8022-0656cce655-lite.chunk.js.map +0 -1
  125. package/dist/scripts/8722-69c1c7a24f-lite.chunk.js +0 -2
  126. package/dist/scripts/8722-69c1c7a24f-lite.chunk.js.map +0 -1
  127. package/dist/scripts/9013-adc5d3517a-lite.chunk.js +0 -2
  128. package/dist/scripts/9013-adc5d3517a-lite.chunk.js.map +0 -1
  129. package/dist/scripts/9155-87c9030ce9-lite.chunk.js +0 -2
  130. package/dist/scripts/9155-87c9030ce9-lite.chunk.js.map +0 -1
  131. package/dist/scripts/9264-750b3d6ea0-lite.chunk.js +0 -2
  132. package/dist/scripts/9264-750b3d6ea0-lite.chunk.js.map +0 -1
  133. package/dist/scripts/9894-bc34edcd67-lite.chunk.js +0 -3
  134. package/dist/scripts/9894-bc34edcd67-lite.chunk.js.map +0 -1
  135. package/dist/scripts/bundle-3d3d127d98.min.js +0 -3
  136. package/dist/scripts/bundle-3d3d127d98.min.js.map +0 -1
  137. package/dist/css/{6455-lite-fe0bc6d95f.chunk.css → 6455-lite-c07987d46c.chunk.css} +1 -1
  138. /package/dist/css/{9155-lite-447d345417.chunk.css → 8465-lite-447d345417.chunk.css} +0 -0
  139. /package/dist/scripts/{1857-d3af9d98eb-lite.chunk.js.LICENSE.txt → 2056-a9e8d17a46-lite.chunk.js.LICENSE.txt} +0 -0
  140. /package/dist/scripts/{2056-84f388df20-lite.chunk.js.LICENSE.txt → 2564-f5628d4e56-lite.chunk.js.LICENSE.txt} +0 -0
  141. /package/dist/scripts/{2564-65e3fc9619-lite.chunk.js.LICENSE.txt → 5896-60133bfdad-lite.chunk.js.LICENSE.txt} +0 -0
  142. /package/dist/scripts/{5896-5d2f32c59e-lite.chunk.js.LICENSE.txt → 6173-7f9939c29e-lite.chunk.js.LICENSE.txt} +0 -0
  143. /package/dist/scripts/{6181-50a39979ec-lite.chunk.js.LICENSE.txt → 6181-9d7668c9e4-lite.chunk.js.LICENSE.txt} +0 -0
  144. /package/dist/scripts/{6623-ebbffb59b3-lite.chunk.js.LICENSE.txt → 6623-84b33c6856-lite.chunk.js.LICENSE.txt} +0 -0
  145. /package/dist/scripts/{7443-7c72de0cb9-lite.chunk.js.LICENSE.txt → 7443-4866d0c9ab-lite.chunk.js.LICENSE.txt} +0 -0
  146. /package/dist/scripts/{9894-bc34edcd67-lite.chunk.js.LICENSE.txt → 9894-0fba5cf702-lite.chunk.js.LICENSE.txt} +0 -0
  147. /package/dist/scripts/{bundle-3d3d127d98.min.js.LICENSE.txt → bundle-2e839958ca.min.js.LICENSE.txt} +0 -0
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[2712],{26136:(e,t,n)=>{n.d(t,{B:()=>l});var a=n(76198),r=n(64818);function l(e,t){return e?t?(0,a._8)((n="profileId"in e?e.profileId:e.id,l=+"".concat(n).concat(Math.floor((new Date).getMinutes()/5)),{dictionaries:[a.O9,a.yd],separator:" ",length:2,style:"capital",seed:l})):"profileId"in e?e.name:r.l.getFullName(e):"";var n,l}},74901:(e,t,n)=>{function a(e){return function(e){if(Array.isArray(e))return r(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 r(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)?r(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 r(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}n.d(t,{K:()=>l});var l=function(e){var t=[],n=[];return e.users&&t.push.apply(t,a(e.users)),e.classrooms&&n.push.apply(n,a(e.classrooms)),e.classroomGroups&&n.push.apply(n,a(e.classroomGroups)),{userId:t,groupId:n}}},40003:(e,t,n)=>{n.d(t,{Hb:()=>d,NG:()=>g,W5:()=>m,eO:()=>p,nG:()=>s,wO:()=>v,zn:()=>o});var a=n(23481),r=n(110),l=n(57266),c=a.T.encloseNamespace("shared.analyticsUtils");function i(e){var t=r.O.convertDateToUTC(e);return r.O.format(t,"YYYY-MM-DDTHH:mm:ss")}function o(){return new Date(2021,0,1)}function s(){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=o(),t=(new Date).getFullYear(),n=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:n,tooltip:n?c("lastYearDisabled"):""},{name:c("allTime"),startDate:r.O.subtract(new Date,5,"years"),endDate:new Date,default:!0}]}function f(e){return r.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 n=t.to,a=t.from,c=t.rangeName,i=m(e,c);if(i)return a||n?void l.e.updateParams(p(i),{replace:!0,merge:!0,keysToRemove:["from","to"]}):i;var d=u(e);if(a&&n&&r.O.isValid(a)&&r.O.isValid(n)){var f=!0,g=r.O.convertDateToUTC(new Date(a)),v=r.O.convertDateToUTC(new Date(n));r.O.isBefore(g,o(),"day")&&(g=o(),f=!1),r.O.isAfter(v,s(),"day")&&(v=s(),f=!1),r.O.isAfter(g,v)&&(g=d.startDate,v=d.endDate,f=!1);var b={startDate:g,endDate:v,name:f?c:""};if(f)return b;l.e.updateParams(p(b),{replace:!0,merge:!0,keysToRemove:["rangeName"]})}else l.e.updateParams(p(d),{replace:!0,merge:!0,keysToRemove:["rangeName"]})}function v(e,t){var n=function(e){return i(r.O.startOf(e,"day"))},a=function(e){return i(r.O.endOf(e,"day"))},l=m(e,t.rangeName);if(l)return{start:n(f(l.startDate)),end:a(f(l.endDate))};if(t.from&&t.to)return{start:n(t.from),end:a(t.to)};var c=u(e);return{start:n(f(c.startDate)),end:a(f(c.endDate))}}},49935:(e,t,n)=>{n.d(t,{Oo:()=>g,b2:()=>v});var a=n(32735),r=n(23481),l=n(36848),c=n(86764),i=n(3747),o=n(5859),s=n(35223),u=n(83914);function m(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,l,c,i=[],o=!0,s=!1;try{if(l=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;o=!1}else for(;!(o=(a=l.call(n)).done)&&(i.push(a.value),i.length!==t);o=!0);}catch(e){s=!0,r=e}finally{try{if(!o&&null!=n.return&&(c=n.return(),Object(c)!==c))return}finally{if(s)throw r}}return i}}(e,t)||function(e,t){if(e){if("string"==typeof e)return d(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)?d(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 d(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}var f=r.T.encloseNamespace("shared.breadcrumbComponent"),p=a.forwardRef((function(e,t){var n=e.breadcrumb,r=n.name,c=n.appLink,i=n.active,o=e.withBackIcon,m=r,d=null;return m.length>48&&(m=r.slice(0,48)+"...",d=r),a.createElement("li",{className:"breadcrumb-item".concat(i?" active":""),title:d},i?a.createElement("strong",null,m):a.createElement(l.F,{appLink:c,ref:t},o&&a.createElement(u.x,{svgName:s.vn.ChevronLeft,size:u.S.Small}),a.createElement("span",{className:o?"ms-2":""},m)))})),g=function(e){var t=e.breadcrumbs,n=(0,i.a)(c.r.XS),r=(null==t?void 0:t.length)||0,l=m(a.useState(!1),2),o=l[0],s=l[1],u=m(a.useState(!1),2),d=u[0],g=u[1],v=a.useRef();if(a.useEffect((function(){var e,n=null!==(e=null==t?void 0:t.reduce((function(e,t){return e+t.name.length}),0))&&void 0!==e?e:0;r>4&&n>64&&s(!0)}),[null==t?void 0:t.length]),a.useLayoutEffect((function(){var e;d&&(null===(e=v.current)||void 0===e||e.focus())}),[v.current,d]),!r||n&&r<2)return a.createElement(a.Fragment,null);if(n)return a.createElement("nav",{"aria-label":"breadcrumb"},a.createElement("ol",{className:"breadcrumb m-0 p-0"},a.createElement(p,{breadcrumb:t[r-2],withBackIcon:!0})));var b=a.createElement(p,{breadcrumb:t[0]}),y=r>2?a.createElement(p,{breadcrumb:t[1]}):a.createElement(a.Fragment,null),E=r>3?a.createElement(p,{breadcrumb:t[r-2]}):a.createElement(a.Fragment,null),h=r>1?a.createElement(p,{breadcrumb:t[r-1]}):a.createElement(a.Fragment,null),D=t.slice(2,r-2);return a.createElement("nav",{"aria-label":"breadcrumb"},a.createElement("ol",{className:"breadcrumb m-0 p-0"},b,y,o?a.createElement("li",{className:"breadcrumb-item"},a.createElement("button",{className:"btn-link",onClick:function(){s(!1),g(!0)},"aria-label":f("expand")},"...")):D.map((function(e,t){return a.createElement(p,{key:t,breadcrumb:e,ref:0===t?v:null})})),E,h))},v=a.memo((function(e){var t=e.numItems,n=void 0===t?3:t;return(0,i.a)(c.r.XS)?a.createElement("div",{className:"partial-loading-background",style:{height:"1.3125rem",width:"6rem"}}):a.createElement("nav",{"aria-label":"breadcrumb"},a.createElement("ol",{className:"breadcrumb m-0 p-0"},o.u.getPartialLoadingItems({numItems:n}).map((function(e,t){var n=e.width;return a.createElement("li",{key:t,className:"breadcrumb-item"},a.createElement("span",{className:"d-inline-block partial-loading-background",style:{width:n},dangerouslySetInnerHTML:{__html:"&nbsp"}}))}))))}))},40782:(e,t,n)=>{n.d(t,{I:()=>a,O:()=>o});var a,r=n(32735),l=n(2606),c=n(62712);function i(e){var t=r.useCallback((function(t){if(t){var n=t.r.baseVal.value,a=2*Math.PI*n,r=a-e.percentage*a;t.style.strokeDasharray="".concat(a," ").concat(a),t.style.strokeDashoffset=r.toString()}}),[e.percentage]);return r.createElement("svg",null,r.createElement("circle",{r:(0,l.pu)(e.size),className:c.Z.backgroundCircle}),!(0,l.zR)(e.percentage)&&r.createElement("circle",{ref:t,r:(0,l.pu)(e.size),className:(0,l.V4)(e.percentage,e.scoreThresholds)}))}function o(e){var t,n=(0,l.Ki)(e.percentage),o=e.size||(e.layout===a.LabelInside?l.Mk.Large:l.Mk.Small),s=e.customLabel||(0,l.DV)(n);return e.layout===a.LabelOnly?r.createElement("span",{className:(0,l.IA)(n)},s):r.createElement("div",{className:"d-flex align-items-center justify-content-between ".concat(null!==(t=e.className)&&void 0!==t?t:"")},e.layout===a.LabelBefore&&r.createElement("span",{className:"me-2"},s),r.createElement("div",{className:(0,l.tw)(o,n)},r.createElement(i,{percentage:n,size:o,scoreThresholds:e.scoreThresholds}),e.layout===a.LabelInside&&r.createElement("span",{className:c.Z.centredPercentageText},s)))}!function(e){e.CircleOnly="circle_only",e.LabelOnly="label_only",e.LabelBefore="label_before",e.LabelInside="label_inside"}(a||(a={})),o.defaultProps={layout:a.CircleOnly}},2606:(e,t,n)=>{n.d(t,{DV:()=>v,IA:()=>f,Ki:()=>g,Mk:()=>i,V4:()=>d,pu:()=>m,tw:()=>p,zR:()=>b});var a=n(94892),r=n(62712);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 c(e,t,n){return(t=function(e){var t=function(e){if("object"!=l(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.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:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var i,o=.2,s=.36;!function(e){e.Small="small",e.Large="large",e.ExtraSmall="extraSmall"}(i||(i={}));var u=c(c(c({},i.ExtraSmall,{size:2}),i.Small,{size:2}),i.Large,{size:5.8});function m(e){var t=u[e].size,n=e===i.Large?s:o;return"".concat(t/2-2*n,"rem")}function d(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:a.i;return e>=t.HIGH?r.Z.circleSuccess:e>=t.MODERATE?r.Z.circleWarning:r.Z.circleDanger}function f(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:a.i;return e>=t.HIGH?"text-success":e>=t.MODERATE?"text-warning":"text-danger"}function p(e,t){var n="d-inline-block ".concat(r.Z.circleContainer);return e===i.Large&&(n+=" ".concat(r.Z.lgCircleContainer)),e===i.ExtraSmall&&(n+=" ".concat(r.Z.xsCircleContainer)),b(t)&&(n+=" ".concat(r.Z.pendingCircle)),n}function g(e){if(!b(e))return+e.toFixed(2)}function v(e){return b(e)?"--%":"".concat(Math.round(100*e),"%")}function b(e){return"number"!=typeof e}},38502:(e,t,n)=>{n.d(t,{r:()=>m});var a=n(32735),r=n(49985),l=n(36848),c=n(18559),i=n(11607),o=n(83914),s=n(87432);function u(e){return a.createElement(a.Fragment,null,!!e.tab.svgName&&a.createElement("div",{className:e.tab.name?"pe-1":""},a.createElement(o.x,{svgName:e.tab.svgName})),e.tab.name,"number"==typeof e.tab.count&&a.createElement("div",{className:"ps-2"},a.createElement(c.C,{type:c.g.Count,data:e.tab.count})))}function m(e){var t;return a.createElement("nav",{className:null!==(t=e.className)&&void 0!==t?t:"",ref:e.containerRef},a.createElement("ul",{className:"\n list-unstyled d-inline-block m-0 ".concat(s.Z.pillTabSelector,"\n ").concat(e.borderRadius?s.Z.radiusSmall:"","\n ").concat(e.listClassName,"\n ")},e.tabs.map((function(e,t){return a.createElement("li",{className:"\n p-0 ".concat(s.Z.tab," ").concat(e.active?"btn btn-dark":"btn btn-outline-dark","\n ").concat(e.name?s.Z.minWidth:""," ").concat(e.className,"\n "),key:t},e.appLink?a.createElement(l.F,{appLink:e.appLink,analyticsData:e.analyticsData,analyticsOptions:e.analyticsOptions,className:"\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ".concat(s.Z.tabLink,"\n ")},a.createElement(u,{tab:e})):a.createElement(i.L,{className:"\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ".concat(s.Z.tabLink,"\n "),onClick:function(){return function(e){!e.active&&e.onSelect&&(e.onSelect(),e.analyticsData&&e.analyticsOptions&&r.k.logUserAction(e.analyticsData,e.analyticsOptions))}(e)}},a.createElement(u,{tab:e})))}))))}m.defaultProps={borderRadius:"lg"}},94892:(e,t,n)=>{n.d(t,{T:()=>r,i:()=>a});var a={HIGH:.75,MODERATE:.5},r={HIGH:.7,MODERATE:.7}},5859:(e,t,n)=>{function a(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}n.d(t,{u:()=>l});var r={numItems:5,minWidth:50,maxWidth:100},l={getPartialLoadingItems:function(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=Object.assign(Object.assign({},r),t);return(e=Array(n.numItems),function(e){if(Array.isArray(e))return a(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 a(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)?a(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.")}()).map((function(){return{width:"".concat(Math.max(Math.floor(Math.random()*n.maxWidth),n.minWidth),"px")}}))}}},5672:(e,t,n)=>{n.d(t,{$6:()=>i,$o:()=>o,kj:()=>s});var a=n(23481),r=n(14070),l=n(97291),c=a.T.encloseNamespace("shared.insightsUtils");function i(e,t,n){return[{name:c("insights"),active:"insights"===t,appLink:{application:l.O.INSIGHTS,action:r.e.Insights.VIDEO_OVERVIEW,args:[e],params:n}},{name:c("heatmap"),active:"heatmap"===t,appLink:{application:l.O.INSIGHTS,action:r.e.Insights.VIDEO_HEATMAP,args:[e],params:n}}]}function o(e,t,n){return[{name:c("insights"),active:"insights"===t,appLink:{application:l.O.INSIGHTS,action:r.e.Insights.CLIP_OVERVIEW,args:[e],params:n}},{name:c("heatmap"),active:"heatmap"===t,appLink:{application:l.O.INSIGHTS,action:r.e.Insights.CLIP_HEATMAP,args:[e],params:n}}]}function s(e,t,n){return[{name:c("insights"),active:"insights"===t,appLink:{application:l.O.INSIGHTS,action:r.e.Insights.INTERACTIVE_OVERVIEW,args:[e],params:n}},{name:c("results"),active:"results"===t,appLink:{application:l.O.INSIGHTS,action:r.e.Insights.INTERACTIVE_STUDENTS,args:[e],params:n}},{name:c("questions"),active:"questions"===t,appLink:{application:l.O.INSIGHTS,action:r.e.Insights.INTERACTIVE_QUESTIONS,args:[e],params:n}},{name:c("heatmap"),active:"heatmap"===t,appLink:{application:l.O.INSIGHTS,action:r.e.Insights.INTERACTIVE_HEATMAP,args:[e],params:n}}]}},93116:(e,t,n)=>{n.d(t,{m:()=>ne});var a=n(32735),r=n(23481),l=n(57900),c=n(2948),i=n(20354),o=n(40003),s=n(88180),u=n(34509),m=n(57266),d=n(22988),f=n(110),p=n(83914),g=n(35223);const v={dateInputLabel:"CLYvu",dateInput:"gnEqJ"};function b(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,l,c,i=[],o=!0,s=!1;try{if(l=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;o=!1}else for(;!(o=(a=l.call(n)).done)&&(i.push(a.value),i.length!==t);o=!0);}catch(e){s=!0,r=e}finally{try{if(!o&&null!=n.return&&(c=n.return(),Object(c)!==c))return}finally{if(s)throw r}}return i}}(e,t)||function(e,t){if(e){if("string"==typeof e)return y(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)?y(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 y(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}var E=r.T.encloseNamespace("shared.customDateRangeSelector"),h=2,D="DD/MM/YYYY";function N(e){var t,n,r=b(a.useState("startDate"),2),l=r[0],c=r[1],i=function(e){var t=a.useRef(),n=a.useRef();return a.useEffect((function(){var a,r;"startDate"===e&&(null===(a=t.current)||void 0===a||a.focus()),"endDate"===e&&(null===(r=n.current)||void 0===r||r.focus())}),[e]),[t,n]}(l),o=b(i,2),s=o[0],u=o[1];return a.createElement("div",{className:"d-inline-block"},a.createElement("div",{className:"d-flex align-items-center border-bottom p-3"},a.createElement("div",{className:"me-auto invisible"},a.createElement(p.x,{svgName:g.vn.Close})),a.createElement("form",{className:"d-flex align-items-center"},a.createElement("div",{className:"position-relative"},a.createElement("strong",{className:v.dateInputLabel},E("from")),a.createElement("input",{ref:s,className:"form-control cursor-pointer ".concat(v.dateInput),value:null!==(t=f.O.format(e.startDate,D))&&void 0!==t?t:"",onChange:function(){},onFocus:function(){return c("startDate")}})),a.createElement("span",{className:"px-3"},a.createElement(p.x,{svgName:g.vn.ArrowRight})),a.createElement("div",{className:"position-relative"},a.createElement("strong",{className:v.dateInputLabel},E("to")),a.createElement("input",{ref:u,className:"form-control cursor-pointer ".concat(v.dateInput),value:null!==(n=f.O.format(e.endDate,D))&&void 0!==n?n:"",onChange:function(){},onFocus:function(){return c("endDate")}}))),a.createElement("div",{className:"ms-auto cursor-pointer"},a.createElement(p.x,{svgName:g.vn.Close,onClick:e.close}))),a.createElement("div",{className:"p-3"},a.createElement(d._W,{mode:"range",numberOfMonths:h,selected:{from:e.startDate,to:e.endDate},onDayClick:function(t){"startDate"===l?(e.setDateRange({startDate:t,endDate:f.O.isAfter(t,e.endDate)?void 0:e.endDate}),c((function(e){return"endDate"===e?"startDate":"endDate"}))):(e.setDateRange({startDate:f.O.isAfter(e.startDate,t)?t:e.startDate,endDate:f.O.isAfter(e.startDate,t)?void 0:t}),f.O.isAfter(e.startDate,t)||c((function(e){return"endDate"===e?"startDate":"endDate"})))},captionLayout:"dropdown-buttons",fromDate:e.minDate,toDate:e.maxDate,modifiersClassNames:{selected:"my-selected",today:"my-today"},defaultMonth:e.startDate})),a.createElement("div",{className:"pb-3 px-3 text-end"},a.createElement("button",{className:"btn btn-outline-dark",onClick:e.onClickApply},E("apply"))))}function S(e){return a.createElement(u.Z.Toggle,{as:"div",id:"date-range-dropdown",className:"no-caret"},a.createElement("button",{className:"btn btn-outline-dark d-flex align-items-center pe-5",onClick:function(){e.toggleDropdown()}},a.createElement("span",null,e.value),a.createElement("div",{className:"position-absolute translate-middle top-50 end-0 me-n1"},a.createElement(p.x,{svgName:g.vn.Calendar,size:p.S.Standard}))))}var I=n(36532);function w(e){return f.O.isAfter(e,new Date,"day")}function k(e){return w(e.startDate)}const O={containerWithDynamicRanges:"pvYdJ",selectedDateRange:"JU7bd",rangeList:"DBlzu"};var R=r.T.encloseNamespace("shared.presetDateRangeSelector");function A(e){var t=e.range.name===e.selectedRangeName,n=k(e.range)||e.range.disabled,r=function(){return a.createElement("button",{className:(l=t,c="btn btn-link d-flex align-items-center py-1 px-0 text-decoration-none",l?c+" fw-bold text-info ".concat(O.selectedDateRange):c+" text-body"),onClick:function(){return e.onClick(e.range)},disabled:n},t&&a.createElement(p.x,{svgName:g.vn.Check}),a.createElement("span",{className:"".concat(n?"text-secondary":""," ").concat(e.isDynamic?"fw-bold":"")},e.range.name),!!e.isDynamic&&a.createElement(a.Fragment,null," ",a.createElement("span",{className:"text-secondary"},(r=e.range,"(".concat(f.O.format(r.startDate,"ddd, D MMM"))+" - ".concat(f.O.format(r.endDate,"ddd, D MMM"),")")))));var r,l,c};return e.range.tooltip?a.createElement(I.u,{title:e.range.tooltip,placement:"left",spanHack:!0,spanHackClassName:"justify-content-start"},a.createElement(r,null)):a.createElement(r,null)}function C(e){var t;function n(t){var n=function(e){if(!k(e))return w(e.endDate)?Object.assign(Object.assign({},e),{endDate:new Date}):e}(t);n&&e.setDateRange(n)}var r=!!(null===(t=e.dynamicDateRanges)||void 0===t?void 0:t.length);return a.createElement("div",{className:r?"py-3 ".concat(O.containerWithDynamicRanges):"py-2"},a.createElement("div",{className:"row px-2"},a.createElement("div",{className:r?"col-4 pe-2 border-end":"col-12"},a.createElement("ul",{className:"list-unstyled ".concat(O.rangeList)},e.genericDateRanges.map((function(t,r){return a.createElement("li",{key:r},a.createElement(A,{range:t,onClick:n,selectedRangeName:e.selectedRangeName}))})))),r&&a.createElement("div",{className:"col-8 ps-2"},a.createElement("ul",{className:"list-unstyled ".concat(O.rangeList)},e.dynamicDateRanges.map((function(t,r){return a.createElement("li",{key:r},a.createElement(A,{range:t,onClick:n,selectedRangeName:e.selectedRangeName,isDynamic:!0}))}))))),a.createElement("div",{className:"row px-2"},a.createElement("div",{className:"col-12"},a.createElement("div",{className:r?"pe-2 text-end":O.rangeList},a.createElement("button",{className:"btn btn-link p-0",onClick:e.showCustomRangeSelector},a.createElement("strong",null,R("customRange")))))))}function T(e){return e.getFullYear()===(new Date).getFullYear()}function x(e,t){var n=t?"ddd, D MMM YYYY":"ddd, D MMM";return f.O.format(e,n)}function L(e,t,n){var a=(0,o.W5)(e,t.name)||t;if(!a.startDate||!a.endDate)return"";var r=!T(a.startDate)||!T(a.endDate),l="".concat(x(a.startDate,r)," - ").concat(x(a.endDate,r));return a.name?"".concat(a.name).concat(n?"":" (".concat(l,")")):l}function M(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,l,c,i=[],o=!0,s=!1;try{if(l=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;o=!1}else for(;!(o=(a=l.call(n)).done)&&(i.push(a.value),i.length!==t);o=!0);}catch(e){s=!0,r=e}finally{try{if(!o&&null!=n.return&&(c=n.return(),Object(c)!==c))return}finally{if(s)throw r}}return i}}(e,t)||function(e,t){if(e){if("string"==typeof e)return j(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)?j(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 j(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 H(e){var t=(0,o.NG)(e.dateRangePresets,e.dateRangeQueryParams),n=M(a.useState(t),2),r=n[0],l=n[1],c=M(a.useState("none"),2),i=c[0],s=c[1];function d(e){s("none"),m.e.updateParams((0,o.eO)(e),{merge:!0,keysToRemove:["rangeName"]})}return a.useEffect((function(){l(t)}),[!!t]),t?a.createElement("div",{className:"position-relative"},a.createElement(u.Z,{show:"preset"===i,onToggle:function(e){return s(e?"preset":"none")},className:"custom"===i?"d-none":""},a.createElement(S,{value:L(e.dateRangePresets,t,e.hideRange),hideRange:e.hideRange,toggleDropdown:function(){return s("preset"===i?"none":"preset")}}),a.createElement(u.Z.Menu,{className:"p-0 text-nowrap",align:"end"},a.createElement(C,{genericDateRanges:e.dateRangePresets,setDateRange:function(e){l(e),d(e)},showCustomRangeSelector:function(){return s("custom")},selectedRangeName:t.name}))),a.createElement(u.Z,{show:"custom"===i,onToggle:function(){s("none"),d(r)},className:"custom"===i?"":"d-none"},a.createElement(S,{value:L(e.dateRangePresets,t,e.hideRange),hideRange:e.hideRange}),a.createElement(u.Z.Menu,{className:"p-0",align:"end"},a.createElement(N,{startDate:null==r?void 0:r.startDate,endDate:null==r?void 0:r.endDate,setDateRange:l,maxDate:(0,o.nG)(),minDate:(0,o.zn)(),onClickApply:function(){return d(r)},close:function(){return s("none")}})))):a.createElement(a.Fragment,null)}var P=n(86509),Y=n(49935),Z=n(10874),V=n(38502),_=n(83345),G=n(83523),F=n(38143),W=n(4594),z=n(16714),U=n(39151),B=n(22902),$=n(37802),q=n(14070),J=n(97291),K=n(22490),Q=n(11293);function X(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}var ee="shared.insightsHeaderView",te=r.T.encloseNamespace(ee);function ne(e){var t,n,r,u=(n=(0,c.D)(F.g.ANONYMISE_USERS,!1,{storage:l.Z1.LocalStorage}),r=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,l,c,i=[],o=!0,s=!1;try{if(l=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;o=!1}else for(;!(o=(a=l.call(n)).done)&&(i.push(a.value),i.length!==t);o=!0);}catch(e){s=!0,r=e}finally{try{if(!o&&null!=n.return&&(c=n.return(),Object(c)!==c))return}finally{if(s)throw r}}return i}}(n,r)||function(e,t){if(e){if("string"==typeof e)return X(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)?X(e,t):void 0}}(n,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),m=u[0],d=u[1],f=(0,$.r)(null).hasClassrooms,v=(0,B.T)().hasPermissions,b=i.a.useBasicFetch(U.L.config());return a.createElement("div",null,a.createElement(Q.p,{analyticsUrl:null===(t=b.data)||void 0===t?void 0:t.analyticsWebUrl,hasAnalytics:v(z.C.ViewCustomerAnalytics),video:e.video}),a.createElement("section",{className:"mb-4"},a.createElement("div",{className:"mb-3"},a.createElement("div",{className:"d-flex justify-content-between mb-3"},a.createElement("div",{className:"me-2"},e.video&&a.createElement(a.Fragment,null,a.createElement("h1",{className:"mb-0 d-inline me-2"},e.video.name),a.createElement(I.u,{title:te(e.video.typeId===W.E.Interactive?"viewInteractive":e.video.typeId===W.E.Clip?"viewClip":"viewVideo"),type:"text",spanHack:!0,spanHackClassName:"d-inline-block align-text-bottom"},a.createElement(Z.h,{svgName:g.vn.NewWindow,appLink:K.W.getAppLink(e.video),svgSize:p.S.Large,className:"d-inline-block",customSize:!0}))),!e.video&&a.createElement("h1",{className:"partial-loading-background",style:{width:"20rem"}}," ")),a.createElement("div",{className:"d-flex gap-2"},a.createElement(s.B,{hasClassroomsFeature:f}),a.createElement(H,{dateRangeQueryParams:e.dateRangeAppLinkParams,dateRangePresets:(0,o.Hb)(),hideRange:!0}),a.createElement(P.m,{dropdownToggleClassName:"btn btn-outline-dark",actions:function(){var t,n=[];return(null===(t=e.video)||void 0===t?void 0:t.typeId)===W.E.Interactive&&n.push({label:te("generateReport"),appLink:{application:J.O.INSIGHTS,action:q.e.Insights.INTERACTIVE_GENERATE_REPORT,args:[e.video.id]}}),n}()}))),a.createElement("div",{className:"d-flex justify-content-between mb-3"},e.video?a.createElement(Y.Oo,{breadcrumbs:[{name:te("myShares"),appLink:{application:J.O.MY_SHARES,action:q.e.MyShares.HOME}},{name:e.video.name,active:!0}]}):a.createElement(Y.b2,null),a.createElement("div",{className:"d-flex gap-3"},a.createElement("label",{htmlFor:"anonymiseNames",className:"mb-0"},a.createElement(_.x,{namespace:ee,phrase:"anonymiseNames"})),a.createElement(G.Z,{id:"anonymiseNames",on:m,onClick:function(){return d(!m)}})))),a.createElement("div",{className:"d-flex align-items-center mb-4"},a.createElement(V.r,{tabs:e.tabs}))))}},62712:(e,t,n)=>{n.d(t,{Z:()=>a});const a={circleContainer:"p8Vgz",backgroundCircle:"asGGE",circleSuccess:"PXLNj",circleWarning:"ZckRN",circleDanger:"slBRg",lgCircleContainer:"N8KCI",xsCircleContainer:"RPqZ2",pendingCircle:"DKrcq",centredPercentageText:"tpmLR"}},87432:(e,t,n)=>{n.d(t,{Z:()=>a});const a={pillTabSelector:"Hdi6o",tab:"RvNxr",minWidth:"GHSz9",radiusSmall:"VhJJa",tabLink:"WFyvo"}}}]);
2
+ //# sourceMappingURL=2712-a851ddc3c3-lite.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/2712-a851ddc3c3-lite.chunk.js","mappings":"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","sources":["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/components/breadcrumbs/Breadcrumbs.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/components/pill-tab-selector/PillTabSelector.tsx","file:///app/packages/libs/shared/src/constants/ScoreThresholds.ts","file:///app/packages/libs/shared/src/utils/PartialLoadingHelper.ts","file:///app/packages/projects/lite/src/apps/insights/utils/InsightsAppLinkUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/views/date-range-selector/components/custom-date-range-selector/custom-date-range-selector.scss","file:///app/packages/libs/shared/src/apps/analytics/views/date-range-selector/components/custom-date-range-selector/CustomDateRangeSelector.tsx","file:///app/packages/libs/shared/src/apps/analytics/views/date-range-selector/components/custom-date-range-selector/CustomDateRangeSelectorHooks.ts","file:///app/packages/libs/shared/src/apps/analytics/views/date-range-selector/components/date-range-input/DateRangeInput.tsx","file:///app/packages/libs/shared/src/apps/analytics/views/date-range-selector/components/preset-date-range-selector/PresetDateRangeSelectorUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/views/date-range-selector/components/preset-date-range-selector/preset-date-range-selector.scss","file:///app/packages/libs/shared/src/apps/analytics/views/date-range-selector/components/preset-date-range-selector/PresetDateRangeSelector.tsx","file:///app/packages/libs/shared/src/apps/analytics/views/date-range-selector/DateRangeSelectorUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/views/date-range-selector/DateRangeSelectorView.tsx","file:///app/packages/projects/lite/src/apps/insights/views/header/InsightsHeaderView.tsx","file:///app/packages/libs/shared/src/components/percentage-indicator/percentage-indicator.scss","file:///app/packages/libs/shared/src/components/pill-tab-selector/pill-tab-selector.scss"],"sourcesContent":["import { animals, colors, Config as UniqueNamesConfig, uniqueNamesGenerator } from 'unique-names-generator';\n\nimport { User } from 'libs/shared/interfaces';\nimport { PublicInteractiveUser } from 'libs/shared/interfaces/models/interactive-results/PublicInteractiveUser';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\n\nfunction getUniqueNamesConfig(id: string): 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 = +`${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 | PublicInteractiveUser, shouldAnonymise: boolean): string {\n if (!user)\n return '';\n\n if (!shouldAnonymise)\n return 'profileId' in user ? user.name : UserHelper.getFullName(user);\n\n return uniqueNamesGenerator(getUniqueNamesConfig('profileId' in user ? user.profileId : user.id));\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(dateRangePresets: DateRange[]): DateRange {\n return dateRangePresets.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 },\n {\n name: getPhrase('lastTwelveMonths'),\n startDate: new Date(currentYear, new Date().getMonth() - 11, 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 * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { PartialLoadingHelper } from 'libs/shared/utils/PartialLoadingHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { SvgContainer, SvgContainerSize } from '../svg-container/SvgContainer';\n\nconst namespace = 'shared.breadcrumbComponent';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst COLLAPSE_CHARACTER_COUNT = 64;\nconst MAX_SEGMENT_LENGTH = 48;\n\nexport interface Breadcrumb {\n name: string;\n appLink?: Core.AppLink;\n active?: boolean;\n}\n\ninterface BreadcrumbItemProps {\n breadcrumb: Breadcrumb;\n withBackIcon?: boolean;\n}\n\nexport const BreadcrumbItem = React.forwardRef((\n props: BreadcrumbItemProps,\n ref: React.ForwardedRef<HTMLElement>\n) => {\n const { breadcrumb: { name, appLink, active }, withBackIcon } = props;\n\n let trimmedName = name;\n let title: string = null;\n\n if (trimmedName.length > MAX_SEGMENT_LENGTH) {\n trimmedName = name.slice(0, MAX_SEGMENT_LENGTH) + '...';\n\n // Only setting the title when we trim, because otherwise it's really not needed - Sha\n title = name;\n }\n\n return (\n <li\n className={`breadcrumb-item${active ? ' active' : ''}`}\n title={title}\n >\n {active\n ? <strong>{trimmedName}</strong>\n : <AppLink appLink={appLink} ref={ref}>\n {withBackIcon && <SvgContainer svgName={cvSvgLibrary.ChevronLeft} size={SvgContainerSize.Small} />}\n <span className={withBackIcon ? 'ms-2' : ''}>{trimmedName}</span>\n </AppLink>\n }\n </li>\n );\n});\n\ninterface BreadcrumbsProps {\n breadcrumbs: Breadcrumb[];\n}\n\nexport const Breadcrumbs = ({ breadcrumbs }: BreadcrumbsProps) => {\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n\n const length = breadcrumbs?.length || 0;\n \n const [ collapse, setCollapse ] = React.useState(false);\n const [ shouldFocus, setShouldFocus ] = React.useState(false);\n const expandRef = React.useRef<HTMLElement>();\n\n React.useEffect(() => {\n const characterLength = breadcrumbs?.reduce((prev, next) => prev + next.name.length, 0) ?? 0;\n\n if (length > 4 && characterLength > COLLAPSE_CHARACTER_COUNT)\n setCollapse(true);\n }, [breadcrumbs?.length]);\n\n /**\n * Focus our first expanded item the first time it appears.\n */\n React.useLayoutEffect(() => {\n if (shouldFocus)\n expandRef.current?.focus();\n }, [ expandRef.current, shouldFocus ]);\n\n function onClickExpand() {\n setCollapse(false);\n setShouldFocus(true);\n }\n\n if (!length || (isMobile && length < 2))\n return <></>;\n\n if (isMobile)\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n <BreadcrumbItem breadcrumb={breadcrumbs[length - 2]} withBackIcon />\n </ol>\n </nav>\n );\n\n const first = <BreadcrumbItem breadcrumb={breadcrumbs[0]} />;\n const second = length > 2 ? <BreadcrumbItem breadcrumb={breadcrumbs[1]} /> : <></>;\n const secondLast = length > 3 ? <BreadcrumbItem breadcrumb={breadcrumbs[length - 2]} /> : <></>;\n const last = length > 1 ? <BreadcrumbItem breadcrumb={breadcrumbs[length - 1]} /> : <></>;\n const rest = breadcrumbs.slice(2, length - 2);\n\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {first}\n {second}\n {collapse ?\n <li className='breadcrumb-item'>\n <button\n className='btn-link'\n onClick={onClickExpand}\n aria-label={getPhrase('expand')}\n >\n ...\n </button>\n </li> :\n rest.map((breadcrumb, idx) => (\n <BreadcrumbItem\n key={idx}\n breadcrumb={breadcrumb}\n ref={idx === 0 ? expandRef : null}\n />\n ))\n }\n {secondLast}\n {last}\n </ol>\n </nav>\n );\n};\n\nexport const PartialBreadcrumbs = React.memo(function({ numItems = 3 }: { numItems?: number; }) {\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n\n if (isMobile) {\n return (\n <div className='partial-loading-background' style={{ height: '1.3125rem', width: '6rem' }} />\n );\n }\n\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {PartialLoadingHelper.getPartialLoadingItems({ numItems }).map(({ width }, idx) => (\n <li key={idx} className='breadcrumb-item'>\n <span className='d-inline-block partial-loading-background' style={{ width }} dangerouslySetInnerHTML={{ __html: '&nbsp' }} />\n </li>\n ))}\n </ol>\n </nav>\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 size?: ProgressCircleSize;\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.size ||\n (props.layout === PercentageIndicatorLayout.LabelInside\n ? ProgressCircleSize.Large\n : ProgressCircleSize.Small\n );\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 ExtraSmall = 'extraSmall'\n}\n\nconst ProgressCircleSizeMap = {\n [ProgressCircleSize.ExtraSmall]: {\n size: CIRCLE_WIDTH\n },\n [ProgressCircleSize.Small]: {\n size: CIRCLE_WIDTH\n },\n [ProgressCircleSize.Large]: {\n size: CIRCLE_WIDTH_LG\n }\n};\n\n/**\n * radius = width / 2 - strokeWidth * 2\n */\nexport function getCircleRadius(size: ProgressCircleSize): string {\n const width = ProgressCircleSizeMap[size].size;\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 (size === ProgressCircleSize.ExtraSmall)\n className += ` ${styles.xsCircleContainer}`;\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}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\n\nimport { SvgContainer } from '../svg-container/SvgContainer';\n\nimport styles from './pill-tab-selector.scss';\n\ninterface TabContentsProps {\n tab: PillTab;\n}\n\nfunction TabContents(props: TabContentsProps): JSX.Element {\n return (\n <>\n {!!props.tab.svgName && (\n <div className={props.tab.name ? 'pe-1' : ''}>\n <SvgContainer svgName={props.tab.svgName} />\n </div>\n )}\n\n {props.tab.name}\n\n {typeof (props.tab.count) === 'number' && (\n <div className='ps-2'>\n <Badge type={BadgeType.Count} data={props.tab.count} />\n </div>\n )}\n </>\n );\n}\n\nexport interface PillTab {\n name: string;\n active: boolean;\n svgName?: string;\n\n className?: string;\n\n appLink?: Core.AppLink;\n onSelect?: () => void;\n\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n\n count?: number;\n}\n\ninterface PillTabSelectorProps {\n tabs: PillTab[];\n containerRef?: (el: HTMLElement) => void;\n listClassName?: string;\n className?: string;\n borderRadius?: 'sm' | 'lg'\n}\n\nPillTabSelector.defaultProps = {\n borderRadius: 'lg'\n};\n\nexport function PillTabSelector(props: PillTabSelectorProps): JSX.Element {\n function onSelectTab(tab: PillTab): void {\n if (tab.active || !tab.onSelect)\n return;\n\n tab.onSelect();\n\n if (tab.analyticsData && tab.analyticsOptions)\n AnalyticsHelper.logUserAction(tab.analyticsData, tab.analyticsOptions);\n }\n\n return (\n <nav className={props.className ?? ''} ref={props.containerRef}>\n <ul className={`\n list-unstyled d-inline-block m-0 ${styles.pillTabSelector}\n ${props.borderRadius ? styles.radiusSmall : ''}\n ${props.listClassName}\n `}>\n {props.tabs.map((tab, index) => {\n return (\n <li\n className={`\n p-0 ${styles.tab} ${tab.active ? 'btn btn-dark' : 'btn btn-outline-dark'}\n ${tab.name ? styles.minWidth : ''} ${tab.className}\n `}\n key={index}\n >\n {tab.appLink ? (\n <AppLink\n appLink={tab.appLink}\n analyticsData={tab.analyticsData}\n analyticsOptions={tab.analyticsOptions}\n className={`\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ${styles.tabLink}\n `}\n >\n <TabContents tab={tab} />\n </AppLink>\n ) : (\n <DivButton\n className={`\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ${styles.tabLink}\n `}\n onClick={() => onSelectTab(tab)}\n >\n <TabContents tab={tab} />\n </DivButton>\n )}\n </li>\n );\n })}\n </ul>\n </nav>\n );\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};","const DEFAULT_PARTIAL_LOADING_OPTIONS: PartialLoadingOptions = {\n numItems: 5,\n minWidth: 50, // px\n maxWidth: 100 // px\n};\n\nexport interface PartialLoadingOptions {\n numItems?: number;\n minWidth?: number;\n maxWidth?: number;\n}\n\ninterface PartialLoadingItem {\n width: string;\n}\n\nexport const PartialLoadingHelper = {\n getPartialLoadingItems(options: PartialLoadingOptions = {}): PartialLoadingItem[] {\n const opts = {\n ...DEFAULT_PARTIAL_LOADING_OPTIONS,\n ...options\n };\n\n const getRandomFilterWidth = () => Math.max(Math.floor(Math.random() * opts.maxWidth), opts.minWidth);\n\n return [...Array(opts.numItems)].map(() => ({ width: `${getRandomFilterWidth()}px` }));\n }\n};","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'shared.insightsUtils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ntype InsightsTabs = 'insights' | 'heatmap' | 'results' | 'questions';\n\nexport function getInsightsVideoTabs(id: string, active: InsightsTabs, params: HashObject) {\n return [\n {\n name: getPhrase('insights'),\n active: active === 'insights',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.VIDEO_OVERVIEW,\n args: [id],\n params\n }\n },\n {\n name: getPhrase('heatmap'),\n active: active === 'heatmap',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.VIDEO_HEATMAP,\n args: [id],\n params\n }\n }\n ];\n}\n\nexport function getInsightsClipTabs(id: string, active: InsightsTabs, params: HashObject) {\n return [\n {\n name: getPhrase('insights'),\n active: active === 'insights',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.CLIP_OVERVIEW,\n args: [id],\n params\n }\n },\n {\n name: getPhrase('heatmap'),\n active: active === 'heatmap',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.CLIP_HEATMAP,\n args: [id],\n params\n }\n }\n ];\n}\n\nexport function getInsightsInteractiveTabs(id: string, active: InsightsTabs, params: HashObject) {\n return [\n {\n name: getPhrase('insights'),\n active: active === 'insights',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_OVERVIEW,\n args: [id],\n params\n }\n },\n {\n name: getPhrase('results'),\n active: active === 'results',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_STUDENTS,\n args: [id],\n params\n }\n },\n {\n name: getPhrase('questions'),\n active: active === 'questions',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_QUESTIONS,\n args: [id],\n params\n }\n },\n {\n name: getPhrase('heatmap'),\n active: active === 'heatmap',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_HEATMAP,\n args: [id],\n params\n }\n }\n ];\n}","// extracted by mini-css-extract-plugin\nexport default {\"dateInputLabel\":\"CLYvu\",\"dateInput\":\"gnEqJ\"};","import React from 'react';\nimport { DayPicker } from 'react-day-picker';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { DateRange } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { useSetInputFocus } from './CustomDateRangeSelectorHooks';\n\nimport './custom-date-range-selector.scss';\nimport './day-picker-styles.scss';\nimport styles from './custom-date-range-selector.scss';\n\nconst namespace = 'shared.customDateRangeSelector';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst NUM_MONTHS_TO_DISPLAY = 2;\nconst DATE_DISPLAY_FORMAT = 'DD/MM/YYYY';\n\ninterface CustomDateRangeSelectorProps {\n startDate: Date | null;\n endDate: Date | null;\n setDateRange: (dateRange: DateRange) => void;\n minDate: Date;\n maxDate: Date;\n onClickApply: () => void;\n close: () => void;\n}\n\nexport function CustomDateRangeSelector(props: CustomDateRangeSelectorProps): JSX.Element {\n const [ focusedInput, setFocusedInput ] = React.useState<'startDate' | 'endDate'>('startDate');\n const [ startDateInputRef, endDateInputRef ] = useSetInputFocus(focusedInput);\n\n function handleDayClick(day: any) {\n if (focusedInput === 'startDate') {\n props.setDateRange({\n startDate: day,\n endDate: DateHelper.isAfter(day, props.endDate) ? undefined : props.endDate\n });\n setFocusedInput(s => s === 'endDate' ? 'startDate' : 'endDate');\n } else {\n props.setDateRange({\n startDate: DateHelper.isAfter(props.startDate, day) ? day : props.startDate,\n endDate: DateHelper.isAfter(props.startDate, day) ? undefined : day\n });\n\n if (!DateHelper.isAfter(props.startDate, day)) {\n setFocusedInput(s => s === 'endDate' ? 'startDate' : 'endDate');\n }\n }\n }\n\n return (\n <div className='d-inline-block'>\n <div className='d-flex align-items-center border-bottom p-3'>\n <div className='me-auto invisible'>\n <SvgContainer svgName={cvSvgLibrary.Close} />\n </div>\n <form className='d-flex align-items-center'>\n <div className='position-relative'>\n <strong className={styles.dateInputLabel}>{getPhrase('from')}</strong>\n <input\n ref={startDateInputRef}\n className={`form-control cursor-pointer ${styles.dateInput}`}\n value={DateHelper.format(props.startDate, DATE_DISPLAY_FORMAT) ?? ''}\n onChange={() => {}}\n onFocus={() => setFocusedInput('startDate')}\n />\n </div>\n <span className='px-3'>\n <SvgContainer svgName={cvSvgLibrary.ArrowRight} />\n </span>\n <div className='position-relative'>\n <strong className={styles.dateInputLabel}>{getPhrase('to')}</strong>\n <input\n ref={endDateInputRef}\n className={`form-control cursor-pointer ${styles.dateInput}`}\n value={DateHelper.format(props.endDate, DATE_DISPLAY_FORMAT) ?? ''}\n onChange={() => {}}\n onFocus={() => setFocusedInput('endDate')}\n />\n </div>\n </form>\n <div className='ms-auto cursor-pointer'>\n <SvgContainer svgName={cvSvgLibrary.Close} onClick={props.close} />\n </div>\n </div>\n <div className='p-3'>\n <DayPicker\n mode='range'\n numberOfMonths={NUM_MONTHS_TO_DISPLAY}\n selected={{ from: props.startDate, to: props.endDate }}\n onDayClick={handleDayClick}\n captionLayout='dropdown-buttons'\n fromDate={props.minDate}\n toDate={props.maxDate}\n modifiersClassNames={{\n selected: 'my-selected',\n today: 'my-today'\n }}\n defaultMonth={props.startDate}\n />\n </div>\n <div className='pb-3 px-3 text-end'>\n <button className='btn btn-outline-dark' onClick={props.onClickApply}>\n {getPhrase('apply')}\n </button>\n </div>\n </div>\n );\n}","import React from 'react';\n\ntype InputRef = React.MutableRefObject<HTMLInputElement>;\n\nexport function useSetInputFocus(focusedInput: 'startDate' | 'endDate'): [InputRef, InputRef] {\n const startDateInputRef = React.useRef<HTMLInputElement>();\n const endDateInputRef = React.useRef<HTMLInputElement>();\n\n React.useEffect(() => {\n if (focusedInput === 'startDate')\n startDateInputRef.current?.focus();\n\n if (focusedInput === 'endDate')\n endDateInputRef.current?.focus();\n }, [focusedInput]);\n\n return [ startDateInputRef, endDateInputRef ];\n}","import React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\ninterface DateRangeInputProps {\n value: string;\n hideRange?: boolean;\n toggleDropdown?: () => void\n}\n\nexport function DateRangeInput(props: DateRangeInputProps): JSX.Element {\n return (\n <Dropdown.Toggle as='div' id='date-range-dropdown' className='no-caret'>\n <button\n className='btn btn-outline-dark d-flex align-items-center pe-5'\n onClick={() => {\n props.toggleDropdown();\n }}\n >\n <span>{props.value}</span>\n <div className='position-absolute translate-middle top-50 end-0 me-n1'>\n <SvgContainer\n svgName={cvSvgLibrary.Calendar}\n size={SvgContainerSize.Standard}\n />\n </div>\n </button>\n </Dropdown.Toggle >\n );\n}","import { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { DateRange } from 'libs/shared/interfaces';\n\nfunction isDateInFuture(date: Date): boolean {\n return DateHelper.isAfter(date, new Date(), 'day');\n}\n\nexport function isRangeInFuture(range: DateRange): boolean {\n return isDateInFuture(range.startDate);\n}\n\nexport function getDynamicRangeSubLabel(range: DateRange): string {\n return `(${DateHelper.format(range.startDate, 'ddd, D MMM')}`\n + ` - ${DateHelper.format(range.endDate, 'ddd, D MMM')})`;\n}\n\nexport function validateRange(range: DateRange): DateRange | null {\n if (isRangeInFuture(range))\n return;\n\n if (isDateInFuture(range.endDate))\n return {\n ...range,\n endDate: new Date()\n };\n\n return range;\n}","// extracted by mini-css-extract-plugin\nexport default {\"containerWithDynamicRanges\":\"pvYdJ\",\"selectedDateRange\":\"JU7bd\",\"rangeList\":\"DBlzu\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { DateRange } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { getDynamicRangeSubLabel, isRangeInFuture, validateRange } from './PresetDateRangeSelectorUtils';\n\nimport styles from './preset-date-range-selector.scss';\n\nconst namespace = 'shared.presetDateRangeSelector';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getButtonClassName(isSelected: boolean): string {\n const buttonClassName = 'btn btn-link d-flex align-items-center py-1 px-0 text-decoration-none';\n\n if (isSelected)\n return buttonClassName + ` fw-bold text-info ${styles.selectedDateRange}`;\n\n return buttonClassName + ' text-body';\n}\n\ninterface DateRangeItemProps {\n range: DateRange;\n onClick: (range: DateRange) => void;\n selectedRangeName?: string;\n isDynamic?: boolean;\n}\n\nfunction DateRangeItem(props: DateRangeItemProps): JSX.Element {\n const selected = props.range.name === props.selectedRangeName;\n const isDisabled = isRangeInFuture(props.range) || props.range.disabled;\n\n const DateRangeButton = () => (\n <button className={getButtonClassName(selected)} onClick={() => props.onClick(props.range)} disabled={isDisabled}>\n {selected && <SvgContainer svgName={cvSvgLibrary.Check} />}\n <span className={`${isDisabled ? 'text-secondary' : ''} ${props.isDynamic ? 'fw-bold' : ''}`}>\n {props.range.name}\n </span>\n {!!props.isDynamic &&\n <>\n &nbsp;\n <span className='text-secondary'>{getDynamicRangeSubLabel(props.range)}</span>\n </>\n }\n </button>\n );\n\n if (!props.range.tooltip)\n return <DateRangeButton />;\n\n return (\n <Tooltip\n title={props.range.tooltip}\n placement='left'\n spanHack\n spanHackClassName='justify-content-start'\n >\n <DateRangeButton />\n </Tooltip>\n );\n}\n\n\ninterface PresetDateRangeSelectorProps {\n genericDateRanges: DateRange[];\n setDateRange: (dateRange: DateRange) => void;\n showCustomRangeSelector: () => void;\n dynamicDateRanges?: DateRange[];\n selectedRangeName?: string;\n}\n\nexport function PresetDateRangeSelector(props: PresetDateRangeSelectorProps): JSX.Element {\n function onClickRange(range: DateRange): void {\n const validatedRange = validateRange(range);\n\n if (!validatedRange)\n return;\n\n props.setDateRange(validatedRange);\n }\n\n const hasDynamicDateRanges = !!props.dynamicDateRanges?.length;\n\n return (\n <div className={hasDynamicDateRanges ? `py-3 ${styles.containerWithDynamicRanges}` : 'py-2'}>\n <div className='row px-2'>\n <div className={hasDynamicDateRanges ? 'col-4 pe-2 border-end' : 'col-12'}>\n <ul className={`list-unstyled ${styles.rangeList}`}>\n {props.genericDateRanges.map((range, idx) => (\n <li key={idx}>\n <DateRangeItem\n range={range}\n onClick={onClickRange}\n selectedRangeName={props.selectedRangeName}\n />\n </li>\n ))}\n </ul>\n </div>\n {hasDynamicDateRanges &&\n <div className='col-8 ps-2'>\n <ul className={`list-unstyled ${styles.rangeList}`}>\n {props.dynamicDateRanges.map((range, idx) => (\n <li key={idx}>\n <DateRangeItem\n range={range}\n onClick={onClickRange}\n selectedRangeName={props.selectedRangeName}\n isDynamic\n />\n </li>\n ))}\n </ul>\n </div>\n }\n </div>\n <div className='row px-2'>\n <div className='col-12'>\n <div className={hasDynamicDateRanges ? 'pe-2 text-end' : styles.rangeList}>\n <button className='btn btn-link p-0' onClick={props.showCustomRangeSelector}>\n <strong>{getPhrase('customRange')}</strong>\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n}","import { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { getPresetRangeByName } from 'libs/shared/apps/analytics/utils/DateRangeUtils';\nimport { DateRange } from 'libs/shared/interfaces';\n\n\nfunction isThisYear(date: Date): boolean {\n return date.getFullYear() === (new Date()).getFullYear();\n}\n\nfunction formatDate(date: Date, showYear: boolean): string {\n const format = showYear\n ? 'ddd, D MMM YYYY'\n : 'ddd, D MMM';\n\n return DateHelper.format(date, format);\n}\n\nexport function getInputValue(dateRangePreset: DateRange[], queryRange: DateRange, hideRange?: boolean): string {\n const presetRange = getPresetRangeByName(dateRangePreset, queryRange.name);\n\n const inputRange = presetRange || queryRange;\n\n if (!inputRange.startDate || !inputRange.endDate)\n return '';\n\n const showYear = !isThisYear(inputRange.startDate) || !isThisYear(inputRange.endDate);\n\n const dateRange = `${formatDate(inputRange.startDate, showYear)} - ${formatDate(inputRange.endDate, showYear)}`;\n \n if (!inputRange.name)\n return dateRange;\n\n return `${inputRange.name}${!hideRange ? ` (${dateRange})` : ''}`;\n}","import React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { DateRangeQueryParams } from 'libs/shared/apps/analytics/interfaces/DateRangeQueryParams';\nimport {\n getMaxDate, getMinDate, getRouteQueryParams,\n useGetDateRangeFromQueryParams\n} from 'libs/shared/apps/analytics/utils/DateRangeUtils';\nimport { DateRange } from 'libs/shared/interfaces';\nimport { AppRouteHelper } from 'libs/shared/utils/AppRouteHelper';\n\nimport { CustomDateRangeSelector } from './components/custom-date-range-selector/CustomDateRangeSelector';\nimport { DateRangeInput } from './components/date-range-input/DateRangeInput';\nimport { PresetDateRangeSelector } from './components/preset-date-range-selector/PresetDateRangeSelector';\nimport { getInputValue } from './DateRangeSelectorUtils';\n\ntype DropdownState = 'none' | 'preset' | 'custom';\n\ninterface DateRangeSelectorViewProps {\n dateRangeQueryParams: DateRangeQueryParams;\n dateRangePresets: DateRange[];\n hideRange?: boolean;\n}\n\n// eslint-disable-next-line rulesdir/require-view-title\nexport function DateRangeSelectorView(props: DateRangeSelectorViewProps): JSX.Element {\n const queryParamDateRange = useGetDateRangeFromQueryParams(props.dateRangePresets, props.dateRangeQueryParams);\n const [ customDateRange, setCustomDateRange ] = React.useState<DateRange>(queryParamDateRange);\n const [ dropdownState, setDropdownState ] = React.useState<DropdownState>('none');\n\n React.useEffect(() => {\n setCustomDateRange(queryParamDateRange);\n }, [!!queryParamDateRange]);\n\n function onSelectPresetDateRange(range: DateRange): void {\n setCustomDateRange(range);\n applyDateRange(range);\n }\n\n function onToggleCustomDateRangeSelector(): void {\n setDropdownState('none');\n applyDateRange(customDateRange);\n }\n\n function applyDateRange(range: DateRange): void {\n setDropdownState('none');\n\n AppRouteHelper.updateParams(getRouteQueryParams(range), { merge: true, keysToRemove: ['rangeName']});\n }\n\n /**\n * If useGetDateRangeFromQueryParams doesn't return a DateRange then it will have\n * triggered an app route update with a new, valid DateRange, so we wait for that.\n */\n if (!queryParamDateRange)\n return <></>;\n\n /**\n * This is rendered as two separate dropdowns so that the menus are sized correctly.\n * The first menu is triggered by clicking on the Dropdown.Toggle in DateRangeInput\n * which fires onToggle.\n * The second menu is only accessible by clicking `Custom Range` in the first menu.\n */\n return (\n <div className='position-relative'>\n <Dropdown\n show={dropdownState === 'preset'}\n onToggle={show => setDropdownState(show ? 'preset' : 'none')}\n className={dropdownState === 'custom' ? 'd-none' : ''}\n >\n <DateRangeInput\n value={getInputValue(props.dateRangePresets, queryParamDateRange, props.hideRange)}\n hideRange={props.hideRange}\n toggleDropdown={() => setDropdownState(dropdownState === 'preset' ? 'none' : 'preset')}\n />\n <Dropdown.Menu className='p-0 text-nowrap' align='end'>\n <PresetDateRangeSelector\n genericDateRanges={props.dateRangePresets}\n setDateRange={onSelectPresetDateRange}\n showCustomRangeSelector={() => setDropdownState('custom')}\n selectedRangeName={queryParamDateRange.name}\n />\n </Dropdown.Menu>\n </Dropdown>\n <Dropdown\n show={dropdownState === 'custom'}\n onToggle={onToggleCustomDateRangeSelector}\n className={dropdownState === 'custom' ? '' : 'd-none'}\n >\n <DateRangeInput\n value={getInputValue(props.dateRangePresets, queryParamDateRange, props.hideRange)}\n hideRange={props.hideRange}\n />\n <Dropdown.Menu className='p-0' align='end'>\n <CustomDateRangeSelector\n startDate={customDateRange?.startDate}\n endDate={customDateRange?.endDate}\n setDateRange={setCustomDateRange}\n maxDate={getMaxDate()}\n minDate={getMinDate()}\n onClickApply={() => applyDateRange(customDateRange)}\n close={() => setDropdownState('none')}\n />\n </Dropdown.Menu>\n </Dropdown>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { StorageType } from 'libs/common/backbone/utils/LocalStorageHelper';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { AudienceQueryParams } from 'libs/shared/apps/analytics/interfaces/AudienceQueryParams';\nimport { DateRangeQueryParams } from 'libs/shared/apps/analytics/interfaces/DateRangeQueryParams';\nimport { getInsightsDateRangePresets } from 'libs/shared/apps/analytics/utils/DateRangeUtils';\nimport { AudienceFilterView } from 'libs/shared/apps/analytics/views/audience-filter/AudienceFilterView';\nimport { DateRangeSelectorView } from 'libs/shared/apps/analytics/views/date-range-selector/DateRangeSelectorView';\nimport { ActionsDropdown } from 'libs/shared/components/actions/ActionsDropdown';\nimport { Breadcrumb, Breadcrumbs, PartialBreadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { PillTab, PillTabSelector } from 'libs/shared/components/pill-tab-selector/PillTabSelector';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, VideoTypes } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { InsightsAdminAlert } from 'apps/insights/views/insights-admin-alert/InsightsAdminAlert';\n\nconst namespace = 'shared.insightsHeaderView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightsHeaderProps {\n audienceAppLinkParams: AudienceQueryParams;\n dateRangeAppLinkParams: DateRangeQueryParams;\n video: VideoTypes;\n tabs: PillTab[];\n}\n\n// eslint-disable-next-line rulesdir/require-view-title\nexport function InsightsHeaderView(props: InsightsHeaderProps) {\n const [ anonymiseUsers, setAnonymiseUsers ] = useViewModel<boolean>(\n SharedViewModelKeys.ANONYMISE_USERS,\n false,\n { storage: StorageType.LocalStorage }\n );\n\n const { hasClassrooms } = useSettings(null);\n const { hasPermissions } = usePermissions();\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n function getBreadcrumbs(): Breadcrumb[] {\n return [\n {\n name: getPhrase('myShares'),\n appLink: {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.HOME\n }\n },\n {\n name: props.video.name,\n active: true\n }\n ];\n }\n\n function getActions() {\n const actions = [];\n\n if (props.video?.typeId === MasterType.Interactive) {\n actions.push({\n label: getPhrase('generateReport'),\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_GENERATE_REPORT,\n args: [props.video.id]\n }\n });\n }\n\n return actions;\n }\n\n function getVideoEntityPhrase() {\n if (props.video.typeId === MasterType.Interactive) return 'viewInteractive';\n if (props.video.typeId === MasterType.Clip) return 'viewClip';\n\n return 'viewVideo';\n }\n\n return (\n <div>\n <InsightsAdminAlert\n analyticsUrl={config.data?.analyticsWebUrl}\n hasAnalytics={hasPermissions(PermissionName.ViewCustomerAnalytics)}\n video={props.video}\n />\n\n <section className='mb-4'>\n <div className='mb-3'>\n <div className='d-flex justify-content-between mb-3'>\n <div className='me-2'>\n {props.video && (\n <>\n <h1 className='mb-0 d-inline me-2'>{props.video.name}</h1>\n <Tooltip title={getPhrase(getVideoEntityPhrase())} type='text' spanHack spanHackClassName='d-inline-block align-text-bottom'>\n <IconButton\n svgName={cvSvgLibrary.NewWindow}\n appLink={VideoAppLinkHelper.getAppLink(props.video)}\n svgSize={SvgContainerSize.Large}\n className='d-inline-block'\n customSize\n />\n </Tooltip>\n </>\n )}\n {!props.video && <h1 className='partial-loading-background' style={{ width: '20rem' }}>&nbsp;</h1>}\n </div>\n <div className='d-flex gap-2'>\n <AudienceFilterView hasClassroomsFeature={hasClassrooms} />\n <DateRangeSelectorView\n dateRangeQueryParams={props.dateRangeAppLinkParams}\n dateRangePresets={getInsightsDateRangePresets()}\n hideRange\n />\n <ActionsDropdown\n dropdownToggleClassName='btn btn-outline-dark'\n actions={getActions()}\n />\n </div>\n </div>\n <div className='d-flex justify-content-between mb-3'>\n {props.video\n ? <Breadcrumbs breadcrumbs={getBreadcrumbs()} />\n : <PartialBreadcrumbs />\n }\n <div className='d-flex gap-3'>\n <label htmlFor='anonymiseNames' className='mb-0'><Text namespace={namespace} phrase='anonymiseNames' /></label>\n <ToggleSwitch id='anonymiseNames' on={anonymiseUsers} onClick={() => setAnonymiseUsers(!anonymiseUsers)} />\n </div>\n </div>\n </div>\n <div className='d-flex align-items-center mb-4'>\n <PillTabSelector tabs={props.tabs} />\n </div>\n </section>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"circleContainer\":\"p8Vgz\",\"backgroundCircle\":\"asGGE\",\"circleSuccess\":\"PXLNj\",\"circleWarning\":\"ZckRN\",\"circleDanger\":\"slBRg\",\"lgCircleContainer\":\"N8KCI\",\"xsCircleContainer\":\"RPqZ2\",\"pendingCircle\":\"DKrcq\",\"centredPercentageText\":\"tpmLR\"};","// extracted by mini-css-extract-plugin\nexport default {\"pillTabSelector\":\"Hdi6o\",\"tab\":\"RvNxr\",\"minWidth\":\"GHSz9\",\"radiusSmall\":\"VhJJa\",\"tabLink\":\"WFyvo\"};"],"names":["anonymiseUserName","user","shouldAnonymise","id","profileId","seed","Math","floor","Date","getMinutes","dictionaries","separator","length","style","name","getAudienceParams","queryParams","userId","groupId","users","push","classrooms","classroomGroups","getPhrase","convertDateToUtcDateTimeString","date","utc","getMinDate","getMaxDate","getDefaultDateRange","dateRangePresets","find","range","getPresetRangeByName","dateRangePresetss","rangeName","p","getInsightsDateRangePresets","minDate","currentYear","getFullYear","isMinDateThisYear","startDate","endDate","getMonth","disabled","tooltip","default","formatDateQueryParam","getRouteQueryParams","dateRange","from","to","useGetDateRangeFromQueryParams","dateRangeQueryParams","presetRange","replace","merge","keysToRemove","defaultDateRange","initialDateRangeValid","getStartEndParams","filterParams","getStartDate","getEndDate","start","end","defaultRange","BreadcrumbItem","props","ref","breadcrumb","appLink","active","withBackIcon","trimmedName","title","slice","className","svgName","size","S","Breadcrumbs","breadcrumbs","isMobile","collapse","setCollapse","shouldFocus","setShouldFocus","expandRef","characterLength","reduce","prev","next","current","focus","first","second","secondLast","last","rest","onClick","map","idx","key","PartialBreadcrumbs","numItems","height","width","dangerouslySetInnerHTML","__html","PercentageIndicatorLayout","ProgressCircle","circle","radius","r","baseVal","value","circumference","PI","offset","percentage","strokeDasharray","strokeDashoffset","toString","scoreThresholds","PercentageIndicator","percentageToFixed","layout","LabelInside","label","customLabel","LabelOnly","LabelBefore","defaultProps","CircleOnly","ProgressCircleSize","CIRCLE_STROKE_WIDTH","CIRCLE_STROKE_WIDTH_LG","ProgressCircleSizeMap","ExtraSmall","Small","Large","getCircleRadius","strokeWidth","getCircleClassName","HIGH","MODERATE","getColouredLabelClassName","getCircleContainerClassName","isPending","getPercentageToFixed","toFixed","getFormattedPercentage","round","TabContents","tab","count","type","data","PillTabSelector","containerRef","borderRadius","listClassName","tabs","index","analyticsData","analyticsOptions","onSelect","onSelectTab","ScoreThresholdDefaults","ScoreThresholdInsights","DEFAULT_PARTIAL_LOADING_OPTIONS","minWidth","maxWidth","PartialLoadingHelper","getPartialLoadingItems","options","opts","Array","max","random","getInsightsVideoTabs","params","application","action","args","getInsightsClipTabs","getInsightsInteractiveTabs","LanguageService","NUM_MONTHS_TO_DISPLAY","DATE_DISPLAY_FORMAT","CustomDateRangeSelector","focusedInput","setFocusedInput","startDateInputRef","endDateInputRef","useSetInputFocus","SvgContainer","DateHelper","onChange","onFocus","close","mode","numberOfMonths","selected","onDayClick","day","setDateRange","undefined","s","captionLayout","fromDate","toDate","maxDate","modifiersClassNames","today","defaultMonth","onClickApply","DateRangeInput","Dropdown","as","toggleDropdown","isDateInFuture","isRangeInFuture","DateRangeItem","selectedRangeName","isDisabled","DateRangeButton","isSelected","buttonClassName","isDynamic","Tooltip","placement","spanHack","spanHackClassName","PresetDateRangeSelector","onClickRange","validatedRange","validateRange","hasDynamicDateRanges","dynamicDateRanges","genericDateRanges","showCustomRangeSelector","isThisYear","formatDate","showYear","format","getInputValue","dateRangePreset","queryRange","hideRange","inputRange","DateRangeSelectorView","queryParamDateRange","customDateRange","setCustomDateRange","dropdownState","setDropdownState","applyDateRange","AppRouteHelper","show","onToggle","align","InsightsHeaderView","SharedViewModelKeys","storage","anonymiseUsers","setAnonymiseUsers","hasClassrooms","useSettings","hasPermissions","usePermissions","config","ConfigRequests","InsightsAdminAlert","analyticsUrl","analyticsWebUrl","hasAnalytics","PermissionName","video","typeId","MasterType","IconButton","VideoAppLinkHelper","svgSize","customSize","AudienceFilterView","hasClassroomsFeature","dateRangeAppLinkParams","ActionsDropdown","dropdownToggleClassName","actions","getActions","htmlFor","Text","namespace","phrase","ToggleSwitch","on"],"sourceRoot":""}
@@ -1,2 +1,2 @@
1
1
  "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[2788],{26025:(e,t,r)=>{r.d(t,{B:()=>o});var n=r(1048),a=r(75795),o={getAudienceAppLinkParams:function(){var e=a.O.getCurrentRoute().appLink,t=n.t.isObject(e.params)?e.params:{},r=t.users,o=t.classrooms,i=t.classroomGroups,c=function(e){var r=t[e];if(r)return Array.isArray(r)?r:[r]},s={};return r&&(s.users=c("users")),o&&(s.classrooms=c("classrooms")),i&&(s.classroomGroups=c("classroomGroups")),s},getDateRangeAppLinkParams:function(){var e=a.O.getCurrentRoute().appLink,t=n.t.isObject(e.params)?e.params:{},r=t.from,o=t.to,i=t.rangeName,c={};return r&&(c.from=r),o&&(c.to=o),i&&(c.rangeName=i),c}}},26136:(e,t,r)=>{r.d(t,{B:()=>o});var n=r(76198),a=r(64818);function o(e,t){return e?t?(0,n._8)((r="profileId"in e?e.profileId:e.id,o=+"".concat(r).concat(Math.floor((new Date).getMinutes()/5)),{dictionaries:[n.O9,n.yd],separator:" ",length:2,style:"capital",seed:o})):"profileId"in e?e.name:a.l.getFullName(e):"";var r,o}},74901:(e,t,r)=>{function n(e){return function(e){if(Array.isArray(e))return a(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 a(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)?a(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 a(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}r.d(t,{K:()=>o});var o=function(e){var t=[],r=[];return e.users&&t.push.apply(t,n(e.users)),e.classrooms&&r.push.apply(r,n(e.classrooms)),e.classroomGroups&&r.push.apply(r,n(e.classroomGroups)),{userId:t,groupId:r}}},40003:(e,t,r)=>{r.d(t,{Hb:()=>d,NG:()=>v,W5:()=>m,eO:()=>p,nG:()=>l,wO:()=>g,zn:()=>s});var n=r(23481),a=r(110),o=r(57266),i=n.T.encloseNamespace("shared.analyticsUtils");function c(e){var t=a.O.convertDateToUTC(e);return a.O.format(t,"YYYY-MM-DDTHH:mm:ss")}function s(){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=s(),t=(new Date).getFullYear(),r=t===e.getFullYear();return[{name:i("today"),startDate:new Date,endDate:new Date},{name:i("thisMonth"),startDate:new Date(t,(new Date).getMonth(),1),endDate:new Date},{name:i("lastThreeMonths"),startDate:new Date(t,(new Date).getMonth()-2,1),endDate:new Date},{name:i("lastSixMonths"),startDate:new Date(t,(new Date).getMonth()-5,1),endDate:new Date},{name:i("thisYear"),startDate:new Date(t,0,1),endDate:new Date},{name:i("lastYear"),startDate:new Date(t-1,0,1),endDate:new Date(t,0,0),disabled:r,tooltip:r?i("lastYearDisabled"):""},{name:i("allTime"),startDate:a.O.subtract(new Date,5,"years"),endDate:new Date,default:!0}]}function f(e){return a.O.format(e,"YYYY-MM-DD")}function p(e){return e.name?{rangeName:e.name}:{from:f(e.startDate),to:f(e.endDate)}}function v(e,t){var r=t.to,n=t.from,i=t.rangeName,c=m(e,i);if(c)return n||r?void o.e.updateParams(p(c),{replace:!0,merge:!0,keysToRemove:["from","to"]}):c;var d=u(e);if(n&&r&&a.O.isValid(n)&&a.O.isValid(r)){var f=!0,v=a.O.convertDateToUTC(new Date(n)),g=a.O.convertDateToUTC(new Date(r));a.O.isBefore(v,s(),"day")&&(v=s(),f=!1),a.O.isAfter(g,l(),"day")&&(g=l(),f=!1),a.O.isAfter(v,g)&&(v=d.startDate,g=d.endDate,f=!1);var y={startDate:v,endDate:g,name:f?i:""};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 g(e,t){var r=function(e){return c(a.O.startOf(e,"day"))},n=function(e){return c(a.O.endOf(e,"day"))},o=m(e,t.rangeName);if(o)return{start:r(f(o.startDate)),end:n(f(o.endDate))};if(t.from&&t.to)return{start:r(t.from),end:n(t.to)};var i=u(e);return{start:r(f(i.startDate)),end:n(f(i.endDate))}}},1568:(e,t,r)=>{r.r(t),r.d(t,{GenerateInteractiveResultsReportView:()=>N});var n=r(32735),a=r(23481),o=r(2948),i=r(20354),c=r(110),s=r(48258),l=r(71553),u=r(41196),m=r(26025),d=r(74901),f=r(40003),p=r(2606),v=r(9111),g=r(13876),y=r(83345),b=r(38143),D=r(28972),w=r(20768),h=r(31949),O=r(69883),E=r(91286),A=r(83140),I=r(80845),C=r(64818);function S(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 n,a,o,i,c=[],s=!0,l=!1;try{if(o=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;s=!1}else for(;!(s=(n=o.call(r)).done)&&(c.push(n.value),c.length!==t);s=!0);}catch(e){l=!0,a=e}finally{try{if(!s&&null!=r.return&&(i=r.return(),Object(i)!==i))return}finally{if(l)throw a}}return c}}(e,t)||function(e,t){if(e){if("string"==typeof e)return R(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)?R(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 R(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 k="shared.generateReport",T=a.T.encloseNamespace(k);function M(e){var t=c.O.convertUTCToLocal(e).toString();return c.O.format(t,"Do MMMM YYYY")}function N(e){var t,r,a=S((0,o.D)(b.g.ANONYMISE_USERS),1)[0],c=(0,O.Z)(),R=i.a.useGetFetchAsync(),N=m.B.getAudienceAppLinkParams(),j=m.B.getDateRangeAppLinkParams(),L=(0,f.wO)((0,f.Hb)(),j),P=S(n.useState(!1),2),x=P[0],Y=P[1],F=i.a.useBasicFetch(h.N.currentUser()),G=i.a.useBasicFetch(w.b.interactiveMetadata(e.interactiveId)),_=i.a.useBasicFetch((null===(t=G.data)||void 0===t?void 0:t.interactiveId)?w.b.interactive(G.data.interactiveId):null),z=(0,u.W)(e.interactiveId,Object.assign(Object.assign({},L),(0,d.K)(N)));(0,E.v)([_,G,z]);var H=(0,I.Q)(_.data),Z=(0,s.Fx)(_.data,z.data,!1,a);return n.createElement(y.D.Provider,{value:k},n.createElement(v.G,{title:T("title"),showLoadingSpinner:!F.hasCompleted,closePopup:e.closePopup},n.createElement(n.Fragment,null,n.createElement("p",null,n.createElement(y.x,{phrase:"description"})),n.createElement("p",null,n.createElement(y.x,{phrase:"dateRange",options:{dateFrom:M(L.start),dateTo:M(L.end)}})),n.createElement("p",null,n.createElement(y.x,{phrase:"emailDescription",options:{email:null===(r=F.data)||void 0===r?void 0:r.email}})),n.createElement(g.u,null,n.createElement(g.u.Cancel,{onClick:e.closePopup}),n.createElement(g.u.Submit,{variant:"dark",onClick:function(){Y(!0);var t={interactiveName:G.data.name,userId:F.data.id,customerId:F.data.customerId,questions:H.map((function(e){return e.name})),rows:Z.map((function(e){return{name:C.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:H.map((function(t){switch(A.A.isInteractionCorrect(t,(0,I.j_)(e))){case D.w.Correct:return T("correct");case D.w.Incorrect:return T("incorrect");case D.w.NotApplicable:return"-";case D.w.AwaitingMarking:return T("awaitingMarking");case D.w.UnAnswered:case D.w.Answered:default:return""}}))}}))};R(l.I.interactiveResultsReport(t)).then((function(){c.success(T("success"))})).catch((function(){c.error(T("error"))})).finally(e.closePopup)},text:T("generateReport"),showSpinner:x})))))}},40782:(e,t,r)=>{r.d(t,{I:()=>n,O:()=>s});var n,a=r(32735),o=r(2606),i=r(62712);function c(e){var t=a.useCallback((function(t){if(t){var r=t.r.baseVal.value,n=2*Math.PI*r,a=n-e.percentage*n;t.style.strokeDasharray="".concat(n," ").concat(n),t.style.strokeDashoffset=a.toString()}}),[e.percentage]);return a.createElement("svg",null,a.createElement("circle",{r:(0,o.pu)(e.size),className:i.Z.backgroundCircle}),!(0,o.zR)(e.percentage)&&a.createElement("circle",{ref:t,r:(0,o.pu)(e.size),className:(0,o.V4)(e.percentage,e.scoreThresholds)}))}function s(e){var t,r=(0,o.Ki)(e.percentage),s=e.size||(e.layout===n.LabelInside?o.Mk.Large:o.Mk.Small),l=e.customLabel||(0,o.DV)(r);return e.layout===n.LabelOnly?a.createElement("span",{className:(0,o.IA)(r)},l):a.createElement("div",{className:"d-flex align-items-center justify-content-between ".concat(null!==(t=e.className)&&void 0!==t?t:"")},e.layout===n.LabelBefore&&a.createElement("span",{className:"me-2"},l),a.createElement("div",{className:(0,o.tw)(s,r)},a.createElement(c,{percentage:r,size:s,scoreThresholds:e.scoreThresholds}),e.layout===n.LabelInside&&a.createElement("span",{className:i.Z.centredPercentageText},l)))}!function(e){e.CircleOnly="circle_only",e.LabelOnly="label_only",e.LabelBefore="label_before",e.LabelInside="label_inside"}(n||(n={})),s.defaultProps={layout:n.CircleOnly}},2606:(e,t,r)=>{r.d(t,{DV:()=>g,IA:()=>f,Ki:()=>v,Mk:()=>c,V4:()=>d,pu:()=>m,tw:()=>p,zR:()=>y});var n=r(94892),a=r(62712);function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function i(e,t,r){return(t=function(e){var t=function(e){if("object"!=o(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var r=t.call(e,"string");if("object"!=o(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==o(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var c,s=.2,l=.36;!function(e){e.Small="small",e.Large="large",e.ExtraSmall="extraSmall"}(c||(c={}));var u=i(i(i({},c.ExtraSmall,{size:2}),c.Small,{size:2}),c.Large,{size:5.8});function m(e){var t=u[e].size,r=e===c.Large?l:s;return"".concat(t/2-2*r,"rem")}function d(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:n.i;return e>=t.HIGH?a.Z.circleSuccess:e>=t.MODERATE?a.Z.circleWarning:a.Z.circleDanger}function f(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 p(e,t){var r="d-inline-block ".concat(a.Z.circleContainer);return e===c.Large&&(r+=" ".concat(a.Z.lgCircleContainer)),e===c.ExtraSmall&&(r+=" ".concat(a.Z.xsCircleContainer)),y(t)&&(r+=" ".concat(a.Z.pendingCircle)),r}function v(e){if(!y(e))return+e.toFixed(2)}function g(e){return y(e)?"--%":"".concat(Math.round(100*e),"%")}function y(e){return"number"!=typeof e}},94892:(e,t,r)=>{r.d(t,{T:()=>a,i:()=>n});var n={HIGH:.75,MODERATE:.5},a={HIGH:.7,MODERATE:.7}},94644:(e,t,r)=>{r.d(t,{r:()=>u});var n=r(50242),a=r(81886),o=r(67058),i=r(14553),c=r(49267),s=r(49075),l={notFound:o.d,forbidden:{rating:i.q,yearLevel:i.q,region:c.a,privacy:i.q},badRequest:s._,internalServerError:s._};function u(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e){var o;o="number"==typeof e?e:e.status;var i=Object.assign(Object.assign({},l),t);o&&a.Q.Ry.isStatusCodeError(o)&&(o!==n.o.InternalServer?o!==n.o.NotFound?o!==n.o.Forbidden?r.badRequest||a.Q.Ry.throw(new i.badRequest):r.forbidden||a.Q.Ry.throw(new i.forbidden.privacy):r.notFound||a.Q.Ry.throw(new i.notFound):r.internalServerError||a.Q.Ry.throw(new s._))}}},91286:(e,t,r)=>{r.d(t,{v:()=>i});var n=r(32735),a=r(94644);function o(e){return e.map((function(e){return e.statusCode})).join(":")}function i(e,t,r){var i=Array.isArray(e)?e:[e];(0,n.useEffect)((function(){i.forEach((function(e){(0,a.r)(e.statusCode,t,r)}))}),[o(i),t,r])}},62875:(e,t,r)=>{function n(e,t,r){var n="".concat(e,":").concat(t.start,":").concat(t.end),a=Array.isArray(t.userId)?t.userId.sort().join(":"):t.userId,o=Array.isArray(t.groupId)?t.groupId.sort().join(":"):t.groupId;return a&&(n+=":".concat(a)),o&&(n+=":".concat(o)),r&&(n+=":".concat(r)),n}r.d(t,{H:()=>n})},57266:(e,t,r)=>{r.d(t,{e:()=>i});var n=r(81886),a=r(1048),o=r(75795),i={updateParams:function(e,t){var r=o.O.getCurrentRoute().appLink,i="string"==typeof r.params?n.Q.Ab.DeserializeQueryParams(r.params):r.params;t.keysToRemove&&(i=a.t.omit(i,t.keysToRemove));var c=(null==t?void 0:t.merge)?Object.assign(Object.assign({},i),e):e,s=Object.assign(Object.assign({},r),{params:c});a.t.isEqual(r,s)||n.Q.C$.trigger(s,a.t.omit(t,["merge","keysToRemove"]))}}},62712:(e,t,r)=>{r.d(t,{Z:()=>n});const n={circleContainer:"p8Vgz",backgroundCircle:"asGGE",circleSuccess:"PXLNj",circleWarning:"ZckRN",circleDanger:"slBRg",lgCircleContainer:"N8KCI",xsCircleContainer:"RPqZ2",pendingCircle:"DKrcq",centredPercentageText:"tpmLR"}}}]);
2
- //# sourceMappingURL=2788-eca70707c6-lite.chunk.js.map
2
+ //# sourceMappingURL=2788-c8ae3be73f-lite.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/2788-c8ae3be73f-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/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/hooks/UseHandleObjectError.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 { PublicInteractiveUser } from 'libs/shared/interfaces/models/interactive-results/PublicInteractiveUser';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\n\nfunction getUniqueNamesConfig(id: string): 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 = +`${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 | PublicInteractiveUser, shouldAnonymise: boolean): string {\n if (!user)\n return '';\n\n if (!shouldAnonymise)\n return 'profileId' in user ? user.name : UserHelper.getFullName(user);\n\n return uniqueNamesGenerator(getUniqueNamesConfig('profileId' in user ? user.profileId : user.id));\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(dateRangePresets: DateRange[]): DateRange {\n return dateRangePresets.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 },\n {\n name: getPhrase('lastTwelveMonths'),\n startDate: new Date(currentYear, new Date().getMonth() - 11, 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 { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\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 useHandleObjectError([ interactive, interactiveMetadata, results ]);\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 size?: ProgressCircleSize;\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.size ||\n (props.layout === PercentageIndicatorLayout.LabelInside\n ? ProgressCircleSize.Large\n : ProgressCircleSize.Small\n );\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 ExtraSmall = 'extraSmall'\n}\n\nconst ProgressCircleSizeMap = {\n [ProgressCircleSize.ExtraSmall]: {\n size: CIRCLE_WIDTH\n },\n [ProgressCircleSize.Small]: {\n size: CIRCLE_WIDTH\n },\n [ProgressCircleSize.Large]: {\n size: CIRCLE_WIDTH_LG\n }\n};\n\n/**\n * radius = width / 2 - strokeWidth * 2\n */\nexport function getCircleRadius(size: ProgressCircleSize): string {\n const width = ProgressCircleSizeMap[size].size;\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 (size === ProgressCircleSize.ExtraSmall)\n className += ` ${styles.xsCircleContainer}`;\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 { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n internalServerError?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError,\n internalServerError: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.InternalServer) {\n if (!ignoreMap.internalServerError)\n Core.ErrorHelper.throw(new UnspecifiedError());\n return;\n }\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import { useEffect } from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { handleHttpError, HttpErrorMap, IgnoreHttpErrorMap } from 'libs/shared/errors/handlers/HttpErrorHandlers';\n\nfunction generateCacheKey(flightObjs: Array<Flight.Response<any>>): string {\n return flightObjs.map(obj => obj.statusCode).join(':');\n}\n\n// TODO: Change this to just `useHandleHttpError` and only accept a status code.\nexport function useHandleObjectError(\n _flightObjs: Flight.Response<any> | Array<Flight.Response<any>>,\n customErrors?: HttpErrorMap,\n ignoreErrors?: IgnoreHttpErrorMap\n): void {\n const flightObjs = Array.isArray(_flightObjs) ? _flightObjs : [_flightObjs];\n\n useEffect(() => {\n flightObjs.forEach(obj => {\n handleHttpError(obj.statusCode, customErrors, ignoreErrors);\n });\n }, [ generateCacheKey(flightObjs), customErrors, ignoreErrors ]);\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\",\"xsCircleContainer\":\"RPqZ2\",\"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","id","profileId","seed","Math","floor","Date","getMinutes","dictionaries","separator","length","style","name","getAudienceParams","queryParams","userId","groupId","push","getPhrase","convertDateToUtcDateTimeString","date","utc","getMinDate","getMaxDate","getDefaultDateRange","dateRangePresets","find","range","getPresetRangeByName","dateRangePresetss","p","getInsightsDateRangePresets","minDate","currentYear","getFullYear","isMinDateThisYear","startDate","endDate","getMonth","disabled","tooltip","default","formatDateQueryParam","getRouteQueryParams","dateRange","useGetDateRangeFromQueryParams","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_STROKE_WIDTH","CIRCLE_STROKE_WIDTH_LG","ProgressCircleSizeMap","ExtraSmall","Small","Large","getCircleRadius","width","strokeWidth","getCircleClassName","HIGH","MODERATE","getColouredLabelClassName","getCircleContainerClassName","isPending","getPercentageToFixed","toFixed","getFormattedPercentage","round","ScoreThresholdDefaults","ScoreThresholdInsights","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","internalServerError","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","generateCacheKey","flightObjs","obj","join","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","useEffect","forEach","getAnalyticsRequestKey","baseKey","filter","sharerId","userIdKey","sort","groupIdKey","AppRouteHelper","updateParams","currentParams","updatedParams","updatedAppLink"],"sourceRoot":""}
@@ -1,2 +1,2 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[7153],{92869:(e,t,r)=>{r.d(t,{t:()=>i});var n=r(48088),a=r(95846),i={preventScrollTop:function(){n.Radio.channel(a.G.SHELL).trigger("prevent:scroll:top")}}},34079:(e,t,r)=>{r.d(t,{O:()=>s});var n=r(32735),a=r(23481),i=r(40782),l=r(36532),c=a.T.encloseNamespace("interactives.pendingIndicator");function o(e){var t="d-flex align-items-center h-100";return t+=e.showLabel?" justify-content-between":" justify-content-center",e.className&&(t+=" ".concat(e.className)),t}function s(e){var t=function(){return n.createElement("div",{className:o(e)},!!e.showLabel&&n.createElement("em",null,c("pending")),n.createElement(i.O,null))};return e.title?n.createElement(l.u,{title:e.title,spanHack:!0,spanHackClassName:e.tooltipClassName||"h-100 w-100 d-flex align-items-center"},n.createElement(t,null)):n.createElement(t,null)}},97364:(e,t,r)=>{r.d(t,{C:()=>i,P:()=>a});var n=r(94892);function a(e,t){switch(e){case"score_desc":return[{id:t,desc:!0}];case"score_asc":return[{id:t,desc:!1}];default:return[]}}function i(e,t){return"marking_required"===e&&!t.awaitingMarking||"helping_hand"===e&&t.percentCorrect>=n.T.HIGH||"not_completed"===e&&!t.unanswered}},1704:(e,t,r)=>{r.d(t,{l:()=>s});var n=r(32735),a=r(23481),i=r(9111),l=r(13876);function c(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 o=a.T.encloseNamespace("shared.confirmationPopup");function s(e){var t,r,a=(t=n.useState(!1),r=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,i,l,c=[],o=!0,s=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;o=!1}else for(;!(o=(n=i.call(r)).done)&&(c.push(n.value),c.length!==t);o=!0);}catch(e){s=!0,a=e}finally{try{if(!o&&null!=r.return&&(l=r.return(),Object(l)!==l))return}finally{if(s)throw a}}return c}}(t,r)||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}}(t,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),s=a[0],u=a[1];return n.createElement(i.G,{title:e.title,closePopup:e.closePopup},n.createElement(n.Fragment,null,e.children,n.createElement(l.u,null,n.createElement(l.u.Cancel,{onClick:e.closePopup,variant:e.cancelButtonVariant,text:e.cancelButtonText||o("cancel")}),n.createElement(l.u.Submit,{onClick:function(){u(!0),e.onClickConfirm()},text:e.confirmButtonText||o("confirm"),variant:e.confirmButtonVariant,showSpinner:s,disabled:e.disabledConfirmButton}))))}s.defaultProps={confirmButtonVariant:"primary",cancelButtonVariant:"link"}},17688:(e,t,r)=>{r.r(t),r.d(t,{InteractiveInsightsQuestionsView:()=>Me});var n=r(32735),a=r(23481),i=r(2948),l=r(20354),c=r(92869),o=r(75896),s=r(9570),u=r(23232),m=r(83345),d="shared.interactionResponseList";function f(e){return n.createElement(n.Fragment,null,n.createElement(u.u,{className:"m-4"},n.createElement(u.u.Image,{src:function(){switch(e.filter){case"correct":return e.correctImageUrl;case"incorrect":return e.incorrectImageUrl;case"marking_required":return e.markingRequiredImageUrl;case"skipped":return e.skippedImageUrl}}(),className:"w-25 h-auto"}),n.createElement(u.u.Info,null,n.createElement(m.x,{namespace:d,phrase:function(){switch(e.filter){case"correct":return"correctEmptyState";case"incorrect":return"incorrectEmptyState";case"marking_required":return"markingRequiredEmptyState";case"skipped":return"skippedEmptyState"}}()}))))}function p(e){function t(t){return"rounded-pill bg-light ".concat(function(t){return t===e.filter}(t)?"bg-dark text-white":"")}return n.createElement("div",{className:"d-flex gap-2 m-3"},n.createElement("button",{className:t("marking_required"),onClick:function(){return e.toggleFilter("marking_required")}},n.createElement(m.x,{namespace:d,phrase:"markingRequired"})),n.createElement("button",{className:t("correct"),onClick:function(){return e.toggleFilter("correct")}},n.createElement(m.x,{namespace:d,phrase:"correct"})),n.createElement("button",{className:t("incorrect"),onClick:function(){return e.toggleFilter("incorrect")}},n.createElement(m.x,{namespace:d,phrase:"incorrect"})),n.createElement("button",{className:t("skipped"),onClick:function(){return e.toggleFilter("skipped")}},n.createElement(m.x,{namespace:d,phrase:"skipped"})))}var g=r(86572),b=a.T.encloseNamespace("interactives.interactionResponseListHeader");function v(e){var t,r=null===(t=e.interaction.data)||void 0===t?void 0:t.suggestedResponse;return n.createElement("div",{className:"rounded bg-white"},n.createElement("div",{className:"p-2 position-relative"},n.createElement("div",{className:"d-flex"},n.createElement(g.y,{interaction:e.interaction,iconClassName:"flex-shrink-0"})),!!r&&n.createElement("div",{className:"mt-2"},n.createElement("strong",null,b("suggestedResponse")),n.createElement("p",{className:"m-0"},r))))}var y=a.T.encloseNamespace("shared.submitMarkedAnswers");function h(e){return n.createElement("div",{className:"d-flex justify-content-end"},n.createElement("button",{className:"btn btn-outline-dark",onClick:e.submit,disabled:e.disabled},y("submitAnswers")))}var E=r(26136),w=r(39157),I=r(44113),k=r(28972),S=r(83140),N=r(80845);const A={awaitingMarking:"PPNkp"};function C(e){return C="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},C(e)}function x(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 U="shared.interactionResponseList",j=a.T.encloseNamespace(U);function O(e){var t,r,a,i,l=(a=n.useState(),i=2,function(e){if(Array.isArray(e))return e}(a)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,i,l,c=[],o=!0,s=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;o=!1}else for(;!(o=(n=i.call(r)).done)&&(c.push(n.value),c.length!==t);o=!0);}catch(e){s=!0,a=e}finally{try{if(!o&&null!=r.return&&(l=r.return(),Object(l)!==l))return}finally{if(s)throw a}}return c}}(a,i)||function(e,t){if(e){if("string"==typeof e)return x(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)?x(e,t):void 0}}(a,i)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),c=l[0],o=l[1],d=(r=e.interaction,e.results.students.filter((function(e){return S.A.isInteractionCorrect(r,(0,N.j_)(e))===k.w.AwaitingMarking})).reduce((function(e,t){var r,n;return Object.assign(Object.assign({},e),function(e,t,r){return(t=function(e){var t=function(e){if("object"!=C(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var r=t.call(e,"string");if("object"!=C(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==C(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}({},(null===(r=t.user)||void 0===r?void 0:r.id)||(null===(n=t.publicUser)||void 0===n?void 0:n.profileId),!0))}),{})),g=Object.keys(e.markedAnswers).length;if(!(null===(t=e.results.students)||void 0===t?void 0:t.length))return n.createElement("div",{className:"d-flex flex-column h-100"},n.createElement(u.u,{className:"bg-white rounded mt-2 py-5 flex-grow-1 justify-content-center"},n.createElement(u.u.Image,{src:e.emptyStateImageUrl,size:"small"}),n.createElement(u.u.Heading,null,j("emptyStateHeading")),n.createElement(u.u.Info,{className:"w-100"},j("emptyStateDescription"))));var b=e.results.students.filter((function(t){var r=(0,N.j_)(t),n=S.A.isInteractionCorrect(e.interaction,r),a={correct:k.w.Correct,incorrect:k.w.Incorrect,marking_required:k.w.AwaitingMarking,skipped:k.w.UnAnswered};return!c||c in a&&n===a[c]}));return n.createElement(n.Fragment,null,e.reportsStyling&&n.createElement(v,{interaction:e.interaction}),n.createElement("div",{className:e.reportsStyling?"d-flex justify-content-end":"d-flex align-items-center justify-content-between border-bottom border-light px-3 py-2"},!e.reportsStyling&&n.createElement("p",{className:"fw-semibold mb-0"},n.createElement(m.x,{namespace:U,phrase:"studentAnswers"})),!!Object.keys(d).length&&n.createElement(h,{submit:e.submitMarkedAnswers,disabled:!g})),n.createElement(n.Fragment,null,!e.reportsStyling&&n.createElement(p,{filter:c,toggleFilter:function(e){o(c===e?null:e)}}),!e.reportsStyling&&!b.length&&c&&n.createElement(f,{filter:c,markingRequiredImageUrl:e.markingRequiredImageUrl,correctImageUrl:e.correctImageUrl,incorrectImageUrl:e.incorrectImageUrl,skippedImageUrl:e.skippedImageUrl}),b&&n.createElement("ul",{className:"list-unstyled mb-0"},b.map((function(t,r){var a,i,l=(0,E.B)(t.user||t.publicUser,e.anonymiseUsers),c=d[(null===(a=t.user)||void 0===a?void 0:a.id)||(null===(i=t.publicUser)||void 0===i?void 0:i.profileId)],o=e.reportsStyling?"bg-white p-2":"bg-white px-3 pt-3 pb-2";return c&&(o+=" ".concat(A.awaitingMarking)),n.createElement("li",{key:r},e.reportsStyling?n.createElement(I.O,{interaction:e.interaction,studentResults:t,markedStatus:(0,w.HI)(e.interaction.id,t,e.markedAnswers),markInteraction:e.addMarkedAnswers,imageCdnUrl:e.imageCdnUrl,showStudentDetails:!0,anonymisedUserName:l,className:o,showFeedback:!0,reportsStyling:!0,responseComponentClass:"mx-n2"}):n.createElement(s.d,{interaction:e.interaction,studentResults:t,markedStatus:(0,w.HI)(e.interaction.id,t,e.markedAnswers),markInteraction:e.addMarkedAnswers,imageCdnUrl:e.imageCdnUrl,showStudentDetails:!0,anonymisedUserName:l,className:o,showFeedback:!0}))}))),e.reportsStyling&&!!d.length&&n.createElement("div",{className:"mt-2"},n.createElement(h,{submit:e.submitMarkedAnswers,disabled:!g}))))}var T=r(34079);function M(e){var t;return n.createElement("div",null,n.createElement("p",{className:"mb-0"},(t=e.interaction.data.sentence)?t.split(/({\d+})/).map((function(t,r){var a=t.match(/{(\d+)}/);if(a){var i=a[1],l=e.interaction.actionableItems.find((function(e){return+e.order==+i}));if(l)return n.createElement("span",{className:"bg-white border border-gray-300 rounded p-1 lh-lg",key:r},l.name)}return t})):""))}var R=r(79671);const P={row:"fXno_",answerImage:"pDAuW",answerWidth:"YHK27"};function q(e){var t,r;return(null===(r=o.m.first(null===(t=e.interaction)||void 0===t?void 0:t.actionableItems).data)||void 0===r?void 0:r.imageUrl)?n.createElement("div",{className:P.answerWidth},n.createElement(R.n,{interaction:e.interaction,size:"sm",showFeedback:!1,showCorrectnessIcons:!0,isDisplayOnly:!0})):n.createElement("ul",{className:"".concat(P.answerWidth," list-unstyled row g-2")},e.interaction.actionableItems.map((function(t){return n.createElement("li",{key:t.id,className:"col-12"},n.createElement("div",{className:"".concat(t.isCorrect?"bg-light-green border-green":"bg-light-red border-red"," rounded border py-1 px-2 m-0")},n.createElement("span",{className:"fw-semibold"},e.indexToLetter(t.order),". "),n.createElement("span",null,t.name)))})))}var W="shared.questionTable";function B(e){var t,r=null===(t=e.interaction.data)||void 0===t?void 0:t.suggestedResponse;return r?n.createElement("div",{className:"".concat(P.answerWidth," bg-light-blue rounded p-2 mb-2")},n.createElement("div",{className:"d-flex justify-content-between"},n.createElement("p",{className:"fw-semibold mb-2"},n.createElement(m.x,{namespace:W,phrase:"suggestedResponse"}))),n.createElement("p",{className:"mb-0"},r)):n.createElement(n.Fragment,null)}function F(e){return n.createElement("ul",{className:"list-unstyled d-flex gap-2"},e.interaction.actionableItems.map((function(t){return n.createElement("li",{key:t.id,className:"".concat(t.isCorrect?"bg-light-green border-green":"bg-light-red border-red"," rounded border px-2 py-1 mb-2 w-50")},n.createElement("span",{className:"fw-semibold"},e.indexToLetter(t.order),". "),n.createElement("span",null,t.name))})))}var L=r(40424);function _(e){var t=function(){switch(e.interaction.typeId){case L.Z9.MultipleChoice:return n.createElement(q,{interaction:e.interaction,indexToLetter:Q});case L.Z9.TrueOrFalse:return n.createElement(F,{interaction:e.interaction,indexToLetter:Q});case L.Z9.ShortAnswer:return n.createElement(B,{interaction:e.interaction});case L.Z9.MissingWord:return n.createElement(M,{interaction:e.interaction});default:return null}}();return t?n.createElement("div",{className:"w-100 mt-3"},t):n.createElement(n.Fragment,null)}var H=r(40782);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)}var Z=a.T.encloseNamespace("shared.questionTable");function K(e,t,r){var n=e.cells.find((function(e){return e.column.id===r})).value,a=t.cells.find((function(e){return e.column.id===r})).value;return n.awaitingMarking?-1:a.awaitingMarking||n.percentCorrect>=a.percentCorrect?1:-1}function V(e){var t;return n.createElement("div",{className:"d-flex ".concat(null!==(t=e.className)&&void 0!==t?t:"")},e.children)}function G(e){return n.createElement(V,{className:e.column.isSorted&&"fw-bold"},Z(e.phraseKey))}function Q(e){return String.fromCharCode(e+"A".charCodeAt(0))}var z=r(8246),$=a.T.encloseNamespace("shared.questionTable");function J(e,t){var r=e.actionableItems.map((function(t,r){return{id:t.id,label:e.typeId===L.Z9.MultipleChoice?Q(r):t.name,isCorrect:t.isCorrect,count:0}}));return t.students.forEach((function(t){var n=o.m.last(t.results).attempts,a=o.m.findWhere(n,{id:e.id});a&&a.answers.forEach((function(e){var t=o.m.findWhere(r,{id:e.id});t&&t.count++}))})),r}function Y(e,t){var r=e.actionableItems.map((function(e){return{id:e.id,label:e.name,isCorrect:e.isCorrect,count:0}}));return r.push({label:$("incorrect"),count:0,isCorrect:!1}),t.students.forEach((function(t){var n=o.m.last(t.results).attempts,a=o.m.findWhere(n,{id:e.id});a&&a.answers.forEach((function(e){var t=o.m.findWhere(r,{id:e.id});t&&e.status===z.N.Correct?t.count++:o.m.findWhere(r,{label:$("incorrect")}).count++}))})),r}function X(e,t){var r=[{label:$("correct"),isCorrect:!0,count:0},{label:$("incorrect"),isCorrect:!1,count:0}];return t.students.forEach((function(t){var n=o.m.last(t.results).attempts,a=o.m.findWhere(n,{id:e.id});a&&a.answers.forEach((function(e){if(e.status===z.N.Correct&&o.m.findWhere(r,{label:$("correct")}).count++,e.status===z.N.Incorrect&&o.m.findWhere(r,{label:$("incorrect")}).count++,e.status===z.N.PendingReview){var t=o.m.findWhere(r,{label:$("pending")});t||(r.push({label:$("pending"),count:0,isCorrect:!1}),t=o.m.findWhere(r,{label:$("pending")})),t.count++}}))})),r}var ee=r(83914),te=r(35223),re="shared.questionTable",ne=a.T.encloseNamespace(re);function ae(e){var t=function(){if(e.interaction&&e.results){var t;switch(e.interaction.typeId){case L.Z9.ShortAnswer:case L.Z9.Illustration:t=X;break;case L.Z9.MissingWord:t=Y;break;case L.Z9.MultipleChoice:case L.Z9.TrueOrFalse:t=J}return t(e.interaction,e.results)}}(),r=null==t?void 0:t.reduce((function(e,t){return t.count>e?t.count:e}),0);function a(e){var t="border rounded me-2";return e.count?e.label===ne("pending")?"".concat(t," border-blue bg-light-blue"):e.isCorrect?"".concat(t," border-green bg-light-green"):"".concat(t," border-red bg-light-red"):"".concat(t," border-light bg-light px-1")}return n.createElement("div",{className:"border border-light rounded p-3 mb-3"},n.createElement("div",{className:"d-flex align-items-center gap-2 mb-3"},n.createElement("div",{className:"rounded-circle bg-light-teal text-teal"},n.createElement(ee.x,{svgName:te.vn.Lightbulb,size:ee.S.Large})),n.createElement("h2",{className:"h6 mb-0"},n.createElement("span",null,n.createElement(m.x,{namespace:re,phrase:"questionSummary"})))),n.createElement("div",{className:"d-flex gap-2"},n.createElement("div",{className:"max-w-25"},null==t?void 0:t.map((function(e){return n.createElement("p",{key:e.label,className:"text-truncate mb-2"},e.label)}))),n.createElement("div",{className:"flex-grow-1"},null==t?void 0:t.map((function(e,t){return n.createElement("div",{key:t,className:"d-flex mb-2"},n.createElement("div",{className:a(e),style:{width:"".concat(e.count/r*100,"%"),height:20}}),n.createElement("span",null,e.count))})))))}var ie=a.T.encloseNamespace("shared.selectedInteractionEmptyState");function le(e){return n.createElement(u.u,{className:"rounded h-100 bg-white justify-content-center py-4"},n.createElement(u.u.Image,{src:e.emptyStateUrl,size:"small"}),n.createElement(u.u.Info,{className:"w-100"},ie("emptyStateText")))}var ce=r(97364),oe=r(69674),se=r(57266);function ue(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}function me(e){var t,r,a,i,l=(a=n.useState((0,ce.P)(e.sortBy,"correctlyAnswered")),i=2,function(e){if(Array.isArray(e))return e}(a)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,i,l,c=[],o=!0,s=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;o=!1}else for(;!(o=(n=i.call(r)).done)&&(c.push(n.value),c.length!==t);o=!0);}catch(e){s=!0,a=e}finally{try{if(!o&&null!=r.return&&(l=r.return(),Object(l)!==l))return}finally{if(s)throw a}}return c}}(a,i)||function(e,t){if(e){if("string"==typeof e)return ue(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)?ue(e,t):void 0}}(a,i)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),s=l[0],u=l[1],m=function(e,t,r,a){return n.useMemo((function(){var r=(0,N.Q)(e),n=r.reduce((function(e,t,r){return Object.assign(Object.assign({},e),function(e,t,r){return(t=function(e){var t=function(e){if("object"!=D(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var r=t.call(e,"string");if("object"!=D(r))return r;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}({},t.id,r))}),{}),i=r.map((function(e){return Object.assign(Object.assign({},e),{questionNumber:n[e.id],resultsSummary:(0,w.nq)(e,t)})}));if("correctlyAnswered"===(null==a?void 0:a.id)){var l=o.m.sortBy(i,(function(e){return e.resultsSummary.awaitingMarking?-1:e.resultsSummary.percentCorrect}));return a.desc?l.reverse():l}return i}),[r,a])}(e.interactive,e.results,e.refreshTable,o.m.first(s)),d=e.selectedInteractionId&&(0,w.Zs)(e.interactive,e.selectedInteractionId);return n.createElement("div",{className:"row"},n.createElement("div",{className:"col-6 flex-grow-1"},n.createElement(oe.i,{key:e.selectedInteractionId,columns:(r=e.showAnswersInTable,[{Header:function(e){var t=e.column;return n.createElement(G,{column:t,phraseKey:"#"})},accessor:"questionNumber",id:"index",Cell:function(e){var t=e.row.original.questionNumber;return n.createElement(V,null,t+1,".")},width:15,disableSortBy:!0},{Header:function(e){var t=e.column;return n.createElement(G,{column:t,phraseKey:"question"})},accessor:"data",Cell:function(e){var t=e.row.original,a=e.initialState.selectedRowIds,i=null==a?void 0:a[null==t?void 0:t.id];return n.createElement(V,{className:"flex-column"},n.createElement("div",{className:"".concat(i?"":"clamp-1"," pe-2")},n.createElement(g.y,{interaction:t,containerClassName:"d-flex"})),r&&i&&n.createElement(_,{interaction:t}))},disableSortBy:!0},{Header:function(e){var t=e.column;return n.createElement(G,{column:t,phraseKey:"score"})},accessor:"resultsSummary",id:"correctlyAnswered",Cell:function(e){var t=e.value,r=t.percentCorrect;return t.awaitingMarking?n.createElement(T.O,{title:Z("markingRequired"),className:"flex-grow-1",tooltipClassName:"d-block",showLabel:!0}):n.createElement(H.O,{percentage:r,layout:H.I.LabelBefore})},width:60,sortDescFirst:!0,sortType:K}]),data:m,theme:e.theme,onSelectRow:function(e){var t=e.original;c.t.preventScrollTop(),se.e.updateParams({interactionId:t.id},{merge:!0})},initialSelectedRowIds:d?[d.id]:null,getRowId:function(e){return e.id},enableSort:!0,manualSort:!0,onSort:u,initialSortBy:s})),n.createElement("div",{className:"col-6 d-flex flex-column"},!e.reportsStyling&&e.selectedInteractionId&&!!(null===(t=e.results.students)||void 0===t?void 0:t.length)&&n.createElement(ae,{interaction:d,results:e.results}),n.createElement("div",{className:"border border-light rounded flex-grow-1"},!!d&&n.createElement(O,{interaction:d,results:e.results,markedAnswers:e.markedAnswers,addMarkedAnswers:e.addMarkedAnswers,submitMarkedAnswers:e.submitMarkedAnswers,imageCdnUrl:e.imageCdnUrl,anonymiseUsers:e.anonymiseUsers,emptyStateImageUrl:e.emptyStateImageUrl,markingRequiredImageUrl:e.markingRequiredImageUrl,correctImageUrl:e.correctImageUrl,incorrectImageUrl:e.incorrectImageUrl,skippedImageUrl:e.skippedImageUrl,reportsStyling:e.reportsStyling}),!d&&n.createElement(le,{emptyStateUrl:e.selectQuestionImageUrl}))))}var de=r(41196),fe=r(9193),pe=r(26025),ge=r(74901),be=r(40003),ve=r(1704),ye=r(38143),he=r(39151),Ee=r(20768),we=r(91286),Ie=r(93322),ke=r(79612),Se=r(99742),Ne=r(5672),Ae=r(93116);const Ce={partialInsights:"bk68v"};function xe(){return n.createElement("div",null,n.createElement("div",{className:"row g-3 mb-5"},n.createElement("div",{className:"col-6"},n.createElement("div",{className:"".concat(Ce.partialInsights," rounded partial-loading-background")})),n.createElement("div",{className:"col-6"},n.createElement("div",{className:"".concat(Ce.partialInsights," rounded partial-loading-background")}))))}function Ue(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 n,a,i,l,c=[],o=!0,s=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;o=!1}else for(;!(o=(n=i.call(r)).done)&&(c.push(n.value),c.length!==t);o=!0);}catch(e){s=!0,a=e}finally{try{if(!o&&null!=r.return&&(l=r.return(),Object(l)!==l))return}finally{if(s)throw a}}return c}}(e,t)||function(e,t){if(e){if("string"==typeof e)return je(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)?je(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 je(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 Oe=a.T.encloseNamespace("shared.interactiveInsightsQuestions"),Te={table:"bg-white rounded border border-light h-100 pb-2",header:"border-bottom px-3 py-2 mb-2",headerCell:"d-flex align-items-center",cell:"",row:"px-3 py-2 bg-light-blue-hover",selectedRow:"bg-gray-100",sortIndicator:"ms-2"};function Me(e){var t,r,a,c,o,s=Ue((0,i.D)(ye.g.ANONYMISE_USERS),1)[0];(0,Ie.F)();var u=Ue(n.useState(!1),2),m=u[0],d=u[1],f=l.a.useBasicFetch(he.L.config()),p=l.a.useBasicFetch(Ee.b.interactiveMetadata(e.interactiveId)),g=l.a.useBasicFetch((null===(t=p.data)||void 0===t?void 0:t.interactiveId)&&Ee.b.interactive(p.data.interactiveId)),b=pe.B.getAudienceAppLinkParams(),v=pe.B.getDateRangeAppLinkParams(),y=(0,de.W)(e.interactiveId,Object.assign(Object.assign({},(0,be.wO)((0,be.Hb)(),v)),(0,ge.K)(b)),!0),h=(0,fe.D)(null===(r=g.data)||void 0===r?void 0:r.id,null===(a=p.data)||void 0===a?void 0:a.id,(function(){return d(!1)})),E=h.markedAnswers,w=h.addMarkedAnswers,I=h.submitMarkedAnswers;(0,ke.M)({title:p.data?Oe("pageTitle",{video:null===(c=p.data)||void 0===c?void 0:c.name}):null}),(0,we.v)([g,p,y]);var k=g.data&&p.data&&y.data,S=Object.assign(Object.assign({},b),v);return n.createElement("div",{className:"px-3"},n.createElement(Ae.m,{audienceAppLinkParams:b,dateRangeAppLinkParams:v,tabs:(0,Ne.kj)(e.interactiveId,"questions",S),video:p.data}),!k&&n.createElement(xe,null),k&&n.createElement(me,{interactive:g.data,results:y.data,markedAnswers:E,addMarkedAnswers:w,submitMarkedAnswers:function(){return d(!0)},imageCdnUrl:f.data.imageCdnUrl,selectedInteractionId:e.interactionId,refreshTable:y.isFetching||g.isFetching,emptyStateImageUrl:Se.W.Insights.NO_RESPONSES,selectQuestionImageUrl:Se.W.Insights.NO_DATA,anonymiseUsers:s,sortBy:e.sortBy,showAnswersInTable:!0,theme:Te,correctImageUrl:Se.W.Insights.JIGSAW,incorrectImageUrl:Se.W.Insights.RED_JIGSAW,skippedImageUrl:Se.W.Insights.SKIPPED,markingRequiredImageUrl:Se.W.Insights.CLIPBOARD}),m&&n.createElement(ve.l,{title:Oe("markPopupTitle",{smartCount:null!==(o=Object.keys(E).length)&&void 0!==o?o:0}),closePopup:function(){return d(!1)},confirmButtonText:Oe("submit"),confirmButtonVariant:"dark",onClickConfirm:I},n.createElement("p",null,Oe("markPopupBody"))))}}}]);
2
- //# sourceMappingURL=7153-0ed8513e59-lite.chunk.js.map
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[2962],{92869:(e,t,r)=>{r.d(t,{t:()=>i});var n=r(48088),a=r(95846),i={preventScrollTop:function(){n.Radio.channel(a.G.SHELL).trigger("prevent:scroll:top")}}},34079:(e,t,r)=>{r.d(t,{O:()=>s});var n=r(32735),a=r(23481),i=r(40782),l=r(36532),c=a.T.encloseNamespace("interactives.pendingIndicator");function o(e){var t="d-flex align-items-center h-100";return t+=e.showLabel?" justify-content-between":" justify-content-center",e.className&&(t+=" ".concat(e.className)),t}function s(e){var t=function(){return n.createElement("div",{className:o(e)},!!e.showLabel&&n.createElement("em",null,c("pending")),n.createElement(i.O,null))};return e.title?n.createElement(l.u,{title:e.title,spanHack:!0,spanHackClassName:e.tooltipClassName||"h-100 w-100 d-flex align-items-center"},n.createElement(t,null)):n.createElement(t,null)}},97364:(e,t,r)=>{r.d(t,{C:()=>i,P:()=>a});var n=r(94892);function a(e,t){switch(e){case"score_desc":return[{id:t,desc:!0}];case"score_asc":return[{id:t,desc:!1}];default:return[]}}function i(e,t){return"marking_required"===e&&!t.awaitingMarking||"helping_hand"===e&&t.percentCorrect>=n.T.HIGH||"not_completed"===e&&!t.unanswered}},1704:(e,t,r)=>{r.d(t,{l:()=>s});var n=r(32735),a=r(23481),i=r(9111),l=r(13876);function c(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 o=a.T.encloseNamespace("shared.confirmationPopup");function s(e){var t,r,a=(t=n.useState(!1),r=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,i,l,c=[],o=!0,s=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;o=!1}else for(;!(o=(n=i.call(r)).done)&&(c.push(n.value),c.length!==t);o=!0);}catch(e){s=!0,a=e}finally{try{if(!o&&null!=r.return&&(l=r.return(),Object(l)!==l))return}finally{if(s)throw a}}return c}}(t,r)||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}}(t,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),s=a[0],u=a[1];return n.createElement(i.G,{title:e.title,closePopup:e.closePopup},n.createElement(n.Fragment,null,e.children,n.createElement(l.u,null,n.createElement(l.u.Cancel,{onClick:e.closePopup,variant:e.cancelButtonVariant,text:e.cancelButtonText||o("cancel")}),n.createElement(l.u.Submit,{onClick:function(){u(!0),e.onClickConfirm()},text:e.confirmButtonText||o("confirm"),variant:e.confirmButtonVariant,showSpinner:s,disabled:e.disabledConfirmButton}))))}s.defaultProps={confirmButtonVariant:"primary",cancelButtonVariant:"link"}},17688:(e,t,r)=>{r.r(t),r.d(t,{InteractiveInsightsQuestionsView:()=>Me});var n=r(32735),a=r(23481),i=r(2948),l=r(20354),c=r(92869),o=r(75896),s=r(9570),u=r(23232),m=r(83345),d="shared.interactionResponseList";function f(e){return n.createElement(n.Fragment,null,n.createElement(u.u,{className:"m-4"},n.createElement(u.u.Image,{src:function(){switch(e.filter){case"correct":return e.correctImageUrl;case"incorrect":return e.incorrectImageUrl;case"marking_required":return e.markingRequiredImageUrl;case"skipped":return e.skippedImageUrl}}(),className:"w-25 h-auto"}),n.createElement(u.u.Info,null,n.createElement(m.x,{namespace:d,phrase:function(){switch(e.filter){case"correct":return"correctEmptyState";case"incorrect":return"incorrectEmptyState";case"marking_required":return"markingRequiredEmptyState";case"skipped":return"skippedEmptyState"}}()}))))}function p(e){function t(t){return"rounded-pill bg-light ".concat(function(t){return t===e.filter}(t)?"bg-dark text-white":"")}return n.createElement("div",{className:"d-flex gap-2 m-3"},n.createElement("button",{className:t("marking_required"),onClick:function(){return e.toggleFilter("marking_required")}},n.createElement(m.x,{namespace:d,phrase:"markingRequired"})),n.createElement("button",{className:t("correct"),onClick:function(){return e.toggleFilter("correct")}},n.createElement(m.x,{namespace:d,phrase:"correct"})),n.createElement("button",{className:t("incorrect"),onClick:function(){return e.toggleFilter("incorrect")}},n.createElement(m.x,{namespace:d,phrase:"incorrect"})),n.createElement("button",{className:t("skipped"),onClick:function(){return e.toggleFilter("skipped")}},n.createElement(m.x,{namespace:d,phrase:"skipped"})))}var g=r(86572),b=a.T.encloseNamespace("interactives.interactionResponseListHeader");function v(e){var t,r=null===(t=e.interaction.data)||void 0===t?void 0:t.suggestedResponse;return n.createElement("div",{className:"rounded bg-white"},n.createElement("div",{className:"p-2 position-relative"},n.createElement("div",{className:"d-flex"},n.createElement(g.y,{interaction:e.interaction,iconClassName:"flex-shrink-0"})),!!r&&n.createElement("div",{className:"mt-2"},n.createElement("strong",null,b("suggestedResponse")),n.createElement("p",{className:"m-0"},r))))}var y=a.T.encloseNamespace("shared.submitMarkedAnswers");function h(e){return n.createElement("div",{className:"d-flex justify-content-end"},n.createElement("button",{className:"btn btn-outline-dark",onClick:e.submit,disabled:e.disabled},y("submitAnswers")))}var E=r(26136),w=r(39157),I=r(44113),k=r(28972),S=r(83140),N=r(80845);const A={awaitingMarking:"PPNkp"};function C(e){return C="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},C(e)}function x(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 U="shared.interactionResponseList",j=a.T.encloseNamespace(U);function O(e){var t,r,a,i,l=(a=n.useState(),i=2,function(e){if(Array.isArray(e))return e}(a)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,i,l,c=[],o=!0,s=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;o=!1}else for(;!(o=(n=i.call(r)).done)&&(c.push(n.value),c.length!==t);o=!0);}catch(e){s=!0,a=e}finally{try{if(!o&&null!=r.return&&(l=r.return(),Object(l)!==l))return}finally{if(s)throw a}}return c}}(a,i)||function(e,t){if(e){if("string"==typeof e)return x(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)?x(e,t):void 0}}(a,i)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),c=l[0],o=l[1],d=(r=e.interaction,e.results.students.filter((function(e){return S.A.isInteractionCorrect(r,(0,N.j_)(e))===k.w.AwaitingMarking})).reduce((function(e,t){var r,n;return Object.assign(Object.assign({},e),function(e,t,r){return(t=function(e){var t=function(e){if("object"!=C(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var r=t.call(e,"string");if("object"!=C(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==C(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}({},(null===(r=t.user)||void 0===r?void 0:r.id)||(null===(n=t.publicUser)||void 0===n?void 0:n.profileId),!0))}),{})),g=Object.keys(e.markedAnswers).length;if(!(null===(t=e.results.students)||void 0===t?void 0:t.length))return n.createElement("div",{className:"d-flex flex-column h-100"},n.createElement(u.u,{className:"bg-white rounded mt-2 py-5 flex-grow-1 justify-content-center"},n.createElement(u.u.Image,{src:e.emptyStateImageUrl,size:"small"}),n.createElement(u.u.Heading,null,j("emptyStateHeading")),n.createElement(u.u.Info,{className:"w-100"},j("emptyStateDescription"))));var b=e.results.students.filter((function(t){var r=(0,N.j_)(t),n=S.A.isInteractionCorrect(e.interaction,r),a={correct:k.w.Correct,incorrect:k.w.Incorrect,marking_required:k.w.AwaitingMarking,skipped:k.w.UnAnswered};return!c||c in a&&n===a[c]}));return n.createElement(n.Fragment,null,e.reportsStyling&&n.createElement(v,{interaction:e.interaction}),n.createElement("div",{className:e.reportsStyling?"d-flex justify-content-end":"d-flex align-items-center justify-content-between border-bottom border-light px-3 py-2"},!e.reportsStyling&&n.createElement("p",{className:"fw-semibold mb-0"},n.createElement(m.x,{namespace:U,phrase:"studentAnswers"})),!!Object.keys(d).length&&n.createElement(h,{submit:e.submitMarkedAnswers,disabled:!g})),n.createElement(n.Fragment,null,!e.reportsStyling&&n.createElement(p,{filter:c,toggleFilter:function(e){o(c===e?null:e)}}),!e.reportsStyling&&!b.length&&c&&n.createElement(f,{filter:c,markingRequiredImageUrl:e.markingRequiredImageUrl,correctImageUrl:e.correctImageUrl,incorrectImageUrl:e.incorrectImageUrl,skippedImageUrl:e.skippedImageUrl}),b&&n.createElement("ul",{className:"list-unstyled mb-0"},b.map((function(t,r){var a,i,l=(0,E.B)(t.user||t.publicUser,e.anonymiseUsers),c=d[(null===(a=t.user)||void 0===a?void 0:a.id)||(null===(i=t.publicUser)||void 0===i?void 0:i.profileId)],o=e.reportsStyling?"bg-white p-2":"bg-white px-3 pt-3 pb-2";return c&&(o+=" ".concat(A.awaitingMarking)),n.createElement("li",{key:r},e.reportsStyling?n.createElement(I.O,{interaction:e.interaction,studentResults:t,markedStatus:(0,w.HI)(e.interaction.id,t,e.markedAnswers),markInteraction:e.addMarkedAnswers,imageCdnUrl:e.imageCdnUrl,showStudentDetails:!0,anonymisedUserName:l,className:o,showFeedback:!0,reportsStyling:!0,responseComponentClass:"mx-n2"}):n.createElement(s.d,{interaction:e.interaction,studentResults:t,markedStatus:(0,w.HI)(e.interaction.id,t,e.markedAnswers),markInteraction:e.addMarkedAnswers,imageCdnUrl:e.imageCdnUrl,showStudentDetails:!0,anonymisedUserName:l,className:o,showFeedback:!0}))}))),e.reportsStyling&&!!d.length&&n.createElement("div",{className:"mt-2"},n.createElement(h,{submit:e.submitMarkedAnswers,disabled:!g}))))}var T=r(34079);function M(e){var t;return n.createElement("div",null,n.createElement("p",{className:"mb-0"},(t=e.interaction.data.sentence)?t.split(/({\d+})/).map((function(t,r){var a=t.match(/{(\d+)}/);if(a){var i=a[1],l=e.interaction.actionableItems.find((function(e){return+e.order==+i}));if(l)return n.createElement("span",{className:"bg-white border border-gray-300 rounded p-1 lh-lg",key:r},l.name)}return t})):""))}var R=r(79671);const P={row:"fXno_",answerImage:"pDAuW",answerWidth:"YHK27"};function q(e){var t,r;return(null===(r=o.m.first(null===(t=e.interaction)||void 0===t?void 0:t.actionableItems).data)||void 0===r?void 0:r.imageUrl)?n.createElement("div",{className:P.answerWidth},n.createElement(R.n,{interaction:e.interaction,size:"sm",showFeedback:!1,showCorrectnessIcons:!0,isDisplayOnly:!0})):n.createElement("ul",{className:"".concat(P.answerWidth," list-unstyled row g-2")},e.interaction.actionableItems.map((function(t){return n.createElement("li",{key:t.id,className:"col-12"},n.createElement("div",{className:"".concat(t.isCorrect?"bg-light-green border-green":"bg-light-red border-red"," rounded border py-1 px-2 m-0")},n.createElement("span",{className:"fw-semibold"},e.indexToLetter(t.order),". "),n.createElement("span",null,t.name)))})))}var W="shared.questionTable";function B(e){var t,r=null===(t=e.interaction.data)||void 0===t?void 0:t.suggestedResponse;return r?n.createElement("div",{className:"".concat(P.answerWidth," bg-light-blue rounded p-2 mb-2")},n.createElement("div",{className:"d-flex justify-content-between"},n.createElement("p",{className:"fw-semibold mb-2"},n.createElement(m.x,{namespace:W,phrase:"suggestedResponse"}))),n.createElement("p",{className:"mb-0"},r)):n.createElement(n.Fragment,null)}function F(e){return n.createElement("ul",{className:"list-unstyled d-flex gap-2"},e.interaction.actionableItems.map((function(t){return n.createElement("li",{key:t.id,className:"".concat(t.isCorrect?"bg-light-green border-green":"bg-light-red border-red"," rounded border px-2 py-1 mb-2 w-50")},n.createElement("span",{className:"fw-semibold"},e.indexToLetter(t.order),". "),n.createElement("span",null,t.name))})))}var L=r(40424);function _(e){var t=function(){switch(e.interaction.typeId){case L.Z9.MultipleChoice:return n.createElement(q,{interaction:e.interaction,indexToLetter:Q});case L.Z9.TrueOrFalse:return n.createElement(F,{interaction:e.interaction,indexToLetter:Q});case L.Z9.ShortAnswer:return n.createElement(B,{interaction:e.interaction});case L.Z9.MissingWord:return n.createElement(M,{interaction:e.interaction});default:return null}}();return t?n.createElement("div",{className:"w-100 mt-3"},t):n.createElement(n.Fragment,null)}var H=r(40782);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)}var Z=a.T.encloseNamespace("shared.questionTable");function K(e,t,r){var n=e.cells.find((function(e){return e.column.id===r})).value,a=t.cells.find((function(e){return e.column.id===r})).value;return n.awaitingMarking?-1:a.awaitingMarking||n.percentCorrect>=a.percentCorrect?1:-1}function V(e){var t;return n.createElement("div",{className:"d-flex ".concat(null!==(t=e.className)&&void 0!==t?t:"")},e.children)}function G(e){return n.createElement(V,{className:e.column.isSorted&&"fw-bold"},Z(e.phraseKey))}function Q(e){return String.fromCharCode(e+"A".charCodeAt(0))}var z=r(8246),$=a.T.encloseNamespace("shared.questionTable");function J(e,t){var r=e.actionableItems.map((function(t,r){return{id:t.id,label:e.typeId===L.Z9.MultipleChoice?Q(r):t.name,isCorrect:t.isCorrect,count:0}}));return t.students.forEach((function(t){var n=o.m.last(t.results).attempts,a=o.m.findWhere(n,{id:e.id});a&&a.answers.forEach((function(e){var t=o.m.findWhere(r,{id:e.id});t&&t.count++}))})),r}function Y(e,t){var r=e.actionableItems.map((function(e){return{id:e.id,label:e.name,isCorrect:e.isCorrect,count:0}}));return r.push({label:$("incorrect"),count:0,isCorrect:!1}),t.students.forEach((function(t){var n=o.m.last(t.results).attempts,a=o.m.findWhere(n,{id:e.id});a&&a.answers.forEach((function(e){var t=o.m.findWhere(r,{id:e.id});t&&e.status===z.N.Correct?t.count++:o.m.findWhere(r,{label:$("incorrect")}).count++}))})),r}function X(e,t){var r=[{label:$("correct"),isCorrect:!0,count:0},{label:$("incorrect"),isCorrect:!1,count:0}];return t.students.forEach((function(t){var n=o.m.last(t.results).attempts,a=o.m.findWhere(n,{id:e.id});a&&a.answers.forEach((function(e){if(e.status===z.N.Correct&&o.m.findWhere(r,{label:$("correct")}).count++,e.status===z.N.Incorrect&&o.m.findWhere(r,{label:$("incorrect")}).count++,e.status===z.N.PendingReview){var t=o.m.findWhere(r,{label:$("pending")});t||(r.push({label:$("pending"),count:0,isCorrect:!1}),t=o.m.findWhere(r,{label:$("pending")})),t.count++}}))})),r}var ee=r(83914),te=r(35223),re="shared.questionTable",ne=a.T.encloseNamespace(re);function ae(e){var t=function(){if(e.interaction&&e.results){var t;switch(e.interaction.typeId){case L.Z9.ShortAnswer:case L.Z9.Illustration:t=X;break;case L.Z9.MissingWord:t=Y;break;case L.Z9.MultipleChoice:case L.Z9.TrueOrFalse:t=J}return t(e.interaction,e.results)}}(),r=null==t?void 0:t.reduce((function(e,t){return t.count>e?t.count:e}),0);function a(e){var t="border rounded me-2";return e.count?e.label===ne("pending")?"".concat(t," border-blue bg-light-blue"):e.isCorrect?"".concat(t," border-green bg-light-green"):"".concat(t," border-red bg-light-red"):"".concat(t," border-light bg-light px-1")}return n.createElement("div",{className:"border border-light rounded p-3 mb-3"},n.createElement("div",{className:"d-flex align-items-center gap-2 mb-3"},n.createElement("div",{className:"rounded-circle bg-light-teal text-teal"},n.createElement(ee.x,{svgName:te.vn.Lightbulb,size:ee.S.Large})),n.createElement("h2",{className:"h6 mb-0"},n.createElement("span",null,n.createElement(m.x,{namespace:re,phrase:"questionSummary"})))),n.createElement("div",{className:"d-flex gap-2"},n.createElement("div",{className:"max-w-25"},null==t?void 0:t.map((function(e){return n.createElement("p",{key:e.label,className:"text-truncate mb-2"},e.label)}))),n.createElement("div",{className:"flex-grow-1"},null==t?void 0:t.map((function(e,t){return n.createElement("div",{key:t,className:"d-flex mb-2"},n.createElement("div",{className:a(e),style:{width:"".concat(e.count/r*100,"%"),height:20}}),n.createElement("span",null,e.count))})))))}var ie=a.T.encloseNamespace("shared.selectedInteractionEmptyState");function le(e){return n.createElement(u.u,{className:"rounded h-100 bg-white justify-content-center py-4"},n.createElement(u.u.Image,{src:e.emptyStateUrl,size:"small"}),n.createElement(u.u.Info,{className:"w-100"},ie("emptyStateText")))}var ce=r(97364),oe=r(69674),se=r(57266);function ue(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}function me(e){var t,r,a,i,l=(a=n.useState((0,ce.P)(e.sortBy,"correctlyAnswered")),i=2,function(e){if(Array.isArray(e))return e}(a)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,i,l,c=[],o=!0,s=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;o=!1}else for(;!(o=(n=i.call(r)).done)&&(c.push(n.value),c.length!==t);o=!0);}catch(e){s=!0,a=e}finally{try{if(!o&&null!=r.return&&(l=r.return(),Object(l)!==l))return}finally{if(s)throw a}}return c}}(a,i)||function(e,t){if(e){if("string"==typeof e)return ue(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)?ue(e,t):void 0}}(a,i)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),s=l[0],u=l[1],m=function(e,t,r,a){return n.useMemo((function(){var r=(0,N.Q)(e),n=r.reduce((function(e,t,r){return Object.assign(Object.assign({},e),function(e,t,r){return(t=function(e){var t=function(e){if("object"!=D(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var r=t.call(e,"string");if("object"!=D(r))return r;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}({},t.id,r))}),{}),i=r.map((function(e){return Object.assign(Object.assign({},e),{questionNumber:n[e.id],resultsSummary:(0,w.nq)(e,t)})}));if("correctlyAnswered"===(null==a?void 0:a.id)){var l=o.m.sortBy(i,(function(e){return e.resultsSummary.awaitingMarking?-1:e.resultsSummary.percentCorrect}));return a.desc?l.reverse():l}return i}),[r,a])}(e.interactive,e.results,e.refreshTable,o.m.first(s)),d=e.selectedInteractionId&&(0,w.Zs)(e.interactive,e.selectedInteractionId);return n.createElement("div",{className:"row"},n.createElement("div",{className:"col-6 flex-grow-1"},n.createElement(oe.i,{key:e.selectedInteractionId,columns:(r=e.showAnswersInTable,[{Header:function(e){var t=e.column;return n.createElement(G,{column:t,phraseKey:"#"})},accessor:"questionNumber",id:"index",Cell:function(e){var t=e.row.original.questionNumber;return n.createElement(V,null,t+1,".")},width:15,disableSortBy:!0},{Header:function(e){var t=e.column;return n.createElement(G,{column:t,phraseKey:"question"})},accessor:"data",Cell:function(e){var t=e.row.original,a=e.initialState.selectedRowIds,i=null==a?void 0:a[null==t?void 0:t.id];return n.createElement(V,{className:"flex-column"},n.createElement("div",{className:"".concat(i?"":"clamp-1"," pe-2")},n.createElement(g.y,{interaction:t,containerClassName:"d-flex"})),r&&i&&n.createElement(_,{interaction:t}))},disableSortBy:!0},{Header:function(e){var t=e.column;return n.createElement(G,{column:t,phraseKey:"score"})},accessor:"resultsSummary",id:"correctlyAnswered",Cell:function(e){var t=e.value,r=t.percentCorrect;return t.awaitingMarking?n.createElement(T.O,{title:Z("markingRequired"),className:"flex-grow-1",tooltipClassName:"d-block",showLabel:!0}):n.createElement(H.O,{percentage:r,layout:H.I.LabelBefore})},width:60,sortDescFirst:!0,sortType:K}]),data:m,theme:e.theme,onSelectRow:function(e){var t=e.original;c.t.preventScrollTop(),se.e.updateParams({interactionId:t.id},{merge:!0})},initialSelectedRowIds:d?[d.id]:null,getRowId:function(e){return e.id},enableSort:!0,manualSort:!0,onSort:u,initialSortBy:s})),n.createElement("div",{className:"col-6 d-flex flex-column"},!e.reportsStyling&&e.selectedInteractionId&&!!(null===(t=e.results.students)||void 0===t?void 0:t.length)&&n.createElement(ae,{interaction:d,results:e.results}),n.createElement("div",{className:"border border-light rounded flex-grow-1"},!!d&&n.createElement(O,{interaction:d,results:e.results,markedAnswers:e.markedAnswers,addMarkedAnswers:e.addMarkedAnswers,submitMarkedAnswers:e.submitMarkedAnswers,imageCdnUrl:e.imageCdnUrl,anonymiseUsers:e.anonymiseUsers,emptyStateImageUrl:e.emptyStateImageUrl,markingRequiredImageUrl:e.markingRequiredImageUrl,correctImageUrl:e.correctImageUrl,incorrectImageUrl:e.incorrectImageUrl,skippedImageUrl:e.skippedImageUrl,reportsStyling:e.reportsStyling}),!d&&n.createElement(le,{emptyStateUrl:e.selectQuestionImageUrl}))))}var de=r(41196),fe=r(9193),pe=r(26025),ge=r(74901),be=r(40003),ve=r(1704),ye=r(38143),he=r(39151),Ee=r(20768),we=r(91286),Ie=r(93322),ke=r(79612),Se=r(99742),Ne=r(5672),Ae=r(93116);const Ce={partialInsights:"bk68v"};function xe(){return n.createElement("div",null,n.createElement("div",{className:"row g-3 mb-5"},n.createElement("div",{className:"col-6"},n.createElement("div",{className:"".concat(Ce.partialInsights," rounded partial-loading-background")})),n.createElement("div",{className:"col-6"},n.createElement("div",{className:"".concat(Ce.partialInsights," rounded partial-loading-background")}))))}function Ue(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 n,a,i,l,c=[],o=!0,s=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;o=!1}else for(;!(o=(n=i.call(r)).done)&&(c.push(n.value),c.length!==t);o=!0);}catch(e){s=!0,a=e}finally{try{if(!o&&null!=r.return&&(l=r.return(),Object(l)!==l))return}finally{if(s)throw a}}return c}}(e,t)||function(e,t){if(e){if("string"==typeof e)return je(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)?je(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 je(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 Oe=a.T.encloseNamespace("shared.interactiveInsightsQuestions"),Te={table:"bg-white rounded border border-light h-100 pb-2",header:"border-bottom px-3 py-2 mb-2",headerCell:"d-flex align-items-center",cell:"",row:"px-3 py-2 bg-light-blue-hover",selectedRow:"bg-gray-100",sortIndicator:"ms-2"};function Me(e){var t,r,a,c,o,s=Ue((0,i.D)(ye.g.ANONYMISE_USERS),1)[0];(0,Ie.F)();var u=Ue(n.useState(!1),2),m=u[0],d=u[1],f=l.a.useBasicFetch(he.L.config()),p=l.a.useBasicFetch(Ee.b.interactiveMetadata(e.interactiveId)),g=l.a.useBasicFetch((null===(t=p.data)||void 0===t?void 0:t.interactiveId)&&Ee.b.interactive(p.data.interactiveId)),b=pe.B.getAudienceAppLinkParams(),v=pe.B.getDateRangeAppLinkParams(),y=(0,de.W)(e.interactiveId,Object.assign(Object.assign({},(0,be.wO)((0,be.Hb)(),v)),(0,ge.K)(b)),!0),h=(0,fe.D)(null===(r=g.data)||void 0===r?void 0:r.id,null===(a=p.data)||void 0===a?void 0:a.id,(function(){return d(!1)})),E=h.markedAnswers,w=h.addMarkedAnswers,I=h.submitMarkedAnswers;(0,ke.M)({title:p.data?Oe("pageTitle",{video:null===(c=p.data)||void 0===c?void 0:c.name}):null}),(0,we.v)([g,p,y]);var k=g.data&&p.data&&y.data,S=Object.assign(Object.assign({},b),v);return n.createElement("div",{className:"px-3"},n.createElement(Ae.m,{audienceAppLinkParams:b,dateRangeAppLinkParams:v,tabs:(0,Ne.kj)(e.interactiveId,"questions",S),video:p.data}),!k&&n.createElement(xe,null),k&&n.createElement(me,{interactive:g.data,results:y.data,markedAnswers:E,addMarkedAnswers:w,submitMarkedAnswers:function(){return d(!0)},imageCdnUrl:f.data.imageCdnUrl,selectedInteractionId:e.interactionId,refreshTable:y.isFetching||g.isFetching,emptyStateImageUrl:Se.W.Insights.NO_RESPONSES,selectQuestionImageUrl:Se.W.Insights.NO_DATA,anonymiseUsers:s,sortBy:e.sortBy,showAnswersInTable:!0,theme:Te,correctImageUrl:Se.W.Insights.JIGSAW,incorrectImageUrl:Se.W.Insights.RED_JIGSAW,skippedImageUrl:Se.W.Insights.SKIPPED,markingRequiredImageUrl:Se.W.Insights.CLIPBOARD}),m&&n.createElement(ve.l,{title:Oe("markPopupTitle",{smartCount:null!==(o=Object.keys(E).length)&&void 0!==o?o:0}),closePopup:function(){return d(!1)},confirmButtonText:Oe("submit"),confirmButtonVariant:"dark",onClickConfirm:I},n.createElement("p",null,Oe("markPopupBody"))))}}}]);
2
+ //# sourceMappingURL=2962-7f2e4412f0-lite.chunk.js.map