@clickview/exchange 0.63.0-rc.0 → 0.63.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.vite/manifest.json +525 -525
- package/dist/bundles.json +1 -1
- package/dist/en.json +1 -1
- package/dist/scripts/{XXzDL37Y.chunk.js → -x9MMtVv.chunk.js} +2 -2
- package/dist/scripts/{XXzDL37Y.chunk.js.map → -x9MMtVv.chunk.js.map} +1 -1
- package/dist/scripts/{BRJldyG42.chunk.js → 4oWF2EyV2.chunk.js} +2 -2
- package/dist/scripts/{BRJldyG42.chunk.js.map → 4oWF2EyV2.chunk.js.map} +1 -1
- package/dist/scripts/{Bbv7q795.chunk.js → 5Z0rGCy2.chunk.js} +2 -2
- package/dist/scripts/{Bbv7q795.chunk.js.map → 5Z0rGCy2.chunk.js.map} +1 -1
- package/dist/scripts/{Buz0cl_A2.chunk.js → 8vJGuJF-2.chunk.js} +2 -2
- package/dist/scripts/{Buz0cl_A2.chunk.js.map → 8vJGuJF-2.chunk.js.map} +1 -1
- package/dist/scripts/{DHyCd_bU2.chunk.js → B0jhFNam2.chunk.js} +3 -3
- package/dist/scripts/{DHyCd_bU2.chunk.js.map → B0jhFNam2.chunk.js.map} +1 -1
- package/dist/scripts/{C56J8vQn2.chunk.js → B3tq0EFi2.chunk.js} +2 -2
- package/dist/scripts/{C56J8vQn2.chunk.js.map → B3tq0EFi2.chunk.js.map} +1 -1
- package/dist/scripts/{z3xPIUA8.chunk.js → B6EmIhMh.chunk.js} +2 -2
- package/dist/scripts/{z3xPIUA8.chunk.js.map → B6EmIhMh.chunk.js.map} +1 -1
- package/dist/scripts/{CvGdC4sR2.chunk.js → BEgLlK2Z2.chunk.js} +2 -2
- package/dist/scripts/{CvGdC4sR2.chunk.js.map → BEgLlK2Z2.chunk.js.map} +1 -1
- package/dist/scripts/{DZzghMqE2.chunk.js → BEyI0jsC2.chunk.js} +2 -2
- package/dist/scripts/{DZzghMqE2.chunk.js.map → BEyI0jsC2.chunk.js.map} +1 -1
- package/dist/scripts/{hZmx1ZBr.chunk.js → BHzUOyzG.chunk.js} +2 -2
- package/dist/scripts/{hZmx1ZBr.chunk.js.map → BHzUOyzG.chunk.js.map} +1 -1
- package/dist/scripts/{CBskpS-O.chunk.js → BI2S4EFA.chunk.js} +2 -2
- package/dist/scripts/{CBskpS-O.chunk.js.map → BI2S4EFA.chunk.js.map} +1 -1
- package/dist/scripts/{_yGE4YHL2.chunk.js → BTsePUCN2.chunk.js} +2 -2
- package/dist/scripts/{_yGE4YHL2.chunk.js.map → BTsePUCN2.chunk.js.map} +1 -1
- package/dist/scripts/{CSI2paIO2.chunk.js → BaXT2aKo2.chunk.js} +2 -2
- package/dist/scripts/{CSI2paIO2.chunk.js.map → BaXT2aKo2.chunk.js.map} +1 -1
- package/dist/scripts/{CmvWR08f.chunk.js → BibFbDqs.chunk.js} +2 -2
- package/dist/scripts/{CmvWR08f.chunk.js.map → BibFbDqs.chunk.js.map} +1 -1
- package/dist/scripts/{DUcxhK9t.chunk.js → BjzONPz9.chunk.js} +2 -2
- package/dist/scripts/{DUcxhK9t.chunk.js.map → BjzONPz9.chunk.js.map} +1 -1
- package/dist/scripts/{DRwPcxvr.chunk.js → BnbM9YhY.chunk.js} +2 -2
- package/dist/scripts/{DRwPcxvr.chunk.js.map → BnbM9YhY.chunk.js.map} +1 -1
- package/dist/scripts/{l5SFnLQO.chunk.js → BrEvIvRP.chunk.js} +2 -2
- package/dist/scripts/{l5SFnLQO.chunk.js.map → BrEvIvRP.chunk.js.map} +1 -1
- package/dist/scripts/{CcQK2DGq2.chunk.js → C1guWVFU2.chunk.js} +2 -2
- package/dist/scripts/{CcQK2DGq2.chunk.js.map → C1guWVFU2.chunk.js.map} +1 -1
- package/dist/scripts/{BWVFXuZ42.chunk.js → C3K3VtRR2.chunk.js} +2 -2
- package/dist/scripts/{BWVFXuZ42.chunk.js.map → C3K3VtRR2.chunk.js.map} +1 -1
- package/dist/scripts/{lWeC_K_B.chunk.js → CAJOpkKZ.chunk.js} +2 -2
- package/dist/scripts/{lWeC_K_B.chunk.js.map → CAJOpkKZ.chunk.js.map} +1 -1
- package/dist/scripts/{feXppHqr.chunk.js → CAOBwDbU.chunk.js} +2 -2
- package/dist/scripts/{feXppHqr.chunk.js.map → CAOBwDbU.chunk.js.map} +1 -1
- package/dist/scripts/{BTP30DaC.chunk.js → CAQAUQMB.chunk.js} +2 -2
- package/dist/scripts/{BTP30DaC.chunk.js.map → CAQAUQMB.chunk.js.map} +1 -1
- package/dist/scripts/{4onqOCbS.chunk.js → CAoPaL8M.chunk.js} +2 -2
- package/dist/scripts/{4onqOCbS.chunk.js.map → CAoPaL8M.chunk.js.map} +1 -1
- package/dist/scripts/{YL1EBDd_.chunk.js → CCvXN2-C.chunk.js} +2 -2
- package/dist/scripts/{YL1EBDd_.chunk.js.map → CCvXN2-C.chunk.js.map} +1 -1
- package/dist/scripts/{D7MdAl-52.chunk.js → CDXcKno52.chunk.js} +2 -2
- package/dist/scripts/{D7MdAl-52.chunk.js.map → CDXcKno52.chunk.js.map} +1 -1
- package/dist/scripts/{B1_Y3iw-.chunk.js → CGLWqKaa.chunk.js} +2 -2
- package/dist/scripts/{B1_Y3iw-.chunk.js.map → CGLWqKaa.chunk.js.map} +1 -1
- package/dist/scripts/{BX4WdpiX.chunk.js → CHQN7xOX.chunk.js} +2 -2
- package/dist/scripts/{BX4WdpiX.chunk.js.map → CHQN7xOX.chunk.js.map} +1 -1
- package/dist/scripts/{3OI-aLOc.chunk.js → CSbvS-Cl.chunk.js} +2 -2
- package/dist/scripts/{3OI-aLOc.chunk.js.map → CSbvS-Cl.chunk.js.map} +1 -1
- package/dist/scripts/{CWY-sFVd.chunk.js → CYFRcx63.chunk.js} +2 -2
- package/dist/scripts/{CWY-sFVd.chunk.js.map → CYFRcx63.chunk.js.map} +1 -1
- package/dist/scripts/{DfMfBgzn2.chunk.js → CeeAb-HT2.chunk.js} +2 -2
- package/dist/scripts/{DfMfBgzn2.chunk.js.map → CeeAb-HT2.chunk.js.map} +1 -1
- package/dist/scripts/{DspWTyv22.chunk.js → Cllrumah2.chunk.js} +2 -2
- package/dist/scripts/{DspWTyv22.chunk.js.map → Cllrumah2.chunk.js.map} +1 -1
- package/dist/scripts/{CPzPIQB92.chunk.js → CoK2sqzN2.chunk.js} +2 -2
- package/dist/scripts/{CPzPIQB92.chunk.js.map → CoK2sqzN2.chunk.js.map} +1 -1
- package/dist/scripts/{DUVTdegJ.chunk.js → CsrTrVKj.chunk.js} +2 -2
- package/dist/scripts/{DUVTdegJ.chunk.js.map → CsrTrVKj.chunk.js.map} +1 -1
- package/dist/scripts/{C-mZmrh2.chunk.js → CuE3TVwa.chunk.js} +2 -2
- package/dist/scripts/{C-mZmrh2.chunk.js.map → CuE3TVwa.chunk.js.map} +1 -1
- package/dist/scripts/{D9yYpvIx.chunk.js → D-ivDlyL.chunk.js} +2 -2
- package/dist/scripts/{D9yYpvIx.chunk.js.map → D-ivDlyL.chunk.js.map} +1 -1
- package/dist/scripts/{ZgHZpHus2.chunk.js → D36Shrdb2.chunk.js} +2 -2
- package/dist/scripts/{ZgHZpHus2.chunk.js.map → D36Shrdb2.chunk.js.map} +1 -1
- package/dist/scripts/{DiivzK1E.chunk.js → D3Jgk2dT.chunk.js} +2 -2
- package/dist/scripts/{DiivzK1E.chunk.js.map → D3Jgk2dT.chunk.js.map} +1 -1
- package/dist/scripts/{DDU0lRB02.chunk.js → D6EZoO4S2.chunk.js} +2 -2
- package/dist/scripts/{DDU0lRB02.chunk.js.map → D6EZoO4S2.chunk.js.map} +1 -1
- package/dist/scripts/{Ca1aJXXk.chunk.js → DDO16-at.chunk.js} +2 -2
- package/dist/scripts/{Ca1aJXXk.chunk.js.map → DDO16-at.chunk.js.map} +1 -1
- package/dist/scripts/{DQhm12vh2.chunk.js → DGRBUJ6T2.chunk.js} +2 -2
- package/dist/scripts/{DQhm12vh2.chunk.js.map → DGRBUJ6T2.chunk.js.map} +1 -1
- package/dist/scripts/{PVFChK662.chunk.js → DGy73Ett2.chunk.js} +2 -2
- package/dist/scripts/{PVFChK662.chunk.js.map → DGy73Ett2.chunk.js.map} +1 -1
- package/dist/scripts/{BhygUKHG2.chunk.js → DHV6S1fA2.chunk.js} +2 -2
- package/dist/scripts/{BhygUKHG2.chunk.js.map → DHV6S1fA2.chunk.js.map} +1 -1
- package/dist/scripts/{ClJxBHin2.chunk.js → DM0JzOpR2.chunk.js} +2 -2
- package/dist/scripts/{ClJxBHin2.chunk.js.map → DM0JzOpR2.chunk.js.map} +1 -1
- package/dist/scripts/{Ovy1FgPr2.chunk.js → DOuiFwIH2.chunk.js} +2 -2
- package/dist/scripts/{Ovy1FgPr2.chunk.js.map → DOuiFwIH2.chunk.js.map} +1 -1
- package/dist/scripts/{C5zVzLiv.chunk.js → DRZvc_n5.chunk.js} +2 -2
- package/dist/scripts/{C5zVzLiv.chunk.js.map → DRZvc_n5.chunk.js.map} +1 -1
- package/dist/scripts/{e-cJ9kRJ.chunk.js → DUCTNoXj.chunk.js} +2 -2
- package/dist/scripts/{e-cJ9kRJ.chunk.js.map → DUCTNoXj.chunk.js.map} +1 -1
- package/dist/scripts/{MsShPjH12.chunk.js → Da2KHzN02.chunk.js} +2 -2
- package/dist/scripts/{MsShPjH12.chunk.js.map → Da2KHzN02.chunk.js.map} +1 -1
- package/dist/scripts/{VrblzwSV.chunk.js → DklryBsJ.chunk.js} +2 -2
- package/dist/scripts/{VrblzwSV.chunk.js.map → DklryBsJ.chunk.js.map} +1 -1
- package/dist/scripts/{V1sSszjJ.chunk.js → DsA2RTbF.chunk.js} +2 -2
- package/dist/scripts/{V1sSszjJ.chunk.js.map → DsA2RTbF.chunk.js.map} +1 -1
- package/dist/scripts/{kAq4UzUo.chunk.js → Dsmr6Wly.chunk.js} +2 -2
- package/dist/scripts/{kAq4UzUo.chunk.js.map → Dsmr6Wly.chunk.js.map} +1 -1
- package/dist/scripts/{PVKBLI-T2.chunk.js → DsolW3Wd2.chunk.js} +2 -2
- package/dist/scripts/{PVKBLI-T2.chunk.js.map → DsolW3Wd2.chunk.js.map} +1 -1
- package/dist/scripts/{C4y3yewN.chunk.js → UK8sD-oL.chunk.js} +2 -2
- package/dist/scripts/{C4y3yewN.chunk.js.map → UK8sD-oL.chunk.js.map} +1 -1
- package/dist/scripts/{C79TzhHV.chunk.js → aXgcldgY.chunk.js} +2 -2
- package/dist/scripts/{C79TzhHV.chunk.js.map → aXgcldgY.chunk.js.map} +1 -1
- package/dist/scripts/{app-DddMB3QD.js → app-lnmpv5W4.js} +3 -3
- package/dist/scripts/app-lnmpv5W4.js.map +1 -0
- package/dist/scripts/{CRtOlUhH.chunk.js → c2oA1XgG.chunk.js} +2 -2
- package/dist/scripts/{CRtOlUhH.chunk.js.map → c2oA1XgG.chunk.js.map} +1 -1
- package/dist/scripts/{CKC7r8Ck2.chunk.js → dkfSCDWH2.chunk.js} +2 -2
- package/dist/scripts/{CKC7r8Ck2.chunk.js.map → dkfSCDWH2.chunk.js.map} +1 -1
- package/dist/scripts/{Dwhojt8g2.chunk.js → jErHNuXU2.chunk.js} +2 -2
- package/dist/scripts/{Dwhojt8g2.chunk.js.map → jErHNuXU2.chunk.js.map} +1 -1
- package/dist/scripts/{BXh_8LxI2.chunk.js → mkasrghR2.chunk.js} +2 -2
- package/dist/scripts/{BXh_8LxI2.chunk.js.map → mkasrghR2.chunk.js.map} +1 -1
- package/dist/scripts/{D2D0ku9V2.chunk.js → s776Po8a2.chunk.js} +2 -2
- package/dist/scripts/{D2D0ku9V2.chunk.js.map → s776Po8a2.chunk.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/app-DddMB3QD.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BX4WdpiX.chunk.js","names":[],"sources":["../../../../libs/shared/src/interfaces/models/curated-widget/CuratedWidget.ts","../../../../libs/shared/src/apps/search/interfaces/SearchTypes.ts","../../../../libs/shared/src/apps/search/interfaces/SearchFilter.ts","../../../../libs/shared/src/enums/WidgetTemplate.ts","../../../../libs/shared/src/enums/WidgetTypeId.ts","../../../../libs/shared/src/utils/DashboardHelper.ts","../../../../libs/shared/src/constants/WidgetTypeIdConfig.ts","../../../../libs/shared/src/images/svg/status/WarningOutlineSvg.tsx","../../../../libs/shared/src/enums/WidgetStatus.ts","../../../../libs/shared/src/utils/WidgetHelper.ts","../../../../libs/shared/src/components/widgets/curated-widgets/components/header/widget-header.module.scss","../../../../libs/shared/src/components/widgets/curated-widgets/components/header/WidgetHeader.tsx","../../../../libs/shared/src/enums/TagType.ts","../../../../libs/shared/src/components/tags/tags.module.scss","../../../../libs/shared/src/components/tags/TagItem.tsx"],"sourcesContent":["import { HashObject } from 'libs/common/react/interfaces';\n\nimport { AllWidgetTemplateProps } from 'libs/shared/components/widgets/curated-widgets/WidgetProps';\nimport { ButtonIcon } from 'libs/shared/constants/WidgetThemingConstants';\nimport { WidgetStatus } from 'libs/shared/enums/WidgetStatus';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { CuratedObjectsWidgetData, CuratedWidgetContent, CuratedWidgetData } from 'libs/shared/interfaces';\n\nexport enum CuratedDashboardAppLink {\n LatestReleases = 'latest-releases',\n ExploreAllTopics = 'explore-all-topics',\n ClassificationLatestReleases = 'classification-latest-releases',\n ClassificationDirectory = 'classification-directory'\n}\n\nexport enum CuratedWidgetCtaAppLink {\n TopicDirectory = 'topic-directory',\n TopicNewReleases = 'topic-new-releases',\n CuratedTopic = 'curated-topic'\n}\n\nexport interface BaseWidget<TContent extends HashObject = HashObject> {\n index: number;\n templateId: WidgetTemplate;\n widgetId: WidgetTypeId;\n name: string;\n description?: string;\n content?: TContent;\n}\n\nexport interface WidgetCta {\n text?: string;\n href?: string;\n icon?: ButtonIcon;\n appLink?: CuratedWidgetCtaAppLink;\n}\n\nexport type WidgetMetadata = AllWidgetTemplateProps['metadata'] & {\n showInTableOfContents: boolean,\n tocIndentation: number,\n headingOptional: boolean,\n aiAddedVideo: boolean\n};\n\nexport interface WidgetPreference {\n id: string;\n index?: number;\n hidden?: boolean;\n}\n\nexport interface CuratedWidget<\n TData extends CuratedWidgetData = CuratedWidgetData,\n TContent extends CuratedWidgetContent = CuratedWidgetContent\n> extends BaseWidget<TContent> {\n id: string;\n dashboardId: string;\n data: TData;\n status: WidgetStatus;\n metadata?: Partial<WidgetMetadata>;\n preferences?: WidgetPreference[];\n cursor?: string;\n\n // If a widget has curriculum IDs set, then it won't be accessible to anyone who doesn't have one of those curriculums\n curriculumIds?: string[];\n}\n\nexport type CuratedMediaWidget<\n TContent extends CuratedWidgetContent = CuratedWidgetContent\n> = CuratedWidget<CuratedObjectsWidgetData, TContent>;\n","import { ObjectHash } from 'backbone';\nimport Bloodhound from 'bloodhound';\n\nimport { SearchIndices } from 'libs/shared/apps/search/interfaces';\n\nexport interface RemoteSearch<T> extends Bloodhound.BloodhoundOptions<T> {\n remote: Bloodhound.RemoteOptions<T>;\n}\n\nexport interface LocalSearch<T> extends Bloodhound.BloodhoundOptions<T> {\n local: T[] | (() => T[]);\n}\n\nexport type TypeaheadDataSource<T> = Bloodhound<T> |\n((query: string, syncResults: (result: T[]) => void, asyncResults?: (result: T[]) => void) => void);\n\nexport interface InstantSearchBloodhound<T> {\n bloodhound: TypeaheadDataSource<T>;\n name: string;\n}\n\nexport type TypeaheadConfig<T> = Twitter.Typeahead.Dataset<T>;\n\nexport interface TypeaheadConfigHandler<T> {\n (source?: InstantSearchBloodhound<T>, index?: number, options?: ObjectHash): Twitter.Typeahead.Dataset<T>;\n}\n\nexport interface BloodhoundConfigHandler<T> {\n (source: string, options?: ObjectHash): LocalSearch<T> | RemoteSearch<T>;\n}\n\nexport interface TypeaheadSourceItem<T> {\n name: string;\n typeaheadConfig: TypeaheadConfigHandler<T>;\n bloodhoundConfig?: BloodhoundConfigHandler<T>;\n options?: ObjectHash;\n}\n\nexport const AllSearchIndicesVideoStyle: SearchIndices[] = [ 'video', 'clip', 'interactive' ];\nexport const AllSearchIndicesInSearch: SearchIndices[] = [ 'playlist', 'series', 'clip', 'classification', 'interactive', 'video', 'company', 'category', 'partner_profile' ];\nexport const AllSearchIndicesInUserManager: SearchIndices[] = ['user'];\n","import { SvgIcon } from 'libs/shared/utils/SvgHelper';\n\nimport { FilterStateHash } from '../reducers';\n\nimport { FilterProps } from './FilterProps';\nimport { SearchIndices } from './SearchResults';\n\nconst FilterIdNames =\n [\n 'sort', // \"sort\" isn't even a filter but it tends to go with our filters in our designs\n 'classification',\n 'presentation',\n 'audience',\n 'yearGroup',\n 'moviesAndTv',\n 'type',\n 'rating',\n 'interactives',\n 'clips',\n 'classroom',\n 'hasResources',\n 'hasSubtitles',\n 'productionYear',\n 'isHd',\n 'producedByClickView',\n 'duration',\n 'tagOrClassification',\n 'status',\n 'isAdmin',\n 'bulkActionType',\n 'userType',\n 'filter',\n 'channel',\n 'dateBroadcast',\n 'categoryId',\n 'hasInteractives',\n 'jobStatus',\n 'source',\n 'customerStatus',\n 'specialEventType',\n 'customerType',\n 'seriesId',\n 'scopeId'\n ] as const;\n\n/**\n * Any filters that shouldn't be sent to the backend as a filter\n * and are instead handled differently by the frontend\n */\nconst FilterBlacklist: Partial<Record<FilterIds, boolean>> = {\n type: true\n};\n\nexport type FilterIds = typeof FilterIdNames[number];\n\nexport const FilterWhitelist = FilterIdNames.reduce((acc, prev) => {\n return {\n ...acc,\n [prev]: !FilterBlacklist[prev]\n };\n}, {} as Record<FilterIds, boolean>);\n\nexport type FilterType = 'radio' | 'checkbox' | 'nested-checkbox' | 'grouped-checkbox' | 'switch' | 'more-filters' | 'rating' | 'dropdown' | 'tag' | 'button';\n\nexport interface SearchFilter<TFilterOptionId = string> {\n id: FilterIds;\n type: FilterType;\n compatibleIndices: SearchIndices[];\n\n name?: string;\n icon?: SvgIcon;\n description?: string;\n options?: FilterOption<TFilterOptionId>[];\n labelPrefix?: string;\n\n // For second layer options, for example 'presentation' checkbox filter has 'audience' as second layer option\n secondaryId?: FilterIds;\n\n customComponent?: (props: FilterProps) => JSX.Element;\n disabled?: boolean;\n disableOptions?: (options: FilterOption[], filters: SearchFilter[], state: FilterStateHash) => FilterOption[];\n}\n\nexport interface MoreFilters extends Omit<SearchFilter, 'id' | 'compatibleIndices'> {\n filters: SearchFilter[];\n id: string;\n}\n\nexport interface FilterOption<TId = string> {\n id: TId;\n name: string;\n default?: boolean;\n disabled?: boolean;\n secondLayerSelection?: FilterOption[];\n secondLayerOptions?: FilterOption[];\n group?: string;\n}\n\nexport type ProductionYearFilterOptions =\n 'any-year' |\n 'this-year' |\n 'last-3-years' |\n 'last-5-years';\n\nexport type DurationFilterOptions =\n 'bite-sized' |\n 'short' |\n 'medium' |\n 'long';\n\nexport enum SourceFilterOptions {\n MyVideos = 'my-videos',\n School = 'school',\n ExchangeArchive = 'exchange-archive',\n ClickView = 'clickview',\n LiveStreams = 'livestreams'\n}\n\nexport enum TypeFilterOptions {\n Video = 'video',\n Series = 'series',\n Playlist = 'playlist',\n Classification = 'classification',\n Clip = 'clip',\n Interactive = 'interactive',\n Company = 'company',\n Category = 'category',\n PartnerProfile = 'partner_profile'\n}\n","export enum WidgetTemplate {\n // Videos\n ThumbnailHeroMedia = 'thumbnail_hero_media',\n ThumbnailFeaturedMedia = 'thumbnail_featured_media',\n ThumbnailSlidingListSmall = 'thumbnail_sliding_list_small',\n ThumbnailSlidingListSmallV2 = 'thumbnail_sliding_list_small_v2',\n ThumbnailSlidingListLarge = 'thumbnail_sliding_list_large',\n ThumbnailFixedListMediaSmall = 'thumbnail_fixed_list_media_small',\n ThumbnailFixedListMediaLarge = 'thumbnail_fixed_list_media_large',\n ThumbnailFixedListFolderSmall = 'thumbnail_fixed_list_folder_small',\n ThumbnailVerticalList = 'thumbnail_vertical_list',\n PopoutThumbnailSlidingListLarge = 'popout_thumbnail_sliding_list_large',\n PopoutThumbnailSlidingListSmall = 'popout_thumbnail_sliding_list_small',\n FeaturedThumbnailSlidingList = 'featured_thumbnail_sliding_list',\n ThumbnailFixedListXLarge = 'thumbnail_fixed_list_xlarge',\n\n // Topics\n CoverSlidingPillListSmall = 'cover_sliding_pill_list_small',\n CoverFixedPillListLarge = 'cover_fixed_pill_list_large',\n StatsCoverFixedPillListLarge = 'stats_cover_fixed_pill_list_large',\n CoverFixedPillListXSmall = 'cover_fixed_pill_list_xsmall',\n ThumbnailFixedListLarge = 'thumbnail_fixed_list_large',\n ThumbnailFixedListSmall = 'thumbnail_fixed_list_small',\n EditableCoverFixedPillListSmall = 'editable_cover_fixed_pill_list_small',\n HeroBanner = 'hero_banner',\n HeroThumbnailSmall = 'hero_thumbnail_small',\n HeroBlockColourSmall = 'hero_block_colour_small',\n\n // Curriculum\n CurriculumResourcesAccordion = 'curriculum_resources_accordion',\n CurriculumCodeSearchResults = 'curriculum_code_search_results',\n\n // Playlists\n CoverFixedTileList = 'cover_fixed_tile_list',\n\n // Topics & Series\n PosterSlidingListLarge = 'poster_sliding_list_large',\n PosterSlidingListMedium = 'poster_sliding_list_medium',\n PosterSlidingListSmall = 'poster_sliding_list_small',\n PosterFixedListLarge = 'poster_fixed_list_large',\n\n // Blurbs & Topics\n HeroBannerSmall = 'hero_banner_small',\n\n // Text-based blurbs\n Heading = 'heading',\n AuthorReviewer = 'author_reviewer',\n Question = 'question',\n QuestionAccordion = 'question_accordion',\n\n // Companies / Studios / Content Partners\n CircleLogoSlidingList = 'circle_logo_sliding_list',\n RectangularLogoSlidingList = 'rectangular_logo_sliding_list',\n RectangularLogoFixedList = 'rectangular_logo_fixed_list',\n ThumbnailFixedListSearchCta = 'thumbnail_fixed_list_search_cta',\n InfiniteThumbnailVerticalList = 'infinite_thumbnail_vertical_list',\n\n // Rating filters\n FilterSlidingPillListSmall = 'filter_sliding_pill_list_small',\n\n // Special events\n EventIconSlidingList = 'event_icon_sliding_list',\n\n // Tags filter\n TagSlidingList = 'tag_sliding_list',\n\n SearchSuggestionsBlurb = 'search_suggestions_blurb'\n}\n","export enum WidgetTypeId {\n // Video group\n CuratedMedia = 'curated_media',\n PlaylistMedia = 'playlist_media',\n SeriesMedia = 'series_media',\n ClassificationMedia = 'classification_media',\n LatestReleasedVideos = 'latest_released_videos',\n ContinueWatching = 'continue_watching_videos',\n CompanyLatestReleasedVideo = 'company_latest_released_video',\n CompanyVideos = 'company_videos',\n ClassificationLatestReleasedVideo = 'classification_latest_released_video',\n ClassificationLatestReleasedVideosV2 = 'classification_latest_released_videos_v2',\n CompanyClassificationVideos = 'company_classification_videos',\n ClassificationDashboardMedia = 'classification_dashboard_media',\n ClassificationDashboardExternalMedia = 'classification_dashboard_external_media',\n SeasonalClassificationMedia = 'seasonal_classification_media',\n TrendingClassificationsMedia = 'trending_classifications_media',\n ClassificationCurriculumMedia = 'classification_curriculum_media',\n\n // Topics group\n CuratedClassifications = 'curated_classifications',\n Classifications = 'classifications',\n ClassificationLatestReleasedVideos = 'classification_latest_released_videos',\n SpecialEventClassifications = 'special_event_classifications',\n LatestReleasedClassifications = 'latest_released_classifications',\n TrendingClassifications = 'trending_classifications',\n\n // Series group\n CuratedSeries = 'curated_series',\n\n // Playlists group\n CuratedPlaylists = 'curated_playlists',\n\n // Blurb group\n Blurb = 'blurb',\n DynamicBlurb = 'dynamic_blurb',\n AuthorReviewer = 'author_reviewer',\n Faq = 'faq',\n\n // Network group\n CuratedCompanies = 'curated_companies',\n\n // Partner Profile group\n CuratedContentPartners = 'curated_content_partners',\n ContentPartnerLatestReleasedVideos = 'content_partner_latest_released_videos',\n ContentPartnerSeries = 'content_partner_series',\n ContentPartnerVideos = 'content_partner_videos',\n SpotlightContentPartners = 'spotlight_curated_content_partners',\n ContentPartners = 'content_partners',\n ContentPartnersHub = 'content_partners_hub',\n TrendingContentPartnersVideo = 'content_partner_trending_videos',\n ContentPartnerAllVideos = 'content_partner_all_videos',\n\n // Search filter group\n Ratings = 'ratings',\n\n // Presentations group\n Presentations = 'presentations',\n\n // Livestreams group\n UpcomingLivestreams = 'upcoming_livestreams',\n\n // Multimedia group\n CuratedMultimedia = 'curated_multimedia',\n\n // Legacy widget types\n ClassificationPlaylists = 'classification_playlists',\n ClassificationSeries = 'classification_series',\n ClassificationFeaturedVideo = 'classification_featured_video',\n ClassificationPinnedVideos = 'classification_pinned_videos',\n\n // Search widget types\n SearchRelevantTopics = 'search_relevant_topics',\n SearchCompanies = 'search_companies',\n SearchTopResults = 'search_top_results',\n SearchSeries = 'search_series',\n SearchPlaylists = 'search_playlists',\n SearchMyVideosFolder = 'search_my_videos_folders',\n SearchMySchoolLibraryFolder = 'search_my_school_library_folders',\n SearchMyVideos = 'search_my_videos',\n SearchMySchoolLibraryVideos = 'search_my_school_library_videos',\n SearchExchangeArchive = 'search_exchange_archive',\n SearchClickViewLive = 'search_clickview_live',\n SearchRelatedResults = 'search_related_results',\n SearchTags = 'search_tags',\n SearchCurriculumCode = 'search_curriculum_code',\n SearchSuggestions = 'search_suggestions',\n SearchContentPartners = 'search_content_partners'\n}\n","import { FormikContextType } from 'formik';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { SearchResultObjectTypes } from 'libs/shared/apps/search/interfaces';\nimport { GetCustomParamOptions, WidgetTypeIdConfig } from 'libs/shared/constants/WidgetTypeIdConfig';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { OnlineUserRole } from 'libs/shared/enums/UserRole';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { SettingsHash } from 'libs/shared/hooks/useSettings';\nimport { BaseObject, ClassificationCurriculumInfo, ClassificationDashboardInfo, ClassificationDirectoryInfo, CuratedDashboard, CuratedMediaWidget, CuratedWidget, CuratedWidgetQueryParams, DashboardTargetInfo, DashboardTargetType, PartnerProfileDashboardInfo, UnknownDashboardTargetInfo } from 'libs/shared/interfaces';\n\ninterface LatestReleasesTimeRange {\n from: string;\n to: string;\n}\n\nexport const DashboardHelper = {\n\n /**\n * Same implementation as GetUserGroup() in Online.\n * @param userRole \n */\n getUserGroup(userRole: OnlineUserRole): UserGroup {\n if (userRole === OnlineUserRole.Student)\n return UserGroup.Learner;\n\n return UserGroup.Staff;\n }\n};\n\nexport const CuratedDashboardHelper = {\n onSelectCuratedObject(\n selectedObj: SearchResultObjectTypes | BaseObject,\n formikProps: FormikContextType<CuratedMediaWidget<BaseObject[]>>\n ) {\n const data = {\n ...formikProps.values.data,\n objectIds: ArrayHelper.addOrRemoveImmutable(formikProps.values.data.objectIds || [], selectedObj.id)\n };\n \n formikProps.setFieldValue('data', data);\n \n formikProps.setTouched({\n ...formikProps.touched,\n data: {\n objectIds: true\n }\n });\n },\n\n onRemoveCuratedObject(\n objectId: string,\n formikProps: FormikContextType<CuratedMediaWidget<BaseObject[]>>\n ) {\n const newData = {\n ...formikProps.values.data,\n objectIds: formikProps.values.data.objectIds.filter(id => id !== objectId)\n };\n\n formikProps.setFieldValue('data', newData);\n },\n\n getDashboardTarget(info: DashboardTargetInfo): string {\n if (info.targetType === DashboardTargetType.Discover)\n return `discover:presentation:${info.presentationId}`;\n\n if (info.targetType === DashboardTargetType.Classification)\n return `classification:${info.classificationId}`;\n\n if (info.targetType === DashboardTargetType.ClassificationDirectory)\n return `classification:${info.classificationId}:directory`;\n\n if (info.targetType === DashboardTargetType.ClassificationCurriculum)\n return `classification:${info.classificationId}:curriculum`;\n\n if (info.targetType === DashboardTargetType.MoviesAndTv)\n return `moviesAndTv:presentation:${info.presentationId}`;\n\n if (info.targetType === DashboardTargetType.Company)\n return `company:${info.companyId}:presentation:${info.presentationId}`;\n\n if (info.targetType === DashboardTargetType.PartnerProfile)\n return `partnerprofile:${info.slug}`;\n\n if (info.targetType === DashboardTargetType.DiscoverPartnerProfiles)\n return `discover:partners`;\n\n if (info.targetType === DashboardTargetType.PartnerProfileHub)\n return `discover:partners:hub`;\n\n return null;\n },\n\n getUnknownDashboardTarget(options: UnknownDashboardTargetInfo): string {\n const {\n presentationId,\n companyId,\n targetType,\n classificationId,\n slug\n } = options;\n\n if (targetType === DashboardTargetType.Discover) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.Discover,\n presentationId\n });\n }\n \n if (targetType === DashboardTargetType.MoviesAndTv) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.MoviesAndTv,\n presentationId\n });\n }\n \n if (targetType === DashboardTargetType.Company) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.Company,\n presentationId,\n companyId\n });\n }\n \n if (targetType === DashboardTargetType.Classification) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.Classification,\n classificationId\n });\n }\n \n if (targetType === DashboardTargetType.ClassificationDirectory) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.ClassificationDirectory,\n classificationId\n });\n }\n \n if (targetType === DashboardTargetType.ClassificationCurriculum) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.ClassificationCurriculum,\n classificationId\n });\n }\n\n if (targetType === DashboardTargetType.PartnerProfile) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.PartnerProfile,\n slug\n });\n }\n\n if (targetType === DashboardTargetType.DiscoverPartnerProfiles) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.DiscoverPartnerProfiles\n });\n }\n\n if (targetType === DashboardTargetType.PartnerProfileHub) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.PartnerProfileHub\n });\n }\n },\n\n getDashboardTargetInfo(dashboard: CuratedDashboard): DashboardTargetInfo {\n const type = CuratedDashboardHelper.getDashboardTargetType(dashboard);\n const split = dashboard?.target?.split(':');\n\n if (type === DashboardTargetType.Discover) {\n return {\n targetType: DashboardTargetType.Discover,\n presentationId: split[2]\n };\n }\n\n if (type === DashboardTargetType.Classification) {\n return {\n targetType: DashboardTargetType.Classification,\n classificationId: split[1]\n };\n }\n\n if (type === DashboardTargetType.ClassificationDirectory) {\n return {\n targetType: DashboardTargetType.ClassificationDirectory,\n classificationId: split[1]\n };\n }\n\n if (type === DashboardTargetType.ClassificationCurriculum) {\n return {\n targetType: DashboardTargetType.ClassificationCurriculum,\n classificationId: split[1]\n };\n }\n\n if (type === DashboardTargetType.MoviesAndTv) {\n return {\n targetType: DashboardTargetType.MoviesAndTv,\n presentationId: split[2]\n };\n }\n\n if (type === DashboardTargetType.Company) {\n return {\n targetType: DashboardTargetType.Company,\n companyId: split[1],\n presentationId: split[3]\n };\n }\n\n if (type === DashboardTargetType.PartnerProfile) {\n return {\n targetType: DashboardTargetType.PartnerProfile,\n slug: split[1]\n };\n }\n\n return null;\n },\n\n getDashboardTargetType(dashboard: CuratedDashboard): DashboardTargetType {\n if (!dashboard?.target)\n return null;\n\n if (dashboard.target.startsWith('discover')) {\n if (dashboard.target.endsWith('partners'))\n return DashboardTargetType.DiscoverPartnerProfiles;\n\n if (dashboard.target.endsWith('hub'))\n return DashboardTargetType.PartnerProfileHub;\n\n return DashboardTargetType.Discover;\n }\n\n if (dashboard.target.startsWith('classification')) {\n if (dashboard.target.endsWith('directory'))\n return DashboardTargetType.ClassificationDirectory;\n\n if (dashboard.target.endsWith('curriculum'))\n return DashboardTargetType.ClassificationCurriculum;\n\n return DashboardTargetType.Classification;\n }\n\n if (dashboard.target.startsWith('moviesAndTv'))\n return DashboardTargetType.MoviesAndTv;\n\n if (dashboard.target.startsWith('company')) {\n return DashboardTargetType.Company;\n }\n\n if (dashboard.target.startsWith('partnerprofile'))\n return DashboardTargetType.PartnerProfile;\n\n return null;\n },\n\n isType(dashboard: CuratedDashboard, target: DashboardTargetType): boolean {\n return CuratedDashboardHelper.getDashboardTargetType(dashboard) === target;\n },\n\n isCuratedDashboard(obj: BaseObject): obj is CuratedDashboard {\n const dashboard = obj as CuratedDashboard;\n\n const targetType = CuratedDashboardHelper.getDashboardTargetType(dashboard);\n\n if (targetType === DashboardTargetType.Discover)\n return true;\n\n if (targetType === DashboardTargetType.Classification)\n return true;\n\n if (targetType === DashboardTargetType.ClassificationDirectory)\n return true;\n\n if (targetType === DashboardTargetType.ClassificationCurriculum)\n return true;\n\n if (targetType === DashboardTargetType.MoviesAndTv)\n return true;\n\n if (targetType === DashboardTargetType.Company)\n return true;\n\n return false;\n },\n\n getLatestReleasedTimeRange(): LatestReleasesTimeRange {\n const now = new Date();\n const from = DateHelper.format(DateHelper.endOf(DateHelper.subtract(now, 2, 'month'), 'day'), 'YYYY-MM-DD');\n const to = DateHelper.format(DateHelper.endOf(now, 'day'), 'YYYY-MM-DD');\n return { from, to };\n },\n\n getWidgetParams(\n widgetTypeId: WidgetTypeId,\n templateId: WidgetTemplate,\n target: DashboardTargetType,\n audienceIds?: string | string[],\n preferredCurriculumId?: string,\n options?: GetCustomParamOptions\n ): CuratedWidgetQueryParams {\n const params: CuratedWidgetQueryParams = { };\n\n if (audienceIds)\n params.audienceId = audienceIds;\n\n if (widgetTypeId === WidgetTypeId.ClassificationCurriculumMedia)\n params.curriculumPresentationId = preferredCurriculumId;\n\n return {\n ...params,\n ...WidgetTypeIdConfig[widgetTypeId]?.getCustomParams?.(templateId, target, options)\n };\n },\n\n isSystemGeneratedDashboard(widgets: CuratedWidget[]): boolean {\n const systemGeneratedClassificationWidgetTypes = new Set<WidgetTypeId>([\n WidgetTypeId.ClassificationFeaturedVideo,\n WidgetTypeId.ClassificationPinnedVideos,\n WidgetTypeId.ClassificationPlaylists,\n WidgetTypeId.ClassificationSeries\n ]);\n\n return widgets?.some(widget => systemGeneratedClassificationWidgetTypes.has(widget.widgetId));\n },\n\n isClassificationDashboard(\n targetInfo: DashboardTargetInfo\n ): targetInfo is ClassificationDashboardInfo | ClassificationDirectoryInfo | ClassificationCurriculumInfo {\n return [\n DashboardTargetType.Classification,\n DashboardTargetType.ClassificationDirectory,\n DashboardTargetType.ClassificationCurriculum\n ].includes(targetInfo?.targetType);\n },\n\n isContentPartnerDashboard(targetInfo: DashboardTargetInfo): targetInfo is PartnerProfileDashboardInfo {\n return targetInfo?.targetType === DashboardTargetType.PartnerProfile;\n },\n\n isDirectoryDashboard(\n targetInfo: DashboardTargetInfo\n ): targetInfo is ClassificationDirectoryInfo {\n return targetInfo?.targetType === DashboardTargetType.ClassificationDirectory;\n },\n\n isWidgetTypeEnabled(\n widgetTypeId: WidgetTypeId,\n settingsHash: SettingsHash,\n targetType: DashboardTargetType\n ): boolean {\n const config = WidgetTypeIdConfig[widgetTypeId];\n \n return config?.predicate?.({ settingsHash, targetType }) ?? true;\n }\n};\n","import { Core } from 'libs/common/backbone/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { SourceFilterOptions, TypeFilterOptions } from '../apps/search/interfaces';\nimport { WidgetAppLinks } from '../components/widgets/curated-widgets/WidgetProps';\nimport { WidgetTemplate } from '../enums/WidgetTemplate';\nimport { WidgetTypeId } from '../enums/WidgetTypeId';\nimport { SettingsHash } from '../hooks/useSettings';\nimport { CuratedWidgetContent, CuratedWidgetQueryParams, DashboardTargetType, Series } from '../interfaces';\nimport { CuratedDashboardHelper } from '../utils/DashboardHelper';\n\ninterface WidgetTypeIdPredicateOptions {\n settingsHash: SettingsHash;\n targetType: DashboardTargetType;\n}\n\nexport interface GetCustomParamOptions {\n params?: CuratedWidgetQueryParams;\n}\n\ninterface WidgetTypeIdConfigType {\n getCustomParams: (\n widgetTemplate: WidgetTemplate,\n targetType: DashboardTargetType,\n options?: GetCustomParamOptions\n ) => CuratedWidgetQueryParams;\n minContent?: number;\n getCollectionAppLink?: (\n appLinks: Partial<WidgetAppLinks>,\n content?: CuratedWidgetContent\n ) => Core.AppLink;\n /**\n * Predicate used to determine if the widget\n * should be displayed based on the target\n * type and settings. Useful for feature flagging widgets.\n */\n predicate?: (options: WidgetTypeIdPredicateOptions) => boolean;\n}\n\nfunction partnerProfileWidgetTypeIdPredicate(options: WidgetTypeIdPredicateOptions): boolean {\n return options.settingsHash?.hasPartnerProfiles ?? false;\n}\n\nexport const WidgetTypeIdConfig: Record<WidgetTypeId, WidgetTypeIdConfigType> = {\n [WidgetTypeId.CuratedMedia]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.PlaylistMedia]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.SeriesMedia]: {\n getCustomParams: (widgetTemplate: WidgetTemplate) => {\n switch (widgetTemplate) {\n case WidgetTemplate.ThumbnailFixedListMediaLarge:\n return { limit: 2 };\n case WidgetTemplate.ThumbnailHeroMedia:\n case WidgetTemplate.ThumbnailFeaturedMedia:\n return { limit: 1 };\n default:\n return { limit: 12 };\n }\n },\n getCollectionAppLink: (appLinks, content) => appLinks?.series?.(ArrayHelper.first(content) as Series)\n },\n [WidgetTypeId.ClassificationMedia]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.LatestReleasedVideos]: {\n getCustomParams: () => {\n return CuratedDashboardHelper.getLatestReleasedTimeRange();\n }\n },\n [WidgetTypeId.ContinueWatching]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks?.watchHistory?.()\n },\n [WidgetTypeId.CompanyLatestReleasedVideo]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.CompanyVideos]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.ClassificationLatestReleasedVideo]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.ClassificationLatestReleasedVideosV2]: {\n getCustomParams: () => {\n return {\n limit: 12\n };\n },\n minContent: 4\n },\n [WidgetTypeId.SeasonalClassificationMedia]: {\n getCustomParams: () => {\n return {\n limit: 12\n };\n },\n minContent: 4\n },\n [WidgetTypeId.CompanyClassificationVideos]: {\n getCustomParams: () => ({}),\n minContent: 4\n },\n [WidgetTypeId.TrendingClassificationsMedia]: {\n getCustomParams: () => {\n return {\n limit: 12\n };\n },\n minContent: 4\n },\n\n [WidgetTypeId.CuratedClassifications]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.TrendingClassifications]: {\n getCustomParams: () => {\n return {\n limit: 6\n };\n },\n minContent: 3\n },\n [WidgetTypeId.Classifications]: {\n getCustomParams: (template: WidgetTemplate, targetType: DashboardTargetType) => {\n if (targetType === DashboardTargetType.Discover) {\n if (template === WidgetTemplate.EditableCoverFixedPillListSmall) {\n return {\n canBePreferred: true,\n isFollowing: true\n };\n }\n\n if ([ WidgetTemplate.PosterSlidingListSmall, WidgetTemplate.CoverFixedPillListXSmall ].includes(template)) {\n return {\n canBePreferred: true\n };\n }\n }\n\n return {};\n }\n },\n [WidgetTypeId.ClassificationLatestReleasedVideos]: {\n getCustomParams: () => {\n return CuratedDashboardHelper.getLatestReleasedTimeRange();\n }\n },\n [WidgetTypeId.SpecialEventClassifications]: {\n getCustomParams: () => ({\n from: DateHelper.format(new Date(), 'YYYY-MM-DD')\n })\n },\n [WidgetTypeId.LatestReleasedClassifications]: {\n getCustomParams: () => {\n return {\n limit: 6\n };\n },\n minContent: 3\n },\n\n [WidgetTypeId.CuratedSeries]: {\n getCustomParams: () => ({})\n },\n\n [WidgetTypeId.CuratedPlaylists]: {\n getCustomParams: () => ({})\n },\n\n [WidgetTypeId.Blurb]: {\n getCustomParams: () => ({})\n },\n\n [WidgetTypeId.DynamicBlurb]: {\n getCustomParams: () => ({})\n },\n\n [WidgetTypeId.AuthorReviewer]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.Faq]: {\n getCustomParams: () => ({})\n },\n\n [WidgetTypeId.CuratedCompanies]: {\n getCustomParams: () => ({}),\n predicate: options => {\n if (options.settingsHash?.hasPartnerProfiles)\n return false;\n return true;\n }\n },\n\n [WidgetTypeId.Ratings]: {\n getCustomParams: () => ({})\n },\n\n [WidgetTypeId.Presentations]: {\n getCustomParams: () => ({})\n },\n\n [WidgetTypeId.UpcomingLivestreams]: {\n getCustomParams: () => ({\n from: DateHelper.format(new Date(), 'YYYY-MM-DD')\n })\n },\n\n [WidgetTypeId.CuratedMultimedia]: {\n getCustomParams: () => ({})\n },\n\n [WidgetTypeId.ClassificationPlaylists]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.ClassificationSeries]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.ClassificationFeaturedVideo]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.ClassificationPinnedVideos]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.ClassificationDashboardExternalMedia]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.ClassificationDashboardMedia]: {\n getCustomParams: () => ({})\n },\n\n [WidgetTypeId.SearchRelevantTopics]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchRelevantTopics],\n type: [TypeFilterOptions.Classification]\n })\n },\n [WidgetTypeId.SearchCompanies]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchCompanies],\n type: [TypeFilterOptions.Company]\n }),\n predicate: options => {\n if (options.settingsHash?.hasPartnerProfiles)\n return false;\n return true;\n }\n },\n [WidgetTypeId.SearchSeries]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchSeries],\n type: [TypeFilterOptions.Series]\n })\n },\n [WidgetTypeId.SearchPlaylists]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchPlaylists],\n type: [TypeFilterOptions.Playlist]\n })\n },\n [WidgetTypeId.SearchMyVideosFolder]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchMyVideosFolder],\n source: [SourceFilterOptions.MyVideos]\n })\n },\n [WidgetTypeId.SearchMySchoolLibraryFolder]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchMySchoolLibraryFolder],\n source: [SourceFilterOptions.School]\n })\n },\n [WidgetTypeId.SearchMyVideos]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchMyVideos],\n source: [SourceFilterOptions.MyVideos]\n })\n },\n [WidgetTypeId.SearchMySchoolLibraryVideos]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchMySchoolLibraryVideos],\n source: [SourceFilterOptions.School]\n })\n },\n [WidgetTypeId.SearchExchangeArchive]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchExchangeArchive],\n source: [SourceFilterOptions.ExchangeArchive]\n })\n },\n [WidgetTypeId.SearchClickViewLive]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchClickViewLive],\n source: [SourceFilterOptions.LiveStreams]\n }),\n predicate: options => options.settingsHash?.clickViewLive ?? false\n },\n [WidgetTypeId.SearchRelatedResults]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.SearchTopResults]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.ClassificationCurriculumMedia]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.SearchTags]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.SearchCurriculumCode]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.SearchSuggestions]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.SearchContentPartners]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchContentPartners],\n type: [TypeFilterOptions.PartnerProfile]\n }),\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.CuratedContentPartners]: {\n getCustomParams: () => ({\n limit: 12\n }),\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.ContentPartnerLatestReleasedVideos]: {\n getCustomParams: () => ({}),\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.ContentPartnerSeries]: {\n getCollectionAppLink: appLinks => {\n return appLinks?.scopedSearchHome?.({\n type: [TypeFilterOptions.Series]\n });\n },\n getCustomParams: () => ({\n limit: 12\n }),\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.ContentPartnerVideos]: {\n getCustomParams: () => ({}),\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.SpotlightContentPartners]: {\n getCustomParams: () => ({}),\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.ContentPartners]: {\n getCustomParams: (\n widgetTemplate: WidgetTemplate,\n targetType: DashboardTargetType,\n options?: GetCustomParamOptions\n ) => ({\n letterPrefix: options?.params?.letterPrefix,\n sort: options?.params?.sort\n }),\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.ContentPartnersHub]: {\n getCustomParams: (\n widgetTemplate: WidgetTemplate,\n targetType: DashboardTargetType,\n options?: GetCustomParamOptions\n ) => {\n if (targetType !== DashboardTargetType.PartnerProfileHub)\n return {};\n\n return {\n objectId: options?.params?.objectId\n };\n },\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.TrendingContentPartnersVideo]: {\n getCustomParams: () => ({}),\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.ContentPartnerAllVideos]: {\n getCustomParams: (widgetTemplate: WidgetTemplate) => {\n if (widgetTemplate === WidgetTemplate.ThumbnailFixedListSearchCta)\n return { limit: 3 };\n\n return {};\n },\n predicate: partnerProfileWidgetTypeIdPredicate\n }\n};\n","import React from 'react';\n\nexport function WarningOutlineSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n d='m13.026 4.377 8.5 14A1.2 1.2 0 0 1 20.5 20.2h-17a1.2 1.2 0 0 1-1.026-1.823l8.5-14a1.2 1.2 0 0 1 2.052 0M12 5 3.5 19h17zm0 13a1 1 0 1 1 0-2 1 1 0 0 1 0 2m.75-3.677a.69.69 0 0 1-.7.677.69.69 0 0 1-.7-.677V8.677c0-.374.313-.677.7-.677s.7.303.7.677z'\n fill='currentColor'\n />\n </svg>\n );\n}\n","export enum WidgetStatus {\n Draft = 0,\n Published = 1,\n Archived = 2\n}\n\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { WidgetStatus } from 'libs/shared/enums/WidgetStatus';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { Breakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { BaseWidget, CuratedDashboardAppLink, CuratedWidget, CuratedWidgetContent, Playlist, Presentation, Series, Video, VideoTypes, VideoWidgetTemplateContent, WidgetMetadata, WidgetPreference } from 'libs/shared/interfaces';\n\nimport { AnyWidgetTemplateProps } from '../components/widgets/curated-widgets/WidgetProps';\nimport { WidgetTypeIdConfig } from '../constants/WidgetTypeIdConfig';\nimport { MasterType } from '../enums/MasterType';\n\nimport { MasterTypeHelper } from './MasterTypeHelper';\n\nenum WidgetStatusString {\n Draft = 'Draft',\n Published = 'Published',\n Archived = 'Archived'\n}\n\nexport const WidgetHelper = {\n /**\n * Used by both the FixedWidget and DynamicWidget\n */\n getSliderAnalyticsOptions: (): AnalyticsOptions => ({\n actionType: UserAction.Click,\n location: LocationContext.SlidingList,\n entity: EntityType.Widget,\n descriptor: ClickDescriptor.Slide\n }),\n\n /**\n * Used by both the FixedWidget and DynamicWidget\n */\n getSliderItemAnalyticsOptions: (): AnalyticsOptions => ({\n location: LocationContext.SlidingListItem\n }),\n\n getSliderHeadingAnalyticsOptions: (): AnalyticsOptions => ({\n actionType: UserAction.Click,\n location: LocationContext.SlidingList,\n entity: EntityType.Widget,\n descriptor: ClickDescriptor.Title\n }),\n\n useGetContent(\n content: CuratedWidgetContent,\n widgetTypeId: WidgetTypeId,\n isPreviewing: boolean,\n preferences: WidgetPreference[],\n removedItemIds: string[]\n ): { content: CuratedWidgetContent, unfilteredContent: CuratedWidgetContent } {\n return React.useMemo(() => {\n if (!content)\n return { content: null, unfilteredContent: null };\n\n if (!Array.isArray(content))\n return { content, unfilteredContent: content };\n\n const preferencesHash = preferences?.reduce((acc: HashObject, current) => {\n acc[current.id] = current;\n return acc;\n }, {}) ?? {};\n\n const removedItemIdsHash = removedItemIds.reduce((acc: HashObject, current) => {\n acc[current] = true;\n return acc;\n }, {});\n\n const contentCopy = [...content];\n \n const sortedContent = contentCopy.sort((a, b) => {\n if (!('id' in a) || !('id' in b))\n return 0;\n\n const aIndex = preferencesHash[a.id]?.index ?? contentCopy.findIndex(c => 'id' in c && c.id === a.id);\n const bIndex = preferencesHash[b.id]?.index ?? contentCopy.findIndex(c => 'id' in c && c.id === b.id);\n\n if (aIndex < bIndex)\n return -1;\n\n if (aIndex > bIndex)\n return 1;\n\n return 0;\n });\n\n if (WidgetHelper.isBelowContentMinimum(sortedContent, widgetTypeId) && !isPreviewing) {\n return {\n content: [],\n unfilteredContent: sortedContent\n };\n }\n\n const filteredContent = sortedContent.filter(item => {\n if (preferencesHash['id' in item && item.id]?.hidden)\n return false;\n\n if (removedItemIdsHash['id' in item && item.id])\n return false;\n\n return true;\n });\n\n return {\n content: filteredContent,\n unfilteredContent: sortedContent\n };\n }, [ content, preferences ]);\n },\n\n isBelowContentMinimum(content: CuratedWidgetContent, widgetTypeId: WidgetTypeId): boolean {\n const minContent = WidgetTypeIdConfig[widgetTypeId]?.minContent || 0;\n return content?.length < minContent;\n },\n\n getCustomAppLink(props: AnyWidgetTemplateProps): Core.AppLink | null {\n if (\n !('metadata' in props) ||\n !('appLinks' in props) ||\n !('appLink' in props.metadata)\n ) {\n return null;\n }\n\n if (props.metadata?.appLink === CuratedDashboardAppLink.LatestReleases && 'latestReleases' in props.appLinks)\n return props.appLinks?.latestReleases?.();\n\n if (props.metadata?.appLink === CuratedDashboardAppLink.ExploreAllTopics && 'allTopics' in props.appLinks && 'presentation' in props)\n return props.appLinks?.allTopics?.(props.presentation.id);\n\n return null;\n },\n\n getWidgetStatus(widget: CuratedWidget): WidgetStatus {\n let status = widget.status;\n\n if (typeof (status) === 'string') {\n switch (status) {\n case WidgetStatusString.Archived:\n status = WidgetStatus.Archived;\n break;\n case WidgetStatusString.Published:\n status = WidgetStatus.Published;\n break;\n case WidgetStatusString.Draft:\n status = WidgetStatus.Draft;\n break;\n }\n }\n\n return status;\n },\n\n formatResponseData(widget: CuratedWidget, presentation?: Presentation): CuratedWidget {\n const content = widget.content;\n\n if (!content)\n return widget;\n\n if ('author' in content) {\n widget.content = [content] as CuratedWidgetContent;\n return widget;\n }\n\n if ('data' in content)\n widget.content = content.data as CuratedWidgetContent;\n else if (!Array.isArray(content))\n widget.content = [content]; // Handle `classification_featured_video` widgets, which don't return content as an array\n\n switch (widget.widgetId) {\n case WidgetTypeId.ClassificationSeries:\n widget.content = widget.content.filter((c): c is Series => 'tallPoster' in c && !!c.tallPoster?.id);\n break;\n case WidgetTypeId.ClassificationPlaylists:\n widget.content = widget.content.filter((c): c is Playlist => 'cover' in c && !!c.cover?.id);\n break;\n case WidgetTypeId.ContinueWatching:\n widget.content = widget.content.map(c => 'object' in c && c.object);\n default:\n break;\n case WidgetTypeId.Presentations:\n widget.content = widget.content.filter((c): c is Presentation => 'id' in c && c.id.toString() !== presentation?.id?.toString());\n break;\n }\n\n return widget;\n },\n \n isWidgetInTableOfContents(metadata: Partial<WidgetMetadata>): boolean {\n return !!metadata?.showInTableOfContents;\n },\n\n /**\n * Widget container view won't render a widget with no content typically,\n * but some widgets (such as blurbs) have no content, but should render anyway.\n */\n hasNoContent(widgetTypeId: WidgetTypeId): boolean {\n if (widgetTypeId === WidgetTypeId.Blurb)\n return true;\n\n return false;\n },\n\n /**\n * If any widgets should be hidden on smaller screen sizes, add them here.\n * If this needs to be more flexible at some point, it should be added to\n * the widget settings and metadata object.\n */\n canDisplayOnScreenSize(\n breakpoints: Breakpoints,\n widgetTypeId: WidgetTypeId,\n widgetTemplate: WidgetTemplate\n ): boolean {\n if (widgetTypeId === WidgetTypeId.Blurb && widgetTemplate === WidgetTemplate.HeroBannerSmall)\n return !breakpoints.xs && !breakpoints.sm;\n\n return true;\n },\n\n isCompanyWidget(widgetTypeId: WidgetTypeId): boolean {\n switch (widgetTypeId) {\n case WidgetTypeId.CompanyLatestReleasedVideo:\n case WidgetTypeId.CompanyVideos:\n case WidgetTypeId.UpcomingLivestreams:\n return true;\n default:\n return false;\n }\n },\n\n getVideoContent(content: VideoWidgetTemplateContent): VideoTypes[] {\n const firstItem = ArrayHelper.first<Video | Series>(content);\n\n if (MasterTypeHelper.isType<Series>(firstItem, MasterType.Series))\n return firstItem.videos.data;\n\n return content as VideoTypes[];\n },\n\n showRemoveButton(widgetTypeId: WidgetTypeId): boolean {\n return widgetTypeId === WidgetTypeId.ContinueWatching;\n },\n\n /**\n * Paginated data returns more widgets so if we dont merge the widget content by widget type id,\n * it would add another widget to the page rather than appending content to the relevant\n * search result index\n * \n * For example:\n * Say we receive these widgets for a query:\n * - topics widget\n * - related results widget\n * \n * If a user scrolls down to the end of page we fetch more items from the last widget\n * which in this case is 'related results widget'. \n * Now our overall response looks like this\n * - topics widget\n * - related results widget\n * - related results widget\n * \n * Since this is a new widget item entry it will be rendered as a new widget with seprate headings etc.\n * In this case we want to combine these two widgets data into one so its looks like this again:\n * - topics widget\n * - related results widget (data is combined)\n * \n * But what if widget we get recieve has a different widget template id. This currently happens for\n * the 'series widget' - series widget can have the tall poster template or the thumbnail like template.\n * \n * so to visualize this it can be like:\n * - topics widget\n * - top results widget\n * - series widget (template: tall poster)\n * - series widget (template: thumbnail)\n * \n * Since they technically will look different based on the template id we will not merge the data in this case.\n * It will merge the data to the same widget as long as the combination of widget Id + template Id is the same.\n * \n * Since they are separate widgets they will render duplicate headings - we handle this in css instead which\n * checks for adjacent siblings and if its the same widget - it hides the widget heading so it will look\n * like its a single widget rather than separate widgets.\n * \n * - Nish\n */\n mergeWidgets<T extends BaseWidget>(\n items: T[],\n mergeContent: (target: T, source: T) => void\n ): T[] {\n const widgets = ObjectHelper.deepClone(items);\n const groupedWidgets = ArrayHelper.groupBy(widgets, 'widgetId');\n const mergedWidgets: T[] = [];\n\n for (const widgetGroup of Object.values(groupedWidgets)) {\n let currentMergedWidget: T | null = null;\n const groupMergedWidgets: T[] = [];\n\n for (const widget of widgetGroup) {\n if (!currentMergedWidget) {\n currentMergedWidget = widget;\n continue;\n }\n\n if (widget.templateId !== currentMergedWidget.templateId) {\n groupMergedWidgets.push(currentMergedWidget);\n currentMergedWidget = widget;\n continue;\n }\n\n mergeContent(currentMergedWidget, widget);\n }\n\n if (currentMergedWidget) {\n groupMergedWidgets.push(currentMergedWidget);\n }\n mergedWidgets.push(...groupMergedWidgets);\n }\n\n return mergedWidgets;\n }\n};\n",":local {\n .widgetTextButton {\n margin-top: 0.1rem;\n flex-shrink: 0;\n }\n}","import React from 'react';\nimport { Spinner } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor, LocationContext } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { WidgetTypeIdConfig } from 'libs/shared/constants/WidgetTypeIdConfig';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { WarningOutlineSvg } from 'libs/shared/images/svg/status/WarningOutlineSvg';\nimport { WidgetHelper } from 'libs/shared/utils/WidgetHelper';\n\nimport styles from './widget-header.module.scss';\n\nconst namespace = 'shared.widgetHeader';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface WidgetHeaderProps {\n name: string;\n description?: string | JSX.Element;\n isPreviewing?: boolean;\n content?: any[];\n widgetTypeId?: WidgetTypeId;\n badgeComponent?: JSX.Element;\n\n appLink?: Core.AppLink;\n onAppLinkClick?: () => void;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n \n showSeeMoreLink?: boolean;\n onClose?: () => void;\n onFollow?: (shouldFollow: boolean) => void;\n isFollowing?: boolean;\n showFollowSpinner?: boolean;\n}\n\nfunction SeeMore(props: WidgetHeaderProps) {\n if (!Core.AppLinkHelper.getHref(props.appLink))\n return null;\n\n return (\n <div className={`ms-3 ${styles.widgetTextButton}`}>\n <AppLink\n appLink={props.appLink}\n analyticsData={props.analyticsData }\n analyticsOptions={{\n location: LocationContext.SlidingList,\n ...props.analyticsOptions,\n descriptor: ClickDescriptor.SeeMore\n }}\n className={`text-decoration-none ${props.appLink ? 'curated-widget-link' : ''}`}\n >\n <p className='hover-text-underline text-dark curated-widget-heading'>{getPhrase('seeAll')}</p>\n </AppLink>\n </div>\n );\n}\n\nfunction CloseWidgetButton(props: { onClose: () => void }) {\n return (\n <div className={`ms-3 ${styles.widgetTextButton} text-decoration-none cursor-pointer`} onClick={props.onClose}>\n <p className='hover-text-underline text-dark curated-widget-heading'>{getPhrase('hide')}</p>\n </div>\n );\n}\n\nfunction FollowWidgetButton(props: {\n isFollowing: boolean,\n onFollow: (shouldFollow: boolean) => void,\n showFollowSpinner: boolean\n}) {\n return (\n <div className={`ms-3 ${styles.widgetTextButton} text-decoration-none`}>\n {\n props.showFollowSpinner ?\n <Spinner as='span' animation='border' role='status' size='sm' /> :\n <p className='hover-text-underline text-dark curated-widget-heading cursor-pointer' onClick={() => props.onFollow(!props.isFollowing)}>\n {getPhrase(props.isFollowing ? 'unfollow' : 'follow')}\n </p>\n }\n </div>\n );\n}\n\nexport function WidgetHeader(props: WidgetHeaderProps): JSX.Element {\n const hasDescription = !!props.description;\n\n if (!props.name && !props.description)\n return <></>;\n\n const isBelowMinimum = WidgetHelper.isBelowContentMinimum(props.content, props.widgetTypeId);\n const minContent = WidgetTypeIdConfig[props.widgetTypeId]?.minContent ?? 0;\n\n return (\n <div className='curated-widget-header'>\n <div className='d-flex justify-content-between'>\n {!!props.name && (\n <div className='d-flex align-items-center'>\n <AppLink\n appLink={props.appLink}\n analyticsData={props.analyticsData}\n className={`text-decoration-none ${props.appLink ? 'curated-widget-link text-reset' : ''}`}\n onClick={props.onAppLinkClick}\n >\n <h2 className='h4 curated-widget-heading'>\n {props.isPreviewing && isBelowMinimum && (\n <SvgContainer\n svg={WarningOutlineSvg}\n title={`Widget is below the minimum content threshold of ${minContent} and won't be displayed.`}\n tooltipSpanHack\n tooltipSpanHackClassName='d-inline text-danger me-1'\n />\n )}\n {props.name}\n </h2>\n </AppLink>\n {!!React.isValidElement(props.badgeComponent) && props.badgeComponent}\n </div>\n )}\n <div className='d-flex justify-content-between align-items-center gap-2'>\n {!!props.appLink && !hasDescription && !!props.showSeeMoreLink && <SeeMore {...props}/>}\n {FunctionHelper.isFunction(props.onFollow) &&\n <FollowWidgetButton\n isFollowing={props.isFollowing}\n onFollow={props.onFollow}\n showFollowSpinner={props.showFollowSpinner}\n />\n }\n {FunctionHelper.isFunction(props.onClose) && <CloseWidgetButton onClose={props.onClose}/>}\n </div>\n </div>\n \n {hasDescription && (\n <div className='d-flex justify-content-between align-items-end'>\n <p className='description curated-widget-description'>\n <span>{props.description}</span>\n </p>\n {!!props.appLink && !!props.showSeeMoreLink && <SeeMore {...props}/> }\n </div>\n )}\n </div>\n );\n}\n","export enum TagType {\n Normal = 'normal',\n Pedagogy = 'pedagogy',\n Hidden = 'hidden',\n Skill = 'skill',\n Curation = 'curation'\n}\n\n/**\n * This should **only** be used to create new tags in master (as it only accepts enum values).\n * Use the string enum above for all other cases.\n */\nexport enum TagTypeNumber {\n Normal = 0,\n Pedagogy = 1,\n Hidden = 2,\n Skill = 3,\n Curation = 4\n}\n",":local {\n $badge-base-height: 1.5rem;\n\n .tagList {\n display: flex;\n flex-wrap: wrap;\n }\n\n .badgeBase {\n height: $badge-base-height;\n }\n \n .disabled {\n background-color: $gray-200;\n color: $gray-500;\n\n &:hover {\n background-color: $gray-200;\n color: $gray-500;\n }\n }\n\n .partialTag {\n width: 5rem;\n }\n\n .removeBadge {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n\n .removeBadgeText {\n line-height: $badge-base-height;\n }\n \n .close {\n opacity: 1;\n background-size: 0.625rem;\n\n &:not(:disabled):hover {\n opacity: 1;\n }\n }\n}","import 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 { TagType } from 'libs/shared/enums/TagType';\nimport { Tag, ThemeColours } from 'libs/shared/interfaces';\n\nimport { DivButton } from '../div-button/DivButton';\n\nimport styles from './tags.module.scss';\n\nconst namespace = 'shared.tags';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface TagItemProps {\n tag: Tag;\n themeColours?: ThemeColours;\n appLink?: Core.AppLink;\n onClick?: () => void;\n onRemove?: () => void;\n disabled?: boolean;\n tagClass?: string;\n}\n\nfunction getTagTypeClass(tagType: TagType, hasThemeColour: boolean): string {\n switch (tagType) {\n case TagType.Pedagogy:\n case TagType.Skill:\n return 'pedagogy-tag text-white';\n\n case TagType.Hidden:\n return 'hidden-tag fw-normal';\n\n case TagType.Normal:\n if (!hasThemeColour)\n return 'bg-gray-100 fw-normal';\n return '';\n\n default:\n return '';\n }\n}\n\nexport function TagItem(props: TagItemProps): JSX.Element {\n const { tag, appLink, onClick, disabled, tagClass = 'tag' } = props;\n\n const name = tag.name.toLowerCase();\n const tagType = tag.tagType?.toLowerCase() as TagType;\n\n const hasThemeColour = (tagType === TagType.Normal && props.themeColours) && !!props.themeColours?.secondary;\n let classNames = `${styles.badgeBase} rounded-pill py-1 px-2 my-1 me-1 ${tagClass} ${getTagTypeClass(tagType, hasThemeColour)}`;\n let textContainerClass = `text-truncate text-nowrap`;\n\n if (hasThemeColour)\n classNames += ' text-white';\n\n if ((appLink || onClick) && !disabled)\n classNames += ' cursor-pointer';\n\n if (disabled)\n classNames += ' ' + styles.disabled;\n\n if (props.onRemove) {\n classNames += ' ' + styles.removeBadge;\n textContainerClass += ' ' + `${styles.removeBadgeText} d-inline-flex align-items-center lh-1`;\n }\n if (!appLink)\n classNames += ' d-inline-block';\n\n const style: React.CSSProperties = hasThemeColour ?\n { backgroundColor: props.themeColours.secondary } :\n {};\n\n if (appLink) {\n return (\n <AppLink\n onClick={onClick}\n appLink={appLink}\n className={classNames}\n title={name}\n style={style}\n >\n <span className={textContainerClass}>{name}</span>\n </AppLink>\n );\n }\n\n return (\n <button\n onClick={onClick}\n className={classNames}\n title={name}\n style={style}\n aria-label={`${getPhrase('ariaFilter')} ${name}`}\n >\n <span className={textContainerClass}>\n {name}\n {props.onRemove &&\n <DivButton\n onClick={props.onRemove}\n className={`${styles.close} btn-close font-size-normal`}\n role='button'\n aria-label='Close'\n />\n }\n </span>\n </button>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CHQN7xOX.chunk.js","names":[],"sources":["../../../../libs/shared/src/interfaces/models/curated-widget/CuratedWidget.ts","../../../../libs/shared/src/apps/search/interfaces/SearchTypes.ts","../../../../libs/shared/src/apps/search/interfaces/SearchFilter.ts","../../../../libs/shared/src/enums/WidgetTemplate.ts","../../../../libs/shared/src/enums/WidgetTypeId.ts","../../../../libs/shared/src/utils/DashboardHelper.ts","../../../../libs/shared/src/constants/WidgetTypeIdConfig.ts","../../../../libs/shared/src/images/svg/status/WarningOutlineSvg.tsx","../../../../libs/shared/src/enums/WidgetStatus.ts","../../../../libs/shared/src/utils/WidgetHelper.ts","../../../../libs/shared/src/components/widgets/curated-widgets/components/header/widget-header.module.scss","../../../../libs/shared/src/components/widgets/curated-widgets/components/header/WidgetHeader.tsx","../../../../libs/shared/src/enums/TagType.ts","../../../../libs/shared/src/components/tags/tags.module.scss","../../../../libs/shared/src/components/tags/TagItem.tsx"],"sourcesContent":["import { HashObject } from 'libs/common/react/interfaces';\n\nimport { AllWidgetTemplateProps } from 'libs/shared/components/widgets/curated-widgets/WidgetProps';\nimport { ButtonIcon } from 'libs/shared/constants/WidgetThemingConstants';\nimport { WidgetStatus } from 'libs/shared/enums/WidgetStatus';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { CuratedObjectsWidgetData, CuratedWidgetContent, CuratedWidgetData } from 'libs/shared/interfaces';\n\nexport enum CuratedDashboardAppLink {\n LatestReleases = 'latest-releases',\n ExploreAllTopics = 'explore-all-topics',\n ClassificationLatestReleases = 'classification-latest-releases',\n ClassificationDirectory = 'classification-directory'\n}\n\nexport enum CuratedWidgetCtaAppLink {\n TopicDirectory = 'topic-directory',\n TopicNewReleases = 'topic-new-releases',\n CuratedTopic = 'curated-topic'\n}\n\nexport interface BaseWidget<TContent extends HashObject = HashObject> {\n index: number;\n templateId: WidgetTemplate;\n widgetId: WidgetTypeId;\n name: string;\n description?: string;\n content?: TContent;\n}\n\nexport interface WidgetCta {\n text?: string;\n href?: string;\n icon?: ButtonIcon;\n appLink?: CuratedWidgetCtaAppLink;\n}\n\nexport type WidgetMetadata = AllWidgetTemplateProps['metadata'] & {\n showInTableOfContents: boolean,\n tocIndentation: number,\n headingOptional: boolean,\n aiAddedVideo: boolean\n};\n\nexport interface WidgetPreference {\n id: string;\n index?: number;\n hidden?: boolean;\n}\n\nexport interface CuratedWidget<\n TData extends CuratedWidgetData = CuratedWidgetData,\n TContent extends CuratedWidgetContent = CuratedWidgetContent\n> extends BaseWidget<TContent> {\n id: string;\n dashboardId: string;\n data: TData;\n status: WidgetStatus;\n metadata?: Partial<WidgetMetadata>;\n preferences?: WidgetPreference[];\n cursor?: string;\n\n // If a widget has curriculum IDs set, then it won't be accessible to anyone who doesn't have one of those curriculums\n curriculumIds?: string[];\n}\n\nexport type CuratedMediaWidget<\n TContent extends CuratedWidgetContent = CuratedWidgetContent\n> = CuratedWidget<CuratedObjectsWidgetData, TContent>;\n","import { ObjectHash } from 'backbone';\nimport Bloodhound from 'bloodhound';\n\nimport { SearchIndices } from 'libs/shared/apps/search/interfaces';\n\nexport interface RemoteSearch<T> extends Bloodhound.BloodhoundOptions<T> {\n remote: Bloodhound.RemoteOptions<T>;\n}\n\nexport interface LocalSearch<T> extends Bloodhound.BloodhoundOptions<T> {\n local: T[] | (() => T[]);\n}\n\nexport type TypeaheadDataSource<T> = Bloodhound<T> |\n((query: string, syncResults: (result: T[]) => void, asyncResults?: (result: T[]) => void) => void);\n\nexport interface InstantSearchBloodhound<T> {\n bloodhound: TypeaheadDataSource<T>;\n name: string;\n}\n\nexport type TypeaheadConfig<T> = Twitter.Typeahead.Dataset<T>;\n\nexport interface TypeaheadConfigHandler<T> {\n (source?: InstantSearchBloodhound<T>, index?: number, options?: ObjectHash): Twitter.Typeahead.Dataset<T>;\n}\n\nexport interface BloodhoundConfigHandler<T> {\n (source: string, options?: ObjectHash): LocalSearch<T> | RemoteSearch<T>;\n}\n\nexport interface TypeaheadSourceItem<T> {\n name: string;\n typeaheadConfig: TypeaheadConfigHandler<T>;\n bloodhoundConfig?: BloodhoundConfigHandler<T>;\n options?: ObjectHash;\n}\n\nexport const AllSearchIndicesVideoStyle: SearchIndices[] = [ 'video', 'clip', 'interactive' ];\nexport const AllSearchIndicesInSearch: SearchIndices[] = [ 'playlist', 'series', 'clip', 'classification', 'interactive', 'video', 'company', 'category', 'partner_profile' ];\nexport const AllSearchIndicesInUserManager: SearchIndices[] = ['user'];\n","import { SvgIcon } from 'libs/shared/utils/SvgHelper';\n\nimport { FilterStateHash } from '../reducers';\n\nimport { FilterProps } from './FilterProps';\nimport { SearchIndices } from './SearchResults';\n\nconst FilterIdNames =\n [\n 'sort', // \"sort\" isn't even a filter but it tends to go with our filters in our designs\n 'classification',\n 'presentation',\n 'audience',\n 'yearGroup',\n 'moviesAndTv',\n 'type',\n 'rating',\n 'interactives',\n 'clips',\n 'classroom',\n 'hasResources',\n 'hasSubtitles',\n 'productionYear',\n 'isHd',\n 'producedByClickView',\n 'duration',\n 'tagOrClassification',\n 'status',\n 'isAdmin',\n 'bulkActionType',\n 'userType',\n 'filter',\n 'channel',\n 'dateBroadcast',\n 'categoryId',\n 'hasInteractives',\n 'jobStatus',\n 'source',\n 'customerStatus',\n 'specialEventType',\n 'customerType',\n 'seriesId',\n 'scopeId'\n ] as const;\n\n/**\n * Any filters that shouldn't be sent to the backend as a filter\n * and are instead handled differently by the frontend\n */\nconst FilterBlacklist: Partial<Record<FilterIds, boolean>> = {\n type: true\n};\n\nexport type FilterIds = typeof FilterIdNames[number];\n\nexport const FilterWhitelist = FilterIdNames.reduce((acc, prev) => {\n return {\n ...acc,\n [prev]: !FilterBlacklist[prev]\n };\n}, {} as Record<FilterIds, boolean>);\n\nexport type FilterType = 'radio' | 'checkbox' | 'nested-checkbox' | 'grouped-checkbox' | 'switch' | 'more-filters' | 'rating' | 'dropdown' | 'tag' | 'button';\n\nexport interface SearchFilter<TFilterOptionId = string> {\n id: FilterIds;\n type: FilterType;\n compatibleIndices: SearchIndices[];\n\n name?: string;\n icon?: SvgIcon;\n description?: string;\n options?: FilterOption<TFilterOptionId>[];\n labelPrefix?: string;\n\n // For second layer options, for example 'presentation' checkbox filter has 'audience' as second layer option\n secondaryId?: FilterIds;\n\n customComponent?: (props: FilterProps) => JSX.Element;\n disabled?: boolean;\n disableOptions?: (options: FilterOption[], filters: SearchFilter[], state: FilterStateHash) => FilterOption[];\n}\n\nexport interface MoreFilters extends Omit<SearchFilter, 'id' | 'compatibleIndices'> {\n filters: SearchFilter[];\n id: string;\n}\n\nexport interface FilterOption<TId = string> {\n id: TId;\n name: string;\n default?: boolean;\n disabled?: boolean;\n secondLayerSelection?: FilterOption[];\n secondLayerOptions?: FilterOption[];\n group?: string;\n}\n\nexport type ProductionYearFilterOptions =\n 'any-year' |\n 'this-year' |\n 'last-3-years' |\n 'last-5-years';\n\nexport type DurationFilterOptions =\n 'bite-sized' |\n 'short' |\n 'medium' |\n 'long';\n\nexport enum SourceFilterOptions {\n MyVideos = 'my-videos',\n School = 'school',\n ExchangeArchive = 'exchange-archive',\n ClickView = 'clickview',\n LiveStreams = 'livestreams'\n}\n\nexport enum TypeFilterOptions {\n Video = 'video',\n Series = 'series',\n Playlist = 'playlist',\n Classification = 'classification',\n Clip = 'clip',\n Interactive = 'interactive',\n Company = 'company',\n Category = 'category',\n PartnerProfile = 'partner_profile'\n}\n","export enum WidgetTemplate {\n // Videos\n ThumbnailHeroMedia = 'thumbnail_hero_media',\n ThumbnailFeaturedMedia = 'thumbnail_featured_media',\n ThumbnailSlidingListSmall = 'thumbnail_sliding_list_small',\n ThumbnailSlidingListSmallV2 = 'thumbnail_sliding_list_small_v2',\n ThumbnailSlidingListLarge = 'thumbnail_sliding_list_large',\n ThumbnailFixedListMediaSmall = 'thumbnail_fixed_list_media_small',\n ThumbnailFixedListMediaLarge = 'thumbnail_fixed_list_media_large',\n ThumbnailFixedListFolderSmall = 'thumbnail_fixed_list_folder_small',\n ThumbnailVerticalList = 'thumbnail_vertical_list',\n PopoutThumbnailSlidingListLarge = 'popout_thumbnail_sliding_list_large',\n PopoutThumbnailSlidingListSmall = 'popout_thumbnail_sliding_list_small',\n FeaturedThumbnailSlidingList = 'featured_thumbnail_sliding_list',\n ThumbnailFixedListXLarge = 'thumbnail_fixed_list_xlarge',\n\n // Topics\n CoverSlidingPillListSmall = 'cover_sliding_pill_list_small',\n CoverFixedPillListLarge = 'cover_fixed_pill_list_large',\n StatsCoverFixedPillListLarge = 'stats_cover_fixed_pill_list_large',\n CoverFixedPillListXSmall = 'cover_fixed_pill_list_xsmall',\n ThumbnailFixedListLarge = 'thumbnail_fixed_list_large',\n ThumbnailFixedListSmall = 'thumbnail_fixed_list_small',\n EditableCoverFixedPillListSmall = 'editable_cover_fixed_pill_list_small',\n HeroBanner = 'hero_banner',\n HeroThumbnailSmall = 'hero_thumbnail_small',\n HeroBlockColourSmall = 'hero_block_colour_small',\n\n // Curriculum\n CurriculumResourcesAccordion = 'curriculum_resources_accordion',\n CurriculumCodeSearchResults = 'curriculum_code_search_results',\n\n // Playlists\n CoverFixedTileList = 'cover_fixed_tile_list',\n\n // Topics & Series\n PosterSlidingListLarge = 'poster_sliding_list_large',\n PosterSlidingListMedium = 'poster_sliding_list_medium',\n PosterSlidingListSmall = 'poster_sliding_list_small',\n PosterFixedListLarge = 'poster_fixed_list_large',\n\n // Blurbs & Topics\n HeroBannerSmall = 'hero_banner_small',\n\n // Text-based blurbs\n Heading = 'heading',\n AuthorReviewer = 'author_reviewer',\n Question = 'question',\n QuestionAccordion = 'question_accordion',\n\n // Companies / Studios / Content Partners\n CircleLogoSlidingList = 'circle_logo_sliding_list',\n RectangularLogoSlidingList = 'rectangular_logo_sliding_list',\n RectangularLogoFixedList = 'rectangular_logo_fixed_list',\n ThumbnailFixedListSearchCta = 'thumbnail_fixed_list_search_cta',\n InfiniteThumbnailVerticalList = 'infinite_thumbnail_vertical_list',\n\n // Rating filters\n FilterSlidingPillListSmall = 'filter_sliding_pill_list_small',\n\n // Special events\n EventIconSlidingList = 'event_icon_sliding_list',\n\n // Tags filter\n TagSlidingList = 'tag_sliding_list',\n\n SearchSuggestionsBlurb = 'search_suggestions_blurb'\n}\n","export enum WidgetTypeId {\n // Video group\n CuratedMedia = 'curated_media',\n PlaylistMedia = 'playlist_media',\n SeriesMedia = 'series_media',\n ClassificationMedia = 'classification_media',\n LatestReleasedVideos = 'latest_released_videos',\n ContinueWatching = 'continue_watching_videos',\n CompanyLatestReleasedVideo = 'company_latest_released_video',\n CompanyVideos = 'company_videos',\n ClassificationLatestReleasedVideo = 'classification_latest_released_video',\n ClassificationLatestReleasedVideosV2 = 'classification_latest_released_videos_v2',\n CompanyClassificationVideos = 'company_classification_videos',\n ClassificationDashboardMedia = 'classification_dashboard_media',\n ClassificationDashboardExternalMedia = 'classification_dashboard_external_media',\n SeasonalClassificationMedia = 'seasonal_classification_media',\n TrendingClassificationsMedia = 'trending_classifications_media',\n ClassificationCurriculumMedia = 'classification_curriculum_media',\n\n // Topics group\n CuratedClassifications = 'curated_classifications',\n Classifications = 'classifications',\n ClassificationLatestReleasedVideos = 'classification_latest_released_videos',\n SpecialEventClassifications = 'special_event_classifications',\n LatestReleasedClassifications = 'latest_released_classifications',\n TrendingClassifications = 'trending_classifications',\n\n // Series group\n CuratedSeries = 'curated_series',\n\n // Playlists group\n CuratedPlaylists = 'curated_playlists',\n\n // Blurb group\n Blurb = 'blurb',\n DynamicBlurb = 'dynamic_blurb',\n AuthorReviewer = 'author_reviewer',\n Faq = 'faq',\n\n // Network group\n CuratedCompanies = 'curated_companies',\n\n // Partner Profile group\n CuratedContentPartners = 'curated_content_partners',\n ContentPartnerLatestReleasedVideos = 'content_partner_latest_released_videos',\n ContentPartnerSeries = 'content_partner_series',\n ContentPartnerVideos = 'content_partner_videos',\n SpotlightContentPartners = 'spotlight_curated_content_partners',\n ContentPartners = 'content_partners',\n ContentPartnersHub = 'content_partners_hub',\n TrendingContentPartnersVideo = 'content_partner_trending_videos',\n ContentPartnerAllVideos = 'content_partner_all_videos',\n\n // Search filter group\n Ratings = 'ratings',\n\n // Presentations group\n Presentations = 'presentations',\n\n // Livestreams group\n UpcomingLivestreams = 'upcoming_livestreams',\n\n // Multimedia group\n CuratedMultimedia = 'curated_multimedia',\n\n // Legacy widget types\n ClassificationPlaylists = 'classification_playlists',\n ClassificationSeries = 'classification_series',\n ClassificationFeaturedVideo = 'classification_featured_video',\n ClassificationPinnedVideos = 'classification_pinned_videos',\n\n // Search widget types\n SearchRelevantTopics = 'search_relevant_topics',\n SearchCompanies = 'search_companies',\n SearchTopResults = 'search_top_results',\n SearchSeries = 'search_series',\n SearchPlaylists = 'search_playlists',\n SearchMyVideosFolder = 'search_my_videos_folders',\n SearchMySchoolLibraryFolder = 'search_my_school_library_folders',\n SearchMyVideos = 'search_my_videos',\n SearchMySchoolLibraryVideos = 'search_my_school_library_videos',\n SearchExchangeArchive = 'search_exchange_archive',\n SearchClickViewLive = 'search_clickview_live',\n SearchRelatedResults = 'search_related_results',\n SearchTags = 'search_tags',\n SearchCurriculumCode = 'search_curriculum_code',\n SearchSuggestions = 'search_suggestions',\n SearchContentPartners = 'search_content_partners'\n}\n","import { FormikContextType } from 'formik';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { SearchResultObjectTypes } from 'libs/shared/apps/search/interfaces';\nimport { GetCustomParamOptions, WidgetTypeIdConfig } from 'libs/shared/constants/WidgetTypeIdConfig';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { OnlineUserRole } from 'libs/shared/enums/UserRole';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { SettingsHash } from 'libs/shared/hooks/useSettings';\nimport { BaseObject, ClassificationCurriculumInfo, ClassificationDashboardInfo, ClassificationDirectoryInfo, CuratedDashboard, CuratedMediaWidget, CuratedWidget, CuratedWidgetQueryParams, DashboardTargetInfo, DashboardTargetType, PartnerProfileDashboardInfo, UnknownDashboardTargetInfo } from 'libs/shared/interfaces';\n\ninterface LatestReleasesTimeRange {\n from: string;\n to: string;\n}\n\nexport const DashboardHelper = {\n\n /**\n * Same implementation as GetUserGroup() in Online.\n * @param userRole \n */\n getUserGroup(userRole: OnlineUserRole): UserGroup {\n if (userRole === OnlineUserRole.Student)\n return UserGroup.Learner;\n\n return UserGroup.Staff;\n }\n};\n\nexport const CuratedDashboardHelper = {\n onSelectCuratedObject(\n selectedObj: SearchResultObjectTypes | BaseObject,\n formikProps: FormikContextType<CuratedMediaWidget<BaseObject[]>>\n ) {\n const data = {\n ...formikProps.values.data,\n objectIds: ArrayHelper.addOrRemoveImmutable(formikProps.values.data.objectIds || [], selectedObj.id)\n };\n \n formikProps.setFieldValue('data', data);\n \n formikProps.setTouched({\n ...formikProps.touched,\n data: {\n objectIds: true\n }\n });\n },\n\n onRemoveCuratedObject(\n objectId: string,\n formikProps: FormikContextType<CuratedMediaWidget<BaseObject[]>>\n ) {\n const newData = {\n ...formikProps.values.data,\n objectIds: formikProps.values.data.objectIds.filter(id => id !== objectId)\n };\n\n formikProps.setFieldValue('data', newData);\n },\n\n getDashboardTarget(info: DashboardTargetInfo): string {\n if (info.targetType === DashboardTargetType.Discover)\n return `discover:presentation:${info.presentationId}`;\n\n if (info.targetType === DashboardTargetType.Classification)\n return `classification:${info.classificationId}`;\n\n if (info.targetType === DashboardTargetType.ClassificationDirectory)\n return `classification:${info.classificationId}:directory`;\n\n if (info.targetType === DashboardTargetType.ClassificationCurriculum)\n return `classification:${info.classificationId}:curriculum`;\n\n if (info.targetType === DashboardTargetType.MoviesAndTv)\n return `moviesAndTv:presentation:${info.presentationId}`;\n\n if (info.targetType === DashboardTargetType.Company)\n return `company:${info.companyId}:presentation:${info.presentationId}`;\n\n if (info.targetType === DashboardTargetType.PartnerProfile)\n return `partnerprofile:${info.slug}`;\n\n if (info.targetType === DashboardTargetType.DiscoverPartnerProfiles)\n return `discover:partners`;\n\n if (info.targetType === DashboardTargetType.PartnerProfileHub)\n return `discover:partners:hub`;\n\n return null;\n },\n\n getUnknownDashboardTarget(options: UnknownDashboardTargetInfo): string {\n const {\n presentationId,\n companyId,\n targetType,\n classificationId,\n slug\n } = options;\n\n if (targetType === DashboardTargetType.Discover) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.Discover,\n presentationId\n });\n }\n \n if (targetType === DashboardTargetType.MoviesAndTv) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.MoviesAndTv,\n presentationId\n });\n }\n \n if (targetType === DashboardTargetType.Company) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.Company,\n presentationId,\n companyId\n });\n }\n \n if (targetType === DashboardTargetType.Classification) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.Classification,\n classificationId\n });\n }\n \n if (targetType === DashboardTargetType.ClassificationDirectory) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.ClassificationDirectory,\n classificationId\n });\n }\n \n if (targetType === DashboardTargetType.ClassificationCurriculum) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.ClassificationCurriculum,\n classificationId\n });\n }\n\n if (targetType === DashboardTargetType.PartnerProfile) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.PartnerProfile,\n slug\n });\n }\n\n if (targetType === DashboardTargetType.DiscoverPartnerProfiles) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.DiscoverPartnerProfiles\n });\n }\n\n if (targetType === DashboardTargetType.PartnerProfileHub) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.PartnerProfileHub\n });\n }\n },\n\n getDashboardTargetInfo(dashboard: CuratedDashboard): DashboardTargetInfo {\n const type = CuratedDashboardHelper.getDashboardTargetType(dashboard);\n const split = dashboard?.target?.split(':');\n\n if (type === DashboardTargetType.Discover) {\n return {\n targetType: DashboardTargetType.Discover,\n presentationId: split[2]\n };\n }\n\n if (type === DashboardTargetType.Classification) {\n return {\n targetType: DashboardTargetType.Classification,\n classificationId: split[1]\n };\n }\n\n if (type === DashboardTargetType.ClassificationDirectory) {\n return {\n targetType: DashboardTargetType.ClassificationDirectory,\n classificationId: split[1]\n };\n }\n\n if (type === DashboardTargetType.ClassificationCurriculum) {\n return {\n targetType: DashboardTargetType.ClassificationCurriculum,\n classificationId: split[1]\n };\n }\n\n if (type === DashboardTargetType.MoviesAndTv) {\n return {\n targetType: DashboardTargetType.MoviesAndTv,\n presentationId: split[2]\n };\n }\n\n if (type === DashboardTargetType.Company) {\n return {\n targetType: DashboardTargetType.Company,\n companyId: split[1],\n presentationId: split[3]\n };\n }\n\n if (type === DashboardTargetType.PartnerProfile) {\n return {\n targetType: DashboardTargetType.PartnerProfile,\n slug: split[1]\n };\n }\n\n return null;\n },\n\n getDashboardTargetType(dashboard: CuratedDashboard): DashboardTargetType {\n if (!dashboard?.target)\n return null;\n\n if (dashboard.target.startsWith('discover')) {\n if (dashboard.target.endsWith('partners'))\n return DashboardTargetType.DiscoverPartnerProfiles;\n\n if (dashboard.target.endsWith('hub'))\n return DashboardTargetType.PartnerProfileHub;\n\n return DashboardTargetType.Discover;\n }\n\n if (dashboard.target.startsWith('classification')) {\n if (dashboard.target.endsWith('directory'))\n return DashboardTargetType.ClassificationDirectory;\n\n if (dashboard.target.endsWith('curriculum'))\n return DashboardTargetType.ClassificationCurriculum;\n\n return DashboardTargetType.Classification;\n }\n\n if (dashboard.target.startsWith('moviesAndTv'))\n return DashboardTargetType.MoviesAndTv;\n\n if (dashboard.target.startsWith('company')) {\n return DashboardTargetType.Company;\n }\n\n if (dashboard.target.startsWith('partnerprofile'))\n return DashboardTargetType.PartnerProfile;\n\n return null;\n },\n\n isType(dashboard: CuratedDashboard, target: DashboardTargetType): boolean {\n return CuratedDashboardHelper.getDashboardTargetType(dashboard) === target;\n },\n\n isCuratedDashboard(obj: BaseObject): obj is CuratedDashboard {\n const dashboard = obj as CuratedDashboard;\n\n const targetType = CuratedDashboardHelper.getDashboardTargetType(dashboard);\n\n if (targetType === DashboardTargetType.Discover)\n return true;\n\n if (targetType === DashboardTargetType.Classification)\n return true;\n\n if (targetType === DashboardTargetType.ClassificationDirectory)\n return true;\n\n if (targetType === DashboardTargetType.ClassificationCurriculum)\n return true;\n\n if (targetType === DashboardTargetType.MoviesAndTv)\n return true;\n\n if (targetType === DashboardTargetType.Company)\n return true;\n\n return false;\n },\n\n getLatestReleasedTimeRange(): LatestReleasesTimeRange {\n const now = new Date();\n const from = DateHelper.format(DateHelper.endOf(DateHelper.subtract(now, 2, 'month'), 'day'), 'YYYY-MM-DD');\n const to = DateHelper.format(DateHelper.endOf(now, 'day'), 'YYYY-MM-DD');\n return { from, to };\n },\n\n getWidgetParams(\n widgetTypeId: WidgetTypeId,\n templateId: WidgetTemplate,\n target: DashboardTargetType,\n audienceIds?: string | string[],\n preferredCurriculumId?: string,\n options?: GetCustomParamOptions\n ): CuratedWidgetQueryParams {\n const params: CuratedWidgetQueryParams = { };\n\n if (audienceIds)\n params.audienceId = audienceIds;\n\n if (widgetTypeId === WidgetTypeId.ClassificationCurriculumMedia)\n params.curriculumPresentationId = preferredCurriculumId;\n\n return {\n ...params,\n ...WidgetTypeIdConfig[widgetTypeId]?.getCustomParams?.(templateId, target, options)\n };\n },\n\n isSystemGeneratedDashboard(widgets: CuratedWidget[]): boolean {\n const systemGeneratedClassificationWidgetTypes = new Set<WidgetTypeId>([\n WidgetTypeId.ClassificationFeaturedVideo,\n WidgetTypeId.ClassificationPinnedVideos,\n WidgetTypeId.ClassificationPlaylists,\n WidgetTypeId.ClassificationSeries\n ]);\n\n return widgets?.some(widget => systemGeneratedClassificationWidgetTypes.has(widget.widgetId));\n },\n\n isClassificationDashboard(\n targetInfo: DashboardTargetInfo\n ): targetInfo is ClassificationDashboardInfo | ClassificationDirectoryInfo | ClassificationCurriculumInfo {\n return [\n DashboardTargetType.Classification,\n DashboardTargetType.ClassificationDirectory,\n DashboardTargetType.ClassificationCurriculum\n ].includes(targetInfo?.targetType);\n },\n\n isContentPartnerDashboard(targetInfo: DashboardTargetInfo): targetInfo is PartnerProfileDashboardInfo {\n return targetInfo?.targetType === DashboardTargetType.PartnerProfile;\n },\n\n isDirectoryDashboard(\n targetInfo: DashboardTargetInfo\n ): targetInfo is ClassificationDirectoryInfo {\n return targetInfo?.targetType === DashboardTargetType.ClassificationDirectory;\n },\n\n isWidgetTypeEnabled(\n widgetTypeId: WidgetTypeId,\n settingsHash: SettingsHash,\n targetType: DashboardTargetType\n ): boolean {\n const config = WidgetTypeIdConfig[widgetTypeId];\n \n return config?.predicate?.({ settingsHash, targetType }) ?? true;\n }\n};\n","import { Core } from 'libs/common/backbone/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { SourceFilterOptions, TypeFilterOptions } from '../apps/search/interfaces';\nimport { WidgetAppLinks } from '../components/widgets/curated-widgets/WidgetProps';\nimport { WidgetTemplate } from '../enums/WidgetTemplate';\nimport { WidgetTypeId } from '../enums/WidgetTypeId';\nimport { SettingsHash } from '../hooks/useSettings';\nimport { CuratedWidgetContent, CuratedWidgetQueryParams, DashboardTargetType, Series } from '../interfaces';\nimport { CuratedDashboardHelper } from '../utils/DashboardHelper';\n\ninterface WidgetTypeIdPredicateOptions {\n settingsHash: SettingsHash;\n targetType: DashboardTargetType;\n}\n\nexport interface GetCustomParamOptions {\n params?: CuratedWidgetQueryParams;\n}\n\ninterface WidgetTypeIdConfigType {\n getCustomParams: (\n widgetTemplate: WidgetTemplate,\n targetType: DashboardTargetType,\n options?: GetCustomParamOptions\n ) => CuratedWidgetQueryParams;\n minContent?: number;\n getCollectionAppLink?: (\n appLinks: Partial<WidgetAppLinks>,\n content?: CuratedWidgetContent\n ) => Core.AppLink;\n /**\n * Predicate used to determine if the widget\n * should be displayed based on the target\n * type and settings. Useful for feature flagging widgets.\n */\n predicate?: (options: WidgetTypeIdPredicateOptions) => boolean;\n}\n\nfunction partnerProfileWidgetTypeIdPredicate(options: WidgetTypeIdPredicateOptions): boolean {\n return options.settingsHash?.hasPartnerProfiles ?? false;\n}\n\nexport const WidgetTypeIdConfig: Record<WidgetTypeId, WidgetTypeIdConfigType> = {\n [WidgetTypeId.CuratedMedia]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.PlaylistMedia]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.SeriesMedia]: {\n getCustomParams: (widgetTemplate: WidgetTemplate) => {\n switch (widgetTemplate) {\n case WidgetTemplate.ThumbnailFixedListMediaLarge:\n return { limit: 2 };\n case WidgetTemplate.ThumbnailHeroMedia:\n case WidgetTemplate.ThumbnailFeaturedMedia:\n return { limit: 1 };\n default:\n return { limit: 12 };\n }\n },\n getCollectionAppLink: (appLinks, content) => appLinks?.series?.(ArrayHelper.first(content) as Series)\n },\n [WidgetTypeId.ClassificationMedia]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.LatestReleasedVideos]: {\n getCustomParams: () => {\n return CuratedDashboardHelper.getLatestReleasedTimeRange();\n }\n },\n [WidgetTypeId.ContinueWatching]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks?.watchHistory?.()\n },\n [WidgetTypeId.CompanyLatestReleasedVideo]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.CompanyVideos]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.ClassificationLatestReleasedVideo]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.ClassificationLatestReleasedVideosV2]: {\n getCustomParams: () => {\n return {\n limit: 12\n };\n },\n minContent: 4\n },\n [WidgetTypeId.SeasonalClassificationMedia]: {\n getCustomParams: () => {\n return {\n limit: 12\n };\n },\n minContent: 4\n },\n [WidgetTypeId.CompanyClassificationVideos]: {\n getCustomParams: () => ({}),\n minContent: 4\n },\n [WidgetTypeId.TrendingClassificationsMedia]: {\n getCustomParams: () => {\n return {\n limit: 12\n };\n },\n minContent: 4\n },\n\n [WidgetTypeId.CuratedClassifications]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.TrendingClassifications]: {\n getCustomParams: () => {\n return {\n limit: 6\n };\n },\n minContent: 3\n },\n [WidgetTypeId.Classifications]: {\n getCustomParams: (template: WidgetTemplate, targetType: DashboardTargetType) => {\n if (targetType === DashboardTargetType.Discover) {\n if (template === WidgetTemplate.EditableCoverFixedPillListSmall) {\n return {\n canBePreferred: true,\n isFollowing: true\n };\n }\n\n if ([ WidgetTemplate.PosterSlidingListSmall, WidgetTemplate.CoverFixedPillListXSmall ].includes(template)) {\n return {\n canBePreferred: true\n };\n }\n }\n\n return {};\n }\n },\n [WidgetTypeId.ClassificationLatestReleasedVideos]: {\n getCustomParams: () => {\n return CuratedDashboardHelper.getLatestReleasedTimeRange();\n }\n },\n [WidgetTypeId.SpecialEventClassifications]: {\n getCustomParams: () => ({\n from: DateHelper.format(new Date(), 'YYYY-MM-DD')\n })\n },\n [WidgetTypeId.LatestReleasedClassifications]: {\n getCustomParams: () => {\n return {\n limit: 6\n };\n },\n minContent: 3\n },\n\n [WidgetTypeId.CuratedSeries]: {\n getCustomParams: () => ({})\n },\n\n [WidgetTypeId.CuratedPlaylists]: {\n getCustomParams: () => ({})\n },\n\n [WidgetTypeId.Blurb]: {\n getCustomParams: () => ({})\n },\n\n [WidgetTypeId.DynamicBlurb]: {\n getCustomParams: () => ({})\n },\n\n [WidgetTypeId.AuthorReviewer]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.Faq]: {\n getCustomParams: () => ({})\n },\n\n [WidgetTypeId.CuratedCompanies]: {\n getCustomParams: () => ({}),\n predicate: options => {\n if (options.settingsHash?.hasPartnerProfiles)\n return false;\n return true;\n }\n },\n\n [WidgetTypeId.Ratings]: {\n getCustomParams: () => ({})\n },\n\n [WidgetTypeId.Presentations]: {\n getCustomParams: () => ({})\n },\n\n [WidgetTypeId.UpcomingLivestreams]: {\n getCustomParams: () => ({\n from: DateHelper.format(new Date(), 'YYYY-MM-DD')\n })\n },\n\n [WidgetTypeId.CuratedMultimedia]: {\n getCustomParams: () => ({})\n },\n\n [WidgetTypeId.ClassificationPlaylists]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.ClassificationSeries]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.ClassificationFeaturedVideo]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.ClassificationPinnedVideos]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.ClassificationDashboardExternalMedia]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.ClassificationDashboardMedia]: {\n getCustomParams: () => ({})\n },\n\n [WidgetTypeId.SearchRelevantTopics]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchRelevantTopics],\n type: [TypeFilterOptions.Classification]\n })\n },\n [WidgetTypeId.SearchCompanies]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchCompanies],\n type: [TypeFilterOptions.Company]\n }),\n predicate: options => {\n if (options.settingsHash?.hasPartnerProfiles)\n return false;\n return true;\n }\n },\n [WidgetTypeId.SearchSeries]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchSeries],\n type: [TypeFilterOptions.Series]\n })\n },\n [WidgetTypeId.SearchPlaylists]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchPlaylists],\n type: [TypeFilterOptions.Playlist]\n })\n },\n [WidgetTypeId.SearchMyVideosFolder]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchMyVideosFolder],\n source: [SourceFilterOptions.MyVideos]\n })\n },\n [WidgetTypeId.SearchMySchoolLibraryFolder]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchMySchoolLibraryFolder],\n source: [SourceFilterOptions.School]\n })\n },\n [WidgetTypeId.SearchMyVideos]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchMyVideos],\n source: [SourceFilterOptions.MyVideos]\n })\n },\n [WidgetTypeId.SearchMySchoolLibraryVideos]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchMySchoolLibraryVideos],\n source: [SourceFilterOptions.School]\n })\n },\n [WidgetTypeId.SearchExchangeArchive]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchExchangeArchive],\n source: [SourceFilterOptions.ExchangeArchive]\n })\n },\n [WidgetTypeId.SearchClickViewLive]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchClickViewLive],\n source: [SourceFilterOptions.LiveStreams]\n }),\n predicate: options => options.settingsHash?.clickViewLive ?? false\n },\n [WidgetTypeId.SearchRelatedResults]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.SearchTopResults]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.ClassificationCurriculumMedia]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.SearchTags]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.SearchCurriculumCode]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.SearchSuggestions]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.SearchContentPartners]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchContentPartners],\n type: [TypeFilterOptions.PartnerProfile]\n }),\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.CuratedContentPartners]: {\n getCustomParams: () => ({\n limit: 12\n }),\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.ContentPartnerLatestReleasedVideos]: {\n getCustomParams: () => ({}),\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.ContentPartnerSeries]: {\n getCollectionAppLink: appLinks => {\n return appLinks?.scopedSearchHome?.({\n type: [TypeFilterOptions.Series]\n });\n },\n getCustomParams: () => ({\n limit: 12\n }),\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.ContentPartnerVideos]: {\n getCustomParams: () => ({}),\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.SpotlightContentPartners]: {\n getCustomParams: () => ({}),\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.ContentPartners]: {\n getCustomParams: (\n widgetTemplate: WidgetTemplate,\n targetType: DashboardTargetType,\n options?: GetCustomParamOptions\n ) => ({\n letterPrefix: options?.params?.letterPrefix,\n sort: options?.params?.sort\n }),\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.ContentPartnersHub]: {\n getCustomParams: (\n widgetTemplate: WidgetTemplate,\n targetType: DashboardTargetType,\n options?: GetCustomParamOptions\n ) => {\n if (targetType !== DashboardTargetType.PartnerProfileHub)\n return {};\n\n return {\n objectId: options?.params?.objectId\n };\n },\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.TrendingContentPartnersVideo]: {\n getCustomParams: () => ({}),\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.ContentPartnerAllVideos]: {\n getCustomParams: (widgetTemplate: WidgetTemplate) => {\n if (widgetTemplate === WidgetTemplate.ThumbnailFixedListSearchCta)\n return { limit: 3 };\n\n return {};\n },\n predicate: partnerProfileWidgetTypeIdPredicate\n }\n};\n","import React from 'react';\n\nexport function WarningOutlineSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n d='m13.026 4.377 8.5 14A1.2 1.2 0 0 1 20.5 20.2h-17a1.2 1.2 0 0 1-1.026-1.823l8.5-14a1.2 1.2 0 0 1 2.052 0M12 5 3.5 19h17zm0 13a1 1 0 1 1 0-2 1 1 0 0 1 0 2m.75-3.677a.69.69 0 0 1-.7.677.69.69 0 0 1-.7-.677V8.677c0-.374.313-.677.7-.677s.7.303.7.677z'\n fill='currentColor'\n />\n </svg>\n );\n}\n","export enum WidgetStatus {\n Draft = 0,\n Published = 1,\n Archived = 2\n}\n\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { WidgetStatus } from 'libs/shared/enums/WidgetStatus';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { Breakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { BaseWidget, CuratedDashboardAppLink, CuratedWidget, CuratedWidgetContent, Playlist, Presentation, Series, Video, VideoTypes, VideoWidgetTemplateContent, WidgetMetadata, WidgetPreference } from 'libs/shared/interfaces';\n\nimport { AnyWidgetTemplateProps } from '../components/widgets/curated-widgets/WidgetProps';\nimport { WidgetTypeIdConfig } from '../constants/WidgetTypeIdConfig';\nimport { MasterType } from '../enums/MasterType';\n\nimport { MasterTypeHelper } from './MasterTypeHelper';\n\nenum WidgetStatusString {\n Draft = 'Draft',\n Published = 'Published',\n Archived = 'Archived'\n}\n\nexport const WidgetHelper = {\n /**\n * Used by both the FixedWidget and DynamicWidget\n */\n getSliderAnalyticsOptions: (): AnalyticsOptions => ({\n actionType: UserAction.Click,\n location: LocationContext.SlidingList,\n entity: EntityType.Widget,\n descriptor: ClickDescriptor.Slide\n }),\n\n /**\n * Used by both the FixedWidget and DynamicWidget\n */\n getSliderItemAnalyticsOptions: (): AnalyticsOptions => ({\n location: LocationContext.SlidingListItem\n }),\n\n getSliderHeadingAnalyticsOptions: (): AnalyticsOptions => ({\n actionType: UserAction.Click,\n location: LocationContext.SlidingList,\n entity: EntityType.Widget,\n descriptor: ClickDescriptor.Title\n }),\n\n useGetContent(\n content: CuratedWidgetContent,\n widgetTypeId: WidgetTypeId,\n isPreviewing: boolean,\n preferences: WidgetPreference[],\n removedItemIds: string[]\n ): { content: CuratedWidgetContent, unfilteredContent: CuratedWidgetContent } {\n return React.useMemo(() => {\n if (!content)\n return { content: null, unfilteredContent: null };\n\n if (!Array.isArray(content))\n return { content, unfilteredContent: content };\n\n const preferencesHash = preferences?.reduce((acc: HashObject, current) => {\n acc[current.id] = current;\n return acc;\n }, {}) ?? {};\n\n const removedItemIdsHash = removedItemIds.reduce((acc: HashObject, current) => {\n acc[current] = true;\n return acc;\n }, {});\n\n const contentCopy = [...content];\n \n const sortedContent = contentCopy.sort((a, b) => {\n if (!('id' in a) || !('id' in b))\n return 0;\n\n const aIndex = preferencesHash[a.id]?.index ?? contentCopy.findIndex(c => 'id' in c && c.id === a.id);\n const bIndex = preferencesHash[b.id]?.index ?? contentCopy.findIndex(c => 'id' in c && c.id === b.id);\n\n if (aIndex < bIndex)\n return -1;\n\n if (aIndex > bIndex)\n return 1;\n\n return 0;\n });\n\n if (WidgetHelper.isBelowContentMinimum(sortedContent, widgetTypeId) && !isPreviewing) {\n return {\n content: [],\n unfilteredContent: sortedContent\n };\n }\n\n const filteredContent = sortedContent.filter(item => {\n if (preferencesHash['id' in item && item.id]?.hidden)\n return false;\n\n if (removedItemIdsHash['id' in item && item.id])\n return false;\n\n return true;\n });\n\n return {\n content: filteredContent,\n unfilteredContent: sortedContent\n };\n }, [ content, preferences ]);\n },\n\n isBelowContentMinimum(content: CuratedWidgetContent, widgetTypeId: WidgetTypeId): boolean {\n const minContent = WidgetTypeIdConfig[widgetTypeId]?.minContent || 0;\n return content?.length < minContent;\n },\n\n getCustomAppLink(props: AnyWidgetTemplateProps): Core.AppLink | null {\n if (\n !('metadata' in props) ||\n !('appLinks' in props) ||\n !('appLink' in props.metadata)\n ) {\n return null;\n }\n\n if (props.metadata?.appLink === CuratedDashboardAppLink.LatestReleases && 'latestReleases' in props.appLinks)\n return props.appLinks?.latestReleases?.();\n\n if (props.metadata?.appLink === CuratedDashboardAppLink.ExploreAllTopics && 'allTopics' in props.appLinks && 'presentation' in props)\n return props.appLinks?.allTopics?.(props.presentation.id);\n\n return null;\n },\n\n getWidgetStatus(widget: CuratedWidget): WidgetStatus {\n let status = widget.status;\n\n if (typeof (status) === 'string') {\n switch (status) {\n case WidgetStatusString.Archived:\n status = WidgetStatus.Archived;\n break;\n case WidgetStatusString.Published:\n status = WidgetStatus.Published;\n break;\n case WidgetStatusString.Draft:\n status = WidgetStatus.Draft;\n break;\n }\n }\n\n return status;\n },\n\n formatResponseData(widget: CuratedWidget, presentation?: Presentation): CuratedWidget {\n const content = widget.content;\n\n if (!content)\n return widget;\n\n if ('author' in content) {\n widget.content = [content] as CuratedWidgetContent;\n return widget;\n }\n\n if ('data' in content)\n widget.content = content.data as CuratedWidgetContent;\n else if (!Array.isArray(content))\n widget.content = [content]; // Handle `classification_featured_video` widgets, which don't return content as an array\n\n switch (widget.widgetId) {\n case WidgetTypeId.ClassificationSeries:\n widget.content = widget.content.filter((c): c is Series => 'tallPoster' in c && !!c.tallPoster?.id);\n break;\n case WidgetTypeId.ClassificationPlaylists:\n widget.content = widget.content.filter((c): c is Playlist => 'cover' in c && !!c.cover?.id);\n break;\n case WidgetTypeId.ContinueWatching:\n widget.content = widget.content.map(c => 'object' in c && c.object);\n default:\n break;\n case WidgetTypeId.Presentations:\n widget.content = widget.content.filter((c): c is Presentation => 'id' in c && c.id.toString() !== presentation?.id?.toString());\n break;\n }\n\n return widget;\n },\n \n isWidgetInTableOfContents(metadata: Partial<WidgetMetadata>): boolean {\n return !!metadata?.showInTableOfContents;\n },\n\n /**\n * Widget container view won't render a widget with no content typically,\n * but some widgets (such as blurbs) have no content, but should render anyway.\n */\n hasNoContent(widgetTypeId: WidgetTypeId): boolean {\n if (widgetTypeId === WidgetTypeId.Blurb)\n return true;\n\n return false;\n },\n\n /**\n * If any widgets should be hidden on smaller screen sizes, add them here.\n * If this needs to be more flexible at some point, it should be added to\n * the widget settings and metadata object.\n */\n canDisplayOnScreenSize(\n breakpoints: Breakpoints,\n widgetTypeId: WidgetTypeId,\n widgetTemplate: WidgetTemplate\n ): boolean {\n if (widgetTypeId === WidgetTypeId.Blurb && widgetTemplate === WidgetTemplate.HeroBannerSmall)\n return !breakpoints.xs && !breakpoints.sm;\n\n return true;\n },\n\n isCompanyWidget(widgetTypeId: WidgetTypeId): boolean {\n switch (widgetTypeId) {\n case WidgetTypeId.CompanyLatestReleasedVideo:\n case WidgetTypeId.CompanyVideos:\n case WidgetTypeId.UpcomingLivestreams:\n return true;\n default:\n return false;\n }\n },\n\n getVideoContent(content: VideoWidgetTemplateContent): VideoTypes[] {\n const firstItem = ArrayHelper.first<Video | Series>(content);\n\n if (MasterTypeHelper.isType<Series>(firstItem, MasterType.Series))\n return firstItem.videos.data;\n\n return content as VideoTypes[];\n },\n\n showRemoveButton(widgetTypeId: WidgetTypeId): boolean {\n return widgetTypeId === WidgetTypeId.ContinueWatching;\n },\n\n /**\n * Paginated data returns more widgets so if we dont merge the widget content by widget type id,\n * it would add another widget to the page rather than appending content to the relevant\n * search result index\n * \n * For example:\n * Say we receive these widgets for a query:\n * - topics widget\n * - related results widget\n * \n * If a user scrolls down to the end of page we fetch more items from the last widget\n * which in this case is 'related results widget'. \n * Now our overall response looks like this\n * - topics widget\n * - related results widget\n * - related results widget\n * \n * Since this is a new widget item entry it will be rendered as a new widget with seprate headings etc.\n * In this case we want to combine these two widgets data into one so its looks like this again:\n * - topics widget\n * - related results widget (data is combined)\n * \n * But what if widget we get recieve has a different widget template id. This currently happens for\n * the 'series widget' - series widget can have the tall poster template or the thumbnail like template.\n * \n * so to visualize this it can be like:\n * - topics widget\n * - top results widget\n * - series widget (template: tall poster)\n * - series widget (template: thumbnail)\n * \n * Since they technically will look different based on the template id we will not merge the data in this case.\n * It will merge the data to the same widget as long as the combination of widget Id + template Id is the same.\n * \n * Since they are separate widgets they will render duplicate headings - we handle this in css instead which\n * checks for adjacent siblings and if its the same widget - it hides the widget heading so it will look\n * like its a single widget rather than separate widgets.\n * \n * - Nish\n */\n mergeWidgets<T extends BaseWidget>(\n items: T[],\n mergeContent: (target: T, source: T) => void\n ): T[] {\n const widgets = ObjectHelper.deepClone(items);\n const groupedWidgets = ArrayHelper.groupBy(widgets, 'widgetId');\n const mergedWidgets: T[] = [];\n\n for (const widgetGroup of Object.values(groupedWidgets)) {\n let currentMergedWidget: T | null = null;\n const groupMergedWidgets: T[] = [];\n\n for (const widget of widgetGroup) {\n if (!currentMergedWidget) {\n currentMergedWidget = widget;\n continue;\n }\n\n if (widget.templateId !== currentMergedWidget.templateId) {\n groupMergedWidgets.push(currentMergedWidget);\n currentMergedWidget = widget;\n continue;\n }\n\n mergeContent(currentMergedWidget, widget);\n }\n\n if (currentMergedWidget) {\n groupMergedWidgets.push(currentMergedWidget);\n }\n mergedWidgets.push(...groupMergedWidgets);\n }\n\n return mergedWidgets;\n }\n};\n",":local {\n .widgetTextButton {\n margin-top: 0.1rem;\n flex-shrink: 0;\n }\n}","import React from 'react';\nimport { Spinner } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor, LocationContext } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { WidgetTypeIdConfig } from 'libs/shared/constants/WidgetTypeIdConfig';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { WarningOutlineSvg } from 'libs/shared/images/svg/status/WarningOutlineSvg';\nimport { WidgetHelper } from 'libs/shared/utils/WidgetHelper';\n\nimport styles from './widget-header.module.scss';\n\nconst namespace = 'shared.widgetHeader';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface WidgetHeaderProps {\n name: string;\n description?: string | JSX.Element;\n isPreviewing?: boolean;\n content?: any[];\n widgetTypeId?: WidgetTypeId;\n badgeComponent?: JSX.Element;\n\n appLink?: Core.AppLink;\n onAppLinkClick?: () => void;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n \n showSeeMoreLink?: boolean;\n onClose?: () => void;\n onFollow?: (shouldFollow: boolean) => void;\n isFollowing?: boolean;\n showFollowSpinner?: boolean;\n}\n\nfunction SeeMore(props: WidgetHeaderProps) {\n if (!Core.AppLinkHelper.getHref(props.appLink))\n return null;\n\n return (\n <div className={`ms-3 ${styles.widgetTextButton}`}>\n <AppLink\n appLink={props.appLink}\n analyticsData={props.analyticsData }\n analyticsOptions={{\n location: LocationContext.SlidingList,\n ...props.analyticsOptions,\n descriptor: ClickDescriptor.SeeMore\n }}\n className={`text-decoration-none ${props.appLink ? 'curated-widget-link' : ''}`}\n >\n <p className='hover-text-underline text-dark curated-widget-heading'>{getPhrase('seeAll')}</p>\n </AppLink>\n </div>\n );\n}\n\nfunction CloseWidgetButton(props: { onClose: () => void }) {\n return (\n <div className={`ms-3 ${styles.widgetTextButton} text-decoration-none cursor-pointer`} onClick={props.onClose}>\n <p className='hover-text-underline text-dark curated-widget-heading'>{getPhrase('hide')}</p>\n </div>\n );\n}\n\nfunction FollowWidgetButton(props: {\n isFollowing: boolean,\n onFollow: (shouldFollow: boolean) => void,\n showFollowSpinner: boolean\n}) {\n return (\n <div className={`ms-3 ${styles.widgetTextButton} text-decoration-none`}>\n {\n props.showFollowSpinner ?\n <Spinner as='span' animation='border' role='status' size='sm' /> :\n <p className='hover-text-underline text-dark curated-widget-heading cursor-pointer' onClick={() => props.onFollow(!props.isFollowing)}>\n {getPhrase(props.isFollowing ? 'unfollow' : 'follow')}\n </p>\n }\n </div>\n );\n}\n\nexport function WidgetHeader(props: WidgetHeaderProps): JSX.Element {\n const hasDescription = !!props.description;\n\n if (!props.name && !props.description)\n return <></>;\n\n const isBelowMinimum = WidgetHelper.isBelowContentMinimum(props.content, props.widgetTypeId);\n const minContent = WidgetTypeIdConfig[props.widgetTypeId]?.minContent ?? 0;\n\n return (\n <div className='curated-widget-header'>\n <div className='d-flex justify-content-between'>\n {!!props.name && (\n <div className='d-flex align-items-center'>\n <AppLink\n appLink={props.appLink}\n analyticsData={props.analyticsData}\n className={`text-decoration-none ${props.appLink ? 'curated-widget-link text-reset' : ''}`}\n onClick={props.onAppLinkClick}\n >\n <h2 className='h4 curated-widget-heading'>\n {props.isPreviewing && isBelowMinimum && (\n <SvgContainer\n svg={WarningOutlineSvg}\n title={`Widget is below the minimum content threshold of ${minContent} and won't be displayed.`}\n tooltipSpanHack\n tooltipSpanHackClassName='d-inline text-danger me-1'\n />\n )}\n {props.name}\n </h2>\n </AppLink>\n {!!React.isValidElement(props.badgeComponent) && props.badgeComponent}\n </div>\n )}\n <div className='d-flex justify-content-between align-items-center gap-2'>\n {!!props.appLink && !hasDescription && !!props.showSeeMoreLink && <SeeMore {...props}/>}\n {FunctionHelper.isFunction(props.onFollow) &&\n <FollowWidgetButton\n isFollowing={props.isFollowing}\n onFollow={props.onFollow}\n showFollowSpinner={props.showFollowSpinner}\n />\n }\n {FunctionHelper.isFunction(props.onClose) && <CloseWidgetButton onClose={props.onClose}/>}\n </div>\n </div>\n \n {hasDescription && (\n <div className='d-flex justify-content-between align-items-end'>\n <p className='description curated-widget-description'>\n <span>{props.description}</span>\n </p>\n {!!props.appLink && !!props.showSeeMoreLink && <SeeMore {...props}/> }\n </div>\n )}\n </div>\n );\n}\n","export enum TagType {\n Normal = 'normal',\n Pedagogy = 'pedagogy',\n Hidden = 'hidden',\n Skill = 'skill',\n Curation = 'curation'\n}\n\n/**\n * This should **only** be used to create new tags in master (as it only accepts enum values).\n * Use the string enum above for all other cases.\n */\nexport enum TagTypeNumber {\n Normal = 0,\n Pedagogy = 1,\n Hidden = 2,\n Skill = 3,\n Curation = 4\n}\n",":local {\n $badge-base-height: 1.5rem;\n\n .tagList {\n display: flex;\n flex-wrap: wrap;\n }\n\n .badgeBase {\n height: $badge-base-height;\n }\n \n .disabled {\n background-color: $gray-200;\n color: $gray-500;\n\n &:hover {\n background-color: $gray-200;\n color: $gray-500;\n }\n }\n\n .partialTag {\n width: 5rem;\n }\n\n .removeBadge {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n\n .removeBadgeText {\n line-height: $badge-base-height;\n }\n \n .close {\n opacity: 1;\n background-size: 0.625rem;\n\n &:not(:disabled):hover {\n opacity: 1;\n }\n }\n}","import 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 { TagType } from 'libs/shared/enums/TagType';\nimport { Tag, ThemeColours } from 'libs/shared/interfaces';\n\nimport { DivButton } from '../div-button/DivButton';\n\nimport styles from './tags.module.scss';\n\nconst namespace = 'shared.tags';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface TagItemProps {\n tag: Tag;\n themeColours?: ThemeColours;\n appLink?: Core.AppLink;\n onClick?: () => void;\n onRemove?: () => void;\n disabled?: boolean;\n tagClass?: string;\n}\n\nfunction getTagTypeClass(tagType: TagType, hasThemeColour: boolean): string {\n switch (tagType) {\n case TagType.Pedagogy:\n case TagType.Skill:\n return 'pedagogy-tag text-white';\n\n case TagType.Hidden:\n return 'hidden-tag fw-normal';\n\n case TagType.Normal:\n if (!hasThemeColour)\n return 'bg-gray-100 fw-normal';\n return '';\n\n default:\n return '';\n }\n}\n\nexport function TagItem(props: TagItemProps): JSX.Element {\n const { tag, appLink, onClick, disabled, tagClass = 'tag' } = props;\n\n const name = tag.name.toLowerCase();\n const tagType = tag.tagType?.toLowerCase() as TagType;\n\n const hasThemeColour = (tagType === TagType.Normal && props.themeColours) && !!props.themeColours?.secondary;\n let classNames = `${styles.badgeBase} rounded-pill py-1 px-2 my-1 me-1 ${tagClass} ${getTagTypeClass(tagType, hasThemeColour)}`;\n let textContainerClass = `text-truncate text-nowrap`;\n\n if (hasThemeColour)\n classNames += ' text-white';\n\n if ((appLink || onClick) && !disabled)\n classNames += ' cursor-pointer';\n\n if (disabled)\n classNames += ' ' + styles.disabled;\n\n if (props.onRemove) {\n classNames += ' ' + styles.removeBadge;\n textContainerClass += ' ' + `${styles.removeBadgeText} d-inline-flex align-items-center lh-1`;\n }\n if (!appLink)\n classNames += ' d-inline-block';\n\n const style: React.CSSProperties = hasThemeColour ?\n { backgroundColor: props.themeColours.secondary } :\n {};\n\n if (appLink) {\n return (\n <AppLink\n onClick={onClick}\n appLink={appLink}\n className={classNames}\n title={name}\n style={style}\n >\n <span className={textContainerClass}>{name}</span>\n </AppLink>\n );\n }\n\n return (\n <button\n onClick={onClick}\n className={classNames}\n title={name}\n style={style}\n aria-label={`${getPhrase('ariaFilter')} ${name}`}\n >\n <span className={textContainerClass}>\n {name}\n {props.onRemove &&\n <DivButton\n onClick={props.onRemove}\n className={`${styles.close} btn-close font-size-normal`}\n role='button'\n aria-label='Close'\n />\n }\n </span>\n </button>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{S as e,b as t,bt as n,d as r,s as i,x as a}from"./B1i9atik.chunk.js";import{l as o}from"./TJBzqR6k.chunk.js";import{t as s}from"./CzvVp9iC.chunk.js";import{n as c,t as l}from"./Dn3hwC-o.chunk.js";import{t as u}from"./CrBD6Z4s.chunk.js";import{Z as d,at as f}from"./app-
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{S as e,b as t,bt as n,d as r,s as i,x as a}from"./B1i9atik.chunk.js";import{l as o}from"./TJBzqR6k.chunk.js";import{t as s}from"./CzvVp9iC.chunk.js";import{n as c,t as l}from"./Dn3hwC-o.chunk.js";import{t as u}from"./CrBD6Z4s.chunk.js";import{Z as d,at as f}from"./app-lnmpv5W4.js";import{n as p}from"./M-OKfIH7.chunk.js";var m=s.encloseNamespace(`tv.addRequests`);function h(s,h,g){let _=o(d.config());return function(o){if(!h)return[];let d=s===`preview`,v={id:o.id,name:o.title},y=d?r.VideoItemPreview:r.VideoListItem;return[{label:d?m(`addVideo`):``,svg:d?void 0:p,tooltip:d?``:m(`addVideo`),className:d?`btn btn-dark me-2 text-nowrap`:`btn`,button:!0,onClick:()=>{n.trigger({application:c.TV,action:l.Tv.ADD,args:[h.code,o.id],params:{currentTime:Math.floor(+g?.currentTime())||void 0}})},analyticsData:v,analyticsOptions:{actionType:t.Click,entity:i.Video,descriptor:a.AddToWorkspace,location:y,workflowPhase:e.Start}},{label:m(`editVideo`),href:u.urlBuilder(`${_.data?.cloudEditorUrl}/tv/${o.globalId}`,{product:f.Exchange}),openInNewTab:!0,analyticsData:v,analyticsOptions:{actionType:t.Click,entity:i.Video,location:y,descriptor:a.EditVideo}}]}}export{h as t};
|
|
2
|
+
//# sourceMappingURL=CSbvS-Cl.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"CSbvS-Cl.chunk.js","names":[],"sources":["../../src/apps/tv/hooks/useGetTvActions.ts"],"sourcesContent":["import { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/react/index';\n\nimport { EntityType, LocationContext, UserAction, VideoActionDescriptor, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { PlayerReference } from 'libs/shared/context/player-context/interfaces/PlayerReference';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { AddVideoSvg } from 'libs/shared/images/svg/actions/AddVideoSvg';\n\nimport { Actions } from 'shared/constants/ExchangeActions';\nimport { AppChannels } from 'shared/constants/ExchangeRadioChannels';\nimport { ExchangeConfig } from 'shared/interfaces/ExchangeConfig';\n\nimport { TvProgram } from 'apps/tv/interfaces/models/TvProgram';\nimport { TvRegion } from 'apps/tv/interfaces/models/TvRegion';\n\nconst namespace = 'tv.addRequests';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ntype Location = 'preview' | 'video-list';\n\nexport function useGetTvActions(location: Location, region: TvRegion, playerRef?: PlayerReference) {\n const config = Flight.useBasicFetch<ExchangeConfig>(ConfigRequests.config());\n \n return function getTvActions(program: TvProgram): ActionOptions[] {\n if (!region)\n return [];\n\n const isPreview = location === 'preview';\n const analyticsData = { id: program.id, name: program.title };\n const locationContext = isPreview ? LocationContext.VideoItemPreview : LocationContext.VideoListItem;\n\n // TODO: Register analytics for all actions\n return [{\n label: isPreview ? getPhrase('addVideo') : '',\n svg: !isPreview ? AddVideoSvg : undefined,\n tooltip: isPreview ? '' : getPhrase('addVideo'),\n className: isPreview ? 'btn btn-dark me-2 text-nowrap' : 'btn',\n button: true,\n onClick: () => {\n Core.AppLinkHelper.trigger({\n application: AppChannels.TV,\n action: Actions.Tv.ADD,\n args: [ region.code, program.id ],\n params: {\n currentTime: Math.floor(+playerRef?.currentTime()) || undefined\n }\n });\n },\n analyticsData,\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.Video,\n descriptor: VideoActionDescriptor.AddToWorkspace,\n location: locationContext,\n workflowPhase: WorkflowPhase.Start\n }\n }, {\n label: getPhrase('editVideo'),\n href: UrlHelper.urlBuilder(\n `${config.data?.cloudEditorUrl}/tv/${program.globalId}`,\n { product: ProductId.Exchange }\n ),\n openInNewTab: true,\n analyticsData,\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.Video,\n location: locationContext,\n descriptor: VideoActionDescriptor.EditVideo\n }\n }];\n };\n}\n"],"mappings":"yUAqBA,IAAM,EAAY,EAAgB,iBADhB,iBAC2C,CAI7D,SAAgB,EAAgB,EAAoB,EAAkB,EAA6B,CACjG,IAAM,EAAS,EAAqC,EAAe,QAAQ,CAAC,CAE5E,OAAO,SAAsB,EAAqC,CAChE,GAAI,CAAC,EACH,MAAO,EAAE,CAEX,IAAM,EAAY,IAAa,UACzB,EAAgB,CAAE,GAAI,EAAQ,GAAI,KAAM,EAAQ,MAAO,CACvD,EAAkB,EAAY,EAAgB,iBAAmB,EAAgB,cAGvF,MAAO,CAAC,CACN,MAAO,EAAY,EAAU,WAAW,CAAG,GAC3C,IAAM,EAA0B,IAAA,GAAd,EAClB,QAAS,EAAY,GAAK,EAAU,WAAW,CAC/C,UAAW,EAAY,gCAAkC,MACzD,OAAQ,GACR,YAAe,CACb,EAAmB,QAAQ,CACzB,YAAa,EAAY,GACzB,OAAQ,EAAQ,GAAG,IACnB,KAAM,CAAE,EAAO,KAAM,EAAQ,GAAI,CACjC,OAAQ,CACN,YAAa,KAAK,MAAM,CAAC,GAAW,aAAa,CAAC,EAAI,IAAA,GAAA,CAEzD,CAAC,EAEJ,gBACA,iBAAkB,CAChB,WAAY,EAAW,MACvB,OAAQ,EAAW,MACnB,WAAY,EAAsB,eAClC,SAAU,EACV,cAAe,EAAc,OAEhC,CAAE,CACD,MAAO,EAAU,YAAY,CAC7B,KAAM,EAAU,WACd,GAAG,EAAO,MAAM,eAAe,MAAM,EAAQ,WAC7C,CAAE,QAAS,EAAU,SAAU,CAChC,CACD,aAAc,GACd,gBACA,iBAAkB,CAChB,WAAY,EAAW,MACvB,OAAQ,EAAW,MACnB,SAAU,EACV,WAAY,EAAsB,WAErC,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{C as e,D as t,fn as n,vt as r}from"./B1i9atik.chunk.js";import{n as i,t as a,v as o}from"./NpQVkKE2.chunk.js";import{C as s,M as c,T as l,w as u}from"./gJSjbaVK.chunk.js";import{t as d}from"./BwpDSW6-.chunk.js";import{n as f}from"./B6rKNJWQ.chunk.js";import{t as p}from"./Y2Q2F5X6.chunk.js";import{T as m}from"./app-
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{C as e,D as t,fn as n,vt as r}from"./B1i9atik.chunk.js";import{n as i,t as a,v as o}from"./NpQVkKE2.chunk.js";import{C as s,M as c,T as l,w as u}from"./gJSjbaVK.chunk.js";import{t as d}from"./BwpDSW6-.chunk.js";import{n as f}from"./B6rKNJWQ.chunk.js";import{t as p}from"./Y2Q2F5X6.chunk.js";import{T as m}from"./app-lnmpv5W4.js";import{t as h}from"./B7KaaLVd.chunk.js";import{r as g}from"./DyUX82Kv.chunk.js";import{t as _}from"./CnBbU5eq.chunk.js";import{t as v}from"./Dlvd6RQv.chunk.js";var y=n(c()),b=n(t()),x=e(),S=b.forwardRef(({bsPrefix:e,className:t,as:n=`div`,...r},i)=>{let a=l(e,`row`),o=s(),c=u(),d=`${a}-cols`,f=[];return o.forEach(e=>{let t=r[e];delete r[e];let n;typeof t==`object`&&t?{cols:n}=t:n=t;let i=e===c?``:`-${e}`;n!=null&&f.push(`${d}${i}-${n}`)}),(0,x.jsx)(n,{ref:i,...r,className:(0,y.default)(t,a,...f)})});S.displayName=`Row`;var C=400;function w(e){let t=()=>{if(!e.isFetching){if(e.scrollContainer){let{scrollContainer:t}=e;if(t.getBoundingClientRect().height+t.scrollTop<t.scrollHeight-C)return}else if(window.innerHeight+document.documentElement.scrollTop<document.documentElement.scrollHeight-C)return;e.fetchNextPage()}};(0,b.useEffect)(()=>{let n=o.throttle(t,200),r=e.scrollContainer||window;return e.hasMore&&r.addEventListener(`scroll`,n),()=>r.removeEventListener(`scroll`,n)},[e.hasMore,e.fetchNextPage,e.scrollContainer])}function T(e,t,n,i,a,s){let[c,l]=(0,b.useState)(0),u=t;function d(t){if(!e)return null;let n=e(t);return n?n.key:null}let f=_(d,i,a);function p(){if(!(!t||!e||!f))return l(e=>e+1),u(f.nextCursor)}return w({fetchNextPage:p,hasMore:!!f?.nextCursor,isFetching:f?.isFetching,scrollContainer:s}),(0,b.useEffect)(()=>{f&&f.shouldInitialFetch&&t&&(u(),l(e=>e+1))},[f?.shouldInitialFetch,t]),(0,b.useEffect)(()=>{if(!f?.statusCode||!o.isFunction(n))return;let e=+f.statusCode?.toString()?.substr(0,1);e!==r.ClientError&&e!==r.ServerError||n(c,f.statusCode)},[f?.statusCode]),{items:f?.items,hasMore:!!f?.nextCursor,nextCursor:f?.nextCursor,isFetching:f?.isFetching,totalItems:f?.totalItems,hasFirstPageCompleted:f?.hasFirstPageCompleted}}var E={container:`_container_1kfhe_1`,spinner:`_spinner_1kfhe_4`};D.defaultProps={fetchOnScroll:!1};function D(e){let[t,n]=g();return b.useEffect(()=>{e.fetchOnScroll&&(!n||e.isFetching||e.fetchNext?.(e.nextCursor))},[n,e.isFetching]),(0,x.jsx)(`div`,{className:`p-3 text-center ${E.container}`,children:e.isFetching?(0,x.jsx)(f,{as:`span`,animation:`border`,role:`status`,className:E.spinner}):(0,x.jsx)(`div`,{ref:t,children:(0,x.jsx)(a,{svg:v,className:`svg-container cursor-pointer`,size:i.Large,onClick:()=>e.fetchNext?.(e.nextCursor)})})})}var O={getThumbnailColumns(){return{xs:12,sm:5,lg:3}},getDetailsColumns(){return{xs:12,sm:7,lg:9}},getSize(e,t){return e.sm?`sm`:t||`md`},getThumbnailColSize(e){return e?10:12}},k={partialOptions:`_partialOptions_157xw_1`,partialName:`_partialName_157xw_4`,partialDescription:`_partialDescription_157xw_8`,partialThumbnail:`_partialThumbnail_157xw_12`,partialDragHandle:`_partialDragHandle_157xw_15`};A.defaultProps={numVideos:15};function A(e){return(0,x.jsx)(x.Fragment,{children:Array(e.numVideos).fill(null).map((t,n)=>(0,x.jsxs)(`div`,{className:`d-flex`,children:[e.allowBulkActions&&(0,x.jsx)(`div`,{className:`form-check pe-3 pe-sm-2 mx-0 mx-md-2`}),(0,x.jsx)(j,{...e})]},n))})}function j(e){let t=m(),n=O.getSize(t,`md`)===`sm`,r=e.withReordering&&!t.xs;return(0,x.jsxs)(S,{className:`${n?``:`py-2`} flex-grow-1`,children:[(0,x.jsx)(d,{...O.getThumbnailColumns(),className:`flex-column align-items-flex-start ${n?`pb-2 pe-1`:`mb-1 pe-3 pe-md-2`}`,children:(0,x.jsxs)(S,{children:[!!r&&(0,x.jsx)(`div`,{className:`d-flex align-items-center justify-content-center col-2`,children:(0,x.jsx)(`div`,{className:`partial-loading-background ${k.partialDragHandle}`})}),(0,x.jsx)(d,{xs:O.getThumbnailColSize(r),children:(0,x.jsx)(`div`,{className:`partial-loading-background ${n?`rounded`:`rounded-3`} ${k.partialThumbnail}`})})]})}),(0,x.jsxs)(d,{...O.getDetailsColumns(),className:n?`pb-2`:`px-2`,children:[(0,x.jsx)(`div`,{className:`partial-loading-background mb-1 ${k.partialName}`}),(0,x.jsx)(`div`,{className:`partial-loading-background ${k.partialDescription}`})]})]})}M.defaultProps={checked:!1,label:``,className:``};function M(e){let{isLabelEllipsis:t}=e,n=b.useRef(null);return b.useEffect(()=>{if(n.current){if(e.checked){n.current.indeterminate&&(n.current.indeterminate=!1);return}if(e.indeterminate&&!n.current.indeterminate){n.current.indeterminate=!0;return}!e.indeterminate&&n.current.indeterminate&&(n.current.indeterminate=!1)}},[n.current,e.indeterminate,e.checked]),(0,x.jsxs)(`div`,{className:`form-check pe-2 ${e.className}`,children:[(0,x.jsx)(`input`,{ref:n,type:`checkbox`,className:`${e.inputClassName} form-check-input`,id:e.id,name:e.name,checked:e.checked,onChange:e.onChange,disabled:e.disabled,"aria-checked":e.checked,"aria-label":e.ariaLabel}),e.label&&(0,x.jsx)(`label`,{className:`form-check-label cursor-pointer align-top`,htmlFor:e.id,children:(0,x.jsx)(`span`,{className:`${t?`clamp-1`:``}`,children:e.label})})]})}function N(e){return(0,x.jsx)(`svg`,{...e,children:(0,x.jsx)(`path`,{fill:`currentColor`,d:`M16.863 20c-.662 0-1.21-.567-1.21-1.252s.548-1.252 1.21-1.252c.663 0 1.21.567 1.21 1.252S17.527 20 16.864 20m0-1.441a.183.183 0 0 0-.182.189c0 .118.068.189.182.189.115 0 .183-.071.183-.19a.183.183 0 0 0-.183-.188m0-.118a.516.516 0 0 1-.502-.52v-6.19L11.75 9.158a.53.53 0 0 1-.205-.71c.137-.26.456-.354.685-.212l4.886 2.717a.57.57 0 0 1 .274.473v6.496a.52.52 0 0 1-.526.52m-4.908-4.205a.8.8 0 0 1-.229-.048L2.296 9.51A.55.55 0 0 1 2 9.014c0-.212.114-.401.297-.472l9.52-4.489a.47.47 0 0 1 .434 0l9.452 4.489a.55.55 0 0 1 .297.472.49.49 0 0 1-.297.473l-9.52 4.701a.8.8 0 0 1-.228.048m-8.22-5.198 8.22 4.087 8.288-4.087-8.22-3.898zm8.151 8.41c-4.749 0-6.644-2.905-6.712-3.047a.7.7 0 0 1-.092-.284V10.81c0-.283.229-.52.503-.52s.502.237.502.52v3.142c.388.496 2.077 2.434 5.776 2.434 3.653 0 5.548-1.938 6.005-2.457v-2.93c0-.284.228-.52.502-.52s.502.236.502.52v3.118a.6.6 0 0 1-.091.307c-.046.142-2.192 3.024-6.895 3.024`})})}function P(){let e=p(h.XS),t=p(h.SM),n=p(h.MD),r=p(h.LG),i=p(h.XL),a=p(h.XXL),o=h.LG;return e&&(o=h.XS),t&&(o=h.SM),n&&(o=h.MD),r&&(o=h.LG),i&&(o=h.XL),a&&(o=h.XXL),o}export{O as a,S as c,A as i,N as n,D as o,M as r,T as s,P as t};
|
|
2
|
+
//# sourceMappingURL=CYFRcx63.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CWY-sFVd.chunk.js","names":[],"sources":["../../../../../node_modules/react-bootstrap/esm/Row.js","../../../../libs/shared/src/hooks/UseInfiniteScroll.ts","../../../../libs/shared/src/hooks/UseInfiniteList.ts","../../../../libs/shared/src/components/infinite-scroll-footer/infinite-scroll-footer.module.scss","../../../../libs/shared/src/components/infinite-scroll-footer/InfiniteScrollFooter.tsx","../../../../libs/shared/src/components/video-list/VideoListHelper.tsx","../../../../libs/shared/src/components/video-list/partial-loading/partial-video-list.module.scss","../../../../libs/shared/src/components/video-list/partial-loading/PartialVideoList.tsx","../../../../libs/shared/src/components/forms/form-checkbox/Checkbox.tsx","../../../../libs/shared/src/images/svg/objects/GraduationCapSvg.tsx","../../../../libs/shared/src/hooks/UseGetMediaQueryString.ts"],"sourcesContent":["\"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;","import { useEffect } from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst SCROLL_TOLERANCE = 400; // value in px\n\ninterface UseInfiniteScrollOptions {\n fetchNextPage: () => void;\n hasMore: boolean;\n isFetching: boolean;\n scrollContainer?: HTMLElement;\n}\n\nexport function useInfiniteScroll(options: UseInfiniteScrollOptions): void {\n const handleScroll = (): void => {\n if (options.isFetching)\n return;\n\n if (!options.scrollContainer) {\n const currentScrollHeight = window.innerHeight + document.documentElement.scrollTop;\n \n const totalHeight = document.documentElement.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n } else {\n const { scrollContainer } = options;\n const currentScrollHeight = scrollContainer.getBoundingClientRect().height + scrollContainer.scrollTop;\n \n const totalHeight = scrollContainer.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n }\n\n options.fetchNextPage();\n };\n\n useEffect(() => {\n const onScroll = FunctionHelper.throttle(handleScroll, 200);\n\n const scrollContainer = options.scrollContainer || window;\n\n if (options.hasMore)\n scrollContainer.addEventListener('scroll', onScroll);\n\n return () => scrollContainer.removeEventListener('scroll', onScroll);\n }, [ options.hasMore, options.fetchNextPage, options.scrollContainer ]);\n}\n","import { useEffect, useState } from 'react';\n\nimport { HttpStatus, HttpStatusClass } from 'libs/common/backbone/enums/HttpStatus';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { BaseObject, BasePaginatedCollection } from 'libs/shared/interfaces';\n\nimport { useInfiniteScroll } from './UseInfiniteScroll';\nimport { useSelectAllPages } from './UseSelectAllPages';\n\nexport interface UseInfiniteListResult<T extends BaseObject> {\n items: T[];\n hasMore: boolean;\n isFetching: boolean;\n nextCursor: string;\n totalItems?: number;\n hasFirstPageCompleted: boolean;\n}\n\n/**\n * Hook to extract an infinite list from the application state,\n * save it locally in state and only update when new data\n * is fetched.\n * \n * @param getRequest - callback function to get the request for each page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n * \n * @param fetchNext - callback function to fetch a page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n */\nexport function useInfiniteList<TObject = BaseObject, TResponse = BasePaginatedCollection<TObject>>(\n getRequest: ((cursor?: string) => Flight.Request) | false,\n fetchNext: ((cursor?: string) => void) | false,\n onError?: (pageNumber: number, statusCode: HttpStatus) => void,\n getItems?: (responseData: TResponse) => TObject[],\n getCursor?: (responseData: TResponse) => string,\n scrollContainer?: HTMLElement\n): UseInfiniteListResult<TObject> {\n const [ pagesFetched, setPagesFetched ] = useState(0);\n\n const fetchNextFn = fetchNext as (cursor?: string) => void;\n\n function getKey(cursor?: string): string {\n if (!getRequest)\n return null;\n\n const request = getRequest(cursor);\n\n if (!request)\n return null;\n\n return request.key;\n }\n\n const response = useSelectAllPages<TObject, TResponse>(\n getKey,\n getItems,\n getCursor\n );\n\n function fetchNextPage(): void {\n if (!fetchNext || !getRequest || !response)\n return;\n\n setPagesFetched(currentVal => currentVal + 1);\n return fetchNextFn(response.nextCursor);\n }\n\n useInfiniteScroll({\n fetchNextPage,\n hasMore: !!response?.nextCursor,\n isFetching: response?.isFetching,\n scrollContainer\n });\n\n useEffect(() => {\n if (!response)\n return;\n\n if (response.shouldInitialFetch && fetchNext) {\n fetchNextFn();\n setPagesFetched(currentVal => currentVal + 1);\n }\n }, [ response?.shouldInitialFetch, fetchNext ]);\n\n useEffect(() => {\n if (!response?.statusCode || !FunctionHelper.isFunction(onError))\n return;\n\n const httpStatusClass: HttpStatusClass = +(response.statusCode?.toString()?.substr(0, 1));\n\n if (httpStatusClass !== HttpStatusClass.ClientError && httpStatusClass !== HttpStatusClass.ServerError)\n return;\n\n onError(pagesFetched, response.statusCode);\n }, [response?.statusCode]);\n\n return {\n items: response?.items,\n hasMore: !!response?.nextCursor,\n nextCursor: response?.nextCursor,\n isFetching: response?.isFetching,\n totalItems: response?.totalItems,\n hasFirstPageCompleted: response?.hasFirstPageCompleted\n };\n}\n",":local {\n .container {\n color: $gray-900;\n }\n\n .spinner {\n width: $cv-svg-size-md;\n height: $cv-svg-size-md;\n }\n}","import * as React from 'react';\nimport { Spinner } from 'react-bootstrap';\nimport { useInView } from 'react-intersection-observer';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { ChevronDownSvg } from 'libs/shared/images/svg/arrows/ChevronDownSvg';\n\nimport styles from './infinite-scroll-footer.module.scss';\n\ninterface InfiniteScrollFooterProps {\n isFetching: boolean;\n fetchNext?: (nextCursor: string) => void;\n nextCursor?: string;\n fetchOnScroll?: boolean;\n}\n\nInfiniteScrollFooter.defaultProps = {\n fetchOnScroll: false\n};\n\nexport function InfiniteScrollFooter(props: InfiniteScrollFooterProps): React.ReactElement {\n const [ ref, inView ] = useInView();\n\n React.useEffect(() => {\n if (!props.fetchOnScroll)\n return;\n\n if (!inView || props.isFetching)\n return;\n\n props.fetchNext?.(props.nextCursor);\n }, [ inView, props.isFetching ]);\n\n return (\n <div className={`p-3 text-center ${styles.container}`}>\n {props.isFetching ?\n <Spinner as='span' animation='border' role='status' className={styles.spinner} /> :\n (\n <div ref={ref}>\n <SvgContainer\n svg={ChevronDownSvg}\n className='svg-container cursor-pointer'\n size={SvgContainerSize.Large}\n onClick={() => props.fetchNext?.(props.nextCursor)}\n />\n </div>\n )\n }\n </div>\n );\n}\n","import { ColProps } from 'react-bootstrap';\n\nimport { VideoItemSize } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { Breakpoints } from 'libs/shared/hooks/useBreakpoints';\n\nexport const VideoListHelper = {\n getThumbnailColumns(): ColProps {\n return {\n xs: 12,\n sm: 5,\n lg: 3\n };\n },\n\n getDetailsColumns(): ColProps {\n return {\n xs: 12,\n sm: 7,\n lg: 9\n };\n },\n\n getSize(breakpoints: Breakpoints, size: VideoItemSize): VideoItemSize {\n if (breakpoints.sm)\n return 'sm';\n \n return size || 'md';\n },\n\n getThumbnailColSize(hasDragHandle: boolean): number {\n return hasDragHandle ? 10 : 12;\n }\n};\n",":local {\n .partialOptions {\n width: 5.375rem;\n }\n\n .partialName {\n width: 18.75rem;\n height: 1.3125rem;\n }\n\n .partialDescription {\n width: 12.5rem;\n height: 1.3125rem;\n }\n\n .partialThumbnail {\n padding-bottom: 56.25%;\n }\n\n .partialDragHandle {\n width: 1.25rem;\n height: 1.25rem;\n }\n}","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { VideoListHelper } from 'libs/shared/components/video-list/VideoListHelper';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\n\nimport styles from './partial-video-list.module.scss';\n\ninterface PartialVideoListProps {\n withReordering?: boolean;\n numVideos?: number;\n allowBulkActions?: boolean;\n}\n\nPartialVideoList.defaultProps = {\n numVideos: 15\n};\n\nexport function PartialVideoList(props: PartialVideoListProps): JSX.Element {\n return (\n <>\n {Array(props.numVideos).fill(null).map((_, i) => (\n <div className='d-flex' key={i}>\n {props.allowBulkActions && <div className='form-check pe-3 pe-sm-2 mx-0 mx-md-2' />}\n <PartialVideoItem {...props} />\n </div>\n ))}\n </>\n );\n}\n\nexport function PartialVideoItem(props: PartialVideoListProps): JSX.Element {\n const breakpoints = useBreakpoints();\n\n const size = VideoListHelper.getSize(breakpoints, 'md');\n const isSmall = size === 'sm';\n\n const withDragHandle = props.withReordering && !breakpoints.xs;\n\n return (\n <Row className={`${isSmall ? '' : 'py-2'} flex-grow-1`}>\n <Col {...VideoListHelper.getThumbnailColumns()} className={`flex-column align-items-flex-start ${isSmall ? `pb-2 pe-1` : 'mb-1 pe-3 pe-md-2'}`}>\n <Row>\n {!!withDragHandle && (\n <div className='d-flex align-items-center justify-content-center col-2'>\n <div className={`partial-loading-background ${styles.partialDragHandle}`} />\n </div>\n )}\n <Col xs={VideoListHelper.getThumbnailColSize(withDragHandle)}>\n <div className={`partial-loading-background ${isSmall ? 'rounded' : 'rounded-3'} ${styles.partialThumbnail}`} />\n </Col>\n </Row>\n </Col>\n <Col {...VideoListHelper.getDetailsColumns()} className={isSmall ? 'pb-2' : 'px-2'}>\n <div className={`partial-loading-background mb-1 ${styles.partialName}`} />\n <div className={`partial-loading-background ${styles.partialDescription}`} />\n </Col>\n </Row>\n );\n}\n\n","import * as React from 'react';\n\ninterface CheckboxProps {\n id: string;\n checked: boolean;\n onChange: (event: React.ChangeEvent<HTMLInputElement>) => void;\n label?: string;\n ariaLabel?: string;\n name?: string;\n className?: string;\n inputClassName?: string;\n disabled?: boolean;\n indeterminate?: boolean;\n isLabelEllipsis?: boolean;\n}\n\nCheckbox.defaultProps = {\n checked: false,\n label: '',\n className: ''\n};\n\n/**\n * Use this checkbox outside of Formik contexts\n */\nexport function Checkbox(props: CheckboxProps): JSX.Element {\n const { isLabelEllipsis } = props;\n const ref = React.useRef<HTMLInputElement>(null);\n\n React.useEffect(() => {\n if (!ref.current)\n return;\n\n if (props.checked) {\n if (ref.current.indeterminate)\n ref.current.indeterminate = false;\n\n return;\n }\n\n if (props.indeterminate && !ref.current.indeterminate) {\n ref.current.indeterminate = true;\n return;\n }\n\n if (!props.indeterminate && ref.current.indeterminate)\n ref.current.indeterminate = false;\n }, [ ref.current, props.indeterminate, props.checked ]);\n\n return (\n <div className={`form-check pe-2 ${props.className}`}>\n <input\n ref={ref}\n type='checkbox'\n className={`${props.inputClassName} form-check-input`}\n id={props.id}\n name={props.name}\n checked={props.checked}\n onChange={props.onChange}\n disabled={props.disabled}\n aria-checked={props.checked}\n aria-label={props.ariaLabel}\n />\n {props.label && (\n <label className='form-check-label cursor-pointer align-top' htmlFor={props.id}>\n <span className={`${isLabelEllipsis ? 'clamp-1' : ''}`}>{props.label}</span>\n </label>\n )}\n </div>\n );\n}\n","import React from 'react';\n\nexport function GraduationCapSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fill='currentColor'\n d='M16.863 20c-.662 0-1.21-.567-1.21-1.252s.548-1.252 1.21-1.252c.663 0 1.21.567 1.21 1.252S17.527 20 16.864 20m0-1.441a.183.183 0 0 0-.182.189c0 .118.068.189.182.189.115 0 .183-.071.183-.19a.183.183 0 0 0-.183-.188m0-.118a.516.516 0 0 1-.502-.52v-6.19L11.75 9.158a.53.53 0 0 1-.205-.71c.137-.26.456-.354.685-.212l4.886 2.717a.57.57 0 0 1 .274.473v6.496a.52.52 0 0 1-.526.52m-4.908-4.205a.8.8 0 0 1-.229-.048L2.296 9.51A.55.55 0 0 1 2 9.014c0-.212.114-.401.297-.472l9.52-4.489a.47.47 0 0 1 .434 0l9.452 4.489a.55.55 0 0 1 .297.472.49.49 0 0 1-.297.473l-9.52 4.701a.8.8 0 0 1-.228.048m-8.22-5.198 8.22 4.087 8.288-4.087-8.22-3.898zm8.151 8.41c-4.749 0-6.644-2.905-6.712-3.047a.7.7 0 0 1-.092-.284V10.81c0-.283.229-.52.503-.52s.502.237.502.52v3.142c.388.496 2.077 2.434 5.776 2.434 3.653 0 5.548-1.938 6.005-2.457v-2.93c0-.284.228-.52.502-.52s.502.236.502.52v3.118a.6.6 0 0 1-.091.307c-.046.142-2.192 3.024-6.895 3.024'\n />\n </svg>\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}\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CYFRcx63.chunk.js","names":[],"sources":["../../../../../node_modules/react-bootstrap/esm/Row.js","../../../../libs/shared/src/hooks/UseInfiniteScroll.ts","../../../../libs/shared/src/hooks/UseInfiniteList.ts","../../../../libs/shared/src/components/infinite-scroll-footer/infinite-scroll-footer.module.scss","../../../../libs/shared/src/components/infinite-scroll-footer/InfiniteScrollFooter.tsx","../../../../libs/shared/src/components/video-list/VideoListHelper.tsx","../../../../libs/shared/src/components/video-list/partial-loading/partial-video-list.module.scss","../../../../libs/shared/src/components/video-list/partial-loading/PartialVideoList.tsx","../../../../libs/shared/src/components/forms/form-checkbox/Checkbox.tsx","../../../../libs/shared/src/images/svg/objects/GraduationCapSvg.tsx","../../../../libs/shared/src/hooks/UseGetMediaQueryString.ts"],"sourcesContent":["\"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;","import { useEffect } from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst SCROLL_TOLERANCE = 400; // value in px\n\ninterface UseInfiniteScrollOptions {\n fetchNextPage: () => void;\n hasMore: boolean;\n isFetching: boolean;\n scrollContainer?: HTMLElement;\n}\n\nexport function useInfiniteScroll(options: UseInfiniteScrollOptions): void {\n const handleScroll = (): void => {\n if (options.isFetching)\n return;\n\n if (!options.scrollContainer) {\n const currentScrollHeight = window.innerHeight + document.documentElement.scrollTop;\n \n const totalHeight = document.documentElement.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n } else {\n const { scrollContainer } = options;\n const currentScrollHeight = scrollContainer.getBoundingClientRect().height + scrollContainer.scrollTop;\n \n const totalHeight = scrollContainer.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n }\n\n options.fetchNextPage();\n };\n\n useEffect(() => {\n const onScroll = FunctionHelper.throttle(handleScroll, 200);\n\n const scrollContainer = options.scrollContainer || window;\n\n if (options.hasMore)\n scrollContainer.addEventListener('scroll', onScroll);\n\n return () => scrollContainer.removeEventListener('scroll', onScroll);\n }, [ options.hasMore, options.fetchNextPage, options.scrollContainer ]);\n}\n","import { useEffect, useState } from 'react';\n\nimport { HttpStatus, HttpStatusClass } from 'libs/common/backbone/enums/HttpStatus';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { BaseObject, BasePaginatedCollection } from 'libs/shared/interfaces';\n\nimport { useInfiniteScroll } from './UseInfiniteScroll';\nimport { useSelectAllPages } from './UseSelectAllPages';\n\nexport interface UseInfiniteListResult<T extends BaseObject> {\n items: T[];\n hasMore: boolean;\n isFetching: boolean;\n nextCursor: string;\n totalItems?: number;\n hasFirstPageCompleted: boolean;\n}\n\n/**\n * Hook to extract an infinite list from the application state,\n * save it locally in state and only update when new data\n * is fetched.\n * \n * @param getRequest - callback function to get the request for each page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n * \n * @param fetchNext - callback function to fetch a page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n */\nexport function useInfiniteList<TObject = BaseObject, TResponse = BasePaginatedCollection<TObject>>(\n getRequest: ((cursor?: string) => Flight.Request) | false,\n fetchNext: ((cursor?: string) => void) | false,\n onError?: (pageNumber: number, statusCode: HttpStatus) => void,\n getItems?: (responseData: TResponse) => TObject[],\n getCursor?: (responseData: TResponse) => string,\n scrollContainer?: HTMLElement\n): UseInfiniteListResult<TObject> {\n const [ pagesFetched, setPagesFetched ] = useState(0);\n\n const fetchNextFn = fetchNext as (cursor?: string) => void;\n\n function getKey(cursor?: string): string {\n if (!getRequest)\n return null;\n\n const request = getRequest(cursor);\n\n if (!request)\n return null;\n\n return request.key;\n }\n\n const response = useSelectAllPages<TObject, TResponse>(\n getKey,\n getItems,\n getCursor\n );\n\n function fetchNextPage(): void {\n if (!fetchNext || !getRequest || !response)\n return;\n\n setPagesFetched(currentVal => currentVal + 1);\n return fetchNextFn(response.nextCursor);\n }\n\n useInfiniteScroll({\n fetchNextPage,\n hasMore: !!response?.nextCursor,\n isFetching: response?.isFetching,\n scrollContainer\n });\n\n useEffect(() => {\n if (!response)\n return;\n\n if (response.shouldInitialFetch && fetchNext) {\n fetchNextFn();\n setPagesFetched(currentVal => currentVal + 1);\n }\n }, [ response?.shouldInitialFetch, fetchNext ]);\n\n useEffect(() => {\n if (!response?.statusCode || !FunctionHelper.isFunction(onError))\n return;\n\n const httpStatusClass: HttpStatusClass = +(response.statusCode?.toString()?.substr(0, 1));\n\n if (httpStatusClass !== HttpStatusClass.ClientError && httpStatusClass !== HttpStatusClass.ServerError)\n return;\n\n onError(pagesFetched, response.statusCode);\n }, [response?.statusCode]);\n\n return {\n items: response?.items,\n hasMore: !!response?.nextCursor,\n nextCursor: response?.nextCursor,\n isFetching: response?.isFetching,\n totalItems: response?.totalItems,\n hasFirstPageCompleted: response?.hasFirstPageCompleted\n };\n}\n",":local {\n .container {\n color: $gray-900;\n }\n\n .spinner {\n width: $cv-svg-size-md;\n height: $cv-svg-size-md;\n }\n}","import * as React from 'react';\nimport { Spinner } from 'react-bootstrap';\nimport { useInView } from 'react-intersection-observer';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { ChevronDownSvg } from 'libs/shared/images/svg/arrows/ChevronDownSvg';\n\nimport styles from './infinite-scroll-footer.module.scss';\n\ninterface InfiniteScrollFooterProps {\n isFetching: boolean;\n fetchNext?: (nextCursor: string) => void;\n nextCursor?: string;\n fetchOnScroll?: boolean;\n}\n\nInfiniteScrollFooter.defaultProps = {\n fetchOnScroll: false\n};\n\nexport function InfiniteScrollFooter(props: InfiniteScrollFooterProps): React.ReactElement {\n const [ ref, inView ] = useInView();\n\n React.useEffect(() => {\n if (!props.fetchOnScroll)\n return;\n\n if (!inView || props.isFetching)\n return;\n\n props.fetchNext?.(props.nextCursor);\n }, [ inView, props.isFetching ]);\n\n return (\n <div className={`p-3 text-center ${styles.container}`}>\n {props.isFetching ?\n <Spinner as='span' animation='border' role='status' className={styles.spinner} /> :\n (\n <div ref={ref}>\n <SvgContainer\n svg={ChevronDownSvg}\n className='svg-container cursor-pointer'\n size={SvgContainerSize.Large}\n onClick={() => props.fetchNext?.(props.nextCursor)}\n />\n </div>\n )\n }\n </div>\n );\n}\n","import { ColProps } from 'react-bootstrap';\n\nimport { VideoItemSize } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { Breakpoints } from 'libs/shared/hooks/useBreakpoints';\n\nexport const VideoListHelper = {\n getThumbnailColumns(): ColProps {\n return {\n xs: 12,\n sm: 5,\n lg: 3\n };\n },\n\n getDetailsColumns(): ColProps {\n return {\n xs: 12,\n sm: 7,\n lg: 9\n };\n },\n\n getSize(breakpoints: Breakpoints, size: VideoItemSize): VideoItemSize {\n if (breakpoints.sm)\n return 'sm';\n \n return size || 'md';\n },\n\n getThumbnailColSize(hasDragHandle: boolean): number {\n return hasDragHandle ? 10 : 12;\n }\n};\n",":local {\n .partialOptions {\n width: 5.375rem;\n }\n\n .partialName {\n width: 18.75rem;\n height: 1.3125rem;\n }\n\n .partialDescription {\n width: 12.5rem;\n height: 1.3125rem;\n }\n\n .partialThumbnail {\n padding-bottom: 56.25%;\n }\n\n .partialDragHandle {\n width: 1.25rem;\n height: 1.25rem;\n }\n}","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { VideoListHelper } from 'libs/shared/components/video-list/VideoListHelper';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\n\nimport styles from './partial-video-list.module.scss';\n\ninterface PartialVideoListProps {\n withReordering?: boolean;\n numVideos?: number;\n allowBulkActions?: boolean;\n}\n\nPartialVideoList.defaultProps = {\n numVideos: 15\n};\n\nexport function PartialVideoList(props: PartialVideoListProps): JSX.Element {\n return (\n <>\n {Array(props.numVideos).fill(null).map((_, i) => (\n <div className='d-flex' key={i}>\n {props.allowBulkActions && <div className='form-check pe-3 pe-sm-2 mx-0 mx-md-2' />}\n <PartialVideoItem {...props} />\n </div>\n ))}\n </>\n );\n}\n\nexport function PartialVideoItem(props: PartialVideoListProps): JSX.Element {\n const breakpoints = useBreakpoints();\n\n const size = VideoListHelper.getSize(breakpoints, 'md');\n const isSmall = size === 'sm';\n\n const withDragHandle = props.withReordering && !breakpoints.xs;\n\n return (\n <Row className={`${isSmall ? '' : 'py-2'} flex-grow-1`}>\n <Col {...VideoListHelper.getThumbnailColumns()} className={`flex-column align-items-flex-start ${isSmall ? `pb-2 pe-1` : 'mb-1 pe-3 pe-md-2'}`}>\n <Row>\n {!!withDragHandle && (\n <div className='d-flex align-items-center justify-content-center col-2'>\n <div className={`partial-loading-background ${styles.partialDragHandle}`} />\n </div>\n )}\n <Col xs={VideoListHelper.getThumbnailColSize(withDragHandle)}>\n <div className={`partial-loading-background ${isSmall ? 'rounded' : 'rounded-3'} ${styles.partialThumbnail}`} />\n </Col>\n </Row>\n </Col>\n <Col {...VideoListHelper.getDetailsColumns()} className={isSmall ? 'pb-2' : 'px-2'}>\n <div className={`partial-loading-background mb-1 ${styles.partialName}`} />\n <div className={`partial-loading-background ${styles.partialDescription}`} />\n </Col>\n </Row>\n );\n}\n\n","import * as React from 'react';\n\ninterface CheckboxProps {\n id: string;\n checked: boolean;\n onChange: (event: React.ChangeEvent<HTMLInputElement>) => void;\n label?: string;\n ariaLabel?: string;\n name?: string;\n className?: string;\n inputClassName?: string;\n disabled?: boolean;\n indeterminate?: boolean;\n isLabelEllipsis?: boolean;\n}\n\nCheckbox.defaultProps = {\n checked: false,\n label: '',\n className: ''\n};\n\n/**\n * Use this checkbox outside of Formik contexts\n */\nexport function Checkbox(props: CheckboxProps): JSX.Element {\n const { isLabelEllipsis } = props;\n const ref = React.useRef<HTMLInputElement>(null);\n\n React.useEffect(() => {\n if (!ref.current)\n return;\n\n if (props.checked) {\n if (ref.current.indeterminate)\n ref.current.indeterminate = false;\n\n return;\n }\n\n if (props.indeterminate && !ref.current.indeterminate) {\n ref.current.indeterminate = true;\n return;\n }\n\n if (!props.indeterminate && ref.current.indeterminate)\n ref.current.indeterminate = false;\n }, [ ref.current, props.indeterminate, props.checked ]);\n\n return (\n <div className={`form-check pe-2 ${props.className}`}>\n <input\n ref={ref}\n type='checkbox'\n className={`${props.inputClassName} form-check-input`}\n id={props.id}\n name={props.name}\n checked={props.checked}\n onChange={props.onChange}\n disabled={props.disabled}\n aria-checked={props.checked}\n aria-label={props.ariaLabel}\n />\n {props.label && (\n <label className='form-check-label cursor-pointer align-top' htmlFor={props.id}>\n <span className={`${isLabelEllipsis ? 'clamp-1' : ''}`}>{props.label}</span>\n </label>\n )}\n </div>\n );\n}\n","import React from 'react';\n\nexport function GraduationCapSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fill='currentColor'\n d='M16.863 20c-.662 0-1.21-.567-1.21-1.252s.548-1.252 1.21-1.252c.663 0 1.21.567 1.21 1.252S17.527 20 16.864 20m0-1.441a.183.183 0 0 0-.182.189c0 .118.068.189.182.189.115 0 .183-.071.183-.19a.183.183 0 0 0-.183-.188m0-.118a.516.516 0 0 1-.502-.52v-6.19L11.75 9.158a.53.53 0 0 1-.205-.71c.137-.26.456-.354.685-.212l4.886 2.717a.57.57 0 0 1 .274.473v6.496a.52.52 0 0 1-.526.52m-4.908-4.205a.8.8 0 0 1-.229-.048L2.296 9.51A.55.55 0 0 1 2 9.014c0-.212.114-.401.297-.472l9.52-4.489a.47.47 0 0 1 .434 0l9.452 4.489a.55.55 0 0 1 .297.472.49.49 0 0 1-.297.473l-9.52 4.701a.8.8 0 0 1-.228.048m-8.22-5.198 8.22 4.087 8.288-4.087-8.22-3.898zm8.151 8.41c-4.749 0-6.644-2.905-6.712-3.047a.7.7 0 0 1-.092-.284V10.81c0-.283.229-.52.503-.52s.502.237.502.52v3.142c.388.496 2.077 2.434 5.776 2.434 3.653 0 5.548-1.938 6.005-2.457v-2.93c0-.284.228-.52.502-.52s.502.236.502.52v3.118a.6.6 0 0 1-.091.307c-.046.142-2.192 3.024-6.895 3.024'\n />\n </svg>\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}\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{C as e,D as t}from"./B1i9atik.chunk.js";import{l as n,u as r}from"./TJBzqR6k.chunk.js";import{t as i}from"./CzvVp9iC.chunk.js";import{t as a}from"./DgSFdSfV.chunk.js";import{t as o}from"./
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{C as e,D as t}from"./B1i9atik.chunk.js";import{l as n,u as r}from"./TJBzqR6k.chunk.js";import{t as i}from"./CzvVp9iC.chunk.js";import{t as a}from"./DgSFdSfV.chunk.js";import{t as o}from"./jErHNuXU2.chunk.js";import{t as s}from"./CCvXN2-C.chunk.js";import{n as c,r as l,t as u}from"./BI2S4EFA.chunk.js";import{t as d}from"./CAJOpkKZ.chunk.js";import{t as f}from"./RNP3-R8c.chunk.js";import{t as p}from"./Dsmr6Wly.chunk.js";import{t as m}from"./DUCTNoXj.chunk.js";t();var h=e(),g=i.encloseNamespace(`exchange.exchange`);function _(){let e=r(),t=n(s.exchange()),i=e=>o.childFolders(t.data.categoryTree.id,e),_=c(t.data&&i,t=>e(i(t)));return d(t),a({title:g(`exchangeArchive`)}),(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)(`div`,{className:`mb-3`,children:[(0,h.jsx)(f,{}),(0,h.jsx)(p,{active:`categories`})]}),_?.items?_.items.length?(0,h.jsx)(`div`,{className:`mx-n2`,children:(0,h.jsx)(l,{folders:_.items,getAppLink:e=>m(e),expandFolders:!0,showHeading:!1})}):(0,h.jsx)(h.Fragment,{}):(0,h.jsx)(`div`,{className:`mt-3`,children:(0,h.jsx)(u,{count:22})})]})}export{_ as ExchangeView};
|
|
2
|
+
//# sourceMappingURL=CeeAb-HT2.chunk.js.map
|