@clickview/lite 0.105.0-rc.0 → 0.105.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/dist/.vite/manifest.json +676 -676
  2. package/dist/bundles.json +1 -1
  3. package/dist/en.json +1 -1
  4. package/dist/scripts/{CsGcvd52.chunk.js → 7lrVefxF.chunk.js} +2 -2
  5. package/dist/scripts/{CsGcvd52.chunk.js.map → 7lrVefxF.chunk.js.map} +1 -1
  6. package/dist/scripts/{CHZLAcZ_2.chunk.js → B-V5u42C2.chunk.js} +3 -3
  7. package/dist/scripts/{CHZLAcZ_2.chunk.js.map → B-V5u42C2.chunk.js.map} +1 -1
  8. package/dist/scripts/{CKh-VEMl.chunk.js → B1rSJN7u.chunk.js} +2 -2
  9. package/dist/scripts/{CKh-VEMl.chunk.js.map → B1rSJN7u.chunk.js.map} +1 -1
  10. package/dist/scripts/{Dfo4EB26.chunk.js → BMSgkYr_.chunk.js} +2 -2
  11. package/dist/scripts/{Dfo4EB26.chunk.js.map → BMSgkYr_.chunk.js.map} +1 -1
  12. package/dist/scripts/{CUiXvqkf2.chunk.js → BNAB3zGE2.chunk.js} +2 -2
  13. package/dist/scripts/{CUiXvqkf2.chunk.js.map → BNAB3zGE2.chunk.js.map} +1 -1
  14. package/dist/scripts/{DMefg444.chunk.js → BObH8Qah.chunk.js} +2 -2
  15. package/dist/scripts/{DMefg444.chunk.js.map → BObH8Qah.chunk.js.map} +1 -1
  16. package/dist/scripts/{kjKFfyCC2.chunk.js → BS-WKys42.chunk.js} +2 -2
  17. package/dist/scripts/{kjKFfyCC2.chunk.js.map → BS-WKys42.chunk.js.map} +1 -1
  18. package/dist/scripts/{qhSE4Eld.chunk.js → BUdIzi2I.chunk.js} +2 -2
  19. package/dist/scripts/{qhSE4Eld.chunk.js.map → BUdIzi2I.chunk.js.map} +1 -1
  20. package/dist/scripts/{Bg-NmCOq.chunk.js → B_Au77Ey.chunk.js} +2 -2
  21. package/dist/scripts/{Bg-NmCOq.chunk.js.map → B_Au77Ey.chunk.js.map} +1 -1
  22. package/dist/scripts/{BNMFIMSB.chunk.js → B_v9mBnF.chunk.js} +2 -2
  23. package/dist/scripts/{BNMFIMSB.chunk.js.map → B_v9mBnF.chunk.js.map} +1 -1
  24. package/dist/scripts/{BT2nvPyG.chunk.js → BaN7PH04.chunk.js} +2 -2
  25. package/dist/scripts/{BT2nvPyG.chunk.js.map → BaN7PH04.chunk.js.map} +1 -1
  26. package/dist/scripts/{BfK63iLm2.chunk.js → BuzAbtqC2.chunk.js} +2 -2
  27. package/dist/scripts/{BfK63iLm2.chunk.js.map → BuzAbtqC2.chunk.js.map} +1 -1
  28. package/dist/scripts/{DyERxRJT2.chunk.js → Bz3CmGse2.chunk.js} +3 -3
  29. package/dist/scripts/{DyERxRJT2.chunk.js.map → Bz3CmGse2.chunk.js.map} +1 -1
  30. package/dist/scripts/{Bpgrfq1W2.chunk.js → C7sAao1u2.chunk.js} +2 -2
  31. package/dist/scripts/{Bpgrfq1W2.chunk.js.map → C7sAao1u2.chunk.js.map} +1 -1
  32. package/dist/scripts/{kitbrI3y.chunk.js → CH2FOD_Y.chunk.js} +2 -2
  33. package/dist/scripts/{kitbrI3y.chunk.js.map → CH2FOD_Y.chunk.js.map} +1 -1
  34. package/dist/scripts/{a9yj-pru.chunk.js → CIpKTjTa.chunk.js} +2 -2
  35. package/dist/scripts/{a9yj-pru.chunk.js.map → CIpKTjTa.chunk.js.map} +1 -1
  36. package/dist/scripts/{Bqi3bvPn.chunk.js → CMIWX3sc.chunk.js} +2 -2
  37. package/dist/scripts/{Bqi3bvPn.chunk.js.map → CMIWX3sc.chunk.js.map} +1 -1
  38. package/dist/scripts/{CLYwJpCJ.chunk.js → CyKAODDv.chunk.js} +2 -2
  39. package/dist/scripts/{CLYwJpCJ.chunk.js.map → CyKAODDv.chunk.js.map} +1 -1
  40. package/dist/scripts/{C35iCvXx2.chunk.js → Cys9_W-O2.chunk.js} +2 -2
  41. package/dist/scripts/{C35iCvXx2.chunk.js.map → Cys9_W-O2.chunk.js.map} +1 -1
  42. package/dist/scripts/{BnR_Hzcf.chunk.js → D9P9eNbi.chunk.js} +2 -2
  43. package/dist/scripts/{BnR_Hzcf.chunk.js.map → D9P9eNbi.chunk.js.map} +1 -1
  44. package/dist/scripts/{iEP6nnLh2.chunk.js → D9POCoFw2.chunk.js} +2 -2
  45. package/dist/scripts/{iEP6nnLh2.chunk.js.map → D9POCoFw2.chunk.js.map} +1 -1
  46. package/dist/scripts/{B6I8Vh8n.chunk.js → DB8xYV5H.chunk.js} +2 -2
  47. package/dist/scripts/{B6I8Vh8n.chunk.js.map → DB8xYV5H.chunk.js.map} +1 -1
  48. package/dist/scripts/{CTpJ4vP62.chunk.js → DT8lKxmy2.chunk.js} +2 -2
  49. package/dist/scripts/{CTpJ4vP62.chunk.js.map → DT8lKxmy2.chunk.js.map} +1 -1
  50. package/dist/scripts/{ByLl4bms2.chunk.js → DWQkljeD2.chunk.js} +2 -2
  51. package/dist/scripts/{ByLl4bms2.chunk.js.map → DWQkljeD2.chunk.js.map} +1 -1
  52. package/dist/scripts/{DQNW-R2Y.chunk.js → DdVzer9F.chunk.js} +2 -2
  53. package/dist/scripts/{DQNW-R2Y.chunk.js.map → DdVzer9F.chunk.js.map} +1 -1
  54. package/dist/scripts/{cu48iYhG.chunk.js → DkA7_vQC.chunk.js} +3 -3
  55. package/dist/scripts/{cu48iYhG.chunk.js.map → DkA7_vQC.chunk.js.map} +1 -1
  56. package/dist/scripts/{CecBf_FP.chunk.js → DqZVK9mn.chunk.js} +2 -2
  57. package/dist/scripts/{CecBf_FP.chunk.js.map → DqZVK9mn.chunk.js.map} +1 -1
  58. package/dist/scripts/{CB13vtRK.chunk.js → DuFYtiN6.chunk.js} +2 -2
  59. package/dist/scripts/{CB13vtRK.chunk.js.map → DuFYtiN6.chunk.js.map} +1 -1
  60. package/dist/scripts/{DcWcozji.chunk.js → DwNluqCs.chunk.js} +2 -2
  61. package/dist/scripts/{DcWcozji.chunk.js.map → DwNluqCs.chunk.js.map} +1 -1
  62. package/dist/scripts/{P9unbQX_2.chunk.js → FxuURp3k2.chunk.js} +2 -2
  63. package/dist/scripts/{P9unbQX_2.chunk.js.map → FxuURp3k2.chunk.js.map} +1 -1
  64. package/dist/scripts/{D_Txk-Lv.chunk.js → WDOpswDS.chunk.js} +2 -2
  65. package/dist/scripts/{D_Txk-Lv.chunk.js.map → WDOpswDS.chunk.js.map} +1 -1
  66. package/dist/scripts/{app-uVIoLFQW.js → app-Bsq2dxSw.js} +4 -4
  67. package/dist/scripts/{app-uVIoLFQW.js.map → app-Bsq2dxSw.js.map} +1 -1
  68. package/dist/scripts/{CZGYNiTy2.chunk.js → oqpijUVC2.chunk.js} +2 -2
  69. package/dist/scripts/{CZGYNiTy2.chunk.js.map → oqpijUVC2.chunk.js.map} +1 -1
  70. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"CUiXvqkf2.chunk.js","names":[],"sources":["../../../../libs/shared/src/apps/analytics/components/engagement-table/engagement-table.module.scss","../../../../libs/shared/src/apps/analytics/components/engagement-table/EngagementTableUtils.tsx","../../../../libs/shared/src/apps/analytics/components/engagement-table/EngagementTable.tsx","../../../../libs/shared/src/components/percentage-indicator/PartialPercentageIndicator.tsx","../../../../libs/shared/src/apps/analytics/components/insights/amount-watched/InsightAmountWatched.tsx","../../../../libs/shared/src/apps/analytics/utils/ChartColourUtils.ts","../../../../libs/shared/src/apps/analytics/utils/SharedUserActivityPieChartUtils.ts","../../../../libs/shared/src/apps/analytics/components/insights/total-views/InsightTotalViews.tsx","../../src/apps/my-shares/components/insights-heatmap/partial-loading/partial-insights-heatmap.module.scss","../../src/apps/my-shares/components/insights-heatmap/partial-loading/PartialInsightsHeatmap.tsx","../../../player/src/plugins/engagement-overlay-plugin/components/engagement-overlay-menu-item/engagement-overlay-menu-item.ts","../../../player/src/plugins/engagement-overlay-plugin/components/timepoint-interactions/timepoint-interactions.tsx","../../../player/src/plugins/engagement-overlay-plugin/components/engagement-overlay/engagement-overlay-chart-options.tsx","../../../player/src/plugins/engagement-overlay-plugin/components/engagement-overlay/engagement-overlay.ts","../../../player/src/plugins/engagement-overlay-plugin/engagement-overlay-plugin.ts","../../../player/src/plugins/interactive-plugin/interactive-seek-bar-plugin.ts","../../../player/src/players/reports/reports-player.ts","../../../player/src/react/ReportsPlayer.tsx","../../src/apps/my-shares/components/video-engagement-overlay/video-engagement-overlay.module.scss","../../src/apps/my-shares/components/video-engagement-overlay/VideoEngagementOverlay.tsx","../../src/apps/my-shares/components/insights-heatmap/insights-heatmap.module.scss","../../src/apps/my-shares/components/insights-heatmap/InsightsHeatmap.tsx"],"sourcesContent":[":local {\n .heatMap {\n height: 1rem;\n }\n\n // use avatar width\n .avatarContainer {\n width: 2rem;\n height: 2rem;\n }\n\n .cogIcon {\n cursor: pointer;\n color: $gray-900;\n line-height: 1;\n }\n}","import React from 'react';\nimport { Column, ColumnInstance, Row } from 'react-table';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EngagementHeatMap } from 'libs/shared/apps/analytics/components/engagement-heat-map/EngagementHeatMap';\nimport { anonymiseUserName } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { EngagementAvatar } from 'libs/shared/components/engagement-avatar/EngagementAvatar';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { PercentageIndicator, PercentageIndicatorLayout } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { CogSvg } from 'libs/shared/images/svg/objects/CogSvg';\nimport { Engagement, EngagementType } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from './engagement-table.module.scss';\n\nconst namespace = 'shared.engagementTable';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst EMPTY_ENGAGEMENT: Partial<Engagement> = {\n heatMap: [],\n engagementRate: 0,\n viewCount: 0\n};\n\ninterface CellWrapperProps {\n className?: string;\n}\n\nfunction CellWrapper(props: React.PropsWithChildren<CellWrapperProps>): JSX.Element {\n return (\n <div className={`${props.className ?? ''}`}>\n {props.children}\n </div>\n );\n}\n\ninterface HeaderCellProps {\n column: ColumnInstance<EngagementTableData>;\n phraseKey: string;\n}\n\nfunction HeaderCell(props: HeaderCellProps): JSX.Element {\n return (\n <CellWrapper className={`d-inline-block ${props.column.isSorted ? 'fw-bold' : ''}`}>\n {getPhrase(props.phraseKey)}\n </CellWrapper>\n );\n}\n\nexport interface EngagementTableData extends Engagement {\n user: AnonUser;\n}\n\nfunction getMaxHeatMapValue(engagement: Engagement[]): number {\n let max = 0;\n\n engagement.forEach(e => {\n const localMax = Math.max(...e.heatMap);\n\n if (localMax > max)\n max = localMax;\n });\n\n return max;\n}\n\n/**\n * Resolves the engagement type, inferring 'anon' for legacy data\n * where type is not set but userId is null.\n */\nfunction resolveEngagementType(engagement: Engagement): EngagementType | undefined {\n if (engagement.type) return engagement.type;\n if (engagement.userId === null || engagement.userId === undefined) return 'anon';\n return undefined;\n}\n\nfunction getEngagementTypeLabel(type: EngagementType): string | null {\n switch (type) {\n case 'student-reach':\n return getPhrase('classroomViews');\n case 'anon':\n return getPhrase('anonymous');\n default:\n return null;\n }\n}\n\nfunction getUsersName(user: AnonUser, anonymiseUsers: boolean, type?: EngagementType) {\n if (type) {\n const label = getEngagementTypeLabel(type);\n if (label && !user?.name) return { name: label, surname: '' };\n }\n\n const fullName = anonymiseUserName(user, anonymiseUsers);\n const nameParts = fullName.split(' ').filter(n => !!n);\n\n return {\n name: nameParts[0],\n surname: nameParts.slice(1).join(' ')\n };\n}\n\nfunction getUserRole(user: AnonUser): string | null {\n if (!user)\n return null;\n \n const role = UserHelper.getUserRole(user);\n\n if ([ UserRole.Admin, UserRole.SuperAdmin ].includes(role))\n return getPhrase('adminRole');\n \n const type = UserHelper.getUserType(user);\n \n if (type === UserGroup.Learner)\n return getPhrase('studentRole');\n \n if (type === UserGroup.Staff)\n return getPhrase('staffRole');\n\n return null;\n}\n\ninterface EngagementColumnProps {\n engagement: Engagement[];\n imageCdnUrl: string;\n anonymiseUsers: boolean;\n showSeparateNameColumns?: boolean;\n classroomViewsAppLink?: Core.AppLink;\n classroomViewsTooltip?: string;\n showRole?: boolean;\n}\n\nexport function useGetColumns(props: EngagementColumnProps): Column<EngagementTableData>[] {\n return React.useMemo(() => {\n const maxHeatMapValue = getMaxHeatMapValue(props.engagement);\n\n const nameColumns: Column<EngagementTableData>[] = props.showSeparateNameColumns ? [\n {\n id: 'firstName',\n Header: ({ column }: { column: ColumnInstance<EngagementTableData> }) => <HeaderCell column={column} phraseKey='firstName' />,\n accessor: 'user',\n width: 63,\n sortType: (rowA: Row<EngagementTableData>, rowB: Row<EngagementTableData>) => {\n const typeA = resolveEngagementType(rowA.original);\n const typeB = resolveEngagementType(rowB.original);\n const { name: nameA } = getUsersName(rowA.values.firstName, props.anonymiseUsers, typeA);\n const { name: nameB } = getUsersName(rowB.values.firstName, props.anonymiseUsers, typeB);\n return nameA > nameB ? 1 : -1;\n },\n Cell: ({ value, row: { original } }: { value: AnonUser, row: Row<EngagementTableData> }) => {\n const effectiveType = resolveEngagementType(original);\n const { name, surname } = getUsersName(value, props.anonymiseUsers, effectiveType);\n return (\n <CellWrapper className='d-flex align-items-center h-100'>\n <span className={styles.avatarContainer}>\n <EngagementAvatar\n type={effectiveType}\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(name, surname)}\n imageUrl={!props.anonymiseUsers && !effectiveType && value?.avatar?.url}\n anonymiseUsers={props.anonymiseUsers}\n />\n </span>\n <span className='ms-2 clamp-1'>\n {name}\n </span>\n {effectiveType === 'student-reach' && props.classroomViewsAppLink &&\n <IconButton\n customSize\n svg={CogSvg}\n svgSize={SvgContainerSize.Standard}\n appLink={props.classroomViewsAppLink}\n className={styles.cogIcon}\n tooltip={props.classroomViewsTooltip}\n tooltipTrigger={['hover']}\n ariaLabel={props.classroomViewsTooltip}\n />\n }\n </CellWrapper>\n );\n }\n },\n {\n id: 'surname',\n Header: ({ column }: { column: ColumnInstance<EngagementTableData> }) => <HeaderCell column={column} phraseKey='surname' />,\n accessor: 'user',\n width: 68,\n sortType: (rowA: Row<EngagementTableData>, rowB: Row<EngagementTableData>) => {\n const typeA = resolveEngagementType(rowA.original);\n const typeB = resolveEngagementType(rowB.original);\n const { surname: surnameA } = getUsersName(rowA.values.surname, props.anonymiseUsers, typeA);\n const { surname: surnameB } = getUsersName(rowB.values.surname, props.anonymiseUsers, typeB);\n return surnameA > surnameB ? 1 : -1;\n },\n Cell: ({ value, row: { original } }: { value: AnonUser, row: Row<EngagementTableData> }) => {\n const { surname } = getUsersName(value, props.anonymiseUsers, resolveEngagementType(original));\n return (\n <CellWrapper className='d-flex align-items-center h-100'>\n <span className='clamp-1'>\n {surname || ''}\n </span>\n </CellWrapper>\n );\n }\n }\n ] : [\n {\n id: 'name',\n Header: ({ column }: { column: ColumnInstance<EngagementTableData> }) => <HeaderCell column={column} phraseKey='name' />,\n accessor: 'user',\n width: 22,\n sortType: (rowA: Row<EngagementTableData>, rowB: Row<EngagementTableData>) => {\n const typeA = resolveEngagementType(rowA.original);\n const typeB = resolveEngagementType(rowB.original);\n const nameA = typeA ?\n getEngagementTypeLabel(typeA) :\n anonymiseUserName(rowA.values.user, props.anonymiseUsers);\n const nameB = typeB ?\n getEngagementTypeLabel(typeB) :\n anonymiseUserName(rowB.values.user, props.anonymiseUsers);\n\n return nameA > nameB ? 1 : -1;\n },\n Cell: ({ value, row: { original } }: { value: AnonUser, row: Row<EngagementTableData> }) => {\n const effectiveType = resolveEngagementType(original);\n const { name, surname } = getUsersName(value, props.anonymiseUsers, effectiveType);\n return (\n <CellWrapper className='d-flex align-items-center h-100'>\n <span className={styles.avatarContainer}>\n <EngagementAvatar\n type={effectiveType}\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(name, surname)}\n imageUrl={!props.anonymiseUsers && !effectiveType && value?.avatar?.url}\n anonymiseUsers={props.anonymiseUsers}\n />\n </span>\n <span className='ms-2 clamp-1 me-1'>\n {name} {surname}\n </span>\n {effectiveType === 'student-reach' && props.classroomViewsAppLink &&\n <IconButton\n customSize\n svg={CogSvg}\n svgSize={SvgContainerSize.Standard}\n appLink={props.classroomViewsAppLink}\n className={styles.cogIcon}\n tooltip={props.classroomViewsTooltip}\n ariaLabel={props.classroomViewsTooltip}\n />\n }\n </CellWrapper>\n );\n }\n }\n ];\n\n const roleColumn: Column<EngagementTableData>[] = [];\n\n if (props.showRole) {\n roleColumn.push({\n Header: ({ column }) => <HeaderCell column={column} phraseKey='role' />,\n accessor: 'user',\n width: 20,\n Cell: ({ value }: { value: AnonUser }) => {\n const role = getUserRole(value);\n return (\n <CellWrapper className='d-flex align-items-center h-100'>\n {role ?\n <div>{role}</div> :\n <span dangerouslySetInnerHTML={{ __html: '&dash;' }} />\n }\n </CellWrapper>\n );\n }\n });\n }\n\n return [\n ...nameColumns,\n ...roleColumn,\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='views' />,\n accessor: 'viewCount',\n // React table uses flex ratios for widths. I've styled with 5 columns but didn't want to effect the sizing\n // for when it was 4 so we're keeping the new and old values - Sha\n width: props.showSeparateNameColumns ? 47 : 15,\n sortType: 'basic',\n sortDescFirst: true,\n Cell: ({ value }) => (\n <CellWrapper className='d-flex align-items-center h-100'>\n <div>{value}</div>\n </CellWrapper>\n )\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='engagement' />,\n accessor: 'engagementRate',\n // React table uses flex ratios for widths. I've styled with 5 columns but didn't want to effect the sizing\n // for when it was 4 so we're keeping the new and old values - Sha\n width: props.showSeparateNameColumns ? 79 : 20,\n sortDescFirst: true,\n Cell: ({ value }) => (\n <CellWrapper className='w-33'>\n <PercentageIndicator\n percentage={value}\n layout={PercentageIndicatorLayout.LabelBefore}\n />\n </CellWrapper>\n )\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='heatMap' />,\n accessor: 'heatMap',\n // React table uses flex ratios for widths. I've styled with 5 columns but didn't want to effect the sizing\n // for when it was 4 so we're keeping the new and old values - Sha\n width: props.showSeparateNameColumns ? 230 : 48,\n disableSortBy: true,\n Cell: ({ row: { original } }) => (\n <CellWrapper className='d-flex align-items-center h-100'>\n <EngagementHeatMap\n engagement={original}\n max={maxHeatMapValue}\n className={`${styles.heatMap} flex-grow-1`}\n />\n </CellWrapper>\n )\n }\n ];\n }, [ props.anonymiseUsers, props.showSeparateNameColumns ]);\n}\n\nexport function useGetTableData(\n engagement: Engagement[],\n users: AnonUser[],\n classroomStudents?: AnonUser[]\n): EngagementTableData[] {\n return React.useMemo(() => {\n const data: EngagementTableData[] = [];\n\n const userIdSet = new Set<string>();\n engagement?.forEach(e => {\n const user = users?.find(u => {\n if (u.id && u.id === e.userId) {\n userIdSet.add(u.id);\n return true;\n }\n\n if (u.sessionId && u.sessionId === e.sessionId)\n return true;\n\n return false;\n });\n\n data.push({ ...e, user });\n });\n\n if (classroomStudents?.length) {\n const students = classroomStudents\n .filter(s => !userIdSet.has(s.id))\n .map(user => ({ ...EMPTY_ENGAGEMENT, userId: user.id, user } as EngagementTableData));\n data.push(...students);\n }\n\n return data;\n }, [ engagement, users, classroomStudents ]);\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { Table, TableTheme } from 'libs/shared/components/table/Table';\nimport { Engagement } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport { useGetColumns, useGetTableData } from './EngagementTableUtils';\n\nconst theme: TableTheme = {\n table: 'bg-white rounded px-0',\n header: 'border-bottom',\n headerCell: 'm-3',\n cell: 'mx-3 my-2'\n};\n\ninterface EngagementTableProps {\n engagement: Engagement[];\n imageCdnUrl: string;\n users?: AnonUser[];\n classroomStudents?: AnonUser[];\n anonymiseUsers: boolean;\n border?: boolean;\n enableSort?: boolean;\n showSeparateNameColumns?: boolean;\n showRole?: boolean;\n classroomViewsAppLink?: Core.AppLink;\n classroomViewsTooltip?: string;\n}\n\nexport function EngagementTable(props: EngagementTableProps): JSX.Element {\n const columns = useGetColumns({\n engagement: props.engagement,\n imageCdnUrl: props.imageCdnUrl,\n anonymiseUsers: props.anonymiseUsers,\n showSeparateNameColumns: props.showSeparateNameColumns,\n classroomViewsAppLink: props.classroomViewsAppLink,\n classroomViewsTooltip: props.classroomViewsTooltip,\n showRole: props.showRole\n });\n\n const data = useGetTableData(props.engagement, props.users, props.classroomStudents);\n\n if (!data.length)\n return <></>;\n\n return (\n <Table\n columns={columns}\n data={data}\n theme={{\n ...theme,\n table: props.border ? `${theme.table} border` : theme.table\n }}\n enableSort={props.enableSort}\n />\n );\n}\n","import React from 'react';\n\nimport { PercentageIndicator, PercentageIndicatorLayout } from './PercentageIndicator';\n\ninterface PartialPercentageIndicatorProps {\n layout: PercentageIndicatorLayout;\n className?: string;\n}\n\nexport function PartialPercentageIndicator(props: PartialPercentageIndicatorProps): JSX.Element {\n return (\n <PercentageIndicator\n layout={props.layout}\n className={props.className}\n percentage={0}\n customLabel='--%'\n />\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { getEngagementRate } from 'libs/shared/apps/analytics/utils/EngagementUtils';\nimport { PartialPercentageIndicator } from 'libs/shared/components/percentage-indicator/PartialPercentageIndicator';\nimport { PercentageIndicator, PercentageIndicatorLayout } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { TimerSvg } from 'libs/shared/images/svg/status/TimerSvg';\nimport { Engagement } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.insightAmountWatched';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightAmountWatchedProps {\n engagement: Engagement[];\n}\n\nexport function InsightAmountWatched(props: InsightAmountWatchedProps) {\n const engagementRate = getEngagementRate(props.engagement);\n const percentage = Math.round(engagementRate * 100);\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svg={TimerSvg}\n svgClassName='bg-light-green text-green'\n >\n <div className='d-flex flex-column align-items-center my-auto gap-2'>\n {!!props.engagement &&\n <>\n <PercentageIndicator\n percentage={engagementRate}\n layout={PercentageIndicatorLayout.LabelInside}\n />\n <p className='text-center'>\n {typeof engagementRate === 'number' ?\n <Text namespace={namespace} phrase='everyoneWatched' options={{ percentage }} /> :\n <Text namespace={namespace} phrase='notWatched' />\n }\n </p>\n </>\n }\n {!props.engagement &&\n <>\n <PartialPercentageIndicator layout={PercentageIndicatorLayout.LabelInside} />\n </>\n }\n </div>\n </InsightCard>\n );\n}\n","const CHART_COLOURS = [\n '#FF9300', // Pizazz\n '#38A2E8', // Picton Blue\n '#7A76E8', // Portage\n '#B679C7', // East Side\n '#F7847B', // Froly\n '#D9584F', // Red (Not in the Primary palette)\n '#FFCD52', // Yellow (Not in the Primary Palette)\n '#5DC786', // Emerald\n '#40BCC3', // Perolous\n '#40C2BB' // Puerto rico\n];\n\nexport function mixinSeriesColours<T>(data: T[]): T[] {\n return data.map((d, idx) => ({\n ...d,\n color: CHART_COLOURS[idx % CHART_COLOURS.length]\n }));\n}\n","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport { BaseAnalyticsEventResponse, GroupedAnalyticsCount } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { UnionEventResponse } from 'libs/shared/apps/analytics/interfaces/UnionEvent';\nimport { VideoViewEventResponse } from 'libs/shared/apps/analytics/interfaces/VideoViewEvent';\nimport { mixinSeriesColours } from 'libs/shared/apps/analytics/utils/ChartColourUtils';\n\ntype EventResponseGroupByAttributes = keyof Pick<VideoViewEventResponse, 'contentTypeCount'> |\n keyof Pick<BaseAnalyticsEventResponse, 'userTypeCount' | 'yearGroupCount'>;\n\nexport function groupEvents(\n events: UnionEventResponse,\n groupBy: EventResponseGroupByAttributes,\n groupsToOmit?: string[],\n getSeriesName?: (group: string) => string\n): Highcharts.PointOptionsObject[] {\n const groups: HashObject<number> = {};\n\n const eventCounts = events[groupBy as keyof UnionEventResponse] as GroupedAnalyticsCount[];\n\n eventCounts?.forEach(ev => {\n const name = ev.name || 'Unknown';\n\n if (!name || groupsToOmit?.includes(name.toLowerCase()))\n return;\n\n groups[name] = groups[name] ?? 0;\n groups[name] += ev.count;\n });\n\n return mixinSeriesColours(ArrayHelper.sortBy(Object.keys(groups).map(group => ({\n name: getSeriesName ? getSeriesName(group) : group,\n y: groups[group],\n type: 'pie'\n })), 'name'));\n}\n\nexport function sortByYearGroup(data: Highcharts.PointOptionsObject[]) {\n const staffIndex = data.findIndex(group => group.name === 'Staff');\n\n // Move Staff to last index\n if (staffIndex > -1) {\n const [staffObject] = data.splice(staffIndex, 1);\n\n data.push(staffObject);\n }\n return data.sort((a, b) => {\n const numA = parseInt((a.name as string).match(/\\d+/)?.[0]);\n const numB = parseInt((b.name as string).match(/\\d+/)?.[0]);\n return numA - numB;\n });\n}\n\nexport function getTotalEventCount(data?: Highcharts.PointOptionsObject[]): number | null {\n return data?.reduce((a, b) => a + b.y, 0) ?? null;\n}\n","import React from 'react';\nimport Highcharts from 'highcharts';\nimport { HighchartsReact } from 'highcharts-react-official';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { CHART_FONT_STYLES } from 'libs/shared/apps/analytics/constants/ChartStyles';\nimport { VideoViewEventResponse } from 'libs/shared/apps/analytics/interfaces/VideoViewEvent';\nimport { getTotalEventCount, groupEvents, sortByYearGroup } from 'libs/shared/apps/analytics/utils/SharedUserActivityPieChartUtils';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VisibleOnSvg } from 'libs/shared/images/svg/actions/VisibleOnSvg';\n\nconst namespace = 'shared.insightTotalViews';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction mapUserTypeToChartLabel(type: string): string {\n if (type === 'Unknown')\n return getPhrase('anon');\n return type;\n}\n\nconst STATIC_CHART_OPTIONS: Highcharts.Options = {\n title: {\n text: null\n },\n credits: {\n enabled: false\n },\n chart: {\n backgroundColor: 'transparent',\n spacing: [ 0, 0, 0, 0 ]\n },\n legend: {\n itemStyle: CHART_FONT_STYLES,\n itemDistance: 8\n },\n plotOptions: {\n pie: {\n allowPointSelect: true,\n cursor: 'pointer',\n dataLabels: {\n enabled: false\n },\n showInLegend: true,\n borderWidth: 1,\n borderColor: '#ffffff',\n borderRadius: 0,\n size: '80%'\n }\n }\n};\n\ninterface InsightTotalViewsProps {\n events: VideoViewEventResponse;\n emptyStateImage: string;\n hideStaffResults: boolean;\n}\n\nexport function InsightTotalViews(props: InsightTotalViewsProps) {\n const grouped = groupEvents(\n props.events,\n 'yearGroupCount',\n props.hideStaffResults ? ['staff'] : [],\n mapUserTypeToChartLabel\n );\n const chartData = sortByYearGroup(grouped);\n const totalViews = getTotalEventCount(chartData);\n\n function getChartOptions(\n data: Highcharts.PointOptionsObject[]\n ): Highcharts.Options {\n return {\n ...STATIC_CHART_OPTIONS,\n series: [{\n type: 'pie',\n name: getPhrase('title'),\n data\n }]\n };\n }\n\n return (\n <InsightCard\n title={getPhrase('title')}\n // Replace with ultra marine + light colour\n svgClassName='bg-light-blue text-blue'\n // Add visibility icon \n svg={VisibleOnSvg}\n >\n {chartData?.length ? (\n <>\n <p className='mb-0'><Text namespace={namespace} phrase='totalViews' options={{ totalViews }} /></p>\n\n <div className='d-flex justify-content-center h-75'>\n <HighchartsReact\n highcharts={Highcharts}\n options={getChartOptions(chartData)}\n containerProps={{\n className: `w-100`\n }}\n />\n </div>\n </>\n ) : (\n <EmptyState className='pt-0 my-auto'>\n <EmptyState.Image src={props.emptyStateImage} className='w-75 h-auto'></EmptyState.Image>\n <EmptyState.Heading className='h4'><Text namespace={namespace} phrase='noViews' /></EmptyState.Heading>\n <EmptyState.Info className='w-100'><Text namespace={namespace} phrase='notWatched' /></EmptyState.Info>\n </EmptyState>\n )}\n </InsightCard>\n );\n}\n",":local {\n .partialInsights {\n height: 21.5rem;\n }\n\n .videoContainer {\n width: 44%;\n }\n}","import React from 'react';\n\nimport styles from './partial-insights-heatmap.module.scss';\n\nexport function PartialInsightsHeatmap() {\n return (\n <div>\n <div className='row g-3 mb-3'>\n <div className='col'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className={styles.videoContainer}>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n </div>\n\n <div className='row g-3 mb-5'>\n <div className='col-12'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n </div>\n </div>\n );\n}\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nconst MenuItem = videojs.getComponent('MenuItem');\n\ninterface EngagementOverlayMenuItemOptions extends videojs.MenuItemOptions {\n overlayVisible: boolean;\n}\n\nexport class EngagementOverlayMenuItem extends MenuItem {\n private toggleEl: Element;\n private overlayVisible: boolean;\n\n /**\n * Because we want to bind our listener in createEl\n * and createEl runs in super. We store if we've bounud\n * our handler, so we only call bind once and \n * the call to removeEventListener will still work\n */\n private handlerBound: boolean;\n\n constructor(player: VideoJsPlayer, options: EngagementOverlayMenuItemOptions) {\n super(player, options);\n\n this.overlayVisible = options.overlayVisible;\n this.toggle(this.overlayVisible);\n }\n\n public handleToggle(): void {\n this.toggle(!this.overlayVisible);\n }\n\n private toggle(state: boolean): void {\n state ? this.toggleOn() : this.toggleOff();\n }\n\n private toggleOn(): void {\n videojs.dom.addClass(this.toggleEl, 'on');\n this.overlayVisible = true;\n this.player().engagementOverlayPlugin().toggleOverlay(this.overlayVisible);\n this.player().addClass('cv-reports-player-overlay-visible');\n }\n\n private toggleOff(): void {\n videojs.dom.removeClass(this.toggleEl, 'on');\n this.overlayVisible = false;\n this.player().engagementOverlayPlugin().toggleOverlay(this.overlayVisible);\n this.player().removeClass('cv-reports-player-overlay-visible');\n }\n\n /**\n * Because we extend MenuItem which will close the menu by default\n * we need to halt the event propogation here\n */\n public handleClick(event: videojs.EventTarget.Event): void {\n event.stopImmediatePropagation();\n }\n\n public createEl(tagName?: string, properties?: any, attributes?: any): HTMLLIElement {\n /**\n * Bind our event listener only once\n * see the comment where handlerBound is defined\n */\n if (!this.handlerBound) {\n this.handleToggle = this.handleToggle.bind(this);\n this.handlerBound = true;\n }\n\n if (this.toggleEl)\n this.toggleEl.removeEventListener('click', this.handleToggle);\n\n this.toggleEl = videojs.dom.createEl('div', {\n className: `custom-toggle custom-toggle-info toggle-option float-end`,\n innerHTML: '<span class=\"handle\"></span></div>'\n });\n this.toggleEl.addEventListener('click', this.handleToggle);\n\n const innerHTML = `\n <span class=\"vjs-menu-item-text\">Heat Map</span>\n <span class=\"cv-toggle-container\"></span>`;\n\n const el = super.createEl(tagName, {\n className: 'vjs-menu-item cv-cog-menu-item',\n innerHTML\n }, attributes);\n\n /**\n * Indexing into the child this way is only safe to do because\n * we know that the el only has two children\n */\n el.children[1].appendChild(this.toggleEl);\n\n return el;\n }\n}\n\nvideojs.registerComponent('EngagementOverlayMenuItem', EngagementOverlayMenuItem);\n","import React from 'react';\n\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { Interactive } from 'libs/shared/interfaces';\n\nconst MAX_INTERACTIONS_TO_SHOW = 3;\n\ninterface TimepointInteractionsProps {\n interactive: Interactive;\n time: number;\n}\n\nexport function TimepointInteractions(props: TimepointInteractionsProps): JSX.Element {\n const timepoint = props.interactive.timepoints.find(t => {\n const timepointTime = t.visibleAt / 1000;\n \n return Math.floor(props.time) === Math.floor(timepointTime)\n || Math.ceil(props.time) === Math.ceil(timepointTime);\n });\n\n if (!timepoint?.interactions?.length)\n return <></>;\n\n const interactions = timepoint.interactions.length > MAX_INTERACTIONS_TO_SHOW ?\n timepoint.interactions.slice(0, MAX_INTERACTIONS_TO_SHOW - 1) :\n timepoint.interactions;\n\n const hiddenInteractions = timepoint.interactions.length - interactions.length;\n\n return (\n <div className='d-flex justify-content-end ms-2'>\n {interactions.map((i, idx) => (\n <InteractionLabel\n key={idx}\n interaction={i}\n showQuestion={false}\n iconClassName='ms-1'\n />\n ))}\n {!!hiddenInteractions &&\n <div\n className={'interaction-type-icon d-flex justify-content-center' +\n ' align-items-center border border-dark text-body ms-1'}\n >\n {`+${hiddenInteractions}`}\n </div>\n }\n </div>\n );\n}\n","import React from 'react';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport Highcharts from 'highcharts';\n\nimport { Interactive } from 'libs/shared/interfaces';\n\nimport { TimepointInteractions } from 'projects/player/plugins/engagement-overlay-plugin/components/timepoint-interactions/timepoint-interactions';\nimport { formatTime } from 'projects/player/utils/formatTime';\n\nexport const STATIC_CHART_OPTIONS: Highcharts.Options = {\n title: {\n text: null\n },\n xAxis: {\n visible: false,\n minPadding: 0,\n maxPadding: 0\n },\n legend: {\n enabled: false\n },\n credits: {\n enabled: false\n },\n defs: {\n gradient: ({\n tagName: 'linearGradient',\n id: 'area-gradient',\n x1: 0,\n y1: 1,\n x2: 0,\n y2: 0,\n children: [\n ({\n tagName: 'stop',\n offset: 0\n } as Highcharts.ASTNode),\n ({\n tagName: 'stop',\n offset: 1\n } as Highcharts.ASTNode)\n ]\n } as Highcharts.ASTNode)\n }\n};\n\nexport function getChartOptions(width: number, height: number): Highcharts.ChartOptions {\n return {\n styledMode: true,\n spacing: [ 15, 0, 0, 0 ],\n width,\n height\n };\n}\n\nexport function getYAxisChartOptions(heatMap: number[]): Highcharts.YAxisOptions {\n const maxValue = Math.max(...heatMap);\n\n return {\n /**\n * To prevent max values from being cut off, we pad them relative to the chart scale.\n */\n max: maxValue * 1.05,\n min: 0,\n minPadding: 0,\n maxPadding: 0,\n allowDecimals: true,\n startOnTick: false,\n endOnTick: false,\n visible: false\n };\n}\n\nexport function getTooltipOptions(interactive?: Interactive): Highcharts.TooltipOptions {\n return {\n formatter: function () {\n const timepointInteractionsHtml = interactive ?\n getTimepointInteractionsHtml(interactive, this.x) :\n '';\n\n return (\n '<div class=\"cv-engagement-tooltip bg-white rounded\">' +\n '<div class=\"d-flex justify-content-between\">' +\n `<strong>${formatTime(this.x)}</strong>` +\n `${timepointInteractionsHtml}` +\n '</div>' +\n '<div class=\"d-flex justify-content-between rounded bg-light cv-view-count-container\">' +\n `<strong>Views</strong> <span class=\"cv-view-count\">${this.y}</span>` +\n '</div>' +\n '</div>'\n );\n },\n positioner: function (\n labelWidth: number,\n labelHeight: number,\n point: Highcharts.TooltipPositionerPointObject\n ) {\n const minX = 0;\n const maxX = this.chart.plotWidth - labelWidth;\n const x = point.plotX - labelWidth / 2;\n \n return {\n // Clamp x between min and max\n x: Math.min(Math.max(x, minX), maxX),\n y: this.chart.plotTop\n };\n },\n useHTML: true,\n padding: 0\n };\n}\n\nexport function getPlotOptions(moveTimepointIndicator: (x: number | null) => void): Highcharts.PlotOptions {\n return {\n area: {\n point: {\n events: {\n mouseOver: function () {\n moveTimepointIndicator(this.x);\n },\n mouseOut: function () {\n moveTimepointIndicator(null);\n }\n }\n }\n },\n series: {\n marker: {\n enabled: false\n }\n }\n };\n}\n\nfunction getTimepointInteractionsHtml(interactive: Interactive, time: number): string {\n return renderToStaticMarkup(\n <TimepointInteractions time={time} interactive={interactive} />\n );\n}\n","import Highcharts from 'highcharts';\nimport videojs, { VideoJsPlayer } from 'video.js';\n\nimport { Interactive } from 'libs/shared/interfaces';\n\nimport {\n getChartOptions,\n getPlotOptions,\n getTooltipOptions,\n getYAxisChartOptions,\n STATIC_CHART_OPTIONS\n} from './engagement-overlay-chart-options';\n\nimport './engagement-overlay.scss';\n\nconst Component = videojs.getComponent('Component');\n\nHighcharts.AST.allowedTags.push('g');\nHighcharts.AST.allowedAttributes.push('viewBox', 'transform');\n\ninterface ChartDimensions {\n width: number;\n height: number;\n}\n\ninterface EngagementOverlayOptions extends videojs.ComponentOptions {\n heatMap: number[];\n interactive?: Interactive;\n onTimepointHover?: (time: number | null) => void;\n}\n\nexport class EngagementOverlay extends Component {\n public options_: EngagementOverlayOptions;\n private chart: Highcharts.Chart;\n\n constructor(player: VideoJsPlayer, options: EngagementOverlayOptions) {\n super(player, options);\n\n this.initialize();\n this.bindListeners();\n }\n\n public initialize(): void {\n this.player().ready(() => this.buildChart());\n }\n\n public buildCSSClass(): string {\n return 'cv-engagement-overlay';\n }\n\n public createEl(tagName?: string, properties?: any, attributes?: any): Element {\n const innerHTML = '<div class=\"cv-engagement-chart\"></div>' +\n '<div class=\"cv-engagement-timepoint-indicator\"></div>';\n\n return super.createEl(tagName, {\n ...properties,\n className: this.buildCSSClass(),\n innerHTML\n }, attributes);\n }\n\n public toggleChart(show: boolean): void {\n if (show)\n this.buildChart();\n else\n this.destroyChart();\n }\n\n private bindListeners(): void {\n this.handleClick = this.handleClick.bind(this);\n this.resizeChart = this.resizeChart.bind(this);\n\n this.player().on('playerresize', this.resizeChart);\n\n this.on(this.el(), 'mouseup', this.handleClick);\n\n this.player().on('dispose', () => {\n this.player().off('playerresize', this.resizeChart);\n\n this.off(this.el(), 'mouseup', this.handleClick);\n });\n }\n\n private handleClick(event: videojs.EventTarget.Event): void {\n if (!videojs.dom.isSingleLeftClick(event))\n return;\n\n if (this.player().paused()) {\n this.player().play();\n return;\n }\n\n this.player().pause();\n }\n\n private buildChart(): void {\n if (this.chart)\n return;\n\n const chartDimensions = this.getChartDimensions();\n\n /**\n * The dimensions calculation relies on the control bar and progress control\n * being visible, so if it isn't, we wait for the play event.\n */\n if (!chartDimensions) {\n this.player().one('play', () => this.buildChart());\n return;\n }\n\n const container: HTMLElement = this.el().querySelector('.cv-engagement-chart');\n\n this.chart = Highcharts.chart(container, this.getHighchartOptions(chartDimensions));\n }\n\n private resizeChart(): void {\n const chartDimensions = this.getChartDimensions();\n\n if (!this.chart || !chartDimensions)\n return;\n\n this.chart.setSize(chartDimensions.width, chartDimensions.height);\n }\n\n private destroyChart(): void {\n this.chart?.destroy();\n this.chart = null;\n }\n\n private getChartDimensions(): ChartDimensions {\n const collapserator = this.player().getChild('collapserator');\n const collapseratorHeight = collapserator?.currentHeight();\n\n const width = this.el().clientWidth;\n\n if (!collapseratorHeight || !width)\n return null;\n\n const { height } = this.player().currentDimensions();\n \n return {\n width,\n height: height - collapseratorHeight\n };\n }\n\n private getHighchartOptions({ width, height }: ChartDimensions): Highcharts.Options {\n return {\n ...STATIC_CHART_OPTIONS,\n chart: getChartOptions(width, height),\n yAxis: getYAxisChartOptions(this.options_.heatMap),\n tooltip: getTooltipOptions(this.options_.interactive),\n plotOptions: getPlotOptions(this.moveTimepointIndicator.bind(this)),\n series: [{\n type: 'area',\n data: this.options_.heatMap\n }]\n };\n }\n\n private moveTimepointIndicator(x: number | null): void {\n if (this.options_.onTimepointHover)\n this.options_.onTimepointHover(x);\n\n const indicator: HTMLDivElement = this.el().querySelector('.cv-engagement-timepoint-indicator');\n\n if (x === null) {\n videojs.dom.removeClass(indicator, 'cv-engagement-timepoint-indicator-visible');\n return;\n }\n\n videojs.dom.addClass(indicator, 'cv-engagement-timepoint-indicator-visible');\n indicator.style.left = `${x / this.options_.heatMap.length * 100}%`;\n }\n}\n\nvideojs.registerComponent('EngagementOverlay', EngagementOverlay);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { Interactive } from 'libs/shared/interfaces';\n\nimport { CogButton } from 'projects/player/components/cog-button/cog-button';\nimport { EngagementOverlay } from 'projects/player/plugins/engagement-overlay-plugin/components/engagement-overlay/engagement-overlay';\nimport { EngagementOverlayMenuItem } from 'projects/player/plugins/engagement-overlay-plugin/components/engagement-overlay-menu-item/engagement-overlay-menu-item';\n\nimport 'projects/player/plugins/engagement-overlay-plugin/components/engagement-overlay/engagement-overlay';\n\nconst Plugin = videojs.getPlugin('plugin');\n\ninterface EngagementOverlayPluginOptions {\n heatMap: number[];\n interactive?: Interactive;\n onTimepointHover?: (time: number | null) => void;\n}\n\nclass EngagementOverlayPlugin extends Plugin {\n private options: EngagementOverlayPluginOptions;\n\n constructor(player: VideoJsPlayer, options: EngagementOverlayPluginOptions) {\n super(player, options);\n\n this.options = options;\n\n player.ready(() => {\n this.initialize();\n });\n }\n \n private initialize(): void {\n if (!this.hasHeatMapData())\n return;\n\n this.player.addChild('engagementOverlay', {\n heatMap: this.options.heatMap,\n interactive: this.options.interactive,\n onTimepointHover: this.options.onTimepointHover\n });\n\n /**\n * Check additionalItemOrder in cog-button.ts if you need to change the order. - Sha\n */\n const cogButton = this.player.getChild('collapserator')?.getChild('cogButton') as CogButton;\n cogButton.addItem({\n ctor: EngagementOverlayMenuItem,\n name: 'EngagementOverlayMenuItem',\n options: { overlayVisible: true }\n });\n }\n\n public toggleOverlay(show: boolean): void {\n const engagementOverlay = this.player.getChild('engagementOverlay') as EngagementOverlay;\n engagementOverlay?.toggleChart(show);\n }\n\n private hasHeatMapData(): boolean {\n return this.options.heatMap?.reduce((acc, val) => acc + val, 0) > 0;\n }\n}\n\nvideojs.registerPlugin('engagementOverlayPlugin', EngagementOverlayPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n engagementOverlayPlugin(options?: EngagementOverlayPluginOptions): EngagementOverlayPlugin;\n }\n}\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { Interactive } from 'libs/shared/interfaces';\n\nimport { InteractiveBarItems } from 'projects/player/plugins/interactive-plugin/components/seek-bar/interactive-bar-items';\nimport { TrackHelper } from 'projects/player/utils/track-helper';\n\nimport './interactive-plugin-styles.scss';\n\nconst Plugin = videojs.getPlugin('plugin');\n\ninterface InteractiveSeekBarPluginOptions {\n interactive: Interactive;\n}\n\n/**\n * This plugin will just render the interactive seek bar (i.e. just the interaction markers).\n * The user won't be able to interact with any of the interactions.\n * Currently this is just used in reports-player\n */\nclass InteractiveSeekBarPlugin extends Plugin {\n private options: InteractiveSeekBarPluginOptions;\n\n constructor(player: VideoJsPlayer, options: InteractiveSeekBarPluginOptions) {\n super(player);\n\n this.options = options;\n\n this.player.one('loadedmetadata', () => this.player.ready(this.initialize.bind(this)));\n }\n\n private initialize(): void {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n TrackHelper.useMetadataTrack(this.player, 'interactive', this.onTrackLoaded.bind(this));\n\n this.player.addClass('cv-interactive-plugin');\n }\n\n private onTrackLoaded(track: TextTrack): void {\n this.addChildren(track);\n }\n\n private addChildren(track: TextTrack): void {\n const seekBar = this.player.controlBar.getChild('progressControl').getChild('SeekBar');\n\n seekBar.addChild(new InteractiveBarItems(this.player, {\n interactive: this.options.interactive,\n track\n }));\n }\n}\n\nvideojs.registerPlugin('interactiveSeekBarPlugin', InteractiveSeekBarPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n interactiveSeekBarPlugin(options?: InteractiveSeekBarPluginOptions): InteractiveSeekBarPlugin;\n }\n}\n","import { Interactive } from 'libs/shared/interfaces';\n\nimport { ClipData } from 'projects/player/interfaces/models/ClipData';\nimport { PlaybackObject } from 'projects/player/interfaces/models/PlaybackObject';\nimport { BasePlayer, BasePlayerOptions } from 'projects/player/players/base-player';\nimport { AnalyticsPlayerType } from 'projects/player/services/analytics-service';\nimport { InteractiveTrackHelper } from 'projects/player/utils/interactive-track-helper';\n\nimport './reports-player.scss';\n\nimport 'projects/player/plugins/engagement-overlay-plugin/engagement-overlay-plugin';\nimport 'projects/player/plugins/clip-plugin/clip-plugin';\nimport 'projects/player/plugins/interactive-plugin/interactive-seek-bar-plugin';\nimport 'projects/player/plugins/old-version-refresh-plugin/old-version-refresh-plugin';\n\nexport interface ReportsPlayerOptions extends BasePlayerOptions {\n heatMap: number[];\n onTimepointHover?: (time: number | null) => void;\n}\n\nexport class ReportsPlayer extends BasePlayer {\n declare protected options: ReportsPlayerOptions;\n private track: TextTrack;\n\n constructor(id: string | Element, options: ReportsPlayerOptions) {\n super(id, options);\n }\n\n protected getPlayerClassName(): string {\n return 'cv-reports-player';\n }\n\n protected getAnalyticsPlayerType(): AnalyticsPlayerType {\n return 'reports-player';\n }\n\n protected async additionalSetup(playbackObject: PlaybackObject): Promise<void> {\n super.additionalSetup(playbackObject);\n\n this.setupEngagementOverlayPlugin(playbackObject);\n this.setupUpClipPlugin(playbackObject);\n this.setupInteractiveSeekBarPlugin(playbackObject);\n }\n\n private setupEngagementOverlayPlugin(playbackObject: PlaybackObject): void {\n this.player.engagementOverlayPlugin({\n heatMap: this.options.heatMap,\n interactive: playbackObject.additionalData?.interactive as Interactive,\n onTimepointHover: this.options.onTimepointHover\n });\n }\n\n private setupUpClipPlugin(playbackObject: PlaybackObject): void {\n const isClip = playbackObject.mediaType === 'MasterClip';\n const isInteractive = playbackObject.mediaType === 'MasterInteractive';\n\n if (!isClip && !isInteractive)\n return;\n\n let clipData: ClipData;\n if (isClip)\n clipData = playbackObject.additionalData;\n \n if (isInteractive) {\n clipData = playbackObject.additionalData?.clipData;\n\n // Not all interactives will have clip data\n if (!clipData)\n return;\n }\n\n if (!clipData)\n throw Error('Invalid clip data');\n\n this.player.clipPlugin({\n startTime: clipData.startTime,\n endTime: clipData.endTime\n });\n }\n\n private setupInteractiveSeekBarPlugin(playbackObject: PlaybackObject): void {\n const interactive = playbackObject.additionalData?.interactive as Interactive;\n\n if (!playbackObject.additionalData?.interactive)\n return;\n\n this.track = InteractiveTrackHelper.getInteractiveTrack(this.player, playbackObject);\n\n this.player.interactiveSeekBarPlugin({ interactive });\n }\n\n protected getSeekBarOptions(): any {\n return {\n ignoreChapters: true\n };\n }\n}\n","import React from 'react';\n\nimport { ReportsPlayer, ReportsPlayerOptions } from 'projects/player/players/reports/reports-player';\n\nexport function ClickViewReportsPlayer(props: ReportsPlayerOptions): React.ReactElement {\n const ref = React.useRef(null);\n const playerRef = React.useRef<ReportsPlayer>(null);\n\n React.useEffect(() => {\n playerRef.current = new ReportsPlayer(ref.current, props);\n }, []);\n\n return (\n <div ref={ref}></div>\n );\n}\n",":local {\n .playerContainer {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n }\n\n .playerPlaceholder {\n width: 100%;\n padding-bottom: 56.25%;\n }\n\n .heatMap {\n height: 1rem;\n }\n\n .heatMapTimepointIndicator {\n border-left: 0.125rem dashed $info;\n margin-left: -0.0625rem;\n position: absolute;\n top: 0;\n bottom: 0;\n opacity: 0;\n visibility: hidden;\n\n &.heatMapTimepointIndicatorVisible {\n opacity: 1;\n visibility: visible;\n }\n }\n\n .partialLoadingContainer {\n height: 24.015625rem;\n }\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EngagementHeatMap, EngagementHeatMapLegend } from 'libs/shared/apps/analytics/components/engagement-heat-map/EngagementHeatMap';\nimport { getFullHeatMap } from 'libs/shared/apps/analytics/utils/EngagementUtils';\nimport { Engagement } from 'libs/shared/interfaces';\n\nimport { ClickViewReportsPlayer } from 'projects/player/react/ReportsPlayer';\n\nimport styles from './video-engagement-overlay.module.scss';\n\nconst namespace = 'shared.videoEngagementOverlay';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface VideoEngagementOverlayProps {\n engagement: Engagement;\n viewKey: string;\n imageCdnUrl: string;\n playerApiUrl: string;\n}\n\nexport function VideoEngagementOverlay(props: VideoEngagementOverlayProps): JSX.Element {\n const timepointIndicatorRef = React.useRef<HTMLDivElement>(null);\n\n const heatMap = getFullHeatMap(props.engagement);\n\n function setHoverTimepoint(time: number | null): void {\n const el = timepointIndicatorRef.current;\n\n if (!el)\n return;\n\n if (time === null) {\n el.classList.remove(styles.heatMapTimepointIndicatorVisible);\n return;\n }\n\n el.classList.add(styles.heatMapTimepointIndicatorVisible);\n el.style.left = `${time / heatMap.length * 100}%`;\n }\n\n return (\n <div className='bg-white border rounded overflow-hidden h-100'>\n <div className='position-relative'>\n {/**\n * The below div is an empty 16:9 rectangle which maintains this component's\n * height while the player is loading.\n */\n }\n <div className={styles.playerPlaceholder} />\n <div className={styles.playerContainer}>\n <ClickViewReportsPlayer\n viewKey={props.viewKey}\n playerApi={new URL(props.playerApiUrl)}\n hotkeyElQuerySelector='body'\n heatMap={heatMap}\n onTimepointHover={setHoverTimepoint}\n aspectRatio='16:9'\n />\n </div>\n </div>\n <div className='p-3'>\n <div className='position-relative'>\n <EngagementHeatMap\n engagement={props.engagement}\n className={styles.heatMap}\n />\n <div ref={timepointIndicatorRef} className={styles.heatMapTimepointIndicator} />\n </div>\n <div className='d-flex justify-content-between mt-2'>\n <strong>\n {getPhrase('heatmap')}\n </strong>\n <div className='w-33'>\n <EngagementHeatMapLegend />\n </div>\n </div>\n </div>\n </div>\n );\n}\n",":local {\n .videoContainer {\n width: 44%;\n }\n}","import React from 'react';\n\nimport { EngagementTable } from 'libs/shared/apps/analytics/components/engagement-table/EngagementTable';\nimport { InsightAmountWatched } from 'libs/shared/apps/analytics/components/insights/amount-watched/InsightAmountWatched';\nimport { InsightTotalViews } from 'libs/shared/apps/analytics/components/insights/total-views/InsightTotalViews';\nimport { GroupedAnalyticsCount } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { VideoViewEventResponse } from 'libs/shared/apps/analytics/interfaces/VideoViewEvent';\nimport { Config, Engagement, PlayerViewKey } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport { PartialInsightsHeatmap } from 'apps/my-shares/components/insights-heatmap/partial-loading/PartialInsightsHeatmap';\nimport { VideoEngagementOverlay } from 'apps/my-shares/components/video-engagement-overlay/VideoEngagementOverlay';\n\nimport styles from './insights-heatmap.module.scss';\n\ninterface InsightsHeatmapProps {\n hasDataLoaded: boolean;\n tableDataLoaded: boolean;\n yearGroups: GroupedAnalyticsCount[];\n aggregateEngagement: Engagement;\n individualEngagement: Engagement[];\n viewKey: PlayerViewKey;\n config: Config;\n users: AnonUser[];\n classroomStudents?: AnonUser[];\n anonymiseUsers: boolean;\n hideStaffResults: boolean;\n}\n\nexport function InsightsHeatmap(props: InsightsHeatmapProps) {\n return (\n <>\n {!props.hasDataLoaded && <PartialInsightsHeatmap />}\n\n <div className='row g-3 mb-3'>\n {props.hasDataLoaded &&\n <>\n <div className='col'>\n <InsightTotalViews\n events={{ yearGroupCount: props.yearGroups } as VideoViewEventResponse}\n emptyStateImage={ImageUrls.EmptyStates.MY_VIDEOS}\n hideStaffResults={props.hideStaffResults}\n />\n </div>\n <div className='col'>\n <InsightAmountWatched engagement={props.individualEngagement} />\n </div>\n <div className={styles.videoContainer}>\n <VideoEngagementOverlay\n engagement={props.aggregateEngagement}\n viewKey={props.viewKey.viewKey}\n playerApiUrl={props.config.playerApiUrl}\n imageCdnUrl={props.config.imageCdnUrl}\n />\n </div>\n </>\n }\n\n {props.tableDataLoaded &&\n <div className='col-12'>\n <EngagementTable\n engagement={props.individualEngagement}\n users={props.users}\n imageCdnUrl={props.config?.imageCdnUrl}\n anonymiseUsers={props.anonymiseUsers}\n classroomStudents={props.classroomStudents}\n border\n enableSort\n showSeparateNameColumns\n />\n </div>\n }\n </div>\n </>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"BNAB3zGE2.chunk.js","names":[],"sources":["../../../../libs/shared/src/apps/analytics/components/engagement-table/engagement-table.module.scss","../../../../libs/shared/src/apps/analytics/components/engagement-table/EngagementTableUtils.tsx","../../../../libs/shared/src/apps/analytics/components/engagement-table/EngagementTable.tsx","../../../../libs/shared/src/components/percentage-indicator/PartialPercentageIndicator.tsx","../../../../libs/shared/src/apps/analytics/components/insights/amount-watched/InsightAmountWatched.tsx","../../../../libs/shared/src/apps/analytics/utils/ChartColourUtils.ts","../../../../libs/shared/src/apps/analytics/utils/SharedUserActivityPieChartUtils.ts","../../../../libs/shared/src/apps/analytics/components/insights/total-views/InsightTotalViews.tsx","../../src/apps/my-shares/components/insights-heatmap/partial-loading/partial-insights-heatmap.module.scss","../../src/apps/my-shares/components/insights-heatmap/partial-loading/PartialInsightsHeatmap.tsx","../../../player/src/plugins/engagement-overlay-plugin/components/engagement-overlay-menu-item/engagement-overlay-menu-item.ts","../../../player/src/plugins/engagement-overlay-plugin/components/timepoint-interactions/timepoint-interactions.tsx","../../../player/src/plugins/engagement-overlay-plugin/components/engagement-overlay/engagement-overlay-chart-options.tsx","../../../player/src/plugins/engagement-overlay-plugin/components/engagement-overlay/engagement-overlay.ts","../../../player/src/plugins/engagement-overlay-plugin/engagement-overlay-plugin.ts","../../../player/src/plugins/interactive-plugin/interactive-seek-bar-plugin.ts","../../../player/src/players/reports/reports-player.ts","../../../player/src/react/ReportsPlayer.tsx","../../src/apps/my-shares/components/video-engagement-overlay/video-engagement-overlay.module.scss","../../src/apps/my-shares/components/video-engagement-overlay/VideoEngagementOverlay.tsx","../../src/apps/my-shares/components/insights-heatmap/insights-heatmap.module.scss","../../src/apps/my-shares/components/insights-heatmap/InsightsHeatmap.tsx"],"sourcesContent":[":local {\n .heatMap {\n height: 1rem;\n }\n\n // use avatar width\n .avatarContainer {\n width: 2rem;\n height: 2rem;\n }\n\n .cogIcon {\n cursor: pointer;\n color: $gray-900;\n line-height: 1;\n }\n}","import React from 'react';\nimport { Column, ColumnInstance, Row } from 'react-table';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EngagementHeatMap } from 'libs/shared/apps/analytics/components/engagement-heat-map/EngagementHeatMap';\nimport { anonymiseUserName } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { EngagementAvatar } from 'libs/shared/components/engagement-avatar/EngagementAvatar';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { PercentageIndicator, PercentageIndicatorLayout } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { CogSvg } from 'libs/shared/images/svg/objects/CogSvg';\nimport { Engagement, EngagementType } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from './engagement-table.module.scss';\n\nconst namespace = 'shared.engagementTable';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst EMPTY_ENGAGEMENT: Partial<Engagement> = {\n heatMap: [],\n engagementRate: 0,\n viewCount: 0\n};\n\ninterface CellWrapperProps {\n className?: string;\n}\n\nfunction CellWrapper(props: React.PropsWithChildren<CellWrapperProps>): JSX.Element {\n return (\n <div className={`${props.className ?? ''}`}>\n {props.children}\n </div>\n );\n}\n\ninterface HeaderCellProps {\n column: ColumnInstance<EngagementTableData>;\n phraseKey: string;\n}\n\nfunction HeaderCell(props: HeaderCellProps): JSX.Element {\n return (\n <CellWrapper className={`d-inline-block ${props.column.isSorted ? 'fw-bold' : ''}`}>\n {getPhrase(props.phraseKey)}\n </CellWrapper>\n );\n}\n\nexport interface EngagementTableData extends Engagement {\n user: AnonUser;\n}\n\nfunction getMaxHeatMapValue(engagement: Engagement[]): number {\n let max = 0;\n\n engagement.forEach(e => {\n const localMax = Math.max(...e.heatMap);\n\n if (localMax > max)\n max = localMax;\n });\n\n return max;\n}\n\n/**\n * Resolves the engagement type, inferring 'anon' for legacy data\n * where type is not set but userId is null.\n */\nfunction resolveEngagementType(engagement: Engagement): EngagementType | undefined {\n if (engagement.type) return engagement.type;\n if (engagement.userId === null || engagement.userId === undefined) return 'anon';\n return undefined;\n}\n\nfunction getEngagementTypeLabel(type: EngagementType): string | null {\n switch (type) {\n case 'student-reach':\n return getPhrase('classroomViews');\n case 'anon':\n return getPhrase('anonymous');\n default:\n return null;\n }\n}\n\nfunction getUsersName(user: AnonUser, anonymiseUsers: boolean, type?: EngagementType) {\n if (type) {\n const label = getEngagementTypeLabel(type);\n if (label && !user?.name) return { name: label, surname: '' };\n }\n\n const fullName = anonymiseUserName(user, anonymiseUsers);\n const nameParts = fullName.split(' ').filter(n => !!n);\n\n return {\n name: nameParts[0],\n surname: nameParts.slice(1).join(' ')\n };\n}\n\nfunction getUserRole(user: AnonUser): string | null {\n if (!user)\n return null;\n \n const role = UserHelper.getUserRole(user);\n\n if ([ UserRole.Admin, UserRole.SuperAdmin ].includes(role))\n return getPhrase('adminRole');\n \n const type = UserHelper.getUserType(user);\n \n if (type === UserGroup.Learner)\n return getPhrase('studentRole');\n \n if (type === UserGroup.Staff)\n return getPhrase('staffRole');\n\n return null;\n}\n\ninterface EngagementColumnProps {\n engagement: Engagement[];\n imageCdnUrl: string;\n anonymiseUsers: boolean;\n showSeparateNameColumns?: boolean;\n classroomViewsAppLink?: Core.AppLink;\n classroomViewsTooltip?: string;\n showRole?: boolean;\n}\n\nexport function useGetColumns(props: EngagementColumnProps): Column<EngagementTableData>[] {\n return React.useMemo(() => {\n const maxHeatMapValue = getMaxHeatMapValue(props.engagement);\n\n const nameColumns: Column<EngagementTableData>[] = props.showSeparateNameColumns ? [\n {\n id: 'firstName',\n Header: ({ column }: { column: ColumnInstance<EngagementTableData> }) => <HeaderCell column={column} phraseKey='firstName' />,\n accessor: 'user',\n width: 63,\n sortType: (rowA: Row<EngagementTableData>, rowB: Row<EngagementTableData>) => {\n const typeA = resolveEngagementType(rowA.original);\n const typeB = resolveEngagementType(rowB.original);\n const { name: nameA } = getUsersName(rowA.values.firstName, props.anonymiseUsers, typeA);\n const { name: nameB } = getUsersName(rowB.values.firstName, props.anonymiseUsers, typeB);\n return nameA > nameB ? 1 : -1;\n },\n Cell: ({ value, row: { original } }: { value: AnonUser, row: Row<EngagementTableData> }) => {\n const effectiveType = resolveEngagementType(original);\n const { name, surname } = getUsersName(value, props.anonymiseUsers, effectiveType);\n return (\n <CellWrapper className='d-flex align-items-center h-100'>\n <span className={styles.avatarContainer}>\n <EngagementAvatar\n type={effectiveType}\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(name, surname)}\n imageUrl={!props.anonymiseUsers && !effectiveType && value?.avatar?.url}\n anonymiseUsers={props.anonymiseUsers}\n />\n </span>\n <span className='ms-2 clamp-1'>\n {name}\n </span>\n {effectiveType === 'student-reach' && props.classroomViewsAppLink &&\n <IconButton\n customSize\n svg={CogSvg}\n svgSize={SvgContainerSize.Standard}\n appLink={props.classroomViewsAppLink}\n className={styles.cogIcon}\n tooltip={props.classroomViewsTooltip}\n tooltipTrigger={['hover']}\n ariaLabel={props.classroomViewsTooltip}\n />\n }\n </CellWrapper>\n );\n }\n },\n {\n id: 'surname',\n Header: ({ column }: { column: ColumnInstance<EngagementTableData> }) => <HeaderCell column={column} phraseKey='surname' />,\n accessor: 'user',\n width: 68,\n sortType: (rowA: Row<EngagementTableData>, rowB: Row<EngagementTableData>) => {\n const typeA = resolveEngagementType(rowA.original);\n const typeB = resolveEngagementType(rowB.original);\n const { surname: surnameA } = getUsersName(rowA.values.surname, props.anonymiseUsers, typeA);\n const { surname: surnameB } = getUsersName(rowB.values.surname, props.anonymiseUsers, typeB);\n return surnameA > surnameB ? 1 : -1;\n },\n Cell: ({ value, row: { original } }: { value: AnonUser, row: Row<EngagementTableData> }) => {\n const { surname } = getUsersName(value, props.anonymiseUsers, resolveEngagementType(original));\n return (\n <CellWrapper className='d-flex align-items-center h-100'>\n <span className='clamp-1'>\n {surname || ''}\n </span>\n </CellWrapper>\n );\n }\n }\n ] : [\n {\n id: 'name',\n Header: ({ column }: { column: ColumnInstance<EngagementTableData> }) => <HeaderCell column={column} phraseKey='name' />,\n accessor: 'user',\n width: 22,\n sortType: (rowA: Row<EngagementTableData>, rowB: Row<EngagementTableData>) => {\n const typeA = resolveEngagementType(rowA.original);\n const typeB = resolveEngagementType(rowB.original);\n const nameA = typeA ?\n getEngagementTypeLabel(typeA) :\n anonymiseUserName(rowA.values.user, props.anonymiseUsers);\n const nameB = typeB ?\n getEngagementTypeLabel(typeB) :\n anonymiseUserName(rowB.values.user, props.anonymiseUsers);\n\n return nameA > nameB ? 1 : -1;\n },\n Cell: ({ value, row: { original } }: { value: AnonUser, row: Row<EngagementTableData> }) => {\n const effectiveType = resolveEngagementType(original);\n const { name, surname } = getUsersName(value, props.anonymiseUsers, effectiveType);\n return (\n <CellWrapper className='d-flex align-items-center h-100'>\n <span className={styles.avatarContainer}>\n <EngagementAvatar\n type={effectiveType}\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(name, surname)}\n imageUrl={!props.anonymiseUsers && !effectiveType && value?.avatar?.url}\n anonymiseUsers={props.anonymiseUsers}\n />\n </span>\n <span className='ms-2 clamp-1 me-1'>\n {name} {surname}\n </span>\n {effectiveType === 'student-reach' && props.classroomViewsAppLink &&\n <IconButton\n customSize\n svg={CogSvg}\n svgSize={SvgContainerSize.Standard}\n appLink={props.classroomViewsAppLink}\n className={styles.cogIcon}\n tooltip={props.classroomViewsTooltip}\n ariaLabel={props.classroomViewsTooltip}\n />\n }\n </CellWrapper>\n );\n }\n }\n ];\n\n const roleColumn: Column<EngagementTableData>[] = [];\n\n if (props.showRole) {\n roleColumn.push({\n Header: ({ column }) => <HeaderCell column={column} phraseKey='role' />,\n accessor: 'user',\n width: 20,\n Cell: ({ value }: { value: AnonUser }) => {\n const role = getUserRole(value);\n return (\n <CellWrapper className='d-flex align-items-center h-100'>\n {role ?\n <div>{role}</div> :\n <span dangerouslySetInnerHTML={{ __html: '&dash;' }} />\n }\n </CellWrapper>\n );\n }\n });\n }\n\n return [\n ...nameColumns,\n ...roleColumn,\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='views' />,\n accessor: 'viewCount',\n // React table uses flex ratios for widths. I've styled with 5 columns but didn't want to effect the sizing\n // for when it was 4 so we're keeping the new and old values - Sha\n width: props.showSeparateNameColumns ? 47 : 15,\n sortType: 'basic',\n sortDescFirst: true,\n Cell: ({ value }) => (\n <CellWrapper className='d-flex align-items-center h-100'>\n <div>{value}</div>\n </CellWrapper>\n )\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='engagement' />,\n accessor: 'engagementRate',\n // React table uses flex ratios for widths. I've styled with 5 columns but didn't want to effect the sizing\n // for when it was 4 so we're keeping the new and old values - Sha\n width: props.showSeparateNameColumns ? 79 : 20,\n sortDescFirst: true,\n Cell: ({ value }) => (\n <CellWrapper className='w-33'>\n <PercentageIndicator\n percentage={value}\n layout={PercentageIndicatorLayout.LabelBefore}\n />\n </CellWrapper>\n )\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='heatMap' />,\n accessor: 'heatMap',\n // React table uses flex ratios for widths. I've styled with 5 columns but didn't want to effect the sizing\n // for when it was 4 so we're keeping the new and old values - Sha\n width: props.showSeparateNameColumns ? 230 : 48,\n disableSortBy: true,\n Cell: ({ row: { original } }) => (\n <CellWrapper className='d-flex align-items-center h-100'>\n <EngagementHeatMap\n engagement={original}\n max={maxHeatMapValue}\n className={`${styles.heatMap} flex-grow-1`}\n />\n </CellWrapper>\n )\n }\n ];\n }, [ props.anonymiseUsers, props.showSeparateNameColumns ]);\n}\n\nexport function useGetTableData(\n engagement: Engagement[],\n users: AnonUser[],\n classroomStudents?: AnonUser[]\n): EngagementTableData[] {\n return React.useMemo(() => {\n const data: EngagementTableData[] = [];\n\n const userIdSet = new Set<string>();\n engagement?.forEach(e => {\n const user = users?.find(u => {\n if (u.id && u.id === e.userId) {\n userIdSet.add(u.id);\n return true;\n }\n\n if (u.sessionId && u.sessionId === e.sessionId)\n return true;\n\n return false;\n });\n\n data.push({ ...e, user });\n });\n\n if (classroomStudents?.length) {\n const students = classroomStudents\n .filter(s => !userIdSet.has(s.id))\n .map(user => ({ ...EMPTY_ENGAGEMENT, userId: user.id, user } as EngagementTableData));\n data.push(...students);\n }\n\n return data;\n }, [ engagement, users, classroomStudents ]);\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { Table, TableTheme } from 'libs/shared/components/table/Table';\nimport { Engagement } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport { useGetColumns, useGetTableData } from './EngagementTableUtils';\n\nconst theme: TableTheme = {\n table: 'bg-white rounded px-0',\n header: 'border-bottom',\n headerCell: 'm-3',\n cell: 'mx-3 my-2'\n};\n\ninterface EngagementTableProps {\n engagement: Engagement[];\n imageCdnUrl: string;\n users?: AnonUser[];\n classroomStudents?: AnonUser[];\n anonymiseUsers: boolean;\n border?: boolean;\n enableSort?: boolean;\n showSeparateNameColumns?: boolean;\n showRole?: boolean;\n classroomViewsAppLink?: Core.AppLink;\n classroomViewsTooltip?: string;\n}\n\nexport function EngagementTable(props: EngagementTableProps): JSX.Element {\n const columns = useGetColumns({\n engagement: props.engagement,\n imageCdnUrl: props.imageCdnUrl,\n anonymiseUsers: props.anonymiseUsers,\n showSeparateNameColumns: props.showSeparateNameColumns,\n classroomViewsAppLink: props.classroomViewsAppLink,\n classroomViewsTooltip: props.classroomViewsTooltip,\n showRole: props.showRole\n });\n\n const data = useGetTableData(props.engagement, props.users, props.classroomStudents);\n\n if (!data.length)\n return <></>;\n\n return (\n <Table\n columns={columns}\n data={data}\n theme={{\n ...theme,\n table: props.border ? `${theme.table} border` : theme.table\n }}\n enableSort={props.enableSort}\n />\n );\n}\n","import React from 'react';\n\nimport { PercentageIndicator, PercentageIndicatorLayout } from './PercentageIndicator';\n\ninterface PartialPercentageIndicatorProps {\n layout: PercentageIndicatorLayout;\n className?: string;\n}\n\nexport function PartialPercentageIndicator(props: PartialPercentageIndicatorProps): JSX.Element {\n return (\n <PercentageIndicator\n layout={props.layout}\n className={props.className}\n percentage={0}\n customLabel='--%'\n />\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { getEngagementRate } from 'libs/shared/apps/analytics/utils/EngagementUtils';\nimport { PartialPercentageIndicator } from 'libs/shared/components/percentage-indicator/PartialPercentageIndicator';\nimport { PercentageIndicator, PercentageIndicatorLayout } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { TimerSvg } from 'libs/shared/images/svg/status/TimerSvg';\nimport { Engagement } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.insightAmountWatched';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightAmountWatchedProps {\n engagement: Engagement[];\n}\n\nexport function InsightAmountWatched(props: InsightAmountWatchedProps) {\n const engagementRate = getEngagementRate(props.engagement);\n const percentage = Math.round(engagementRate * 100);\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svg={TimerSvg}\n svgClassName='bg-light-green text-green'\n >\n <div className='d-flex flex-column align-items-center my-auto gap-2'>\n {!!props.engagement &&\n <>\n <PercentageIndicator\n percentage={engagementRate}\n layout={PercentageIndicatorLayout.LabelInside}\n />\n <p className='text-center'>\n {typeof engagementRate === 'number' ?\n <Text namespace={namespace} phrase='everyoneWatched' options={{ percentage }} /> :\n <Text namespace={namespace} phrase='notWatched' />\n }\n </p>\n </>\n }\n {!props.engagement &&\n <>\n <PartialPercentageIndicator layout={PercentageIndicatorLayout.LabelInside} />\n </>\n }\n </div>\n </InsightCard>\n );\n}\n","const CHART_COLOURS = [\n '#FF9300', // Pizazz\n '#38A2E8', // Picton Blue\n '#7A76E8', // Portage\n '#B679C7', // East Side\n '#F7847B', // Froly\n '#D9584F', // Red (Not in the Primary palette)\n '#FFCD52', // Yellow (Not in the Primary Palette)\n '#5DC786', // Emerald\n '#40BCC3', // Perolous\n '#40C2BB' // Puerto rico\n];\n\nexport function mixinSeriesColours<T>(data: T[]): T[] {\n return data.map((d, idx) => ({\n ...d,\n color: CHART_COLOURS[idx % CHART_COLOURS.length]\n }));\n}\n","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport { BaseAnalyticsEventResponse, GroupedAnalyticsCount } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { UnionEventResponse } from 'libs/shared/apps/analytics/interfaces/UnionEvent';\nimport { VideoViewEventResponse } from 'libs/shared/apps/analytics/interfaces/VideoViewEvent';\nimport { mixinSeriesColours } from 'libs/shared/apps/analytics/utils/ChartColourUtils';\n\ntype EventResponseGroupByAttributes = keyof Pick<VideoViewEventResponse, 'contentTypeCount'> |\n keyof Pick<BaseAnalyticsEventResponse, 'userTypeCount' | 'yearGroupCount'>;\n\nexport function groupEvents(\n events: UnionEventResponse,\n groupBy: EventResponseGroupByAttributes,\n groupsToOmit?: string[],\n getSeriesName?: (group: string) => string\n): Highcharts.PointOptionsObject[] {\n const groups: HashObject<number> = {};\n\n const eventCounts = events[groupBy as keyof UnionEventResponse] as GroupedAnalyticsCount[];\n\n eventCounts?.forEach(ev => {\n const name = ev.name || 'Unknown';\n\n if (!name || groupsToOmit?.includes(name.toLowerCase()))\n return;\n\n groups[name] = groups[name] ?? 0;\n groups[name] += ev.count;\n });\n\n return mixinSeriesColours(ArrayHelper.sortBy(Object.keys(groups).map(group => ({\n name: getSeriesName ? getSeriesName(group) : group,\n y: groups[group],\n type: 'pie'\n })), 'name'));\n}\n\nexport function sortByYearGroup(data: Highcharts.PointOptionsObject[]) {\n const staffIndex = data.findIndex(group => group.name === 'Staff');\n\n // Move Staff to last index\n if (staffIndex > -1) {\n const [staffObject] = data.splice(staffIndex, 1);\n\n data.push(staffObject);\n }\n return data.sort((a, b) => {\n const numA = parseInt((a.name as string).match(/\\d+/)?.[0]);\n const numB = parseInt((b.name as string).match(/\\d+/)?.[0]);\n return numA - numB;\n });\n}\n\nexport function getTotalEventCount(data?: Highcharts.PointOptionsObject[]): number | null {\n return data?.reduce((a, b) => a + b.y, 0) ?? null;\n}\n","import React from 'react';\nimport Highcharts from 'highcharts';\nimport { HighchartsReact } from 'highcharts-react-official';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { CHART_FONT_STYLES } from 'libs/shared/apps/analytics/constants/ChartStyles';\nimport { VideoViewEventResponse } from 'libs/shared/apps/analytics/interfaces/VideoViewEvent';\nimport { getTotalEventCount, groupEvents, sortByYearGroup } from 'libs/shared/apps/analytics/utils/SharedUserActivityPieChartUtils';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VisibleOnSvg } from 'libs/shared/images/svg/actions/VisibleOnSvg';\n\nconst namespace = 'shared.insightTotalViews';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction mapUserTypeToChartLabel(type: string): string {\n if (type === 'Unknown')\n return getPhrase('anon');\n return type;\n}\n\nconst STATIC_CHART_OPTIONS: Highcharts.Options = {\n title: {\n text: null\n },\n credits: {\n enabled: false\n },\n chart: {\n backgroundColor: 'transparent',\n spacing: [ 0, 0, 0, 0 ]\n },\n legend: {\n itemStyle: CHART_FONT_STYLES,\n itemDistance: 8\n },\n plotOptions: {\n pie: {\n allowPointSelect: true,\n cursor: 'pointer',\n dataLabels: {\n enabled: false\n },\n showInLegend: true,\n borderWidth: 1,\n borderColor: '#ffffff',\n borderRadius: 0,\n size: '80%'\n }\n }\n};\n\ninterface InsightTotalViewsProps {\n events: VideoViewEventResponse;\n emptyStateImage: string;\n hideStaffResults: boolean;\n}\n\nexport function InsightTotalViews(props: InsightTotalViewsProps) {\n const grouped = groupEvents(\n props.events,\n 'yearGroupCount',\n props.hideStaffResults ? ['staff'] : [],\n mapUserTypeToChartLabel\n );\n const chartData = sortByYearGroup(grouped);\n const totalViews = getTotalEventCount(chartData);\n\n function getChartOptions(\n data: Highcharts.PointOptionsObject[]\n ): Highcharts.Options {\n return {\n ...STATIC_CHART_OPTIONS,\n series: [{\n type: 'pie',\n name: getPhrase('title'),\n data\n }]\n };\n }\n\n return (\n <InsightCard\n title={getPhrase('title')}\n // Replace with ultra marine + light colour\n svgClassName='bg-light-blue text-blue'\n // Add visibility icon \n svg={VisibleOnSvg}\n >\n {chartData?.length ? (\n <>\n <p className='mb-0'><Text namespace={namespace} phrase='totalViews' options={{ totalViews }} /></p>\n\n <div className='d-flex justify-content-center h-75'>\n <HighchartsReact\n highcharts={Highcharts}\n options={getChartOptions(chartData)}\n containerProps={{\n className: `w-100`\n }}\n />\n </div>\n </>\n ) : (\n <EmptyState className='pt-0 my-auto'>\n <EmptyState.Image src={props.emptyStateImage} className='w-75 h-auto'></EmptyState.Image>\n <EmptyState.Heading className='h4'><Text namespace={namespace} phrase='noViews' /></EmptyState.Heading>\n <EmptyState.Info className='w-100'><Text namespace={namespace} phrase='notWatched' /></EmptyState.Info>\n </EmptyState>\n )}\n </InsightCard>\n );\n}\n",":local {\n .partialInsights {\n height: 21.5rem;\n }\n\n .videoContainer {\n width: 44%;\n }\n}","import React from 'react';\n\nimport styles from './partial-insights-heatmap.module.scss';\n\nexport function PartialInsightsHeatmap() {\n return (\n <div>\n <div className='row g-3 mb-3'>\n <div className='col'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className={styles.videoContainer}>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n </div>\n\n <div className='row g-3 mb-5'>\n <div className='col-12'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n </div>\n </div>\n );\n}\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nconst MenuItem = videojs.getComponent('MenuItem');\n\ninterface EngagementOverlayMenuItemOptions extends videojs.MenuItemOptions {\n overlayVisible: boolean;\n}\n\nexport class EngagementOverlayMenuItem extends MenuItem {\n private toggleEl: Element;\n private overlayVisible: boolean;\n\n /**\n * Because we want to bind our listener in createEl\n * and createEl runs in super. We store if we've bounud\n * our handler, so we only call bind once and \n * the call to removeEventListener will still work\n */\n private handlerBound: boolean;\n\n constructor(player: VideoJsPlayer, options: EngagementOverlayMenuItemOptions) {\n super(player, options);\n\n this.overlayVisible = options.overlayVisible;\n this.toggle(this.overlayVisible);\n }\n\n public handleToggle(): void {\n this.toggle(!this.overlayVisible);\n }\n\n private toggle(state: boolean): void {\n state ? this.toggleOn() : this.toggleOff();\n }\n\n private toggleOn(): void {\n videojs.dom.addClass(this.toggleEl, 'on');\n this.overlayVisible = true;\n this.player().engagementOverlayPlugin().toggleOverlay(this.overlayVisible);\n this.player().addClass('cv-reports-player-overlay-visible');\n }\n\n private toggleOff(): void {\n videojs.dom.removeClass(this.toggleEl, 'on');\n this.overlayVisible = false;\n this.player().engagementOverlayPlugin().toggleOverlay(this.overlayVisible);\n this.player().removeClass('cv-reports-player-overlay-visible');\n }\n\n /**\n * Because we extend MenuItem which will close the menu by default\n * we need to halt the event propogation here\n */\n public handleClick(event: videojs.EventTarget.Event): void {\n event.stopImmediatePropagation();\n }\n\n public createEl(tagName?: string, properties?: any, attributes?: any): HTMLLIElement {\n /**\n * Bind our event listener only once\n * see the comment where handlerBound is defined\n */\n if (!this.handlerBound) {\n this.handleToggle = this.handleToggle.bind(this);\n this.handlerBound = true;\n }\n\n if (this.toggleEl)\n this.toggleEl.removeEventListener('click', this.handleToggle);\n\n this.toggleEl = videojs.dom.createEl('div', {\n className: `custom-toggle custom-toggle-info toggle-option float-end`,\n innerHTML: '<span class=\"handle\"></span></div>'\n });\n this.toggleEl.addEventListener('click', this.handleToggle);\n\n const innerHTML = `\n <span class=\"vjs-menu-item-text\">Heat Map</span>\n <span class=\"cv-toggle-container\"></span>`;\n\n const el = super.createEl(tagName, {\n className: 'vjs-menu-item cv-cog-menu-item',\n innerHTML\n }, attributes);\n\n /**\n * Indexing into the child this way is only safe to do because\n * we know that the el only has two children\n */\n el.children[1].appendChild(this.toggleEl);\n\n return el;\n }\n}\n\nvideojs.registerComponent('EngagementOverlayMenuItem', EngagementOverlayMenuItem);\n","import React from 'react';\n\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { Interactive } from 'libs/shared/interfaces';\n\nconst MAX_INTERACTIONS_TO_SHOW = 3;\n\ninterface TimepointInteractionsProps {\n interactive: Interactive;\n time: number;\n}\n\nexport function TimepointInteractions(props: TimepointInteractionsProps): JSX.Element {\n const timepoint = props.interactive.timepoints.find(t => {\n const timepointTime = t.visibleAt / 1000;\n \n return Math.floor(props.time) === Math.floor(timepointTime)\n || Math.ceil(props.time) === Math.ceil(timepointTime);\n });\n\n if (!timepoint?.interactions?.length)\n return <></>;\n\n const interactions = timepoint.interactions.length > MAX_INTERACTIONS_TO_SHOW ?\n timepoint.interactions.slice(0, MAX_INTERACTIONS_TO_SHOW - 1) :\n timepoint.interactions;\n\n const hiddenInteractions = timepoint.interactions.length - interactions.length;\n\n return (\n <div className='d-flex justify-content-end ms-2'>\n {interactions.map((i, idx) => (\n <InteractionLabel\n key={idx}\n interaction={i}\n showQuestion={false}\n iconClassName='ms-1'\n />\n ))}\n {!!hiddenInteractions &&\n <div\n className={'interaction-type-icon d-flex justify-content-center' +\n ' align-items-center border border-dark text-body ms-1'}\n >\n {`+${hiddenInteractions}`}\n </div>\n }\n </div>\n );\n}\n","import React from 'react';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport Highcharts from 'highcharts';\n\nimport { Interactive } from 'libs/shared/interfaces';\n\nimport { TimepointInteractions } from 'projects/player/plugins/engagement-overlay-plugin/components/timepoint-interactions/timepoint-interactions';\nimport { formatTime } from 'projects/player/utils/formatTime';\n\nexport const STATIC_CHART_OPTIONS: Highcharts.Options = {\n title: {\n text: null\n },\n xAxis: {\n visible: false,\n minPadding: 0,\n maxPadding: 0\n },\n legend: {\n enabled: false\n },\n credits: {\n enabled: false\n },\n defs: {\n gradient: ({\n tagName: 'linearGradient',\n id: 'area-gradient',\n x1: 0,\n y1: 1,\n x2: 0,\n y2: 0,\n children: [\n ({\n tagName: 'stop',\n offset: 0\n } as Highcharts.ASTNode),\n ({\n tagName: 'stop',\n offset: 1\n } as Highcharts.ASTNode)\n ]\n } as Highcharts.ASTNode)\n }\n};\n\nexport function getChartOptions(width: number, height: number): Highcharts.ChartOptions {\n return {\n styledMode: true,\n spacing: [ 15, 0, 0, 0 ],\n width,\n height\n };\n}\n\nexport function getYAxisChartOptions(heatMap: number[]): Highcharts.YAxisOptions {\n const maxValue = Math.max(...heatMap);\n\n return {\n /**\n * To prevent max values from being cut off, we pad them relative to the chart scale.\n */\n max: maxValue * 1.05,\n min: 0,\n minPadding: 0,\n maxPadding: 0,\n allowDecimals: true,\n startOnTick: false,\n endOnTick: false,\n visible: false\n };\n}\n\nexport function getTooltipOptions(interactive?: Interactive): Highcharts.TooltipOptions {\n return {\n formatter: function () {\n const timepointInteractionsHtml = interactive ?\n getTimepointInteractionsHtml(interactive, this.x) :\n '';\n\n return (\n '<div class=\"cv-engagement-tooltip bg-white rounded\">' +\n '<div class=\"d-flex justify-content-between\">' +\n `<strong>${formatTime(this.x)}</strong>` +\n `${timepointInteractionsHtml}` +\n '</div>' +\n '<div class=\"d-flex justify-content-between rounded bg-light cv-view-count-container\">' +\n `<strong>Views</strong> <span class=\"cv-view-count\">${this.y}</span>` +\n '</div>' +\n '</div>'\n );\n },\n positioner: function (\n labelWidth: number,\n labelHeight: number,\n point: Highcharts.TooltipPositionerPointObject\n ) {\n const minX = 0;\n const maxX = this.chart.plotWidth - labelWidth;\n const x = point.plotX - labelWidth / 2;\n \n return {\n // Clamp x between min and max\n x: Math.min(Math.max(x, minX), maxX),\n y: this.chart.plotTop\n };\n },\n useHTML: true,\n padding: 0\n };\n}\n\nexport function getPlotOptions(moveTimepointIndicator: (x: number | null) => void): Highcharts.PlotOptions {\n return {\n area: {\n point: {\n events: {\n mouseOver: function () {\n moveTimepointIndicator(this.x);\n },\n mouseOut: function () {\n moveTimepointIndicator(null);\n }\n }\n }\n },\n series: {\n marker: {\n enabled: false\n }\n }\n };\n}\n\nfunction getTimepointInteractionsHtml(interactive: Interactive, time: number): string {\n return renderToStaticMarkup(\n <TimepointInteractions time={time} interactive={interactive} />\n );\n}\n","import Highcharts from 'highcharts';\nimport videojs, { VideoJsPlayer } from 'video.js';\n\nimport { Interactive } from 'libs/shared/interfaces';\n\nimport {\n getChartOptions,\n getPlotOptions,\n getTooltipOptions,\n getYAxisChartOptions,\n STATIC_CHART_OPTIONS\n} from './engagement-overlay-chart-options';\n\nimport './engagement-overlay.scss';\n\nconst Component = videojs.getComponent('Component');\n\nHighcharts.AST.allowedTags.push('g');\nHighcharts.AST.allowedAttributes.push('viewBox', 'transform');\n\ninterface ChartDimensions {\n width: number;\n height: number;\n}\n\ninterface EngagementOverlayOptions extends videojs.ComponentOptions {\n heatMap: number[];\n interactive?: Interactive;\n onTimepointHover?: (time: number | null) => void;\n}\n\nexport class EngagementOverlay extends Component {\n public options_: EngagementOverlayOptions;\n private chart: Highcharts.Chart;\n\n constructor(player: VideoJsPlayer, options: EngagementOverlayOptions) {\n super(player, options);\n\n this.initialize();\n this.bindListeners();\n }\n\n public initialize(): void {\n this.player().ready(() => this.buildChart());\n }\n\n public buildCSSClass(): string {\n return 'cv-engagement-overlay';\n }\n\n public createEl(tagName?: string, properties?: any, attributes?: any): Element {\n const innerHTML = '<div class=\"cv-engagement-chart\"></div>' +\n '<div class=\"cv-engagement-timepoint-indicator\"></div>';\n\n return super.createEl(tagName, {\n ...properties,\n className: this.buildCSSClass(),\n innerHTML\n }, attributes);\n }\n\n public toggleChart(show: boolean): void {\n if (show)\n this.buildChart();\n else\n this.destroyChart();\n }\n\n private bindListeners(): void {\n this.handleClick = this.handleClick.bind(this);\n this.resizeChart = this.resizeChart.bind(this);\n\n this.player().on('playerresize', this.resizeChart);\n\n this.on(this.el(), 'mouseup', this.handleClick);\n\n this.player().on('dispose', () => {\n this.player().off('playerresize', this.resizeChart);\n\n this.off(this.el(), 'mouseup', this.handleClick);\n });\n }\n\n private handleClick(event: videojs.EventTarget.Event): void {\n if (!videojs.dom.isSingleLeftClick(event))\n return;\n\n if (this.player().paused()) {\n this.player().play();\n return;\n }\n\n this.player().pause();\n }\n\n private buildChart(): void {\n if (this.chart)\n return;\n\n const chartDimensions = this.getChartDimensions();\n\n /**\n * The dimensions calculation relies on the control bar and progress control\n * being visible, so if it isn't, we wait for the play event.\n */\n if (!chartDimensions) {\n this.player().one('play', () => this.buildChart());\n return;\n }\n\n const container: HTMLElement = this.el().querySelector('.cv-engagement-chart');\n\n this.chart = Highcharts.chart(container, this.getHighchartOptions(chartDimensions));\n }\n\n private resizeChart(): void {\n const chartDimensions = this.getChartDimensions();\n\n if (!this.chart || !chartDimensions)\n return;\n\n this.chart.setSize(chartDimensions.width, chartDimensions.height);\n }\n\n private destroyChart(): void {\n this.chart?.destroy();\n this.chart = null;\n }\n\n private getChartDimensions(): ChartDimensions {\n const collapserator = this.player().getChild('collapserator');\n const collapseratorHeight = collapserator?.currentHeight();\n\n const width = this.el().clientWidth;\n\n if (!collapseratorHeight || !width)\n return null;\n\n const { height } = this.player().currentDimensions();\n \n return {\n width,\n height: height - collapseratorHeight\n };\n }\n\n private getHighchartOptions({ width, height }: ChartDimensions): Highcharts.Options {\n return {\n ...STATIC_CHART_OPTIONS,\n chart: getChartOptions(width, height),\n yAxis: getYAxisChartOptions(this.options_.heatMap),\n tooltip: getTooltipOptions(this.options_.interactive),\n plotOptions: getPlotOptions(this.moveTimepointIndicator.bind(this)),\n series: [{\n type: 'area',\n data: this.options_.heatMap\n }]\n };\n }\n\n private moveTimepointIndicator(x: number | null): void {\n if (this.options_.onTimepointHover)\n this.options_.onTimepointHover(x);\n\n const indicator: HTMLDivElement = this.el().querySelector('.cv-engagement-timepoint-indicator');\n\n if (x === null) {\n videojs.dom.removeClass(indicator, 'cv-engagement-timepoint-indicator-visible');\n return;\n }\n\n videojs.dom.addClass(indicator, 'cv-engagement-timepoint-indicator-visible');\n indicator.style.left = `${x / this.options_.heatMap.length * 100}%`;\n }\n}\n\nvideojs.registerComponent('EngagementOverlay', EngagementOverlay);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { Interactive } from 'libs/shared/interfaces';\n\nimport { CogButton } from 'projects/player/components/cog-button/cog-button';\nimport { EngagementOverlay } from 'projects/player/plugins/engagement-overlay-plugin/components/engagement-overlay/engagement-overlay';\nimport { EngagementOverlayMenuItem } from 'projects/player/plugins/engagement-overlay-plugin/components/engagement-overlay-menu-item/engagement-overlay-menu-item';\n\nimport 'projects/player/plugins/engagement-overlay-plugin/components/engagement-overlay/engagement-overlay';\n\nconst Plugin = videojs.getPlugin('plugin');\n\ninterface EngagementOverlayPluginOptions {\n heatMap: number[];\n interactive?: Interactive;\n onTimepointHover?: (time: number | null) => void;\n}\n\nclass EngagementOverlayPlugin extends Plugin {\n private options: EngagementOverlayPluginOptions;\n\n constructor(player: VideoJsPlayer, options: EngagementOverlayPluginOptions) {\n super(player, options);\n\n this.options = options;\n\n player.ready(() => {\n this.initialize();\n });\n }\n \n private initialize(): void {\n if (!this.hasHeatMapData())\n return;\n\n this.player.addChild('engagementOverlay', {\n heatMap: this.options.heatMap,\n interactive: this.options.interactive,\n onTimepointHover: this.options.onTimepointHover\n });\n\n /**\n * Check additionalItemOrder in cog-button.ts if you need to change the order. - Sha\n */\n const cogButton = this.player.getChild('collapserator')?.getChild('cogButton') as CogButton;\n cogButton.addItem({\n ctor: EngagementOverlayMenuItem,\n name: 'EngagementOverlayMenuItem',\n options: { overlayVisible: true }\n });\n }\n\n public toggleOverlay(show: boolean): void {\n const engagementOverlay = this.player.getChild('engagementOverlay') as EngagementOverlay;\n engagementOverlay?.toggleChart(show);\n }\n\n private hasHeatMapData(): boolean {\n return this.options.heatMap?.reduce((acc, val) => acc + val, 0) > 0;\n }\n}\n\nvideojs.registerPlugin('engagementOverlayPlugin', EngagementOverlayPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n engagementOverlayPlugin(options?: EngagementOverlayPluginOptions): EngagementOverlayPlugin;\n }\n}\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { Interactive } from 'libs/shared/interfaces';\n\nimport { InteractiveBarItems } from 'projects/player/plugins/interactive-plugin/components/seek-bar/interactive-bar-items';\nimport { TrackHelper } from 'projects/player/utils/track-helper';\n\nimport './interactive-plugin-styles.scss';\n\nconst Plugin = videojs.getPlugin('plugin');\n\ninterface InteractiveSeekBarPluginOptions {\n interactive: Interactive;\n}\n\n/**\n * This plugin will just render the interactive seek bar (i.e. just the interaction markers).\n * The user won't be able to interact with any of the interactions.\n * Currently this is just used in reports-player\n */\nclass InteractiveSeekBarPlugin extends Plugin {\n private options: InteractiveSeekBarPluginOptions;\n\n constructor(player: VideoJsPlayer, options: InteractiveSeekBarPluginOptions) {\n super(player);\n\n this.options = options;\n\n this.player.one('loadedmetadata', () => this.player.ready(this.initialize.bind(this)));\n }\n\n private initialize(): void {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n TrackHelper.useMetadataTrack(this.player, 'interactive', this.onTrackLoaded.bind(this));\n\n this.player.addClass('cv-interactive-plugin');\n }\n\n private onTrackLoaded(track: TextTrack): void {\n this.addChildren(track);\n }\n\n private addChildren(track: TextTrack): void {\n const seekBar = this.player.controlBar.getChild('progressControl').getChild('SeekBar');\n\n seekBar.addChild(new InteractiveBarItems(this.player, {\n interactive: this.options.interactive,\n track\n }));\n }\n}\n\nvideojs.registerPlugin('interactiveSeekBarPlugin', InteractiveSeekBarPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n interactiveSeekBarPlugin(options?: InteractiveSeekBarPluginOptions): InteractiveSeekBarPlugin;\n }\n}\n","import { Interactive } from 'libs/shared/interfaces';\n\nimport { ClipData } from 'projects/player/interfaces/models/ClipData';\nimport { PlaybackObject } from 'projects/player/interfaces/models/PlaybackObject';\nimport { BasePlayer, BasePlayerOptions } from 'projects/player/players/base-player';\nimport { AnalyticsPlayerType } from 'projects/player/services/analytics-service';\nimport { InteractiveTrackHelper } from 'projects/player/utils/interactive-track-helper';\n\nimport './reports-player.scss';\n\nimport 'projects/player/plugins/engagement-overlay-plugin/engagement-overlay-plugin';\nimport 'projects/player/plugins/clip-plugin/clip-plugin';\nimport 'projects/player/plugins/interactive-plugin/interactive-seek-bar-plugin';\nimport 'projects/player/plugins/old-version-refresh-plugin/old-version-refresh-plugin';\n\nexport interface ReportsPlayerOptions extends BasePlayerOptions {\n heatMap: number[];\n onTimepointHover?: (time: number | null) => void;\n}\n\nexport class ReportsPlayer extends BasePlayer {\n declare protected options: ReportsPlayerOptions;\n private track: TextTrack;\n\n constructor(id: string | Element, options: ReportsPlayerOptions) {\n super(id, options);\n }\n\n protected getPlayerClassName(): string {\n return 'cv-reports-player';\n }\n\n protected getAnalyticsPlayerType(): AnalyticsPlayerType {\n return 'reports-player';\n }\n\n protected async additionalSetup(playbackObject: PlaybackObject): Promise<void> {\n super.additionalSetup(playbackObject);\n\n this.setupEngagementOverlayPlugin(playbackObject);\n this.setupUpClipPlugin(playbackObject);\n this.setupInteractiveSeekBarPlugin(playbackObject);\n }\n\n private setupEngagementOverlayPlugin(playbackObject: PlaybackObject): void {\n this.player.engagementOverlayPlugin({\n heatMap: this.options.heatMap,\n interactive: playbackObject.additionalData?.interactive as Interactive,\n onTimepointHover: this.options.onTimepointHover\n });\n }\n\n private setupUpClipPlugin(playbackObject: PlaybackObject): void {\n const isClip = playbackObject.mediaType === 'MasterClip';\n const isInteractive = playbackObject.mediaType === 'MasterInteractive';\n\n if (!isClip && !isInteractive)\n return;\n\n let clipData: ClipData;\n if (isClip)\n clipData = playbackObject.additionalData;\n \n if (isInteractive) {\n clipData = playbackObject.additionalData?.clipData;\n\n // Not all interactives will have clip data\n if (!clipData)\n return;\n }\n\n if (!clipData)\n throw Error('Invalid clip data');\n\n this.player.clipPlugin({\n startTime: clipData.startTime,\n endTime: clipData.endTime\n });\n }\n\n private setupInteractiveSeekBarPlugin(playbackObject: PlaybackObject): void {\n const interactive = playbackObject.additionalData?.interactive as Interactive;\n\n if (!playbackObject.additionalData?.interactive)\n return;\n\n this.track = InteractiveTrackHelper.getInteractiveTrack(this.player, playbackObject);\n\n this.player.interactiveSeekBarPlugin({ interactive });\n }\n\n protected getSeekBarOptions(): any {\n return {\n ignoreChapters: true\n };\n }\n}\n","import React from 'react';\n\nimport { ReportsPlayer, ReportsPlayerOptions } from 'projects/player/players/reports/reports-player';\n\nexport function ClickViewReportsPlayer(props: ReportsPlayerOptions): React.ReactElement {\n const ref = React.useRef(null);\n const playerRef = React.useRef<ReportsPlayer>(null);\n\n React.useEffect(() => {\n playerRef.current = new ReportsPlayer(ref.current, props);\n }, []);\n\n return (\n <div ref={ref}></div>\n );\n}\n",":local {\n .playerContainer {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n }\n\n .playerPlaceholder {\n width: 100%;\n padding-bottom: 56.25%;\n }\n\n .heatMap {\n height: 1rem;\n }\n\n .heatMapTimepointIndicator {\n border-left: 0.125rem dashed $info;\n margin-left: -0.0625rem;\n position: absolute;\n top: 0;\n bottom: 0;\n opacity: 0;\n visibility: hidden;\n\n &.heatMapTimepointIndicatorVisible {\n opacity: 1;\n visibility: visible;\n }\n }\n\n .partialLoadingContainer {\n height: 24.015625rem;\n }\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EngagementHeatMap, EngagementHeatMapLegend } from 'libs/shared/apps/analytics/components/engagement-heat-map/EngagementHeatMap';\nimport { getFullHeatMap } from 'libs/shared/apps/analytics/utils/EngagementUtils';\nimport { Engagement } from 'libs/shared/interfaces';\n\nimport { ClickViewReportsPlayer } from 'projects/player/react/ReportsPlayer';\n\nimport styles from './video-engagement-overlay.module.scss';\n\nconst namespace = 'shared.videoEngagementOverlay';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface VideoEngagementOverlayProps {\n engagement: Engagement;\n viewKey: string;\n imageCdnUrl: string;\n playerApiUrl: string;\n}\n\nexport function VideoEngagementOverlay(props: VideoEngagementOverlayProps): JSX.Element {\n const timepointIndicatorRef = React.useRef<HTMLDivElement>(null);\n\n const heatMap = getFullHeatMap(props.engagement);\n\n function setHoverTimepoint(time: number | null): void {\n const el = timepointIndicatorRef.current;\n\n if (!el)\n return;\n\n if (time === null) {\n el.classList.remove(styles.heatMapTimepointIndicatorVisible);\n return;\n }\n\n el.classList.add(styles.heatMapTimepointIndicatorVisible);\n el.style.left = `${time / heatMap.length * 100}%`;\n }\n\n return (\n <div className='bg-white border rounded overflow-hidden h-100'>\n <div className='position-relative'>\n {/**\n * The below div is an empty 16:9 rectangle which maintains this component's\n * height while the player is loading.\n */\n }\n <div className={styles.playerPlaceholder} />\n <div className={styles.playerContainer}>\n <ClickViewReportsPlayer\n viewKey={props.viewKey}\n playerApi={new URL(props.playerApiUrl)}\n hotkeyElQuerySelector='body'\n heatMap={heatMap}\n onTimepointHover={setHoverTimepoint}\n aspectRatio='16:9'\n />\n </div>\n </div>\n <div className='p-3'>\n <div className='position-relative'>\n <EngagementHeatMap\n engagement={props.engagement}\n className={styles.heatMap}\n />\n <div ref={timepointIndicatorRef} className={styles.heatMapTimepointIndicator} />\n </div>\n <div className='d-flex justify-content-between mt-2'>\n <strong>\n {getPhrase('heatmap')}\n </strong>\n <div className='w-33'>\n <EngagementHeatMapLegend />\n </div>\n </div>\n </div>\n </div>\n );\n}\n",":local {\n .videoContainer {\n width: 44%;\n }\n}","import React from 'react';\n\nimport { EngagementTable } from 'libs/shared/apps/analytics/components/engagement-table/EngagementTable';\nimport { InsightAmountWatched } from 'libs/shared/apps/analytics/components/insights/amount-watched/InsightAmountWatched';\nimport { InsightTotalViews } from 'libs/shared/apps/analytics/components/insights/total-views/InsightTotalViews';\nimport { GroupedAnalyticsCount } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { VideoViewEventResponse } from 'libs/shared/apps/analytics/interfaces/VideoViewEvent';\nimport { Config, Engagement, PlayerViewKey } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport { PartialInsightsHeatmap } from 'apps/my-shares/components/insights-heatmap/partial-loading/PartialInsightsHeatmap';\nimport { VideoEngagementOverlay } from 'apps/my-shares/components/video-engagement-overlay/VideoEngagementOverlay';\n\nimport styles from './insights-heatmap.module.scss';\n\ninterface InsightsHeatmapProps {\n hasDataLoaded: boolean;\n tableDataLoaded: boolean;\n yearGroups: GroupedAnalyticsCount[];\n aggregateEngagement: Engagement;\n individualEngagement: Engagement[];\n viewKey: PlayerViewKey;\n config: Config;\n users: AnonUser[];\n classroomStudents?: AnonUser[];\n anonymiseUsers: boolean;\n hideStaffResults: boolean;\n}\n\nexport function InsightsHeatmap(props: InsightsHeatmapProps) {\n return (\n <>\n {!props.hasDataLoaded && <PartialInsightsHeatmap />}\n\n <div className='row g-3 mb-3'>\n {props.hasDataLoaded &&\n <>\n <div className='col'>\n <InsightTotalViews\n events={{ yearGroupCount: props.yearGroups } as VideoViewEventResponse}\n emptyStateImage={ImageUrls.EmptyStates.MY_VIDEOS}\n hideStaffResults={props.hideStaffResults}\n />\n </div>\n <div className='col'>\n <InsightAmountWatched engagement={props.individualEngagement} />\n </div>\n <div className={styles.videoContainer}>\n <VideoEngagementOverlay\n engagement={props.aggregateEngagement}\n viewKey={props.viewKey.viewKey}\n playerApiUrl={props.config.playerApiUrl}\n imageCdnUrl={props.config.imageCdnUrl}\n />\n </div>\n </>\n }\n\n {props.tableDataLoaded &&\n <div className='col-12'>\n <EngagementTable\n engagement={props.individualEngagement}\n users={props.users}\n imageCdnUrl={props.config?.imageCdnUrl}\n anonymiseUsers={props.anonymiseUsers}\n classroomStudents={props.classroomStudents}\n border\n enableSort\n showSeparateNameColumns\n />\n </div>\n }\n </div>\n </>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import"./DAXXjFlN.chunk.js";import{t as e}from"./C2w0pmFW.chunk.js";import{t}from"./wrLrTezN.chunk.js";import{d as n}from"./CEamUdnf.chunk.js";import{t as r}from"./C1HfCcUR.chunk.js";import{t as i}from"./Bjt_-lTs.chunk.js";import{t as a}from"./D_gWf2lC.chunk.js";import{t as o}from"./Dy1f-lNJ.chunk.js";import{n as s,t as c}from"./Dy8J1lcl.chunk.js";import{n as l,t as u}from"./BWWumAle.chunk.js";import{t as d}from"./BQAs90Va.chunk.js";import{c as f,t as p}from"./CHZLAcZ_2.chunk.js";import{t as m}from"./BTd65Rcb2.chunk.js";import{t as h}from"./BVIVwJwa.chunk.js";e();var g=t();function _(e){let t=n(i.currentUser()),_=n(!!t.data&&r.sharedClip(e.objectId,e.shareId)),v=n(a.config()),y=n(u.createViewKey(e.shareId,l.Share)),b=n(o.getShareObject(e.shareId)),x=f(e.objectId);function S(e){e.one(`cv-playback-data-loaded`,()=>{m.remove()})}return c(s.getClipMetadata({content:_.data})),d(_,{private:h}),_.data&&t.hasCompleted&&v.hasCompleted&&y.hasCompleted&&b.hasCompleted&&x.hasCompleted?(0,g.jsx)(p,{config:v.data,video:_.data,currentUser:t.data,shareLink:b.data,viewKey:y.data,presentationSlug:null,embed:!0,showResources:!0,autoplay:e.queryParams.a===`true`,startTime:e.queryParams.t??e.queryParams.startTime,onReady:S,playerIntegrations:x.data}):(0,g.jsx)(g.Fragment,{})}export{_ as EmbeddedClipView};
2
- //# sourceMappingURL=DMefg444.chunk.js.map
1
+ import"./DAXXjFlN.chunk.js";import{t as e}from"./C2w0pmFW.chunk.js";import{t}from"./wrLrTezN.chunk.js";import{d as n}from"./CEamUdnf.chunk.js";import{t as r}from"./C1HfCcUR.chunk.js";import{t as i}from"./Bjt_-lTs.chunk.js";import{t as a}from"./D_gWf2lC.chunk.js";import{t as o}from"./Dy1f-lNJ.chunk.js";import{n as s,t as c}from"./Dy8J1lcl.chunk.js";import{n as l,t as u}from"./BWWumAle.chunk.js";import{t as d}from"./BQAs90Va.chunk.js";import{c as f,t as p}from"./B-V5u42C2.chunk.js";import{t as m}from"./BTd65Rcb2.chunk.js";import{t as h}from"./BVIVwJwa.chunk.js";e();var g=t();function _(e){let t=n(i.currentUser()),_=n(!!t.data&&r.sharedClip(e.objectId,e.shareId)),v=n(a.config()),y=n(u.createViewKey(e.shareId,l.Share)),b=n(o.getShareObject(e.shareId)),x=f(e.objectId);function S(e){e.one(`cv-playback-data-loaded`,()=>{m.remove()})}return c(s.getClipMetadata({content:_.data})),d(_,{private:h}),_.data&&t.hasCompleted&&v.hasCompleted&&y.hasCompleted&&b.hasCompleted&&x.hasCompleted?(0,g.jsx)(p,{config:v.data,video:_.data,currentUser:t.data,shareLink:b.data,viewKey:y.data,presentationSlug:null,embed:!0,showResources:!0,autoplay:e.queryParams.a===`true`,startTime:e.queryParams.t??e.queryParams.startTime,onReady:S,playerIntegrations:x.data}):(0,g.jsx)(g.Fragment,{})}export{_ as EmbeddedClipView};
2
+ //# sourceMappingURL=BObH8Qah.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DMefg444.chunk.js","names":[],"sources":["../../src/apps/embed/views/embedded-clip/EmbeddedClipView.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { PlayerReference } from 'libs/shared/context/player-context/interfaces/PlayerReference';\nimport { MediaIdType } from 'libs/shared/enums/MediaIdType';\nimport { ClipRequests } from 'libs/shared/flight-requests/ClipRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { PlayerRequests } from 'libs/shared/flight-requests/PlayerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useCannotConsumeError } from 'libs/shared/hooks/useCannotConsumeError';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Clip, Config, CurrentUser, PlayerViewKey, UnionShareObject } from 'libs/shared/interfaces';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { usePlayerIntegrations } from 'shared/hooks/usePlayerIntegrations';\nimport { LitePlayerView } from 'shared/views/lite-player/LitePlayerView';\n\nimport { PrivateEmbedError } from 'apps/embed/errors/forbidden/PrivateEmbedError';\nimport { EmbedViewProps } from 'apps/embed/interfaces/EmbedViewProps';\nimport { EmbedPlaceHolderHelper } from 'apps/embed/utils/EmbedPlaceholderHelper';\n\nexport function EmbeddedClipView(props: EmbedViewProps): JSX.Element {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const clip = Flight.useBasicFetch<Clip>(!!currentUser.data &&\n ClipRequests.sharedClip(props.objectId, props.shareId));\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const viewKey = Flight.useBasicFetch<PlayerViewKey>(PlayerRequests.createViewKey(props.shareId, MediaIdType.Share));\n const shareLink = Flight.useBasicFetch<UnionShareObject>(\n ShareRequests.getShareObject(props.shareId)\n );\n const playerIntegrations = usePlayerIntegrations(props.objectId);\n\n function onReady(player: PlayerReference): void {\n player.one('cv-playback-data-loaded', () => {\n EmbedPlaceHolderHelper.remove();\n });\n }\n\n useSetPageMetadata(PageMetadataHelper.getClipMetadata({ content: clip.data }));\n useCannotConsumeError(clip, { private: PrivateEmbedError });\n\n const hasLoaded = (\n clip.data &&\n currentUser.hasCompleted &&\n config.hasCompleted &&\n viewKey.hasCompleted &&\n shareLink.hasCompleted &&\n playerIntegrations.hasCompleted\n );\n\n if (!hasLoaded)\n return <></>;\n\n return (\n <LitePlayerView\n config={config.data}\n video={clip.data}\n currentUser={currentUser.data}\n shareLink={shareLink.data}\n viewKey={viewKey.data}\n presentationSlug={null}\n embed\n showResources\n autoplay={props.queryParams.a === 'true'}\n startTime={props.queryParams.t ?? props.queryParams.startTime}\n onReady={onReady}\n playerIntegrations={playerIntegrations.data}\n />\n );\n}\n"],"mappings":"okBAuBA,SAAgB,EAAiB,EAAoC,CACnE,IAAM,EAAc,EAAkC,EAAa,YAAY,CAAC,EAC1E,EAAO,EAA2B,CAAC,CAAC,EAAY,MACpD,EAAa,WAAW,EAAM,SAAU,EAAM,OAAO,CAAC,EAClD,EAAS,EAA6B,EAAe,OAAO,CAAC,EAC7D,EAAU,EAAoC,EAAe,cAAc,EAAM,QAAS,EAAY,KAAK,CAAC,EAC5G,EAAY,EAChB,EAAc,eAAe,EAAM,OAAO,CAC5C,EACM,EAAqB,EAAsB,EAAM,QAAQ,EAE/D,SAAS,EAAQ,EAA+B,CAC9C,EAAO,IAAI,8BAAiC,CAC1C,EAAuB,OAAO,CAChC,CAAC,CACH,CAiBA,OAfA,EAAmB,EAAmB,gBAAgB,CAAE,QAAS,EAAK,IAAK,CAAC,CAAC,EAC7E,EAAsB,EAAM,CAAE,QAAS,CAAkB,CAAC,EAGxD,EAAK,MACL,EAAY,cACZ,EAAO,cACP,EAAQ,cACR,EAAU,cACV,EAAmB,cAOnB,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,OAAQ,EAAO,KACf,MAAO,EAAK,KACZ,YAAa,EAAY,KACzB,UAAW,EAAU,KACrB,QAAS,EAAQ,KACjB,iBAAkB,KAClB,MAAA,GACA,cAAA,GACA,SAAU,EAAM,YAAY,IAAM,OAClC,UAAW,EAAM,YAAY,GAAK,EAAM,YAAY,UAC3C,UACT,mBAAoB,EAAmB,IACxC,CAAA,GAhBM,EAAA,EAAA,IAAA,CAAA,EAAA,SAAA,CAAI,CAAA,CAkBf"}
1
+ {"version":3,"file":"BObH8Qah.chunk.js","names":[],"sources":["../../src/apps/embed/views/embedded-clip/EmbeddedClipView.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { PlayerReference } from 'libs/shared/context/player-context/interfaces/PlayerReference';\nimport { MediaIdType } from 'libs/shared/enums/MediaIdType';\nimport { ClipRequests } from 'libs/shared/flight-requests/ClipRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { PlayerRequests } from 'libs/shared/flight-requests/PlayerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useCannotConsumeError } from 'libs/shared/hooks/useCannotConsumeError';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Clip, Config, CurrentUser, PlayerViewKey, UnionShareObject } from 'libs/shared/interfaces';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { usePlayerIntegrations } from 'shared/hooks/usePlayerIntegrations';\nimport { LitePlayerView } from 'shared/views/lite-player/LitePlayerView';\n\nimport { PrivateEmbedError } from 'apps/embed/errors/forbidden/PrivateEmbedError';\nimport { EmbedViewProps } from 'apps/embed/interfaces/EmbedViewProps';\nimport { EmbedPlaceHolderHelper } from 'apps/embed/utils/EmbedPlaceholderHelper';\n\nexport function EmbeddedClipView(props: EmbedViewProps): JSX.Element {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const clip = Flight.useBasicFetch<Clip>(!!currentUser.data &&\n ClipRequests.sharedClip(props.objectId, props.shareId));\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const viewKey = Flight.useBasicFetch<PlayerViewKey>(PlayerRequests.createViewKey(props.shareId, MediaIdType.Share));\n const shareLink = Flight.useBasicFetch<UnionShareObject>(\n ShareRequests.getShareObject(props.shareId)\n );\n const playerIntegrations = usePlayerIntegrations(props.objectId);\n\n function onReady(player: PlayerReference): void {\n player.one('cv-playback-data-loaded', () => {\n EmbedPlaceHolderHelper.remove();\n });\n }\n\n useSetPageMetadata(PageMetadataHelper.getClipMetadata({ content: clip.data }));\n useCannotConsumeError(clip, { private: PrivateEmbedError });\n\n const hasLoaded = (\n clip.data &&\n currentUser.hasCompleted &&\n config.hasCompleted &&\n viewKey.hasCompleted &&\n shareLink.hasCompleted &&\n playerIntegrations.hasCompleted\n );\n\n if (!hasLoaded)\n return <></>;\n\n return (\n <LitePlayerView\n config={config.data}\n video={clip.data}\n currentUser={currentUser.data}\n shareLink={shareLink.data}\n viewKey={viewKey.data}\n presentationSlug={null}\n embed\n showResources\n autoplay={props.queryParams.a === 'true'}\n startTime={props.queryParams.t ?? props.queryParams.startTime}\n onReady={onReady}\n playerIntegrations={playerIntegrations.data}\n />\n );\n}\n"],"mappings":"okBAuBA,SAAgB,EAAiB,EAAoC,CACnE,IAAM,EAAc,EAAkC,EAAa,YAAY,CAAC,EAC1E,EAAO,EAA2B,CAAC,CAAC,EAAY,MACpD,EAAa,WAAW,EAAM,SAAU,EAAM,OAAO,CAAC,EAClD,EAAS,EAA6B,EAAe,OAAO,CAAC,EAC7D,EAAU,EAAoC,EAAe,cAAc,EAAM,QAAS,EAAY,KAAK,CAAC,EAC5G,EAAY,EAChB,EAAc,eAAe,EAAM,OAAO,CAC5C,EACM,EAAqB,EAAsB,EAAM,QAAQ,EAE/D,SAAS,EAAQ,EAA+B,CAC9C,EAAO,IAAI,8BAAiC,CAC1C,EAAuB,OAAO,CAChC,CAAC,CACH,CAiBA,OAfA,EAAmB,EAAmB,gBAAgB,CAAE,QAAS,EAAK,IAAK,CAAC,CAAC,EAC7E,EAAsB,EAAM,CAAE,QAAS,CAAkB,CAAC,EAGxD,EAAK,MACL,EAAY,cACZ,EAAO,cACP,EAAQ,cACR,EAAU,cACV,EAAmB,cAOnB,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,OAAQ,EAAO,KACf,MAAO,EAAK,KACZ,YAAa,EAAY,KACzB,UAAW,EAAU,KACrB,QAAS,EAAQ,KACjB,iBAAkB,KAClB,MAAA,GACA,cAAA,GACA,SAAU,EAAM,YAAY,IAAM,OAClC,UAAW,EAAM,YAAY,GAAK,EAAM,YAAY,UAC3C,UACT,mBAAoB,EAAmB,IACxC,CAAA,GAhBM,EAAA,EAAA,IAAA,CAAA,EAAA,SAAA,CAAI,CAAA,CAkBf"}
@@ -1,2 +1,2 @@
1
- import{o as e}from"./DAXXjFlN.chunk.js";import{o as t,r as n,t as r}from"./CvE4SVf2.chunk.js";import{y as i}from"./BftnFbcr.chunk.js";import"./DFZS3Ffo.chunk.js";import{t as a}from"./CQyJ7YGa.chunk.js";import{t as o}from"./e57H3T-k.chunk.js";import{t as s}from"./C2w0pmFW.chunk.js";import{t as c}from"./wrLrTezN.chunk.js";import{t as l}from"./BXTI9cmX.chunk.js";import{t as u}from"./CjA4Q5pm.chunk.js";import{N as d,U as ee,a as te,l as f,y as p,z as m}from"./BHvdJc9z.chunk.js";import{t as h}from"./BxbRBSiP.chunk.js";import{i as g,t as _}from"./DxTLIRiK2.chunk.js";import{t as ne}from"./CVHQXNzi2.chunk.js";import{t as v}from"./quMwO3lt2.chunk.js";import{t as y}from"./CVtvY0gg.chunk.js";import{t as b}from"./hQ9iY4r0.chunk.js";import{n as re}from"./BRcHS92O2.chunk.js";import{t as ie}from"./Bs2PKr1I2.chunk.js";import{t as ae}from"./DpCWroEe2.chunk.js";import{n as x}from"./C0exjRXJ.chunk.js";import{t as oe}from"./Bbp2U9GK.chunk.js";import{t as S}from"./B8AENY2U.chunk.js";import{t as se}from"./CKh-VEMl.chunk.js";import{t as C}from"./B5TCUfQl.chunk.js";import{i as ce}from"./Dy8J1lcl.chunk.js";import{t as le}from"./rVRhgtHY2.chunk.js";import{n as w,t as ue}from"./CpFtf-tI2.chunk.js";import{n as de}from"./BJUbYu222.chunk.js";import{t as fe}from"./DW24qN_e2.chunk.js";import{t as T}from"./5ONJSThP.chunk.js";import{t as pe}from"./jAbfamoi.chunk.js";import{t as me}from"./BE8FmNfm2.chunk.js";import{n as E,t as D}from"./BzuCKTvW.chunk.js";import{t as O}from"./DsBWAM3I.chunk.js";import{t as he}from"./BqbRZ5hB.chunk.js";import{t as ge}from"./9kh0Xx2n2.chunk.js";import{c as _e,i as ve,n as ye,o as be,s as xe,t as Se}from"./BcrXhug9.chunk.js";import{t as Ce}from"./tnBD84bg2.chunk.js";import{t as we}from"./DELN_PAD2.chunk.js";import{t as k}from"./u5dYfNkx2.chunk.js";import{n as Te,t as Ee}from"./KmDyjq5W.chunk.js";import{t as De}from"./BTFvVc1Z.chunk.js";import{t as A}from"./OtQaFdir.chunk.js";import{t as j}from"./Dopg0SXC.chunk.js";import{n as Oe}from"./BtgXP7tw.chunk.js";import{t as ke}from"./jlUP1BHc.chunk.js";import{n as Ae,t as je}from"./DLpjTXb22.chunk.js";import{n as M,t as Me}from"./BfGWS3N1.chunk.js";import{t as N}from"./BAkU_szZ.chunk.js";import{t as Ne}from"./BJk-_glp2.chunk.js";import{r as Pe}from"./C1SMWeap2.chunk.js";import{t as Fe}from"./7I0L5W4N2.chunk.js";import{n as P,r as F,t as Ie}from"./sTL-xC6d2.chunk.js";import{t as I}from"./CLjADRa42.chunk.js";import{t as Le}from"./CafgzmZf.chunk.js";import{t as Re}from"./qmv5yEXF.chunk.js";var L=e(s()),R=c(),z=pe();function B(){let e=T();return e.lg||e.xl||e.xxl}var V={copyrightDisclaimer:`_copyrightDisclaimer_yyjul_1`,overlayContainer:`_overlayContainer_yyjul_4`},H=`shared.copyrightDisclaimer`,ze=150;function Be(e){let[n,r]=de({});function i(){return document.documentElement.clientHeight-n.current?.getBoundingClientRect().bottom<ze}return(0,R.jsxs)(`div`,{ref:n,className:e.className,children:[(0,R.jsx)(`p`,{className:`${V.copyrightDisclaimer} ${e.phraseClassName??`mb-1`}`,children:(0,R.jsx)(w,{namespace:H,phrase:`copyrightDisclaimer`})}),(0,R.jsx)(t,{target:n.current,show:r,placement:e.overflowPlacement&&i()?e.overflowPlacement:e.placement,children:(0,R.jsxs)(`div`,{className:`${V.overlayContainer} mw-100 bg-white border rounded-3 p-2`,children:[(0,R.jsx)(`p`,{children:(0,R.jsx)(w,{namespace:H,phrase:`warning`})}),(0,R.jsx)(`p`,{className:`fw-semibold mb-0`,children:(0,R.jsx)(w,{namespace:H,phrase:`sharing`})})]})})]})}function Ve(e){return(0,R.jsx)(Fe,{lines:12,children:()=>(0,R.jsx)(`p`,{className:`mb-0`,dangerouslySetInnerHTML:{__html:o.sanitize(Ce.linkifyText(e.video.description,{nl2br:!0}))}})})}var He={descriptionBorder:`_descriptionBorder_any0w_2`},U=`shared.videoDetailsV2`,W=a.encloseNamespace(U);function G(e){let{label:t,items:n,className:r}=e;return n&&n.data&&n.data.length?typeof e.getItemAppLink==`function`?(0,R.jsxs)(`div`,{className:r,children:[(0,R.jsxs)(`span`,{children:[t,`: `]}),n.data.map((t,r)=>(0,R.jsxs)(L.Fragment,{children:[(0,R.jsx)(S,{appLink:e.getItemAppLink(t),children:t.name?.trim()},t.id),r<n.data.length-1&&(0,R.jsx)(`span`,{children:`, `})]},t.id))]}):(0,R.jsxs)(`div`,{className:r,children:[t,`: `,n.data.map(e=>e.name?.trim()).join(`, `)]}):(0,R.jsx)(R.Fragment,{})}function Ue(e){let t=e.categories?.data;return t?.length?t.filter(e=>e.libraries?.data?.[0]?.type===fe.CustomLibrary).map(e=>({library:e.libraries?.data?.[0],category:e})):[]}function We(e){return[{name:e.pair.library.name,appLink:e.getLibraryAppLink?.(e.pair.library)},{name:`...`},{name:e.pair.category.name,appLink:e.getFolderAppLink?.(e.pair.library,e.pair.category)}]}function Ge(e){let{video:t}=e;if(!v.isVideo(t)&&!v.isClip(t))return(0,R.jsx)(R.Fragment,{});let n=v.getParentVideo(t),r=Ue(t);function i(t){if(!(!t.partnerProfiles||!t.partnerProfiles?.data?.length)){if(t.partnerProfiles?.count>1&&typeof e.getPartnerDashboardHubAppLink==`function`)return e.getPartnerDashboardHubAppLink(t);if(typeof e.getPartnerProfileAppLink==`function`)return e.getPartnerProfileAppLink(t.partnerProfiles?.data?.[0])}}return(0,R.jsxs)(`div`,{className:t.description?`col-md-5 ps-md-3 pt-3 pt-md-0`:`col-12`,children:[(0,R.jsx)(`h2`,{className:`h6 mb-1`,children:(0,R.jsx)(w,{phrase:`details`})}),!!n.productionYear&&(0,R.jsx)(`div`,{className:`mb-1`,children:(0,R.jsx)(w,{phrase:`productionYear`,options:{year:n.productionYear}})}),(0,R.jsx)(G,{label:W(`productionCompanies`,{smartCount:n.productionCompanies?.data?.length}),items:n.productionCompanies,getItemAppLink:i,className:`mb-1`}),(0,R.jsx)(G,{label:W(`distributors`,{smartCount:n.distributors?.data?.length}),items:n.distributors,getItemAppLink:i,className:`mb-1`}),(0,R.jsx)(G,{label:W(`producers`,{smartCount:n.producers?.data?.length}),items:n.producers,className:`mb-1`}),(0,R.jsx)(G,{label:W(`directors`,{smartCount:n.directors?.data?.length}),items:n.directors,className:`mb-1`}),!!n.dateBroadcast&&(0,R.jsx)(`div`,{className:`mb-1`,children:(0,R.jsx)(w,{phrase:`dateBroadcast`,options:{date:u.format(n.dateBroadcast,`DD/MM/YYYY`)}})}),!!n.channel&&(0,R.jsx)(`div`,{className:`mb-1`,children:(0,R.jsx)(w,{phrase:`channel`,options:{channel:n.channel.name}})}),v.canViewUploadDate(e.video)&&(0,R.jsx)(`div`,{className:`mb-1`,children:(0,R.jsx)(w,{phrase:`dateUploaded`,options:{date:u.format(t.dateCreated,`DD/MM/YYYY`)}})}),!!(r.length&&e.getLibraryAppLink&&e.getFolderAppLink)&&(0,R.jsxs)(`div`,{className:`mb-1`,children:[(0,R.jsxs)(`div`,{children:[W(`libraries`,{smartCount:r.length}),`:`]}),r.map((t,n)=>(0,R.jsx)(`div`,{children:(0,R.jsx)(De,{breadcrumbs:We({pair:t,getLibraryAppLink:e.getLibraryAppLink,getFolderAppLink:e.getFolderAppLink}),linkClassName:`text-info`})},n))]})]})}function Ke(e){let{video:t,maxHeight:n=368}=e,r=v.getParentVideo(t),i=!!e.video.description,a=Ie(e.video)||!!r.productionYear||!!r.dateBroadcast||!!r.channel||v.canViewUploadDate(e.video);if(!i&&!a)return(0,R.jsx)(R.Fragment,{});function o(){return e.hideTags||v.isInteractive(e.video)||!e.video.tags?.data?.length?null:e.video.tags?.data?.filter(e=>e.tagType===h.Normal)}let s=o();return(0,R.jsx)(ue.Provider,{value:U,children:(0,R.jsxs)(`section`,{id:N.VideoDetails,ref:t=>{t&&e.headingRef?.current&&e.headingRef.current.set(N.VideoDetails,t)},className:`play-page-section`,children:[e.showHeading&&(0,R.jsx)(k,{name:W(`heading`)}),(0,R.jsx)(`div`,{className:`rounded border p-3 position-relative`,children:(0,R.jsxs)(z.Scrollbars,{autoHeight:!0,autoHeightMax:n,hideTracksWhenNotNeeded:!0,children:[(0,R.jsxs)(`div`,{className:`row g-0`,children:[i&&(0,R.jsxs)(`div`,{className:a?`${He.descriptionBorder} pe-3 col-md-7`:`col-12`,children:[(0,R.jsxs)(`div`,{className:`d-flex align-items-center`,children:[(0,R.jsx)(`h2`,{className:`h6 mb-1`,children:(0,R.jsx)(w,{phrase:`description`})}),(0,R.jsx)(Ne,{text:t.description,title:t.name,className:`ps-2`,onLaunch:e.onLaunchImmersiveReader,onExit:e.onExitImmersiveReader,analyticsOptions:{location:p.PlayPage,entity:f.Video,actionType:m.Click,descriptor:te.LaunchImmersiveReader},analyticsData:{id:t.id,type:`description`}})]}),(0,R.jsx)(Ve,{video:e.video})]}),a&&(0,R.jsx)(Ge,{...e})]}),!!s?.length&&(0,R.jsxs)(`div`,{className:`mt-3`,children:[(0,R.jsx)(`h2`,{className:`h6 mb-1`,children:(0,R.jsx)(w,{phrase:`normalTags`})}),(0,R.jsx)(P,{tags:s,...F.getTagActionProps(e.getTagAppLink,null,e.suppressInteractivity),className:`mt-1`})]}),v.isBroadcast(e.video)&&(0,R.jsx)(Be,{placement:`bottom-start`,className:`d-flex justify-content-start mt-2`,phraseClassName:`mb-0`,overflowPlacement:`top-start`})]})})]})})}function K(e,t,n,r){let i=()=>{I.unsubscribe(e,t)};return(0,L.useEffect)(()=>{if(r)return n?I.subscribeOnce(e,t):I.subscribe(e,t),()=>{i()}},[]),i}var q={learningIntention:`_learningIntention_lm8nf_1`,highlightPoi:`_highlightPoi_lm8nf_7`,icon:`_icon_lm8nf_10`},qe=/\[\]\(cv:\/\/poi\?id=\d+\)\n*/g;function Je(e){return e.replace(qe,``)}function Ye(e){return ce(Je(e.content),{async:!1})}function Xe(e,t){let[n,r]=(0,L.useState)(``);return(0,L.useEffect)(()=>{if(!t||!e.glance?.content)return;let n=Ye(e.glance);r(n)},[e.glance?.content,t]),n}function Ze(e){return e.glance?.content&&e.glance?.format===`text/markdown`}function Qe(e,t){let n=(0,L.useRef)(null);K(`player:poi:mouseover`,r,null,t),K(`player:poi:mouseleave`,i,null,t),(0,L.useEffect)(()=>{if(!(!n.current||!t))return n.current?.addEventListener(`mouseover`,a),n.current?.addEventListener(`mouseleave`,o),()=>{n.current?.removeEventListener(`mouseover`,a),n.current?.removeEventListener(`mouseleave`,o)}},[n.current]);function r(t){!t?.id||e?.id?.toString()!==t?.id?.toString()||n.current?.classList.add(q.highlightPoi)}function i(){n.current?.classList.remove(q.highlightPoi)}function a(){e&&I.trigger(`glance:poi:mouseover`,e)}function o(){I.trigger(`glance:poi:mouseleave`)}return n}var J={poiEntry:`_poiEntry_1bne8_1`,poiText:`_poiText_1bne8_5`,public:`_public_1bne8_5`,poiTimeStamp:`_poiTimeStamp_1bne8_14`,wideBadge:`_wideBadge_1bne8_18`};function $e(e){let t=O.ToDisplayDuration(e.poi.startTime*1e3),n=Qe(e.poi,!e.suppressInteractivity);return e.suppressInteractivity?(0,R.jsxs)(`div`,{className:`d-flex ${J.poiEntry} mb-2`,children:[(0,R.jsx)(`span`,{className:`d-flex rounded-pill justify-content-center align-items-center text-info bg-light-blue ${J.poiTimeStamp} ${e.wideBadge?J.wideBadge:``}`,children:t}),(0,R.jsx)(`div`,{className:`${J.public} ms-2`,children:e.poi.description})]}):(0,R.jsxs)(oe,{className:`d-flex ${J.poiEntry} mb-2 cursor-pointer`,onClick:()=>e.onClickPoiItem(e.poi.startTime),ref:n,children:[(0,R.jsx)(`div`,{className:`d-flex rounded-pill justify-content-center align-items-center text-info bg-light-blue ${J.poiTimeStamp} ${e.wideBadge?J.wideBadge:``}`,children:t}),(0,R.jsx)(`div`,{className:`ms-2 ${J.poiText}`,children:e.poi.description})]},e.poi.startTime)}var et=`shared.pointsOfInterestList`;function tt(e){let t=e.pointsOfInterest.sort((e,t)=>e.startTime-t.startTime),n=t.some(e=>e.startTime>=3600);return(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`h2`,{className:`h6 my-2`,children:(0,R.jsx)(w,{namespace:et,phrase:`heading`})}),(0,R.jsx)(`div`,{children:t.map(t=>(0,R.jsx)($e,{poi:t,suppressInteractivity:e.suppressInteractivity,onClickPoiItem:e.onClickPoiItem,wideBadge:n},t.startTime))})]})}var nt=`shared.videoAtAGlanceV2`,rt=365;function it(e){return e.hideScrollbar?(0,R.jsx)(R.Fragment,{children:e.children}):(0,R.jsx)(`div`,{className:`rounded border mb-4 bg-white`,children:(0,R.jsx)(z.Scrollbars,{autoHeight:!0,autoHeightMax:rt,children:(0,R.jsx)(`div`,{className:`px-3 pt-3 pb-2`,children:e.children})})})}function at(e){let t=Xe(e.video,e.canViewGlance),[n,r]=L.useState(``);function i(){let t={id:e.video.glance.id,name:e.video.glance.name,videoId:e.video.id,videoName:e.video.name,learningIntention:n},r={actionType:m.Copy,entity:f.Glance,location:p.PlayPage};b.logUserAction(t,r)}function a(){return v.isInteractive(e.video)||!e.video.tags?.data?.length?null:e.video.tags?.data?.filter(e=>e.tagType===h.Pedagogy||e.tagType===h.Skill)}let s=a(),c=L.useRef(null);if(L.useEffect(()=>{c.current?.innerText&&r(c.current.innerText)},[c.current?.innerText]),!e.canViewGlance)return(0,R.jsx)(R.Fragment,{});function l(t){e.setStartTime(t)}return(0,R.jsx)(`section`,{className:`play-page-section`,children:(0,R.jsxs)(it,{hideScrollbar:e.hideScrollbar,children:[(0,R.jsx)(`h2`,{className:`h6 mb-2`,children:(0,R.jsx)(w,{namespace:nt,phrase:`learningIntention`})}),(0,R.jsxs)(`div`,{className:`mb-3 ${q.learningIntention}`,children:[(0,R.jsx)(Me,{copyableContent:n,tooltipClassName:q.icon,onClick:i,visible:!0}),(0,R.jsx)(`div`,{dangerouslySetInnerHTML:{__html:o.sanitize(t)},className:`d-inline`,ref:c})]}),!!s?.length&&(0,R.jsx)(`div`,{children:(0,R.jsx)(P,{tags:s,...F.getTagActionProps(e.getTagAppLink,e.onClickTag,e.suppressInteractivity),className:`mt-2`})}),!!e.pointsOfInterest?.length&&(0,R.jsx)(`div`,{className:`mt-3`,children:(0,R.jsx)(tt,{pointsOfInterest:e.pointsOfInterest,suppressInteractivity:e.suppressInteractivity,onClickPoiItem:l})})]})})}var ot=L.memo(function(e){let{data:t,thumbnailSize:n,preloadImage:r,getAppLink:i}=e,a=j(t.subjectPresentationAudiences?.data,e.audiences);return(0,R.jsxs)(`div`,{className:`flex-shrink-0 px-1 col-6 col-sm-4`,children:[(0,R.jsx)(Se,{type:`static`,textPosition:ye.Independent,video:t,appLink:i(t),imageOptions:{size:n},preload:r,analyticsData:e.analyticsData,analyticsOptions:e.analyticsOptions,audience:a,hideDuration:!1,commonVideoProps:e.commonVideoProps}),(0,R.jsx)(`div`,{className:`mt-2`,children:(0,R.jsx)(ve,{...e,video:t,appLink:e.getAppLink(t)})})]})}),st=`shared.playPageClips`;function ct(e){if(!e.canViewClips||!e.clips?.length)return(0,R.jsx)(R.Fragment,{});let t=v.isVideo(e.video);function n(){return v.isVideo(e.video)?{action:y.Videos.VIDEO_CLIPS,application:l.VIDEOS,args:[e.presentationSlug,e.video.id,o.slugify(e.video.name)]}:{action:y.Clips.CLIP_CLIPS,application:l.CLIPS,args:[e.video.id,o.slugify(e.video.name)]}}let r=a.getPhrase(st,t?`clips`:`otherClips`,{count:e.clips.length});return(0,R.jsx)(`section`,{className:`play-page-section`,id:N.Clips,ref:t=>{t&&e.headingRef?.current&&e.headingRef.current.set(N.Clips,t)},children:(0,R.jsx)(_,{name:r,contents:g.ClipsV2,collection:e.clips,prefetched:!0,getChildAppLink:e=>({application:l.CLIPS,action:y.Clips.PLAY_CLIP,args:[e.id,o.slugify(e.name)]}),appLink:n(),childComponent:ot,extraChildComponentProps:{audiences:e.audiences,showOwner:!0,commonVideoProps:e.commonVideoProps},analyticsData:e.analyticsData})})}var lt=`shared.playPageInteractives`;function ut(e){if(!e.canViewInteractives||!e.interactives?.length)return(0,R.jsx)(R.Fragment,{});function t(){return v.isVideo(e.video)?{action:y.Videos.VIDEO_INTERACTIVES,application:l.VIDEOS,args:[e.presentationSlug,e.video.id,o.slugify(e.video.name)]}:{action:y.Clips.CLIP_INTERACTIVES,application:l.CLIPS,args:[e.video.id,o.slugify(e.video.name)]}}let n=a.getPhrase(lt,`interactives`,{count:e.interactives.length});return(0,R.jsx)(`section`,{className:`play-page-section`,id:N.Interactives,ref:t=>{t&&e.headingRef?.current&&e.headingRef.current.set(N.Interactives,t)},children:(0,R.jsx)(_,{name:n,contents:g.InteractivesV2,collection:e.interactives,prefetched:!0,getChildAppLink:e=>({application:l.INTERACTIVES,action:y.Interactives.VIEW_INTERACTIVE,args:[e.id,o.slugify(e.name)]}),appLink:t(),childComponent:Pe,extraChildComponentProps:{questionsAppLink:{application:l.INTERACTIVES,action:y.Interactives.PREVIEW_QUESTIONS},showOwner:!0,commonVideoProps:e.commonVideoProps},analyticsData:e.analyticsData})})}function dt(e){return(0,R.jsx)(`svg`,{...e,children:(0,R.jsx)(`path`,{d:`M5.455 12c0 .401.325.727.727.727h9.88l-3.849 3.85a.728.728 0 0 0 1.029 1.028l5.09-5.091a.73.73 0 0 0 .213-.514v7.272a.727.727 0 0 0 1.455 0V4.727a.727.727 0 0 0-1.455 0V12a.73.73 0 0 0-.213-.515l-5.09-5.09a.727.727 0 1 0-1.029 1.028l3.85 3.85H6.181a.727.727 0 0 0-.727.727`,fill:`currentColor`})})}function ft(e){return(0,R.jsx)(`svg`,{...e,children:(0,R.jsx)(`path`,{d:`M20 12a.727.727 0 0 0-.727-.728h-9.88l3.848-3.849a.727.727 0 1 0-1.028-1.029l-5.091 5.091a.73.73 0 0 0-.213.514V4.727a.727.727 0 0 0-1.454 0v14.545a.727.727 0 0 0 1.454 0V12c0 .186.071.373.213.515l5.091 5.09a.727.727 0 0 0 1.029-1.028l-3.85-3.85h9.88A.727.727 0 0 0 20 12`,fill:`currentColor`})})}var Y={showInSide:`_showInSide_1n1am_1`,container:`_container_1n1am_7`,aside:`_aside_1n1am_11`,collapse:`_collapse_1n1am_14`,iconContainer:`_iconContainer_1n1am_22`,arrowIcon:`_arrowIcon_1n1am_22`,listIcon:`_listIcon_1n1am_25`},pt=`shared.playPage`;function mt(e){function t(){let t={actionType:e.isExpanded?m.Hide:m.Open,entity:f.TableOfContents,location:p.PlayPage};b.logUserAction(e.analyticsData,t)}function n(){let n=!e.isExpanded;e.setIsExpanded(n),n?(e.toggleTheatreMode?.(!1),e.toggleTheatreMode||e.setIsExpanded(!1)):(e.toggleTheatreMode?.(!0),e.toggleTheatreMode||e.setIsExpanded(!0)),t()}return(0,R.jsx)(`div`,{className:`d-flex justify-content-end`,children:(0,R.jsx)(`div`,{className:Y.container,children:(0,R.jsxs)(`div`,{className:`${Y.iconContainer}`,children:[(0,R.jsx)(C,{className:`btn btn-outline-dark ${Y.listIcon}`,svg:we,onClick:n}),(0,R.jsx)(C,{className:`btn btn-outline-dark ${Y.arrowIcon}`,svg:e.isExpanded?dt:ft,onClick:n})]})})})}function ht(e){function t(){let t={actionType:m.Hide,entity:f.TableOfContents,location:p.PlayPage};b.logUserAction(e.analyticsData,t)}function n(e){let t=ae.getCurrentRoute().appLink,n=t.params?{...t.params}:{};return n.tocId=e.id,{...t,params:n}}function r(){e.showInSide||e.setIsExpanded(!1)}return(0,R.jsxs)(R.Fragment,{children:[e.showInSide&&!e.hasTranscription&&(0,R.jsx)(C,{className:`btn position-absolute ${Y.collapse}`,svg:dt,onClick:()=>{e.setIsExpanded(!1),e.toggleTheatreMode?.(!0),t()}}),(0,R.jsx)(`h2`,{className:`h5`,children:(0,R.jsx)(w,{namespace:pt,phrase:`tocHeading`})}),(0,R.jsx)(Le,{items:e.items,activeId:e.activeId,getAppLink:n,setControlledId:e.setControlledId,analyticsData:e.analyticsData,onItemClick:()=>r()})]})}function gt(e){return(0,R.jsxs)(`div`,{className:e.showInSide?`col ms-2 ps-4 ${Y.showInSide}`:`d-inline-flex gap-1`,children:[(0,R.jsx)(`aside`,{className:`${Y.aside} position-relative ${e.showInSide?`pe-1 pt-1 `:`px-3 pt-3 pb-2 border border-dark rounded-1 bg-white`}`,children:(0,R.jsxs)(`div`,{className:`${Y.container}`,children:[e.shouldShowToc&&(0,R.jsx)(ht,{...e}),!e.showTocOnly&&e.additionalComponents.map((e,t)=>(0,R.jsx)(L.Fragment,{children:e},`additional-component-${t}`))]})}),!e.showInSide&&e.shouldShowToc&&(0,R.jsx)(mt,{...e})]})}function _t(e){return(0,R.jsxs)(R.Fragment,{children:[e.isExpanded&&e.showInSide&&(0,R.jsx)(gt,{...e}),A.renderInPortalIfExists(!e.isExpanded&&e.shouldShowToc&&(0,R.jsx)(mt,{...e}),document.getElementById(se)),A.renderInPortalIfExists(!e.showInSide&&e.isExpanded&&(0,R.jsx)(gt,{...e}),document.getElementById(se))]})}var X={series:`_series_rbe3v_1`,badgeListContainer:`_badgeListContainer_rbe3v_5`,clipOriginInfo:`_clipOriginInfo_rbe3v_11`},vt=`shared.playPage`;function yt(e){let t=j(e.media.subjectPresentationAudiences?.data,e.audiences),n=L.useRef(null),r=L.useRef(null),i=v.isVideo(e.media)&&!!v.getRating(e.media)?.value||v.isVideo(e.media)&&!!e.media.productionYear||!!e.media.subjectPresentationAudiences?.data?.length,a=Ae({location:je.PlayPage,shareId:e.shareId,presentationSlug:e.presentationSlug}),o=!!e.originalVideoAppLink&&v.isClip(e.media)&&v.canViewOriginalVideo(e.media),s=v.getAssociatedCompanies(e.media);return(0,R.jsx)(`section`,{className:`mb-3 position-relative`,ref:n,children:(0,R.jsxs)(`div`,{className:`d-inline-block w-100`,ref:r,children:[e.featureAccess.canNavigate&&(0,R.jsx)(`div`,{className:`ms-2 float-end`,children:(0,R.jsx)(he,{actions:a.getVideoActions(e.media),actionsDropdownClassName:`btn btn-outline-dark`,fetchMore:()=>a.fetchMoreActions(e.media)})}),!!v.isVideo(e.media)&&(0,R.jsx)(me,{type:e.subTextType,video:e.media,appLink:e.subtextAppLink,className:`${X.series} text-truncate mw-100`,analyticsOptions:{location:p.PlayPage}}),(0,R.jsxs)(`h1`,{className:`h4 mb-2 mw-100`,children:[(0,R.jsx)(`span`,{className:`align-self-center`,children:e.media.name}),e.showTitlePadlock&&(0,R.jsx)(be,{tooltipPlacement:`right`,className:`d-inline-block ps-1`,video:e.media,yearGroups:e.yearGroups})]}),v.isClip(e.media)&&o&&(0,R.jsxs)(`p`,{className:`clamp-1 ${X.clipOriginInfo}`,children:[(0,R.jsx)(w,{namespace:vt,phrase:`viewOriginal`}),`\xA0`,(0,R.jsx)(S,{className:`info-link`,appLink:e.originalVideoAppLink,children:e.media._parentVideo?.name}),`\xA0`,(0,R.jsx)(w,{namespace:vt,phrase:`timestamp`,options:{timeRange:`${O.ToDisplayTimeRange(e.media.startTime*1e3,e.media.endTime*1e3)}`}})]}),i&&(0,R.jsxs)(ge,{className:X.badgeListContainer,children:[v.isVideo(e.media)&&s.length>0&&(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(Re,{type:ne.Video,companies:s,video:e.media,companyLogoFallbackUrl:e.companyLogoFallbackUrl,imageCdnUrl:e.imageCdnUrl}),(0,R.jsx)(`span`,{className:`ms-n1 me-1`,children:`•`})]}),(0,R.jsx)(xe,{audience:t,className:`bg-white text-dark`,border:`dark`}),v.isVideo(e.media)&&(0,R.jsx)(D,{type:E.Rating,data:v.getRating(e.media)}),v.isVideo(e.media)&&(0,R.jsx)(D,{type:E.ProductionYear,data:e.media.productionYear})]})]})})}var Z={mask:`_mask_vq9tb_1`,centeredIcon:`_centeredIcon_vq9tb_10`,bgImage:`_bgImage_vq9tb_21`,centeredOverlay:`_centeredOverlay_vq9tb_24`},bt=a.encloseNamespace(`shared.playerPlaceholder`);function xt(e){switch(e.type){case`pip`:return(0,R.jsx)(St,{...e});case`public`:return(0,R.jsx)(Ct,{...e});default:return(0,R.jsx)(R.Fragment,{})}}var St=e=>(0,R.jsxs)(`div`,{className:`position-relative responsive-img ${Z.bgImage}`,style:{backgroundImage:`url('${v.getThumbnail(e.video)?.url??``}')`},children:[(0,R.jsx)(`p`,{className:`m-0 text-white h3 ${Z.centeredOverlay}`,children:bt(`playingPiP`)}),(0,R.jsx)(`div`,{className:Z.mask})]}),Ct=e=>{let t=ie.createUrl(v.getThumbnail(e.video)?.url??``,{size:re.Large});return(0,R.jsx)(`div`,{className:`position-relative responsive-img ${Z.bgImage}`,style:{backgroundImage:`url('${t}')`},children:(0,R.jsxs)(S,{appLink:e.appLink,analyticsOptions:{actionType:m.Click,location:p.PlayPage,entity:f.AppLink,workflowPhase:ee.Start,descriptor:d.SignUp},analyticsData:{},children:[(0,R.jsx)(r,{svg:_e,className:Z.centeredIcon}),(0,R.jsx)(`div`,{className:Z.mask})]})})},wt={fullSizeContainer:`_fullSizeContainer_devjw_1`,slidingListScroll:`_slidingListScroll_devjw_5`},Tt=`shared.relatedTopics`,Et=`flex-shrink-0 me-2`;function Dt(e){return(0,R.jsxs)(`section`,{id:N.RelatedTopic,className:`play-page-section`,children:[(0,R.jsx)(k,{name:a.getPhrase(Tt,`heading`)}),(0,R.jsx)(`div`,{className:`mx-n4 px-4 ${wt.slidingListScroll}`,children:(0,R.jsx)(Ee,{position:0,positionType:Te.Pixels,children:e.topics.map(t=>(0,R.jsx)(`li`,{className:Et,children:(0,R.jsx)(Oe,{coverUrl:t.cover?.url,data:t,getChildAppLink:e.getAppLink})},`${t.id}`))})})]})}var Ot=`shared.relatedTopics`;function kt(e){return e.topics?(0,R.jsxs)(`div`,{className:x(e.className),children:[(0,R.jsx)(`h2`,{className:`h5`,children:(0,R.jsx)(w,{namespace:Ot,phrase:`heading`})}),(0,R.jsx)(`div`,{className:x(wt.fullSizeContainer,`overflow-y-auto`),children:e.topics?.map(t=>(0,R.jsx)(n,{title:t?.name,spanHack:!0,children:(0,R.jsx)(`div`,{className:`position-relative mb-3 w-100`,children:(0,R.jsx)(ke,{classification:t,getAppLink:e.getAppLink,onToggleFollowClassification:()=>{},canFollowTopics:!1,hideCounts:!1})})},`related_topic_${t.id}`))})]}):(0,R.jsx)(R.Fragment,{})}function At({resourcePopupId:e,resources:t,getResourceAppLink:n}){L.useEffect(()=>{if(!e)return;let r=t?.find(t=>t.id.toString()===e.toString());r&&i.trigger(n(r))},[e])}var Q={main:`_main_1ujkn_1`,expandedToc:`_expandedToc_1ujkn_1`,theatreMode:`_theatreMode_1ujkn_4`,theatreModeContent:`_theatreModeContent_1ujkn_7`,theatreModePlayPageContainer:`_theatreModePlayPageContainer_1ujkn_17`,theatreModeLeftContent:`_theatreModeLeftContent_1ujkn_21`};function jt(e){return e.shouldShowSideTableOfContents?e.hasTheatreMode&&e.theatreMode?Q.theatreMode:e.tableOfContentsExpanded?`${Q.expandedToc} col-9`:`pe-4`:``}function Mt(e){return e.hasTheatreMode&&(e.theatreMode||!e.shouldShowSideTableOfContents)?`container ${Q.theatreModeContent}`:``}function Nt(e,t){return e&&t.defaultDisplayMode===`theatre`&&t.mode==="default"}var Pt=`play-page-toc-expanded`;function Ft(e,t,n){let r=B(),i=M.get(Pt)!==`false`,a=t?n||r:i,[o,s]=L.useState(e||``),[c,l]=L.useState(``),[u,d]=L.useState(a);L.useEffect(()=>{if(!r){d(!1);return}if(t){d(!0);return}d(a)},[r,n]);function ee(){t&&r||(d(!u),M.set(Pt,(!u).toString()))}return{controlledId:o,setControlledId:s,tableOfContentsExpanded:u,tableOfContentsActiveId:c,setTableOfContentsActiveId:l,onToggleTableOfContents:ee}}var It={map(e){let t=new Proxy(new Map,{get(n,r){if(r===`set`)return(r,i)=>(n.get(r)!==i&&(n.set(r,i),e()),t);let i=Reflect.get(n,r);return typeof i==`function`?i.bind(n):i}});return t}},Lt=[N.Video,N.CurriculumLinks,N.Resources,N.Interactives,N.Clips,N.VideoDetails,N.ClippedFrom,N.Transcript,N.ReferenceVideo,N.RelatedVideos],Rt=[N.Video,N.VideoDetails,N.CurriculumLinks,N.Resources,N.Interactives,N.Clips,N.ClippedFrom,N.Transcript,N.ReferenceVideo,N.RelatedVideos];function zt(e){let t=le(),n=L.useRef(It.map(t));return{headingRef:n,headingElements:(e?Lt:Rt).map(e=>n.current.get(e)).filter(Boolean)}}function Bt(e,t,n){let r=T();if(t!=="default")return!1;let i=n===`theatre`;return!(r.sm||r.md)&&e&&i}var $=a.encloseNamespace(`shared.play`),Vt={getSectionHeading(e,t){switch(e){case N.Resources:return $(`resourcesHeading`,{count:t.resources?.length});case N.Clips:return t.isPlayClipPage?$(`otherClipsHeading`,{count:t.clips?.length-1}):$(`clipsHeading`,{count:t.clips?.length});case N.Interactives:return $(`interactivesHeading`,{count:t.interactives?.length});case N.Video:return $(`videoHeading`);case N.VideoDetails:return $(`videoDetailsHeading`);case N.RelatedVideos:return $(`upNextHeading`);case N.CurriculumLinks:return $(`curriculumLinksHeading`);case N.ClippedFrom:return $(`clippedFromHeading`);case N.ReferenceVideo:return $(`referenceVideoHeading`);case N.Transcript:return $(`transcriptHeading`);default:return``}}};export{at as _,Mt as a,B as b,Q as c,Dt as d,xt as f,ct as g,ut as h,Ft as i,At as l,_t as m,Bt as n,Nt as o,yt as p,zt as r,jt as s,Vt as t,kt as u,Ze as v,Ke as y};
2
- //# sourceMappingURL=kjKFfyCC2.chunk.js.map
1
+ import{o as e}from"./DAXXjFlN.chunk.js";import{o as t,r as n,t as r}from"./CvE4SVf2.chunk.js";import{y as i}from"./BftnFbcr.chunk.js";import"./DFZS3Ffo.chunk.js";import{t as a}from"./CQyJ7YGa.chunk.js";import{t as o}from"./e57H3T-k.chunk.js";import{t as s}from"./C2w0pmFW.chunk.js";import{t as c}from"./wrLrTezN.chunk.js";import{t as l}from"./BXTI9cmX.chunk.js";import{t as u}from"./CjA4Q5pm.chunk.js";import{N as d,U as ee,a as te,l as f,y as p,z as m}from"./BHvdJc9z.chunk.js";import{t as h}from"./BxbRBSiP.chunk.js";import{i as g,t as _}from"./DxTLIRiK2.chunk.js";import{t as ne}from"./CVHQXNzi2.chunk.js";import{t as v}from"./quMwO3lt2.chunk.js";import{t as y}from"./CVtvY0gg.chunk.js";import{t as b}from"./hQ9iY4r0.chunk.js";import{n as re}from"./BRcHS92O2.chunk.js";import{t as ie}from"./Bs2PKr1I2.chunk.js";import{t as ae}from"./DpCWroEe2.chunk.js";import{n as x}from"./C0exjRXJ.chunk.js";import{t as oe}from"./Bbp2U9GK.chunk.js";import{t as S}from"./B8AENY2U.chunk.js";import{t as se}from"./B1rSJN7u.chunk.js";import{t as C}from"./B5TCUfQl.chunk.js";import{i as ce}from"./Dy8J1lcl.chunk.js";import{t as le}from"./rVRhgtHY2.chunk.js";import{n as w,t as ue}from"./CpFtf-tI2.chunk.js";import{n as de}from"./BJUbYu222.chunk.js";import{t as fe}from"./DW24qN_e2.chunk.js";import{t as T}from"./5ONJSThP.chunk.js";import{t as pe}from"./jAbfamoi.chunk.js";import{t as me}from"./BE8FmNfm2.chunk.js";import{n as E,t as D}from"./BzuCKTvW.chunk.js";import{t as O}from"./DsBWAM3I.chunk.js";import{t as he}from"./BqbRZ5hB.chunk.js";import{t as ge}from"./9kh0Xx2n2.chunk.js";import{c as _e,i as ve,n as ye,o as be,s as xe,t as Se}from"./BcrXhug9.chunk.js";import{t as Ce}from"./tnBD84bg2.chunk.js";import{t as we}from"./DELN_PAD2.chunk.js";import{t as k}from"./u5dYfNkx2.chunk.js";import{n as Te,t as Ee}from"./KmDyjq5W.chunk.js";import{t as De}from"./BTFvVc1Z.chunk.js";import{t as A}from"./OtQaFdir.chunk.js";import{t as j}from"./Dopg0SXC.chunk.js";import{n as Oe}from"./BtgXP7tw.chunk.js";import{t as ke}from"./jlUP1BHc.chunk.js";import{n as Ae,t as je}from"./DLpjTXb22.chunk.js";import{n as M,t as Me}from"./BfGWS3N1.chunk.js";import{t as N}from"./BAkU_szZ.chunk.js";import{t as Ne}from"./BJk-_glp2.chunk.js";import{r as Pe}from"./C1SMWeap2.chunk.js";import{t as Fe}from"./7I0L5W4N2.chunk.js";import{n as P,r as F,t as Ie}from"./sTL-xC6d2.chunk.js";import{t as I}from"./CLjADRa42.chunk.js";import{t as Le}from"./CafgzmZf.chunk.js";import{t as Re}from"./qmv5yEXF.chunk.js";var L=e(s()),R=c(),z=pe();function B(){let e=T();return e.lg||e.xl||e.xxl}var V={copyrightDisclaimer:`_copyrightDisclaimer_yyjul_1`,overlayContainer:`_overlayContainer_yyjul_4`},H=`shared.copyrightDisclaimer`,ze=150;function Be(e){let[n,r]=de({});function i(){return document.documentElement.clientHeight-n.current?.getBoundingClientRect().bottom<ze}return(0,R.jsxs)(`div`,{ref:n,className:e.className,children:[(0,R.jsx)(`p`,{className:`${V.copyrightDisclaimer} ${e.phraseClassName??`mb-1`}`,children:(0,R.jsx)(w,{namespace:H,phrase:`copyrightDisclaimer`})}),(0,R.jsx)(t,{target:n.current,show:r,placement:e.overflowPlacement&&i()?e.overflowPlacement:e.placement,children:(0,R.jsxs)(`div`,{className:`${V.overlayContainer} mw-100 bg-white border rounded-3 p-2`,children:[(0,R.jsx)(`p`,{children:(0,R.jsx)(w,{namespace:H,phrase:`warning`})}),(0,R.jsx)(`p`,{className:`fw-semibold mb-0`,children:(0,R.jsx)(w,{namespace:H,phrase:`sharing`})})]})})]})}function Ve(e){return(0,R.jsx)(Fe,{lines:12,children:()=>(0,R.jsx)(`p`,{className:`mb-0`,dangerouslySetInnerHTML:{__html:o.sanitize(Ce.linkifyText(e.video.description,{nl2br:!0}))}})})}var He={descriptionBorder:`_descriptionBorder_any0w_2`},U=`shared.videoDetailsV2`,W=a.encloseNamespace(U);function G(e){let{label:t,items:n,className:r}=e;return n&&n.data&&n.data.length?typeof e.getItemAppLink==`function`?(0,R.jsxs)(`div`,{className:r,children:[(0,R.jsxs)(`span`,{children:[t,`: `]}),n.data.map((t,r)=>(0,R.jsxs)(L.Fragment,{children:[(0,R.jsx)(S,{appLink:e.getItemAppLink(t),children:t.name?.trim()},t.id),r<n.data.length-1&&(0,R.jsx)(`span`,{children:`, `})]},t.id))]}):(0,R.jsxs)(`div`,{className:r,children:[t,`: `,n.data.map(e=>e.name?.trim()).join(`, `)]}):(0,R.jsx)(R.Fragment,{})}function Ue(e){let t=e.categories?.data;return t?.length?t.filter(e=>e.libraries?.data?.[0]?.type===fe.CustomLibrary).map(e=>({library:e.libraries?.data?.[0],category:e})):[]}function We(e){return[{name:e.pair.library.name,appLink:e.getLibraryAppLink?.(e.pair.library)},{name:`...`},{name:e.pair.category.name,appLink:e.getFolderAppLink?.(e.pair.library,e.pair.category)}]}function Ge(e){let{video:t}=e;if(!v.isVideo(t)&&!v.isClip(t))return(0,R.jsx)(R.Fragment,{});let n=v.getParentVideo(t),r=Ue(t);function i(t){if(!(!t.partnerProfiles||!t.partnerProfiles?.data?.length)){if(t.partnerProfiles?.count>1&&typeof e.getPartnerDashboardHubAppLink==`function`)return e.getPartnerDashboardHubAppLink(t);if(typeof e.getPartnerProfileAppLink==`function`)return e.getPartnerProfileAppLink(t.partnerProfiles?.data?.[0])}}return(0,R.jsxs)(`div`,{className:t.description?`col-md-5 ps-md-3 pt-3 pt-md-0`:`col-12`,children:[(0,R.jsx)(`h2`,{className:`h6 mb-1`,children:(0,R.jsx)(w,{phrase:`details`})}),!!n.productionYear&&(0,R.jsx)(`div`,{className:`mb-1`,children:(0,R.jsx)(w,{phrase:`productionYear`,options:{year:n.productionYear}})}),(0,R.jsx)(G,{label:W(`productionCompanies`,{smartCount:n.productionCompanies?.data?.length}),items:n.productionCompanies,getItemAppLink:i,className:`mb-1`}),(0,R.jsx)(G,{label:W(`distributors`,{smartCount:n.distributors?.data?.length}),items:n.distributors,getItemAppLink:i,className:`mb-1`}),(0,R.jsx)(G,{label:W(`producers`,{smartCount:n.producers?.data?.length}),items:n.producers,className:`mb-1`}),(0,R.jsx)(G,{label:W(`directors`,{smartCount:n.directors?.data?.length}),items:n.directors,className:`mb-1`}),!!n.dateBroadcast&&(0,R.jsx)(`div`,{className:`mb-1`,children:(0,R.jsx)(w,{phrase:`dateBroadcast`,options:{date:u.format(n.dateBroadcast,`DD/MM/YYYY`)}})}),!!n.channel&&(0,R.jsx)(`div`,{className:`mb-1`,children:(0,R.jsx)(w,{phrase:`channel`,options:{channel:n.channel.name}})}),v.canViewUploadDate(e.video)&&(0,R.jsx)(`div`,{className:`mb-1`,children:(0,R.jsx)(w,{phrase:`dateUploaded`,options:{date:u.format(t.dateCreated,`DD/MM/YYYY`)}})}),!!(r.length&&e.getLibraryAppLink&&e.getFolderAppLink)&&(0,R.jsxs)(`div`,{className:`mb-1`,children:[(0,R.jsxs)(`div`,{children:[W(`libraries`,{smartCount:r.length}),`:`]}),r.map((t,n)=>(0,R.jsx)(`div`,{children:(0,R.jsx)(De,{breadcrumbs:We({pair:t,getLibraryAppLink:e.getLibraryAppLink,getFolderAppLink:e.getFolderAppLink}),linkClassName:`text-info`})},n))]})]})}function Ke(e){let{video:t,maxHeight:n=368}=e,r=v.getParentVideo(t),i=!!e.video.description,a=Ie(e.video)||!!r.productionYear||!!r.dateBroadcast||!!r.channel||v.canViewUploadDate(e.video);if(!i&&!a)return(0,R.jsx)(R.Fragment,{});function o(){return e.hideTags||v.isInteractive(e.video)||!e.video.tags?.data?.length?null:e.video.tags?.data?.filter(e=>e.tagType===h.Normal)}let s=o();return(0,R.jsx)(ue.Provider,{value:U,children:(0,R.jsxs)(`section`,{id:N.VideoDetails,ref:t=>{t&&e.headingRef?.current&&e.headingRef.current.set(N.VideoDetails,t)},className:`play-page-section`,children:[e.showHeading&&(0,R.jsx)(k,{name:W(`heading`)}),(0,R.jsx)(`div`,{className:`rounded border p-3 position-relative`,children:(0,R.jsxs)(z.Scrollbars,{autoHeight:!0,autoHeightMax:n,hideTracksWhenNotNeeded:!0,children:[(0,R.jsxs)(`div`,{className:`row g-0`,children:[i&&(0,R.jsxs)(`div`,{className:a?`${He.descriptionBorder} pe-3 col-md-7`:`col-12`,children:[(0,R.jsxs)(`div`,{className:`d-flex align-items-center`,children:[(0,R.jsx)(`h2`,{className:`h6 mb-1`,children:(0,R.jsx)(w,{phrase:`description`})}),(0,R.jsx)(Ne,{text:t.description,title:t.name,className:`ps-2`,onLaunch:e.onLaunchImmersiveReader,onExit:e.onExitImmersiveReader,analyticsOptions:{location:p.PlayPage,entity:f.Video,actionType:m.Click,descriptor:te.LaunchImmersiveReader},analyticsData:{id:t.id,type:`description`}})]}),(0,R.jsx)(Ve,{video:e.video})]}),a&&(0,R.jsx)(Ge,{...e})]}),!!s?.length&&(0,R.jsxs)(`div`,{className:`mt-3`,children:[(0,R.jsx)(`h2`,{className:`h6 mb-1`,children:(0,R.jsx)(w,{phrase:`normalTags`})}),(0,R.jsx)(P,{tags:s,...F.getTagActionProps(e.getTagAppLink,null,e.suppressInteractivity),className:`mt-1`})]}),v.isBroadcast(e.video)&&(0,R.jsx)(Be,{placement:`bottom-start`,className:`d-flex justify-content-start mt-2`,phraseClassName:`mb-0`,overflowPlacement:`top-start`})]})})]})})}function K(e,t,n,r){let i=()=>{I.unsubscribe(e,t)};return(0,L.useEffect)(()=>{if(r)return n?I.subscribeOnce(e,t):I.subscribe(e,t),()=>{i()}},[]),i}var q={learningIntention:`_learningIntention_lm8nf_1`,highlightPoi:`_highlightPoi_lm8nf_7`,icon:`_icon_lm8nf_10`},qe=/\[\]\(cv:\/\/poi\?id=\d+\)\n*/g;function Je(e){return e.replace(qe,``)}function Ye(e){return ce(Je(e.content),{async:!1})}function Xe(e,t){let[n,r]=(0,L.useState)(``);return(0,L.useEffect)(()=>{if(!t||!e.glance?.content)return;let n=Ye(e.glance);r(n)},[e.glance?.content,t]),n}function Ze(e){return e.glance?.content&&e.glance?.format===`text/markdown`}function Qe(e,t){let n=(0,L.useRef)(null);K(`player:poi:mouseover`,r,null,t),K(`player:poi:mouseleave`,i,null,t),(0,L.useEffect)(()=>{if(!(!n.current||!t))return n.current?.addEventListener(`mouseover`,a),n.current?.addEventListener(`mouseleave`,o),()=>{n.current?.removeEventListener(`mouseover`,a),n.current?.removeEventListener(`mouseleave`,o)}},[n.current]);function r(t){!t?.id||e?.id?.toString()!==t?.id?.toString()||n.current?.classList.add(q.highlightPoi)}function i(){n.current?.classList.remove(q.highlightPoi)}function a(){e&&I.trigger(`glance:poi:mouseover`,e)}function o(){I.trigger(`glance:poi:mouseleave`)}return n}var J={poiEntry:`_poiEntry_1bne8_1`,poiText:`_poiText_1bne8_5`,public:`_public_1bne8_5`,poiTimeStamp:`_poiTimeStamp_1bne8_14`,wideBadge:`_wideBadge_1bne8_18`};function $e(e){let t=O.ToDisplayDuration(e.poi.startTime*1e3),n=Qe(e.poi,!e.suppressInteractivity);return e.suppressInteractivity?(0,R.jsxs)(`div`,{className:`d-flex ${J.poiEntry} mb-2`,children:[(0,R.jsx)(`span`,{className:`d-flex rounded-pill justify-content-center align-items-center text-info bg-light-blue ${J.poiTimeStamp} ${e.wideBadge?J.wideBadge:``}`,children:t}),(0,R.jsx)(`div`,{className:`${J.public} ms-2`,children:e.poi.description})]}):(0,R.jsxs)(oe,{className:`d-flex ${J.poiEntry} mb-2 cursor-pointer`,onClick:()=>e.onClickPoiItem(e.poi.startTime),ref:n,children:[(0,R.jsx)(`div`,{className:`d-flex rounded-pill justify-content-center align-items-center text-info bg-light-blue ${J.poiTimeStamp} ${e.wideBadge?J.wideBadge:``}`,children:t}),(0,R.jsx)(`div`,{className:`ms-2 ${J.poiText}`,children:e.poi.description})]},e.poi.startTime)}var et=`shared.pointsOfInterestList`;function tt(e){let t=e.pointsOfInterest.sort((e,t)=>e.startTime-t.startTime),n=t.some(e=>e.startTime>=3600);return(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`h2`,{className:`h6 my-2`,children:(0,R.jsx)(w,{namespace:et,phrase:`heading`})}),(0,R.jsx)(`div`,{children:t.map(t=>(0,R.jsx)($e,{poi:t,suppressInteractivity:e.suppressInteractivity,onClickPoiItem:e.onClickPoiItem,wideBadge:n},t.startTime))})]})}var nt=`shared.videoAtAGlanceV2`,rt=365;function it(e){return e.hideScrollbar?(0,R.jsx)(R.Fragment,{children:e.children}):(0,R.jsx)(`div`,{className:`rounded border mb-4 bg-white`,children:(0,R.jsx)(z.Scrollbars,{autoHeight:!0,autoHeightMax:rt,children:(0,R.jsx)(`div`,{className:`px-3 pt-3 pb-2`,children:e.children})})})}function at(e){let t=Xe(e.video,e.canViewGlance),[n,r]=L.useState(``);function i(){let t={id:e.video.glance.id,name:e.video.glance.name,videoId:e.video.id,videoName:e.video.name,learningIntention:n},r={actionType:m.Copy,entity:f.Glance,location:p.PlayPage};b.logUserAction(t,r)}function a(){return v.isInteractive(e.video)||!e.video.tags?.data?.length?null:e.video.tags?.data?.filter(e=>e.tagType===h.Pedagogy||e.tagType===h.Skill)}let s=a(),c=L.useRef(null);if(L.useEffect(()=>{c.current?.innerText&&r(c.current.innerText)},[c.current?.innerText]),!e.canViewGlance)return(0,R.jsx)(R.Fragment,{});function l(t){e.setStartTime(t)}return(0,R.jsx)(`section`,{className:`play-page-section`,children:(0,R.jsxs)(it,{hideScrollbar:e.hideScrollbar,children:[(0,R.jsx)(`h2`,{className:`h6 mb-2`,children:(0,R.jsx)(w,{namespace:nt,phrase:`learningIntention`})}),(0,R.jsxs)(`div`,{className:`mb-3 ${q.learningIntention}`,children:[(0,R.jsx)(Me,{copyableContent:n,tooltipClassName:q.icon,onClick:i,visible:!0}),(0,R.jsx)(`div`,{dangerouslySetInnerHTML:{__html:o.sanitize(t)},className:`d-inline`,ref:c})]}),!!s?.length&&(0,R.jsx)(`div`,{children:(0,R.jsx)(P,{tags:s,...F.getTagActionProps(e.getTagAppLink,e.onClickTag,e.suppressInteractivity),className:`mt-2`})}),!!e.pointsOfInterest?.length&&(0,R.jsx)(`div`,{className:`mt-3`,children:(0,R.jsx)(tt,{pointsOfInterest:e.pointsOfInterest,suppressInteractivity:e.suppressInteractivity,onClickPoiItem:l})})]})})}var ot=L.memo(function(e){let{data:t,thumbnailSize:n,preloadImage:r,getAppLink:i}=e,a=j(t.subjectPresentationAudiences?.data,e.audiences);return(0,R.jsxs)(`div`,{className:`flex-shrink-0 px-1 col-6 col-sm-4`,children:[(0,R.jsx)(Se,{type:`static`,textPosition:ye.Independent,video:t,appLink:i(t),imageOptions:{size:n},preload:r,analyticsData:e.analyticsData,analyticsOptions:e.analyticsOptions,audience:a,hideDuration:!1,commonVideoProps:e.commonVideoProps}),(0,R.jsx)(`div`,{className:`mt-2`,children:(0,R.jsx)(ve,{...e,video:t,appLink:e.getAppLink(t)})})]})}),st=`shared.playPageClips`;function ct(e){if(!e.canViewClips||!e.clips?.length)return(0,R.jsx)(R.Fragment,{});let t=v.isVideo(e.video);function n(){return v.isVideo(e.video)?{action:y.Videos.VIDEO_CLIPS,application:l.VIDEOS,args:[e.presentationSlug,e.video.id,o.slugify(e.video.name)]}:{action:y.Clips.CLIP_CLIPS,application:l.CLIPS,args:[e.video.id,o.slugify(e.video.name)]}}let r=a.getPhrase(st,t?`clips`:`otherClips`,{count:e.clips.length});return(0,R.jsx)(`section`,{className:`play-page-section`,id:N.Clips,ref:t=>{t&&e.headingRef?.current&&e.headingRef.current.set(N.Clips,t)},children:(0,R.jsx)(_,{name:r,contents:g.ClipsV2,collection:e.clips,prefetched:!0,getChildAppLink:e=>({application:l.CLIPS,action:y.Clips.PLAY_CLIP,args:[e.id,o.slugify(e.name)]}),appLink:n(),childComponent:ot,extraChildComponentProps:{audiences:e.audiences,showOwner:!0,commonVideoProps:e.commonVideoProps},analyticsData:e.analyticsData})})}var lt=`shared.playPageInteractives`;function ut(e){if(!e.canViewInteractives||!e.interactives?.length)return(0,R.jsx)(R.Fragment,{});function t(){return v.isVideo(e.video)?{action:y.Videos.VIDEO_INTERACTIVES,application:l.VIDEOS,args:[e.presentationSlug,e.video.id,o.slugify(e.video.name)]}:{action:y.Clips.CLIP_INTERACTIVES,application:l.CLIPS,args:[e.video.id,o.slugify(e.video.name)]}}let n=a.getPhrase(lt,`interactives`,{count:e.interactives.length});return(0,R.jsx)(`section`,{className:`play-page-section`,id:N.Interactives,ref:t=>{t&&e.headingRef?.current&&e.headingRef.current.set(N.Interactives,t)},children:(0,R.jsx)(_,{name:n,contents:g.InteractivesV2,collection:e.interactives,prefetched:!0,getChildAppLink:e=>({application:l.INTERACTIVES,action:y.Interactives.VIEW_INTERACTIVE,args:[e.id,o.slugify(e.name)]}),appLink:t(),childComponent:Pe,extraChildComponentProps:{questionsAppLink:{application:l.INTERACTIVES,action:y.Interactives.PREVIEW_QUESTIONS},showOwner:!0,commonVideoProps:e.commonVideoProps},analyticsData:e.analyticsData})})}function dt(e){return(0,R.jsx)(`svg`,{...e,children:(0,R.jsx)(`path`,{d:`M5.455 12c0 .401.325.727.727.727h9.88l-3.849 3.85a.728.728 0 0 0 1.029 1.028l5.09-5.091a.73.73 0 0 0 .213-.514v7.272a.727.727 0 0 0 1.455 0V4.727a.727.727 0 0 0-1.455 0V12a.73.73 0 0 0-.213-.515l-5.09-5.09a.727.727 0 1 0-1.029 1.028l3.85 3.85H6.181a.727.727 0 0 0-.727.727`,fill:`currentColor`})})}function ft(e){return(0,R.jsx)(`svg`,{...e,children:(0,R.jsx)(`path`,{d:`M20 12a.727.727 0 0 0-.727-.728h-9.88l3.848-3.849a.727.727 0 1 0-1.028-1.029l-5.091 5.091a.73.73 0 0 0-.213.514V4.727a.727.727 0 0 0-1.454 0v14.545a.727.727 0 0 0 1.454 0V12c0 .186.071.373.213.515l5.091 5.09a.727.727 0 0 0 1.029-1.028l-3.85-3.85h9.88A.727.727 0 0 0 20 12`,fill:`currentColor`})})}var Y={showInSide:`_showInSide_1n1am_1`,container:`_container_1n1am_7`,aside:`_aside_1n1am_11`,collapse:`_collapse_1n1am_14`,iconContainer:`_iconContainer_1n1am_22`,arrowIcon:`_arrowIcon_1n1am_22`,listIcon:`_listIcon_1n1am_25`},pt=`shared.playPage`;function mt(e){function t(){let t={actionType:e.isExpanded?m.Hide:m.Open,entity:f.TableOfContents,location:p.PlayPage};b.logUserAction(e.analyticsData,t)}function n(){let n=!e.isExpanded;e.setIsExpanded(n),n?(e.toggleTheatreMode?.(!1),e.toggleTheatreMode||e.setIsExpanded(!1)):(e.toggleTheatreMode?.(!0),e.toggleTheatreMode||e.setIsExpanded(!0)),t()}return(0,R.jsx)(`div`,{className:`d-flex justify-content-end`,children:(0,R.jsx)(`div`,{className:Y.container,children:(0,R.jsxs)(`div`,{className:`${Y.iconContainer}`,children:[(0,R.jsx)(C,{className:`btn btn-outline-dark ${Y.listIcon}`,svg:we,onClick:n}),(0,R.jsx)(C,{className:`btn btn-outline-dark ${Y.arrowIcon}`,svg:e.isExpanded?dt:ft,onClick:n})]})})})}function ht(e){function t(){let t={actionType:m.Hide,entity:f.TableOfContents,location:p.PlayPage};b.logUserAction(e.analyticsData,t)}function n(e){let t=ae.getCurrentRoute().appLink,n=t.params?{...t.params}:{};return n.tocId=e.id,{...t,params:n}}function r(){e.showInSide||e.setIsExpanded(!1)}return(0,R.jsxs)(R.Fragment,{children:[e.showInSide&&!e.hasTranscription&&(0,R.jsx)(C,{className:`btn position-absolute ${Y.collapse}`,svg:dt,onClick:()=>{e.setIsExpanded(!1),e.toggleTheatreMode?.(!0),t()}}),(0,R.jsx)(`h2`,{className:`h5`,children:(0,R.jsx)(w,{namespace:pt,phrase:`tocHeading`})}),(0,R.jsx)(Le,{items:e.items,activeId:e.activeId,getAppLink:n,setControlledId:e.setControlledId,analyticsData:e.analyticsData,onItemClick:()=>r()})]})}function gt(e){return(0,R.jsxs)(`div`,{className:e.showInSide?`col ms-2 ps-4 ${Y.showInSide}`:`d-inline-flex gap-1`,children:[(0,R.jsx)(`aside`,{className:`${Y.aside} position-relative ${e.showInSide?`pe-1 pt-1 `:`px-3 pt-3 pb-2 border border-dark rounded-1 bg-white`}`,children:(0,R.jsxs)(`div`,{className:`${Y.container}`,children:[e.shouldShowToc&&(0,R.jsx)(ht,{...e}),!e.showTocOnly&&e.additionalComponents.map((e,t)=>(0,R.jsx)(L.Fragment,{children:e},`additional-component-${t}`))]})}),!e.showInSide&&e.shouldShowToc&&(0,R.jsx)(mt,{...e})]})}function _t(e){return(0,R.jsxs)(R.Fragment,{children:[e.isExpanded&&e.showInSide&&(0,R.jsx)(gt,{...e}),A.renderInPortalIfExists(!e.isExpanded&&e.shouldShowToc&&(0,R.jsx)(mt,{...e}),document.getElementById(se)),A.renderInPortalIfExists(!e.showInSide&&e.isExpanded&&(0,R.jsx)(gt,{...e}),document.getElementById(se))]})}var X={series:`_series_rbe3v_1`,badgeListContainer:`_badgeListContainer_rbe3v_5`,clipOriginInfo:`_clipOriginInfo_rbe3v_11`},vt=`shared.playPage`;function yt(e){let t=j(e.media.subjectPresentationAudiences?.data,e.audiences),n=L.useRef(null),r=L.useRef(null),i=v.isVideo(e.media)&&!!v.getRating(e.media)?.value||v.isVideo(e.media)&&!!e.media.productionYear||!!e.media.subjectPresentationAudiences?.data?.length,a=Ae({location:je.PlayPage,shareId:e.shareId,presentationSlug:e.presentationSlug}),o=!!e.originalVideoAppLink&&v.isClip(e.media)&&v.canViewOriginalVideo(e.media),s=v.getAssociatedCompanies(e.media);return(0,R.jsx)(`section`,{className:`mb-3 position-relative`,ref:n,children:(0,R.jsxs)(`div`,{className:`d-inline-block w-100`,ref:r,children:[e.featureAccess.canNavigate&&(0,R.jsx)(`div`,{className:`ms-2 float-end`,children:(0,R.jsx)(he,{actions:a.getVideoActions(e.media),actionsDropdownClassName:`btn btn-outline-dark`,fetchMore:()=>a.fetchMoreActions(e.media)})}),!!v.isVideo(e.media)&&(0,R.jsx)(me,{type:e.subTextType,video:e.media,appLink:e.subtextAppLink,className:`${X.series} text-truncate mw-100`,analyticsOptions:{location:p.PlayPage}}),(0,R.jsxs)(`h1`,{className:`h4 mb-2 mw-100`,children:[(0,R.jsx)(`span`,{className:`align-self-center`,children:e.media.name}),e.showTitlePadlock&&(0,R.jsx)(be,{tooltipPlacement:`right`,className:`d-inline-block ps-1`,video:e.media,yearGroups:e.yearGroups})]}),v.isClip(e.media)&&o&&(0,R.jsxs)(`p`,{className:`clamp-1 ${X.clipOriginInfo}`,children:[(0,R.jsx)(w,{namespace:vt,phrase:`viewOriginal`}),`\xA0`,(0,R.jsx)(S,{className:`info-link`,appLink:e.originalVideoAppLink,children:e.media._parentVideo?.name}),`\xA0`,(0,R.jsx)(w,{namespace:vt,phrase:`timestamp`,options:{timeRange:`${O.ToDisplayTimeRange(e.media.startTime*1e3,e.media.endTime*1e3)}`}})]}),i&&(0,R.jsxs)(ge,{className:X.badgeListContainer,children:[v.isVideo(e.media)&&s.length>0&&(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(Re,{type:ne.Video,companies:s,video:e.media,companyLogoFallbackUrl:e.companyLogoFallbackUrl,imageCdnUrl:e.imageCdnUrl}),(0,R.jsx)(`span`,{className:`ms-n1 me-1`,children:`•`})]}),(0,R.jsx)(xe,{audience:t,className:`bg-white text-dark`,border:`dark`}),v.isVideo(e.media)&&(0,R.jsx)(D,{type:E.Rating,data:v.getRating(e.media)}),v.isVideo(e.media)&&(0,R.jsx)(D,{type:E.ProductionYear,data:e.media.productionYear})]})]})})}var Z={mask:`_mask_vq9tb_1`,centeredIcon:`_centeredIcon_vq9tb_10`,bgImage:`_bgImage_vq9tb_21`,centeredOverlay:`_centeredOverlay_vq9tb_24`},bt=a.encloseNamespace(`shared.playerPlaceholder`);function xt(e){switch(e.type){case`pip`:return(0,R.jsx)(St,{...e});case`public`:return(0,R.jsx)(Ct,{...e});default:return(0,R.jsx)(R.Fragment,{})}}var St=e=>(0,R.jsxs)(`div`,{className:`position-relative responsive-img ${Z.bgImage}`,style:{backgroundImage:`url('${v.getThumbnail(e.video)?.url??``}')`},children:[(0,R.jsx)(`p`,{className:`m-0 text-white h3 ${Z.centeredOverlay}`,children:bt(`playingPiP`)}),(0,R.jsx)(`div`,{className:Z.mask})]}),Ct=e=>{let t=ie.createUrl(v.getThumbnail(e.video)?.url??``,{size:re.Large});return(0,R.jsx)(`div`,{className:`position-relative responsive-img ${Z.bgImage}`,style:{backgroundImage:`url('${t}')`},children:(0,R.jsxs)(S,{appLink:e.appLink,analyticsOptions:{actionType:m.Click,location:p.PlayPage,entity:f.AppLink,workflowPhase:ee.Start,descriptor:d.SignUp},analyticsData:{},children:[(0,R.jsx)(r,{svg:_e,className:Z.centeredIcon}),(0,R.jsx)(`div`,{className:Z.mask})]})})},wt={fullSizeContainer:`_fullSizeContainer_devjw_1`,slidingListScroll:`_slidingListScroll_devjw_5`},Tt=`shared.relatedTopics`,Et=`flex-shrink-0 me-2`;function Dt(e){return(0,R.jsxs)(`section`,{id:N.RelatedTopic,className:`play-page-section`,children:[(0,R.jsx)(k,{name:a.getPhrase(Tt,`heading`)}),(0,R.jsx)(`div`,{className:`mx-n4 px-4 ${wt.slidingListScroll}`,children:(0,R.jsx)(Ee,{position:0,positionType:Te.Pixels,children:e.topics.map(t=>(0,R.jsx)(`li`,{className:Et,children:(0,R.jsx)(Oe,{coverUrl:t.cover?.url,data:t,getChildAppLink:e.getAppLink})},`${t.id}`))})})]})}var Ot=`shared.relatedTopics`;function kt(e){return e.topics?(0,R.jsxs)(`div`,{className:x(e.className),children:[(0,R.jsx)(`h2`,{className:`h5`,children:(0,R.jsx)(w,{namespace:Ot,phrase:`heading`})}),(0,R.jsx)(`div`,{className:x(wt.fullSizeContainer,`overflow-y-auto`),children:e.topics?.map(t=>(0,R.jsx)(n,{title:t?.name,spanHack:!0,children:(0,R.jsx)(`div`,{className:`position-relative mb-3 w-100`,children:(0,R.jsx)(ke,{classification:t,getAppLink:e.getAppLink,onToggleFollowClassification:()=>{},canFollowTopics:!1,hideCounts:!1})})},`related_topic_${t.id}`))})]}):(0,R.jsx)(R.Fragment,{})}function At({resourcePopupId:e,resources:t,getResourceAppLink:n}){L.useEffect(()=>{if(!e)return;let r=t?.find(t=>t.id.toString()===e.toString());r&&i.trigger(n(r))},[e])}var Q={main:`_main_1ujkn_1`,expandedToc:`_expandedToc_1ujkn_1`,theatreMode:`_theatreMode_1ujkn_4`,theatreModeContent:`_theatreModeContent_1ujkn_7`,theatreModePlayPageContainer:`_theatreModePlayPageContainer_1ujkn_17`,theatreModeLeftContent:`_theatreModeLeftContent_1ujkn_21`};function jt(e){return e.shouldShowSideTableOfContents?e.hasTheatreMode&&e.theatreMode?Q.theatreMode:e.tableOfContentsExpanded?`${Q.expandedToc} col-9`:`pe-4`:``}function Mt(e){return e.hasTheatreMode&&(e.theatreMode||!e.shouldShowSideTableOfContents)?`container ${Q.theatreModeContent}`:``}function Nt(e,t){return e&&t.defaultDisplayMode===`theatre`&&t.mode==="default"}var Pt=`play-page-toc-expanded`;function Ft(e,t,n){let r=B(),i=M.get(Pt)!==`false`,a=t?n||r:i,[o,s]=L.useState(e||``),[c,l]=L.useState(``),[u,d]=L.useState(a);L.useEffect(()=>{if(!r){d(!1);return}if(t){d(!0);return}d(a)},[r,n]);function ee(){t&&r||(d(!u),M.set(Pt,(!u).toString()))}return{controlledId:o,setControlledId:s,tableOfContentsExpanded:u,tableOfContentsActiveId:c,setTableOfContentsActiveId:l,onToggleTableOfContents:ee}}var It={map(e){let t=new Proxy(new Map,{get(n,r){if(r===`set`)return(r,i)=>(n.get(r)!==i&&(n.set(r,i),e()),t);let i=Reflect.get(n,r);return typeof i==`function`?i.bind(n):i}});return t}},Lt=[N.Video,N.CurriculumLinks,N.Resources,N.Interactives,N.Clips,N.VideoDetails,N.ClippedFrom,N.Transcript,N.ReferenceVideo,N.RelatedVideos],Rt=[N.Video,N.VideoDetails,N.CurriculumLinks,N.Resources,N.Interactives,N.Clips,N.ClippedFrom,N.Transcript,N.ReferenceVideo,N.RelatedVideos];function zt(e){let t=le(),n=L.useRef(It.map(t));return{headingRef:n,headingElements:(e?Lt:Rt).map(e=>n.current.get(e)).filter(Boolean)}}function Bt(e,t,n){let r=T();if(t!=="default")return!1;let i=n===`theatre`;return!(r.sm||r.md)&&e&&i}var $=a.encloseNamespace(`shared.play`),Vt={getSectionHeading(e,t){switch(e){case N.Resources:return $(`resourcesHeading`,{count:t.resources?.length});case N.Clips:return t.isPlayClipPage?$(`otherClipsHeading`,{count:t.clips?.length-1}):$(`clipsHeading`,{count:t.clips?.length});case N.Interactives:return $(`interactivesHeading`,{count:t.interactives?.length});case N.Video:return $(`videoHeading`);case N.VideoDetails:return $(`videoDetailsHeading`);case N.RelatedVideos:return $(`upNextHeading`);case N.CurriculumLinks:return $(`curriculumLinksHeading`);case N.ClippedFrom:return $(`clippedFromHeading`);case N.ReferenceVideo:return $(`referenceVideoHeading`);case N.Transcript:return $(`transcriptHeading`);default:return``}}};export{at as _,Mt as a,B as b,Q as c,Dt as d,xt as f,ct as g,ut as h,Ft as i,At as l,_t as m,Bt as n,Nt as o,yt as p,zt as r,jt as s,Vt as t,kt as u,Ze as v,Ke as y};
2
+ //# sourceMappingURL=BS-WKys42.chunk.js.map