@clickview/lite 0.75.0-rc.2 → 0.75.0-rc.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundles.json +1 -1
- package/dist/css/{119-lite-a1f592f602.chunk.css → 1243-lite-13eda8f6a0.chunk.css} +2 -4
- package/dist/css/{7230-lite-36ff6e6d53.chunk.css → 1867-lite-8baa8af02b.chunk.css} +3 -5
- package/dist/css/{5241-lite-baab687563.chunk.css → 4203-lite-9ffab89741.chunk.css} +3 -5
- package/dist/css/{8364-lite-99938dea56.chunk.css → 5193-lite-d434056013.chunk.css} +1 -0
- package/dist/css/{7339-lite-05c396fed3.chunk.css → 6756-lite-839687d3d7.chunk.css} +1 -0
- package/dist/css/{9527-lite-1d2221b6a8.chunk.css → 7103-lite-fef3024f61.chunk.css} +2 -4
- package/dist/css/{8856-lite-827b34aed7.chunk.css → 8856-lite-c114ab5c89.chunk.css} +1 -1
- package/dist/languages/en.json +1 -1
- package/dist/scripts/104-7abe2b09dd-lite.chunk.js +2 -0
- package/dist/scripts/104-7abe2b09dd-lite.chunk.js.map +1 -0
- package/dist/scripts/1074-2ab8b03e30-lite.chunk.js +2 -0
- package/dist/scripts/1074-2ab8b03e30-lite.chunk.js.map +1 -0
- package/dist/scripts/1087-861be5211f-lite.chunk.js +2 -0
- package/dist/scripts/1087-861be5211f-lite.chunk.js.map +1 -0
- package/dist/scripts/1199-6522b1d291-lite.chunk.js +2 -0
- package/dist/scripts/1199-6522b1d291-lite.chunk.js.map +1 -0
- package/dist/scripts/121-1b744469ee-lite.chunk.js +2 -0
- package/dist/scripts/121-1b744469ee-lite.chunk.js.map +1 -0
- package/dist/scripts/{1221-502395e693-lite.chunk.js → 1221-894d8474d5-lite.chunk.js} +3 -3
- package/dist/scripts/1221-894d8474d5-lite.chunk.js.map +1 -0
- package/dist/scripts/1243-ede924125c-lite.chunk.js +2 -0
- package/dist/scripts/1243-ede924125c-lite.chunk.js.map +1 -0
- package/dist/scripts/147-44ee7e9a78-lite.chunk.js +2 -0
- package/dist/scripts/147-44ee7e9a78-lite.chunk.js.map +1 -0
- package/dist/scripts/{1610-7f58bb25a9-lite.chunk.js → 1610-bf848cce4d-lite.chunk.js} +2 -2
- package/dist/scripts/{1610-7f58bb25a9-lite.chunk.js.map → 1610-bf848cce4d-lite.chunk.js.map} +1 -1
- package/dist/scripts/{7230-71f8d6d1bd-lite.chunk.js → 1867-3b447a1b85-lite.chunk.js} +2 -2
- package/dist/scripts/{7230-71f8d6d1bd-lite.chunk.js.map → 1867-3b447a1b85-lite.chunk.js.map} +1 -1
- package/dist/scripts/2258-ed7383502f-lite.chunk.js +3 -0
- package/dist/scripts/2258-ed7383502f-lite.chunk.js.map +1 -0
- package/dist/scripts/3268-2736356687-lite.chunk.js +2 -0
- package/dist/scripts/{3268-faca1bf46e-lite.chunk.js.map → 3268-2736356687-lite.chunk.js.map} +1 -1
- package/dist/scripts/3836-425334ab13-lite.chunk.js +2 -0
- package/dist/scripts/{3836-f2a0c9f713-lite.chunk.js.map → 3836-425334ab13-lite.chunk.js.map} +1 -1
- package/dist/scripts/3837-e4c5bb738b-lite.chunk.js +2 -0
- package/dist/scripts/3837-e4c5bb738b-lite.chunk.js.map +1 -0
- package/dist/scripts/4185-1f65c7adc9-lite.chunk.js +2 -0
- package/dist/scripts/4185-1f65c7adc9-lite.chunk.js.map +1 -0
- package/dist/scripts/4203-ee50e89841-lite.chunk.js +3 -0
- package/dist/scripts/4203-ee50e89841-lite.chunk.js.map +1 -0
- package/dist/scripts/4598-bcd3f6f8a7-lite.chunk.js +2 -0
- package/dist/scripts/{4598-2b1daca7ae-lite.chunk.js.map → 4598-bcd3f6f8a7-lite.chunk.js.map} +1 -1
- package/dist/scripts/4948-f21dad2ca1-lite.chunk.js +2 -0
- package/dist/scripts/4948-f21dad2ca1-lite.chunk.js.map +1 -0
- package/dist/scripts/{5153-079b4125ae-lite.chunk.js → 5153-acc6c13153-lite.chunk.js} +3 -3
- package/dist/scripts/5153-acc6c13153-lite.chunk.js.map +1 -0
- package/dist/scripts/6137-bc8b193237-lite.chunk.js +2 -0
- package/dist/scripts/6137-bc8b193237-lite.chunk.js.map +1 -0
- package/dist/scripts/6756-e90680dfcd-lite.chunk.js +3 -0
- package/dist/scripts/6756-e90680dfcd-lite.chunk.js.map +1 -0
- package/dist/scripts/6790-c8a9efba50-lite.chunk.js +2 -0
- package/dist/scripts/6790-c8a9efba50-lite.chunk.js.map +1 -0
- package/dist/scripts/705-10a85bae7a-lite.chunk.js +2 -0
- package/dist/scripts/705-10a85bae7a-lite.chunk.js.map +1 -0
- package/dist/scripts/7103-14bd3771d2-lite.chunk.js +2 -0
- package/dist/scripts/7103-14bd3771d2-lite.chunk.js.map +1 -0
- package/dist/scripts/7205-12a6b2ac55-lite.chunk.js +2 -0
- package/dist/scripts/7205-12a6b2ac55-lite.chunk.js.map +1 -0
- package/dist/scripts/7438-88d11bb89a-lite.chunk.js +2 -0
- package/dist/scripts/7438-88d11bb89a-lite.chunk.js.map +1 -0
- package/dist/scripts/7480-e0749592fc-lite.chunk.js +2 -0
- package/dist/scripts/7480-e0749592fc-lite.chunk.js.map +1 -0
- package/dist/scripts/8010-e9163f5bee-lite.chunk.js +2 -0
- package/dist/scripts/8010-e9163f5bee-lite.chunk.js.map +1 -0
- package/dist/scripts/8410-1f1fd5ccf0-lite.chunk.js +3 -0
- package/dist/scripts/8410-1f1fd5ccf0-lite.chunk.js.map +1 -0
- package/dist/scripts/8705-ecd20ef6cb-lite.chunk.js +2 -0
- package/dist/scripts/8705-ecd20ef6cb-lite.chunk.js.map +1 -0
- package/dist/scripts/8856-02dd2e486c-lite.chunk.js +2 -0
- package/dist/scripts/8856-02dd2e486c-lite.chunk.js.map +1 -0
- package/dist/scripts/9003-1db925f5ec-lite.chunk.js +2 -0
- package/dist/scripts/9003-1db925f5ec-lite.chunk.js.map +1 -0
- package/dist/scripts/9042-1a42fcbba2-lite.chunk.js +2 -0
- package/dist/scripts/9042-1a42fcbba2-lite.chunk.js.map +1 -0
- package/dist/scripts/9103-4eec16d73b-lite.chunk.js +2 -0
- package/dist/scripts/9103-4eec16d73b-lite.chunk.js.map +1 -0
- package/dist/scripts/9134-19912ca3ee-lite.chunk.js +2 -0
- package/dist/scripts/9134-19912ca3ee-lite.chunk.js.map +1 -0
- package/dist/scripts/9266-f0ad8d5cb3-lite.chunk.js +2 -0
- package/dist/scripts/9266-f0ad8d5cb3-lite.chunk.js.map +1 -0
- package/dist/scripts/9740-9d50d31b72-lite.chunk.js +2 -0
- package/dist/scripts/9740-9d50d31b72-lite.chunk.js.map +1 -0
- package/dist/scripts/{bundle-95a6fc2722.min.js → bundle-828ca65de8.min.js} +3 -3
- package/dist/scripts/{bundle-95a6fc2722.min.js.map → bundle-828ca65de8.min.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/104-b62a8447f0-lite.chunk.js +0 -2
- package/dist/scripts/104-b62a8447f0-lite.chunk.js.map +0 -1
- package/dist/scripts/107-989ac2dc47-lite.chunk.js +0 -2
- package/dist/scripts/107-989ac2dc47-lite.chunk.js.map +0 -1
- package/dist/scripts/119-e3a8bd94dd-lite.chunk.js +0 -2
- package/dist/scripts/119-e3a8bd94dd-lite.chunk.js.map +0 -1
- package/dist/scripts/1199-a2ac2338d0-lite.chunk.js +0 -2
- package/dist/scripts/1199-a2ac2338d0-lite.chunk.js.map +0 -1
- package/dist/scripts/121-bf7a153eb8-lite.chunk.js +0 -2
- package/dist/scripts/121-bf7a153eb8-lite.chunk.js.map +0 -1
- package/dist/scripts/1221-502395e693-lite.chunk.js.map +0 -1
- package/dist/scripts/2258-4d0639c9fe-lite.chunk.js +0 -3
- package/dist/scripts/2258-4d0639c9fe-lite.chunk.js.map +0 -1
- package/dist/scripts/3268-faca1bf46e-lite.chunk.js +0 -2
- package/dist/scripts/3836-f2a0c9f713-lite.chunk.js +0 -2
- package/dist/scripts/3837-fe321e8deb-lite.chunk.js +0 -2
- package/dist/scripts/3837-fe321e8deb-lite.chunk.js.map +0 -1
- package/dist/scripts/4025-306e0fbdd5-lite.chunk.js +0 -2
- package/dist/scripts/4025-306e0fbdd5-lite.chunk.js.map +0 -1
- package/dist/scripts/4164-5d3af57b67-lite.chunk.js +0 -2
- package/dist/scripts/4164-5d3af57b67-lite.chunk.js.map +0 -1
- package/dist/scripts/4185-e8e40dab72-lite.chunk.js +0 -2
- package/dist/scripts/4185-e8e40dab72-lite.chunk.js.map +0 -1
- package/dist/scripts/4562-545f04c53f-lite.chunk.js +0 -2
- package/dist/scripts/4562-545f04c53f-lite.chunk.js.map +0 -1
- package/dist/scripts/4598-2b1daca7ae-lite.chunk.js +0 -2
- package/dist/scripts/4948-66ba60c8e3-lite.chunk.js +0 -2
- package/dist/scripts/4948-66ba60c8e3-lite.chunk.js.map +0 -1
- package/dist/scripts/5153-079b4125ae-lite.chunk.js.map +0 -1
- package/dist/scripts/5241-163f5ac64c-lite.chunk.js +0 -3
- package/dist/scripts/5241-163f5ac64c-lite.chunk.js.map +0 -1
- package/dist/scripts/5349-bc0fcb4083-lite.chunk.js +0 -2
- package/dist/scripts/5349-bc0fcb4083-lite.chunk.js.map +0 -1
- package/dist/scripts/6135-a878a9cff0-lite.chunk.js +0 -3
- package/dist/scripts/6135-a878a9cff0-lite.chunk.js.map +0 -1
- package/dist/scripts/6509-23fdb20a4b-lite.chunk.js +0 -2
- package/dist/scripts/6509-23fdb20a4b-lite.chunk.js.map +0 -1
- package/dist/scripts/6790-5086b72662-lite.chunk.js +0 -2
- package/dist/scripts/6790-5086b72662-lite.chunk.js.map +0 -1
- package/dist/scripts/7205-2428f775a5-lite.chunk.js +0 -2
- package/dist/scripts/7205-2428f775a5-lite.chunk.js.map +0 -1
- package/dist/scripts/7339-5793c921bb-lite.chunk.js +0 -3
- package/dist/scripts/7339-5793c921bb-lite.chunk.js.map +0 -1
- package/dist/scripts/7438-a5f96e58fc-lite.chunk.js +0 -2
- package/dist/scripts/7438-a5f96e58fc-lite.chunk.js.map +0 -1
- package/dist/scripts/7926-6b040931aa-lite.chunk.js +0 -2
- package/dist/scripts/7926-6b040931aa-lite.chunk.js.map +0 -1
- package/dist/scripts/8536-f75009dd87-lite.chunk.js +0 -2
- package/dist/scripts/8536-f75009dd87-lite.chunk.js.map +0 -1
- package/dist/scripts/8856-df102acdff-lite.chunk.js +0 -2
- package/dist/scripts/8856-df102acdff-lite.chunk.js.map +0 -1
- package/dist/scripts/9134-42dc2390ce-lite.chunk.js +0 -2
- package/dist/scripts/9134-42dc2390ce-lite.chunk.js.map +0 -1
- package/dist/scripts/9266-c5d6705147-lite.chunk.js +0 -2
- package/dist/scripts/9266-c5d6705147-lite.chunk.js.map +0 -1
- package/dist/scripts/9284-402a14d41c-lite.chunk.js +0 -2
- package/dist/scripts/9284-402a14d41c-lite.chunk.js.map +0 -1
- package/dist/scripts/9470-11c8c2ca71-lite.chunk.js +0 -2
- package/dist/scripts/9470-11c8c2ca71-lite.chunk.js.map +0 -1
- package/dist/scripts/9527-111c8586a7-lite.chunk.js +0 -2
- package/dist/scripts/9527-111c8586a7-lite.chunk.js.map +0 -1
- package/dist/scripts/9591-230bcf0935-lite.chunk.js +0 -2
- package/dist/scripts/9591-230bcf0935-lite.chunk.js.map +0 -1
- /package/dist/css/{5349-lite-829df3b4e7.chunk.css → 6137-lite-829df3b4e7.chunk.css} +0 -0
- /package/dist/css/{9470-lite-edb2d29928.chunk.css → 8010-lite-edb2d29928.chunk.css} +0 -0
- /package/dist/css/{6135-lite-41bdd1c5a3.chunk.css → 8410-lite-41bdd1c5a3.chunk.css} +0 -0
- /package/dist/css/{121-lite-1337d9acf0.chunk.css → 9042-lite-1337d9acf0.chunk.css} +0 -0
- /package/dist/scripts/{1221-502395e693-lite.chunk.js.LICENSE.txt → 1221-894d8474d5-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{2258-4d0639c9fe-lite.chunk.js.LICENSE.txt → 2258-ed7383502f-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{5153-079b4125ae-lite.chunk.js.LICENSE.txt → 4203-ee50e89841-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{5241-163f5ac64c-lite.chunk.js.LICENSE.txt → 5153-acc6c13153-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{6135-a878a9cff0-lite.chunk.js.LICENSE.txt → 6756-e90680dfcd-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{7339-5793c921bb-lite.chunk.js.LICENSE.txt → 8410-1f1fd5ccf0-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{bundle-95a6fc2722.min.js.LICENSE.txt → bundle-828ca65de8.min.js.LICENSE.txt} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/5241-163f5ac64c-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/analytics/components/engagement-heat-map/engagement-heat-map.scss","file:///app/packages/libs/shared/src/apps/analytics/components/engagement-heat-map/EngagementHeatMap.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insight-card/insight-card.scss","file:///app/packages/libs/shared/src/apps/analytics/components/insight-card/InsightCard.tsx","file:///app/packages/libs/shared/src/apps/analytics/constants/ChartStyles.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/EngagementUtils.ts","file:///app/packages/libs/shared/src/constants/DragOverlayStyles.ts","file:///app/packages/libs/shared/src/components/table/TableUtils.ts","file:///app/packages/libs/shared/src/components/table/table.scss","file:///app/packages/libs/shared/src/components/table/Table.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/engagement-table/engagement-table.scss","file:///app/packages/libs/shared/src/apps/analytics/components/engagement-table/EngagementTableUtils.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/engagement-table/EngagementTable.tsx","file:///app/packages/libs/shared/src/components/percentage-indicator/PartialPercentageIndicator.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/amount-watched/InsightAmountWatched.tsx","file:///app/packages/libs/shared/src/apps/analytics/utils/ChartColourUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/components/insights/total-views/InsightTotalViews.tsx","file:///app/packages/libs/shared/src/apps/analytics/utils/SharedUserActivityPieChartUtils.ts","file:///app/packages/projects/lite/src/apps/my-shares/components/insights-heatmap/partial-loading/partial-insights-heatmap.scss","file:///app/packages/projects/lite/src/apps/my-shares/components/insights-heatmap/partial-loading/PartialInsightsHeatmap.tsx","file:///app/packages/projects/player/src/plugins/engagement-overlay-plugin/components/engagement-overlay-menu-item/engagement-overlay-menu-item.ts","file:///app/packages/projects/player/src/plugins/engagement-overlay-plugin/components/timepoint-interactions/timepoint-interactions.tsx","file:///app/packages/projects/player/src/plugins/engagement-overlay-plugin/components/engagement-overlay/engagement-overlay-chart-options.tsx","file:///app/packages/projects/player/src/plugins/engagement-overlay-plugin/components/engagement-overlay/engagement-overlay.ts","file:///app/packages/projects/player/src/plugins/engagement-overlay-plugin/engagement-overlay-plugin.ts","file:///app/packages/projects/player/src/plugins/interactive-plugin/interactive-seek-bar-plugin.ts","file:///app/packages/projects/player/src/players/reports/reports-player.ts","file:///app/packages/projects/player/src/react/ReportsPlayer.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/video-engagement-overlay/video-engagement-overlay.scss","file:///app/packages/projects/lite/src/apps/my-shares/components/video-engagement-overlay/VideoEngagementOverlay.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/insights-heatmap/insights-heatmap.scss","file:///app/packages/projects/lite/src/apps/my-shares/components/insights-heatmap/InsightsHeatmap.tsx"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"heatMap\":\"epapa\",\"legend\":\"uhH4p\"};","import React from 'react';\nimport chroma from 'chroma-js';\n\nimport { getFullHeatMap } from 'libs/shared/apps/analytics/utils/EngagementUtils';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Engagement } from 'libs/shared/interfaces';\n\nimport styles from './engagement-heat-map.scss';\n\nconst namespace = 'shared.engagementHeatMap';\n\nconst ZERO_COLOUR = '#f1f1f1';\nconst MIN_COLOUR = '#daf07d';\nconst MAX_COLOUR = '#08bd1a';\n\nconst COLOUR_SCALE = chroma.scale([ MIN_COLOUR, MAX_COLOUR ]);\n\nconst LEGEND_VALUES = [ 0, 0.01, 0.25, 0.5, 0.75, 1 ];\n\nfunction getBackgroundColor(value: number, max: number): string {\n if (!value)\n return ZERO_COLOUR;\n\n return COLOUR_SCALE(value / max).hex();\n}\n\nfunction getGradient(data: number[], max: number): string {\n const gradient: string[] = [];\n\n for (let i = 0; i < data.length; i++) {\n const previousValue = i > 0 && data[i - 1];\n const currentValue = data[i];\n const nextValue = i < data.length - 1 && data[i + 1];\n\n /**\n * We want to capture colour changes but if a value has the same value\n * of both of its neighbours, we can skip it.\n */\n if (currentValue === previousValue && currentValue === nextValue)\n continue;\n\n gradient.push(`${getBackgroundColor(currentValue, max)} ${100 / data.length * i}%`);\n }\n\n return `linear-gradient(to right, ${gradient.join(',')})`;\n}\n\nexport function EngagementHeatMapLegend(): JSX.Element {\n const max = Math.max(...LEGEND_VALUES);\n const legendSquareWidthPercentage = 100 / LEGEND_VALUES.length;\n\n return (\n <div className='d-flex justify-content-between w-100'>\n <Text namespace={namespace} phrase='less' />\n <div className={`d-flex mx-1 flex-grow-1 ${styles.legend}`}>\n {LEGEND_VALUES.map((val, idx) => (\n <div\n key={idx}\n style={{\n width: `${legendSquareWidthPercentage}%`,\n backgroundColor: getBackgroundColor(val, max)\n }}\n />\n ))}\n </div>\n <Text namespace={namespace} phrase='more' />\n </div>\n );\n}\n\ninterface EngagementHeatMapProps {\n engagement: Engagement;\n max?: number;\n className?: string;\n}\n\nexport function EngagementHeatMap(props: EngagementHeatMapProps): JSX.Element {\n const heatMap = getFullHeatMap(props.engagement);\n const max = props.max ?? Math.max(...heatMap);\n\n return (\n <div\n className={`border rounded ${styles.heatMap} ${props.className ?? ''}`}\n style={{\n background: getGradient(heatMap, max)\n }}\n />\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"icon\":\"sAmpy\",\"count\":\"faDs4\"};","import React from 'react';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\n\nimport styles from './insight-card.scss';\n\ninterface InsightCardProps extends React.PropsWithChildren {\n svgName: string;\n svgClassName: string;\n title: string;\n subtitle?: string;\n count?: number;\n}\n\nexport function InsightCard(props: InsightCardProps) {\n return (\n <section className='d-flex flex-column border rounded p-3 h-100'>\n <div className={`d-flex ${props.subtitle ? 'align-items-top' : 'align-items-center'} mb-2`}>\n <div className={`${styles.icon} ${props.svgClassName} rounded-circle d-flex justify-content-center align-items-center`}>\n <SvgContainer svgName={props.svgName} size={SvgContainerSize.Small} />\n </div>\n <div className='d-flex flex-column ms-2'>\n <h2 className='h6 mb-0'>{props.title}</h2>\n </div>\n {typeof props.count === 'number' && (\n <div className={`${styles.count} d-flex justify-content-center align-items-center bg-light rounded-circle ms-auto`}>\n {props.count}\n </div>\n )}\n </div>\n {props.children}\n </section>\n );\n}","export const CHART_FONT_STYLES = {\n fontSize: '12px',\n fontFamily: `\"Inter\",-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,\"Noto Sans\",\"Liberation Sans\",sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\"`,\n fontWeight: '400',\n color: '#313543'\n};","import { Engagement } from 'libs/shared/interfaces';\n\n/**\n * The heat map in the API response won't contain trailing zeros so we need to add those\n * in manually.\n */\nexport function getFullHeatMap(engagement: Engagement): number[] {\n const videoDuration = engagement.videoDuration || 0;\n \n return (new Array(Math.ceil(videoDuration))).fill(null).map((t, idx) => engagement?.heatMap[idx] || 0);\n}\n\nexport function getEngagementRate(engagement: Engagement[]): number {\n return engagement?.reduce((prev, next) => prev + next.engagementRate / engagement.length, 0);\n}","export const DragOverlayStyles = { opacity: '0.8', cursor: 'grabbing' };","import React from 'react';\nimport { PluginHook, useBlockLayout, useFilters, useFlexLayout, useGlobalFilter, useRowSelect, useSortBy } from 'react-table';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\n\ninterface PluginOptions {\n allowFiltering?: boolean;\n allowGlobalFiltering?: boolean;\n layout?: 'flex' | 'block';\n}\n\nexport function getPlugins<T extends HashObject>(props: PluginOptions): PluginHook<T>[] {\n let plugins: PluginHook<T>[] = [\n useSortBy,\n useRowSelect,\n props.layout === 'flex' ? useFlexLayout : useBlockLayout\n ];\n\n if (props.allowFiltering)\n plugins = [\n ...plugins,\n useFilters\n ];\n\n if (props.allowGlobalFiltering)\n plugins = [\n ...plugins,\n useGlobalFilter\n ];\n\n return plugins;\n}\n\nexport function getSelectedRowIds(ids: string[]): Record<string, boolean> {\n const idHash: Record<string, boolean> = {};\n\n ids.forEach(id => idHash[id] = true);\n\n return idHash;\n}\n\ninterface TableScrollState {\n canScrollLeft: boolean;\n canScrollRight: boolean;\n}\n\nfunction calculateScrollState(ref: React.MutableRefObject<HTMLDivElement>): TableScrollState {\n const canScrollLeft = ref.current?.scrollLeft > 0;\n const canScrollRight = (ref.current?.scrollLeft + 1) < ref.current?.scrollWidth - ref.current?.clientWidth;\n\n return { canScrollLeft, canScrollRight };\n}\n\ninterface UseTableScroll {\n ref: (el: HTMLDivElement) => void;\n scrollState: TableScrollState;\n scroll: (scrollBy: number) => void;\n}\n\nexport function useTableScroll(): UseTableScroll {\n const elRef = React.useRef<HTMLDivElement>(null);\n const [ scrollState, setScrollState ] = React.useState<TableScrollState>(calculateScrollState(elRef));\n\n function onScroll(): void {\n setScrollState(calculateScrollState(elRef));\n }\n\n function scroll(scrollBy: number): void {\n elRef.current?.scrollBy({ left: scrollBy, top: 0, behavior: 'smooth' });\n }\n\n const throttledOnScroll = FunctionHelper.throttle(onScroll, 200);\n\n const ref = React.useCallback((el: HTMLDivElement) => {\n if (elRef.current) {\n elRef.current?.removeEventListener('scroll', throttledOnScroll);\n }\n\n if (el) {\n setScrollState(calculateScrollState(elRef));\n el.addEventListener('scroll', throttledOnScroll);\n }\n\n elRef.current = el;\n }, []);\n\n React.useEffect(() => {\n if (elRef?.current) {\n setScrollState(calculateScrollState(elRef));\n }\n }, [elRef]);\n\n return { ref, scrollState, scroll };\n}","// extracted by mini-css-extract-plugin\nexport default {\"sortIndicator\":\"gFhu0\",\"scrollContainer\":\"sWUp9\",\"scrollbarTrack\":\"Vn2qM\"};","import React from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\nimport {\n Cell,\n Column as BaseColumn,\n HeaderGroup,\n HeaderProps as BaseHeaderProps,\n IdType,\n Row,\n SortingRule,\n TableOptions,\n TableRowProps,\n useTable } from 'react-table';\nimport { DragEndEvent } from '@dnd-kit/core';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SortableContainerWrapper } from 'libs/shared/components/sortable/SortableContainerWrapper';\nimport { PropsWithSortableItemProps, SortableItemWrapper } from 'libs/shared/components/sortable/SortableItemWrapper';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { WidgetButton, WidgetButtonDirection } from 'libs/shared/components/widgets/widget-button/WidgetButton';\nimport { DragOverlayStyles } from 'libs/shared/constants/DragOverlayStyles';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { getPlugins, getSelectedRowIds, useTableScroll } from './TableUtils';\n\nimport styles from './table.scss';\n\nexport interface TableTheme {\n table?: string;\n header?: string;\n headerRow?: string;\n headerCell?: string;\n body?: string;\n row?: string | ((row: Row<any>) => string);\n selectedRow?: string;\n cell?: string | ((row?: Row<any>, cell?: Cell<any, any>) => string);\n sortIndicator?: string;\n}\n\nexport type HeaderProps<T extends HashObject> = BaseHeaderProps<T> & {\n renderSortIndicator: () => void;\n}\n\nexport type Column<T extends HashObject> = BaseColumn<T> & {\n hideSortIndicator?: boolean;\n}\n\ninterface SortIndicatorProps<T extends HashObject> {\n column: HeaderGroup<T>;\n theme?: TableTheme;\n}\n\nfunction SortIndicator<T extends HashObject>(props: SortIndicatorProps<T>): JSX.Element {\n if (!props.column.canSort)\n return <></>;\n\n return (\n <span\n className={\n `${styles.sortIndicator}\n ${!props.column.isSorted ? 'text-secondary' : ''}\n ${props.theme?.sortIndicator ?? ''}`\n }\n >\n <SvgContainer\n svgName={(props.column.isSortedDesc || !props.column.isSorted)\n ? cvSvgLibrary.ArrowRight\n : cvSvgLibrary.ArrowLeft\n }\n size={SvgContainerSize.Small}\n />\n </span>\n );\n}\n\ninterface BaseTableProps<T extends HashObject> {\n /**\n * Must be memoized.\n */\n data: T[];\n\n /**\n * Must be memoized.\n * \n * For documentation on Column Options, see https://react-table.tanstack.com/docs/api/useTable#column-options\n */\n columns: Column<T>[];\n\n theme?: TableTheme;\n\n onSelectRow?: (row: Row<T>) => void;\n\n onSelectCell?: (cell: Cell<T>) => void;\n\n onRowMouseOver?: (row: Row<T>) => void;\n\n onRowMouseLeave?: (row: Row<T>) => void;\n\n allowSelectMultipleRows?: boolean;\n\n initialSelectedRowIds?: string[];\n\n getRowId?: (row: T) => string;\n\n getRowAppLink?: (row: Row<T>) => Core.AppLink;\n\n enableSort?: boolean;\n\n manualSort?: boolean;\n\n onSort?: (sortingRule: SortingRule<T>[]) => void;\n \n // Opt-in to utilise react-table's useFilter hook.\n allowFiltering?: boolean;\n\n // Opt-in to utilise react-table's useGlobalFilter hook.\n allowGlobalFiltering?: boolean;\n\n // Use either a flex layout or a block layout. Default is flex.\n layout?: 'flex' | 'block';\n\n // Used by useGlobalFilter hook, needs to be enabled by prop above.\n globalFilter?: string;\n\n // Set initial state of hidden columns in react-table.\n hiddenColumns?: IdType<T>[];\n\n // Determine whether hidden columns should be preserved on a table update event.\n autoResetHiddenColumns?: boolean;\n\n // Determine whether sort order state should be preserved on a table update event.\n autoResetSortBy?: boolean;\n\n // Determine whether rows are sortable by drag and drop\n enableSortableRows?: boolean;\n\n onSortingRowsEnd?: (event: DragEndEvent) => void;\n\n // Set initial state of sorting in react-table\n initialSortBy?: SortingRule<T>[];\n}\n \ntype SortableRowProps = PropsWithSortableItemProps<TableRowProps>;\n\nfunction BaseTable<T extends HashObject>(props: BaseTableProps<T>): JSX.Element {\n const tableOptions: TableOptions<T> = {\n columns: props.columns,\n data: props.data,\n disableSortBy: !props.enableSort,\n manualSortBy: props.manualSort,\n autoResetHiddenColumns: props.autoResetHiddenColumns,\n autoResetSortBy: props.autoResetSortBy,\n initialState: {\n sortBy: props.initialSortBy || []\n }\n };\n\n if (props.initialSelectedRowIds)\n tableOptions.initialState = { selectedRowIds: getSelectedRowIds(props.initialSelectedRowIds) };\n\n if (props.getRowId)\n tableOptions.getRowId = props.getRowId;\n\n const {\n getTableProps,\n getTableBodyProps,\n headerGroups,\n rows,\n prepareRow,\n toggleAllRowsSelected,\n setGlobalFilter,\n setHiddenColumns,\n state: { sortBy }\n } = useTable<T>(tableOptions, ...getPlugins<T>({ ...props }));\n\n function getTableRowsClass(row: Row<T>) {\n let className = FunctionHelper.isFunction(props.theme?.row)\n ? props.theme.row(row)\n : props.theme?.row ?? '';\n\n if (row.isSelected && props.theme?.selectedRow)\n className += ` ${props.theme?.selectedRow}`;\n\n if (props.onSelectRow)\n className += ' cursor-pointer';\n\n if (props.enableSortableRows)\n className += ' cursor-grab';\n\n return className;\n }\n\n function renderTableRows(): JSX.Element[] {\n return rows.map(row => {\n prepareRow(row);\n \n const className = getTableRowsClass(row);\n const rowAppLink = !!props.getRowAppLink && props.getRowAppLink(row);\n\n function onClickRow(): void {\n if (!props.onSelectRow)\n return;\n\n if (!props.allowSelectMultipleRows)\n toggleAllRowsSelected(false);\n \n props.onSelectRow(row);\n row.toggleRowSelected(true);\n }\n\n function getSortableProps(props: TableRowProps | PropsWithSortableItemProps<TableRowProps>, ref?: any) {\n if ('dragAttributes' in props && 'dragListeners' in props) {\n return {\n ...props.dragAttributes,\n ...props.dragListeners,\n 'aria-roledescription': 'Sortable row',\n ref\n };\n }\n\n return {};\n }\n\n function renderRow(props: TableRowProps | PropsWithSortableItemProps<TableRowProps>, ref?: any): JSX.Element {\n const sortableProps = getSortableProps(props, ref);\n\n if (rowAppLink) {\n return (\n <div\n role='row'\n key={row.id}\n >\n <AppLink\n {...props}\n {...sortableProps}\n className={className}\n appLink={rowAppLink}\n >\n {renderCells(row)}\n </AppLink>\n </div>\n );\n }\n\n return (\n <div\n {...props}\n {...sortableProps}\n key={row.id}\n role='row'\n className={className}\n onClick={onClickRow}\n >\n {renderCells(row)}\n </div>\n );\n }\n\n const rowProps = row.getRowProps();\n\n if (props.enableSortableRows) {\n return (\n <SortableItemWrapper\n id={row.original.id}\n key={row.id}\n childProps={rowProps}\n childComponent={React.forwardRef(\n (props: SortableRowProps, ref: React.LegacyRef<HTMLDivElement>) => (renderRow(props, ref))\n )}\n />\n );\n }\n\n return renderRow(rowProps);\n });\n }\n\n function getDragOverlayClassName(theme: TableTheme): string {\n let className = 'g-0 ';\n\n if (theme)\n className += theme.row;\n\n return className;\n }\n\n function getDragOverlay(id: string) {\n const rowIndex = rows.findIndex(item => item.original.id === id);\n const row = rows[rowIndex];\n \n return (\n <div\n {...props}\n className={getDragOverlayClassName(props.theme)}\n style={DragOverlayStyles}\n >\n {renderCells(row)}\n </div>\n );\n }\n\n function getCellClassName(row: Row<T>, cell: Cell<T>): string {\n let cellClassName = '';\n\n if (typeof props.theme?.cell === 'function')\n cellClassName = props.theme.cell(row, cell);\n\n if (typeof props.theme?.cell === 'string')\n cellClassName = props.theme.cell;\n\n if (props.onSelectCell)\n cellClassName += ' cursor-pointer';\n\n return cellClassName;\n }\n\n function renderCells(row: Row<T>): JSX.Element[] {\n return row.cells.map(cell => {\n const cellClassName = getCellClassName(row, cell);\n\n function onClickCell(): void {\n props.onSelectCell && props.onSelectCell(cell);\n }\n\n return (\n <div key={cell.column.id} {...cell.getCellProps()} className={cellClassName} onClick={onClickCell} >\n {cell.render('Cell')}\n </div>\n );\n });\n }\n\n React.useEffect(() => {\n if (!props.onSort)\n return;\n\n props.onSort(sortBy);\n }, [sortBy]);\n\n React.useEffect(() => {\n if (!props.globalFilter)\n return;\n\n setGlobalFilter(props.globalFilter);\n }, [props.globalFilter]);\n\n React.useEffect(() => {\n if (!props.hiddenColumns)\n return;\n\n setHiddenColumns(props.hiddenColumns);\n }, [props.hiddenColumns && props.hiddenColumns.length]);\n\n return (\n <div {...getTableProps()} className={props.theme?.table ?? ''}>\n <div className={props.theme?.header ?? ''}>\n {headerGroups.map(headerGroup => (\n <div {...headerGroup.getHeaderGroupProps()} className={props.theme?.headerRow ?? ''}>\n {headerGroup.headers.map(column => (\n <div {...column.getHeaderProps(column.getSortByToggleProps())} className={props.theme?.headerCell ?? ''}>\n {column.render('Header', { renderSortIndicator: () => <SortIndicator column={column} theme={props.theme} /> })}\n {!(column as Column<T>).hideSortIndicator &&\n <SortIndicator column={column} theme={props.theme} />\n }\n </div>\n ))}\n </div>\n ))}\n </div>\n <div {...getTableBodyProps()} className={props.theme?.body ?? ''}>\n { props.enableSortableRows ? (\n <SortableContainerWrapper\n ids={rows.map(row => row.original.id)}\n getDragOverlay={getDragOverlay}\n onSortEnd={props.onSortingRowsEnd}\n >\n {renderTableRows()}\n </SortableContainerWrapper>\n ) : (\n renderTableRows()\n )}\n </div>\n </div>\n );\n}\n\ninterface TableProps<T extends HashObject> extends BaseTableProps<T> {\n enableSlider?: boolean;\n scrollIncrement?: number;\n scrollContainerClassName?: string;\n scrollable?: boolean;\n initialSortBy?: SortingRule<T>[];\n}\n\nTable.defaultProps = {\n scrollIncrement: 250,\n scrollable: false,\n layout: 'flex'\n};\n\nexport function Table<T extends HashObject>(props: TableProps<T>): JSX.Element {\n const { enableSlider, scrollIncrement, scrollable, ...tableProps } = props;\n\n const { ref, scrollState, scroll } = useTableScroll();\n\n if (scrollable) {\n return (\n <Scrollbars\n renderTrackHorizontal={() => <div className={styles.scrollbarTrack} />}\n autoHeightMax={10000}\n autoHeight\n >\n <BaseTable {...tableProps} />\n </Scrollbars>\n );\n }\n\n if (!enableSlider)\n return <BaseTable {...tableProps} />;\n\n function onClickScroll(direction: 'left' | 'right'): void {\n scroll(scrollIncrement * (direction === 'right' ? 1 : -1));\n }\n\n return (\n <div className='mx-n4 overflow-x-hidden overflow-y-hidden'>\n <div className='px-4'>\n <div className='position-relative'>\n <WidgetButton\n direction={WidgetButtonDirection.Left}\n onClick={() => onClickScroll('left')}\n hide={!scrollState.canScrollLeft}\n />\n <div className={`${styles.scrollContainer} ${props.scrollContainerClassName}`} ref={ref}>\n <BaseTable {...tableProps } />\n </div>\n <WidgetButton\n direction={WidgetButtonDirection.Right}\n onClick={() => onClickScroll('right')}\n hide={!scrollState.canScrollRight}\n />\n </div>\n </div>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"heatMap\":\"rwDjh\",\"avatarContainer\":\"kW4ZM\"};","import React from 'react';\nimport { Column, ColumnInstance, Row } from 'react-table';\n\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 { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { PercentageIndicator, PercentageIndicatorLayout } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Engagement } 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.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\nfunction getUsersName(user: AnonUser, anonymiseUsers: boolean) {\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\ninterface EngagementColumnProps {\n engagement: Engagement[],\n imageCdnUrl: string;\n anonymiseUsers: boolean;\n}\n\nexport function useGetColumns(props: EngagementColumnProps): Column<EngagementTableData>[] {\n return React.useMemo(() => {\n const maxHeatMapValue = getMaxHeatMapValue(props.engagement);\n\n return [\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='name' />,\n width: 22,\n accessor: 'user',\n sortType: (rowA: Row<EngagementTableData>, rowB: Row<EngagementTableData>) => {\n const nameA = anonymiseUserName(rowA.values.user, props.anonymiseUsers);\n const nameB = anonymiseUserName(rowB.values.user, props.anonymiseUsers);\n\n return nameA > nameB ? 1 : -1;\n },\n Cell: ({ value }) => {\n const { name, surname } = getUsersName(value, props.anonymiseUsers);\n return (\n <CellWrapper className='d-flex align-items-center h-100'>\n <span className={styles.avatarContainer}>\n <Avatar\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(name, surname)}\n imageUrl={!props.anonymiseUsers && value?.avatar?.url}\n showAnonymousUser={!props.anonymiseUsers && (!value || !!value.sessionId)}\n />\n </span>\n <span className={'ms-2 clamp-1'}>\n {name} {surname}\n </span>\n </CellWrapper>\n );\n }\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='views' />,\n accessor: 'viewCount',\n width: 15,\n sortType: 'basic', // Default is 'alphanumeric' which would treat the numbers as strings\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 width: 20,\n sortType: 'basic', // Default is 'alphanumeric' which would treat the numbers as strings\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 width: 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]);\n}\n\nexport function useGetTableData(\n engagement: Engagement[],\n users: AnonUser[],\n classroomStudents?: AnonUser[]\n): EngagementTableData[] {\n return React.useMemo(() => {\n if (!engagement?.length)\n return [];\n\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, user } as EngagementTableData));\n data.push(...students);\n }\n\n return data;\n }, [users?.length]);\n}","import React from 'react';\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}\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 });\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}","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}","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 { Engagement } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\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 svgName={cvSvgLibrary.Timer}\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}","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}","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 { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightTotalViews';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\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: 0,\n size: '80%'\n }\n }\n};\n\ninterface InsightTotalViewsProps {\n events: VideoViewEventResponse;\n emptyStateImage: string;\n}\n\nexport function InsightTotalViews(props: InsightTotalViewsProps) {\n const chartData = sortByYearGroup(groupEvents(props.events, 'yearGroupCount', []));\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 svgName={cvSvgLibrary.VisibleOn}\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}","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}","// extracted by mini-css-extract-plugin\nexport default {\"partialInsights\":\"nKLWa\",\"videoContainer\":\"WF2iA\"};","import React from 'react';\n\nimport styles from './partial-insights-heatmap.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}","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}","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}","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);","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 const cogButton = this.player.getChild('collapserator')?.getChild('cogButton') as CogButton;\n cogButton.addItem({\n index: 0,\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}","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}","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';\n\nexport interface ReportsPlayerOptions extends BasePlayerOptions {\n heatMap: number[];\n onTimepointHover?: (time: number | null) => void;\n}\n\nexport class ReportsPlayer extends BasePlayer {\n 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}","// extracted by mini-css-extract-plugin\nexport default {\"playerContainer\":\"fGWsk\",\"playerPlaceholder\":\"v1MjE\",\"heatMap\":\"lp1Yn\",\"heatMapTimepointIndicator\":\"yOOK6\",\"heatMapTimepointIndicatorVisible\":\"rTXmB\",\"partialLoadingContainer\":\"gW1HU\"};","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.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}","// extracted by mini-css-extract-plugin\nexport default {\"videoContainer\":\"cpl68\"};","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.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}\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 />\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 />\n </div>\n }\n </div>\n </>\n );\n}"],"names":["namespace","ZERO_COLOUR","COLOUR_SCALE","LEGEND_VALUES","getBackgroundColor","value","max","hex","getGradient","data","gradient","i","length","previousValue","currentValue","nextValue","push","join","EngagementHeatMapLegend","Math","legendSquareWidthPercentage","className","Text","phrase","map","val","idx","key","style","width","backgroundColor","EngagementHeatMap","props","heatMap","engagement","background","InsightCard","subtitle","svgClassName","SvgContainer","svgName","size","S","title","count","children","CHART_FONT_STYLES","fontSize","fontFamily","fontWeight","color","getFullHeatMap","videoDuration","Array","ceil","fill","t","getEngagementRate","reduce","prev","next","engagementRate","DragOverlayStyles","opacity","cursor","calculateScrollState","ref","canScrollLeft","current","scrollLeft","canScrollRight","scrollWidth","clientWidth","SortIndicator","column","canSort","isSorted","theme","sortIndicator","isSortedDesc","BaseTable","ids","idHash","tableOptions","columns","disableSortBy","enableSort","manualSortBy","manualSort","autoResetHiddenColumns","autoResetSortBy","initialState","sortBy","initialSortBy","initialSelectedRowIds","selectedRowIds","forEach","id","getRowId","useTable","plugins","useSortBy","useRowSelect","layout","useFlexLayout","useBlockLayout","allowFiltering","useFilters","allowGlobalFiltering","useGlobalFilter","getPlugins","getTableProps","getTableBodyProps","headerGroups","rows","prepareRow","toggleAllRowsSelected","setGlobalFilter","setHiddenColumns","state","renderTableRows","row","FunctionHelper","isSelected","selectedRow","onSelectRow","enableSortableRows","getTableRowsClass","rowAppLink","getRowAppLink","onClickRow","allowSelectMultipleRows","toggleRowSelected","renderRow","sortableProps","dragAttributes","dragListeners","getSortableProps","role","AppLink","appLink","renderCells","onClick","rowProps","getRowProps","SortableItemWrapper","original","childProps","childComponent","cells","cell","cellClassName","onSelectCell","getCellClassName","getCellProps","render","onSort","globalFilter","hiddenColumns","table","header","headerGroup","getHeaderGroupProps","headerRow","headers","getHeaderProps","getSortByToggleProps","headerCell","renderSortIndicator","hideSortIndicator","body","SortableContainerWrapper","getDragOverlay","rowIndex","findIndex","item","onSortEnd","onSortingRowsEnd","Table","enableSlider","scrollIncrement","scrollable","tableProps","elRef","scrollState","setScrollState","throttledOnScroll","el","removeEventListener","addEventListener","scroll","scrollBy","left","top","behavior","useTableScroll","renderTrackHorizontal","autoHeightMax","autoHeight","onClickScroll","direction","WidgetButton","W","hide","scrollContainerClassName","defaultProps","getPhrase","LanguageService","EMPTY_ENGAGEMENT","viewCount","CellWrapper","HeaderCell","phraseKey","EngagementTable","users","classroomStudents","maxHeatMapValue","e","localMax","Header","accessor","sortType","rowA","rowB","values","user","anonymiseUsers","Cell","nameParts","name","split","filter","n","surname","slice","Avatar","imageCdnUrl","initials","UserHelper","imageUrl","avatar","url","showAnonymousUser","sessionId","sortDescFirst","PercentageIndicator","percentage","useGetColumns","userIdSet","Set","find","u","userId","add","students","s","has","border","PartialPercentageIndicator","customLabel","InsightAmountWatched","round","options","CHART_COLOURS","STATIC_CHART_OPTIONS","text","credits","enabled","chart","spacing","legend","itemStyle","itemDistance","plotOptions","pie","allowPointSelect","dataLabels","showInLegend","borderWidth","InsightTotalViews","events","groupsToOmit","getSeriesName","groups","eventCounts","chartData","staffIndex","group","staffObject","splice","sort","a","b","parseInt","match","sortByYearGroup","ev","includes","toLowerCase","ArrayHelper","Object","keys","y","type","d","totalViews","highcharts","series","getChartOptions","containerProps","EmptyState","src","emptyStateImage","PartialInsightsHeatmap","EngagementOverlayMenuItem","player","overlayVisible","toggle","this","toggleOn","toggleOff","toggleEl","engagementOverlayPlugin","toggleOverlay","addClass","removeClass","event","stopImmediatePropagation","tagName","properties","attributes","handlerBound","handleToggle","bind","innerHTML","appendChild","TimepointInteractions","timepoint","interactive","timepoints","timepointTime","visibleAt","floor","time","interactions","MAX_INTERACTIONS_TO_SHOW","hiddenInteractions","InteractionLabel","interaction","showQuestion","iconClassName","xAxis","visible","minPadding","maxPadding","defs","x1","y1","x2","y2","offset","height","styledMode","Component","EngagementOverlay","initialize","bindListeners","ready","buildChart","buildCSSClass","show","destroyChart","handleClick","resizeChart","on","off","paused","play","pause","chartDimensions","getChartDimensions","container","querySelector","getHighchartOptions","one","setSize","destroy","collapserator","getChild","collapseratorHeight","currentHeight","currentDimensions","moveTimepointIndicator","yAxis","options_","min","allowDecimals","startOnTick","endOnTick","tooltip","formatter","timepointInteractionsHtml","renderToStaticMarkup","getTimepointInteractionsHtml","x","formatTime","positioner","labelWidth","labelHeight","point","maxX","plotWidth","plotX","plotTop","useHTML","padding","area","mouseOver","mouseOut","marker","onTimepointHover","indicator","EngagementOverlayPlugin","hasHeatMapData","addChild","addItem","index","ctor","engagementOverlay","toggleChart","acc","InteractiveSeekBarPlugin","onTrackLoaded","track","addChildren","controlBar","ReportsPlayer","playbackObject","additionalSetup","setupEngagementOverlayPlugin","setupUpClipPlugin","setupInteractiveSeekBarPlugin","additionalData","clipData","isClip","mediaType","isInteractive","Error","clipPlugin","startTime","endTime","interactiveSeekBarPlugin","ignoreChapters","ClickViewReportsPlayer","playerRef","VideoEngagementOverlay","timepointIndicatorRef","viewKey","playerApi","URL","playerApiUrl","hotkeyElQuerySelector","classList","remove","aspectRatio","InsightsHeatmap","hasDataLoaded","yearGroupCount","yearGroups","ImageUrls","individualEngagement","aggregateEngagement","config","tableDataLoaded"],"sourceRoot":""}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[5349],{6748:(e,t,n)=>{n.d(t,{i:()=>C});var r=n(32735),a=n(42648),l=n(35509),o=n(91967),i=n(15611),c=n(17808),s=n(1287),u=n(83914),d=n(90281),m={opacity:"0.8",cursor:"grabbing"},f=n(35223);function v(e){return function(e){if(Array.isArray(e))return g(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||h(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function h(e,t){if(e){if("string"==typeof e)return g(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?g(e,t):void 0}}function g(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function p(e){var t,n,r,a;return{canScrollLeft:(null===(t=e.current)||void 0===t?void 0:t.scrollLeft)>0,canScrollRight:(null===(n=e.current)||void 0===n?void 0:n.scrollLeft)+1<(null===(r=e.current)||void 0===r?void 0:r.scrollWidth)-(null===(a=e.current)||void 0===a?void 0:a.clientWidth)}}const E={sortIndicator:"gFhu0",scrollContainer:"sWUp9",scrollbarTrack:"Vn2qM"};function b(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var y=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var a=0;for(r=Object.getOwnPropertySymbols(e);a<r.length;a++)t.indexOf(r[a])<0&&Object.prototype.propertyIsEnumerable.call(e,r[a])&&(n[r[a]]=e[r[a]])}return n};function S(e){var t,n;return e.column.canSort?r.createElement("span",{className:"".concat(E.sortIndicator,"\n ").concat(e.column.isSorted?"":"text-secondary","\n ").concat(null!==(n=null===(t=e.theme)||void 0===t?void 0:t.sortIndicator)&&void 0!==n?n:"")},r.createElement(u.x,{svgName:e.column.isSortedDesc||!e.column.isSorted?f.vn.ArrowRight:f.vn.ArrowLeft,size:u.S.Small})):r.createElement(r.Fragment,null)}function w(e){var t,n,a,u,d,f,h,g,p={columns:e.columns,data:e.data,disableSortBy:!e.enableSort,manualSortBy:e.manualSort,autoResetHiddenColumns:e.autoResetHiddenColumns,autoResetSortBy:e.autoResetSortBy,initialState:{sortBy:e.initialSortBy||[]}};e.initialSelectedRowIds&&(p.initialState={selectedRowIds:(h=e.initialSelectedRowIds,g={},h.forEach((function(e){return g[e]=!0})),g)}),e.getRowId&&(p.getRowId=e.getRowId);var E,y=l.useTable.apply(void 0,[p].concat((E=function(e){var t=[l.useSortBy,l.useRowSelect,"flex"===e.layout?l.useFlexLayout:l.useBlockLayout];return e.allowFiltering&&(t=[].concat(v(t),[l.useFilters])),e.allowGlobalFiltering&&(t=[].concat(v(t),[l.useGlobalFilter])),t}(Object.assign({},e)),function(e){if(Array.isArray(e))return b(e)}(E)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(E)||function(e,t){if(e){if("string"==typeof e)return b(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?b(e,t):void 0}}(E)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()))),w=y.getTableProps,C=y.getTableBodyProps,j=y.headerGroups,N=y.rows,x=y.prepareRow,O=y.toggleAllRowsSelected,k=y.setGlobalFilter,A=y.setHiddenColumns,I=y.state.sortBy;function R(){return N.map((function(t){x(t);var n=function(t){var n,r,a,l,i,c=o.q.isFunction(null===(n=e.theme)||void 0===n?void 0:n.row)?e.theme.row(t):null!==(a=null===(r=e.theme)||void 0===r?void 0:r.row)&&void 0!==a?a:"";return t.isSelected&&(null===(l=e.theme)||void 0===l?void 0:l.selectedRow)&&(c+=" ".concat(null===(i=e.theme)||void 0===i?void 0:i.selectedRow)),e.onSelectRow&&(c+=" cursor-pointer"),e.enableSortableRows&&(c+=" cursor-grab"),c}(t),a=!!e.getRowAppLink&&e.getRowAppLink(t);function l(){e.onSelectRow&&(e.allowSelectMultipleRows||O(!1),e.onSelectRow(t),t.toggleRowSelected(!0))}function c(e,o){var c=function(e,t){return"dragAttributes"in e&&"dragListeners"in e?Object.assign(Object.assign(Object.assign({},e.dragAttributes),e.dragListeners),{"aria-roledescription":"Sortable row",ref:t}):{}}(e,o);return a?r.createElement("div",{role:"row",key:t.id},r.createElement(i.F,Object.assign({},e,c,{className:n,appLink:a}),F(t))):r.createElement("div",Object.assign({},e,c,{key:t.id,role:"row",className:n,onClick:l}),F(t))}var u=t.getRowProps();return e.enableSortableRows?r.createElement(s.W,{id:t.original.id,key:t.id,childProps:u,childComponent:r.forwardRef((function(e,t){return c(e,t)}))}):c(u)}))}function F(t){return t.cells.map((function(n){var a=function(t,n){var r,a,l="";return"function"==typeof(null===(r=e.theme)||void 0===r?void 0:r.cell)&&(l=e.theme.cell(t,n)),"string"==typeof(null===(a=e.theme)||void 0===a?void 0:a.cell)&&(l=e.theme.cell),e.onSelectCell&&(l+=" cursor-pointer"),l}(t,n);return r.createElement("div",Object.assign({key:n.column.id},n.getCellProps(),{className:a,onClick:function(){e.onSelectCell&&e.onSelectCell(n)}}),n.render("Cell"))}))}return r.useEffect((function(){e.onSort&&e.onSort(I)}),[I]),r.useEffect((function(){e.globalFilter&&k(e.globalFilter)}),[e.globalFilter]),r.useEffect((function(){e.hiddenColumns&&A(e.hiddenColumns)}),[e.hiddenColumns&&e.hiddenColumns.length]),r.createElement("div",Object.assign({},w(),{className:null!==(n=null===(t=e.theme)||void 0===t?void 0:t.table)&&void 0!==n?n:""}),r.createElement("div",{className:null!==(u=null===(a=e.theme)||void 0===a?void 0:a.header)&&void 0!==u?u:""},j.map((function(t){var n,a;return r.createElement("div",Object.assign({},t.getHeaderGroupProps(),{className:null!==(a=null===(n=e.theme)||void 0===n?void 0:n.headerRow)&&void 0!==a?a:""}),t.headers.map((function(t){var n,a;return r.createElement("div",Object.assign({},t.getHeaderProps(t.getSortByToggleProps()),{className:null!==(a=null===(n=e.theme)||void 0===n?void 0:n.headerCell)&&void 0!==a?a:""}),t.render("Header",{renderSortIndicator:function(){return r.createElement(S,{column:t,theme:e.theme})}}),!t.hideSortIndicator&&r.createElement(S,{column:t,theme:e.theme}))})))}))),r.createElement("div",Object.assign({},C(),{className:null!==(f=null===(d=e.theme)||void 0===d?void 0:d.body)&&void 0!==f?f:""}),e.enableSortableRows?r.createElement(c.Q,{ids:N.map((function(e){return e.original.id})),getDragOverlay:function(t){var n,a,l=N.findIndex((function(e){return e.original.id===t})),o=N[l];return r.createElement("div",Object.assign({},e,{className:(n=e.theme,a="g-0 ",n&&(a+=n.row),a),style:m}),F(o))},onSortEnd:e.onSortingRowsEnd},R()):R()))}function C(e){var t=e.enableSlider,n=e.scrollIncrement,l=e.scrollable,i=y(e,["enableSlider","scrollIncrement","scrollable"]),c=function(){var e,t,n=r.useRef(null),a=(e=r.useState(p(n)),t=2,function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,l,o,i=[],c=!0,s=!1;try{if(l=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=l.call(n)).done)&&(i.push(r.value),i.length!==t);c=!0);}catch(e){s=!0,a=e}finally{try{if(!c&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(s)throw a}}return i}}(e,t)||h(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),l=a[0],i=a[1],c=o.q.throttle((function(){i(p(n))}),200),s=r.useCallback((function(e){var t;n.current&&(null===(t=n.current)||void 0===t||t.removeEventListener("scroll",c)),e&&(i(p(n)),e.addEventListener("scroll",c)),n.current=e}),[]);return r.useEffect((function(){(null==n?void 0:n.current)&&i(p(n))}),[n]),{ref:s,scrollState:l,scroll:function(e){var t;null===(t=n.current)||void 0===t||t.scrollBy({left:e,top:0,behavior:"smooth"})}}}(),s=c.ref,u=c.scrollState,m=c.scroll;if(l)return r.createElement(a.$B,{renderTrackHorizontal:function(){return r.createElement("div",{className:E.scrollbarTrack})},autoHeightMax:1e4,autoHeight:!0},r.createElement(w,Object.assign({},i)));if(!t)return r.createElement(w,Object.assign({},i));function f(e){m(n*("right"===e?1:-1))}return r.createElement("div",{className:"mx-n4 overflow-x-hidden overflow-y-hidden"},r.createElement("div",{className:"px-4"},r.createElement("div",{className:"position-relative"},r.createElement(d.W,{direction:d.f.Left,onClick:function(){return f("left")},hide:!u.canScrollLeft}),r.createElement("div",{className:"".concat(E.scrollContainer," ").concat(e.scrollContainerClassName),ref:s},r.createElement(w,Object.assign({},i))),r.createElement(d.W,{direction:d.f.Right,onClick:function(){return f("right")},hide:!u.canScrollRight}))))}C.defaultProps={scrollIncrement:250,scrollable:!1,layout:"flex"}},60115:(e,t,n)=>{n.d(t,{K:()=>s});var r=n(32735),a=n(50242),l=n(91967),o=400,i=n(45719);function c(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function s(e,t,n,s,u,d){var m,f,v,h,g=(m=(0,r.useState)(0),f=2,function(e){if(Array.isArray(e))return e}(m)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,l,o,i=[],c=!0,s=!1;try{if(l=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=l.call(n)).done)&&(i.push(r.value),i.length!==t);c=!0);}catch(e){s=!0,a=e}finally{try{if(!c&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(s)throw a}}return i}}(m,f)||function(e,t){if(e){if("string"==typeof e)return c(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?c(e,t):void 0}}(m,f)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),p=g[0],E=g[1],b=t,y=(0,i.P)((function(t){if(!e)return null;var n=e(t);return n?n.key:null}),s,u);return v={fetchNextPage:function(){if(t&&e&&y)return E((function(e){return e+1})),b(y.nextCursor)},hasMore:!!(null==y?void 0:y.nextCursor),isFetching:null==y?void 0:y.isFetching,scrollContainer:d},h=function(){if(!v.isFetching){if(v.scrollContainer){var e=v.scrollContainer;if(e.getBoundingClientRect().height+e.scrollTop<e.scrollHeight-o)return}else if(window.innerHeight+document.documentElement.scrollTop<document.documentElement.scrollHeight-o)return;v.fetchNextPage()}},(0,r.useEffect)((function(){var e=l.q.throttle(h,200),t=v.scrollContainer||window;return v.hasMore&&t.addEventListener("scroll",e),function(){return t.removeEventListener("scroll",e)}}),[v.hasMore,v.fetchNextPage,v.scrollContainer]),(0,r.useEffect)((function(){y&&y.shouldInitialFetch&&t&&(b(),E((function(e){return e+1})))}),[null==y?void 0:y.shouldInitialFetch,t]),(0,r.useEffect)((function(){var e,t;if((null==y?void 0:y.statusCode)&&l.q.isFunction(n)){var r=+(null===(t=null===(e=y.statusCode)||void 0===e?void 0:e.toString())||void 0===t?void 0:t.substr(0,1));r!==a.k.ClientError&&r!==a.k.ServerError||n(p,y.statusCode)}}),[null==y?void 0:y.statusCode]),{items:null==y?void 0:y.items,hasMore:!!(null==y?void 0:y.nextCursor),nextCursor:null==y?void 0:y.nextCursor,isFetching:null==y?void 0:y.isFetching,totalItems:null==y?void 0:y.totalItems,hasFirstPageCompleted:null==y?void 0:y.hasFirstPageCompleted}}},81854:(e,t,n)=>{n.r(t),n.d(t,{SharedWithMeView:()=>oe});var r=n(32735),a=n(70680),l=n(23481),o=n(81886),i=n(20354),c=n(30439),s=n(87801),u=n(83345),d=n(16714),m=n(67058),f=n(39151),v=n(79967),h=n(60115),g=n(22902),p=n(79612),E=n(37802),b=n(57900),y=n(2948),S=n(15611),w=n(91693),C=n(35223),j=n(14070),N=n(97291),x=n(86702);function O(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var k="lite.shareInsightsAlert";function A(){var e,t,n=(e=(0,y.D)(x.y.SHARE_INSIGHTS_ALERT,!0,{storage:b.Z1.LocalStorage}),t=2,function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,l,o,i=[],c=!0,s=!1;try{if(l=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=l.call(n)).done)&&(i.push(r.value),i.length!==t);c=!0);}catch(e){s=!0,a=e}finally{try{if(!c&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(s)throw a}}return i}}(e,t)||function(e,t){if(e){if("string"==typeof e)return O(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?O(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),a=n[0],l=n[1];return a?r.createElement("div",{role:"alert",className:"d-flex justify-content-between align-items-center bg-light-blue rounded p-2 mb-4"},r.createElement("div",null,r.createElement(u.x,{namespace:k,phrase:"sharedByMe"}),r.createElement(S.F,{appLink:{application:N.O.MY_SHARES,action:j.e.MyShares.HOME},className:"text-info"},r.createElement(u.x,{namespace:k,phrase:"myShares"})),"."),r.createElement(w.h,{svgName:C.vn.Close,className:"text-blue",onClick:function(){l(!1)}})):r.createElement(r.Fragment,null)}const I={imageColumn:"Hs7kk",nameColumn:"GRyds",sharedByColumn:"fewR0",dateSharedColumn:"G6z3W",heading:"YxAsH",image:"CdUtO",name:"pdEW7",avatar:"rQ2Dt",date:"Lx3Ce"};function R(){return r.createElement("div",{className:"d-flex striped-row rounded"},r.createElement("div",{className:"d-flex align-items-center justify-content-center p-2 ".concat(I.imageColumn)},r.createElement("div",{className:"partial-loading-background rounded w-100 ".concat(I.image)})),r.createElement("div",{className:"d-flex align-items-center p-2 ".concat(I.nameColumn)},r.createElement("div",{className:"partial-loading-background w-75 ".concat(I.name)})),r.createElement("div",{className:"d-flex align-items-center p-2 ".concat(I.sharedByColumn)},r.createElement("div",{className:"partial-loading-background ".concat(I.avatar)})),r.createElement("div",{className:"d-none d-md-flex align-items-center p-2 ".concat(I.dateSharedColumn)},r.createElement("div",{className:"partial-loading-background ".concat(I.date)})))}function F(e){return r.createElement("div",{className:"d-flex mb-1"},r.createElement("div",{className:"".concat(I.imageColumn," p-2")},r.createElement("div",{className:"partial-loading-background ".concat(I.heading)})),r.createElement("div",{className:"".concat(I.nameColumn," p-2")}," "),r.createElement("div",{className:"".concat(I.sharedByColumn," p-2")},e.fullHeader?r.createElement("div",{className:"partial-loading-background ".concat(I.heading)}):r.createElement(r.Fragment,null," ")),r.createElement("div",{className:"".concat(I.dateSharedColumn," p-2 d-none d-md-flex")},e.fullHeader?r.createElement("div",{className:"partial-loading-background ".concat(I.heading)}):r.createElement(r.Fragment,null," ")))}function H(){return r.createElement(r.Fragment,null,r.createElement("div",{className:"mb-3"},r.createElement(F,{fullHeader:!0}),r.createElement("div",{className:"striped-list no-full-width"},r.createElement(R,null),r.createElement(R,null),r.createElement(R,null))),r.createElement("div",{className:"mb-3"},r.createElement(F,null),r.createElement("div",{className:"striped-list no-full-width"},r.createElement(R,null),r.createElement(R,null),r.createElement(R,null),r.createElement(R,null))),r.createElement("div",{className:"mb-3"},r.createElement(F,null),r.createElement("div",{className:"striped-list no-full-width"},r.createElement(R,null),r.createElement(R,null),r.createElement(R,null),r.createElement(R,null),r.createElement(R,null),r.createElement(R,null),r.createElement(R,null),r.createElement(R,null),r.createElement(R,null),r.createElement(R,null))))}var M=n(95834),L=n(6748),T=n(96560),B=n(31908),P=n(46390),W=n(82602),U=n(65858),_=n(9806),D=n(31754),G=n(64249),V=n(97408),q=n(62335),$=n(4594),z=n(64818),K="share.sharedWithMeTable",Q=l.T.encloseNamespace(K);function Z(e){var t=e.index,n=e.dateHeading,a=e.breakpoints,l=e.getObjectAppLink,o=e.imageCdnUrl,i=a.xs||a.sm;return[{Header:n,accessor:"object",id:"image",Cell:function(e){var t=e.row.original;return r.createElement(_.k,{object:t.object,appLink:l(t),locationContext:U.LZ.SharedWithMe,showVideoMetadata:!0})},minWidth:140,maxWidth:30},{accessor:"object",id:"name",Cell:function(e){var t,n,a,o=e.row.original,i=function(){switch(o.object.typeId){case $.E.Series:return"series";case $.E.Playlist:return"playlist"}}();return(null===(t=o.object)||void 0===t?void 0:t.name)?r.createElement("div",{className:"clamp-2"},i&&r.createElement(q.m,null,r.createElement(u.x,{namespace:K,phrase:i})),r.createElement(S.F,{appLink:l(o),analyticsData:{id:null===(n=o.object)||void 0===n?void 0:n.id,name:null===(a=o.object)||void 0===a?void 0:a.name},analyticsOptions:{entity:G.I.getAnalyticsEntity(o.object.type),actionType:U.Vw.Click,location:U.LZ.SharedByMe}},o.object.name)):r.createElement("span",null,r.createElement(u.x,{namespace:K,phrase:"videoUnavailable"}))},width:60},{Header:0===t?Q("sharedBy"):"",accessor:"owner",Cell:function(e){var t,n=e.value;return r.createElement("div",{className:"d-flex align-items-center"},r.createElement("div",{className:"".concat(I.avatar," flex-shrink-0")},r.createElement(V.q,{initials:z.l.getInitials(n.name,n.surname),imageUrl:null===(t=n.avatar)||void 0===t?void 0:t.url,imageCdnUrl:o})),!i&&r.createElement("p",{className:"clamp-1 ms-2"},"".concat(n.name," ").concat(n.surname)))},width:40},!i&&{Header:0===t?Q("shared"):"",id:"dateShared",accessor:function(e){return(0,W.WU)(e.dateShared)},width:60}].filter(Boolean)}function Y(e){var t,n,a,l=(t=e.data,n=e.refreshTable,r.useMemo((function(){return D.x.groupByDateShared(t)}),[n])),o=(a=(0,P.G)().isPlugin,function(e){var t,n={application:N.O.SHARE,action:j.e.Share.VIEW_SHARE_LINK,args:[e.id]};if(B.M.isVideoType(e.object)&&!(null===(t=B.M.getCanBeConsumed(e.object))||void 0===t?void 0:t.canConsume))return null;if(!a)return n;var r={application:N.O.SHARE,action:j.e.Share.SHARE,args:[e.id]};return e.object.type===T.r.Video?Object.assign(Object.assign({},r),{params:{entityType:"video"}}):e.object.type===T.r.Clip?Object.assign(Object.assign({},r),{params:{entityType:"clip"}}):e.object.type===T.r.Interactive?Object.assign(Object.assign({},r),{params:{entityType:"interactive"}}):n});return r.createElement(r.Fragment,null,Object.keys(l).map((function(t,n){return r.createElement(L.i,{key:n,columns:Z({index:n,dateHeading:t,breakpoints:e.breakpoints,getObjectAppLink:o,imageCdnUrl:e.imageCdnUrl}),data:l[t],theme:M.J})})))}var J=n(2523),X=n(97958),ee=n(99742),te="share.sharedWithMeEmptyState",ne={application:N.O.DASHBOARD,action:j.e.Dashboard.HOME};function re(){return r.createElement(u.D.Provider,{value:te},r.createElement(X.u,null,r.createElement(X.u.Image,{src:ee.W.EmptyStates.Share.SHARED_WITH_ME,size:"small"}),r.createElement(X.u.Heading,null,r.createElement(u.x,{phrase:"heading"})),r.createElement(X.u.Info,null,r.createElement(u.x,{phrase:"info"})),r.createElement(X.u.Cta,{appLink:ne,text:l.T.getPhrase(te,"cta")})))}var ae="liteShare.sharedWithMe",le=l.T.encloseNamespace(ae);function oe(){var e,t=(0,g.T)().hasPermissions,n=(0,E.r)(null).hasShareFlowV2,l=(0,a.I0)(),b=(0,v.k)(),y=i.a.useBasicFetch(f.L.config()),S=function(e){return c.o.getObjectsSharedWithUser(e)},w=function(e){return i.a.getFetch(l)(S(e))},C=(0,h.K)(S,w),j=C.items,N=C.hasMore,x=C.isFetching,O=C.nextCursor;return(0,p.M)({title:le("sharedWithMe")}),t(d.C.StudentExperience)?(o.Q.Ry.throw(new m.d),r.createElement(r.Fragment,null)):r.createElement("div",{className:"px-3"},n&&t(d.C.ViewMyShares)?r.createElement("div",null,r.createElement(A,null),r.createElement("h1",{className:"h2 mb-3"},r.createElement(u.x,{namespace:ae,phrase:"sharedWithMe"}))):r.createElement(J.w,null),j&&y.data?(null==j?void 0:j.length)?r.createElement(r.Fragment,null,r.createElement(Y,{data:j,refreshTable:x,breakpoints:b,imageCdnUrl:null===(e=y.data)||void 0===e?void 0:e.imageCdnUrl}),(N||x)&&r.createElement(s._,{isFetching:x,fetchNext:w,nextCursor:O})):r.createElement(re,null):r.createElement(H,null))}}}]);
|
|
2
|
-
//# sourceMappingURL=5349-bc0fcb4083-lite.chunk.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/5349-bc0fcb4083-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/constants/DragOverlayStyles.ts","file:///app/packages/libs/shared/src/components/table/TableUtils.ts","file:///app/packages/libs/shared/src/components/table/table.scss","file:///app/packages/libs/shared/src/components/table/Table.tsx","file:///app/packages/libs/shared/src/hooks/UseInfiniteScroll.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteList.ts","file:///app/packages/projects/lite/src/apps/share/components/share-insights-alert/ShareInsightsAlert.tsx","file:///app/packages/projects/lite/src/apps/share/components/shared-with-me-table/shared-with-me-table.scss","file:///app/packages/projects/lite/src/apps/share/components/shared-with-me-table/PartialSharedWithMeTable.tsx","file:///app/packages/projects/lite/src/apps/share/components/shared-with-me-table/SharedWithMeTableUtils.tsx","file:///app/packages/projects/lite/src/apps/share/components/shared-with-me-table/SharedWithMeTable.tsx","file:///app/packages/projects/lite/src/apps/share/views/shared-with-me/empty-state/SharedWithMeEmptyState.tsx","file:///app/packages/projects/lite/src/apps/share/views/shared-with-me/SharedWithMeView.tsx"],"sourcesContent":["export const DragOverlayStyles = { opacity: '0.8', cursor: 'grabbing' };","import React from 'react';\nimport { PluginHook, useBlockLayout, useFilters, useFlexLayout, useGlobalFilter, useRowSelect, useSortBy } from 'react-table';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\n\ninterface PluginOptions {\n allowFiltering?: boolean;\n allowGlobalFiltering?: boolean;\n layout?: 'flex' | 'block';\n}\n\nexport function getPlugins<T extends HashObject>(props: PluginOptions): PluginHook<T>[] {\n let plugins: PluginHook<T>[] = [\n useSortBy,\n useRowSelect,\n props.layout === 'flex' ? useFlexLayout : useBlockLayout\n ];\n\n if (props.allowFiltering)\n plugins = [\n ...plugins,\n useFilters\n ];\n\n if (props.allowGlobalFiltering)\n plugins = [\n ...plugins,\n useGlobalFilter\n ];\n\n return plugins;\n}\n\nexport function getSelectedRowIds(ids: string[]): Record<string, boolean> {\n const idHash: Record<string, boolean> = {};\n\n ids.forEach(id => idHash[id] = true);\n\n return idHash;\n}\n\ninterface TableScrollState {\n canScrollLeft: boolean;\n canScrollRight: boolean;\n}\n\nfunction calculateScrollState(ref: React.MutableRefObject<HTMLDivElement>): TableScrollState {\n const canScrollLeft = ref.current?.scrollLeft > 0;\n const canScrollRight = (ref.current?.scrollLeft + 1) < ref.current?.scrollWidth - ref.current?.clientWidth;\n\n return { canScrollLeft, canScrollRight };\n}\n\ninterface UseTableScroll {\n ref: (el: HTMLDivElement) => void;\n scrollState: TableScrollState;\n scroll: (scrollBy: number) => void;\n}\n\nexport function useTableScroll(): UseTableScroll {\n const elRef = React.useRef<HTMLDivElement>(null);\n const [ scrollState, setScrollState ] = React.useState<TableScrollState>(calculateScrollState(elRef));\n\n function onScroll(): void {\n setScrollState(calculateScrollState(elRef));\n }\n\n function scroll(scrollBy: number): void {\n elRef.current?.scrollBy({ left: scrollBy, top: 0, behavior: 'smooth' });\n }\n\n const throttledOnScroll = FunctionHelper.throttle(onScroll, 200);\n\n const ref = React.useCallback((el: HTMLDivElement) => {\n if (elRef.current) {\n elRef.current?.removeEventListener('scroll', throttledOnScroll);\n }\n\n if (el) {\n setScrollState(calculateScrollState(elRef));\n el.addEventListener('scroll', throttledOnScroll);\n }\n\n elRef.current = el;\n }, []);\n\n React.useEffect(() => {\n if (elRef?.current) {\n setScrollState(calculateScrollState(elRef));\n }\n }, [elRef]);\n\n return { ref, scrollState, scroll };\n}","// extracted by mini-css-extract-plugin\nexport default {\"sortIndicator\":\"gFhu0\",\"scrollContainer\":\"sWUp9\",\"scrollbarTrack\":\"Vn2qM\"};","import React from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\nimport {\n Cell,\n Column as BaseColumn,\n HeaderGroup,\n HeaderProps as BaseHeaderProps,\n IdType,\n Row,\n SortingRule,\n TableOptions,\n TableRowProps,\n useTable } from 'react-table';\nimport { DragEndEvent } from '@dnd-kit/core';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SortableContainerWrapper } from 'libs/shared/components/sortable/SortableContainerWrapper';\nimport { PropsWithSortableItemProps, SortableItemWrapper } from 'libs/shared/components/sortable/SortableItemWrapper';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { WidgetButton, WidgetButtonDirection } from 'libs/shared/components/widgets/widget-button/WidgetButton';\nimport { DragOverlayStyles } from 'libs/shared/constants/DragOverlayStyles';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { getPlugins, getSelectedRowIds, useTableScroll } from './TableUtils';\n\nimport styles from './table.scss';\n\nexport interface TableTheme {\n table?: string;\n header?: string;\n headerRow?: string;\n headerCell?: string;\n body?: string;\n row?: string | ((row: Row<any>) => string);\n selectedRow?: string;\n cell?: string | ((row?: Row<any>, cell?: Cell<any, any>) => string);\n sortIndicator?: string;\n}\n\nexport type HeaderProps<T extends HashObject> = BaseHeaderProps<T> & {\n renderSortIndicator: () => void;\n}\n\nexport type Column<T extends HashObject> = BaseColumn<T> & {\n hideSortIndicator?: boolean;\n}\n\ninterface SortIndicatorProps<T extends HashObject> {\n column: HeaderGroup<T>;\n theme?: TableTheme;\n}\n\nfunction SortIndicator<T extends HashObject>(props: SortIndicatorProps<T>): JSX.Element {\n if (!props.column.canSort)\n return <></>;\n\n return (\n <span\n className={\n `${styles.sortIndicator}\n ${!props.column.isSorted ? 'text-secondary' : ''}\n ${props.theme?.sortIndicator ?? ''}`\n }\n >\n <SvgContainer\n svgName={(props.column.isSortedDesc || !props.column.isSorted)\n ? cvSvgLibrary.ArrowRight\n : cvSvgLibrary.ArrowLeft\n }\n size={SvgContainerSize.Small}\n />\n </span>\n );\n}\n\ninterface BaseTableProps<T extends HashObject> {\n /**\n * Must be memoized.\n */\n data: T[];\n\n /**\n * Must be memoized.\n * \n * For documentation on Column Options, see https://react-table.tanstack.com/docs/api/useTable#column-options\n */\n columns: Column<T>[];\n\n theme?: TableTheme;\n\n onSelectRow?: (row: Row<T>) => void;\n\n onSelectCell?: (cell: Cell<T>) => void;\n\n onRowMouseOver?: (row: Row<T>) => void;\n\n onRowMouseLeave?: (row: Row<T>) => void;\n\n allowSelectMultipleRows?: boolean;\n\n initialSelectedRowIds?: string[];\n\n getRowId?: (row: T) => string;\n\n getRowAppLink?: (row: Row<T>) => Core.AppLink;\n\n enableSort?: boolean;\n\n manualSort?: boolean;\n\n onSort?: (sortingRule: SortingRule<T>[]) => void;\n \n // Opt-in to utilise react-table's useFilter hook.\n allowFiltering?: boolean;\n\n // Opt-in to utilise react-table's useGlobalFilter hook.\n allowGlobalFiltering?: boolean;\n\n // Use either a flex layout or a block layout. Default is flex.\n layout?: 'flex' | 'block';\n\n // Used by useGlobalFilter hook, needs to be enabled by prop above.\n globalFilter?: string;\n\n // Set initial state of hidden columns in react-table.\n hiddenColumns?: IdType<T>[];\n\n // Determine whether hidden columns should be preserved on a table update event.\n autoResetHiddenColumns?: boolean;\n\n // Determine whether sort order state should be preserved on a table update event.\n autoResetSortBy?: boolean;\n\n // Determine whether rows are sortable by drag and drop\n enableSortableRows?: boolean;\n\n onSortingRowsEnd?: (event: DragEndEvent) => void;\n\n // Set initial state of sorting in react-table\n initialSortBy?: SortingRule<T>[];\n}\n \ntype SortableRowProps = PropsWithSortableItemProps<TableRowProps>;\n\nfunction BaseTable<T extends HashObject>(props: BaseTableProps<T>): JSX.Element {\n const tableOptions: TableOptions<T> = {\n columns: props.columns,\n data: props.data,\n disableSortBy: !props.enableSort,\n manualSortBy: props.manualSort,\n autoResetHiddenColumns: props.autoResetHiddenColumns,\n autoResetSortBy: props.autoResetSortBy,\n initialState: {\n sortBy: props.initialSortBy || []\n }\n };\n\n if (props.initialSelectedRowIds)\n tableOptions.initialState = { selectedRowIds: getSelectedRowIds(props.initialSelectedRowIds) };\n\n if (props.getRowId)\n tableOptions.getRowId = props.getRowId;\n\n const {\n getTableProps,\n getTableBodyProps,\n headerGroups,\n rows,\n prepareRow,\n toggleAllRowsSelected,\n setGlobalFilter,\n setHiddenColumns,\n state: { sortBy }\n } = useTable<T>(tableOptions, ...getPlugins<T>({ ...props }));\n\n function getTableRowsClass(row: Row<T>) {\n let className = FunctionHelper.isFunction(props.theme?.row)\n ? props.theme.row(row)\n : props.theme?.row ?? '';\n\n if (row.isSelected && props.theme?.selectedRow)\n className += ` ${props.theme?.selectedRow}`;\n\n if (props.onSelectRow)\n className += ' cursor-pointer';\n\n if (props.enableSortableRows)\n className += ' cursor-grab';\n\n return className;\n }\n\n function renderTableRows(): JSX.Element[] {\n return rows.map(row => {\n prepareRow(row);\n \n const className = getTableRowsClass(row);\n const rowAppLink = !!props.getRowAppLink && props.getRowAppLink(row);\n\n function onClickRow(): void {\n if (!props.onSelectRow)\n return;\n\n if (!props.allowSelectMultipleRows)\n toggleAllRowsSelected(false);\n \n props.onSelectRow(row);\n row.toggleRowSelected(true);\n }\n\n function getSortableProps(props: TableRowProps | PropsWithSortableItemProps<TableRowProps>, ref?: any) {\n if ('dragAttributes' in props && 'dragListeners' in props) {\n return {\n ...props.dragAttributes,\n ...props.dragListeners,\n 'aria-roledescription': 'Sortable row',\n ref\n };\n }\n\n return {};\n }\n\n function renderRow(props: TableRowProps | PropsWithSortableItemProps<TableRowProps>, ref?: any): JSX.Element {\n const sortableProps = getSortableProps(props, ref);\n\n if (rowAppLink) {\n return (\n <div\n role='row'\n key={row.id}\n >\n <AppLink\n {...props}\n {...sortableProps}\n className={className}\n appLink={rowAppLink}\n >\n {renderCells(row)}\n </AppLink>\n </div>\n );\n }\n\n return (\n <div\n {...props}\n {...sortableProps}\n key={row.id}\n role='row'\n className={className}\n onClick={onClickRow}\n >\n {renderCells(row)}\n </div>\n );\n }\n\n const rowProps = row.getRowProps();\n\n if (props.enableSortableRows) {\n return (\n <SortableItemWrapper\n id={row.original.id}\n key={row.id}\n childProps={rowProps}\n childComponent={React.forwardRef(\n (props: SortableRowProps, ref: React.LegacyRef<HTMLDivElement>) => (renderRow(props, ref))\n )}\n />\n );\n }\n\n return renderRow(rowProps);\n });\n }\n\n function getDragOverlayClassName(theme: TableTheme): string {\n let className = 'g-0 ';\n\n if (theme)\n className += theme.row;\n\n return className;\n }\n\n function getDragOverlay(id: string) {\n const rowIndex = rows.findIndex(item => item.original.id === id);\n const row = rows[rowIndex];\n \n return (\n <div\n {...props}\n className={getDragOverlayClassName(props.theme)}\n style={DragOverlayStyles}\n >\n {renderCells(row)}\n </div>\n );\n }\n\n function getCellClassName(row: Row<T>, cell: Cell<T>): string {\n let cellClassName = '';\n\n if (typeof props.theme?.cell === 'function')\n cellClassName = props.theme.cell(row, cell);\n\n if (typeof props.theme?.cell === 'string')\n cellClassName = props.theme.cell;\n\n if (props.onSelectCell)\n cellClassName += ' cursor-pointer';\n\n return cellClassName;\n }\n\n function renderCells(row: Row<T>): JSX.Element[] {\n return row.cells.map(cell => {\n const cellClassName = getCellClassName(row, cell);\n\n function onClickCell(): void {\n props.onSelectCell && props.onSelectCell(cell);\n }\n\n return (\n <div key={cell.column.id} {...cell.getCellProps()} className={cellClassName} onClick={onClickCell} >\n {cell.render('Cell')}\n </div>\n );\n });\n }\n\n React.useEffect(() => {\n if (!props.onSort)\n return;\n\n props.onSort(sortBy);\n }, [sortBy]);\n\n React.useEffect(() => {\n if (!props.globalFilter)\n return;\n\n setGlobalFilter(props.globalFilter);\n }, [props.globalFilter]);\n\n React.useEffect(() => {\n if (!props.hiddenColumns)\n return;\n\n setHiddenColumns(props.hiddenColumns);\n }, [props.hiddenColumns && props.hiddenColumns.length]);\n\n return (\n <div {...getTableProps()} className={props.theme?.table ?? ''}>\n <div className={props.theme?.header ?? ''}>\n {headerGroups.map(headerGroup => (\n <div {...headerGroup.getHeaderGroupProps()} className={props.theme?.headerRow ?? ''}>\n {headerGroup.headers.map(column => (\n <div {...column.getHeaderProps(column.getSortByToggleProps())} className={props.theme?.headerCell ?? ''}>\n {column.render('Header', { renderSortIndicator: () => <SortIndicator column={column} theme={props.theme} /> })}\n {!(column as Column<T>).hideSortIndicator &&\n <SortIndicator column={column} theme={props.theme} />\n }\n </div>\n ))}\n </div>\n ))}\n </div>\n <div {...getTableBodyProps()} className={props.theme?.body ?? ''}>\n { props.enableSortableRows ? (\n <SortableContainerWrapper\n ids={rows.map(row => row.original.id)}\n getDragOverlay={getDragOverlay}\n onSortEnd={props.onSortingRowsEnd}\n >\n {renderTableRows()}\n </SortableContainerWrapper>\n ) : (\n renderTableRows()\n )}\n </div>\n </div>\n );\n}\n\ninterface TableProps<T extends HashObject> extends BaseTableProps<T> {\n enableSlider?: boolean;\n scrollIncrement?: number;\n scrollContainerClassName?: string;\n scrollable?: boolean;\n initialSortBy?: SortingRule<T>[];\n}\n\nTable.defaultProps = {\n scrollIncrement: 250,\n scrollable: false,\n layout: 'flex'\n};\n\nexport function Table<T extends HashObject>(props: TableProps<T>): JSX.Element {\n const { enableSlider, scrollIncrement, scrollable, ...tableProps } = props;\n\n const { ref, scrollState, scroll } = useTableScroll();\n\n if (scrollable) {\n return (\n <Scrollbars\n renderTrackHorizontal={() => <div className={styles.scrollbarTrack} />}\n autoHeightMax={10000}\n autoHeight\n >\n <BaseTable {...tableProps} />\n </Scrollbars>\n );\n }\n\n if (!enableSlider)\n return <BaseTable {...tableProps} />;\n\n function onClickScroll(direction: 'left' | 'right'): void {\n scroll(scrollIncrement * (direction === 'right' ? 1 : -1));\n }\n\n return (\n <div className='mx-n4 overflow-x-hidden overflow-y-hidden'>\n <div className='px-4'>\n <div className='position-relative'>\n <WidgetButton\n direction={WidgetButtonDirection.Left}\n onClick={() => onClickScroll('left')}\n hide={!scrollState.canScrollLeft}\n />\n <div className={`${styles.scrollContainer} ${props.scrollContainerClassName}`} ref={ref}>\n <BaseTable {...tableProps } />\n </div>\n <WidgetButton\n direction={WidgetButtonDirection.Right}\n onClick={() => onClickScroll('right')}\n hide={!scrollState.canScrollRight}\n />\n </div>\n </div>\n </div>\n );\n}","import { useEffect } from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst SCROLL_TOLERANCE = 400; // value in px\n\ninterface UseInfiniteScrollOptions {\n fetchNextPage: () => void;\n hasMore: boolean;\n isFetching: boolean;\n scrollContainer?: HTMLElement;\n}\n\nexport function useInfiniteScroll(options: UseInfiniteScrollOptions): void {\n const handleScroll = (): void => {\n if (options.isFetching)\n return;\n\n if (!options.scrollContainer) {\n const currentScrollHeight = window.innerHeight + document.documentElement.scrollTop;\n \n const totalHeight = document.documentElement.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n } else {\n const { scrollContainer } = options;\n const currentScrollHeight = scrollContainer.getBoundingClientRect().height + scrollContainer.scrollTop;\n \n const totalHeight = scrollContainer.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n }\n\n options.fetchNextPage();\n };\n\n useEffect(() => {\n const onScroll = FunctionHelper.throttle(handleScroll, 200);\n\n const scrollContainer = options.scrollContainer || window;\n\n if (options.hasMore)\n scrollContainer.addEventListener('scroll', onScroll);\n\n return () => scrollContainer.removeEventListener('scroll', onScroll);\n }, [ options.hasMore, options.fetchNextPage, options.scrollContainer ]);\n}","import { useEffect, useState } from 'react';\n\nimport { HttpStatus, HttpStatusClass } from 'libs/common/backbone/enums/HttpStatus';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { BaseObject, BasePaginatedCollection } from 'libs/shared/interfaces';\n\nimport { useInfiniteScroll } from './UseInfiniteScroll';\nimport { useSelectAllPages } from './UseSelectAllPages';\n\nexport interface UseInfiniteListResult<T extends BaseObject> {\n items: T[];\n hasMore: boolean;\n isFetching: boolean;\n nextCursor: string;\n totalItems?: number;\n hasFirstPageCompleted: boolean;\n}\n\n/**\n * Hook to extract an infinite list from the application state,\n * save it locally in state and only update when new data\n * is fetched.\n * \n * @param getRequest - callback function to get the request for each page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n * \n * @param fetchNext - callback function to fetch a page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n */\nexport function useInfiniteList<TObject = BaseObject, TResponse = BasePaginatedCollection<TObject>>(\n getRequest: ((cursor?: string) => Flight.Request) | false,\n fetchNext: ((cursor?: string) => void) | false,\n onError?: (pageNumber: number, statusCode: HttpStatus) => void,\n getItems?: (responseData: TResponse) => TObject[],\n getCursor?: (responseData: TResponse) => string,\n scrollContainer?: HTMLElement\n): UseInfiniteListResult<TObject> {\n const [ pagesFetched, setPagesFetched ] = useState(0);\n\n const fetchNextFn = fetchNext as (cursor?: string) => void;\n\n function getKey(cursor?: string): string {\n if (!getRequest)\n return null;\n\n const request = getRequest(cursor);\n\n if (!request)\n return null;\n\n return request.key;\n }\n\n const response = useSelectAllPages<TObject, TResponse>(\n getKey,\n getItems,\n getCursor\n );\n\n function fetchNextPage(): void {\n if (!fetchNext || !getRequest || !response)\n return;\n\n setPagesFetched(currentVal => currentVal + 1);\n return fetchNextFn(response.nextCursor);\n }\n\n useInfiniteScroll({\n fetchNextPage,\n hasMore: !!response?.nextCursor,\n isFetching: response?.isFetching,\n scrollContainer\n });\n\n useEffect(() => {\n if (!response)\n return;\n\n if (response.shouldInitialFetch && fetchNext) {\n fetchNextFn();\n setPagesFetched(currentVal => currentVal + 1);\n }\n }, [ response?.shouldInitialFetch, fetchNext ]);\n\n useEffect(() => {\n if (!response?.statusCode || !FunctionHelper.isFunction(onError))\n return;\n\n const httpStatusClass: HttpStatusClass = +(response.statusCode?.toString()?.substr(0, 1));\n\n if (httpStatusClass !== HttpStatusClass.ClientError && httpStatusClass !== HttpStatusClass.ServerError)\n return;\n\n onError(pagesFetched, response.statusCode);\n }, [response?.statusCode]);\n\n return {\n items: response?.items,\n hasMore: !!response?.nextCursor,\n nextCursor: response?.nextCursor,\n isFetching: response?.isFetching,\n totalItems: response?.totalItems,\n hasFirstPageCompleted: response?.hasFirstPageCompleted\n };\n}","import React from 'react';\n\nimport { StorageType } from 'libs/common/backbone/utils/LocalStorageHelper';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { ViewModelKeys } from 'shared/constants/LiteViewModels';\n\nconst namespace = 'lite.shareInsightsAlert';\n\n// eslint-disable-next-line rulesdir/require-view-title\nexport function ShareInsightsAlert() {\n const [ show, setShow ] = useViewModel(\n ViewModelKeys.SHARE_INSIGHTS_ALERT,\n true,\n { storage: StorageType.LocalStorage }\n );\n\n\n const onDismiss = () => {\n setShow(false);\n };\n\n if (!show)\n return <></>;\n\n return (\n <div role='alert' className='d-flex justify-content-between align-items-center bg-light-blue rounded p-2 mb-4'>\n <div>\n <Text namespace={namespace} phrase='sharedByMe' />\n <AppLink\n appLink={{\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.HOME\n }}\n className='text-info'\n >\n <Text namespace={namespace} phrase='myShares' />\n </AppLink>.\n </div>\n <IconButton svgName={cvSvgLibrary.Close} className='text-blue' onClick={onDismiss} />\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"imageColumn\":\"Hs7kk\",\"nameColumn\":\"GRyds\",\"sharedByColumn\":\"fewR0\",\"dateSharedColumn\":\"G6z3W\",\"heading\":\"YxAsH\",\"image\":\"CdUtO\",\"name\":\"pdEW7\",\"avatar\":\"rQ2Dt\",\"date\":\"Lx3Ce\"};","import React from 'react';\n\nimport styles from './shared-with-me-table.scss';\n\nfunction PartialRow(): JSX.Element {\n return (\n <div className={`d-flex striped-row rounded`}>\n <div className={`d-flex align-items-center justify-content-center p-2 ${styles.imageColumn}`}>\n <div className={`partial-loading-background rounded w-100 ${styles.image}`} />\n </div>\n <div className={`d-flex align-items-center p-2 ${styles.nameColumn}`}>\n <div className={`partial-loading-background w-75 ${styles.name}`} />\n </div>\n <div className={`d-flex align-items-center p-2 ${styles.sharedByColumn}`}>\n <div className={`partial-loading-background ${styles.avatar}`} />\n </div>\n <div className={`d-none d-md-flex align-items-center p-2 ${styles.dateSharedColumn}`}>\n <div className={`partial-loading-background ${styles.date}`} />\n </div>\n </div>\n );\n}\n\ninterface PartialHeaderProps {\n fullHeader?: boolean;\n}\n\nfunction PartialHeader(props: PartialHeaderProps): JSX.Element {\n return (\n <div className='d-flex mb-1'>\n <div className={`${styles.imageColumn} p-2`}>\n <div className={`partial-loading-background ${styles.heading}`} />\n </div>\n <div className={`${styles.nameColumn} p-2`}>\n \n </div>\n <div className={`${styles.sharedByColumn} p-2`}>\n {props.fullHeader\n ? <div className={`partial-loading-background ${styles.heading}`} />\n : <> </>\n }\n </div>\n <div className={`${styles.dateSharedColumn} p-2 d-none d-md-flex`}>\n {props.fullHeader\n ? <div className={`partial-loading-background ${styles.heading}`} />\n : <> </>\n }\n </div>\n </div>\n );\n}\n\nexport function PartialSharedWithMeTable(): JSX.Element {\n return (\n <>\n <div className='mb-3'>\n <PartialHeader fullHeader />\n\n <div className='striped-list no-full-width'>\n <PartialRow />\n <PartialRow />\n <PartialRow />\n </div>\n </div>\n\n <div className='mb-3'>\n <PartialHeader />\n\n <div className='striped-list no-full-width'>\n <PartialRow />\n <PartialRow />\n <PartialRow />\n <PartialRow />\n </div>\n </div>\n\n <div className='mb-3'>\n <PartialHeader />\n\n <div className='striped-list no-full-width'>\n <PartialRow />\n <PartialRow />\n <PartialRow />\n <PartialRow />\n <PartialRow />\n <PartialRow />\n <PartialRow />\n <PartialRow />\n <PartialRow />\n <PartialRow />\n </div>\n </div>\n </>\n );\n}","import React from 'react';\nimport { Column } from 'react-table';\nimport { format as formatDate } from 'timeago.js';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { SharedObjectImage } from 'libs/shared/apps/share/components/shared-object-image/SharedObjectImage';\nimport { SharedWithMeResponse } from 'libs/shared/apps/share/interfaces/responses/SharedWithMeResponse';\nimport { ShareHelper } from 'libs/shared/apps/share/utils/ShareHelper';\nimport { ShareViewHelper } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { TitleSubText } from 'libs/shared/components/title-sub-text/TitleSubText';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { Breakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from './shared-with-me-table.scss';\n\nconst namespace = 'share.sharedWithMeTable';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ntype TableDataGroupings = { [date: string]: SharedWithMeResponse[] };\n\ninterface GetColumnsOptions {\n index: number;\n dateHeading: string;\n breakpoints: Breakpoints;\n getObjectAppLink: (data: SharedWithMeResponse) => Core.AppLink;\n imageCdnUrl: string;\n}\n\nexport function getColumns(options: GetColumnsOptions): Column<SharedWithMeResponse>[] {\n const { index, dateHeading, breakpoints, getObjectAppLink, imageCdnUrl } = options;\n\n const isMobile = breakpoints.xs || breakpoints.sm;\n\n const column: Column<SharedWithMeResponse>[] = [\n {\n Header: dateHeading,\n accessor: 'object',\n id: 'image',\n Cell: ({ row: { original } }) => {\n return (\n <SharedObjectImage\n object={original.object}\n appLink={getObjectAppLink(original)}\n locationContext={LocationContext.SharedWithMe}\n showVideoMetadata\n />\n );\n },\n minWidth: 140,\n maxWidth: 30\n },\n {\n accessor: 'object',\n id: 'name',\n Cell: ({ row: { original } }) => {\n function getSubTextPhrase(): string {\n switch (original.object.typeId) {\n case MasterType.Series: return 'series';\n case MasterType.Playlist: return 'playlist';\n }\n }\n\n const subTextPhrase = getSubTextPhrase();\n\n if (original.object?.name) {\n return (\n <div className='clamp-2'>\n {subTextPhrase &&\n <TitleSubText>\n <Text namespace={namespace} phrase={subTextPhrase} />\n </TitleSubText>\n }\n <AppLink\n appLink={getObjectAppLink(original)}\n analyticsData={{ id: original.object?.id, name: original.object?.name }}\n analyticsOptions={{\n entity: ShareViewHelper.getAnalyticsEntity(original.object.type),\n actionType: UserAction.Click,\n location: LocationContext.SharedByMe\n }}\n >\n {original.object.name}\n </AppLink>\n </div>\n );\n }\n\n return <span><Text namespace={namespace} phrase='videoUnavailable' /></span>;\n },\n width: 60\n },\n {\n Header: index === 0 ? getPhrase('sharedBy') : '',\n accessor: 'owner',\n Cell: ({ value }) => (\n <div className='d-flex align-items-center'>\n <div className={`${styles.avatar} flex-shrink-0`}>\n <Avatar\n initials={UserHelper.getInitials(value.name, value.surname)}\n imageUrl={value.avatar?.url}\n imageCdnUrl={imageCdnUrl}\n />\n </div>\n\n {!isMobile && <p className='clamp-1 ms-2'>{`${value.name} ${value.surname}`}</p>}\n </div>\n ),\n width: 40\n },\n !isMobile && {\n Header: index === 0 ? getPhrase('shared') : '',\n id: 'dateShared',\n accessor: s => formatDate(s.dateShared),\n width: 60\n }\n ];\n\n return column.filter(Boolean);\n}\n\nexport function useGetData(data: SharedWithMeResponse[], refreshData: boolean): TableDataGroupings {\n return React.useMemo(() => {\n return ShareHelper.groupByDateShared(data);\n }, [refreshData]);\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { SHARES_TABLE_THEME } from 'libs/shared/apps/share/constants/TableTheme';\nimport { SharedWithMeResponse } from 'libs/shared/apps/share/interfaces/responses/SharedWithMeResponse';\nimport { Table } from 'libs/shared/components/table/Table';\nimport { MasterObjectTypes } from 'libs/shared/enums/MasterObjectTypes';\nimport { Breakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { usePluginHelper } from 'shared/hooks/use-plugin-helper/usePluginHelper';\n\nimport { getColumns, useGetData } from './SharedWithMeTableUtils';\n\nfunction useGetObjectAppLink(): (data: SharedWithMeResponse) => Core.AppLink {\n const { isPlugin } = usePluginHelper();\n\n return (data: SharedWithMeResponse) => {\n const appLink = {\n application: AppChannels.SHARE,\n action: Actions.Share.VIEW_SHARE_LINK,\n args: [data.id]\n };\n\n if (VideoHelper.isVideoType(data.object) && !VideoHelper.getCanBeConsumed(data.object)?.canConsume)\n return null;\n\n if (!isPlugin)\n return appLink;\n \n const shareAppLink: Core.AppLink = {\n application: AppChannels.SHARE,\n action: Actions.Share.SHARE,\n args: [data.id]\n };\n\n if (data.object.type === MasterObjectTypes.Video)\n return { ...shareAppLink, params: { entityType: 'video' } };\n\n if (data.object.type === MasterObjectTypes.Clip)\n return { ...shareAppLink, params: { entityType: 'clip' } };\n\n if (data.object.type === MasterObjectTypes.Interactive)\n return { ...shareAppLink, params: { entityType: 'interactive' } };\n\n return appLink;\n };\n}\n\ninterface SharedWithMeTableProps {\n data: SharedWithMeResponse[];\n\n /**\n * As the table data is memoized, it must be prompted to recalculate.\n * Toggle `refreshTable` to do so.\n */\n refreshTable: boolean;\n breakpoints: Breakpoints;\n imageCdnUrl: string;\n}\n\nexport function SharedWithMeTable(props: SharedWithMeTableProps): JSX.Element {\n const tableData = useGetData(props.data, props.refreshTable);\n const getObjectAppLink = useGetObjectAppLink();\n\n return (\n <>\n {Object.keys(tableData).map((heading, index) => (\n <Table\n key={index}\n columns={getColumns({\n index,\n dateHeading: heading,\n breakpoints: props.breakpoints,\n getObjectAppLink,\n imageCdnUrl: props.imageCdnUrl\n })}\n data={tableData[heading]}\n theme={SHARES_TABLE_THEME}\n />\n ))}\n </>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'share.sharedWithMeEmptyState';\n\nconst cta = {\n application: AppChannels.DASHBOARD,\n action: Actions.Dashboard.HOME\n};\n\nexport function SharedWithMeEmptyState(): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.Share.SHARED_WITH_ME} size='small'/>\n <EmptyState.Heading><Text phrase='heading' /></EmptyState.Heading>\n <EmptyState.Info><Text phrase='info' /></EmptyState.Info>\n <EmptyState.Cta appLink={cta} text={LanguageService.getPhrase(namespace, 'cta')} />\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\n\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { SharedWithMeResponse } from 'libs/shared/apps/share/interfaces/responses/SharedWithMeResponse';\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { useInfiniteList } from 'libs/shared/hooks/UseInfiniteList';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config } from 'libs/shared/interfaces';\n\nimport { ShareInsightsAlert } from 'apps/share/components/share-insights-alert/ShareInsightsAlert';\nimport { PartialSharedWithMeTable } from 'apps/share/components/shared-with-me-table/PartialSharedWithMeTable';\nimport { SharedWithMeTable } from 'apps/share/components/shared-with-me-table/SharedWithMeTable';\nimport { SharesHeader } from 'apps/share/components/shares-header/SharesHeader';\n\nimport { SharedWithMeEmptyState } from './empty-state/SharedWithMeEmptyState';\n\nconst namespace = 'liteShare.sharedWithMe';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function SharedWithMeView(): JSX.Element {\n const { hasPermissions } = usePermissions();\n const { hasShareFlowV2 } = useSettings(null);\n const dispatch = useDispatch();\n const breakpoints = useBreakpoints();\n\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const getRequest = (cursor?: string) => ShareRequests.getObjectsSharedWithUser(cursor);\n const fetchNext = (cursor?: string) => Flight.getFetch(dispatch)(getRequest(cursor));\n\n const {\n items: sharedWithMe,\n hasMore,\n isFetching,\n nextCursor\n } = useInfiniteList<SharedWithMeResponse>(getRequest, fetchNext);\n\n useSetPageMetadata({ title: getPhrase('sharedWithMe') });\n\n if (hasPermissions(PermissionName.StudentExperience)) {\n Core.ErrorHelper.throw(new NotFoundError());\n return <></>;\n }\n\n return (\n <div className='px-3'>\n {!(hasShareFlowV2 && hasPermissions(PermissionName.ViewMyShares))\n ? <SharesHeader />\n : (\n <div>\n <ShareInsightsAlert />\n <h1 className='h2 mb-3'><Text namespace={namespace} phrase='sharedWithMe' /></h1>\n </div>\n )\n }\n\n {(() => {\n if (!sharedWithMe || !config.data)\n return <PartialSharedWithMeTable />;\n\n if (!sharedWithMe?.length)\n return <SharedWithMeEmptyState />;\n\n return (\n <>\n <SharedWithMeTable\n data={sharedWithMe}\n refreshTable={isFetching}\n breakpoints={breakpoints}\n imageCdnUrl={config.data?.imageCdnUrl}\n />\n {(hasMore || isFetching) &&\n <InfiniteScrollFooter isFetching={isFetching} fetchNext={fetchNext} nextCursor={nextCursor} />\n }\n </>\n );\n })()}\n </div>\n );\n}"],"names":["DragOverlayStyles","opacity","cursor","calculateScrollState","ref","canScrollLeft","current","scrollLeft","canScrollRight","scrollWidth","clientWidth","SortIndicator","props","column","canSort","className","isSorted","theme","sortIndicator","SvgContainer","svgName","isSortedDesc","size","S","BaseTable","ids","idHash","tableOptions","columns","data","disableSortBy","enableSort","manualSortBy","manualSort","autoResetHiddenColumns","autoResetSortBy","initialState","sortBy","initialSortBy","initialSelectedRowIds","selectedRowIds","forEach","id","getRowId","useTable","plugins","useSortBy","useRowSelect","layout","useFlexLayout","useBlockLayout","allowFiltering","useFilters","allowGlobalFiltering","useGlobalFilter","getPlugins","getTableProps","getTableBodyProps","headerGroups","rows","prepareRow","toggleAllRowsSelected","setGlobalFilter","setHiddenColumns","state","renderTableRows","map","row","FunctionHelper","isSelected","selectedRow","onSelectRow","enableSortableRows","getTableRowsClass","rowAppLink","getRowAppLink","onClickRow","allowSelectMultipleRows","toggleRowSelected","renderRow","sortableProps","dragAttributes","dragListeners","getSortableProps","role","key","AppLink","appLink","renderCells","onClick","rowProps","getRowProps","SortableItemWrapper","original","childProps","childComponent","cells","cell","cellClassName","onSelectCell","getCellClassName","getCellProps","render","onSort","globalFilter","hiddenColumns","length","table","header","headerGroup","getHeaderGroupProps","headerRow","headers","getHeaderProps","getSortByToggleProps","headerCell","renderSortIndicator","hideSortIndicator","body","SortableContainerWrapper","getDragOverlay","rowIndex","findIndex","item","style","onSortEnd","onSortingRowsEnd","Table","enableSlider","scrollIncrement","scrollable","tableProps","elRef","scrollState","setScrollState","throttledOnScroll","el","removeEventListener","addEventListener","scroll","scrollBy","left","top","behavior","useTableScroll","renderTrackHorizontal","autoHeightMax","autoHeight","onClickScroll","direction","WidgetButton","W","hide","scrollContainerClassName","defaultProps","SCROLL_TOLERANCE","useInfiniteList","getRequest","fetchNext","onError","getItems","getCursor","scrollContainer","options","handleScroll","useState","pagesFetched","setPagesFetched","fetchNextFn","response","request","fetchNextPage","currentVal","nextCursor","hasMore","isFetching","getBoundingClientRect","height","scrollTop","scrollHeight","window","innerHeight","document","documentElement","useEffect","onScroll","shouldInitialFetch","statusCode","httpStatusClass","toString","substr","HttpStatus","items","totalItems","hasFirstPageCompleted","namespace","ShareInsightsAlert","storage","show","setShow","Text","phrase","application","action","IconButton","PartialRow","PartialHeader","fullHeader","PartialSharedWithMeTable","getPhrase","LanguageService","getColumns","index","dateHeading","breakpoints","getObjectAppLink","imageCdnUrl","isMobile","xs","sm","Header","accessor","Cell","SharedObjectImage","object","locationContext","showVideoMetadata","minWidth","maxWidth","subTextPhrase","typeId","MasterType","getSubTextPhrase","name","TitleSubText","analyticsData","analyticsOptions","entity","ShareViewHelper","type","actionType","location","width","value","Avatar","initials","UserHelper","surname","imageUrl","avatar","url","s","dateShared","filter","Boolean","SharedWithMeTable","refreshData","isPlugin","tableData","refreshTable","ShareHelper","usePluginHelper","args","VideoHelper","canConsume","shareAppLink","MasterObjectTypes","params","entityType","Object","keys","heading","cta","SharedWithMeEmptyState","EmptyState","src","ImageUrls","text","SharedWithMeView","hasPermissions","usePermissions","hasShareFlowV2","useSettings","dispatch","useBreakpoints","config","ConfigRequests","ShareRequests","sharedWithMe","useSetPageMetadata","title","PermissionName","NotFoundError","SharesHeader","InfiniteScrollFooter"],"sourceRoot":""}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
/*! For license information please see 6135-a878a9cff0-lite.chunk.js.LICENSE.txt */
|
|
2
|
-
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[6135],{34055:(e,t,r)=>{r.d(t,{W:()=>g});var n=r(32735),a=r(92869),o=r(81886),i=r(31453),c=r(1048),s=r(49985),l=r(65858),u=r(83914),m=r(28329),f=r(43132),d=r(75795),p=r(35223);const h={searchSvg:"NXv7I",searchInput:"ntGKR"};function y(e){return y="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},y(e)}function v(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}function g(e){var t,r,g,b=d.O.getCurrentRoute().appLink.params,E=(r=n.useState(null!==(t=null==b?void 0:b[e.queryParamName])&&void 0!==t?t:""),g=2,function(e){if(Array.isArray(e))return e}(r)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,o,i,c=[],s=!0,l=!1;try{if(o=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;s=!1}else for(;!(s=(n=o.call(r)).done)&&(c.push(n.value),c.length!==t);s=!0);}catch(e){l=!0,a=e}finally{try{if(!s&&null!=r.return&&(i=r.return(),Object(i)!==i))return}finally{if(l)throw a}}return c}}(r,g)||function(e,t){if(e){if("string"==typeof e)return v(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?v(e,t):void 0}}(r,g)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),S=E[0],w=E[1];n.useEffect((function(){var t,r,n;b&&(b[e.queryParamName]?w(null!==(r=null===(t=b[e.queryParamName])||void 0===t?void 0:t.trim())&&void 0!==r?r:""):S.length&&!(null===(n=b[e.queryParamName])||void 0===n?void 0:n.length)&&w(""))}),[e.id]),n.useEffect((function(){(null==b?void 0:b[e.queryParamName])&&(null==b?void 0:b[e.queryParamName])!==S&&w(null==b?void 0:b[e.queryParamName])}),[null==b?void 0:b[e.queryParamName]]);var C=(0,m.N)(S,e.debounceTime);n.useEffect((function(){!function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";if(t!==b[e.queryParamName]&&(t||b[e.queryParamName])){var r=c.t.omit(b,[e.queryParamName,"cursor"]),n=Object.assign(function(e,t,r){return(t=function(e){var t=function(e){if("object"!=y(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var r=t.call(e,"string");if("object"!=y(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==y(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}({},e.queryParamName,t.trim()?t.trimLeft():""),r);n[e.queryParamName]||(delete n[e.queryParamName],delete n.cursor),a.t.preventScrollTop(),e.analyticsOptions&&s.k.logUserAction({query:t,indices:e.searchIndices},s.k.mergeOptions(e.analyticsOptions,{actionType:l.Vw.InstantSearch,workflowPhase:l.eu.Complete})),o.Q.C$.trigger(Object.assign(Object.assign({},e.searchAppLink),{params:n}))}}(C)}),[C]);var O=(0,f.s)({query:S,indices:e.searchIndices,analyticsOptions:e.analyticsOptions,shouldLog:!!e.analyticsOptions}).log;return n.createElement("div",{className:"position-relative w-100"},n.createElement("input",{name:e.name,type:"text",className:(0,i.A)("form-control pe-2 w-100 border-dark ".concat(h.searchInput),"lg"===e.size&&"form-control-lg",e.className),id:e.id,autoComplete:"off",placeholder:e.placeholder,"aria-label":"Search",onChange:function(e){w(e.target.value)},onBlur:function(e){var t;return O(null!==(t=e.target.value)&&void 0!==t?t:"")},value:S}),n.createElement(u.x,{svgName:p.vn.Search,className:"".concat(h.searchSvg," svg-container cursor-pointer text-dark")}))}g.defaultProps={debounceTime:300,queryParamName:"query"}},38502:(e,t,r)=>{r.d(t,{r:()=>m});var n=r(32735),a=r(49985),o=r(15611),i=r(18559),c=r(11607),s=r(83914),l=r(22771);function u(e){return n.createElement(n.Fragment,null,!!e.tab.svgName&&n.createElement("div",{className:e.tab.name?"pe-1":""},n.createElement(s.x,{svgName:e.tab.svgName})),e.tab.name,"number"==typeof e.tab.count&&n.createElement("div",{className:"ps-2"},n.createElement(i.C,{type:i.g.Count,data:e.tab.count})))}function m(e){var t;return n.createElement("nav",{className:null!==(t=e.className)&&void 0!==t?t:"",ref:e.containerRef},n.createElement("ul",{className:"\n list-unstyled d-inline-block m-0 ".concat(l.Z.pillTabSelector,"\n ").concat(e.borderRadius?l.Z.radiusSmall:"","\n ").concat(e.listClassName,"\n ")},e.tabs.map((function(e,t){return n.createElement("li",{className:"\n p-0 ".concat(l.Z.tab," ").concat(e.active?"btn btn-dark":"btn btn-outline-dark","\n ").concat(e.name?l.Z.minWidth:""," ").concat(e.className,"\n "),key:t},e.appLink?n.createElement(o.F,{appLink:e.appLink,analyticsData:e.analyticsData,analyticsOptions:e.analyticsOptions,className:"\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ".concat(l.Z.tabLink,"\n ")},n.createElement(u,{tab:e})):n.createElement(c.L,{className:"\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ".concat(l.Z.tabLink,"\n "),onClick:function(){return function(e){!e.active&&e.onSelect&&(e.onSelect(),e.analyticsData&&e.analyticsOptions&&a.k.logUserAction(e.analyticsData,e.analyticsOptions))}(e)}},n.createElement(u,{tab:e})))}))))}m.defaultProps={borderRadius:"lg"}},28469:(e,t,r)=>{r.d(t,{P:()=>o});var n=r(32735),a=r(23481).T.encloseNamespace("rostering.alert");function o(e){var t="classroom"===e.type?a("classroom"):a("hasRostering");return n.createElement("div",{className:"alert text-info bg-light-blue px-2 rounded-3 fw-semibold py-2 d-flex flex-wrap"},t," ")}},58739:(e,t,r)=>{var n;r.d(t,{K:()=>n}),function(e){e[e.Submitted=0]="Submitted",e[e.Queued=1]="Queued",e[e.Pending=2]="Pending",e[e.InProgress=3]="InProgress",e[e.Completed=4]="Completed",e[e.CompletedWithError=5]="CompletedWithError",e[e.Failed=6]="Failed"}(n||(n={}))},44538:(e,t,r)=>{r.d(t,{K:()=>c});var n=r(99940),a=r(97395),o=r(58739),i=r(38389),c={getRostering:function(){return{url:"{gateway}/v1/users/me/rostering",key:"rostering"}},getSyncList:function(e){var t={};if(e.cursor&&(t.cursor=e.cursor),e.sort&&("oldest"===e.sort?t.order="ASC":t.order="DESC"),e.jobStatus){var r=[];e.jobStatus.includes("completed")&&r.push.apply(r,[o.K.Completed,o.K.CompletedWithError]),e.jobStatus.includes("failed")&&r.push(o.K.Failed),e.jobStatus.includes("inProgress")&&r.push.apply(r,[o.K.Submitted,o.K.Queued,o.K.Pending,o.K.InProgress]),t.status=r}return t.type=i.m.Rostering,{url:a._.urlBuilder("{gateway}/v1/batch/jobs",t),key:"rostering:sync:".concat(e.cursor,":").concat(e.sort,":").concat(e.jobStatus)}},createJob:function(e,t,r){return{url:"{gateway}/v1/batch/jobs",key:"rostering:sync",type:n.k.POST,invalidationKeys:["rostering:sync"],data:e,success:t,error:r}},getJobSummary:function(e){return{url:"{gateway}/v1/batch/jobs/".concat(e,"/summary"),key:"job:summary:".concat(e)}},getSyncScheduleSettings:function(e){return{url:"{gateway}/v1/rostering/".concat(e,"/schedule"),key:"sync-settings:".concat(e)}},updateScheduleSetting:function(e,t,r,a,o){return{type:n.k.PUT,url:"{gateway}/v1/rostering/".concat(t,"/schedule"),key:"update:sync-settings:".concat(e.customerId,":").concat(t),invalidationKeys:["sync-settings:".concat(t)],data:e,success:r,error:a,always:o}}}},91286:(e,t,r)=>{r.d(t,{v:()=>i});var n=r(32735),a=r(94644);function o(e){return e.map((function(e){return e.statusCode})).join(":")}function i(e,t,r){var i=Array.isArray(e)?e:[e];(0,n.useEffect)((function(){i.forEach((function(e){(0,a.r)(e.statusCode,t,r)}))}),[o(i),t,r])}},59278:(e,t,r)=>{r.d(t,{d:()=>h});var n=r(32735),a=r(23481),o=r(83657),i=r(38502),c=r(28469),s=r(83345),l=r(79967),u=r(14070),m=r(97291);const f={searchContainer:"rwTB7"};var d="classrooms.classroomsHeader",p=a.T.encloseNamespace(d);function h(e){var t,r=(0,l.k)(),a=r.xs||r.sm,h=[{name:p("classroomsTab"),appLink:{application:m.O.CLASSROOMS,action:u.e.Classrooms.HOME},active:"classrooms"===e.activeTab}];return e.hasShareFlowV2&&h.push({name:p("openClassroomsTab"),appLink:{application:m.O.CLASSROOMS,action:u.e.Classrooms.OPEN_CLASSROOMS},active:"open-classrooms"===e.activeTab}),n.createElement("div",null,!!e.hasRostering&&n.createElement("div",{className:"my-3"},n.createElement(c.P,{type:"general"})),n.createElement("div",{className:"d-flex align-items-center mb-3"},n.createElement("h1",{className:"flex-fill h2 me-3 my-1"},n.createElement(s.x,{namespace:d,phrase:"heading"})),e.searchBar&&n.createElement("div",{className:"d-flex"},!a&&n.createElement("div",{className:"".concat(f.searchContainer," d-flex mb-2 mb-sm-0 me-2")},e.searchBar),n.createElement(o.e,{actions:null!==(t=e.actions)&&void 0!==t?t:[],actionsDropdownClassName:"btn btn-outline-dark"}))),h.length>1&&n.createElement("div",{className:"mb-3"},n.createElement(i.r,{tabs:h})),a&&e.searchBar?n.createElement("div",{className:"mb-3"},e.searchBar):null)}},63578:(e,t,r)=>{r.d(t,{Y:()=>f});var n=r(70680),a=r(23481),o=r(20354),i=r(94644),c=r(31949),s=r(69883),l=r(60115),u=r(88630),m=r(1211),f=function(e,t){var r=o.a.useBasicFetch(c.N.currentUser()),f=(0,s.Z)(),d=(0,n.I0)(),p=function(n){return e?(null==t?void 0:t.withStudentsCount)?m.J.searchClassroomsV4(e,n):m.J.searchClassrooms(e,r.data.customerId,n):(null==t?void 0:t.withStudentsCount)?u.F.getPublishedWithStudents(r.data.id,n):u.F.getPublished(r.data.id,n)},h=function(e){return o.a.getFetch(d)(p(e))},y=(0,l.K)(!!r.data&&p,h,(function(e,t){if(1===e)return(0,i.r)(t);f.error(a.T.getPhrase("classrooms.hooks","error"))}),(function(t){return e?t.results:t.data}));return Object.assign(Object.assign({},y),{fetchNext:h})}},86828:(e,t,r)=>{r.r(t),r.d(t,{ClassroomsView:()=>V});var n=r(32735),a=r(23481),o=r(81886),i=r(20354),c=r(65858),s=r(34055),l=r(87801),u=r(83345),m=r(16714),f=r(67058),d=r(39151),p=r(44538),h=r(31949),y=r(79967),v=r(91286),g=r(22902),b=r(79612),E=r(37802),S=r(35223),w=r(14070),C=r(97291),O=r(59278),N=r(90681),x=r(19948),L=r(88630),k=r(63578),P=r(97958),j=r(99742),T="classrooms.classroomsEmptyState";function A(e){var t=e.query;return n.createElement(u.D.Provider,{value:T},n.createElement(P.u,null,n.createElement(P.u.Image,{src:j.W.EmptyStates.Classrooms.CLASSROOMS}),n.createElement(P.u.Heading,null,n.createElement(u.x,{phrase:"empty",options:{query:t}}))))}var F="classrooms.classroomsEmptyState";function R(){return n.createElement(u.D.Provider,{value:F},n.createElement(P.u,null,n.createElement(P.u.Image,{src:j.W.EmptyStates.Classrooms.CLASSROOMS}),n.createElement(P.u.Heading,null,n.createElement(u.x,{phrase:"heading"})),n.createElement(P.u.Info,null,n.createElement(u.x,{phrase:"info"})),n.createElement(P.u.Cta,{text:a.T.getPhrase(F,"cta"),icon:S.vn.Plus,appLink:{application:C.O.CLASSROOMS,action:w.e.Classrooms.NEW_CLASSROOM}})))}function _(e){return _="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_(e)}function q(){q=function(){return t};var e,t={},r=Object.prototype,n=r.hasOwnProperty,a=Object.defineProperty||function(e,t,r){e[t]=r.value},o="function"==typeof Symbol?Symbol:{},i=o.iterator||"@@iterator",c=o.asyncIterator||"@@asyncIterator",s=o.toStringTag||"@@toStringTag";function l(e,t,r){return Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{l({},"")}catch(e){l=function(e,t,r){return e[t]=r}}function u(e,t,r,n){var o=t&&t.prototype instanceof v?t:v,i=Object.create(o.prototype),c=new j(n||[]);return a(i,"_invoke",{value:x(e,r,c)}),i}function m(e,t,r){try{return{type:"normal",arg:e.call(t,r)}}catch(e){return{type:"throw",arg:e}}}t.wrap=u;var f="suspendedStart",d="suspendedYield",p="executing",h="completed",y={};function v(){}function g(){}function b(){}var E={};l(E,i,(function(){return this}));var S=Object.getPrototypeOf,w=S&&S(S(T([])));w&&w!==r&&n.call(w,i)&&(E=w);var C=b.prototype=v.prototype=Object.create(E);function O(e){["next","throw","return"].forEach((function(t){l(e,t,(function(e){return this._invoke(t,e)}))}))}function N(e,t){function r(a,o,i,c){var s=m(e[a],e,o);if("throw"!==s.type){var l=s.arg,u=l.value;return u&&"object"==_(u)&&n.call(u,"__await")?t.resolve(u.__await).then((function(e){r("next",e,i,c)}),(function(e){r("throw",e,i,c)})):t.resolve(u).then((function(e){l.value=e,i(l)}),(function(e){return r("throw",e,i,c)}))}c(s.arg)}var o;a(this,"_invoke",{value:function(e,n){function a(){return new t((function(t,a){r(e,n,t,a)}))}return o=o?o.then(a,a):a()}})}function x(t,r,n){var a=f;return function(o,i){if(a===p)throw Error("Generator is already running");if(a===h){if("throw"===o)throw i;return{value:e,done:!0}}for(n.method=o,n.arg=i;;){var c=n.delegate;if(c){var s=L(c,n);if(s){if(s===y)continue;return s}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(a===f)throw a=h,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);a=p;var l=m(t,r,n);if("normal"===l.type){if(a=n.done?h:d,l.arg===y)continue;return{value:l.arg,done:n.done}}"throw"===l.type&&(a=h,n.method="throw",n.arg=l.arg)}}}function L(t,r){var n=r.method,a=t.iterator[n];if(a===e)return r.delegate=null,"throw"===n&&t.iterator.return&&(r.method="return",r.arg=e,L(t,r),"throw"===r.method)||"return"!==n&&(r.method="throw",r.arg=new TypeError("The iterator does not provide a '"+n+"' method")),y;var o=m(a,t.iterator,r.arg);if("throw"===o.type)return r.method="throw",r.arg=o.arg,r.delegate=null,y;var i=o.arg;return i?i.done?(r[t.resultName]=i.value,r.next=t.nextLoc,"return"!==r.method&&(r.method="next",r.arg=e),r.delegate=null,y):i:(r.method="throw",r.arg=new TypeError("iterator result is not an object"),r.delegate=null,y)}function k(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function P(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function j(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(k,this),this.reset(!0)}function T(t){if(t||""===t){var r=t[i];if(r)return r.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var a=-1,o=function r(){for(;++a<t.length;)if(n.call(t,a))return r.value=t[a],r.done=!1,r;return r.value=e,r.done=!0,r};return o.next=o}}throw new TypeError(_(t)+" is not iterable")}return g.prototype=b,a(C,"constructor",{value:b,configurable:!0}),a(b,"constructor",{value:g,configurable:!0}),g.displayName=l(b,s,"GeneratorFunction"),t.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===g||"GeneratorFunction"===(t.displayName||t.name))},t.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,b):(e.__proto__=b,l(e,s,"GeneratorFunction")),e.prototype=Object.create(C),e},t.awrap=function(e){return{__await:e}},O(N.prototype),l(N.prototype,c,(function(){return this})),t.AsyncIterator=N,t.async=function(e,r,n,a,o){void 0===o&&(o=Promise);var i=new N(u(e,r,n,a),o);return t.isGeneratorFunction(r)?i:i.next().then((function(e){return e.done?e.value:i.next()}))},O(C),l(C,s,"Generator"),l(C,i,(function(){return this})),l(C,"toString",(function(){return"[object Generator]"})),t.keys=function(e){var t=Object(e),r=[];for(var n in t)r.push(n);return r.reverse(),function e(){for(;r.length;){var n=r.pop();if(n in t)return e.value=n,e.done=!1,e}return e.done=!0,e}},t.values=T,j.prototype={constructor:j,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=e,this.done=!1,this.delegate=null,this.method="next",this.arg=e,this.tryEntries.forEach(P),!t)for(var r in this)"t"===r.charAt(0)&&n.call(this,r)&&!isNaN(+r.slice(1))&&(this[r]=e)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var r=this;function a(n,a){return c.type="throw",c.arg=t,r.next=n,a&&(r.method="next",r.arg=e),!!a}for(var o=this.tryEntries.length-1;o>=0;--o){var i=this.tryEntries[o],c=i.completion;if("root"===i.tryLoc)return a("end");if(i.tryLoc<=this.prev){var s=n.call(i,"catchLoc"),l=n.call(i,"finallyLoc");if(s&&l){if(this.prev<i.catchLoc)return a(i.catchLoc,!0);if(this.prev<i.finallyLoc)return a(i.finallyLoc)}else if(s){if(this.prev<i.catchLoc)return a(i.catchLoc,!0)}else{if(!l)throw Error("try statement without catch or finally");if(this.prev<i.finallyLoc)return a(i.finallyLoc)}}}},abrupt:function(e,t){for(var r=this.tryEntries.length-1;r>=0;--r){var a=this.tryEntries[r];if(a.tryLoc<=this.prev&&n.call(a,"finallyLoc")&&this.prev<a.finallyLoc){var o=a;break}}o&&("break"===e||"continue"===e)&&o.tryLoc<=t&&t<=o.finallyLoc&&(o=null);var i=o?o.completion:{};return i.type=e,i.arg=t,o?(this.method="next",this.next=o.finallyLoc,y):this.complete(i)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),y},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),P(r),y}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var a=n.arg;P(r)}return a}}throw Error("illegal catch attempt")},delegateYield:function(t,r,n){return this.delegate={iterator:T(t),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=e),y}},t}var I=function(e,t,r,n){return new(r||(r=Promise))((function(a,o){function i(e){try{s(n.next(e))}catch(e){o(e)}}function c(e){try{s(n.throw(e))}catch(e){o(e)}}function s(e){var t;e.done?a(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(i,c)}s((n=n.apply(e,t||[])).next())}))},M="classrooms.classrooms",B=a.T.encloseNamespace(M),K=C.O.CLASSROOMS,W={application:K,action:w.e.Classrooms.NEW_CLASSROOM},G={link:{application:K,action:w.e.Classrooms.GENERATE_JOIN_LINK},archive:{application:K,action:w.e.Classrooms.ARCHIVE_CLASSROOM},edit:{application:K,action:w.e.Classrooms.EDIT_CLASSROOM},classroom:{application:K,action:w.e.Classrooms.CLASSROOM_HOME}};function D(){return n.createElement(s.W,{id:"classroom-search",searchAppLink:{application:C.O.CLASSROOMS,action:w.e.Classrooms.HOME},searchIndices:["classroom"],analyticsOptions:{entity:c.py.Classroom,location:c.LZ.ClassroomsList},placeholder:B("searchBarPlaceholder")})}function V(e){var t,r,s,w,C=(0,E.r)(null).hasShareFlowV2,P=(0,g.T)().hasPermissions,j=(0,y.k)();(0,b.M)({title:B("pageTitle")});var T=i.a.useGetFetchAsync(),F=i.a.useBasicFetch(h.N.currentUser()),_=i.a.useBasicFetch(d.L.config()),K=i.a.useBasicFetch(p.K.getRostering()),V=(null===(t=K.data)||void 0===t?void 0:t.status)&&"None"!==K.data.status,Z=i.a.useBasicFetch(L.F.getPinnedClassrooms(null===(r=F.data)||void 0===r?void 0:r.id,null===(s=F.data)||void 0===s?void 0:s.customerId)),H=(0,k.Y)(e.query);function U(e,t,r,n){return I(this,void 0,void 0,q().mark((function a(){var o;return q().wrap((function(a){for(;;)switch(a.prev=a.next){case 0:return o=t?L.F.pinClassroom:L.F.unpinClassroom,a.prev=1,a.next=4,T(o(e));case 4:r(),a.next=10;break;case 7:a.prev=7,a.t0=a.catch(1),n();case 10:case"end":return a.stop()}}),a,null,[[1,7]])})))}if((0,v.v)(Z),!P(m.C.ViewClassrooms))return o.Q.Ry.throw(new f.d),n.createElement(n.Fragment,null);var J=!!(null===(w=null==H?void 0:H.items)||void 0===w?void 0:w.length);return n.createElement(u.D.Provider,{value:M},n.createElement("div",{className:"px-3"},n.createElement(O.d,{searchBar:J||e.query?n.createElement(D,null):null,actions:[{label:a.T.getPhrase(M,"newClassroom"),appLink:W,svgName:S.vn.Plus,className:"btn btn-outline-dark",disabled:V,tooltip:V?B("disabledByRostering"):"",analyticsOptions:{actionType:c.Vw.Create,entity:c.py.Classroom,workflowPhase:c.eu.Start,location:c.LZ.ClassroomsList},button:!j.xs}],activeTab:"classrooms",hasRostering:V,hasShareFlowV2:C}),function(){var t,r;return H.items&&Z.hasCompleted&&K.hasCompleted?J||e.query?!J&&e.query?n.createElement(A,{query:e.query}):n.createElement(n.Fragment,null,n.createElement(N.D,{pinnedClassrooms:null!==(r=null===(t=Z.data)||void 0===t?void 0:t.data)&&void 0!==r?r:[],allClassrooms:H.items,query:e.query,imageCdnUrl:_.data.imageCdnUrl,appLinks:G,onTogglePin:U,refreshTable:H.isFetching,currentUser:F.data,hasRostering:V}),(H.isFetching||H.nextCursor)&&n.createElement(l._,{isFetching:H.isFetching,fetchNext:H.fetchNext,nextCursor:H.nextCursor})):n.createElement(R,null):n.createElement(x.I,null)}()))}},22771:(e,t,r)=>{r.d(t,{Z:()=>n});const n={pillTabSelector:"Hdi6o",tab:"RvNxr",minWidth:"GHSz9",radiusSmall:"VhJJa",tabLink:"WFyvo"}}}]);
|
|
3
|
-
//# sourceMappingURL=6135-a878a9cff0-lite.chunk.js.map
|