@clickview/lite 0.64.0-rc.1 → 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 (132) 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/229-ac9f12e165-lite.chunk.js +2 -0
  12. package/dist/scripts/229-ac9f12e165-lite.chunk.js.map +1 -0
  13. package/dist/scripts/2712-a851ddc3c3-lite.chunk.js +2 -0
  14. package/dist/scripts/2712-a851ddc3c3-lite.chunk.js.map +1 -0
  15. package/dist/scripts/{2788-eca70707c6-lite.chunk.js → 2788-c8ae3be73f-lite.chunk.js} +1 -1
  16. package/dist/scripts/2788-c8ae3be73f-lite.chunk.js.map +1 -0
  17. package/dist/scripts/{7153-0ed8513e59-lite.chunk.js → 2962-7f2e4412f0-lite.chunk.js} +2 -2
  18. package/dist/scripts/{7153-0ed8513e59-lite.chunk.js.map → 2962-7f2e4412f0-lite.chunk.js.map} +1 -1
  19. package/dist/scripts/2988-b602b64344-lite.chunk.js +2 -0
  20. package/dist/scripts/2988-b602b64344-lite.chunk.js.map +1 -0
  21. package/dist/scripts/3180-c1f065183d-lite.chunk.js +2 -0
  22. package/dist/scripts/3180-c1f065183d-lite.chunk.js.map +1 -0
  23. package/dist/scripts/3549-111225ff0e-lite.chunk.js +2 -0
  24. package/dist/scripts/3549-111225ff0e-lite.chunk.js.map +1 -0
  25. package/dist/scripts/4591-f78fa6c784-lite.chunk.js +2 -0
  26. package/dist/scripts/4591-f78fa6c784-lite.chunk.js.map +1 -0
  27. package/dist/scripts/4667-5101904582-lite.chunk.js +2 -0
  28. package/dist/scripts/4667-5101904582-lite.chunk.js.map +1 -0
  29. package/dist/scripts/{5056-6057435479-lite.chunk.js → 5056-65c739468f-lite.chunk.js} +1 -1
  30. package/dist/scripts/5056-65c739468f-lite.chunk.js.map +1 -0
  31. package/dist/scripts/5201-98ee21febb-lite.chunk.js +2 -0
  32. package/dist/scripts/5201-98ee21febb-lite.chunk.js.map +1 -0
  33. package/dist/scripts/5595-79068997ce-lite.chunk.js +2 -0
  34. package/dist/scripts/5595-79068997ce-lite.chunk.js.map +1 -0
  35. package/dist/scripts/5770-f88f6d9c00-lite.chunk.js +2 -0
  36. package/dist/scripts/5770-f88f6d9c00-lite.chunk.js.map +1 -0
  37. package/dist/scripts/5896-60133bfdad-lite.chunk.js +3 -0
  38. package/dist/scripts/5896-60133bfdad-lite.chunk.js.map +1 -0
  39. package/dist/scripts/6173-7f9939c29e-lite.chunk.js +3 -0
  40. package/dist/scripts/6173-7f9939c29e-lite.chunk.js.map +1 -0
  41. package/dist/scripts/6181-9d7668c9e4-lite.chunk.js +3 -0
  42. package/dist/scripts/6181-9d7668c9e4-lite.chunk.js.map +1 -0
  43. package/dist/scripts/6455-37039eb687-lite.chunk.js +2 -0
  44. package/dist/scripts/6455-37039eb687-lite.chunk.js.map +1 -0
  45. package/dist/scripts/6623-84b33c6856-lite.chunk.js +3 -0
  46. package/dist/scripts/6623-84b33c6856-lite.chunk.js.map +1 -0
  47. package/dist/scripts/6919-0f2cef64e5-lite.chunk.js +2 -0
  48. package/dist/scripts/6919-0f2cef64e5-lite.chunk.js.map +1 -0
  49. package/dist/scripts/7267-1f5006c9c5-lite.chunk.js +2 -0
  50. package/dist/scripts/7267-1f5006c9c5-lite.chunk.js.map +1 -0
  51. package/dist/scripts/{2083-7daacf0112-lite.chunk.js → 7324-ee20e73ac1-lite.chunk.js} +2 -2
  52. package/dist/scripts/{2083-7daacf0112-lite.chunk.js.map → 7324-ee20e73ac1-lite.chunk.js.map} +1 -1
  53. package/dist/scripts/7434-fef3ea4e89-lite.chunk.js +2 -0
  54. package/dist/scripts/7434-fef3ea4e89-lite.chunk.js.map +1 -0
  55. package/dist/scripts/7443-4866d0c9ab-lite.chunk.js +3 -0
  56. package/dist/scripts/7443-4866d0c9ab-lite.chunk.js.map +1 -0
  57. package/dist/scripts/8416-7d71a55a14-lite.chunk.js +2 -0
  58. package/dist/scripts/8416-7d71a55a14-lite.chunk.js.map +1 -0
  59. package/dist/scripts/8465-01b0f72699-lite.chunk.js +2 -0
  60. package/dist/scripts/8465-01b0f72699-lite.chunk.js.map +1 -0
  61. package/dist/scripts/9013-6fcc58f028-lite.chunk.js +2 -0
  62. package/dist/scripts/9013-6fcc58f028-lite.chunk.js.map +1 -0
  63. package/dist/scripts/9264-998d93d1c2-lite.chunk.js +2 -0
  64. package/dist/scripts/9264-998d93d1c2-lite.chunk.js.map +1 -0
  65. package/dist/scripts/9894-0fba5cf702-lite.chunk.js +3 -0
  66. package/dist/scripts/9894-0fba5cf702-lite.chunk.js.map +1 -0
  67. package/dist/scripts/bundle-2e839958ca.min.js +3 -0
  68. package/dist/scripts/bundle-2e839958ca.min.js.map +1 -0
  69. package/package.json +1 -1
  70. package/dist/scripts/1755-462bcd99e9-lite.chunk.js +0 -2
  71. package/dist/scripts/1755-462bcd99e9-lite.chunk.js.map +0 -1
  72. package/dist/scripts/180-6c4779f6ab-lite.chunk.js +0 -2
  73. package/dist/scripts/180-6c4779f6ab-lite.chunk.js.map +0 -1
  74. package/dist/scripts/1820-3b5d0a340d-lite.chunk.js +0 -2
  75. package/dist/scripts/1820-3b5d0a340d-lite.chunk.js.map +0 -1
  76. package/dist/scripts/1857-d3af9d98eb-lite.chunk.js +0 -3
  77. package/dist/scripts/1857-d3af9d98eb-lite.chunk.js.map +0 -1
  78. package/dist/scripts/229-900e650427-lite.chunk.js +0 -2
  79. package/dist/scripts/229-900e650427-lite.chunk.js.map +0 -1
  80. package/dist/scripts/2788-eca70707c6-lite.chunk.js.map +0 -1
  81. package/dist/scripts/3180-22edf4c9fc-lite.chunk.js +0 -2
  82. package/dist/scripts/3180-22edf4c9fc-lite.chunk.js.map +0 -1
  83. package/dist/scripts/3549-30d3b1cd05-lite.chunk.js +0 -2
  84. package/dist/scripts/3549-30d3b1cd05-lite.chunk.js.map +0 -1
  85. package/dist/scripts/3776-0027340c98-lite.chunk.js +0 -2
  86. package/dist/scripts/3776-0027340c98-lite.chunk.js.map +0 -1
  87. package/dist/scripts/4591-3e8dddd0e9-lite.chunk.js +0 -2
  88. package/dist/scripts/4591-3e8dddd0e9-lite.chunk.js.map +0 -1
  89. package/dist/scripts/4667-f3882f2379-lite.chunk.js +0 -2
  90. package/dist/scripts/4667-f3882f2379-lite.chunk.js.map +0 -1
  91. package/dist/scripts/5056-6057435479-lite.chunk.js.map +0 -1
  92. package/dist/scripts/5201-7d3867d027-lite.chunk.js +0 -2
  93. package/dist/scripts/5201-7d3867d027-lite.chunk.js.map +0 -1
  94. package/dist/scripts/5595-10e586779d-lite.chunk.js +0 -2
  95. package/dist/scripts/5595-10e586779d-lite.chunk.js.map +0 -1
  96. package/dist/scripts/5896-5d2f32c59e-lite.chunk.js +0 -3
  97. package/dist/scripts/5896-5d2f32c59e-lite.chunk.js.map +0 -1
  98. package/dist/scripts/6181-50a39979ec-lite.chunk.js +0 -3
  99. package/dist/scripts/6181-50a39979ec-lite.chunk.js.map +0 -1
  100. package/dist/scripts/6455-2f45be17cf-lite.chunk.js +0 -2
  101. package/dist/scripts/6455-2f45be17cf-lite.chunk.js.map +0 -1
  102. package/dist/scripts/6623-ebbffb59b3-lite.chunk.js +0 -3
  103. package/dist/scripts/6623-ebbffb59b3-lite.chunk.js.map +0 -1
  104. package/dist/scripts/6919-cb2de57c2e-lite.chunk.js +0 -2
  105. package/dist/scripts/6919-cb2de57c2e-lite.chunk.js.map +0 -1
  106. package/dist/scripts/7267-c2d30dd339-lite.chunk.js +0 -2
  107. package/dist/scripts/7267-c2d30dd339-lite.chunk.js.map +0 -1
  108. package/dist/scripts/7434-c34ca23a21-lite.chunk.js +0 -2
  109. package/dist/scripts/7434-c34ca23a21-lite.chunk.js.map +0 -1
  110. package/dist/scripts/7443-7c72de0cb9-lite.chunk.js +0 -3
  111. package/dist/scripts/7443-7c72de0cb9-lite.chunk.js.map +0 -1
  112. package/dist/scripts/8022-0656cce655-lite.chunk.js +0 -2
  113. package/dist/scripts/8022-0656cce655-lite.chunk.js.map +0 -1
  114. package/dist/scripts/9013-adc5d3517a-lite.chunk.js +0 -2
  115. package/dist/scripts/9013-adc5d3517a-lite.chunk.js.map +0 -1
  116. package/dist/scripts/9155-87c9030ce9-lite.chunk.js +0 -2
  117. package/dist/scripts/9155-87c9030ce9-lite.chunk.js.map +0 -1
  118. package/dist/scripts/9264-750b3d6ea0-lite.chunk.js +0 -2
  119. package/dist/scripts/9264-750b3d6ea0-lite.chunk.js.map +0 -1
  120. package/dist/scripts/9894-bc34edcd67-lite.chunk.js +0 -3
  121. package/dist/scripts/9894-bc34edcd67-lite.chunk.js.map +0 -1
  122. package/dist/scripts/bundle-e02b7c5d7f.min.js +0 -3
  123. package/dist/scripts/bundle-e02b7c5d7f.min.js.map +0 -1
  124. package/dist/css/{6455-lite-fe0bc6d95f.chunk.css → 6455-lite-c07987d46c.chunk.css} +1 -1
  125. /package/dist/css/{9155-lite-447d345417.chunk.css → 8465-lite-447d345417.chunk.css} +0 -0
  126. /package/dist/scripts/{1857-d3af9d98eb-lite.chunk.js.LICENSE.txt → 5896-60133bfdad-lite.chunk.js.LICENSE.txt} +0 -0
  127. /package/dist/scripts/{5896-5d2f32c59e-lite.chunk.js.LICENSE.txt → 6173-7f9939c29e-lite.chunk.js.LICENSE.txt} +0 -0
  128. /package/dist/scripts/{6181-50a39979ec-lite.chunk.js.LICENSE.txt → 6181-9d7668c9e4-lite.chunk.js.LICENSE.txt} +0 -0
  129. /package/dist/scripts/{6623-ebbffb59b3-lite.chunk.js.LICENSE.txt → 6623-84b33c6856-lite.chunk.js.LICENSE.txt} +0 -0
  130. /package/dist/scripts/{7443-7c72de0cb9-lite.chunk.js.LICENSE.txt → 7443-4866d0c9ab-lite.chunk.js.LICENSE.txt} +0 -0
  131. /package/dist/scripts/{9894-bc34edcd67-lite.chunk.js.LICENSE.txt → 9894-0fba5cf702-lite.chunk.js.LICENSE.txt} +0 -0
  132. /package/dist/scripts/{bundle-e02b7c5d7f.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([[4667],{50690:(e,t,n)=>{n.d(t,{b:()=>r});var a=n(12788),r={renderInPortalIfExists:function(e,t){return t?(0,a.createPortal)(e,t):e}}},83657:(e,t,n)=>{n.d(t,{e:()=>s});var a=n(32735),r=n(91967),o=n(10874),i=n(36532),l=n(42735),c=n(86509);function s(e){var t=a.useMemo((function(){return e.actions.sort((function(e,t){return e.order-t.order}))}),[e.actions]),n=[],s=[];t.forEach((function(e){e.button?n.push(e):s.push(e)}));var d="d-flex";return e.className&&(d+=" ".concat(e.className)),n.length||s.length?a.createElement("div",{className:d},n.length?n.map((function(t,n){return a.createElement(a.Fragment,{key:n},function(){if(t.label){var n=r.q.isFunction(t.label)?t.label:function(){return a.createElement(a.Fragment,null,t.label)};return a.createElement(l.K,{appLink:t.appLink,href:t.href,onClick:t.onClick,svgName:t.svgName,svgSize:e.dropdownToggleSvgSize,className:t.className,tooltip:t.tooltip,showSpinner:t.showSpinner,analyticsData:t.analyticsData,analyticsOptions:t.analyticsOptions,openInNewTab:t.openInNewTab,disabled:t.disabled},n())}var c=a.createElement(o.h,{appLink:t.appLink,href:t.href,onClick:t.onClick,svgName:t.svgName,className:t.className,analyticsData:t.analyticsData,analyticsOptions:t.analyticsOptions,openInNewTab:t.openInNewTab,disabled:t.disabled,showBorder:t.showBorder,customSize:e.customSize,ariaLabel:t.tooltip});return t.tooltip?a.createElement(i.u,{title:t.tooltip,spanHack:!0},c):c}())})):a.createElement(a.Fragment,null),e.sortComponent&&e.sortComponent,s.length?a.createElement(c.m,{actions:s,dropdownToggleClassName:e.actionsDropdownClassName,dropdownToggleSvgSize:e.dropdownToggleSvgSize,fetchMore:e.fetchMore}):a.createElement(a.Fragment,null)):a.createElement(a.Fragment,null)}},86509:(e,t,n)=>{n.d(t,{m:()=>f});var a=n(32735),r=n(91967),o=n(81886),i=n(45157),l=n(49985),c=n(36848),s=n(83914),d=n(36532),m=n(35223);const u={dropdownToggle:"UCAnJ"};function p(){return a.createElement(a.Fragment,null,a.createElement("div",{style:{padding:"0.53125rem 1rem"}},a.createElement("div",{className:"partial-loading-background",style:{height:"1.0625rem",width:"8rem"}})),a.createElement("div",{style:{padding:"0.53125rem 1rem"}},a.createElement("div",{className:"partial-loading-background",style:{height:"1.0625rem",width:"12rem"}})),a.createElement("div",{style:{padding:"0.53125rem 1rem"}},a.createElement("div",{className:"partial-loading-background",style:{height:"1.0625rem",width:"11rem"}})),a.createElement("div",{style:{padding:"0.53125rem 1rem"}},a.createElement("div",{className:"partial-loading-background",style:{height:"1.0625rem",width:"9rem"}})))}function g(e){var t="dropdown-item";return e&&(t+=" ".concat(e)),t}function v(e){var t=r.q.isFunction(e.action.label)?e.action.label:function(){return a.createElement(a.Fragment,null,e.action.label)};if(e.action.appLink)return a.createElement(c.F,{appLink:e.action.appLink,onClick:e.action.onClick,className:g(e.action.className),analyticsData:e.action.analyticsData,analyticsOptions:e.action.analyticsOptions,openInNewTab:e.action.openInNewTab,disabled:e.action.disabled},e.action.svgName&&a.createElement(s.x,{svgName:e.action.svgName,className:"d-inline-block svg-container me-2 align-middle"}),a.createElement("span",{className:"align-middle"},t()));function n(t){t.preventDefault(),e.action.analyticsData&&e.action.analyticsOptions&&l.k.logUserAction(e.action.analyticsData,e.action.analyticsOptions),r.q.isFunction(e.action.onClick)&&e.action.onClick(),e.action.href&&o.Q.Ab.PageLoad(e.action.href,e.action.openInNewTab)}return e.action.href?a.createElement("a",{className:g(e.action.className),onClick:n,href:e.action.href},e.action.svgName&&a.createElement(s.x,{svgName:e.action.svgName,className:"d-inline-block svg-container me-2 align-middle"}),a.createElement("span",{className:"align-middle"},t())):a.createElement("span",{className:"cursor-pointer ".concat(g(e.action.className)),onClick:n,role:"button",tabIndex:0,onKeyDown:function(e){return"Enter"===e.key&&n(e)}},e.action.svgName&&a.createElement(s.x,{svgName:e.action.svgName,className:"d-inline-block svg-container me-2"}),t())}function f(e){if(!e.actions||!e.actions.length)return a.createElement(a.Fragment,null);var t=e.actions.some((function(e){return e.lazyPlaceholder})),n="dropdown";e.className&&(n+=" ".concat(e.className));var r,o="actions-dropdown-".concat(i.Y.getRandomInt()),l="dropdown-toggle px-0 ".concat(u.dropdownToggle);return e.dropdownToggleClassName&&(l+=" ".concat(e.dropdownToggleClassName)),a.createElement("div",{className:n},a.createElement("button",{className:l,type:"button",id:o,"data-bs-toggle":"dropdown","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false","aria-label":"More actions dropdown",onClick:t?e.fetchMore:null},a.createElement(s.x,{svgName:m.vn.More,size:e.dropdownToggleSvgSize})),a.createElement("ul",{className:"dropdown-menu dropdown-menu-end dropdown-menu-right font-size-normal","aria-labelledby":o},t?a.createElement(p,null):e.actions.map((function(e,t){var n=void 0!==r&&r!==e.group;return r=e.group,e.tooltip?a.createElement("li",{key:t},n&&a.createElement("hr",{className:"dropdown-divider",role:"separator"}),a.createElement(d.u,{title:e.tooltip,spanHack:!0},a.createElement(v,{action:e}))):a.createElement("li",{key:t},n&&a.createElement("hr",{className:"dropdown-divider",role:"separator"}),a.createElement(v,{action:e}))}))))}f.defaultProps={dropdownToggleClassName:"btn btn-light",dropdownToggleSvgSize:s.S.Small}},44522:(e,t,n)=>{n.d(t,{p:()=>L,v:()=>T});var a=n(32735),r=n(110),o=n(50690),i=n(84963),l=n(73679),c=n(83657),s=n(23481),d=n(36848),m=n(83914),u=n(35223),p="shared.backButton";function g(e){var t=Object.assign({textShadow:!0},e),n=t.backToName,r=t.appLink,o=t.color,i=t.extraClasses,l=t.textShadow,c=n?s.T.getPhrase(p,"backTo",{backToName:n}):s.T.getPhrase(p,"back"),g="black"===o?"":"text-white",v=l?"text-shadow":"";return a.createElement(d.F,{appLink:r,className:"d-inline-flex align-items-center h5 mb-0 ".concat(i," ").concat(g," ").concat(v)},a.createElement(m.x,{svgName:u.vn.ChevronLeft,size:m.S.Medium}),a.createElement("span",{className:"ms-1"},c))}g.defaultProps={color:"black",extraClasses:""};var v=n(36518),f=n(83345),b=n(7733),h=n(10587),E=n(94232),y=n(54610),N=n(79967),k=n(9085),w=n(67453);const C={bannerContent:"sSCTB",actionsContainer:"Z5WI2",bannerContentWithLogo:"rgs7Q",container:"M51HJ",logoContainer:"vkeJk",logoContainerLeft:"M3U9B",logoHeading:"EtRwC",specialEventContainer:"rOxDc",headingLarge:"_8pnV",heading:"JXVBH"};var x="".concat(h.y[y.__.Banners].width,":").concat(h.y[y.__.Banners].height);function S(e){return e.length<160?"h1":C.headingLarge}var L=a.memo((function(e){var t,n,s,d,m=e.heading,u=e.banner,p=e.imageCdnUrl,h=e.actions,L=e.sortComponent,T=e.blockColourClass,D=e.specialEvent,A=a.useContext(E.n),I=(0,N.k)().xxl?1920:1200,O=a.useMemo((function(){if(!D||e.showComingSoon)return!1;var t=r.O.format(new Date,"YYYY-MM-DD");return D.endDate?D.startDate<=t&&D.endDate>=t:D.startDate===t}),[D]),P=e.imageOptions||{width:I,ratio:x,resizeType:y.Nq.Cover},M=!!u&&!!p&&w.j.createBannerUrl(u,{fallbackBaseUrl:p,fallbackCategoryName:m,type:y.__.Banners},P),B={className:"banner banner-header ".concat(e.bannerClassName),style:M?{backgroundImage:"url('".concat(M,"')")}:{}};!u&&T&&(delete B.style,B.className+=" ".concat(T));var F=e.detailsComponent,j=(0,k.x)(e.heading,b.o);return o.b.renderInPortalIfExists(a.createElement("header",Object.assign({},B),a.createElement("div",{className:"container ".concat(C.container," position-relative inner-banner")},e.backButtonAppLink&&a.createElement("div",{className:"pt-3"},a.createElement(g,{appLink:e.backButtonAppLink,backToName:e.backButtonText,extraClasses:e.backButtonClasses,color:"white"})),a.createElement("div",{className:"".concat(e.alignLogoLeft?"position-absolute top-50 start-0 translate-middle-y w-100 ps-4":"".concat(C.bannerContent," px-2 ").concat((null===(t=e.logo)||void 0===t?void 0:t.url)?C.bannerContentWithLogo:""))},!!D&&a.createElement("div",{className:"position-relative ".concat(C.specialEventContainer)},a.createElement(l.s,{body:{type:D.endDate?"range":"day",text:D.endDate?"".concat(r.O.format(D.startDate,"DD"),"-").concat(r.O.format(D.endDate,"DD")):r.O.format(D.startDate,"DD")},month:function(e){return e.endDate?r.O.isSame(e.startDate,e.endDate,"month")?r.O.format(e.startDate,"MMMM"):"".concat(r.O.format(e.startDate,"MMM")," - ").concat(r.O.format(e.endDate,"MMM")):r.O.format(e.startDate,"MMMM")}(D),theme:e.calendarTheme})),a.createElement("div",null,O&&a.createElement("div",{className:"rounded-pill py-1 px-2 my-1 me-1 fw-semibold bg-light-blue lh-1 d-inline-block"},a.createElement(f.x,{namespace:"shared.bannerHeader",phrase:"onToday"})),e.showComingSoon&&a.createElement(i.r,{className:"pe-2 fw-semibold mb-1 rounded-pill justify-content-start text-nowrap"}),a.createElement("div",{className:"d-flex align-items-center"},e.alignLogoLeft&&(null===(n=e.logo)||void 0===n?void 0:n.url)&&a.createElement("div",{className:"".concat(C.logoContainerLeft," d-none d-md-block rounded-circle overflow-hidden me-3 ").concat(j)},a.createElement(v.w,{src:w.j.createUrl(null===(s=e.logo)||void 0===s?void 0:s.url,{size:y.h2.Medium}),style:{backgroundColor:e.logoBgColour}})),a.createElement("h1",{className:"text-white text-shadow pe-3 position-static ".concat(C.heading," ").concat(S(m)," ").concat(e.alignLogoLeft?"w-50":"")},m,F&&a.createElement(F,null)))),!!h&&a.createElement("div",{className:C.actionsContainer},a.createElement(c.e,{actions:h,sortComponent:L,actionsDropdownClassName:e.actionsDropdownClassName}))),!e.alignLogoLeft&&!!(null===(d=e.logo)||void 0===d?void 0:d.url)&&a.createElement("div",{className:C.logoContainer},a.createElement("img",{src:w.j.createUrl(e.logo.url,{size:y.h2.Small}),className:"rounded-circle"})))),null==A?void 0:A.container)}),(function(e,t){var n,a;return e.actions===t.actions&&e.heading===t.heading&&(null===(n=e.logo)||void 0===n?void 0:n.url)===(null===(a=t.logo)||void 0===a?void 0:a.url)}));function T(){var e=a.useContext(E.n);return o.b.renderInPortalIfExists(a.createElement("div",{className:"partial-banner partial-loading-background ".concat(C.banner)}),null==e?void 0:e.container)}},49935:(e,t,n)=>{n.d(t,{Oo:()=>v,b2:()=>f});var a=n(32735),r=n(23481),o=n(36848),i=n(86764),l=n(3747),c=n(5859),s=n(35223),d=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,o,i,l=[],c=!0,s=!1;try{if(o=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(a=o.call(n)).done)&&(l.push(a.value),l.length!==t);c=!0);}catch(e){s=!0,r=e}finally{try{if(!c&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(s)throw r}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return u(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)?u(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 u(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 p=r.T.encloseNamespace("shared.breadcrumbComponent"),g=a.forwardRef((function(e,t){var n=e.breadcrumb,r=n.name,i=n.appLink,l=n.active,c=e.withBackIcon,m=r,u=null;return m.length>48&&(m=r.slice(0,48)+"...",u=r),a.createElement("li",{className:"breadcrumb-item".concat(l?" active":""),title:u},l?a.createElement("strong",null,m):a.createElement(o.F,{appLink:i,ref:t},c&&a.createElement(d.x,{svgName:s.vn.ChevronLeft,size:d.S.Small}),a.createElement("span",{className:c?"ms-2":""},m)))})),v=function(e){var t=e.breadcrumbs,n=(0,l.a)(i.r.XS),r=(null==t?void 0:t.length)||0,o=m(a.useState(!1),2),c=o[0],s=o[1],d=m(a.useState(!1),2),u=d[0],v=d[1],f=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;u&&(null===(e=f.current)||void 0===e||e.focus())}),[f.current,u]),!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(g,{breadcrumb:t[r-2],withBackIcon:!0})));var b=a.createElement(g,{breadcrumb:t[0]}),h=r>2?a.createElement(g,{breadcrumb:t[1]}):a.createElement(a.Fragment,null),E=r>3?a.createElement(g,{breadcrumb:t[r-2]}):a.createElement(a.Fragment,null),y=r>1?a.createElement(g,{breadcrumb:t[r-1]}):a.createElement(a.Fragment,null),N=t.slice(2,r-2);return a.createElement("nav",{"aria-label":"breadcrumb"},a.createElement("ol",{className:"breadcrumb m-0 p-0"},b,h,c?a.createElement("li",{className:"breadcrumb-item"},a.createElement("button",{className:"btn-link",onClick:function(){s(!1),v(!0)},"aria-label":p("expand")},"...")):N.map((function(e,t){return a.createElement(g,{key:t,breadcrumb:e,ref:0===t?f:null})})),E,y))},f=a.memo((function(e){var t=e.numItems,n=void 0===t?3:t;return(0,l.a)(i.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"},c.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"}}))}))))}))},88513:(e,t,n)=>{n.d(t,{B:()=>g});var a=n(32735),r=n(23481),o=n(65858),i=n(36848),l=n(83914),c=n(17082),s=n(35223),d=n(49542);const m={seeMore:"yv0FS"};var u=r.T.encloseNamespace("shared.widgetHeader");function p(e){return a.createElement("div",{className:"ms-3 ".concat(m.seeMore)},a.createElement(i.F,{appLink:e.appLink,analyticsData:e.analyticsData,analyticsOptions:Object.assign(Object.assign({location:o.LZ.SlidingList},e.analyticsOptions),{descriptor:o._S.SeeMore}),className:"text-decoration-none ".concat(e.appLink?"curated-widget-link":"")},a.createElement("p",{className:"hover-text-underline text-dark curated-widget-heading"},u("seeAll"))))}function g(e){var t,n,r=!!e.description;if(!e.name&&!e.description)return a.createElement(a.Fragment,null);var o=d.d.isBelowContentMinimum(e.content,e.widgetTypeId),m=null!==(n=null===(t=c.u[e.widgetTypeId])||void 0===t?void 0:t.minContent)&&void 0!==n?n:0;return a.createElement("div",{className:"curated-widget-header"},a.createElement("div",{className:"d-flex justify-content-between"},!!e.name&&a.createElement("div",{className:"d-flex align-items-center"},a.createElement(i.F,{appLink:e.appLink,analyticsData:e.analyticsData,className:"text-decoration-none ".concat(e.appLink?"curated-widget-link text-reset":""),onClick:e.onClick},a.createElement("h2",{className:"h4 curated-widget-heading"},e.isPreviewing&&o&&a.createElement(l.x,{svgName:s.vn.WarningOutline,title:"Widget is below the minimum content threshold of ".concat(m," and won't be displayed."),tooltipSpanHack:!0,tooltipSpanHackClassName:"d-inline text-danger me-1"}),e.name)),!!a.isValidElement(e.badgeComponent)&&e.badgeComponent),!!e.appLink&&!r&&!!e.showSeeMoreLink&&a.createElement(p,Object.assign({},e))),r&&a.createElement("div",{className:"d-flex justify-content-between align-items-end"},a.createElement("p",{className:"description curated-widget-description"},a.createElement("span",null,e.description)),!!e.appLink&&!!e.showSeeMoreLink&&a.createElement(p,Object.assign({},e))))}},29420:(e,t,n)=>{n.d(t,{T:()=>s});var a=n(32735),r=n(82182);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){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,o,i,l=[],c=!0,s=!1;try{if(o=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(a=o.call(n)).done)&&(l.push(a.value),l.length!==t);c=!0);}catch(e){s=!0,r=e}finally{try{if(!c&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(s)throw r}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return l(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)?l(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 l(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 c=400;function s(e){var t=e.type,n=e.state,l=e.containerRef,s=e.mediaQuery,d=i(a.useState(!1),2),m=d[0],u=d[1],p=i(a.useState({}),2),g=p[0],v=p[1],f=i(a.useState(null),2),b=f[0],h=f[1],E=a.useMemo((function(){return r.V.isTouchScreen()}),[]);return a.useEffect((function(){"dynamic"===t&&l.current&&n.containerLeftPosition&&!E&&setTimeout((function(){return function(){var e,t=n;if(null===(e=l.current)||void 0===e?void 0:e.children){var a=Array.from(l.current.children).reduce((function(e,n){var a,r,i,l=null==n?void 0:n.getBoundingClientRect(),c=l.left<t.containerRightPosition&&l.right>t.containerLeftPosition;return Object.assign(Object.assign({},e),(a={},r=n.id,i=c?{"aria-hidden":!1}:{"aria-hidden":!0,inert:"true"},(r=function(e){var t=function(e){if("object"!=o(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=o(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==o(t)?t:t+""}(r))in a?Object.defineProperty(a,r,{value:i,enumerable:!0,configurable:!0,writable:!0}):a[r]=i,a))}),{});v(a)}}()}),c+50)}),[l.current,s,n.offset,n.containerLeftPosition]),{isTabbing:m,onFocusWidget:function(e){document.querySelector(".user-is-tabbing")&&(u(!0),h(e))},onBlurWidget:function(){document.querySelector(".user-is-tabbing")||(u(!1),h(null))},getFixedAttributes:function(e){var t=n;return E||e>=t.offset-t.viewableItems&&e<t.offset?{"aria-hidden":!1}:{inert:"true","aria-hidden":!0}},dynamicAttributes:g,focusNext:function(){setTimeout((function(){if(l.current){for(var e=l.current.querySelectorAll("li[aria-hidden]"),t=null,n=b+1;n<e.length&&!t;n++)t=e[n].querySelector('a[tabindex="0"]');t&&t.focus()}}),c+100)},focusPrev:function(){setTimeout((function(){if(l.current){for(var e=l.current.querySelectorAll("li[aria-hidden]"),t=null,n=b-1;n>=0&&!t;n--)t=e[n].querySelector('a[tabindex="0"]');t&&t.focus()}}),c+100)}}}},43872:(e,t,n)=>{n.d(t,{V:()=>d});var a=n(32735),r=n(82182),o=n(31069),i=n(91967),l=new Image;l.src="data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=";var c=function(e){e.dataTransfer.setDragImage&&i.q.isFunction(e.dataTransfer.setDragImage)&&e.dataTransfer.setDragImage(l,0,0)},s=r.V.isTouchScreen(),d=a.forwardRef((function(e,t){var n,r,i,l,d=e.children,m=e.positionType,u=e.onDrag,p=e.onDragEnd,g=e.onTouchMove,v=e.onTouchEnd,f=e.percentageDragged,b=e.position,h=void 0===b?0:b;return a.createElement("ul",Object.assign({className:"list-unstyled d-flex flex-nowrap position-relative w-100 mb-0",style:(r=h,i=m,l=f,i===o.C.Percentage&&l&&(r-=l),{transform:"translate3d(".concat(r).concat(i,", 0px, 0px)"),transition:"transform .4s ease-in-out"}),ref:t},(n={},u&&p&&(n.draggable=!0,n.onDragEnd=p,n.onDragStart=c,n.onDragOver=u),g&&v&&s&&(n.onTouchMoveCapture=g,n.onTouchEndCapture=v),n)),d)}))},16930:(e,t,n)=>{n.d(t,{W:()=>m,f:()=>s});var a=n(32735),r=n(23481),o=n(83914),i=n(35223);const l="VSAPU",c="kgeXh";var s,d=r.T.encloseNamespace("shared.widgetButton");!function(e){e[e.Left=0]="Left",e[e.Right=1]="Right"}(s||(s={}));var m=a.memo((function(e){var t,n,r,m=e.direction===s.Left,u=m?i.vn.ChevronLeft:i.vn.ChevronRight;return e.hide?a.createElement(a.Fragment,null):a.createElement("div",{className:"".concat("_ejId"," ").concat(e.containerClassName?e.containerClassName:""),style:"videos"===(null===(n=e.state)||void 0===n?void 0:n.contents)?{paddingBottom:56.25/(null===(r=e.state)||void 0===r?void 0:r.viewableItems)+"%"}:{height:"100%"}},e.useGradientBackdrop&&a.createElement("div",{className:m?"".concat("Pt3nx"," ").concat(e.leftGradientClassName):"".concat("ZuAif"," ").concat(e.rightGradientClassName)}),!e.hideExtendedClickableArea&&a.createElement("button",{onClick:e.onClick,className:"".concat("AtsWP"," ").concat(m?l:c),tabIndex:-1}),a.createElement("button",{className:"".concat((t="BVcIS",t+=m?" ".concat(l," ").concat(e.leftButtonClassName):" ".concat(c," ").concat(e.rightButtonClassName))," ").concat("gAsE9"," ").concat(e.className||""),onClick:e.onClick,"aria-label":d(m?"previous":"next")},e.hoverText&&a.createElement("span",{className:"ps-3 pe-2 ".concat("APA36")},e.hoverText),a.createElement(o.x,{svgName:u,size:o.S.Medium,className:"svg-container d-inline-block ".concat("Ev4hr")})))}))},31069:(e,t,n)=>{var a;n.d(t,{C:()=>a}),function(e){e.Percentage="%",e.Pixels="px"}(a||(a={}))},10841:(e,t,n)=>{var a;n.d(t,{n:()=>a}),function(e){e.Init="init",e.Next="next",e.Previous="previous",e.Resize="resize",e.Drag="drag",e.Update="update",e.JumpToIndex="jump-to-index"}(a||(a={}))},81514:(e,t,n)=>{n.d(t,{V:()=>o});var a=n(86764),r=n(3747);function o(){var e=(0,r.a)(a.r.XS),t=(0,r.a)(a.r.SM),n=(0,r.a)(a.r.MD),o=(0,r.a)(a.r.LG),i=(0,r.a)(a.r.XL),l=(0,r.a)(a.r.XXL),c=a.r.LG;return e&&(c=a.r.XS),t&&(c=a.r.SM),n&&(c=a.r.MD),o&&(c=a.r.LG),i&&(c=a.r.XL),l&&(c=a.r.XXL),c}},97461:(e,t,n)=>{n.r(t),n.d(t,{PresentationTopicsView:()=>z});var a=n(32735),r=n(23481),o=n(20354),i=n(65858),l=n(36848),c=n(44522),s=n(49935),d=n(10874),m=n(83345),u=n(47770),p=n(30662),g=n(65163),v=n(9513),f=n(54610),b=n(12754),h=n(78479),E=n(42308),y=n(21750),N=n(39151),k=n(79967),w=n(15311),C=n(79612),x=n(37802),S=n(35223),L=n(87114),T=n(14070),D=n(97291),A=n(86698),I=n(33192),O=n(23923),P=(n(28400),n(34181)),M=function(e){return function(t){return(null==t?void 0:t.id)?P.L.getAppLink(t,e||{}):null}};const B={classificationPane:"ftCMX"};var F="subjects.presentationTopics",j=r.T.encloseNamespace(F);function z(e){var t,n,r,P,z,U,_,R,q,X=(0,x.r)(null).hasTopicDirectories,H=(0,k.k)(),V=o.a.useBasicFetch(N.L.config()),W=(0,A.y)(),Q=W.availablePresentations,G=W.activePresentation,J=W.hasPresentationsLoaded,Y=W.canAccessPresentation,Z=(0,O.B)(),K=(0,w.r)(),$=e.queryParams.presentationId||(null==G?void 0:G.id),ee=o.a.useBasicFetch($&&y.x.presentationById($)),te=ee.hasCompleted&&J,ne={name:L.i.getExploreAllTopicsTitle(null===(t=ee.data)||void 0===t?void 0:t.name,null==Q?void 0:Q.length),banner:{url:L.i.getPresentationLevelImage(null===(n=ee.data)||void 0===n?void 0:n.learningLevel,"topic-banner")}},ae=o.a.useBasicFetch(te&&y.x.topLevelTopics($||(null===(r=ee.data)||void 0===r?void 0:r.id))),re=j("pageTitleSubject",{title:null===(P=ee.data)||void 0===P?void 0:P.name});(0,C.M)({title:re,description:j("pageDescription",{title:null===(z=ee.data)||void 0===z?void 0:z.name}),canonicalLink:I.f.getCanonicalLink(),allowIndexing:I.f.allowIndexing()});var oe=M();var ie=!!V.data&&!!Q&&ae.data,le=Y(null===(U=ee.data)||void 0===U?void 0:U.id),ce={presentationId:null===(_=ee.data)||void 0===_?void 0:_.id,presentationName:null===(R=ee.data)||void 0===R?void 0:R.name,widgetId:E.z.Classifications,templateId:h.f.CoverFixedPillListLarge},se=X?p.q:u.K;return a.createElement("main",{className:"bg-white px-4"},ie?a.createElement(c.p,{heading:null==ne?void 0:ne.name,banner:null==ne?void 0:ne.banner,imageCdnUrl:V.data.imageCdnUrl,imageOptions:{size:f.h2.Large}}):a.createElement(c.v,null),a.createElement("div",{className:"py-3 mb-3 ".concat(le?"border-bottom":"")},le?ie?a.createElement(s.Oo,{breadcrumbs:function(){var e;return[{name:j("discover"),appLink:{application:D.O.DASHBOARD,action:T.e.Dashboard.HOME}},{name:L.i.getExploreAllTopicsBreadcrumb(null===(e=ee.data)||void 0===e?void 0:e.name,null==Q?void 0:Q.length),active:!0}]}()}):a.createElement(s.b2,null):a.createElement(a.Fragment,null)),a.createElement("div",{className:B.classificationPane},ie?a.createElement(se,{id:null===(q=ee.data)||void 0===q?void 0:q.id,name:"",description:"",analyticsData:ce,content:null==ae?void 0:ae.data,appLinks:{classification:oe},hasTableOfContents:!1,settings:{hasTopicDirectories:X},isTertiaryCustomerWithoutExchange:Z&&!(null==K?void 0:K.hasProduct(b.x.Exchange)),onToggleFollowClassification:function(){}}):a.createElement(g.QL,{partialLoadingComponent:v.Qh}),ie&&X&&(null==Q?void 0:Q.length)>1&&a.createElement("ul",{className:"pt-3 list-unstyled"},Q.filter((function(e){var t;return e.id!==(null===(t=ee.data)||void 0===t?void 0:t.id)})).map((function(e){var t,n,r;return a.createElement("li",{key:e.id},a.createElement(l.F,{className:"d-flex justify-content-between align-items-center text-white p-3 mb-3 rounded-3 ".concat(B.link," ").concat(L.i.getMappedPresentationBackgroundColourClass(null==e?void 0:e.learningLevel)),appLink:{application:D.O.SUBJECT,action:T.e.Subjects.PRESENTATION_TOPICS,params:{presentationId:e.id}},appLinkOptions:{middlewareOptions:{presentationSlug:e.vanitySlug}},analyticsData:{id:e.id,name:e.name,description:e.description,currentPresentationId:null===(t=ee.data)||void 0===t?void 0:t.id,currentPresentationName:null===(n=ee.data)||void 0===n?void 0:n.name,currentPresentationDescription:null===(r=ee.data)||void 0===r?void 0:r.description},analyticsOptions:{entity:i.py.Presentation,actionType:i.Vw.Click,location:i.LZ.PresentationClassifications}},a.createElement("div",{className:"h4 text-shadow mb-0"},Q.length>2||H.sm||H.xs?a.createElement(m.x,{namespace:F,phrase:"multiPresentationBanner",options:{name:e.name}}):a.createElement(m.x,{namespace:F,phrase:"singlePresentationBanner",options:{name:e.name}})),a.createElement(d.h,{svgName:H.xs?S.vn.Sparkle:S.vn.School,openInNewTab:!0,className:"btn btn-outline-dark",onClick:null},a.createElement(m.x,{namespace:F,phrase:H.xs?"explore":"changeTo",options:{name:e.name}}))))})))))}}}]);
2
+ //# sourceMappingURL=4667-5101904582-lite.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/4667-5101904582-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/common/src/react/utils/PortalHelper.ts","file:///app/packages/libs/shared/src/components/actions/Actions.tsx","file:///app/packages/libs/shared/src/components/actions/actions.scss","file:///app/packages/libs/shared/src/components/actions/ActionsDropdown.tsx","file:///app/packages/libs/shared/src/components/back-button/BackButton.tsx","file:///app/packages/libs/shared/src/components/banner-header/banner-header.scss","file:///app/packages/libs/shared/src/components/banner-header/BannerHeader.tsx","file:///app/packages/libs/shared/src/components/breadcrumbs/Breadcrumbs.tsx","file:///app/packages/libs/shared/src/components/widgets/curated-widgets/components/header/widget-header.scss","file:///app/packages/libs/shared/src/components/widgets/curated-widgets/components/header/WidgetHeader.tsx","file:///app/packages/libs/shared/src/components/widgets/hooks/useWidgetKeyboard.ts","file:///app/packages/libs/shared/src/utils/DragHelper.ts","file:///app/packages/libs/shared/src/components/widgets/sliding-list/SlidingListContainer.tsx","file:///app/packages/libs/shared/src/components/widgets/widget-button/widget-button.scss","file:///app/packages/libs/shared/src/components/widgets/widget-button/WidgetButton.tsx","file:///app/packages/libs/shared/src/enums/CssMeasurement.ts","file:///app/packages/libs/shared/src/enums/WidgetInteraction.ts","file:///app/packages/libs/shared/src/hooks/UseGetMediaQueryString.ts","file:///app/packages/projects/lite/src/apps/subjects/utils/ClassificationAppLinks.ts","file:///app/packages/projects/lite/src/apps/subjects/views/presentation-topics/presentation-topics.scss","file:///app/packages/projects/lite/src/apps/subjects/views/presentation-topics/PresentationTopicsView.tsx"],"sourcesContent":["import React from 'react';\nimport { createPortal } from 'react-dom';\n\nexport const PortalHelper = {\n renderInPortalIfExists(component: React.ReactElement, portalContainer: Element | null): React.ReactElement {\n if (portalContainer)\n return createPortal(component, portalContainer);\n\n return component;\n }\n};","import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { BaseObject } from 'libs/shared/interfaces';\n\nimport { ActionButton } from './ActionButton';\nimport { ActionsDropdown } from './ActionsDropdown';\n\nexport interface ActionOptions {\n order?: number;\n label?: string | (() => JSX.Element);\n appLink?: Core.AppLink;\n href?: string;\n onClick?: () => void;\n svgName?: string;\n className?: string;\n button?: boolean; // If true, a button will be rendered. Otherwise the action will be rendered in the dropdown.\n tooltip?: string;\n showSpinner?: boolean;\n showBorder?: boolean; // only works for button without text label\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n disabled?: boolean;\n openInNewTab?: boolean; // Only used if appLink or href is provided\n group?: string;\n lazyPlaceholder?: boolean;\n}\n\nexport type ActionGenerator = (obj: BaseObject) => ActionOptions[];\n\ninterface ActionsProps {\n actions: ActionOptions[];\n className?: string;\n actionsDropdownClassName?: string;\n dropdownToggleSvgSize?: SvgContainerSize;\n sortComponent?: JSX.Element;\n customSize?: boolean;\n fetchMore?: () => void;\n}\n\nexport function Actions(props: ActionsProps): JSX.Element {\n const orderedActions = React.useMemo(() => props.actions.sort((a, b) => a.order - b.order), [props.actions]);\n\n const buttonActions: ActionOptions[] = [];\n const moreActions: ActionOptions[] = [];\n\n orderedActions.forEach(a => {\n if (a.button)\n buttonActions.push(a);\n else\n moreActions.push(a);\n });\n\n let className = 'd-flex';\n\n if (props.className)\n className += ` ${props.className}`;\n\n if (!buttonActions.length && !moreActions.length)\n return <></>;\n\n return (\n <div className={className}>\n {buttonActions.length ? buttonActions.map((a, idx) => (\n <React.Fragment key={idx}>\n {(() => {\n if (a.label) {\n const label = FunctionHelper.isFunction(a.label)\n ? a.label\n : () => <>{a.label}</>;\n\n return (\n <ActionButton\n appLink={a.appLink}\n href={a.href}\n onClick={a.onClick}\n svgName={a.svgName}\n svgSize={props.dropdownToggleSvgSize}\n className={a.className}\n tooltip={a.tooltip}\n showSpinner={a.showSpinner}\n analyticsData={a.analyticsData}\n analyticsOptions={a.analyticsOptions}\n openInNewTab={a.openInNewTab}\n disabled={a.disabled}\n >\n {label()}\n </ActionButton>\n );\n }\n\n const iconButton = (\n <IconButton\n appLink={a.appLink}\n href={a.href}\n onClick={a.onClick}\n svgName={a.svgName}\n className={a.className}\n analyticsData={a.analyticsData}\n analyticsOptions={a.analyticsOptions}\n openInNewTab={a.openInNewTab}\n disabled={a.disabled}\n showBorder={a.showBorder}\n customSize={props.customSize}\n ariaLabel={a.tooltip}\n />\n );\n\n return a.tooltip\n ? <Tooltip title={a.tooltip} spanHack>{iconButton}</Tooltip>\n : iconButton;\n })()}\n </React.Fragment>\n )) : <></>}\n {props.sortComponent && props.sortComponent}\n {moreActions.length ? (\n <ActionsDropdown\n actions={moreActions}\n dropdownToggleClassName={props.actionsDropdownClassName}\n dropdownToggleSvgSize={props.dropdownToggleSvgSize}\n fetchMore={props.fetchMore}\n />\n ) : <></>}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"dropdownToggle\":\"UCAnJ\"};","import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Core } from 'libs/common/core';\nimport { RandomHelper } from 'libs/common/react/utils/RandomHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ActionOptions } from './Actions';\n\nimport styles from './actions.scss';\n\nfunction LazyDropdownItems(): JSX.Element {\n return (\n <>\n <div style={{ padding: '0.53125rem 1rem' }}>\n <div className='partial-loading-background' style={{ height: '1.0625rem', width: '8rem' }}></div>\n </div>\n <div style={{ padding: '0.53125rem 1rem' }}>\n <div className='partial-loading-background' style={{ height: '1.0625rem', width: '12rem' }}></div>\n </div>\n <div style={{ padding: '0.53125rem 1rem' }}>\n <div className='partial-loading-background' style={{ height: '1.0625rem', width: '11rem' }}></div>\n </div>\n <div style={{ padding: '0.53125rem 1rem' }}>\n <div className='partial-loading-background' style={{ height: '1.0625rem', width: '9rem' }}></div>\n </div>\n </>\n );\n}\n\nfunction getDropdownItemClassName(actionClassName?: string): string {\n let className = 'dropdown-item';\n\n if (actionClassName)\n className += ` ${actionClassName}`;\n\n return className;\n}\n\nexport type DropdownActionOptions = Omit<ActionOptions, 'button'>;\n\ninterface ActionsDropdownItemProps {\n action: DropdownActionOptions;\n}\n\nfunction ActionsDropdownItem(props: ActionsDropdownItemProps): React.ReactElement {\n const label = FunctionHelper.isFunction(props.action.label)\n ? props.action.label\n : () => <>{props.action.label}</>;\n\n if (props.action.appLink)\n return (\n <AppLink\n appLink={props.action.appLink}\n onClick={props.action.onClick}\n className={getDropdownItemClassName(props.action.className)}\n analyticsData={props.action.analyticsData}\n analyticsOptions={props.action.analyticsOptions}\n openInNewTab={props.action.openInNewTab}\n disabled={props.action.disabled}\n >\n {props.action.svgName && <SvgContainer svgName={props.action.svgName} className='d-inline-block svg-container me-2 align-middle' />}\n <span className='align-middle'>{label()}</span>\n </AppLink>\n );\n\n function onClick(e: React.MouseEvent | React.KeyboardEvent): void {\n e.preventDefault();\n\n if (props.action.analyticsData && props.action.analyticsOptions)\n AnalyticsHelper.logUserAction(props.action.analyticsData, props.action.analyticsOptions);\n\n if (FunctionHelper.isFunction(props.action.onClick))\n props.action.onClick();\n\n if (props.action.href)\n Core.LocationUtils.PageLoad(props.action.href, props.action.openInNewTab);\n }\n\n if (props.action.href) {\n return (\n <a\n className={getDropdownItemClassName(props.action.className)}\n onClick={onClick}\n href={props.action.href}\n >\n {props.action.svgName && <SvgContainer svgName={props.action.svgName} className='d-inline-block svg-container me-2 align-middle' />}\n <span className='align-middle'>{label()}</span>\n </a>\n );\n }\n\n return (\n <span\n className={`cursor-pointer ${getDropdownItemClassName(props.action.className)}`}\n onClick={onClick}\n role='button'\n tabIndex={0}\n onKeyDown={(e: React.KeyboardEvent) => e.key === 'Enter' && onClick(e)}\n >\n {props.action.svgName && <SvgContainer svgName={props.action.svgName} className='d-inline-block svg-container me-2' />}\n {label()}\n </span>\n );\n}\n\ninterface ActionsDropdownProps {\n actions: DropdownActionOptions[];\n className?: string;\n dropdownToggleClassName?: string;\n dropdownToggleSvgSize?: SvgContainerSize;\n fetchMore?: () => void;\n}\n\nActionsDropdown.defaultProps = {\n dropdownToggleClassName: 'btn btn-light',\n dropdownToggleSvgSize: SvgContainerSize.Small\n};\n\nexport function ActionsDropdown(props: ActionsDropdownProps): React.ReactElement {\n if (!props.actions || !props.actions.length)\n return <></>;\n\n const isLazy = props.actions.some(a => a.lazyPlaceholder);\n\n let className = 'dropdown';\n\n if (props.className)\n className += ` ${props.className}`;\n\n // Generate unique id to avoid collisions.\n const dropdownToggleId = `actions-dropdown-${RandomHelper.getRandomInt()}`;\n\n let dropdownToggleClassName = `dropdown-toggle px-0 ${styles.dropdownToggle}`;\n\n if (props.dropdownToggleClassName)\n dropdownToggleClassName += ` ${props.dropdownToggleClassName}`;\n\n let currentGroup: string;\n\n return (\n <div className={className}>\n <button\n className={dropdownToggleClassName}\n type='button'\n id={dropdownToggleId}\n data-bs-toggle='dropdown'\n data-toggle='dropdown'\n aria-haspopup='true'\n aria-expanded='false'\n aria-label={'More actions dropdown'}\n onClick={isLazy ? props.fetchMore : null}\n >\n <SvgContainer svgName={cvSvgLibrary.More} size={props.dropdownToggleSvgSize} />\n </button>\n <ul className='dropdown-menu dropdown-menu-end dropdown-menu-right font-size-normal' aria-labelledby={dropdownToggleId}>\n {isLazy ?\n <LazyDropdownItems /> :\n props.actions.map((a, idx) => {\n const showDivider = currentGroup !== undefined && currentGroup !== a.group;\n currentGroup = a.group;\n \n if (a.tooltip) {\n return (\n <li key={idx}>\n {showDivider && <hr className='dropdown-divider' role='separator'></hr>}\n <Tooltip title={a.tooltip} spanHack>\n <ActionsDropdownItem action={a} />\n </Tooltip>\n \n </li>\n );\n }\n \n return (\n <li key={idx}>\n {showDivider && <hr className='dropdown-divider' role='separator'></hr>}\n <ActionsDropdownItem action={a} />\n </li>\n );\n })\n }\n </ul>\n </div>\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 { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.backButton';\n\ninterface BackButtonProps {\n appLink: Core.AppLink;\n backToName?: string;\n color?: 'black' | 'white';\n extraClasses?: string;\n /**\n * Whether or not the button text has a text shadow. Defaults to true\n */\n textShadow?: boolean;\n}\n\nBackButton.defaultProps = {\n color: 'black',\n extraClasses: ''\n};\n\nexport function BackButton(props: BackButtonProps): React.ReactElement {\n const { backToName, appLink, color, extraClasses, textShadow } = {\n textShadow: true,\n ...props\n };\n\n const backPhrase = backToName\n ? LanguageService.getPhrase(namespace, 'backTo', { backToName })\n : LanguageService.getPhrase(namespace, 'back');\n\n const colorClass = color === 'black' ? '' : 'text-white';\n const textShadowClass = textShadow ? 'text-shadow' : '';\n\n return (\n <AppLink\n appLink={appLink}\n className={`d-inline-flex align-items-center h5 mb-0 ${extraClasses} ${colorClass} ${textShadowClass}`}\n >\n <SvgContainer svgName={cvSvgLibrary.ChevronLeft} size={SvgContainerSize.Medium} />\n <span className='ms-1'>{backPhrase}</span>\n </AppLink>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"bannerContent\":\"sSCTB\",\"actionsContainer\":\"Z5WI2\",\"bannerContentWithLogo\":\"rgs7Q\",\"container\":\"M51HJ\",\"logoContainer\":\"vkeJk\",\"logoContainerLeft\":\"M3U9B\",\"logoHeading\":\"EtRwC\",\"specialEventContainer\":\"rOxDc\",\"headingLarge\":\"_8pnV\",\"heading\":\"JXVBH\"};","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\nimport { PortalHelper } from 'libs/common/react/utils/PortalHelper';\n\nimport { ComingSoonTag } from 'libs/shared/apps/calendar/components/coming-soon-tag/ComingSoonTag';\nimport { GenericCalendarDate } from 'libs/shared/apps/calendar/components/generic-calendar-date/GenericCalendarDate';\nimport { CalendarTheme } from 'libs/shared/apps/calendar/interfaces/CalendarTheme';\nimport { ActionOptions, Actions } from 'libs/shared/components/actions/Actions';\nimport { BackButton } from 'libs/shared/components/back-button/BackButton';\nimport { LazyImage } from 'libs/shared/components/lazy-image/LazyImage';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { ImageMinDimensions } from 'libs/shared/constants/ImageSizes';\nimport { BannerPortalContext } from 'libs/shared/context/BannerPortalContext';\nimport { ImageSize, ImageType, ResizeType } from 'libs/shared/enums/Images';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Banner, CalendarEvent, Logo } from 'libs/shared/interfaces';\nimport { getBgColorClass } from 'libs/shared/utils/getBgColorClass';\nimport { ImageHelper, ImageOptions } from 'libs/shared/utils/ImageHelper';\n\nimport styles from './banner-header.scss';\n\nconst RATIO = `${ImageMinDimensions[ImageType.Banners].width}:${ImageMinDimensions[ImageType.Banners].height}`;\nconst DEFAULT_WIDTH = 1200; // This is ImageSize.Large for a Banner.\nconst LARGE_SCREEN_WIDTH = 1920;\n\nfunction useGetImageWidth(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xxl)\n return LARGE_SCREEN_WIDTH;\n\n return DEFAULT_WIDTH;\n}\n\nfunction getSizeClass(heading: string): string {\n if (heading.length < 160)\n return 'h1';\n\n return styles.headingLarge;\n}\n\ninterface BannerHeaderProps {\n heading: string;\n banner?: Banner;\n bannerClassName?: string;\n imageCdnUrl?: string;\n logo?: Logo;\n logoBgColour?: string;\n actions?: ActionOptions[];\n specialEvent?: CalendarEvent;\n backButtonAppLink?: Core.AppLink;\n backButtonText?: string;\n backButtonClasses?: string;\n sortComponent?: JSX.Element;\n blockColourClass?: string;\n actionsDropdownClassName?: string;\n detailsComponent?: () => React.ReactElement;\n imageOptions?: ImageOptions;\n showComingSoon?: boolean;\n alignLogoLeft?: boolean;\n calendarTheme?: CalendarTheme;\n}\n\nconst namespace = 'shared.bannerHeader';\n\nexport const BannerHeader = React.memo(function(props: React.PropsWithChildren<BannerHeaderProps>): React.ReactElement {\n const { heading, banner, imageCdnUrl, actions, sortComponent, blockColourClass, specialEvent } = props;\n\n const portalContainerContext = React.useContext(BannerPortalContext);\n\n const imageWidth = useGetImageWidth();\n\n const specialEventIsToday = React.useMemo(() => {\n if (!specialEvent || props.showComingSoon)\n return false;\n\n const today = DateHelper.format(new Date(), 'YYYY-MM-DD');\n\n if (!specialEvent.endDate)\n return specialEvent.startDate === today;\n\n return specialEvent.startDate <= today && specialEvent.endDate >= today;\n }, [specialEvent]);\n\n function getSpecialEventMonthText(specialEvent: CalendarEvent): string {\n if (!specialEvent.endDate)\n return DateHelper.format(specialEvent.startDate, 'MMMM');\n\n if (DateHelper.isSame(specialEvent.startDate, specialEvent.endDate, 'month'))\n return DateHelper.format(specialEvent.startDate, 'MMMM');\n\n return `${DateHelper.format(specialEvent.startDate, 'MMM')} - ${DateHelper.format(specialEvent.endDate, 'MMM')}`;\n }\n\n const imageOptions = props.imageOptions || {\n width: imageWidth,\n ratio: RATIO,\n resizeType: ResizeType.Cover\n };\n\n const url = !!banner && !!imageCdnUrl && ImageHelper.createBannerUrl(banner, {\n fallbackBaseUrl: imageCdnUrl,\n fallbackCategoryName: heading,\n type: ImageType.Banners\n }, imageOptions);\n\n const containerProps: React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement> = {\n className: `banner banner-header ${props.bannerClassName}`,\n style: url ? { backgroundImage: `url('${url}')` } : {}\n };\n\n if (!banner && blockColourClass) {\n delete containerProps.style;\n containerProps.className += ` ${blockColourClass}`;\n }\n\n const DetailsComponent = props.detailsComponent;\n\n const logoFallbackBgClassName = getBgColorClass(props.heading, BG_COLOUR_CLASS_NAMES);\n\n return PortalHelper.renderInPortalIfExists(\n // \"banner\" is used in playlists in Online. banner-header is used by all other projects\n <header {...containerProps}>\n <div className={`container ${styles.container} position-relative inner-banner`}>\n {props.backButtonAppLink && (\n <div className='pt-3'>\n <BackButton\n appLink={props.backButtonAppLink}\n backToName={props.backButtonText}\n extraClasses={props.backButtonClasses}\n color='white'\n />\n </div>\n )}\n \n <div className={`${props.alignLogoLeft ? 'position-absolute top-50 start-0 translate-middle-y w-100 ps-4' : `${styles.bannerContent} px-2 ${props.logo?.url ? styles.bannerContentWithLogo : ''}`}`}>\n {!!specialEvent && (\n <div className={`position-relative ${styles.specialEventContainer}`}>\n <GenericCalendarDate\n body={{\n type: specialEvent.endDate ? 'range' : 'day',\n text: specialEvent.endDate\n ? `${DateHelper.format(specialEvent.startDate, 'DD')}-${DateHelper.format(specialEvent.endDate, 'DD')}`\n : DateHelper.format(specialEvent.startDate, 'DD')\n }}\n month={getSpecialEventMonthText(specialEvent)}\n theme={props.calendarTheme}\n />\n </div>\n )}\n <div>\n {specialEventIsToday && (\n <div className='rounded-pill py-1 px-2 my-1 me-1 fw-semibold bg-light-blue lh-1 d-inline-block'>\n <Text namespace={namespace} phrase='onToday' />\n </div>\n )}\n {props.showComingSoon && (\n <ComingSoonTag className='pe-2 fw-semibold mb-1 rounded-pill justify-content-start text-nowrap' />\n )}\n <div className='d-flex align-items-center'>\n {props.alignLogoLeft && props.logo?.url &&\n <div className={`${styles.logoContainerLeft} d-none d-md-block rounded-circle overflow-hidden me-3 ${logoFallbackBgClassName}`}>\n <LazyImage\n src={ImageHelper.createUrl(props.logo?.url, { size: ImageSize.Medium })}\n style={{ backgroundColor: props.logoBgColour }}\n />\n </div>\n }\n <h1 className={`text-white text-shadow pe-3 position-static ${styles.heading} ${getSizeClass(heading)} ${props.alignLogoLeft ? 'w-50' : ''}`}>\n {heading}\n {DetailsComponent && <DetailsComponent />}\n </h1>\n </div>\n </div>\n {!!actions && (\n <div className={styles.actionsContainer}>\n <Actions\n actions={actions}\n sortComponent={sortComponent}\n actionsDropdownClassName={props.actionsDropdownClassName}\n />\n </div>\n )}\n </div>\n {!props.alignLogoLeft && !!props.logo?.url &&\n <div className={styles.logoContainer}>\n <img\n src={ImageHelper.createUrl(props.logo.url, { size: ImageSize.Small })}\n className='rounded-circle'\n />\n </div>\n }\n </div>\n </header>,\n portalContainerContext?.container\n );\n}, (prevProps, nextProps): boolean => (\n prevProps.actions === nextProps.actions\n && prevProps.heading === nextProps.heading\n && prevProps.logo?.url === nextProps.logo?.url\n));\n\nexport function PartialBannerHeader(): JSX.Element {\n const portalContainerContext = React.useContext(BannerPortalContext);\n\n return PortalHelper.renderInPortalIfExists(\n <div className={`partial-banner partial-loading-background ${styles.banner}`} />,\n portalContainerContext?.container\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});","// extracted by mini-css-extract-plugin\nexport default {\"seeMore\":\"yv0FS\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor, LocationContext } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { WidgetTypeIdConfig } from 'libs/shared/constants/WidgetTypeIdConfig';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { WidgetHelper } from 'libs/shared/utils/WidgetHelper';\n\nimport styles from './widget-header.scss';\n\nconst namespace = 'shared.widgetHeader';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface WidgetHeaderProps {\n name: string;\n description: string | JSX.Element;\n isPreviewing?: boolean;\n content?: any[];\n widgetTypeId?: WidgetTypeId;\n badgeComponent?: JSX.Element;\n\n appLink?: Core.AppLink;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n \n showSeeMoreLink?: boolean;\n onClick?: () => void;\n}\n\nfunction SeeMore(props: WidgetHeaderProps) {\n return (\n <div className={`ms-3 ${styles.seeMore}`}>\n <AppLink\n appLink={props.appLink}\n analyticsData={props.analyticsData }\n analyticsOptions={{\n location: LocationContext.SlidingList,\n ...props.analyticsOptions,\n descriptor: ClickDescriptor.SeeMore\n }}\n className={`text-decoration-none ${props.appLink ? 'curated-widget-link' : ''}`}\n >\n <p className='hover-text-underline text-dark curated-widget-heading'>{getPhrase('seeAll')}</p>\n </AppLink>\n </div>\n );\n}\n\nexport function WidgetHeader(props: WidgetHeaderProps): JSX.Element {\n const hasDescription = !!props.description;\n\n if (!props.name && !props.description)\n return <></>;\n\n const isBelowMinimum = WidgetHelper.isBelowContentMinimum(props.content, props.widgetTypeId);\n const minContent = WidgetTypeIdConfig[props.widgetTypeId]?.minContent ?? 0;\n\n return (\n <div className='curated-widget-header'>\n <div className='d-flex justify-content-between'>\n {!!props.name && (\n <div className='d-flex align-items-center'>\n <AppLink\n appLink={props.appLink}\n analyticsData={props.analyticsData}\n className={`text-decoration-none ${props.appLink ? 'curated-widget-link text-reset' : ''}`}\n onClick={props.onClick}\n >\n <h2 className='h4 curated-widget-heading'>\n {props.isPreviewing && isBelowMinimum && (\n <SvgContainer\n svgName={cvSvgLibrary.WarningOutline}\n title={`Widget is below the minimum content threshold of ${minContent} and won't be displayed.`}\n tooltipSpanHack\n tooltipSpanHackClassName='d-inline text-danger me-1'\n />\n )}\n {props.name}\n </h2>\n </AppLink>\n {!!React.isValidElement(props.badgeComponent) && props.badgeComponent}\n </div>\n )}\n {!!props.appLink && !hasDescription && !!props.showSeeMoreLink && <SeeMore {...props}/>}\n </div>\n \n {hasDescription && (\n <div className='d-flex justify-content-between align-items-end'>\n <p className={`description curated-widget-description`}>\n <span>{props.description}</span>\n </p>\n {!!props.appLink && !!props.showSeeMoreLink && <SeeMore {...props}/> }\n </div>\n )}\n </div>\n );\n}","import React from 'react';\n\nimport { UserAgentHelper } from 'libs/common/backbone/utils/UserAgentHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { DynamicWidgetState } from 'libs/shared/components/widgets/dynamic-widget';\nimport { FixedWidgetState } from 'libs/shared/components/widgets/fixed-widget';\n\n// Sync with transition time in SlidingListContainer.tsx\nconst SLIDER_ANIMATION_TIME = 400;\n\ntype FixedWidgetKeyboardOptions = {\n type: 'fixed',\n state: FixedWidgetState,\n containerRef: React.MutableRefObject<HTMLElement>\n mediaQuery?: never;\n}\n\ntype DynamicWidgetKeyboardOptions = {\n type: 'dynamic',\n state: DynamicWidgetState,\n containerRef: React.MutableRefObject<HTMLElement>\n mediaQuery: string\n}\n\ntype UseWidgetKeyboard = FixedWidgetKeyboardOptions | DynamicWidgetKeyboardOptions\n\nexport function useWidgetKeyboard(options: UseWidgetKeyboard) {\n const { type, state, containerRef, mediaQuery } = options;\n\n const [ isTabbing, setIsTabbing ] = React.useState(false);\n const [ dynamicAttributes, setDynamicAttributes ] = React.useState<HashObject>({});\n const [ focusedWidgetIndex, setFocusedWidgetIndex ] = React.useState(null);\n\n const isTouch = React.useMemo(() => UserAgentHelper.isTouchScreen(), []);\n\n /**\n * Get accessibility attributes for dynamic widget items\n * */\n React.useEffect(() => {\n if (type !== 'dynamic' || !containerRef.current || !(state as DynamicWidgetState).containerLeftPosition || isTouch) return;\n\n setTimeout(() => getDynamicAttributes(), SLIDER_ANIMATION_TIME + 50);\n }, [\n containerRef.current,\n mediaQuery,\n (state as DynamicWidgetState).offset,\n (state as DynamicWidgetState).containerLeftPosition\n ]);\n\n function getDynamicAttributes() {\n const dynamicWidgetState = state as DynamicWidgetState;\n\n if (!containerRef.current?.children)\n return;\n\n const focusableItems = Array.from(containerRef.current.children).reduce((acc, item) => {\n const rect = item?.getBoundingClientRect();\n\n /**\n * When any part of the widget item is visible it should be focusable,\n * otherwise prevent interaction and the slider should be the next focusable element\n * */\n const isItemVisable =\n rect.left < dynamicWidgetState.containerRightPosition &&\n rect.right > dynamicWidgetState.containerLeftPosition;\n\n return {\n ...acc,\n [item.id]: isItemVisable\n ? {\n 'aria-hidden': false\n } : {\n 'aria-hidden': true,\n 'inert': 'true'\n }\n };\n }, {});\n\n setDynamicAttributes(focusableItems);\n }\n\n /**\n * Get accessibility attributes for fixed widget items\n * */\n function getFixedAttributes(index?: number) {\n const fixedWidgetState = state as FixedWidgetState;\n\n const isItemVisible =\n isTouch ||\n index >= (fixedWidgetState.offset - fixedWidgetState.viewableItems) &&\n index < fixedWidgetState.offset;\n if (isItemVisible) {\n return {\n 'aria-hidden': false\n };\n }\n\n return {\n 'inert': 'true',\n 'aria-hidden': true\n };\n }\n\n /**\n * When the user is not signed in, there may be videos which are not focusable.\n * setTimeout is required because the transition time is 400ms\n */\n function focusNext() {\n setTimeout(() => {\n if (!containerRef.current)\n return;\n\n const items = containerRef.current.querySelectorAll('li[aria-hidden]');\n\n let nextFocusableElement: HTMLElement = null;\n\n for (let i = (focusedWidgetIndex + 1); i < items.length; i++) {\n if (nextFocusableElement)\n break;\n\n nextFocusableElement = items[i].querySelector('a[tabindex=\"0\"]');\n }\n\n if (nextFocusableElement)\n nextFocusableElement.focus();\n }, SLIDER_ANIMATION_TIME + 100);\n }\n\n function focusPrev() {\n setTimeout(() => {\n if (!containerRef.current)\n return;\n\n const items = containerRef.current.querySelectorAll('li[aria-hidden]');\n\n let prevFocusableElement: HTMLElement = null;\n for (let i = focusedWidgetIndex - 1; i >= 0; i--) {\n if (prevFocusableElement) break;\n\n const item = items[i];\n prevFocusableElement = item.querySelector('a[tabindex=\"0\"]');\n }\n\n if (prevFocusableElement)\n prevFocusableElement.focus();\n }, SLIDER_ANIMATION_TIME + 100);\n }\n\n function onFocusWidget(index: number) {\n if (document.querySelector('.user-is-tabbing')) {\n setIsTabbing(true);\n setFocusedWidgetIndex(index);\n }\n }\n\n function onBlurWidget() {\n if (!document.querySelector('.user-is-tabbing')) {\n setIsTabbing(false);\n setFocusedWidgetIndex(null);\n }\n }\n\n return {\n isTabbing,\n onFocusWidget,\n onBlurWidget,\n getFixedAttributes,\n dynamicAttributes,\n focusNext,\n focusPrev\n };\n}","import { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst blankImage = new Image();\nblankImage.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=';\n\nexport const DragHelper = {\n // This removes the image that appears when you drag a draggable HTML element\n hideDragImage(event: React.DragEvent<HTMLElement>): void {\n if (!event.dataTransfer.setDragImage || !FunctionHelper.isFunction(event.dataTransfer.setDragImage))\n return;\n\n event.dataTransfer.setDragImage(blankImage, 0, 0);\n }\n};","import * as React from 'react';\n\nimport { UserAgentHelper } from 'libs/common/backbone/utils/UserAgentHelper';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { CssMeasurement } from 'libs/shared/enums/CssMeasurement';\nimport { DragHelper } from 'libs/shared/utils/DragHelper';\n\nconst isTouchScreen = UserAgentHelper.isTouchScreen();\n\nconst getPositionStyling = (xPosition: number, measurement: CssMeasurement, dragPercentage?: number) => {\n // Used in situations where a touch screen user is dragging the `<FixedWidget />`\n if (measurement === CssMeasurement.Percentage && dragPercentage)\n xPosition = xPosition - dragPercentage;\n \n return {\n transform: `translate3d(${xPosition}${measurement}, 0px, 0px)`,\n // Sync with transition time in useWidgetKeyboard.ts\n transition: 'transform .4s ease-in-out'\n };\n};\n\ninterface SlidingListContainerProps extends React.PropsWithChildren<unknown> {\n position: number;\n positionType: CssMeasurement;\n\n onDrag?: (event: React.DragEvent<HTMLUListElement>) => void;\n onDragEnd?: () => void;\n\n onTouchMove?: (event: React.TouchEvent<HTMLUListElement>) => void;\n onTouchEnd?: () => void;\n\n percentageDragged?: number;\n}\n\nexport const SlidingListContainer = React.forwardRef((\n props: SlidingListContainerProps,\n ref: React.MutableRefObject<HTMLUListElement>\n): JSX.Element => {\n const { children, positionType, onDrag, onDragEnd, onTouchMove, onTouchEnd, percentageDragged, position = 0 } = props;\n\n function getEventListeners(): HashObject {\n const listenerProps: HashObject = {};\n\n if (onDrag && onDragEnd) {\n listenerProps.draggable = true;\n listenerProps.onDragEnd = onDragEnd;\n listenerProps.onDragStart = DragHelper.hideDragImage;\n listenerProps.onDragOver = onDrag;\n }\n\n if (onTouchMove && onTouchEnd && isTouchScreen) {\n listenerProps.onTouchMoveCapture = onTouchMove;\n listenerProps.onTouchEndCapture = onTouchEnd;\n }\n\n return listenerProps;\n }\n\n return (\n <ul\n className='list-unstyled d-flex flex-nowrap position-relative w-100 mb-0'\n style={getPositionStyling(position, positionType, percentageDragged)}\n ref={ref}\n {...getEventListeners()}\n >\n {children}\n </ul>\n );\n});","// extracted by mini-css-extract-plugin\nexport default {\"buttonContainer\":\"_ejId\",\"left\":\"VSAPU\",\"right\":\"kgeXh\",\"button\":\"gAsE9\",\"hoverText\":\"APA36\",\"buttonHover\":\"cqD75\",\"chevron\":\"Ev4hr\",\"extendedClickableArea\":\"AtsWP\",\"gradientRight\":\"ZuAif\",\"gradientLeft\":\"Pt3nx\",\"topPos\":\"BVcIS\"};","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { FixedWidgetState } from 'libs/shared/components/widgets/fixed-widget';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './widget-button.scss';\n\nconst namespace = 'shared.widgetButton';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport enum WidgetButtonDirection {\n Left,\n Right\n}\n\ninterface WidgetButtonProps {\n onClick: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;\n direction: WidgetButtonDirection;\n hide: boolean;\n contents?: WidgetContents;\n useGradientBackdrop?: boolean;\n className?: string;\n hoverText?: string;\n hideExtendedClickableArea?: boolean;\n state?: FixedWidgetState;\n\n leftButtonClassName?: string;\n rightButtonClassName?: string;\n leftGradientClassName?: string;\n rightGradientClassName?: string;\n containerClassName?: string;\n}\n\nexport const WidgetButton = React.memo(function(props: WidgetButtonProps): JSX.Element {\n const isLeft = props.direction === WidgetButtonDirection.Left;\n\n const arrowSvg = isLeft ? cvSvgLibrary.ChevronLeft : cvSvgLibrary.ChevronRight;\n\n function getPositionClass(): string {\n let className = styles.topPos;\n \n // Left / Right\n if (isLeft)\n className += ` ${styles.left} ${props.leftButtonClassName}`;\n else\n className += ` ${styles.right} ${props.rightButtonClassName}`;\n \n return className;\n }\n\n function getStyle(): React.CSSProperties {\n if (props.state?.contents === 'videos')\n return { paddingBottom: (56.25 / props.state?.viewableItems) + '%' };\n\n return { height: '100%' };\n }\n\n if (props.hide)\n return <></>;\n\n return (\n <div className={`${styles.buttonContainer} ${props.containerClassName ? props.containerClassName : ''}`} style={getStyle()}>\n {props.useGradientBackdrop &&\n <div className={isLeft ? `${styles.gradientLeft} ${props.leftGradientClassName}` : `${styles.gradientRight} ${props.rightGradientClassName}`} />\n }\n\n {!props.hideExtendedClickableArea && (\n <button\n onClick={props.onClick}\n className={`${styles.extendedClickableArea} ${isLeft ? styles.left : styles.right}`}\n tabIndex={-1}\n />\n )}\n\n <button\n className={`${getPositionClass()} ${styles.button} ${props.className || ''}`}\n onClick={props.onClick}\n aria-label={isLeft ? getPhrase('previous') : getPhrase('next')}\n >\n {props.hoverText && (\n <span className={`ps-3 pe-2 ${styles.hoverText}`}>{props.hoverText}</span>\n )}\n <SvgContainer\n svgName={arrowSvg}\n size={SvgContainerSize.Medium}\n className={`svg-container d-inline-block ${styles.chevron}`}\n />\n </button>\n </div>\n );\n});","export enum CssMeasurement {\n Percentage = '%',\n Pixels = 'px'\n}","export enum WidgetInteraction {\n Init = 'init',\n Next = 'next',\n Previous = 'previous',\n Resize = 'resize',\n Drag = 'drag',\n Update = 'update',\n JumpToIndex = 'jump-to-index'\n}","import { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\n\nimport { useMediaQuery } from './UseMediaQuery';\n\n/**\n * @deprecated Please use useBreakpoints() instead\n */\nexport function useGetMediaQueryString(): MediaQueryStrings {\n const isXS = useMediaQuery(MediaQueryStrings.XS);\n const isSM = useMediaQuery(MediaQueryStrings.SM);\n const isMD = useMediaQuery(MediaQueryStrings.MD);\n const isLG = useMediaQuery(MediaQueryStrings.LG);\n const isXL = useMediaQuery(MediaQueryStrings.XL);\n const isXXL = useMediaQuery(MediaQueryStrings.XXL);\n\n let currentString = MediaQueryStrings.LG; // default\n if (isXS) currentString = MediaQueryStrings.XS;\n if (isSM) currentString = MediaQueryStrings.SM;\n if (isMD) currentString = MediaQueryStrings.MD;\n if (isLG) currentString = MediaQueryStrings.LG;\n if (isXL) currentString = MediaQueryStrings.XL;\n if (isXXL) currentString = MediaQueryStrings.XXL;\n\n return currentString;\n}","import { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { Classification, Playlist } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { ClassificationAppLinkHelper } from 'shared/utils/ClassificationAppLinkHelper';\n\nexport const getClassificationAppLink = (params?: HashObject) =>\n (classification?: Classification): Core.AppLink => {\n if (!classification?.id)\n return null;\n\n return ClassificationAppLinkHelper.getAppLink(classification, params || {});\n };\n\nexport const getPlaylistAppLink = (playlist: Playlist, classificationId: string): Core.AppLink => ({\n application: AppChannels.PLAYLISTS,\n action: Actions.Playlists.PLAYLIST,\n args: [ playlist.id, TextHelper.slugify(playlist.name) ],\n params: { classificationId }\n});\n\nexport const getAllTopicsAppLink = (presentationId?: string): Core.AppLink => ({\n application: AppChannels.SUBJECT,\n action: Actions.Subjects.PRESENTATION_TOPICS,\n params: presentationId ? { presentationId } : {}\n});","// extracted by mini-css-extract-plugin\nexport default {\"classificationPane\":\"ftCMX\"};","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { BannerHeader, PartialBannerHeader } from 'libs/shared/components/banner-header/BannerHeader';\nimport { Breadcrumb, Breadcrumbs, PartialBreadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { CoverFixedPillListLargeWidgetTemplate } from 'libs/shared/components/widgets/curated-widgets/templates/cover-fixed-pill-list-large/CoverFixedPillListLargeWidgetTemplate';\nimport { StatsCoverFixedPillListLargeWidgetTemplate } from 'libs/shared/components/widgets/curated-widgets/templates/stats-cover-fixed-pill-list-large/StatsCoverFixedPillListLargeWidgetTemplate';\nimport { PartialDynamicWidget } from 'libs/shared/components/widgets/dynamic-widget';\nimport { PartialSubjectWidgetItem } from 'libs/shared/components/widgets/items/subject-widget-item';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Classification, Config, Presentation } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { usePresentation } from 'shared/hooks/usePresentation';\nimport { SeoHelper } from 'shared/utils/SeoHelper';\n\nimport { useIsTertiary } from 'apps/onboarding/hooks/useIsTertiary';\nimport { getClassificationAppLink } from 'apps/subjects/utils/ClassificationAppLinks';\n\nimport styles from './presentation-topics.scss';\n\nconst namespace = 'subjects.presentationTopics';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface PresentationTopicsViewQueryParams {\n presentationId?: string;\n}\n\ninterface PresentationTopicsViewProps {\n queryParams: PresentationTopicsViewQueryParams;\n}\n\nexport function PresentationTopicsView(props: PresentationTopicsViewProps): React.ReactElement {\n const { hasTopicDirectories } = useSettings(null);\n const breakpoints = useBreakpoints();\n\n /**\n * Data fetching\n */\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const {\n availablePresentations,\n activePresentation,\n hasPresentationsLoaded,\n canAccessPresentation\n } = usePresentation();\n\n const isTertiary = useIsTertiary();\n const products = useProducts();\n\n /**\n * We'll prefer the presentationId query param, but fallback to the\n * user's activePresentation where the queryParam doesn't exist.\n */\n const initialPresentationId = props.queryParams.presentationId || activePresentation?.id;\n\n const currentPresentation = Flight.useBasicFetch<Presentation>(\n initialPresentationId &&\n ClassificationRequests.presentationById(initialPresentationId)\n );\n\n const hasLoaded = currentPresentation.hasCompleted && hasPresentationsLoaded;\n\n const classification = {\n name: TopicsHelper.getExploreAllTopicsTitle(currentPresentation.data?.name, availablePresentations?.length),\n banner: {\n url: TopicsHelper.getPresentationLevelImage(currentPresentation.data?.learningLevel, 'topic-banner')\n }\n } as Classification;\n\n const children = Flight.useBasicFetch<Classification[]>(\n hasLoaded &&\n ClassificationRequests.topLevelTopics(initialPresentationId || currentPresentation.data?.id)\n );\n\n const title = getPhrase('pageTitleSubject', { title: currentPresentation.data?.name });\n\n useSetPageMetadata({\n title,\n description: getPhrase('pageDescription', { title: currentPresentation.data?.name }),\n canonicalLink: SeoHelper.getCanonicalLink(),\n allowIndexing: SeoHelper.allowIndexing()\n });\n\n const classificationAppLinkFn = getClassificationAppLink();\n\n function getBreadcrumbs(): Breadcrumb[] {\n return [{\n name: getPhrase('discover'),\n appLink: {\n application: AppChannels.DASHBOARD,\n action: Actions.Dashboard.HOME\n }\n }, {\n name: TopicsHelper.getExploreAllTopicsBreadcrumb(currentPresentation.data?.name, availablePresentations?.length),\n active: true\n }];\n }\n\n /**\n * Render Variable\n */\n const dataLoaded = !!config.data && !!availablePresentations && children.data;\n const canViewBreadcrumbs = canAccessPresentation(currentPresentation.data?.id);\n\n /**\n * Additional subjects data to be mixed in with lower-level component analytics collection\n */\n const analyticsData = {\n presentationId: currentPresentation.data?.id,\n presentationName: currentPresentation.data?.name,\n widgetId: WidgetTypeId.Classifications,\n templateId: WidgetTemplate.CoverFixedPillListLarge\n };\n\n const TemplateComponent = hasTopicDirectories\n ? StatsCoverFixedPillListLargeWidgetTemplate\n : CoverFixedPillListLargeWidgetTemplate;\n \n return (\n <main className='bg-white px-4'>\n {dataLoaded\n ? (\n <BannerHeader\n heading={classification?.name}\n banner={classification?.banner}\n imageCdnUrl={config.data.imageCdnUrl}\n imageOptions={{ size: ImageSize.Large }}\n />\n ) : <PartialBannerHeader />\n }\n <div className={`py-3 mb-3 ${canViewBreadcrumbs ? 'border-bottom' : ''}`}>\n {(() => {\n if (!canViewBreadcrumbs)\n return <></>;\n\n if (!dataLoaded)\n return <PartialBreadcrumbs />;\n\n return <Breadcrumbs breadcrumbs={getBreadcrumbs()} />;\n })()}\n </div>\n <div className={styles.classificationPane}>\n {dataLoaded ? (\n <TemplateComponent\n id={currentPresentation.data?.id}\n name=''\n description=''\n analyticsData={analyticsData}\n content={children?.data}\n appLinks={{ classification: classificationAppLinkFn }}\n hasTableOfContents={false}\n settings={{ hasTopicDirectories }}\n isTertiaryCustomerWithoutExchange={isTertiary && !products?.hasProduct(ProductId.Exchange)}\n // TODO: Should this be optional?\n onToggleFollowClassification={() => {}}\n />\n ) : (\n <PartialDynamicWidget partialLoadingComponent={PartialSubjectWidgetItem} />\n )}\n\n {dataLoaded && hasTopicDirectories && availablePresentations?.length > 1 && (\n <ul className='pt-3 list-unstyled'>\n {availablePresentations.filter(p => p.id !== currentPresentation.data?.id).map(presentation => {\n return (\n <li key={presentation.id}>\n <AppLink\n className={`d-flex justify-content-between align-items-center text-white p-3 mb-3 rounded-3 ${styles.link} ${TopicsHelper.getMappedPresentationBackgroundColourClass(presentation?.learningLevel)}`}\n appLink={{\n application: AppChannels.SUBJECT,\n action: Actions.Subjects.PRESENTATION_TOPICS,\n params: { presentationId: presentation.id }\n }}\n appLinkOptions={{ middlewareOptions: { presentationSlug: presentation.vanitySlug } }}\n analyticsData={{\n id: presentation.id,\n name: presentation.name,\n description: presentation.description,\n currentPresentationId: currentPresentation.data?.id,\n currentPresentationName: currentPresentation.data?.name,\n currentPresentationDescription: currentPresentation.data?.description\n }}\n analyticsOptions={{\n entity: EntityType.Presentation,\n actionType: UserAction.Click,\n location: LocationContext.PresentationClassifications\n }}\n >\n <div className='h4 text-shadow mb-0'>\n {(availablePresentations.length > 2 || breakpoints.sm || breakpoints.xs) ? (\n <Text namespace={namespace} phrase='multiPresentationBanner' options={{ name: presentation.name }} />\n ) : (\n <Text namespace={namespace} phrase='singlePresentationBanner' options={{ name: presentation.name }} />\n )}\n </div>\n <IconButton\n svgName={breakpoints.xs ? cvSvgLibrary.Sparkle : cvSvgLibrary.School}\n openInNewTab\n className='btn btn-outline-dark'\n onClick={null}\n >\n <Text\n namespace={namespace}\n phrase={breakpoints.xs ? 'explore' : 'changeTo'}\n options={{ name: presentation.name }}\n />\n </IconButton>\n </AppLink>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </main>\n );\n}\n"],"names":["PortalHelper","renderInPortalIfExists","component","portalContainer","createPortal","Actions","props","orderedActions","actions","sort","a","b","order","buttonActions","moreActions","forEach","button","push","className","length","map","idx","key","label","appLink","href","onClick","svgName","svgSize","dropdownToggleSvgSize","tooltip","showSpinner","analyticsData","analyticsOptions","openInNewTab","disabled","iconButton","showBorder","customSize","ariaLabel","title","spanHack","sortComponent","dropdownToggleClassName","actionsDropdownClassName","fetchMore","LazyDropdownItems","style","padding","height","width","getDropdownItemClassName","actionClassName","ActionsDropdownItem","FunctionHelper","action","AppLink","SvgContainer","e","preventDefault","AnalyticsHelper","role","tabIndex","onKeyDown","ActionsDropdown","isLazy","some","lazyPlaceholder","currentGroup","dropdownToggleId","RandomHelper","type","id","size","showDivider","undefined","group","Tooltip","defaultProps","S","namespace","BackButton","textShadow","backToName","color","extraClasses","backPhrase","LanguageService","colorClass","textShadowClass","RATIO","getSizeClass","heading","BannerHeader","banner","imageCdnUrl","blockColourClass","specialEvent","portalContainerContext","BannerPortalContext","imageWidth","useBreakpoints","xxl","specialEventIsToday","showComingSoon","today","DateHelper","Date","endDate","startDate","imageOptions","ratio","resizeType","url","ImageHelper","fallbackBaseUrl","fallbackCategoryName","containerProps","bannerClassName","backgroundImage","DetailsComponent","detailsComponent","logoFallbackBgClassName","getBgColorClass","backButtonAppLink","backButtonText","backButtonClasses","alignLogoLeft","logo","GenericCalendarDate","body","text","month","getSpecialEventMonthText","theme","calendarTheme","Text","phrase","ComingSoonTag","LazyImage","src","backgroundColor","logoBgColour","container","prevProps","nextProps","PartialBannerHeader","getPhrase","BreadcrumbItem","ref","breadcrumb","name","active","withBackIcon","trimmedName","slice","Breadcrumbs","breadcrumbs","isMobile","collapse","setCollapse","shouldFocus","setShouldFocus","expandRef","characterLength","reduce","prev","next","current","focus","first","second","secondLast","last","rest","PartialBreadcrumbs","numItems","dangerouslySetInnerHTML","__html","SeeMore","location","descriptor","WidgetHeader","hasDescription","description","isBelowMinimum","WidgetHelper","content","widgetTypeId","minContent","WidgetTypeIdConfig","isPreviewing","tooltipSpanHack","tooltipSpanHackClassName","badgeComponent","showSeeMoreLink","SLIDER_ANIMATION_TIME","useWidgetKeyboard","options","state","containerRef","mediaQuery","isTabbing","setIsTabbing","dynamicAttributes","setDynamicAttributes","focusedWidgetIndex","setFocusedWidgetIndex","isTouch","containerLeftPosition","setTimeout","dynamicWidgetState","children","focusableItems","Array","from","acc","item","rect","getBoundingClientRect","isItemVisable","left","containerRightPosition","right","getDynamicAttributes","offset","onFocusWidget","index","document","querySelector","onBlurWidget","getFixedAttributes","fixedWidgetState","viewableItems","focusNext","items","querySelectorAll","nextFocusableElement","i","focusPrev","prevFocusableElement","blankImage","Image","DragHelper","event","dataTransfer","setDragImage","isTouchScreen","UserAgentHelper","SlidingListContainer","listenerProps","xPosition","measurement","dragPercentage","positionType","onDrag","onDragEnd","onTouchMove","onTouchEnd","percentageDragged","position","CssMeasurement","C","transform","transition","draggable","onDragStart","onDragOver","onTouchMoveCapture","onTouchEndCapture","WidgetButtonDirection","WidgetButton","isLeft","direction","Left","arrowSvg","hide","containerClassName","contents","paddingBottom","useGradientBackdrop","leftGradientClassName","rightGradientClassName","hideExtendedClickableArea","leftButtonClassName","rightButtonClassName","hoverText","WidgetInteraction","useGetMediaQueryString","isXS","isSM","isMD","isLG","isXL","isXXL","currentString","getClassificationAppLink","params","classification","ClassificationAppLinkHelper","PresentationTopicsView","hasTopicDirectories","useSettings","breakpoints","config","ConfigRequests","usePresentation","availablePresentations","activePresentation","hasPresentationsLoaded","canAccessPresentation","isTertiary","useIsTertiary","products","initialPresentationId","queryParams","presentationId","currentPresentation","ClassificationRequests","hasLoaded","hasCompleted","TopicsHelper","data","learningLevel","useSetPageMetadata","canonicalLink","SeoHelper","allowIndexing","classificationAppLinkFn","dataLoaded","canViewBreadcrumbs","presentationName","widgetId","WidgetTypeId","templateId","WidgetTemplate","TemplateComponent","StatsCoverFixedPillListLargeWidgetTemplate","CoverFixedPillListLargeWidgetTemplate","application","getBreadcrumbs","appLinks","hasTableOfContents","settings","isTertiaryCustomerWithoutExchange","hasProduct","ProductId","onToggleFollowClassification","partialLoadingComponent","filter","p","presentation","appLinkOptions","middlewareOptions","presentationSlug","vanitySlug","currentPresentationId","currentPresentationName","currentPresentationDescription","entity","actionType","sm","xs","IconButton"],"sourceRoot":""}
@@ -1,2 +1,2 @@
1
1
  "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[5056],{26025:(e,t,n)=>{n.d(t,{B:()=>s});var r=n(1048),a=n(75795),s={getAudienceAppLinkParams:function(){var e=a.O.getCurrentRoute().appLink,t=r.t.isObject(e.params)?e.params:{},n=t.users,s=t.classrooms,i=t.classroomGroups,o=function(e){var n=t[e];if(n)return Array.isArray(n)?n:[n]},l={};return n&&(l.users=o("users")),s&&(l.classrooms=o("classrooms")),i&&(l.classroomGroups=o("classroomGroups")),l},getDateRangeAppLinkParams:function(){var e=a.O.getCurrentRoute().appLink,t=r.t.isObject(e.params)?e.params:{},n=t.from,s=t.to,i=t.rangeName,o={};return n&&(o.from=n),s&&(o.to=s),i&&(o.rangeName=i),o}}},26136:(e,t,n)=>{n.d(t,{B:()=>s});var r=n(76198),a=n(64818);function s(e,t){return e?t?(0,r._8)((n="profileId"in e?e.profileId:e.id,s=+"".concat(n).concat(Math.floor((new Date).getMinutes()/5)),{dictionaries:[r.O9,r.yd],separator:" ",length:2,style:"capital",seed:s})):"profileId"in e?e.name:a.l.getFullName(e):"";var n,s}},40003:(e,t,n)=>{n.d(t,{Hb:()=>m,NG:()=>p,W5:()=>d,eO:()=>v,nG:()=>u,wO:()=>g,zn:()=>l});var r=n(23481),a=n(110),s=n(57266),i=r.T.encloseNamespace("shared.analyticsUtils");function o(e){var t=a.O.convertDateToUTC(e);return a.O.format(t,"YYYY-MM-DDTHH:mm:ss")}function l(){return new Date(2021,0,1)}function u(){return new Date}function c(e){return e.find((function(e){return!!e.default}))}function d(e,t){if(t)return e.find((function(e){return e.name===t}))}function m(){var e=l(),t=(new Date).getFullYear(),n=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:n,tooltip:n?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 v(e){return e.name?{rangeName:e.name}:{from:f(e.startDate),to:f(e.endDate)}}function p(e,t){var n=t.to,r=t.from,i=t.rangeName,o=d(e,i);if(o)return r||n?void s.e.updateParams(v(o),{replace:!0,merge:!0,keysToRemove:["from","to"]}):o;var m=c(e);if(r&&n&&a.O.isValid(r)&&a.O.isValid(n)){var f=!0,p=a.O.convertDateToUTC(new Date(r)),g=a.O.convertDateToUTC(new Date(n));a.O.isBefore(p,l(),"day")&&(p=l(),f=!1),a.O.isAfter(g,u(),"day")&&(g=u(),f=!1),a.O.isAfter(p,g)&&(p=m.startDate,g=m.endDate,f=!1);var b={startDate:p,endDate:g,name:f?i:""};if(f)return b;s.e.updateParams(v(b),{replace:!0,merge:!0,keysToRemove:["rangeName"]})}else s.e.updateParams(v(m),{replace:!0,merge:!0,keysToRemove:["rangeName"]})}function g(e,t){var n=function(e){return o(a.O.startOf(e,"day"))},r=function(e){return o(a.O.endOf(e,"day"))},s=d(e,t.rangeName);if(s)return{start:n(f(s.startDate)),end:r(f(s.endDate))};if(t.from&&t.to)return{start:n(t.from),end:r(t.to)};var i=c(e);return{start:n(f(i.startDate)),end:r(f(i.endDate))}}},70548:(e,t,n)=>{n.r(t),n.d(t,{InteractiveStudentResultsView:()=>P});var r=n(32735),a=n(23481),s=n(20354),i=n(2948),o=n(41196),l=n(9193),u=n(26025),c=n(26136),d=n(40003),m=n(9570),f=n(39157),v=n(44113),p=n(86572),g=n(28972),b=n(83140),w=n(80845),y=n(2102),k=a.T.encloseNamespace("interactives.studentResponseList");function D(e){var t=Object.keys(e.markedAnswers).length;return r.createElement("div",{className:"d-flex justify-content-end pt-3"},r.createElement("div",null,!e.showSubmitButtonSpinner&&r.createElement("button",{className:"btn btn-link",onClick:e.onClickClose},k("close")),!!e.interactionsToMark.length&&r.createElement(y.m,{variant:"outline-dark",onClick:e.onClickSubmit,disabled:!t,showSpinner:e.showSubmitButtonSpinner},k("submitAnswers"))))}var h=a.T.encloseNamespace("interactives.studentResponseList");function A(e){var t=Object.keys(e.markedAnswers).length;return r.createElement("div",{className:"d-flex justify-content-between pb-3"},r.createElement("div",{className:"d-flex"},!!e.summary.unanswered&&r.createElement("div",{className:"bg-light rounded p-2 me-2"},r.createElement("strong",{className:"me-2"},h("unanswered")),e.summary.unanswered),r.createElement("div",{className:"bg-light rounded p-2 me-2"},r.createElement("strong",{className:"me-2"},h("score")),e.summary.awaitingMarking?r.createElement("em",null,h("pending")):"".concat(Math.round(100*e.summary.percentCorrect),"%"))),r.createElement("div",null,!!e.interactionsToMark.length&&r.createElement(y.m,{variant:"outline-dark",onClick:e.onClickSubmit,disabled:!t,showSpinner:e.showSubmitButtonSpinner},h("submitAnswers"))))}const S={awaitingMarking:"MvGb5"};function O(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 r,a,s,i,o=[],l=!0,u=!1;try{if(s=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=s.call(n)).done)&&(o.push(r.value),o.length!==t);l=!0);}catch(e){u=!0,a=e}finally{try{if(!l&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(u)throw a}}return o}}(e,t)||function(e,t){if(e){if("string"==typeof e)return I(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)?I(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 I(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function C(e){var t,n,a,s,i=O(r.useState(!1),2),o=i[0],l=i[1],u=(t=r.useRef(),n=O(r.useState(!1),2),a=n[0],s=n[1],r.useEffect((function(){t.current&&!a&&(s(!0),t.current.scrollIntoView({behavior:"smooth",block:"center"}))}),[t.current,a]),t),d=(0,f.Rt)(e.interactive,e.studentResults),y=(0,w.Q)(e.interactive),k=function(e,t){return e.filter((function(e){return b.A.isInteractionCorrect(e,(0,w.j_)(t))===g.w.AwaitingMarking}))}(y,e.studentResults);function h(){l(!0),e.submitMarkedAnswers()}return r.createElement(r.Fragment,null,r.createElement(A,{summary:d,interactionsToMark:k,markedAnswers:e.markedAnswers,onClickSubmit:h,showSubmitButtonSpinner:o}),r.createElement("ul",{className:"list-unstyled"},y.map((function(t,n){var a,s=t.id.toString()===(null===(a=e.selectedInteractionId)||void 0===a?void 0:a.toString()),i=k.some((function(e){return e.id===t.id})),o=(0,c.B)(e.studentResults.user||e.studentResults.publicUser,e.anonymiseUsers),l="p-2 mb-3 rounded";return s&&(l+=" border-2 border-info shadow"),l+=i?" ".concat(S.awaitingMarking):" border",r.createElement("li",{key:n,className:l,ref:s?u:null},r.createElement("div",{className:"d-flex mb-2"},r.createElement(p.y,{interaction:t,iconClassName:"flex-shrink-0"})),e.reportsStyling?r.createElement(v.O,{interaction:t,studentResults:e.studentResults,markedStatus:(0,f.HI)(t.id,e.studentResults,e.markedAnswers),markInteraction:e.addMarkedAnswers,imageCdnUrl:e.imageCdnUrl,anonymisedUserName:o,className:"bg-light ps-2",showFeedback:!0,reportsStyling:!0,responseComponentClass:"mx-n2"}):r.createElement(m.d,{interaction:t,studentResults:e.studentResults,markedStatus:(0,f.HI)(t.id,e.studentResults,e.markedAnswers),markInteraction:e.addMarkedAnswers,imageCdnUrl:e.imageCdnUrl,anonymisedUserName:o,showFeedback:!0}))}))),r.createElement(D,{interactionsToMark:k,markedAnswers:e.markedAnswers,onClickSubmit:h,onClickClose:e.onClickClose,showSubmitButtonSpinner:o}))}var M=n(9111),E=n(38143),N=n(39151),R=n(20768),T=n(26304),j=n(91286),U=n(93322);function B(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var Y=a.T.encloseNamespace("shared.interactiveStudentResults");function P(e){var t,n,a,m,f,v,p=(f=(0,i.D)(E.g.ANONYMISE_USERS),v=1,function(e){if(Array.isArray(e))return e}(f)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,s,i,o=[],l=!0,u=!1;try{if(s=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=s.call(n)).done)&&(o.push(r.value),o.length!==t);l=!0);}catch(e){u=!0,a=e}finally{try{if(!l&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(u)throw a}}return o}}(f,v)||function(e,t){if(e){if("string"==typeof e)return B(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)?B(e,t):void 0}}(f,v)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];(0,U.F)();var g=s.a.useBasicFetch(R.b.interactiveMetadata(e.interactiveId)),b=s.a.useBasicFetch((null===(t=g.data)||void 0===t?void 0:t.interactiveId)&&R.b.interactive(g.data.interactiveId)),w=u.B.getDateRangeAppLinkParams(),y=(0,o.W)(e.interactiveId,(0,d.wO)((0,d.Hb)(),w)),k=s.a.useBasicFetch(N.L.config());(0,j.v)([g,y]),(0,T.b)(g);var D=(0,l.D)(null===(n=b.data)||void 0===n?void 0:n.id,null===(a=g.data)||void 0===a?void 0:a.id,e.closePopup),h=D.markedAnswers,A=D.addMarkedAnswers,S=D.submitMarkedAnswers,O=null===(m=y.data)||void 0===m?void 0:m.students.find((function(t){var n,r,a,s,i,o;return e.userId?(null===(r=null===(n=t.user)||void 0===n?void 0:n.id)||void 0===r?void 0:r.toString())===(null===(a=e.userId)||void 0===a?void 0:a.toString()):!!e.profileId&&(null===(i=null===(s=t.publicUser)||void 0===s?void 0:s.profileId)||void 0===i?void 0:i.toString())===(null===(o=e.profileId)||void 0===o?void 0:o.toString())})),I=O?Y("heading",{studentName:(0,c.B)(O.user||O.publicUser,p)}):"",P=!!b.data&&!!y.data&&!!k.data;return r.createElement(M.G,{title:I,showLoadingSpinner:!P,closePopup:e.closePopup,size:"lg"},P&&r.createElement(C,{interactive:b.data,studentResults:O,markedAnswers:h,addMarkedAnswers:A,submitMarkedAnswers:S,imageCdnUrl:k.data.imageCdnUrl,selectedInteractionId:e.interactionId,onClickClose:e.closePopup,anonymiseUsers:p,reportsStyling:e.reportsStyling}))}},94892:(e,t,n)=>{n.d(t,{T:()=>a,i:()=>r});var r={HIGH:.75,MODERATE:.5},a={HIGH:.7,MODERATE:.7}},62875:(e,t,n)=>{function r(e,t,n){var r="".concat(e,":").concat(t.start,":").concat(t.end),a=Array.isArray(t.userId)?t.userId.sort().join(":"):t.userId,s=Array.isArray(t.groupId)?t.groupId.sort().join(":"):t.groupId;return a&&(r+=":".concat(a)),s&&(r+=":".concat(s)),n&&(r+=":".concat(n)),r}n.d(t,{H:()=>r})},57266:(e,t,n)=>{n.d(t,{e:()=>i});var r=n(81886),a=n(1048),s=n(75795),i={updateParams:function(e,t){var n=s.O.getCurrentRoute().appLink,i="string"==typeof n.params?r.Q.Ab.DeserializeQueryParams(n.params):n.params;t.keysToRemove&&(i=a.t.omit(i,t.keysToRemove));var o=(null==t?void 0:t.merge)?Object.assign(Object.assign({},i),e):e,l=Object.assign(Object.assign({},n),{params:o});a.t.isEqual(n,l)||r.Q.C$.trigger(l,a.t.omit(t,["merge","keysToRemove"]))}}}}]);
2
- //# sourceMappingURL=5056-6057435479-lite.chunk.js.map
2
+ //# sourceMappingURL=5056-65c739468f-lite.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/5056-65c739468f-lite.chunk.js","mappings":"6JAOaA,EAAwB,CACnCC,yBAA0B,WACxB,IAAQC,EAAY,sBAAZA,QACFC,EAAS,aAAsBD,EAAQC,QAAUD,EAAQC,OAAuB,CAAC,EAC/EC,EAAuCD,EAAvCC,MAAOC,EAAgCF,EAAhCE,WAAYC,EAAoBH,EAApBG,gBAErBC,EAAW,SAACC,GAChB,IAAMC,EAAQN,EAAOK,GAErB,GAAKC,EAGL,OAAOC,MAAMC,QAAQF,GAASA,EAAQ,CAACA,EACzC,EAEMG,EAAuC,CAAC,EAW9C,OATIR,IACFQ,EAAgBR,MAAQG,EAAS,UAE/BF,IACFO,EAAgBP,WAAaE,EAAS,eAEpCD,IACFM,EAAgBN,gBAAkBC,EAAS,oBAEtCK,CACT,EACAC,0BAA2B,WACzB,IAAQX,EAAY,sBAAZA,QACFC,EAAS,aAAsBD,EAAQC,QAAUD,EAAQC,OAAuB,CAAC,EAC/EW,EAAwBX,EAAxBW,KAAMC,EAAkBZ,EAAlBY,GAAIC,EAAcb,EAAda,UAEZC,EAAyC,CAAC,EAWhD,OATIH,IACFG,EAAiBH,KAAOA,GAEtBC,IACFE,EAAiBF,GAAKA,GAEpBC,IACFC,EAAiBD,UAAYA,GAExBC,CACT,E,6DCzBI,SAAUC,EAAkBC,EAAoCC,GACpE,OAAKD,EAGAC,GAGE,SA3BqBC,EA2BqB,cAAeF,EAAOA,EAAKG,UAAYH,EAAKE,GAlBvFE,GAAQ,GAAD,OAAIF,GAAE,OAAGG,KAAKC,OAAO,IAAIC,MAAQC,aAAe,IAEtD,CACLC,aAAc,CAAE,KAAQ,MACxBC,UAAW,IACXC,OAAQ,EACRC,MAAO,UACPR,KAAAA,KASO,cAAeJ,EAAOA,EAAKa,KAAO,gBAAuBb,GAHzD,GAtBX,IAA8BE,EAStBE,CAmBR,C,6HC1BMU,EAAY,qBADA,yBAGZ,SAAUC,EAA+BC,GAC7C,IAAMC,EAAM,qBAA4BD,GACxC,OAAO,WAAkBC,EAAK,sBAChC,CAEM,SAAUC,IACd,OAAO,IAAIX,KAAK,KAAM,EAAG,EAC3B,CAEM,SAAUY,IACd,OAAO,IAAIZ,IACb,CAEM,SAAUa,EAAoBC,GAClC,OAAOA,EAAiBC,MAAK,SAAAC,GAAK,QAAMA,EAAK,OAAQ,GACvD,CAEM,SAAUC,EAAqBC,EAAgC5B,GACnE,GAAKA,EAKL,OAFgB4B,EAEDH,MAAK,SAAAI,GAAC,OAAIA,EAAEb,OAAShB,CAAS,GAC/C,CAkDM,SAAU8B,IACd,IAAMC,EAAUV,IACVW,GAAe,IAAItB,MAAQuB,cAE3BC,EAAoBF,IAAgBD,EAAQE,cAElD,MAAO,CACL,CACEjB,KAAMC,EAAU,SAChBkB,UAAW,IAAIzB,KACf0B,QAAS,IAAI1B,MAEf,CACEM,KAAMC,EAAU,aAChBkB,UAAW,IAAIzB,KAAKsB,GAAa,IAAItB,MAAO2B,WAAY,GACxDD,QAAS,IAAI1B,MAEf,CACEM,KAAMC,EAAU,mBAChBkB,UAAW,IAAIzB,KAAKsB,GAAa,IAAItB,MAAO2B,WAAa,EAAG,GAC5DD,QAAS,IAAI1B,MAEf,CACEM,KAAMC,EAAU,iBAChBkB,UAAW,IAAIzB,KAAKsB,GAAa,IAAItB,MAAO2B,WAAa,EAAG,GAC5DD,QAAS,IAAI1B,MAEf,CACEM,KAAMC,EAAU,YAChBkB,UAAW,IAAIzB,KAAKsB,EAAa,EAAG,GACpCI,QAAS,IAAI1B,MAEf,CACEM,KAAMC,EAAU,YAChBkB,UAAW,IAAIzB,KAAKsB,EAAc,EAAG,EAAG,GACxCI,QAAS,IAAI1B,KAAKsB,EAAa,EAAG,GAClCM,SAAUJ,EACVK,QAASL,EAAoBjB,EAAU,oBAAsB,IAE/D,CACED,KAAMC,EAAU,WAChBkB,UAAW,aAAoB,IAAIzB,KAAQ,EAAG,SAC9C0B,QAAS,IAAI1B,KACb8B,SAAS,GAGf,CAEM,SAAUC,EAAqBtB,GACnC,OAAO,WAAkBA,EAAM,aACjC,CAEM,SAAUuB,EAAoBC,GAClC,OAAIA,EAAU3B,KACL,CAAEhB,UAAW2C,EAAU3B,MAEzB,CACLlB,KAAM2C,EAAqBE,EAAUR,WACrCpC,GAAI0C,EAAqBE,EAAUP,SAEvC,CAEM,SAAUQ,EACdpB,EACAqB,GAEA,IAAQ9C,EAAwB8C,EAAxB9C,GAAID,EAAoB+C,EAApB/C,KAAME,EAAc6C,EAAd7C,UAEZ8C,EAAcnB,EAAqBH,EAAkBxB,GAE3D,GAAI8C,EACF,OAAKhD,GAASC,OAMd,iBACE2C,EAAoBI,GACpB,CAAEC,SAAS,EAAMC,OAAO,EAAMC,aAAc,CAAE,OAAQ,QAP/CH,EAYX,IAAMI,EAAmB3B,EAAoBC,GAK7C,GAAK1B,GAASC,GAAO,YAAmBD,IAAU,YAAmBC,GAArE,CAQA,IAAIoD,GAAwB,EAExBhB,EAAY,qBAA4B,IAAIzB,KAAKZ,IACjDsC,EAAU,qBAA4B,IAAI1B,KAAKX,IAE/C,aAAoBoC,EAAWd,IAAc,SAC/Cc,EAAYd,IACZ8B,GAAwB,GAGtB,YAAmBf,EAASd,IAAc,SAC5Cc,EAAUd,IACV6B,GAAwB,GAGtB,YAAmBhB,EAAWC,KAChCD,EAAYe,EAAiBf,UAC7BC,EAAUc,EAAiBd,QAC3Be,GAAwB,GAG1B,IAAMR,EAAuB,CAAER,UAAAA,EAAWC,QAAAA,EAASpB,KAAMmC,EAAwBnD,EAAY,IAE7F,GAAImD,EACF,OAAOR,EAKT,iBAA4BD,EAAoBC,GAAY,CAAEI,SAAS,EAAMC,OAAO,EAAMC,aAAc,CAAC,cA/BxG,MALC,iBACEP,EAAoBQ,GACpB,CAAEH,SAAS,EAAMC,OAAO,EAAMC,aAAc,CAAC,cAmCnD,CAEM,SAAUG,EACdxB,EACAyB,GAEA,IAAMC,EAAe,SAACnC,GAAY,OAAKD,EAA+B,YAAmBC,EAAM,OAAO,EAChGoC,EAAa,SAACpC,GAAY,OAAKD,EAA+B,UAAiBC,EAAM,OAAO,EAE5F2B,EAAcnB,EAAqBC,EAAmByB,EAAarD,WAMzE,GAAI8C,EACF,MAAO,CACLU,MAAOF,EAAab,EAAqBK,EAAYX,YACrDsB,IAAKF,EAAWd,EAAqBK,EAAYV,WAMrD,GAAIiB,EAAavD,MAAQuD,EAAatD,GACpC,MAAO,CACLyD,MAAOF,EAAaD,EAAavD,MACjC2D,IAAKF,EAAWF,EAAatD,KAMjC,IAAM2D,EAAenC,EAAoBK,GAEzC,MAAO,CACL4B,MAAOF,EAAab,EAAqBiB,EAAavB,YACtDsB,IAAKF,EAAWd,EAAqBiB,EAAatB,UAEtD,C,iQClPMnB,EAAY0C,EAAA,mBADA,oCAWZ,SAAUC,EAA0BC,GACxC,IAAMC,EAAmBC,OAAOC,KAAKH,EAAMI,eAAenD,OAE1D,OACE,uBAAKoD,UAAU,mCACb,4BACIL,EAAMM,yBACN,0BAAQD,UAAU,eAAeE,QAASP,EAAMQ,cAC7CpD,EAAU,YAGZ4C,EAAMS,mBAAmBxD,QAC1B,gBAACyD,EAAA,EAAa,CACZC,QAAQ,eACRJ,QAASP,EAAMY,cACfnC,UAAWwB,EACXY,YAAab,EAAMM,yBAElBlD,EAAU,mBAMvB,CClCA,IACM,EAAY0C,EAAA,mBADA,oCAWZ,SAAUgB,EAA0Bd,GACxC,IAAMC,EAAmBC,OAAOC,KAAKH,EAAMI,eAAenD,OAE1D,OACE,uBAAKoD,UAAU,uCACb,uBAAKA,UAAU,YACVL,EAAMe,QAAQC,YACf,uBAAKX,UAAU,6BACb,0BAAQA,UAAU,QAAQ,EAAU,eACnCL,EAAMe,QAAQC,YAGnB,uBAAKX,UAAU,6BACb,0BAAQA,UAAU,QAAQ,EAAU,UACnCL,EAAMe,QAAQE,gBACX,0BAAK,EAAU,YAAgB,UAC5BtE,KAAKuE,MAAqC,IAA/BlB,EAAMe,QAAQI,gBAAqB,OAIzD,6BACKnB,EAAMS,mBAAmBxD,QAC1B,gBAACyD,EAAA,EAAa,CACZC,QAAQ,eACRJ,QAASP,EAAMY,cACfnC,UAAWwB,EACXY,YAAab,EAAMM,yBAElB,EAAU,mBAMvB,CCrDA,SAAgB,gBAAkB,S,ggCC4D5B,SAAUc,EAAoBpB,GAClC,IA7BMqB,EACiD,EAA/CC,EAAUC,EA4B2C,IAArB,YAAe,GAAM,GAArDV,EAAW,KAAEW,EAAc,KAC7BC,GA9BAJ,EAAM,WAC2C,IAArB,YAAe,GAAM,GAA/CC,EAAQ,KAAEC,EAAW,KAG7B,aAAgB,WACTF,EAAIK,UAAWJ,IAGpBC,GAAY,GACZF,EAAIK,QAAQC,eAAe,CAAEC,SAAU,SAAUC,MAAO,WAC1D,GAAG,CAAER,EAAIK,QAASJ,IAEXD,GAoBDN,GAAU,QAAyBf,EAAM8B,YAAa9B,EAAM+B,gBAC5DC,GAAe,OAAgBhC,EAAM8B,aACrCG,EAhDR,SACED,EACAD,GAEA,OAAOC,EAAaE,QAAO,SAAAC,GACzB,OAAOC,EAAA,uBACLD,GACA,QAAiBJ,MACbM,EAAA,iBACR,GACF,CAsC0BC,CAAsBN,EAAchC,EAAM+B,gBAElE,SAASnB,IACPY,GAAe,GACfxB,EAAMuC,qBACR,CAEA,OACE,gCACE,gBAACzB,EAAyB,CACxBC,QAASA,EACTN,mBAAoBwB,EACpB7B,cAAeJ,EAAMI,cACrBQ,cAAeA,EACfN,wBAAyBO,IAE3B,sBAAIR,UAAU,iBACX2B,EAAaQ,KAAI,SAACC,EAAaC,G,MACxBC,EAAaF,EAAYjG,GAAGoG,cAA0C,QAA3B,EAAA5C,EAAM6C,6BAAqB,eAAED,YACxEE,EAAkBb,EAAgBc,MAAK,SAAAC,GAAC,OAAIA,EAAExG,KAAOiG,EAAYjG,EAAE,IACnEyG,GAAqB,OACzBjD,EAAM+B,eAAezF,MAAQ0D,EAAM+B,eAAemB,WAClDlD,EAAMmD,gBAGJ9C,EAAY,mBAUhB,OARIsC,IACFtC,GAAa,gCAGbA,GADEyC,EACW,IAAJ,OAAQ,mBAEJ,UAGb,sBAAInH,IAAK+G,EAAKrC,UAAWA,EAAWgB,IAAKsB,EAAalB,EAAyB,MAC7E,uBAAKpB,UAAU,eACb,gBAAC+C,EAAA,EAAgB,CACfX,YAAaA,EACbY,cAAc,mBAGjBrD,EAAMsD,eACL,gBAACC,EAAA,EAAmB,CAClBd,YAAaA,EACbV,eAAgB/B,EAAM+B,eACtByB,cAAc,QAAgBf,EAAYjG,GAAIwD,EAAM+B,eAAgB/B,EAAMI,eAC1EqD,gBAAiBzD,EAAM0D,iBACvBC,YAAa3D,EAAM2D,YACnBV,mBAAoBA,EACpB5C,UAAU,gBACVuD,cAAY,EACZN,gBAAc,EACdO,uBAAuB,UAGzB,gBAACC,EAAA,EAAuB,CACtBrB,YAAaA,EACbV,eAAgB/B,EAAM+B,eACtByB,cAAc,QAAgBf,EAAYjG,GAAIwD,EAAM+B,eAAgB/B,EAAMI,eAC1EqD,gBAAiBzD,EAAM0D,iBACvBC,YAAa3D,EAAM2D,YACnBV,mBAAoBA,EACpBW,cAAY,IAKtB,KAEF,gBAAC7D,EAAyB,CACxBU,mBAAoBwB,EACpB7B,cAAeJ,EAAMI,cACrBQ,cAAeA,EACfJ,aAAcR,EAAMQ,aACpBF,wBAAyBO,IAIjC,C,sLC7HA,IACM,EAAYf,EAAA,mBADA,oCAWZ,SAAUiE,EAA8B/D,G,gBACrCmD,G,GAAkB,OAAsBa,EAAA,mB,EAAoC,E,o4BAA9D,IAErB,EAAAC,EAAA,KAEA,IAAMC,EAAsB,kBAC1BC,EAAA,sBAAwCnE,EAAMoE,gBAE1CtC,EAAc,mBAA0D,QAAxB,EAAAoC,EAAoBG,YAAI,eAAED,gBAC9ED,EAAA,cAAgCD,EAAoBG,KAAKD,gBAErDE,EAAyB,gCAEzBC,GAAU,OACdvE,EAAMoE,eACN,SAAkB,UAA+BE,IAE7CE,EAAS,kBAA6BC,EAAA,aAE5C,OAAqB,CAAEP,EAAqBK,KAC5C,EAAAG,EAAA,GAAsBR,GAEtB,OAAiE,OAC/C,QAAhB,EAAApC,EAAYuC,YAAI,eAAE7H,GACM,QAAxB,EAAA0H,EAAoBG,YAAI,eAAE7H,GAC1BwD,EAAM2E,YAHAvE,EAAa,EAAbA,cAAesD,EAAgB,EAAhBA,iBAAkBnB,EAAmB,EAAnBA,oBAMnCR,EAA6B,QAAZ,EAAAwC,EAAQF,YAAI,eAAEO,SAAShH,MAAK,SAAAiH,G,gBACjD,OAAI7E,EAAM8E,QACS,QAAV,EAAM,QAAN,EAAAD,EAAEvI,YAAI,eAAEE,UAAE,eAAEoG,eAA2B,QAAZ,EAAA5C,EAAM8E,cAAM,eAAElC,cAE9C5C,EAAMvD,YACsB,QAAvB,EAAY,QAAZ,EAAAoI,EAAE3B,kBAAU,eAAEzG,iBAAS,eAAEmG,eAA8B,QAAf,EAAA5C,EAAMvD,iBAAS,eAAEmG,WAGpE,IAEMmC,EAAahD,EACf,EAAU,UAAW,CAAEiD,aAAa,OAAkBjD,EAAezF,MAAQyF,EAAemB,WAAYC,KACxG,GACE8B,IAAenD,EAAYuC,QAAUE,EAAQF,QAAUG,EAAOH,KAEpE,OACE,gBAACa,EAAA,EAAK,CACJC,MAAOJ,EACPK,oBAAqBH,EACrBN,WAAY3E,EAAM2E,WAClBU,KAAK,MAEJJ,GACC,gBAAC7D,EAAmB,CAClBU,YAAaA,EAAYuC,KACzBtC,eAAgBA,EAChB3B,cAAeA,EACfsD,iBAAkBA,EAClBnB,oBAAqBA,EACrBoB,YAAaa,EAAOH,KAAKV,YACzBd,sBAAuB7C,EAAMsF,cAC7B9E,aAAcR,EAAM2E,WACpBxB,eAAgBA,EAChBG,eAAgBtD,EAAMsD,iBAKhC,C,2CC9FO,IAAMiC,EAA0C,CACrDC,KAAM,IACNC,SAAU,IAGCC,EAA0C,CACrDF,KAAM,GACNC,SAAU,G,kBCVN,SAAUE,EAAuBC,EAAiB1D,EAAgC2D,GACtF,IAAIlK,EAAM,GAAH,OAAMiK,EAAO,YAAI1D,EAAOvC,MAAK,YAAIuC,EAAOtC,KAEzCkG,EAAYjK,MAAMC,QAAQoG,EAAO4C,QAAU5C,EAAO4C,OAAOiB,OAAOC,KAAK,KAAO9D,EAAO4C,OACnFmB,EAAapK,MAAMC,QAAQoG,EAAOgE,SAAWhE,EAAOgE,QAAQH,OAAOC,KAAK,KAAO9D,EAAOgE,QAW5F,OATIJ,IACFnK,GAAO,IAAJ,OAAQmK,IAETG,IACFtK,GAAO,IAAJ,OAAQsK,IAETJ,IACFlK,GAAO,IAAJ,OAAQkK,IAENlK,CACT,C,uFCPawK,EAAiB,CAO5BC,aAAY,SAAC9K,EAAoB+K,GAC/B,IAAQhL,EAAY,sBAAZA,QAEJiL,EAA2C,iBAApBjL,EAAQC,OAC/B,8BAA0CD,EAAQC,QAClDD,EAAQC,OAER+K,EAAQjH,eACVkH,EAAgB,SAAkBA,EAAeD,EAAQjH,eAE3D,IAAMmH,GAAgBF,aAAO,EAAPA,EAASlH,OAC5B,+BAAMmH,GAAkBhL,GACvBA,EAEEkL,EAAiB,OAAH,wBACfnL,GAAO,CACVC,OAAQiL,IAMN,YAAqBlL,EAASmL,IAGlC,eAA2BA,EAAgB,SAAkBH,EAAS,CAAE,QAAS,iBACnF,E","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/DateRangeUtils.ts","file:///app/packages/libs/shared/src/apps/student-response-list/StudentResponseListFooter.tsx","file:///app/packages/libs/shared/src/apps/student-response-list/StudentResponseListHeader.tsx","file:///app/packages/libs/shared/src/apps/student-response-list/student-response-list.scss","file:///app/packages/libs/shared/src/apps/student-response-list/StudentResponseList.tsx","file:///app/packages/libs/shared/src/apps/analytics/views/interactive-student-results/InteractiveStudentResultsView.tsx","file:///app/packages/libs/shared/src/constants/ScoreThresholds.ts","file:///app/packages/libs/shared/src/utils/AnalyticsRequestUtils.ts","file:///app/packages/libs/shared/src/utils/AppRouteHelper.ts"],"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 { 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';\n\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\nimport { Interaction } from 'libs/shared/interfaces';\n\nconst namespace = 'interactives.studentResponseList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface StudentResponseListFooterProps {\n interactionsToMark: Interaction[];\n markedAnswers: MarkedAnswerHash;\n onClickSubmit: () => void;\n onClickClose: () => void;\n showSubmitButtonSpinner: boolean;\n}\n\nexport function StudentResponseListFooter(props: StudentResponseListFooterProps): JSX.Element {\n const numMarkedAnswers = Object.keys(props.markedAnswers).length;\n\n return (\n <div className='d-flex justify-content-end pt-3'>\n <div>\n {!props.showSubmitButtonSpinner &&\n <button className='btn btn-link' onClick={props.onClickClose}>\n {getPhrase('close')}\n </button>\n }\n {!!props.interactionsToMark.length &&\n <SpinnerButton\n variant='outline-dark'\n onClick={props.onClickSubmit}\n disabled={!numMarkedAnswers}\n showSpinner={props.showSubmitButtonSpinner}\n >\n {getPhrase('submitAnswers')}\n </SpinnerButton>\n }\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { ResultsSummary } from 'libs/shared/apps/analytics/interfaces/ResultsSummary';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\nimport { Interaction } from 'libs/shared/interfaces';\n\nconst namespace = 'interactives.studentResponseList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface StudentResponseListHeaderProps {\n summary: ResultsSummary;\n interactionsToMark: Interaction[];\n markedAnswers: MarkedAnswerHash;\n onClickSubmit: () => void;\n showSubmitButtonSpinner: boolean;\n}\n\nexport function StudentResponseListHeader(props: StudentResponseListHeaderProps): JSX.Element {\n const numMarkedAnswers = Object.keys(props.markedAnswers).length;\n\n return (\n <div className='d-flex justify-content-between pb-3'>\n <div className='d-flex'>\n {!!props.summary.unanswered &&\n <div className='bg-light rounded p-2 me-2'>\n <strong className='me-2'>{getPhrase('unanswered')}</strong>\n {props.summary.unanswered}\n </div>\n }\n <div className='bg-light rounded p-2 me-2'>\n <strong className='me-2'>{getPhrase('score')}</strong>\n {props.summary.awaitingMarking\n ? <em>{getPhrase('pending')}</em>\n : `${Math.round(props.summary.percentCorrect * 100)}%`\n }\n </div>\n </div>\n <div>\n {!!props.interactionsToMark.length &&\n <SpinnerButton\n variant='outline-dark'\n onClick={props.onClickSubmit}\n disabled={!numMarkedAnswers}\n showSpinner={props.showSubmitButtonSpinner}\n >\n {getPhrase('submitAnswers')}\n </SpinnerButton>\n }\n </div>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"awaitingMarking\":\"MvGb5\"};","import React from 'react';\n\nimport { InteractionResponseItem } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/InteractionResponseItem';\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { anonymiseUserName } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { getMarkedStatus, getStudentResultsSummary } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { InteractionResponse } from 'libs/shared/components/interaction-response/InteractionResponse';\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, Interactive, StudentAnswer, StudentResults } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { getInteractions, getStudentResult } from 'libs/shared/utils/InteractiveHelper';\n\nimport { StudentResponseListFooter } from './StudentResponseListFooter';\nimport { StudentResponseListHeader } from './StudentResponseListHeader';\n\nimport styles from './student-response-list.scss';\n\nfunction getInteractionsToMark(\n interactions: Interaction[],\n studentResults: StudentResults\n): Interaction[] {\n return interactions.filter(i => {\n return InteractiveCorrectnessHelper.isInteractionCorrect(\n i,\n getStudentResult(studentResults)\n ) === InteractionCorrectness.AwaitingMarking;\n });\n}\n\n// eslint-disable-next-line rulesdir/require-view-title\nfunction useScrollSelectedInteractionIntoView(): React.MutableRefObject<HTMLLIElement> {\n const ref = React.useRef<HTMLLIElement>();\n const [ scrolled, setScrolled ] = React.useState(false);\n\n // Only scroll once\n React.useEffect(() => {\n if (!ref.current || scrolled)\n return;\n\n setScrolled(true);\n ref.current.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }, [ ref.current, scrolled ]);\n\n return ref;\n}\n\ninterface StudentResponseListProps {\n interactive: Interactive;\n markedAnswers: MarkedAnswerHash;\n studentResults: StudentResults;\n addMarkedAnswers: (answer: StudentAnswer[], status: InteractiveAnswerStatus) => void;\n submitMarkedAnswers: () => void;\n onClickClose: () => void;\n imageCdnUrl: string;\n selectedInteractionId?: string;\n anonymiseUsers: boolean;\n reportsStyling?: boolean;\n}\n\nexport function StudentResponseList(props: StudentResponseListProps): JSX.Element {\n const [ showSpinner, setShowSpinner ] = React.useState(false);\n const selectedInteractionRef = useScrollSelectedInteractionIntoView();\n\n const summary = getStudentResultsSummary(props.interactive, props.studentResults);\n const interactions = getInteractions(props.interactive);\n const questionsToMark = getInteractionsToMark(interactions, props.studentResults);\n\n function onClickSubmit(): void {\n setShowSpinner(true);\n props.submitMarkedAnswers();\n }\n\n return (\n <>\n <StudentResponseListHeader\n summary={summary}\n interactionsToMark={questionsToMark}\n markedAnswers={props.markedAnswers}\n onClickSubmit={onClickSubmit}\n showSubmitButtonSpinner={showSpinner}\n />\n <ul className='list-unstyled'>\n {interactions.map((interaction, idx) => {\n const isSelected = interaction.id.toString() === props.selectedInteractionId?.toString();\n const markingRequired = questionsToMark.some(q => q.id === interaction.id);\n const anonymisedUserName = anonymiseUserName(\n props.studentResults.user || props.studentResults.publicUser,\n props.anonymiseUsers\n );\n\n let className = 'p-2 mb-3 rounded';\n\n if (isSelected)\n className += ' border-2 border-info shadow';\n\n if (markingRequired)\n className += ` ${styles.awaitingMarking}`;\n else\n className += ' border';\n\n return (\n <li key={idx} className={className} ref={isSelected ? selectedInteractionRef : null}>\n <div className='d-flex mb-2'>\n <InteractionLabel\n interaction={interaction}\n iconClassName='flex-shrink-0'\n />\n </div>\n {props.reportsStyling ? (\n <InteractionResponse\n interaction={interaction}\n studentResults={props.studentResults}\n markedStatus={getMarkedStatus(interaction.id, props.studentResults, props.markedAnswers)}\n markInteraction={props.addMarkedAnswers}\n imageCdnUrl={props.imageCdnUrl}\n anonymisedUserName={anonymisedUserName}\n className='bg-light ps-2'\n showFeedback\n reportsStyling\n responseComponentClass='mx-n2'\n />\n ) : (\n <InteractionResponseItem\n interaction={interaction}\n studentResults={props.studentResults}\n markedStatus={getMarkedStatus(interaction.id, props.studentResults, props.markedAnswers)}\n markInteraction={props.addMarkedAnswers}\n imageCdnUrl={props.imageCdnUrl}\n anonymisedUserName={anonymisedUserName}\n showFeedback\n />\n )}\n </li>\n );\n })}\n </ul>\n <StudentResponseListFooter\n interactionsToMark={questionsToMark}\n markedAnswers={props.markedAnswers}\n onClickSubmit={onClickSubmit}\n onClickClose={props.onClickClose}\n showSubmitButtonSpinner={showSpinner}\n />\n </>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { useFetchInteractiveResults } from 'libs/shared/apps/analytics/hooks/UseFetchInteractiveResults';\nimport { useMarkAnswers } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { AnalyticsFilterHelper } from 'libs/shared/apps/analytics/utils/AnalyticsFilterUtils';\nimport { anonymiseUserName } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { getInsightsDateRangePresets, getStartEndParams } from 'libs/shared/apps/analytics/utils/DateRangeUtils';\nimport { StudentResponseList } from 'libs/shared/apps/student-response-list/StudentResponseList';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { useCannotConsumeError } from 'libs/shared/hooks/useCannotConsumeError';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { useLockContentWidth } from 'libs/shared/hooks/useLockContentWidth';\nimport { Config, Interactive, InteractiveMetadata } from 'libs/shared/interfaces';\nimport { PopupViewProps } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.interactiveStudentResults';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractiveStudentResultsViewProps extends PopupViewProps {\n userId: string;\n interactiveId: string;\n interactionId?: string;\n reportsStyling?: boolean;\n profileId?: string;\n}\n\nexport function InteractiveStudentResultsView(props: InteractiveStudentResultsViewProps): JSX.Element {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n useLockContentWidth();\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n InteractiveRequests.interactiveMetadata(props.interactiveId)\n );\n const interactive = Flight.useBasicFetch<Interactive>(interactiveMetadata.data?.interactiveId &&\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId));\n\n const dateRangeAppLinkParams = AnalyticsFilterHelper.getDateRangeAppLinkParams();\n\n const results = useFetchInteractiveResults(\n props.interactiveId,\n getStartEndParams(getInsightsDateRangePresets(), dateRangeAppLinkParams)\n );\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n useHandleObjectError([ interactiveMetadata, results ]);\n useCannotConsumeError(interactiveMetadata);\n\n const { markedAnswers, addMarkedAnswers, submitMarkedAnswers } = useMarkAnswers(\n interactive.data?.id,\n interactiveMetadata.data?.id,\n props.closePopup\n );\n\n const studentResults = results.data?.students.find(s => {\n if (props.userId)\n return s.user?.id?.toString() === props.userId?.toString();\n\n if (props.profileId)\n return s.publicUser?.profileId?.toString() === props.profileId?.toString();\n\n return false;\n });\n\n const popupTitle = studentResults\n ? getPhrase('heading', { studentName: anonymiseUserName(studentResults.user || studentResults.publicUser, anonymiseUsers) })\n : '';\n const dataLoaded = !!interactive.data && !!results.data && !!config.data;\n\n return (\n <Popup\n title={popupTitle}\n showLoadingSpinner={!dataLoaded}\n closePopup={props.closePopup}\n size='lg'\n >\n {dataLoaded &&\n <StudentResponseList\n interactive={interactive.data}\n studentResults={studentResults}\n markedAnswers={markedAnswers}\n addMarkedAnswers={addMarkedAnswers}\n submitMarkedAnswers={submitMarkedAnswers}\n imageCdnUrl={config.data.imageCdnUrl}\n selectedInteractionId={props.interactionId}\n onClickClose={props.closePopup}\n anonymiseUsers={anonymiseUsers}\n reportsStyling={props.reportsStyling}\n />\n }\n </Popup>\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};","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};"],"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","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","LanguageService","StudentResponseListFooter","props","numMarkedAnswers","Object","keys","markedAnswers","className","showSubmitButtonSpinner","onClick","onClickClose","interactionsToMark","SpinnerButton","variant","onClickSubmit","showSpinner","StudentResponseListHeader","summary","unanswered","awaitingMarking","round","percentCorrect","StudentResponseList","ref","scrolled","setScrolled","setShowSpinner","selectedInteractionRef","current","scrollIntoView","behavior","block","interactive","studentResults","interactions","questionsToMark","filter","i","InteractiveCorrectnessHelper","InteractionCorrectness","getInteractionsToMark","submitMarkedAnswers","map","interaction","idx","isSelected","toString","selectedInteractionId","markingRequired","some","q","anonymisedUserName","publicUser","anonymiseUsers","InteractionLabel","iconClassName","reportsStyling","InteractionResponse","markedStatus","markInteraction","addMarkedAnswers","imageCdnUrl","showFeedback","responseComponentClass","InteractionResponseItem","InteractiveStudentResultsView","SharedViewModelKeys","useLockContentWidth","interactiveMetadata","InteractiveRequests","interactiveId","data","dateRangeAppLinkParams","results","config","ConfigRequests","useCannotConsumeError","closePopup","students","s","userId","popupTitle","studentName","dataLoaded","Popup","title","showLoadingSpinner","size","interactionId","ScoreThresholdDefaults","HIGH","MODERATE","ScoreThresholdInsights","getAnalyticsRequestKey","baseKey","sharerId","userIdKey","sort","join","groupIdKey","groupId","AppRouteHelper","updateParams","options","currentParams","updatedParams","updatedAppLink"],"sourceRoot":""}