@clickview/lite 0.64.0-rc.1 → 0.64.0-rc.3
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.
- package/dist/bundles.json +1 -1
- package/dist/css/{7153-lite-0cc5db0db7.chunk.css → 2962-lite-2002c62a24.chunk.css} +0 -1
- package/dist/css/{1857-lite-324255d395.chunk.css → 6173-lite-911f35513f.chunk.css} +0 -1
- package/dist/css/{2083-lite-6cb1775e12.chunk.css → 7324-lite-238bd550b7.chunk.css} +0 -1
- package/dist/css/{9013-lite-620f218839.chunk.css → 9013-lite-3c31b606c5.chunk.css} +2 -2
- package/dist/languages/en.json +1 -1
- package/dist/scripts/1216-899540dc73-lite.chunk.js +2 -0
- package/dist/scripts/1216-899540dc73-lite.chunk.js.map +1 -0
- package/dist/scripts/1820-b572681b3a-lite.chunk.js +2 -0
- package/dist/scripts/1820-b572681b3a-lite.chunk.js.map +1 -0
- package/dist/scripts/229-ac9f12e165-lite.chunk.js +2 -0
- package/dist/scripts/229-ac9f12e165-lite.chunk.js.map +1 -0
- package/dist/scripts/2712-a851ddc3c3-lite.chunk.js +2 -0
- package/dist/scripts/2712-a851ddc3c3-lite.chunk.js.map +1 -0
- package/dist/scripts/{2788-eca70707c6-lite.chunk.js → 2788-c8ae3be73f-lite.chunk.js} +1 -1
- package/dist/scripts/2788-c8ae3be73f-lite.chunk.js.map +1 -0
- package/dist/scripts/{7153-0ed8513e59-lite.chunk.js → 2962-7f2e4412f0-lite.chunk.js} +2 -2
- package/dist/scripts/{7153-0ed8513e59-lite.chunk.js.map → 2962-7f2e4412f0-lite.chunk.js.map} +1 -1
- package/dist/scripts/2988-b602b64344-lite.chunk.js +2 -0
- package/dist/scripts/2988-b602b64344-lite.chunk.js.map +1 -0
- package/dist/scripts/3180-c1f065183d-lite.chunk.js +2 -0
- package/dist/scripts/3180-c1f065183d-lite.chunk.js.map +1 -0
- package/dist/scripts/3549-111225ff0e-lite.chunk.js +2 -0
- package/dist/scripts/3549-111225ff0e-lite.chunk.js.map +1 -0
- package/dist/scripts/4591-f78fa6c784-lite.chunk.js +2 -0
- package/dist/scripts/4591-f78fa6c784-lite.chunk.js.map +1 -0
- package/dist/scripts/4667-5101904582-lite.chunk.js +2 -0
- package/dist/scripts/4667-5101904582-lite.chunk.js.map +1 -0
- package/dist/scripts/4718-1426986e1d-lite.chunk.js +2 -0
- package/dist/scripts/4718-1426986e1d-lite.chunk.js.map +1 -0
- package/dist/scripts/{5056-6057435479-lite.chunk.js → 5056-65c739468f-lite.chunk.js} +1 -1
- package/dist/scripts/5056-65c739468f-lite.chunk.js.map +1 -0
- package/dist/scripts/5201-98ee21febb-lite.chunk.js +2 -0
- package/dist/scripts/5201-98ee21febb-lite.chunk.js.map +1 -0
- package/dist/scripts/5595-79068997ce-lite.chunk.js +2 -0
- package/dist/scripts/5595-79068997ce-lite.chunk.js.map +1 -0
- package/dist/scripts/5770-f88f6d9c00-lite.chunk.js +2 -0
- package/dist/scripts/5770-f88f6d9c00-lite.chunk.js.map +1 -0
- package/dist/scripts/5896-60133bfdad-lite.chunk.js +3 -0
- package/dist/scripts/5896-60133bfdad-lite.chunk.js.map +1 -0
- package/dist/scripts/6173-7f9939c29e-lite.chunk.js +3 -0
- package/dist/scripts/6173-7f9939c29e-lite.chunk.js.map +1 -0
- package/dist/scripts/6181-9d7668c9e4-lite.chunk.js +3 -0
- package/dist/scripts/6181-9d7668c9e4-lite.chunk.js.map +1 -0
- package/dist/scripts/6455-37039eb687-lite.chunk.js +2 -0
- package/dist/scripts/6455-37039eb687-lite.chunk.js.map +1 -0
- package/dist/scripts/6623-84b33c6856-lite.chunk.js +3 -0
- package/dist/scripts/6623-84b33c6856-lite.chunk.js.map +1 -0
- package/dist/scripts/6919-8f60ca2263-lite.chunk.js +2 -0
- package/dist/scripts/6919-8f60ca2263-lite.chunk.js.map +1 -0
- package/dist/scripts/7267-1f5006c9c5-lite.chunk.js +2 -0
- package/dist/scripts/7267-1f5006c9c5-lite.chunk.js.map +1 -0
- package/dist/scripts/{2083-7daacf0112-lite.chunk.js → 7324-ee20e73ac1-lite.chunk.js} +2 -2
- package/dist/scripts/{2083-7daacf0112-lite.chunk.js.map → 7324-ee20e73ac1-lite.chunk.js.map} +1 -1
- package/dist/scripts/7434-fef3ea4e89-lite.chunk.js +2 -0
- package/dist/scripts/7434-fef3ea4e89-lite.chunk.js.map +1 -0
- package/dist/scripts/7443-4866d0c9ab-lite.chunk.js +3 -0
- package/dist/scripts/7443-4866d0c9ab-lite.chunk.js.map +1 -0
- package/dist/scripts/8416-7d71a55a14-lite.chunk.js +2 -0
- package/dist/scripts/8416-7d71a55a14-lite.chunk.js.map +1 -0
- package/dist/scripts/8465-01b0f72699-lite.chunk.js +2 -0
- package/dist/scripts/8465-01b0f72699-lite.chunk.js.map +1 -0
- package/dist/scripts/9013-6fcc58f028-lite.chunk.js +2 -0
- package/dist/scripts/9013-6fcc58f028-lite.chunk.js.map +1 -0
- package/dist/scripts/9264-998d93d1c2-lite.chunk.js +2 -0
- package/dist/scripts/9264-998d93d1c2-lite.chunk.js.map +1 -0
- package/dist/scripts/9894-0fba5cf702-lite.chunk.js +3 -0
- package/dist/scripts/9894-0fba5cf702-lite.chunk.js.map +1 -0
- package/dist/scripts/bundle-48f54fe5c2.min.js +3 -0
- package/dist/scripts/bundle-48f54fe5c2.min.js.map +1 -0
- package/package.json +1 -1
- package/dist/scripts/1755-462bcd99e9-lite.chunk.js +0 -2
- package/dist/scripts/1755-462bcd99e9-lite.chunk.js.map +0 -1
- package/dist/scripts/180-6c4779f6ab-lite.chunk.js +0 -2
- package/dist/scripts/180-6c4779f6ab-lite.chunk.js.map +0 -1
- package/dist/scripts/1820-3b5d0a340d-lite.chunk.js +0 -2
- package/dist/scripts/1820-3b5d0a340d-lite.chunk.js.map +0 -1
- package/dist/scripts/1857-d3af9d98eb-lite.chunk.js +0 -3
- package/dist/scripts/1857-d3af9d98eb-lite.chunk.js.map +0 -1
- package/dist/scripts/229-900e650427-lite.chunk.js +0 -2
- package/dist/scripts/229-900e650427-lite.chunk.js.map +0 -1
- package/dist/scripts/2788-eca70707c6-lite.chunk.js.map +0 -1
- package/dist/scripts/3180-22edf4c9fc-lite.chunk.js +0 -2
- package/dist/scripts/3180-22edf4c9fc-lite.chunk.js.map +0 -1
- package/dist/scripts/3549-30d3b1cd05-lite.chunk.js +0 -2
- package/dist/scripts/3549-30d3b1cd05-lite.chunk.js.map +0 -1
- package/dist/scripts/3776-0027340c98-lite.chunk.js +0 -2
- package/dist/scripts/3776-0027340c98-lite.chunk.js.map +0 -1
- package/dist/scripts/4591-3e8dddd0e9-lite.chunk.js +0 -2
- package/dist/scripts/4591-3e8dddd0e9-lite.chunk.js.map +0 -1
- package/dist/scripts/4667-f3882f2379-lite.chunk.js +0 -2
- package/dist/scripts/4667-f3882f2379-lite.chunk.js.map +0 -1
- package/dist/scripts/4718-16d6e39561-lite.chunk.js +0 -2
- package/dist/scripts/4718-16d6e39561-lite.chunk.js.map +0 -1
- package/dist/scripts/5056-6057435479-lite.chunk.js.map +0 -1
- package/dist/scripts/5201-7d3867d027-lite.chunk.js +0 -2
- package/dist/scripts/5201-7d3867d027-lite.chunk.js.map +0 -1
- package/dist/scripts/5595-10e586779d-lite.chunk.js +0 -2
- package/dist/scripts/5595-10e586779d-lite.chunk.js.map +0 -1
- package/dist/scripts/5896-5d2f32c59e-lite.chunk.js +0 -3
- package/dist/scripts/5896-5d2f32c59e-lite.chunk.js.map +0 -1
- package/dist/scripts/6181-50a39979ec-lite.chunk.js +0 -3
- package/dist/scripts/6181-50a39979ec-lite.chunk.js.map +0 -1
- package/dist/scripts/6455-2f45be17cf-lite.chunk.js +0 -2
- package/dist/scripts/6455-2f45be17cf-lite.chunk.js.map +0 -1
- package/dist/scripts/6623-ebbffb59b3-lite.chunk.js +0 -3
- package/dist/scripts/6623-ebbffb59b3-lite.chunk.js.map +0 -1
- package/dist/scripts/6919-cb2de57c2e-lite.chunk.js +0 -2
- package/dist/scripts/6919-cb2de57c2e-lite.chunk.js.map +0 -1
- package/dist/scripts/7267-c2d30dd339-lite.chunk.js +0 -2
- package/dist/scripts/7267-c2d30dd339-lite.chunk.js.map +0 -1
- package/dist/scripts/7434-c34ca23a21-lite.chunk.js +0 -2
- package/dist/scripts/7434-c34ca23a21-lite.chunk.js.map +0 -1
- package/dist/scripts/7443-7c72de0cb9-lite.chunk.js +0 -3
- package/dist/scripts/7443-7c72de0cb9-lite.chunk.js.map +0 -1
- package/dist/scripts/8022-0656cce655-lite.chunk.js +0 -2
- package/dist/scripts/8022-0656cce655-lite.chunk.js.map +0 -1
- package/dist/scripts/9013-adc5d3517a-lite.chunk.js +0 -2
- package/dist/scripts/9013-adc5d3517a-lite.chunk.js.map +0 -1
- package/dist/scripts/9155-87c9030ce9-lite.chunk.js +0 -2
- package/dist/scripts/9155-87c9030ce9-lite.chunk.js.map +0 -1
- package/dist/scripts/9264-750b3d6ea0-lite.chunk.js +0 -2
- package/dist/scripts/9264-750b3d6ea0-lite.chunk.js.map +0 -1
- package/dist/scripts/9894-bc34edcd67-lite.chunk.js +0 -3
- package/dist/scripts/9894-bc34edcd67-lite.chunk.js.map +0 -1
- package/dist/scripts/bundle-e02b7c5d7f.min.js +0 -3
- package/dist/scripts/bundle-e02b7c5d7f.min.js.map +0 -1
- package/dist/css/{6455-lite-fe0bc6d95f.chunk.css → 6455-lite-c07987d46c.chunk.css} +1 -1
- /package/dist/css/{9155-lite-447d345417.chunk.css → 8465-lite-447d345417.chunk.css} +0 -0
- /package/dist/scripts/{1857-d3af9d98eb-lite.chunk.js.LICENSE.txt → 5896-60133bfdad-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{5896-5d2f32c59e-lite.chunk.js.LICENSE.txt → 6173-7f9939c29e-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{6181-50a39979ec-lite.chunk.js.LICENSE.txt → 6181-9d7668c9e4-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{6623-ebbffb59b3-lite.chunk.js.LICENSE.txt → 6623-84b33c6856-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{7443-7c72de0cb9-lite.chunk.js.LICENSE.txt → 7443-4866d0c9ab-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{9894-bc34edcd67-lite.chunk.js.LICENSE.txt → 9894-0fba5cf702-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{bundle-e02b7c5d7f.min.js.LICENSE.txt → bundle-48f54fe5c2.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:" "}}))}))))}))},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":"mJAGaA,EAAe,CAC1BC,uBAAsB,SAACC,EAA+BC,GACpD,OAAIA,GACK,IAAAC,cAAaF,EAAWC,GAE1BD,CACT,E,yGCuCI,SAAUG,EAAQC,GACtB,IAAMC,EAAiB,WAAc,kBAAMD,EAAME,QAAQC,MAAK,SAACC,EAAGC,GAAC,OAAKD,EAAEE,MAAQD,EAAEC,KAAK,GAAC,GAAE,CAACN,EAAME,UAE7FK,EAAiC,GACjCC,EAA+B,GAErCP,EAAeQ,SAAQ,SAAAL,GACjBA,EAAEM,OACJH,EAAcI,KAAKP,GAEnBI,EAAYG,KAAKP,EACrB,IAEA,IAAIQ,EAAY,SAKhB,OAHIZ,EAAMY,YACRA,GAAa,IAAJ,OAAQZ,EAAMY,YAEpBL,EAAcM,QAAWL,EAAYK,OAIxC,uBAAKD,UAAWA,GACbL,EAAcM,OAASN,EAAcO,KAAI,SAACV,EAAGW,GAAG,OAC/C,gBAAC,WAAc,CAACC,IAAKD,GACjB,WACA,GAAIX,EAAEa,MAAO,CACX,IAAMA,EAAQ,eAA0Bb,EAAEa,OACtCb,EAAEa,MACF,kBAAM,gCAAGb,EAAEa,MAAS,EAExB,OACE,gBAAC,IAAY,CACXC,QAASd,EAAEc,QACXC,KAAMf,EAAEe,KACRC,QAAShB,EAAEgB,QACXC,QAASjB,EAAEiB,QACXC,QAAStB,EAAMuB,sBACfX,UAAWR,EAAEQ,UACbY,QAASpB,EAAEoB,QACXC,YAAarB,EAAEqB,YACfC,cAAetB,EAAEsB,cACjBC,iBAAkBvB,EAAEuB,iBACpBC,aAAcxB,EAAEwB,aAChBC,SAAUzB,EAAEyB,UAEXZ,IAGN,CAED,IAAMa,EACJ,gBAAC,IAAU,CACTZ,QAASd,EAAEc,QACXC,KAAMf,EAAEe,KACRC,QAAShB,EAAEgB,QACXC,QAASjB,EAAEiB,QACXT,UAAWR,EAAEQ,UACbc,cAAetB,EAAEsB,cACjBC,iBAAkBvB,EAAEuB,iBACpBC,aAAcxB,EAAEwB,aAChBC,SAAUzB,EAAEyB,SACZE,WAAY3B,EAAE2B,WACdC,WAAYhC,EAAMgC,WAClBC,UAAW7B,EAAEoB,UAIjB,OAAOpB,EAAEoB,QACL,gBAAC,IAAO,CAACU,MAAO9B,EAAEoB,QAASW,UAAQ,GAAEL,GACrCA,CACN,CA9CE,GA+Ca,IACd,iCACJ9B,EAAMoC,eAAiBpC,EAAMoC,cAC7B5B,EAAYK,OACX,gBAAC,IAAe,CACdX,QAASM,EACT6B,wBAAyBrC,EAAMsC,yBAC/Bf,sBAAuBvB,EAAMuB,sBAC7BgB,UAAWvC,EAAMuC,YAEjB,kCA/DC,gCAkEX,C,0ICpIA,SAAgB,eAAiB,SCgBjC,SAASC,IACP,OACE,gCACE,uBAAKC,MAAO,CAAEC,QAAS,oBACrB,uBAAK9B,UAAU,6BAA6B6B,MAAO,CAAEE,OAAQ,YAAaC,MAAO,WAEnF,uBAAKH,MAAO,CAAEC,QAAS,oBACrB,uBAAK9B,UAAU,6BAA6B6B,MAAO,CAAEE,OAAQ,YAAaC,MAAO,YAEnF,uBAAKH,MAAO,CAAEC,QAAS,oBACrB,uBAAK9B,UAAU,6BAA6B6B,MAAO,CAAEE,OAAQ,YAAaC,MAAO,YAEnF,uBAAKH,MAAO,CAAEC,QAAS,oBACrB,uBAAK9B,UAAU,6BAA6B6B,MAAO,CAAEE,OAAQ,YAAaC,MAAO,WAIzF,CAEA,SAASC,EAAyBC,GAChC,IAAIlC,EAAY,gBAKhB,OAHIkC,IACFlC,GAAa,IAAJ,OAAQkC,IAEZlC,CACT,CAQA,SAASmC,EAAoB/C,GAC3B,IAAMiB,EAAQ+B,EAAA,aAA0BhD,EAAMiD,OAAOhC,OACjDjB,EAAMiD,OAAOhC,MACb,kBAAM,gCAAGjB,EAAMiD,OAAOhC,MAAS,EAEnC,GAAIjB,EAAMiD,OAAO/B,QACf,OACE,gBAACgC,EAAA,EAAO,CACNhC,QAASlB,EAAMiD,OAAO/B,QACtBE,QAASpB,EAAMiD,OAAO7B,QACtBR,UAAWiC,EAAyB7C,EAAMiD,OAAOrC,WACjDc,cAAe1B,EAAMiD,OAAOvB,cAC5BC,iBAAkB3B,EAAMiD,OAAOtB,iBAC/BC,aAAc5B,EAAMiD,OAAOrB,aAC3BC,SAAU7B,EAAMiD,OAAOpB,UAEtB7B,EAAMiD,OAAO5B,SAAW,gBAAC8B,EAAA,EAAY,CAAC9B,QAASrB,EAAMiD,OAAO5B,QAAST,UAAU,mDAChF,wBAAMA,UAAU,gBAAgBK,MAItC,SAASG,EAAQgC,GACfA,EAAEC,iBAEErD,EAAMiD,OAAOvB,eAAiB1B,EAAMiD,OAAOtB,kBAC7C2B,EAAA,gBAA8BtD,EAAMiD,OAAOvB,cAAe1B,EAAMiD,OAAOtB,kBAErEqB,EAAA,aAA0BhD,EAAMiD,OAAO7B,UACzCpB,EAAMiD,OAAO7B,UAEXpB,EAAMiD,OAAO9B,MACf,gBAA4BnB,EAAMiD,OAAO9B,KAAMnB,EAAMiD,OAAOrB,aAChE,CAEA,OAAI5B,EAAMiD,OAAO9B,KAEb,qBACEP,UAAWiC,EAAyB7C,EAAMiD,OAAOrC,WACjDQ,QAASA,EACTD,KAAMnB,EAAMiD,OAAO9B,MAElBnB,EAAMiD,OAAO5B,SAAW,gBAAC8B,EAAA,EAAY,CAAC9B,QAASrB,EAAMiD,OAAO5B,QAAST,UAAU,mDAChF,wBAAMA,UAAU,gBAAgBK,MAMpC,wBACEL,UAAS,yBAAoBiC,EAAyB7C,EAAMiD,OAAOrC,YACnEQ,QAASA,EACTmC,KAAK,SACLC,SAAU,EACVC,UAAW,SAACL,GAAsB,MAAe,UAAVA,EAAEpC,KAAmBI,EAAQgC,EAAE,GAErEpD,EAAMiD,OAAO5B,SAAW,gBAAC8B,EAAA,EAAY,CAAC9B,QAASrB,EAAMiD,OAAO5B,QAAST,UAAU,sCAC/EK,IAGP,CAeM,SAAUyC,EAAgB1D,GAC9B,IAAKA,EAAME,UAAYF,EAAME,QAAQW,OACnC,OAAO,iCAET,IAAM8C,EAAS3D,EAAME,QAAQ0D,MAAK,SAAAxD,GAAC,OAAIA,EAAEyD,eAAe,IAEpDjD,EAAY,WAEZZ,EAAMY,YACRA,GAAa,IAAJ,OAAQZ,EAAMY,YAGzB,IAOIkD,EAPEC,EAAmB,oBAAH,OAAuBC,EAAA,kBAEzC3B,EAA0B,wBAAH,OAA2B,kBAOtD,OALIrC,EAAMqC,0BACRA,GAA2B,IAAJ,OAAQrC,EAAMqC,0BAKrC,uBAAKzB,UAAWA,GACd,0BACEA,UAAWyB,EACX4B,KAAK,SACLC,GAAIH,EAAgB,iBACL,WAAU,cACb,WAAU,gBACR,OAAM,gBACN,QAAO,aACT,wBACZ3C,QAASuC,EAAS3D,EAAMuC,UAAY,MAEpC,gBAACY,EAAA,EAAY,CAAC9B,QAAS,UAAmB8C,KAAMnE,EAAMuB,yBAExD,sBAAIX,UAAU,uEAAsE,kBAAkBmD,GACnGJ,EACC,gBAACnB,EAAiB,MAClBxC,EAAME,QAAQY,KAAI,SAACV,EAAGW,GACpB,IAAMqD,OAA+BC,IAAjBP,GAA8BA,IAAiB1D,EAAEkE,MAGrE,OAFAR,EAAe1D,EAAEkE,MAEblE,EAAEoB,QAEF,sBAAIR,IAAKD,GACNqD,GAAe,sBAAIxD,UAAU,mBAAmB2C,KAAK,cACtD,gBAACgB,EAAA,EAAO,CAACrC,MAAO9B,EAAEoB,QAASW,UAAQ,GACjC,gBAACY,EAAmB,CAACE,OAAQ7C,MAQnC,sBAAIY,IAAKD,GACNqD,GAAe,sBAAIxD,UAAU,mBAAmB2C,KAAK,cACtD,gBAACR,EAAmB,CAACE,OAAQ7C,IAGnC,KAKV,CAvEAsD,EAAgBc,aAAe,CAC7BnC,wBAAyB,gBACzBd,sBAAuB4B,EAAAsB,EAAA,M,2JCjHnBC,EAAY,oBAkBZ,SAAUC,EAAW3E,GACzB,MAA8D,eAC5D4E,YAAY,GACT5E,GAFG6E,EAAU,EAAVA,WAAY3D,EAAO,EAAPA,QAAS4D,EAAK,EAALA,MAAOC,EAAY,EAAZA,aAAcH,EAAU,EAAVA,WAK5CI,EAAaH,EACfI,EAAA,YAA0BP,EAAW,SAAU,CAAEG,WAAAA,IACjDI,EAAA,YAA0BP,EAAW,QAEnCQ,EAAuB,UAAVJ,EAAoB,GAAK,aACtCK,EAAkBP,EAAa,cAAgB,GAErD,OACE,gBAAC1B,EAAA,EAAO,CACNhC,QAASA,EACTN,UAAS,mDAA8CmE,EAAY,YAAIG,EAAU,YAAIC,IAErF,gBAAChC,EAAA,EAAY,CAAC9B,QAAS,iBAA0B8C,KAAMhB,EAAAsB,EAAA,SACvD,wBAAM7D,UAAU,QAAQoE,GAG9B,CA3BAL,EAAWH,aAAe,CACxBM,MAAO,QACPC,aAAc,I,qGCvBhB,SAAgB,cAAgB,QAAQ,iBAAmB,QAAQ,sBAAwB,QAAQ,UAAY,QAAQ,cAAgB,QAAQ,kBAAoB,QAAQ,YAAc,QAAQ,sBAAwB,QAAQ,aAAe,QAAQ,QAAU,SCuBlQ,IAAMK,EAAQ,GAAH,OAAM,IAAmB,cAAmBxC,MAAK,YAAI,IAAmB,cAAmBD,QAatG,SAAS0C,EAAaC,GACpB,OAAIA,EAAQzE,OAAS,IACZ,KAEF,cACT,CAwBA,IAEa0E,EAAe,QAAW,SAASvF,G,YACtCsF,EAAyFtF,EAAzFsF,QAASE,EAAgFxF,EAAhFwF,OAAQC,EAAwEzF,EAAxEyF,YAAavF,EAA2DF,EAA3DE,QAASkC,EAAkDpC,EAAlDoC,cAAesD,EAAmC1F,EAAnC0F,iBAAkBC,EAAiB3F,EAAjB2F,aAE1EC,EAAyB,aAAiBC,EAAA,GAE1CC,GA5Cc,EAAAC,EAAA,KAEJC,IALS,KADL,KAkDdC,EAAsB,WAAc,WACxC,IAAKN,GAAgB3F,EAAMkG,eACzB,OAAO,EAET,IAAMC,EAAQC,EAAA,SAAkB,IAAIC,KAAQ,cAE5C,OAAKV,EAAaW,QAGXX,EAAaY,WAAaJ,GAASR,EAAaW,SAAWH,EAFzDR,EAAaY,YAAcJ,CAGtC,GAAG,CAACR,IAYEa,EAAexG,EAAMwG,cAAgB,CACzC5D,MAAOkD,EACPW,MAAOrB,EACPsB,WAAY,YAGRC,IAAQnB,KAAYC,GAAemB,EAAA,kBAA4BpB,EAAQ,CAC3EqB,gBAAiBpB,EACjBqB,qBAAsBxB,EACtBrB,KAAM,cACLuC,GAEGO,EAAgG,CACpGnG,UAAW,wBAAF,OAA0BZ,EAAMgH,iBACzCvE,MAAOkE,EAAM,CAAEM,gBAAiB,QAAF,OAAUN,EAAG,OAAS,CAAC,IAGlDnB,GAAUE,WACNqB,EAAetE,MACtBsE,EAAenG,WAAa,IAAJ,OAAQ8E,IAGlC,IAAMwB,EAAmBlH,EAAMmH,iBAEzBC,GAA0B,EAAAC,EAAA,GAAgBrH,EAAMsF,QAAS,KAE/D,OAAO5F,EAAA,yBAEL,0CAAYqH,GACV,uBAAKnG,UAAS,oBAAe,YAAgB,oCAC1CZ,EAAMsH,mBACL,uBAAK1G,UAAU,QACb,gBAAC+D,EAAU,CACTzD,QAASlB,EAAMsH,kBACfzC,WAAY7E,EAAMuH,eAClBxC,aAAc/E,EAAMwH,kBACpB1C,MAAM,WAKZ,uBAAKlE,UAAS,UAAKZ,EAAMyH,cAAgB,iEAAmE,GAAH,OAAM,gBAAoB,kBAAmB,QAAV,EAAAzH,EAAM0H,YAAI,eAAEf,KAAM,wBAA+B,QACxLhB,GACD,uBAAK/E,UAAS,4BAAuB,0BACnC,gBAAC+G,EAAA,EAAmB,CAClBC,KAAM,CACJ3D,KAAM0B,EAAaW,QAAU,QAAU,MACvCuB,KAAMlC,EAAaW,QAAO,UACnBF,EAAA,SAAkBT,EAAaY,UAAW,MAAK,YAAIH,EAAA,SAAkBT,EAAaW,QAAS,OAC9FF,EAAA,SAAkBT,EAAaY,UAAW,OAEhDuB,MA7Dd,SAAkCnC,GAChC,OAAKA,EAAaW,QAGdF,EAAA,SAAkBT,EAAaY,UAAWZ,EAAaW,QAAS,SAC3DF,EAAA,SAAkBT,EAAaY,UAAW,QAE5C,GAAP,OAAUH,EAAA,SAAkBT,EAAaY,UAAW,OAAM,cAAMH,EAAA,SAAkBT,EAAaW,QAAS,QAL/FF,EAAA,SAAkBT,EAAaY,UAAW,OAMrD,CAqDqBwB,CAAyBpC,GAChCqC,MAAOhI,EAAMiI,iBAInB,2BACGhC,GACC,uBAAKrF,UAAU,kFACb,gBAACsH,EAAA,EAAI,CAACxD,UA1FJ,sBA0F0ByD,OAAO,aAGtCnI,EAAMkG,gBACL,gBAACkC,EAAA,EAAa,CAACxH,UAAU,yEAE3B,uBAAKA,UAAU,6BACZZ,EAAMyH,gBAA2B,QAAV,EAAAzH,EAAM0H,YAAI,eAAEf,MAClC,uBAAK/F,UAAS,UAAK,oBAAwB,kEAA0DwG,IACnG,gBAACiB,EAAA,EAAS,CACRC,IAAK1B,EAAA,YAAgC,QAAV,EAAA5G,EAAM0H,YAAI,eAAEf,IAAK,CAAExC,KAAM,cACpD1B,MAAO,CAAE8F,gBAAiBvI,EAAMwI,iBAItC,sBAAI5H,UAAS,sDAAiD,UAAc,YAAIyE,EAAaC,GAAQ,YAAItF,EAAMyH,cAAgB,OAAS,KACrInC,EACA4B,GAAoB,gBAACA,EAAgB,WAIzChH,GACD,uBAAKU,UAAW,oBACd,gBAACb,EAAA,EAAO,CACNG,QAASA,EACTkC,cAAeA,EACfE,yBAA0BtC,EAAMsC,8BAKtCtC,EAAMyH,kBAA6B,QAAV,EAAAzH,EAAM0H,YAAI,eAAEf,MACrC,uBAAK/F,UAAW,iBACd,uBACE0H,IAAK1B,EAAA,YAAsB5G,EAAM0H,KAAKf,IAAK,CAAExC,KAAM,aACnDvD,UAAU,sBAMpBgF,aAAsB,EAAtBA,EAAwB6C,UAE5B,IAAG,SAACC,EAAWC,G,QAAuB,OACpCD,EAAUxI,UAAYyI,EAAUzI,SAC7BwI,EAAUpD,UAAYqD,EAAUrD,UAClB,QAAd,EAAAoD,EAAUhB,YAAI,eAAEf,QAAsB,QAAd,EAAAgC,EAAUjB,YAAI,eAAEf,I,IAGvC,SAAUiC,IACd,IAAMhD,EAAyB,aAAiBC,EAAA,GAEhD,OAAOnG,EAAA,yBACL,uBAAKkB,UAAS,oDAA+C,YAC7DgF,aAAsB,EAAtBA,EAAwB6C,UAE5B,C,uoCCvMA,IACMI,EAAY,qBADA,8BAiBLC,EAAiB,cAAiB,SAC7C9I,EACA+I,GAEA,MAAgE/I,EAAxDgJ,WAAcC,EAAI,EAAJA,KAAM/H,EAAO,EAAPA,QAASgI,EAAM,EAANA,OAAUC,EAAiBnJ,EAAjBmJ,aAE3CC,EAAcH,EACd/G,EAAgB,KASpB,OAPIkH,EAAYvI,OAtBS,KAuBvBuI,EAAcH,EAAKI,MAAM,EAvBF,IAuB2B,MAGlDnH,EAAQ+G,GAIR,sBACErI,UAAS,yBAAoBsI,EAAS,UAAY,IAClDhH,MAAOA,GAENgH,EACG,8BAASE,GACT,gBAAC,IAAO,CAAClI,QAASA,EAAS6H,IAAKA,GAC/BI,GAAgB,gBAAC,IAAY,CAAC9H,QAAS,iBAA0B8C,KAAM,EAAAM,EAAA,QACxE,wBAAM7D,UAAWuI,EAAe,OAAS,IAAKC,IAKxD,IAMaE,EAAc,SAAH,GAAyC,IAAnCC,EAAW,EAAXA,YACtBC,GAAW,OAAc,QAEzB3I,GAAS0I,aAAW,EAAXA,EAAa1I,SAAU,EAEiB,IAArB,YAAe,GAAM,GAA/C4I,EAAQ,KAAEC,EAAW,KACgC,IAArB,YAAe,GAAM,GAArDC,EAAW,KAAEC,EAAc,KAC7BC,EAAY,WAsBlB,GApBA,aAAgB,W,MACRC,EAAiF,QAA/D,EAAAP,aAAW,EAAXA,EAAaQ,QAAO,SAACC,EAAMC,GAAI,OAAKD,EAAOC,EAAKhB,KAAKpI,MAAM,GAAE,UAAE,QAAI,EAEvFA,EAAS,GAAKiJ,EA9DW,IA+D3BJ,GAAY,EAChB,GAAG,CAACH,aAAW,EAAXA,EAAa1I,SAKjB,mBAAsB,W,MAChB8I,IACe,QAAjB,EAAAE,EAAUK,eAAO,SAAEC,QACvB,GAAG,CAAEN,EAAUK,QAASP,KAOnB9I,GAAW2I,GAAY3I,EAAS,EACnC,OAAO,iCAET,GAAI2I,EACF,OACE,oCAAgB,cACd,sBAAI5I,UAAU,sBACZ,gBAACkI,EAAc,CAACE,WAAYO,EAAY1I,EAAS,GAAIsI,cAAY,MAKzE,IAAMiB,EAAQ,gBAACtB,EAAc,CAACE,WAAYO,EAAY,KAChDc,EAASxJ,EAAS,EAAI,gBAACiI,EAAc,CAACE,WAAYO,EAAY,KAAS,iCACvEe,EAAazJ,EAAS,EAAI,gBAACiI,EAAc,CAACE,WAAYO,EAAY1I,EAAS,KAAS,iCACpF0J,EAAO1J,EAAS,EAAI,gBAACiI,EAAc,CAACE,WAAYO,EAAY1I,EAAS,KAAS,iCAC9E2J,EAAOjB,EAAYF,MAAM,EAAGxI,EAAS,GAE3C,OACE,oCAAgB,cACd,sBAAID,UAAU,sBACXwJ,EACAC,EACAZ,EACC,sBAAI7I,UAAU,mBACZ,0BACEA,UAAU,WACVQ,QAhCZ,WACEsI,GAAY,GACZE,GAAe,EACjB,EA6BkC,aACVf,EAAU,WAAS,QAKnC2B,EAAK1J,KAAI,SAACkI,EAAYjI,GAAG,OACvB,gBAAC+H,EAAc,CACb9H,IAAKD,EACLiI,WAAYA,EACZD,IAAa,IAARhI,EAAY8I,EAAY,MAC7B,IAGLS,EACAC,GAIT,EAEaE,EAAqB,QAAW,YAAiD,QAAtCC,SAAAA,OAAQ,IAAG,IAAC,EAGlE,OAFiB,OAAc,QAI3B,uBAAK9J,UAAU,6BAA6B6B,MAAO,CAAEE,OAAQ,YAAaC,MAAO,UAKnF,oCAAgB,cACd,sBAAIhC,UAAU,sBACX,2BAA4C,CAAE8J,SAAAA,IAAY5J,KAAI,WAAYC,GAAG,IAAZ6B,EAAK,EAALA,MAAK,OACrE,sBAAI5B,IAAKD,EAAKH,UAAU,mBACtB,wBAAMA,UAAU,4CAA4C6B,MAAO,CAAEG,MAAAA,GAAS+H,wBAAyB,CAAEC,OAAQ,WAC9G,KAKf,G,+HClKA,SAAgB,QAAU,SCgB1B,IACM/B,EAAY5D,EAAA,mBADA,uBAmBlB,SAAS4F,EAAQ7K,GACf,OACE,uBAAKY,UAAS,eAAU,YACtB,gBAACsC,EAAA,EAAO,CACNhC,QAASlB,EAAMkB,QACfQ,cAAe1B,EAAM0B,cACrBC,iBAAgB,6BACdmJ,SAAU,kBACP9K,EAAM2B,kBAAgB,CACzBoJ,WAAY,eAEdnK,UAAS,+BAA0BZ,EAAMkB,QAAU,sBAAwB,KAE3E,qBAAGN,UAAU,yDAAyDiI,EAAU,YAIxF,CAEM,SAAUmC,EAAahL,G,QACrBiL,IAAmBjL,EAAMkL,YAE/B,IAAKlL,EAAMiJ,OAASjJ,EAAMkL,YACxB,OAAO,iCAET,IAAMC,EAAiBC,EAAA,wBAAmCpL,EAAMqL,QAASrL,EAAMsL,cACzEC,EAA+D,QAAlD,EAAsC,QAAtC,EAAAC,EAAA,EAAmBxL,EAAMsL,qBAAa,eAAEC,kBAAU,QAAI,EAEzE,OACE,uBAAK3K,UAAU,yBACb,uBAAKA,UAAU,oCACVZ,EAAMiJ,MACP,uBAAKrI,UAAU,6BACb,gBAACsC,EAAA,EAAO,CACNhC,QAASlB,EAAMkB,QACfQ,cAAe1B,EAAM0B,cACrBd,UAAS,+BAA0BZ,EAAMkB,QAAU,iCAAmC,IACtFE,QAASpB,EAAMoB,SAEf,sBAAIR,UAAU,6BACXZ,EAAMyL,cAAgBN,GACrB,gBAAChI,EAAA,EAAY,CACX9B,QAAS,oBACTa,MAAK,2DAAsDqJ,EAAU,4BACrEG,iBAAe,EACfC,yBAAyB,8BAG5B3L,EAAMiJ,SAGR,iBAAqBjJ,EAAM4L,iBAAmB5L,EAAM4L,kBAGxD5L,EAAMkB,UAAY+J,KAAoBjL,EAAM6L,iBAAmB,gBAAChB,EAAO,iBAAK7K,KAGhFiL,GACC,uBAAKrK,UAAU,kDACb,qBAAGA,UAAS,0CACV,4BAAOZ,EAAMkL,gBAEZlL,EAAMkB,WAAalB,EAAM6L,iBAAmB,gBAAChB,EAAO,iBAAK7K,KAKtE,C,myCC9FA,IAAM8L,EAAwB,IAkBxB,SAAUC,EAAkBC,GAChC,IAAQ/H,EAA0C+H,EAA1C/H,KAAMgI,EAAoCD,EAApCC,MAAOC,EAA6BF,EAA7BE,aAAcC,EAAeH,EAAfG,WAEsB,IAArB,YAAe,GAAM,GAAjDC,EAAS,KAAEC,EAAY,KACmD,IAA9B,WAA2B,CAAC,GAAE,GAA1EC,EAAiB,KAAEC,EAAoB,KAC2B,IAApB,WAAe,MAAK,GAAlEC,EAAkB,KAAEC,EAAqB,KAE3CC,EAAU,WAAc,kBAAM,mBAA+B,GAAE,IAiIrE,OA5HA,aAAgB,WACD,YAATzI,GAAuBiI,EAAahC,SAAa+B,EAA6BU,wBAAyBD,GAE3GE,YAAW,kBAQb,W,MACQC,EAAqBZ,EAE3B,GAAyB,QAApB,EAAAC,EAAahC,eAAO,eAAE4C,SAA3B,CAGA,IAAMC,EAAiBC,MAAMC,KAAKf,EAAahC,QAAQ4C,UAAU/C,QAAO,SAACmD,EAAKC,GAC5E,I,MAAMC,EAAOD,aAAI,EAAJA,EAAME,wBAMbC,EACJF,EAAKG,KAAOV,EAAmBW,wBAC/BJ,EAAKK,MAAQZ,EAAmBF,sBAElC,OAAO,OAAP,wBACKO,I,EAAG,G,EACLC,EAAKjJ,G,EAAKoJ,EACP,CACA,eAAe,GACb,CACF,eAAe,EACf,MAAS,S,qXAGjB,GAAG,CAAC,GAEJf,EAAqBQ,EAzBb,CA0BV,CAtCmBW,EAAsB,GAAE5B,EAAwB,GACnE,GAAG,CACDI,EAAahC,QACbiC,EACCF,EAA6B0B,OAC7B1B,EAA6BU,wBAoHzB,CACLP,UAAAA,EACAwB,cAhBF,SAAuBC,GACjBC,SAASC,cAAc,sBACzB1B,GAAa,GACbI,EAAsBoB,GAE1B,EAYEG,aAVF,WACOF,SAASC,cAAc,sBAC1B1B,GAAa,GACbI,EAAsB,MAE1B,EAMEwB,mBAlFF,SAA4BJ,GAC1B,IAAMK,EAAmBjC,EAMzB,OAHES,GACAmB,GAAUK,EAAiBP,OAASO,EAAiBC,eACrDN,EAAQK,EAAiBP,OAElB,CACL,eAAe,GAIZ,CACL,MAAS,OACT,eAAe,EAEnB,EAkEErB,kBAAAA,EACA8B,UA7DF,WACExB,YAAW,WACT,GAAKV,EAAahC,QAAlB,CAOA,IAJA,IAAMmE,EAAQnC,EAAahC,QAAQoE,iBAAiB,mBAEhDC,EAAoC,KAE/BC,EAAKhC,EAAqB,EAAIgC,EAAIH,EAAMxN,SAC3C0N,EADmDC,IAIvDD,EAAuBF,EAAMG,GAAGT,cAAc,mBAG5CQ,GACFA,EAAqBpE,OAdf,CAeV,GAAG2B,EAAwB,IAC7B,EA2CE2C,UAzCF,WACE7B,YAAW,WACT,GAAKV,EAAahC,QAAlB,CAMA,IAHA,IAAMmE,EAAQnC,EAAahC,QAAQoE,iBAAiB,mBAEhDI,EAAoC,KAC/BF,EAAIhC,EAAqB,EAAGgC,GAAK,IACpCE,EADuCF,IAI3CE,EADaL,EAAMG,GACST,cAAc,mBAGxCW,GACFA,EAAqBvE,OAbf,CAcV,GAAG2B,EAAwB,IAC7B,EAyBF,C,mFC1KM6C,EAAa,IAAIC,MACvBD,EAAWrG,IAAM,yEAEV,IAAMuG,EAEE,SAACC,GACPA,EAAMC,aAAaC,cAAiBhM,EAAA,aAA0B8L,EAAMC,aAAaC,eAGtFF,EAAMC,aAAaC,aAAaL,EAAY,EAAG,EACjD,ECJIM,EAAgBC,EAAA,kBA2BTC,EAAuB,cAAiB,SACnDnP,EACA+I,GAEA,IAGQqG,EAhCkBC,EAAmBC,EAA6BC,EA6BlEzC,EAAwG9M,EAAxG8M,SAAU0C,EAA8FxP,EAA9FwP,aAAcC,EAAgFzP,EAAhFyP,OAAQC,EAAwE1P,EAAxE0P,UAAWC,EAA6D3P,EAA7D2P,YAAaC,EAAgD5P,EAAhD4P,WAAYC,EAAoC7P,EAApC6P,kBAAiB,EAAmB7P,EAAjB8P,SAAAA,OAAQ,IAAG,IAAC,EAoB3G,OACE,oCACElP,UAAU,gEACV6B,OApDsB4M,EAoDIS,EApDeR,EAoDLE,EApDkCD,EAoDpBM,EAlDlDP,IAAgBS,EAAAC,EAAA,YAA6BT,IAC/CF,GAAwBE,GAEnB,CACLU,UAAW,eAAF,OAAiBZ,GAAS,OAAGC,EAAW,eAEjDY,WAAY,8BA6CVnH,IAAKA,IArBDqG,EAA4B,CAAC,EAE/BK,GAAUC,IACZN,EAAce,WAAY,EAC1Bf,EAAcM,UAAYA,EAC1BN,EAAcgB,YAAcvB,EAC5BO,EAAciB,WAAaZ,GAGzBE,GAAeC,GAAcX,IAC/BG,EAAckB,mBAAqBX,EACnCP,EAAcmB,kBAAoBX,GAG7BR,IAUJtC,EAGP,G,2FCpEA,QAAiD,QAAjD,EAAiE,QCUjE,IAGY0D,EAFN3H,EAAY5D,EAAA,mBADA,wBAGlB,SAAYuL,GACV,mBACA,oBACD,CAHD,CAAYA,IAAAA,EAAqB,KAuB1B,IAAMC,EAAe,QAAW,SAASzQ,GAC9C,IAKMY,E,IALA8P,EAAS1Q,EAAM2Q,YAAcH,EAAsBI,KAEnDC,EAAWH,EAAS,iBAA2B,kBAqBrD,OAAI1Q,EAAM8Q,KACD,iCAGP,uBAAKlQ,UAAS,UDhEgB,QCgEW,YAAIZ,EAAM+Q,mBAAqB/Q,EAAM+Q,mBAAqB,IAAMtO,MAV3E,YAAf,QAAX,EAAAzC,EAAMiM,aAAK,eAAE+E,UACR,CAAEC,cAAgB,OAAmB,QAAX,EAAAjR,EAAMiM,aAAK,eAAEkC,eAAiB,KAE1D,CAAExL,OAAQ,SAQd3C,EAAMkR,qBACL,uBAAKtQ,UAAW8P,EAAS,GAAH,ODlE+L,QCkEtK,YAAI1Q,EAAMmR,uBAAqB,UDlEgH,QCkEpF,YAAInR,EAAMoR,2BAGpHpR,EAAMqR,2BACN,0BACEjQ,QAASpB,EAAMoB,QACfR,UAAS,UDxE2J,QCwE1H,YAAI8P,EAAS,EAAc,GACrElN,UAAW,IAIf,0BACE5C,UAAS,WApCTA,ED1CsO,QC8CxOA,GADE8P,EACW,IAAJ,OAAQ,EAAW,YAAI1Q,EAAMsR,qBAEzB,IAAJ,OAAQ,EAAY,YAAItR,EAAMuR,uBA8BL,YD9E0C,QC8EzB,YAAIvR,EAAMY,WAAa,IACxEQ,QAASpB,EAAMoB,QAAO,aACDyH,EAAT6H,EAAmB,WAAwB,SAEtD1Q,EAAMwR,WACL,wBAAM5Q,UAAS,oBDnF6E,UCmFzCZ,EAAMwR,WAE3D,gBAACrO,EAAA,EAAY,CACX9B,QAASwP,EACT1M,KAAMhB,EAAAsB,EAAA,OACN7D,UAAS,uCDxF2H,YC6F9I,G,kBC9FA,IAAYmP,E,iBAAZ,SAAYA,GACV,iBACA,aACD,CAHD,CAAYA,IAAAA,EAAc,I,kBCA1B,IAAY0B,E,iBAAZ,SAAYA,GACV,cACA,cACA,sBACA,kBACA,cACA,kBACA,6BACD,CARD,CAAYA,IAAAA,EAAiB,I,4DCOvB,SAAUC,IACd,IAAMC,GAAO,OAAc,QACrBC,GAAO,OAAc,QACrBC,GAAO,OAAc,QACrBC,GAAO,OAAc,QACrBC,GAAO,OAAc,QACrBC,GAAQ,OAAc,SAExBC,EAAgB,OAQpB,OAPIN,IAAMM,EAAgB,QACtBL,IAAMK,EAAgB,QACtBJ,IAAMI,EAAgB,QACtBH,IAAMG,EAAgB,QACtBF,IAAME,EAAgB,QACtBD,IAAOC,EAAgB,SAEpBA,CACT,C,kaCdaC,EAA2B,SAACC,GAAmB,OAC1D,SAACC,GACC,OAAKA,aAAc,EAAdA,EAAgBlO,IAGdmO,EAAA,aAAuCD,EAAgBD,GAAU,CAAC,GAFhE,IAGX,CAAC,ECfH,SAAgB,mBAAqB,SCuCrC,IAAMzN,EAAY,8BACZmE,EAAY5D,EAAA,mBAAiCP,GAU7C,SAAU4N,EAAuBtS,G,sBAC7BuS,GAAwB,EAAAC,EAAA,GAAY,MAApCD,oBACFE,GAAc,EAAA1M,EAAA,KAKd2M,EAAS,kBAA6BC,EAAA,YAE5C,GAKI,EAAAC,EAAA,KAJFC,EAAsB,EAAtBA,uBACAC,EAAkB,EAAlBA,mBACAC,EAAsB,EAAtBA,uBACAC,EAAqB,EAArBA,sBAGIC,GAAa,EAAAC,EAAA,KACbC,GAAW,SAMXC,EAAwBpT,EAAMqT,YAAYC,iBAAkBR,aAAkB,EAAlBA,EAAoB5O,IAEhFqP,GAAsB,kBAC1BH,GACAI,EAAA,mBAAwCJ,IAGpCK,GAAYF,GAAoBG,cAAgBX,EAEhDX,GAAiB,CACrBnJ,KAAM0K,EAAA,2BAA8D,QAAxB,EAAAJ,GAAoBK,YAAI,eAAE3K,KAAM4J,aAAsB,EAAtBA,EAAwBhS,QACpG2E,OAAQ,CACNmB,IAAKgN,EAAA,4BAA+D,QAAxB,EAAAJ,GAAoBK,YAAI,eAAEC,cAAe,kBAInF/G,GAAW,kBACf2G,IACAD,EAAA,iBAAsCJ,IAAiD,QAAxB,EAAAG,GAAoBK,YAAI,eAAE1P,MAGrFhC,GAAQ2G,EAAU,mBAAoB,CAAE3G,MAA+B,QAAxB,EAAAqR,GAAoBK,YAAI,eAAE3K,QAE/E,EAAA6K,EAAA,GAAmB,CACjB5R,MAAAA,GACAgJ,YAAarC,EAAU,kBAAmB,CAAE3G,MAA+B,QAAxB,EAAAqR,GAAoBK,YAAI,eAAE3K,OAC7E8K,cAAeC,EAAA,qBACfC,cAAeD,EAAA,oBAGjB,IAAME,GAA0BhC,IAkBhC,IAAMiC,KAAezB,EAAOkB,QAAUf,GAA0B/F,GAAS8G,KACnEQ,GAAqBpB,EAA8C,QAAxB,EAAAO,GAAoBK,YAAI,eAAE1P,IAKrExC,GAAgB,CACpB4R,eAAwC,QAAxB,EAAAC,GAAoBK,YAAI,eAAE1P,GAC1CmQ,iBAA0C,QAAxB,EAAAd,GAAoBK,YAAI,eAAE3K,KAC5CqL,SAAUC,EAAA,kBACVC,WAAYC,EAAA,2BAGRC,GAAoBnC,EACtBoC,EAAA,EACAC,EAAA,EAEJ,OACE,wBAAMhU,UAAU,iBACbuT,GAEG,gBAAC5O,EAAA,EAAY,CACXD,QAAS8M,cAAc,EAAdA,GAAgBnJ,KACzBzD,OAAQ4M,cAAc,EAAdA,GAAgB5M,OACxBC,YAAaiN,EAAOkB,KAAKnO,YACzBe,aAAc,CAAErC,KAAM,cAEtB,gBAAC,IAAmB,MAE1B,uBAAKvD,UAAS,oBAAewT,GAAqB,gBAAkB,KAE3DA,GAGAD,GAGE,gBAAC7K,EAAA,GAAW,CAACC,YArD5B,W,MACE,MAAO,CAAC,CACNN,KAAMJ,EAAU,YAChB3H,QAAS,CACP2T,YAAa,cACb5R,OAAQ,qBAET,CACDgG,KAAM0K,EAAA,gCAAmE,QAAxB,EAAAJ,GAAoBK,YAAI,eAAE3K,KAAM4J,aAAsB,EAAtBA,EAAwBhS,QACzGqI,QAAQ,GAEZ,CA0CyC4L,KAFxB,gBAAC,KAAkB,MAHnB,kCAQb,uBAAKlU,UAAW,sBACbuT,GACC,gBAACO,GAAiB,CAChBxQ,GAA4B,QAAxB,EAAAqP,GAAoBK,YAAI,eAAE1P,GAC9B+E,KAAK,GACLiC,YAAY,GACZxJ,cAAeA,GACf2J,QAASyB,cAAQ,EAARA,GAAU8G,KACnBmB,SAAU,CAAE3C,eAAgB8B,IAC5Bc,oBAAoB,EACpBC,SAAU,CAAE1C,oBAAAA,GACZ2C,kCAAmCjC,KAAeE,aAAQ,EAARA,EAAUgC,WAAWC,EAAA,aAEvEC,6BAA8B,WAAO,IAGvC,gBAAC,KAAoB,CAACC,wBAAyB,OAGhDnB,IAAc5B,IAAuBM,aAAsB,EAAtBA,EAAwBhS,QAAS,GACrE,sBAAID,UAAU,sBACXiS,EAAuB0C,QAAO,SAAAC,GAAI,MAAC,OAAAA,EAAEtR,MAA+B,QAAxB,EAAAqP,GAAoBK,YAAI,eAAE1P,GAAE,IAAEpD,KAAI,SAAA2U,G,UAC7E,OACE,sBAAIzU,IAAKyU,EAAavR,IACpB,gBAAChB,EAAA,EAAO,CACNtC,UAAS,0FAAqF,OAAW,YAAI+S,EAAA,6CAAwD8B,aAAY,EAAZA,EAAc5B,gBACnL3S,QAAS,CACP2T,YAAa,YACb5R,OAAQ,iCACRkP,OAAQ,CAAEmB,eAAgBmC,EAAavR,KAEzCwR,eAAgB,CAAEC,kBAAmB,CAAEC,iBAAkBH,EAAaI,aACtEnU,cAAe,CACbwC,GAAIuR,EAAavR,GACjB+E,KAAMwM,EAAaxM,KACnBiC,YAAauK,EAAavK,YAC1B4K,sBAA+C,QAAxB,EAAAvC,GAAoBK,YAAI,eAAE1P,GACjD6R,wBAAiD,QAAxB,EAAAxC,GAAoBK,YAAI,eAAE3K,KACnD+M,+BAAwD,QAAxB,EAAAzC,GAAoBK,YAAI,eAAE1I,aAE5DvJ,iBAAkB,CAChBsU,OAAQ,kBACRC,WAAY,WACZpL,SAAU,mCAGZ,uBAAKlK,UAAU,uBACXiS,EAAuBhS,OAAS,GAAK4R,EAAY0D,IAAM1D,EAAY2D,GACnE,gBAAClO,EAAA,EAAI,CAACxD,UAAWA,EAAWyD,OAAO,0BAA0B6D,QAAS,CAAE/C,KAAMwM,EAAaxM,QAE3F,gBAACf,EAAA,EAAI,CAACxD,UAAWA,EAAWyD,OAAO,2BAA2B6D,QAAS,CAAE/C,KAAMwM,EAAaxM,SAGhG,gBAACoN,EAAA,EAAU,CACThV,QAASoR,EAAY2D,GAAK,aAAuB,YACjDxU,cAAY,EACZhB,UAAU,uBACVQ,QAAS,MAET,gBAAC8G,EAAA,EAAI,CACHxD,UAAWA,EACXyD,OAAQsK,EAAY2D,GAAK,UAAY,WACrCpK,QAAS,CAAE/C,KAAMwM,EAAaxM,UAM1C,MAMZ,C","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: ' ' }} />\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":""}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[4718],{78259:(e,n,t)=>{t.d(n,{O:()=>c});var r=t(58176),a=t.n(r),i=t(39479),o={className:"info-link",defaultProtocol:"https"},c={linkifyText:function(e,n){if(e){var t=n?i.extend({},o,n):o;return a()(e,t)}}}},51685:(e,n,t)=>{t.d(n,{g:()=>v});var r=t(32735),a=t(78259),i=t(18559),o=t(86764),c=t(5345),l=t(3747),s=t(26361),u=t(31908);const d={captionsBadge:"eXhiL"};function m(e){var n,t,o,c,l,s;if(!e.video.description&&!(null===(n=u.M.getCanBeConsumed(e.video))||void 0===n?void 0:n.canNavigate))return r.createElement("em",null,u.M.getPrivacyReasoning(e.video,e.showSignIn));var m=!!(null===(c=null===(o=null===(t=e.video)||void 0===t?void 0:t.subtitles)||void 0===o?void 0:o.data)||void 0===c?void 0:c.length);return r.createElement(r.Fragment,null,m&&r.createElement("span",{className:"d-inline-block align-middle ".concat(d.captionsBadge)},r.createElement(i.C,{type:i.g.Captions,data:null===(l=e.video)||void 0===l?void 0:l.subtitles})),!!(null===(s=e.video)||void 0===s?void 0:s.productionYear)&&r.createElement("span",{className:"fw-semibold align-middle"},m?" • ":"",e.video.productionYear),!!e.video.description&&r.createElement("span",{className:"align-middle",dangerouslySetInnerHTML:{__html:"".concat(e.video.productionYear||m?" • ":"").concat(a.O.linkifyText(e.video.description))}}))}function v(e){var n=(0,l.a)(o.r.XS),t=!!s.l.getRestrictionByType(e.video,c.c.User);return n||t?r.createElement(r.Fragment,null):r.createElement("div",{className:"position-relative overflow-hidden clamp-2"},r.createElement("p",{className:"m-0"},r.createElement(m,{video:e.video,showSignIn:e.showSignIn})))}},84678:(e,n,t)=>{t.d(n,{L:()=>i});var r=t(32735),a=t(18559);function i(e){return r.createElement(a.C,{type:a.g.Restriction,data:{restrictions:e.restrictions,yearGroups:e.yearGroups},inline:!0})}},94696:(e,n,t)=>{t.d(n,{B:()=>l});var r=t(32735),a=t(17464),i=t(84678),o=t(26361),c=t(31908);function l(e){var n=o.l.hasRestrictions(e.video),t=c.M.getCanBeConsumed(e.video).canConsume;return n&&e.yearGroups&&t?r.createElement(a.c,{className:e.className||"pt-1"},r.createElement(i.L,{restrictions:e.video._restrictions,yearGroups:e.yearGroups})):r.createElement(r.Fragment,null)}},70872:(e,n,t)=>{t.d(n,{u:()=>l});var r=t(32735),a=t(65858),i=t(36848),o=t(29598),c=t(31908);function l(e){var n,t,l,s=c.M.getCanBeConsumed(e.video).canNavigate,u=c.M.getTitle(e.video),d=Object.assign(Object.assign({},e.analyticsData),{id:null===(n=e.video)||void 0===n?void 0:n.id,name:null===(t=e.video)||void 0===t?void 0:t.name}),m=Object.assign(Object.assign({},e.analyticsOptions),{actionType:a.Vw.Click,descriptor:a._S.Title}),v=e.textClassName?"":"clamp-1 align-middle",p=e.textClassName||("md"===e.size?"h4":"h5");return r.createElement(i.F,{className:e.linkClassName,appLink:s?e.appLink:null,onClick:s?e.onClickAppLink:null,analyticsOptions:m,analyticsData:d},r.createElement("div",{className:v,title:null!==(l=e.video.name)&&void 0!==l?l:""},r.createElement(o.O,{video:e.video,title:u,yearGroups:e.yearGroups,lockSize:e.size,textClassName:p,showNewVideoIndicator:e.showNewVideoIndicator,headingClassName:e.headingClassName})))}},15469:(e,n,t)=>{t.d(n,{r:()=>d});var r=t(32735),a=t(36848),i=t(86572),o=t(83345),c=t(86764),l=t(81514),s=t(40424),u="shared.interactiveItem";function d(e){var n,t,d,m=(t=e.totalToDisplay,d=(0,l.V)(),"number"==typeof t?t:d===c.r.XS?3:d===c.r.SM?1:d===c.r.MD||d===c.r.LG?2:3);if(!(null===(n=e.timepoints)||void 0===n?void 0:n.length))return r.createElement(r.Fragment,null);var v=[],p=0;e.timepoints.forEach((function(n){null==n||n.interactions.forEach((function(t){if(!(s.IL[t.typeId]||p>=m)){p++;var r=t.typeId===s.Z9.Annotation&&"string"==typeof t.data?JSON.parse(t.data):t.data,a=Object.assign(Object.assign({},t),{data:Object.assign(Object.assign({},r),{appLink:e.appLink&&Object.assign(Object.assign({},e.appLink),{params:{t:Math.floor(n.visibleAt/1e3)}})})});v.push(a)}}))}));var f=e.timepoints.reduce((function(e,n){var t,r;return e+(null!==(r=null===(t=null==n?void 0:n.interactions)||void 0===t?void 0:t.length)&&void 0!==r?r:0)}),0);return v.length?r.createElement(r.Fragment,null,v.map((function(n,t){var a,o;return r.createElement("div",{key:t,className:"d-flex align-items-center mb-1"},r.createElement("div",{className:"clamp-1"},r.createElement(i.y,{interaction:n,appLink:null===(a=n.data)||void 0===a?void 0:a.appLink,onClick:(null===(o=n.data)||void 0===o?void 0:o.appLink)?e.onClickAppLink:null,smallIcon:!0})))})),r.createElement("div",{className:"mb-1 text-link"},r.createElement(a.F,{className:"cursor-pointer hover-text-underline",appLink:e.previewAppLink,onClick:e.onClickAppLink},r.createElement(o.x,{namespace:u,phrase:"previewQuestions",options:{questionsShown:v.length,smartCount:f}})))):r.createElement(r.Fragment,null)}},81514:(e,n,t)=>{t.d(n,{V:()=>i});var r=t(86764),a=t(3747);function i(){var e=(0,a.a)(r.r.XS),n=(0,a.a)(r.r.SM),t=(0,a.a)(r.r.MD),i=(0,a.a)(r.r.LG),o=(0,a.a)(r.r.XL),c=(0,a.a)(r.r.XXL),l=r.r.LG;return e&&(l=r.r.XS),n&&(l=r.r.SM),t&&(l=r.r.MD),i&&(l=r.r.LG),o&&(l=r.r.XL),c&&(l=r.r.XXL),l}},80143:(e,n,t)=>{t.d(n,{n:()=>i});var r=t(32735),a=t(69454);function i(e,n){var t=r.useMemo((function(){return(null==e?void 0:e.length)&&n&&a.T.shouldShowAudiences(n)?a.T.getSortedPresentationAudiences(e,n):null}),[e]);return r.useMemo((function(){return(null==t?void 0:t.length)?a.T.getMergedPresentationAudienceString(t):null}),[t])}},69454:(e,n,t)=>{t.d(n,{T:()=>m});var r=t(75896),a=t(1048),i=t(55171);function o(e,n){return function(e){if(Array.isArray(e))return e}(e)||function(e,n){var t=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=t){var r,a,i,o,c=[],l=!0,s=!1;try{if(i=(t=t.call(e)).next,0===n){if(Object(t)!==t)return;l=!1}else for(;!(l=(r=i.call(t)).done)&&(c.push(r.value),c.length!==n);l=!0);}catch(e){s=!0,a=e}finally{try{if(!l&&null!=t.return&&(o=t.return(),Object(o)!==o))return}finally{if(s)throw a}}return c}}(e,n)||function(e,n){if(e){if("string"==typeof e)return c(e,n);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?c(e,n):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function c(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,r=Array(n);t<n;t++)r[t]=e[t];return r}var l=/\d/,s={yearsAndGradesBuilder:function(e){var n=e.map((function(e){return e.name})).join(" "),t=n.split(" ").filter((function(e){return!isNaN(+e)})).map((function(e){return+e}))||[],r=n.split(" ").filter((function(e){return isNaN(+e)}))||[],a=e.find((function(e){return!l.test(e.name)})),i=r.find((function(e){return e!==(null==a?void 0:a.name)}));if(e.length>1&&(i+="s"),a&&t.length)return"".concat(i," ").concat(a.name.charAt(0)," - ").concat(t.pop());var o=function(e){var n,t,r,a,i=!1,o=[];for(e=e.sort((function(e,n){return e-n})),r=0;r<e.length;r++)a=r+1,i||(n=e[r]),t=e[a],e[r]+1===t?i=!0:i?(o.push("".concat(n," - ").concat(e[r])),i=!1):(o.push("".concat(e[r])),i=!1);return o}(t);return"".concat(i," ").concat(o.join(", "))},internationalSecondaryBuilder:function(e){return s.englandSecondaryBuilder(e)},scotlandPrimaryBuilder:function(e){var n=r.m.first(e),t=r.m.last(e),a=o(n.name.split(" "),1)[0],i=o(t.name.split(" "),1)[0];return"First"===a&&(a="1st"),"First"===i&&(i="1st"),"Second"===a&&(a="2nd"),"Second"===i&&(i="2nd"),a===i?"".concat(a," Level"):"".concat(a," - ").concat(i," Level")},internationalPrimaryBuilder:function(e){var n=r.m.first(e),t=r.m.last(e);if(n.name===t.name)return n.name;var a=o(n.name.split(" "),1)[0],i=o(t.name.split(" "),1)[0];return"Lower"===a&&(a="Low"),"Lower"===i&&(i="Low"),"Middle"===a&&(a="Mid"),"Middle"===i&&(i="Mid"),"".concat(a," - ").concat(i," Pri")},englandSecondaryBuilder:function(e){var n=r.m.first(e),t=r.m.last(e);return n.name===t.name?n.name:"Advanced"===t.name?"lower"===o(n.name.split(" "),1)[0].toLowerCase()?"Lower Sec - Adv":"Upper Sec - Adv":"Lower - Upper Sec"},scotlandSecondaryBuilder:function(e){var n=r.m.first(e),t=r.m.last(e);return n.name===t.name?n.name:"Senior Phase"===t.name?"".concat(n.name," - Senior"):"Third - Fourth Level"},englandPrimaryBuilder:function(e){var n=r.m.first(e),t=r.m.last(e),a=r.m.first(n.name.split(" ")),i=r.m.first(t.name.split(" ")),o=n.name.split(" ").find((function(e){return!isNaN(+e)})),c=t.name.split(" ").find((function(e){return!isNaN(+e)}));if(n===t)return"Key"===a||"Reception"===a?n.name:"".concat(a," KS").concat(o);var l="",s="";return l="Reception"===a?"R":"KS".concat(o),s="KS".concat(c),"Lower"===a&&"Upper"===i?"L ".concat(l," - U ").concat(s):("Lower"===a&&(l="Lower ".concat(l)),"Upper"===i&&(s="Upper ".concat(s)),"Key"===i&&(s=t.name),"".concat(l," - ").concat(s))}},u=/([0-9]+)/gi,d=/\s|\+/gi,m={getSortedPresentationAudiences:function(e,n){var t=e.filter((function(e){return!!e})).map((function(e){return e.id.toString()}));return n.filter((function(e){return t.includes(e.masterId.toString())}))},getMergedPresentationAudienceString:function(e){var n="";switch(+r.m.first(e).presentationId){case i.e.PresentationIds.DEFAULT:case i.e.PresentationIds.AU_SECONDARY:case i.e.PresentationIds.US_ELEMENTARY:case i.e.PresentationIds.AU_PRIMARY:case i.e.PresentationIds.STREAMABLE_LEARNING:if(1===e.length)return e[0];n=s.yearsAndGradesBuilder(e);break;case i.e.PresentationIds.INTERNATIONAL_SECONDARY:if(1===e.length)return e[0];n=s.internationalSecondaryBuilder(e);break;case i.e.PresentationIds.INTERNATIONAL_PRIMARY:n=s.internationalPrimaryBuilder(e);break;case i.e.PresentationIds.SCOTLAND_PRIMARY:n=s.scotlandPrimaryBuilder(e);break;case i.e.PresentationIds.ENGLISH_SECONDARY:n=s.englandSecondaryBuilder(e);break;case i.e.PresentationIds.SCOTLAND_SECONDARY:n=s.scotlandSecondaryBuilder(e);break;case i.e.PresentationIds.ENGLAND_PRIMARY:n=s.englandPrimaryBuilder(e);case i.e.PresentationIds.US_MIDDLE:case i.e.PresentationIds.US_HIGH:case i.e.PresentationIds.AU_TERTIARY:case i.e.PresentationIds.UK_TERTIARY:}return n?{name:n}:null},sortMembersWithDuplicateNamesByAudience:function(e){var n=function(e){return e.length?(e.forEach((function(e){var a=+r.m.first(e.name.match(u));if(!n)return n=e,void(t=a);a<t&&(n=e)})),n):null;var n,t},t={},a=[];return e.forEach((function(e){if(!t[e.name])return t[e.name]=1,void a.push(e);a.push(e),t[e.name]++;var r=a.splice(a.length-t[e.name]).sort((function(e,t){var r=n(e.subjectPresentationAudiences.data),a=n(t.subjectPresentationAudiences.data);if(!r&&a)return 1;if(!a)return-1;var i=r.name.localeCompare(a.name);return 0===i?i:i>0?-1:1}));a=a.concat(r)})),a},getActiveAudiencesFromParams:function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(a.t.isObject(n)&&!a.t.isEmpty(n)&&e&&e.length&&m.shouldShowAudiences(e)){var t=n.a;if(t){"string"==typeof t&&(t=[t]);var r=function(e){return e.replace(d,"").toLowerCase()},i=t.reduce((function(e,n){return e[r(n)]=n,e}),{});return e.filter((function(e){return i[r(e.name)]}))}}},getAudienceParams:function(e){return(null==e?void 0:e.length)?{a:e.map((function(e){return e.name}))}:null},shouldShowAudiences:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return!!e&&e.length>1}}}}]);
|
|
2
|
+
//# sourceMappingURL=4718-1426986e1d-lite.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts/4718-1426986e1d-lite.chunk.js","mappings":"uKAIMA,EAAqB,CACzBC,UAAW,YACXC,gBAAiB,SAGNC,EAAgB,CAI3BC,YAAW,SAACC,EAAcC,GACxB,GAAKD,EAAL,CACA,IAAME,EAAMD,EAAU,SAAS,CAAC,EAAGN,EAAoBM,GAAWN,EAClE,OAAO,IAAWK,EAAME,EAFP,CAGnB,E,6HChBF,SAAgB,cAAgB,SCkBhC,SAASC,EAAaC,G,gBACpB,IAAKA,EAAMC,MAAMC,eAAyD,QAAzC,EAAAC,EAAA,mBAA6BH,EAAMC,cAAM,eAAEG,aAC1E,OACE,0BAAKD,EAAA,sBAAgCH,EAAMC,MAAOD,EAAMK,aAI5D,IAAMC,KAA4C,QAA5B,EAAsB,QAAtB,EAAW,QAAX,EAAAN,EAAMC,aAAK,eAAEM,iBAAS,eAAEC,YAAI,eAAEC,QAEpD,OACE,gCACGH,GACC,wBAAMd,UAAS,sCAAiC,kBAC9C,gBAACkB,EAAA,EAAK,CAACC,KAAMD,EAAA,WAAoBF,KAAiB,QAAX,EAAAR,EAAMC,aAAK,eAAEM,gBAG1C,QAAX,EAAAP,EAAMC,aAAK,eAAEW,iBACd,wBAAMpB,UAAU,4BACbc,EAAc,MAAa,GAAIN,EAAMC,MAAMW,kBAG7CZ,EAAMC,MAAMC,aACb,wBACEV,UAAU,eACVqB,wBAAyB,CACvBC,OAAQ,GAAF,OAAMd,EAAMC,MAAMW,gBAAkBN,EAAe,MAAa,IAAE,OAAGZ,EAAA,cAA0BM,EAAMC,MAAMC,iBAM7H,CAOM,SAAUa,EAAqBf,GACnC,IAAMgB,GAAW,OAAc,QACzBC,IAAwBC,EAAA,uBAAuClB,EAAMC,MAAOkB,EAAA,QAElF,OAAIH,GAAYC,EACP,iCAGP,uBAAKzB,UAAS,6CACZ,qBAAGA,UAAU,OACX,gBAACO,EAAY,CACXE,MAAOD,EAAMC,MACbI,WAAYL,EAAMK,cAK5B,C,6DChEM,SAAUe,EAAiBpB,GAC/B,OACE,gBAAC,IAAK,CACJW,KAAM,gBACNH,KAAM,CAAEa,aAAcrB,EAAMqB,aAAcC,WAAYtB,EAAMsB,YAC5DC,QAAM,GAGZ,C,8FCJM,SAAUC,EAA0BxB,GACxC,IAAMyB,EAAkB,oBAAkCzB,EAAMC,OACxDyB,EAAe,qBAA6B1B,EAAMC,OAAlDyB,WAER,OAAKD,GAAoBzB,EAAMsB,YAAeI,EAI5C,gBAAC,IAAkB,CAAClC,UAAWQ,EAAMR,WAAa,QAChD,gBAAC,IAAgB,CAAC6B,aAAcrB,EAAMC,MAAM0B,cAAeL,WAAYtB,EAAMsB,cAJxE,gCAOX,C,8FCCM,SAAUM,EAAe5B,G,UACrBI,EAAgB,qBAA6BJ,EAAMC,OAAnDG,YACFyB,EAAQ,aAAqB7B,EAAMC,OAEnC6B,EAAa,+BACd9B,EAAM8B,eAAa,CACtBC,GAAe,QAAX,EAAA/B,EAAMC,aAAK,eAAE8B,GACjBC,KAAiB,QAAX,EAAAhC,EAAMC,aAAK,eAAE+B,OAGfC,EAAgB,+BACjBjC,EAAMiC,kBAAgB,CACzBC,WAAY,WACZC,WAAY,aAGRC,EAA0BpC,EAAMqC,cAAgB,GAAK,uBACrDC,EAAqBtC,EAAMqC,gBAAiC,OAAfrC,EAAMuC,KAAgB,KAAO,MAEhF,OACE,gBAAC,IAAO,CACN/C,UAAWQ,EAAMwC,cACjBC,QAASrC,EAAcJ,EAAMyC,QAAU,KACvCC,QAAStC,EAAcJ,EAAM2C,eAAiB,KAC9CV,iBAAkBA,EAClBH,cAAeA,GAEf,uBAAKtC,UAAW4C,EAAyBP,MAAuB,QAAhB,EAAA7B,EAAMC,MAAM+B,YAAI,QAAI,IAClE,gBAAC,IAAU,CACT/B,MAAOD,EAAMC,MACb4B,MAAOA,EACPP,WAAYtB,EAAMsB,WAClBsB,SAAU5C,EAAMuC,KAChBF,cAAeC,EACfO,sBAAuB7C,EAAM6C,sBAC7BC,iBAAkB9C,EAAM8C,oBAKlC,C,oHCxDMC,EAAY,yBA4BZ,SAAUC,EAAyBhD,G,MA1BLiD,EAC5BC,EA0BAC,GA3B4BF,EA2BsBjD,EAAMiD,eA1BxDC,GAAa,SAEW,iBAAnBD,EACFA,EAELC,IAAe,OACV,EAELA,IAAe,OACV,EAELA,IAAe,QAAwBA,IAAe,OACjD,EAEF,GAcP,KAAqB,QAAhB,EAAAlD,EAAMoD,kBAAU,eAAE3C,QACrB,OAAO,iCAET,IAAM4C,EAAoC,GACtCC,EAA2B,EAE/BtD,EAAMoD,WAAWG,SAAQ,SAAAC,GACvBA,SAAAA,EAAWC,aAAaF,SAAQ,SAAAG,GAC9B,KAAI,KAA6BA,EAAYC,SAGzCL,GAAoBH,GAAxB,CAGAG,IAIA,IAAMM,EAAkBF,EAAYC,SAAW,iBAA6D,iBAAtBD,EAAYlD,KAC9FqD,KAAKC,MAAMJ,EAAYlD,MACvBkD,EAAYlD,KAEVuD,EAAoB,OAAH,wBAClBL,GAAW,CACdlD,KAAM,OAAF,wBACCoD,GAAe,CAElBnB,QAASzC,EAAMyC,SAAW,OAAJ,wBAASzC,EAAMyC,SAAO,CAAEuB,OAAQ,CAAEC,EAAGC,KAAKC,MAAMX,EAAUY,UAAY,YAIhGf,EAAmBgB,KAAKN,EAnBhB,CAoBV,GACF,IAEA,IAAMO,EAAoBtE,EAAMoD,WAAWmB,QAAO,SAACC,EAAKhB,G,QAItD,OAFAgB,GADyD,QAA/B,EAAuB,QAAvB,EAAAhB,aAAS,EAATA,EAAWC,oBAAY,eAAEhD,cAAM,QAAI,EAI/D,GAAG,GAEH,OAAK4C,EAAmB5C,OAItB,gCACG4C,EAAmBoB,KAAI,SAACf,EAAagB,G,QACpC,OACE,uBAAKC,IAAKD,EAAGlF,UAAU,kCACrB,uBAAKA,UAAU,WACb,gBAAC,IAAgB,CACfkE,YAAaA,EACbjB,QAAyB,QAAhB,EAAAiB,EAAYlD,YAAI,eAAEiC,QAC3BC,SAAyB,QAAhB,EAAAgB,EAAYlD,YAAI,eAAEiC,SAAUzC,EAAM2C,eAAiB,KAC5DiC,WAAS,KAKnB,IACA,uBAAKpF,UAAU,kBACb,gBAAC,IAAO,CACNA,UAAU,sCACViD,QAASzC,EAAM6E,eACfnC,QAAS1C,EAAM2C,gBAEf,gBAAC,IAAI,CACHI,UAAWA,EACX+B,OAAO,mBACPjF,QAAS,CACPkF,eAAgB1B,EAAmB5C,OACnCuE,WAAYV,QA7Bf,gCAoCX,C,4DClHM,SAAUW,IACd,IAAMC,GAAO,OAAc,QACrBC,GAAO,OAAc,QACrBC,GAAO,OAAc,QACrBC,GAAO,OAAc,QACrBC,GAAO,OAAc,QACrBC,GAAQ,OAAc,SAExBC,EAAgB,OAQpB,OAPIN,IAAMM,EAAgB,QACtBL,IAAMK,EAAgB,QACtBJ,IAAMI,EAAgB,QACtBH,IAAMG,EAAgB,QACtBF,IAAME,EAAgB,QACtBD,IAAOC,EAAgB,SAEpBA,CACT,C,6DCnBM,SAAUC,EACdC,EACAC,GAGA,IAAMC,EAAkB,WAAc,WACpC,OAAKF,aAAS,EAATA,EAAWjF,SAAWkF,GAA0B,wBAAmCA,GAGjF,mCAA8CD,EAAWC,GAFvD,IAGX,GAAG,CAACD,IASJ,OAPuB,WAAc,WACnC,OAAKE,aAAe,EAAfA,EAAiBnF,QAGf,wCAAmDmF,GAFjD,IAGX,GAAG,CAACA,GAGN,C,ukCCrBA,IAAMC,EAAmB,KAGZC,EAAyB,CAMpCC,sBAAqB,SAACL,GAIpB,IAAMM,EAAgBN,EAAUjB,KAAI,SAAAwB,GAAC,OAAIA,EAAEjE,IAAI,IAAEkE,KAAK,KAKhDC,EAAaH,EAAcI,MAAM,KAAKC,QAAO,SAAArE,GAAI,OAAKsE,OAAOtE,EAAK,IAAEyC,KAAI,SAAA8B,GAAG,OAAKA,CAAG,KAAK,GACxFC,EAAWR,EAAcI,MAAM,KAAKC,QAAO,SAAArE,GAAI,OAAIsE,OAAOtE,EAAK,KAAK,GAGpEyE,EAAqBf,EAAUgB,MAAK,SAAAC,GACxC,OAAQd,EAAiBe,KAAKD,EAAE3E,KAClC,IAGI6E,EAASL,EAASE,MAAK,SAAA1E,GAAI,OAAIA,KAASyE,aAAkB,EAAlBA,EAAoBzE,KAAI,IAMpE,GAHI0D,EAAUjF,OAAS,IACrBoG,GAAU,KAERJ,GAAsBN,EAAW1F,OACnC,MAAO,GAAP,OAAUoG,EAAM,YAAIJ,EAAmBzE,KAAK8E,OAAO,GAAE,cAAMX,EAAWY,OAKxE,IAAMC,EAiKV,SAA+BC,GAI7B,IAEIC,EAAgBC,EAQhBzC,EAAO0C,EAPPC,GAAyB,EAEvBC,EAAmB,GAOzB,IAJAL,EAAiBA,EAAeM,MAAK,SAACtB,EAAGuB,GAAC,OAAKvB,EAAIuB,CAAC,IAI/C9C,EAAI,EAAGA,EAAIuC,EAAexG,OAAQiE,IACrC0C,EAAI1C,EAAI,EAGH2C,IACHH,EAAaD,EAAevC,IAE9ByC,EAAUF,EAAeG,GAOrBH,EAAevC,GArOF,IAqOkByC,EACjCE,GAAgB,EACPA,GAMTC,EAAOjD,KAAK,GAAD,OAAI6C,EAAU,cAAMD,EAAevC,KAC9C2C,GAAgB,IAMhBC,EAAOjD,KAAK,GAAD,OAAI4C,EAAevC,KAC9B2C,GAAgB,GAIpB,OAAOC,CACT,CApN0BG,CAAsBtB,GAE5C,MAAO,GAAP,OAAUU,EAAM,YAAIG,EAAcd,KAAK,MACzC,EAEAwB,8BAA6B,SAAChC,GAC5B,OAAOI,EAAuB6B,wBAAwBjC,EACxD,EAEAkC,uBAAsB,SAAClC,GACrB,IAAMmC,EAAgBC,EAAA,QAAkBpC,GAClCqC,EAAeD,EAAA,OAAiBpC,GAEjCsC,EAAmD,EAA7BH,EAAc7F,KAAKoE,MAAM,KAAI,GAAjC,GAClB6B,EAAiD,EAA5BF,EAAa/F,KAAKoE,MAAM,KAAI,GAAhC,GActB,MAZ2B,UAAvB4B,IACFA,EAAqB,OAEG,UAAtBC,IACFA,EAAoB,OAEK,WAAvBD,IACFA,EAAqB,OAEG,WAAtBC,IACFA,EAAoB,OAElBD,IAAuBC,EAClB,GAAP,OAAUD,EAAkB,UAEvB,GAAP,OAAUA,EAAkB,cAAMC,EAAiB,SACrD,EAEAC,4BAA2B,SAACxC,GAC1B,IAAMmC,EAAgBC,EAAA,QAAkBpC,GAClCqC,EAAeD,EAAA,OAAiBpC,GAEtC,GAAImC,EAAc7F,OAAS+F,EAAa/F,KACtC,OAAO6F,EAAc7F,KAEvB,IAAKgG,EAAmD,EAA7BH,EAAc7F,KAAKoE,MAAM,KAAI,GAAjC,GAClB6B,EAAiD,EAA5BF,EAAa/F,KAAKoE,MAAM,KAAI,GAAhC,GActB,MAZ2B,UAAvB4B,IACFA,EAAqB,OAEG,UAAtBC,IACFA,EAAoB,OAEK,WAAvBD,IACFA,EAAqB,OAEG,WAAtBC,IACFA,EAAoB,OAEf,GAAP,OAAUD,EAAkB,cAAMC,EAAiB,OACrD,EAKAN,wBAAuB,SAACjC,GACtB,IAAMmC,EAAgBC,EAAA,QAAkBpC,GAClCqC,EAAeD,EAAA,OAAiBpC,GAEtC,OAAImC,EAAc7F,OAAS+F,EAAa/F,KAC/B6F,EAAc7F,KAEG,aAAtB+F,EAAa/F,KAGa,UAFiB,EAA7B6F,EAAc7F,KAAKoE,MAAM,KAAI,GAAjC,GAEF+B,cACD,kBAEF,kBAGF,mBACT,EAEAC,yBAAwB,SAAC1C,GACvB,IAAMmC,EAAgBC,EAAA,QAAkBpC,GAClCqC,EAAeD,EAAA,OAAiBpC,GAEtC,OAAImC,EAAc7F,OAAS+F,EAAa/F,KAC/B6F,EAAc7F,KAEG,iBAAtB+F,EAAa/F,KACR,GAAP,OAAU6F,EAAc7F,KAAI,aAEvB,sBACT,EAKAqG,sBAAqB,SAAC3C,GAEpB,IAAMmC,EAAgBC,EAAA,QAAkBpC,GAClCqC,EAAeD,EAAA,OAAiBpC,GAGhC4C,EAAyBR,EAAA,QAAkBD,EAAc7F,KAAKoE,MAAM,MACpEmC,EAAwBT,EAAA,QAAkBC,EAAa/F,KAAKoE,MAAM,MAGlEoC,EAAsBX,EAAc7F,KAAKoE,MAAM,KAAKM,MAAK,SAAA+B,GAAI,OAAKnC,OAAOmC,EAAK,IAC9EC,EAAqBX,EAAa/F,KAAKoE,MAAM,KAAKM,MAAK,SAAA+B,GAAI,OAAKnC,OAAOmC,EAAK,IAGlF,GAAIZ,IAAkBE,EAEpB,MAA+B,QAA3BO,GAA+D,cAA3BA,EAC/BT,EAAc7F,KAGhB,GAAP,OAAUsG,EAAsB,cAAME,GAOxC,IAAIG,EAAsB,GACtBC,EAAqB,GAczB,OAVED,EAD6B,cAA3BL,EACoB,IAGA,KAAH,OAAQE,GAI7BI,EAAqB,KAAH,OAAQF,GAGK,UAA3BJ,GAAgE,UAA1BC,EACjC,KAAP,OAAYI,EAAmB,gBAAQC,IAIV,UAA3BN,IACFK,EAAsB,SAAH,OAAYA,IAGH,UAA1BJ,IACFK,EAAqB,SAAH,OAAYA,IAIF,QAA1BL,IACFK,EAAqBb,EAAa/F,MAG7B,GAAP,OAAU2G,EAAmB,cAAMC,GACrC,GChMIC,EAAc,aACdC,EAAc,UAQPC,EAAiB,CAM5BC,+BAA8B,SAC5BC,EACAtD,GAOA,IAAMuD,EAAoBD,EACvB5C,QAAO,SAAA8C,GAAC,QAAMA,CAAC,IACf1E,KAAI,SAAA2E,GAAQ,OAAIA,EAASrH,GAAGsH,UAAU,IASzC,OAJ0B1D,EAAsBU,QAAO,SAAAiD,GACrD,OAAOJ,EAAkBK,SAASD,EAAaE,SAASH,WAC1D,GAGF,EAUAI,oCAAmC,SAAC9D,GAClC,IAEI+D,EAAuB,GAE3B,QAJ2B5B,EAAA,QAAkBnC,GAArCgE,gBAMN,KAAKC,EAAA,0BACL,KAAKA,EAAA,+BACL,KAAKA,EAAA,gCACL,KAAKA,EAAA,6BACL,KAAKA,EAAA,sCACH,GAAqC,IAAjCjE,EAAsBlF,OACxB,OAAOkF,EAAsB,GAE/B+D,EAAuB5D,EAAuBC,sBAAsBJ,GACpE,MAEF,KAAKiE,EAAA,0CACH,GAAqC,IAAjCjE,EAAsBlF,OACxB,OAAOkF,EAAsB,GAG/B+D,EAAuB5D,EAAuB4B,8BAA8B/B,GAC5E,MAEF,KAAKiE,EAAA,wCACHF,EAAuB5D,EAAuBoC,4BAA4BvC,GAC1E,MAEF,KAAKiE,EAAA,mCACHF,EAAuB5D,EAAuB8B,uBAAuBjC,GACrE,MAEF,KAAKiE,EAAA,oCACHF,EAAuB5D,EAAuB6B,wBAAwBhC,GACtE,MAGF,KAAKiE,EAAA,qCACHF,EAAuB5D,EAAuBsC,yBAAyBzC,GACvE,MAGF,KAAKiE,EAAA,kCACHF,EAAuB5D,EAAuBuC,sBAAsB1C,GAItE,KAAKiE,EAAA,4BACL,KAAKA,EAAA,0BACL,KAAKA,EAAA,8BACL,KAAKA,EAAA,+BAKP,OAAKF,EAGE,CAAE1H,KAAM0H,GAFN,IAGX,EAKAG,wCAAuC,SAACC,GAEtC,IAAMC,EAAoB,SAACrE,GACzB,OAAKA,EAAUjF,QAMfiF,EAAUnC,SAAQ,SAAA6F,GAChB,IAAMY,GAASlC,EAAA,QAAkBsB,EAASpH,KAAKiI,MAAMpB,IAErD,IAAKqB,EAGH,OAFAA,EAAiBd,OACjBe,EAAsBH,GAIpBA,EAAQG,IACVD,EAAiBd,EACrB,IAEOc,GAlBE,KAET,IAAIA,EACAC,CAgBN,EAGMC,EAAmC,CAAC,EAEtCC,EAAuB,GAoC3B,OAlCAP,EAAQvG,SAAQ,SAAA+G,GACd,IAAKF,EAAaE,EAAOtI,MAGvB,OAFAoI,EAAaE,EAAOtI,MAAQ,OAC5BqI,EAAOhG,KAAKiG,GAIdD,EAAOhG,KAAKiG,GACZF,EAAaE,EAAOtI,QAGpB,IAGMuI,EAHQF,EAAOG,OAAOH,EAAO5J,OAAS2J,EAAaE,EAAOtI,OAGtCuF,MAAK,SAACtB,EAAQuB,GACtC,IAAMiD,EAAyBV,EAAkB9D,EAAEyE,6BAA6BlK,MAC1EmK,EAA0BZ,EAAkBvC,EAAEkD,6BAA6BlK,MAEjF,IAAKiK,GAA0BE,EAC7B,OAAO,EAET,IAAKA,EACH,OAAQ,EAEV,IAAMC,EAAaH,EAAuBzI,KAAK6I,cAAcF,EAAwB3I,MAErF,OAAmB,IAAf4I,EAAyBA,EAEtBA,EAAa,GAAK,EAAI,CAC/B,IAEAP,EAASA,EAAOS,OAAOP,EACzB,IAEOF,CACT,EAEAU,6BAA4B,SAACrF,GAA0D,IAAvB1B,EAAA,uDAAqB,CAAC,EACpF,GAAKgH,EAAA,WAAsBhH,KAAWgH,EAAA,UAAqBhH,IAGtD0B,GAAcA,EAAUjF,QAGxBsI,EAAekC,oBAAoBvF,GAAxC,CAIA,IAAMO,EAAMjC,EAANiC,EAEN,GAAKA,EAAL,CAIiB,iBAANA,IACTA,EAAI,CAACA,IAEP,IAAMiF,EAAwB,SAACC,GAC7B,OAAOA,EAAaC,QAAQtC,EAAa,IAAIX,aAC/C,EAGMkD,EAAiBpF,EAAE1B,QAAO,SAAC+G,EAAmBC,GAElD,OADAD,EAAMJ,EAAsBK,IAAgBA,EACrCD,CACT,GAAG,CAAC,GAGJ,OAAO5F,EAAUW,QAAO,SAAC+C,GACvB,OAAOiC,EAAeH,EAAsB9B,EAASpH,MACvD,GAnBQ,CANA,CA0BV,EAEAwJ,kBAAiB,SAAC9F,GAChB,OAAKA,aAAS,EAATA,EAAWjF,QAGT,CAAEwF,EAAGP,EAAUjB,KAAI,SAAAwB,GAAC,OAAIA,EAAEjE,IAAI,KAF5B,IAGX,EAEAiJ,oBAAmB,WAAuC,IAAtCvF,EAAA,uDAAoC,GACtD,QAAKA,GAGEA,EAAUjF,OA3NU,CA4N7B,E","sources":["file:///app/packages/libs/common/src/react/utils/LinkifyHelper.ts","file:///app/packages/libs/shared/src/components/video-list/components/video-item-description/video-item-description.scss","file:///app/packages/libs/shared/src/components/video-list/components/video-item-description/VideoItemDescription.tsx","file:///app/packages/libs/shared/src/components/video-list/components/video-item-restriction-badge/RestrictionBadge.tsx","file:///app/packages/libs/shared/src/components/video-list/components/video-item-restriction-badge/VideoItemRestrictionBadge.tsx","file:///app/packages/libs/shared/src/components/video-list/components/video-item-title/VideoItemTitle.tsx","file:///app/packages/libs/shared/src/components/video-list/interactive-item/InteractiveItemQuestions.tsx","file:///app/packages/libs/shared/src/hooks/UseGetMediaQueryString.ts","file:///app/packages/libs/shared/src/hooks/UseMergeAudiences.ts","file:///app/packages/libs/shared/src/utils/audience-helper/AudienceStringBuilders.ts","file:///app/packages/libs/shared/src/utils/audience-helper/AudienceHelper.ts"],"sourcesContent":["import { ObjectHash } from 'backbone';\nimport linkifyStr from 'linkifyjs/string';\nimport * as _ from 'underscore';\n\nconst BaseLinkifyOptions = {\n className: 'info-link',\n defaultProtocol: 'https'\n};\n\nexport const LinkifyHelper = {\n /**\n * The underlying linkifyStr interface escapes text within the input string\n */\n linkifyText(text: string, options?: ObjectHash): string {\n if (!text) return;\n const ops = options ? _.extend({}, BaseLinkifyOptions, options) : BaseLinkifyOptions;\n return linkifyStr(text, ops);\n }\n};","// extracted by mini-css-extract-plugin\nexport default {\"captionsBadge\":\"eXhiL\"};","import * as React from 'react';\n\nimport { LinkifyHelper } from 'libs/common/react/utils/LinkifyHelper';\n\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { RestrictionType } from 'libs/shared/enums/RestrictionType';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { Video } from 'libs/shared/interfaces';\nimport { RestrictionHelper } from 'libs/shared/utils/RestrictionHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './video-item-description.scss';\n\ninterface InnerContentProps {\n video: Video;\n showSignIn: boolean;\n}\n\nfunction InnerContent(props: InnerContentProps): JSX.Element {\n if (!props.video.description && !VideoHelper.getCanBeConsumed(props.video)?.canNavigate) {\n return (\n <em>{VideoHelper.getPrivacyReasoning(props.video, props.showSignIn)}</em>\n );\n }\n\n const hasCaptions = !!props.video?.subtitles?.data?.length;\n\n return (\n <>\n {hasCaptions && (\n <span className={`d-inline-block align-middle ${styles.captionsBadge}`}>\n <Badge type={BadgeType.Captions} data={props.video?.subtitles} />\n </span>\n )}\n {!!props.video?.productionYear && (\n <span className='fw-semibold align-middle'>\n {hasCaptions ? ' \\u2022 ' : ''}{props.video.productionYear}\n </span>\n )}\n {!!props.video.description && (\n <span\n className='align-middle'\n dangerouslySetInnerHTML={{\n __html: `${(props.video.productionYear || hasCaptions) ? ' \\u2022 ' : ''}${LinkifyHelper.linkifyText(props.video.description)}`\n }}\n />\n )}\n </>\n );\n}\n\ninterface VideoItemDescriptionProps {\n video: Video;\n showSignIn?: boolean;\n}\n\nexport function VideoItemDescription(props: VideoItemDescriptionProps): JSX.Element {\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n const hasUserRestrictions = !!RestrictionHelper.getRestrictionByType(props.video, RestrictionType.User);\n\n if (isMobile || hasUserRestrictions)\n return <></>;\n\n return (\n <div className={`position-relative overflow-hidden clamp-2`}>\n <p className='m-0'>\n <InnerContent\n video={props.video}\n showSignIn={props.showSignIn}\n />\n </p>\n </div>\n );\n}","import React from 'react';\n\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { Restrictions, YearGroup } from 'libs/shared/interfaces';\n\ninterface RestrictionBadgeProps {\n restrictions: Restrictions;\n yearGroups: YearGroup[];\n}\n\nexport function RestrictionBadge(props: RestrictionBadgeProps): JSX.Element {\n return (\n <Badge\n type={BadgeType.Restriction}\n data={{ restrictions: props.restrictions, yearGroups: props.yearGroups }}\n inline\n />\n );\n}","import React from 'react';\n\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { RestrictionBadge } from 'libs/shared/components/video-list/components/video-item-restriction-badge/RestrictionBadge';\nimport { VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { RestrictionHelper } from 'libs/shared/utils/RestrictionHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\ninterface VideoItemRestrictionBadgeProps {\n video: VideoTypes;\n yearGroups: YearGroup[];\n className?: string;\n}\n\nexport function VideoItemRestrictionBadge(props: VideoItemRestrictionBadgeProps): JSX.Element {\n const hasRestrictions = RestrictionHelper.hasRestrictions(props.video);\n const { canConsume } = VideoHelper.getCanBeConsumed(props.video);\n\n if (!hasRestrictions || !props.yearGroups || !canConsume)\n return <></>;\n \n return (\n <BadgeListContainer className={props.className || 'pt-1'}>\n <RestrictionBadge restrictions={props.video._restrictions} yearGroups={props.yearGroups} />\n </BadgeListContainer>\n );\n}","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, ClickDescriptor, HashObject, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { VideoItemSize } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { VideoTitle } from 'libs/shared/components/video-title/VideoTitle';\nimport { Video, YearGroup } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\ninterface VideoItemTitleProps {\n video: Video;\n appLink: Core.AppLink;\n onClickAppLink?: () => void;\n size?: VideoItemSize;\n analyticsData?: HashObject;\n analyticsOptions: AnalyticsOptions;\n yearGroups: YearGroup[];\n showNewVideoIndicator?: boolean;\n\n linkClassName?: string;\n textClassName?: 'h6' | 'h5' | 'h4';\n headingClassName?: string;\n}\n\nexport function VideoItemTitle(props: VideoItemTitleProps): JSX.Element {\n const { canNavigate } = VideoHelper.getCanBeConsumed(props.video);\n const title = VideoHelper.getTitle(props.video);\n\n const analyticsData: HashObject = {\n ...props.analyticsData,\n id: props.video?.id,\n name: props.video?.name\n };\n\n const analyticsOptions: AnalyticsOptions = {\n ...props.analyticsOptions,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.Title\n };\n\n const titleContainerClassname = props.textClassName ? '' : `clamp-1 align-middle`;\n const titleTextClassName = props.textClassName || (props.size === 'md' ? 'h4' : 'h5');\n\n return (\n <AppLink\n className={props.linkClassName}\n appLink={canNavigate ? props.appLink : null}\n onClick={canNavigate ? props.onClickAppLink : null}\n analyticsOptions={analyticsOptions}\n analyticsData={analyticsData}\n >\n <div className={titleContainerClassname} title={props.video.name ?? ''}>\n <VideoTitle\n video={props.video}\n title={title}\n yearGroups={props.yearGroups}\n lockSize={props.size}\n textClassName={titleTextClassName}\n showNewVideoIndicator={props.showNewVideoIndicator}\n headingClassName={props.headingClassName}\n />\n </div>\n </AppLink>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useGetMediaQueryString } from 'libs/shared/hooks/UseGetMediaQueryString';\nimport { ExperimentalInteractionTypes, Interaction, InteractionTypeId, Timepoint } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.interactiveItem';\n\nfunction useGetQuestionDisplayLimit(totalToDisplay: number): number {\n const mediaQuery = useGetMediaQueryString();\n\n if (typeof totalToDisplay === 'number')\n return totalToDisplay;\n \n if (mediaQuery === MediaQueryStrings.XS)\n return 3;\n\n if (mediaQuery === MediaQueryStrings.SM)\n return 1;\n\n if (mediaQuery === MediaQueryStrings.MD || mediaQuery === MediaQueryStrings.LG)\n return 2;\n\n return 3;\n}\n\ninterface InteractiveItemQuestionsProps {\n timepoints: Timepoint[];\n appLink?: Core.AppLink;\n onClickAppLink?: () => void;\n previewAppLink: Core.AppLink;\n totalToDisplay?: number;\n}\n\nexport function InteractiveItemQuestions(props: InteractiveItemQuestionsProps): JSX.Element {\n const questionDisplayLimit = useGetQuestionDisplayLimit(props.totalToDisplay);\n\n if (!props.timepoints?.length)\n return <></>;\n\n const interactionsToShow: Interaction[] = [];\n let interactionCount: number = 0;\n\n props.timepoints.forEach(timepoint => {\n timepoint?.interactions.forEach(interaction => {\n if (ExperimentalInteractionTypes[interaction.typeId])\n return;\n\n if (interactionCount >= questionDisplayLimit)\n return;\n\n interactionCount++;\n\n // When displaying an annotation interaction, we display the \"data\" field, which may be a JSON string\n // For other interactions we display the \"name\" field, so we don't need to parse those.\n const interactionData = interaction.typeId === InteractionTypeId.Annotation && typeof(interaction.data) === 'string'\n ? JSON.parse(interaction.data)\n : interaction.data;\n\n const interactionToShow = {\n ...interaction,\n data: {\n ...interactionData,\n // Add interactive time to applink and convert to seconds\n appLink: props.appLink && { ...props.appLink, params: { t: Math.floor(timepoint.visibleAt / 1000) } }\n }\n };\n \n interactionsToShow.push(interactionToShow);\n });\n });\n \n const totalInteractions = props.timepoints.reduce((acc, timepoint) => {\n const totalInteractions = timepoint?.interactions?.length ?? 0;\n acc += totalInteractions;\n\n return acc;\n }, 0);\n\n if (!interactionsToShow.length)\n return <></>;\n\n return (\n <>\n {interactionsToShow.map((interaction, i) => {\n return (\n <div key={i} className='d-flex align-items-center mb-1'>\n <div className='clamp-1'>\n <InteractionLabel\n interaction={interaction}\n appLink={interaction.data?.appLink}\n onClick={interaction.data?.appLink ? props.onClickAppLink : null}\n smallIcon\n />\n </div>\n </div>\n );\n })}\n <div className='mb-1 text-link'>\n <AppLink\n className='cursor-pointer hover-text-underline'\n appLink={props.previewAppLink}\n onClick={props.onClickAppLink}\n >\n <Text\n namespace={namespace}\n phrase='previewQuestions'\n options={{\n questionsShown: interactionsToShow.length,\n smartCount: totalInteractions\n }}\n />\n </AppLink>\n </div>\n </>\n );\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 React from 'react';\n\nimport { Audience, PresentationAudience } from '../interfaces';\nimport { AudienceHelper } from '../utils/audience-helper/AudienceHelper';\n\nexport function useMergeAudiences(\n audiences: Audience[],\n presentationAudiences: PresentationAudience[]\n): PresentationAudience {\n // Memoize the audience functions as they are somewhat expensive and the result shouldn't change\n const sortedAudiences = React.useMemo(() => {\n if (!audiences?.length || !presentationAudiences || !AudienceHelper.shouldShowAudiences(presentationAudiences))\n return null;\n\n return AudienceHelper.getSortedPresentationAudiences(audiences, presentationAudiences);\n }, [audiences]);\n\n const mergedAudience = React.useMemo(() => {\n if (!sortedAudiences?.length)\n return null;\n\n return AudienceHelper.getMergedPresentationAudienceString(sortedAudiences);\n }, [sortedAudiences]);\n\n return mergedAudience;\n}","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nconst HAS_NUMBER_REGEX = /\\d/;\nconst COUNT_OFFSET = 1;\n\nexport const AudienceStringBuilders = {\n /**\n * Handles audience sets like:\n * - Year 7, Year 8, etc\n * - Kindergarten, Grade 1, Grade 2, etc\n */\n yearsAndGradesBuilder(audiences: PresentationAudience[]): string {\n /**\n * Create a string with all of the audiences\n */\n const combinedNames = audiences.map(a => a.name).join(' ');\n\n /**\n * Extract all the numbers and matches from the string\n */\n const numberList = combinedNames.split(' ').filter(name => !isNaN(+name)).map(num => +num) || [];\n const wordList = combinedNames.split(' ').filter(name => isNaN(+name)) || [];\n\n // Find an audience that doesn't have a number, like \"Kindergarten\" or \"Foundation\".\n const audienceWithoutNum = audiences.find(p => {\n return !HAS_NUMBER_REGEX.test(p.name);\n });\n\n // Get audience label prefix\n let prefix = wordList.find(name => name !== audienceWithoutNum?.name);\n\n // Pluralise the prefix is there are multiple audiences\n if (audiences.length > 1)\n prefix += 's';\n\n if (audienceWithoutNum && numberList.length)\n return `${prefix} ${audienceWithoutNum.name.charAt(0)} - ${numberList.pop()}`;\n\n /**\n * Build set of logical audience ranges\n */\n const audienceRange = processAudienceRanges(numberList);\n\n return `${prefix} ${audienceRange.join(', ')}`;\n },\n\n internationalSecondaryBuilder(audiences: PresentationAudience[]): string {\n return AudienceStringBuilders.englandSecondaryBuilder(audiences);\n },\n\n scotlandPrimaryBuilder(audiences: PresentationAudience[]): string {\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n let [firstAudienceLevel] = firstAudience.name.split(' ');\n let [lastAudienceLevel] = lastAudience.name.split(' ');\n\n if (firstAudienceLevel === 'First')\n firstAudienceLevel = '1st';\n\n if (lastAudienceLevel === 'First')\n lastAudienceLevel = '1st';\n\n if (firstAudienceLevel === 'Second')\n firstAudienceLevel = '2nd';\n\n if (lastAudienceLevel === 'Second')\n lastAudienceLevel = '2nd';\n\n if (firstAudienceLevel === lastAudienceLevel)\n return `${firstAudienceLevel} Level`;\n\n return `${firstAudienceLevel} - ${lastAudienceLevel} Level`;\n },\n\n internationalPrimaryBuilder(audiences: PresentationAudience[]): string {\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n if (firstAudience.name === lastAudience.name)\n return firstAudience.name;\n\n let [firstAudienceLevel] = firstAudience.name.split(' ');\n let [lastAudienceLevel] = lastAudience.name.split(' ');\n\n if (firstAudienceLevel === 'Lower')\n firstAudienceLevel = 'Low';\n\n if (lastAudienceLevel === 'Lower')\n lastAudienceLevel = 'Low';\n\n if (firstAudienceLevel === 'Middle')\n firstAudienceLevel = 'Mid';\n\n if (lastAudienceLevel === 'Middle')\n lastAudienceLevel = 'Mid';\n\n return `${firstAudienceLevel} - ${lastAudienceLevel} Pri`;\n },\n\n /**\n * Handles the english secondary audiences, which can be: Lower Secondary, Upper Secondary, and Advanced\n */\n englandSecondaryBuilder(audiences: PresentationAudience[]): string {\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n if (firstAudience.name === lastAudience.name)\n return firstAudience.name;\n\n if (lastAudience.name === 'Advanced') {\n const [level] = firstAudience.name.split(' ');\n\n if (level.toLowerCase() === 'lower')\n return 'Lower Sec - Adv';\n\n return 'Upper Sec - Adv';\n }\n\n return 'Lower - Upper Sec';\n },\n\n scotlandSecondaryBuilder(audiences: PresentationAudience[]): string {\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n if (firstAudience.name === lastAudience.name)\n return firstAudience.name;\n\n if (lastAudience.name === 'Senior Phase')\n return `${firstAudience.name} - Senior`;\n\n return 'Third - Fourth Level';\n },\n\n /**\n * Handles the audience set: Reception, Key Stage 1, Lower Key Stage 2, and Upper Key Stage 2\n */\n englandPrimaryBuilder(audiences: PresentationAudience[]): string {\n // The first and last audience will build out the range\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n // The first word in the strings will either be \"Upper\", \"Lower\", \"Key\", or \"Reception\"\n const firstAudienceFirstWord = ArrayHelper.first(firstAudience.name.split(' '));\n const lastAudienceFirstWord = ArrayHelper.first(lastAudience.name.split(' '));\n\n // Each audience in this set except for \"Reception\" has a number. Get the numbers for the first and last audiences\n const firstAudienceNumber = firstAudience.name.split(' ').find(word => !isNaN(+word));\n const lastAudienceNumber = lastAudience.name.split(' ').find(word => !isNaN(+word));\n\n // If there's only one audience on the video:\n if (firstAudience === lastAudience) {\n // For these 2 audiences, return the full name as it's short enough already\n if (firstAudienceFirstWord === 'Key' || firstAudienceFirstWord === 'Reception')\n return firstAudience.name;\n\n // For the Upper/Lower key stage audiences, abbreviate the \"key stage\" part to KS1/KS2\n return `${firstAudienceFirstWord} KS${firstAudienceNumber}`;\n }\n\n /**\n * Handle when the object has >1 audience\n */\n\n let firstAudienceString = '';\n let lastAudienceString = '';\n\n // Reception is always shortened to \"R\" when in a range\n if (firstAudienceFirstWord === 'Reception') {\n firstAudienceString = 'R';\n } else {\n // All other audiences will be abbreviated to \"KS1/KS2\"\n firstAudienceString = `KS${firstAudienceNumber}`;\n }\n\n // The last audience will always be a key stage, so abbreviate this too\n lastAudienceString = `KS${lastAudienceNumber}`;\n\n // If the audience range contains both the \"Lower\" and \"Upper\" audiences, abbreviate those and return\n if (firstAudienceFirstWord === 'Lower' && lastAudienceFirstWord === 'Upper') {\n return `L ${firstAudienceString} - U ${lastAudienceString}`;\n }\n\n // Add \"Lower\" and \"Upper\" to the strings if it's needed\n if (firstAudienceFirstWord === 'Lower') {\n firstAudienceString = `Lower ${firstAudienceString}`;\n }\n\n if (lastAudienceFirstWord === 'Upper') {\n lastAudienceString = `Upper ${lastAudienceString}`;\n }\n\n // This handles a case where the range is Reception - Key Stage 1. In which case we don't abbreviate the key stage part to KS1.\n if (lastAudienceFirstWord === 'Key') {\n lastAudienceString = lastAudience.name;\n }\n\n return `${firstAudienceString} - ${lastAudienceString}`;\n }\n};\n\nfunction processAudienceRanges(audienceValues: number[]): string[] {\n /**\n * Lookahead by increments of offset\n */\n const offset = COUNT_OFFSET;\n\n let initialVal; let nextVal;\n let isContinguous: boolean = false;\n\n const ranges: string[] = [];\n\n // Audience values need to be in ascending order\n audienceValues = audienceValues.sort((a, b) => a - b);\n\n let i; let j;\n\n for (i = 0; i < audienceValues.length; i++) {\n j = i + 1;\n\n // Set our lower boundary to compare against\n if (!isContinguous)\n initialVal = audienceValues[i];\n\n nextVal = audienceValues[j];\n\n /**\n * Where the next number is also the next incremental value\n * we're going to continue iterating until the next value\n * is no longer contiguos.\n */\n if (audienceValues[i] + offset === nextVal) {\n isContinguous = true;\n } else if (isContinguous) {\n /**\n * Where we were tracking a contiguous set, format appropriately \n * and store the vals\n */\n\n ranges.push(`${initialVal} - ${audienceValues[i]}`);\n isContinguous = false;\n } else {\n /**\n * Where the values arent contiguous, just store the current value\n */\n\n ranges.push(`${audienceValues[i]}`);\n isContinguous = false;\n }\n }\n\n return ranges;\n}","import { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { HardCoded } from 'libs/shared/constants/HardCoded';\nimport { Audience, BaseObject, PresentationAudience } from 'libs/shared/interfaces';\n\nimport { AudienceStringBuilders } from './AudienceStringBuilders';\n\nconst DIGIT_REGEX = /([0-9]+)/ig;\nconst SPACE_REGEX = /\\s|\\+/ig;\n\n/**\n * Where there is 1 or less audiences on a presentation, it provides little value to\n * the user's experience, so we'll hide audiences altogether.\n */\nconst MIN_AUDIENCE_THRESHOLD = 1;\n\nexport const AudienceHelper = {\n /**\n * This is needed to sort an object's audiences, as they are not sorted by the backend.\n * To do this, we take the presentation audiences (sorted) and filter them by the object's\n * audiences, leaving behind a sorted array of object audiences.\n */\n getSortedPresentationAudiences(\n objectAudiences: Audience[],\n presentationAudiences: PresentationAudience[]\n ): PresentationAudience[] {\n /**\n * Atm there is a bug in flight's optimize, around multiple parts of the page \n * fetching the same object with a different response. We are filtering out\n * falsey values in our object audience ids until that's fixed. - Sha\n */\n const objectAudienceIds = objectAudiences\n .filter(v => !!v)\n .map(audience => audience.id.toString());\n\n /**\n * Remove audiences that aren't relevant for the user's current presentation\n */\n const filteredAudiences = presentationAudiences.filter(presAudience => {\n return objectAudienceIds.includes(presAudience.masterId.toString());\n });\n\n return filteredAudiences;\n },\n\n /**\n * This function accepts a set of presentation audiences, and returns a single\n * audience where the name is a merged string of the names of all of the audiences passed in.\n *\n * As we add more presentations that have different audience sets, we'll need to extend the `switch`\n * statement below to either include new string builder functions, or to include new presentation IDs\n * for existing string builder functions.\n */\n getMergedPresentationAudienceString(presentationAudiences: PresentationAudience[]): PresentationAudience {\n const { presentationId } = ArrayHelper.first(presentationAudiences);\n\n let mergedAudienceString = '';\n\n switch (+presentationId) {\n // Generic `Name Number`. Sometimes has just name. Examples: Year 12, Grade 4, Kindergarten\n case HardCoded.PresentationIds.DEFAULT:\n case HardCoded.PresentationIds.AU_SECONDARY:\n case HardCoded.PresentationIds.US_ELEMENTARY:\n case HardCoded.PresentationIds.AU_PRIMARY:\n case HardCoded.PresentationIds.STREAMABLE_LEARNING:\n if (presentationAudiences.length === 1)\n return presentationAudiences[0];\n\n mergedAudienceString = AudienceStringBuilders.yearsAndGradesBuilder(presentationAudiences);\n break;\n\n case HardCoded.PresentationIds.INTERNATIONAL_SECONDARY:\n if (presentationAudiences.length === 1)\n return presentationAudiences[0];\n\n // TODO: Implement this properly\n mergedAudienceString = AudienceStringBuilders.internationalSecondaryBuilder(presentationAudiences);\n break;\n\n case HardCoded.PresentationIds.INTERNATIONAL_PRIMARY:\n mergedAudienceString = AudienceStringBuilders.internationalPrimaryBuilder(presentationAudiences);\n break;\n\n case HardCoded.PresentationIds.SCOTLAND_PRIMARY:\n mergedAudienceString = AudienceStringBuilders.scotlandPrimaryBuilder(presentationAudiences);\n break;\n\n case HardCoded.PresentationIds.ENGLISH_SECONDARY:\n mergedAudienceString = AudienceStringBuilders.englandSecondaryBuilder(presentationAudiences);\n break;\n\n \n case HardCoded.PresentationIds.SCOTLAND_SECONDARY:\n mergedAudienceString = AudienceStringBuilders.scotlandSecondaryBuilder(presentationAudiences);\n break;\n\n // Key Stage 1, Lower Key Stage 2, etc.\n case HardCoded.PresentationIds.ENGLAND_PRIMARY:\n mergedAudienceString = AudienceStringBuilders.englandPrimaryBuilder(presentationAudiences);\n break;\n\n // These presentations only have 1 audience mapped. These are never shown as badges in the product.\n case HardCoded.PresentationIds.US_MIDDLE:\n case HardCoded.PresentationIds.US_HIGH:\n case HardCoded.PresentationIds.AU_TERTIARY:\n case HardCoded.PresentationIds.UK_TERTIARY:\n default:\n break;\n }\n\n if (!mergedAudienceString)\n return null;\n\n return { name: mergedAudienceString } as PresentationAudience;\n },\n\n /**\n * This function assumes the members array passed in is ordered by `name`.\n */\n sortMembersWithDuplicateNamesByAudience(members: BaseObject[]): BaseObject[] {\n // Returns the lowest level audience out of an array of audience objects by looking at the name\n const getLowestAudience = (audiences: Audience[]) => {\n if (!audiences.length)\n return null;\n\n let lowestAudience: Audience;\n let lowestAudienceDigit: number;\n\n audiences.forEach(audience => {\n const digit = +ArrayHelper.first(audience.name.match(DIGIT_REGEX));\n\n if (!lowestAudience) {\n lowestAudience = audience;\n lowestAudienceDigit = digit;\n return;\n }\n\n if (digit < lowestAudienceDigit)\n lowestAudience = audience;\n });\n\n return lowestAudience;\n };\n\n // This is used to track how many times a member's name appears in the collection\n const nameCountMap: HashObject<number> = {};\n\n let sorted: BaseObject[] = [];\n\n members.forEach(member => {\n if (!nameCountMap[member.name]) {\n nameCountMap[member.name] = 1;\n sorted.push(member);\n return;\n }\n\n sorted.push(member);\n nameCountMap[member.name]++;\n\n // Take the slice of duplicates that we want to sort by audience\n const slice = sorted.splice(sorted.length - nameCountMap[member.name]);\n\n // Sort the slice by lowest audience\n const sortedSlice = slice.sort((a: any, b: any) => {\n const firstObjLowestAudience = getLowestAudience(a.subjectPresentationAudiences.data);\n const secondObjLowestAudience = getLowestAudience(b.subjectPresentationAudiences.data);\n\n if (!firstObjLowestAudience && secondObjLowestAudience)\n return 1;\n\n if (!secondObjLowestAudience)\n return -1;\n\n const comparison = firstObjLowestAudience.name.localeCompare(secondObjLowestAudience.name);\n\n if (comparison === 0) return comparison;\n\n return comparison > 0 ? -1 : 1;\n });\n\n sorted = sorted.concat(sortedSlice);\n });\n\n return sorted;\n },\n\n getActiveAudiencesFromParams(audiences: PresentationAudience[], params: HashObject = {}): PresentationAudience[] {\n if (!ObjectHelper.isObject(params) || ObjectHelper.isEmpty(params))\n return;\n\n if (!audiences || !audiences.length)\n return;\n\n if (!AudienceHelper.shouldShowAudiences(audiences))\n return;\n\n // 'a' is shorthand for audience\n let { a } = params;\n\n if (!a)\n return;\n\n // Only a single query param was passed, we'll wrap it in an array\n if (typeof a === 'string')\n a = [a];\n\n const normalizeAudienceName = (audienceName: string) => {\n return audienceName.replace(SPACE_REGEX, '').toLowerCase();\n };\n\n // Build an audience lookup\n const audienceLookup = a.reduce((state: HashObject, audienceStr: string) => {\n state[normalizeAudienceName(audienceStr)] = audienceStr;\n return state;\n }, {});\n\n // Filter out our active audience based on whether their name matches the lookup object\n return audiences.filter((audience: PresentationAudience) => {\n return audienceLookup[normalizeAudienceName(audience.name)];\n });\n },\n\n getAudienceParams(audiences: PresentationAudience[]): HashObject {\n if (!audiences?.length)\n return null;\n\n return { a: audiences.map(a => a.name) };\n },\n\n shouldShowAudiences(audiences: PresentationAudience[] = []): boolean {\n if (!audiences)\n return false;\n\n return audiences.length > MIN_AUDIENCE_THRESHOLD;\n }\n};\n"],"names":["BaseLinkifyOptions","className","defaultProtocol","LinkifyHelper","linkifyText","text","options","ops","InnerContent","props","video","description","VideoHelper","canNavigate","showSignIn","hasCaptions","subtitles","data","length","Badge","type","productionYear","dangerouslySetInnerHTML","__html","VideoItemDescription","isMobile","hasUserRestrictions","RestrictionHelper","RestrictionType","RestrictionBadge","restrictions","yearGroups","inline","VideoItemRestrictionBadge","hasRestrictions","canConsume","_restrictions","VideoItemTitle","title","analyticsData","id","name","analyticsOptions","actionType","descriptor","titleContainerClassname","textClassName","titleTextClassName","size","linkClassName","appLink","onClick","onClickAppLink","lockSize","showNewVideoIndicator","headingClassName","namespace","InteractiveItemQuestions","totalToDisplay","mediaQuery","questionDisplayLimit","timepoints","interactionsToShow","interactionCount","forEach","timepoint","interactions","interaction","typeId","interactionData","JSON","parse","interactionToShow","params","t","Math","floor","visibleAt","push","totalInteractions","reduce","acc","map","i","key","smallIcon","previewAppLink","phrase","questionsShown","smartCount","useGetMediaQueryString","isXS","isSM","isMD","isLG","isXL","isXXL","currentString","useMergeAudiences","audiences","presentationAudiences","sortedAudiences","HAS_NUMBER_REGEX","AudienceStringBuilders","yearsAndGradesBuilder","combinedNames","a","join","numberList","split","filter","isNaN","num","wordList","audienceWithoutNum","find","p","test","prefix","charAt","pop","audienceRange","audienceValues","initialVal","nextVal","j","isContinguous","ranges","sort","b","processAudienceRanges","internationalSecondaryBuilder","englandSecondaryBuilder","scotlandPrimaryBuilder","firstAudience","ArrayHelper","lastAudience","firstAudienceLevel","lastAudienceLevel","internationalPrimaryBuilder","toLowerCase","scotlandSecondaryBuilder","englandPrimaryBuilder","firstAudienceFirstWord","lastAudienceFirstWord","firstAudienceNumber","word","lastAudienceNumber","firstAudienceString","lastAudienceString","DIGIT_REGEX","SPACE_REGEX","AudienceHelper","getSortedPresentationAudiences","objectAudiences","objectAudienceIds","v","audience","toString","presAudience","includes","masterId","getMergedPresentationAudienceString","mergedAudienceString","presentationId","HardCoded","sortMembersWithDuplicateNamesByAudience","members","getLowestAudience","digit","match","lowestAudience","lowestAudienceDigit","nameCountMap","sorted","member","sortedSlice","splice","firstObjLowestAudience","subjectPresentationAudiences","secondObjLowestAudience","comparison","localeCompare","concat","getActiveAudiencesFromParams","ObjectHelper","shouldShowAudiences","normalizeAudienceName","audienceName","replace","audienceLookup","state","audienceStr","getAudienceParams"],"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-
|
|
2
|
+
//# sourceMappingURL=5056-65c739468f-lite.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts/5056-65c739468f-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/analytics/utils/AnalyticsFilterUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/AnonymiseUserUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/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":""}
|