@clickview/lite 0.50.2 → 0.50.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundles.json +1 -1
- package/dist/scripts/{1437-5b1889cf0d-lite.chunk.js → 1437-f76bfeecb0-lite.chunk.js} +1 -1
- package/dist/scripts/{1437-5b1889cf0d-lite.chunk.js.map → 1437-f76bfeecb0-lite.chunk.js.map} +1 -1
- package/dist/scripts/{1820-2fa6cf6cb2-lite.chunk.js → 1820-645f38c1a1-lite.chunk.js} +2 -2
- package/dist/scripts/1820-645f38c1a1-lite.chunk.js.map +1 -0
- package/dist/scripts/3070-d2de8f3807-lite.chunk.js +2 -0
- package/dist/scripts/3070-d2de8f3807-lite.chunk.js.map +1 -0
- package/dist/scripts/4718-d159deec5b-lite.chunk.js +2 -0
- package/dist/scripts/4718-d159deec5b-lite.chunk.js.map +1 -0
- package/dist/scripts/{5940-d841fd31d8-lite.chunk.js → 5940-c55ee9b374-lite.chunk.js} +2 -2
- package/dist/scripts/5940-c55ee9b374-lite.chunk.js.map +1 -0
- package/dist/scripts/6309-6f21942483-lite.chunk.js +3 -0
- package/dist/scripts/6309-6f21942483-lite.chunk.js.map +1 -0
- package/dist/scripts/9016-9eba1d2c42-lite.chunk.js +3 -0
- package/dist/scripts/9016-9eba1d2c42-lite.chunk.js.map +1 -0
- package/dist/scripts/9839-8d44a3235c-lite.chunk.js +3 -0
- package/dist/scripts/9839-8d44a3235c-lite.chunk.js.map +1 -0
- package/dist/scripts/{bundle-83d3367a0c.min.js → bundle-8860d17bb5.min.js} +3 -3
- package/dist/scripts/bundle-8860d17bb5.min.js.map +1 -0
- package/package.json +1 -1
- package/dist/scripts/1820-2fa6cf6cb2-lite.chunk.js.map +0 -1
- package/dist/scripts/3070-47e46e0d89-lite.chunk.js +0 -2
- package/dist/scripts/3070-47e46e0d89-lite.chunk.js.map +0 -1
- package/dist/scripts/4718-6df54d3039-lite.chunk.js +0 -2
- package/dist/scripts/4718-6df54d3039-lite.chunk.js.map +0 -1
- package/dist/scripts/5940-d841fd31d8-lite.chunk.js.map +0 -1
- package/dist/scripts/6309-dd3a8e7f21-lite.chunk.js +0 -3
- package/dist/scripts/6309-dd3a8e7f21-lite.chunk.js.map +0 -1
- package/dist/scripts/9016-df37abbca9-lite.chunk.js +0 -3
- package/dist/scripts/9016-df37abbca9-lite.chunk.js.map +0 -1
- package/dist/scripts/9839-5befd54d51-lite.chunk.js +0 -3
- package/dist/scripts/9839-5befd54d51-lite.chunk.js.map +0 -1
- package/dist/scripts/bundle-83d3367a0c.min.js.map +0 -1
- /package/dist/scripts/{6309-dd3a8e7f21-lite.chunk.js.LICENSE.txt → 6309-6f21942483-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{9016-df37abbca9-lite.chunk.js.LICENSE.txt → 9016-9eba1d2c42-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{9839-5befd54d51-lite.chunk.js.LICENSE.txt → 9839-8d44a3235c-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{bundle-83d3367a0c.min.js.LICENSE.txt → bundle-8860d17bb5.min.js.LICENSE.txt} +0 -0
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/1820-2fa6cf6cb2-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/common/src/react/utils/PortalHelper.ts","file:///app/packages/libs/shared/src/apps/calendar/components/coming-soon-tag/coming-soon-tag.scss","file:///app/packages/libs/shared/src/apps/calendar/components/coming-soon-tag/ComingSoonTag.tsx","file:///app/packages/libs/shared/src/apps/calendar/components/generic-calendar-date/generic-calendar-date.scss","file:///app/packages/libs/shared/src/apps/calendar/components/generic-calendar-date/GenericCalendarDate.tsx","file:///app/packages/libs/shared/src/components/actions/Actions.tsx","file:///app/packages/libs/shared/src/components/actions/actions.scss","file:///app/packages/libs/shared/src/components/actions/ActionsDropdown.tsx","file:///app/packages/libs/shared/src/components/back-button/BackButton.tsx","file:///app/packages/libs/shared/src/components/banner-header/banner-header.scss","file:///app/packages/libs/shared/src/components/banner-header/BannerHeader.tsx","file:///app/packages/libs/shared/src/components/breadcrumbs/Breadcrumbs.tsx","file:///app/packages/libs/shared/src/components/widgets/curated-widgets/components/header/widget-header.scss","file:///app/packages/libs/shared/src/components/widgets/curated-widgets/components/header/WidgetHeader.tsx","file:///app/packages/libs/shared/src/components/widgets/curated-widgets/templates/cover-fixed-pill-list-large/CoverFixedPillListLargeWidgetTemplate.tsx","file:///app/packages/libs/shared/src/components/widgets/items/subject-widget-item/CoverPill.tsx","file:///app/packages/libs/shared/src/components/widgets/items/subject-widget-item/PartialSubjectWidgetItem.tsx","file:///app/packages/libs/shared/src/components/widgets/items/subject-widget-item/SubjectWidgetItem.tsx","file:///app/packages/libs/shared/src/components/widgets/items/subject-widget-item/EditSubjectsWidgetLink.tsx","file:///app/packages/libs/shared/src/components/widgets/items/subject-widget-item/AllSubjectsWidgetLink.tsx","file:///app/packages/libs/shared/src/utils/DragHelper.ts","file:///app/packages/libs/shared/src/components/widgets/sliding-list/SlidingListContainer.tsx","file:///app/packages/libs/shared/src/components/widgets/widget-button/widget-button.scss","file:///app/packages/libs/shared/src/components/widgets/widget-button/WidgetButton.tsx","file:///app/packages/libs/shared/src/enums/ClassificationStatus.ts","file:///app/packages/libs/shared/src/enums/CssMeasurement.ts","file:///app/packages/libs/shared/src/enums/WidgetInteraction.ts","file:///app/packages/libs/shared/src/flight-requests/FollowRequests.ts","file:///app/packages/libs/shared/src/hooks/UseGetMediaQueryString.ts","file:///app/packages/libs/shared/src/utils/audience-helper/AudienceStringBuilders.ts","file:///app/packages/libs/shared/src/utils/audience-helper/AudienceHelper.ts","file:///app/packages/projects/lite/src/apps/subjects/utils/ClassificationAppLinks.ts","file:///app/packages/projects/lite/src/apps/subjects/views/classifications/classifications.scss","file:///app/packages/projects/lite/src/apps/subjects/views/classifications/ClassificationsView.tsx","file:///app/packages/libs/shared/src/components/widgets/items/subject-widget-item/cover-pill.scss","file:///app/node_modules/react-bootstrap/esm/Row.js"],"sourcesContent":["import React from 'react';\nimport { createPortal } from 'react-dom';\n\nexport const PortalHelper = {\n renderInPortalIfExists(component: React.ReactElement, portalContainer: Element | null): React.ReactElement {\n if (portalContainer)\n return createPortal(component, portalContainer);\n\n return component;\n }\n};","// extracted by mini-css-extract-plugin\nexport default {\"tag\":\"XRj8d\",\"tooltip\":\"X6mLk\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './coming-soon-tag.scss';\n\nconst namespace = 'specialEventCalendar.comingSoonTag';\n\ninterface ComingSoonProps {\n className?: string;\n onlyIcon?: boolean;\n}\n\nexport function ComingSoonTag(props: ComingSoonProps): JSX.Element {\n return (\n <Tooltip title={LanguageService.getPhrase(namespace, 'tooltip')} spanHackClassName={`d-block ${styles.tooltip}`} spanHack>\n <div className={`d-flex text-dark align-items-center ${styles.tag} ${props.className}`}>\n <SvgContainer svgName={cvSvgLibrary.Timer} />\n {!props.onlyIcon && LanguageService.getPhrase(namespace, 'comingSoon')}\n </div>\n </Tooltip>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"dateItem\":\"I3SBm\",\"label\":\"PRORs\",\"body\":\"RfiM_\",\"bodyDay\":\"ZOVny\",\"bodyRange\":\"vYhXN\",\"bodyMonth\":\"mYslO\",\"month\":\"EPkkQ\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { CalendarTheme } from 'libs/shared/apps/calendar/interfaces/CalendarTheme';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\n\nimport styles from './generic-calendar-date.scss';\n\nexport interface GenericCalendarDateProps {\n label?: string;\n body: {\n type: 'month' | 'range' | 'day';\n text: string;\n };\n month?: string;\n getAppLink?: () => Core.AppLink;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n className?: string;\n theme?: CalendarTheme;\n}\n\nexport function GenericCalendarDate(props: GenericCalendarDateProps): JSX.Element {\n function getBodyClass(): string {\n switch (props.body.type) {\n case 'range':\n return styles.bodyRange;\n case 'day':\n return styles.bodyDay;\n case 'month':\n return styles.bodyMonth;\n }\n }\n\n return (\n <AppLink\n appLink={props.getAppLink?.()}\n className={`text-decoration-none text-center bg-white text-dark border border-3 ${props.theme?.border} rounded-3 d-block fw-semibold ${props.className}`}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n >\n <div className={`position-relative ${styles.dateItem}`}>\n <div className={`${props.theme?.background} py-1 ${styles.label} d-flex align-items-center justify-content-center`}>\n {props.label ? props.label : <> </>}\n </div>\n <div className={`${getBodyClass()} ${styles.body} my-2`}>\n {props.body.text}\n </div>\n <div className={`mb-0 ${styles.month}`}>\n {props.month}\n </div>\n </div>\n </AppLink>\n );\n}","import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { BaseObject } from 'libs/shared/interfaces';\n\nimport { ActionButton } from './ActionButton';\nimport { ActionsDropdown } from './ActionsDropdown';\n\nexport interface ActionOptions {\n order?: number;\n label?: string | (() => JSX.Element);\n appLink?: Core.AppLink;\n href?: string;\n onClick?: () => void;\n svgName?: string;\n className?: string;\n button?: boolean; // If true, a button will be rendered. Otherwise the action will be rendered in the dropdown.\n tooltip?: string;\n showSpinner?: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n disabled?: boolean;\n openInNewTab?: boolean; // Only used if appLink or href is provided\n group?: string;\n lazyPlaceholder?: boolean;\n}\n\nexport type ActionGenerator = (obj: BaseObject) => ActionOptions[];\n\ninterface ActionsProps {\n actions: ActionOptions[];\n className?: string;\n actionsDropdownClassName?: string;\n dropdownToggleSvgSize?: SvgContainerSize;\n sortComponent?: JSX.Element;\n fetchMore?: () => void;\n}\n\nexport function Actions(props: ActionsProps): JSX.Element {\n const orderedActions = React.useMemo(() => props.actions.sort((a, b) => a.order - b.order), [props.actions]);\n\n const buttonActions: ActionOptions[] = [];\n const moreActions: ActionOptions[] = [];\n\n orderedActions.forEach(a => {\n if (a.button)\n buttonActions.push(a);\n else\n moreActions.push(a);\n });\n\n let className = 'd-flex';\n\n if (props.className)\n className += ` ${props.className}`;\n\n if (!buttonActions.length && !moreActions.length)\n return <></>;\n\n return (\n <div className={className}>\n <>\n <span className='d-flex align-items-center'>\n {buttonActions.length ? buttonActions.map((a, idx) => (\n <React.Fragment key={idx}>\n {(() => {\n if (a.label) {\n const label = FunctionHelper.isFunction(a.label)\n ? a.label\n : () => <>{a.label}</>;\n \n return (\n <ActionButton\n appLink={a.appLink}\n href={a.href}\n onClick={a.onClick}\n svgName={a.svgName}\n className={a.className}\n tooltip={a.tooltip}\n showSpinner={a.showSpinner}\n analyticsData={a.analyticsData}\n analyticsOptions={a.analyticsOptions}\n openInNewTab={a.openInNewTab}\n disabled={a.disabled}\n >\n {label()}\n </ActionButton>\n );\n }\n\n const iconButton = (\n <IconButton\n appLink={a.appLink}\n href={a.href}\n onClick={a.onClick}\n svgName={a.svgName}\n className={a.className}\n analyticsData={a.analyticsData}\n analyticsOptions={a.analyticsOptions}\n openInNewTab={a.openInNewTab}\n disabled={a.disabled}\n />\n );\n\n return a.tooltip\n ? <Tooltip title={a.tooltip} spanHack>{iconButton}</Tooltip>\n : iconButton;\n })()}\n </React.Fragment>\n )) : <></>}\n {props.sortComponent && props.sortComponent}\n {moreActions.length ? (\n <ActionsDropdown\n actions={moreActions}\n dropdownToggleClassName={props.actionsDropdownClassName}\n dropdownToggleSvgSize={props.dropdownToggleSvgSize}\n fetchMore={props.fetchMore}\n />\n ) : <></>}\n </span>\n </>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"dropdownToggle\":\"UCAnJ\"};","import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Core } from 'libs/common/core';\nimport { RandomHelper } from 'libs/common/react/utils/RandomHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ActionOptions } from './Actions';\n\nimport styles from './actions.scss';\n\nfunction LazyDropdownItems(): JSX.Element {\n return (\n <>\n <div style={{ padding: '0.53125rem 1rem' }}>\n <div className='partial-loading-background' style={{ height: '1.0625rem', width: '8rem' }}></div>\n </div>\n <div style={{ padding: '0.53125rem 1rem' }}>\n <div className='partial-loading-background' style={{ height: '1.0625rem', width: '12rem' }}></div>\n </div>\n <div style={{ padding: '0.53125rem 1rem' }}>\n <div className='partial-loading-background' style={{ height: '1.0625rem', width: '11rem' }}></div>\n </div>\n <div style={{ padding: '0.53125rem 1rem' }}>\n <div className='partial-loading-background' style={{ height: '1.0625rem', width: '9rem' }}></div>\n </div>\n </>\n );\n}\n\nfunction getDropdownItemClassName(actionClassName?: string): string {\n let className = 'dropdown-item';\n\n if (actionClassName)\n className += ` ${actionClassName}`;\n\n return className;\n}\n\nexport type DropdownActionOptions = Omit<ActionOptions, 'button'>;\n\ninterface ActionsDropdownItemProps {\n action: DropdownActionOptions;\n}\n\nfunction ActionsDropdownItem(props: ActionsDropdownItemProps): React.ReactElement {\n const label = FunctionHelper.isFunction(props.action.label)\n ? props.action.label\n : () => <>{props.action.label}</>;\n\n if (props.action.appLink)\n return (\n <AppLink\n appLink={props.action.appLink}\n onClick={props.action.onClick}\n className={getDropdownItemClassName(props.action.className)}\n analyticsData={props.action.analyticsData}\n analyticsOptions={props.action.analyticsOptions}\n openInNewTab={props.action.openInNewTab}\n disabled={props.action.disabled}\n >\n {props.action.svgName && <SvgContainer svgName={props.action.svgName} className='d-inline-block svg-container me-2 align-middle' />}\n <span className='align-middle'>{label()}</span>\n </AppLink>\n );\n\n function onClick(e: React.MouseEvent | React.KeyboardEvent): void {\n e.preventDefault();\n\n if (props.action.analyticsData && props.action.analyticsOptions)\n AnalyticsHelper.logUserAction(props.action.analyticsData, props.action.analyticsOptions);\n\n if (FunctionHelper.isFunction(props.action.onClick))\n props.action.onClick();\n\n if (props.action.href)\n Core.LocationUtils.PageLoad(props.action.href, props.action.openInNewTab);\n }\n\n if (props.action.href) {\n return (\n <a\n className={getDropdownItemClassName(props.action.className)}\n onClick={onClick}\n href={props.action.href}\n >\n {props.action.svgName && <SvgContainer svgName={props.action.svgName} className='d-inline-block svg-container me-2 align-middle' />}\n <span className='align-middle'>{label()}</span>\n </a>\n );\n }\n\n return (\n <span\n className={`cursor-pointer ${getDropdownItemClassName(props.action.className)}`}\n onClick={onClick}\n role='button'\n tabIndex={0}\n onKeyDown={(e: React.KeyboardEvent) => e.key === 'Enter' && onClick(e)}\n >\n {props.action.svgName && <SvgContainer svgName={props.action.svgName} className='d-inline-block svg-container me-2' />}\n {label()}\n </span>\n );\n}\n\ninterface ActionsDropdownProps {\n actions: DropdownActionOptions[];\n className?: string;\n dropdownToggleClassName?: string;\n dropdownToggleSvgSize?: SvgContainerSize;\n fetchMore?: () => void;\n}\n\nActionsDropdown.defaultProps = {\n dropdownToggleClassName: 'btn btn-light',\n dropdownToggleSvgSize: SvgContainerSize.Small\n};\n\nexport function ActionsDropdown(props: ActionsDropdownProps): React.ReactElement {\n if (!props.actions || !props.actions.length)\n return <></>;\n\n const isLazy = props.actions.some(a => a.lazyPlaceholder);\n\n let className = 'dropdown';\n\n if (props.className)\n className += ` ${props.className}`;\n\n // Generate unique id to avoid collisions.\n const dropdownToggleId = `actions-dropdown-${RandomHelper.getRandomInt()}`;\n\n let dropdownToggleClassName = `dropdown-toggle px-0 ${styles.dropdownToggle}`;\n\n if (props.dropdownToggleClassName)\n dropdownToggleClassName += ` ${props.dropdownToggleClassName}`;\n\n let currentGroup: string;\n\n return (\n <div className={className}>\n <button\n className={dropdownToggleClassName}\n type='button'\n id={dropdownToggleId}\n data-bs-toggle='dropdown'\n data-toggle='dropdown'\n aria-haspopup='true'\n aria-expanded='false'\n onClick={isLazy ? props.fetchMore : null}\n >\n <SvgContainer svgName={cvSvgLibrary.More} size={props.dropdownToggleSvgSize} />\n </button>\n <div className='dropdown-menu dropdown-menu-end dropdown-menu-right' aria-labelledby={dropdownToggleId}>\n {isLazy ?\n <LazyDropdownItems /> :\n props.actions.map((a, idx) => {\n const showDivider = currentGroup !== undefined && currentGroup !== a.group;\n currentGroup = a.group;\n \n if (a.tooltip) {\n return (\n <React.Fragment key={idx}>\n {showDivider && <hr className='dropdown-divider' role='separator'></hr>}\n <Tooltip title={a.tooltip} spanHack>\n <ActionsDropdownItem action={a} />\n </Tooltip>\n \n </React.Fragment>\n );\n }\n \n return (\n <React.Fragment key={idx}>\n {showDivider && <hr className='dropdown-divider' role='separator'></hr>}\n <ActionsDropdownItem action={a} />\n </React.Fragment>\n );\n })\n }\n </div>\n </div>\n );\n}","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.backButton';\n\ninterface BackButtonProps {\n appLink: Core.AppLink;\n backToName?: string;\n color?: 'black' | 'white';\n extraClasses?: string;\n /**\n * Whether or not the button text has a text shadow. Defaults to true\n */\n textShadow?: boolean;\n}\n\nBackButton.defaultProps = {\n color: 'black',\n extraClasses: ''\n};\n\nexport function BackButton(props: BackButtonProps): React.ReactElement {\n const { backToName, appLink, color, extraClasses, textShadow } = {\n textShadow: true,\n ...props\n };\n\n const backPhrase = backToName\n ? LanguageService.getPhrase(namespace, 'backTo', { backToName })\n : LanguageService.getPhrase(namespace, 'back');\n\n const colorClass = color === 'black' ? '' : 'text-white';\n const textShadowClass = textShadow ? 'text-shadow' : '';\n\n return (\n <AppLink\n appLink={appLink}\n className={`d-inline-flex align-items-center h5 mb-0 ${extraClasses} ${colorClass} ${textShadowClass}`}\n >\n <SvgContainer svgName={cvSvgLibrary.ChevronLeft} size={SvgContainerSize.Medium} />\n <span className='ms-1'>{backPhrase}</span>\n </AppLink>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"bannerContent\":\"sSCTB\",\"actionsContainer\":\"Z5WI2\",\"bannerContentWithLogo\":\"rgs7Q\",\"container\":\"M51HJ\",\"logoContainer\":\"vkeJk\",\"logoContainerLeft\":\"M3U9B\",\"logoHeading\":\"EtRwC\",\"specialEventContainer\":\"rOxDc\",\"headingLarge\":\"_8pnV\",\"heading\":\"JXVBH\"};","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\nimport { PortalHelper } from 'libs/common/react/utils/PortalHelper';\n\nimport { ComingSoonTag } from 'libs/shared/apps/calendar/components/coming-soon-tag/ComingSoonTag';\nimport { GenericCalendarDate } from 'libs/shared/apps/calendar/components/generic-calendar-date/GenericCalendarDate';\nimport { CalendarTheme } from 'libs/shared/apps/calendar/interfaces/CalendarTheme';\nimport { ActionOptions, Actions } from 'libs/shared/components/actions/Actions';\nimport { BackButton } from 'libs/shared/components/back-button/BackButton';\nimport { LazyImage } from 'libs/shared/components/lazy-image/LazyImage';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ImageMinDimensions } from 'libs/shared/constants/ImageSizes';\nimport { BannerPortalContext } from 'libs/shared/context/BannerPortalContext';\nimport { ImageSize, ImageType, ResizeType } from 'libs/shared/enums/Images';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Banner, CalendarEvent, Logo } from 'libs/shared/interfaces';\nimport { ImageHelper, ImageOptions } from 'libs/shared/utils/ImageHelper';\n\nimport styles from './banner-header.scss';\n\nconst RATIO = `${ImageMinDimensions[ImageType.Banners].width}:${ImageMinDimensions[ImageType.Banners].height}`;\nconst DEFAULT_WIDTH = 1200; // This is ImageSize.Large for a Banner.\nconst LARGE_SCREEN_WIDTH = 1920;\n\nfunction useGetImageWidth(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xxl)\n return LARGE_SCREEN_WIDTH;\n\n return DEFAULT_WIDTH;\n}\n\nfunction getSizeClass(heading: string): string {\n if (heading.length < 160)\n return 'h1';\n\n return styles.headingLarge;\n}\n\ninterface BannerHeaderProps {\n heading: string;\n banner?: Banner;\n bannerClassName?: string;\n imageCdnUrl?: string;\n logo?: Logo;\n actions?: ActionOptions[];\n specialEvent?: CalendarEvent;\n backButtonAppLink?: Core.AppLink;\n backButtonText?: string;\n backButtonClasses?: string;\n sortComponent?: JSX.Element;\n blockColourClass?: string;\n actionsDropdownClassName?: string;\n detailsComponent?: () => React.ReactElement;\n imageOptions?: ImageOptions;\n showComingSoon?: boolean;\n alignLogoLeft?: boolean;\n calendarTheme?: CalendarTheme;\n}\n\nconst namespace = 'shared.bannerHeader';\n\nexport const BannerHeader = React.memo(function(props: React.PropsWithChildren<BannerHeaderProps>): React.ReactElement {\n const { heading, banner, imageCdnUrl, actions, sortComponent, blockColourClass, specialEvent } = props;\n\n const portalContainerContext = React.useContext(BannerPortalContext);\n\n const imageWidth = useGetImageWidth();\n\n const specialEventIsToday = React.useMemo(() => {\n if (!specialEvent || props.showComingSoon)\n return false;\n\n const today = DateHelper.format(new Date(), 'YYYY-MM-DD');\n\n if (!specialEvent.endDate)\n return specialEvent.startDate === today;\n\n return specialEvent.startDate <= today && specialEvent.endDate >= today;\n }, [specialEvent]);\n\n const imageOptions = props.imageOptions || {\n width: imageWidth,\n ratio: RATIO,\n resizeType: ResizeType.Cover\n };\n\n const url = !!banner && !!imageCdnUrl && ImageHelper.createBannerUrl(banner, {\n fallbackBaseUrl: imageCdnUrl,\n fallbackCategoryName: heading,\n type: ImageType.Banners\n }, imageOptions);\n\n const containerProps: React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement> = {\n className: `banner banner-header ${props.bannerClassName}`,\n style: url ? { backgroundImage: `url('${url}')` } : {}\n };\n\n if (!banner && blockColourClass) {\n delete containerProps.style;\n containerProps.className += ` ${blockColourClass}`;\n }\n\n const DetailsComponent = props.detailsComponent;\n\n return PortalHelper.renderInPortalIfExists(\n // \"banner\" is used in playlists in Online. banner-header is used by all other projects\n <header {...containerProps}>\n <div className={`container ${styles.container} position-relative inner-banner`}>\n {props.backButtonAppLink && (\n <div className='pt-3'>\n <BackButton\n appLink={props.backButtonAppLink}\n backToName={props.backButtonText}\n extraClasses={props.backButtonClasses}\n color='white'\n />\n </div>\n )}\n \n <div className={`${props.alignLogoLeft ? 'position-absolute top-50 start-0 translate-middle-y w-100 ps-4' : `${styles.bannerContent} px-2 ${props.logo?.url ? styles.bannerContentWithLogo : ''}`}`}>\n {!!specialEvent && (\n <div className={`position-relative ${styles.specialEventContainer}`}>\n <GenericCalendarDate\n body={{\n type: specialEvent.endDate ? 'range' : 'day',\n text: specialEvent.endDate\n ? `${DateHelper.format(specialEvent.startDate, 'DD')}-${DateHelper.format(specialEvent.endDate, 'DD')}`\n : DateHelper.format(specialEvent.startDate, 'DD')\n }}\n month={DateHelper.format(specialEvent.startDate, 'MMMM')}\n theme={props.calendarTheme}\n />\n </div>\n )}\n <div>\n {specialEventIsToday && (\n <div className='rounded-pill py-1 px-2 my-1 me-1 fw-semibold bg-light-blue lh-1 d-inline-block'>\n <Text namespace={namespace} phrase='onToday' />\n </div>\n )}\n {props.showComingSoon && (\n <ComingSoonTag className='pe-2 fw-semibold mb-1 rounded-pill justify-content-start text-nowrap' />\n )}\n <div className='d-flex align-items-center'>\n {props.alignLogoLeft &&\n <div className={`${styles.logoContainerLeft} d-none d-md-block partial-loading-background rounded-circle overflow-hidden me-3`}>\n {props.logo?.url &&\n <LazyImage src={ImageHelper.createUrl(props.logo?.url, { size: ImageSize.Small })} />}\n </div>\n }\n <h1 className={`text-white text-shadow pe-3 position-static ${styles.heading} ${getSizeClass(heading)} ${props.alignLogoLeft ? 'w-50' : ''}`}>\n {heading}\n {DetailsComponent && <DetailsComponent />}\n </h1>\n </div>\n </div>\n {!!actions && (\n <div className={styles.actionsContainer}>\n <Actions\n actions={actions}\n sortComponent={sortComponent}\n actionsDropdownClassName={props.actionsDropdownClassName}\n />\n </div>\n )}\n </div>\n {!props.alignLogoLeft && !!props.logo?.url &&\n <div className={styles.logoContainer}>\n <img\n src={ImageHelper.createUrl(props.logo.url, { size: ImageSize.Small })}\n className='rounded-circle'\n />\n </div>\n }\n </div>\n </header>,\n portalContainerContext?.container\n );\n}, (prevProps, nextProps): boolean => (\n prevProps.actions === nextProps.actions\n && prevProps.heading === nextProps.heading\n && prevProps.logo?.url === nextProps.logo?.url\n));\n\nexport function PartialBannerHeader(): JSX.Element {\n const portalContainerContext = React.useContext(BannerPortalContext);\n\n return PortalHelper.renderInPortalIfExists(\n <div className={`partial-banner partial-loading-background ${styles.banner}`} />,\n portalContainerContext?.container\n );\n}","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { PartialLoadingHelper } from 'libs/shared/utils/PartialLoadingHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { SvgContainer, SvgContainerSize } from '../svg-container/SvgContainer';\n\nexport interface Breadcrumb {\n name: string;\n appLink?: Core.AppLink;\n active?: boolean;\n}\n\ninterface BreadcrumbItemProps {\n breadcrumb: Breadcrumb;\n withBackIcon?: boolean;\n}\n\nexport const BreadcrumbItem = ({ breadcrumb: { name, appLink, active }, withBackIcon }: BreadcrumbItemProps) => (\n <li className={`breadcrumb-item${active ? ' active' : ''}`}>\n {active\n ? <strong>{name}</strong>\n : <AppLink appLink={appLink}>\n {withBackIcon && <SvgContainer svgName={cvSvgLibrary.ChevronLeft} size={SvgContainerSize.Small} />}\n <span className={withBackIcon ? 'ms-2' : ''}>{name}</span>\n </AppLink>\n }\n </li>\n);\n\ninterface BreadcrumbsProps {\n breadcrumbs: Breadcrumb[];\n}\n\nexport const Breadcrumbs = ({ breadcrumbs }: BreadcrumbsProps) => {\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n\n const length = breadcrumbs?.length;\n\n if (!length || (isMobile && length < 2))\n return <></>;\n\n if (isMobile)\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n <BreadcrumbItem breadcrumb={breadcrumbs[length - 2]} withBackIcon />\n </ol>\n </nav>\n );\n\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {breadcrumbs.map((b, idx) => <BreadcrumbItem key={idx} breadcrumb={b} />)}\n </ol>\n </nav>\n );\n};\n\nexport const PartialBreadcrumbs = React.memo(function({ numItems = 3 }: { numItems?: number; }) {\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n\n if (isMobile) {\n return (\n <div className='partial-loading-background' style={{ height: '1.3125rem', width: '6rem' }} />\n );\n }\n\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {PartialLoadingHelper.getPartialLoadingItems({ numItems }).map(({ width }, idx) => (\n <li key={idx} className='breadcrumb-item'>\n <span className='d-inline-block partial-loading-background' style={{ width }} dangerouslySetInnerHTML={{ __html: ' ' }} />\n </li>\n ))}\n </ol>\n </nav>\n );\n});","// extracted by mini-css-extract-plugin\nexport default {\"seeMore\":\"yv0FS\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\n\nimport styles from './widget-header.scss';\n\nconst namespace = 'shared.widgetHeader';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface WidgetHeaderProps {\n name: string;\n description: string;\n\n appLink?: Core.AppLink;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n showSeeMoreLink?: boolean;\n onClick?: () => void;\n}\n\nfunction SeeMore(props: WidgetHeaderProps) {\n return (\n <div className={`ms-3 ${styles.seeMore}`}>\n <AppLink\n appLink={props.appLink}\n analyticsData={props.analyticsData }\n analyticsOptions={{ ...props.analyticsOptions, descriptor: ClickDescriptor.SeeMore }}\n className={`text-decoration-none ${props.appLink ? 'curated-widget-link' : ''}`}\n >\n <p className='hover-text-underline text-dark curated-widget-heading'>{getPhrase('seeMore')}</p>\n </AppLink>\n </div>\n );\n}\n\nexport function WidgetHeader(props: WidgetHeaderProps): JSX.Element {\n const hasDescription = !!props.description;\n\n if (!props.name && !props.description)\n return <></>;\n\n return (\n <div className='curated-widget-header'>\n <div className='d-flex justify-content-between'>\n {!!props.name && (\n <div className={styles.title}>\n <AppLink\n appLink={props.appLink}\n analyticsOptions={props.analyticsOptions}\n analyticsData={props.analyticsData}\n className={`text-decoration-none ${props.appLink ? 'curated-widget-link' : ''}`}\n onClick={props.onClick}\n >\n <h2 className='h4 curated-widget-heading'>\n {props.name}\n </h2>\n </AppLink>\n </div>\n )}\n {!!props.appLink && !hasDescription && !!props.showSeeMoreLink && <SeeMore {...props}/>}\n </div>\n \n {hasDescription && (\n <div className='d-flex justify-content-between align-items-end'>\n <p className={`description curated-widget-description ${styles.description}`}>\n <span>{props.description}</span>\n </p>\n {!!props.appLink && !!props.showSeeMoreLink && <SeeMore {...props}/> }\n </div>\n )}\n </div>\n );\n}","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { WidgetHeader } from 'libs/shared/components/widgets/curated-widgets/components/header/WidgetHeader';\nimport { WidgetTemplateProps } from 'libs/shared/components/widgets/curated-widgets/WidgetProps';\nimport { SubjectWidgetItem } from 'libs/shared/components/widgets/items/subject-widget-item/SubjectWidgetItem';\nimport { Classification } from 'libs/shared/interfaces';\n\nexport function CoverFixedPillListLargeWidgetTemplate(props: WidgetTemplateProps<Classification[]>): JSX.Element {\n return (\n <>\n <WidgetHeader name={props.name} description={props.description} />\n <Row className='mb-n2'>\n {props.content.map(c => {\n return (\n <Col className={`position-relative pb-2`} key={c.id} xs={12} sm={6} lg={props.hasTableOfContents ? 6 : 4} xl={4}>\n <SubjectWidgetItem\n data={c}\n getChildAppLink={(c: Classification) => props.appLinks?.classification?.(c)}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n isLarge\n />\n </Col>\n );\n })}\n </Row>\n </>\n );\n}","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\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 { ImageSize } from 'libs/shared/enums/Images';\nimport { BaseObject, Presentation } from 'libs/shared/interfaces';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './cover-pill.scss';\n\nconst namespace = 'shared.subjectWidgetItem';\n\ninterface NamePanelProps {\n name: string;\n multiline?: boolean;\n subtitle?: string;\n}\n\nconst ComingSoonNamePanel = ({ name, multiline }: 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={`${styles.name} h6`}><span className={textClassName}>{name}</span></p>\n </div>\n );\n};\n\nconst NormalNamePanel = ({ name, multiline, subtitle }: NamePanelProps) => {\n let wrapperClassName = 'px-3 d-flex flex-column justify-content-center';\n let textClassName = `${styles.name} h6`;\n\n if (!multiline) {\n wrapperClassName += ' text-nowrap text-truncate';\n textClassName += ' text-truncate mb-0 pb-1';\n } else {\n textClassName += ' 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 </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}\n\ninterface CoverPillWidgetContentProps<T> extends CoverPillWidgetItemProps<T> {\n coverUrl?: string;\n subtitle?: string;\n isComingSoon?: boolean;\n className?: string;\n imageClassName?: string;\n isSelected?: boolean;\n hideFallback?: boolean;\n hideCheckmark?: boolean;\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 const childProps = {\n name: props.data.name,\n multiline: props.isLarge || props.multiline,\n subtitle: props.subtitle\n };\n\n return (\n <div\n className={`border d-flex position-relative ${props.className} ${styles.widgetItem} ${props.isSelected ? 'border-success border-2' : ''}`}\n id={`${props.data.id}-${RandomHelper.getRandomInt()}`}\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 svgName={cvSvgLibrary.Check} svgSize={SvgContainerSize.Large} textVariant='white' variant='green' />\n </div>\n )}\n\n <div\n className={`${styles.image} ${props.imageClassName}`}\n style={props.coverUrl ? { backgroundImage: `url('${coverUrl}')` } : {}}\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}","import * as React from 'react';\n\nimport { RandomHelper } from 'libs/common/react/utils/RandomHelper';\n\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\n\nimport styles from './cover-pill.scss';\n\nexport const PartialSubjectWidgetItem = () => {\n const [width] = React.useState(RandomHelper.getRandomInt(5) + 3 + 'rem');\n\n return (\n <div className={`border d-flex position-relative me-2 ${styles.widgetItem}`}>\n <div className={styles.imagePanel} />\n <div className='px-2' style={{ width }} />\n <div className={styles.partialIcon}>\n <ImageFallback type={ImageFallbackType.Subject} />\n </div>\n </div>\n );\n};\n\nexport const PartialLargeSubjectWidgetItem = () => {\n return (\n <div className={`border d-flex position-relative me-2 ${styles.widgetItem}`}>\n <div className={`${styles.partialLargeImage}`} />\n <div className='px-2' />\n <div className={styles.partialIcon}>\n <ImageFallback type={ImageFallbackType.Subject} extraClasses={styles.partialLargeFallback} />\n </div>\n </div>\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.data?.id,\n name: props.data?.name,\n presentationId: props.data.presentationId,\n comingSoon: !!isComingSoon\n };\n\n const analyticsOptions = {\n location: LocationContext.ClassificationListItem,\n ...props.analyticsOptions,\n actionType: UserAction.Click,\n entity: EntityType.Classification,\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 subtitle={props.getSubtitle?.(props.data) || presentationName}\n isComingSoon={isComingSoon}\n />\n );\n}\n\nconst Memoized = React.memo(SubjectWidgetItem);\n\nexport { Memoized as SubjectWidgetItem };","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 { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './cover-pill.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 svgName={cvSvgLibrary.Edit} 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}","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.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 { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst blankImage = new Image();\nblankImage.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=';\n\nexport const DragHelper = {\n // This removes the image that appears when you drag a draggable HTML element\n hideDragImage(event: React.DragEvent<HTMLElement>): void {\n if (!event.dataTransfer.setDragImage || !FunctionHelper.isFunction(event.dataTransfer.setDragImage))\n return;\n\n event.dataTransfer.setDragImage(blankImage, 0, 0);\n }\n};","import * as React from 'react';\n\nimport { UserAgentHelper } from 'libs/common/backbone/utils/UserAgentHelper';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { CssMeasurement } from 'libs/shared/enums/CssMeasurement';\nimport { DragHelper } from 'libs/shared/utils/DragHelper';\n\nconst isTouchScreen = UserAgentHelper.isTouchScreen();\n\nconst getPositionStyling = (xPosition: number, measurement: CssMeasurement, dragPercentage?: number) => {\n // Used in situations where a touch screen user is dragging the `<FixedWidget />`\n if (measurement === CssMeasurement.Percentage && dragPercentage)\n xPosition = xPosition - dragPercentage;\n\n return {\n transform: `translate3d(${xPosition}${measurement}, 0px, 0px)`,\n transition: 'transform .4s ease-in-out'\n };\n};\n\ninterface SlidingListContainerProps extends React.PropsWithChildren<unknown> {\n position: number;\n positionType: CssMeasurement;\n\n onDrag?: (event: React.DragEvent<HTMLDivElement>) => void;\n onDragEnd?: () => void;\n\n onTouchMove?: (event: React.TouchEvent<HTMLDivElement>) => void;\n onTouchEnd?: () => void;\n\n percentageDragged?: number;\n}\n\nexport const SlidingListContainer = React.forwardRef((\n props: SlidingListContainerProps,\n ref: React.MutableRefObject<HTMLDivElement>\n): JSX.Element => {\n const { children, positionType, onDrag, onDragEnd, onTouchMove, onTouchEnd, percentageDragged, position = 0 } = props;\n\n function getEventListeners(): HashObject {\n const listenerProps: HashObject = {};\n\n if (onDrag && onDragEnd) {\n listenerProps.draggable = true;\n listenerProps.onDragEnd = onDragEnd;\n listenerProps.onDragStart = DragHelper.hideDragImage;\n listenerProps.onDragOver = onDrag;\n }\n\n if (onTouchMove && onTouchEnd && isTouchScreen) {\n listenerProps.onTouchMoveCapture = onTouchMove;\n listenerProps.onTouchEndCapture = onTouchEnd;\n }\n\n return listenerProps;\n }\n\n return (\n <div\n className='d-flex flex-nowrap position-relative w-100'\n style={getPositionStyling(position, positionType, percentageDragged)}\n ref={ref}\n {...getEventListeners()}\n >\n {children}\n </div>\n );\n});","// extracted by mini-css-extract-plugin\nexport default {\"buttonContainer\":\"_ejId\",\"left\":\"VSAPU\",\"right\":\"kgeXh\",\"button\":\"gAsE9\",\"hoverText\":\"APA36\",\"buttonHover\":\"cqD75\",\"chevron\":\"Ev4hr\",\"extendedClickableArea\":\"AtsWP\",\"gradientRight\":\"ZuAif\",\"gradientLeft\":\"Pt3nx\",\"topPos\":\"BVcIS\"};","import * as React from 'react';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { FixedWidgetState } from 'libs/shared/components/widgets/fixed-widget';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './widget-button.scss';\n\nexport enum WidgetButtonDirection {\n Left,\n Right\n}\n\ninterface WidgetButtonProps {\n onClick: (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => void;\n direction: WidgetButtonDirection;\n hide: boolean;\n contents?: WidgetContents;\n useGradientBackdrop?: boolean;\n className?: string;\n hoverText?: string;\n hideExtendedClickableArea?: boolean;\n state?: FixedWidgetState;\n\n leftButtonClassName?: string;\n rightButtonClassName?: string;\n leftGradientClassName?: string;\n rightGradientClassName?: string;\n}\n\nexport const WidgetButton = React.memo(function(props: WidgetButtonProps): JSX.Element {\n const isLeft = props.direction === WidgetButtonDirection.Left;\n\n const arrowSvg = isLeft ? cvSvgLibrary.ChevronLeft : cvSvgLibrary.ChevronRight;\n\n function getPositionClass(): string {\n let className = styles.topPos;\n \n // Left / Right\n if (isLeft)\n className += ` ${styles.left} ${props.leftButtonClassName}`;\n else\n className += ` ${styles.right} ${props.rightButtonClassName}`;\n \n return className;\n }\n\n function getStyle(): React.CSSProperties {\n if (props.state?.contents === 'videos')\n return { paddingBottom: (56.25 / props.state?.viewableItems) + '%' };\n\n return { height: '100%' };\n }\n\n if (props.hide)\n return <></>;\n\n return (\n <div className={styles.buttonContainer} style={getStyle()}>\n {props.useGradientBackdrop &&\n <div className={isLeft ? `${styles.gradientLeft} ${props.leftGradientClassName}` : `${styles.gradientRight} ${props.rightGradientClassName}`} />\n }\n\n {!props.hideExtendedClickableArea && (\n <div\n role='button'\n onClick={props.onClick}\n className={`${styles.extendedClickableArea} ${isLeft ? styles.left : styles.right}`}\n />\n )}\n\n <div\n role='button'\n className={`${getPositionClass()} ${styles.button} ${props.className || ''}`}\n onClick={props.onClick}\n >\n {props.hoverText && (\n <span className={`ps-3 pe-2 ${styles.hoverText}`}>{props.hoverText}</span>\n )}\n <SvgContainer\n svgName={arrowSvg}\n size={SvgContainerSize.Medium}\n className={`svg-container d-inline-block ${styles.chevron}`}\n />\n </div>\n </div>\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}","export enum CssMeasurement {\n Percentage = '%',\n Pixels = 'px'\n}","export enum WidgetInteraction {\n Init = 'init',\n Next = 'next',\n Previous = 'previous',\n Resize = 'resize',\n Drag = 'drag',\n Update = 'update',\n JumpToIndex = 'jump-to-index'\n}","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\n\nconst endpoints = {\n follow: () => `/api/domain/v1/subjects/classifications/following`,\n unfollow: (ids: string[]) => UrlHelper.urlBuilder('/api/domain/v1/subjects/classifications/following', { id: ids })\n};\n\nexport const FollowRequests = {\n /**\n * @param data - array of object ids the user is going to follow\n */\n follow(ids: string[], success?: (data: string[]) => void, error?: () => void): Flight.Request {\n return {\n url: endpoints.follow(),\n key: `follow:${ids.join(',')}`,\n type: HttpVerbs.POST,\n data: ids,\n success,\n error,\n invalidationKeys: [ ...ids.map(id => `classification:${id}`), 'my:subject:preferences', 'classifications' ]\n };\n },\n\n unfollow(ids: string[], success?: () => void, error?: () => void): Flight.Request {\n return {\n url: endpoints.unfollow(ids),\n key: `unfollow:${ids.join(',')}`,\n type: HttpVerbs.DELETE,\n success,\n error,\n invalidationKeys: [ ...ids.map(id => `classification:${id}`), 'my:subject:preferences', 'classifications' ]\n };\n }\n};\n","import { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\n\nimport { useMediaQuery } from './UseMediaQuery';\n\n/**\n * @deprecated Please use useBreakpoints() instead\n */\nexport function useGetMediaQueryString(): MediaQueryStrings {\n const isXS = useMediaQuery(MediaQueryStrings.XS);\n const isSM = useMediaQuery(MediaQueryStrings.SM);\n const isMD = useMediaQuery(MediaQueryStrings.MD);\n const isLG = useMediaQuery(MediaQueryStrings.LG);\n const isXL = useMediaQuery(MediaQueryStrings.XL);\n const isXXL = useMediaQuery(MediaQueryStrings.XXL);\n\n let currentString = MediaQueryStrings.LG; // default\n if (isXS) currentString = MediaQueryStrings.XS;\n if (isSM) currentString = MediaQueryStrings.SM;\n if (isMD) currentString = MediaQueryStrings.MD;\n if (isLG) currentString = MediaQueryStrings.LG;\n if (isXL) currentString = MediaQueryStrings.XL;\n if (isXXL) currentString = MediaQueryStrings.XXL;\n\n return currentString;\n}","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nconst HAS_NUMBER_REGEX = /\\d/;\nconst COUNT_OFFSET = 1;\n\nexport const AudienceStringBuilders = {\n /**\n * Handles audience sets like:\n * - Year 7, Year 8, etc\n * - Kindergarten, Grade 1, Grade 2, etc\n */\n yearsAndGradesBuilder(audiences: PresentationAudience[]): string {\n /**\n * Create a string with all of the audiences\n */\n const combinedNames = audiences.map(a => a.name).join(' ');\n\n /**\n * Extract all the numbers and matches from the string\n */\n const numberList = combinedNames.split(' ').filter(name => !isNaN(+name)).map(num => +num) || [];\n const wordList = combinedNames.split(' ').filter(name => isNaN(+name)) || [];\n\n // Find an audience that doesn't have a number, like \"Kindergarten\" or \"Foundation\".\n const audienceWithoutNum = audiences.find(p => {\n return !HAS_NUMBER_REGEX.test(p.name);\n });\n\n // Get audience label prefix\n let prefix = wordList.find(name => name !== audienceWithoutNum?.name);\n\n // Pluralise the prefix is there are multiple audiences\n if (audiences.length > 1)\n prefix += 's';\n\n if (audienceWithoutNum && numberList.length)\n return `${prefix} ${audienceWithoutNum.name.charAt(0)} - ${numberList.pop()}`;\n\n /**\n * Build set of logical audience ranges\n */\n const audienceRange = processAudienceRanges(numberList);\n\n return `${prefix} ${audienceRange.join(', ')}`;\n },\n\n /**\n * Handles audience sets like:\n * - Early Level, First Level, etc\n * - Lower Primary, Middle Primary, etc\n */\n wordyLevelsBuilder(audiences: PresentationAudience[]): string {\n const audienceNames = audiences.map(a => a.name);\n\n const commonWordsAndTheirPositions: { [word: string]: 'start' | 'end' } = {};\n\n /**\n * Go through each audience name, and find the words that are common between _all_ of the audiences.\n * For example, if the audiences are \"Early Level\", \"First Level\", and \"Second Level\", the common\n * word will be \"Level\".\n * We will also save whether the common word appears at the beginning or the end of the audience name.\n */\n audienceNames.forEach((name, index) => {\n if (index === 0) {\n const wordsInName = name.split(' ');\n wordsInName.forEach((word, index) => {\n commonWordsAndTheirPositions[word] = index === 0 ? 'start' : 'end';\n });\n\n return;\n }\n\n const wordsInName = name.split(' ');\n\n Object.keys(commonWordsAndTheirPositions).forEach(word => {\n if (!wordsInName.includes(word))\n delete commonWordsAndTheirPositions[word];\n });\n });\n\n // This function currently only handles audience names with 1 common word.\n const commonWord = Object.keys(commonWordsAndTheirPositions)[0];\n const commonWordPosition = commonWordsAndTheirPositions[commonWord];\n\n if (!commonWord)\n return audiences[0].name;\n\n /**\n * At this point, we will have a common word and the position of that word.\n * We now need to build out the rest of the audience name by merging the unique words.\n * For example, if the audiences are \"Early Level\", \"First Level\", and \"Second Level\", we will get\n * \"Early - Second\"\n */\n\n const firstAudienceName = audiences[0].name;\n const lastAudienceName = audiences[audiences.length - 1].name;\n\n // Function to strip the common word out of the audience name\n const stripOutCommonWord = (name: string) => name.split(commonWord)[0];\n\n const mergedWord = `${stripOutCommonWord(firstAudienceName)} - ${stripOutCommonWord(lastAudienceName)}`;\n\n const finalName = commonWordPosition === 'start'\n ? `${commonWord} ${mergedWord}`\n : `${mergedWord} ${commonWord}`;\n\n return finalName;\n },\n\n /**\n * Handles the english secondary audiences, which can be: Lower Secondary, Upper Secondary, and Advanced\n */\n englishSecondaryBuilder(audiences: PresentationAudience[]): string {\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n if (firstAudience.name === lastAudience.name)\n return firstAudience.name;\n\n if (lastAudience.name === 'Advanced') {\n const [level] = firstAudience.name.split(' ');\n\n if (level.toLowerCase() === 'lower')\n return 'Lower Sec - Adv';\n\n return 'Upper Sec - Adv';\n }\n\n return 'Lower - Upper Sec';\n },\n\n scottishSecondaryBuilder(audiences: PresentationAudience[]): string {\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n if (firstAudience.name === lastAudience.name)\n return firstAudience.name;\n\n if (lastAudience.name === 'Senior Phase')\n return `${firstAudience.name} - Senior`;\n\n return 'Third - Fourth Level';\n },\n\n /**\n * Handles the audience set: Reception, Key Stage 1, Lower Key Stage 2, and Upper Key Stage 2\n */\n keyStagesBuilder(audiences: PresentationAudience[]): string {\n // The first and last audience will build out the range\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n // The first word in the strings will either be \"Upper\", \"Lower\", \"Key\", or \"Reception\"\n const firstAudienceFirstWord = ArrayHelper.first(firstAudience.name.split(' '));\n const lastAudienceFirstWord = ArrayHelper.first(lastAudience.name.split(' '));\n\n // Each audience in this set except for \"Reception\" has a number. Get the numbers for the first and last audiences\n const firstAudienceNumber = firstAudience.name.split(' ').find(word => !isNaN(+word));\n const lastAudienceNumber = lastAudience.name.split(' ').find(word => !isNaN(+word));\n\n // If there's only one audience on the video:\n if (firstAudience === lastAudience) {\n // For these 2 audiences, return the full name as it's short enough already\n if (firstAudienceFirstWord === 'Key' || firstAudienceFirstWord === 'Reception')\n return firstAudience.name;\n\n // For the Upper/Lower key stage audiences, abbreviate the \"key stage\" part to KS1/KS2\n return `${firstAudienceFirstWord} KS${firstAudienceNumber}`;\n }\n\n /**\n * Handle when the object has >1 audience\n */\n\n let firstAudienceString = '';\n let lastAudienceString = '';\n\n // Reception is always shortened to \"R\" when in a range\n if (firstAudienceFirstWord === 'Reception') {\n firstAudienceString = 'R';\n } else {\n // All other audiences will be abbreviated to \"KS1/KS2\"\n firstAudienceString = `KS${firstAudienceNumber}`;\n }\n\n // The last audience will always be a key stage, so abbreviate this too\n lastAudienceString = `KS${lastAudienceNumber}`;\n\n // If the audience range contains both the \"Lower\" and \"Upper\" audiences, abbreviate those and return\n if (firstAudienceFirstWord === 'Lower' && lastAudienceFirstWord === 'Upper') {\n return `L ${firstAudienceString} - U ${lastAudienceString}`;\n }\n\n // Add \"Lower\" and \"Upper\" to the strings if it's needed\n if (firstAudienceFirstWord === 'Lower') {\n firstAudienceString = `Lower ${firstAudienceString}`;\n }\n\n if (lastAudienceFirstWord === 'Upper') {\n lastAudienceString = `Upper ${lastAudienceString}`;\n }\n\n // This handles a case where the range is Reception - Key Stage 1. In which case we don't abbreviate the key stage part to KS1.\n if (lastAudienceFirstWord === 'Key') {\n lastAudienceString = lastAudience.name;\n }\n\n return `${firstAudienceString} - ${lastAudienceString}`;\n }\n};\n\nfunction processAudienceRanges(audienceValues: number[]): string[] {\n /**\n * Lookahead by increments of offset\n */\n const offset = COUNT_OFFSET;\n\n let initialVal; let nextVal;\n let isContinguous: boolean = false;\n\n const ranges: string[] = [];\n\n // Audience values need to be in ascending order\n audienceValues = audienceValues.sort((a, b) => a - b);\n\n let i; let j;\n\n for (i = 0; i < audienceValues.length; i++) {\n j = i + 1;\n\n // Set our lower boundary to compare against\n if (!isContinguous)\n initialVal = audienceValues[i];\n\n nextVal = audienceValues[j];\n\n /**\n * Where the next number is also the next incremental value\n * we're going to continue iterating until the next value\n * is no longer contiguos.\n */\n if (audienceValues[i] + offset === nextVal) {\n isContinguous = true;\n } else if (isContinguous) {\n /**\n * Where we were tracking a contiguous set, format appropriately \n * and store the vals\n */\n\n ranges.push(`${initialVal} - ${audienceValues[i]}`);\n isContinguous = false;\n } else {\n /**\n * Where the values arent contiguous, just store the current value\n */\n\n ranges.push(`${audienceValues[i]}`);\n isContinguous = false;\n }\n }\n\n return ranges;\n}","import { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { HardCoded } from 'libs/shared/constants/HardCoded';\nimport { Audience, BaseObject, PresentationAudience } from 'libs/shared/interfaces';\n\nimport { AudienceStringBuilders } from './AudienceStringBuilders';\n\nconst DIGIT_REGEX = /([0-9]+)/ig;\nconst SPACE_REGEX = /\\s|\\+/ig;\n\n/**\n * Where there is 1 or less audiences on a presentation, it provides little value to\n * the user's experience, so we'll hide audiences altogether.\n */\nconst MIN_AUDIENCE_THRESHOLD = 1;\n\nexport const AudienceHelper = {\n /**\n * This is needed to sort an object's audiences, as they are not sorted by the backend.\n * To do this, we take the presentation audiences (sorted) and filter them by the object's\n * audiences, leaving behind a sorted array of object audiences.\n */\n getSortedPresentationAudiences(\n objectAudiences: Audience[],\n presentationAudiences: PresentationAudience[]\n ): PresentationAudience[] {\n /**\n * Atm there is a bug in flight's optimize, around multiple parts of the page \n * fetching the same object with a different response. We are filtering out\n * falsey values in our object audience ids until that's fixed. - Sha\n */\n const objectAudienceIds = objectAudiences\n .filter(v => !!v)\n .map(audience => audience.id.toString());\n\n /**\n * Remove audiences that aren't relevant for the user's current presentation\n */\n const filteredAudiences = presentationAudiences.filter(presAudience => {\n return objectAudienceIds.includes(presAudience.masterId.toString());\n });\n\n return filteredAudiences;\n },\n\n /**\n * This function accepts a set of presentation audiences, and returns a single\n * audience where the name is a merged string of the names of all of the audiences passed in.\n *\n * As we add more presentations that have different audience sets, we'll need to extend the `switch`\n * statement below to either include new string builder functions, or to include new presentation IDs\n * for existing string builder functions.\n */\n getMergedPresentationAudienceString(presentationAudiences: PresentationAudience[]): PresentationAudience {\n const { presentationId } = ArrayHelper.first(presentationAudiences);\n\n let mergedAudienceString = '';\n\n switch (+presentationId) {\n // Generic `Name Number`. Sometimes has just name. Examples: Year 12, Grade 4, Kindergarten\n case HardCoded.PresentationIds.DEFAULT:\n case HardCoded.PresentationIds.AU_SECONDARY:\n case HardCoded.PresentationIds.US_ELEMENTARY:\n case HardCoded.PresentationIds.AU_PRIMARY:\n case HardCoded.PresentationIds.STREAMABLE_LEARNING:\n if (presentationAudiences.length === 1)\n return presentationAudiences[0];\n\n mergedAudienceString = AudienceStringBuilders.yearsAndGradesBuilder(presentationAudiences);\n break;\n\n // Early Level, First Level, Second Level, etc.\n case HardCoded.PresentationIds.SCOTLAND_PRIMARY:\n case HardCoded.PresentationIds.INTERNATIONAL_PRIMARY:\n case HardCoded.PresentationIds.INTERNATIONAL_SECONDARY:\n if (presentationAudiences.length === 1)\n return presentationAudiences[0];\n\n mergedAudienceString = AudienceStringBuilders.wordyLevelsBuilder(presentationAudiences);\n break;\n\n case HardCoded.PresentationIds.ENGLISH_SECONDARY:\n mergedAudienceString = AudienceStringBuilders.englishSecondaryBuilder(presentationAudiences);\n break;\n\n \n case HardCoded.PresentationIds.SCOTLAND_SECONDARY:\n mergedAudienceString = AudienceStringBuilders.scottishSecondaryBuilder(presentationAudiences);\n break;\n\n // Key Stage 1, Lower Key Stage 2, etc.\n case HardCoded.PresentationIds.ENGLAND_PRIMARY:\n mergedAudienceString = AudienceStringBuilders.keyStagesBuilder(presentationAudiences);\n break;\n\n // These presentations only have 1 audience mapped. These are never shown as badges in the product.\n case HardCoded.PresentationIds.US_MIDDLE:\n case HardCoded.PresentationIds.US_HIGH:\n default:\n break;\n }\n\n if (!mergedAudienceString)\n return null;\n\n return { name: mergedAudienceString } as PresentationAudience;\n },\n\n /**\n * This function assumes the members array passed in is ordered by `name`.\n */\n sortMembersWithDuplicateNamesByAudience(members: BaseObject[]): BaseObject[] {\n // Returns the lowest level audience out of an array of audience objects by looking at the name\n const getLowestAudience = (audiences: Audience[]) => {\n if (!audiences.length)\n return null;\n\n let lowestAudience: Audience;\n let lowestAudienceDigit: number;\n\n audiences.forEach(audience => {\n const digit = +ArrayHelper.first(audience.name.match(DIGIT_REGEX));\n\n if (!lowestAudience) {\n lowestAudience = audience;\n lowestAudienceDigit = digit;\n return;\n }\n\n if (digit < lowestAudienceDigit)\n lowestAudience = audience;\n });\n\n return lowestAudience;\n };\n\n // This is used to track how many times a member's name appears in the collection\n const nameCountMap: HashObject<number> = {};\n\n let sorted: BaseObject[] = [];\n\n members.forEach(member => {\n if (!nameCountMap[member.name]) {\n nameCountMap[member.name] = 1;\n sorted.push(member);\n return;\n }\n\n sorted.push(member);\n nameCountMap[member.name]++;\n\n // Take the slice of duplicates that we want to sort by audience\n const slice = sorted.splice(sorted.length - nameCountMap[member.name]);\n\n // Sort the slice by lowest audience\n const sortedSlice = slice.sort((a: any, b: any) => {\n const firstObjLowestAudience = getLowestAudience(a.subjectPresentationAudiences.data);\n const secondObjLowestAudience = getLowestAudience(b.subjectPresentationAudiences.data);\n\n if (!firstObjLowestAudience && secondObjLowestAudience)\n return 1;\n\n if (!secondObjLowestAudience)\n return -1;\n\n const comparison = firstObjLowestAudience.name.localeCompare(secondObjLowestAudience.name);\n\n if (comparison === 0) return comparison;\n\n return comparison > 0 ? -1 : 1;\n });\n\n sorted = sorted.concat(sortedSlice);\n });\n\n return sorted;\n },\n\n getActiveAudiencesFromParams(audiences: PresentationAudience[], params: HashObject = {}): PresentationAudience[] {\n if (!ObjectHelper.isObject(params) || ObjectHelper.isEmpty(params))\n return;\n\n if (!audiences || !audiences.length)\n return;\n\n if (!AudienceHelper.shouldShowAudiences(audiences))\n return;\n\n // 'a' is shorthand for audience\n let { a } = params;\n\n if (!a)\n return;\n\n // Only a single query param was passed, we'll wrap it in an array\n if (typeof a === 'string')\n a = [a];\n\n const normalizeAudienceName = (audienceName: string) => {\n return audienceName.replace(SPACE_REGEX, '').toLowerCase();\n };\n\n // Build an audience lookup\n const audienceLookup = a.reduce((state: HashObject, audienceStr: string) => {\n state[normalizeAudienceName(audienceStr)] = audienceStr;\n return state;\n }, {});\n\n // Filter out our active audience based on whether their name matches the lookup object\n return audiences.filter((audience: PresentationAudience) => {\n return audienceLookup[normalizeAudienceName(audience.name)];\n });\n },\n\n getAudienceParams(audiences: PresentationAudience[]): HashObject {\n if (!audiences?.length)\n return null;\n\n return { a: audiences.map(a => a.name) };\n },\n\n shouldShowAudiences(audiences: PresentationAudience[] = []): boolean {\n if (!audiences)\n return false;\n\n return audiences.length > MIN_AUDIENCE_THRESHOLD;\n }\n};\n","import { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { Classification, Playlist } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nexport const getClassificationAppLink = (params?: HashObject) =>\n (classification?: Classification): Core.AppLink => ({\n application: AppChannels.SUBJECT,\n action: Actions.Subjects.CLASSIFICATION,\n args: classification ? [ classification.id, TextHelper.slugify(classification.name) ] : [],\n params: params || {}\n });\n\nexport const getPlaylistAppLink = (playlist: Playlist, classificationId: string): Core.AppLink => ({\n application: AppChannels.PLAYLISTS,\n action: Actions.Playlists.PLAYLIST,\n args: [ playlist.id, TextHelper.slugify(playlist.name) ],\n params: { classificationId }\n});\n\nexport const getAllTopicsAppLink = (presentationId?: string): Core.AppLink => ({\n application: AppChannels.SUBJECT,\n action: Actions.Subjects.CLASSIFICATION_ALL,\n params: presentationId ? { presentationId } : {}\n});","// extracted by mini-css-extract-plugin\nexport default {\"classificationPane\":\"kx1WX\"};","import * as React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { StorageType } from 'libs/common/backbone/utils/LocalStorageHelper';\nimport { Flight } from 'libs/common/flight';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { BannerHeader, PartialBannerHeader } from 'libs/shared/components/banner-header/BannerHeader';\nimport { Breadcrumb, Breadcrumbs, PartialBreadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { CoverFixedPillListLargeWidgetTemplate } from 'libs/shared/components/widgets/curated-widgets/templates/cover-fixed-pill-list-large/CoverFixedPillListLargeWidgetTemplate';\nimport { PartialDynamicWidget } from 'libs/shared/components/widgets/dynamic-widget';\nimport { PartialSubjectWidgetItem } from 'libs/shared/components/widgets/items/subject-widget-item';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { ClassificationStatus } from 'libs/shared/enums/ClassificationStatus';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { FollowRequests } from 'libs/shared/flight-requests/FollowRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Classification, Config, CurrentUser, Presentation, PresentationAudience } from 'libs/shared/interfaces';\nimport { AudienceHelper } from 'libs/shared/utils/audience-helper/AudienceHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { usePluginHelper } from 'shared/hooks/use-plugin-helper/usePluginHelper';\nimport { useDeepLinks } from 'shared/hooks/useDeepLinks';\nimport { usePresentation } from 'shared/hooks/usePresentation';\nimport { SeoHelper } from 'shared/utils/SeoHelper';\n\nimport { getClassificationAppLink } from 'apps/subjects/utils/ClassificationAppLinks';\n\nimport styles from './classifications.scss';\n\nconst getPhrase = LanguageService.encloseNamespace('subjects.classifications');\n\nexport function getBannerActions(\n classification: Classification,\n onFollow: () => void,\n showFollowButtonSpinner: boolean,\n isSmallScreen: boolean\n): ActionOptions[] {\n if (!classification?.id)\n return [];\n\n const isFollowing = !!classification.followers?.data?.length;\n\n return [{\n label: getPhrase(isFollowing ? 'unfollow' : 'follow'),\n onClick: onFollow,\n svgName: isFollowing ? cvSvgLibrary.Check : cvSvgLibrary.Bell,\n className: `btn follow-btn ${isFollowing ? 'btn-outline-dark' : 'btn-dark'} me-2`,\n button: true,\n tooltip: (isFollowing || isSmallScreen) ? undefined : getPhrase('followBtnTooltip'),\n showSpinner: showFollowButtonSpinner\n }];\n}\n\ninterface ClassificationsViewProps {\n id?: string;\n queryParams?: HashObject;\n presentationId?: string;\n}\n\nfunction useGetClassification(\n presentation: Presentation,\n presentationCount: number,\n id?: string,\n userId?: string\n): Classification {\n /**\n * With an id, we're fetching the classification to show the child topics in the\n * classification list.\n */\n const classification = Flight.useBasicFetch<Classification>(\n id &&\n ClassificationRequests.classification(id, userId)\n );\n\n /**\n * Without an id, we should be displaying the All Subjects page. So we'll construct\n * a synthetic classification.\n */\n if (!id)\n return {\n name: TopicsHelper.getExploreAllTopicsTitle(presentation?.name, presentationCount),\n banner: {\n url: TopicsHelper.getPresentationLevelImage(presentation?.learningLevel, 'topic-banner')\n }\n } as Classification;\n\n return classification?.data;\n}\n\nfunction useGetPaths(id?: string): Classification[] {\n const path = Flight.useBasicFetch<Classification[]>(id && ClassificationRequests.path(id));\n\n if (!id)\n return [];\n\n return path?.data;\n}\n\nexport function ClassificationsView({ id, presentationId }: ClassificationsViewProps): React.ReactElement {\n const [ showFollowButtonSpinner, setShowFollowButtonSpinner ] = React.useState<boolean>();\n const { isPlugin } = usePluginHelper();\n const dispatch = useDispatch();\n\n /**\n * Data fetching\n */\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const {\n availablePresentations,\n activePresentation,\n hasPresentationsLoaded,\n canAccessPresentation\n } = usePresentation();\n\n const { hasPermissions, hasLocalPermissions } = usePermissions();\n\n /**\n * We'll prefer the presentationId query param, but fallback to the\n * user's activePresentation where the queryParam doesn't exist.\n */\n const initialPresentationId = presentationId || activePresentation?.id;\n\n const currentPresentation = Flight.useBasicFetch<Presentation>(\n initialPresentationId &&\n ClassificationRequests.presentationById(initialPresentationId)\n );\n\n const hasLoaded = currentPresentation.hasCompleted && hasPresentationsLoaded;\n\n const classification = useGetClassification(\n currentPresentation?.data,\n availablePresentations?.length,\n id,\n currentUser.data?.id\n );\n\n /**\n * With an id, we'll fetch the classification's children.\n * With a presentationId, we'll fetch the presentation's top level topics.\n * For public access, we will always have a presentationId available.\n */\n const request = id\n ? ClassificationRequests.children(id)\n : ClassificationRequests.topLevelTopics(initialPresentationId || currentPresentation.data?.id);\n\n const children = Flight.useBasicFetch<Classification[]>(hasLoaded && request);\n\n const paths = useGetPaths(id);\n\n const [activeAudiences] = useViewModel<PresentationAudience[]>(\n SharedViewModelKeys.AUDIENCE_FILTER,\n undefined,\n { storage: StorageType.SessionStorage }\n );\n\n const title = id\n ? getPhrase('pageTitleTopic', { title: classification?.name })\n : getPhrase('pageTitleSubject', { title: currentPresentation.data?.name });\n\n useSetPageMetadata({\n title,\n description: getPhrase('pageDescription', { title: id ? classification?.name : currentPresentation.data?.name }),\n canonicalLink: SeoHelper.getCanonicalLink(),\n allowIndexing: SeoHelper.allowIndexing()\n });\n useDeepLinks({ id, app: 'topics' });\n\n const classificationAppLinkFn = getClassificationAppLink(AudienceHelper.getAudienceParams(activeAudiences));\n\n /**\n * Following\n */\n function onToggleFollow(): void {\n setShowFollowButtonSpinner(true);\n\n const request = classification?.followers?.data?.length\n ? FollowRequests.unfollow\n : FollowRequests.follow;\n\n Flight.fetch(dispatch, request([classification?.id]));\n }\n\n React.useEffect(() => {\n setShowFollowButtonSpinner(false);\n }, [classification?.followers?.data?.length]);\n\n const isSmallScreen = useMediaQuery(MediaQueryStrings.MDDown);\n\n function getBreadcrumbs(): Breadcrumb[] {\n const breadcrumbs: Breadcrumb[] = [{\n name: getPhrase('discover'),\n appLink: {\n application: AppChannels.DASHBOARD,\n action: Actions.Dashboard.HOME\n }\n }, {\n name: TopicsHelper.getExploreAllTopicsTitle(currentPresentation.data?.name, availablePresentations?.length),\n appLink: { application: AppChannels.SUBJECT, action: Actions.Subjects.CLASSIFICATION_ALL },\n active: !id\n }];\n\n paths.forEach(item => {\n breadcrumbs.push({\n name: item.name,\n appLink: classificationAppLinkFn(item)\n });\n });\n\n if (id)\n breadcrumbs.push({\n name: getPhrase('subview'),\n active: true\n });\n\n return breadcrumbs;\n }\n\n /**\n * Render Variable\n */\n const dataLoaded = (id ? !!classification : true) && !!config.data && !!availablePresentations && children.data;\n const breadcrumbsDataLoaded = !!availablePresentations && !!paths;\n const canViewBreadcrumbs = canAccessPresentation(currentPresentation.data?.id);\n\n /**\n * Additional subjects data to be mixed in with lower-level component analytics collection\n */\n const analyticsData = {\n presentationId: currentPresentation.data?.id,\n presentationName: currentPresentation.data?.name,\n currentClassificationName: classification?.name,\n widgetId: WidgetTypeId.Classifications,\n templateId: WidgetTemplate.CoverFixedPillListLarge\n };\n \n const isComingSoon = classification?.status === ClassificationStatus.ComingSoon;\n\n return (\n <main className='bg-white px-3'>\n {dataLoaded\n ? (\n <BannerHeader\n heading={classification?.name}\n banner={classification?.banner}\n imageCdnUrl={config.data.imageCdnUrl}\n actions={!isComingSoon\n ? getBannerActions(\n classification,\n onToggleFollow,\n showFollowButtonSpinner,\n isSmallScreen\n )\n : []\n }\n imageOptions={!id && { size: ImageSize.Large }}\n />\n ) : <PartialBannerHeader />\n }\n <div className={`py-3 mb-3 ${canViewBreadcrumbs ? 'border-bottom' : ''}`}>\n {(() => {\n if (!canViewBreadcrumbs)\n return <></>;\n\n if (!breadcrumbsDataLoaded)\n return <PartialBreadcrumbs />;\n\n return <Breadcrumbs breadcrumbs={getBreadcrumbs()} />;\n })()}\n </div>\n <div className={styles.classificationPane}>\n {dataLoaded\n ? (\n <CoverFixedPillListLargeWidgetTemplate\n id={id}\n name=''\n description=''\n metadata={{}}\n preferences={[]}\n hasPermissions={hasPermissions}\n hasLocalPermissions={hasLocalPermissions}\n widgetTypeId={WidgetTypeId.Classifications}\n templateId={WidgetTemplate.CoverFixedPillListLarge}\n analyticsData={analyticsData}\n content={children?.data}\n analyticsOptions={{ location: LocationContext.SlidingListItem }}\n appLinks={{ classification: classificationAppLinkFn }}\n imageCdnUrl={config.data.imageCdnUrl}\n resourceThumbnailFallbackImageUrl={ImageUrls.Fallbacks.RESOURCE_THUMBNAIL}\n isPlugin={isPlugin}\n />\n ) : <PartialDynamicWidget partialLoadingComponent={PartialSubjectWidgetItem} />}\n </div>\n </main>\n );\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"appLink\":\"fFjKN\",\"name\":\"A_by9\",\"selectedMask\":\"xSQtR\",\"widgetItem\":\"Ys9W_\",\"text\":\"JfAoy\",\"imagePanel\":\"aUNDc\",\"partialLargeImage\":\"RuLxv\",\"selected\":\"BViJb\",\"image\":\"LkTep\",\"dragHandle\":\"CJqvP\",\"large\":\"R5clw\",\"comingSoonPanel\":\"Wa2PG\",\"editSubjectsItem\":\"gGNFD\",\"allSubjectsItem\":\"IHdlJ\",\"logoContainer\":\"Nzaes\",\"draggingItem\":\"zUOye\",\"partialLargeFallback\":\"FmJP9\",\"partialIcon\":\"sdZuo\"};","\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { useBootstrapPrefix, useBootstrapBreakpoints, useBootstrapMinBreakpoint } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst Row = /*#__PURE__*/React.forwardRef(({\n bsPrefix,\n className,\n // Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as: Component = 'div',\n ...props\n}, ref) => {\n const decoratedBsPrefix = useBootstrapPrefix(bsPrefix, 'row');\n const breakpoints = useBootstrapBreakpoints();\n const minBreakpoint = useBootstrapMinBreakpoint();\n const sizePrefix = `${decoratedBsPrefix}-cols`;\n const classes = [];\n breakpoints.forEach(brkPoint => {\n const propValue = props[brkPoint];\n delete props[brkPoint];\n let cols;\n if (propValue != null && typeof propValue === 'object') {\n ({\n cols\n } = propValue);\n } else {\n cols = propValue;\n }\n const infix = brkPoint !== minBreakpoint ? `-${brkPoint}` : '';\n if (cols != null) classes.push(`${sizePrefix}${infix}-${cols}`);\n });\n return /*#__PURE__*/_jsx(Component, {\n ref: ref,\n ...props,\n className: classNames(className, decoratedBsPrefix, ...classes)\n });\n});\nRow.displayName = 'Row';\nexport default Row;"],"names":["PortalHelper","renderInPortalIfExists","component","portalContainer","createPortal","namespace","ComingSoonTag","props","Tooltip","title","LanguageService","spanHackClassName","spanHack","className","SvgContainer","svgName","onlyIcon","GenericCalendarDate","AppLink","appLink","getAppLink","theme","border","analyticsData","analyticsOptions","background","label","body","type","getBodyClass","text","month","Actions","orderedActions","actions","sort","a","b","order","buttonActions","moreActions","forEach","button","push","length","map","idx","key","href","onClick","tooltip","showSpinner","openInNewTab","disabled","iconButton","sortComponent","dropdownToggleClassName","actionsDropdownClassName","dropdownToggleSvgSize","fetchMore","LazyDropdownItems","style","padding","height","width","getDropdownItemClassName","actionClassName","ActionsDropdownItem","FunctionHelper","action","e","preventDefault","AnalyticsHelper","role","tabIndex","onKeyDown","ActionsDropdown","isLazy","some","lazyPlaceholder","currentGroup","dropdownToggleId","RandomHelper","id","size","showDivider","undefined","group","defaultProps","S","BackButton","textShadow","backToName","color","extraClasses","backPhrase","colorClass","textShadowClass","RATIO","getSizeClass","heading","BannerHeader","banner","imageCdnUrl","blockColourClass","specialEvent","portalContainerContext","BannerPortalContext","imageWidth","useBreakpoints","xxl","specialEventIsToday","showComingSoon","today","DateHelper","Date","endDate","startDate","imageOptions","ratio","resizeType","url","ImageHelper","fallbackBaseUrl","fallbackCategoryName","containerProps","bannerClassName","backgroundImage","DetailsComponent","detailsComponent","backButtonAppLink","backButtonText","backButtonClasses","alignLogoLeft","logo","calendarTheme","Text","phrase","LazyImage","src","container","prevProps","nextProps","PartialBannerHeader","BreadcrumbItem","breadcrumb","name","active","withBackIcon","Breadcrumbs","breadcrumbs","isMobile","PartialBreadcrumbs","numItems","dangerouslySetInnerHTML","__html","getPhrase","SeeMore","descriptor","WidgetHeader","hasDescription","description","showSeeMoreLink","CoverFixedPillListLargeWidgetTemplate","content","c","xs","sm","lg","hasTableOfContents","xl","data","getChildAppLink","appLinks","classification","isLarge","ComingSoonNamePanel","multiline","wrapperClassName","textClassName","NormalNamePanel","subtitle","CoverPillWidgetContent","coverUrl","childProps","isSelected","hideCheckmark","svgSize","textVariant","variant","imageClassName","hideFallback","isComingSoon","CoverPillWidgetContentWrapper","appLinkOptions","getChildAppLinkOptions","PartialSubjectWidgetItem","PartialLargeSubjectWidgetItem","Memoized","status","presentationName","presentationId","availablePresentations","find","p","usePresentationName","comingSoon","location","actionType","entity","cover","getSubtitle","blankImage","Image","DragHelper","event","dataTransfer","setDragImage","isTouchScreen","UserAgentHelper","SlidingListContainer","ref","listenerProps","xPosition","measurement","dragPercentage","children","positionType","onDrag","onDragEnd","onTouchMove","onTouchEnd","percentageDragged","position","CssMeasurement","C","transform","transition","draggable","onDragStart","onDragOver","onTouchMoveCapture","onTouchEndCapture","WidgetButtonDirection","WidgetButton","isLeft","direction","Left","arrowSvg","hide","state","contents","paddingBottom","viewableItems","useGradientBackdrop","leftGradientClassName","rightGradientClassName","hideExtendedClickableArea","leftButtonClassName","rightButtonClassName","hoverText","ClassificationStatus","WidgetInteraction","endpoints","ids","FollowRequests","follow","success","error","join","invalidationKeys","unfollow","useGetMediaQueryString","isXS","isSM","isMD","isLG","isXL","isXXL","currentString","HAS_NUMBER_REGEX","AudienceStringBuilders","audiences","firstAudience","ArrayHelper","lastAudience","split","toLowerCase","DIGIT_REGEX","SPACE_REGEX","AudienceHelper","getSortedPresentationAudiences","objectAudiences","presentationAudiences","objectAudienceIds","filter","v","audience","toString","presAudience","includes","masterId","getMergedPresentationAudienceString","mergedAudienceString","HardCoded","combinedNames","numberList","isNaN","num","wordList","audienceWithoutNum","test","prefix","charAt","pop","audienceRange","audienceValues","initialVal","nextVal","i","j","isContinguous","ranges","processAudienceRanges","audienceNames","commonWordsAndTheirPositions","index","wordsInName","Object","keys","word","commonWord","commonWordPosition","firstAudienceName","lastAudienceName","stripOutCommonWord","mergedWord","firstAudienceFirstWord","lastAudienceFirstWord","firstAudienceNumber","lastAudienceNumber","firstAudienceString","lastAudienceString","sortMembersWithDuplicateNamesByAudience","members","getLowestAudience","digit","match","lowestAudience","lowestAudienceDigit","nameCountMap","sorted","member","sortedSlice","splice","firstObjLowestAudience","subjectPresentationAudiences","secondObjLowestAudience","comparison","localeCompare","concat","getActiveAudiencesFromParams","params","ObjectHelper","shouldShowAudiences","normalizeAudienceName","audienceName","replace","audienceLookup","reduce","audienceStr","getAudienceParams","getClassificationAppLink","application","args","getAllTopicsAppLink","getBannerActions","onFollow","showFollowButtonSpinner","isSmallScreen","isFollowing","followers","ClassificationsView","setShowFollowButtonSpinner","isPlugin","usePluginHelper","dispatch","currentUser","UserRequests","config","ConfigRequests","usePresentation","activePresentation","hasPresentationsLoaded","canAccessPresentation","usePermissions","hasPermissions","hasLocalPermissions","initialPresentationId","currentPresentation","ClassificationRequests","hasLoaded","hasCompleted","presentation","presentationCount","userId","TopicsHelper","learningLevel","useGetClassification","request","paths","path","useGetPaths","activeAudiences","SharedViewModelKeys","storage","useSetPageMetadata","canonicalLink","SeoHelper","allowIndexing","useDeepLinks","app","classificationAppLinkFn","dataLoaded","breadcrumbsDataLoaded","canViewBreadcrumbs","currentClassificationName","widgetId","WidgetTypeId","templateId","WidgetTemplate","item","getBreadcrumbs","metadata","preferences","widgetTypeId","resourceThumbnailFallbackImageUrl","ImageUrls","partialLoadingComponent","Row","bsPrefix","as","Component","decoratedBsPrefix","breakpoints","minBreakpoint","sizePrefix","classes","brkPoint","propValue","cols","infix","displayName"],"sourceRoot":""}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[3070],{80835:(e,n,t)=>{t.d(n,{U:()=>l});var r=t(32735),a=t(89118),i=t(68626),o=t(79967),s=t(80143),u=t(40424),c=t(31908);var l=r.memo((function(e){var n,t=e.data,l=e.getSubTextAppLink,d=e.context,m=e.thumbnailSize,p=e.preloadImage,f=e.presentationAudiences,v=null===(n=null==t?void 0:t.subjectPresentationAudiences)||void 0===n?void 0:n.data,h=(0,s.n)(v,f),g=(0,o.k)(),y="JSM4l";return d.type===u.l9.LargeRow&&(y="YYpNz"),r.createElement("div",{className:"px-1 flex-shrink-0 position-relative ".concat(y)},r.createElement(a.u,{type:e.preventPopout||g.xs?"static":"popout",textPosition:i.z.Below,video:t,appLink:e.getAppLink(t),subTextAppLink:c.M.isVideo(t)&&(null==l?void 0:l(t)),imageOptions:{size:m},preload:p,analyticsData:e.analyticsData,analyticsOptions:e.analyticsOptions,canFavourite:e.canFavourite,setFavourite:e.setFavourite,imageCdnUrl:e.imageCdnUrl,audience:h,hideRating:!!h,hideDuration:!1,yearGroups:e.yearGroups,hideTitle:e.hideTitle,showVideoGuidance:e.showVideoGuidance,companyLogoFallbackUrl:e.companyLogoFallbackUrl,subTextType:e.subTextType,isPlugin:e.isPlugin,getInteractiveGuidanceAppLink:e.getInteractiveGuidanceAppLink,getResourceGuidanceAppLink:e.getResourceGuidanceAppLink,getClassroomGuideAppLink:e.getClassroomGuideAppLink}))}))},39902:(e,n,t)=>{t.d(n,{f:()=>u});var r=t(32735),a=t(70680),i=t(20354);function o(e,n){if(e){if("string"==typeof e)return s(e,n);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?s(e,n):void 0}}function s(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,r=Array(n);t<n;t++)r[t]=e[t];return r}function u(e,n){var t,u,c=(t=r.useState([]),u=2,function(e){if(Array.isArray(e))return e}(t)||function(e,n){var t=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=t){var r,a,i,o,s=[],u=!0,c=!1;try{if(i=(t=t.call(e)).next,0===n){if(Object(t)!==t)return;u=!1}else for(;!(u=(r=i.call(t)).done)&&(s.push(r.value),s.length!==n);u=!0);}catch(e){c=!0,a=e}finally{try{if(!u&&null!=t.return&&(o=t.return(),Object(o)!==o))return}finally{if(c)throw a}}return s}}(t,u)||o(t,u)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),l=c[0],d=c[1];r.useEffect((function(){if(null==e?void 0:e.length){var n=function(e){return function(e){if(Array.isArray(e))return s(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||o(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(l);n.push([]),e.forEach((function(e){n.find((function(n){return n.find((function(n){return n===e}))}))||n[n.length-1].push(e)})),d(n.filter((function(e){return e.length})))}}),[e?e.join(","):null]);var m=(0,a.I0)(),p=(0,a.v9)((function(e){return e}));if(r.useEffect((function(){l.forEach((function(e){var t=n(e);i.a.getResponse(p,t.key).shouldFetch&&i.a.fetch(m,t)}))}),[null==l?void 0:l.length]),!(null==l?void 0:l.length))return{items:null,isFetching:!1};var f={},v={};return l.forEach((function(e,t){var r=n(e),a=i.a.getResponse(p,r.key);v[t]=a,a.data&&a.data.forEach((function(e){return f[e.id]=e}))})),{items:Object.keys(v).some((function(e){return!!v[e].data}))?f:null,isFetching:!!Object.keys(v).some((function(e){return v[e].isFetching}))}}},80143:(e,n,t)=>{t.d(n,{n:()=>i});var r=t(32735),a=t(69454);function i(e,n){var t=r.useMemo((function(){return(null==e?void 0:e.length)&&n&&a.T.shouldShowAudiences(n)?a.T.getSortedPresentationAudiences(e,n):null}),[e]);return r.useMemo((function(){return(null==t?void 0:t.length)?a.T.getMergedPresentationAudienceString(t):null}),[t])}},69454:(e,n,t)=>{t.d(n,{T:()=>d});var r=t(75896),a=t(1048),i=t(55171);function o(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,r=Array(n);t<n;t++)r[t]=e[t];return r}var s=/\d/,u=function(e){var n,t,a=r.m.first(e),i=r.m.last(e);return a.name===i.name?a.name:"Advanced"===i.name?"lower"===(n=a.name.split(" "),t=1,function(e){if(Array.isArray(e))return e}(n)||function(e,n){var t=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=t){var r,a,i,o,s=[],u=!0,c=!1;try{if(i=(t=t.call(e)).next,0===n){if(Object(t)!==t)return;u=!1}else for(;!(u=(r=i.call(t)).done)&&(s.push(r.value),s.length!==n);u=!0);}catch(e){c=!0,a=e}finally{try{if(!u&&null!=t.return&&(o=t.return(),Object(o)!==o))return}finally{if(c)throw a}}return s}}(n,t)||function(e,n){if(e){if("string"==typeof e)return o(e,n);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?o(e,n):void 0}}(n,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0].toLowerCase()?"Lower Sec - Adv":"Upper Sec - Adv":"Lower - Upper Sec"},c=/([0-9]+)/gi,l=/\s|\+/gi,d={getSortedPresentationAudiences:function(e,n){var t=e.filter((function(e){return!!e})).map((function(e){return e.id.toString()}));return n.filter((function(e){return t.includes(e.masterId.toString())}))},getMergedPresentationAudienceString:function(e){var n,t,a,o="";switch(+r.m.first(e).presentationId){case i.e.PresentationIds.DEFAULT:case i.e.PresentationIds.AU_SECONDARY:case i.e.PresentationIds.US_ELEMENTARY:case i.e.PresentationIds.AU_PRIMARY:case i.e.PresentationIds.STREAMABLE_LEARNING:if(1===e.length)return e[0];o=function(e){var n=e.map((function(e){return e.name})).join(" "),t=n.split(" ").filter((function(e){return!isNaN(+e)})).map((function(e){return+e}))||[],r=n.split(" ").filter((function(e){return isNaN(+e)}))||[],a=e.find((function(e){return!s.test(e.name)})),i=r.find((function(e){return e!==(null==a?void 0:a.name)}));if(e.length>1&&(i+="s"),a&&t.length)return"".concat(i," ").concat(a.name.charAt(0)," - ").concat(t.pop());var o=function(e){var n,t,r,a,i=!1,o=[];for(e=e.sort((function(e,n){return e-n})),r=0;r<e.length;r++)a=r+1,i||(n=e[r]),t=e[a],e[r]+1===t?i=!0:i?(o.push("".concat(n," - ").concat(e[r])),i=!1):(o.push("".concat(e[r])),i=!1);return o}(t);return"".concat(i," ").concat(o.join(", "))}(e);break;case i.e.PresentationIds.SCOTLAND_PRIMARY:case i.e.PresentationIds.INTERNATIONAL_PRIMARY:case i.e.PresentationIds.INTERNATIONAL_SECONDARY:if(1===e.length)return e[0];o=function(e){var n=e.map((function(e){return e.name})),t={};n.forEach((function(e,n){if(0!==n){var r=e.split(" ");Object.keys(t).forEach((function(e){r.includes(e)||delete t[e]}))}else e.split(" ").forEach((function(e,n){t[e]=0===n?"start":"end"}))}));var r=Object.keys(t)[0],a=t[r];if(!r)return e[0].name;var i=e[0].name,o=e[e.length-1].name,s=function(e){return e.split(r)[0]},u="".concat(s(i)," - ").concat(s(o));return"start"===a?"".concat(r," ").concat(u):"".concat(u," ").concat(r)}(e);break;case i.e.PresentationIds.ENGLISH_SECONDARY:o=u(e);break;case i.e.PresentationIds.SCOTLAND_SECONDARY:n=e,t=r.m.first(n),a=r.m.last(n),o=t.name===a.name?t.name:"Senior Phase"===a.name?"".concat(t.name," - Senior"):"Third - Fourth Level";break;case i.e.PresentationIds.ENGLAND_PRIMARY:o=function(e){var n=r.m.first(e),t=r.m.last(e),a=r.m.first(n.name.split(" ")),i=r.m.first(t.name.split(" ")),o=n.name.split(" ").find((function(e){return!isNaN(+e)})),s=t.name.split(" ").find((function(e){return!isNaN(+e)}));if(n===t)return"Key"===a||"Reception"===a?n.name:"".concat(a," KS").concat(o);var u="",c="";return u="Reception"===a?"R":"KS".concat(o),c="KS".concat(s),"Lower"===a&&"Upper"===i?"L ".concat(u," - U ").concat(c):("Lower"===a&&(u="Lower ".concat(u)),"Upper"===i&&(c="Upper ".concat(c)),"Key"===i&&(c=t.name),"".concat(u," - ").concat(c))}(e);case i.e.PresentationIds.US_MIDDLE:case i.e.PresentationIds.US_HIGH:}return o?{name:o}:null},sortMembersWithDuplicateNamesByAudience:function(e){var n=function(e){return e.length?(e.forEach((function(e){var a=+r.m.first(e.name.match(c));if(!n)return n=e,void(t=a);a<t&&(n=e)})),n):null;var n,t},t={},a=[];return e.forEach((function(e){if(!t[e.name])return t[e.name]=1,void a.push(e);a.push(e),t[e.name]++;var r=a.splice(a.length-t[e.name]).sort((function(e,t){var r=n(e.subjectPresentationAudiences.data),a=n(t.subjectPresentationAudiences.data);if(!r&&a)return 1;if(!a)return-1;var i=r.name.localeCompare(a.name);return 0===i?i:i>0?-1:1}));a=a.concat(r)})),a},getActiveAudiencesFromParams:function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(a.t.isObject(n)&&!a.t.isEmpty(n)&&e&&e.length&&d.shouldShowAudiences(e)){var t=n.a;if(t){"string"==typeof t&&(t=[t]);var r=function(e){return e.replace(l,"").toLowerCase()},i=t.reduce((function(e,n){return e[r(n)]=n,e}),{});return e.filter((function(e){return i[r(e.name)]}))}}},getAudienceParams:function(e){return(null==e?void 0:e.length)?{a:e.map((function(e){return e.name}))}:null},shouldShowAudiences:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return!!e&&e.length>1}}},58:(e,n,t)=>{t.r(n),t.d(n,{PopupPluginView:()=>ne});var r=t(32735),a=t(48088),i=t(95846),o=t(81886),s=t(23481),u=t(20354),c=t(65858),l=t(4201),d=t(11518),m=t(80835),p=t(16714),f=t(58704),v=t(89454),h=t(39151),g=t(1666),y=t(63419),A=t(98064),b=t(31949),L=t(35286),S=t(22902),k=t(37802),E=t(40424),P=t(31908),N=t(14070),C=t(97291),I=t(51855),w=t(27638),T=t(86698),M=t(23737),O=t(44230),j=t(22490),F=t(28400),G=t(36848),R=t(60376),U=t(83914),x=t(54610),D=t(67453),V=t(35223),_=t(71750),Y=t(98073),W=t(48688);const B={leftNavIcon:"ssG3i"};var H=s.T.encloseNamespace("default.popupPlugin");function z(e){return r.createElement("li",{className:"columns-of-five-md col-6 mb-3"},r.createElement(G.F,{appLink:e.appLink,className:"border rounded-3 d-flex align-items-center\n justify-content-center flex-column text-decoration-none h-100 py-3 px-1 text-center"},r.createElement("div",{className:"".concat(B.leftNavIcon," ").concat(e.iconClassName," mx-auto mb-3")},r.createElement(R.f,{imageUrl:D.j.createUrl(e.imageUrl,{size:x.h2.Small}),svgName:e.svgName,svgSize:U.S.Large})),r.createElement("div",{className:"h6"},e.name)))}function K(e){var n=e.hasPermissions,t=e.moviesAndTvDashboard,a=e.hasNewMoviesAndTv,i=e.libraries,o=e.liteStudentCustomLibraries;return r.createElement("ul",{className:"list-unstyled row"},n(p.C.StudentExperience)&&r.createElement(z,{id:_.P.StudentFeed,appLink:Y.T[_.P.StudentFeed].appLink,name:H("home"),iconClassName:"bg-purple",svgName:V.vn.House}),r.createElement(z,{id:_.P.Discover,appLink:Y.T[_.P.Discover].appLink,name:H("discover"),iconClassName:"bg-blue",svgName:V.vn.Compass}),!!t&&!!a&&r.createElement(z,{id:_.P.MoviesAndTv,appLink:Y.T[_.P.MoviesAndTv].appLink,name:H("moviesAndTv"),iconClassName:"bg-indigo",svgName:V.vn.Popcorn}),r.createElement(z,{id:_.P.Playlists,appLink:Y.T[_.P.Playlists].appLink,name:H("playlists"),iconClassName:"bg-green",svgName:V.vn.Playlist}),r.createElement(z,{id:_.P.MyVideos,appLink:Y.T[_.P.MyVideos].appLink,name:H("myVideos"),iconClassName:"bg-orange",svgName:V.vn.Video}),!(!(null==i?void 0:i.length)||n(p.C.StudentExperience)&&!o)&&W.g.sort(i).map((function(e,n){var t,a,i,o;return r.createElement(z,{key:n,id:_.P.Library,name:e.name,appLink:Object.assign(Object.assign({},Y.T[_.P.Library].appLink),{args:[e.id,F.m.slugify(e.name)]}),iconClassName:"bg-teal",imageUrl:null===(a=null===(t=e.owner)||void 0===t?void 0:t.logo)||void 0===a?void 0:a.url,svgName:!(null===(o=null===(i=e.owner)||void 0===i?void 0:i.logo)||void 0===o?void 0:o.url)&&V.vn.Library})})))}var $=t(1575),Q=t(39902),q=t(97816),J=t(87821);function Z(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,r=Array(n);t<n;t++)r[t]=e[t];return r}var X=t(82431),ee=s.T.encloseNamespace("default.popupPlugin");function ne(){var e,n,t=(0,I.G)().isPlugin,s=(0,l.of)().focusSearchBar,F=(0,T.y)().activePresentation,G=(0,S.T)(),R=G.hasPermissions,U=G.isLoaded,x=(0,w.u)(c.LZ.VideoThumbnail),D=x.setFavourite,V=x.canFavourite,_=(0,k.r)(null),Y=_.hasNewMoviesAndTv,W=_.liteStudentCustomLibraries,B=_.isLoadingSettings,H=u.a.useBasicFetch(h.L.config()),z=u.a.useBasicFetch(b.N.currentUser()),ne=u.a.useBasicFetch((null===(e=z.data)||void 0===e?void 0:e.isAuthenticated)&&g.h.yearGroups(z.data.customerId)),te=u.a.useBasicFetch(F&&v.O.audiencesByPresentationId(F.id)),re=function(){var e,n,t,a=u.a.useBasicFetch(J.p.userVideoHistory()),i=(0,Q.f)(null!==(t=null===(n=null===(e=a.data)||void 0===e?void 0:e.data)||void 0===n?void 0:n.map((function(e){return e.videoId})))&&void 0!==t?t:[],$.R.watchHistoryVideos),o=r.useMemo((function(){var e,n,t,r=new Map;return null===(n=null===(e=a.data)||void 0===e?void 0:e.data)||void 0===n||n.forEach((function(e){var n;if(!r.has(e.videoId)){var t=null===(n=i.items)||void 0===n?void 0:n[e.videoId];t&&r.set(e.videoId,t)}})),function(e){if(Array.isArray(e))return Z(e)}(t=r.values())||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(t)||function(e,n){if(e){if("string"==typeof e)return Z(e,n);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?Z(e,n):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}),[i.items,a.data]);return(0,q.V)(o),{data:o,hasCompleted:!i.isFetching}}(),ae=u.a.useBasicFetch(z.data&&y.P.getFavourites(z.data.id)),ie=u.a.useBasicFetch(R(p.C.ViewLibraries)&&A.D.domainLibraries(["customLibrary","sharedLibrary"])),oe=(0,M.y)({targetType:E.ku.MoviesAndTv,queryParams:{}}).dashboard;return u.a.useBasicFetch(!!(null===(n=ie.data)||void 0===n?void 0:n.length)&&A.D.librariesWithOwnerLogos(ie.data.map((function(e){return e.id})))),(0,L.L)(i.G.SHELL,o.Q.Vy.ROUTE,(function(e){o.Q.C$.getHref(e)&&(O.e.enableNav(),a.Radio.channel(i.G.SHELL).once("routing:end",s))})),oe.hasCompleted&&U&&!B&&(!R(p.C.ViewLibraries)||ie.hasCompleted)&&H.hasCompleted?r.createElement("div",{className:"px-4"},r.createElement(K,{hasPermissions:R,moviesAndTvDashboard:oe.data,hasNewMoviesAndTv:Y,libraries:ie.data,liteStudentCustomLibraries:W}),re.hasCompleted?r.createElement("div",{className:"mb-3"},r.createElement(d.kM,{name:ee("recentlyWatched"),collection:re.data||[],contents:f.z.Videos,childComponent:m.U,extraChildComponentProps:{setFavourite:D,canFavourite:V,presentationAudiences:te.data,getSubTextAppLink:X.j.getSeriesAppLink,imageCdnUrl:H.data.imageCdnUrl,yearGroups:ne.data,showVideoGuidance:P.M.showVideoGuidance(R),isPlugin:t,getClassroomGuideAppLink:j.W.getClassroomGuideAppLink,getResourceGuidanceAppLink:j.W.getResourceGuidanceAppLink,getInteractiveGuidanceAppLink:j.W.getInteractiveGuidanceAppLink},getChildAppLink:j.W.getAppLink,appLink:{application:C.O.WATCH_HISTORY,action:N.e.WatchHistory.HOME},prefetched:!0})):r.createElement("div",{className:"mb-3"},r.createElement(d.j7,null)),ae.hasCompleted?r.createElement(d.kM,{name:ee("favourites"),collection:ae.data.data||[],contents:f.z.Videos,childComponent:m.U,extraChildComponentProps:{setFavourite:D,canFavourite:V,presentationAudiences:te.data,getSubTextAppLink:X.j.getSeriesAppLink,imageCdnUrl:H.data.imageCdnUrl,yearGroups:ne.data,showVideoGuidance:P.M.showVideoGuidance(R),isPlugin:t,getClassroomGuideAppLink:j.W.getClassroomGuideAppLink,getResourceGuidanceAppLink:j.W.getResourceGuidanceAppLink,getInteractiveGuidanceAppLink:j.W.getInteractiveGuidanceAppLink},getChildAppLink:j.W.getAppLink,appLink:{application:C.O.DEFAULT,action:N.e.MyFavourites.MY_FAVOURITES},prefetched:!0}):r.createElement(d.j7,null)):r.createElement(r.Fragment,null)}},87821:(e,n,t)=>{t.d(n,{p:()=>a});var r=t(110),a={userVideoHistory:function(e,n,t,a){var i="video:history",o="{gateway}/v1/users/me/watch-history";return e&&(i+=":".concat(e),o+="?cursor=".concat(e)),{key:i,url:o,formatData:function(e){return{data:e.data.map((function(e){var n=r.O.format(e.lastTimeWatched),t=r.O.format(n,"YYYY-MM-DD");return Object.assign(Object.assign({},e),{lastTimeWatched:n,lastDateWatched:t})})),pagination:e.pagination}},success:n,error:t,always:a}},videoHistory:function(e,n,t,r,a){var i=e.sort().map((function(e){return"videoId=".concat(e)}));return{key:"video:history:videos:".concat(i.join("&")),url:"{gateway}/v1/videos/history?".concat(i.join("&")),normalizeOptions:{namespace:n},formatData:function(e){return(null==e?void 0:e.length)?e.map((function(e){return{id:e.videoId,lastProgressPoint:e.lastProgressPoint}})):e},success:t,error:r,always:a}}}},97816:(e,n,t)=>{t.d(n,{V:()=>d});var r=t(32735),a=t(20354),i=t(21750),o=t(31949),s=t(1575),u=t(31908);function c(e,n){if(e){if("string"==typeof e)return l(e,n);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?l(e,n):void 0}}function l(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,r=Array(n);t<n;t++)r[t]=e[t];return r}function d(e){var n,t,d=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},m=a.a.useBasicFetch(o.N.currentUser()),p=r.useRef(new Set),f=function(e){return e?Array.isArray(e)?e.filter((function(e){return!!e&&(u.M.isVideo(e)||u.M.isClip(e))})):"data"in e?e.data.filter((function(e){return!!e&&(u.M.isVideo(e)||u.M.isClip(e))})):[]:[]}(e),v=f.map((function(e){return e.id})),h=(n=r.useState([]),t=2,function(e){if(Array.isArray(e))return e}(n)||function(e,n){var t=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=t){var r,a,i,o,s=[],u=!0,c=!1;try{if(i=(t=t.call(e)).next,0===n){if(Object(t)!==t)return;u=!1}else for(;!(u=(r=i.call(t)).done)&&(s.push(r.value),s.length!==n);u=!0);}catch(e){c=!0,a=e}finally{try{if(!u&&null!=t.return&&(o=t.return(),Object(o)!==o))return}finally{if(c)throw a}}return s}}(n,t)||c(n,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),g=h[0],y=h[1];r.useEffect((function(){if((null==v?void 0:v.length)&&m.hasCompleted){var e=[];v.forEach((function(n){p.current.has(n)||(e.push(n),p.current.add(n))})),e.length&&y((function(n){var t,r=[].concat(function(e){return function(e){if(Array.isArray(e))return l(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||c(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(n),[s.R.videoMixinAssocs(e,d.flightNamespace)]);return(null===(t=m.data)||void 0===t?void 0:t.isAuthenticated)&&r.push(i.x.hasCurriculumLinks(e,null,d.flightNamespace)),r}))}}),[null==v?void 0:v.length,m.hasCompleted]),a.a.useBasicFetchAll(g)}}}]);
|
|
2
|
-
//# sourceMappingURL=3070-47e46e0d89-lite.chunk.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/3070-47e46e0d89-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/widgets/items/popout-video-widget-item/PopoutVideoWidgetItem.tsx","file:///app/packages/libs/shared/src/components/widgets/items/popout-video-widget-item/popout-video-widget-item.scss","file:///app/packages/libs/shared/src/hooks/UseBatchFetch.ts","file:///app/packages/libs/shared/src/hooks/UseMergeAudiences.ts","file:///app/packages/libs/shared/src/utils/audience-helper/AudienceStringBuilders.ts","file:///app/packages/libs/shared/src/utils/audience-helper/AudienceHelper.ts","file:///app/packages/projects/lite/src/apps/default/views/popup-plugin/components/nav-tiles.scss","file:///app/packages/projects/lite/src/apps/default/views/popup-plugin/components/Navtiles.tsx","file:///app/packages/projects/lite/src/apps/default/views/popup-plugin/PopupPluginView.tsx","file:///app/packages/projects/lite/src/apps/default/views/popup-plugin/hooks/useGetVideoHistoryVideos.ts","file:///app/packages/projects/lite/src/apps/watch-history/flight-requests/VideoHistoryRequests.ts","file:///app/packages/projects/lite/src/shared/hooks/useVideoMixin.ts"],"sourcesContent":["import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { VideoSubTextType } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { FixedWidgetItemProps } from 'libs/shared/components/widgets/items/FixedWidgetItemProps';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { CanFavouriteFunc, FavouriteFunc, PresentationAudience, Video, VideoTypes, WidgetType, YearGroup } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './popout-video-widget-item.scss';\n\nexport interface PopoutVideoWidgetItemProps extends FixedWidgetItemProps<VideoTypes> {\n canFavourite: CanFavouriteFunc;\n setFavourite: FavouriteFunc;\n presentationAudiences: PresentationAudience[];\n imageCdnUrl: string;\n yearGroups: YearGroup[];\n showVideoGuidance: boolean;\n hideTitle?: boolean;\n hideSeries?: boolean;\n companyLogoFallbackUrl?: string;\n subTextType?: VideoSubTextType;\n getSubTextAppLink?: (video: Video) => Core.AppLink;\n getInteractiveGuidanceAppLink: (id: string, type: MasterType) => Core.AppLink;\n getResourceGuidanceAppLink: (id: string, type: MasterType) => Core.AppLink;\n getClassroomGuideAppLink: (id: string, type: MasterType) => Core.AppLink;\n preventPopout?: boolean;\n isPlugin: boolean;\n}\n\nexport const PopoutVideoWidgetItem = React.memo(function(props: PopoutVideoWidgetItemProps): JSX.Element {\n const { data: video, getSubTextAppLink, context, thumbnailSize, preloadImage, presentationAudiences } = props;\n \n const videoAudiences = video?.subjectPresentationAudiences?.data;\n const mergedAudience = useMergeAudiences(videoAudiences, presentationAudiences);\n\n const breakpoints = useBreakpoints();\n\n let width = styles.rowWidth;\n\n if (context.type === WidgetType.LargeRow)\n width = styles.largeRowWidth;\n\n return (\n <div className={`px-1 flex-shrink-0 position-relative ${width}`}>\n <VideoThumbnail\n type={props.preventPopout || breakpoints.xs ? 'static' : 'popout'}\n textPosition={ThumbnailTextPosition.Below}\n video={video}\n appLink={props.getAppLink(video)}\n subTextAppLink={VideoHelper.isVideo(video) && getSubTextAppLink?.(video)}\n imageOptions={{ size: thumbnailSize }}\n preload={preloadImage}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n canFavourite={props.canFavourite}\n setFavourite={props.setFavourite}\n imageCdnUrl={props.imageCdnUrl}\n audience={mergedAudience}\n hideRating={!!mergedAudience}\n hideDuration={false}\n yearGroups={props.yearGroups}\n hideTitle={props.hideTitle}\n showVideoGuidance={props.showVideoGuidance}\n companyLogoFallbackUrl={props.companyLogoFallbackUrl}\n subTextType={props.subTextType}\n isPlugin={props.isPlugin}\n getInteractiveGuidanceAppLink={props.getInteractiveGuidanceAppLink}\n getResourceGuidanceAppLink={props.getResourceGuidanceAppLink}\n getClassroomGuideAppLink={props.getClassroomGuideAppLink}\n />\n </div>\n );\n});","// extracted by mini-css-extract-plugin\nexport default {\"rowWidth\":\"JSM4l\",\"largeRowWidth\":\"YYpNz\"};","import React from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport { Flight } from 'libs/common/flight';\nimport { ApplicationState, HashObject } from 'libs/common/react/interfaces';\n\nimport { BaseObject } from 'libs/shared/interfaces';\n\nexport interface UseBatchFetchResult<T extends BaseObject> {\n items: { [key: string]: T} | null;\n isFetching: boolean;\n}\n\n/**\n * Used to fetch multiple items by id with Flight. Will fetch 25 items at a time firing off multiple\n * requests if there are more than 25 items.\n * This will return items as null until we have all our items. Items will be returned as an object with\n * their ids as they key for easy mapping\n * \n * @param itemIds \n * @param getRequest \n */\nexport function useBatchFetch<T extends BaseObject>(\n itemIds: string[],\n getRequest: (ids: string[]) => Flight.Request\n): UseBatchFetchResult<T> {\n const [ idBatches, setIdBatches ] = React.useState<string[][]>([]);\n\n React.useEffect(() => {\n if (!itemIds?.length)\n return;\n\n const newBatches = [...idBatches];\n newBatches.push([]);\n\n itemIds.forEach(id => {\n if (newBatches.find(batch => batch.find(_id => _id === id)))\n return;\n\n newBatches[newBatches.length - 1].push(id);\n });\n\n setIdBatches(newBatches.filter(batch => batch.length));\n }, [itemIds ? itemIds.join(',') : null]);\n\n const dispatch = useDispatch();\n\n const state = useSelector((state: ApplicationState) => state);\n\n React.useEffect(() => {\n idBatches.forEach(idBatch => {\n const request = getRequest(idBatch);\n const response = Flight.getResponse<T[]>(state, request.key);\n\n if (response.shouldFetch)\n Flight.fetch(dispatch, request);\n });\n }, [idBatches?.length]);\n\n if (!idBatches?.length)\n return { items: null, isFetching: false };\n \n const items: { [key: string]: T} = {};\n\n /* Used locally to only return our items if we've fetched all of them */\n const responses: HashObject<Flight.Response<T[]>> = {};\n \n idBatches.forEach((idBatch, i) => {\n const request = getRequest(idBatch);\n const response = Flight.getResponse<T[]>(state, request.key);\n responses[i] = response;\n\n if (response.data)\n response.data.forEach(v => items[v.id] = v);\n });\n\n return {\n items: Object.keys(responses).some(k => !!responses[k].data) ? items : null,\n isFetching: !!Object.keys(responses).some(k => responses[k].isFetching)\n };\n}","import React from 'react';\n\nimport { Audience, PresentationAudience } from '../interfaces';\nimport { AudienceHelper } from '../utils/audience-helper/AudienceHelper';\n\nexport function useMergeAudiences(\n audiences: Audience[],\n presentationAudiences: PresentationAudience[]\n): PresentationAudience {\n // Memoize the audience functions as they are somewhat expensive and the result shouldn't change\n const sortedAudiences = React.useMemo(() => {\n if (!audiences?.length || !presentationAudiences || !AudienceHelper.shouldShowAudiences(presentationAudiences))\n return null;\n\n return AudienceHelper.getSortedPresentationAudiences(audiences, presentationAudiences);\n }, [audiences]);\n\n const mergedAudience = React.useMemo(() => {\n if (!sortedAudiences?.length)\n return null;\n\n return AudienceHelper.getMergedPresentationAudienceString(sortedAudiences);\n }, [sortedAudiences]);\n\n return mergedAudience;\n}","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nconst HAS_NUMBER_REGEX = /\\d/;\nconst COUNT_OFFSET = 1;\n\nexport const AudienceStringBuilders = {\n /**\n * Handles audience sets like:\n * - Year 7, Year 8, etc\n * - Kindergarten, Grade 1, Grade 2, etc\n */\n yearsAndGradesBuilder(audiences: PresentationAudience[]): string {\n /**\n * Create a string with all of the audiences\n */\n const combinedNames = audiences.map(a => a.name).join(' ');\n\n /**\n * Extract all the numbers and matches from the string\n */\n const numberList = combinedNames.split(' ').filter(name => !isNaN(+name)).map(num => +num) || [];\n const wordList = combinedNames.split(' ').filter(name => isNaN(+name)) || [];\n\n // Find an audience that doesn't have a number, like \"Kindergarten\" or \"Foundation\".\n const audienceWithoutNum = audiences.find(p => {\n return !HAS_NUMBER_REGEX.test(p.name);\n });\n\n // Get audience label prefix\n let prefix = wordList.find(name => name !== audienceWithoutNum?.name);\n\n // Pluralise the prefix is there are multiple audiences\n if (audiences.length > 1)\n prefix += 's';\n\n if (audienceWithoutNum && numberList.length)\n return `${prefix} ${audienceWithoutNum.name.charAt(0)} - ${numberList.pop()}`;\n\n /**\n * Build set of logical audience ranges\n */\n const audienceRange = processAudienceRanges(numberList);\n\n return `${prefix} ${audienceRange.join(', ')}`;\n },\n\n /**\n * Handles audience sets like:\n * - Early Level, First Level, etc\n * - Lower Primary, Middle Primary, etc\n */\n wordyLevelsBuilder(audiences: PresentationAudience[]): string {\n const audienceNames = audiences.map(a => a.name);\n\n const commonWordsAndTheirPositions: { [word: string]: 'start' | 'end' } = {};\n\n /**\n * Go through each audience name, and find the words that are common between _all_ of the audiences.\n * For example, if the audiences are \"Early Level\", \"First Level\", and \"Second Level\", the common\n * word will be \"Level\".\n * We will also save whether the common word appears at the beginning or the end of the audience name.\n */\n audienceNames.forEach((name, index) => {\n if (index === 0) {\n const wordsInName = name.split(' ');\n wordsInName.forEach((word, index) => {\n commonWordsAndTheirPositions[word] = index === 0 ? 'start' : 'end';\n });\n\n return;\n }\n\n const wordsInName = name.split(' ');\n\n Object.keys(commonWordsAndTheirPositions).forEach(word => {\n if (!wordsInName.includes(word))\n delete commonWordsAndTheirPositions[word];\n });\n });\n\n // This function currently only handles audience names with 1 common word.\n const commonWord = Object.keys(commonWordsAndTheirPositions)[0];\n const commonWordPosition = commonWordsAndTheirPositions[commonWord];\n\n if (!commonWord)\n return audiences[0].name;\n\n /**\n * At this point, we will have a common word and the position of that word.\n * We now need to build out the rest of the audience name by merging the unique words.\n * For example, if the audiences are \"Early Level\", \"First Level\", and \"Second Level\", we will get\n * \"Early - Second\"\n */\n\n const firstAudienceName = audiences[0].name;\n const lastAudienceName = audiences[audiences.length - 1].name;\n\n // Function to strip the common word out of the audience name\n const stripOutCommonWord = (name: string) => name.split(commonWord)[0];\n\n const mergedWord = `${stripOutCommonWord(firstAudienceName)} - ${stripOutCommonWord(lastAudienceName)}`;\n\n const finalName = commonWordPosition === 'start'\n ? `${commonWord} ${mergedWord}`\n : `${mergedWord} ${commonWord}`;\n\n return finalName;\n },\n\n /**\n * Handles the english secondary audiences, which can be: Lower Secondary, Upper Secondary, and Advanced\n */\n englishSecondaryBuilder(audiences: PresentationAudience[]): string {\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n if (firstAudience.name === lastAudience.name)\n return firstAudience.name;\n\n if (lastAudience.name === 'Advanced') {\n const [level] = firstAudience.name.split(' ');\n\n if (level.toLowerCase() === 'lower')\n return 'Lower Sec - Adv';\n\n return 'Upper Sec - Adv';\n }\n\n return 'Lower - Upper Sec';\n },\n\n scottishSecondaryBuilder(audiences: PresentationAudience[]): string {\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n if (firstAudience.name === lastAudience.name)\n return firstAudience.name;\n\n if (lastAudience.name === 'Senior Phase')\n return `${firstAudience.name} - Senior`;\n\n return 'Third - Fourth Level';\n },\n\n /**\n * Handles the audience set: Reception, Key Stage 1, Lower Key Stage 2, and Upper Key Stage 2\n */\n keyStagesBuilder(audiences: PresentationAudience[]): string {\n // The first and last audience will build out the range\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n // The first word in the strings will either be \"Upper\", \"Lower\", \"Key\", or \"Reception\"\n const firstAudienceFirstWord = ArrayHelper.first(firstAudience.name.split(' '));\n const lastAudienceFirstWord = ArrayHelper.first(lastAudience.name.split(' '));\n\n // Each audience in this set except for \"Reception\" has a number. Get the numbers for the first and last audiences\n const firstAudienceNumber = firstAudience.name.split(' ').find(word => !isNaN(+word));\n const lastAudienceNumber = lastAudience.name.split(' ').find(word => !isNaN(+word));\n\n // If there's only one audience on the video:\n if (firstAudience === lastAudience) {\n // For these 2 audiences, return the full name as it's short enough already\n if (firstAudienceFirstWord === 'Key' || firstAudienceFirstWord === 'Reception')\n return firstAudience.name;\n\n // For the Upper/Lower key stage audiences, abbreviate the \"key stage\" part to KS1/KS2\n return `${firstAudienceFirstWord} KS${firstAudienceNumber}`;\n }\n\n /**\n * Handle when the object has >1 audience\n */\n\n let firstAudienceString = '';\n let lastAudienceString = '';\n\n // Reception is always shortened to \"R\" when in a range\n if (firstAudienceFirstWord === 'Reception') {\n firstAudienceString = 'R';\n } else {\n // All other audiences will be abbreviated to \"KS1/KS2\"\n firstAudienceString = `KS${firstAudienceNumber}`;\n }\n\n // The last audience will always be a key stage, so abbreviate this too\n lastAudienceString = `KS${lastAudienceNumber}`;\n\n // If the audience range contains both the \"Lower\" and \"Upper\" audiences, abbreviate those and return\n if (firstAudienceFirstWord === 'Lower' && lastAudienceFirstWord === 'Upper') {\n return `L ${firstAudienceString} - U ${lastAudienceString}`;\n }\n\n // Add \"Lower\" and \"Upper\" to the strings if it's needed\n if (firstAudienceFirstWord === 'Lower') {\n firstAudienceString = `Lower ${firstAudienceString}`;\n }\n\n if (lastAudienceFirstWord === 'Upper') {\n lastAudienceString = `Upper ${lastAudienceString}`;\n }\n\n // This handles a case where the range is Reception - Key Stage 1. In which case we don't abbreviate the key stage part to KS1.\n if (lastAudienceFirstWord === 'Key') {\n lastAudienceString = lastAudience.name;\n }\n\n return `${firstAudienceString} - ${lastAudienceString}`;\n }\n};\n\nfunction processAudienceRanges(audienceValues: number[]): string[] {\n /**\n * Lookahead by increments of offset\n */\n const offset = COUNT_OFFSET;\n\n let initialVal; let nextVal;\n let isContinguous: boolean = false;\n\n const ranges: string[] = [];\n\n // Audience values need to be in ascending order\n audienceValues = audienceValues.sort((a, b) => a - b);\n\n let i; let j;\n\n for (i = 0; i < audienceValues.length; i++) {\n j = i + 1;\n\n // Set our lower boundary to compare against\n if (!isContinguous)\n initialVal = audienceValues[i];\n\n nextVal = audienceValues[j];\n\n /**\n * Where the next number is also the next incremental value\n * we're going to continue iterating until the next value\n * is no longer contiguos.\n */\n if (audienceValues[i] + offset === nextVal) {\n isContinguous = true;\n } else if (isContinguous) {\n /**\n * Where we were tracking a contiguous set, format appropriately \n * and store the vals\n */\n\n ranges.push(`${initialVal} - ${audienceValues[i]}`);\n isContinguous = false;\n } else {\n /**\n * Where the values arent contiguous, just store the current value\n */\n\n ranges.push(`${audienceValues[i]}`);\n isContinguous = false;\n }\n }\n\n return ranges;\n}","import { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { HardCoded } from 'libs/shared/constants/HardCoded';\nimport { Audience, BaseObject, PresentationAudience } from 'libs/shared/interfaces';\n\nimport { AudienceStringBuilders } from './AudienceStringBuilders';\n\nconst DIGIT_REGEX = /([0-9]+)/ig;\nconst SPACE_REGEX = /\\s|\\+/ig;\n\n/**\n * Where there is 1 or less audiences on a presentation, it provides little value to\n * the user's experience, so we'll hide audiences altogether.\n */\nconst MIN_AUDIENCE_THRESHOLD = 1;\n\nexport const AudienceHelper = {\n /**\n * This is needed to sort an object's audiences, as they are not sorted by the backend.\n * To do this, we take the presentation audiences (sorted) and filter them by the object's\n * audiences, leaving behind a sorted array of object audiences.\n */\n getSortedPresentationAudiences(\n objectAudiences: Audience[],\n presentationAudiences: PresentationAudience[]\n ): PresentationAudience[] {\n /**\n * Atm there is a bug in flight's optimize, around multiple parts of the page \n * fetching the same object with a different response. We are filtering out\n * falsey values in our object audience ids until that's fixed. - Sha\n */\n const objectAudienceIds = objectAudiences\n .filter(v => !!v)\n .map(audience => audience.id.toString());\n\n /**\n * Remove audiences that aren't relevant for the user's current presentation\n */\n const filteredAudiences = presentationAudiences.filter(presAudience => {\n return objectAudienceIds.includes(presAudience.masterId.toString());\n });\n\n return filteredAudiences;\n },\n\n /**\n * This function accepts a set of presentation audiences, and returns a single\n * audience where the name is a merged string of the names of all of the audiences passed in.\n *\n * As we add more presentations that have different audience sets, we'll need to extend the `switch`\n * statement below to either include new string builder functions, or to include new presentation IDs\n * for existing string builder functions.\n */\n getMergedPresentationAudienceString(presentationAudiences: PresentationAudience[]): PresentationAudience {\n const { presentationId } = ArrayHelper.first(presentationAudiences);\n\n let mergedAudienceString = '';\n\n switch (+presentationId) {\n // Generic `Name Number`. Sometimes has just name. Examples: Year 12, Grade 4, Kindergarten\n case HardCoded.PresentationIds.DEFAULT:\n case HardCoded.PresentationIds.AU_SECONDARY:\n case HardCoded.PresentationIds.US_ELEMENTARY:\n case HardCoded.PresentationIds.AU_PRIMARY:\n case HardCoded.PresentationIds.STREAMABLE_LEARNING:\n if (presentationAudiences.length === 1)\n return presentationAudiences[0];\n\n mergedAudienceString = AudienceStringBuilders.yearsAndGradesBuilder(presentationAudiences);\n break;\n\n // Early Level, First Level, Second Level, etc.\n case HardCoded.PresentationIds.SCOTLAND_PRIMARY:\n case HardCoded.PresentationIds.INTERNATIONAL_PRIMARY:\n case HardCoded.PresentationIds.INTERNATIONAL_SECONDARY:\n if (presentationAudiences.length === 1)\n return presentationAudiences[0];\n\n mergedAudienceString = AudienceStringBuilders.wordyLevelsBuilder(presentationAudiences);\n break;\n\n case HardCoded.PresentationIds.ENGLISH_SECONDARY:\n mergedAudienceString = AudienceStringBuilders.englishSecondaryBuilder(presentationAudiences);\n break;\n\n \n case HardCoded.PresentationIds.SCOTLAND_SECONDARY:\n mergedAudienceString = AudienceStringBuilders.scottishSecondaryBuilder(presentationAudiences);\n break;\n\n // Key Stage 1, Lower Key Stage 2, etc.\n case HardCoded.PresentationIds.ENGLAND_PRIMARY:\n mergedAudienceString = AudienceStringBuilders.keyStagesBuilder(presentationAudiences);\n break;\n\n // These presentations only have 1 audience mapped. These are never shown as badges in the product.\n case HardCoded.PresentationIds.US_MIDDLE:\n case HardCoded.PresentationIds.US_HIGH:\n default:\n break;\n }\n\n if (!mergedAudienceString)\n return null;\n\n return { name: mergedAudienceString } as PresentationAudience;\n },\n\n /**\n * This function assumes the members array passed in is ordered by `name`.\n */\n sortMembersWithDuplicateNamesByAudience(members: BaseObject[]): BaseObject[] {\n // Returns the lowest level audience out of an array of audience objects by looking at the name\n const getLowestAudience = (audiences: Audience[]) => {\n if (!audiences.length)\n return null;\n\n let lowestAudience: Audience;\n let lowestAudienceDigit: number;\n\n audiences.forEach(audience => {\n const digit = +ArrayHelper.first(audience.name.match(DIGIT_REGEX));\n\n if (!lowestAudience) {\n lowestAudience = audience;\n lowestAudienceDigit = digit;\n return;\n }\n\n if (digit < lowestAudienceDigit)\n lowestAudience = audience;\n });\n\n return lowestAudience;\n };\n\n // This is used to track how many times a member's name appears in the collection\n const nameCountMap: HashObject<number> = {};\n\n let sorted: BaseObject[] = [];\n\n members.forEach(member => {\n if (!nameCountMap[member.name]) {\n nameCountMap[member.name] = 1;\n sorted.push(member);\n return;\n }\n\n sorted.push(member);\n nameCountMap[member.name]++;\n\n // Take the slice of duplicates that we want to sort by audience\n const slice = sorted.splice(sorted.length - nameCountMap[member.name]);\n\n // Sort the slice by lowest audience\n const sortedSlice = slice.sort((a: any, b: any) => {\n const firstObjLowestAudience = getLowestAudience(a.subjectPresentationAudiences.data);\n const secondObjLowestAudience = getLowestAudience(b.subjectPresentationAudiences.data);\n\n if (!firstObjLowestAudience && secondObjLowestAudience)\n return 1;\n\n if (!secondObjLowestAudience)\n return -1;\n\n const comparison = firstObjLowestAudience.name.localeCompare(secondObjLowestAudience.name);\n\n if (comparison === 0) return comparison;\n\n return comparison > 0 ? -1 : 1;\n });\n\n sorted = sorted.concat(sortedSlice);\n });\n\n return sorted;\n },\n\n getActiveAudiencesFromParams(audiences: PresentationAudience[], params: HashObject = {}): PresentationAudience[] {\n if (!ObjectHelper.isObject(params) || ObjectHelper.isEmpty(params))\n return;\n\n if (!audiences || !audiences.length)\n return;\n\n if (!AudienceHelper.shouldShowAudiences(audiences))\n return;\n\n // 'a' is shorthand for audience\n let { a } = params;\n\n if (!a)\n return;\n\n // Only a single query param was passed, we'll wrap it in an array\n if (typeof a === 'string')\n a = [a];\n\n const normalizeAudienceName = (audienceName: string) => {\n return audienceName.replace(SPACE_REGEX, '').toLowerCase();\n };\n\n // Build an audience lookup\n const audienceLookup = a.reduce((state: HashObject, audienceStr: string) => {\n state[normalizeAudienceName(audienceStr)] = audienceStr;\n return state;\n }, {});\n\n // Filter out our active audience based on whether their name matches the lookup object\n return audiences.filter((audience: PresentationAudience) => {\n return audienceLookup[normalizeAudienceName(audience.name)];\n });\n },\n\n getAudienceParams(audiences: PresentationAudience[]): HashObject {\n if (!audiences?.length)\n return null;\n\n return { a: audiences.map(a => a.name) };\n },\n\n shouldShowAudiences(audiences: PresentationAudience[] = []): boolean {\n if (!audiences)\n return false;\n\n return audiences.length > MIN_AUDIENCE_THRESHOLD;\n }\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"leftNavIcon\":\"ssG3i\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { IconCircle } from 'libs/shared/components/icon-circle/IconCircle';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { CuratedDashboard, Library } from 'libs/shared/interfaces';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { LeftNavId } from 'shared/enums/LeftNavId';\nimport { LeftNavConfig } from 'shared/views/left-nav/LeftNavConfig';\n\nimport { LibraryHelper } from 'apps/libraries/utils/LibraryHelper';\n\nimport styles from './nav-tiles.scss';\n\nconst namespace = 'default.popupPlugin';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface NavItemTileProps {\n id: LeftNavId;\n name: string;\n imageUrl?: string;\n iconClassName: string;\n svgName: string;\n appLink: Core.AppLink;\n}\n\nfunction NavItemTile(props: NavItemTileProps): JSX.Element {\n return (\n <li className={`columns-of-five-md col-6 mb-3`}>\n <AppLink\n appLink={props.appLink}\n className={`border rounded-3 d-flex align-items-center\n justify-content-center flex-column text-decoration-none h-100 py-3 px-1 text-center`}\n >\n <div className={`${styles.leftNavIcon} ${props.iconClassName} mx-auto mb-3`}>\n <IconCircle\n imageUrl={ImageHelper.createUrl(props.imageUrl, { size: ImageSize.Small })}\n svgName={props.svgName}\n svgSize={SvgContainerSize.Large}\n />\n </div>\n <div className='h6'>\n {props.name}\n </div>\n </AppLink>\n </li>\n );\n}\n\ninterface NavTilesProps {\n hasPermissions: HasPermissionsFunc;\n moviesAndTvDashboard: CuratedDashboard;\n hasNewMoviesAndTv: boolean;\n libraries: Library[];\n liteStudentCustomLibraries: boolean;\n}\n\nexport function NavTiles(props: NavTilesProps): JSX.Element {\n const { hasPermissions, moviesAndTvDashboard, hasNewMoviesAndTv, libraries, liteStudentCustomLibraries } = props;\n\n function shouldShowLibraries(): boolean {\n if (!libraries?.length)\n return false;\n \n if (!hasPermissions(PermissionName.StudentExperience))\n return true;\n \n /**\n * Students only see libraries if the school has the domain option\n */\n return liteStudentCustomLibraries;\n }\n\n return (\n <ul className='list-unstyled row'>\n {hasPermissions(PermissionName.StudentExperience) && (\n <NavItemTile\n id={LeftNavId.StudentFeed}\n appLink={LeftNavConfig[LeftNavId.StudentFeed].appLink}\n name={getPhrase('home')}\n iconClassName='bg-purple'\n svgName={cvSvgLibrary.House}\n />\n )}\n <NavItemTile\n id={LeftNavId.Discover}\n appLink={LeftNavConfig[LeftNavId.Discover].appLink}\n name={getPhrase('discover')}\n iconClassName='bg-blue'\n svgName={cvSvgLibrary.Compass}\n />\n {(!!moviesAndTvDashboard && !!hasNewMoviesAndTv) && (\n <NavItemTile\n id={LeftNavId.MoviesAndTv}\n appLink={LeftNavConfig[LeftNavId.MoviesAndTv].appLink}\n name={getPhrase('moviesAndTv')}\n iconClassName='bg-indigo'\n svgName={cvSvgLibrary.Popcorn}\n />\n )}\n <NavItemTile\n id={LeftNavId.Playlists}\n appLink={LeftNavConfig[LeftNavId.Playlists].appLink}\n name={getPhrase('playlists')}\n iconClassName='bg-green'\n svgName={cvSvgLibrary.Playlist}\n />\n <NavItemTile\n id={LeftNavId.MyVideos}\n appLink={LeftNavConfig[LeftNavId.MyVideos].appLink}\n name={getPhrase('myVideos')}\n iconClassName='bg-orange'\n svgName={cvSvgLibrary.Video}\n />\n {!!shouldShowLibraries() && (\n LibraryHelper.sort(libraries).map((library, index) => (\n <NavItemTile\n key={index}\n id={LeftNavId.Library}\n name={library.name}\n appLink={{\n ...LeftNavConfig[LeftNavId.Library].appLink,\n args: [ library.id, TextHelper.slugify(library.name) ]\n }}\n iconClassName='bg-teal'\n imageUrl={library.owner?.logo?.url}\n svgName={!(library.owner?.logo?.url) && cvSvgLibrary.Library}\n />\n ))\n )}\n </ul>\n );\n}","import React from 'react';\nimport { Radio } from 'backbone';\n\nimport { CommonChannels } from 'libs/common/backbone/constants/CommonChannels';\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { useFocusSearchBar } from 'libs/shared/components/search-bar/SearchUtils';\nimport { FixedWidget, PartialFixedWidget } from 'libs/shared/components/widgets/fixed-widget';\nimport { PopoutVideoWidgetItem, PopoutVideoWidgetItemProps } from 'libs/shared/components/widgets/items/popout-video-widget-item/PopoutVideoWidgetItem';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { FavouriteRequests } from 'libs/shared/flight-requests/FavouriteRequests';\nimport { LibraryRequests } from 'libs/shared/flight-requests/LibraryRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useListenOn } from 'libs/shared/hooks/UseListenOn';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, CurrentUser, DashboardTargetType, Library, PresentationAudience, VideoTypesCollection, YearGroup } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { usePluginHelper } from 'shared/hooks/use-plugin-helper/usePluginHelper';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\nimport { usePresentation } from 'shared/hooks/usePresentation';\nimport { useFetchCuratedDashboard } from 'shared/utils/DashboardHelper';\nimport { LayoutHelper } from 'shared/utils/LayoutHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { NavTiles } from 'apps/default/views/popup-plugin/components/Navtiles';\nimport { useGetVideoHistory } from 'apps/default/views/popup-plugin/hooks/useGetVideoHistoryVideos';\nimport { SeriesAppLinkHelper } from 'apps/series/SeriesAppLinkHelper';\n\nconst namespace = 'default.popupPlugin';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\n\nexport function PopupPluginView(): JSX.Element {\n const { isPlugin } = usePluginHelper();\n const { focusSearchBar } = useFocusSearchBar();\n\n /**\n * Required for video widgets\n */\n const { activePresentation } = usePresentation();\n const { hasPermissions, isLoaded } = usePermissions();\n const { setFavourite, canFavourite } = useLiteFavourites(LocationContext.VideoThumbnail);\n const { hasNewMoviesAndTv, liteStudentCustomLibraries, isLoadingSettings } = useSettings(null);\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n activePresentation &&\n AudienceRequests.audiencesByPresentationId(activePresentation.id)\n );\n\n /**\n * Watch history videos\n */\n const videoHistory = useGetVideoHistory();\n\n /**\n * Favourite videos\n */\n const favouriteVideos = Flight.useBasicFetch<VideoTypesCollection>(\n currentUser.data && FavouriteRequests.getFavourites(currentUser.data.id)\n );\n\n /**\n * Required for displaying our Nav item tiles.\n */\n const libraries = Flight.useBasicFetch<Library[]>(\n hasPermissions(PermissionName.ViewLibraries) &&\n LibraryRequests.domainLibraries([ 'customLibrary', 'sharedLibrary' ])\n );\n const {\n dashboard: moviesAndTvDashboard\n } = useFetchCuratedDashboard({\n targetType: DashboardTargetType.MoviesAndTv,\n queryParams: {}\n });\n Flight.useBasicFetch(!!libraries.data?.length &&\n LibraryRequests.librariesWithOwnerLogos(libraries.data.map(s => s.id)));\n\n useListenOn(CommonChannels.SHELL, Core.EventNames.ROUTE, appLink => {\n /**\n * Ignore applinks with no href. Like the embed popup - Sha\n */\n if (!Core.AppLinkHelper.getHref(appLink))\n return;\n\n /**\n * Enable the nav as we leave our popup view - Sha\n */\n LayoutHelper.enableNav();\n\n /**\n * Re-focus the search bar when the routing has ended.\n * We need to do this because the user may be mid typing, but the layout\n * re-render causes the search bar to lose focus - Sha\n */\n Radio.channel(CommonChannels.SHELL).once('routing:end', focusSearchBar);\n });\n\n const hasLoaded = (\n moviesAndTvDashboard.hasCompleted &&\n isLoaded &&\n !isLoadingSettings &&\n (!hasPermissions(PermissionName.ViewLibraries) || libraries.hasCompleted) &&\n config.hasCompleted\n );\n\n if (!hasLoaded)\n return <></>;\n\n return (\n <div className='px-4'>\n <NavTiles\n hasPermissions={hasPermissions}\n moviesAndTvDashboard={moviesAndTvDashboard.data}\n hasNewMoviesAndTv={hasNewMoviesAndTv}\n libraries={libraries.data}\n liteStudentCustomLibraries={liteStudentCustomLibraries}\n />\n\n {videoHistory.hasCompleted ?\n <div className='mb-3'>\n <FixedWidget<PopoutVideoWidgetItemProps>\n name={getPhrase('recentlyWatched')}\n collection={videoHistory.data || []}\n contents={WidgetContents.Videos}\n childComponent={PopoutVideoWidgetItem}\n extraChildComponentProps={{\n setFavourite,\n canFavourite,\n presentationAudiences: audiences.data,\n getSubTextAppLink: SeriesAppLinkHelper.getSeriesAppLink,\n imageCdnUrl: config.data.imageCdnUrl,\n yearGroups: yearGroups.data,\n showVideoGuidance: VideoHelper.showVideoGuidance(hasPermissions),\n isPlugin,\n getClassroomGuideAppLink: VideoAppLinkHelper.getClassroomGuideAppLink,\n getResourceGuidanceAppLink: VideoAppLinkHelper.getResourceGuidanceAppLink,\n getInteractiveGuidanceAppLink: VideoAppLinkHelper.getInteractiveGuidanceAppLink\n }}\n getChildAppLink={VideoAppLinkHelper.getAppLink}\n appLink={{\n application: AppChannels.WATCH_HISTORY,\n action: Actions.WatchHistory.HOME\n }}\n prefetched\n />\n </div> :\n <div className='mb-3'><PartialFixedWidget /></div>\n }\n\n {favouriteVideos.hasCompleted ?\n <FixedWidget<PopoutVideoWidgetItemProps>\n name={getPhrase('favourites')}\n collection={favouriteVideos.data.data || []}\n contents={WidgetContents.Videos}\n childComponent={PopoutVideoWidgetItem}\n extraChildComponentProps={{\n setFavourite,\n canFavourite,\n presentationAudiences: audiences.data,\n getSubTextAppLink: SeriesAppLinkHelper.getSeriesAppLink,\n imageCdnUrl: config.data.imageCdnUrl,\n yearGroups: yearGroups.data,\n showVideoGuidance: VideoHelper.showVideoGuidance(hasPermissions),\n isPlugin,\n getClassroomGuideAppLink: VideoAppLinkHelper.getClassroomGuideAppLink,\n getResourceGuidanceAppLink: VideoAppLinkHelper.getResourceGuidanceAppLink,\n getInteractiveGuidanceAppLink: VideoAppLinkHelper.getInteractiveGuidanceAppLink\n }}\n getChildAppLink={VideoAppLinkHelper.getAppLink}\n appLink={{\n application: AppChannels.DEFAULT,\n action: Actions.MyFavourites.MY_FAVOURITES\n }}\n prefetched\n /> :\n <PartialFixedWidget />\n }\n </div>\n );\n}","import React from 'react';\n\nimport { Flight } from 'libs/common/react/index';\n\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useBatchFetch } from 'libs/shared/hooks/UseBatchFetch';\nimport { VideoHistoryCollection, VideoTypes } from 'libs/shared/interfaces';\n\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\n\nimport { VideoHistoryRequests } from 'apps/watch-history/flight-requests/VideoHistoryRequests';\n\nexport function useGetVideoHistory() {\n const videoHistory = Flight.useBasicFetch<VideoHistoryCollection>(VideoHistoryRequests.userVideoHistory());\n\n const videosFetchResult = useBatchFetch<VideoTypes>(\n videoHistory.data?.data?.map(v => v.videoId) ?? [],\n VideoRequests.watchHistoryVideos\n );\n\n /**\n * We must do this to get the videos back into the correct order - Sha\n */\n const videoHistoryVideos = React.useMemo(() => {\n const videosMap = new Map<string, VideoTypes>();\n\n videoHistory.data?.data?.forEach(history => {\n if (videosMap.has(history.videoId))\n return;\n\n const video = videosFetchResult.items?.[history.videoId];\n\n if (video)\n videosMap.set(history.videoId, video);\n });\n\n return [...videosMap.values()];\n }, [ videosFetchResult.items, videoHistory.data ]);\n \n useVideoMixin(videoHistoryVideos);\n\n return {\n data: videoHistoryVideos,\n hasCompleted: !videosFetchResult.isFetching\n };\n}","\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { VideoHistoryCollection } from 'libs/shared/interfaces';\n\nexport const VideoHistoryRequests = {\n userVideoHistory(\n cursor?: string,\n success?: (data: HashObject) => void,\n error?: (Xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n let key = 'video:history';\n let url = `{gateway}/v1/users/me/watch-history`;\n\n if (cursor) {\n key += `:${cursor}`;\n url += `?cursor=${cursor}`;\n }\n\n return {\n key,\n url,\n formatData: (historyCollection: VideoHistoryCollection) => {\n return {\n data: historyCollection.data.map(historyData => {\n // Convert last watched times from UTC to local time\n const lastTimeWatchedLocal = DateHelper.format(historyData.lastTimeWatched);\n const lastDateWatchedLocal = DateHelper.format(lastTimeWatchedLocal, 'YYYY-MM-DD');\n\n return {\n ...historyData,\n lastTimeWatched: lastTimeWatchedLocal,\n lastDateWatched: lastDateWatchedLocal\n };\n }),\n pagination: historyCollection.pagination\n };\n },\n success,\n error,\n always\n };\n },\n\n videoHistory(\n ids: string[],\n namespace?: string,\n success?: (data: HashObject) => void,\n error?: (Xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n const params = ids.sort().map(i => `videoId=${i}`);\n\n return {\n key: `video:history:videos:${params.join('&')}`,\n url: `{gateway}/v1/videos/history?${params.join('&')}`,\n normalizeOptions: {\n namespace\n },\n formatData: (historyCollection: HashObject[]) => {\n if (!historyCollection?.length)\n return historyCollection;\n\n /**\n * Data is formatted to enable it to be merged with the existing video object in the store\n * Where we need to merge more history properties with the video object, map them below.\n */\n return historyCollection.map((watchHistory: HashObject) => ({\n id: watchHistory.videoId,\n lastProgressPoint: watchHistory.lastProgressPoint\n }));\n },\n success,\n error,\n always\n };\n }\n};","import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { Clip, ClipCollection, CurrentUser, Video, VideoCollection } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\ntype Types = Video[] | VideoCollection | Clip[] | ClipCollection;\n\nfunction getValidObjects(objects: Types): (Video | Clip)[] {\n if (!objects)\n return [];\n\n if (Array.isArray(objects))\n return objects.filter(o => !!o && (VideoHelper.isVideo(o) || VideoHelper.isClip(o)));\n\n if ('data' in objects)\n return objects.data.filter(o => !!o && (VideoHelper.isVideo(o) || VideoHelper.isClip(o)));\n\n return [];\n}\n\ninterface VideoMixinOptions {\n /**\n * If the videos that are having new data mixed into are sitting on an explicit Flight namespace,\n * providing that namespace here is required\n */\n flightNamespace?: string;\n}\n\nexport function useVideoMixin(objects: Types, options: VideoMixinOptions = {}): void {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const hydratedVideos = React.useRef<Set<string>>(new Set<string>());\n\n const videos = getValidObjects(objects);\n\n const videoIds = videos.map(v => v.id);\n\n const [ request, setRequest ] = React.useState<Flight.Request[]>([]);\n\n React.useEffect(() => {\n if (!videoIds?.length || !currentUser.hasCompleted)\n return;\n\n const unhydratedVideos: string[] = [];\n\n videoIds.forEach(id => {\n if (!hydratedVideos.current.has(id)) {\n unhydratedVideos.push(id);\n hydratedVideos.current.add(id);\n }\n });\n \n if (!unhydratedVideos.length)\n return;\n\n setRequest(r => {\n const newRequests = [\n ...r,\n VideoRequests.videoMixinAssocs(unhydratedVideos, options.flightNamespace)\n ];\n\n if (currentUser.data?.isAuthenticated)\n newRequests.push(ClassificationRequests.hasCurriculumLinks(unhydratedVideos, null, options.flightNamespace));\n\n return newRequests;\n });\n }, [ videoIds?.length, currentUser.hasCompleted ]);\n\n Flight.useBasicFetchAll(request);\n}"],"names":["PopoutVideoWidgetItem","props","video","data","getSubTextAppLink","context","thumbnailSize","preloadImage","presentationAudiences","videoAudiences","subjectPresentationAudiences","mergedAudience","breakpoints","useBreakpoints","width","type","className","VideoThumbnail","preventPopout","xs","textPosition","ThumbnailTextPosition","appLink","getAppLink","subTextAppLink","VideoHelper","imageOptions","size","preload","analyticsData","analyticsOptions","canFavourite","setFavourite","imageCdnUrl","audience","hideRating","hideDuration","yearGroups","hideTitle","showVideoGuidance","companyLogoFallbackUrl","subTextType","isPlugin","getInteractiveGuidanceAppLink","getResourceGuidanceAppLink","getClassroomGuideAppLink","useBatchFetch","itemIds","getRequest","idBatches","setIdBatches","length","newBatches","push","forEach","id","find","batch","_id","filter","join","dispatch","state","idBatch","request","key","shouldFetch","items","isFetching","responses","i","response","v","Object","keys","some","k","useMergeAudiences","audiences","sortedAudiences","HAS_NUMBER_REGEX","AudienceStringBuilders","firstAudience","ArrayHelper","lastAudience","name","split","toLowerCase","DIGIT_REGEX","SPACE_REGEX","AudienceHelper","getSortedPresentationAudiences","objectAudiences","objectAudienceIds","map","toString","presAudience","includes","masterId","getMergedPresentationAudienceString","mergedAudienceString","presentationId","HardCoded","combinedNames","a","numberList","isNaN","num","wordList","audienceWithoutNum","p","test","prefix","charAt","pop","audienceRange","audienceValues","initialVal","nextVal","j","isContinguous","ranges","sort","b","processAudienceRanges","audienceNames","commonWordsAndTheirPositions","index","wordsInName","word","commonWord","commonWordPosition","firstAudienceName","lastAudienceName","stripOutCommonWord","mergedWord","firstAudienceFirstWord","lastAudienceFirstWord","firstAudienceNumber","lastAudienceNumber","firstAudienceString","lastAudienceString","sortMembersWithDuplicateNamesByAudience","members","getLowestAudience","digit","match","lowestAudience","lowestAudienceDigit","nameCountMap","sorted","member","sortedSlice","splice","firstObjLowestAudience","secondObjLowestAudience","comparison","localeCompare","concat","getActiveAudiencesFromParams","params","ObjectHelper","shouldShowAudiences","normalizeAudienceName","audienceName","replace","audienceLookup","reduce","audienceStr","getAudienceParams","getPhrase","LanguageService","NavItemTile","AppLink","iconClassName","IconCircle","imageUrl","ImageHelper","svgName","svgSize","SvgContainer","S","NavTiles","hasPermissions","moviesAndTvDashboard","hasNewMoviesAndTv","libraries","liteStudentCustomLibraries","PermissionName","LeftNavId","LeftNavConfig","LibraryHelper","library","args","TextHelper","owner","logo","url","PopupPluginView","usePluginHelper","focusSearchBar","activePresentation","usePresentation","usePermissions","isLoaded","useLiteFavourites","u","useSettings","isLoadingSettings","config","ConfigRequests","currentUser","UserRequests","isAuthenticated","CustomerRequests","customerId","AudienceRequests","videoHistory","VideoHistoryRequests","videosFetchResult","videoId","VideoRequests","videoHistoryVideos","videosMap","Map","history","has","set","values","useVideoMixin","hasCompleted","useGetVideoHistory","favouriteVideos","FavouriteRequests","LibraryRequests","targetType","queryParams","dashboard","s","CommonChannels","LayoutHelper","Radio","once","collection","contents","WidgetContents","childComponent","extraChildComponentProps","SeriesAppLinkHelper","VideoAppLinkHelper","getChildAppLink","application","action","prefetched","userVideoHistory","cursor","success","error","always","formatData","historyCollection","historyData","lastTimeWatchedLocal","lastTimeWatched","lastDateWatchedLocal","lastDateWatched","pagination","ids","namespace","normalizeOptions","watchHistory","lastProgressPoint","objects","options","hydratedVideos","Set","videos","Array","isArray","o","getValidObjects","videoIds","setRequest","unhydratedVideos","current","add","r","newRequests","flightNamespace"],"sourceRoot":""}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[4718],{78259:(e,n,t)=>{t.d(n,{O:()=>c});var r=t(58176),a=t.n(r),i=t(39479),o={className:"info-link",defaultProtocol:"https"},c={linkifyText:function(e,n){if(e){var t=n?i.extend({},o,n):o;return a()(e,t)}}}},51685:(e,n,t)=>{t.d(n,{g:()=>m});var r=t(32735),a=t(78259),i=t(18559),o=t(86764),c=t(3747),s=t(26361),l=t(31908);const u={captionsBadge:"eXhiL"};function d(e){var n,t,o,c,s,d;if(!e.video.description&&!(null===(n=l.M.getCanBeConsumed(e.video))||void 0===n?void 0:n.canNavigate))return r.createElement("em",null,l.M.getPrivacyReasoning(e.video,e.showSignIn));var m=!!(null===(c=null===(o=null===(t=e.video)||void 0===t?void 0:t.subtitles)||void 0===o?void 0:o.data)||void 0===c?void 0:c.length);return r.createElement(r.Fragment,null,m&&r.createElement("span",{className:"d-inline-block align-middle ".concat(u.captionsBadge)},r.createElement(i.C,{type:i.g.Captions,data:null===(s=e.video)||void 0===s?void 0:s.subtitles})),!!(null===(d=e.video)||void 0===d?void 0:d.productionYear)&&r.createElement("span",{className:"fw-semibold align-middle"},m?" • ":"",e.video.productionYear),!!e.video.description&&r.createElement("span",{className:"align-middle",dangerouslySetInnerHTML:{__html:"".concat(e.video.productionYear||m?" • ":"").concat(a.O.linkifyText(e.video.description))}}))}function m(e){var n=(0,c.a)(o.r.XS),t=s.l.hasRestrictions(e.video);return n||t?r.createElement(r.Fragment,null):r.createElement("div",{className:"position-relative overflow-hidden clamp-2"},r.createElement("p",{className:"m-0"},r.createElement(d,{video:e.video,showSignIn:e.showSignIn})))}},84678:(e,n,t)=>{t.d(n,{L:()=>i});var r=t(32735),a=t(18559);function i(e){return r.createElement(a.C,{type:a.g.Restriction,data:{restrictions:e.restrictions,yearGroups:e.yearGroups},inline:!0})}},94696:(e,n,t)=>{t.d(n,{B:()=>s});var r=t(32735),a=t(17464),i=t(84678),o=t(26361),c=t(31908);function s(e){var n=o.l.hasRestrictions(e.video),t=c.M.getCanBeConsumed(e.video).canConsume;return n&&e.yearGroups&&t?r.createElement(a.c,{className:e.className||"pt-1"},r.createElement(i.L,{restrictions:e.video._restrictions,yearGroups:e.yearGroups})):r.createElement(r.Fragment,null)}},70872:(e,n,t)=>{t.d(n,{u:()=>s});var r=t(32735),a=t(65858),i=t(36848),o=t(38647),c=t(31908);function s(e){var n,t,s,l=c.M.getCanBeConsumed(e.video).canNavigate,u=c.M.getTitle(e.video),d=Object.assign(Object.assign({},e.analyticsData),{id:null===(n=e.video)||void 0===n?void 0:n.id,name:null===(t=e.video)||void 0===t?void 0:t.name}),m=Object.assign(Object.assign({},e.analyticsOptions),{actionType:a.Vw.Click,descriptor:a._S.Title}),v=e.textClassName||"clamp-1 align-middle ".concat("md"===e.size?"h4":"h5");return r.createElement(i.F,{className:e.linkClassName,appLink:l?e.appLink:null,onClick:l?e.onClickAppLink:null,analyticsOptions:m,analyticsData:d},r.createElement("h5",{className:v,title:null!==(s=e.video.name)&&void 0!==s?s:""},u,r.createElement(o.m,{size:e.size,video:e.video,yearGroups:e.yearGroups})))}},15469:(e,n,t)=>{t.d(n,{r:()=>d});var r=t(32735),a=t(36848),i=t(86572),o=t(83345),c=t(86764),s=t(81514),l=t(40424),u="shared.interactiveItem";function d(e){var n,t,d,m=(t=e.totalToDisplay,d=(0,s.V)(),"number"==typeof t?t:d===c.r.XS?3:d===c.r.SM?1:d===c.r.MD||d===c.r.LG?2:3);if(!(null===(n=e.timepoints)||void 0===n?void 0:n.length))return r.createElement(r.Fragment,null);var v=[],f=0;e.timepoints.forEach((function(n){null==n||n.interactions.forEach((function(t){if(f<m){f++;var r=t.typeId===l.Z9.Annotation&&"string"==typeof t.data?JSON.parse(t.data):t.data,a=Object.assign(Object.assign({},t),{data:Object.assign(Object.assign({},r),{appLink:e.appLink&&Object.assign(Object.assign({},e.appLink),{params:{t:Math.floor(n.visibleAt/1e3)}})})});v.push(a)}}))}));var p=e.timepoints.reduce((function(e,n){var t,r;return e+(null!==(r=null===(t=null==n?void 0:n.interactions)||void 0===t?void 0:t.length)&&void 0!==r?r:0)}),0);return v.length?r.createElement(r.Fragment,null,v.map((function(n){var t,a;return r.createElement("div",{key:n.id,className:"d-flex align-items-center mb-1"},r.createElement("div",{className:"clamp-1"},r.createElement(i.y,{interaction:n,appLink:null===(t=n.data)||void 0===t?void 0:t.appLink,onClick:(null===(a=n.data)||void 0===a?void 0:a.appLink)?e.onClickAppLink:null,smallIcon:!0})))})),r.createElement("div",{className:"mb-1 text-link"},r.createElement(a.F,{className:"info-link",appLink:e.previewAppLink,onClick:e.onClickAppLink},r.createElement(o.x,{namespace:u,phrase:"previewQuestions",options:{questionsShown:v.length,smartCount:p}})))):r.createElement(r.Fragment,null)}},81514:(e,n,t)=>{t.d(n,{V:()=>i});var r=t(86764),a=t(3747);function i(){var e=(0,a.a)(r.r.XS),n=(0,a.a)(r.r.SM),t=(0,a.a)(r.r.MD),i=(0,a.a)(r.r.LG),o=(0,a.a)(r.r.XL),c=(0,a.a)(r.r.XXL),s=r.r.LG;return e&&(s=r.r.XS),n&&(s=r.r.SM),t&&(s=r.r.MD),i&&(s=r.r.LG),o&&(s=r.r.XL),c&&(s=r.r.XXL),s}},80143:(e,n,t)=>{t.d(n,{n:()=>i});var r=t(32735),a=t(69454);function i(e,n){var t=r.useMemo((function(){return(null==e?void 0:e.length)&&n&&a.T.shouldShowAudiences(n)?a.T.getSortedPresentationAudiences(e,n):null}),[e]);return r.useMemo((function(){return(null==t?void 0:t.length)?a.T.getMergedPresentationAudienceString(t):null}),[t])}},69454:(e,n,t)=>{t.d(n,{T:()=>d});var r=t(75896),a=t(1048),i=t(55171);function o(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,r=Array(n);t<n;t++)r[t]=e[t];return r}var c=/\d/,s=function(e){var n,t,a=r.m.first(e),i=r.m.last(e);return a.name===i.name?a.name:"Advanced"===i.name?"lower"===(n=a.name.split(" "),t=1,function(e){if(Array.isArray(e))return e}(n)||function(e,n){var t=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=t){var r,a,i,o,c=[],s=!0,l=!1;try{if(i=(t=t.call(e)).next,0===n){if(Object(t)!==t)return;s=!1}else for(;!(s=(r=i.call(t)).done)&&(c.push(r.value),c.length!==n);s=!0);}catch(e){l=!0,a=e}finally{try{if(!s&&null!=t.return&&(o=t.return(),Object(o)!==o))return}finally{if(l)throw a}}return c}}(n,t)||function(e,n){if(e){if("string"==typeof e)return o(e,n);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?o(e,n):void 0}}(n,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0].toLowerCase()?"Lower Sec - Adv":"Upper Sec - Adv":"Lower - Upper Sec"},l=/([0-9]+)/gi,u=/\s|\+/gi,d={getSortedPresentationAudiences:function(e,n){var t=e.filter((function(e){return!!e})).map((function(e){return e.id.toString()}));return n.filter((function(e){return t.includes(e.masterId.toString())}))},getMergedPresentationAudienceString:function(e){var n,t,a,o="";switch(+r.m.first(e).presentationId){case i.e.PresentationIds.DEFAULT:case i.e.PresentationIds.AU_SECONDARY:case i.e.PresentationIds.US_ELEMENTARY:case i.e.PresentationIds.AU_PRIMARY:case i.e.PresentationIds.STREAMABLE_LEARNING:if(1===e.length)return e[0];o=function(e){var n=e.map((function(e){return e.name})).join(" "),t=n.split(" ").filter((function(e){return!isNaN(+e)})).map((function(e){return+e}))||[],r=n.split(" ").filter((function(e){return isNaN(+e)}))||[],a=e.find((function(e){return!c.test(e.name)})),i=r.find((function(e){return e!==(null==a?void 0:a.name)}));if(e.length>1&&(i+="s"),a&&t.length)return"".concat(i," ").concat(a.name.charAt(0)," - ").concat(t.pop());var o=function(e){var n,t,r,a,i=!1,o=[];for(e=e.sort((function(e,n){return e-n})),r=0;r<e.length;r++)a=r+1,i||(n=e[r]),t=e[a],e[r]+1===t?i=!0:i?(o.push("".concat(n," - ").concat(e[r])),i=!1):(o.push("".concat(e[r])),i=!1);return o}(t);return"".concat(i," ").concat(o.join(", "))}(e);break;case i.e.PresentationIds.SCOTLAND_PRIMARY:case i.e.PresentationIds.INTERNATIONAL_PRIMARY:case i.e.PresentationIds.INTERNATIONAL_SECONDARY:if(1===e.length)return e[0];o=function(e){var n=e.map((function(e){return e.name})),t={};n.forEach((function(e,n){if(0!==n){var r=e.split(" ");Object.keys(t).forEach((function(e){r.includes(e)||delete t[e]}))}else e.split(" ").forEach((function(e,n){t[e]=0===n?"start":"end"}))}));var r=Object.keys(t)[0],a=t[r];if(!r)return e[0].name;var i=e[0].name,o=e[e.length-1].name,c=function(e){return e.split(r)[0]},s="".concat(c(i)," - ").concat(c(o));return"start"===a?"".concat(r," ").concat(s):"".concat(s," ").concat(r)}(e);break;case i.e.PresentationIds.ENGLISH_SECONDARY:o=s(e);break;case i.e.PresentationIds.SCOTLAND_SECONDARY:n=e,t=r.m.first(n),a=r.m.last(n),o=t.name===a.name?t.name:"Senior Phase"===a.name?"".concat(t.name," - Senior"):"Third - Fourth Level";break;case i.e.PresentationIds.ENGLAND_PRIMARY:o=function(e){var n=r.m.first(e),t=r.m.last(e),a=r.m.first(n.name.split(" ")),i=r.m.first(t.name.split(" ")),o=n.name.split(" ").find((function(e){return!isNaN(+e)})),c=t.name.split(" ").find((function(e){return!isNaN(+e)}));if(n===t)return"Key"===a||"Reception"===a?n.name:"".concat(a," KS").concat(o);var s="",l="";return s="Reception"===a?"R":"KS".concat(o),l="KS".concat(c),"Lower"===a&&"Upper"===i?"L ".concat(s," - U ").concat(l):("Lower"===a&&(s="Lower ".concat(s)),"Upper"===i&&(l="Upper ".concat(l)),"Key"===i&&(l=t.name),"".concat(s," - ").concat(l))}(e);case i.e.PresentationIds.US_MIDDLE:case i.e.PresentationIds.US_HIGH:}return o?{name:o}:null},sortMembersWithDuplicateNamesByAudience:function(e){var n=function(e){return e.length?(e.forEach((function(e){var a=+r.m.first(e.name.match(l));if(!n)return n=e,void(t=a);a<t&&(n=e)})),n):null;var n,t},t={},a=[];return e.forEach((function(e){if(!t[e.name])return t[e.name]=1,void a.push(e);a.push(e),t[e.name]++;var r=a.splice(a.length-t[e.name]).sort((function(e,t){var r=n(e.subjectPresentationAudiences.data),a=n(t.subjectPresentationAudiences.data);if(!r&&a)return 1;if(!a)return-1;var i=r.name.localeCompare(a.name);return 0===i?i:i>0?-1:1}));a=a.concat(r)})),a},getActiveAudiencesFromParams:function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(a.t.isObject(n)&&!a.t.isEmpty(n)&&e&&e.length&&d.shouldShowAudiences(e)){var t=n.a;if(t){"string"==typeof t&&(t=[t]);var r=function(e){return e.replace(u,"").toLowerCase()},i=t.reduce((function(e,n){return e[r(n)]=n,e}),{});return e.filter((function(e){return i[r(e.name)]}))}}},getAudienceParams:function(e){return(null==e?void 0:e.length)?{a:e.map((function(e){return e.name}))}:null},shouldShowAudiences:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return!!e&&e.length>1}}}}]);
|
|
2
|
-
//# sourceMappingURL=4718-6df54d3039-lite.chunk.js.map
|