@clickview/exchange 0.62.0-rc.0 → 0.62.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.vite/manifest.json +549 -549
- package/dist/bundles.json +1 -1
- package/dist/css/Crtlho0p.chunk.css +8 -0
- package/dist/en.json +1 -1
- package/dist/scripts/{Dg-h5qnR.chunk.js → 0uwnPAi2.chunk.js} +2 -2
- package/dist/scripts/{Dg-h5qnR.chunk.js.map → 0uwnPAi2.chunk.js.map} +1 -1
- package/dist/scripts/{CgGl8jzo.chunk.js → 6f-CHYL3.chunk.js} +2 -2
- package/dist/scripts/{CgGl8jzo.chunk.js.map → 6f-CHYL3.chunk.js.map} +1 -1
- package/dist/scripts/{CkH6ird3.chunk.js → B09qwiFG.chunk.js} +2 -2
- package/dist/scripts/{CkH6ird3.chunk.js.map → B09qwiFG.chunk.js.map} +1 -1
- package/dist/scripts/{BRQhDr-02.chunk.js → B0uOvqjG2.chunk.js} +2 -2
- package/dist/scripts/{BRQhDr-02.chunk.js.map → B0uOvqjG2.chunk.js.map} +1 -1
- package/dist/scripts/{ZSP3Vfha2.chunk.js → B8BobN3r2.chunk.js} +2 -2
- package/dist/scripts/{ZSP3Vfha2.chunk.js.map → B8BobN3r2.chunk.js.map} +1 -1
- package/dist/scripts/{BHKm8WQq2.chunk.js → B8wHzPHI2.chunk.js} +2 -2
- package/dist/scripts/{BHKm8WQq2.chunk.js.map → B8wHzPHI2.chunk.js.map} +1 -1
- package/dist/scripts/{CeCXhgoJ.chunk.js → BAIdKirt.chunk.js} +2 -2
- package/dist/scripts/{CeCXhgoJ.chunk.js.map → BAIdKirt.chunk.js.map} +1 -1
- package/dist/scripts/{Ct8ETEOn2.chunk.js → BAwP70HI2.chunk.js} +2 -2
- package/dist/scripts/{Ct8ETEOn2.chunk.js.map → BAwP70HI2.chunk.js.map} +1 -1
- package/dist/scripts/{YGLkoFLc.chunk.js → BEv09vqz.chunk.js} +2 -2
- package/dist/scripts/{YGLkoFLc.chunk.js.map → BEv09vqz.chunk.js.map} +1 -1
- package/dist/scripts/{uPFXIvcK2.chunk.js → BLs3APIS2.chunk.js} +2 -2
- package/dist/scripts/{uPFXIvcK2.chunk.js.map → BLs3APIS2.chunk.js.map} +1 -1
- package/dist/scripts/{D9zlZIWi2.chunk.js → BP0LMV9S2.chunk.js} +2 -2
- package/dist/scripts/{D9zlZIWi2.chunk.js.map → BP0LMV9S2.chunk.js.map} +1 -1
- package/dist/scripts/{CqNKzFA4.chunk.js → BPttZx0-.chunk.js} +2 -2
- package/dist/scripts/{CqNKzFA4.chunk.js.map → BPttZx0-.chunk.js.map} +1 -1
- package/dist/scripts/{B9Rb6IIb.chunk.js → BQk9Mhlr.chunk.js} +2 -2
- package/dist/scripts/{B9Rb6IIb.chunk.js.map → BQk9Mhlr.chunk.js.map} +1 -1
- package/dist/scripts/{CYUx40jk.chunk.js → BXIfsdxg.chunk.js} +2 -2
- package/dist/scripts/{CYUx40jk.chunk.js.map → BXIfsdxg.chunk.js.map} +1 -1
- package/dist/scripts/{CvQQNf_J2.chunk.js → B_P4D3Hf2.chunk.js} +2 -2
- package/dist/scripts/{CvQQNf_J2.chunk.js.map → B_P4D3Hf2.chunk.js.map} +1 -1
- package/dist/scripts/{Dp0gbhZx2.chunk.js → BgskDBpT2.chunk.js} +2 -2
- package/dist/scripts/{Dp0gbhZx2.chunk.js.map → BgskDBpT2.chunk.js.map} +1 -1
- package/dist/scripts/{Nx0q4bij.chunk.js → BhOZYAZn.chunk.js} +2 -2
- package/dist/scripts/{Nx0q4bij.chunk.js.map → BhOZYAZn.chunk.js.map} +1 -1
- package/dist/scripts/{CKrB9r9w.chunk.js → Bn9ROglk.chunk.js} +2 -2
- package/dist/scripts/{CKrB9r9w.chunk.js.map → Bn9ROglk.chunk.js.map} +1 -1
- package/dist/scripts/{Ds3cFntF2.chunk.js → Bo8PhXY12.chunk.js} +3 -3
- package/dist/scripts/{Ds3cFntF2.chunk.js.map → Bo8PhXY12.chunk.js.map} +1 -1
- package/dist/scripts/{Fu0bLEzl2.chunk.js → BrVyRSUS2.chunk.js} +2 -2
- package/dist/scripts/{Fu0bLEzl2.chunk.js.map → BrVyRSUS2.chunk.js.map} +1 -1
- package/dist/scripts/{CeHHO1Hv.chunk.js → BxLgTmMl.chunk.js} +2 -2
- package/dist/scripts/{CeHHO1Hv.chunk.js.map → BxLgTmMl.chunk.js.map} +1 -1
- package/dist/scripts/{BPgKK-d32.chunk.js → Bxsu4S752.chunk.js} +2 -2
- package/dist/scripts/{BPgKK-d32.chunk.js.map → Bxsu4S752.chunk.js.map} +1 -1
- package/dist/scripts/{B0VKYPiu.chunk.js → C-PORBUs.chunk.js} +2 -2
- package/dist/scripts/{B0VKYPiu.chunk.js.map → C-PORBUs.chunk.js.map} +1 -1
- package/dist/scripts/{RiPZGw_q2.chunk.js → C1StI3Bl2.chunk.js} +2 -2
- package/dist/scripts/{RiPZGw_q2.chunk.js.map → C1StI3Bl2.chunk.js.map} +1 -1
- package/dist/scripts/{DoTtsl0X.chunk.js → C6Hr-vqw.chunk.js} +2 -2
- package/dist/scripts/{DoTtsl0X.chunk.js.map → C6Hr-vqw.chunk.js.map} +1 -1
- package/dist/scripts/{UjMbny4R.chunk.js → CBnNAkzx.chunk.js} +2 -2
- package/dist/scripts/{UjMbny4R.chunk.js.map → CBnNAkzx.chunk.js.map} +1 -1
- package/dist/scripts/{DyRGf1o8.chunk.js → CFkqPGiT.chunk.js} +2 -2
- package/dist/scripts/{DyRGf1o8.chunk.js.map → CFkqPGiT.chunk.js.map} +1 -1
- package/dist/scripts/{Xs1Bv1h-.chunk.js → CKD2j1rw.chunk.js} +2 -2
- package/dist/scripts/{Xs1Bv1h-.chunk.js.map → CKD2j1rw.chunk.js.map} +1 -1
- package/dist/scripts/{aDegERgV2.chunk.js → CSKzCsLv2.chunk.js} +2 -2
- package/dist/scripts/{aDegERgV2.chunk.js.map → CSKzCsLv2.chunk.js.map} +1 -1
- package/dist/scripts/{DVVx1aiS2.chunk.js → CZgaUoHE2.chunk.js} +2 -2
- package/dist/scripts/{DVVx1aiS2.chunk.js.map → CZgaUoHE2.chunk.js.map} +1 -1
- package/dist/scripts/{B6mSouu5.chunk.js → C_7tv1r9.chunk.js} +2 -2
- package/dist/scripts/{B6mSouu5.chunk.js.map → C_7tv1r9.chunk.js.map} +1 -1
- package/dist/scripts/{DtYC8Udi2.chunk.js → C_jUsStb2.chunk.js} +2 -2
- package/dist/scripts/{DtYC8Udi2.chunk.js.map → C_jUsStb2.chunk.js.map} +1 -1
- package/dist/scripts/{BOvQpQ21.chunk.js → CdNTKjPA.chunk.js} +2 -2
- package/dist/scripts/{BOvQpQ21.chunk.js.map → CdNTKjPA.chunk.js.map} +1 -1
- package/dist/scripts/{C7OCN_w_.chunk.js → ChDwbV8F.chunk.js} +2 -2
- package/dist/scripts/{C7OCN_w_.chunk.js.map → ChDwbV8F.chunk.js.map} +1 -1
- package/dist/scripts/{CKUk2HqE.chunk.js → Cq-TpkxJ.chunk.js} +2 -2
- package/dist/scripts/{CKUk2HqE.chunk.js.map → Cq-TpkxJ.chunk.js.map} +1 -1
- package/dist/scripts/{o2htB_49.chunk.js → CrCX606H.chunk.js} +2 -2
- package/dist/scripts/{o2htB_49.chunk.js.map → CrCX606H.chunk.js.map} +1 -1
- package/dist/scripts/{D0H6Hjd-2.chunk.js → CrDpB82d2.chunk.js} +2 -2
- package/dist/scripts/{D0H6Hjd-2.chunk.js.map → CrDpB82d2.chunk.js.map} +1 -1
- package/dist/scripts/{DBKlntFN2.chunk.js → Czivka682.chunk.js} +2 -2
- package/dist/scripts/{DBKlntFN2.chunk.js.map → Czivka682.chunk.js.map} +1 -1
- package/dist/scripts/{eLmgigsW.chunk.js → DEP_Z-S0.chunk.js} +2 -2
- package/dist/scripts/{eLmgigsW.chunk.js.map → DEP_Z-S0.chunk.js.map} +1 -1
- package/dist/scripts/{cIPkkuhG.chunk.js → DQBoqkL7.chunk.js} +2 -2
- package/dist/scripts/{cIPkkuhG.chunk.js.map → DQBoqkL7.chunk.js.map} +1 -1
- package/dist/scripts/{BV2vTX2L.chunk.js → DeXP2wHV.chunk.js} +2 -2
- package/dist/scripts/{BV2vTX2L.chunk.js.map → DeXP2wHV.chunk.js.map} +1 -1
- package/dist/scripts/{C1u2qBZg2.chunk.js → Df82DFJ62.chunk.js} +2 -2
- package/dist/scripts/{C1u2qBZg2.chunk.js.map → Df82DFJ62.chunk.js.map} +1 -1
- package/dist/scripts/{Co_6cSBX2.chunk.js → DgrEIxhT2.chunk.js} +2 -2
- package/dist/scripts/{Co_6cSBX2.chunk.js.map → DgrEIxhT2.chunk.js.map} +1 -1
- package/dist/scripts/{CRHkMr9_2.chunk.js → DhT0tpZm2.chunk.js} +2 -2
- package/dist/scripts/{CRHkMr9_2.chunk.js.map → DhT0tpZm2.chunk.js.map} +1 -1
- package/dist/scripts/{CUdaR862.chunk.js → Dhe09-jE.chunk.js} +2 -2
- package/dist/scripts/{CUdaR862.chunk.js.map → Dhe09-jE.chunk.js.map} +1 -1
- package/dist/scripts/{BijIuzIs2.chunk.js → DhtgaF-y2.chunk.js} +2 -2
- package/dist/scripts/{BijIuzIs2.chunk.js.map → DhtgaF-y2.chunk.js.map} +1 -1
- package/dist/scripts/{BsSKrRku2.chunk.js → Div1wl-R2.chunk.js} +2 -2
- package/dist/scripts/{BsSKrRku2.chunk.js.map → Div1wl-R2.chunk.js.map} +1 -1
- package/dist/scripts/{CKNdXwxe2.chunk.js → DjuXXgD-2.chunk.js} +2 -2
- package/dist/scripts/{CKNdXwxe2.chunk.js.map → DjuXXgD-2.chunk.js.map} +1 -1
- package/dist/scripts/{DBJfKQKx.chunk.js → Dkazht4Q.chunk.js} +2 -2
- package/dist/scripts/{DBJfKQKx.chunk.js.map → Dkazht4Q.chunk.js.map} +1 -1
- package/dist/scripts/{D5qMnGHT2.chunk.js → DmmZ2XbB2.chunk.js} +2 -2
- package/dist/scripts/{D5qMnGHT2.chunk.js.map → DmmZ2XbB2.chunk.js.map} +1 -1
- package/dist/scripts/{CWsmm40y.chunk.js → Dr35AMvf.chunk.js} +2 -2
- package/dist/scripts/{CWsmm40y.chunk.js.map → Dr35AMvf.chunk.js.map} +1 -1
- package/dist/scripts/{CyAM5o2e.chunk.js → HgLS_KfH.chunk.js} +2 -2
- package/dist/scripts/{CyAM5o2e.chunk.js.map → HgLS_KfH.chunk.js.map} +1 -1
- package/dist/scripts/{zp5MUThO.chunk.js → W8Q7Z6fd.chunk.js} +2 -2
- package/dist/scripts/{zp5MUThO.chunk.js.map → W8Q7Z6fd.chunk.js.map} +1 -1
- package/dist/scripts/{NInuYe7b2.chunk.js → XWykPl9h2.chunk.js} +2 -2
- package/dist/scripts/{NInuYe7b2.chunk.js.map → XWykPl9h2.chunk.js.map} +1 -1
- package/dist/scripts/{BggsU83p2.chunk.js → _3n_0ch72.chunk.js} +2 -2
- package/dist/scripts/{BggsU83p2.chunk.js.map → _3n_0ch72.chunk.js.map} +1 -1
- package/dist/scripts/{app-DDrsm5nt.js → app-CgkYY4K0.js} +3 -3
- package/dist/scripts/app-CgkYY4K0.js.map +1 -0
- package/dist/scripts/{DeevL6eQ.chunk.js → go6zFmPK.chunk.js} +2 -2
- package/dist/scripts/{DeevL6eQ.chunk.js.map → go6zFmPK.chunk.js.map} +1 -1
- package/dist/scripts/{BJxTZJOX.chunk.js → p5-1Ey-R.chunk.js} +2 -2
- package/dist/scripts/{BJxTZJOX.chunk.js.map → p5-1Ey-R.chunk.js.map} +1 -1
- package/dist/scripts/{B0hNKKDw2.chunk.js → qrcrWbQJ2.chunk.js} +2 -2
- package/dist/scripts/{B0hNKKDw2.chunk.js.map → qrcrWbQJ2.chunk.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/app-DDrsm5nt.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"D5qMnGHT2.chunk.js","names":["en_US","zh_CN"],"sources":["../../../../libs/shared/src/components/widgets/items/subject-widget-item/cover-pill.module.scss","../../../../libs/shared/src/components/widgets/items/subject-widget-item/CoverPill.tsx","../../../../libs/shared/src/components/widgets/items/subject-widget-item/CompanyWidgetItem.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/CompanyResult.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/mixed-search-results.module.scss","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/exchange-video-group/ExchangeVideoGroup.tsx","../../../../libs/shared/src/apps/subjects/components/hero-video/hero-video.module.scss","../../../../libs/shared/src/apps/subjects/components/hero-video/HeroVideo.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/FeaturedVideoResult.tsx","../../../../libs/shared/src/apps/playlists/components/playlist-list/playlist.module.scss","../../../../libs/shared/src/apps/playlists/components/playlist-list/PartialPlaylistList.tsx","../../../../../node_modules/timeago.js/esm/lang/en_US.js","../../../../../node_modules/timeago.js/esm/lang/zh_CN.js","../../../../../node_modules/timeago.js/esm/register.js","../../../../../node_modules/timeago.js/esm/utils/date.js","../../../../../node_modules/timeago.js/esm/format.js","../../../../../node_modules/timeago.js/esm/index.js","../../../../libs/shared/src/apps/playlists/components/playlist-count/PlaylistCount.tsx","../../../../libs/shared/src/components/clickview-avatar/clickview-avatar.module.scss","../../../../libs/shared/src/components/clickview-avatar/ClickViewAvatar.tsx","../../../../libs/shared/src/apps/playlists/components/playlist-list/PlaylistOwnerAvatar.tsx","../../../../libs/shared/src/apps/playlists/components/playlist-list/PlaylistItem.tsx","../../../../libs/shared/src/apps/playlists/components/playlist-list/PlaylistList.tsx","../../../../libs/shared/src/apps/search/components/playlist-with-videos/playlist-with-videos.module.scss","../../../../libs/shared/src/apps/search/components/playlist-with-videos/PlaylistWithVideos.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/LargePlaylistResults.tsx","../../../../libs/shared/src/components/series-tall-poster/series-tall-poster.module.scss","../../../../libs/shared/src/components/series-tall-poster/SeriesTallPoster.tsx","../../../../libs/shared/src/apps/search/components/series-with-videos/series-with-videos.module.scss","../../../../libs/shared/src/apps/search/components/series-with-videos/SeriesWithVideos.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/LargeSeriesResult.tsx","../../../../libs/shared/src/apps/search/components/collection-video-list/CollectionVideoList.tsx","../../../../libs/shared/src/apps/search/components/collection-thumbnail/collection-thumbnail.module.scss","../../../../libs/shared/src/apps/search/components/collection-thumbnail/CollectionThumbnail.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/SmallPlaylistResult.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/SmallSeriesResults.tsx","../../../../libs/shared/src/enums/ClassificationStatus.ts","../../../../libs/shared/src/components/widgets/items/subject-widget-item/SubjectWidgetItem.tsx","../../../../libs/shared/src/components/widgets/items/subject-widget-item/EditSubjectsWidgetLink.tsx","../../../../libs/shared/src/components/widgets/items/subject-widget-item/AllSubjectsWidgetLink.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/SubjectResult.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/VideoResult.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/MixedSearchResults.tsx","../../../../libs/shared/src/apps/search/components/search-substitute/SearchSubstitute.tsx","../../../../libs/shared/src/apps/search/components/search-suggestions/SearchSuggestions.tsx","../../src/apps/exchange/views/exchange-search-results/ExchangeSearchUtils.ts","../../src/apps/exchange/views/exchange-search-results/empty-state/ExchangeSearchEmptyState.tsx","../../src/apps/exchange/views/exchange-search-results/useFetchSearchData.ts","../../src/apps/exchange/views/exchange-search-results/useGetSearchResults.ts","../../../../libs/shared/src/apps/search/constants/SearchOGQL.ts","../../../../libs/shared/src/apps/search/flight-requests/SharedSearchRequests.ts","../../src/apps/exchange/views/exchange-search-results/useGetTagsAndClassifications.ts","../../src/apps/exchange/views/exchange-search-results/ExchangeSearchResultsView.tsx"],"sourcesContent":["@import '~styles/utils/include-media';\n:local {\n $classification-cover-height: 5rem; // 80px\n $classification-cover-height-lg: 8rem; // 128px\n\n .appLink:hover {\n text-decoration: none;\n\n .name {\n text-decoration: underline;\n }\n }\n\n .selectedMask {\n background-color: rgba($green, 0.1);\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n\n .widgetItem {\n border-radius: $border-radius-lg;\n overflow: hidden;\n \n &.hasThemeColor {\n border: 0.0625rem solid var(--themeColor);\n background-color: color-mix(in srgb, var(--themeColor) 10%, white);\n &:hover {\n background-color: color-mix(in srgb, var(--themeColor) 15%, white);\n }\n }\n\n .text {\n font-size: $font-size-base;\n }\n\n .imagePanel {\n position: relative;\n background-position: top;\n background-size: cover;\n width: $classification-cover-height;\n height: $classification-cover-height;\n flex-shrink: 0;\n\n .selected {\n width: 2.5rem;\n height: 2.5rem;\n position: absolute;\n top: 50%;\n z-index: 5;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n\n .image {\n z-index: 2;\n position: relative;\n width: 100%;\n height: 100%;\n background-position: center;\n background-size: cover;\n background-repeat: no-repeat;\n }\n }\n\n .dragHandle {\n height: $classification-cover-height;\n color: $gray-700;\n }\n\n .large {\n width: $classification-cover-height-lg;\n height: $classification-cover-height-lg;\n \n @include media(\">=sm\", \"<=700px\") {\n width: $classification-cover-height;\n height: $classification-cover-height;\n }\n }\n\n .comingSoonPanel {\n line-height: 1;\n }\n\n .name {\n color: $gray-900;\n }\n }\n\n .newVideos {\n font-size: 0.6875rem; // 11px\n }\n\n .editSubjectsItem {\n height: $classification-cover-height;\n border-radius: $border-radius-lg;\n color: $gray-500;\n border: 1px dashed $gray-400;\n }\n\n .allSubjectsItem {\n height: $classification-cover-height;\n color: $white;\n border-radius: $border-radius-lg;\n border: 1px solid $gray-400;\n\n .logoContainer {\n height: 1.1rem;\n width: 6rem;\n }\n }\n\n .draggingItem {\n border: 2px dashed $border-color;\n height: $classification-cover-height;\n }\n\n .partialLargeImage {\n @extend .imagePanel;\n width: $classification-cover-height-lg !important;\n height: $classification-cover-height-lg !important;\n }\n\n .partialLargeFallback {\n width: $classification-cover-height-lg;\n height: $classification-cover-height-lg;\n }\n\n .partialIcon {\n z-index: 1;\n }\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\nimport { RandomHelper } from 'libs/common/react/utils/RandomHelper';\n\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { IconCircle } from 'libs/shared/components/icon-circle/IconCircle';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { CheckSvg } from 'libs/shared/images/svg/status/CheckSvg';\nimport { BaseObject, Classification, Presentation } from 'libs/shared/interfaces';\nimport { getBgColorClass } from 'libs/shared/utils/getBgColorClass';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\nimport { MasterTypeHelper } from 'libs/shared/utils/MasterTypeHelper';\n\nimport styles from './cover-pill.module.scss';\n\nconst namespace = 'shared.subjectWidgetItem';\n\ninterface NamePanelProps {\n name: string;\n multiline?: boolean;\n subtitle?: string;\n noUnderLine?: boolean;\n newVideosCount?: number;\n}\n\nconst ComingSoonNamePanel = ({ name, multiline, noUnderLine }: NamePanelProps) => {\n let wrapperClassName = `${styles.comingSoonPanel} \n d-flex flex-column align-items-center justify-content-center px-3 text-center`;\n\n let textClassName = '';\n\n if (!multiline) {\n wrapperClassName += ' text-nowrap';\n textClassName += ' text-truncate';\n } else {\n textClassName += ` ${styles.clamped} clamp-2`;\n }\n\n return (\n <div className={wrapperClassName}>\n <small className='text-secondary'><Text namespace={namespace} phrase='comingSoon' /></small>\n <p className={`${noUnderLine ? '' : styles.name} h6`}><span className={textClassName}>{name}</span></p>\n </div>\n );\n};\n\nconst NormalNamePanel = ({ name, multiline, subtitle, noUnderLine, newVideosCount }: NamePanelProps) => {\n let wrapperClassName = 'px-3 d-flex flex-column justify-content-center';\n let textClassName = `${noUnderLine ? '' : styles.name} h6`;\n\n if (!multiline) {\n wrapperClassName += ' text-nowrap text-truncate';\n textClassName += ' text-truncate mb-0';\n } else {\n textClassName += ` ${newVideosCount ? 'clamp-2' : 'clamp-3'} text-start`;\n }\n\n return (\n <div className={wrapperClassName}>\n {subtitle && <div className={`text-secondary clamp-1 ${styles.text}`}>{subtitle}</div>}\n <div className={textClassName} title={name}>{name}</div>\n {!!newVideosCount && (\n <div className={`fw-semibold d-inline-block rounded-pill px-2 mt-1 bg-light-green w-fit h-fit text-green ${styles.newVideos}`}>\n <Text namespace={namespace} phrase='newVideos' options={{ smartCount: newVideosCount }} />\n </div>\n )}\n </div>\n );\n};\n\nexport interface CoverPillWidgetItemProps<T extends BaseObject> {\n data: T;\n getChildAppLink?: (data: T) => Core.AppLink;\n getChildAppLinkOptions?: () => Core.AppLinkOptions;\n isLarge?: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n availablePresentations?: Presentation[];\n getSubtitle?: (data: T) => string;\n multiline?: boolean;\n // set to true it will highlight on hover and also remove the hover text underline\n highlightOnHover?: boolean;\n showNewVideosCount?: boolean;\n shouldHighlight?: (data: T) => boolean;\n showFallbackBackgroundColour?: boolean;\n onClick?: () => void;\n}\n\nCoverPillWidgetContent.defaultProps = {\n showFallbackBackgroundColour: true\n};\n\ninterface CoverPillWidgetContentProps<T> extends CoverPillWidgetItemProps<T> {\n coverUrl?: string;\n coverBgColor?: string;\n subtitle?: string;\n isComingSoon?: boolean;\n className?: string;\n imageClassName?: string;\n isSelected?: boolean;\n hideFallback?: boolean;\n hideCheckmark?: boolean;\n themeColor?: string;\n}\n\nexport function CoverPillWidgetContent(props: CoverPillWidgetContentProps<BaseObject>): JSX.Element {\n const coverUrl = ImageHelper.createUrl(props.coverUrl, { size: props.isLarge ? ImageSize.Medium : ImageSize.Small });\n\n let classification: Classification | undefined = undefined;\n if (MasterTypeHelper.isClassification(props.data)) {\n classification = props.data;\n }\n\n const childProps = {\n name: props.data.name,\n multiline: props.isLarge || props.multiline,\n subtitle: props.subtitle,\n noUnderLine: props.highlightOnHover,\n newVideosCount: props.showNewVideosCount ? classification?.externalMetadata?.childDashboardNewVideoCount : 0\n };\n\n const coverStyle: React.CSSProperties = {\n backgroundImage: coverUrl ? `url('${coverUrl}')` : null,\n backgroundColor: props.coverBgColor\n };\n\n const fallbackCoverBgClassName = getBgColorClass(props.data.name, BG_COLOUR_CLASS_NAMES);\n\n return (\n <div\n className={classNames(\n props.themeColor ? styles.hasThemeColor : 'border',\n 'd-flex position-relative',\n props.className,\n styles.widgetItem,\n props.isSelected ? 'border-success border-2' : '',\n props.highlightOnHover && !props.themeColor ? 'bg-light-blue-hover' : ''\n )}\n style={props.themeColor ? { '--themeColor': props.themeColor } as unknown as React.CSSProperties : {}}\n id={`${props.data.id}-${RandomHelper.getRandomInt()}`}\n onClick={props.onClick}\n >\n {props.isSelected && (\n <div className={`${styles.selectedMask} border-2`} />\n )}\n\n <div className={`${styles.imagePanel} ${props.isLarge ? styles.large : ''}`}>\n {props.isSelected && !props.hideCheckmark && (\n <div className={styles.selected}>\n <IconCircle svg={CheckSvg} svgSize={SvgContainerSize.Large} textVariant='white' variant='green' />\n </div>\n )}\n\n {coverUrl &&\n <div\n className={classNames(\n styles.image,\n props.imageClassName,\n !props.coverBgColor && props.showFallbackBackgroundColour && fallbackCoverBgClassName\n )}\n style={coverStyle}\n />\n }\n {!props.hideFallback && (\n <ImageFallback\n type={ImageFallbackType.Subject}\n extraClasses={props.isLarge ? styles.large : ''}\n />\n )}\n </div>\n\n {props.isComingSoon ?\n <ComingSoonNamePanel {...childProps} /> :\n <NormalNamePanel {...childProps} />\n }\n </div>\n );\n}\n\nexport function CoverPillWidgetContentWrapper(props: CoverPillWidgetContentProps<BaseObject>) {\n const appLink = props.getChildAppLink ? props.getChildAppLink(props.data) : null;\n\n return (\n <>\n {appLink ? (\n <AppLink\n className={styles.appLink}\n appLink={appLink}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n appLinkOptions={props.getChildAppLinkOptions?.()}\n >\n <CoverPillWidgetContent {...props} />\n </AppLink>\n ) : (<CoverPillWidgetContent {...props} />)\n }\n </>\n );\n}\n","import * as React from 'react';\n\nimport { ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { CoverPillWidgetContentWrapper, CoverPillWidgetItemProps } from 'libs/shared/components/widgets/items/subject-widget-item/CoverPill';\nimport { Company } from 'libs/shared/interfaces';\n\nexport function CompanyWidgetItem(props: CoverPillWidgetItemProps<Company>): JSX.Element {\n const analyticsData = {\n ...props.analyticsData,\n id: props.data?.id,\n name: props.data?.name\n };\n\n const analyticsOptions = {\n location: LocationContext.ClassificationListItem,\n ...props.analyticsOptions,\n actionType: UserAction.Click,\n entity: EntityType.Company,\n descriptor: ClickDescriptor.Cover\n };\n\n return (\n <CoverPillWidgetContentWrapper\n {...props}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n coverUrl={props.data.logo?.url}\n coverBgColor={props.data.metadata?.colour}\n />\n );\n}\n","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { CompanyWidgetItem } from 'libs/shared/components/widgets/items/subject-widget-item/CompanyWidgetItem';\nimport { Company } from 'libs/shared/interfaces';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function CompanyResult(props: MixedSearchResultItemProps<Company>): JSX.Element {\n return (\n <Col as='li' sm={6} md={props.useLargeStyle ? 6 : 4} lg={props.useLargeStyle ? 4 : 3}>\n <div className='position-relative px-1 mb-2'>\n <CompanyWidgetItem\n data={props.item}\n getChildAppLink={props.appLinks.getCompanyAppLink}\n getChildAppLinkOptions={() => props.appLinks.getCompanyAppLinkOptions?.(props.item)}\n analyticsData={{\n itemIndex: props.itemIndex,\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: 0\n }}\n isLarge={props.useLargeStyle}\n />\n </div>\n </Col>\n );\n}\n","@import '~styles/utils/include-media';\n:local {\n .videoList {\n margin: 0 -#{map-get($spacers, 2)};\n \n @include media('<=md') {\n margin: 0;\n }\n }\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { ClickDescriptor, EntityType, HashObject, LocationContext, SearchSourceDescriptor, UserAction } from 'libs/analytics/interfaces';\n\nimport { SourceFilterOptions } from 'libs/shared/apps/search/interfaces';\nimport { type ExchangeVideoGroup as ExchangeVideoGroupData } from 'libs/shared/apps/search/interfaces/SearchResults';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoItem } from 'libs/shared/components/video-list/video-item/VideoItem';\n\nimport { MixedSearchResultItemProps } from './../MixedSearchResultItemProps';\n\nimport styles from '../../mixed-search-results.module.scss';\n\nconst namespace = 'search.exchangeVideoGroup';\n\nconst EXCHANGE_RESULT_DISPLAY_LIMIT = 3;\n\nexport function ExchangeVideoGroup(props: MixedSearchResultItemProps<ExchangeVideoGroupData>): JSX.Element {\n const limit = props.item.showCount >= EXCHANGE_RESULT_DISPLAY_LIMIT ?\n EXCHANGE_RESULT_DISPLAY_LIMIT :\n props.item.showCount;\n\n function getContainerClassName(): string {\n if (props.pagePositionIndex === 0)\n return 'border-bottom pb-1 mb-3';\n\n return 'border-top border-bottom pt-3 mt-2 pb-1 mb-3';\n }\n\n const currentAppLink = Core.AppLinkHelper.getCurrentAppLink();\n const currentParams = (currentAppLink.params as HashObject) ?? {};\n let currentSource = currentParams?.source ?? [];\n\n if (currentSource && !Array.isArray(currentSource))\n currentSource = [currentSource];\n\n const searchAppLink = {\n ...currentAppLink,\n params: {\n ...currentParams,\n source: [ ...(currentSource), SourceFilterOptions.ExchangeArchive ]\n }\n };\n\n const analyticsData = {\n query: props.queryParams.query,\n itemIndex: props.itemIndex,\n pagePositionIndex: props.pagePositionIndex\n };\n const analyticsOptions = {\n entity: EntityType.SearchResults,\n location: LocationContext.ExchangeSearchGroupItem,\n actionType: UserAction.Click,\n descriptor: SearchSourceDescriptor.ExchangeArchive\n };\n\n return (\n <div className={getContainerClassName()}>\n <AppLink\n appLink={searchAppLink}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n >\n <h2 className='h4'>\n <Text namespace={namespace} phrase='heading' />\n </h2>\n </AppLink>\n <p>\n <Text namespace={namespace} phrase='message' />\n \n <AppLink\n appLink={props.appLinks.searchSettings}\n className='text-info'\n analyticsData={analyticsData}\n analyticsOptions={{\n ...analyticsOptions,\n descriptor: ClickDescriptor.Settings\n }}\n >\n <Text namespace={namespace} phrase='searchSettings' />\n </AppLink>\n .\n </p>\n\n <div className={`position-relative ${styles.videoList}`}>\n {props.item.videos.slice(0, limit).map((v, i) => {\n return (\n <VideoItem\n key={i}\n video={v}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n presentationAudiences={props.audiences}\n analyticsData= {{\n search: {\n query: props.queryParams.query,\n score: v._score,\n maxScore: v._maxScore,\n featured: v._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n />\n );\n })}\n </div>\n <div className='text-center py-2'>\n <AppLink\n className='text-secondary'\n appLink={searchAppLink}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n >\n <Text namespace={namespace} phrase='seeMore' />\n </AppLink>\n </div>\n </div>\n );\n}\n","@import '~styles/utils/mixins';\n@import '~styles/utils/include-media';\n:local {\n .partialHeroThumbnail {\n position: relative;\n width: 100%;\n padding-bottom: 56.25%;\n }\n\n .partialSeriesText {\n width: 6.25rem;\n height: 1rem;\n }\n\n .partialVideoTitleText {\n width: 16rem;\n height: 2rem;\n }\n\n .partialBadge {\n width: 4rem;\n height: 1rem;\n }\n\n .partialDescription {\n width: 80%;\n height: 4rem;\n }\n\n .partialSubject {\n width: 6.25rem;\n height: 1.5rem;\n }\n\n .partialHeading {\n height: 1.5rem;\n width: 8.4375rem;\n }\n\n .guidance {\n position: absolute;\n bottom: 0;\n gap: map-get($spacers, 1);\n\n @include media(\"<md\") {\n position: relative;\n }\n }\n\n .responsiveGuidance {\n @include media('>md') {\n @include responsive-guidance-tags;\n }\n\n @include media('<=sm') {\n @include responsive-guidance-tags;\n }\n }\n\n .description {\n @include clamp(4);\n \n @include media(\"<xl\") {\n @include clamp(3);\n }\n \n @include media(\"<md\") {\n display: none;\n }\n }\n\n .details {\n @include media(\"<md\") {\n padding-top: map-get($spacers, 2);\n }\n }\n}","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, LocationContext } from 'libs/analytics/interfaces';\n\nimport { AudienceLabel } from 'libs/shared/components/audience-label/AudienceLabel';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { VideoItemGuidance } from 'libs/shared/components/video-list/components/video-guidance/VideoItemGuidance';\nimport { VideoItemActions } from 'libs/shared/components/video-list/components/video-item-actions/VideoItemActions';\nimport { VideoItemTitle } from 'libs/shared/components/video-list/components/video-item-title/VideoItemTitle';\nimport { VideoSubText } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { PresentationAudience, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './hero-video.module.scss';\n\ninterface HeroVideoProps {\n video: Video;\n presentationAudiences: PresentationAudience[];\n showVideoGuidance: boolean;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n hideInteractiveBadge?: boolean;\n badgePosition?: 'thumbnail' | 'info-panel';\n titleClassName?: string;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n commonVideoProps: CommonVideoProps;\n showNewVideoIndicator?: boolean;\n}\n\nHeroVideo.defaultProps = {\n newDurationStyle: true,\n badgePosition: 'thumbnail'\n};\n\nexport function HeroVideo(props: HeroVideoProps): JSX.Element {\n const videoAudiences = props.video?.subjectPresentationAudiences?.data;\n const mergedAudience = useMergeAudiences(videoAudiences, props.presentationAudiences);\n\n const analyticsOptions = AnalyticsHelper.mergeOptions(props.analyticsOptions, {\n location: LocationContext.ClassificationHero,\n entity: VideoHelper.getAnalyticsEntity(props.video)\n });\n\n const containerRef = React.useRef(null);\n \n if (!props.video)\n return <></>;\n\n return (\n <Row>\n <Col xs={12} md={6}>\n <div ref={containerRef} >\n <VideoThumbnail\n analyticsOptions={analyticsOptions}\n video={props.video}\n appLink={props.getVideoAppLink?.(props.video, {})}\n imageOptions={{ size: ImageSize.Medium }}\n textPosition={ThumbnailTextPosition.Independent}\n type='static'\n audience={props.badgePosition === 'thumbnail' ? mergedAudience : null}\n hideRating={props.badgePosition === 'thumbnail' ? !!mergedAudience : true}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n </Col>\n <Col xs={12} md={6} className={`${styles.details} position-relative`}>\n <div className='d-flex justify-content-between'>\n <div className='overflow-hidden'>\n <VideoSubText\n type={props.commonVideoProps.subTextType}\n appLink={props.commonVideoProps.getSubTextAppLink?.(props.video)}\n analyticsData={props.analyticsData}\n analyticsOptions={analyticsOptions}\n video={props.video}\n className='text-reset clamp-1'\n />\n <VideoItemTitle\n yearGroups={props.commonVideoProps.yearGroups}\n video={props.video}\n analyticsData={props.analyticsData}\n analyticsOptions={analyticsOptions}\n appLink={props.getVideoAppLink?.(props.video, {})}\n titleSize='h4'\n showNewVideoIndicator={props.showNewVideoIndicator}\n showPadlock={!props.commonVideoProps.hasStudentExperience && !props.commonVideoProps.hasGuestExperience}\n titleClassName={props.titleClassName}\n clampLevel={2}\n />\n </div>\n <VideoItemActions\n analyticsData={props.analyticsData}\n analyticsOptions={analyticsOptions}\n video={props.video}\n />\n </div>\n\n {props.badgePosition === 'info-panel' && (\n <BadgeListContainer className='pb-1'>\n {!props.hideInteractiveBadge && <Badge type={ BadgeType.Interactive } data={props.video.interactives} />}\n <Badge type={ BadgeType.Rating } data={VideoHelper.getRating(props.video)} />\n <Badge type={ BadgeType.ProductionYear } data={props.video.productionYear} />\n </BadgeListContainer>\n )}\n\n <p className='mb-1'><span className={styles.description}>{props.video.description}</span></p>\n \n {props.badgePosition === 'info-panel' && (\n <AudienceLabel\n audience={mergedAudience}\n className='mt-1'\n border='dark'\n />\n )}\n\n {props.showVideoGuidance && (\n <VideoItemGuidance\n video={props.video}\n analyticsData={props.analyticsData}\n analyticsOptions={analyticsOptions}\n containerClassName={`d-flex ${styles.guidance}`}\n responsiveClassName={styles.responsiveGuidance}\n commonVideoProps={props.commonVideoProps}\n />\n )}\n </Col>\n </Row>\n );\n}\n\nexport function PartialHeroVideo(): JSX.Element {\n return (\n <>\n <div className={`partial-loading-background mb-2 ${styles.partialHeading}`} />\n <div className='row pb-3'>\n <div className='col-6 p1'>\n <div className={`${styles.partialHeroThumbnail} partial-loading-background rounded-3`}></div>\n </div>\n <div className='col-6 p1'>\n <div className={`partial-loading-background mb-1 ${styles.partialSeriesText}`}></div>\n <div className={`partial-loading-background my-1 ${styles.partialVideoTitleText}`}></div>\n <div className='d-flex'>\n <div className={`partial-loading-background my-1 me-1 ${styles.partialBadge}`}></div>\n <div className={`partial-loading-background my-1 ms-1 ${styles.partialBadge}`}></div>\n </div>\n <div className={`partial-loading-background my-1 ${styles.partialDescription}`}></div>\n <div className={`partial-loading-background mt-2 ${styles.partialSubject}`}></div>\n </div>\n </div>\n </>\n );\n}\n","import React from 'react';\n\nimport { HeroVideo } from 'libs/shared/apps/subjects/components/hero-video/HeroVideo';\nimport { Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function FeaturedVideoResult(props: MixedSearchResultItemProps<Video>): JSX.Element {\n return (\n <div className='pb-3'>\n <HeroVideo\n video={props.item}\n presentationAudiences={props.audiences}\n getVideoAppLink={(v, opts) => props.appLinks.getVideoAppLink(v, opts)}\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n hideInteractiveBadge\n showVideoGuidance={VideoHelper.showVideoGuidance(props.hasPermissions)}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n}\n",":local {\n .playlistItem {\n padding-bottom: 100%; // 1:1 aspect ratio\n }\n\n .playlistItemGradient {\n &::after {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: linear-gradient(\n to top,\n rgba(0, 0, 0, 0.55) 00%,\n rgba(0, 0, 0, 0.50) 05%,\n rgba(0, 0, 0, 0.40) 10%,\n rgba(0, 0, 0, 0.20) 25%,\n rgba(0, 0, 0, 0.05) 50%,\n rgba(0, 0, 0, 0.02) 60%,\n rgba(0, 0, 0, 0.00) 80%\n );\n }\n }\n\n .playlistMetadata {\n position: absolute;\n left: map-get($spacers, 2);\n right: map-get($spacers, 2);\n bottom: map-get($spacers, 2);\n z-index: 1;\n }\n\n .partialHeading {\n height: 2rem;\n width: 17rem;\n }\n\n .ownerAvatarContainer {\n position: absolute;\n right: map-get($spacers, 2);\n top: map-get($spacers, 2);\n z-index: 1;\n width: 15%;\n height: 15%;\n }\n}","import * as React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport styles from './playlist.module.scss';\n\ninterface PartialPlaylistListProps {\n numItems?: number;\n itemClassName?: string;\n showHeading?: boolean;\n}\n\nPartialPlaylistList.defaultProps = {\n numItems: 8\n};\n\nexport function PartialPlaylistList(props: PartialPlaylistListProps): JSX.Element {\n const PARTIAL_PLAYLISTS = [...Array(props.numItems)];\n\n const className = props.itemClassName || '';\n\n return (\n <>\n {props.showHeading && <div className={`${styles.partialHeading} mb-1 partial-loading-background`} />}\n <Row className='mx-n1 mb-n2'>\n {PARTIAL_PLAYLISTS.map((p, idx) => (\n <Col key={idx} xs={6} sm={4} lg={3} className={`${className} px-1 pb-2`}>\n <div className={`${styles.playlistItem} partial-loading-background rounded-3`} />\n </Col>\n ))}\n </Row>\n </>\n );\n}\n","var EN_US = ['second', 'minute', 'hour', 'day', 'week', 'month', 'year'];\nexport default function (diff, idx) {\n if (idx === 0)\n return ['just now', 'right now'];\n var unit = EN_US[Math.floor(idx / 2)];\n if (diff > 1)\n unit += 's';\n return [diff + \" \" + unit + \" ago\", \"in \" + diff + \" \" + unit];\n}\n//# sourceMappingURL=en_US.js.map","var ZH_CN = ['秒', '分钟', '小时', '天', '周', '个月', '年'];\nexport default function (diff, idx) {\n if (idx === 0)\n return ['刚刚', '片刻后'];\n var unit = ZH_CN[~~(idx / 2)];\n return [diff + \" \" + unit + \"\\u524D\", diff + \" \" + unit + \"\\u540E\"];\n}\n//# sourceMappingURL=zh_CN.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\n/**\n * All supported locales\n */\nvar Locales = {};\n/**\n * register a locale\n * @param locale\n * @param func\n */\nexport var register = function (locale, func) {\n Locales[locale] = func;\n};\n/**\n * get a locale, default is en_US\n * @param locale\n * @returns {*}\n */\nexport var getLocale = function (locale) {\n return Locales[locale] || Locales['en_US'];\n};\n//# sourceMappingURL=register.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\nvar SEC_ARRAY = [\n 60,\n 60,\n 24,\n 7,\n 365 / 7 / 12,\n 12,\n];\n/**\n * format Date / string / timestamp to timestamp\n * @param input\n * @returns {*}\n */\nexport function toDate(input) {\n if (input instanceof Date)\n return input;\n // @ts-ignore\n if (!isNaN(input) || /^\\d+$/.test(input))\n return new Date(parseInt(input));\n input = (input || '')\n // @ts-ignore\n .trim()\n .replace(/\\.\\d+/, '') // remove milliseconds\n .replace(/-/, '/')\n .replace(/-/, '/')\n .replace(/(\\d)T(\\d)/, '$1 $2')\n .replace(/Z/, ' UTC') // 2017-2-5T3:57:52Z -> 2017-2-5 3:57:52UTC\n .replace(/([+-]\\d\\d):?(\\d\\d)/, ' $1$2'); // -04:00 -> -0400\n return new Date(input);\n}\n/**\n * format the diff second to *** time ago, with setting locale\n * @param diff\n * @param localeFunc\n * @returns\n */\nexport function formatDiff(diff, localeFunc) {\n /**\n * if locale is not exist, use defaultLocale.\n * if defaultLocale is not exist, use build-in `en`.\n * be sure of no error when locale is not exist.\n *\n * If `time in`, then 1\n * If `time ago`, then 0\n */\n var agoIn = diff < 0 ? 1 : 0;\n /**\n * Get absolute value of number (|diff| is non-negative) value of x\n * |diff| = diff if diff is positive\n * |diff| = -diff if diff is negative\n * |0| = 0\n */\n diff = Math.abs(diff);\n /**\n * Time in seconds\n */\n var totalSec = diff;\n /**\n * Unit of time\n */\n var idx = 0;\n for (; diff >= SEC_ARRAY[idx] && idx < SEC_ARRAY.length; idx++) {\n diff /= SEC_ARRAY[idx];\n }\n /**\n * Math.floor() is alternative of ~~\n *\n * The differences and bugs:\n * Math.floor(3.7) -> 4 but ~~3.7 -> 3\n * Math.floor(1559125440000.6) -> 1559125440000 but ~~1559125440000.6 -> 52311552\n *\n * More information about the performance of algebraic:\n * https://www.youtube.com/watch?v=65-RbBwZQdU\n */\n diff = Math.floor(diff);\n idx *= 2;\n if (diff > (idx === 0 ? 9 : 1))\n idx += 1;\n return localeFunc(diff, idx, totalSec)[agoIn].replace('%s', diff.toString());\n}\n/**\n * calculate the diff second between date to be formatted an now date.\n * @param date\n * @param relativeDate\n * @returns {number}\n */\nexport function diffSec(date, relativeDate) {\n var relDate = relativeDate ? toDate(relativeDate) : new Date();\n return (+relDate - +toDate(date)) / 1000;\n}\n/**\n * nextInterval: calculate the next interval time.\n * - diff: the diff sec between now and date to be formatted.\n *\n * What's the meaning?\n * diff = 61 then return 59\n * diff = 3601 (an hour + 1 second), then return 3599\n * make the interval with high performance.\n **/\nexport function nextInterval(diff) {\n var rst = 1, i = 0, d = Math.abs(diff);\n for (; diff >= SEC_ARRAY[i] && i < SEC_ARRAY.length; i++) {\n diff /= SEC_ARRAY[i];\n rst *= SEC_ARRAY[i];\n }\n d = d % rst;\n d = d ? rst - d : rst;\n return Math.ceil(d);\n}\n//# sourceMappingURL=date.js.map","import { formatDiff, diffSec } from './utils/date';\nimport { getLocale } from './register';\n/**\n * format a TDate into string\n * @param date\n * @param locale\n * @param opts\n */\nexport var format = function (date, locale, opts) {\n // diff seconds\n var sec = diffSec(date, opts && opts.relativeDate);\n // format it with locale\n return formatDiff(sec, getLocale(locale));\n};\n//# sourceMappingURL=format.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\nimport en_US from './lang/en_US';\nimport zh_CN from './lang/zh_CN';\nimport { register } from './register';\nregister('en_US', en_US);\nregister('zh_CN', zh_CN);\nexport { format } from './format';\nexport { render, cancel } from './realtime';\nexport { register };\n//# sourceMappingURL=index.js.map","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Playlist } from 'libs/shared/interfaces';\n\nconst namespace = 'playlists.playlistCount';\n\nfunction getCount(playlist: Playlist): number | false {\n if (!playlist)\n return false;\n\n const videos = playlist.videos?.count ?? 0;\n const interactives = playlist.interactives?.count ?? 0;\n const clips = playlist.clips?.count ?? 0;\n\n return videos + interactives + clips;\n}\n\ninterface PlaylistCountProps {\n playlist: Playlist;\n}\n\nexport function PlaylistCount(props: PlaylistCountProps): JSX.Element {\n const count = getCount(props.playlist);\n\n if (count === false || Number.isNaN(count))\n return <></>;\n\n return (\n <span className='text-shadow font-size-sm'>\n <Text namespace={namespace} phrase='count' options={{ smartCount: count }} />\n </span>\n );\n}\n",".avatar {\n position: relative;\n border-radius: 50%;\n background-color: $white;\n width: 100%;\n height: 100%;\n text-align: center;\n\n svg {\n position: absolute;\n top: 50%;\n left: 59%; // 59 rather than 50 as it makes the play icon look more centered\n transform: translate(-50%, -50%);\n width: 60%;\n height: 60%;\n }\n}","import * as React from 'react';\n\nimport { ClickViewLogoMark } from 'libs/shared/components/svgs/clickview-logo/ClickViewLogo';\n\nimport styles from './clickview-avatar.module.scss';\n\nexport function ClickViewAvatar(): JSX.Element {\n return (\n <div className={styles.avatar}>\n <ClickViewLogoMark />\n </div>\n );\n}\n","import * as React from 'react';\n\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { ClickViewAvatar } from 'libs/shared/components/clickview-avatar/ClickViewAvatar';\nimport { CurrentUser, Playlist } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\ninterface PlaylistOwnerAvatarProps {\n playlist: Playlist;\n imageCdnUrl: string;\n currentUser?: CurrentUser;\n}\n\nexport function PlaylistOwnerAvatar(props: PlaylistOwnerAvatarProps): JSX.Element {\n const { _liteOwner } = props.playlist;\n\n if (props.playlist._isClickViewCurated?.value)\n return (\n <ClickViewAvatar />\n );\n\n if (!_liteOwner?.id || !props.currentUser?.id)\n return <></>;\n\n const currentUserIsOwner = _liteOwner.id.toString() === props.currentUser.id.toString();\n\n if (currentUserIsOwner)\n return <></>;\n\n const url = typeof _liteOwner.avatar === 'string' ? _liteOwner.avatar : _liteOwner.avatar?.url;\n\n return (\n <Avatar\n imageUrl={url}\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(_liteOwner.name, _liteOwner.surname)}\n />\n );\n}\n","import * as React from 'react';\nimport { format } from 'timeago.js';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { AnalyticsOptions, EntityType, HashObject } from 'libs/analytics/interfaces';\n\nimport { PlaylistCount } from 'libs/shared/apps/playlists/components/playlist-count/PlaylistCount';\nimport { PlaylistOwnerAvatar } from 'libs/shared/apps/playlists/components/playlist-list/PlaylistOwnerAvatar';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { AudienceLabel } from 'libs/shared/components/audience-label/AudienceLabel';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { ImageSize, ResizeType } from 'libs/shared/enums/Images';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { CurrentUser, Playlist, PresentationAudience } from 'libs/shared/interfaces';\nimport { getBgColorClass } from 'libs/shared/utils/getBgColorClass';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\n\nimport styles from './playlist.module.scss';\n\nconst namespace = 'playlists.playlistList';\n\nexport type PlaylistItemStyle = 'square' | 'round' | 'round-left';\n\nexport interface PlaylistItemProps {\n data: Playlist;\n appLink: Core.AppLink;\n currentUser?: CurrentUser;\n presentationAudiences?: PresentationAudience[];\n bgColourClassNames?: string[];\n titleClassName?: string;\n imageCdnUrl?: string;\n itemStyle?: PlaylistItemStyle;\n showCount?: boolean;\n showOwner?: boolean;\n showFallbackImage?: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n audienceLabelClass?: string;\n}\n\nPlaylistItem.defaultProps = {\n itemStyle: 'square'\n};\n\nexport function PlaylistItem(props: PlaylistItemProps): JSX.Element {\n const imageUrl = ImageHelper.createUrl(props.data.cover && props.data.cover.url, {\n size: ImageSize.Medium,\n resizeType: ResizeType.Cover\n });\n\n const audiences = props.data.subjectPresentationAudiences &&\n props.data.subjectPresentationAudiences.data;\n\n const mergedAudience = useMergeAudiences(audiences, props.presentationAudiences);\n\n let className = styles.playlistItem;\n\n const showImage = !!imageUrl || !!props.showFallbackImage;\n\n if (showImage)\n className += ` ${styles.playlistItemGradient}`;\n\n if (!showImage && props.bgColourClassNames)\n className += ` ${styles.playlistItem} ${getBgColorClass(props.data.name, props.bgColourClassNames)}`;\n\n if (props.itemStyle === 'round')\n className += ` rounded-3 overflow-hidden`;\n\n if (props.itemStyle === 'round-left')\n className += ` rounded-start-lg overflow-hidden`;\n\n const analyticsData = { ...props.analyticsData,\n id: props.data?.id,\n name: props.data?.name\n };\n\n const analyticsOptions = {\n ...props.analyticsOptions,\n entity: EntityType.Playlist\n };\n\n const getTitle = () => {\n if (!props.data.contentModifiedDate || props.data._isClickViewCurated?.value)\n return '';\n\n return LanguageService.getPhrase(namespace, 'lastUpdated', {\n timeago: format(DateHelper.convertUTCToLocal(props.data.contentModifiedDate))\n });\n };\n\n return (\n <AppLink\n appLink={props.appLink}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n title={getTitle()}\n >\n <BaseImage data={imageUrl} alt={props.data.name} className={className}>\n {!!props.showFallbackImage && <ImageFallback type={ImageFallbackType.Playlist} />}\n <div className={`text-white ${styles.playlistMetadata}`}>\n {!!props.showCount && (\n <PlaylistCount playlist={props.data} />\n )}\n <h5 className={`mb-0 ${props.titleClassName || ''}`}><span className='text-shadow clamp-2'>{props.data.name}</span></h5>\n {!!audiences && !!audiences.length && !!mergedAudience &&\n <AudienceLabel\n className={`${props.audienceLabelClass ? props.audienceLabelClass : ''} mt-1`}\n audience={mergedAudience}\n border='white'\n />\n }\n </div>\n {!!props.showOwner && !!props.imageCdnUrl &&\n <div className={styles.ownerAvatarContainer}>\n <PlaylistOwnerAvatar\n playlist={props.data}\n currentUser={props.currentUser}\n imageCdnUrl={props.imageCdnUrl}\n />\n </div>\n }\n </BaseImage>\n </AppLink>\n );\n}\n","import * as React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, HashObject, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { CurrentUser, Playlist, PresentationAudience } from 'libs/shared/interfaces';\n\nimport { PlaylistItem, PlaylistItemStyle } from './PlaylistItem';\n\ninterface PlaylistListProps {\n playlists: Playlist[];\n getPlaylistAppLink: (playlist: Playlist) => Core.AppLink;\n currentUser?: CurrentUser;\n presentationAudiences?: PresentationAudience[];\n itemContainerClassName?: string;\n itemTitleClassName?: string;\n bgColourClassNames?: string[];\n itemStyle?: PlaylistItemStyle;\n imageCdnUrl?: string;\n showCount?: boolean;\n showOwner?: boolean;\n showFallbackImage?: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n extraPlaylistItem?: JSX.Element;\n}\n\nconst analyticsOptions: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Playlist,\n location: LocationContext.PlaylistListItem,\n descriptor: ClickDescriptor.Cover\n};\n\nexport function PlaylistList(props: PlaylistListProps): JSX.Element {\n return (\n <Row as='ul' className='list-unstyled mx-n1'>\n {props.extraPlaylistItem && (\n <Col as='li' key='extra-playlist-item' xs={6} sm={4} lg={3} className={`mb-2 px-1 ${props.itemContainerClassName ? props.itemContainerClassName : ''}`}>\n {props.extraPlaylistItem}\n </Col>\n )}\n\n {props.playlists.map(p => (\n <Col as='li' key={p.id} xs={6} sm={4} lg={3} className={`mb-2 px-1 ${props.itemContainerClassName ? props.itemContainerClassName : ''}`}>\n <PlaylistItem\n data={p}\n appLink={props.getPlaylistAppLink(p)}\n imageCdnUrl={props.imageCdnUrl}\n currentUser={props.currentUser}\n presentationAudiences={props.presentationAudiences}\n bgColourClassNames={props.bgColourClassNames}\n showCount={props.showCount}\n showOwner={props.showOwner}\n showFallbackImage={props.showFallbackImage}\n titleClassName={props.itemTitleClassName}\n itemStyle={props.itemStyle}\n analyticsData={props.analyticsData}\n analyticsOptions={{ ...props.analyticsOptions, ...analyticsOptions }}\n />\n </Col>\n ))}\n </Row>\n );\n}\n","@import '~styles/utils/include-media';\n:local {\n .videoList {\n width: 63%;\n\n @include media('<=xl') {\n width: 75%;\n }\n\n @include media('<=lg') {\n width: 88%;\n }\n }\n}","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { PlaylistItem } from 'libs/shared/apps/playlists/components/playlist-list';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoItem } from 'libs/shared/components/video-list/video-item/VideoItem';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { CurrentUser, Playlist, PresentationAudience, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\n\nimport styles from './playlist-with-videos.module.scss';\n\nconst namespace = 'search.playlistWithVideos';\n\nfunction useGetMaxVideos(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xl || breakpoints.xxl)\n return 3;\n \n return 2;\n}\n\ninterface PlaylistWithVideoProps {\n playlist: Playlist;\n playlistAppLink: Core.AppLink;\n presentationAudiences: PresentationAudience[];\n preloadImage: boolean;\n analyticsData: HashObject;\n currentUser: CurrentUser;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n hasPermissions: HasPermissionsFunc;\n commonVideoProps: CommonVideoProps;\n}\n\nexport function PlaylistWithVideos(props: PlaylistWithVideoProps): JSX.Element {\n const maxVideos = useGetMaxVideos();\n\n const videos = props.playlist.videos.data.slice(0, maxVideos);\n\n const playlistAnalyticsOption: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Playlist,\n location: LocationContext.PlaylistWithVideos\n };\n\n const playlistAnalyticsData: HashObject = {\n ...props.analyticsData,\n id: props.playlist.id,\n name: props.playlist.name\n };\n\n return (\n <div className='ps-2 py-2'>\n <Row className='g-0 border rounded-3'>\n <Col xs={4} lg={3} className='pe-3'>\n <PlaylistItem\n appLink={props.playlistAppLink}\n analyticsData={props.analyticsData}\n analyticsOptions={{\n ...playlistAnalyticsOption,\n descriptor: ClickDescriptor.Cover\n }}\n data={props.playlist}\n presentationAudiences={props.presentationAudiences}\n bgColourClassNames={BG_COLOUR_CLASS_NAMES}\n itemStyle='round-left'\n imageCdnUrl={props.commonVideoProps.imageCdnUrl}\n currentUser={props.currentUser}\n showCount={false}\n showOwner\n />\n </Col>\n <Col xs={8} lg={9}>\n <div className='d-flex justify-content-between'>\n <div className={`pt-3 mb-n2 ${styles.videoList}`}>\n {videos?.map(video => {\n const videoAnalyticsData: HashObject = {\n ...playlistAnalyticsData,\n videoId: video.id,\n videoName: video.name\n };\n\n return (\n <div key={video.id} className='mb-2'>\n <VideoItem\n video={video}\n getVideoAppLink={props.getVideoAppLink}\n analyticsData={videoAnalyticsData}\n analyticsOptions={{\n entity: EntityType.Video,\n location: LocationContext.PlaylistWithVideos\n }}\n size='sm'\n hasPermissions={props.hasPermissions}\n hideVideoGuidance\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n })}\n </div>\n <div className='text-end pt-3 pe-3'>\n <AppLink\n className='info-link fw-semibold'\n appLink={props.playlistAppLink}\n analyticsData={playlistAnalyticsData}\n analyticsOptions={{\n ...playlistAnalyticsOption,\n descriptor: ClickDescriptor.Link\n }}\n >\n <Text namespace={namespace} phrase='seeAllVideos' />\n </AppLink>\n </div>\n </div>\n </Col>\n </Row>\n </div>\n );\n}\n","import React from 'react';\n\nimport { Playlist } from 'libs/shared/interfaces';\n\nimport { PlaylistWithVideos } from '../../playlist-with-videos/PlaylistWithVideos';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function LargePlaylistResult(props: MixedSearchResultItemProps<Playlist>): JSX.Element {\n return (\n <div className='mx-n2'>\n <PlaylistWithVideos\n playlist={props.item}\n playlistAppLink={props.appLinks.getPlaylistAppLink(props.item)}\n presentationAudiences={props.audiences}\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n currentUser={props.currentUser}\n preloadImage\n getVideoAppLink={props.appLinks.getVideoAppLink}\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n}\n","@import '~styles/utils/mixins';\n@import '~styles/utils/include-media';\n:local {\n .labelContainer {\n z-index: 1;\n bottom: map-get($spacers, 2);\n left: 50%;\n transform: translate(-50%, 0%);\n\n :global(.rating-badge) {\n @include thumbnail-poster-badge;\n }\n }\n\n .labelContainerOverlay {\n :global(.rating-badge) {\n @include thumbnail-poster-badge;\n }\n }\n\n .hoverActive {\n transform: translate3D(0, -1px, 0) scale(1.01);\n transition: all .1s ease;\n\n &:after {\n content: '';\n\n position: absolute;\n top: 0;\n left: -(map-get($spacers, 1));\n right: -(map-get($spacers, 1));\n bottom: 0;\n\n margin: 0 map-get($spacers, 1);\n\n border-radius: $border-radius-lg;\n }\n }\n\n .mask {\n z-index: 2;\n position: absolute;\n bottom: map-get($spacers, 2);\n right: 0;\n left: 0;\n\n max-height: calc(100% - (map-get($spacers, 2) * 2));\n \n @include media('<=lg') {\n padding: map-get($spacers, 3) map-get($spacers, 1);\n }\n\n .largeHoverTitle {\n font-size: $h4-font-size;\n\n @include media('<=lg') {\n font-size: $h5-font-size;\n }\n\n @include media('<=md') {\n font-size: $h6-font-size;\n margin-bottom: map-get($spacers, 1);\n }\n\n @include media('<=sm') {\n font-size: $h5-font-size;\n }\n }\n\n .smallHoverTitle {\n font-size: $h5-font-size;\n\n @include media('<=xl') {\n font-size: $h6-font-size;\n }\n\n @include media('<=lg') {\n font-size: $h6-font-size;\n }\n\n @include media('<=md') {\n @include clamp(5);\n }\n }\n\n .description {\n text-overflow: ellipsis;\n overflow: hidden;\n -webkit-box-orient: vertical;\n display: -webkit-box;\n }\n\n .largeHoverDescription {\n @include clamp(11);\n\n @include media('<=xl') {\n @include clamp(9);\n }\n @include media('<=lg') {\n @include clamp(7);\n }\n @include media(\"<=878px\") {\n @include clamp(4);\n }\n\n &.hasTableOfContents {\n @include clamp(7);\n\n @include media('<=xl') {\n @include clamp(5);\n }\n @include media(\"<=1003px\") {\n @include clamp(4);\n }\n @include media('<=lg') {\n @include clamp(7);\n }\n @include media(\"<=878px\") {\n @include clamp(4);\n }\n }\n }\n\n .smallHoverDescription {\n @include clamp(8);\n\n @include media('<=xl') {\n @include clamp(8);\n font-size: 12px;\n }\n\n @include media('<=md') {\n @include clamp(6);\n }\n @include media('<=sm') {\n @include clamp(9);\n }\n } \n }\n}","import React from 'react';\n\nimport { AudienceLabel } from 'libs/shared/components/audience-label/AudienceLabel';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { ImageSize, ImageType } from 'libs/shared/enums/Images';\nimport { useHoverIntent } from 'libs/shared/hooks/UseHover';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { PresentationAudience, Series } from 'libs/shared/interfaces';\nimport { SeriesHelper } from 'libs/shared/utils/SeriesHelper';\n\nimport styles from './series-tall-poster.module.scss';\n\ninterface SeriesTallPosterHoverOverlay {\n series: Series;\n mergedAudience: PresentationAudience;\n isSmall?: boolean;\n hasTableOfContents?: boolean;\n}\n\nfunction SeriesTallPosterHoverOverlay(props: SeriesTallPosterHoverOverlay): JSX.Element {\n return (\n <div className={`py-3 mx-2 px-2 rounded bg-white text-center ${styles.mask} d-flex flex-column align-items-center`}>\n <h3 className={`fw-semibold mb-0 ${styles.hoverTitle} ${props.isSmall ? styles.smallHoverTitle : styles.largeHoverTitle}`}>\n <span className='clamp-3'>\n {props.series.name}\n </span>\n </h3>\n\n {!!props.series.description && (\n <p className={`${props.hasTableOfContents ? styles.hasTableOfContents : ''} ${styles.hoverDescription} ${props.isSmall ? styles.smallHoverDescription : styles.largeHoverDescription} mb-0`}>{props.series.description}</p>\n )}\n <div className={`${styles.labelContainerOverlay}`}>\n {props.mergedAudience ?\n <AudienceLabel audience={props.mergedAudience} border='dark' className='mt-2 w-fit'/> :\n <Badge type={BadgeType.Rating} data={SeriesHelper.getRating(props.series)} className='mt-2' />\n }\n </div>\n </div>\n );\n}\n\ninterface SeriesTallPosterMaskProps {\n series: Series;\n presentationAudiences: PresentationAudience[];\n preloadImage: boolean;\n imageClass?: string;\n isSmall?: boolean;\n hasTableOfContents?: boolean;\n}\n\nexport function SeriesTallPoster(props: SeriesTallPosterMaskProps): JSX.Element {\n const [ hoverRef, isHovering ] = useHoverIntent<HTMLDivElement>({ className: styles.hoverActive });\n \n const audiences = props.series && props.series.subjectPresentationAudiences &&\n props.series.subjectPresentationAudiences.data || [];\n\n const mergedAudience = useMergeAudiences(audiences, props.presentationAudiences);\n const displayAudience = !!(audiences && audiences.length && mergedAudience);\n\n return (\n <div ref={hoverRef}>\n <BaseImage\n data={props.series.tallPoster}\n alt={props.series.name}\n imageType={ImageType.TallPosters}\n preload={props.preloadImage}\n imageOptions={{ size: ImageSize.Large }}\n imageClassName={props.imageClass ? props.imageClass : 'rounded-3'}\n >\n {isHovering && (\n <SeriesTallPosterHoverOverlay\n isSmall={props.isSmall}\n series={props.series}\n mergedAudience={audiences && audiences.length ? mergedAudience : null}\n hasTableOfContents={props.hasTableOfContents}\n />\n )}\n \n <ImageFallback type={ImageFallbackType.Series} />\n <div className={`position-absolute text-white ${styles.labelContainer}`}>\n {displayAudience ?\n <AudienceLabel audience={mergedAudience} className='bg-white text-dark' border='dark' /> :\n <Badge className='text-shadow' type={BadgeType.Rating} data={SeriesHelper.getRating(props.series)} />\n }\n </div>\n </BaseImage>\n </div>\n );\n}\n","@import '~styles/utils/include-media';\n:local {\n .videoList {\n width: 63%;\n\n @include media('<=xl') {\n width: 75%;\n }\n\n @include media('<=lg') {\n width: 88%;\n }\n }\n}","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SeriesTallPoster } from 'libs/shared/components/series-tall-poster/SeriesTallPoster';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoItem } from 'libs/shared/components/video-list/video-item/VideoItem';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { PresentationAudience, Series, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\n\nimport styles from './series-with-videos.module.scss';\n\nconst namespace = 'search.seriesWithVideos';\n\nfunction useGetMaxVideos(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xl || breakpoints.xxl)\n return 5;\n \n if (breakpoints.lg || breakpoints.md)\n return 4;\n\n return 3;\n}\n\ninterface SeriesWithVideoProps {\n series: Series;\n seriesAppLink: Core.AppLink;\n presentationAudiences: PresentationAudience[];\n preloadImage: boolean;\n analyticsData: HashObject;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n hasPermissions: HasPermissionsFunc;\n commonVideoProps: CommonVideoProps;\n}\n\nexport function SeriesWithVideos(props: SeriesWithVideoProps): JSX.Element {\n const maxVideos = useGetMaxVideos();\n\n const videos = props.series.videos.data.slice(0, maxVideos);\n\n const seriesAnalyticsOption: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Series,\n location: LocationContext.SeriesWithVideos\n };\n\n const seriesAnalyticsData: HashObject = {\n ...props.analyticsData,\n id: props.series.id,\n name: props.series.name\n };\n\n return (\n <div className='ps-2 py-2'>\n <Row className='g-0 border rounded-3'>\n <Col xs={4} lg={3} className='pe-3'>\n <AppLink\n appLink={props.seriesAppLink}\n className='position-relative'\n analyticsData={seriesAnalyticsData}\n analyticsOptions={{\n ...seriesAnalyticsOption,\n descriptor: ClickDescriptor.TallPoster\n }}\n >\n <SeriesTallPoster\n series={props.series}\n presentationAudiences={props.presentationAudiences}\n preloadImage={props.preloadImage}\n imageClass='rounded-start-lg'\n />\n </AppLink>\n </Col>\n <Col xs={8} lg={9}>\n <div className='d-flex justify-content-between'>\n <div className={`pt-3 mb-n2 ${styles.videoList}`}>\n {videos?.map(video => {\n const videoAnalyticsData: HashObject = {\n ...seriesAnalyticsData,\n videoId: video.id,\n videoName: video.name\n };\n\n // insert parent series into video object\n video = {\n ...video,\n series: props.series\n };\n\n return (\n <div key={video.id} className='mb-2'>\n <VideoItem\n video={video}\n getVideoAppLink={props.getVideoAppLink}\n analyticsData={videoAnalyticsData}\n analyticsOptions={{\n entity: EntityType.Video,\n location: LocationContext.SeriesWithVideos\n }}\n size='sm'\n hasPermissions={props.hasPermissions}\n hideVideoGuidance\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n })}\n </div>\n <div className='text-end pt-3 pe-3'>\n <AppLink\n className='info-link fw-semibold'\n appLink={props.seriesAppLink}\n analyticsData={seriesAnalyticsData}\n analyticsOptions={{\n ...seriesAnalyticsOption,\n descriptor: ClickDescriptor.Link\n }}\n >\n <Text namespace={namespace} phrase='seeAllVideos' />\n </AppLink>\n </div>\n </div>\n </Col>\n </Row>\n </div>\n );\n}\n","import React from 'react';\n\nimport { Series } from 'libs/shared/interfaces';\n\nimport { SeriesWithVideos } from '../../series-with-videos/SeriesWithVideos';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function LargeSeriesResult(props: MixedSearchResultItemProps<Series>): JSX.Element {\n return (\n <div className='mx-n2'>\n <SeriesWithVideos\n presentationAudiences={props.audiences}\n series={props.item}\n seriesAppLink={props.appLinks.getSeriesAppLink(props.item)}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n preloadImage\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { SeasonEpisode } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Video } from 'libs/shared/interfaces';\n\nconst namespace = 'search.collectionVideoList';\n\ninterface CollectionVideoListProps {\n videos: Video[];\n collectionId: string;\n appLink: Core.AppLink;\n analyticsOptions: AnalyticsOptions;\n analyticsData?: HashObject;\n getVideoAppLink: (video: Video) => Core.AppLink;\n}\n\nfunction useGetMaxVideos(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xs)\n return 2;\n\n if (breakpoints.sm)\n return 1;\n\n return 3;\n}\n\nexport function CollectionVideoList(props: CollectionVideoListProps): JSX.Element {\n const maxVideos = useGetMaxVideos();\n\n const analyticsProps = {\n analyticsData: props.analyticsData,\n analyticsOptions: props.analyticsOptions\n };\n\n return (\n <>\n <ul className='list-unstyled my-1'>\n {props.videos.slice(0, maxVideos).map(v => {\n const hasSeasonEpisode = !!v.episodeNumber && !!v.season?.id;\n\n return (\n <li key={`${props.collectionId}:${v.id}`} className='d-flex align-items-center'>\n <AppLink\n {...analyticsProps}\n className='clamp-1'\n appLink={props.getVideoAppLink(v)}\n >\n {hasSeasonEpisode && <><SeasonEpisode video={v} /> </>}\n {v.name}\n </AppLink>\n </li>\n );\n })}\n </ul>\n\n <AppLink\n {...analyticsProps}\n className='info-link'\n appLink={props.appLink}\n >\n <Text namespace={namespace} phrase='seeAll' />\n </AppLink>\n </>\n );\n}\n",":local {\n .overlayContainer {\n position: absolute;\n width: 100%;\n height: 100%;\n z-index: 1;\n padding: map-get($spacers, 1);\n color: $white;\n }\n\n .overlay {\n background-color: darken($dark, 30%);\n opacity: .7;\n width: 40%;\n position: absolute;\n right: 0;\n z-index: 1;\n }\n}","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor } from 'libs/analytics/interfaces';\n\nimport { CollectionVideoList } from 'libs/shared/apps/search/components/collection-video-list/CollectionVideoList';\nimport { ActionOptions, Actions as ActionsComponent } from 'libs/shared/components/actions/Actions';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { Mask, MaskType } from 'libs/shared/components/mask/Mask';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoListHelper } from 'libs/shared/components/video-list/VideoListHelper';\nimport { ImageType } from 'libs/shared/enums/Images';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Playlist, Series, Video } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { SeriesHelper } from 'libs/shared/utils/SeriesHelper';\n\nimport styles from './collection-thumbnail.module.scss';\n\nconst namespace = 'search.collectionThumbnail';\n\nexport type GetCollectionActions = (\n collection: Collection,\n showActions: boolean,\n collectionType: CollectionType,\n baseAnalyticsOptions: AnalyticsOptions\n) => ActionOptions[];\n\ntype Collection = Series | Playlist;\ntype CollectionType = 'series' | 'playlist';\n\ninterface CollectionThumbnailProps {\n collection: Collection;\n collectionType: CollectionType;\n appLink: Core.AppLink;\n showActions: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n maskType?: MaskType;\n imageFallbackType?: ImageFallbackType;\n hideBadges?: boolean;\n isPlugin: boolean;\n getCollectionActions: GetCollectionActions;\n getVideoAppLink: (video: Video, opts?: GetVideoAppLinkOptions) => Core.AppLink;\n}\n\nexport function CollectionThumbnail(props: CollectionThumbnailProps): JSX.Element {\n const breakpoints = useBreakpoints();\n const size = VideoListHelper.getSize(breakpoints, 'md');\n const isSmall = size === 'sm';\n\n const hasVideos = !!props.collection.videos?.data?.length;\n\n const firstVideoWithThumbnail = hasVideos && props.collection.videos.data.find(v => !!v.thumbnail?.url);\n\n function getAnalyticsData(): HashObject {\n const data: HashObject = {\n ...props.analyticsData,\n id: props.collection.id,\n name: props.collection.name\n };\n\n if (firstVideoWithThumbnail) {\n data.videoId = firstVideoWithThumbnail.id;\n data.videoName = firstVideoWithThumbnail.name;\n }\n\n return data;\n }\n\n const analyticsData = getAnalyticsData();\n const isSeries = props.collectionType === 'series';\n\n return (\n <div className={`row g-0 ${isSmall ? '' : 'py-2'}`}>\n <Col {...VideoListHelper.getThumbnailColumns()} className={`flex-column align-items-flex-start ${isSmall ? `pb-2 pe-2` : 'mb-1 px-2'}`}>\n <div className={`position-relative overflow-hidden ${isSmall ? 'rounded' : 'rounded-3'}`}>\n <BaseImage\n data={firstVideoWithThumbnail?.thumbnail}\n appLink={props.appLink}\n imageType={ImageType.Thumbnails}\n analyticsData={analyticsData}\n analyticsOptions={{\n ...props.analyticsOptions,\n descriptor: ClickDescriptor.Thumbnail\n }}\n >\n <Mask type={props.maskType} />\n <ImageFallback type={props.imageFallbackType} />\n \n <div className={`d-flex flex-column align-items-center justify-content-center text-white h-100 ${styles.overlay}`}>\n <Text namespace={namespace} phrase='seeAll' />\n </div>\n </BaseImage>\n </div>\n </Col>\n\n <Col {...VideoListHelper.getDetailsColumns()} className={isSmall ? 'pb-2' : 'px-2'}>\n {!props.isPlugin &&\n <ActionsComponent\n actions={props.getCollectionActions(\n props.collection,\n props.showActions,\n props.collectionType,\n props.analyticsOptions\n )}\n className='float-end mt-n1'\n actionsDropdownClassName='btn btn-link ms-1'\n />\n }\n\n <AppLink\n appLink={props.appLink}\n analyticsData={analyticsData}\n analyticsOptions={{\n ...props.analyticsOptions,\n descriptor: ClickDescriptor.Title\n }}\n >\n <h5 className='m-0 mb-1'><span className='clamp-1'>{props.collection.name}</span></h5>\n </AppLink>\n\n {isSeries && !props.hideBadges && (\n <BadgeListContainer>\n <Badge type={BadgeType.Rating} data={SeriesHelper.getRating((props.collection as Series))} />\n <Badge type={BadgeType.ProductionYear} data={(props.collection as Series).metadata?.year} />\n </BadgeListContainer>\n )}\n \n {hasVideos && (\n <CollectionVideoList\n collectionId={props.collection.id}\n videos={props.collection.videos.data}\n appLink={props.appLink}\n analyticsData={analyticsData}\n analyticsOptions={{\n ...props.analyticsOptions,\n descriptor: ClickDescriptor.Link\n }}\n getVideoAppLink={props.getVideoAppLink}\n />\n )}\n </Col>\n </div>\n );\n}\n","import React from 'react';\n\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { MaskType } from 'libs/shared/components/mask/Mask';\nimport { Playlist } from 'libs/shared/interfaces';\n\nimport { CollectionThumbnail } from '../../collection-thumbnail/CollectionThumbnail';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nimport styles from '../mixed-search-results.module.scss';\n\nexport function SmallPlaylistResult(props: MixedSearchResultItemProps<Playlist>): JSX.Element {\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <CollectionThumbnail\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n analyticsOptions={{\n entity: EntityType.Playlist,\n actionType: UserAction.Click,\n location: LocationContext.PlaylistListItem\n }}\n appLink={props.appLinks.getPlaylistAppLink(props.item)}\n showActions={props.showActions}\n collection={props.item}\n collectionType='playlist'\n maskType={MaskType.Playlist}\n imageFallbackType={ImageFallbackType.PlaylistThumbnail}\n isPlugin={props.commonVideoProps.isPlugin}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getCollectionActions={props.appLinks.getCollectionActions}\n />\n </div>\n );\n}\n","import React from 'react';\n\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { MaskType } from 'libs/shared/components/mask/Mask';\nimport { Series } from 'libs/shared/interfaces';\n\nimport { CollectionThumbnail } from '../../collection-thumbnail/CollectionThumbnail';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nimport styles from '../mixed-search-results.module.scss';\n\nexport function SmallSeriesResult(props: MixedSearchResultItemProps<Series>): JSX.Element {\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <CollectionThumbnail\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n analyticsOptions={{\n entity: EntityType.Series,\n actionType: UserAction.Click,\n location: LocationContext.SeriesListItem\n }}\n appLink={props.appLinks.getSeriesAppLink(props.item)}\n collectionType='series'\n collection={props.item}\n showActions={props.showActions}\n maskType={MaskType.Series}\n imageFallbackType={ImageFallbackType.SeriesThumbnail}\n hideBadges\n isPlugin={props.commonVideoProps.isPlugin}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getCollectionActions={props.appLinks.getCollectionActions}\n />\n </div>\n );\n}\n","// Maps to enum in SubjectApi but uses the\n// key rather than the value as SubjectsApi returns the key.\nexport enum ClassificationStatus {\n Draft = 'Draft',\n ComingSoon = 'ComingSoon',\n Published = 'Published'\n}\n","import * as React from 'react';\n\nimport { ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { CoverPillWidgetContentWrapper, CoverPillWidgetItemProps } from 'libs/shared/components/widgets/items/subject-widget-item/CoverPill';\nimport { TopicsConstants } from 'libs/shared/constants/TopicsConstants';\nimport { ClassificationStatus } from 'libs/shared/enums/ClassificationStatus';\nimport { Classification, Presentation } from 'libs/shared/interfaces';\n\nfunction usePresentationName(presentationId: string, availablePresentations: Presentation[]): string {\n const showPresentationName = availablePresentations?.length >= TopicsConstants.MULTI_PRESENTATION_THRESHOLD;\n\n if (!showPresentationName) {\n return undefined;\n }\n\n return availablePresentations?.find(p => p.id === presentationId)?.name;\n}\n\nfunction SubjectWidgetItem(props: CoverPillWidgetItemProps<Classification>): JSX.Element {\n const isComingSoon = props.data?.status === ClassificationStatus.ComingSoon;\n const presentationName = usePresentationName(props.data.presentationId, props?.availablePresentations);\n\n const analyticsData = {\n ...props.analyticsData,\n id: props.analyticsData?.id || props.data?.id,\n name: props.data?.name,\n presentationId: props.analyticsData?.presentationId || props.data.presentationId,\n comingSoon: !!isComingSoon\n };\n\n const analyticsOptions = {\n location: LocationContext.ClassificationListItem,\n entity: EntityType.Classification,\n ...props.analyticsOptions,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.Cover\n };\n\n return (\n <CoverPillWidgetContentWrapper\n {...props}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n coverUrl={props.data.cover?.url}\n coverBgColor={props.data?.metadata?.backgroundColor}\n subtitle={props.getSubtitle?.(props.data) || presentationName}\n isComingSoon={isComingSoon}\n themeColor={props.shouldHighlight?.(props.data) ? props.data?.metadata?.backgroundColor ?? '' : ''}\n />\n );\n}\n\nconst Memoized = React.memo(SubjectWidgetItem);\n\nexport { Memoized as SubjectWidgetItem };\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, HashObject, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { EditSvg } from 'libs/shared/images/svg/actions/EditSvg';\n\nimport styles from './cover-pill.module.scss';\n\ninterface EditSubjectsWidgetLinkProps {\n appLink: Core.AppLink;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n}\n\nconst analyticsOptions: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.UserSetting,\n descriptor: ClickDescriptor.Tile\n};\n\nexport function EditSubjectsWidgetLink(props: EditSubjectsWidgetLinkProps): JSX.Element {\n const className =\n `${styles.editSubjectsItem} d-flex position-relative px-3 justify-content-center align-items-center`;\n\n return (\n <AppLink\n appLink={props.appLink}\n className='text-decoration-none'\n analyticsData={{ ...props.analyticsData, type: 'subject-preference' }}\n analyticsOptions={ { ...props.analyticsOptions, ...analyticsOptions }}\n >\n <div className={className}>\n <SvgContainer svg={EditSvg} className='me-2 align-middle d-inline-block svg-container' />\n <p className='h6 align-middle text-truncate'><Text namespace='shared.subjectWidgetItem' phrase='edit' /></p>\n </div>\n </AppLink>\n );\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, HashObject, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { ClickViewLogoInverted } from 'libs/shared/components/svgs/clickview-logo/ClickViewLogo';\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport styles from './cover-pill.module.scss';\n\ninterface AllSubjectsWidgetLinkProps {\n appLink: Core.AppLink;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n}\n\nconst analyticsOptions: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Url,\n descriptor: ClickDescriptor.Tile\n};\n\nexport function AllSubjectsWidgetLink(props: AllSubjectsWidgetLinkProps): JSX.Element {\n const className =\n `${styles.allSubjectsItem}\n d-flex flex-column position-relative px-2\n align-items-center justify-content-center text-nowrap bg-navy`;\n\n return (\n <AppLink\n appLink={props.appLink}\n className='text-decoration-none'\n analyticsData={{ ...props.analyticsData, type: 'subject-all' }}\n analyticsOptions={ { ...props.analyticsOptions, ...analyticsOptions }}\n >\n <div className={className}>\n <div className={styles.logoContainer}>\n <ClickViewLogoInverted />\n </div>\n <p className='h6 pt-2 px-3 mb-0'><Text namespace='shared.subjectWidgetItem' phrase='all' /></p>\n </div>\n </AppLink>\n );\n}\n","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { SubjectWidgetItem } from 'libs/shared/components/widgets/items/subject-widget-item';\nimport { Classification } from 'libs/shared/interfaces';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function SubjectResult(props: MixedSearchResultItemProps<Classification>): JSX.Element {\n return (\n <Col as='li' sm={6} md={props.useLargeStyle ? 6 : 4} lg={props.useLargeStyle ? 4 : 3}>\n <div className='position-relative px-1 mb-2'>\n <SubjectWidgetItem\n data={props.item}\n getChildAppLink={props.appLinks.getClassificationAppLink}\n getChildAppLinkOptions={\n () => props.appLinks.getClassificationAppLinkOptions?.(props.item)\n }\n availablePresentations={props.availablePresentations}\n analyticsData={{\n itemIndex: props.itemIndex,\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: 0\n }}\n isLarge={props.useLargeStyle}\n highlightOnHover={props.commonVideoProps.showNewVideoIndicator}\n />\n </div>\n </Col>\n );\n}\n","import React from 'react';\n\nimport { ClipItem, ClipItemProps } from 'libs/shared/components/video-list/clip-item/ClipItem';\nimport { InteractiveItem, InteractiveItemProps } from 'libs/shared/components/video-list/interactive-item/InteractiveItem';\nimport { VideoItem, VideoItemProps } from 'libs/shared/components/video-list/video-item/VideoItem';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nimport styles from '../mixed-search-results.module.scss';\n\nexport function VideoResult(props: MixedSearchResultItemProps<VideoTypes>): JSX.Element {\n function getItemComponent(\n video: VideoTypes\n ): (props: ClipItemProps | InteractiveItemProps | VideoItemProps) => JSX.Element {\n if (VideoHelper.isClip(video))\n return ClipItem;\n \n if (VideoHelper.isInteractive(video))\n return InteractiveItem;\n \n return VideoItem;\n }\n\n const Component = getItemComponent(props.item);\n\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <Component\n video={props.item}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getPreviewQuestionsAppLink={props.appLinks.getPreviewQuestionsAppLink}\n presentationAudiences={props.audiences}\n analyticsData= {{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n}\n","import React from 'react';\nimport { Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { Classification, Company, CurrentUser, InteractiveMetadata, Playlist, Presentation, PresentationAudience, Series, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { SearchResultObjectTypes, SearchResults, SearchResultsObject } from '../../interfaces';\nimport { GetCollectionActions } from '../collection-thumbnail/CollectionThumbnail';\n\nimport { CompanyResult } from './components/CompanyResult';\nimport { ExchangeVideoGroup } from './components/exchange-video-group/ExchangeVideoGroup';\nimport { FeaturedVideoResult } from './components/FeaturedVideoResult';\nimport { LargePlaylistResult } from './components/LargePlaylistResults';\nimport { LargeSeriesResult } from './components/LargeSeriesResult';\nimport { BaseMixedSearchResultItemProps } from './components/MixedSearchResultItemProps';\nimport { SmallPlaylistResult } from './components/SmallPlaylistResult';\nimport { SmallSeriesResult } from './components/SmallSeriesResults';\nimport { SubjectResult } from './components/SubjectResult';\nimport { VideoResult } from './components/VideoResult';\n\nconst namespace = 'shared.mixedSearchResults';\n\nconst TOPIC_DISPLAY_LIMIT = 8;\n\nexport interface MixedSearchResultAppLinks {\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n getSeriesAppLink: (series: Series) => Core.AppLink;\n getCompanyAppLink: (company: Company) => Core.AppLink;\n getCompanyAppLinkOptions?: (company: Company) => Core.AppLinkOptions;\n getClassificationAppLink: (classification: Classification) => Core.AppLink;\n getClassificationAppLinkOptions?: (classification: Classification) => Core.AppLinkOptions;\n getPlaylistAppLink: (playlist: Playlist) => Core.AppLink;\n getPreviewQuestionsAppLink: (interactive: InteractiveMetadata) => Core.AppLink;\n getCollectionActions: GetCollectionActions;\n searchSettings?: Core.AppLink;\n}\n\ninterface MixedSearchResultsProps {\n queryParams: HashObject;\n results: SearchResultObjectTypes[];\n topics?: SearchResults;\n companies?: SearchResults;\n audiences: PresentationAudience[];\n currentUser: CurrentUser;\n availablePresentations: Presentation[];\n showActions: boolean;\n hasPermissions: HasPermissionsFunc;\n appLinks: MixedSearchResultAppLinks;\n commonVideoProps: CommonVideoProps;\n}\n\nexport const MixedSearchResults = React.memo(function(props: MixedSearchResultsProps): JSX.Element {\n const breakpoints = useBreakpoints();\n const useSmallComponent = breakpoints.xs || breakpoints.sm;\n\n if (!props.results?.length && !props.topics?.totalResults && !props.companies?.totalResults)\n return <></>;\n\n const companiesAndTopics = [\n ...props.companies?.results ?? [],\n ...props.topics?.results ?? []\n ];\n\n const childProps: BaseMixedSearchResultItemProps = {\n useLargeStyle: companiesAndTopics.length < 4,\n ...props\n };\n\n return (\n <div className='position-relative'>\n <p role='status' className='visually-hidden'><Text namespace={namespace} phrase='ariaSearch' /></p>\n\n {!!companiesAndTopics.length && (\n <Row as='ul' className='list-unstyled g-0 pb-3 mx-n1'>\n {companiesAndTopics.slice(0, TOPIC_DISPLAY_LIMIT).map((c, itemIndex) => {\n switch (c.type.toLowerCase()) {\n case 'company':\n return (\n <CompanyResult\n key={itemIndex}\n item={c as SearchResultsObject<Company>}\n itemIndex={itemIndex}\n {...childProps}\n />\n );\n case 'subject': {\n return (\n <SubjectResult\n key={itemIndex}\n item={c as SearchResultsObject<Classification>}\n itemIndex={itemIndex}\n {...childProps}\n />\n );\n }\n }\n })}\n </Row>\n )}\n\n {props.results?.map((result, index) => {\n const pagePositionIndex = companiesAndTopics.length ? index + 1 : index;\n\n if ('isExchangeVideoGroup' in result && result.isExchangeVideoGroup) {\n return (\n <ExchangeVideoGroup\n key={index}\n item={result}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n switch (result.type?.toLowerCase()) {\n case 'interactive':\n case 'clip':\n case 'video': {\n if (index === 0 && result._featured && VideoHelper.isVideo(result)) {\n return (\n <FeaturedVideoResult\n key={index}\n item={result as SearchResultsObject<Video>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n return (\n <VideoResult\n key={index}\n item={result as SearchResultsObject<Video>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n case 'playlist': {\n if (useSmallComponent) {\n return (\n <SmallPlaylistResult\n key={index}\n item={result as SearchResultsObject<Playlist>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n return (\n <LargePlaylistResult\n key={index}\n item={result as SearchResultsObject<Playlist>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n case 'series': {\n const series = result as Series;\n\n if (useSmallComponent || !series.tallPoster?.id) {\n return (\n <SmallSeriesResult\n key={index}\n item={result as SearchResultsObject<Series>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n return (\n <LargeSeriesResult\n key={index}\n item={result as SearchResultsObject<Series>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n }\n })}\n </div>\n );\n});\n","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'search.searchSubstitute';\n\ninterface SearchSubstituteProps {\n substitute: string;\n queryParams: HashObject;\n getAppLink: (query: string, queryParams: HashObject) => Core.AppLink;\n}\n\nexport function SearchSubstitute(props: SearchSubstituteProps): JSX.Element {\n if (!props.substitute)\n return <></>;\n\n return (\n <div className='pb-3'>\n <p className='mb-1 h6'>\n <Text namespace={namespace} phrase='showingFor' /> \n <AppLink\n className='info-link'\n appLink={props.getAppLink(props.substitute, props.queryParams)}\n appLinkOptions={{ replace: true }}\n >\n {props.substitute}\n </AppLink>\n </p>\n <p className='mb-0 h6 fw-normal'>\n <Text namespace={namespace} phrase='searchInsteadFor' />\n <AppLink\n className='info-link'\n appLink={props.getAppLink(props.queryParams.query, { ...props.queryParams, allowSubstitute: 'false' })}\n >\n {props.queryParams.query}\n </AppLink>\n <Text namespace={namespace} phrase='endOriginal' />\n </p>\n </div>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'search.searchSuggestions';\n\ninterface SearchSuggestionsProps {\n suggestions: string[];\n queryParams: HashObject;\n getAppLink: (query: string, queryParams: HashObject) => Core.AppLink;\n}\n\nSearchSuggestions.defaultProps = {\n suggestions: [],\n queryParams: {}\n};\n\nexport function SearchSuggestions(props: SearchSuggestionsProps): JSX.Element {\n if (!props.suggestions?.length)\n return <></>;\n\n return (\n <div className='d-flex align-items-center mb-3'>\n <Text namespace={namespace} phrase='didYouMean' />\n \n\n {props.suggestions.map((suggestion, index) => (\n <React.Fragment key={`${suggestion}:${index}`}>\n {index !== 0 && <span className='mx-1'>•</span>}\n\n <AppLink\n className='info-link'\n appLink={props.getAppLink(suggestion, props.queryParams)}\n appLinkOptions={{ replace: true }}\n >\n {suggestion}\n </AppLink>\n </React.Fragment>\n ))}\n </div>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { FilterConstants } from 'libs/shared/apps/search/constants/FilterConstants';\nimport { SearchIndices } from 'libs/shared/apps/search/interfaces';\nimport { FilterHelper, Filters } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { Library, MasterNestedObject, Playlist, Rating, Series, Video } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/ExchangeActions';\nimport { AppChannels } from 'shared/constants/ExchangeRadioChannels';\n\nexport const ExchangeSearchUtils = {\n useOnFilterChange(fetchResults: (cursor?: string) => void, queryParams: HashObject): void {\n const params = { ...queryParams };\n delete params.query;\n \n const sortedValues = Object.keys(params).map(filterName => params[filterName]).sort((a, b) => a - b);\n \n React.useEffect(() => {\n fetchResults();\n }, [sortedValues.join(':')]);\n },\n\n getCollectionActions(\n collection: Series | Playlist,\n showActions: boolean,\n collectionType: 'series' | 'playlist',\n baseAnalyticsOptions: AnalyticsOptions\n ): ActionOptions[] {\n collection;\n collectionType;\n baseAnalyticsOptions;\n\n if (!showActions)\n return [];\n\n return [];\n },\n\n getSeriesAppLink(series: Series): Core.AppLink {\n if (!series?.id)\n return null;\n\n return {\n application: AppChannels.EXCHANGE,\n action: Actions.Exchange.SERIES,\n args: [ series.id, TextHelper.slugify(series.name) ]\n };\n },\n\n getVideoAppLink(video: Video): Core.AppLink {\n if (!video?.id)\n return null;\n\n return {\n application: AppChannels.EXCHANGE,\n action: Actions.Exchange.PREVIEW,\n args: [ video.id, TextHelper.slugify(video.name) ]\n };\n },\n\n getAppliedIndices(queryParams: HashObject = {}): SearchIndices[] {\n const { type: indices } = queryParams;\n\n if (indices) {\n if (!Array.isArray(indices))\n return [indices];\n\n if (indices.length)\n return indices;\n }\n\n return ['video'];\n },\n\n getNestedCategoryIds(topLevelCategoryIds: string | string[], categories: MasterNestedObject<Library>[]) {\n const searchNestedCategories = (categoryId: string) => {\n const categoryIds: string[] = [];\n const category = categories.find(category => +category.data.id === +categoryId);\n\n if (!category?.children.length)\n return [categoryId];\n \n const searchCategoryIds = (category: MasterNestedObject<Library>) => {\n if (!category) return;\n \n if (category.data) {\n categoryIds.push(category.data.id);\n }\n \n if (category.children.length) {\n category.children.forEach(child => {\n searchCategoryIds(child);\n });\n }\n };\n \n searchCategoryIds(category);\n \n return categoryIds;\n };\n\n if (!Array.isArray(topLevelCategoryIds)) {\n return searchNestedCategories(topLevelCategoryIds);\n }\n \n const nestedCategoryIds = [...topLevelCategoryIds].map(categoryId => searchNestedCategories(categoryId));\n\n return ArrayHelper.flatten(nestedCategoryIds);\n },\n\n buildBackendFilterParams(\n libraryId: string,\n queryParams: HashObject,\n ratings: Rating[] = [],\n categories: MasterNestedObject<Library>[]\n ): HashObject {\n const topLevelCategoryIds = queryParams?.categoryId;\n const nestedCategories = topLevelCategoryIds && this.getNestedCategoryIds(topLevelCategoryIds, categories);\n\n const filters = FilterHelper.buildBackendFilterParams(\n { ...queryParams, categoryId: nestedCategories },\n ratings,\n null,\n false,\n []\n );\n\n // TODO: Filtering the search results means that we can't search for series, clips and interactives\n filters[`${FilterConstants.FILTER_PARAM_PREFIX}library`] = libraryId;\n\n return filters;\n },\n\n getBackendFilters(options: {\n queryParams: HashObject,\n ratings: Flight.Response<Rating[]>,\n exchange: Flight.Response<Library>,\n categories: Flight.Response<MasterNestedObject<Library>[]>,\n hasDataLoaded: boolean\n }) {\n if (!options.hasDataLoaded)\n return null;\n\n const { queryParams, ratings, exchange, categories } = options;\n \n const backendFilters = ExchangeSearchUtils.buildBackendFilterParams(\n exchange.data.id,\n queryParams,\n ratings.data,\n categories.data\n );\n \n const appliedIndices = ExchangeSearchUtils.getAppliedIndices(queryParams);\n \n return {\n queryParams,\n backendFilters,\n appliedIndices\n };\n },\n\n getFilters(\n options: {\n categories: Flight.Response<MasterNestedObject<Library>[]>,\n ratings: Flight.Response<Rating[]>,\n hasDataLoaded: boolean\n },\n tagsAndClassifications: Flight.Response<string[]>\n ) {\n if (!options.hasDataLoaded || !tagsAndClassifications.hasCompleted)\n return null;\n\n const { categories, ratings } = options;\n\n const mainFilters = [\n Filters.Categories(categories.data),\n Filters.Rating(ratings.data, null),\n Filters.HasResources(),\n Filters.HasSubtitles(),\n Filters.TagOrClassification(tagsAndClassifications.data)\n ];\n \n const moreFilters = FilterHelper.getMoreFilters([\n Filters.ProductionYear(),\n Filters.IsHD(),\n Filters.Duration()\n ]);\n\n return {\n mainFilters,\n moreFilters\n };\n },\n\n getAppLink(query: string, queryParams: HashObject): Core.AppLink {\n return {\n application: AppChannels.EXCHANGE,\n action: Actions.Exchange.SEARCH,\n params: {\n ...queryParams,\n query\n }\n };\n }\n};\n","import React from 'react';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport { Actions } from 'shared/constants/ExchangeActions';\nimport { AppChannels } from 'shared/constants/ExchangeRadioChannels';\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nconst namespace = 'exchange.searchResultsEmptyState';\n\ninterface ExchangeSearchResultsStateProps {\n query?: string;\n}\n\nexport function ExchangeSearchResultsState(props: ExchangeSearchResultsStateProps): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.SEARCH} />\n\n <EmptyState.Heading>\n {props.query ?\n <Text phrase='headingWithQuery' options={{ query: props.query }} /> :\n <Text phrase='headingWithoutQuery' />\n }\n </EmptyState.Heading>\n\n <EmptyState.Info>\n <Text phrase='info' />\n <AppLink\n className='info-link'\n appLink={{ application: AppChannels.EXCHANGE, action: Actions.Exchange.INDEX }}\n >\n <Text phrase='topicsAppLink' />\n </AppLink>\n </EmptyState.Info>\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}\n","import { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { RatingRequests } from 'libs/shared/flight-requests/RatingRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { CurrentUser, Library, MasterNestedObject, Rating } from 'libs/shared/interfaces';\n\nimport { ExchangeRequests } from 'apps/exchange/flight-requests/ExchangeRequests';\n\nexport function useFetchSearchData(queryParams: HashObject) {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const exchange = Flight.useBasicFetch<Library>(ExchangeRequests.exchange());\n const ratings = Flight.useBasicFetch<Rating[]>(RatingRequests.ratings());\n const categories = Flight.useBasicFetch<MasterNestedObject<Library>[]>(ExchangeRequests.categories());\n\n const hasDataLoaded = (\n currentUser.hasCompleted &&\n exchange.hasCompleted &&\n ratings.hasCompleted &&\n categories.hasCompleted\n );\n\n return {\n queryParams,\n currentUser,\n exchange,\n ratings,\n categories,\n hasDataLoaded\n };\n}\n","import { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport { SearchIndices, SearchResultObjectTypes, SearchResults } from 'libs/shared/apps/search/interfaces';\nimport { handleHttpError } from 'libs/shared/errors/handlers/HttpErrorHandlers';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useInfiniteList } from 'libs/shared/hooks/UseInfiniteList';\n\nimport { ExchangeRequests } from 'apps/exchange/flight-requests/ExchangeRequests';\n\nexport const namespace = 'exchange.searchResultsView2';\n\ninterface UseGetSearchResultsOptions {\n queryParams: HashObject;\n appliedIndices: SearchIndices[];\n backendFilters: HashObject;\n hasDataLoaded: boolean;\n}\nexport function useGetSearchResults(options: UseGetSearchResultsOptions) {\n const { queryParams, appliedIndices, backendFilters } = options;\n\n const alerts = useAlerts();\n const fetch = Flight.useGetFetch();\n\n const searchResultsResponse = Flight.useGetResponse<SearchResults>(getSearchRequest()?.key);\n\n function getSearchRequest(cursor?: string) {\n return options.hasDataLoaded &&\n ExchangeRequests.search(queryParams.query, appliedIndices, backendFilters, cursor);\n }\n\n function fetchNext(cursor?: string) {\n fetch(getSearchRequest(cursor));\n }\n\n function onError(pageNumber: number, httpStatus: HttpStatus): void {\n if (pageNumber === 1)\n return handleHttpError(httpStatus);\n\n alerts.error(LanguageService.getPhrase(namespace, 'error'));\n }\n\n const searchResults = useInfiniteList<SearchResultObjectTypes, SearchResults>(\n getSearchRequest,\n fetchNext,\n onError,\n data => data.results\n );\n\n return {\n ...searchResults,\n fetchNext,\n substituteQuery: searchResultsResponse.data?.substituteQuery,\n suggestions: searchResultsResponse.data?.suggestions\n };\n}\n","import { SharedWithStatements } from 'libs/shared/constants/WithStatements';\nimport { TagType } from 'libs/shared/enums/TagType';\n\n/**\n * OGQL used for search V5 endpoint\n */\nexport const SearchOGQL = {\n video: SharedWithStatements.VIDEO_COLLECTION,\n series: 'rating,tallPoster',\n playlist:\n 'videos[count(),thumbnail]{limit:1},interactives[count(),_thumbnail]{limit:1},' +\n 'clips[count(),_thumbnail]{limit:1}',\n classification: `_theme[banner,cover,tallposter,thumbnail,icon],cover,thumbnail,tags{tagtype:${TagType.Curation}}`,\n clip: SharedWithStatements.CLIP_COLLECTION,\n interactive: SharedWithStatements.INTERACTIVE_COLLECTION,\n company: 'logo',\n category: 'libraries[_logo],thumbnail',\n partner_profile: SharedWithStatements.PARTNER_PROFILE\n};\n","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { FilterConstants } from 'libs/shared/apps/search/constants/FilterConstants';\nimport { SearchOGQL } from 'libs/shared/apps/search/constants/SearchOGQL';\nimport { SearchIndices, SearchResultObjectTypes, SearchResults, SearchResultsObject } from 'libs/shared/apps/search/interfaces';\nimport type { WidgetFilter } from 'libs/shared/apps/search/interfaces/WidgetSearchResults';\nimport { SharedSearchHelper } from 'libs/shared/apps/search/utils/SharedSearchHelper';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport type { Playlist, Series } from 'libs/shared/interfaces';\nimport { ThemeAssetHelper } from 'libs/shared/utils/ThemeAssetHelper';\n\nfunction formatSearchResponse(response: SearchResults<SearchResultObjectTypes>) {\n /**\n * Until playlists and series are regionalised, search will always return every series/playlist that exists\n * even if the current user doesn't have access to the content inside (which will happen for example when playlists/series)\n * contain all UK library content but is being searched for by an AU user.\n *\n * For some search queries, this may result in search showing a bunch of \"empty\" playlists/series, which sucks.\n * This will filter all empty collections out and decrement the `totalResults` to avoid this and make search a better\n * experience.\n *\n * Ideally this will be removed one day when this regionalisation is no longer an issue.\n */\n let totalResults = response.totalResults;\n\n const results = response?.results?.filter(result => {\n if (result._index !== 'series' && result._index !== 'playlist')\n return true;\n\n if (result._index === 'playlist') {\n const playlist = result as SearchResultsObject<Playlist>;\n\n if (playlist.clips?.data?.length ||\n playlist.interactives?.data?.length ||\n playlist.videos?.data?.length)\n return true;\n\n totalResults--;\n return false;\n }\n\n if ((result as SearchResultsObject<Series>).videos?.data?.length === 0) {\n totalResults--;\n return false;\n }\n\n return true;\n }) ?? [];\n\n response.results = results;\n response.totalResults = totalResults;\n\n // The first search result will always have the highest score value.\n // We store it so that we can access it for subsequent results pages\n const resultMaxScore = results[0]?._score;\n\n return {\n ...response,\n results: SharedSearchHelper.mapMaxScoreToSearchResults(results, resultMaxScore)\n };\n}\n\nfunction stringifyObject(obj: HashObject): string {\n return Object.entries(obj).reduce((prev, [ , value ]) => {\n let stringifiedValue = value;\n\n if (typeof value === 'object') {\n stringifiedValue = stringifyObject(value);\n } else if ([ 'number', 'boolean', 'string' ].includes(typeof value)) {\n stringifiedValue = value.toString();\n }\n\n if (!prev.length)\n return stringifiedValue;\n\n return `${prev},${stringifiedValue}`;\n }, '');\n}\n\n/**\n * We want to map the filters to the global filters object but we need to remove the filter prefix\n * and exclude the presentation filter\n */\nfunction getGlobalFilters(filters: HashObject, widgetTypeId: WidgetTypeId | null): Record<string, any> {\n return Object.entries(filters)\n .reduce((prev, [ key, value ]) => {\n const actualKey = key.replace(FilterConstants.FILTER_PARAM_PREFIX, '');\n if (actualKey === 'presentation' &&\n widgetTypeId !== WidgetTypeId.SearchTopResults &&\n widgetTypeId !== WidgetTypeId.SearchRelatedResults &&\n widgetTypeId !== WidgetTypeId.SearchSeries\n ) {\n return prev;\n }\n\n return { ...prev, [actualKey]: value };\n }, {});\n}\n\nexport const SharedSearchRequests = {\n searchDashboard(\n query: string,\n filters: HashObject,\n widgets: WidgetFilter[] = []\n ): Flight.PublicRequest {\n const widgetData = widgets.sort((a, b) => a.id.localeCompare(b.id)).map(w => [ w.id, w?.cursor ]);\n const filterData = stringifyObject(filters);\n \n const key = `search:v5:dashboard:${query}:${widgetData}:${filterData}`;\n \n const {\n [`${FilterConstants.FILTER_PARAM_PREFIX}indicesFilters`]: indicesFilter,\n isLearner,\n ...genericFilters\n } = filters;\n\n const data = {\n widgets,\n indices: indicesFilter,\n filters: getGlobalFilters(genericFilters, null),\n query,\n includeAllIndices: false,\n isLearner: !!isLearner\n };\n\n return {\n url: '{gateway}/v5/search/widgets',\n publicUrl: '/api/search/v5/widgets',\n type: HttpVerbs.POST,\n data,\n key\n };\n },\n\n searchDashboardWidget(\n widgetTypeId: WidgetTypeId,\n query: string,\n filters: HashObject,\n widgets: WidgetFilter[] = []\n ): Flight.PublicRequest {\n const widgetData = widgets.sort((a, b) => a.id.localeCompare(b.id)).map(w => [ w.id, w?.cursor ]);\n const filterData = stringifyObject(filters);\n \n const key = `search:v5:dashboard:${widgetTypeId}:widget:${query}:${widgetData}:${filterData}`;\n \n const {\n [`${FilterConstants.FILTER_PARAM_PREFIX}indicesFilters`]: indicesFilter,\n isLearner,\n excludeVideoIds,\n ...genericFilters\n } = filters;\n\n const data = {\n widgets,\n indices: indicesFilter,\n filters: getGlobalFilters(genericFilters, widgetTypeId),\n query,\n includeAllIndices: false,\n isLearner: !!isLearner,\n ogql: SearchOGQL,\n excludeVideoIds\n };\n\n return {\n url: `{gateway}/v5/search/widgets/${widgetTypeId}`,\n publicUrl: `/api/search/v5/widgets/${widgetTypeId}`,\n type: HttpVerbs.POST,\n data,\n key,\n formatData: (data: HashObject) => {\n if (!data)\n return data;\n\n return {\n ...data,\n content: data.content?.data ?\n { ...data.content, data: data.content.data.map(ThemeAssetHelper.applyThemeToClassification) } :\n data.content\n };\n }\n };\n },\n\n searchV5(\n query: string,\n filters: HashObject,\n widgets: WidgetFilter[] = []\n ): Flight.PublicRequest {\n const widgetData = widgets.sort((a, b) => a.id.localeCompare(b.id)).map(w => [ w.id, w?.cursor ]);\n const filterData = stringifyObject(filters);\n \n const key = `search:v5:${query}:${widgetData}:${filterData}`;\n \n const {\n [`${FilterConstants.FILTER_PARAM_PREFIX}indicesFilters`]: indicesFilter,\n isLearner,\n ...genericFilters\n } = filters;\n\n const data = {\n widgets,\n indices: indicesFilter,\n filters: Object.entries(genericFilters)\n .reduce((prev, [ key, value ]) =>\n ({ ...prev, [key.replace('filters.', '')]: value }), {}),\n query,\n includeAllIndices: false,\n isLearner: !!isLearner,\n ogql: SearchOGQL\n };\n\n return {\n url: '{gateway}/v5/search',\n publicUrl: '/api/search/v5',\n type: HttpVerbs.POST,\n data,\n key\n };\n },\n \n searchV4(options: {\n query: string,\n indices: SearchIndices[],\n filters: HashObject,\n sorts?: HashObject,\n allowSubstitute: boolean,\n cursor?: string,\n limit?: number\n }): Flight.PublicRequest {\n const { query, indices, filters = {}, sorts = {}, allowSubstitute = true, cursor, limit } = options;\n\n let key = `search:v4:${query}:${allowSubstitute}:${indices}:${cursor}`;\n\n key += Object.keys(filters).map(filterName => {\n const filter = filters[filterName];\n return Array.isArray(filter) ? filter.join(';') : filter;\n }).join(';');\n\n const {\n [`${FilterConstants.FILTER_PARAM_PREFIX}excludeLibraryExclusive`]: excludeLibraryExclusive,\n isLearner,\n ...genericFilters\n } = filters;\n\n const indexObjects = indices.map(index => {\n if (index !== 'video' || !excludeLibraryExclusive)\n return { index };\n\n return { index, filters: { excludeLibraryExclusive } };\n });\n\n const data = {\n searchType: 'content',\n indices: indexObjects,\n filters: Object.entries(genericFilters)\n .reduce((prev, [ key, value ]) =>\n ({ ...prev, [key.replace('filters.', '')]: value }), {}),\n sorts,\n query,\n allowSubstitute,\n cursor: cursor ?? undefined,\n isLearner: !!isLearner,\n limit\n };\n\n return {\n url: '{gateway}/v4/search',\n publicUrl: '/api/search/v4',\n type: HttpVerbs.POST,\n data,\n key,\n formatData: formatSearchResponse\n };\n },\n\n search(options: {\n query: string,\n indices: SearchIndices[],\n filters?: HashObject,\n allowSubstitute?: boolean,\n cursor?: string,\n limit?: number,\n success?: (results: SearchResults) => void,\n error?: (xhr: Xhr) => void\n }): Flight.PublicRequest {\n const { query, indices, filters, allowSubstitute, cursor, limit, success, error } = options;\n\n let key = `search:${query}:${allowSubstitute}:${indices}:${cursor}`;\n\n key += Object.keys(filters).map(filterName => {\n const filter = filters[filterName];\n return Array.isArray(filter) ? filter.join(';') : filter;\n }).join(';');\n\n const params = Object.assign({}, {\n index: indices,\n cursor: cursor ?? undefined,\n query,\n allowSubstitute,\n limit,\n ...filters\n });\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v3/search', params),\n publicUrl: UrlHelper.urlBuilder('/api/search', params),\n key,\n formatData: formatSearchResponse,\n success,\n error\n };\n },\n\n tagsAndClassifications(\n query: string,\n indices: SearchIndices[],\n filters: HashObject = {},\n cursor?: string,\n success?: (results: string[]) => void,\n error?: () => void\n ): Flight.PublicRequest {\n const params = {\n index: indices,\n cursor,\n query,\n ...filters\n };\n\n let key = `filter:options:${query}:${indices.join(':')}:${cursor}`;\n\n key += Object.keys(filters).map(filterName => {\n const filter = filters[filterName];\n return Array.isArray(filter) ? filter.join(';') : filter;\n }).join(';');\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v3/search/tags-and-classifications', params),\n publicUrl: UrlHelper.urlBuilder('/api/search/tags-and-classifications', params),\n key,\n success,\n error,\n normalize: false\n };\n }\n};\n","import { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { SharedSearchRequests } from 'libs/shared/apps/search/flight-requests/SharedSearchRequests';\nimport { SearchIndices } from 'libs/shared/apps/search/interfaces';\n\nexport interface UseGetTagsAndClassificationsOptions {\n queryParams: HashObject;\n appliedIndices: SearchIndices[];\n backendFilters: HashObject;\n}\n\nexport function useGetTagsAndClassifications(options: UseGetTagsAndClassificationsOptions) {\n return Flight.useBasicFetch<string[]>(options && SharedSearchRequests.tagsAndClassifications(\n options.queryParams.query,\n options.appliedIndices,\n options.backendFilters\n ));\n}\n","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { EntityType, LocationContext } from 'libs/analytics/interfaces';\n\nimport { MixedSearchResults } from 'libs/shared/apps/search/components/mixed-search-results/MixedSearchResults';\nimport { SearchFilters } from 'libs/shared/apps/search/components/search-filters/SearchFilters';\nimport { SearchSubstitute } from 'libs/shared/apps/search/components/search-substitute/SearchSubstitute';\nimport { SearchSuggestions } from 'libs/shared/apps/search/components/search-suggestions/SearchSuggestions';\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { PartialVideoList } from 'libs/shared/components/video-list/partial-loading/PartialVideoList';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\n\nimport { Actions } from 'shared/constants/ExchangeActions';\nimport { AppChannels } from 'shared/constants/ExchangeRadioChannels';\n\nimport { ExchangeSearchBar } from 'apps/exchange/components/exchange-search-bar/ExchangeSearchBar';\nimport { useCommonVideoProps } from 'apps/exchange/hooks/useCommonVideoProps';\nimport { useGetExchangeActions } from 'apps/exchange/hooks/useGetExchangeActions';\nimport { ExchangeSearchUtils } from 'apps/exchange/views/exchange-search-results/ExchangeSearchUtils';\n\nimport { ExchangeSearchResultsState } from './empty-state/ExchangeSearchEmptyState';\nimport { useFetchSearchData } from './useFetchSearchData';\nimport { useGetSearchResults } from './useGetSearchResults';\nimport { useGetTagsAndClassifications } from './useGetTagsAndClassifications';\n\ninterface ExchangeSearchResultsViewProps {\n queryParams: HashObject;\n}\n\nexport function ExchangeSearchResultsView(props: ExchangeSearchResultsViewProps): JSX.Element {\n const { queryParams = {} } = props;\n\n const videoActions = useGetExchangeActions('video-list');\n\n const searchData = useFetchSearchData(queryParams);\n\n const { commonVideoProps } = useCommonVideoProps();\n\n const searchFilters = ExchangeSearchUtils.getBackendFilters(searchData);\n\n const tagsAndClassifications = useGetTagsAndClassifications(searchFilters);\n const searchResults = useGetSearchResults({ ...searchFilters, ...searchData });\n\n const filters = ExchangeSearchUtils.getFilters(searchData, tagsAndClassifications);\n\n /**\n * Custom hooks\n */\n useSetPageMetadata({ title: queryParams.query ?? '' });\n\n /**\n * Do we have the data we need for the entire view to render\n */\n const hasLoaded = (\n searchData.hasDataLoaded && filters\n );\n\n /**\n * Do we have the data we need to render our results\n */\n const hasSearchCompleted = (\n searchResults.hasFirstPageCompleted &&\n // Topic and Company requests won't exist if they aren't being fetched\n tagsAndClassifications.hasCompleted &&\n !!filters\n );\n\n /**\n * Do we actually have results\n */\n const hasResults = (\n searchResults.items?.length\n );\n\n if (!hasLoaded)\n return <></>;\n\n return (\n <>\n <ExchangeSearchBar query={queryParams.query} />\n\n <SearchSubstitute\n substitute={searchResults.substituteQuery}\n queryParams={queryParams}\n getAppLink={ExchangeSearchUtils.getAppLink}\n />\n\n {!searchResults.substituteQuery && (\n <SearchSuggestions\n suggestions={searchResults?.suggestions}\n queryParams={queryParams}\n getAppLink={ExchangeSearchUtils.getAppLink}\n />\n )}\n\n <SearchFilters\n queryParams={queryParams}\n mainFilters={filters?.mainFilters}\n moreFilters={filters?.moreFilters}\n analyticsOptions={{\n entity: EntityType.SearchResults,\n location: LocationContext.SearchFilters\n }}\n appLink={{ application: AppChannels.EXCHANGE, action: Actions.Exchange.SEARCH }}\n isFetchingOptions={tagsAndClassifications.isFetching}\n />\n\n {hasSearchCompleted ? (\n <section>\n {hasResults ?\n (\n <VideoActionsContext.Provider value={videoActions}>\n {/* // TODO: Update the prop interfaces for mixed search results to be strongly typed for each use case */}\n <MixedSearchResults\n queryParams={queryParams.query}\n results={searchResults.items}\n audiences={null}\n currentUser={searchData.currentUser.data}\n availablePresentations={null}\n showActions\n companies={null}\n hasPermissions={() => false}\n appLinks={{\n getCollectionActions: ExchangeSearchUtils.getCollectionActions,\n getSeriesAppLink: ExchangeSearchUtils.getSeriesAppLink,\n getVideoAppLink: ExchangeSearchUtils.getVideoAppLink,\n getClassificationAppLink: () => null,\n getClassificationAppLinkOptions: () => null,\n getPlaylistAppLink: () => null,\n getCompanyAppLink: () => null,\n getPreviewQuestionsAppLink: () => null\n }}\n commonVideoProps={commonVideoProps}\n />\n </VideoActionsContext.Provider>\n ) : (\n <ExchangeSearchResultsState query={queryParams.query} />\n )\n }\n {searchResults.hasMore && (\n <InfiniteScrollFooter\n isFetching={searchResults.isFetching}\n fetchNext={searchResults.fetchNext}\n nextCursor={searchResults.nextCursor}\n />\n )}\n </section>\n ) : (\n <div className='mx-n2'>\n <PartialVideoList />\n </div>\n )}\n </>\n );\n}\n"],"x_google_ignoreList":[11,12,13,14,15,16],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DmmZ2XbB2.chunk.js","names":["en_US","zh_CN"],"sources":["../../../../libs/shared/src/components/widgets/items/subject-widget-item/cover-pill.module.scss","../../../../libs/shared/src/components/widgets/items/subject-widget-item/CoverPill.tsx","../../../../libs/shared/src/components/widgets/items/subject-widget-item/CompanyWidgetItem.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/CompanyResult.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/mixed-search-results.module.scss","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/exchange-video-group/ExchangeVideoGroup.tsx","../../../../libs/shared/src/apps/subjects/components/hero-video/hero-video.module.scss","../../../../libs/shared/src/apps/subjects/components/hero-video/HeroVideo.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/FeaturedVideoResult.tsx","../../../../libs/shared/src/apps/playlists/components/playlist-list/playlist.module.scss","../../../../libs/shared/src/apps/playlists/components/playlist-list/PartialPlaylistList.tsx","../../../../../node_modules/timeago.js/esm/lang/en_US.js","../../../../../node_modules/timeago.js/esm/lang/zh_CN.js","../../../../../node_modules/timeago.js/esm/register.js","../../../../../node_modules/timeago.js/esm/utils/date.js","../../../../../node_modules/timeago.js/esm/format.js","../../../../../node_modules/timeago.js/esm/index.js","../../../../libs/shared/src/apps/playlists/components/playlist-count/PlaylistCount.tsx","../../../../libs/shared/src/components/clickview-avatar/clickview-avatar.module.scss","../../../../libs/shared/src/components/clickview-avatar/ClickViewAvatar.tsx","../../../../libs/shared/src/apps/playlists/components/playlist-list/PlaylistOwnerAvatar.tsx","../../../../libs/shared/src/apps/playlists/components/playlist-list/PlaylistItem.tsx","../../../../libs/shared/src/apps/playlists/components/playlist-list/PlaylistList.tsx","../../../../libs/shared/src/apps/search/components/playlist-with-videos/playlist-with-videos.module.scss","../../../../libs/shared/src/apps/search/components/playlist-with-videos/PlaylistWithVideos.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/LargePlaylistResults.tsx","../../../../libs/shared/src/components/series-tall-poster/series-tall-poster.module.scss","../../../../libs/shared/src/components/series-tall-poster/SeriesTallPoster.tsx","../../../../libs/shared/src/apps/search/components/series-with-videos/series-with-videos.module.scss","../../../../libs/shared/src/apps/search/components/series-with-videos/SeriesWithVideos.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/LargeSeriesResult.tsx","../../../../libs/shared/src/apps/search/components/collection-video-list/CollectionVideoList.tsx","../../../../libs/shared/src/apps/search/components/collection-thumbnail/collection-thumbnail.module.scss","../../../../libs/shared/src/apps/search/components/collection-thumbnail/CollectionThumbnail.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/SmallPlaylistResult.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/SmallSeriesResults.tsx","../../../../libs/shared/src/enums/ClassificationStatus.ts","../../../../libs/shared/src/components/widgets/items/subject-widget-item/SubjectWidgetItem.tsx","../../../../libs/shared/src/components/widgets/items/subject-widget-item/EditSubjectsWidgetLink.tsx","../../../../libs/shared/src/components/widgets/items/subject-widget-item/AllSubjectsWidgetLink.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/SubjectResult.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/VideoResult.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/MixedSearchResults.tsx","../../../../libs/shared/src/apps/search/components/search-substitute/SearchSubstitute.tsx","../../../../libs/shared/src/apps/search/components/search-suggestions/SearchSuggestions.tsx","../../src/apps/exchange/views/exchange-search-results/ExchangeSearchUtils.ts","../../src/apps/exchange/views/exchange-search-results/empty-state/ExchangeSearchEmptyState.tsx","../../src/apps/exchange/views/exchange-search-results/useFetchSearchData.ts","../../src/apps/exchange/views/exchange-search-results/useGetSearchResults.ts","../../../../libs/shared/src/apps/search/constants/SearchOGQL.ts","../../../../libs/shared/src/apps/search/flight-requests/SharedSearchRequests.ts","../../src/apps/exchange/views/exchange-search-results/useGetTagsAndClassifications.ts","../../src/apps/exchange/views/exchange-search-results/ExchangeSearchResultsView.tsx"],"sourcesContent":["@import '~styles/utils/include-media';\n:local {\n $classification-cover-height: 5rem; // 80px\n $classification-cover-height-lg: 8rem; // 128px\n\n .appLink:hover {\n text-decoration: none;\n\n .name {\n text-decoration: underline;\n }\n }\n\n .selectedMask {\n background-color: rgba($green, 0.1);\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n\n .widgetItem {\n border-radius: $border-radius-lg;\n overflow: hidden;\n \n &.hasThemeColor {\n border: 0.0625rem solid var(--themeColor);\n background-color: color-mix(in srgb, var(--themeColor) 10%, white);\n &:hover {\n background-color: color-mix(in srgb, var(--themeColor) 15%, white);\n }\n }\n\n .text {\n font-size: $font-size-base;\n }\n\n .imagePanel {\n position: relative;\n background-position: top;\n background-size: cover;\n width: $classification-cover-height;\n height: $classification-cover-height;\n flex-shrink: 0;\n\n .selected {\n width: 2.5rem;\n height: 2.5rem;\n position: absolute;\n top: 50%;\n z-index: 5;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n\n .image {\n z-index: 2;\n position: relative;\n width: 100%;\n height: 100%;\n background-position: center;\n background-size: cover;\n background-repeat: no-repeat;\n }\n }\n\n .dragHandle {\n height: $classification-cover-height;\n color: $gray-700;\n }\n\n .large {\n width: $classification-cover-height-lg;\n height: $classification-cover-height-lg;\n \n @include media(\">=sm\", \"<=700px\") {\n width: $classification-cover-height;\n height: $classification-cover-height;\n }\n }\n\n .comingSoonPanel {\n line-height: 1;\n }\n\n .name {\n color: $gray-900;\n }\n }\n\n .newVideos {\n font-size: 0.6875rem; // 11px\n }\n\n .editSubjectsItem {\n height: $classification-cover-height;\n border-radius: $border-radius-lg;\n color: $gray-500;\n border: 1px dashed $gray-400;\n }\n\n .allSubjectsItem {\n height: $classification-cover-height;\n color: $white;\n border-radius: $border-radius-lg;\n border: 1px solid $gray-400;\n\n .logoContainer {\n height: 1.1rem;\n width: 6rem;\n }\n }\n\n .draggingItem {\n border: 2px dashed $border-color;\n height: $classification-cover-height;\n }\n\n .partialLargeImage {\n @extend .imagePanel;\n width: $classification-cover-height-lg !important;\n height: $classification-cover-height-lg !important;\n }\n\n .partialLargeFallback {\n width: $classification-cover-height-lg;\n height: $classification-cover-height-lg;\n }\n\n .partialIcon {\n z-index: 1;\n }\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\nimport { RandomHelper } from 'libs/common/react/utils/RandomHelper';\n\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { IconCircle } from 'libs/shared/components/icon-circle/IconCircle';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { CheckSvg } from 'libs/shared/images/svg/status/CheckSvg';\nimport { BaseObject, Classification, Presentation } from 'libs/shared/interfaces';\nimport { getBgColorClass } from 'libs/shared/utils/getBgColorClass';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\nimport { MasterTypeHelper } from 'libs/shared/utils/MasterTypeHelper';\n\nimport styles from './cover-pill.module.scss';\n\nconst namespace = 'shared.subjectWidgetItem';\n\ninterface NamePanelProps {\n name: string;\n multiline?: boolean;\n subtitle?: string;\n noUnderLine?: boolean;\n newVideosCount?: number;\n}\n\nconst ComingSoonNamePanel = ({ name, multiline, noUnderLine }: NamePanelProps) => {\n let wrapperClassName = `${styles.comingSoonPanel} \n d-flex flex-column align-items-center justify-content-center px-3 text-center`;\n\n let textClassName = '';\n\n if (!multiline) {\n wrapperClassName += ' text-nowrap';\n textClassName += ' text-truncate';\n } else {\n textClassName += ` ${styles.clamped} clamp-2`;\n }\n\n return (\n <div className={wrapperClassName}>\n <small className='text-secondary'><Text namespace={namespace} phrase='comingSoon' /></small>\n <p className={`${noUnderLine ? '' : styles.name} h6`}><span className={textClassName}>{name}</span></p>\n </div>\n );\n};\n\nconst NormalNamePanel = ({ name, multiline, subtitle, noUnderLine, newVideosCount }: NamePanelProps) => {\n let wrapperClassName = 'px-3 d-flex flex-column justify-content-center';\n let textClassName = `${noUnderLine ? '' : styles.name} h6`;\n\n if (!multiline) {\n wrapperClassName += ' text-nowrap text-truncate';\n textClassName += ' text-truncate mb-0';\n } else {\n textClassName += ` ${newVideosCount ? 'clamp-2' : 'clamp-3'} text-start`;\n }\n\n return (\n <div className={wrapperClassName}>\n {subtitle && <div className={`text-secondary clamp-1 ${styles.text}`}>{subtitle}</div>}\n <div className={textClassName} title={name}>{name}</div>\n {!!newVideosCount && (\n <div className={`fw-semibold d-inline-block rounded-pill px-2 mt-1 bg-light-green w-fit h-fit text-green ${styles.newVideos}`}>\n <Text namespace={namespace} phrase='newVideos' options={{ smartCount: newVideosCount }} />\n </div>\n )}\n </div>\n );\n};\n\nexport interface CoverPillWidgetItemProps<T extends BaseObject> {\n data: T;\n getChildAppLink?: (data: T) => Core.AppLink;\n getChildAppLinkOptions?: () => Core.AppLinkOptions;\n isLarge?: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n availablePresentations?: Presentation[];\n getSubtitle?: (data: T) => string;\n multiline?: boolean;\n // set to true it will highlight on hover and also remove the hover text underline\n highlightOnHover?: boolean;\n showNewVideosCount?: boolean;\n shouldHighlight?: (data: T) => boolean;\n showFallbackBackgroundColour?: boolean;\n onClick?: () => void;\n}\n\nCoverPillWidgetContent.defaultProps = {\n showFallbackBackgroundColour: true\n};\n\ninterface CoverPillWidgetContentProps<T> extends CoverPillWidgetItemProps<T> {\n coverUrl?: string;\n coverBgColor?: string;\n subtitle?: string;\n isComingSoon?: boolean;\n className?: string;\n imageClassName?: string;\n isSelected?: boolean;\n hideFallback?: boolean;\n hideCheckmark?: boolean;\n themeColor?: string;\n}\n\nexport function CoverPillWidgetContent(props: CoverPillWidgetContentProps<BaseObject>): JSX.Element {\n const coverUrl = ImageHelper.createUrl(props.coverUrl, { size: props.isLarge ? ImageSize.Medium : ImageSize.Small });\n\n let classification: Classification | undefined = undefined;\n if (MasterTypeHelper.isClassification(props.data)) {\n classification = props.data;\n }\n\n const childProps = {\n name: props.data.name,\n multiline: props.isLarge || props.multiline,\n subtitle: props.subtitle,\n noUnderLine: props.highlightOnHover,\n newVideosCount: props.showNewVideosCount ? classification?.externalMetadata?.childDashboardNewVideoCount : 0\n };\n\n const coverStyle: React.CSSProperties = {\n backgroundImage: coverUrl ? `url('${coverUrl}')` : null,\n backgroundColor: props.coverBgColor\n };\n\n const fallbackCoverBgClassName = getBgColorClass(props.data.name, BG_COLOUR_CLASS_NAMES);\n\n return (\n <div\n className={classNames(\n props.themeColor ? styles.hasThemeColor : 'border',\n 'd-flex position-relative',\n props.className,\n styles.widgetItem,\n props.isSelected ? 'border-success border-2' : '',\n props.highlightOnHover && !props.themeColor ? 'bg-light-blue-hover' : ''\n )}\n style={props.themeColor ? { '--themeColor': props.themeColor } as unknown as React.CSSProperties : {}}\n id={`${props.data.id}-${RandomHelper.getRandomInt()}`}\n onClick={props.onClick}\n >\n {props.isSelected && (\n <div className={`${styles.selectedMask} border-2`} />\n )}\n\n <div className={`${styles.imagePanel} ${props.isLarge ? styles.large : ''}`}>\n {props.isSelected && !props.hideCheckmark && (\n <div className={styles.selected}>\n <IconCircle svg={CheckSvg} svgSize={SvgContainerSize.Large} textVariant='white' variant='green' />\n </div>\n )}\n\n {coverUrl &&\n <div\n className={classNames(\n styles.image,\n props.imageClassName,\n !props.coverBgColor && props.showFallbackBackgroundColour && fallbackCoverBgClassName\n )}\n style={coverStyle}\n />\n }\n {!props.hideFallback && (\n <ImageFallback\n type={ImageFallbackType.Subject}\n extraClasses={props.isLarge ? styles.large : ''}\n />\n )}\n </div>\n\n {props.isComingSoon ?\n <ComingSoonNamePanel {...childProps} /> :\n <NormalNamePanel {...childProps} />\n }\n </div>\n );\n}\n\nexport function CoverPillWidgetContentWrapper(props: CoverPillWidgetContentProps<BaseObject>) {\n const appLink = props.getChildAppLink ? props.getChildAppLink(props.data) : null;\n\n return (\n <>\n {appLink ? (\n <AppLink\n className={styles.appLink}\n appLink={appLink}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n appLinkOptions={props.getChildAppLinkOptions?.()}\n >\n <CoverPillWidgetContent {...props} />\n </AppLink>\n ) : (<CoverPillWidgetContent {...props} />)\n }\n </>\n );\n}\n","import * as React from 'react';\n\nimport { ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { CoverPillWidgetContentWrapper, CoverPillWidgetItemProps } from 'libs/shared/components/widgets/items/subject-widget-item/CoverPill';\nimport { Company } from 'libs/shared/interfaces';\n\nexport function CompanyWidgetItem(props: CoverPillWidgetItemProps<Company>): JSX.Element {\n const analyticsData = {\n ...props.analyticsData,\n id: props.data?.id,\n name: props.data?.name\n };\n\n const analyticsOptions = {\n location: LocationContext.ClassificationListItem,\n ...props.analyticsOptions,\n actionType: UserAction.Click,\n entity: EntityType.Company,\n descriptor: ClickDescriptor.Cover\n };\n\n return (\n <CoverPillWidgetContentWrapper\n {...props}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n coverUrl={props.data.logo?.url}\n coverBgColor={props.data.metadata?.colour}\n />\n );\n}\n","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { CompanyWidgetItem } from 'libs/shared/components/widgets/items/subject-widget-item/CompanyWidgetItem';\nimport { Company } from 'libs/shared/interfaces';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function CompanyResult(props: MixedSearchResultItemProps<Company>): JSX.Element {\n return (\n <Col as='li' sm={6} md={props.useLargeStyle ? 6 : 4} lg={props.useLargeStyle ? 4 : 3}>\n <div className='position-relative px-1 mb-2'>\n <CompanyWidgetItem\n data={props.item}\n getChildAppLink={props.appLinks.getCompanyAppLink}\n getChildAppLinkOptions={() => props.appLinks.getCompanyAppLinkOptions?.(props.item)}\n analyticsData={{\n itemIndex: props.itemIndex,\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: 0\n }}\n isLarge={props.useLargeStyle}\n />\n </div>\n </Col>\n );\n}\n","@import '~styles/utils/include-media';\n:local {\n .videoList {\n margin: 0 -#{map-get($spacers, 2)};\n \n @include media('<=md') {\n margin: 0;\n }\n }\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { ClickDescriptor, EntityType, HashObject, LocationContext, SearchSourceDescriptor, UserAction } from 'libs/analytics/interfaces';\n\nimport { SourceFilterOptions } from 'libs/shared/apps/search/interfaces';\nimport { type ExchangeVideoGroup as ExchangeVideoGroupData } from 'libs/shared/apps/search/interfaces/SearchResults';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoItem } from 'libs/shared/components/video-list/video-item/VideoItem';\n\nimport { MixedSearchResultItemProps } from './../MixedSearchResultItemProps';\n\nimport styles from '../../mixed-search-results.module.scss';\n\nconst namespace = 'search.exchangeVideoGroup';\n\nconst EXCHANGE_RESULT_DISPLAY_LIMIT = 3;\n\nexport function ExchangeVideoGroup(props: MixedSearchResultItemProps<ExchangeVideoGroupData>): JSX.Element {\n const limit = props.item.showCount >= EXCHANGE_RESULT_DISPLAY_LIMIT ?\n EXCHANGE_RESULT_DISPLAY_LIMIT :\n props.item.showCount;\n\n function getContainerClassName(): string {\n if (props.pagePositionIndex === 0)\n return 'border-bottom pb-1 mb-3';\n\n return 'border-top border-bottom pt-3 mt-2 pb-1 mb-3';\n }\n\n const currentAppLink = Core.AppLinkHelper.getCurrentAppLink();\n const currentParams = (currentAppLink.params as HashObject) ?? {};\n let currentSource = currentParams?.source ?? [];\n\n if (currentSource && !Array.isArray(currentSource))\n currentSource = [currentSource];\n\n const searchAppLink = {\n ...currentAppLink,\n params: {\n ...currentParams,\n source: [ ...(currentSource), SourceFilterOptions.ExchangeArchive ]\n }\n };\n\n const analyticsData = {\n query: props.queryParams.query,\n itemIndex: props.itemIndex,\n pagePositionIndex: props.pagePositionIndex\n };\n const analyticsOptions = {\n entity: EntityType.SearchResults,\n location: LocationContext.ExchangeSearchGroupItem,\n actionType: UserAction.Click,\n descriptor: SearchSourceDescriptor.ExchangeArchive\n };\n\n return (\n <div className={getContainerClassName()}>\n <AppLink\n appLink={searchAppLink}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n >\n <h2 className='h4'>\n <Text namespace={namespace} phrase='heading' />\n </h2>\n </AppLink>\n <p>\n <Text namespace={namespace} phrase='message' />\n \n <AppLink\n appLink={props.appLinks.searchSettings}\n className='text-info'\n analyticsData={analyticsData}\n analyticsOptions={{\n ...analyticsOptions,\n descriptor: ClickDescriptor.Settings\n }}\n >\n <Text namespace={namespace} phrase='searchSettings' />\n </AppLink>\n .\n </p>\n\n <div className={`position-relative ${styles.videoList}`}>\n {props.item.videos.slice(0, limit).map((v, i) => {\n return (\n <VideoItem\n key={i}\n video={v}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n presentationAudiences={props.audiences}\n analyticsData= {{\n search: {\n query: props.queryParams.query,\n score: v._score,\n maxScore: v._maxScore,\n featured: v._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n />\n );\n })}\n </div>\n <div className='text-center py-2'>\n <AppLink\n className='text-secondary'\n appLink={searchAppLink}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n >\n <Text namespace={namespace} phrase='seeMore' />\n </AppLink>\n </div>\n </div>\n );\n}\n","@import '~styles/utils/mixins';\n@import '~styles/utils/include-media';\n:local {\n .partialHeroThumbnail {\n position: relative;\n width: 100%;\n padding-bottom: 56.25%;\n }\n\n .partialSeriesText {\n width: 6.25rem;\n height: 1rem;\n }\n\n .partialVideoTitleText {\n width: 16rem;\n height: 2rem;\n }\n\n .partialBadge {\n width: 4rem;\n height: 1rem;\n }\n\n .partialDescription {\n width: 80%;\n height: 4rem;\n }\n\n .partialSubject {\n width: 6.25rem;\n height: 1.5rem;\n }\n\n .partialHeading {\n height: 1.5rem;\n width: 8.4375rem;\n }\n\n .guidance {\n position: absolute;\n bottom: 0;\n gap: map-get($spacers, 1);\n\n @include media(\"<md\") {\n position: relative;\n }\n }\n\n .responsiveGuidance {\n @include media('>md') {\n @include responsive-guidance-tags;\n }\n\n @include media('<=sm') {\n @include responsive-guidance-tags;\n }\n }\n\n .description {\n @include clamp(4);\n \n @include media(\"<xl\") {\n @include clamp(3);\n }\n \n @include media(\"<md\") {\n display: none;\n }\n }\n\n .details {\n @include media(\"<md\") {\n padding-top: map-get($spacers, 2);\n }\n }\n}","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, LocationContext } from 'libs/analytics/interfaces';\n\nimport { AudienceLabel } from 'libs/shared/components/audience-label/AudienceLabel';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { VideoItemGuidance } from 'libs/shared/components/video-list/components/video-guidance/VideoItemGuidance';\nimport { VideoItemActions } from 'libs/shared/components/video-list/components/video-item-actions/VideoItemActions';\nimport { VideoItemTitle } from 'libs/shared/components/video-list/components/video-item-title/VideoItemTitle';\nimport { VideoSubText } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { PresentationAudience, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './hero-video.module.scss';\n\ninterface HeroVideoProps {\n video: Video;\n presentationAudiences: PresentationAudience[];\n showVideoGuidance: boolean;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n hideInteractiveBadge?: boolean;\n badgePosition?: 'thumbnail' | 'info-panel';\n titleClassName?: string;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n commonVideoProps: CommonVideoProps;\n showNewVideoIndicator?: boolean;\n}\n\nHeroVideo.defaultProps = {\n newDurationStyle: true,\n badgePosition: 'thumbnail'\n};\n\nexport function HeroVideo(props: HeroVideoProps): JSX.Element {\n const videoAudiences = props.video?.subjectPresentationAudiences?.data;\n const mergedAudience = useMergeAudiences(videoAudiences, props.presentationAudiences);\n\n const analyticsOptions = AnalyticsHelper.mergeOptions(props.analyticsOptions, {\n location: LocationContext.ClassificationHero,\n entity: VideoHelper.getAnalyticsEntity(props.video)\n });\n\n const containerRef = React.useRef(null);\n \n if (!props.video)\n return <></>;\n\n return (\n <Row>\n <Col xs={12} md={6}>\n <div ref={containerRef} >\n <VideoThumbnail\n analyticsOptions={analyticsOptions}\n video={props.video}\n appLink={props.getVideoAppLink?.(props.video, {})}\n imageOptions={{ size: ImageSize.Medium }}\n textPosition={ThumbnailTextPosition.Independent}\n type='static'\n audience={props.badgePosition === 'thumbnail' ? mergedAudience : null}\n hideRating={props.badgePosition === 'thumbnail' ? !!mergedAudience : true}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n </Col>\n <Col xs={12} md={6} className={`${styles.details} position-relative`}>\n <div className='d-flex justify-content-between'>\n <div className='overflow-hidden'>\n <VideoSubText\n type={props.commonVideoProps.subTextType}\n appLink={props.commonVideoProps.getSubTextAppLink?.(props.video)}\n analyticsData={props.analyticsData}\n analyticsOptions={analyticsOptions}\n video={props.video}\n className='text-reset clamp-1'\n />\n <VideoItemTitle\n yearGroups={props.commonVideoProps.yearGroups}\n video={props.video}\n analyticsData={props.analyticsData}\n analyticsOptions={analyticsOptions}\n appLink={props.getVideoAppLink?.(props.video, {})}\n titleSize='h4'\n showNewVideoIndicator={props.showNewVideoIndicator}\n showPadlock={!props.commonVideoProps.hasStudentExperience && !props.commonVideoProps.hasGuestExperience}\n titleClassName={props.titleClassName}\n clampLevel={2}\n />\n </div>\n <VideoItemActions\n analyticsData={props.analyticsData}\n analyticsOptions={analyticsOptions}\n video={props.video}\n />\n </div>\n\n {props.badgePosition === 'info-panel' && (\n <BadgeListContainer className='pb-1'>\n {!props.hideInteractiveBadge && <Badge type={ BadgeType.Interactive } data={props.video.interactives} />}\n <Badge type={ BadgeType.Rating } data={VideoHelper.getRating(props.video)} />\n <Badge type={ BadgeType.ProductionYear } data={props.video.productionYear} />\n </BadgeListContainer>\n )}\n\n <p className='mb-1'><span className={styles.description}>{props.video.description}</span></p>\n \n {props.badgePosition === 'info-panel' && (\n <AudienceLabel\n audience={mergedAudience}\n className='mt-1'\n border='dark'\n />\n )}\n\n {props.showVideoGuidance && (\n <VideoItemGuidance\n video={props.video}\n analyticsData={props.analyticsData}\n analyticsOptions={analyticsOptions}\n containerClassName={`d-flex ${styles.guidance}`}\n responsiveClassName={styles.responsiveGuidance}\n commonVideoProps={props.commonVideoProps}\n />\n )}\n </Col>\n </Row>\n );\n}\n\nexport function PartialHeroVideo(): JSX.Element {\n return (\n <>\n <div className={`partial-loading-background mb-2 ${styles.partialHeading}`} />\n <div className='row pb-3'>\n <div className='col-6 p1'>\n <div className={`${styles.partialHeroThumbnail} partial-loading-background rounded-3`}></div>\n </div>\n <div className='col-6 p1'>\n <div className={`partial-loading-background mb-1 ${styles.partialSeriesText}`}></div>\n <div className={`partial-loading-background my-1 ${styles.partialVideoTitleText}`}></div>\n <div className='d-flex'>\n <div className={`partial-loading-background my-1 me-1 ${styles.partialBadge}`}></div>\n <div className={`partial-loading-background my-1 ms-1 ${styles.partialBadge}`}></div>\n </div>\n <div className={`partial-loading-background my-1 ${styles.partialDescription}`}></div>\n <div className={`partial-loading-background mt-2 ${styles.partialSubject}`}></div>\n </div>\n </div>\n </>\n );\n}\n","import React from 'react';\n\nimport { HeroVideo } from 'libs/shared/apps/subjects/components/hero-video/HeroVideo';\nimport { Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function FeaturedVideoResult(props: MixedSearchResultItemProps<Video>): JSX.Element {\n return (\n <div className='pb-3'>\n <HeroVideo\n video={props.item}\n presentationAudiences={props.audiences}\n getVideoAppLink={(v, opts) => props.appLinks.getVideoAppLink(v, opts)}\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n hideInteractiveBadge\n showVideoGuidance={VideoHelper.showVideoGuidance(props.hasPermissions)}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n}\n",":local {\n .playlistItem {\n padding-bottom: 100%; // 1:1 aspect ratio\n }\n\n .playlistItemGradient {\n &::after {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: linear-gradient(\n to top,\n rgba(0, 0, 0, 0.55) 00%,\n rgba(0, 0, 0, 0.50) 05%,\n rgba(0, 0, 0, 0.40) 10%,\n rgba(0, 0, 0, 0.20) 25%,\n rgba(0, 0, 0, 0.05) 50%,\n rgba(0, 0, 0, 0.02) 60%,\n rgba(0, 0, 0, 0.00) 80%\n );\n }\n }\n\n .playlistMetadata {\n position: absolute;\n left: map-get($spacers, 2);\n right: map-get($spacers, 2);\n bottom: map-get($spacers, 2);\n z-index: 1;\n }\n\n .partialHeading {\n height: 2rem;\n width: 17rem;\n }\n\n .ownerAvatarContainer {\n position: absolute;\n right: map-get($spacers, 2);\n top: map-get($spacers, 2);\n z-index: 1;\n width: 15%;\n height: 15%;\n }\n}","import * as React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport styles from './playlist.module.scss';\n\ninterface PartialPlaylistListProps {\n numItems?: number;\n itemClassName?: string;\n showHeading?: boolean;\n}\n\nPartialPlaylistList.defaultProps = {\n numItems: 8\n};\n\nexport function PartialPlaylistList(props: PartialPlaylistListProps): JSX.Element {\n const PARTIAL_PLAYLISTS = [...Array(props.numItems)];\n\n const className = props.itemClassName || '';\n\n return (\n <>\n {props.showHeading && <div className={`${styles.partialHeading} mb-1 partial-loading-background`} />}\n <Row className='mx-n1 mb-n2'>\n {PARTIAL_PLAYLISTS.map((p, idx) => (\n <Col key={idx} xs={6} sm={4} lg={3} className={`${className} px-1 pb-2`}>\n <div className={`${styles.playlistItem} partial-loading-background rounded-3`} />\n </Col>\n ))}\n </Row>\n </>\n );\n}\n","var EN_US = ['second', 'minute', 'hour', 'day', 'week', 'month', 'year'];\nexport default function (diff, idx) {\n if (idx === 0)\n return ['just now', 'right now'];\n var unit = EN_US[Math.floor(idx / 2)];\n if (diff > 1)\n unit += 's';\n return [diff + \" \" + unit + \" ago\", \"in \" + diff + \" \" + unit];\n}\n//# sourceMappingURL=en_US.js.map","var ZH_CN = ['秒', '分钟', '小时', '天', '周', '个月', '年'];\nexport default function (diff, idx) {\n if (idx === 0)\n return ['刚刚', '片刻后'];\n var unit = ZH_CN[~~(idx / 2)];\n return [diff + \" \" + unit + \"\\u524D\", diff + \" \" + unit + \"\\u540E\"];\n}\n//# sourceMappingURL=zh_CN.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\n/**\n * All supported locales\n */\nvar Locales = {};\n/**\n * register a locale\n * @param locale\n * @param func\n */\nexport var register = function (locale, func) {\n Locales[locale] = func;\n};\n/**\n * get a locale, default is en_US\n * @param locale\n * @returns {*}\n */\nexport var getLocale = function (locale) {\n return Locales[locale] || Locales['en_US'];\n};\n//# sourceMappingURL=register.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\nvar SEC_ARRAY = [\n 60,\n 60,\n 24,\n 7,\n 365 / 7 / 12,\n 12,\n];\n/**\n * format Date / string / timestamp to timestamp\n * @param input\n * @returns {*}\n */\nexport function toDate(input) {\n if (input instanceof Date)\n return input;\n // @ts-ignore\n if (!isNaN(input) || /^\\d+$/.test(input))\n return new Date(parseInt(input));\n input = (input || '')\n // @ts-ignore\n .trim()\n .replace(/\\.\\d+/, '') // remove milliseconds\n .replace(/-/, '/')\n .replace(/-/, '/')\n .replace(/(\\d)T(\\d)/, '$1 $2')\n .replace(/Z/, ' UTC') // 2017-2-5T3:57:52Z -> 2017-2-5 3:57:52UTC\n .replace(/([+-]\\d\\d):?(\\d\\d)/, ' $1$2'); // -04:00 -> -0400\n return new Date(input);\n}\n/**\n * format the diff second to *** time ago, with setting locale\n * @param diff\n * @param localeFunc\n * @returns\n */\nexport function formatDiff(diff, localeFunc) {\n /**\n * if locale is not exist, use defaultLocale.\n * if defaultLocale is not exist, use build-in `en`.\n * be sure of no error when locale is not exist.\n *\n * If `time in`, then 1\n * If `time ago`, then 0\n */\n var agoIn = diff < 0 ? 1 : 0;\n /**\n * Get absolute value of number (|diff| is non-negative) value of x\n * |diff| = diff if diff is positive\n * |diff| = -diff if diff is negative\n * |0| = 0\n */\n diff = Math.abs(diff);\n /**\n * Time in seconds\n */\n var totalSec = diff;\n /**\n * Unit of time\n */\n var idx = 0;\n for (; diff >= SEC_ARRAY[idx] && idx < SEC_ARRAY.length; idx++) {\n diff /= SEC_ARRAY[idx];\n }\n /**\n * Math.floor() is alternative of ~~\n *\n * The differences and bugs:\n * Math.floor(3.7) -> 4 but ~~3.7 -> 3\n * Math.floor(1559125440000.6) -> 1559125440000 but ~~1559125440000.6 -> 52311552\n *\n * More information about the performance of algebraic:\n * https://www.youtube.com/watch?v=65-RbBwZQdU\n */\n diff = Math.floor(diff);\n idx *= 2;\n if (diff > (idx === 0 ? 9 : 1))\n idx += 1;\n return localeFunc(diff, idx, totalSec)[agoIn].replace('%s', diff.toString());\n}\n/**\n * calculate the diff second between date to be formatted an now date.\n * @param date\n * @param relativeDate\n * @returns {number}\n */\nexport function diffSec(date, relativeDate) {\n var relDate = relativeDate ? toDate(relativeDate) : new Date();\n return (+relDate - +toDate(date)) / 1000;\n}\n/**\n * nextInterval: calculate the next interval time.\n * - diff: the diff sec between now and date to be formatted.\n *\n * What's the meaning?\n * diff = 61 then return 59\n * diff = 3601 (an hour + 1 second), then return 3599\n * make the interval with high performance.\n **/\nexport function nextInterval(diff) {\n var rst = 1, i = 0, d = Math.abs(diff);\n for (; diff >= SEC_ARRAY[i] && i < SEC_ARRAY.length; i++) {\n diff /= SEC_ARRAY[i];\n rst *= SEC_ARRAY[i];\n }\n d = d % rst;\n d = d ? rst - d : rst;\n return Math.ceil(d);\n}\n//# sourceMappingURL=date.js.map","import { formatDiff, diffSec } from './utils/date';\nimport { getLocale } from './register';\n/**\n * format a TDate into string\n * @param date\n * @param locale\n * @param opts\n */\nexport var format = function (date, locale, opts) {\n // diff seconds\n var sec = diffSec(date, opts && opts.relativeDate);\n // format it with locale\n return formatDiff(sec, getLocale(locale));\n};\n//# sourceMappingURL=format.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\nimport en_US from './lang/en_US';\nimport zh_CN from './lang/zh_CN';\nimport { register } from './register';\nregister('en_US', en_US);\nregister('zh_CN', zh_CN);\nexport { format } from './format';\nexport { render, cancel } from './realtime';\nexport { register };\n//# sourceMappingURL=index.js.map","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Playlist } from 'libs/shared/interfaces';\n\nconst namespace = 'playlists.playlistCount';\n\nfunction getCount(playlist: Playlist): number | false {\n if (!playlist)\n return false;\n\n const videos = playlist.videos?.count ?? 0;\n const interactives = playlist.interactives?.count ?? 0;\n const clips = playlist.clips?.count ?? 0;\n\n return videos + interactives + clips;\n}\n\ninterface PlaylistCountProps {\n playlist: Playlist;\n}\n\nexport function PlaylistCount(props: PlaylistCountProps): JSX.Element {\n const count = getCount(props.playlist);\n\n if (count === false || Number.isNaN(count))\n return <></>;\n\n return (\n <span className='text-shadow font-size-sm'>\n <Text namespace={namespace} phrase='count' options={{ smartCount: count }} />\n </span>\n );\n}\n",".avatar {\n position: relative;\n border-radius: 50%;\n background-color: $white;\n width: 100%;\n height: 100%;\n text-align: center;\n\n svg {\n position: absolute;\n top: 50%;\n left: 59%; // 59 rather than 50 as it makes the play icon look more centered\n transform: translate(-50%, -50%);\n width: 60%;\n height: 60%;\n }\n}","import * as React from 'react';\n\nimport { ClickViewLogoMark } from 'libs/shared/components/svgs/clickview-logo/ClickViewLogo';\n\nimport styles from './clickview-avatar.module.scss';\n\nexport function ClickViewAvatar(): JSX.Element {\n return (\n <div className={styles.avatar}>\n <ClickViewLogoMark />\n </div>\n );\n}\n","import * as React from 'react';\n\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { ClickViewAvatar } from 'libs/shared/components/clickview-avatar/ClickViewAvatar';\nimport { CurrentUser, Playlist } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\ninterface PlaylistOwnerAvatarProps {\n playlist: Playlist;\n imageCdnUrl: string;\n currentUser?: CurrentUser;\n}\n\nexport function PlaylistOwnerAvatar(props: PlaylistOwnerAvatarProps): JSX.Element {\n const { _liteOwner } = props.playlist;\n\n if (props.playlist._isClickViewCurated?.value)\n return (\n <ClickViewAvatar />\n );\n\n if (!_liteOwner?.id || !props.currentUser?.id)\n return <></>;\n\n const currentUserIsOwner = _liteOwner.id.toString() === props.currentUser.id.toString();\n\n if (currentUserIsOwner)\n return <></>;\n\n const url = typeof _liteOwner.avatar === 'string' ? _liteOwner.avatar : _liteOwner.avatar?.url;\n\n return (\n <Avatar\n imageUrl={url}\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(_liteOwner.name, _liteOwner.surname)}\n />\n );\n}\n","import * as React from 'react';\nimport { format } from 'timeago.js';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { AnalyticsOptions, EntityType, HashObject } from 'libs/analytics/interfaces';\n\nimport { PlaylistCount } from 'libs/shared/apps/playlists/components/playlist-count/PlaylistCount';\nimport { PlaylistOwnerAvatar } from 'libs/shared/apps/playlists/components/playlist-list/PlaylistOwnerAvatar';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { AudienceLabel } from 'libs/shared/components/audience-label/AudienceLabel';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { ImageSize, ResizeType } from 'libs/shared/enums/Images';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { CurrentUser, Playlist, PresentationAudience } from 'libs/shared/interfaces';\nimport { getBgColorClass } from 'libs/shared/utils/getBgColorClass';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\n\nimport styles from './playlist.module.scss';\n\nconst namespace = 'playlists.playlistList';\n\nexport type PlaylistItemStyle = 'square' | 'round' | 'round-left';\n\nexport interface PlaylistItemProps {\n data: Playlist;\n appLink: Core.AppLink;\n currentUser?: CurrentUser;\n presentationAudiences?: PresentationAudience[];\n bgColourClassNames?: string[];\n titleClassName?: string;\n imageCdnUrl?: string;\n itemStyle?: PlaylistItemStyle;\n showCount?: boolean;\n showOwner?: boolean;\n showFallbackImage?: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n audienceLabelClass?: string;\n}\n\nPlaylistItem.defaultProps = {\n itemStyle: 'square'\n};\n\nexport function PlaylistItem(props: PlaylistItemProps): JSX.Element {\n const imageUrl = ImageHelper.createUrl(props.data.cover && props.data.cover.url, {\n size: ImageSize.Medium,\n resizeType: ResizeType.Cover\n });\n\n const audiences = props.data.subjectPresentationAudiences &&\n props.data.subjectPresentationAudiences.data;\n\n const mergedAudience = useMergeAudiences(audiences, props.presentationAudiences);\n\n let className = styles.playlistItem;\n\n const showImage = !!imageUrl || !!props.showFallbackImage;\n\n if (showImage)\n className += ` ${styles.playlistItemGradient}`;\n\n if (!showImage && props.bgColourClassNames)\n className += ` ${styles.playlistItem} ${getBgColorClass(props.data.name, props.bgColourClassNames)}`;\n\n if (props.itemStyle === 'round')\n className += ` rounded-3 overflow-hidden`;\n\n if (props.itemStyle === 'round-left')\n className += ` rounded-start-lg overflow-hidden`;\n\n const analyticsData = { ...props.analyticsData,\n id: props.data?.id,\n name: props.data?.name\n };\n\n const analyticsOptions = {\n ...props.analyticsOptions,\n entity: EntityType.Playlist\n };\n\n const getTitle = () => {\n if (!props.data.contentModifiedDate || props.data._isClickViewCurated?.value)\n return '';\n\n return LanguageService.getPhrase(namespace, 'lastUpdated', {\n timeago: format(DateHelper.convertUTCToLocal(props.data.contentModifiedDate))\n });\n };\n\n return (\n <AppLink\n appLink={props.appLink}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n title={getTitle()}\n >\n <BaseImage data={imageUrl} alt={props.data.name} className={className}>\n {!!props.showFallbackImage && <ImageFallback type={ImageFallbackType.Playlist} />}\n <div className={`text-white ${styles.playlistMetadata}`}>\n {!!props.showCount && (\n <PlaylistCount playlist={props.data} />\n )}\n <h5 className={`mb-0 ${props.titleClassName || ''}`}><span className='text-shadow clamp-2'>{props.data.name}</span></h5>\n {!!audiences && !!audiences.length && !!mergedAudience &&\n <AudienceLabel\n className={`${props.audienceLabelClass ? props.audienceLabelClass : ''} mt-1`}\n audience={mergedAudience}\n border='white'\n />\n }\n </div>\n {!!props.showOwner && !!props.imageCdnUrl &&\n <div className={styles.ownerAvatarContainer}>\n <PlaylistOwnerAvatar\n playlist={props.data}\n currentUser={props.currentUser}\n imageCdnUrl={props.imageCdnUrl}\n />\n </div>\n }\n </BaseImage>\n </AppLink>\n );\n}\n","import * as React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, HashObject, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { CurrentUser, Playlist, PresentationAudience } from 'libs/shared/interfaces';\n\nimport { PlaylistItem, PlaylistItemStyle } from './PlaylistItem';\n\ninterface PlaylistListProps {\n playlists: Playlist[];\n getPlaylistAppLink: (playlist: Playlist) => Core.AppLink;\n currentUser?: CurrentUser;\n presentationAudiences?: PresentationAudience[];\n itemContainerClassName?: string;\n itemTitleClassName?: string;\n bgColourClassNames?: string[];\n itemStyle?: PlaylistItemStyle;\n imageCdnUrl?: string;\n showCount?: boolean;\n showOwner?: boolean;\n showFallbackImage?: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n extraPlaylistItem?: JSX.Element;\n}\n\nconst analyticsOptions: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Playlist,\n location: LocationContext.PlaylistListItem,\n descriptor: ClickDescriptor.Cover\n};\n\nexport function PlaylistList(props: PlaylistListProps): JSX.Element {\n return (\n <Row as='ul' className='list-unstyled mx-n1'>\n {props.extraPlaylistItem && (\n <Col as='li' key='extra-playlist-item' xs={6} sm={4} lg={3} className={`mb-2 px-1 ${props.itemContainerClassName ? props.itemContainerClassName : ''}`}>\n {props.extraPlaylistItem}\n </Col>\n )}\n\n {props.playlists.map(p => (\n <Col as='li' key={p.id} xs={6} sm={4} lg={3} className={`mb-2 px-1 ${props.itemContainerClassName ? props.itemContainerClassName : ''}`}>\n <PlaylistItem\n data={p}\n appLink={props.getPlaylistAppLink(p)}\n imageCdnUrl={props.imageCdnUrl}\n currentUser={props.currentUser}\n presentationAudiences={props.presentationAudiences}\n bgColourClassNames={props.bgColourClassNames}\n showCount={props.showCount}\n showOwner={props.showOwner}\n showFallbackImage={props.showFallbackImage}\n titleClassName={props.itemTitleClassName}\n itemStyle={props.itemStyle}\n analyticsData={props.analyticsData}\n analyticsOptions={{ ...props.analyticsOptions, ...analyticsOptions }}\n />\n </Col>\n ))}\n </Row>\n );\n}\n","@import '~styles/utils/include-media';\n:local {\n .videoList {\n width: 63%;\n\n @include media('<=xl') {\n width: 75%;\n }\n\n @include media('<=lg') {\n width: 88%;\n }\n }\n}","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { PlaylistItem } from 'libs/shared/apps/playlists/components/playlist-list';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoItem } from 'libs/shared/components/video-list/video-item/VideoItem';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { CurrentUser, Playlist, PresentationAudience, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\n\nimport styles from './playlist-with-videos.module.scss';\n\nconst namespace = 'search.playlistWithVideos';\n\nfunction useGetMaxVideos(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xl || breakpoints.xxl)\n return 3;\n \n return 2;\n}\n\ninterface PlaylistWithVideoProps {\n playlist: Playlist;\n playlistAppLink: Core.AppLink;\n presentationAudiences: PresentationAudience[];\n preloadImage: boolean;\n analyticsData: HashObject;\n currentUser: CurrentUser;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n hasPermissions: HasPermissionsFunc;\n commonVideoProps: CommonVideoProps;\n}\n\nexport function PlaylistWithVideos(props: PlaylistWithVideoProps): JSX.Element {\n const maxVideos = useGetMaxVideos();\n\n const videos = props.playlist.videos.data.slice(0, maxVideos);\n\n const playlistAnalyticsOption: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Playlist,\n location: LocationContext.PlaylistWithVideos\n };\n\n const playlistAnalyticsData: HashObject = {\n ...props.analyticsData,\n id: props.playlist.id,\n name: props.playlist.name\n };\n\n return (\n <div className='ps-2 py-2'>\n <Row className='g-0 border rounded-3'>\n <Col xs={4} lg={3} className='pe-3'>\n <PlaylistItem\n appLink={props.playlistAppLink}\n analyticsData={props.analyticsData}\n analyticsOptions={{\n ...playlistAnalyticsOption,\n descriptor: ClickDescriptor.Cover\n }}\n data={props.playlist}\n presentationAudiences={props.presentationAudiences}\n bgColourClassNames={BG_COLOUR_CLASS_NAMES}\n itemStyle='round-left'\n imageCdnUrl={props.commonVideoProps.imageCdnUrl}\n currentUser={props.currentUser}\n showCount={false}\n showOwner\n />\n </Col>\n <Col xs={8} lg={9}>\n <div className='d-flex justify-content-between'>\n <div className={`pt-3 mb-n2 ${styles.videoList}`}>\n {videos?.map(video => {\n const videoAnalyticsData: HashObject = {\n ...playlistAnalyticsData,\n videoId: video.id,\n videoName: video.name\n };\n\n return (\n <div key={video.id} className='mb-2'>\n <VideoItem\n video={video}\n getVideoAppLink={props.getVideoAppLink}\n analyticsData={videoAnalyticsData}\n analyticsOptions={{\n entity: EntityType.Video,\n location: LocationContext.PlaylistWithVideos\n }}\n size='sm'\n hasPermissions={props.hasPermissions}\n hideVideoGuidance\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n })}\n </div>\n <div className='text-end pt-3 pe-3'>\n <AppLink\n className='info-link fw-semibold'\n appLink={props.playlistAppLink}\n analyticsData={playlistAnalyticsData}\n analyticsOptions={{\n ...playlistAnalyticsOption,\n descriptor: ClickDescriptor.Link\n }}\n >\n <Text namespace={namespace} phrase='seeAllVideos' />\n </AppLink>\n </div>\n </div>\n </Col>\n </Row>\n </div>\n );\n}\n","import React from 'react';\n\nimport { Playlist } from 'libs/shared/interfaces';\n\nimport { PlaylistWithVideos } from '../../playlist-with-videos/PlaylistWithVideos';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function LargePlaylistResult(props: MixedSearchResultItemProps<Playlist>): JSX.Element {\n return (\n <div className='mx-n2'>\n <PlaylistWithVideos\n playlist={props.item}\n playlistAppLink={props.appLinks.getPlaylistAppLink(props.item)}\n presentationAudiences={props.audiences}\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n currentUser={props.currentUser}\n preloadImage\n getVideoAppLink={props.appLinks.getVideoAppLink}\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n}\n","@import '~styles/utils/mixins';\n@import '~styles/utils/include-media';\n:local {\n .labelContainer {\n z-index: 1;\n bottom: map-get($spacers, 2);\n left: 50%;\n transform: translate(-50%, 0%);\n\n :global(.rating-badge) {\n @include thumbnail-poster-badge;\n }\n }\n\n .labelContainerOverlay {\n :global(.rating-badge) {\n @include thumbnail-poster-badge;\n }\n }\n\n .hoverActive {\n transform: translate3D(0, -1px, 0) scale(1.01);\n transition: all .1s ease;\n\n &:after {\n content: '';\n\n position: absolute;\n top: 0;\n left: -(map-get($spacers, 1));\n right: -(map-get($spacers, 1));\n bottom: 0;\n\n margin: 0 map-get($spacers, 1);\n\n border-radius: $border-radius-lg;\n }\n }\n\n .mask {\n z-index: 2;\n position: absolute;\n bottom: map-get($spacers, 2);\n right: 0;\n left: 0;\n\n max-height: calc(100% - (map-get($spacers, 2) * 2));\n \n @include media('<=lg') {\n padding: map-get($spacers, 3) map-get($spacers, 1);\n }\n\n .largeHoverTitle {\n font-size: $h4-font-size;\n\n @include media('<=lg') {\n font-size: $h5-font-size;\n }\n\n @include media('<=md') {\n font-size: $h6-font-size;\n margin-bottom: map-get($spacers, 1);\n }\n\n @include media('<=sm') {\n font-size: $h5-font-size;\n }\n }\n\n .smallHoverTitle {\n font-size: $h5-font-size;\n\n @include media('<=xl') {\n font-size: $h6-font-size;\n }\n\n @include media('<=lg') {\n font-size: $h6-font-size;\n }\n\n @include media('<=md') {\n @include clamp(5);\n }\n }\n\n .description {\n text-overflow: ellipsis;\n overflow: hidden;\n -webkit-box-orient: vertical;\n display: -webkit-box;\n }\n\n .largeHoverDescription {\n @include clamp(11);\n\n @include media('<=xl') {\n @include clamp(9);\n }\n @include media('<=lg') {\n @include clamp(7);\n }\n @include media(\"<=878px\") {\n @include clamp(4);\n }\n\n &.hasTableOfContents {\n @include clamp(7);\n\n @include media('<=xl') {\n @include clamp(5);\n }\n @include media(\"<=1003px\") {\n @include clamp(4);\n }\n @include media('<=lg') {\n @include clamp(7);\n }\n @include media(\"<=878px\") {\n @include clamp(4);\n }\n }\n }\n\n .smallHoverDescription {\n @include clamp(8);\n\n @include media('<=xl') {\n @include clamp(8);\n font-size: 12px;\n }\n\n @include media('<=md') {\n @include clamp(6);\n }\n @include media('<=sm') {\n @include clamp(9);\n }\n } \n }\n}","import React from 'react';\n\nimport { AudienceLabel } from 'libs/shared/components/audience-label/AudienceLabel';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { ImageSize, ImageType } from 'libs/shared/enums/Images';\nimport { useHoverIntent } from 'libs/shared/hooks/UseHover';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { PresentationAudience, Series } from 'libs/shared/interfaces';\nimport { SeriesHelper } from 'libs/shared/utils/SeriesHelper';\n\nimport styles from './series-tall-poster.module.scss';\n\ninterface SeriesTallPosterHoverOverlay {\n series: Series;\n mergedAudience: PresentationAudience;\n isSmall?: boolean;\n hasTableOfContents?: boolean;\n}\n\nfunction SeriesTallPosterHoverOverlay(props: SeriesTallPosterHoverOverlay): JSX.Element {\n return (\n <div className={`py-3 mx-2 px-2 rounded bg-white text-center ${styles.mask} d-flex flex-column align-items-center`}>\n <h3 className={`fw-semibold mb-0 ${styles.hoverTitle} ${props.isSmall ? styles.smallHoverTitle : styles.largeHoverTitle}`}>\n <span className='clamp-3'>\n {props.series.name}\n </span>\n </h3>\n\n {!!props.series.description && (\n <p className={`${props.hasTableOfContents ? styles.hasTableOfContents : ''} ${styles.hoverDescription} ${props.isSmall ? styles.smallHoverDescription : styles.largeHoverDescription} mb-0`}>{props.series.description}</p>\n )}\n <div className={`${styles.labelContainerOverlay}`}>\n {props.mergedAudience ?\n <AudienceLabel audience={props.mergedAudience} border='dark' className='mt-2 w-fit'/> :\n <Badge type={BadgeType.Rating} data={SeriesHelper.getRating(props.series)} className='mt-2' />\n }\n </div>\n </div>\n );\n}\n\ninterface SeriesTallPosterMaskProps {\n series: Series;\n presentationAudiences: PresentationAudience[];\n preloadImage: boolean;\n imageClass?: string;\n isSmall?: boolean;\n hasTableOfContents?: boolean;\n}\n\nexport function SeriesTallPoster(props: SeriesTallPosterMaskProps): JSX.Element {\n const [ hoverRef, isHovering ] = useHoverIntent<HTMLDivElement>({ className: styles.hoverActive });\n \n const audiences = props.series && props.series.subjectPresentationAudiences &&\n props.series.subjectPresentationAudiences.data || [];\n\n const mergedAudience = useMergeAudiences(audiences, props.presentationAudiences);\n const displayAudience = !!(audiences && audiences.length && mergedAudience);\n\n return (\n <div ref={hoverRef}>\n <BaseImage\n data={props.series.tallPoster}\n alt={props.series.name}\n imageType={ImageType.TallPosters}\n preload={props.preloadImage}\n imageOptions={{ size: ImageSize.Large }}\n imageClassName={props.imageClass ? props.imageClass : 'rounded-3'}\n >\n {isHovering && (\n <SeriesTallPosterHoverOverlay\n isSmall={props.isSmall}\n series={props.series}\n mergedAudience={audiences && audiences.length ? mergedAudience : null}\n hasTableOfContents={props.hasTableOfContents}\n />\n )}\n \n <ImageFallback type={ImageFallbackType.Series} />\n <div className={`position-absolute text-white ${styles.labelContainer}`}>\n {displayAudience ?\n <AudienceLabel audience={mergedAudience} className='bg-white text-dark' border='dark' /> :\n <Badge className='text-shadow' type={BadgeType.Rating} data={SeriesHelper.getRating(props.series)} />\n }\n </div>\n </BaseImage>\n </div>\n );\n}\n","@import '~styles/utils/include-media';\n:local {\n .videoList {\n width: 63%;\n\n @include media('<=xl') {\n width: 75%;\n }\n\n @include media('<=lg') {\n width: 88%;\n }\n }\n}","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SeriesTallPoster } from 'libs/shared/components/series-tall-poster/SeriesTallPoster';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoItem } from 'libs/shared/components/video-list/video-item/VideoItem';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { PresentationAudience, Series, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\n\nimport styles from './series-with-videos.module.scss';\n\nconst namespace = 'search.seriesWithVideos';\n\nfunction useGetMaxVideos(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xl || breakpoints.xxl)\n return 5;\n \n if (breakpoints.lg || breakpoints.md)\n return 4;\n\n return 3;\n}\n\ninterface SeriesWithVideoProps {\n series: Series;\n seriesAppLink: Core.AppLink;\n presentationAudiences: PresentationAudience[];\n preloadImage: boolean;\n analyticsData: HashObject;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n hasPermissions: HasPermissionsFunc;\n commonVideoProps: CommonVideoProps;\n}\n\nexport function SeriesWithVideos(props: SeriesWithVideoProps): JSX.Element {\n const maxVideos = useGetMaxVideos();\n\n const videos = props.series.videos.data.slice(0, maxVideos);\n\n const seriesAnalyticsOption: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Series,\n location: LocationContext.SeriesWithVideos\n };\n\n const seriesAnalyticsData: HashObject = {\n ...props.analyticsData,\n id: props.series.id,\n name: props.series.name\n };\n\n return (\n <div className='ps-2 py-2'>\n <Row className='g-0 border rounded-3'>\n <Col xs={4} lg={3} className='pe-3'>\n <AppLink\n appLink={props.seriesAppLink}\n className='position-relative'\n analyticsData={seriesAnalyticsData}\n analyticsOptions={{\n ...seriesAnalyticsOption,\n descriptor: ClickDescriptor.TallPoster\n }}\n >\n <SeriesTallPoster\n series={props.series}\n presentationAudiences={props.presentationAudiences}\n preloadImage={props.preloadImage}\n imageClass='rounded-start-lg'\n />\n </AppLink>\n </Col>\n <Col xs={8} lg={9}>\n <div className='d-flex justify-content-between'>\n <div className={`pt-3 mb-n2 ${styles.videoList}`}>\n {videos?.map(video => {\n const videoAnalyticsData: HashObject = {\n ...seriesAnalyticsData,\n videoId: video.id,\n videoName: video.name\n };\n\n // insert parent series into video object\n video = {\n ...video,\n series: props.series\n };\n\n return (\n <div key={video.id} className='mb-2'>\n <VideoItem\n video={video}\n getVideoAppLink={props.getVideoAppLink}\n analyticsData={videoAnalyticsData}\n analyticsOptions={{\n entity: EntityType.Video,\n location: LocationContext.SeriesWithVideos\n }}\n size='sm'\n hasPermissions={props.hasPermissions}\n hideVideoGuidance\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n })}\n </div>\n <div className='text-end pt-3 pe-3'>\n <AppLink\n className='info-link fw-semibold'\n appLink={props.seriesAppLink}\n analyticsData={seriesAnalyticsData}\n analyticsOptions={{\n ...seriesAnalyticsOption,\n descriptor: ClickDescriptor.Link\n }}\n >\n <Text namespace={namespace} phrase='seeAllVideos' />\n </AppLink>\n </div>\n </div>\n </Col>\n </Row>\n </div>\n );\n}\n","import React from 'react';\n\nimport { Series } from 'libs/shared/interfaces';\n\nimport { SeriesWithVideos } from '../../series-with-videos/SeriesWithVideos';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function LargeSeriesResult(props: MixedSearchResultItemProps<Series>): JSX.Element {\n return (\n <div className='mx-n2'>\n <SeriesWithVideos\n presentationAudiences={props.audiences}\n series={props.item}\n seriesAppLink={props.appLinks.getSeriesAppLink(props.item)}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n preloadImage\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { SeasonEpisode } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Video } from 'libs/shared/interfaces';\n\nconst namespace = 'search.collectionVideoList';\n\ninterface CollectionVideoListProps {\n videos: Video[];\n collectionId: string;\n appLink: Core.AppLink;\n analyticsOptions: AnalyticsOptions;\n analyticsData?: HashObject;\n getVideoAppLink: (video: Video) => Core.AppLink;\n}\n\nfunction useGetMaxVideos(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xs)\n return 2;\n\n if (breakpoints.sm)\n return 1;\n\n return 3;\n}\n\nexport function CollectionVideoList(props: CollectionVideoListProps): JSX.Element {\n const maxVideos = useGetMaxVideos();\n\n const analyticsProps = {\n analyticsData: props.analyticsData,\n analyticsOptions: props.analyticsOptions\n };\n\n return (\n <>\n <ul className='list-unstyled my-1'>\n {props.videos.slice(0, maxVideos).map(v => {\n const hasSeasonEpisode = !!v.episodeNumber && !!v.season?.id;\n\n return (\n <li key={`${props.collectionId}:${v.id}`} className='d-flex align-items-center'>\n <AppLink\n {...analyticsProps}\n className='clamp-1'\n appLink={props.getVideoAppLink(v)}\n >\n {hasSeasonEpisode && <><SeasonEpisode video={v} /> </>}\n {v.name}\n </AppLink>\n </li>\n );\n })}\n </ul>\n\n <AppLink\n {...analyticsProps}\n className='info-link'\n appLink={props.appLink}\n >\n <Text namespace={namespace} phrase='seeAll' />\n </AppLink>\n </>\n );\n}\n",":local {\n .overlayContainer {\n position: absolute;\n width: 100%;\n height: 100%;\n z-index: 1;\n padding: map-get($spacers, 1);\n color: $white;\n }\n\n .overlay {\n background-color: darken($dark, 30%);\n opacity: .7;\n width: 40%;\n position: absolute;\n right: 0;\n z-index: 1;\n }\n}","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor } from 'libs/analytics/interfaces';\n\nimport { CollectionVideoList } from 'libs/shared/apps/search/components/collection-video-list/CollectionVideoList';\nimport { ActionOptions, Actions as ActionsComponent } from 'libs/shared/components/actions/Actions';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { Mask, MaskType } from 'libs/shared/components/mask/Mask';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoListHelper } from 'libs/shared/components/video-list/VideoListHelper';\nimport { ImageType } from 'libs/shared/enums/Images';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Playlist, Series, Video } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { SeriesHelper } from 'libs/shared/utils/SeriesHelper';\n\nimport styles from './collection-thumbnail.module.scss';\n\nconst namespace = 'search.collectionThumbnail';\n\nexport type GetCollectionActions = (\n collection: Collection,\n showActions: boolean,\n collectionType: CollectionType,\n baseAnalyticsOptions: AnalyticsOptions\n) => ActionOptions[];\n\ntype Collection = Series | Playlist;\ntype CollectionType = 'series' | 'playlist';\n\ninterface CollectionThumbnailProps {\n collection: Collection;\n collectionType: CollectionType;\n appLink: Core.AppLink;\n showActions: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n maskType?: MaskType;\n imageFallbackType?: ImageFallbackType;\n hideBadges?: boolean;\n isPlugin: boolean;\n getCollectionActions: GetCollectionActions;\n getVideoAppLink: (video: Video, opts?: GetVideoAppLinkOptions) => Core.AppLink;\n}\n\nexport function CollectionThumbnail(props: CollectionThumbnailProps): JSX.Element {\n const breakpoints = useBreakpoints();\n const size = VideoListHelper.getSize(breakpoints, 'md');\n const isSmall = size === 'sm';\n\n const hasVideos = !!props.collection.videos?.data?.length;\n\n const firstVideoWithThumbnail = hasVideos && props.collection.videos.data.find(v => !!v.thumbnail?.url);\n\n function getAnalyticsData(): HashObject {\n const data: HashObject = {\n ...props.analyticsData,\n id: props.collection.id,\n name: props.collection.name\n };\n\n if (firstVideoWithThumbnail) {\n data.videoId = firstVideoWithThumbnail.id;\n data.videoName = firstVideoWithThumbnail.name;\n }\n\n return data;\n }\n\n const analyticsData = getAnalyticsData();\n const isSeries = props.collectionType === 'series';\n\n return (\n <div className={`row g-0 ${isSmall ? '' : 'py-2'}`}>\n <Col {...VideoListHelper.getThumbnailColumns()} className={`flex-column align-items-flex-start ${isSmall ? `pb-2 pe-2` : 'mb-1 px-2'}`}>\n <div className={`position-relative overflow-hidden ${isSmall ? 'rounded' : 'rounded-3'}`}>\n <BaseImage\n data={firstVideoWithThumbnail?.thumbnail}\n appLink={props.appLink}\n imageType={ImageType.Thumbnails}\n analyticsData={analyticsData}\n analyticsOptions={{\n ...props.analyticsOptions,\n descriptor: ClickDescriptor.Thumbnail\n }}\n >\n <Mask type={props.maskType} />\n <ImageFallback type={props.imageFallbackType} />\n \n <div className={`d-flex flex-column align-items-center justify-content-center text-white h-100 ${styles.overlay}`}>\n <Text namespace={namespace} phrase='seeAll' />\n </div>\n </BaseImage>\n </div>\n </Col>\n\n <Col {...VideoListHelper.getDetailsColumns()} className={isSmall ? 'pb-2' : 'px-2'}>\n {!props.isPlugin &&\n <ActionsComponent\n actions={props.getCollectionActions(\n props.collection,\n props.showActions,\n props.collectionType,\n props.analyticsOptions\n )}\n className='float-end mt-n1'\n actionsDropdownClassName='btn btn-link ms-1'\n />\n }\n\n <AppLink\n appLink={props.appLink}\n analyticsData={analyticsData}\n analyticsOptions={{\n ...props.analyticsOptions,\n descriptor: ClickDescriptor.Title\n }}\n >\n <h5 className='m-0 mb-1'><span className='clamp-1'>{props.collection.name}</span></h5>\n </AppLink>\n\n {isSeries && !props.hideBadges && (\n <BadgeListContainer>\n <Badge type={BadgeType.Rating} data={SeriesHelper.getRating((props.collection as Series))} />\n <Badge type={BadgeType.ProductionYear} data={(props.collection as Series).metadata?.year} />\n </BadgeListContainer>\n )}\n \n {hasVideos && (\n <CollectionVideoList\n collectionId={props.collection.id}\n videos={props.collection.videos.data}\n appLink={props.appLink}\n analyticsData={analyticsData}\n analyticsOptions={{\n ...props.analyticsOptions,\n descriptor: ClickDescriptor.Link\n }}\n getVideoAppLink={props.getVideoAppLink}\n />\n )}\n </Col>\n </div>\n );\n}\n","import React from 'react';\n\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { MaskType } from 'libs/shared/components/mask/Mask';\nimport { Playlist } from 'libs/shared/interfaces';\n\nimport { CollectionThumbnail } from '../../collection-thumbnail/CollectionThumbnail';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nimport styles from '../mixed-search-results.module.scss';\n\nexport function SmallPlaylistResult(props: MixedSearchResultItemProps<Playlist>): JSX.Element {\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <CollectionThumbnail\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n analyticsOptions={{\n entity: EntityType.Playlist,\n actionType: UserAction.Click,\n location: LocationContext.PlaylistListItem\n }}\n appLink={props.appLinks.getPlaylistAppLink(props.item)}\n showActions={props.showActions}\n collection={props.item}\n collectionType='playlist'\n maskType={MaskType.Playlist}\n imageFallbackType={ImageFallbackType.PlaylistThumbnail}\n isPlugin={props.commonVideoProps.isPlugin}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getCollectionActions={props.appLinks.getCollectionActions}\n />\n </div>\n );\n}\n","import React from 'react';\n\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { MaskType } from 'libs/shared/components/mask/Mask';\nimport { Series } from 'libs/shared/interfaces';\n\nimport { CollectionThumbnail } from '../../collection-thumbnail/CollectionThumbnail';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nimport styles from '../mixed-search-results.module.scss';\n\nexport function SmallSeriesResult(props: MixedSearchResultItemProps<Series>): JSX.Element {\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <CollectionThumbnail\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n analyticsOptions={{\n entity: EntityType.Series,\n actionType: UserAction.Click,\n location: LocationContext.SeriesListItem\n }}\n appLink={props.appLinks.getSeriesAppLink(props.item)}\n collectionType='series'\n collection={props.item}\n showActions={props.showActions}\n maskType={MaskType.Series}\n imageFallbackType={ImageFallbackType.SeriesThumbnail}\n hideBadges\n isPlugin={props.commonVideoProps.isPlugin}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getCollectionActions={props.appLinks.getCollectionActions}\n />\n </div>\n );\n}\n","// Maps to enum in SubjectApi but uses the\n// key rather than the value as SubjectsApi returns the key.\nexport enum ClassificationStatus {\n Draft = 'Draft',\n ComingSoon = 'ComingSoon',\n Published = 'Published'\n}\n","import * as React from 'react';\n\nimport { ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { CoverPillWidgetContentWrapper, CoverPillWidgetItemProps } from 'libs/shared/components/widgets/items/subject-widget-item/CoverPill';\nimport { TopicsConstants } from 'libs/shared/constants/TopicsConstants';\nimport { ClassificationStatus } from 'libs/shared/enums/ClassificationStatus';\nimport { Classification, Presentation } from 'libs/shared/interfaces';\n\nfunction usePresentationName(presentationId: string, availablePresentations: Presentation[]): string {\n const showPresentationName = availablePresentations?.length >= TopicsConstants.MULTI_PRESENTATION_THRESHOLD;\n\n if (!showPresentationName) {\n return undefined;\n }\n\n return availablePresentations?.find(p => p.id === presentationId)?.name;\n}\n\nfunction SubjectWidgetItem(props: CoverPillWidgetItemProps<Classification>): JSX.Element {\n const isComingSoon = props.data?.status === ClassificationStatus.ComingSoon;\n const presentationName = usePresentationName(props.data.presentationId, props?.availablePresentations);\n\n const analyticsData = {\n ...props.analyticsData,\n id: props.analyticsData?.id || props.data?.id,\n name: props.data?.name,\n presentationId: props.analyticsData?.presentationId || props.data.presentationId,\n comingSoon: !!isComingSoon\n };\n\n const analyticsOptions = {\n location: LocationContext.ClassificationListItem,\n entity: EntityType.Classification,\n ...props.analyticsOptions,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.Cover\n };\n\n return (\n <CoverPillWidgetContentWrapper\n {...props}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n coverUrl={props.data.cover?.url}\n coverBgColor={props.data?.metadata?.backgroundColor}\n subtitle={props.getSubtitle?.(props.data) || presentationName}\n isComingSoon={isComingSoon}\n themeColor={props.shouldHighlight?.(props.data) ? props.data?.metadata?.backgroundColor ?? '' : ''}\n />\n );\n}\n\nconst Memoized = React.memo(SubjectWidgetItem);\n\nexport { Memoized as SubjectWidgetItem };\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, HashObject, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { EditSvg } from 'libs/shared/images/svg/actions/EditSvg';\n\nimport styles from './cover-pill.module.scss';\n\ninterface EditSubjectsWidgetLinkProps {\n appLink: Core.AppLink;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n}\n\nconst analyticsOptions: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.UserSetting,\n descriptor: ClickDescriptor.Tile\n};\n\nexport function EditSubjectsWidgetLink(props: EditSubjectsWidgetLinkProps): JSX.Element {\n const className =\n `${styles.editSubjectsItem} d-flex position-relative px-3 justify-content-center align-items-center`;\n\n return (\n <AppLink\n appLink={props.appLink}\n className='text-decoration-none'\n analyticsData={{ ...props.analyticsData, type: 'subject-preference' }}\n analyticsOptions={ { ...props.analyticsOptions, ...analyticsOptions }}\n >\n <div className={className}>\n <SvgContainer svg={EditSvg} className='me-2 align-middle d-inline-block svg-container' />\n <p className='h6 align-middle text-truncate'><Text namespace='shared.subjectWidgetItem' phrase='edit' /></p>\n </div>\n </AppLink>\n );\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, HashObject, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { ClickViewLogoInverted } from 'libs/shared/components/svgs/clickview-logo/ClickViewLogo';\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport styles from './cover-pill.module.scss';\n\ninterface AllSubjectsWidgetLinkProps {\n appLink: Core.AppLink;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n}\n\nconst analyticsOptions: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Url,\n descriptor: ClickDescriptor.Tile\n};\n\nexport function AllSubjectsWidgetLink(props: AllSubjectsWidgetLinkProps): JSX.Element {\n const className =\n `${styles.allSubjectsItem}\n d-flex flex-column position-relative px-2\n align-items-center justify-content-center text-nowrap bg-navy`;\n\n return (\n <AppLink\n appLink={props.appLink}\n className='text-decoration-none'\n analyticsData={{ ...props.analyticsData, type: 'subject-all' }}\n analyticsOptions={ { ...props.analyticsOptions, ...analyticsOptions }}\n >\n <div className={className}>\n <div className={styles.logoContainer}>\n <ClickViewLogoInverted />\n </div>\n <p className='h6 pt-2 px-3 mb-0'><Text namespace='shared.subjectWidgetItem' phrase='all' /></p>\n </div>\n </AppLink>\n );\n}\n","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { SubjectWidgetItem } from 'libs/shared/components/widgets/items/subject-widget-item';\nimport { Classification } from 'libs/shared/interfaces';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function SubjectResult(props: MixedSearchResultItemProps<Classification>): JSX.Element {\n return (\n <Col as='li' sm={6} md={props.useLargeStyle ? 6 : 4} lg={props.useLargeStyle ? 4 : 3}>\n <div className='position-relative px-1 mb-2'>\n <SubjectWidgetItem\n data={props.item}\n getChildAppLink={props.appLinks.getClassificationAppLink}\n getChildAppLinkOptions={\n () => props.appLinks.getClassificationAppLinkOptions?.(props.item)\n }\n availablePresentations={props.availablePresentations}\n analyticsData={{\n itemIndex: props.itemIndex,\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: 0\n }}\n isLarge={props.useLargeStyle}\n highlightOnHover={props.commonVideoProps.showNewVideoIndicator}\n />\n </div>\n </Col>\n );\n}\n","import React from 'react';\n\nimport { ClipItem, ClipItemProps } from 'libs/shared/components/video-list/clip-item/ClipItem';\nimport { InteractiveItem, InteractiveItemProps } from 'libs/shared/components/video-list/interactive-item/InteractiveItem';\nimport { VideoItem, VideoItemProps } from 'libs/shared/components/video-list/video-item/VideoItem';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nimport styles from '../mixed-search-results.module.scss';\n\nexport function VideoResult(props: MixedSearchResultItemProps<VideoTypes>): JSX.Element {\n function getItemComponent(\n video: VideoTypes\n ): (props: ClipItemProps | InteractiveItemProps | VideoItemProps) => JSX.Element {\n if (VideoHelper.isClip(video))\n return ClipItem;\n \n if (VideoHelper.isInteractive(video))\n return InteractiveItem;\n \n return VideoItem;\n }\n\n const Component = getItemComponent(props.item);\n\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <Component\n video={props.item}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getPreviewQuestionsAppLink={props.appLinks.getPreviewQuestionsAppLink}\n presentationAudiences={props.audiences}\n analyticsData= {{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n}\n","import React from 'react';\nimport { Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { Classification, Company, CurrentUser, InteractiveMetadata, Playlist, Presentation, PresentationAudience, Series, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { SearchResultObjectTypes, SearchResults, SearchResultsObject } from '../../interfaces';\nimport { GetCollectionActions } from '../collection-thumbnail/CollectionThumbnail';\n\nimport { CompanyResult } from './components/CompanyResult';\nimport { ExchangeVideoGroup } from './components/exchange-video-group/ExchangeVideoGroup';\nimport { FeaturedVideoResult } from './components/FeaturedVideoResult';\nimport { LargePlaylistResult } from './components/LargePlaylistResults';\nimport { LargeSeriesResult } from './components/LargeSeriesResult';\nimport { BaseMixedSearchResultItemProps } from './components/MixedSearchResultItemProps';\nimport { SmallPlaylistResult } from './components/SmallPlaylistResult';\nimport { SmallSeriesResult } from './components/SmallSeriesResults';\nimport { SubjectResult } from './components/SubjectResult';\nimport { VideoResult } from './components/VideoResult';\n\nconst namespace = 'shared.mixedSearchResults';\n\nconst TOPIC_DISPLAY_LIMIT = 8;\n\nexport interface MixedSearchResultAppLinks {\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n getSeriesAppLink: (series: Series) => Core.AppLink;\n getCompanyAppLink: (company: Company) => Core.AppLink;\n getCompanyAppLinkOptions?: (company: Company) => Core.AppLinkOptions;\n getClassificationAppLink: (classification: Classification) => Core.AppLink;\n getClassificationAppLinkOptions?: (classification: Classification) => Core.AppLinkOptions;\n getPlaylistAppLink: (playlist: Playlist) => Core.AppLink;\n getPreviewQuestionsAppLink: (interactive: InteractiveMetadata) => Core.AppLink;\n getCollectionActions: GetCollectionActions;\n searchSettings?: Core.AppLink;\n}\n\ninterface MixedSearchResultsProps {\n queryParams: HashObject;\n results: SearchResultObjectTypes[];\n topics?: SearchResults;\n companies?: SearchResults;\n audiences: PresentationAudience[];\n currentUser: CurrentUser;\n availablePresentations: Presentation[];\n showActions: boolean;\n hasPermissions: HasPermissionsFunc;\n appLinks: MixedSearchResultAppLinks;\n commonVideoProps: CommonVideoProps;\n}\n\nexport const MixedSearchResults = React.memo(function(props: MixedSearchResultsProps): JSX.Element {\n const breakpoints = useBreakpoints();\n const useSmallComponent = breakpoints.xs || breakpoints.sm;\n\n if (!props.results?.length && !props.topics?.totalResults && !props.companies?.totalResults)\n return <></>;\n\n const companiesAndTopics = [\n ...props.companies?.results ?? [],\n ...props.topics?.results ?? []\n ];\n\n const childProps: BaseMixedSearchResultItemProps = {\n useLargeStyle: companiesAndTopics.length < 4,\n ...props\n };\n\n return (\n <div className='position-relative'>\n <p role='status' className='visually-hidden'><Text namespace={namespace} phrase='ariaSearch' /></p>\n\n {!!companiesAndTopics.length && (\n <Row as='ul' className='list-unstyled g-0 pb-3 mx-n1'>\n {companiesAndTopics.slice(0, TOPIC_DISPLAY_LIMIT).map((c, itemIndex) => {\n switch (c.type.toLowerCase()) {\n case 'company':\n return (\n <CompanyResult\n key={itemIndex}\n item={c as SearchResultsObject<Company>}\n itemIndex={itemIndex}\n {...childProps}\n />\n );\n case 'subject': {\n return (\n <SubjectResult\n key={itemIndex}\n item={c as SearchResultsObject<Classification>}\n itemIndex={itemIndex}\n {...childProps}\n />\n );\n }\n }\n })}\n </Row>\n )}\n\n {props.results?.map((result, index) => {\n const pagePositionIndex = companiesAndTopics.length ? index + 1 : index;\n\n if ('isExchangeVideoGroup' in result && result.isExchangeVideoGroup) {\n return (\n <ExchangeVideoGroup\n key={index}\n item={result}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n switch (result.type?.toLowerCase()) {\n case 'interactive':\n case 'clip':\n case 'video': {\n if (index === 0 && result._featured && VideoHelper.isVideo(result)) {\n return (\n <FeaturedVideoResult\n key={index}\n item={result as SearchResultsObject<Video>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n return (\n <VideoResult\n key={index}\n item={result as SearchResultsObject<Video>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n case 'playlist': {\n if (useSmallComponent) {\n return (\n <SmallPlaylistResult\n key={index}\n item={result as SearchResultsObject<Playlist>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n return (\n <LargePlaylistResult\n key={index}\n item={result as SearchResultsObject<Playlist>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n case 'series': {\n const series = result as Series;\n\n if (useSmallComponent || !series.tallPoster?.id) {\n return (\n <SmallSeriesResult\n key={index}\n item={result as SearchResultsObject<Series>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n return (\n <LargeSeriesResult\n key={index}\n item={result as SearchResultsObject<Series>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n }\n })}\n </div>\n );\n});\n","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'search.searchSubstitute';\n\ninterface SearchSubstituteProps {\n substitute: string;\n queryParams: HashObject;\n getAppLink: (query: string, queryParams: HashObject) => Core.AppLink;\n}\n\nexport function SearchSubstitute(props: SearchSubstituteProps): JSX.Element {\n if (!props.substitute)\n return <></>;\n\n return (\n <div className='pb-3'>\n <p className='mb-1 h6'>\n <Text namespace={namespace} phrase='showingFor' /> \n <AppLink\n className='info-link'\n appLink={props.getAppLink(props.substitute, props.queryParams)}\n appLinkOptions={{ replace: true }}\n >\n {props.substitute}\n </AppLink>\n </p>\n <p className='mb-0 h6 fw-normal'>\n <Text namespace={namespace} phrase='searchInsteadFor' />\n <AppLink\n className='info-link'\n appLink={props.getAppLink(props.queryParams.query, { ...props.queryParams, allowSubstitute: 'false' })}\n >\n {props.queryParams.query}\n </AppLink>\n <Text namespace={namespace} phrase='endOriginal' />\n </p>\n </div>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'search.searchSuggestions';\n\ninterface SearchSuggestionsProps {\n suggestions: string[];\n queryParams: HashObject;\n getAppLink: (query: string, queryParams: HashObject) => Core.AppLink;\n}\n\nSearchSuggestions.defaultProps = {\n suggestions: [],\n queryParams: {}\n};\n\nexport function SearchSuggestions(props: SearchSuggestionsProps): JSX.Element {\n if (!props.suggestions?.length)\n return <></>;\n\n return (\n <div className='d-flex align-items-center mb-3'>\n <Text namespace={namespace} phrase='didYouMean' />\n \n\n {props.suggestions.map((suggestion, index) => (\n <React.Fragment key={`${suggestion}:${index}`}>\n {index !== 0 && <span className='mx-1'>•</span>}\n\n <AppLink\n className='info-link'\n appLink={props.getAppLink(suggestion, props.queryParams)}\n appLinkOptions={{ replace: true }}\n >\n {suggestion}\n </AppLink>\n </React.Fragment>\n ))}\n </div>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { FilterConstants } from 'libs/shared/apps/search/constants/FilterConstants';\nimport { SearchIndices } from 'libs/shared/apps/search/interfaces';\nimport { FilterHelper, Filters } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { Library, MasterNestedObject, Playlist, Rating, Series, Video } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/ExchangeActions';\nimport { AppChannels } from 'shared/constants/ExchangeRadioChannels';\n\nexport const ExchangeSearchUtils = {\n useOnFilterChange(fetchResults: (cursor?: string) => void, queryParams: HashObject): void {\n const params = { ...queryParams };\n delete params.query;\n \n const sortedValues = Object.keys(params).map(filterName => params[filterName]).sort((a, b) => a - b);\n \n React.useEffect(() => {\n fetchResults();\n }, [sortedValues.join(':')]);\n },\n\n getCollectionActions(\n collection: Series | Playlist,\n showActions: boolean,\n collectionType: 'series' | 'playlist',\n baseAnalyticsOptions: AnalyticsOptions\n ): ActionOptions[] {\n collection;\n collectionType;\n baseAnalyticsOptions;\n\n if (!showActions)\n return [];\n\n return [];\n },\n\n getSeriesAppLink(series: Series): Core.AppLink {\n if (!series?.id)\n return null;\n\n return {\n application: AppChannels.EXCHANGE,\n action: Actions.Exchange.SERIES,\n args: [ series.id, TextHelper.slugify(series.name) ]\n };\n },\n\n getVideoAppLink(video: Video): Core.AppLink {\n if (!video?.id)\n return null;\n\n return {\n application: AppChannels.EXCHANGE,\n action: Actions.Exchange.PREVIEW,\n args: [ video.id, TextHelper.slugify(video.name) ]\n };\n },\n\n getAppliedIndices(queryParams: HashObject = {}): SearchIndices[] {\n const { type: indices } = queryParams;\n\n if (indices) {\n if (!Array.isArray(indices))\n return [indices];\n\n if (indices.length)\n return indices;\n }\n\n return ['video'];\n },\n\n getNestedCategoryIds(topLevelCategoryIds: string | string[], categories: MasterNestedObject<Library>[]) {\n const searchNestedCategories = (categoryId: string) => {\n const categoryIds: string[] = [];\n const category = categories.find(category => +category.data.id === +categoryId);\n\n if (!category?.children.length)\n return [categoryId];\n \n const searchCategoryIds = (category: MasterNestedObject<Library>) => {\n if (!category) return;\n \n if (category.data) {\n categoryIds.push(category.data.id);\n }\n \n if (category.children.length) {\n category.children.forEach(child => {\n searchCategoryIds(child);\n });\n }\n };\n \n searchCategoryIds(category);\n \n return categoryIds;\n };\n\n if (!Array.isArray(topLevelCategoryIds)) {\n return searchNestedCategories(topLevelCategoryIds);\n }\n \n const nestedCategoryIds = [...topLevelCategoryIds].map(categoryId => searchNestedCategories(categoryId));\n\n return ArrayHelper.flatten(nestedCategoryIds);\n },\n\n buildBackendFilterParams(\n libraryId: string,\n queryParams: HashObject,\n ratings: Rating[] = [],\n categories: MasterNestedObject<Library>[]\n ): HashObject {\n const topLevelCategoryIds = queryParams?.categoryId;\n const nestedCategories = topLevelCategoryIds && this.getNestedCategoryIds(topLevelCategoryIds, categories);\n\n const filters = FilterHelper.buildBackendFilterParams(\n { ...queryParams, categoryId: nestedCategories },\n ratings,\n null,\n false,\n []\n );\n\n // TODO: Filtering the search results means that we can't search for series, clips and interactives\n filters[`${FilterConstants.FILTER_PARAM_PREFIX}library`] = libraryId;\n\n return filters;\n },\n\n getBackendFilters(options: {\n queryParams: HashObject,\n ratings: Flight.Response<Rating[]>,\n exchange: Flight.Response<Library>,\n categories: Flight.Response<MasterNestedObject<Library>[]>,\n hasDataLoaded: boolean\n }) {\n if (!options.hasDataLoaded)\n return null;\n\n const { queryParams, ratings, exchange, categories } = options;\n \n const backendFilters = ExchangeSearchUtils.buildBackendFilterParams(\n exchange.data.id,\n queryParams,\n ratings.data,\n categories.data\n );\n \n const appliedIndices = ExchangeSearchUtils.getAppliedIndices(queryParams);\n \n return {\n queryParams,\n backendFilters,\n appliedIndices\n };\n },\n\n getFilters(\n options: {\n categories: Flight.Response<MasterNestedObject<Library>[]>,\n ratings: Flight.Response<Rating[]>,\n hasDataLoaded: boolean\n },\n tagsAndClassifications: Flight.Response<string[]>\n ) {\n if (!options.hasDataLoaded || !tagsAndClassifications.hasCompleted)\n return null;\n\n const { categories, ratings } = options;\n\n const mainFilters = [\n Filters.Categories(categories.data),\n Filters.Rating(ratings.data, null),\n Filters.HasResources(),\n Filters.HasSubtitles(),\n Filters.TagOrClassification(tagsAndClassifications.data)\n ];\n \n const moreFilters = FilterHelper.getMoreFilters([\n Filters.ProductionYear(),\n Filters.IsHD(),\n Filters.Duration()\n ]);\n\n return {\n mainFilters,\n moreFilters\n };\n },\n\n getAppLink(query: string, queryParams: HashObject): Core.AppLink {\n return {\n application: AppChannels.EXCHANGE,\n action: Actions.Exchange.SEARCH,\n params: {\n ...queryParams,\n query\n }\n };\n }\n};\n","import React from 'react';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport { Actions } from 'shared/constants/ExchangeActions';\nimport { AppChannels } from 'shared/constants/ExchangeRadioChannels';\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nconst namespace = 'exchange.searchResultsEmptyState';\n\ninterface ExchangeSearchResultsStateProps {\n query?: string;\n}\n\nexport function ExchangeSearchResultsState(props: ExchangeSearchResultsStateProps): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.SEARCH} />\n\n <EmptyState.Heading>\n {props.query ?\n <Text phrase='headingWithQuery' options={{ query: props.query }} /> :\n <Text phrase='headingWithoutQuery' />\n }\n </EmptyState.Heading>\n\n <EmptyState.Info>\n <Text phrase='info' />\n <AppLink\n className='info-link'\n appLink={{ application: AppChannels.EXCHANGE, action: Actions.Exchange.INDEX }}\n >\n <Text phrase='topicsAppLink' />\n </AppLink>\n </EmptyState.Info>\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}\n","import { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { RatingRequests } from 'libs/shared/flight-requests/RatingRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { CurrentUser, Library, MasterNestedObject, Rating } from 'libs/shared/interfaces';\n\nimport { ExchangeRequests } from 'apps/exchange/flight-requests/ExchangeRequests';\n\nexport function useFetchSearchData(queryParams: HashObject) {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const exchange = Flight.useBasicFetch<Library>(ExchangeRequests.exchange());\n const ratings = Flight.useBasicFetch<Rating[]>(RatingRequests.ratings());\n const categories = Flight.useBasicFetch<MasterNestedObject<Library>[]>(ExchangeRequests.categories());\n\n const hasDataLoaded = (\n currentUser.hasCompleted &&\n exchange.hasCompleted &&\n ratings.hasCompleted &&\n categories.hasCompleted\n );\n\n return {\n queryParams,\n currentUser,\n exchange,\n ratings,\n categories,\n hasDataLoaded\n };\n}\n","import { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport { SearchIndices, SearchResultObjectTypes, SearchResults } from 'libs/shared/apps/search/interfaces';\nimport { handleHttpError } from 'libs/shared/errors/handlers/HttpErrorHandlers';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useInfiniteList } from 'libs/shared/hooks/UseInfiniteList';\n\nimport { ExchangeRequests } from 'apps/exchange/flight-requests/ExchangeRequests';\n\nexport const namespace = 'exchange.searchResultsView2';\n\ninterface UseGetSearchResultsOptions {\n queryParams: HashObject;\n appliedIndices: SearchIndices[];\n backendFilters: HashObject;\n hasDataLoaded: boolean;\n}\nexport function useGetSearchResults(options: UseGetSearchResultsOptions) {\n const { queryParams, appliedIndices, backendFilters } = options;\n\n const alerts = useAlerts();\n const fetch = Flight.useGetFetch();\n\n const searchResultsResponse = Flight.useGetResponse<SearchResults>(getSearchRequest()?.key);\n\n function getSearchRequest(cursor?: string) {\n return options.hasDataLoaded &&\n ExchangeRequests.search(queryParams.query, appliedIndices, backendFilters, cursor);\n }\n\n function fetchNext(cursor?: string) {\n fetch(getSearchRequest(cursor));\n }\n\n function onError(pageNumber: number, httpStatus: HttpStatus): void {\n if (pageNumber === 1)\n return handleHttpError(httpStatus);\n\n alerts.error(LanguageService.getPhrase(namespace, 'error'));\n }\n\n const searchResults = useInfiniteList<SearchResultObjectTypes, SearchResults>(\n getSearchRequest,\n fetchNext,\n onError,\n data => data.results\n );\n\n return {\n ...searchResults,\n fetchNext,\n substituteQuery: searchResultsResponse.data?.substituteQuery,\n suggestions: searchResultsResponse.data?.suggestions\n };\n}\n","import { SharedWithStatements } from 'libs/shared/constants/WithStatements';\nimport { TagType } from 'libs/shared/enums/TagType';\n\n/**\n * OGQL used for search V5 endpoint\n */\nexport const SearchOGQL = {\n video: SharedWithStatements.VIDEO_COLLECTION,\n series: 'rating,tallPoster',\n playlist:\n 'videos[count(),thumbnail]{limit:1},interactives[count(),_thumbnail]{limit:1},' +\n 'clips[count(),_thumbnail]{limit:1}',\n classification: `_theme[banner,cover,tallposter,thumbnail,icon],cover,thumbnail,tags{tagtype:${TagType.Curation}}`,\n clip: SharedWithStatements.CLIP_COLLECTION,\n interactive: SharedWithStatements.INTERACTIVE_COLLECTION,\n company: 'logo',\n category: 'libraries[_logo],thumbnail',\n partner_profile: SharedWithStatements.PARTNER_PROFILE\n};\n","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { FilterConstants } from 'libs/shared/apps/search/constants/FilterConstants';\nimport { SearchOGQL } from 'libs/shared/apps/search/constants/SearchOGQL';\nimport { SearchIndices, SearchResultObjectTypes, SearchResults, SearchResultsObject } from 'libs/shared/apps/search/interfaces';\nimport type { WidgetFilter } from 'libs/shared/apps/search/interfaces/WidgetSearchResults';\nimport { SharedSearchHelper } from 'libs/shared/apps/search/utils/SharedSearchHelper';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport type { Playlist, Series } from 'libs/shared/interfaces';\nimport { ThemeAssetHelper } from 'libs/shared/utils/ThemeAssetHelper';\n\nfunction formatSearchResponse(response: SearchResults<SearchResultObjectTypes>) {\n /**\n * Until playlists and series are regionalised, search will always return every series/playlist that exists\n * even if the current user doesn't have access to the content inside (which will happen for example when playlists/series)\n * contain all UK library content but is being searched for by an AU user.\n *\n * For some search queries, this may result in search showing a bunch of \"empty\" playlists/series, which sucks.\n * This will filter all empty collections out and decrement the `totalResults` to avoid this and make search a better\n * experience.\n *\n * Ideally this will be removed one day when this regionalisation is no longer an issue.\n */\n let totalResults = response.totalResults;\n\n const results = response?.results?.filter(result => {\n if (result._index !== 'series' && result._index !== 'playlist')\n return true;\n\n if (result._index === 'playlist') {\n const playlist = result as SearchResultsObject<Playlist>;\n\n if (playlist.clips?.data?.length ||\n playlist.interactives?.data?.length ||\n playlist.videos?.data?.length)\n return true;\n\n totalResults--;\n return false;\n }\n\n if ((result as SearchResultsObject<Series>).videos?.data?.length === 0) {\n totalResults--;\n return false;\n }\n\n return true;\n }) ?? [];\n\n response.results = results;\n response.totalResults = totalResults;\n\n // The first search result will always have the highest score value.\n // We store it so that we can access it for subsequent results pages\n const resultMaxScore = results[0]?._score;\n\n return {\n ...response,\n results: SharedSearchHelper.mapMaxScoreToSearchResults(results, resultMaxScore)\n };\n}\n\nfunction stringifyObject(obj: HashObject): string {\n return Object.entries(obj).reduce((prev, [ , value ]) => {\n let stringifiedValue = value;\n\n if (typeof value === 'object') {\n stringifiedValue = stringifyObject(value);\n } else if ([ 'number', 'boolean', 'string' ].includes(typeof value)) {\n stringifiedValue = value.toString();\n }\n\n if (!prev.length)\n return stringifiedValue;\n\n return `${prev},${stringifiedValue}`;\n }, '');\n}\n\n/**\n * We want to map the filters to the global filters object but we need to remove the filter prefix\n * and exclude the presentation filter\n */\nfunction getGlobalFilters(filters: HashObject, widgetTypeId: WidgetTypeId | null): Record<string, any> {\n return Object.entries(filters)\n .reduce((prev, [ key, value ]) => {\n const actualKey = key.replace(FilterConstants.FILTER_PARAM_PREFIX, '');\n if (actualKey === 'presentation' &&\n widgetTypeId !== WidgetTypeId.SearchTopResults &&\n widgetTypeId !== WidgetTypeId.SearchRelatedResults &&\n widgetTypeId !== WidgetTypeId.SearchSeries\n ) {\n return prev;\n }\n\n return { ...prev, [actualKey]: value };\n }, {});\n}\n\nexport const SharedSearchRequests = {\n searchDashboard(\n query: string,\n filters: HashObject,\n widgets: WidgetFilter[] = []\n ): Flight.PublicRequest {\n const widgetData = widgets.sort((a, b) => a.id.localeCompare(b.id)).map(w => [ w.id, w?.cursor ]);\n const filterData = stringifyObject(filters);\n \n const key = `search:v5:dashboard:${query}:${widgetData}:${filterData}`;\n \n const {\n [`${FilterConstants.FILTER_PARAM_PREFIX}indicesFilters`]: indicesFilter,\n isLearner,\n ...genericFilters\n } = filters;\n\n const data = {\n widgets,\n indices: indicesFilter,\n filters: getGlobalFilters(genericFilters, null),\n query,\n includeAllIndices: false,\n isLearner: !!isLearner\n };\n\n return {\n url: '{gateway}/v5/search/widgets',\n publicUrl: '/api/search/v5/widgets',\n type: HttpVerbs.POST,\n data,\n key\n };\n },\n\n searchDashboardWidget(\n widgetTypeId: WidgetTypeId,\n query: string,\n filters: HashObject,\n widgets: WidgetFilter[] = []\n ): Flight.PublicRequest {\n const widgetData = widgets.sort((a, b) => a.id.localeCompare(b.id)).map(w => [ w.id, w?.cursor ]);\n const filterData = stringifyObject(filters);\n \n const key = `search:v5:dashboard:${widgetTypeId}:widget:${query}:${widgetData}:${filterData}`;\n \n const {\n [`${FilterConstants.FILTER_PARAM_PREFIX}indicesFilters`]: indicesFilter,\n isLearner,\n excludeVideoIds,\n ...genericFilters\n } = filters;\n\n const data = {\n widgets,\n indices: indicesFilter,\n filters: getGlobalFilters(genericFilters, widgetTypeId),\n query,\n includeAllIndices: false,\n isLearner: !!isLearner,\n ogql: SearchOGQL,\n excludeVideoIds\n };\n\n return {\n url: `{gateway}/v5/search/widgets/${widgetTypeId}`,\n publicUrl: `/api/search/v5/widgets/${widgetTypeId}`,\n type: HttpVerbs.POST,\n data,\n key,\n formatData: (data: HashObject) => {\n if (!data)\n return data;\n\n return {\n ...data,\n content: data.content?.data ?\n { ...data.content, data: data.content.data.map(ThemeAssetHelper.applyThemeToClassification) } :\n data.content\n };\n }\n };\n },\n\n searchV5(\n query: string,\n filters: HashObject,\n widgets: WidgetFilter[] = []\n ): Flight.PublicRequest {\n const widgetData = widgets.sort((a, b) => a.id.localeCompare(b.id)).map(w => [ w.id, w?.cursor ]);\n const filterData = stringifyObject(filters);\n \n const key = `search:v5:${query}:${widgetData}:${filterData}`;\n \n const {\n [`${FilterConstants.FILTER_PARAM_PREFIX}indicesFilters`]: indicesFilter,\n isLearner,\n ...genericFilters\n } = filters;\n\n const data = {\n widgets,\n indices: indicesFilter,\n filters: Object.entries(genericFilters)\n .reduce((prev, [ key, value ]) =>\n ({ ...prev, [key.replace('filters.', '')]: value }), {}),\n query,\n includeAllIndices: false,\n isLearner: !!isLearner,\n ogql: SearchOGQL\n };\n\n return {\n url: '{gateway}/v5/search',\n publicUrl: '/api/search/v5',\n type: HttpVerbs.POST,\n data,\n key\n };\n },\n \n searchV4(options: {\n query: string,\n indices: SearchIndices[],\n filters: HashObject,\n sorts?: HashObject,\n allowSubstitute: boolean,\n cursor?: string,\n limit?: number\n }): Flight.PublicRequest {\n const { query, indices, filters = {}, sorts = {}, allowSubstitute = true, cursor, limit } = options;\n\n let key = `search:v4:${query}:${allowSubstitute}:${indices}:${cursor}`;\n\n key += Object.keys(filters).map(filterName => {\n const filter = filters[filterName];\n return Array.isArray(filter) ? filter.join(';') : filter;\n }).join(';');\n\n const {\n [`${FilterConstants.FILTER_PARAM_PREFIX}excludeLibraryExclusive`]: excludeLibraryExclusive,\n isLearner,\n ...genericFilters\n } = filters;\n\n const indexObjects = indices.map(index => {\n if (index !== 'video' || !excludeLibraryExclusive)\n return { index };\n\n return { index, filters: { excludeLibraryExclusive } };\n });\n\n const data = {\n searchType: 'content',\n indices: indexObjects,\n filters: Object.entries(genericFilters)\n .reduce((prev, [ key, value ]) =>\n ({ ...prev, [key.replace('filters.', '')]: value }), {}),\n sorts,\n query,\n allowSubstitute,\n cursor: cursor ?? undefined,\n isLearner: !!isLearner,\n limit\n };\n\n return {\n url: '{gateway}/v4/search',\n publicUrl: '/api/search/v4',\n type: HttpVerbs.POST,\n data,\n key,\n formatData: formatSearchResponse\n };\n },\n\n search(options: {\n query: string,\n indices: SearchIndices[],\n filters?: HashObject,\n allowSubstitute?: boolean,\n cursor?: string,\n limit?: number,\n success?: (results: SearchResults) => void,\n error?: (xhr: Xhr) => void\n }): Flight.PublicRequest {\n const { query, indices, filters, allowSubstitute, cursor, limit, success, error } = options;\n\n let key = `search:${query}:${allowSubstitute}:${indices}:${cursor}`;\n\n key += Object.keys(filters).map(filterName => {\n const filter = filters[filterName];\n return Array.isArray(filter) ? filter.join(';') : filter;\n }).join(';');\n\n const params = Object.assign({}, {\n index: indices,\n cursor: cursor ?? undefined,\n query,\n allowSubstitute,\n limit,\n ...filters\n });\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v3/search', params),\n publicUrl: UrlHelper.urlBuilder('/api/search', params),\n key,\n formatData: formatSearchResponse,\n success,\n error\n };\n },\n\n tagsAndClassifications(\n query: string,\n indices: SearchIndices[],\n filters: HashObject = {},\n cursor?: string,\n success?: (results: string[]) => void,\n error?: () => void\n ): Flight.PublicRequest {\n const params = {\n index: indices,\n cursor,\n query,\n ...filters\n };\n\n let key = `filter:options:${query}:${indices.join(':')}:${cursor}`;\n\n key += Object.keys(filters).map(filterName => {\n const filter = filters[filterName];\n return Array.isArray(filter) ? filter.join(';') : filter;\n }).join(';');\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v3/search/tags-and-classifications', params),\n publicUrl: UrlHelper.urlBuilder('/api/search/tags-and-classifications', params),\n key,\n success,\n error,\n normalize: false\n };\n }\n};\n","import { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { SharedSearchRequests } from 'libs/shared/apps/search/flight-requests/SharedSearchRequests';\nimport { SearchIndices } from 'libs/shared/apps/search/interfaces';\n\nexport interface UseGetTagsAndClassificationsOptions {\n queryParams: HashObject;\n appliedIndices: SearchIndices[];\n backendFilters: HashObject;\n}\n\nexport function useGetTagsAndClassifications(options: UseGetTagsAndClassificationsOptions) {\n return Flight.useBasicFetch<string[]>(options && SharedSearchRequests.tagsAndClassifications(\n options.queryParams.query,\n options.appliedIndices,\n options.backendFilters\n ));\n}\n","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { EntityType, LocationContext } from 'libs/analytics/interfaces';\n\nimport { MixedSearchResults } from 'libs/shared/apps/search/components/mixed-search-results/MixedSearchResults';\nimport { SearchFilters } from 'libs/shared/apps/search/components/search-filters/SearchFilters';\nimport { SearchSubstitute } from 'libs/shared/apps/search/components/search-substitute/SearchSubstitute';\nimport { SearchSuggestions } from 'libs/shared/apps/search/components/search-suggestions/SearchSuggestions';\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { PartialVideoList } from 'libs/shared/components/video-list/partial-loading/PartialVideoList';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\n\nimport { Actions } from 'shared/constants/ExchangeActions';\nimport { AppChannels } from 'shared/constants/ExchangeRadioChannels';\n\nimport { ExchangeSearchBar } from 'apps/exchange/components/exchange-search-bar/ExchangeSearchBar';\nimport { useCommonVideoProps } from 'apps/exchange/hooks/useCommonVideoProps';\nimport { useGetExchangeActions } from 'apps/exchange/hooks/useGetExchangeActions';\nimport { ExchangeSearchUtils } from 'apps/exchange/views/exchange-search-results/ExchangeSearchUtils';\n\nimport { ExchangeSearchResultsState } from './empty-state/ExchangeSearchEmptyState';\nimport { useFetchSearchData } from './useFetchSearchData';\nimport { useGetSearchResults } from './useGetSearchResults';\nimport { useGetTagsAndClassifications } from './useGetTagsAndClassifications';\n\ninterface ExchangeSearchResultsViewProps {\n queryParams: HashObject;\n}\n\nexport function ExchangeSearchResultsView(props: ExchangeSearchResultsViewProps): JSX.Element {\n const { queryParams = {} } = props;\n\n const videoActions = useGetExchangeActions('video-list');\n\n const searchData = useFetchSearchData(queryParams);\n\n const { commonVideoProps } = useCommonVideoProps();\n\n const searchFilters = ExchangeSearchUtils.getBackendFilters(searchData);\n\n const tagsAndClassifications = useGetTagsAndClassifications(searchFilters);\n const searchResults = useGetSearchResults({ ...searchFilters, ...searchData });\n\n const filters = ExchangeSearchUtils.getFilters(searchData, tagsAndClassifications);\n\n /**\n * Custom hooks\n */\n useSetPageMetadata({ title: queryParams.query ?? '' });\n\n /**\n * Do we have the data we need for the entire view to render\n */\n const hasLoaded = (\n searchData.hasDataLoaded && filters\n );\n\n /**\n * Do we have the data we need to render our results\n */\n const hasSearchCompleted = (\n searchResults.hasFirstPageCompleted &&\n // Topic and Company requests won't exist if they aren't being fetched\n tagsAndClassifications.hasCompleted &&\n !!filters\n );\n\n /**\n * Do we actually have results\n */\n const hasResults = (\n searchResults.items?.length\n );\n\n if (!hasLoaded)\n return <></>;\n\n return (\n <>\n <ExchangeSearchBar query={queryParams.query} />\n\n <SearchSubstitute\n substitute={searchResults.substituteQuery}\n queryParams={queryParams}\n getAppLink={ExchangeSearchUtils.getAppLink}\n />\n\n {!searchResults.substituteQuery && (\n <SearchSuggestions\n suggestions={searchResults?.suggestions}\n queryParams={queryParams}\n getAppLink={ExchangeSearchUtils.getAppLink}\n />\n )}\n\n <SearchFilters\n queryParams={queryParams}\n mainFilters={filters?.mainFilters}\n moreFilters={filters?.moreFilters}\n analyticsOptions={{\n entity: EntityType.SearchResults,\n location: LocationContext.SearchFilters\n }}\n appLink={{ application: AppChannels.EXCHANGE, action: Actions.Exchange.SEARCH }}\n isFetchingOptions={tagsAndClassifications.isFetching}\n />\n\n {hasSearchCompleted ? (\n <section>\n {hasResults ?\n (\n <VideoActionsContext.Provider value={videoActions}>\n {/* // TODO: Update the prop interfaces for mixed search results to be strongly typed for each use case */}\n <MixedSearchResults\n queryParams={queryParams.query}\n results={searchResults.items}\n audiences={null}\n currentUser={searchData.currentUser.data}\n availablePresentations={null}\n showActions\n companies={null}\n hasPermissions={() => false}\n appLinks={{\n getCollectionActions: ExchangeSearchUtils.getCollectionActions,\n getSeriesAppLink: ExchangeSearchUtils.getSeriesAppLink,\n getVideoAppLink: ExchangeSearchUtils.getVideoAppLink,\n getClassificationAppLink: () => null,\n getClassificationAppLinkOptions: () => null,\n getPlaylistAppLink: () => null,\n getCompanyAppLink: () => null,\n getPreviewQuestionsAppLink: () => null\n }}\n commonVideoProps={commonVideoProps}\n />\n </VideoActionsContext.Provider>\n ) : (\n <ExchangeSearchResultsState query={queryParams.query} />\n )\n }\n {searchResults.hasMore && (\n <InfiniteScrollFooter\n isFetching={searchResults.isFetching}\n fetchNext={searchResults.fetchNext}\n nextCursor={searchResults.nextCursor}\n />\n )}\n </section>\n ) : (\n <div className='mx-n2'>\n <PartialVideoList />\n </div>\n )}\n </>\n );\n}\n"],"x_google_ignoreList":[11,12,13,14,15,16],"mappings":"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"}
|