@clickview/lite 0.50.0-rc.4 → 0.50.0-rc.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/dist/bundles.json +1 -1
  2. package/dist/scripts/{1402-d327ed0365-lite.chunk.js → 1402-8c3babb6af-lite.chunk.js} +2 -2
  3. package/dist/scripts/1402-8c3babb6af-lite.chunk.js.map +1 -0
  4. package/dist/scripts/{1437-0db2164033-lite.chunk.js → 1437-2931819506-lite.chunk.js} +2 -2
  5. package/dist/scripts/{1437-0db2164033-lite.chunk.js.map → 1437-2931819506-lite.chunk.js.map} +1 -1
  6. package/dist/scripts/{1518-9961f6d99b-lite.chunk.js → 1518-e6c8ab0c89-lite.chunk.js} +2 -2
  7. package/dist/scripts/1518-e6c8ab0c89-lite.chunk.js.map +1 -0
  8. package/dist/scripts/{1820-006bcd8691-lite.chunk.js → 1820-818cf5a35d-lite.chunk.js} +2 -2
  9. package/dist/scripts/{1820-006bcd8691-lite.chunk.js.map → 1820-818cf5a35d-lite.chunk.js.map} +1 -1
  10. package/dist/scripts/{1895-933141db03-lite.chunk.js → 1895-a799be78c3-lite.chunk.js} +3 -3
  11. package/dist/scripts/{1895-933141db03-lite.chunk.js.map → 1895-a799be78c3-lite.chunk.js.map} +1 -1
  12. package/dist/scripts/{2446-c6b50a79cd-lite.chunk.js → 2446-acc94130ed-lite.chunk.js} +3 -3
  13. package/dist/scripts/{2446-c6b50a79cd-lite.chunk.js.map → 2446-acc94130ed-lite.chunk.js.map} +1 -1
  14. package/dist/scripts/{2703-430c5a5fc1-lite.chunk.js → 2703-6ae830c2e6-lite.chunk.js} +2 -2
  15. package/dist/scripts/2703-6ae830c2e6-lite.chunk.js.map +1 -0
  16. package/dist/scripts/{2724-9b1a944cfb-lite.chunk.js → 2724-ee3a51e0c9-lite.chunk.js} +2 -2
  17. package/dist/scripts/{2724-9b1a944cfb-lite.chunk.js.map → 2724-ee3a51e0c9-lite.chunk.js.map} +1 -1
  18. package/dist/scripts/{3070-4e82411f0c-lite.chunk.js → 3070-07721de8f8-lite.chunk.js} +2 -2
  19. package/dist/scripts/3070-07721de8f8-lite.chunk.js.map +1 -0
  20. package/dist/scripts/{5242-04c52713f2-lite.chunk.js → 5242-76b32478bc-lite.chunk.js} +2 -2
  21. package/dist/scripts/5242-76b32478bc-lite.chunk.js.map +1 -0
  22. package/dist/scripts/{537-92893a696e-lite.chunk.js → 537-850ad2ee25-lite.chunk.js} +3 -3
  23. package/dist/scripts/{537-92893a696e-lite.chunk.js.map → 537-850ad2ee25-lite.chunk.js.map} +1 -1
  24. package/dist/scripts/{5936-59acb26157-lite.chunk.js → 5936-7ad136f2a3-lite.chunk.js} +2 -2
  25. package/dist/scripts/5936-7ad136f2a3-lite.chunk.js.map +1 -0
  26. package/dist/scripts/6181-7a4fc8e1e1-lite.chunk.js +2 -0
  27. package/dist/scripts/6181-7a4fc8e1e1-lite.chunk.js.map +1 -0
  28. package/dist/scripts/{6263-0be2ae1ab4-lite.chunk.js → 6263-a60b811d93-lite.chunk.js} +2 -2
  29. package/dist/scripts/6263-a60b811d93-lite.chunk.js.map +1 -0
  30. package/dist/scripts/{6309-79092eb273-lite.chunk.js → 6309-dd3a8e7f21-lite.chunk.js} +3 -3
  31. package/dist/scripts/{6309-79092eb273-lite.chunk.js.map → 6309-dd3a8e7f21-lite.chunk.js.map} +1 -1
  32. package/dist/scripts/{6489-51de20f6f6-lite.chunk.js → 6489-335e4d9396-lite.chunk.js} +3 -3
  33. package/dist/scripts/{6489-51de20f6f6-lite.chunk.js.map → 6489-335e4d9396-lite.chunk.js.map} +1 -1
  34. package/dist/scripts/6531-835c743f1b-lite.chunk.js +2 -0
  35. package/dist/scripts/6531-835c743f1b-lite.chunk.js.map +1 -0
  36. package/dist/scripts/6741-e0ed9fd6f0-lite.chunk.js +3 -0
  37. package/dist/scripts/6741-e0ed9fd6f0-lite.chunk.js.map +1 -0
  38. package/dist/scripts/{6846-5ae3efe823-lite.chunk.js → 6846-08b00decd8-lite.chunk.js} +2 -2
  39. package/dist/scripts/{6846-5ae3efe823-lite.chunk.js.map → 6846-08b00decd8-lite.chunk.js.map} +1 -1
  40. package/dist/scripts/{7187-814cd6f6db-lite.chunk.js → 7187-93d4aac9eb-lite.chunk.js} +2 -2
  41. package/dist/scripts/{7187-814cd6f6db-lite.chunk.js.map → 7187-93d4aac9eb-lite.chunk.js.map} +1 -1
  42. package/dist/scripts/8055-08b92f8ed7-lite.chunk.js +3 -0
  43. package/dist/scripts/8055-08b92f8ed7-lite.chunk.js.map +1 -0
  44. package/dist/scripts/{8085-ed82fb07da-lite.chunk.js → 8085-cde67e66df-lite.chunk.js} +2 -2
  45. package/dist/scripts/8085-cde67e66df-lite.chunk.js.map +1 -0
  46. package/dist/scripts/8139-f0229a0806-lite.chunk.js +3 -0
  47. package/dist/scripts/8139-f0229a0806-lite.chunk.js.map +1 -0
  48. package/dist/scripts/{8354-a104955138-lite.chunk.js → 8354-411c0c4a3a-lite.chunk.js} +2 -2
  49. package/dist/scripts/8354-411c0c4a3a-lite.chunk.js.map +1 -0
  50. package/dist/scripts/{841-85a91a6576-lite.chunk.js → 841-a60ac16a8c-lite.chunk.js} +3 -3
  51. package/dist/scripts/{841-85a91a6576-lite.chunk.js.map → 841-a60ac16a8c-lite.chunk.js.map} +1 -1
  52. package/dist/scripts/{8987-07d38d2bab-lite.chunk.js → 8987-9fb9a632e7-lite.chunk.js} +2 -2
  53. package/dist/scripts/8987-9fb9a632e7-lite.chunk.js.map +1 -0
  54. package/dist/scripts/{9068-1c0aece2e1-lite.chunk.js → 9068-562c30f718-lite.chunk.js} +2 -2
  55. package/dist/scripts/9068-562c30f718-lite.chunk.js.map +1 -0
  56. package/dist/scripts/{9839-5347f31f8b-lite.chunk.js → 9839-d50dedfab8-lite.chunk.js} +3 -3
  57. package/dist/scripts/9839-d50dedfab8-lite.chunk.js.map +1 -0
  58. package/dist/scripts/{bundle-90f71581a8.min.js → bundle-098294f9a6.min.js} +3 -3
  59. package/dist/scripts/bundle-098294f9a6.min.js.map +1 -0
  60. package/package.json +1 -1
  61. package/dist/scripts/1402-d327ed0365-lite.chunk.js.map +0 -1
  62. package/dist/scripts/1518-9961f6d99b-lite.chunk.js.map +0 -1
  63. package/dist/scripts/2703-430c5a5fc1-lite.chunk.js.map +0 -1
  64. package/dist/scripts/3070-4e82411f0c-lite.chunk.js.map +0 -1
  65. package/dist/scripts/5242-04c52713f2-lite.chunk.js.map +0 -1
  66. package/dist/scripts/5936-59acb26157-lite.chunk.js.map +0 -1
  67. package/dist/scripts/6181-4944b5c6a2-lite.chunk.js +0 -2
  68. package/dist/scripts/6181-4944b5c6a2-lite.chunk.js.map +0 -1
  69. package/dist/scripts/6263-0be2ae1ab4-lite.chunk.js.map +0 -1
  70. package/dist/scripts/6531-d77ba2c5ce-lite.chunk.js +0 -2
  71. package/dist/scripts/6531-d77ba2c5ce-lite.chunk.js.map +0 -1
  72. package/dist/scripts/6741-6222c7b762-lite.chunk.js +0 -3
  73. package/dist/scripts/6741-6222c7b762-lite.chunk.js.map +0 -1
  74. package/dist/scripts/8055-9c259a30c4-lite.chunk.js +0 -3
  75. package/dist/scripts/8055-9c259a30c4-lite.chunk.js.map +0 -1
  76. package/dist/scripts/8085-ed82fb07da-lite.chunk.js.map +0 -1
  77. package/dist/scripts/8139-ec264689fd-lite.chunk.js +0 -3
  78. package/dist/scripts/8139-ec264689fd-lite.chunk.js.map +0 -1
  79. package/dist/scripts/8354-a104955138-lite.chunk.js.map +0 -1
  80. package/dist/scripts/8987-07d38d2bab-lite.chunk.js.map +0 -1
  81. package/dist/scripts/9068-1c0aece2e1-lite.chunk.js.map +0 -1
  82. package/dist/scripts/9839-5347f31f8b-lite.chunk.js.map +0 -1
  83. package/dist/scripts/bundle-90f71581a8.min.js.map +0 -1
  84. /package/dist/scripts/{1895-933141db03-lite.chunk.js.LICENSE.txt → 1895-a799be78c3-lite.chunk.js.LICENSE.txt} +0 -0
  85. /package/dist/scripts/{2446-c6b50a79cd-lite.chunk.js.LICENSE.txt → 2446-acc94130ed-lite.chunk.js.LICENSE.txt} +0 -0
  86. /package/dist/scripts/{537-92893a696e-lite.chunk.js.LICENSE.txt → 537-850ad2ee25-lite.chunk.js.LICENSE.txt} +0 -0
  87. /package/dist/scripts/{6309-79092eb273-lite.chunk.js.LICENSE.txt → 6309-dd3a8e7f21-lite.chunk.js.LICENSE.txt} +0 -0
  88. /package/dist/scripts/{6489-51de20f6f6-lite.chunk.js.LICENSE.txt → 6489-335e4d9396-lite.chunk.js.LICENSE.txt} +0 -0
  89. /package/dist/scripts/{6741-6222c7b762-lite.chunk.js.LICENSE.txt → 6741-e0ed9fd6f0-lite.chunk.js.LICENSE.txt} +0 -0
  90. /package/dist/scripts/{8055-9c259a30c4-lite.chunk.js.LICENSE.txt → 8055-08b92f8ed7-lite.chunk.js.LICENSE.txt} +0 -0
  91. /package/dist/scripts/{8139-ec264689fd-lite.chunk.js.LICENSE.txt → 8139-f0229a0806-lite.chunk.js.LICENSE.txt} +0 -0
  92. /package/dist/scripts/{841-85a91a6576-lite.chunk.js.LICENSE.txt → 841-a60ac16a8c-lite.chunk.js.LICENSE.txt} +0 -0
  93. /package/dist/scripts/{9839-5347f31f8b-lite.chunk.js.LICENSE.txt → 9839-d50dedfab8-lite.chunk.js.LICENSE.txt} +0 -0
  94. /package/dist/scripts/{bundle-90f71581a8.min.js.LICENSE.txt → bundle-098294f9a6.min.js.LICENSE.txt} +0 -0
@@ -1,3 +0,0 @@
1
- /*! For license information please see 8139-ec264689fd-lite.chunk.js.LICENSE.txt */
2
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[8139],{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}}},7870:(e,t,n)=>{n.d(t,{N:()=>c});var a=n(97395),r=n(75896),i=n(110),o=n(40424),c={calendarEvents:function(e,t,n){return{url:a._.urlBuilder("{gateway}/v1/discover/special-events/content",{from:e,to:t,presentationId:n}),publicUrl:a._.urlBuilder("/api/discover/special-events/content",{from:e,to:t,presentationId:n}),key:"presentation:".concat(n,":events:from:").concat(e,":to").concat(t)}},nextTopicSpecialEvent:function(e,t){var n={presentationId:t,limit:1,from:i.O.format(new Date,"YYYY-MM-DD"),objectType:o.VH.Classification};return{url:a._.urlBuilder("{gateway}/v1/discover/special-events/object/".concat(e,"/next-events"),n),publicUrl:a._.urlBuilder("/api/discover/special-events/object/".concat(e,"/next-events"),n),key:"presentation:".concat(t,":events:classification:").concat(e),formatData:function(e){return r.m.first(e)}}}}},69395:(e,t,n)=>{n.d(t,{e:()=>o});var a=n(32735),r=n(91967);const i={disabled:"pERi4",disabledHighlighted:"AxyWm"};function o(e){var t=e.audience,n=e.highlight,o=e.setAudience,c=e.isDisabled,s=e.extraClasses,l=function(e,t){return e?t?"".concat(i.disabledHighlighted," text-light"):"bg-blue text-light":t?"".concat(i.disabled," text-secondary"):"bg-light"}(n,c),u="rounded-pill d-inline-block me-1 user-select-none ".concat(c?"cursor-default":"cursor-pointer"," ").concat(l," ").concat(s);return a.createElement("span",{className:u,onClick:function(){!c&&r.q.isFunction(o)&&o(t,!n)},role:"checkbox","aria-checked":n},t.name.split(" ").map((function(e){return e.charAt(0).toUpperCase()+e.substring(1)})).join(" "))}o.defaultProps={extraClasses:""}},14875:(e,t,n)=>{n.d(t,{a:()=>y});var a=n(32735),r=n(23481),i=n(75902),o=n(35223);function c(e){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},c(e)}function s(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=c(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var a=n.call(e,"string");if("object"!=c(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==c(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var l=s(s(s({},i.GL.Archived,{svgName:o.vn.Archive,svgColorClassName:"text-secondary",actionName:"Archive",statusName:"Archived"}),i.GL.Draft,{svgName:o.vn.Edit,svgColorClassName:"",actionName:"Draft",statusName:"Draft"}),i.GL.Published,{svgName:o.vn.VisibleOn,svgColorClassName:"text-success",actionName:"Publish",statusName:"Published"}),u=n(83914),d=n(40424);const m={badge:"ciO47",draftLight:"A6Yi7",draftDark:"fkXBX",published:"Ovzwy",archived:"r_dco"};function p(e){var t="rounded-pill d-flex align-items-center ps-2 py-1 fw-semibold ms-2 ".concat(m.badge);switch(e.status){case d.GL.Published:t+=" ".concat(m.published);break;case d.GL.Archived:t+=" ".concat(m.archived);break;case d.GL.Draft:t+=" ".concat(e.darkMode?m.draftDark:m.draftLight)}return e.wrapperClassName&&(t+=" ".concat(e.wrapperClassName)),t}function f(e){var t=l[e.status],n=t.statusName,r=t.svgName;return a.createElement("div",{className:p(e)},a.createElement(u.x,{svgName:r}),a.createElement("div",null,n))}var v=n(98364);const g={stickyWrapper:"zhw6K",badgeWrapper:"NOvn1",badge:"pxQSR"};var b=r.T.encloseNamespace("shared.classificationPreviewBanner");function y(e){return a.createElement("div",{className:"".concat(g.stickyWrapper," py-2 d-flex justify-content-space-between bg-dark text-white mx-2 rounded")},a.createElement("div",{className:"position-absolute d-flex ".concat(g.badgeWrapper)},a.createElement(f,{status:e.status,wrapperClassName:"".concat(g.badge),darkMode:!0})),a.createElement("div",{className:"flex-grow-1"},a.createElement("h1",{className:"text-center my-3 h5"},a.createElement(v.V,{emoji:"👀"}),b("topic"===e.type?"topicTitle":"companyTitle"))))}},28046:(e,t,n)=>{n.d(t,{l:()=>p,v:()=>f});var a=n(39479),r=["pdf"],i=["doc","docx","dotx","dot","rtf","docm","odt"],o=["csv","txt"],c=["xls","xlt","xlsx"],s=["jpg","tif","png","bmp","gif","jpeg"],l="video/*",u=["zip","rar"],d=["ppt","pot","pps","pptx"],m=["srt"],p={IMAGES:".".concat(s.join(",.")),VIDEO:l,MIXED_MEDIA:".".concat(s.join(",."),",").concat(l),RESOURCES:".".concat([].concat(i,c,d,r,o,s,u).join(",.")),SUBTITLES:".".concat(m.join(",."))},f={getResourceType:function(e){var t=e.toLowerCase();return a.contains(i,t)?"document":a.contains(c,t)?"excel":a.contains(d,t)?"powerpoint":a.contains(r,t)?"pdf":a.contains(o,t)?"text":a.contains(s,t)?"image":a.contains(u,t)?"archive":a.contains(m,t)?"subtitle":""}}},44522:(e,t,n)=>{n.d(t,{p:()=>C,v:()=>L});var a=n(32735),r=n(110),i=n(50690),o=n(84963),c=n(73679),s=n(83657),l=n(23481),u=n(36848),d=n(83914),m=n(35223),p="shared.backButton";function f(e){var t=Object.assign({textShadow:!0},e),n=t.backToName,r=t.appLink,i=t.color,o=t.extraClasses,c=t.textShadow,s=n?l.T.getPhrase(p,"backTo",{backToName:n}):l.T.getPhrase(p,"back"),f="black"===i?"":"text-white",v=c?"text-shadow":"";return a.createElement(u.F,{appLink:r,className:"d-inline-flex align-items-center h5 mb-0 ".concat(o," ").concat(f," ").concat(v)},a.createElement(d.x,{svgName:m.vn.ChevronLeft,size:d.S.Medium}),a.createElement("span",{className:"ms-1"},s))}f.defaultProps={color:"black",extraClasses:""};var v=n(36518),g=n(83345),b=n(10587),y=n(94232),h=n(54610),w=n(79967),E=n(67453);const k={bannerContent:"sSCTB",actionsContainer:"Z5WI2",bannerContentWithLogo:"rgs7Q",container:"M51HJ",logoContainer:"vkeJk",logoContainerLeft:"M3U9B",logoHeading:"EtRwC",specialEventContainer:"rOxDc",headingLarge:"_8pnV",heading:"JXVBH"};var S="".concat(b.y[h.__.Banners].width,":").concat(b.y[h.__.Banners].height);function I(e){return e.length<160?"h1":k.headingLarge}var C=a.memo((function(e){var t,n,l,u,d=e.heading,m=e.banner,p=e.imageCdnUrl,b=e.actions,C=e.sortComponent,L=e.blockColourClass,T=e.specialEvent,x=a.useContext(y.n),N=(0,w.k)().xxl?1920:1200,O=a.useMemo((function(){if(!T||e.showComingSoon)return!1;var t=r.O.format(new Date,"YYYY-MM-DD");return T.endDate?T.startDate<=t&&T.endDate>=t:T.startDate===t}),[T]),A=e.imageOptions||{width:N,ratio:S,resizeType:h.Nq.Cover},P=!!m&&!!p&&E.j.createBannerUrl(m,{fallbackBaseUrl:p,fallbackCategoryName:d,type:h.__.Banners},A),j={className:"banner banner-header ".concat(e.bannerClassName),style:P?{backgroundImage:"url('".concat(P,"')")}:{}};!m&&L&&(delete j.style,j.className+=" ".concat(L));var F=e.detailsComponent;return i.b.renderInPortalIfExists(a.createElement("header",Object.assign({},j),a.createElement("div",{className:"container ".concat(k.container," position-relative inner-banner")},e.backButtonAppLink&&a.createElement("div",{className:"pt-3"},a.createElement(f,{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(k.bannerContent," px-2 ").concat((null===(t=e.logo)||void 0===t?void 0:t.url)?k.bannerContentWithLogo:""))},!!T&&a.createElement("div",{className:"position-relative ".concat(k.specialEventContainer)},a.createElement(c.s,{body:{type:T.endDate?"range":"day",text:T.endDate?"".concat(r.O.format(T.startDate,"DD"),"-").concat(r.O.format(T.endDate,"DD")):r.O.format(T.startDate,"DD")},month:r.O.format(T.startDate,"MMMM"),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(g.x,{namespace:"shared.bannerHeader",phrase:"onToday"})),e.showComingSoon&&a.createElement(o.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&&a.createElement("div",{className:"".concat(k.logoContainerLeft," d-none d-md-block partial-loading-background rounded-circle overflow-hidden me-3")},(null===(n=e.logo)||void 0===n?void 0:n.url)&&a.createElement(v.w,{src:E.j.createUrl(null===(l=e.logo)||void 0===l?void 0:l.url,{size:h.h2.Small})})),a.createElement("h1",{className:"text-white text-shadow pe-3 ".concat(k.heading," ").concat(I(d)," ").concat(e.alignLogoLeft?"w-50":"")},d,F&&a.createElement(F,null)))),!!b&&a.createElement("div",{className:k.actionsContainer},a.createElement(s.e,{actions:b,sortComponent:C,actionsDropdownClassName:e.actionsDropdownClassName}))),!e.alignLogoLeft&&!!(null===(u=e.logo)||void 0===u?void 0:u.url)&&a.createElement("div",{className:k.logoContainer},a.createElement("img",{src:E.j.createUrl(e.logo.url,{size:h.h2.Small}),className:"rounded-circle"})))),null==x?void 0:x.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 L(){var e=a.useContext(y.n);return i.b.renderInPortalIfExists(a.createElement("div",{className:"partial-banner partial-loading-background ".concat(k.banner)}),null==e?void 0:e.container)}},49935:(e,t,n)=>{n.d(t,{Oo:()=>d,b2:()=>m});var a=n(32735),r=n(36848),i=n(86764),o=n(3747),c=n(5859),s=n(35223),l=n(83914),u=function(e){var t=e.breadcrumb,n=t.name,i=t.appLink,o=t.active,c=e.withBackIcon;return a.createElement("li",{className:"breadcrumb-item".concat(o?" active":"")},o?a.createElement("strong",null,n):a.createElement(r.F,{appLink:i},c&&a.createElement(l.x,{svgName:s.vn.ChevronLeft,size:l.S.Small}),a.createElement("span",{className:c?"ms-2":""},n)))},d=function(e){var t=e.breadcrumbs,n=(0,o.a)(i.r.XS),r=null==t?void 0:t.length;return!r||n&&r<2?a.createElement(a.Fragment,null):n?a.createElement("nav",{"aria-label":"breadcrumb"},a.createElement("ol",{className:"breadcrumb m-0 p-0"},a.createElement(u,{breadcrumb:t[r-2],withBackIcon:!0}))):a.createElement("nav",{"aria-label":"breadcrumb"},a.createElement("ol",{className:"breadcrumb m-0 p-0"},t.map((function(e,t){return a.createElement(u,{key:t,breadcrumb:e})}))))},m=a.memo((function(e){var t=e.numItems,n=void 0===t?3:t;return(0,o.a)(i.r.XS)?a.createElement("div",{className:"partial-loading-background",style:{height:"1.3125rem",width:"6rem"}}):a.createElement("nav",{"aria-label":"breadcrumb"},a.createElement("ol",{className:"breadcrumb m-0 p-0"},c.u.getPartialLoadingItems({numItems:n}).map((function(e,t){var n=e.width;return a.createElement("li",{key:t,className:"breadcrumb-item"},a.createElement("span",{className:"d-inline-block partial-loading-background",style:{width:n},dangerouslySetInnerHTML:{__html:"&nbsp"}}))}))))}))},38502:(e,t,n)=>{n.d(t,{r:()=>d});var a=n(32735),r=n(49985),i=n(36848),o=n(18559),c=n(11607),s=n(83914),l=n(87432);function u(e){return a.createElement(a.Fragment,null,!!e.tab.svgName&&a.createElement("div",{className:e.tab.name?"pe-1":""},a.createElement(s.x,{svgName:e.tab.svgName})),e.tab.name,"number"==typeof e.tab.count&&a.createElement("div",{className:"ps-2"},a.createElement(o.C,{type:o.g.Count,data:e.tab.count})))}function d(e){var t;return a.createElement("nav",{className:null!==(t=e.className)&&void 0!==t?t:""},a.createElement("ul",{className:"\n list-unstyled d-inline-block m-0 ".concat(l.Z.pillTabSelector,"\n ").concat(e.borderRadius?l.Z.radiusSmall:"","\n ").concat(e.listClassName,"\n ")},e.tabs.map((function(e,t){return a.createElement("li",{className:"\n p-0 ".concat(l.Z.tab," ").concat(e.active?"btn btn-dark":"btn btn-outline-dark","\n ").concat(e.name?l.Z.minWidth:""," ").concat(e.className,"\n "),key:t},e.appLink?a.createElement(i.F,{appLink:e.appLink,analyticsData:e.analyticsData,analyticsOptions:e.analyticsOptions,className:"\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ".concat(l.Z.tabLink,"\n ")},a.createElement(u,{tab:e})):a.createElement(c.L,{className:"\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset p-2 text-nowrap ".concat(l.Z.tabLink,"\n "),onClick:function(){return function(e){!e.active&&e.onSelect&&(e.onSelect(),e.analyticsData&&e.analyticsOptions&&r.k.logUserAction(e.analyticsData,e.analyticsOptions))}(e)}},a.createElement(u,{tab:e})))}))))}d.defaultProps={borderRadius:"lg"}},75838:(e,t,n)=>{n.d(t,{w:()=>u});var a=n(32735),r=n(92869),i=n(49985),o=n(65858),c=n(36848),s=n(11607);const l={itemsWrapper:"m6mGm",anchorWrapper:"QptZj",default:"_AZa8",selectedItem:"Nuiel",disabled:"WIzWJ",floatIcon:"ARudn",arrowIcon:"tEF5Q",listIcon:"Ql2wi"};function u(e){var t={actionType:o.Vw.Click,entity:o.py.Widget,location:o.LZ.TableOfContents};return a.createElement("div",{className:"".concat(l.itemsWrapper)},e.items.map((function(n,o){return e.localState?a.createElement(s.L,{key:n.id,className:"".concat(l.anchorWrapper," ").concat(e.activeId===n.id?l.selectedItem:""),onClick:function(){r.t.preventScrollTop(),e.setControlledId(n.id),function(n){i.k.logUserAction(Object.assign(Object.assign({},e.analyticsData),{id:n.id,name:n.name}),t)}(n)}},a.createElement("div",{className:"".concat(e.activeId||0!==o?"":l.default," ")},n.name)):a.createElement(c.F,{key:n.id,appLink:e.getAppLink(n),appLinkOptions:{replace:!0},className:"".concat(l.anchorWrapper," ").concat(e.activeId===n.id?l.selectedItem:""),onClick:function(){r.t.preventScrollTop(),e.setControlledId(n.id)},analyticsData:Object.assign(Object.assign({},e.analyticsData),{id:n.id,name:n.name}),analyticsOptions:t},a.createElement("div",{className:"".concat(e.activeId||0!==o?"":l.default," ")},n.name))})))}},17101:(e,t,n)=>{var a;n.d(t,{n:()=>a}),function(e){e[e.Other=0]="Other",e[e.SuggestImprovement=1]="SuggestImprovement",e[e.ReportBug=2]="ReportBug",e[e.RequestVideo=3]="RequestVideo",e[e.RaiseIssue=4]="RaiseIssue",e[e.GivePraise=5]="GivePraise",e[e.Footer=6]="Footer"}(a||(a={}))},94644:(e,t,n)=>{n.d(t,{r:()=>u});var a=n(50242),r=n(81886),i=n(67058),o=n(14553),c=n(49267),s=n(49075),l={notFound:i.d,forbidden:{rating:o.q,yearLevel:o.q,region:c.a,privacy:o.q},badRequest:s._};function u(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e){var i;i="number"==typeof e?e:e.status;var o=Object.assign(Object.assign({},l),t);i&&r.Q.Ry.isStatusCodeError(i)&&(i!==a.o.NotFound?i!==a.o.Forbidden?n.badRequest||r.Q.Ry.throw(new o.badRequest):n.forbidden||r.Q.Ry.throw(new o.forbidden.privacy):n.notFound||r.Q.Ry.throw(new o.notFound))}}},7198:(e,t,n)=>{n.d(t,{f:()=>r});var a=n(99940),r={submitFeedback:function(e,t){return{url:"{gateway}/v1/feedback",key:"submit:feedback",type:a.k.POST,data:Object.assign(Object.assign({},e),t)}}}},25665:(e,t,n)=>{n.d(t,{k:()=>s});var a=n(99940),r=n(97395);function i(e){return function(e){if(Array.isArray(e))return o(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return o(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)?o(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function o(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=function(e){return r._.urlBuilder("/api/domain/v1/subjects/classifications/following",{id:e})},s={follow:function(e,t,n){return{url:"/api/domain/v1/subjects/classifications/following",key:"follow:".concat(e.join(",")),type:a.k.POST,data:e,success:t,error:n,invalidationKeys:[].concat(i(e.map((function(e){return"classification:".concat(e)}))),["my:subject:preferences","classifications"])}},unfollow:function(e,t,n){return{url:c(e),key:"unfollow:".concat(e.join(",")),type:a.k.DELETE,success:t,error:n,invalidationKeys:[].concat(i(e.map((function(e){return"classification:".concat(e)}))),["my:subject:preferences","classifications"])}}}},91286:(e,t,n)=>{n.d(t,{v:()=>o});var a=n(32735),r=n(94644);function i(e){return e.map((function(e){return e.statusCode})).join(":")}function o(e,t,n){var o=Array.isArray(e)?e:[e];(0,a.useEffect)((function(){o.forEach((function(e){(0,r.r)(e.statusCode,t,n)}))}),[i(o),t,n])}},94631:(e,t,n)=>{n.d(t,{D:()=>r});var a=n(32735);function r(e){var t=a.useRef();return a.useEffect((function(){t.current=e})),t.current}},65332:(e,t,n)=>{n.d(t,{D:()=>i});var a,r=n(32735),i=function(e){var t=e.setActiveId,n=e.headingElements,i=e.controlledId,o=e.setControlledId,c=r.useRef(0);r.useEffect((function(){var e=new IntersectionObserver((function(e){e.forEach((function(e){if(i)return t(i),void(a=window.setTimeout((function(){o("")}),800));if(e.isIntersecting)t(e.target.id),c.current=window.scrollY;else{var r=c.current-window.scrollY>0,s=n.findIndex((function(t){return t.id===e.target.id})),l=n[s-1];r&&(null==l?void 0:l.id)&&t(null==l?void 0:l.id)}}))}),{rootMargin:"-67px 0px -80% 0px"});return n.forEach((function(t){return e.observe(t)})),function(){a&&window.clearTimeout(a),e.disconnect()}}),[t,n.length,i])}},76196:(e,t,n)=>{n.d(t,{P:()=>o});var a=n(32735),r=n(94631);function i(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 o=function(e,t){var n,o,c=(n=a.useState(!1),o=2,function(e){if(Array.isArray(e))return e}(n)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,i,o,c=[],s=!0,l=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(a=i.call(n)).done)&&(c.push(a.value),c.length!==t);s=!0);}catch(e){l=!0,r=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(l)throw r}}return c}}(n,o)||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}}(n,o)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),s=c[0],l=c[1],u=(0,r.D)(t),d=t;a.useLayoutEffect((function(){if(!s||u!==d){var t=e.find((function(e){return e&&(null==e?void 0:e.id)===d}));if(t){var n=t.getBoundingClientRect();window.scrollBy({top:n.top-80,behavior:"smooth"}),s||l(!0)}}}),[e,u,d,s])}},52167:(e,t,n)=>{n.d(t,{m:()=>l});var a=n(53301),r=n.n(a),i=n(28046),o=n(19808),c=n(86613);function s(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 l={getUserInfo:function(e,t){return{id:e.id,username:e.username,email:e.email,userType:e.role===c.i.Admin?"Admin":"Staff",customerId:e.customerId,cvcId:t.crmId,customerName:t.name,instanceRegion:e.instanceRegion,contentRegion:e.contentRegion}},mapInstanceRegionToTag:function(e){switch(e){case o.b.AU:return"au";case o.b.NZ:return"nz";case o.b.UK:return"uk";case o.b.US:return"us"}},getTags:function(e,t,n,a){var r,i=[t].concat(function(e){if(Array.isArray(e))return s(e)}(r=a)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(r)||function(e,t){if(e){if("string"==typeof e)return s(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)?s(e,t):void 0}}(r)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}());i.push(n?"student":"staff"),e.role===c.i.Admin&&i.push("administrator");var o=l.mapInstanceRegionToTag(e.instanceRegion);return o&&i.push(o),i},categorizeFiles:function(e){return e.reduce((function(e,t){var n=t.get("fileInfo");return r().isValidFile(t.get("file"),i.l.VIDEO)?e.videoUrls.push(null==n?void 0:n.url):e.imageUrls.push(null==n?void 0:n.url),e}),{imageUrls:[],videoUrls:[]})}}},4399:(e,t,n)=>{n.d(t,{$7:()=>o,Dp:()=>c});var a=n(28400),r=n(14070),i=n(97291),o=function(e){return function(t){return{application:i.O.SUBJECT,action:r.e.Subjects.CLASSIFICATION,args:t?[t.id,a.m.slugify(t.name)]:[],params:e||{}}}},c=function(e){return{application:i.O.SUBJECT,action:r.e.Subjects.CLASSIFICATION_ALL,params:e?{presentationId:e}:{}}}},68139:(e,t,n)=>{n.r(t),n.d(t,{CuratedClassificationView:()=>gt});var a=n(32735),r=n(23481),i=n(20354),o=n(28400),c=n(49985),s=n(65858),l=n(7870),u=n(23232),d=n(83345),m=n(76177),p=n(40424),f=n(35223),v="subjects.curatedClassificationEmptyState",g=r.T.encloseNamespace(v);function b(e){var t,n,i=(null===(t=e.dashboard)||void 0===t?void 0:t.status)===p.GL.Archived;return a.createElement(d.D.Provider,{value:v},a.createElement(u.u,null,a.createElement(u.u.Image,{src:e.imageUrl,altText:g("headingForNP")}),e.isReadonly?a.createElement(a.Fragment,null,a.createElement(u.u.Heading,null,a.createElement(d.x,{namespace:v,phrase:"headingForCurator"})),a.createElement(u.u.Info,null,a.createElement(d.x,{namespace:v,phrase:"info"})),a.createElement(m.u,{title:i?r.T.getPhrase(v,"archivedCtaTooltip"):"",spanHack:!0},a.createElement(u.u.Cta,{text:r.T.getPhrase(v,"add"),appLink:null===(n=e.addWidgetApplink)||void 0===n?void 0:n.call(e),className:"btn btn-dark",icon:f.vn.Plus,disabled:i}))):a.createElement(u.u.Heading,null,a.createElement(d.x,{phrase:"headingForNP"}))))}var y=n(81886),h=n(75838);const w={container:"k1iOO"};function E(e){return a.createElement("div",{className:"".concat(w.container," ps-3")},a.createElement("h2",{className:"h5"},e.title),a.createElement(h.w,{items:e.widgets,activeId:e.activeId,appLink:e.appLink,analyticsData:e.analyticsData,setControlledId:e.setControlledId,getAppLink:function(e){var t=y.Q.C$.getCurrentAppLink(),n=t.params?Object.assign({},t.params):{};return n.tocId=e.id,Object.assign(Object.assign({},t),{params:n})}}))}var k="subjects.teacherOnlyEmptyState",S=r.T.encloseNamespace(k);function I(e){var t;return a.createElement(d.D.Provider,{value:k},a.createElement(u.u,null,a.createElement(u.u.Image,{src:e.imageUrl,altText:S("heading")}),a.createElement(u.u.Heading,null,a.createElement(d.x,{phrase:"heading"})),a.createElement(u.u.Info,null,a.createElement(d.x,{phrase:"info"})),a.createElement(u.u.Cta,{text:S("cta"),appLink:null===(t=e.ctaAppLink)||void 0===t?void 0:t.call(e),className:"btn btn-dark"})))}var C=n(75896),L=n(42308),T=n(80889),x=n(21366),N=n(44522),O=n(13231),A=n(88513),P=n(97717),j=n(86764),F=n(78479),D=n(3747),B=n(65332),U=n(76196),R=n(42735),_="subjects.classificationComingSoon",G=r.T.encloseNamespace(_);function W(e){var t,n,r=!!(null===(n=null===(t=e.data.followers)||void 0===t?void 0:t.data)||void 0===n?void 0:n.length);return a.createElement(d.D.Provider,{value:_},a.createElement(u.u,{className:"pt-0"},a.createElement(u.u.Image,{src:e.imageUrl,altText:G("comingSoon")}),a.createElement(u.u.Heading,null,a.createElement(d.x,{phrase:"comingSoon"})),a.createElement(u.u.Info,null,a.createElement(d.x,{phrase:"info"})),e.canFollowSubjects&&a.createElement(R.K,{svgName:r?f.vn.Check:f.vn.Bell,onClick:function(){var t;null===(t=e.onToggleFollow)||void 0===t||t.call(e)},showSpinner:e.showFollowButtonSpinner,className:"btn follow-btn me-2 ".concat(r?"btn-outline-dark":"btn-dark")},a.createElement(d.x,{phrase:r?"unfollow":"follow"}))))}var V=n(49935),M=n(79967),H=n(69454),q=n(57900),z=n(2948),Z=n(1048),Q=n(69395),Y=n(11607),J=n(38143),$=n(5859);function X(e,t){if(e){if("string"==typeof e)return K(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)?K(e,t):void 0}}function K(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var ee="subjects.audienceFilter";function te(e){var t,n,r=e.audiences,i=e.activeAudiences,o=e.disabled,c=e.appLink,s=(t=(0,z.D)(J.g.AUDIENCE_FILTER,void 0,{storage:q.Z1.SessionStorage}),n=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,i,o,c=[],s=!0,l=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(a=i.call(n)).done)&&(c.push(a.value),c.length!==t);s=!0);}catch(e){l=!0,r=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(l)throw r}}return c}}(t,n)||X(t,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.")}())[1];function l(e,t){var n,a,r=t?[].concat(function(e){return function(e){if(Array.isArray(e))return K(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||X(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(null!==(n=null==i?void 0:i.map((function(e){return e.name})))&&void 0!==n?n:[]),[e.name]):i.map((function(e){return e.name})).filter((function(t){return t!==e.name}));y.Q.C$.trigger(Object.assign(Object.assign({},c),{params:(a=Z.t.omit(c.params,["a"]),r.length?Object.assign({},a,{a:r}):a)}),{replace:!0})}return a.useEffect((function(){e.disablePersist||s(i)}),[i]),r&&r.length?a.createElement("div",{className:"d-flex flex-wrap row-gap-2"},r.map((function(e){return a.createElement(Q.e,{key:e.masterId,audience:e,highlight:!!(null==i?void 0:i.find((function(t){return t.masterId===e.masterId}))),setAudience:l,isDisabled:o})})),!!i&&!!Object.keys(i).length&&a.createElement(Y.L,{className:"info-link d-inline-block fw-semibold ms-1",onClick:function(){var e=Z.t.omit(c.params,["a"]);y.Q.C$.trigger(Object.assign(Object.assign({},c),{params:e}),{replace:!0})}},a.createElement(d.x,{namespace:ee,phrase:"clear"}))):a.createElement(a.Fragment,null)}var ne=$.u.getPartialLoadingItems({numItems:6}),ae=function(){return a.createElement("div",{className:"d-flex flex-wrap row-gap-2"},ne.map((function(e,t){var n=e.width;return a.createElement("span",{key:t,className:"rounded-pill partial-loading-background me-1",dangerouslySetInnerHTML:{__html:"&nbsp"},style:{width:n}})})))};function re(e){return a.createElement(te,{audiences:e.audiences,activeAudiences:e.activeAudiences,disabled:e.isReadonly,appLink:e.appLink,disablePersist:e.disablePersist})}var ie=n(38502),oe="shared.classificationDashboard";function ce(e){var t,n,i,o,c,l,u,d,m=(0,M.k)(),p=m.lg||m.xl||m.xxl||m.xs;return a.createElement(ie.r,{borderRadius:"sm",className:m.xs?"w-100":"",listClassName:"d-flex flex-nowrap",tabs:[{name:p?r.T.getPhrase(oe,"newReleases"):"",appLink:e.isReadonly?null:null===(n=null===(t=e.appLinks)||void 0===t?void 0:t.classification)||void 0===n?void 0:n.call(t,e.classification),active:"new-releases"===e.activeTab,svgName:f.vn.Sparkle,analyticsData:{id:"new-releases",classificationId:e.classification.id,classificationName:e.classification.name,presentationId:e.presentation.id,presentationDescription:e.presentation.description,name:r.T.getPhrase(oe,"newReleases"),url:y.Q.C$.getHref(null===(o=null===(i=e.appLinks)||void 0===i?void 0:i.classification)||void 0===o?void 0:o.call(i,e.classification))},analyticsOptions:{actionType:s.Vw.Click,entity:s.py.Url,location:s.LZ.MagicTabs},className:m.xs?"w-100":""},{name:p?r.T.getPhrase(oe,"allTopics"):"",appLink:e.isReadonly?null:null===(l=null===(c=e.appLinks)||void 0===c?void 0:c.classificationTopics)||void 0===l?void 0:l.call(c,e.classification),active:"all-topics"===e.activeTab,svgName:f.vn.Grid,analyticsData:{id:"all-topics",classificationId:e.classification.id,classificationName:e.classification.name,presentationId:e.presentation.id,presentationDescription:e.presentation.description,name:r.T.getPhrase(oe,"allTopics"),url:y.Q.C$.getHref(null===(d=null===(u=e.appLinks)||void 0===u?void 0:u.classificationTopics)||void 0===d?void 0:d.call(u,e.classification))},analyticsOptions:{actionType:s.Vw.Click,entity:s.py.Url,location:s.LZ.MagicTabs},className:m.xs?"w-100":""}]})}function se(e){var t,n,r,i,o,c,s,l=(0,M.k)(),u=(i=e.audiences,o=e.activeAudiences,c=e.isEmpty,!!e.isComingSoon||!(!c||(null==o?void 0:o.length))||!H.T.shouldShowAudiences(i));return a.createElement("div",{className:(s="d-flex flex-column py-3 mb-3",e.isComingSoon||(s+=" border-bottom"),!e.canViewDirectory&&!u||l.xs?s+" row-gap-3":s)},a.createElement("div",{className:function(){var e="";return u&&(e+="d-flex align-items-center justify-content-between"),l.xs&&(e+=" row-gap-3"),e}()},a.createElement(V.Oo,{breadcrumbs:null===(t=e.getBreadcrumbs)||void 0===t?void 0:t.call(e)}),e.canViewDirectory&&u&&a.createElement(ce,{classification:e.classification,activeTab:e.activeTab,appLinks:e.appLinks,presentation:e.presentation,isReadonly:e.isReadonly})),a.createElement("div",{className:function(){var e="d-flex align-items-end justify-content-between";return l.xs&&(e+=" row-gap-3 flex-wrap"),e}()},!u&&a.createElement(re,{audiences:e.audiences,activeAudiences:e.activeAudiences,appLink:null===(r=(n=e.appLinks).audience)||void 0===r?void 0:r.call(n),isReadonly:e.isReadonly,disablePersist:!e.isViewingCurrentPresentation}),e.canViewDirectory&&!u&&a.createElement(ce,{classification:e.classification,activeTab:e.activeTab,appLinks:e.appLinks,presentation:e.presentation,isReadonly:e.isReadonly})))}function le(e){return le="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},le(e)}function ue(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,i,o,c=[],s=!0,l=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(a=i.call(n)).done)&&(c.push(a.value),c.length!==t);s=!0);}catch(e){l=!0,r=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(l)throw r}}return c}}(e,t)||function(e,t){if(e){if("string"==typeof e)return de(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)?de(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 de(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 me="shared.classificationDashboard";function pe(e){return e.widgetId===L.z.Blurb&&e.templateId===F.f.Heading}function fe(e){var t,n=function(e,t){var n,r,o,c,s=a.useMemo((function(){return e?{isSystemGeneratedDashboard:x.S.isSystemGeneratedDashboard(e.widgets),systemGeneratedVideoWidget:e.widgets.find((function(e){return e.widgetId===L.z.ClassificationPinnedVideos}))}:{isSystemGeneratedDashboard:!1,systemGeneratedVideoWidget:null}}),[null==e?void 0:e.id]),l=s.isSystemGeneratedDashboard,u=s.systemGeneratedVideoWidget,d=i.a.useBasicFetch(!!u&&T._.dashboardWidgetContent(null==u?void 0:u.id,x.S.getWidgetParams(u.widgetId,u.templateId,x.S.getDashboardTargetType(e),null==t?void 0:t.map((function(e){return e.masterId}))),null==u?void 0:u.templateId));return l?{widgets:null!==(r=null===(n=null==e?void 0:e.widgets)||void 0===n?void 0:n.filter((function(e){return e.widgetId!==L.z.ClassificationPinnedVideos})))&&void 0!==r?r:[],videoList:null!==(c=null===(o=d.data)||void 0===o?void 0:o.content)&&void 0!==c?c:[],videoListWidgetId:null==u?void 0:u.id}:{widgets:C.m.sortBy(null==e?void 0:e.widgets,"index")}}(e.dashboard,e.activeAudiences),o=n.widgets,c=n.videoList,l=n.videoListWidgetId,u=(0,D.a)(j.r.LGDown),d=a.useRef(new Set),m=a.useMemo((function(){return o.reduce((function(e,t){return e[t.id]=!1,e}),{})}),[null==o?void 0:o.length]),f=ue(a.useState(m),2),v=f[0],g=f[1],y=ue(a.useState(window.location.hash.slice(1)||""),2),h=y[0],w=y[1],k=ue(a.useState(""),2),S=k[0],F=k[1],R=Array.from(d.current);function _(t,n,a){var r,i=x.S.getWidgetParams(n,a,x.S.getDashboardTargetType(e.dashboard),null===(r=e.activeAudiences)||void 0===r?void 0:r.map((function(e){return e.masterId})));return e.getWidgetContentRequest(t,i,a)}(0,U.P)(R,e.tableOfContentsId),(0,B.D)({setActiveId:F,headingElements:R,controlledId:h,setControlledId:w});var G=!e.isComingSoon&&!e.isTeacherOnly&&(!e.dashboard||e.dashboard.status===p.GL.Archived&&!e.isReadonly||e.dashboard.status===p.GL.Draft&&!e.isPreviewing||!(null==o?void 0:o.length)||(!c||!c.length)&&Object.values(v).every((function(e){return!!e})));a.useEffect((function(){G&&g(m)}),[null==o?void 0:o.length]);var V=a.useCallback((function(e,t){if(v[e]!==t){for(var n,a=(Object.assign(Object.assign({},v),(u={},m=t,(d=function(e){var t=function(e,t){if("object"!=le(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var a=n.call(e,"string");if("object"!=le(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==le(t)?t:t+""}(d=e))in u?Object.defineProperty(u,d,{value:m,enumerable:!0,configurable:!0,writable:!0}):u[d]=m,u))),r=0;r<o.length;){var i=o[r];if(pe(i)){for(var c=!0,s=r+1;c&&s<o.length;){var l=o[s];if(pe(l))break;a[l.id]||(n=l).widgetId===L.z.CuratedClassifications||n.widgetId===L.z.Classifications||(c=!1),s++}r=s,a[i.id]=c}else r++}g(a)}var u,d,m}),[v,o]);function M(e){return pe(e)&&v[e.id]}var H=o.filter((function(e){var t;return!M(e)&&!!(null===(t=e.metadata)||void 0===t?void 0:t.showInTableOfContents)})),q=H.length>=2&&!u;return a.createElement("div",{className:"bg-white px-4 ".concat(e.moviesAndTv?"":"topic-dashboard")},a.createElement(N.p,{heading:e.classification.name,banner:e.classification.banner,imageCdnUrl:e.imageCdnUrl,actions:null===(t=e.getBannerActions)||void 0===t?void 0:t.call(e),actionsDropdownClassName:"btn btn-outline-dark",specialEvent:e.specialEvent,calendarTheme:{background:"bg-light-blue",border:"border-light-blue"},showComingSoon:e.isComingSoon}),a.createElement(se,{classification:e.classification,presentation:e.presentation,appLinks:e.appLinks,activeTab:e.tab,audiences:e.audiences,activeAudiences:e.activeAudiences,getBreadcrumbs:e.getBreadcrumbs,canViewDirectory:e.canViewDirectory,isComingSoon:e.isComingSoon,isEmpty:G,isViewingCurrentPresentation:e.isViewCurrentPresentation,isReadonly:e.isReadonly}),e.isComingSoon&&a.createElement(W,{imageUrl:e.comingSoonImageUrl,data:e.classification,canFollowSubjects:e.canFollowSubjects,showFollowButtonSpinner:e.showFollowButtonSpinner,onToggleFollow:function(){return e.onToggleFollow(e.classification,s.LZ.ClassificationComingSoon)}}),!e.isComingSoon&&a.createElement("div",{className:"".concat(q?"row no-wrap":"")},a.createElement("div",{className:q?"col-9":""},o.map((function(t,n){return M(t)?a.createElement(a.Fragment,{key:t.id}):a.createElement(P.L,{headingElementRef:d,key:t.id,id:t.id,name:t.name,description:t.description,templateId:t.templateId,widgetTypeId:t.widgetId,audiences:e.audiences,getContentRequest:_,setIsEmpty:V,setFavourite:e.setFavourite,canFavourite:e.canFavourite,appLinks:e.appLinks,yearGroups:e.yearGroups,presentation:e.presentation,analyticsData:e.analyticsData,isScrollToTargetWidget:e.scrollToWidgetId===t.id,imageCdnUrl:e.imageCdnUrl,onSubmitFeedback:e.onSubmitFeedback,metadata:t.metadata,isBot:e.isBot,hasTableOfContents:q,lazyLoad:e.lazyLoad,dashboardTarget:x.S.getDashboardTargetType(e.dashboard),widgetIndex:n,hasPermissions:e.hasPermissions,hasLocalPermissions:e.hasLocalPermissions,isPreviewing:e.isReadonly,companyLogoFallbackUrl:e.companyLogoFallbackUrl,subTextType:e.subTextType,contentType:e.contentType,resourceThumbnailFallbackImageUrl:e.resourceThumbnailFallbackImageUrl,preferences:t.preferences,onToggleFollowClassification:e.onToggleFollow,isPlugin:e.isPlugin})}))),q&&a.createElement("aside",{className:"col-3"},a.createElement(E,{widgets:H,title:e.classification.name,activeId:S,clickable:!e.isReadonly,analyticsData:e.analyticsData,setControlledId:w})),!!(null==c?void 0:c.length)&&a.createElement(a.Fragment,null,a.createElement(A.B,{name:r.T.getPhrase(me,"videos"),description:""}),a.createElement(O.E4,{videos:c,yearGroups:e.yearGroups,getVideoAppLink:function(t,n){return e.appLinks.videoType(t,Object.assign(Object.assign({},n),{contextId:l}))},getSubTextAppLink:e.appLinks.subText,hasPermissions:e.hasPermissions,setFavourite:e.setFavourite,canFavourite:e.canFavourite,presentationAudiences:e.audiences,companyLogoFallbackUrl:e.companyLogoFallbackUrl,subTextType:e.subTextType,getPreviewQuestionsAppLink:e.appLinks.previewQuestions,isPlugin:e.isPlugin,getClassroomGuideAppLink:e.appLinks.classroomGuide,getInteractiveGuidanceAppLink:e.appLinks.interactiveGuidance,getResourceGuidanceAppLink:e.appLinks.resourceGuidance}))),G&&a.createElement(b,{dashboard:e.dashboard,isReadonly:e.isReadonly,imageUrl:e.emptyImageUrl,addWidgetApplink:e.appLinks.widgetWizard}),e.isTeacherOnly&&a.createElement(I,{imageUrl:e.emptyImageUrl,ctaAppLink:function(){return e.appLinks.allTopics(e.classification.presentationId)}}))}function ve(){return a.createElement("div",{className:"bg-white px-4"},a.createElement(N.v,null),a.createElement("div",{className:"d-flex flex-column row-gap-3 py-3 mb-3 border-bottom"},a.createElement(V.b2,null),a.createElement(ae,null)))}fe.defaultProps={appLinks:{}};var ge=n(14875),be=n(51365),ye=n(2284),he=n(17101),we=n(4594),Ee=n(16714),ke=n(12754),Se=n(89454),Ie=n(21750),Ce=n(39151),Le=n(1666),Te=n(7198),xe=n(25665),Ne=n(31949),Oe=n(69883),Ae=n(56520),Pe=n(91286),je=n(22902),Fe=n(79612),De=n(52167),Be=n(76753),Ue=n(10144),Re=n(99742),_e=n(14070),Ge=n(97291),We=n(51855),Ve=n(10671),Me=n(7179),He=n(27638),qe=n(86698),ze=n(33192),Ze=n(64364);function Qe(e){return Qe="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},Qe(e)}function Ye(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,Je(a.key),a)}}function Je(e){var t=function(e,t){if("object"!=Qe(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var a=n.call(e,"string");if("object"!=Qe(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==Qe(t)?t:t+""}function $e(e,t,n){return t=Ke(t),function(e,t){if(t&&("object"==Qe(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}(e,Xe()?Reflect.construct(t,n||[],Ke(e).constructor):t.apply(e,n))}function Xe(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(Xe=function(){return!!e})()}function Ke(e){return Ke=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},Ke(e)}function et(e,t){return et=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},et(e,t)}var tt="subjects.topicNotFoundError",nt=function(e){function t(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),$e(this,t,["Topic doesn't exist"])}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&et(e,t)}(t,e),n=t,(a=[{key:"name",get:function(){return"TopicNotFoundError"}},{key:"heading",get:function(){return r.T.getPhrase(tt,"heading")}},{key:"description",get:function(){return r.T.getPhrase(tt,"description")}},{key:"cta",get:function(){return{text:r.T.getPhrase(tt,"cta"),appLink:{application:Ge.O.SUBJECT,action:_e.e.Subjects.CLASSIFICATION_ALL}}}}])&&Ye(n.prototype,a),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,a}(Ze.H),at=n(37802),rt=n(23737),it=n(183),ot=n(22490),ct=n(82431),st=n(4399),lt=r.T.encloseNamespace("subjects.classification");const ut={followButton:"HlRXj"};function dt(e){return dt="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},dt(e)}function mt(){mt=function(){return t};var e,t={},n=Object.prototype,a=n.hasOwnProperty,r=Object.defineProperty||function(e,t,n){e[t]=n.value},i="function"==typeof Symbol?Symbol:{},o=i.iterator||"@@iterator",c=i.asyncIterator||"@@asyncIterator",s=i.toStringTag||"@@toStringTag";function l(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{l({},"")}catch(e){l=function(e,t,n){return e[t]=n}}function u(e,t,n,a){var i=t&&t.prototype instanceof b?t:b,o=Object.create(i.prototype),c=new O(a||[]);return r(o,"_invoke",{value:L(e,n,c)}),o}function d(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}t.wrap=u;var m="suspendedStart",p="suspendedYield",f="executing",v="completed",g={};function b(){}function y(){}function h(){}var w={};l(w,o,(function(){return this}));var E=Object.getPrototypeOf,k=E&&E(E(A([])));k&&k!==n&&a.call(k,o)&&(w=k);var S=h.prototype=b.prototype=Object.create(w);function I(e){["next","throw","return"].forEach((function(t){l(e,t,(function(e){return this._invoke(t,e)}))}))}function C(e,t){function n(r,i,o,c){var s=d(e[r],e,i);if("throw"!==s.type){var l=s.arg,u=l.value;return u&&"object"==dt(u)&&a.call(u,"__await")?t.resolve(u.__await).then((function(e){n("next",e,o,c)}),(function(e){n("throw",e,o,c)})):t.resolve(u).then((function(e){l.value=e,o(l)}),(function(e){return n("throw",e,o,c)}))}c(s.arg)}var i;r(this,"_invoke",{value:function(e,a){function r(){return new t((function(t,r){n(e,a,t,r)}))}return i=i?i.then(r,r):r()}})}function L(t,n,a){var r=m;return function(i,o){if(r===f)throw Error("Generator is already running");if(r===v){if("throw"===i)throw o;return{value:e,done:!0}}for(a.method=i,a.arg=o;;){var c=a.delegate;if(c){var s=T(c,a);if(s){if(s===g)continue;return s}}if("next"===a.method)a.sent=a._sent=a.arg;else if("throw"===a.method){if(r===m)throw r=v,a.arg;a.dispatchException(a.arg)}else"return"===a.method&&a.abrupt("return",a.arg);r=f;var l=d(t,n,a);if("normal"===l.type){if(r=a.done?v:p,l.arg===g)continue;return{value:l.arg,done:a.done}}"throw"===l.type&&(r=v,a.method="throw",a.arg=l.arg)}}}function T(t,n){var a=n.method,r=t.iterator[a];if(r===e)return n.delegate=null,"throw"===a&&t.iterator.return&&(n.method="return",n.arg=e,T(t,n),"throw"===n.method)||"return"!==a&&(n.method="throw",n.arg=new TypeError("The iterator does not provide a '"+a+"' method")),g;var i=d(r,t.iterator,n.arg);if("throw"===i.type)return n.method="throw",n.arg=i.arg,n.delegate=null,g;var o=i.arg;return o?o.done?(n[t.resultName]=o.value,n.next=t.nextLoc,"return"!==n.method&&(n.method="next",n.arg=e),n.delegate=null,g):o:(n.method="throw",n.arg=new TypeError("iterator result is not an object"),n.delegate=null,g)}function x(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function N(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function O(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(x,this),this.reset(!0)}function A(t){if(t||""===t){var n=t[o];if(n)return n.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var r=-1,i=function n(){for(;++r<t.length;)if(a.call(t,r))return n.value=t[r],n.done=!1,n;return n.value=e,n.done=!0,n};return i.next=i}}throw new TypeError(dt(t)+" is not iterable")}return y.prototype=h,r(S,"constructor",{value:h,configurable:!0}),r(h,"constructor",{value:y,configurable:!0}),y.displayName=l(h,s,"GeneratorFunction"),t.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===y||"GeneratorFunction"===(t.displayName||t.name))},t.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,h):(e.__proto__=h,l(e,s,"GeneratorFunction")),e.prototype=Object.create(S),e},t.awrap=function(e){return{__await:e}},I(C.prototype),l(C.prototype,c,(function(){return this})),t.AsyncIterator=C,t.async=function(e,n,a,r,i){void 0===i&&(i=Promise);var o=new C(u(e,n,a,r),i);return t.isGeneratorFunction(n)?o:o.next().then((function(e){return e.done?e.value:o.next()}))},I(S),l(S,s,"Generator"),l(S,o,(function(){return this})),l(S,"toString",(function(){return"[object Generator]"})),t.keys=function(e){var t=Object(e),n=[];for(var a in t)n.push(a);return n.reverse(),function e(){for(;n.length;){var a=n.pop();if(a in t)return e.value=a,e.done=!1,e}return e.done=!0,e}},t.values=A,O.prototype={constructor:O,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=e,this.done=!1,this.delegate=null,this.method="next",this.arg=e,this.tryEntries.forEach(N),!t)for(var n in this)"t"===n.charAt(0)&&a.call(this,n)&&!isNaN(+n.slice(1))&&(this[n]=e)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var n=this;function r(a,r){return c.type="throw",c.arg=t,n.next=a,r&&(n.method="next",n.arg=e),!!r}for(var i=this.tryEntries.length-1;i>=0;--i){var o=this.tryEntries[i],c=o.completion;if("root"===o.tryLoc)return r("end");if(o.tryLoc<=this.prev){var s=a.call(o,"catchLoc"),l=a.call(o,"finallyLoc");if(s&&l){if(this.prev<o.catchLoc)return r(o.catchLoc,!0);if(this.prev<o.finallyLoc)return r(o.finallyLoc)}else if(s){if(this.prev<o.catchLoc)return r(o.catchLoc,!0)}else{if(!l)throw Error("try statement without catch or finally");if(this.prev<o.finallyLoc)return r(o.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var r=this.tryEntries[n];if(r.tryLoc<=this.prev&&a.call(r,"finallyLoc")&&this.prev<r.finallyLoc){var i=r;break}}i&&("break"===e||"continue"===e)&&i.tryLoc<=t&&t<=i.finallyLoc&&(i=null);var o=i?i.completion:{};return o.type=e,o.arg=t,i?(this.method="next",this.next=i.finallyLoc,g):this.complete(o)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),g},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),N(n),g}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var a=n.completion;if("throw"===a.type){var r=a.arg;N(n)}return r}}throw Error("illegal catch attempt")},delegateYield:function(t,n,a){return this.delegate={iterator:A(t),resultName:n,nextLoc:a},"next"===this.method&&(this.arg=e),g}},t}function pt(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 ft=function(e,t,n,a){return new(n||(n=Promise))((function(r,i){function o(e){try{s(a.next(e))}catch(e){i(e)}}function c(e){try{s(a.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,c)}s((a=a.apply(e,t||[])).next())}))};gt.defaultProps={queryParams:{}};var vt=r.T.encloseNamespace("subjects.classification");function gt(e){var t,n,r,u,d,m,v,g,b,y,h,w,E,k,S=(E=a.useState(!1),k=2,function(e){if(Array.isArray(e))return e}(E)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,i,o,c=[],s=!0,l=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(a=i.call(n)).done)&&(c.push(a.value),c.length!==t);s=!0);}catch(e){l=!0,r=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(l)throw r}}return c}}(E,k)||function(e,t){if(e){if("string"==typeof e)return pt(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)?pt(e,t):void 0}}(E,k)||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.")}()),I=S[0],C=S[1],L=(0,Oe.Z)(),x=i.a.useGetFetchAsync(),N=(0,je.T)(),O=N.hasPermissions,A=N.hasLocalPermissions,P=(0,We.G)().isPlugin,F=i.a.useBasicFetch(Ce.L.config()),B=i.a.useBasicFetch(Ne.N.currentUser()),U=(0,Ae.R0)(),R=U.openInCurationStudioLabel,_=U.isUserCurator,G=U.getOpenInCurationStudioLink,W=i.a.useBasicFetch(O(Ee.C.CanSubmitFeedback)&&B.data&&Le.h.customer(B.data.customerId)),V=i.a.useBasicFetch(Ie.x.classification(e.id,null===(t=B.data)||void 0===t?void 0:t.id)),M=i.a.useBasicFetch(V.data&&Ie.x.presentationById(V.data.presentationId)),q=i.a.useBasicFetch(V.data&&Se.O.audiencesByPresentationId(V.data.presentationId)),z=i.a.useBasicFetch(V.data&&l.N.nextTopicSpecialEvent(e.id,V.data.presentationId)),Q=(0,qe.y)(),Y=Q.activePresentation,J=Q.availablePresentations,$=Q.canAccessPresentation,X=i.a.useBasicFetch((null===(n=B.data)||void 0===n?void 0:n.isAuthenticated)&&Le.h.yearGroups(B.data.customerId)),K=i.a.useBasicFetch(Ie.x.path(e.id)),ee=function(e,t,n){var a=(0,at.r)(null).hasTopicDirectories,r=(0,rt.y)({classificationId:e,queryParams:t,targetType:p.ku.Classification}),i=r.dashboard,o=r.isPreviewing,c=r.isTeacherOnly,s=(0,rt.y)({classificationId:e,queryParams:t,targetType:p.ku.ClassificationDirectory}).dashboard;return{dashboard:n===p.ku.Classification?i:s,canViewDirectory:a&&!!s.data,isTeacherOnly:c,isPreviewing:o}}(e.id,e.queryParams,e.targetType),te=ee.dashboard,ne=ee.canViewDirectory,ae=ee.isPreviewing,re=ee.isTeacherOnly,ie=i.a.useBasicFetch(Ie.x.regionAlternatives(e.id));(0,Fe.M)(Be.CG.getClassificationMetadata({content:V.data,phraseContext:{phraseHandler:vt,titlePhrase:"pageTitle",descriptionPhrase:"pageDescription"},canonicalLink:ze.f.getCanonicalLink({stripPresentationSlug:!0}),allowIndexing:ze.f.allowIndexing(),hrefLang:ze.f.getContentHrefLang(ie.data,(function(e,t){return{application:Ge.O.SUBJECT,action:_e.e.Subjects.CLASSIFICATION,args:[e,o.m.slugify(t)]}}))})),(0,Pe.v)(V,{notFound:nt}),(0,Me.P)({id:e.id,app:"topics"});var oe=(null==Y?void 0:Y.id)===(null===(r=M.data)||void 0===r?void 0:r.id),ce=(0,D.a)(j.r.MDDown),se=(0,D.a)(j.r.SMDown),le=(0,He.u)(s.LZ.ExpandableVideoThumbnail),ue=le.setFavourite,de=le.canFavourite,me=(0,Ve._)({location:Ve.i.VideoItem}),pe=O(Ee.C.FollowSubjects),Ze=(null===(u=V.data)||void 0===u?void 0:u.status)===ye.W.ComingSoon&&!ae,Qe=H.T.getActiveAudiencesFromParams(q.data,e.queryParams),Ye=null!==(d=null==Qe?void 0:Qe.map((function(e){return e.masterId})))&&void 0!==d?d:[];function Je(e,t){var n,a;if(pe&&V){var r=e.id.toString()===(null===(a=null===(n=V.data)||void 0===n?void 0:n.id)||void 0===a?void 0:a.toString());r&&C(!0);var i=Ue.i.isFollowing(e),o=i?xe.k.unfollow:xe.k.follow;x(o([e.id])).then((function(){c.k.logUserAction(et,{location:t,actionType:s.Vw.Follow,workflowPhase:s.eu.Complete,descriptor:i?s.DL.Off:s.DL.On,entity:s.py.Classification}),r||L.success(vt(i?"unfollowed":"followed",{name:e.name}))})).finally((function(){r&&C(!1)}))}}var $e,Xe,Ke=($e=V.data,Xe=e.queryParams,{audience:function(){return{application:Ge.O.SUBJECT,action:_e.e.Subjects.CLASSIFICATION,args:[$e.id,o.m.slugify($e.name)],params:Xe}},classification:function(e){var t=e||$e;return{application:Ge.O.SUBJECT,action:_e.e.Subjects.CLASSIFICATION,args:[t.id,o.m.slugify(t.name)],params:Z.t.omit(Xe,["preview","dashboardId","skipPrompt"])}},classificationTopics:function(e){var t=e||$e;return{application:Ge.O.SUBJECT,action:_e.e.Subjects.CLASSIFICATION_TOPICS,args:[t.id,o.m.slugify(t.name)],params:Z.t.omit(Xe,["preview","dashboardId","skipPrompt"])}},videoType:function(e,t){return ot.W.getAppLink(e,Object.assign(Object.assign({},t),{context:it.Q.Widget,moviesAndTv:Xe.mtv}))},allTopics:function(e){return{application:Ge.O.SUBJECT,action:_e.e.Subjects.CLASSIFICATION_ALL,params:{presentationId:e}}},series:function(e){return ct.j.getSeriesAppLink(e,{classificationId:$e.id,mtv:!!Xe.mtv||void 0})},subText:function(e){return ct.j.getSeriesAppLink(e.series,{classificationId:$e.id,mtv:!!Xe.mtv||void 0})},playlist:function(e){return{application:Ge.O.PLAYLISTS,action:_e.e.Playlists.PLAYLIST,args:[e.id,o.m.slugify(e.name)],params:{classificationId:$e.id,mtv:!!Xe.mtv||void 0}}},resource:function(e,t,n){return n?{application:Ge.O.VIDEOS,action:_e.e.Videos.PREVIEW_PDF,args:[e.id],params:{videoId:t}}:{application:Ge.O.SIGN_UP,action:_e.e.SignUp.SIGN_UP}},classroomGuide:ot.W.getClassroomGuideAppLink,interactiveGuidance:ot.W.getInteractiveGuidanceAppLink,resourceGuidance:ot.W.getResourceGuidanceAppLink}),et={presentationId:null===(m=M.data)||void 0===m?void 0:m.id,presentationName:null===(v=M.data)||void 0===v?void 0:v.name,currentClassificationId:null===(g=V.data)||void 0===g?void 0:g.id,currentClassificationName:null===(b=V.data)||void 0===b?void 0:b.name,followingCurrentClassification:!!(null===(w=null===(h=null===(y=V.data)||void 0===y?void 0:y.followers)||void 0===h?void 0:h.data)||void 0===w?void 0:w.length),activeAudienceNames:(null==Qe?void 0:Qe.length)?Qe.map((function(e){return e.name})):null,activeAudienceIds:Ye.length?Ye:null};return F.data&&te.hasCompleted&&V.data&&M.data&&K.data&&J&&q.data&&z.hasCompleted?a.createElement(be.M.Provider,{value:me},a.createElement("div",{className:"position-relative"},!(!ae||!te.data)&&a.createElement(ge.a,{status:te.data.status,type:"topic"}),a.createElement(fe,{dashboard:te.data,classification:V.data,getWidgetContentRequest:T._.dashboardWidgetContent,getBreadcrumbs:function(){var t;if($(null===(t=M.data)||void 0===t?void 0:t.id))return function(){return function(e){var t=e.classification,n=e.path,a=e.presentation,r=e.availablePresentations,i=e.appLinks;if(e.queryParams.mtv){var o=[{name:lt("moviesAndTv"),appLink:{application:Ge.O.MOVIES_AND_TV,action:_e.e.MoviesAndTv.HOME}}];return n.slice(1,n.length).forEach((function(e){o.push({name:e.name,appLink:i.classification(e),active:e.name===t.name})})),o}var c=[{name:Ue.i.getExploreAllTopicsTitle(null==a?void 0:a.name,null==r?void 0:r.length),appLink:(0,st.Dp)(null==a?void 0:a.id)}];return n.forEach((function(e){c.push({name:e.name,appLink:i.classification(e),active:e.name===t.name})})),c}({appLinks:Ke,availablePresentations:J,classification:V.data,path:K.data,presentation:M.data,queryParams:e.queryParams})}}(),hasPermissions:O,hasLocalPermissions:A,presentation:M.data,onToggleFollow:Je,getBannerActions:function(){var e,t,n,a,r,i=!!(null===(n=null===(t=null===(e=V.data)||void 0===e?void 0:e.followers)||void 0===t?void 0:t.data)||void 0===n?void 0:n.length);if(!pe||Ze)return[];var o=[{label:se?"":vt(i?"unfollow":"follow"),onClick:function(){return Je(V.data,s.LZ.Banner)},svgName:i?f.vn.Check:f.vn.Bell,className:"btn follow-btn me-2 ".concat(i?"btn-outline-dark":"btn-dark"," ").concat(ut.followButton),button:!0,tooltip:i||ce?void 0:vt("followBtnTooltip"),showSpinner:I}];return _&&o.push({label:R,href:G(we.E.Subject,null===(a=V.data)||void 0===a?void 0:a.id,null===(r=M.data)||void 0===r?void 0:r.id),openInNewTab:!0}),o},audiences:e.queryParams.mtv?null:q.data,activeAudiences:Qe,analyticsData:et,imageCdnUrl:F.data.imageCdnUrl,resourceThumbnailFallbackImageUrl:Re.W.Fallbacks.RESOURCE_THUMBNAIL,emptyImageUrl:re?Re.W.EmptyStates.Topics.TEACHER_ONLY:Re.W.EmptyStates.Topics.TOPIC,isComingSoon:Ze,showFollowButtonSpinner:I,comingSoonImageUrl:Re.W.EmptyStates.Topics.COMING_SOON,appLinks:Ke,isPreviewing:ae,setFavourite:ue,canFavourite:de,isViewCurrentPresentation:oe,canFollowSubjects:pe,onSubmitFeedback:O(Ee.C.CanSubmitFeedback)&&function(e){return ft(this,void 0,void 0,mt().mark((function t(){var n;return mt().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,x(Te.f.submitFeedback({type:he.n.Footer,user:De.m.getUserInfo(B.data,W.data),tags:De.m.getTags(B.data,ke.x.Primary,O(Ee.C.StudentExperience),["topics","in product feedback"])},{reaction:e.type,feedback:e.content,location:"Topic Footer",presentationName:M.data.description,presentationId:M.data.id,dashboardName:te.data.name,dashboardId:te.data.id,classificationName:V.data.name,classificationId:V.data.id}));case 2:return n=t.sent,c.k.logUserAction({feedbackType:e.type,content:e.content,presentationId:M.data.id,classificationId:V.data.id,dashboardId:te.data.id},{actionType:s.Vw.Submit,location:s.LZ.ClassificationFooter,entity:s.py.Feedback,workflowPhase:s.eu.Complete}),t.abrupt("return",n);case 5:case"end":return t.stop()}}),t)})))},tableOfContentsId:e.queryParams.tocId,yearGroups:X.data,lazyLoad:!ze.f.isBot(),moviesAndTv:e.queryParams.mtv,isTeacherOnly:re,specialEvent:z.data,isBot:ze.f.isBot(),canViewDirectory:ne,tab:e.targetType===p.ku.Classification?"new-releases":"all-topics",isPlugin:P}))):a.createElement(ve,null)}},87432:(e,t,n)=>{n.d(t,{Z:()=>a});const a={pillTabSelector:"Hdi6o",tab:"RvNxr",minWidth:"GHSz9",radiusSmall:"VhJJa",tabLink:"WFyvo"}}}]);
3
- //# sourceMappingURL=8139-ec264689fd-lite.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/8139-ec264689fd-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/common/src/react/utils/PortalHelper.ts","file:///app/packages/libs/shared/src/apps/calendar/flight-request/CalendarRequests.ts","file:///app/packages/libs/shared/src/apps/subjects/components/audience-item/audience-item.scss","file:///app/packages/libs/shared/src/apps/subjects/components/audience-item/AudienceItem.tsx","file:///app/packages/libs/shared/src/apps/subjects/constants/DashboardStatusConfig.ts","file:///app/packages/libs/shared/src/apps/subjects/components/classification-dashboard/dashboard-status-badge/dashboard-status-badge.scss","file:///app/packages/libs/shared/src/apps/subjects/components/classification-dashboard/dashboard-status-badge/DashboardStatusBadge.tsx","file:///app/packages/libs/shared/src/apps/subjects/components/preview-banner/preview-banner.scss","file:///app/packages/libs/shared/src/apps/subjects/components/preview-banner/PreviewBanner.tsx","file:///app/packages/libs/shared/src/apps/upload/utils/FileExtensionsHelper.ts","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/pill-tab-selector/PillTabSelector.tsx","file:///app/packages/libs/shared/src/components/table-of-contents-list/table-of-contents-list.scss","file:///app/packages/libs/shared/src/components/table-of-contents-list/TableOfContentsList.tsx","file:///app/packages/libs/shared/src/enums/FeedbackType.ts","file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/flight-requests/FeedbackRequests.ts","file:///app/packages/libs/shared/src/flight-requests/FollowRequests.ts","file:///app/packages/libs/shared/src/hooks/UseHandleObjectError.ts","file:///app/packages/libs/shared/src/hooks/usePrevious.ts","file:///app/packages/libs/shared/src/hooks/useTableOfContentsActiveHeading.tsx","file:///app/packages/libs/shared/src/hooks/useTableOfContentsScroll.tsx","file:///app/packages/libs/shared/src/utils/FeedbackFormHelper.ts","file:///app/packages/projects/lite/src/apps/subjects/utils/ClassificationAppLinks.ts","file:///app/packages/libs/shared/src/apps/subjects/components/classification-dashboard/empty-state/CuratedClassificationEmptyState.tsx","file:///app/packages/libs/shared/src/apps/subjects/components/classification-dashboard/table-of-contents/table-of-contents.scss","file:///app/packages/libs/shared/src/apps/subjects/components/classification-dashboard/table-of-contents/TableOfContents.tsx","file:///app/packages/libs/shared/src/apps/subjects/components/classification-dashboard/teacher-only/TeacherOnlyEmptyState.tsx","file:///app/packages/libs/shared/src/apps/subjects/components/classification-dashboard/classification-coming-soon/ClassificationComingSoon.tsx","file:///app/packages/libs/shared/src/apps/subjects/components/audience-filter/AudienceFilter.tsx","file:///app/packages/libs/shared/src/apps/subjects/components/classification-dashboard/audiences/ClassificationDashboardAudiences.tsx","file:///app/packages/libs/shared/src/apps/subjects/components/classification-dashboard/classification-tabs/ClassificationTabs.tsx","file:///app/packages/libs/shared/src/apps/subjects/components/classification-dashboard/classification-dashboard-nav/ClassificationDashboardNav.tsx","file:///app/packages/libs/shared/src/apps/subjects/components/classification-dashboard/ClassificationDashboard.tsx","file:///app/packages/libs/shared/src/apps/subjects/hooks/useGetTopicsWidgets.ts","file:///app/packages/libs/shared/src/apps/subjects/components/classification-dashboard/partial-loading/PartialClassificationDashboard.tsx","file:///app/packages/projects/lite/src/apps/subjects/errors/TopicNotFoundError.ts","file:///app/packages/projects/lite/src/apps/subjects/views/classification/ClassificationViewUtils.ts","file:///app/packages/projects/lite/src/apps/subjects/views/classification/curated-classification-view.scss","file:///app/packages/projects/lite/src/apps/subjects/views/classification/CuratedClassificationView.tsx","file:///app/packages/projects/lite/src/apps/subjects/hooks/useFetchClassificationDashboard.ts","file:///app/packages/libs/shared/src/components/pill-tab-selector/pill-tab-selector.scss"],"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 { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { CalendarEvent, CalendarEventContentType } from 'libs/shared/interfaces';\n\nexport const CalendarRequests = {\n calendarEvents(\n from: string,\n to: string,\n presentationId: string\n ): Flight.PublicRequest {\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/discover/special-events/content', { from, to, presentationId }),\n publicUrl: UrlHelper.urlBuilder(`/api/discover/special-events/content`, { from, to, presentationId }),\n key: `presentation:${presentationId}:events:from:${from}:to${to}`\n };\n },\n\n nextTopicSpecialEvent(\n classificationId: string,\n presentationId: string\n ): Flight.PublicRequest {\n const params = {\n presentationId,\n limit: 1,\n from: DateHelper.format(new Date(), 'YYYY-MM-DD'),\n objectType: CalendarEventContentType.Classification\n };\n\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v1/discover/special-events/object/${classificationId}/next-events`, params),\n publicUrl: UrlHelper.urlBuilder(`/api/discover/special-events/object/${classificationId}/next-events`, params),\n key: `presentation:${presentationId}:events:classification:${classificationId}`,\n formatData: (events: CalendarEvent[]) => ArrayHelper.first(events)\n };\n }\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"disabled\":\"pERi4\",\"disabledHighlighted\":\"AxyWm\"};","import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nimport styles from './audience-item.scss';\n\nfunction lowerCaseToTitleCase(str: string): string {\n return str.split(' ').map((s: string) => s.charAt(0).toUpperCase() + s.substring(1)).join(' ');\n}\n\nfunction getColourClass(highlight: boolean, isDisabled: boolean): string {\n if (highlight) return isDisabled ? `${styles.disabledHighlighted} text-light` : 'bg-blue text-light';\n if (isDisabled) return `${styles.disabled} text-secondary`;\n return 'bg-light';\n}\n\ninterface AudienceItemProps {\n audience: PresentationAudience;\n highlight: boolean;\n setAudience?: (audience: PresentationAudience, highlight: boolean) => void;\n isDisabled?: boolean;\n extraClasses?: string;\n}\n\nAudienceItem.defaultProps = {\n extraClasses: ''\n};\n\nexport function AudienceItem(props: AudienceItemProps): React.ReactElement {\n const { audience, highlight, setAudience, isDisabled, extraClasses } = props;\n\n const colourClass = getColourClass(highlight, isDisabled);\n const cursorClass = isDisabled ? 'cursor-default' : 'cursor-pointer';\n const className = `rounded-pill d-inline-block me-1 user-select-none ${cursorClass} ${colourClass} ${extraClasses}`;\n\n const onClick = () => {\n if (isDisabled || !FunctionHelper.isFunction(setAudience))\n return;\n\n setAudience(audience, !highlight);\n };\n\n return (\n <span\n className={className}\n onClick={onClick}\n role='checkbox'\n aria-checked={highlight}\n >\n {lowerCaseToTitleCase(audience.name)}\n </span>\n );\n}","import { localSvgs } from 'libs/shared/images/svg';\nimport { DashboardStatus } from 'libs/shared/interfaces/models/Dashboard';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\ninterface DashboardStatusConfigType {\n statusName: string;\n actionName: string;\n svgName: localSvgs;\n svgColorClassName: string;\n}\n\nexport const DashboardStatusConfig: Record<DashboardStatus, DashboardStatusConfigType> = {\n [DashboardStatus.Archived]: {\n svgName: cvSvgLibrary.Archive,\n svgColorClassName: 'text-secondary',\n actionName: 'Archive',\n statusName: 'Archived'\n },\n [DashboardStatus.Draft]: {\n svgName: cvSvgLibrary.Edit,\n svgColorClassName: '',\n actionName: 'Draft',\n statusName: 'Draft'\n },\n [DashboardStatus.Published]: {\n svgName: cvSvgLibrary.VisibleOn,\n svgColorClassName: 'text-success',\n actionName: 'Publish',\n statusName: 'Published'\n }\n};","// extracted by mini-css-extract-plugin\nexport default {\"badge\":\"ciO47\",\"draftLight\":\"A6Yi7\",\"draftDark\":\"fkXBX\",\"published\":\"Ovzwy\",\"archived\":\"r_dco\"};","import React from 'react';\n\nimport { DashboardStatusConfig } from 'libs/shared/apps/subjects/constants/DashboardStatusConfig';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { DashboardStatus } from 'libs/shared/interfaces';\n\nimport styles from './dashboard-status-badge.scss';\n\nfunction getClassName(props: DashboardStatusBadgeProps): string {\n let className = `rounded-pill d-flex align-items-center ps-2 py-1 fw-semibold ms-2 ${styles.badge}`;\n\n switch (props.status) {\n case DashboardStatus.Published:\n className += ` ${styles.published}`;\n break;\n case DashboardStatus.Archived:\n className += ` ${styles.archived}`;\n break;\n case DashboardStatus.Draft:\n className += ` ${props.darkMode ? styles.draftDark : styles.draftLight}`;\n break;\n }\n\n if (props.wrapperClassName)\n className += ` ${props.wrapperClassName}`;\n\n return className;\n}\n\ninterface DashboardStatusBadgeProps {\n status: DashboardStatus;\n darkMode?: boolean;\n wrapperClassName?: string;\n}\n\nexport function DashboardStatusBadge(props: DashboardStatusBadgeProps): JSX.Element {\n const { statusName, svgName } = DashboardStatusConfig[props.status];\n\n return (\n <div className={getClassName(props)}>\n <SvgContainer svgName={svgName} />\n <div>{statusName}</div>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"stickyWrapper\":\"zhw6K\",\"badgeWrapper\":\"NOvn1\",\"badge\":\"pxQSR\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { DashboardStatusBadge } from 'libs/shared/apps/subjects/components/classification-dashboard/dashboard-status-badge/DashboardStatusBadge';\nimport { EmojiText } from 'libs/shared/components/emoji-text/EmojiText';\nimport { DashboardStatus } from 'libs/shared/interfaces';\n\nimport styles from './preview-banner.scss';\n\nconst namespace = 'shared.classificationPreviewBanner';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface PreviewBannerProps {\n status: DashboardStatus;\n type: 'company' | 'topic';\n}\n\nexport function PreviewBanner(props: PreviewBannerProps): JSX.Element {\n return (\n <div className={`${styles.stickyWrapper} py-2 d-flex justify-content-space-between bg-dark text-white mx-2 rounded`}>\n <div className={`position-absolute d-flex ${styles.badgeWrapper}`}>\n <DashboardStatusBadge status={props.status} wrapperClassName={`${styles.badge}`} darkMode />\n </div>\n <div className='flex-grow-1'>\n <h1 className='text-center my-3 h5'>\n <EmojiText emoji='👀' />\n {getPhrase(props.type === 'topic' ? 'topicTitle' : 'companyTitle')}\n </h1>\n </div>\n </div>\n );\n}\n","import * as _ from 'underscore';\n\n/**\n * This are kept as separate variables for when we eventually need a single group of them.\n * For example when we add image upload support.\n */\n\nconst pdfExtensions = ['pdf'];\nconst docExtensions = [ 'doc', 'docx', 'dotx', 'dot', 'rtf', 'docm', 'odt' ];\nconst textExtensions = [ 'csv', 'txt' ];\nconst excelExtensions = [ 'xls', 'xlt', 'xlsx' ];\nconst imageExtensions = [ 'jpg', 'tif', 'png', 'bmp', 'gif', 'jpeg' ];\nconst videoMimeType = 'video/*';\nconst archiveExtensions = [ 'zip', 'rar' ];\nconst powerPointExtensions = [ 'ppt', 'pot', 'pps', 'pptx' ];\n\nconst subtitleExtensions = ['srt'];\n\nconst FileExtensions = {\n IMAGES: `.${imageExtensions.join(',.')}`,\n VIDEO: videoMimeType,\n MIXED_MEDIA: `.${imageExtensions.join(',.')},${videoMimeType}`,\n RESOURCES: `.${[\n ...docExtensions,\n ...excelExtensions,\n ...powerPointExtensions,\n ...pdfExtensions,\n ...textExtensions,\n ...imageExtensions,\n ...archiveExtensions\n ].join(',.')}`,\n SUBTITLES: `.${subtitleExtensions.join(',.')}`\n};\n\nconst FileExtensionHelper = {\n getResourceType(extension: string): string {\n const ext = extension.toLowerCase();\n\n if (_.contains(docExtensions, ext)) return 'document';\n if (_.contains(excelExtensions, ext)) return 'excel';\n if (_.contains(powerPointExtensions, ext)) return 'powerpoint';\n if (_.contains(pdfExtensions, ext)) return 'pdf';\n\n if (_.contains(textExtensions, ext)) return 'text';\n if (_.contains(imageExtensions, ext)) return 'image';\n if (_.contains(archiveExtensions, ext)) return 'archive';\n if (_.contains(subtitleExtensions, ext)) return 'subtitle';\n\n return '';\n }\n};\n\nexport { FileExtensions, FileExtensionHelper };","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 { 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 { 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 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 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 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={DateHelper.format(specialEvent.startDate, 'MMMM')}\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 &&\n <div className={`${styles.logoContainerLeft} d-none d-md-block partial-loading-background rounded-circle overflow-hidden me-3`}>\n {props.logo?.url &&\n <LazyImage src={ImageHelper.createUrl(props.logo?.url, { size: ImageSize.Small })} />}\n </div>\n }\n <h1 className={`text-white text-shadow pe-3 ${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 { 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\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 = ({ breadcrumb: { name, appLink, active }, withBackIcon }: BreadcrumbItemProps) => (\n <li className={`breadcrumb-item${active ? ' active' : ''}`}>\n {active\n ? <strong>{name}</strong>\n : <AppLink appLink={appLink}>\n {withBackIcon && <SvgContainer svgName={cvSvgLibrary.ChevronLeft} size={SvgContainerSize.Small} />}\n <span className={withBackIcon ? 'ms-2' : ''}>{name}</span>\n </AppLink>\n }\n </li>\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;\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 return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {breadcrumbs.map((b, idx) => <BreadcrumbItem key={idx} breadcrumb={b} />)}\n </ol>\n </nav>\n );\n};\n\nexport const PartialBreadcrumbs = React.memo(function({ numItems = 3 }: { numItems?: number; }) {\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n\n if (isMobile) {\n return (\n <div className='partial-loading-background' style={{ height: '1.3125rem', width: '6rem' }} />\n );\n }\n\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {PartialLoadingHelper.getPartialLoadingItems({ numItems }).map(({ width }, idx) => (\n <li key={idx} className='breadcrumb-item'>\n <span className='d-inline-block partial-loading-background' style={{ width }} dangerouslySetInnerHTML={{ __html: '&nbsp' }} />\n </li>\n ))}\n </ol>\n </nav>\n );\n});","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\n\nimport { SvgContainer } from '../svg-container/SvgContainer';\n\nimport styles from './pill-tab-selector.scss';\n\ninterface TabContentsProps {\n tab: PillTab;\n}\n\nfunction TabContents(props: TabContentsProps): JSX.Element {\n return (\n <>\n {!!props.tab.svgName && (\n <div className={props.tab.name ? 'pe-1' : ''}>\n <SvgContainer svgName={props.tab.svgName} />\n </div>\n )}\n\n {props.tab.name}\n\n {typeof (props.tab.count) === 'number' && (\n <div className='ps-2'>\n <Badge type={BadgeType.Count} data={props.tab.count} />\n </div>\n )}\n </>\n );\n}\n\nexport interface PillTab {\n name: string;\n active: boolean;\n svgName?: string;\n\n className?: string;\n\n appLink?: Core.AppLink;\n onSelect?: () => void;\n\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n\n count?: number;\n}\n\ninterface PillTabSelectorProps {\n tabs: PillTab[];\n listClassName?: string;\n className?: string;\n borderRadius?: 'sm' | 'lg'\n}\n\nPillTabSelector.defaultProps = {\n borderRadius: 'lg'\n};\n\nexport function PillTabSelector(props: PillTabSelectorProps): JSX.Element {\n function onSelectTab(tab: PillTab): void {\n if (tab.active || !tab.onSelect)\n return;\n\n tab.onSelect();\n\n if (tab.analyticsData && tab.analyticsOptions)\n AnalyticsHelper.logUserAction(tab.analyticsData, tab.analyticsOptions);\n }\n\n return (\n <nav className={props.className ?? ''}>\n <ul className={`\n list-unstyled d-inline-block m-0 ${styles.pillTabSelector}\n ${props.borderRadius ? styles.radiusSmall : ''}\n ${props.listClassName}\n `}>\n {props.tabs.map((tab, index) => {\n return (\n <li\n className={`\n p-0 ${styles.tab} ${tab.active ? 'btn btn-dark' : 'btn btn-outline-dark'}\n ${tab.name ? styles.minWidth : ''} ${tab.className}\n `}\n key={index}\n >\n {tab.appLink ? (\n <AppLink\n appLink={tab.appLink}\n analyticsData={tab.analyticsData}\n analyticsOptions={tab.analyticsOptions}\n className={`\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ${styles.tabLink}\n `}\n >\n <TabContents tab={tab} />\n </AppLink>\n ) : (\n <DivButton\n className={`\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset p-2 text-nowrap ${styles.tabLink}\n `}\n onClick={() => onSelectTab(tab)}\n >\n <TabContents tab={tab} />\n </DivButton>\n )}\n </li>\n );\n })}\n </ul>\n </nav>\n );\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"itemsWrapper\":\"m6mGm\",\"anchorWrapper\":\"QptZj\",\"default\":\"_AZa8\",\"selectedItem\":\"Nuiel\",\"disabled\":\"WIzWJ\",\"floatIcon\":\"ARudn\",\"arrowIcon\":\"tEF5Q\",\"listIcon\":\"Ql2wi\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { ScrollHelper } from 'libs/common/backbone/utils/ScrollHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, HashObject, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\n\nimport styles from './table-of-contents-list.scss';\n\nexport interface TableOfContentsItem<T=string> {\n name: string;\n id: T;\n}\n\ninterface TableOfContentsProps<T> {\n items: TableOfContentsItem<T>[];\n activeId: string;\n appLink?: Core.AppLink;\n analyticsData?: HashObject;\n setControlledId: (arg: string) => void;\n // set to true if the TOC is controlled by a local state rather than query params\n localState?: boolean;\n getAppLink?: (args: TableOfContentsItem<T>) => Core.AppLink\n}\n\nexport function TableOfContentsList<T extends string>(props: TableOfContentsProps<T>): JSX.Element {\n const analyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Widget,\n location: LocationContext.TableOfContents\n };\n\n function logUserEvent(item: TableOfContentsItem) {\n AnalyticsHelper.logUserAction(\n {\n ...props.analyticsData,\n id: item.id,\n name: item.name\n },\n analyticsOptions\n );\n }\n\n return (\n <div className={`${styles.itemsWrapper}`}>\n {props.items.map((item, idx) => {\n if (props.localState) {\n return (\n <DivButton\n key={item.id}\n className={`${styles.anchorWrapper} ${props.activeId === item.id ? styles.selectedItem : ''}`}\n onClick={() => {\n ScrollHelper.preventScrollTop();\n props.setControlledId(item.id);\n logUserEvent(item);\n }}\n >\n <div className={`${!props.activeId && idx === 0 ? styles.default : ''} `}>\n {item.name}\n </div>\n </DivButton>\n );\n }\n\n return (\n <AppLink\n key={item.id}\n appLink={props.getAppLink(item)}\n appLinkOptions={{ replace: true }}\n className={`${styles.anchorWrapper} ${props.activeId === item.id ? styles.selectedItem : ''}`}\n onClick={() => {\n ScrollHelper.preventScrollTop();\n props.setControlledId(item.id);\n }}\n analyticsData={{\n ...props.analyticsData,\n id: item.id,\n name: item.name\n }}\n analyticsOptions={analyticsOptions}\n >\n <div className={`${!props.activeId && idx === 0 ? styles.default : ''} `}>\n {item.name}\n </div>\n </AppLink>\n );\n })}\n </div>\n );\n}","export enum FeedbackType {\n Other,\n SuggestImprovement,\n ReportBug,\n RequestVideo,\n RaiseIssue,\n GivePraise,\n Footer\n}","import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Flight } from 'libs/common/react/index';\n\nimport { FeedbackFormRequest } from 'libs/shared/interfaces/requests/FeedbackFormRequest';\n\nexport const FeedbackRequests = {\n submitFeedback(requestData: FeedbackFormRequest, formValues: Record<string, string>): Flight.Request {\n return {\n url: '{gateway}/v1/feedback',\n key: 'submit:feedback',\n type: HttpVerbs.POST,\n data: {\n ...requestData,\n ...formValues\n }\n };\n }\n};","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\n\nconst endpoints = {\n follow: () => `/api/domain/v1/subjects/classifications/following`,\n unfollow: (ids: string[]) => UrlHelper.urlBuilder('/api/domain/v1/subjects/classifications/following', { id: ids })\n};\n\nexport const FollowRequests = {\n /**\n * @param data - array of object ids the user is going to follow\n */\n follow(ids: string[], success?: (data: string[]) => void, error?: () => void): Flight.Request {\n return {\n url: endpoints.follow(),\n key: `follow:${ids.join(',')}`,\n type: HttpVerbs.POST,\n data: ids,\n success,\n error,\n invalidationKeys: [ ...ids.map(id => `classification:${id}`), 'my:subject:preferences', 'classifications' ]\n };\n },\n\n unfollow(ids: string[], success?: () => void, error?: () => void): Flight.Request {\n return {\n url: endpoints.unfollow(ids),\n key: `unfollow:${ids.join(',')}`,\n type: HttpVerbs.DELETE,\n success,\n error,\n invalidationKeys: [ ...ids.map(id => `classification:${id}`), 'my:subject:preferences', 'classifications' ]\n };\n }\n};\n","import { useEffect } from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { handleHttpError, HttpErrorMap, IgnoreHttpErrorMap } from 'libs/shared/errors/handlers/HttpErrorHandlers';\n\nfunction generateCacheKey(flightObjs: Array<Flight.Response<any>>): string {\n return flightObjs.map(obj => obj.statusCode).join(':');\n}\n\n// TODO: Change this to just `useHandleHttpError` and only accept a status code.\nexport function useHandleObjectError(\n _flightObjs: Flight.Response<any> | Array<Flight.Response<any>>,\n customErrors?: HttpErrorMap,\n ignoreErrors?: IgnoreHttpErrorMap\n): void {\n const flightObjs = Array.isArray(_flightObjs) ? _flightObjs : [_flightObjs];\n\n useEffect(() => {\n flightObjs.forEach(obj => {\n handleHttpError(obj.statusCode, customErrors, ignoreErrors);\n });\n }, [ generateCacheKey(flightObjs), customErrors, ignoreErrors ]);\n}","import React from 'react';\n\n// https://reactjs.org/docs/hooks-faq.html#how-to-get-the-previous-props-or-state\nexport function usePrevious<T>(value: T): T {\n const ref = React.useRef<T>();\n React.useEffect(() => {\n ref.current = value;\n });\n return ref.current;\n}","import React from 'react';\n\ntype TableOfContentsActiveOption = {\n setActiveId: (id: string) => void;\n headingElements: Element[];\n controlledId?: string;\n setControlledId?: (arg: string) => void;\n}\n\nlet timer: number;\n\nexport const useTableOfContentsActiveHeading = (\n { setActiveId, headingElements, controlledId, setControlledId }: TableOfContentsActiveOption\n) => {\n const scrollPositionRef = React.useRef(0);\n\n React.useEffect(() => {\n const callback = (headings: IntersectionObserverEntry[]) => {\n headings.forEach(heading => {\n if (controlledId) {\n setActiveId(controlledId);\n // can use scrollEnd event when the new event type is supported\n timer = window.setTimeout(() => {\n setControlledId('');\n }, 800);\n return;\n }\n if (heading.isIntersecting) {\n setActiveId(heading.target.id);\n scrollPositionRef.current = window.scrollY;\n } else {\n const scrollDistance = scrollPositionRef.current - window.scrollY;\n const isScrollingUp = scrollDistance > 0;\n const curIndex = headingElements.findIndex(h => h.id === heading.target.id);\n const prevHeading = headingElements[curIndex - 1];\n if (isScrollingUp && prevHeading?.id) {\n setActiveId(prevHeading?.id);\n }\n }\n });\n };\n\n const observer = new IntersectionObserver(callback, {\n // rootMargin top: same as the cv-nav-height\n rootMargin: '-67px 0px -80% 0px'\n });\n\n headingElements.forEach(element => observer.observe(element));\n\n return () => {\n timer && window.clearTimeout(timer);\n observer.disconnect();\n };\n }, [ setActiveId, headingElements.length, controlledId ]);\n};\n\n","import React from 'react';\n\nimport { usePrevious } from './usePrevious';\n\nconst HEADER_OFFSET = 80; // Size of header + some extra spacing\n\nexport const useTableOfContentsScroll = (elements: Element[], activeId: string) => {\n const [ hasDoneInitialScroll, setHasDoneInitialScroll ] = React.useState(false);\n\n const previousId = usePrevious(activeId);\n const currentId = activeId;\n\n React.useLayoutEffect(() => {\n if (!hasDoneInitialScroll || previousId !== currentId) {\n const target = elements.find(heading => heading && (heading?.id === currentId));\n\n if (target) {\n const rec = target.getBoundingClientRect();\n\n window.scrollBy({\n top: rec.top - HEADER_OFFSET,\n behavior: 'smooth'\n });\n \n if (!hasDoneInitialScroll)\n setHasDoneInitialScroll(true);\n }\n }\n }, [ elements, previousId, currentId, hasDoneInitialScroll ]);\n};","import Dropzone from 'dropzone';\n\nimport { UploadItem } from 'libs/shared/apps/upload/services/UploadService';\nimport { FileExtensions } from 'libs/shared/apps/upload/utils/FileExtensionsHelper';\nimport { InstanceRegion } from 'libs/shared/enums/InstanceRegion';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { CurrentUser, Customer } from 'libs/shared/interfaces';\nimport { FeedbackUserDetails } from 'libs/shared/interfaces/requests/FeedbackFormRequest';\n\nexport const FeedbackFormHelper = {\n getUserInfo: (\n currentUser: CurrentUser,\n customer: Customer\n ): FeedbackUserDetails => {\n return {\n id: currentUser.id,\n username: currentUser.username,\n email: currentUser.email,\n userType: currentUser.role === UserRole.Admin ? 'Admin' : 'Staff',\n customerId: currentUser.customerId,\n cvcId: customer.crmId,\n customerName: customer.name,\n instanceRegion: currentUser.instanceRegion,\n contentRegion: currentUser.contentRegion\n };\n },\n\n mapInstanceRegionToTag: (instanceRegion: InstanceRegion): string => {\n switch (instanceRegion) {\n case InstanceRegion.AU:\n return 'au';\n case InstanceRegion.NZ:\n return 'nz';\n case InstanceRegion.UK:\n return 'uk';\n case InstanceRegion.US:\n return 'us';\n }\n },\n\n getTags: (currentUser: CurrentUser, product: ProductId, hasStudentExperience: boolean, extraTags: string[]) => {\n const tags = [\n product,\n ...extraTags\n ];\n\n tags.push(hasStudentExperience ? 'student' : 'staff');\n \n if (currentUser.role === UserRole.Admin)\n tags.push('administrator');\n \n const regionTag = FeedbackFormHelper.mapInstanceRegionToTag(currentUser.instanceRegion);\n \n if (regionTag)\n tags.push(regionTag);\n\n return tags;\n },\n\n categorizeFiles(files: UploadItem[]) {\n return files.reduce((result, file) => {\n const fileInfo = file.get('fileInfo');\n if (Dropzone.isValidFile(file.get('file'), FileExtensions.VIDEO)) {\n result.videoUrls.push(fileInfo?.url);\n } else {\n result.imageUrls.push(fileInfo?.url);\n }\n return result;\n }, {\n imageUrls: [],\n videoUrls: []\n });\n }\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';\n\nexport const getClassificationAppLink = (params?: HashObject) =>\n (classification?: Classification): Core.AppLink => ({\n application: AppChannels.SUBJECT,\n action: Actions.Subjects.CLASSIFICATION,\n args: classification ? [ classification.id, TextHelper.slugify(classification.name) ] : [],\n params: 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.CLASSIFICATION_ALL,\n params: presentationId ? { presentationId } : {}\n});","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { CuratedDashboard, DashboardStatus } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'subjects.curatedClassificationEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface CuratedClassificationEmptyStateProps {\n dashboard: CuratedDashboard;\n imageUrl: string;\n isReadonly: boolean;\n addWidgetApplink?: () => Core.AppLink;\n}\n\nexport function CuratedClassificationEmptyState(props: CuratedClassificationEmptyStateProps): JSX.Element {\n const isArchived = props.dashboard?.status === DashboardStatus.Archived;\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={props.imageUrl} altText={getPhrase('headingForNP')} />\n {!props.isReadonly ? (\n <EmptyState.Heading>\n <Text phrase='headingForNP' />\n </EmptyState.Heading>\n ) : (\n <>\n <EmptyState.Heading>\n <Text namespace={namespace} phrase='headingForCurator' />\n </EmptyState.Heading>\n <EmptyState.Info>\n <Text namespace={namespace} phrase='info' />\n </EmptyState.Info>\n <Tooltip title={isArchived ? LanguageService.getPhrase(namespace, 'archivedCtaTooltip') : ''} spanHack>\n <EmptyState.Cta\n text={LanguageService.getPhrase(namespace, 'add')}\n appLink={props.addWidgetApplink?.()}\n className='btn btn-dark'\n icon={cvSvgLibrary.Plus}\n disabled={isArchived}\n />\n </Tooltip>\n </>\n )}\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"container\":\"k1iOO\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport { TableOfContentsList } from 'libs/shared/components/table-of-contents-list/TableOfContentsList';\nimport { CuratedWidget } from 'libs/shared/interfaces';\n\nimport styles from './table-of-contents.scss';\n\ninterface TableOfContentsProps {\n widgets: CuratedWidget[];\n title: string;\n activeId: string;\n appLink?: Core.AppLink;\n clickable?: boolean;\n analyticsData?: HashObject;\n setControlledId: (arg: string) => void;\n}\n\nexport function TableOfContents(props: TableOfContentsProps): JSX.Element {\n function getAppLink(widget: CuratedWidget): Core.AppLink {\n const currentAppLink = Core.AppLinkHelper.getCurrentAppLink();\n \n const params: HashObject = currentAppLink.params\n ? { ...(currentAppLink.params as HashObject) }\n : {};\n\n params.tocId = widget.id;\n\n return {\n ...currentAppLink,\n params\n };\n }\n\n return (\n <div className={`${styles.container} ps-3`}>\n <h2 className='h5'>{props.title}</h2>\n \n <TableOfContentsList\n items={props.widgets}\n activeId={props.activeId}\n appLink={props.appLink}\n analyticsData={props.analyticsData}\n setControlledId={props.setControlledId}\n getAppLink={getAppLink}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'subjects.teacherOnlyEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface TeacherOnlyEmptyStateProps {\n imageUrl: string;\n ctaAppLink?: () => Core.AppLink;\n}\n\nexport function TeacherOnlyEmptyState(props: TeacherOnlyEmptyStateProps): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={props.imageUrl} altText={getPhrase('heading')} />\n <EmptyState.Heading>\n <Text phrase='heading' />\n </EmptyState.Heading>\n <EmptyState.Info>\n <Text phrase='info' />\n </EmptyState.Info>\n\n <EmptyState.Cta\n text={getPhrase('cta')}\n appLink={props.ctaAppLink?.()}\n className='btn btn-dark'\n />\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { ActionButton } from 'libs/shared/components/actions/ActionButton';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { Classification } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'subjects.classificationComingSoon';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ComingSoonProps {\n data: Classification;\n onToggleFollow?: () => void;\n canFollowSubjects: boolean;\n imageUrl: string;\n showFollowButtonSpinner: boolean;\n}\n\nexport function ClassificationComingSoon(props: ComingSoonProps): JSX.Element {\n const isFollowing = !!props.data.followers?.data?.length;\n function onClick(): void {\n props.onToggleFollow?.();\n }\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState className='pt-0'>\n <EmptyState.Image src={props.imageUrl} altText={getPhrase('comingSoon')} />\n\n <EmptyState.Heading>\n <Text phrase='comingSoon' />\n </EmptyState.Heading>\n\n <EmptyState.Info>\n <Text phrase='info' />\n </EmptyState.Info>\n\n {props.canFollowSubjects && (\n <ActionButton\n svgName={isFollowing ? cvSvgLibrary.Check : cvSvgLibrary.Bell}\n onClick={onClick}\n showSpinner={props.showFollowButtonSpinner}\n className={`btn follow-btn me-2 ${isFollowing ? 'btn-outline-dark' : 'btn-dark'}`}\n >\n <Text phrase={isFollowing ? 'unfollow' : 'follow'} />\n </ActionButton>\n )}\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}\n","import * as React from 'react';\n\nimport { StorageType } from 'libs/common/backbone/utils/LocalStorageHelper';\nimport { Core } from 'libs/common/core';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AudienceItem } from 'libs/shared/apps/subjects/components/audience-item/AudienceItem';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { PresentationAudience } from 'libs/shared/interfaces';\nimport { PartialLoadingHelper } from 'libs/shared/utils/PartialLoadingHelper';\n\nconst namespace = 'subjects.audienceFilter';\n\ninterface AudienceFilterProps {\n audiences: PresentationAudience[];\n activeAudiences?: PresentationAudience[];\n disabled?: boolean;\n appLink: Core.AppLink;\n disablePersist?: boolean;\n}\n\nexport function AudienceFilter(props: AudienceFilterProps): React.ReactElement {\n const { audiences, activeAudiences, disabled, appLink } = props;\n\n const [ , setActiveAudiences ] = useViewModel<PresentationAudience[]>(\n SharedViewModelKeys.AUDIENCE_FILTER,\n undefined,\n { storage: StorageType.SessionStorage }\n );\n\n React.useEffect(() => {\n if (!props.disablePersist)\n setActiveAudiences(activeAudiences);\n }, [activeAudiences]);\n\n function onToggleAudience(audience: PresentationAudience, isSelected: boolean): void {\n const activeAudienceNames = isSelected\n ? [ ...(activeAudiences?.map(a => a.name) ?? []), audience.name ]\n : activeAudiences.map(a => a.name).filter(name => name !== audience.name);\n\n const getParams = () => {\n const otherParams = ObjectHelper.omit(appLink.params, ['a']);\n\n if (!activeAudienceNames.length)\n return otherParams;\n\n return Object.assign({}, otherParams, { a: activeAudienceNames });\n };\n\n Core.AppLinkHelper.trigger({\n ...appLink,\n params: getParams()\n }, { replace: true });\n }\n\n function onClickClearAudiences(): void {\n const params = ObjectHelper.omit(appLink.params, ['a']);\n\n Core.AppLinkHelper.trigger({\n ...appLink,\n params\n }, { replace: true });\n }\n\n if (!audiences || !audiences.length)\n return <></>;\n\n return (\n <div className='d-flex flex-wrap row-gap-2'>\n {audiences.map((a: PresentationAudience) => (\n <AudienceItem\n key={a.masterId}\n audience={a}\n highlight={!!activeAudiences?.find(aa => aa.masterId === a.masterId)}\n setAudience={onToggleAudience}\n isDisabled={disabled}\n />\n ))}\n {(!!activeAudiences && !!Object.keys(activeAudiences).length) && (\n <DivButton className='info-link d-inline-block fw-semibold ms-1' onClick={onClickClearAudiences}>\n <Text namespace={namespace} phrase='clear' />\n </DivButton>\n )}\n </div>\n );\n}\n\nconst PARTIAL_AUDIENCES = PartialLoadingHelper.getPartialLoadingItems({ numItems: 6 });\n\nexport const PartialAudienceFilter = () => (\n <div className={'d-flex flex-wrap row-gap-2'}>\n {PARTIAL_AUDIENCES.map(({ width }, idx) => (\n <span\n key={idx}\n className='rounded-pill partial-loading-background me-1'\n dangerouslySetInnerHTML={{ __html: '&nbsp' }}\n style={{ width }}\n />\n ))}\n </div>\n);","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AudienceFilter } from 'libs/shared/apps/subjects/components/audience-filter/AudienceFilter';\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\ninterface ClassificationDashboardAudiencesProps {\n audiences: PresentationAudience[];\n activeAudiences: PresentationAudience[];\n appLink: Core.AppLink;\n isReadonly: boolean;\n disablePersist: boolean;\n}\n\nexport function ClassificationDashboardAudiences(props: ClassificationDashboardAudiencesProps): JSX.Element {\n return (\n <AudienceFilter\n audiences={props.audiences}\n activeAudiences={props.activeAudiences}\n disabled={props.isReadonly}\n appLink={props.appLink}\n disablePersist={props.disablePersist}\n />\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { PillTabSelector } from 'libs/shared/components/pill-tab-selector/PillTabSelector';\nimport { WidgetAppLinks } from 'libs/shared/components/widgets/curated-widgets/WidgetProps';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Classification, Presentation } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.classificationDashboard';\n\nexport type ClassificationTab = 'new-releases' | 'all-topics';\n\ninterface ClassificationTabsProps {\n classification: Classification;\n presentation: Presentation;\n appLinks: WidgetAppLinks;\n activeTab: ClassificationTab;\n isReadonly: boolean;\n}\n\nexport function ClassificationTabs(props: ClassificationTabsProps): JSX.Element {\n const breakpoints = useBreakpoints();\n\n const showText = breakpoints.lg || breakpoints.xl || breakpoints.xxl || breakpoints.xs;\n\n return (\n <PillTabSelector\n borderRadius='sm'\n className={breakpoints.xs ? 'w-100' : ''}\n listClassName='d-flex flex-nowrap'\n tabs={[{\n name: showText ? LanguageService.getPhrase(namespace, 'newReleases') : '',\n appLink: !props.isReadonly ? props.appLinks?.classification?.(props.classification) : null,\n active: props.activeTab === 'new-releases',\n svgName: cvSvgLibrary.Sparkle,\n analyticsData: {\n id: 'new-releases',\n classificationId: props.classification.id,\n classificationName: props.classification.name,\n presentationId: props.presentation.id,\n presentationDescription: props.presentation.description,\n name: LanguageService.getPhrase(namespace, 'newReleases'),\n url: Core.AppLinkHelper.getHref(props.appLinks?.classification?.(props.classification))\n },\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.Url,\n location: LocationContext.MagicTabs\n },\n className: breakpoints.xs ? 'w-100' : ''\n }, {\n name: showText ? LanguageService.getPhrase(namespace, 'allTopics') : '',\n appLink: !props.isReadonly ? props.appLinks?.classificationTopics?.(props.classification) : null,\n active: props.activeTab === 'all-topics',\n svgName: cvSvgLibrary.Grid,\n analyticsData: {\n id: 'all-topics',\n classificationId: props.classification.id,\n classificationName: props.classification.name,\n presentationId: props.presentation.id,\n presentationDescription: props.presentation.description,\n name: LanguageService.getPhrase(namespace, 'allTopics'),\n url: Core.AppLinkHelper.getHref(props.appLinks?.classificationTopics?.(props.classification))\n },\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.Url,\n location: LocationContext.MagicTabs\n },\n className: breakpoints.xs ? 'w-100' : ''\n }]}\n />\n );\n}","import React from 'react';\n\nimport { Breadcrumb, Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { WidgetAppLinks } from 'libs/shared/components/widgets/curated-widgets/WidgetProps';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Classification, Presentation, PresentationAudience } from 'libs/shared/interfaces';\nimport { AudienceHelper } from 'libs/shared/utils/audience-helper/AudienceHelper';\n\nimport { ClassificationDashboardAudiences } from '../audiences/ClassificationDashboardAudiences';\nimport { ClassificationTab, ClassificationTabs } from '../classification-tabs/ClassificationTabs';\n\nfunction shouldHideAudiences(\n audiences: PresentationAudience[],\n activeAudiences: PresentationAudience[],\n isEmpty: boolean,\n isComingSoon: boolean\n): boolean {\n if (isComingSoon)\n return true;\n\n if (isEmpty && !activeAudiences?.length)\n return true;\n\n if (!AudienceHelper.shouldShowAudiences(audiences))\n return true;\n\n return false;\n}\n\ninterface ClassificationDashboardNavProps {\n classification: Classification;\n presentation: Presentation;\n appLinks: WidgetAppLinks;\n activeTab: ClassificationTab;\n audiences: PresentationAudience[];\n activeAudiences: PresentationAudience[];\n getBreadcrumbs: () => Breadcrumb[];\n\n canViewDirectory: boolean;\n isComingSoon: boolean;\n isEmpty: boolean;\n isViewingCurrentPresentation: boolean;\n isReadonly: boolean;\n}\n\nexport function ClassificationDashboardNav(props: ClassificationDashboardNavProps): JSX.Element {\n const breakpoints = useBreakpoints();\n\n const hideAudiences = shouldHideAudiences(\n props.audiences,\n props.activeAudiences,\n props.isEmpty,\n props.isComingSoon\n );\n\n function getContainerClass(): string {\n let className = 'd-flex flex-column py-3 mb-3';\n\n if (!props.isComingSoon)\n className += ' border-bottom';\n\n if ((props.canViewDirectory || hideAudiences) && !breakpoints.xs)\n return className;\n\n return className + ' row-gap-3';\n }\n\n function getTopRowClass(): string {\n let className = '';\n\n if (hideAudiences)\n className += 'd-flex align-items-center justify-content-between';\n\n if (breakpoints.xs)\n className += ' row-gap-3';\n\n return className;\n }\n\n function getBottomRowClass(): string {\n let className = 'd-flex align-items-end justify-content-between';\n\n if (breakpoints.xs)\n className += ' row-gap-3 flex-wrap';\n\n return className;\n }\n\n return (\n <div className={getContainerClass()}>\n <div className={getTopRowClass()}>\n <Breadcrumbs breadcrumbs={props.getBreadcrumbs?.()} />\n\n {props.canViewDirectory && hideAudiences && (\n <ClassificationTabs\n classification={props.classification}\n activeTab={props.activeTab}\n appLinks={props.appLinks}\n presentation={props.presentation}\n isReadonly={props.isReadonly}\n />\n )}\n </div>\n\n <div className={getBottomRowClass()}>\n {!hideAudiences && (\n <ClassificationDashboardAudiences\n audiences={props.audiences}\n activeAudiences={props.activeAudiences}\n appLink={props.appLinks.audience?.()}\n isReadonly={props.isReadonly}\n disablePersist={!props.isViewingCurrentPresentation}\n />\n )}\n\n {props.canViewDirectory && !hideAudiences && (\n <ClassificationTabs\n classification={props.classification}\n activeTab={props.activeTab}\n appLinks={props.appLinks}\n presentation={props.presentation}\n isReadonly={props.isReadonly}\n />\n )}\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsOptions, HashObject, LocationContext } from 'libs/analytics/interfaces';\n\nimport { CuratedClassificationEmptyState } from 'libs/shared/apps/subjects/components/classification-dashboard/empty-state/CuratedClassificationEmptyState';\nimport { TableOfContents } from 'libs/shared/apps/subjects/components/classification-dashboard/table-of-contents/TableOfContents';\nimport { TeacherOnlyEmptyState } from 'libs/shared/apps/subjects/components/classification-dashboard/teacher-only/TeacherOnlyEmptyState';\nimport { useGetTopicsWidgets } from 'libs/shared/apps/subjects/hooks/useGetTopicsWidgets';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { BannerHeader } from 'libs/shared/components/banner-header/BannerHeader';\nimport { Breadcrumb } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { DashboardFeedbackData } from 'libs/shared/components/feedback-form/FeedbackForm';\nimport { VideoList } from 'libs/shared/components/video-list/VideoList';\nimport { VideoSubTextType } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { WidgetHeader } from 'libs/shared/components/widgets/curated-widgets/components/header/WidgetHeader';\nimport { WidgetContainerView } from 'libs/shared/components/widgets/curated-widgets/WidgetContainerView';\nimport { WidgetAppLinks } from 'libs/shared/components/widgets/curated-widgets/WidgetProps';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { HasLocalPermissionsFunc, HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { useTableOfContentsActiveHeading } from 'libs/shared/hooks/useTableOfContentsActiveHeading';\nimport { useTableOfContentsScroll } from 'libs/shared/hooks/useTableOfContentsScroll';\nimport { CalendarEvent, CalendarEventContentType, CanFavouriteFunc, Classification, CuratedDashboard, CuratedWidget, CuratedWidgetQueryParams, DashboardStatus, FavouriteFunc, Presentation, PresentationAudience, YearGroup } from 'libs/shared/interfaces';\nimport { CuratedDashboardHelper } from 'libs/shared/utils/DashboardHelper';\n\nimport { ClassificationComingSoon } from './classification-coming-soon/ClassificationComingSoon';\nimport { ClassificationDashboardNav } from './classification-dashboard-nav/ClassificationDashboardNav';\n\nconst namespace = 'shared.classificationDashboard';\n\nfunction isHeadingWidget(widget: CuratedWidget) {\n return widget.widgetId === WidgetTypeId.Blurb && widget.templateId === WidgetTemplate.Heading;\n}\n\nfunction isTopicWidget(widget: CuratedWidget) {\n return widget.widgetId === WidgetTypeId.CuratedClassifications || widget.widgetId === WidgetTypeId.Classifications;\n}\n\ninterface ClassificationDashboardProps {\n dashboard: CuratedDashboard;\n classification: Classification;\n presentation: Presentation;\n hasPermissions: HasPermissionsFunc;\n hasLocalPermissions: HasLocalPermissionsFunc;\n resourceThumbnailFallbackImageUrl: string;\n canViewDirectory: boolean;\n tab: 'new-releases' | 'all-topics';\n specialEvent?: CalendarEvent;\n\n audiences: PresentationAudience[];\n activeAudiences?: PresentationAudience[];\n\n getWidgetContentRequest: (\n id: string,\n params: CuratedWidgetQueryParams,\n widgetTemplate: WidgetTemplate\n ) => Flight.Request;\n\n getBannerActions?: () => ActionOptions[];\n getBreadcrumbs?: () => Breadcrumb[];\n onToggleFollow?: (classification: Classification, locationContext: LocationContext) => void;\n setFavourite?: FavouriteFunc;\n canFavourite?: CanFavouriteFunc;\n canFollowSubjects: boolean;\n onSubmitFeedback?: (feedback: DashboardFeedbackData) => Promise<void>;\n\n appLinks?: WidgetAppLinks;\n\n imageCdnUrl: string\n emptyImageUrl: string;\n comingSoonImageUrl?: string;\n\n analyticsOptions?: AnalyticsOptions;\n analyticsData?: HashObject;\n\n scrollToWidgetId?: string;\n tableOfContentsId?: string;\n\n // Means the dashboard contains no linked or working filters\n isReadonly?: boolean;\n\n // Means the dashboard is being previewed by ClickView staff either in product or in curator\n isPreviewing?: boolean;\n\n // Means the parent topic for the dashboard has a status of \"Coming Soon\"\n isComingSoon?: boolean;\n\n showFollowButtonSpinner?: boolean;\n \n isViewCurrentPresentation?: boolean;\n\n yearGroups?: YearGroup[];\n\n // By default widgets will always be lazyloaded. We override this behaviour only in extenuating \n // circumstances, such as dynamic rendering for SEO.\n lazyLoad?: boolean;\n\n moviesAndTv?: boolean;\n\n isTeacherOnly?: boolean;\n\n // Fallback url to display for the company logo. Only used by Streamable Learning atm\n companyLogoFallbackUrl?: string;\n\n subTextType?: VideoSubTextType;\n \n contentType?: CalendarEventContentType;\n\n isBot?: boolean;\n\n isPlugin: boolean;\n}\n\nClassificationDashboard.defaultProps = {\n appLinks: {}\n};\n\nexport function ClassificationDashboard(props: ClassificationDashboardProps): JSX.Element {\n const { widgets, videoList, videoListWidgetId } = useGetTopicsWidgets(props.dashboard, props.activeAudiences);\n\n const isSmallScreen = useMediaQuery(MediaQueryStrings.LGDown);\n const headingRef = React.useRef<Set<Element>>(new Set());\n\n const initialEmptyWidgets = React.useMemo(() => {\n return widgets.reduce((acc: HashObject<boolean>, widget) => {\n acc[widget.id] = false;\n return acc;\n }, {});\n }, [widgets?.length]);\n\n const [ emptyWidgets, setEmptyWidgets ] = React.useState(initialEmptyWidgets);\n\n const [ controlledId, setControlledId ] = React.useState(window.location.hash.slice(1) || '');\n\n const [ tableOfContentActiveId, setTableOfContentActiveId ] = React.useState<string>('');\n\n const headingElements = Array.from(headingRef.current);\n useTableOfContentsScroll(headingElements, props.tableOfContentsId);\n useTableOfContentsActiveHeading({\n setActiveId: setTableOfContentActiveId,\n headingElements,\n controlledId,\n setControlledId\n });\n\n function shouldShowEmptyState(): boolean {\n if (props.isComingSoon)\n return false;\n\n if (props.isTeacherOnly)\n return false;\n\n if (!props.dashboard)\n return true;\n\n if (props.dashboard.status === DashboardStatus.Archived && !props.isReadonly)\n return true;\n\n if (props.dashboard.status === DashboardStatus.Draft && !props.isPreviewing)\n return true;\n\n if (!widgets?.length)\n return true;\n\n if (videoList && videoList.length)\n return false;\n\n return Object.values(emptyWidgets).every(state => !!state);\n }\n\n function getWidgetContentRequest(id: string, widgetTypeId: WidgetTypeId, template: WidgetTemplate): Flight.Request {\n const params = CuratedDashboardHelper.getWidgetParams(\n widgetTypeId,\n template,\n CuratedDashboardHelper.getDashboardTargetType(props.dashboard),\n props.activeAudiences?.map(a => a.masterId)\n );\n\n return props.getWidgetContentRequest(id, params, template);\n }\n\n const showEmptyState = shouldShowEmptyState();\n\n React.useEffect(() => {\n /**\n * When we add the first widget of the dashboard, the showEmptyState is `true`, the WidgetContainer is not going to be rendered to lazyload the `content`\n * so we set the emptyWidget to initial make sure the widget container is rendered to lazyload `widget.content`\n * and let the WidgetContainer to re-set the empty state based on the actual `widget.content` from backend\n */\n if (showEmptyState) {\n setEmptyWidgets(initialEmptyWidgets);\n }\n }, [widgets?.length]);\n\n const onSetIsEmpty = React.useCallback((widgetId: string, isEmpty: boolean) => {\n if (emptyWidgets[widgetId] === isEmpty)\n return;\n\n const newEmptyState = {\n ...emptyWidgets,\n [widgetId]: isEmpty\n };\n\n let index = 0;\n\n /**\n * Every time a widget is identified as empty, we check each heading blurb widget\n * to see if it should be hidden. This will be the case when all widgets beneath a heading\n * (up until the next heading) are empty.\n */\n while (index < widgets.length) {\n const currentWidget = widgets[index];\n\n if (!isHeadingWidget(currentWidget)) {\n index++;\n continue;\n }\n\n let isHeadingEmpty = true;\n let subWidgetIndex = index + 1;\n\n while (isHeadingEmpty && subWidgetIndex < widgets.length) {\n const headingSubWidget = widgets[subWidgetIndex];\n\n if (isHeadingWidget(headingSubWidget))\n break;\n\n if (!newEmptyState[headingSubWidget.id] && !isTopicWidget(headingSubWidget))\n isHeadingEmpty = false;\n\n subWidgetIndex++;\n }\n\n index = subWidgetIndex;\n\n newEmptyState[currentWidget.id] = isHeadingEmpty;\n }\n\n setEmptyWidgets(newEmptyState);\n }, [ emptyWidgets, widgets ]);\n\n function hideWidget(widget: CuratedWidget): boolean {\n return isHeadingWidget(widget) && emptyWidgets[widget.id];\n }\n\n const widgetsInTableOfContents = widgets.filter(w => {\n return !hideWidget(w) && !!w.metadata?.showInTableOfContents;\n });\n\n const shouldShowTableOfContents = widgetsInTableOfContents.length >= 2 && !isSmallScreen;\n\n /**\n * We don't put the .topic-dashboard class when we're in a movies and tv classification\n * because we don't want the extra padding between widgets.\n */\n return (\n <div className={`bg-white px-4 ${props.moviesAndTv ? '' : 'topic-dashboard'}`}>\n <BannerHeader\n heading={props.classification.name}\n banner={props.classification.banner}\n imageCdnUrl={props.imageCdnUrl}\n actions={props.getBannerActions?.()}\n actionsDropdownClassName='btn btn-outline-dark'\n specialEvent={props.specialEvent}\n calendarTheme={{\n background: 'bg-light-blue',\n border: 'border-light-blue'\n }}\n showComingSoon={props.isComingSoon}\n />\n\n <ClassificationDashboardNav\n classification={props.classification}\n presentation={props.presentation}\n appLinks={props.appLinks}\n activeTab={props.tab}\n audiences={props.audiences}\n activeAudiences={props.activeAudiences}\n getBreadcrumbs={props.getBreadcrumbs}\n canViewDirectory={props.canViewDirectory}\n isComingSoon={props.isComingSoon}\n isEmpty={showEmptyState}\n isViewingCurrentPresentation={props.isViewCurrentPresentation}\n isReadonly={props.isReadonly}\n />\n\n {props.isComingSoon && (\n <ClassificationComingSoon\n imageUrl={props.comingSoonImageUrl}\n data={props.classification}\n canFollowSubjects={props.canFollowSubjects}\n showFollowButtonSpinner={props.showFollowButtonSpinner}\n onToggleFollow={() => props.onToggleFollow(props.classification, LocationContext.ClassificationComingSoon)}\n />\n )}\n\n {!props.isComingSoon && (\n <div className={`${shouldShowTableOfContents ? 'row no-wrap' : ''}`}>\n <div className={shouldShowTableOfContents ? 'col-9' : ''}>\n {widgets.map((widget, idx) => {\n if (hideWidget(widget))\n return <React.Fragment key={widget.id}></React.Fragment>;\n\n return (\n <WidgetContainerView\n headingElementRef={headingRef}\n key={widget.id}\n id={widget.id}\n name={widget.name}\n description={widget.description}\n templateId={widget.templateId}\n widgetTypeId={widget.widgetId}\n audiences={props.audiences}\n getContentRequest={getWidgetContentRequest}\n setIsEmpty={onSetIsEmpty}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n appLinks={props.appLinks}\n yearGroups={props.yearGroups}\n presentation={props.presentation}\n analyticsData={props.analyticsData}\n isScrollToTargetWidget={props.scrollToWidgetId === widget.id}\n imageCdnUrl={props.imageCdnUrl}\n onSubmitFeedback={props.onSubmitFeedback}\n metadata={widget.metadata}\n isBot={props.isBot}\n hasTableOfContents={shouldShowTableOfContents}\n lazyLoad={props.lazyLoad}\n dashboardTarget={CuratedDashboardHelper.getDashboardTargetType(props.dashboard)}\n widgetIndex={idx}\n hasPermissions={props.hasPermissions}\n hasLocalPermissions={props.hasLocalPermissions}\n isPreviewing={props.isReadonly}\n companyLogoFallbackUrl={props.companyLogoFallbackUrl}\n subTextType={props.subTextType}\n contentType={props.contentType}\n resourceThumbnailFallbackImageUrl={props.resourceThumbnailFallbackImageUrl}\n preferences={widget.preferences}\n onToggleFollowClassification={props.onToggleFollow}\n isPlugin={props.isPlugin}\n />\n );\n })}\n </div>\n\n {shouldShowTableOfContents && (\n <aside className='col-3'>\n <TableOfContents\n widgets={widgetsInTableOfContents}\n title={props.classification.name}\n activeId={tableOfContentActiveId}\n clickable={!props.isReadonly}\n analyticsData={props.analyticsData}\n\n setControlledId={setControlledId}\n />\n </aside>\n )}\n\n {!!videoList?.length && (\n <>\n <WidgetHeader name={LanguageService.getPhrase(namespace, 'videos')} description='' />\n <VideoList\n videos={videoList}\n yearGroups={props.yearGroups}\n getVideoAppLink={(v, opts) => props.appLinks.videoType(v, { ...opts, contextId: videoListWidgetId })}\n getSubTextAppLink={props.appLinks.subText}\n hasPermissions={props.hasPermissions}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n presentationAudiences={props.audiences}\n companyLogoFallbackUrl={props.companyLogoFallbackUrl}\n subTextType={props.subTextType}\n getPreviewQuestionsAppLink={props.appLinks.previewQuestions}\n isPlugin={props.isPlugin}\n getClassroomGuideAppLink={props.appLinks.classroomGuide}\n getInteractiveGuidanceAppLink={props.appLinks.interactiveGuidance}\n getResourceGuidanceAppLink={props.appLinks.resourceGuidance}\n />\n </>\n )}\n </div>\n )}\n\n {showEmptyState && (\n <CuratedClassificationEmptyState\n dashboard={props.dashboard}\n isReadonly={props.isReadonly}\n imageUrl={props.emptyImageUrl}\n addWidgetApplink={props.appLinks.widgetWizard}\n />\n )}\n\n {props.isTeacherOnly && (\n <TeacherOnlyEmptyState\n imageUrl={props.emptyImageUrl}\n ctaAppLink={() => props.appLinks.allTopics(props.classification.presentationId)}\n />\n )}\n </div>\n );\n}","import React from 'react';\n\nimport { Flight } from 'libs/common/react/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { DashboardRequests } from 'libs/shared/flight-requests/DashboardRequests';\nimport { CuratedDashboard, CuratedMediaWidget, CuratedWidget, PresentationAudience, Video } from 'libs/shared/interfaces';\nimport { CuratedDashboardHelper } from 'libs/shared/utils/DashboardHelper';\n\nexport interface Response {\n widgets: CuratedWidget[];\n\n videoList?: Video[];\n videoListWidgetId?: string;\n}\n\n/**\n * This hook helps us with custom logic for to display system generated dashboards in a slightly\n * different way.\n */\nexport function useGetTopicsWidgets(dashboard: CuratedDashboard, activeAudiences: PresentationAudience[]): Response {\n const {\n isSystemGeneratedDashboard,\n systemGeneratedVideoWidget\n } = React.useMemo(() => {\n if (!dashboard) {\n return {\n isSystemGeneratedDashboard: false,\n systemGeneratedVideoWidget: null\n };\n }\n\n const isSystemGeneratedDashboard = CuratedDashboardHelper.isSystemGeneratedDashboard(dashboard.widgets);\n\n return {\n isSystemGeneratedDashboard,\n systemGeneratedVideoWidget: dashboard.widgets.find(widget => {\n return widget.widgetId === WidgetTypeId.ClassificationPinnedVideos;\n })\n };\n }, [dashboard?.id]);\n\n const systemGeneratedVideoContent = Flight.useBasicFetch<CuratedMediaWidget<Video[]>>(\n !!systemGeneratedVideoWidget &&\n DashboardRequests.dashboardWidgetContent(\n systemGeneratedVideoWidget?.id,\n CuratedDashboardHelper.getWidgetParams(\n systemGeneratedVideoWidget.widgetId,\n systemGeneratedVideoWidget.templateId,\n CuratedDashboardHelper.getDashboardTargetType(dashboard),\n activeAudiences?.map(a => a.masterId)\n ),\n systemGeneratedVideoWidget?.templateId\n )\n );\n\n // Non system generated dashboards are returned as per usual\n if (!isSystemGeneratedDashboard)\n return { widgets: ArrayHelper.sortBy(dashboard?.widgets, 'index') };\n\n // System generated dashboard have the video widget removed and returned as a separate video list\n return {\n widgets: dashboard?.widgets?.filter(widget => widget.widgetId !== WidgetTypeId.ClassificationPinnedVideos) ?? [],\n videoList: systemGeneratedVideoContent.data?.content ?? [],\n videoListWidgetId: systemGeneratedVideoWidget?.id\n };\n}","import React from 'react';\n\nimport { PartialAudienceFilter } from 'libs/shared/apps/subjects/components/audience-filter/AudienceFilter';\nimport { PartialBannerHeader } from 'libs/shared/components/banner-header/BannerHeader';\nimport { PartialBreadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\n\nexport function PartialClassificationDashboard(): JSX.Element {\n return (\n <div className='bg-white px-4'>\n <PartialBannerHeader />\n\n <div className='d-flex flex-column row-gap-3 py-3 mb-3 border-bottom'>\n <PartialBreadcrumbs />\n <PartialAudienceFilter />\n </div>\n </div>\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { ErrorCta, ErrorPageError } from 'libs/shared/errors/primitives/ErrorPageError';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'subjects.topicNotFoundError';\n\nexport class TopicNotFoundError extends ErrorPageError {\n constructor() {\n super('Topic doesn\\'t exist');\n }\n\n // @ts-ignore\n public get name(): string {\n return 'TopicNotFoundError';\n }\n\n // @ts-ignore\n public get heading(): string {\n return LanguageService.getPhrase(namespace, 'heading');\n }\n\n // @ts-ignore\n public get description(): string {\n return LanguageService.getPhrase(namespace, 'description');\n }\n\n // @ts-ignore\n public get cta(): ErrorCta {\n return {\n text: LanguageService.getPhrase(namespace, 'cta'),\n appLink: {\n application: AppChannels.SUBJECT,\n action: Actions.Subjects.CLASSIFICATION_ALL\n }\n };\n }\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { Breadcrumb } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { WidgetAppLinks } from 'libs/shared/components/widgets/curated-widgets/WidgetProps';\nimport { RelatedVideosContext } from 'libs/shared/enums/RelatedVideosContext';\nimport { Classification, Playlist, PlaylistCollection, Presentation, Resource, Series, SeriesCollection, Video, VideoCollection } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\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 { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { SeriesAppLinkHelper } from 'apps/series/SeriesAppLinkHelper';\nimport { getAllTopicsAppLink } from 'apps/subjects/utils/ClassificationAppLinks';\n\nexport interface ClassificationViewQueryParams {\n a?: string[];\n dashboardId?: string;\n preview?: 'true';\n tocId?: string;\n mtv?: boolean;\n}\n\n/**\n * Checks if the classification would have any content with\n * no filters applied\n */\nexport function hasNoContentUnfiltered(classification: Classification): boolean {\n if (!classification)\n return false;\n\n return (\n classification.series?.count === 0 &&\n classification.pinnedVideos?.count === 0 &&\n classification.playlists?.count === 0\n );\n}\n\ninterface HeroVideoWithVideoList {\n heroVideo: Video;\n videoList: Video[];\n}\n\nexport function extractHeroVideo(\n series: SeriesCollection,\n playlists: PlaylistCollection,\n videos: VideoCollection,\n classification: Classification\n): HeroVideoWithVideoList {\n if (!series || !playlists || !videos || !classification)\n return {\n heroVideo: null,\n videoList: videos && videos.data\n };\n\n // If the subject has no series/playlists, and has only 1 video, that video is displayed as the hero.\n if (!series.data.length && !playlists.data.length && videos.data.length === 1) {\n return {\n heroVideo: ArrayHelper.first(videos.data),\n videoList: []\n };\n }\n\n const pinnedVideoIndex = videos.data.findIndex(video => video.id === classification.pinnedVideoMasterId);\n\n if (pinnedVideoIndex === -1)\n return {\n heroVideo: null,\n videoList: videos.data\n };\n\n return {\n heroVideo: videos.data[pinnedVideoIndex],\n videoList: videos.data.filter(vid => vid.id !== classification.pinnedVideoMasterId)\n };\n}\nconst getPhrase = LanguageService.encloseNamespace('subjects.classification');\n\nexport function getBannerActions(\n classification: Classification,\n canFollowSubjects: boolean,\n onFollow: () => void,\n showFollowButtonSpinner: boolean,\n isSmallScreen: boolean\n): ActionOptions[] {\n if (!canFollowSubjects)\n return [];\n\n const isFollowing = !!classification.followers?.data?.length;\n\n return [{\n label: getPhrase(isFollowing ? 'unfollow' : 'follow'),\n onClick: onFollow,\n svgName: isFollowing ? cvSvgLibrary.Check : cvSvgLibrary.Bell,\n className: `btn follow-btn ${isFollowing ? 'btn-outline-dark' : 'btn-dark'}`,\n button: true,\n tooltip: (isFollowing || isSmallScreen) ? undefined : getPhrase('followBtnTooltip'),\n showSpinner: showFollowButtonSpinner\n }];\n}\n\nexport function getClassificationAppLinks(\n classification: Classification,\n params: ClassificationViewQueryParams\n): WidgetAppLinks {\n return {\n audience: () => ({\n application: AppChannels.SUBJECT,\n action: Actions.Subjects.CLASSIFICATION,\n args: [ classification.id, TextHelper.slugify(classification.name) ],\n params\n }),\n \n classification: (_classification: Classification | null) => {\n const appLinkClassification = _classification || classification;\n\n return {\n application: AppChannels.SUBJECT,\n action: Actions.Subjects.CLASSIFICATION,\n args: [ appLinkClassification.id, TextHelper.slugify(appLinkClassification.name) ],\n params: ObjectHelper.omit(params, [ 'preview', 'dashboardId', 'skipPrompt' ])\n };\n },\n\n classificationTopics: (_classification: Classification) => {\n const appLinkClassification = _classification || classification;\n\n return {\n application: AppChannels.SUBJECT,\n action: Actions.Subjects.CLASSIFICATION_TOPICS,\n args: [ appLinkClassification.id, TextHelper.slugify(appLinkClassification.name) ],\n params: ObjectHelper.omit(params, [ 'preview', 'dashboardId', 'skipPrompt' ])\n };\n },\n\n videoType: (video: Video, opts: GetVideoAppLinkOptions) => (\n VideoAppLinkHelper.getAppLink(video, {\n ...opts,\n context: RelatedVideosContext.Widget,\n moviesAndTv: params.mtv\n })\n ),\n\n allTopics: (presentationId: string) => ({\n application: AppChannels.SUBJECT,\n action: Actions.Subjects.CLASSIFICATION_ALL,\n params: { presentationId }\n }),\n\n series: (series: Series) => {\n return SeriesAppLinkHelper.getSeriesAppLink(series, {\n classificationId: classification.id,\n mtv: params.mtv ? true : undefined\n });\n },\n\n subText: (video: Video) => SeriesAppLinkHelper.getSeriesAppLink(video.series, {\n classificationId: classification.id,\n mtv: params.mtv ? true : undefined\n }),\n\n playlist: (playlist: Playlist) => ({\n application: AppChannels.PLAYLISTS,\n action: Actions.Playlists.PLAYLIST,\n args: [ playlist.id, TextHelper.slugify(playlist.name) ],\n params: {\n classificationId: classification.id,\n mtv: params.mtv ? true : undefined\n }\n }),\n\n resource: (resource: Resource, videoId: string, canViewResources: boolean) => {\n if (!canViewResources) {\n return {\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.SIGN_UP\n };\n }\n\n return {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PREVIEW_PDF,\n args: [resource.id],\n params: {\n videoId\n }\n };\n },\n\n classroomGuide: VideoAppLinkHelper.getClassroomGuideAppLink,\n interactiveGuidance: VideoAppLinkHelper.getInteractiveGuidanceAppLink,\n resourceGuidance: VideoAppLinkHelper.getResourceGuidanceAppLink\n };\n}\n\ninterface GetClassificationBreadcrumbsOptions {\n queryParams: ClassificationViewQueryParams;\n classification: Classification;\n path: Classification[];\n appLinks: WidgetAppLinks;\n presentation: Presentation;\n availablePresentations: Presentation[];\n}\n\nexport function getClassificationBreadcrumbs(\n options: GetClassificationBreadcrumbsOptions\n): Breadcrumb[] {\n const { queryParams, classification, path, presentation, availablePresentations, appLinks } = options;\n\n if (queryParams.mtv) {\n const breadcrumbs: Breadcrumb[] = [{\n name: getPhrase('moviesAndTv'),\n appLink: {\n application: AppChannels.MOVIES_AND_TV,\n action: Actions.MoviesAndTv.HOME\n }\n }];\n\n path.slice(1, path.length).forEach(item => {\n breadcrumbs.push({\n name: item.name,\n appLink: appLinks.classification(item),\n active: item.name === classification.name\n });\n });\n\n return breadcrumbs;\n }\n \n const breadcrumbs: Breadcrumb[] = [{\n name: TopicsHelper.getExploreAllTopicsTitle(presentation?.name, availablePresentations?.length),\n appLink: getAllTopicsAppLink(presentation?.id)\n }];\n\n path.forEach(item => {\n breadcrumbs.push({\n name: item.name,\n appLink: appLinks.classification(item),\n active: item.name === classification.name\n });\n });\n\n return breadcrumbs;\n}","// extracted by mini-css-extract-plugin\nexport default {\"followButton\":\"HlRXj\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, ToggleDescriptor, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { CalendarRequests } from 'libs/shared/apps/calendar/flight-request/CalendarRequests';\nimport { ClassificationDashboard } from 'libs/shared/apps/subjects/components/classification-dashboard/ClassificationDashboard';\nimport { PartialClassificationDashboard } from 'libs/shared/apps/subjects/components/classification-dashboard/partial-loading/PartialClassificationDashboard';\nimport { PreviewBanner } from 'libs/shared/apps/subjects/components/preview-banner/PreviewBanner';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { Breadcrumb } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { DashboardFeedbackData } from 'libs/shared/components/feedback-form/FeedbackForm';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { ClassificationStatus } from 'libs/shared/enums/ClassificationStatus';\nimport { FeedbackType } from 'libs/shared/enums/FeedbackType';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { DashboardRequests } from 'libs/shared/flight-requests/DashboardRequests';\nimport { FeedbackRequests } from 'libs/shared/flight-requests/FeedbackRequests';\nimport { FollowRequests } from 'libs/shared/flight-requests/FollowRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useCurationStudio } from 'libs/shared/hooks/useCurationStudio';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { CalendarEvent, Classification, Config, CurrentUser, Customer, DashboardTargetType, Presentation, PresentationAudience, RegionAlternative, YearGroup } from 'libs/shared/interfaces';\nimport { AudienceHelper } from 'libs/shared/utils/audience-helper/AudienceHelper';\nimport { FeedbackFormHelper } from 'libs/shared/utils/FeedbackFormHelper';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { usePluginHelper } from 'shared/hooks/use-plugin-helper/usePluginHelper';\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { useDeepLinks } from 'shared/hooks/useDeepLinks';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\nimport { usePresentation } from 'shared/hooks/usePresentation';\nimport { SeoHelper } from 'shared/utils/SeoHelper';\n\nimport { TopicNotFoundError } from 'apps/subjects/errors/TopicNotFoundError';\nimport { useFetchClassificationDashboard } from 'apps/subjects/hooks/useFetchClassificationDashboard';\n\nimport { ClassificationViewQueryParams, getClassificationAppLinks, getClassificationBreadcrumbs } from './ClassificationViewUtils';\n\nimport styles from './curated-classification-view.scss';\n\ninterface CuratedClassificationViewProps {\n id: string;\n queryParams?: ClassificationViewQueryParams;\n targetType: DashboardTargetType;\n}\n\nCuratedClassificationView.defaultProps = {\n queryParams: {}\n};\n\nconst namespace = 'subjects.classification';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function CuratedClassificationView(props: CuratedClassificationViewProps): React.ReactElement {\n const [ showFollowButtonSpinner, setShowFollowButtonSpinner ] = React.useState<boolean>(false);\n\n const alerts = useAlerts();\n const fetchAsync = Flight.useGetFetchAsync();\n const { hasPermissions, hasLocalPermissions } = usePermissions();\n const { isPlugin } = usePluginHelper();\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const { openInCurationStudioLabel, isUserCurator, getOpenInCurationStudioLink } = useCurationStudio();\n\n const customer = Flight.useBasicFetch<Customer>(\n hasPermissions(PermissionName.CanSubmitFeedback) &&\n currentUser.data &&\n CustomerRequests.customer(currentUser.data.customerId)\n );\n\n const classification = Flight.useBasicFetch<Classification>(\n ClassificationRequests.classification(props.id, currentUser.data?.id)\n );\n\n const presentation = Flight.useBasicFetch<Presentation>(\n classification.data &&\n ClassificationRequests.presentationById(classification.data.presentationId)\n );\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n classification.data &&\n AudienceRequests.audiencesByPresentationId(classification.data.presentationId)\n );\n\n const specialEvent = Flight.useBasicFetch<CalendarEvent>(\n classification.data &&\n CalendarRequests.nextTopicSpecialEvent(props.id, classification.data.presentationId)\n );\n\n const {\n activePresentation,\n availablePresentations,\n canAccessPresentation\n } = usePresentation();\n\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const path = Flight.useBasicFetch<Classification[]>(ClassificationRequests.path(props.id));\n\n const {\n dashboard,\n canViewDirectory,\n isPreviewing,\n isTeacherOnly\n } = useFetchClassificationDashboard(props.id, props.queryParams, props.targetType);\n\n const regionAlternatives = Flight.useBasicFetch<RegionAlternative[]>(\n ClassificationRequests.regionAlternatives(props.id)\n );\n\n useSetPageMetadata(PageMetadataHelper.getClassificationMetadata({\n content: classification.data,\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n },\n canonicalLink: SeoHelper.getCanonicalLink({ stripPresentationSlug: true }),\n allowIndexing: SeoHelper.allowIndexing(),\n hrefLang: SeoHelper.getContentHrefLang(regionAlternatives.data, (id: string, name: string) => ({\n application: AppChannels.SUBJECT,\n action: Actions.Subjects.CLASSIFICATION,\n args: [ id, TextHelper.slugify(name) ]\n }))\n }));\n\n useHandleObjectError(classification, {\n notFound: TopicNotFoundError\n });\n useDeepLinks({ id: props.id, app: 'topics' });\n\n const isViewCurrentPresentation = activePresentation?.id === presentation.data?.id;\n \n const isSmallScreen = useMediaQuery(MediaQueryStrings.MDDown);\n const isMobile = useMediaQuery(MediaQueryStrings.SMDown);\n\n const { setFavourite, canFavourite } = useLiteFavourites(LocationContext.ExpandableVideoThumbnail);\n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n\n const canFollowSubjects = hasPermissions(PermissionName.FollowSubjects);\n const isComingSoon = (\n classification.data?.status === ClassificationStatus.ComingSoon &&\n !isPreviewing\n );\n\n /**\n * We use the current active audiences to re-fetch content for that specific audience set.\n */\n const activeAudiences = AudienceHelper.getActiveAudiencesFromParams(audiences.data, props.queryParams);\n const activeAudienceIds = activeAudiences?.map(a => a.masterId) ?? [];\n\n /**\n * Following\n */\n function onToggleFollow(followedClassification: Classification, location: LocationContext) {\n if (!canFollowSubjects || !classification)\n return;\n\n const isTogglingCurrentTopic = followedClassification.id.toString() === classification.data?.id?.toString();\n\n if (isTogglingCurrentTopic)\n setShowFollowButtonSpinner(true);\n\n const isFollowing = TopicsHelper.isFollowing(followedClassification);\n\n const request = isFollowing\n ? FollowRequests.unfollow\n : FollowRequests.follow;\n\n fetchAsync(request([followedClassification.id]))\n .then(() => {\n AnalyticsHelper.logUserAction(analyticsData, {\n location,\n actionType: UserAction.Follow,\n workflowPhase: WorkflowPhase.Complete,\n descriptor: isFollowing ? ToggleDescriptor.Off : ToggleDescriptor.On,\n entity: EntityType.Classification\n });\n\n if (!isTogglingCurrentTopic) {\n alerts.success(getPhrase(isFollowing ? 'unfollowed' : 'followed', { name: followedClassification.name }));\n }\n })\n .finally(() => {\n if (isTogglingCurrentTopic)\n setShowFollowButtonSpinner(false);\n });\n }\n\n async function onSubmitFeedback(feedback: DashboardFeedbackData): Promise<void> {\n const promise = await fetchAsync<void>(FeedbackRequests.submitFeedback({\n type: FeedbackType.Footer,\n user: FeedbackFormHelper.getUserInfo(currentUser.data, customer.data),\n tags: FeedbackFormHelper.getTags(\n currentUser.data,\n ProductId.Primary,\n hasPermissions(PermissionName.StudentExperience),\n [ 'topics', 'in product feedback' ]\n )\n }, {\n reaction: feedback.type,\n feedback: feedback.content,\n location: 'Topic Footer',\n presentationName: presentation.data.description,\n presentationId: presentation.data.id,\n dashboardName: dashboard.data.name,\n dashboardId: dashboard.data.id,\n classificationName: classification.data.name,\n classificationId: classification.data.id\n }));\n\n AnalyticsHelper.logUserAction({\n feedbackType: feedback.type,\n content: feedback.content,\n presentationId: presentation.data.id,\n classificationId: classification.data.id,\n dashboardId: dashboard.data.id\n }, {\n actionType: UserAction.Submit,\n location: LocationContext.ClassificationFooter,\n entity: EntityType.Feedback,\n workflowPhase: WorkflowPhase.Complete\n });\n\n return promise;\n }\n\n function getBannerActions(): ActionOptions[] {\n const isFollowing = !!classification.data?.followers?.data?.length;\n\n if (!canFollowSubjects || isComingSoon)\n return [];\n\n const actions: ActionOptions[] = [{\n label: isMobile ? '' : getPhrase(isFollowing ? 'unfollow' : 'follow'),\n onClick: () => onToggleFollow(classification.data, LocationContext.Banner),\n svgName: isFollowing ? cvSvgLibrary.Check : cvSvgLibrary.Bell,\n className: `btn follow-btn me-2 ${isFollowing ? 'btn-outline-dark' : 'btn-dark'} ${styles.followButton}`,\n button: true,\n tooltip: (isFollowing || isSmallScreen) ? undefined : getPhrase('followBtnTooltip'),\n showSpinner: showFollowButtonSpinner\n }];\n\n if (isUserCurator)\n actions.push({\n label: openInCurationStudioLabel,\n href: getOpenInCurationStudioLink(MasterType.Subject, classification.data?.id, presentation.data?.id),\n openInNewTab: true\n });\n \n return actions;\n }\n\n const appLinks = getClassificationAppLinks(classification.data, props.queryParams);\n\n function getBreadcrumbs(): () => Breadcrumb[] {\n if (!canAccessPresentation(presentation.data?.id))\n return;\n\n return () => getClassificationBreadcrumbs({\n appLinks: appLinks,\n availablePresentations,\n classification: classification.data,\n path: path.data,\n presentation: presentation.data,\n queryParams: props.queryParams\n });\n }\n \n /**\n * Additional topics data to be mixed in with lower-level component analytics collection\n */\n const analyticsData = {\n presentationId: presentation.data?.id,\n presentationName: presentation.data?.name,\n currentClassificationId: classification.data?.id,\n currentClassificationName: classification.data?.name,\n followingCurrentClassification: !!classification.data?.followers?.data?.length,\n activeAudienceNames: activeAudiences?.length ? activeAudiences.map(a => a.name) : null,\n activeAudienceIds: activeAudienceIds.length ? activeAudienceIds : null\n };\n\n const dataLoaded = !!config.data\n && dashboard.hasCompleted\n && !!classification.data\n && !!presentation.data\n && !!path.data\n && !!availablePresentations\n && !!audiences.data\n && specialEvent.hasCompleted;\n\n if (!dataLoaded)\n return <PartialClassificationDashboard />;\n\n return (\n <VideoActionsContext.Provider value={videoActions}>\n <div className='position-relative'>\n {!!(isPreviewing && dashboard.data) && <PreviewBanner status={dashboard.data.status} type='topic' />}\n <ClassificationDashboard\n dashboard={dashboard.data}\n classification={classification.data}\n getWidgetContentRequest={DashboardRequests.dashboardWidgetContent}\n getBreadcrumbs={getBreadcrumbs()}\n hasPermissions={hasPermissions}\n hasLocalPermissions={hasLocalPermissions}\n presentation={presentation.data}\n onToggleFollow={onToggleFollow}\n getBannerActions={getBannerActions}\n audiences={props.queryParams.mtv ? null : audiences.data}\n activeAudiences={activeAudiences}\n analyticsData={analyticsData}\n imageCdnUrl={config.data.imageCdnUrl}\n resourceThumbnailFallbackImageUrl={ImageUrls.Fallbacks.RESOURCE_THUMBNAIL}\n emptyImageUrl={isTeacherOnly ? ImageUrls.EmptyStates.Topics.TEACHER_ONLY : ImageUrls.EmptyStates.Topics.TOPIC}\n isComingSoon={isComingSoon}\n showFollowButtonSpinner={showFollowButtonSpinner}\n comingSoonImageUrl={ImageUrls.EmptyStates.Topics.COMING_SOON}\n appLinks={appLinks}\n isPreviewing={isPreviewing}\n setFavourite={setFavourite}\n canFavourite={canFavourite}\n isViewCurrentPresentation={isViewCurrentPresentation}\n canFollowSubjects={canFollowSubjects}\n onSubmitFeedback={\n hasPermissions(PermissionName.CanSubmitFeedback) &&\n onSubmitFeedback\n }\n tableOfContentsId={props.queryParams.tocId}\n yearGroups={yearGroups.data}\n lazyLoad={!SeoHelper.isBot()}\n moviesAndTv={props.queryParams.mtv}\n isTeacherOnly={isTeacherOnly}\n specialEvent={specialEvent.data}\n isBot={SeoHelper.isBot()}\n canViewDirectory={canViewDirectory}\n tab={props.targetType === DashboardTargetType.Classification ? 'new-releases' : 'all-topics'}\n // just... one... more.. prop....\n isPlugin={isPlugin}\n />\n </div>\n </VideoActionsContext.Provider>\n );\n}\n","import { useSettings } from 'libs/shared/hooks/useSettings';\nimport { DashboardTargetType } from 'libs/shared/interfaces';\n\nimport { useFetchCuratedDashboard } from 'shared/utils/DashboardHelper';\n\nimport { ClassificationViewQueryParams } from '../views/classification/ClassificationViewUtils';\n\nexport function useFetchClassificationDashboard(\n id: string,\n queryParams: ClassificationViewQueryParams,\n targetType: DashboardTargetType\n) {\n const { hasTopicDirectories } = useSettings(null);\n\n const {\n dashboard: curatedTopicDashboard,\n isPreviewing,\n isTeacherOnly\n } = useFetchCuratedDashboard({\n classificationId: id,\n queryParams: queryParams,\n targetType: DashboardTargetType.Classification\n });\n\n const { dashboard: directoryDashboard } = useFetchCuratedDashboard({\n classificationId: id,\n queryParams: queryParams,\n targetType: DashboardTargetType.ClassificationDirectory\n });\n\n return {\n dashboard: targetType === DashboardTargetType.Classification ? curatedTopicDashboard : directoryDashboard,\n canViewDirectory: hasTopicDirectories && !!directoryDashboard.data,\n isTeacherOnly,\n isPreviewing\n };\n}","// extracted by mini-css-extract-plugin\nexport default {\"pillTabSelector\":\"Hdi6o\",\"tab\":\"RvNxr\",\"minWidth\":\"GHSz9\",\"radiusSmall\":\"VhJJa\",\"tabLink\":\"WFyvo\"};"],"names":["PortalHelper","renderInPortalIfExists","component","portalContainer","createPortal","CalendarRequests","calendarEvents","from","to","presentationId","url","publicUrl","key","nextTopicSpecialEvent","classificationId","params","limit","Date","objectType","formatData","events","AudienceItem","props","audience","highlight","setAudience","isDisabled","extraClasses","colourClass","getColourClass","className","onClick","FunctionHelper","role","name","split","map","s","charAt","toUpperCase","substring","join","defaultProps","DashboardStatusConfig","Dashboard","svgName","svgColorClassName","actionName","statusName","getClassName","status","darkMode","wrapperClassName","DashboardStatusBadge","SvgContainer","getPhrase","LanguageService","PreviewBanner","EmojiText","emoji","type","pdfExtensions","docExtensions","textExtensions","excelExtensions","imageExtensions","videoMimeType","archiveExtensions","powerPointExtensions","subtitleExtensions","FileExtensions","IMAGES","VIDEO","MIXED_MEDIA","RESOURCES","SUBTITLES","FileExtensionHelper","getResourceType","extension","ext","toLowerCase","namespace","BackButton","textShadow","backToName","appLink","color","backPhrase","colorClass","textShadowClass","AppLink","size","S","RATIO","width","height","getSizeClass","heading","length","BannerHeader","banner","imageCdnUrl","actions","sortComponent","blockColourClass","specialEvent","portalContainerContext","BannerPortalContext","imageWidth","useBreakpoints","xxl","specialEventIsToday","showComingSoon","today","DateHelper","endDate","startDate","imageOptions","ratio","resizeType","ImageHelper","fallbackBaseUrl","fallbackCategoryName","containerProps","bannerClassName","style","backgroundImage","DetailsComponent","detailsComponent","backButtonAppLink","backButtonText","backButtonClasses","alignLogoLeft","logo","GenericCalendarDate","body","text","month","theme","calendarTheme","Text","phrase","ComingSoonTag","LazyImage","src","Actions","actionsDropdownClassName","container","prevProps","nextProps","PartialBannerHeader","BreadcrumbItem","breadcrumb","active","withBackIcon","Breadcrumbs","breadcrumbs","isMobile","b","idx","PartialBreadcrumbs","numItems","dangerouslySetInnerHTML","__html","TabContents","tab","count","data","PillTabSelector","borderRadius","listClassName","tabs","index","analyticsData","analyticsOptions","onSelect","onSelectTab","TableOfContentsList","actionType","entity","location","items","item","localState","DivButton","id","activeId","ScrollHelper","setControlledId","AnalyticsHelper","logUserEvent","getAppLink","appLinkOptions","replace","FeedbackType","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","handleHttpError","info","customErrorMap","ignoreMap","statusCode","errorMap","FeedbackRequests","submitFeedback","requestData","formValues","endpoints","ids","FollowRequests","follow","success","error","invalidationKeys","unfollow","generateCacheKey","flightObjs","obj","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","Array","isArray","useEffect","forEach","usePrevious","value","ref","current","timer","useTableOfContentsActiveHeading","setActiveId","headingElements","controlledId","scrollPositionRef","observer","IntersectionObserver","headings","window","setTimeout","isIntersecting","target","scrollY","isScrollingUp","curIndex","findIndex","h","prevHeading","rootMargin","element","observe","clearTimeout","disconnect","useTableOfContentsScroll","elements","hasDoneInitialScroll","setHasDoneInitialScroll","previousId","currentId","find","rec","getBoundingClientRect","scrollBy","top","behavior","FeedbackFormHelper","getUserInfo","currentUser","customer","username","email","userType","customerId","cvcId","crmId","customerName","instanceRegion","contentRegion","mapInstanceRegionToTag","getTags","product","hasStudentExperience","extraTags","tags","push","regionTag","categorizeFiles","files","reduce","result","file","fileInfo","get","videoUrls","imageUrls","getClassificationAppLink","classification","application","action","args","getAllTopicsAppLink","CuratedClassificationEmptyState","isArchived","dashboard","EmptyState","imageUrl","altText","isReadonly","Tooltip","title","spanHack","addWidgetApplink","icon","disabled","TableOfContents","widgets","widget","currentAppLink","tocId","TeacherOnlyEmptyState","ctaAppLink","ClassificationComingSoon","isFollowing","followers","canFollowSubjects","ActionButton","onToggleFollow","showSpinner","showFollowButtonSpinner","AudienceFilter","audiences","activeAudiences","setActiveAudiences","SharedViewModelKeys","undefined","storage","onToggleAudience","isSelected","otherParams","activeAudienceNames","a","filter","ObjectHelper","Object","assign","disablePersist","masterId","aa","keys","PARTIAL_AUDIENCES","PartialLoadingHelper","PartialAudienceFilter","ClassificationDashboardAudiences","ClassificationTabs","breakpoints","showText","lg","xl","xs","appLinks","activeTab","classificationName","presentation","presentationDescription","description","classificationTopics","ClassificationDashboardNav","isEmpty","hideAudiences","isComingSoon","AudienceHelper","canViewDirectory","getTopRowClass","getBreadcrumbs","getBottomRowClass","isViewingCurrentPresentation","isHeadingWidget","widgetId","WidgetTypeId","templateId","WidgetTemplate","ClassificationDashboard","isSystemGeneratedDashboard","systemGeneratedVideoWidget","systemGeneratedVideoContent","DashboardRequests","videoList","content","videoListWidgetId","useGetTopicsWidgets","isSmallScreen","headingRef","Set","initialEmptyWidgets","acc","emptyWidgets","setEmptyWidgets","hash","slice","tableOfContentActiveId","setTableOfContentActiveId","getWidgetContentRequest","widgetTypeId","template","tableOfContentsId","showEmptyState","isTeacherOnly","isPreviewing","values","every","state","onSetIsEmpty","newEmptyState","currentWidget","isHeadingEmpty","subWidgetIndex","headingSubWidget","hideWidget","widgetsInTableOfContents","w","metadata","showInTableOfContents","shouldShowTableOfContents","moviesAndTv","getBannerActions","background","border","isViewCurrentPresentation","comingSoonImageUrl","WidgetContainerView","headingElementRef","getContentRequest","setIsEmpty","setFavourite","canFavourite","yearGroups","isScrollToTargetWidget","scrollToWidgetId","onSubmitFeedback","isBot","hasTableOfContents","lazyLoad","dashboardTarget","widgetIndex","hasPermissions","hasLocalPermissions","companyLogoFallbackUrl","subTextType","contentType","resourceThumbnailFallbackImageUrl","preferences","onToggleFollowClassification","isPlugin","clickable","WidgetHeader","VideoList","videos","getVideoAppLink","v","opts","videoType","contextId","getSubTextAppLink","subText","presentationAudiences","getPreviewQuestionsAppLink","previewQuestions","getClassroomGuideAppLink","classroomGuide","getInteractiveGuidanceAppLink","interactiveGuidance","getResourceGuidanceAppLink","resourceGuidance","emptyImageUrl","widgetWizard","allTopics","PartialClassificationDashboard","TopicNotFoundError","ErrorPageError","CuratedClassificationView","queryParams","setShowFollowButtonSpinner","alerts","fetchAsync","usePermissions","usePluginHelper","config","ConfigRequests","UserRequests","useCurationStudio","openInCurationStudioLabel","isUserCurator","getOpenInCurationStudioLink","PermissionName","CustomerRequests","ClassificationRequests","AudienceRequests","usePresentation","activePresentation","availablePresentations","canAccessPresentation","isAuthenticated","path","targetType","hasTopicDirectories","useSettings","curatedTopicDashboard","directoryDashboard","useFetchClassificationDashboard","regionAlternatives","useSetPageMetadata","PageMetadataHelper","phraseContext","phraseHandler","titlePhrase","descriptionPhrase","canonicalLink","SeoHelper","stripPresentationSlug","allowIndexing","hrefLang","TextHelper","useDeepLinks","app","useLiteFavourites","u","videoActions","useVideoActions","ClassificationStatus","activeAudienceIds","followedClassification","isTogglingCurrentTopic","toString","TopicsHelper","request","then","workflowPhase","descriptor","_classification","appLinkClassification","video","VideoAppLinkHelper","context","RelatedVideosContext","mtv","series","SeriesAppLinkHelper","playlist","resource","videoId","canViewResources","presentationName","currentClassificationId","currentClassificationName","followingCurrentClassification","hasCompleted","VideoActionsContext","options","getClassificationBreadcrumbs","label","button","tooltip","href","MasterType","openInNewTab","ImageUrls","feedback","user","ProductId","reaction","dashboardName","dashboardId","promise","feedbackType"],"sourceRoot":""}