@clickview/lite 0.70.1-dev.5 → 0.70.1-dev.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/dist/bundles.json +1 -1
  2. package/dist/css/{9583-lite-9eda71423d.chunk.css → 3878-lite-877e596a24.chunk.css} +3 -0
  3. package/dist/css/{5797-lite-1dfd2c337d.chunk.css → 5099-lite-7d7c063e62.chunk.css} +3 -0
  4. package/dist/css/{8191-lite-ee877f2ecd.chunk.css → 6984-lite-53c3fa4d18.chunk.css} +3 -0
  5. package/dist/css/{8723-lite-676baa8218.chunk.css → 7103-lite-ee0c975440.chunk.css} +3 -0
  6. package/dist/css/{7783-lite-1dfd2c337d.chunk.css → 7394-lite-7d7c063e62.chunk.css} +3 -0
  7. package/dist/css/7502-lite-9b2ed5bd56.chunk.css +4 -0
  8. package/dist/css/{5721-lite-9eda71423d.chunk.css → 7548-lite-877e596a24.chunk.css} +3 -0
  9. package/dist/css/{549-lite-b49bde8e4d.chunk.css → 7657-lite-ad909396f3.chunk.css} +3 -1
  10. package/dist/css/{6783-lite-e85973335b.chunk.css → 829-lite-27b58d07b3.chunk.css} +3 -0
  11. package/dist/css/{5635-lite-ee877f2ecd.chunk.css → 9673-lite-53c3fa4d18.chunk.css} +3 -0
  12. package/dist/scripts/1107-0fb4769540-lite.chunk.js +2 -0
  13. package/dist/scripts/1107-0fb4769540-lite.chunk.js.map +1 -0
  14. package/dist/scripts/1437-658ad1fe2b-lite.chunk.js +2 -0
  15. package/dist/scripts/1437-658ad1fe2b-lite.chunk.js.map +1 -0
  16. package/dist/scripts/1710-ef798f1e0d-lite.chunk.js +2 -0
  17. package/dist/scripts/1710-ef798f1e0d-lite.chunk.js.map +1 -0
  18. package/dist/scripts/2024-4fec8f175b-lite.chunk.js +2 -0
  19. package/dist/scripts/2024-4fec8f175b-lite.chunk.js.map +1 -0
  20. package/dist/scripts/2435-a846651e83-lite.chunk.js +2 -0
  21. package/dist/scripts/2435-a846651e83-lite.chunk.js.map +1 -0
  22. package/dist/scripts/2809-84ce060e14-lite.chunk.js +2 -0
  23. package/dist/scripts/2809-84ce060e14-lite.chunk.js.map +1 -0
  24. package/dist/scripts/3878-45fd0861cc-lite.chunk.js +2 -0
  25. package/dist/scripts/3878-45fd0861cc-lite.chunk.js.map +1 -0
  26. package/dist/scripts/4096-c834372efb-lite.chunk.js +2 -0
  27. package/dist/scripts/4096-c834372efb-lite.chunk.js.map +1 -0
  28. package/dist/scripts/4456-ada4977b41-lite.chunk.js +2 -0
  29. package/dist/scripts/4456-ada4977b41-lite.chunk.js.map +1 -0
  30. package/dist/scripts/4806-a05a2a3012-lite.chunk.js +2 -0
  31. package/dist/scripts/4806-a05a2a3012-lite.chunk.js.map +1 -0
  32. package/dist/scripts/5099-297f8cd028-lite.chunk.js +2 -0
  33. package/dist/scripts/5099-297f8cd028-lite.chunk.js.map +1 -0
  34. package/dist/scripts/5829-903613bbf0-lite.chunk.js +3 -0
  35. package/dist/scripts/5829-903613bbf0-lite.chunk.js.map +1 -0
  36. package/dist/scripts/5925-937fec8a93-lite.chunk.js +2 -0
  37. package/dist/scripts/5925-937fec8a93-lite.chunk.js.map +1 -0
  38. package/dist/scripts/6459-ac139cb154-lite.chunk.js +2 -0
  39. package/dist/scripts/6459-ac139cb154-lite.chunk.js.map +1 -0
  40. package/dist/scripts/6629-4edaed39c8-lite.chunk.js +3 -0
  41. package/dist/scripts/6629-4edaed39c8-lite.chunk.js.map +1 -0
  42. package/dist/scripts/6984-9d8b378bcc-lite.chunk.js +2 -0
  43. package/dist/scripts/6984-9d8b378bcc-lite.chunk.js.map +1 -0
  44. package/dist/scripts/7103-ef79582538-lite.chunk.js +2 -0
  45. package/dist/scripts/7103-ef79582538-lite.chunk.js.map +1 -0
  46. package/dist/scripts/7394-5448807e14-lite.chunk.js +2 -0
  47. package/dist/scripts/7394-5448807e14-lite.chunk.js.map +1 -0
  48. package/dist/scripts/7502-78b085caad-lite.chunk.js +2 -0
  49. package/dist/scripts/7502-78b085caad-lite.chunk.js.map +1 -0
  50. package/dist/scripts/7548-5eb0d3b7a0-lite.chunk.js +2 -0
  51. package/dist/scripts/7548-5eb0d3b7a0-lite.chunk.js.map +1 -0
  52. package/dist/scripts/7593-cc4e09c847-lite.chunk.js +2 -0
  53. package/dist/scripts/7593-cc4e09c847-lite.chunk.js.map +1 -0
  54. package/dist/scripts/7657-e302fda4f2-lite.chunk.js +2 -0
  55. package/dist/scripts/7657-e302fda4f2-lite.chunk.js.map +1 -0
  56. package/dist/scripts/8057-431c6be34c-lite.chunk.js +2 -0
  57. package/dist/scripts/8057-431c6be34c-lite.chunk.js.map +1 -0
  58. package/dist/scripts/8224-b9b5d3b1a5-lite.chunk.js +2 -0
  59. package/dist/scripts/8224-b9b5d3b1a5-lite.chunk.js.map +1 -0
  60. package/dist/scripts/829-aff9937989-lite.chunk.js +3 -0
  61. package/dist/scripts/829-aff9937989-lite.chunk.js.map +1 -0
  62. package/dist/scripts/{9250-ec244ab17a-lite.chunk.js → 8723-708f2373d6-lite.chunk.js} +3 -3
  63. package/dist/scripts/{9250-ec244ab17a-lite.chunk.js.map → 8723-708f2373d6-lite.chunk.js.map} +1 -1
  64. package/dist/scripts/8960-c159492ba3-lite.chunk.js +2 -0
  65. package/dist/scripts/8960-c159492ba3-lite.chunk.js.map +1 -0
  66. package/dist/scripts/9673-8a2740611a-lite.chunk.js +2 -0
  67. package/dist/scripts/9673-8a2740611a-lite.chunk.js.map +1 -0
  68. package/dist/scripts/9882-f1a9cc55ec-lite.chunk.js +2 -0
  69. package/dist/scripts/9882-f1a9cc55ec-lite.chunk.js.map +1 -0
  70. package/dist/scripts/{bundle-d2cf17c78d.min.js → bundle-5a89651ec2.min.js} +3 -3
  71. package/dist/scripts/{bundle-d2cf17c78d.min.js.map → bundle-5a89651ec2.min.js.map} +1 -1
  72. package/package.json +1 -1
  73. package/dist/css/7428-lite-e2d7497beb.chunk.css +0 -8
  74. package/dist/scripts/1565-ba78a2a25c-lite.chunk.js +0 -2
  75. package/dist/scripts/1565-ba78a2a25c-lite.chunk.js.map +0 -1
  76. package/dist/scripts/2024-abf6cf1842-lite.chunk.js +0 -2
  77. package/dist/scripts/2024-abf6cf1842-lite.chunk.js.map +0 -1
  78. package/dist/scripts/2072-50b656cb3b-lite.chunk.js +0 -2
  79. package/dist/scripts/2072-50b656cb3b-lite.chunk.js.map +0 -1
  80. package/dist/scripts/2574-02faf4a2d2-lite.chunk.js +0 -2
  81. package/dist/scripts/2574-02faf4a2d2-lite.chunk.js.map +0 -1
  82. package/dist/scripts/396-2ffc09cc70-lite.chunk.js +0 -2
  83. package/dist/scripts/396-2ffc09cc70-lite.chunk.js.map +0 -1
  84. package/dist/scripts/4377-001a8ee263-lite.chunk.js +0 -2
  85. package/dist/scripts/4377-001a8ee263-lite.chunk.js.map +0 -1
  86. package/dist/scripts/4806-c2dce3650d-lite.chunk.js +0 -2
  87. package/dist/scripts/4806-c2dce3650d-lite.chunk.js.map +0 -1
  88. package/dist/scripts/4948-30af9a446d-lite.chunk.js +0 -2
  89. package/dist/scripts/4948-30af9a446d-lite.chunk.js.map +0 -1
  90. package/dist/scripts/549-2d591052e3-lite.chunk.js +0 -2
  91. package/dist/scripts/549-2d591052e3-lite.chunk.js.map +0 -1
  92. package/dist/scripts/5635-6e2559f04d-lite.chunk.js +0 -2
  93. package/dist/scripts/5635-6e2559f04d-lite.chunk.js.map +0 -1
  94. package/dist/scripts/5679-80c1d8434e-lite.chunk.js +0 -2
  95. package/dist/scripts/5679-80c1d8434e-lite.chunk.js.map +0 -1
  96. package/dist/scripts/5721-2141ed4fb6-lite.chunk.js +0 -2
  97. package/dist/scripts/5721-2141ed4fb6-lite.chunk.js.map +0 -1
  98. package/dist/scripts/5797-f84ce545b9-lite.chunk.js +0 -2
  99. package/dist/scripts/5797-f84ce545b9-lite.chunk.js.map +0 -1
  100. package/dist/scripts/581-fe733617bd-lite.chunk.js +0 -2
  101. package/dist/scripts/581-fe733617bd-lite.chunk.js.map +0 -1
  102. package/dist/scripts/5829-689f5be5d1-lite.chunk.js +0 -3
  103. package/dist/scripts/5829-689f5be5d1-lite.chunk.js.map +0 -1
  104. package/dist/scripts/6046-5652117548-lite.chunk.js +0 -2
  105. package/dist/scripts/6046-5652117548-lite.chunk.js.map +0 -1
  106. package/dist/scripts/6629-910e316a83-lite.chunk.js +0 -3
  107. package/dist/scripts/6629-910e316a83-lite.chunk.js.map +0 -1
  108. package/dist/scripts/6783-7efd15103a-lite.chunk.js +0 -3
  109. package/dist/scripts/6783-7efd15103a-lite.chunk.js.map +0 -1
  110. package/dist/scripts/7064-f5e8bc71bc-lite.chunk.js +0 -2
  111. package/dist/scripts/7064-f5e8bc71bc-lite.chunk.js.map +0 -1
  112. package/dist/scripts/7428-546d62999f-lite.chunk.js +0 -2
  113. package/dist/scripts/7428-546d62999f-lite.chunk.js.map +0 -1
  114. package/dist/scripts/7482-9016f79093-lite.chunk.js +0 -2
  115. package/dist/scripts/7482-9016f79093-lite.chunk.js.map +0 -1
  116. package/dist/scripts/7757-9b72774917-lite.chunk.js +0 -2
  117. package/dist/scripts/7757-9b72774917-lite.chunk.js.map +0 -1
  118. package/dist/scripts/7783-18da4064c0-lite.chunk.js +0 -2
  119. package/dist/scripts/7783-18da4064c0-lite.chunk.js.map +0 -1
  120. package/dist/scripts/8191-ff27deee6c-lite.chunk.js +0 -2
  121. package/dist/scripts/8191-ff27deee6c-lite.chunk.js.map +0 -1
  122. package/dist/scripts/8672-094d54cbbd-lite.chunk.js +0 -2
  123. package/dist/scripts/8672-094d54cbbd-lite.chunk.js.map +0 -1
  124. package/dist/scripts/8723-c3aaa1643a-lite.chunk.js +0 -2
  125. package/dist/scripts/8723-c3aaa1643a-lite.chunk.js.map +0 -1
  126. package/dist/scripts/9583-3b2623e754-lite.chunk.js +0 -2
  127. package/dist/scripts/9583-3b2623e754-lite.chunk.js.map +0 -1
  128. /package/dist/css/{4377-lite-856c02f000.chunk.css → 1107-lite-856c02f000.chunk.css} +0 -0
  129. /package/dist/css/{581-lite-a1cdc302ab.chunk.css → 1437-lite-a1cdc302ab.chunk.css} +0 -0
  130. /package/dist/css/{7757-lite-856c02f000.chunk.css → 4456-lite-856c02f000.chunk.css} +0 -0
  131. /package/dist/css/{9250-lite-37216d4207.chunk.css → 8723-lite-37216d4207.chunk.css} +0 -0
  132. /package/dist/scripts/{5829-689f5be5d1-lite.chunk.js.LICENSE.txt → 5829-903613bbf0-lite.chunk.js.LICENSE.txt} +0 -0
  133. /package/dist/scripts/{6629-910e316a83-lite.chunk.js.LICENSE.txt → 6629-4edaed39c8-lite.chunk.js.LICENSE.txt} +0 -0
  134. /package/dist/scripts/{6783-7efd15103a-lite.chunk.js.LICENSE.txt → 829-aff9937989-lite.chunk.js.LICENSE.txt} +0 -0
  135. /package/dist/scripts/{9250-ec244ab17a-lite.chunk.js.LICENSE.txt → 8723-708f2373d6-lite.chunk.js.LICENSE.txt} +0 -0
  136. /package/dist/scripts/{bundle-d2cf17c78d.min.js.LICENSE.txt → bundle-5a89651ec2.min.js.LICENSE.txt} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/2072-50b656cb3b-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/utils/EngagementUtils.ts","file:///app/packages/libs/shared/src/components/pill-tab-selector/PillTabSelector.tsx","file:///app/packages/libs/shared/src/hooks/useLockContentWidth.ts","file:///app/packages/projects/lite/src/apps/my-shares/components/insights-admin-alert/InsightsAdminAlert.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/insights-header/InsightsHeader.tsx","file:///app/packages/projects/lite/src/apps/my-shares/utils/InsightsAppLinkUtils.ts","file:///app/packages/libs/shared/src/components/pill-tab-selector/pill-tab-selector.scss"],"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}","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 return (new Array(Math.ceil(engagement.videoDuration))).fill(null).map((t, idx) => engagement.heatMap[idx] || 0);\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\n\nimport { SvgContainer } from '../svg-container/SvgContainer';\n\nimport styles from './pill-tab-selector.scss';\n\ninterface TabContentsProps {\n tab: PillTab;\n}\n\nfunction TabContents(props: TabContentsProps): JSX.Element {\n return (\n <>\n {!!props.tab.svgName && (\n <div className={props.tab.name ? 'pe-1' : ''}>\n <SvgContainer svgName={props.tab.svgName} />\n </div>\n )}\n\n {props.tab.name}\n\n {typeof (props.tab.count) === 'number' && (\n <div className='ps-2'>\n <Badge type={BadgeType.Count} data={props.tab.count} />\n </div>\n )}\n </>\n );\n}\n\nexport interface PillTab {\n name: string;\n active: boolean;\n svgName?: string;\n\n className?: string;\n\n appLink?: Core.AppLink;\n onSelect?: () => void;\n\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n\n count?: number;\n}\n\ninterface PillTabSelectorProps {\n tabs: PillTab[];\n containerRef?: (el: HTMLElement) => void;\n listClassName?: string;\n className?: string;\n borderRadius?: 'sm' | 'lg'\n}\n\nPillTabSelector.defaultProps = {\n borderRadius: 'lg'\n};\n\nexport function PillTabSelector(props: PillTabSelectorProps): JSX.Element {\n function onSelectTab(tab: PillTab): void {\n if (tab.active || !tab.onSelect)\n return;\n\n tab.onSelect();\n\n if (tab.analyticsData && tab.analyticsOptions)\n AnalyticsHelper.logUserAction(tab.analyticsData, tab.analyticsOptions);\n }\n\n return (\n <nav className={props.className ?? ''} ref={props.containerRef}>\n <ul className={`\n list-unstyled d-inline-block m-0 ${styles.pillTabSelector}\n ${props.borderRadius ? styles.radiusSmall : ''}\n ${props.listClassName}\n `}>\n {props.tabs.map((tab, index) => {\n return (\n <li\n className={`\n p-0 ${styles.tab} ${tab.active ? 'btn btn-dark' : 'btn btn-outline-dark'}\n ${tab.name ? styles.minWidth : ''} ${tab.className}\n `}\n key={index}\n >\n {tab.appLink ? (\n <AppLink\n appLink={tab.appLink}\n analyticsData={tab.analyticsData}\n analyticsOptions={tab.analyticsOptions}\n className={`\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ${styles.tabLink}\n `}\n >\n <TabContents tab={tab} />\n </AppLink>\n ) : (\n <DivButton\n className={`\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ${styles.tabLink}\n `}\n onClick={() => onSelectTab(tab)}\n >\n <TabContents tab={tab} />\n </DivButton>\n )}\n </li>\n );\n })}\n </ul>\n </nav>\n );\n}\n","import React from 'react';\n\nimport { LayoutHelper } from 'libs/shared/utils/LayoutHelper';\n\nexport function useLockContentWidth(): void {\n React.useEffect(() => {\n LayoutHelper.lockContentWidth();\n return () => LayoutHelper.unlockContentWidth();\n }, []);\n}","import React from 'react';\n\nimport { StorageType } from 'libs/common/backbone/utils/LocalStorageHelper';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ViewModelKeys } from 'shared/constants/LiteViewModels';\n\nconst namespace = 'lite.insightsAdminAlert';\n\ninterface InsightsAdminAlertProps {\n hasAnalytics: boolean;\n analyticsUrl: string;\n video?: VideoTypes;\n}\n\n// eslint-disable-next-line rulesdir/require-view-title\nexport function InsightsAdminAlert(props: InsightsAdminAlertProps) {\n const [ show, setShow ] = useViewModel(\n ViewModelKeys.INSIGHTS_ADMIN_ALERT,\n true,\n { storage: StorageType.LocalStorage }\n );\n\n function onDismiss() {\n setShow(false);\n }\n\n function getAnalyticsUrl() {\n if (!props.video) return props.analyticsUrl;\n\n let videoRoute = '';\n\n if (props.video.typeId === MasterType.Interactive)\n videoRoute = `/interactives/${props.video.id}/views`;\n\n if (props.video.typeId === MasterType.Video)\n videoRoute = `/videos/${props.video.id}/views`;\n\n if (props.video.typeId === MasterType.Clip)\n videoRoute = `/clips/${props.video.id}/views`;\n\n return UrlHelper.safeUrlConcat(props.analyticsUrl, videoRoute);\n }\n\n if (!props.hasAnalytics || !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='adminAlert' />\n <a className='text-info' href={getAnalyticsUrl()} target='_blank'>\n <Text namespace={namespace} phrase='analytics' />\n </a>.\n </div>\n <IconButton svgName={cvSvgLibrary.Close} className='text-blue' onClick={onDismiss} />\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { StorageType } from 'libs/common/backbone/utils/LocalStorageHelper';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { DateRangeQueryParams } from 'libs/shared/apps/analytics/interfaces/DateRangeQueryParams';\nimport { ActionsDropdown } from 'libs/shared/components/actions/ActionsDropdown';\nimport { Breadcrumb, Breadcrumbs, PartialBreadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { PillTab, PillTabSelector } from 'libs/shared/components/pill-tab-selector/PillTabSelector';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { InsightsAdminAlert } from 'apps/my-shares/components/insights-admin-alert/InsightsAdminAlert';\n\nconst namespace = 'insights.header';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightsHeaderProps {\n video: VideoTypes;\n hasClassrooms?: boolean;\n dateRangeAppLinkParams?: DateRangeQueryParams;\n tabs: PillTab[]\n isDemo?: boolean;\n analyticsWebUrl?: string;\n hasAnalytics?: boolean;\n hasShareFlowV2?: boolean;\n shareId?: string;\n}\n\nexport function InsightsHeader(props: InsightsHeaderProps) {\n const [ anonymiseUsers, setAnonymiseUsers ] = useViewModel<boolean>(\n SharedViewModelKeys.ANONYMISE_USERS,\n false,\n { storage: StorageType.LocalStorage }\n );\n\n function getBreadcrumbs(): Breadcrumb[] {\n return [\n {\n name: 'Reports',\n appLink: {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.HOME\n }\n },\n {\n name: props.video.name,\n active: true\n }\n ];\n }\n\n function getActions() {\n const actions = [{\n label: 'Edit time range',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_GENERATE_REPORT,\n args: [props.video?.id]\n }\n },\n {\n label: 'Edit audience',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_GENERATE_REPORT,\n args: [props.video?.id]\n }\n }];\n\n if (props.video?.typeId === MasterType.Interactive) {\n actions.push({\n label: getPhrase('generateReport'),\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_GENERATE_REPORT,\n args: [props.video?.id]\n }\n });\n }\n\n return actions;\n }\n\n return (\n <div>\n <InsightsAdminAlert\n analyticsUrl={props.analyticsWebUrl}\n hasAnalytics={props.hasAnalytics}\n video={props.video}\n />\n <section className='mb-4'>\n <div className='mb-3'>\n <div className='d-flex justify-content-between align-items-center mb-3'>\n {props.video\n ? <Breadcrumbs breadcrumbs={getBreadcrumbs()} />\n : <PartialBreadcrumbs />\n }\n <ActionsDropdown\n dropdownToggleClassName='btn btn-outline-dark'\n actions={getActions()}\n />\n </div>\n </div>\n <div className='d-flex align-items-center mb-4'>\n <PillTabSelector tabs={props.tabs} />\n <div className='flex-grow-1' />\n <div className='d-flex gap-3'>\n <label htmlFor='anonymiseNames' className='mb-0'><Text namespace={namespace} phrase='anonymiseNames' /></label>\n <ToggleSwitch id='anonymiseNames' on={anonymiseUsers} onClick={() => setAnonymiseUsers(!anonymiseUsers)} />\n </div>\n </div>\n </section>\n </div>\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'shared.insightsUtils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ntype InsightsTabs = 'insights' | 'heatmap' | 'results' | 'questions' | 'shareOptions' | 'videos';\n\nexport function getInsightsVideoTabs(\n id: string,\n active: InsightsTabs,\n params: HashObject,\n hasShareFlowV2: boolean = true\n) {\n const tabs = [\n {\n name: getPhrase('insights'),\n active: active === 'insights',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.VIDEO_OVERVIEW,\n args: [id],\n params\n }\n },\n {\n name: getPhrase('heatmap'),\n active: active === 'heatmap',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.VIDEO_HEATMAP,\n args: [id],\n params\n }\n }\n ];\n\n if (hasShareFlowV2) {\n return [\n {\n name: 'Report',\n active: active === 'shareOptions',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.VIDEO_SHARE_OPTIONS,\n args: [id],\n params\n }\n },\n ...tabs\n ];\n }\n\n return tabs;\n}\n\nexport function getInsightsClipTabs(\n id: string,\n active: InsightsTabs,\n params: HashObject,\n hasShareFlowV2: boolean = true\n) {\n const tabs = [\n {\n name: getPhrase('insights'),\n active: active === 'insights',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.CLIP_OVERVIEW,\n args: [id],\n params\n }\n },\n {\n name: getPhrase('heatmap'),\n active: active === 'heatmap',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.CLIP_HEATMAP,\n args: [id],\n params\n }\n }\n ];\n\n if (hasShareFlowV2) {\n return [\n {\n name: 'Report',\n active: active === 'shareOptions',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.CLIP_SHARE_OPTIONS,\n args: [id],\n params\n }\n },\n ...tabs\n ];\n }\n\n return tabs;\n}\n\nexport function getInsightsInteractiveTabs(\n id: string,\n active: InsightsTabs,\n params: HashObject,\n hasShareFlowV2: boolean = true\n) {\n const tabs = [\n {\n name: getPhrase('insights'),\n active: active === 'insights',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_OVERVIEW,\n args: [id],\n params\n }\n },\n {\n name: getPhrase('results'),\n active: active === 'results',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_STUDENTS,\n args: [id],\n params\n }\n },\n {\n name: getPhrase('questions'),\n active: active === 'questions',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_QUESTIONS,\n args: [id],\n params\n }\n },\n {\n name: getPhrase('heatmap'),\n active: active === 'heatmap',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_HEATMAP,\n args: [id],\n params\n }\n }\n ];\n\n if (hasShareFlowV2) {\n return [\n {\n name: 'Report',\n active: active === 'shareOptions',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_SHARE_OPTIONS,\n args: [id],\n params\n }\n },\n ...tabs\n ];\n }\n\n return tabs;\n}\n\nexport function getInsightsDemoInteractiveTabs(id: string, active: InsightsTabs, params: HashObject) {\n return [\n {\n name: getPhrase('insights'),\n active: active === 'insights',\n appLink: {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_OVERVIEW_DEMO,\n args: [id],\n params\n }\n },\n {\n name: getPhrase('results'),\n active: active === 'results',\n appLink: {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_STUDENTS_DEMO,\n args: [id],\n params\n }\n },\n {\n name: getPhrase('questions'),\n active: active === 'questions',\n appLink: {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_QUESTIONS_DEMO,\n args: [id],\n params\n }\n },\n {\n name: getPhrase('heatmap'),\n active: active === 'heatmap',\n appLink: {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_HEATMAP_DEMO,\n args: [id],\n params\n }\n }\n ];\n}\n\nexport function getInsightsSeriesTabs(\n id: string,\n active: InsightsTabs,\n params: HashObject\n) {\n const tabs = [\n {\n name: 'Report',\n active: active === 'shareOptions',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.SERIES_SHARE_OPTIONS,\n args: [id],\n params\n }\n },\n {\n name: 'Videos',\n active: active === 'videos',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.SERIES_VIDEOS,\n args: [id],\n params\n }\n }\n ];\n\n return tabs;\n}\n\nexport function getInsightsPlaylistTabs(\n id: string,\n active: InsightsTabs,\n params: HashObject\n) {\n const tabs = [\n {\n name: 'Report',\n active: active === 'shareOptions',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.PLAYLIST_SHARE_OPTIONS,\n args: [id],\n params\n }\n },\n {\n name: 'Videos',\n active: active === 'videos',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.PLAYLIST_VIDEOS,\n args: [id],\n params\n }\n }\n ];\n\n return tabs;\n}","// extracted by mini-css-extract-plugin\nexport default {\"pillTabSelector\":\"Hdi6o\",\"tab\":\"RvNxr\",\"minWidth\":\"GHSz9\",\"radiusSmall\":\"VhJJa\",\"tabLink\":\"WFyvo\"};"],"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","getFullHeatMap","Array","ceil","videoDuration","fill","t","TabContents","tab","svgName","name","count","type","PillTabSelector","ref","containerRef","borderRadius","listClassName","tabs","index","active","appLink","analyticsData","analyticsOptions","onClick","onSelect","onSelectTab","defaultProps","useLockContentWidth","InsightsAdminAlert","storage","show","setShow","hasAnalytics","role","href","video","analyticsUrl","videoRoute","typeId","id","getAnalyticsUrl","target","getPhrase","InsightsHeader","actions","anonymiseUsers","setAnonymiseUsers","analyticsWebUrl","breadcrumbs","application","action","dropdownToggleClassName","label","args","htmlFor","on","getInsightsVideoTabs","params","hasShareFlowV2","getInsightsClipTabs","getInsightsInteractiveTabs","getInsightsDemoInteractiveTabs","getInsightsSeriesTabs","getInsightsPlaylistTabs"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[2574],{38502:(e,t,n)=>{n.d(t,{r:()=>m});var a=n(32735),r=n(49985),l=n(15611),i=n(18559),o=n(11607),c=n(83914),s=n(22771);function u(e){return a.createElement(a.Fragment,null,!!e.tab.svgName&&a.createElement("div",{className:e.tab.name?"pe-1":""},a.createElement(c.x,{svgName:e.tab.svgName})),e.tab.name,"number"==typeof e.tab.count&&a.createElement("div",{className:"ps-2"},a.createElement(i.C,{type:i.g.Count,data:e.tab.count})))}function m(e){var t;return a.createElement("nav",{className:null!==(t=e.className)&&void 0!==t?t:"",ref:e.containerRef},a.createElement("ul",{className:"\n list-unstyled d-inline-block m-0 ".concat(s.Z.pillTabSelector,"\n ").concat(e.borderRadius?s.Z.radiusSmall:"","\n ").concat(e.listClassName,"\n ")},e.tabs.map((function(e,t){return a.createElement("li",{className:"\n p-0 ".concat(s.Z.tab," ").concat(e.active?"btn btn-dark":"btn btn-outline-dark","\n ").concat(e.name?s.Z.minWidth:""," ").concat(e.className,"\n "),key:t},e.appLink?a.createElement(l.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(s.Z.tabLink,"\n ")},a.createElement(u,{tab:e})):a.createElement(o.L,{className:"\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ".concat(s.Z.tabLink,"\n "),onClick:function(){return function(e){!e.active&&e.onSelect&&(e.onSelect(),e.analyticsData&&e.analyticsOptions&&r.k.logUserAction(e.analyticsData,e.analyticsOptions))}(e)}},a.createElement(u,{tab:e})))}))))}m.defaultProps={borderRadius:"lg"}},6748:(e,t,n)=>{n.d(t,{i:()=>N});var a=n(32735),r=n(42648),l=n(35509),i=n(91967),o=n(15611),c=n(17808),s=n(1287),u=n(83914),m=n(90281),d={opacity:"0.8",cursor:"grabbing"},p=n(35223);function f(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)||v(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 v(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,a=Array(t);n<t;n++)a[n]=e[n];return a}function h(e){var t,n,a,r;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===(a=e.current)||void 0===a?void 0:a.scrollWidth)-(null===(r=e.current)||void 0===r?void 0:r.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,a=Array(t);n<t;n++)a[n]=e[n];return a}var S=function(e,t){var n={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&t.indexOf(a)<0&&(n[a]=e[a]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(a=Object.getOwnPropertySymbols(e);r<a.length;r++)t.indexOf(a[r])<0&&Object.prototype.propertyIsEnumerable.call(e,a[r])&&(n[a[r]]=e[a[r]])}return n};function y(e){var t,n;return e.column.canSort?a.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:"")},a.createElement(u.x,{svgName:e.column.isSortedDesc||!e.column.isSorted?p.vn.ArrowRight:p.vn.ArrowLeft,size:u.S.Small})):a.createElement(a.Fragment,null)}function I(e){var t,n,r,u,m,p,v,g,h={columns:e.columns,data:e.data,disableSortBy:!e.enableSort,manualSortBy:e.manualSort,autoResetHiddenColumns:e.autoResetHiddenColumns,autoResetSortBy:e.autoResetSortBy,initialState:{sortBy:e.initialSortBy||[]}};e.initialSelectedRowIds&&(h.initialState={selectedRowIds:(v=e.initialSelectedRowIds,g={},v.forEach((function(e){return g[e]=!0})),g)}),e.getRowId&&(h.getRowId=e.getRowId);var E,S=l.useTable.apply(void 0,[h].concat((E=function(e){var t=[l.useSortBy,l.useRowSelect,"flex"===e.layout?l.useFlexLayout:l.useBlockLayout];return e.allowFiltering&&(t=[].concat(f(t),[l.useFilters])),e.allowGlobalFiltering&&(t=[].concat(f(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.")}()))),I=S.getTableProps,N=S.getTableBodyProps,R=S.headerGroups,O=S.rows,w=S.prepareRow,T=S.toggleAllRowsSelected,A=S.setGlobalFilter,k=S.setHiddenColumns,C=S.state.sortBy;function _(){return O.map((function(t){w(t);var n=function(t){var n,a,r,l,o,c=i.q.isFunction(null===(n=e.theme)||void 0===n?void 0:n.row)?e.theme.row(t):null!==(r=null===(a=e.theme)||void 0===a?void 0:a.row)&&void 0!==r?r:"";return t.isSelected&&(null===(l=e.theme)||void 0===l?void 0:l.selectedRow)&&(c+=" ".concat(null===(o=e.theme)||void 0===o?void 0:o.selectedRow)),e.onSelectRow&&(c+=" cursor-pointer"),e.enableSortableRows&&(c+=" cursor-grab"),c}(t),r=!!e.getRowAppLink&&e.getRowAppLink(t);function l(){e.onSelectRow&&(e.allowSelectMultipleRows||T(!1),e.onSelectRow(t),t.toggleRowSelected(!0))}function c(e,i){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,i);return r?a.createElement("div",{role:"row",key:t.id},a.createElement(o.F,Object.assign({},e,c,{className:n,appLink:r}),L(t))):a.createElement("div",Object.assign({},e,c,{key:t.id,role:"row",className:n,onClick:l}),L(t))}var u=t.getRowProps();return e.enableSortableRows?a.createElement(s.W,{id:t.original.id,key:t.id,childProps:u,childComponent:a.forwardRef((function(e,t){return c(e,t)}))}):c(u)}))}function L(t){return t.cells.map((function(n){var r=function(t,n){var a,r,l="";return"function"==typeof(null===(a=e.theme)||void 0===a?void 0:a.cell)&&(l=e.theme.cell(t,n)),"string"==typeof(null===(r=e.theme)||void 0===r?void 0:r.cell)&&(l=e.theme.cell),e.onSelectCell&&(l+=" cursor-pointer"),l}(t,n);return a.createElement("div",Object.assign({key:n.column.id},n.getCellProps(),{className:r,onClick:function(){e.onSelectCell&&e.onSelectCell(n)}}),n.render("Cell"))}))}return a.useEffect((function(){e.onSort&&e.onSort(C)}),[C]),a.useEffect((function(){e.globalFilter&&A(e.globalFilter)}),[e.globalFilter]),a.useEffect((function(){e.hiddenColumns&&k(e.hiddenColumns)}),[e.hiddenColumns&&e.hiddenColumns.length]),a.createElement("div",Object.assign({},I(),{className:null!==(n=null===(t=e.theme)||void 0===t?void 0:t.table)&&void 0!==n?n:""}),a.createElement("div",{className:null!==(u=null===(r=e.theme)||void 0===r?void 0:r.header)&&void 0!==u?u:""},R.map((function(t){var n,r;return a.createElement("div",Object.assign({},t.getHeaderGroupProps(),{className:null!==(r=null===(n=e.theme)||void 0===n?void 0:n.headerRow)&&void 0!==r?r:""}),t.headers.map((function(t){var n,r;return a.createElement("div",Object.assign({},t.getHeaderProps(t.getSortByToggleProps()),{className:null!==(r=null===(n=e.theme)||void 0===n?void 0:n.headerCell)&&void 0!==r?r:""}),t.render("Header",{renderSortIndicator:function(){return a.createElement(y,{column:t,theme:e.theme})}}),!t.hideSortIndicator&&a.createElement(y,{column:t,theme:e.theme}))})))}))),a.createElement("div",Object.assign({},N(),{className:null!==(p=null===(m=e.theme)||void 0===m?void 0:m.body)&&void 0!==p?p:""}),e.enableSortableRows?a.createElement(c.Q,{ids:O.map((function(e){return e.original.id})),getDragOverlay:function(t){var n,r,l=O.findIndex((function(e){return e.original.id===t})),i=O[l];return a.createElement("div",Object.assign({},e,{className:(n=e.theme,r="g-0 ",n&&(r+=n.row),r),style:d}),L(i))},onSortEnd:e.onSortingRowsEnd},_()):_()))}function N(e){var t=e.enableSlider,n=e.scrollIncrement,l=e.scrollable,o=S(e,["enableSlider","scrollIncrement","scrollable"]),c=function(){var e,t,n=a.useRef(null),r=(e=a.useState(h(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 a,r,l,i,o=[],c=!0,s=!1;try{if(l=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(a=l.call(n)).done)&&(o.push(a.value),o.length!==t);c=!0);}catch(e){s=!0,r=e}finally{try{if(!c&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(s)throw r}}return o}}(e,t)||v(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=r[0],o=r[1],c=i.q.throttle((function(){o(h(n))}),200),s=a.useCallback((function(e){var t;n.current&&(null===(t=n.current)||void 0===t||t.removeEventListener("scroll",c)),e&&(o(h(n)),e.addEventListener("scroll",c)),n.current=e}),[]);return a.useEffect((function(){(null==n?void 0:n.current)&&o(h(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,d=c.scroll;if(l)return a.createElement(r.$B,{renderTrackHorizontal:function(){return a.createElement("div",{className:E.scrollbarTrack})},autoHeightMax:1e4,autoHeight:!0},a.createElement(I,Object.assign({},o)));if(!t)return a.createElement(I,Object.assign({},o));function p(e){d(n*("right"===e?1:-1))}return a.createElement("div",{className:"mx-n4 overflow-x-hidden overflow-y-hidden"},a.createElement("div",{className:"px-4"},a.createElement("div",{className:"position-relative"},a.createElement(m.W,{direction:m.f.Left,onClick:function(){return p("left")},hide:!u.canScrollLeft}),a.createElement("div",{className:"".concat(E.scrollContainer," ").concat(e.scrollContainerClassName),ref:s},a.createElement(I,Object.assign({},o))),a.createElement(m.W,{direction:m.f.Right,onClick:function(){return p("right")},hide:!u.canScrollRight}))))}N.defaultProps={scrollIncrement:250,scrollable:!1,layout:"flex"}},99746:(e,t,n)=>{n.d(t,{p:()=>f});var a=n(32735),r=n(57900),l=n(97395),i=n(2948),o=n(91693),c=n(83345),s=n(4594),u=n(35223),m=n(86702);function d(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var p="lite.insightsAdminAlert";function f(e){var t,n,f=(t=(0,i.D)(m.y.INSIGHTS_ADMIN_ALERT,!0,{storage:r.Z1.LocalStorage}),n=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,l,i,o=[],c=!0,s=!1;try{if(l=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(a=l.call(n)).done)&&(o.push(a.value),o.length!==t);c=!0);}catch(e){s=!0,r=e}finally{try{if(!c&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(s)throw r}}return o}}(t,n)||function(e,t){if(e){if("string"==typeof e)return d(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)?d(e,t):void 0}}(t,n)||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.")}()),v=f[0],g=f[1];return e.hasAnalytics&&v?a.createElement("div",{role:"alert",className:"d-flex justify-content-between align-items-center bg-light-blue rounded p-2 mb-4"},a.createElement("div",null,a.createElement(c.x,{namespace:p,phrase:"adminAlert"}),a.createElement("a",{className:"text-info",href:function(){if(!e.video)return e.analyticsUrl;var t="";return e.video.typeId===s.E.Interactive&&(t="/interactives/".concat(e.video.id,"/views")),e.video.typeId===s.E.Video&&(t="/videos/".concat(e.video.id,"/views")),e.video.typeId===s.E.Clip&&(t="/clips/".concat(e.video.id,"/views")),l._.safeUrlConcat(e.analyticsUrl,t)}(),target:"_blank"},a.createElement(c.x,{namespace:p,phrase:"analytics"})),"."),a.createElement(o.h,{svgName:u.vn.Close,className:"text-blue",onClick:function(){g(!1)}})):a.createElement(a.Fragment,null)}},53936:(e,t,n)=>{n.d(t,{j:()=>S});var a=n(32735),r=n(23481),l=n(57900),i=n(2948),o=n(76306),c=n(49935),s=n(38502),u=n(83345),m=n(83523),d=n(38143),p=n(4594),f=n(14070),v=n(97291),g=n(99746);function h(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var E="insights.header",b=r.T.encloseNamespace(E);function S(e){var t,n,r,S,y,I,N,R=(I=(0,i.D)(d.g.ANONYMISE_USERS,!1,{storage:l.Z1.LocalStorage}),N=2,function(e){if(Array.isArray(e))return e}(I)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,l,i,o=[],c=!0,s=!1;try{if(l=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(a=l.call(n)).done)&&(o.push(a.value),o.length!==t);c=!0);}catch(e){s=!0,r=e}finally{try{if(!c&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(s)throw r}}return o}}(I,N)||function(e,t){if(e){if("string"==typeof e)return h(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)?h(e,t):void 0}}(I,N)||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.")}()),O=R[0],w=R[1];return a.createElement("div",null,a.createElement(g.p,{analyticsUrl:e.analyticsWebUrl,hasAnalytics:e.hasAnalytics,video:e.video}),a.createElement("section",{className:"mb-4"},a.createElement("div",{className:"mb-3"},a.createElement("div",{className:"d-flex justify-content-between align-items-center mb-3"},e.video?a.createElement(c.Oo,{breadcrumbs:[{name:"Reports",appLink:{application:v.O.MY_SHARES,action:f.e.MyShares.HOME}},{name:e.video.name,active:!0}]}):a.createElement(c.b2,null),a.createElement(o.m,{dropdownToggleClassName:"btn btn-outline-dark",actions:(y=[{label:"Edit time range",appLink:{application:v.O.INSIGHTS,action:f.e.Insights.INTERACTIVE_GENERATE_REPORT,args:[null===(t=e.video)||void 0===t?void 0:t.id]}},{label:"Edit audience",appLink:{application:v.O.INSIGHTS,action:f.e.Insights.INTERACTIVE_GENERATE_REPORT,args:[null===(n=e.video)||void 0===n?void 0:n.id]}}],(null===(r=e.video)||void 0===r?void 0:r.typeId)===p.E.Interactive&&y.push({label:b("generateReport"),appLink:{application:v.O.INSIGHTS,action:f.e.Insights.INTERACTIVE_GENERATE_REPORT,args:[null===(S=e.video)||void 0===S?void 0:S.id]}}),y)}))),a.createElement("div",{className:"d-flex align-items-center mb-4"},a.createElement(s.r,{tabs:e.tabs}),a.createElement("div",{className:"flex-grow-1"}),a.createElement("div",{className:"d-flex gap-3"},a.createElement("label",{htmlFor:"anonymiseNames",className:"mb-0"},a.createElement(u.x,{namespace:E,phrase:"anonymiseNames"})),a.createElement(m.Z,{id:"anonymiseNames",on:O,onClick:function(){return w(!O)}})))))}},78057:(e,t,n)=>{n.d(t,{R:()=>O});var a=n(32735),r=n(75896),l=n(23481),i=n(97958),o=l.T.encloseNamespace("shared.studentResultsTable");function c(e){return"not_completed"===e.filter?a.createElement(i.u,{className:"bg-white rounded-bottom py-5"},a.createElement(i.u.Image,{src:e.notCompletedImageUrl,size:"small"}),a.createElement(i.u.Info,null,o("notCompletedDescription"))):"marking_required"===e.filter?a.createElement(i.u,{className:"bg-white rounded-bottom py-5"},a.createElement(i.u.Image,{src:e.markingRequiredImageUrl,size:"small"}),a.createElement(i.u.Info,null,o("markingRequiredDescription"))):"helping_hand"===e.filter?a.createElement(i.u,{className:"bg-white rounded-bottom py-5"},a.createElement(i.u.Image,{src:e.helpingHandImageUrl,size:"small"}),a.createElement(i.u.Info,null,o("helpingHandDescription"))):a.createElement(i.u,{className:"bg-white rounded-bottom py-5"},a.createElement(i.u.Image,{src:e.emptyStateImageUrl,size:"small"}),a.createElement(i.u.Heading,null,o("emptyStateHeading")),a.createElement(i.u.Info,null,o("emptyStateDescription")))}var s=n(83345),u="shared.studentResultsTable";function m(e){function t(t){var n=e.filter===t?null:t;e.setFilter(n)}function n(t){return"btn btn-outline-dark ".concat(function(t){return e.filter===t}(t)?"bg-dark text-white":"")}return a.createElement("div",{className:"d-flex align-items-center mb-3"},a.createElement("p",{className:"h6 mb-0"},a.createElement(s.x,{namespace:u,phrase:"filters"})),a.createElement("div",{className:"d-flex border-start ps-3 ms-3 gap-2"},a.createElement("button",{className:n("not_completed"),onClick:function(){return t("not_completed")}},a.createElement(s.x,{namespace:u,phrase:"notCompletedFilter"})),a.createElement("button",{className:n("marking_required"),onClick:function(){return t("marking_required")}},a.createElement(s.x,{namespace:u,phrase:"markingRequiredFilter"})),a.createElement("button",{className:n("helping_hand"),onClick:function(){return t("helping_hand")}},a.createElement(s.x,{namespace:u,phrase:"helpingHandFilter"}))))}var d=n(26136),p=n(97364),f=n(6748),v=n(84806),g=n(19912);function h(e,t){return 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 a,r,l,i,o=[],c=!0,s=!1;try{if(l=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(a=l.call(n)).done)&&(o.push(a.value),o.length!==t);c=!0);}catch(e){s=!0,r=e}finally{try{if(!c&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(s)throw r}}return o}}(e,t)||function(e,t){if(e){if("string"==typeof e)return E(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)?E(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.")}()}function E(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var b={table:"".concat(g.Z.fixedTable," bg-white rounded-start border border-end-0"),header:"".concat(g.Z.header," border-bottom"),headerRow:"h-100",headerCell:"d-flex align-items-center justify-content-start",row:g.Z.row},S={header:"".concat(g.Z.header," fw-bold"),headerRow:"h-100",headerCell:"".concat(g.Z.interactionHeaderCellOuter," bg-white border-bottom"),row:"".concat(g.Z.row," ").concat(g.Z.resultsRow),cell:g.Z.resultsCellOuter};function y(e){var t=h(a.useState((0,p.P)(e.sortBy,"score")),2),n=t[0],l=t[1],i=h(a.useState(e.filterBy),2),o=i[0],s=i[1],u=a.useRef(null),E=(0,v.R7)(e.results,e.anonSessions,e.anonymiseUsers),y=(0,v.lE)(e.interactive,e.interactiveMetadata,e.results,(function(e){(0,v.bB)(u.current,e)}),e.refreshTable),I=(0,v.Fx)(e.interactive,e.results,e.refreshTable,e.anonymiseUsers,r.m.first(n),o);function N(e){(0,v.l8)(u.current,e)}return a.createElement("div",null,!!e.results.students.length&&a.createElement(m,{filter:o,setFilter:s}),!I.length&&a.createElement(c,{emptyStateImageUrl:e.emptyStateImageUrl,helpingHandImageUrl:e.helpingHandImageUrl,markingRequiredImageUrl:e.markingRequiredImageUrl,notCompletedImageUrl:e.notCompletedImageUrl,filter:o}),!!I.length&&a.createElement("div",{ref:u,className:"d-flex".concat(I.length?" ".concat(g.Z.hasResults):"")},a.createElement(f.i,{columns:E,data:I,theme:b,onSelectRow:function(t){var n=t.original;e.viewStudentResults((0,d.DV)(n,e.anonSessions),e.interactiveMetadata.id)},onRowMouseOver:function(e){return N(e.index)},onRowMouseLeave:function(){return N()},enableSort:!0,manualSort:!0,onSort:l,initialSortBy:n}),a.createElement(f.i,{columns:y,data:I,theme:S,enableSlider:!0,scrollIncrement:8*v.Ju,onSelectCell:function(t){e.viewStudentResults((0,d.DV)(t.row.original,e.anonSessions),e.interactiveMetadata.id,t.column.id)},scrollContainerClassName:"rounded-end border border-start-0 border"})))}var I=n(99742);const N={partialInsights:"qSeTe"};function R(){return a.createElement("div",null,a.createElement("div",{className:"d-flex align-items-center mb-3"},a.createElement("p",{className:"h6 px-4 mb-0 me-4 partial-loading-background"}," "),a.createElement("div",{className:"row g-2 w-50"},a.createElement("div",{className:"col-3"},a.createElement("div",{className:"p-2 rounded-1 partial-loading-background"}," ")),a.createElement("div",{className:"col-3"},a.createElement("div",{className:"p-2 rounded-1 partial-loading-background"}," ")),a.createElement("div",{className:"col-3"},a.createElement("div",{className:"p-2 rounded-1 partial-loading-background"}," ")))),a.createElement("div",{className:"row g-3 mb-5"},a.createElement("div",{className:"col-12"},a.createElement("div",{className:"".concat(N.partialInsights," rounded partial-loading-background")}))))}function O(e){return a.createElement(a.Fragment,null,!e.hasDataLoaded&&a.createElement(R,null),e.hasDataLoaded&&a.createElement(y,{interactive:e.interactive,interactiveMetadata:e.interactiveMetadata,results:e.results,refreshTable:e.isFetching,viewStudentResults:e.viewStudentResults,emptyStateImageUrl:I.W.Insights.NO_RESPONSES,sortBy:e.sortBy,filterBy:e.filterBy,anonymiseUsers:e.anonymiseUsers,notCompletedImageUrl:I.W.Insights.JIGSAW,markingRequiredImageUrl:I.W.Insights.CLIPBOARD,helpingHandImageUrl:I.W.Insights.SPEECH_BUBBLE_HEART,anonSessions:e.anonSessions}))}},10447:(e,t,n)=>{n.d(t,{$6:()=>o,$o:()=>c,W_:()=>d,aq:()=>u,kj:()=>s,lo:()=>m});var a=n(23481),r=n(14070),l=n(97291),i=a.T.encloseNamespace("shared.insightsUtils");function o(e,t,n){var a=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],o=[{name:i("insights"),active:"insights"===t,appLink:{application:l.O.INSIGHTS,action:r.e.Insights.VIDEO_OVERVIEW,args:[e],params:n}},{name:i("heatmap"),active:"heatmap"===t,appLink:{application:l.O.INSIGHTS,action:r.e.Insights.VIDEO_HEATMAP,args:[e],params:n}}];return a?[{name:"Report",active:"shareOptions"===t,appLink:{application:l.O.INSIGHTS,action:r.e.Insights.VIDEO_SHARE_OPTIONS,args:[e],params:n}}].concat(o):o}function c(e,t,n){var a=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],o=[{name:i("insights"),active:"insights"===t,appLink:{application:l.O.INSIGHTS,action:r.e.Insights.CLIP_OVERVIEW,args:[e],params:n}},{name:i("heatmap"),active:"heatmap"===t,appLink:{application:l.O.INSIGHTS,action:r.e.Insights.CLIP_HEATMAP,args:[e],params:n}}];return a?[{name:"Report",active:"shareOptions"===t,appLink:{application:l.O.INSIGHTS,action:r.e.Insights.CLIP_SHARE_OPTIONS,args:[e],params:n}}].concat(o):o}function s(e,t,n){var a=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],o=[{name:i("insights"),active:"insights"===t,appLink:{application:l.O.INSIGHTS,action:r.e.Insights.INTERACTIVE_OVERVIEW,args:[e],params:n}},{name:i("results"),active:"results"===t,appLink:{application:l.O.INSIGHTS,action:r.e.Insights.INTERACTIVE_STUDENTS,args:[e],params:n}},{name:i("questions"),active:"questions"===t,appLink:{application:l.O.INSIGHTS,action:r.e.Insights.INTERACTIVE_QUESTIONS,args:[e],params:n}},{name:i("heatmap"),active:"heatmap"===t,appLink:{application:l.O.INSIGHTS,action:r.e.Insights.INTERACTIVE_HEATMAP,args:[e],params:n}}];return a?[{name:"Report",active:"shareOptions"===t,appLink:{application:l.O.INSIGHTS,action:r.e.Insights.INTERACTIVE_SHARE_OPTIONS,args:[e],params:n}}].concat(o):o}function u(e,t,n){return[{name:i("insights"),active:"insights"===t,appLink:{application:l.O.MY_SHARES,action:r.e.MyShares.INTERACTIVE_OVERVIEW_DEMO,args:[e],params:n}},{name:i("results"),active:"results"===t,appLink:{application:l.O.MY_SHARES,action:r.e.MyShares.INTERACTIVE_STUDENTS_DEMO,args:[e],params:n}},{name:i("questions"),active:"questions"===t,appLink:{application:l.O.MY_SHARES,action:r.e.MyShares.INTERACTIVE_QUESTIONS_DEMO,args:[e],params:n}},{name:i("heatmap"),active:"heatmap"===t,appLink:{application:l.O.MY_SHARES,action:r.e.MyShares.INTERACTIVE_HEATMAP_DEMO,args:[e],params:n}}]}function m(e,t,n){return[{name:"Report",active:"shareOptions"===t,appLink:{application:l.O.INSIGHTS,action:r.e.Insights.SERIES_SHARE_OPTIONS,args:[e],params:n}},{name:"Videos",active:"videos"===t,appLink:{application:l.O.INSIGHTS,action:r.e.Insights.SERIES_VIDEOS,args:[e],params:n}}]}function d(e,t,n){return[{name:"Report",active:"shareOptions"===t,appLink:{application:l.O.INSIGHTS,action:r.e.Insights.PLAYLIST_SHARE_OPTIONS,args:[e],params:n}},{name:"Videos",active:"videos"===t,appLink:{application:l.O.INSIGHTS,action:r.e.Insights.PLAYLIST_VIDEOS,args:[e],params:n}}]}},22771:(e,t,n)=>{n.d(t,{Z:()=>a});const a={pillTabSelector:"Hdi6o",tab:"RvNxr",minWidth:"GHSz9",radiusSmall:"VhJJa",tabLink:"WFyvo"}}}]);
2
- //# sourceMappingURL=2574-02faf4a2d2-lite.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/2574-02faf4a2d2-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/pill-tab-selector/PillTabSelector.tsx","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/projects/lite/src/apps/my-shares/components/insights-admin-alert/InsightsAdminAlert.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/insights-header/InsightsHeader.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/StudentResultsEmptyState.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/StudentResultsTableFilters.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/StudentResultsTable.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/interactive-insights-students/partial-loading/partial-interactive-insights-students.scss","file:///app/packages/projects/lite/src/apps/my-shares/components/interactive-insights-students/partial-loading/PartialInteractiveInsightsStudents.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/interactive-insights-students/InteractiveInsightsStudents.tsx","file:///app/packages/projects/lite/src/apps/my-shares/utils/InsightsAppLinkUtils.ts","file:///app/packages/libs/shared/src/components/pill-tab-selector/pill-tab-selector.scss"],"sourcesContent":["import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\n\nimport { SvgContainer } from '../svg-container/SvgContainer';\n\nimport styles from './pill-tab-selector.scss';\n\ninterface TabContentsProps {\n tab: PillTab;\n}\n\nfunction TabContents(props: TabContentsProps): JSX.Element {\n return (\n <>\n {!!props.tab.svgName && (\n <div className={props.tab.name ? 'pe-1' : ''}>\n <SvgContainer svgName={props.tab.svgName} />\n </div>\n )}\n\n {props.tab.name}\n\n {typeof (props.tab.count) === 'number' && (\n <div className='ps-2'>\n <Badge type={BadgeType.Count} data={props.tab.count} />\n </div>\n )}\n </>\n );\n}\n\nexport interface PillTab {\n name: string;\n active: boolean;\n svgName?: string;\n\n className?: string;\n\n appLink?: Core.AppLink;\n onSelect?: () => void;\n\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n\n count?: number;\n}\n\ninterface PillTabSelectorProps {\n tabs: PillTab[];\n containerRef?: (el: HTMLElement) => void;\n listClassName?: string;\n className?: string;\n borderRadius?: 'sm' | 'lg'\n}\n\nPillTabSelector.defaultProps = {\n borderRadius: 'lg'\n};\n\nexport function PillTabSelector(props: PillTabSelectorProps): JSX.Element {\n function onSelectTab(tab: PillTab): void {\n if (tab.active || !tab.onSelect)\n return;\n\n tab.onSelect();\n\n if (tab.analyticsData && tab.analyticsOptions)\n AnalyticsHelper.logUserAction(tab.analyticsData, tab.analyticsOptions);\n }\n\n return (\n <nav className={props.className ?? ''} ref={props.containerRef}>\n <ul className={`\n list-unstyled d-inline-block m-0 ${styles.pillTabSelector}\n ${props.borderRadius ? styles.radiusSmall : ''}\n ${props.listClassName}\n `}>\n {props.tabs.map((tab, index) => {\n return (\n <li\n className={`\n p-0 ${styles.tab} ${tab.active ? 'btn btn-dark' : 'btn btn-outline-dark'}\n ${tab.name ? styles.minWidth : ''} ${tab.className}\n `}\n key={index}\n >\n {tab.appLink ? (\n <AppLink\n appLink={tab.appLink}\n analyticsData={tab.analyticsData}\n analyticsOptions={tab.analyticsOptions}\n className={`\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ${styles.tabLink}\n `}\n >\n <TabContents tab={tab} />\n </AppLink>\n ) : (\n <DivButton\n className={`\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ${styles.tabLink}\n `}\n onClick={() => onSelectTab(tab)}\n >\n <TabContents tab={tab} />\n </DivButton>\n )}\n </li>\n );\n })}\n </ul>\n </nav>\n );\n}\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}","import React from 'react';\n\nimport { StorageType } from 'libs/common/backbone/utils/LocalStorageHelper';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ViewModelKeys } from 'shared/constants/LiteViewModels';\n\nconst namespace = 'lite.insightsAdminAlert';\n\ninterface InsightsAdminAlertProps {\n hasAnalytics: boolean;\n analyticsUrl: string;\n video?: VideoTypes;\n}\n\n// eslint-disable-next-line rulesdir/require-view-title\nexport function InsightsAdminAlert(props: InsightsAdminAlertProps) {\n const [ show, setShow ] = useViewModel(\n ViewModelKeys.INSIGHTS_ADMIN_ALERT,\n true,\n { storage: StorageType.LocalStorage }\n );\n\n function onDismiss() {\n setShow(false);\n }\n\n function getAnalyticsUrl() {\n if (!props.video) return props.analyticsUrl;\n\n let videoRoute = '';\n\n if (props.video.typeId === MasterType.Interactive)\n videoRoute = `/interactives/${props.video.id}/views`;\n\n if (props.video.typeId === MasterType.Video)\n videoRoute = `/videos/${props.video.id}/views`;\n\n if (props.video.typeId === MasterType.Clip)\n videoRoute = `/clips/${props.video.id}/views`;\n\n return UrlHelper.safeUrlConcat(props.analyticsUrl, videoRoute);\n }\n\n if (!props.hasAnalytics || !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='adminAlert' />\n <a className='text-info' href={getAnalyticsUrl()} target='_blank'>\n <Text namespace={namespace} phrase='analytics' />\n </a>.\n </div>\n <IconButton svgName={cvSvgLibrary.Close} className='text-blue' onClick={onDismiss} />\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { StorageType } from 'libs/common/backbone/utils/LocalStorageHelper';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { DateRangeQueryParams } from 'libs/shared/apps/analytics/interfaces/DateRangeQueryParams';\nimport { ActionsDropdown } from 'libs/shared/components/actions/ActionsDropdown';\nimport { Breadcrumb, Breadcrumbs, PartialBreadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { PillTab, PillTabSelector } from 'libs/shared/components/pill-tab-selector/PillTabSelector';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { InsightsAdminAlert } from 'apps/my-shares/components/insights-admin-alert/InsightsAdminAlert';\n\nconst namespace = 'insights.header';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightsHeaderProps {\n video: VideoTypes;\n hasClassrooms?: boolean;\n dateRangeAppLinkParams?: DateRangeQueryParams;\n tabs: PillTab[]\n isDemo?: boolean;\n analyticsWebUrl?: string;\n hasAnalytics?: boolean;\n hasShareFlowV2?: boolean;\n shareId?: string;\n}\n\nexport function InsightsHeader(props: InsightsHeaderProps) {\n const [ anonymiseUsers, setAnonymiseUsers ] = useViewModel<boolean>(\n SharedViewModelKeys.ANONYMISE_USERS,\n false,\n { storage: StorageType.LocalStorage }\n );\n\n function getBreadcrumbs(): Breadcrumb[] {\n return [\n {\n name: 'Reports',\n appLink: {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.HOME\n }\n },\n {\n name: props.video.name,\n active: true\n }\n ];\n }\n\n function getActions() {\n const actions = [{\n label: 'Edit time range',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_GENERATE_REPORT,\n args: [props.video?.id]\n }\n },\n {\n label: 'Edit audience',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_GENERATE_REPORT,\n args: [props.video?.id]\n }\n }];\n\n if (props.video?.typeId === MasterType.Interactive) {\n actions.push({\n label: getPhrase('generateReport'),\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_GENERATE_REPORT,\n args: [props.video?.id]\n }\n });\n }\n\n return actions;\n }\n\n return (\n <div>\n <InsightsAdminAlert\n analyticsUrl={props.analyticsWebUrl}\n hasAnalytics={props.hasAnalytics}\n video={props.video}\n />\n <section className='mb-4'>\n <div className='mb-3'>\n <div className='d-flex justify-content-between align-items-center mb-3'>\n {props.video\n ? <Breadcrumbs breadcrumbs={getBreadcrumbs()} />\n : <PartialBreadcrumbs />\n }\n <ActionsDropdown\n dropdownToggleClassName='btn btn-outline-dark'\n actions={getActions()}\n />\n </div>\n </div>\n <div className='d-flex align-items-center mb-4'>\n <PillTabSelector tabs={props.tabs} />\n <div className='flex-grow-1' />\n <div className='d-flex gap-3'>\n <label htmlFor='anonymiseNames' className='mb-0'><Text namespace={namespace} phrase='anonymiseNames' /></label>\n <ToggleSwitch id='anonymiseNames' on={anonymiseUsers} onClick={() => setAnonymiseUsers(!anonymiseUsers)} />\n </div>\n </div>\n </section>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { FilterStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\n\n\nconst namespace = 'shared.studentResultsTable';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface StudentResultsEmptyStateProps {\n filter: FilterStudentsBy;\n notCompletedImageUrl: string;\n helpingHandImageUrl: string;\n markingRequiredImageUrl: string;\n emptyStateImageUrl: string;\n}\n\nexport function StudentResultsEmptyState(props: StudentResultsEmptyStateProps) {\n if (props.filter === 'not_completed') {\n return (\n <EmptyState className='bg-white rounded-bottom py-5'>\n <EmptyState.Image src={props.notCompletedImageUrl} size='small' />\n <EmptyState.Info>\n {getPhrase('notCompletedDescription')}\n </EmptyState.Info>\n </EmptyState>\n );\n }\n if (props.filter === 'marking_required') {\n return (\n <EmptyState className='bg-white rounded-bottom py-5'>\n <EmptyState.Image src={props.markingRequiredImageUrl} size='small' />\n <EmptyState.Info>\n {getPhrase('markingRequiredDescription')}\n </EmptyState.Info>\n </EmptyState>\n );\n }\n\n if (props.filter === 'helping_hand') {\n return (\n <EmptyState className='bg-white rounded-bottom py-5'>\n <EmptyState.Image src={props.helpingHandImageUrl} size='small' />\n <EmptyState.Info>\n {getPhrase('helpingHandDescription')}\n </EmptyState.Info>\n </EmptyState>\n );\n }\n\n return (\n <EmptyState className='bg-white rounded-bottom py-5'>\n <EmptyState.Image src={props.emptyStateImageUrl} size='small' />\n <EmptyState.Heading>\n {getPhrase('emptyStateHeading')}\n </EmptyState.Heading>\n <EmptyState.Info>\n {getPhrase('emptyStateDescription')}\n </EmptyState.Info>\n </EmptyState>\n );\n}","import React from 'react';\n\nimport { FilterStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'shared.studentResultsTable';\n\ninterface StudentResultsTableFiltersProps {\n filter: FilterStudentsBy;\n setFilter: (filter: FilterStudentsBy) => void;\n}\n\nexport function StudentResultsTableFilterButtons(props: StudentResultsTableFiltersProps) {\n function toggleFilter(selectedFilter: FilterStudentsBy) {\n const updatedFilter = props.filter === selectedFilter ? null : selectedFilter;\n\n props.setFilter(updatedFilter);\n }\n\n function isFilterSelected(filter: FilterStudentsBy) {\n return props.filter === filter;\n }\n\n function getClassName(filter: FilterStudentsBy) {\n return `btn btn-outline-dark ${isFilterSelected(filter) ? 'bg-dark text-white' : ''}`;\n }\n\n return (\n <div className='d-flex align-items-center mb-3'>\n <p className='h6 mb-0'><Text namespace={namespace} phrase='filters' /></p>\n <div className='d-flex border-start ps-3 ms-3 gap-2'>\n <button className={getClassName('not_completed')} onClick={() => toggleFilter('not_completed')}>\n <Text namespace={namespace} phrase='notCompletedFilter' />\n </button>\n <button className={getClassName('marking_required')} onClick={() => toggleFilter('marking_required')}>\n <Text namespace={namespace} phrase='markingRequiredFilter' />\n </button>\n <button className={getClassName('helping_hand')} onClick={() => toggleFilter('helping_hand')}>\n <Text namespace={namespace} phrase='helpingHandFilter' />\n </button>\n </div>\n </div>\n );\n}","import React from 'react';\nimport { Cell, Row, SortingRule } from 'react-table';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { StudentResultsEmptyState } from 'libs/shared/apps/analytics/components/student-results/student-results-table/StudentResultsEmptyState';\nimport { StudentResultsTableFilterButtons } from 'libs/shared/apps/analytics/components/student-results/student-results-table/StudentResultsTableFilters';\nimport { AnonSessions } from 'libs/shared/apps/analytics/hooks/UseAnonSessions';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { UserOrAnonSession } from 'libs/shared/apps/analytics/interfaces/UserOrAnonSession';\nimport { getUserOrAnonSession } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { FilterStudentsBy, getSortStudents, SortStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { Table, TableTheme } from 'libs/shared/components/table/Table';\nimport { Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\n\nimport {\n highlightColumns,\n highlightRows,\n RESULTS_COL_WIDTH,\n useGetFixedColumns,\n useGetResultColumns,\n useGetResultsTableData\n} from './StudentResultsTableUtils';\n\nimport styles from './student-results-table.scss';\n\nconst fixedTableTheme: TableTheme = {\n table: `${styles.fixedTable} bg-white rounded-start border border-end-0`,\n header: `${styles.header} border-bottom`,\n headerRow: 'h-100',\n headerCell: 'd-flex align-items-center justify-content-start',\n row: styles.row\n};\n\nconst resultsTableTheme: TableTheme = {\n header: `${styles.header} fw-bold`,\n headerRow: 'h-100',\n headerCell: `${styles.interactionHeaderCellOuter} bg-white border-bottom`,\n row: `${styles.row} ${styles.resultsRow}`,\n cell: styles.resultsCellOuter\n};\n\ninterface StudentResultsTableProps {\n interactive: Interactive;\n interactiveMetadata: InteractiveMetadata;\n results: InteractiveResultSet;\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 selectedStudentId?: string;\n emptyStateImageUrl?: string;\n notCompletedImageUrl?: string;\n helpingHandImageUrl?: string;\n markingRequiredImageUrl?: string;\n anonymiseUsers?: boolean;\n sortBy?: SortStudentsBy;\n filterBy?: FilterStudentsBy;\n anonSessions?: AnonSessions;\n viewStudentResults: (\n student: UserOrAnonSession,\n interactiveMetadataId: string,\n interactionId?: string\n ) => void;\n}\n\nexport function StudentResultsTable(props: StudentResultsTableProps): JSX.Element {\n const [ sortBy, setSortBy ] = React.useState<SortingRule<StudentResultsWithSummary>[]>(\n getSortStudents(props.sortBy, 'score')\n );\n const [ filter, setFilter ] = React.useState<FilterStudentsBy>(props.filterBy);\n\n const ref = React.useRef<HTMLDivElement>(null);\n\n const fixedColumns = useGetFixedColumns(props.results, props.anonSessions, props.anonymiseUsers);\n const resultColumns = useGetResultColumns(\n props.interactive,\n props.interactiveMetadata,\n props.results,\n onColumnHover,\n props.refreshTable\n );\n const data = useGetResultsTableData(\n props.interactive,\n props.results,\n props.refreshTable,\n props.anonymiseUsers,\n ArrayHelper.first(sortBy),\n filter\n );\n\n function onSelectStudent({ original }: Row<StudentResultsWithSummary>): void {\n props.viewStudentResults(getUserOrAnonSession(original, props.anonSessions), props.interactiveMetadata.id);\n }\n\n function onSelectStudentResponse(cell: Cell<StudentResultsWithSummary>): void {\n props.viewStudentResults(\n getUserOrAnonSession(cell.row.original, props.anonSessions),\n props.interactiveMetadata.id,\n cell.column.id\n );\n }\n\n function onColumnHover(index?: number): void {\n highlightColumns(ref.current, index);\n }\n\n function onRowHover(index?: number): void {\n highlightRows(ref.current, index);\n }\n\n return (\n <div>\n {!!props.results.students.length && <StudentResultsTableFilterButtons filter={filter} setFilter={setFilter} />}\n\n {!data.length && (\n <StudentResultsEmptyState\n emptyStateImageUrl={props.emptyStateImageUrl}\n helpingHandImageUrl={props.helpingHandImageUrl}\n markingRequiredImageUrl={props.markingRequiredImageUrl}\n notCompletedImageUrl={props.notCompletedImageUrl}\n filter={filter}\n />\n )}\n\n {!!data.length && (\n <div ref={ref} className={`d-flex${data.length ? ` ${styles.hasResults}` : ''}`}>\n <Table\n columns={fixedColumns}\n data={data}\n theme={fixedTableTheme}\n onSelectRow={onSelectStudent}\n onRowMouseOver={row => onRowHover(row.index)}\n onRowMouseLeave={() => onRowHover()}\n enableSort\n manualSort\n onSort={setSortBy}\n initialSortBy={sortBy}\n />\n <Table\n columns={resultColumns}\n data={data}\n theme={resultsTableTheme}\n enableSlider\n scrollIncrement={RESULTS_COL_WIDTH * 8}\n onSelectCell={onSelectStudentResponse}\n scrollContainerClassName='rounded-end border border-start-0 border'\n />\n </div>\n )}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialInsights\":\"qSeTe\"};","import React from 'react';\n\nimport styles from './partial-interactive-insights-students.scss';\n\nexport function PartialInteractiveInsightsStudents() {\n return (\n <div>\n <div className='d-flex align-items-center mb-3'>\n <p className='h6 px-4 mb-0 me-4 partial-loading-background'>&nbsp;</p>\n <div className='row g-2 w-50'>\n <div className='col-3'>\n <div className='p-2 rounded-1 partial-loading-background'>&nbsp;</div>\n </div>\n <div className='col-3'>\n <div className='p-2 rounded-1 partial-loading-background'>&nbsp;</div>\n </div>\n <div className='col-3'>\n <div className='p-2 rounded-1 partial-loading-background'>&nbsp;</div>\n </div>\n </div>\n </div>\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 React from 'react';\n\nimport { StudentResultsTable } from 'libs/shared/apps/analytics/components/student-results/student-results-table/StudentResultsTable';\nimport { AnonSessions } from 'libs/shared/apps/analytics/hooks/UseAnonSessions';\nimport { UserOrAnonSession } from 'libs/shared/apps/analytics/interfaces/UserOrAnonSession';\nimport { FilterStudentsBy, SortStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport { PartialInteractiveInsightsStudents } from 'apps/my-shares/components/interactive-insights-students/partial-loading/PartialInteractiveInsightsStudents';\n\ninterface InteractiveInsightsStudentsProps {\n interactive: Interactive;\n interactiveMetadata: InteractiveMetadata;\n results: InteractiveResultSet;\n isFetching: boolean;\n sortBy: SortStudentsBy;\n filterBy: FilterStudentsBy;\n anonymiseUsers: boolean;\n viewStudentResults: (\n user: UserOrAnonSession,\n interactiveMetadataId: string,\n interactionId?: string\n ) => void;\n hasDataLoaded: boolean;\n anonSessions?: AnonSessions;\n}\n\nexport function InteractiveInsightsStudents(props: InteractiveInsightsStudentsProps) {\n return (\n <>\n {!props.hasDataLoaded &&\n <PartialInteractiveInsightsStudents />\n }\n\n {props.hasDataLoaded &&\n <StudentResultsTable\n interactive={props.interactive}\n interactiveMetadata={props.interactiveMetadata}\n results={props.results}\n refreshTable={props.isFetching}\n viewStudentResults={props.viewStudentResults}\n emptyStateImageUrl={ImageUrls.Insights.NO_RESPONSES}\n sortBy={props.sortBy}\n filterBy={props.filterBy}\n anonymiseUsers={props.anonymiseUsers}\n notCompletedImageUrl={ImageUrls.Insights.JIGSAW}\n markingRequiredImageUrl={ImageUrls.Insights.CLIPBOARD}\n helpingHandImageUrl={ImageUrls.Insights.SPEECH_BUBBLE_HEART}\n anonSessions={props.anonSessions}\n />\n }\n </>\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'shared.insightsUtils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ntype InsightsTabs = 'insights' | 'heatmap' | 'results' | 'questions' | 'shareOptions' | 'videos';\n\nexport function getInsightsVideoTabs(\n id: string,\n active: InsightsTabs,\n params: HashObject,\n hasShareFlowV2: boolean = true\n) {\n const tabs = [\n {\n name: getPhrase('insights'),\n active: active === 'insights',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.VIDEO_OVERVIEW,\n args: [id],\n params\n }\n },\n {\n name: getPhrase('heatmap'),\n active: active === 'heatmap',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.VIDEO_HEATMAP,\n args: [id],\n params\n }\n }\n ];\n\n if (hasShareFlowV2) {\n return [\n {\n name: 'Report',\n active: active === 'shareOptions',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.VIDEO_SHARE_OPTIONS,\n args: [id],\n params\n }\n },\n ...tabs\n ];\n }\n\n return tabs;\n}\n\nexport function getInsightsClipTabs(\n id: string,\n active: InsightsTabs,\n params: HashObject,\n hasShareFlowV2: boolean = true\n) {\n const tabs = [\n {\n name: getPhrase('insights'),\n active: active === 'insights',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.CLIP_OVERVIEW,\n args: [id],\n params\n }\n },\n {\n name: getPhrase('heatmap'),\n active: active === 'heatmap',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.CLIP_HEATMAP,\n args: [id],\n params\n }\n }\n ];\n\n if (hasShareFlowV2) {\n return [\n {\n name: 'Report',\n active: active === 'shareOptions',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.CLIP_SHARE_OPTIONS,\n args: [id],\n params\n }\n },\n ...tabs\n ];\n }\n\n return tabs;\n}\n\nexport function getInsightsInteractiveTabs(\n id: string,\n active: InsightsTabs,\n params: HashObject,\n hasShareFlowV2: boolean = true\n) {\n const tabs = [\n {\n name: getPhrase('insights'),\n active: active === 'insights',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_OVERVIEW,\n args: [id],\n params\n }\n },\n {\n name: getPhrase('results'),\n active: active === 'results',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_STUDENTS,\n args: [id],\n params\n }\n },\n {\n name: getPhrase('questions'),\n active: active === 'questions',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_QUESTIONS,\n args: [id],\n params\n }\n },\n {\n name: getPhrase('heatmap'),\n active: active === 'heatmap',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_HEATMAP,\n args: [id],\n params\n }\n }\n ];\n\n if (hasShareFlowV2) {\n return [\n {\n name: 'Report',\n active: active === 'shareOptions',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_SHARE_OPTIONS,\n args: [id],\n params\n }\n },\n ...tabs\n ];\n }\n\n return tabs;\n}\n\nexport function getInsightsDemoInteractiveTabs(id: string, active: InsightsTabs, params: HashObject) {\n return [\n {\n name: getPhrase('insights'),\n active: active === 'insights',\n appLink: {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_OVERVIEW_DEMO,\n args: [id],\n params\n }\n },\n {\n name: getPhrase('results'),\n active: active === 'results',\n appLink: {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_STUDENTS_DEMO,\n args: [id],\n params\n }\n },\n {\n name: getPhrase('questions'),\n active: active === 'questions',\n appLink: {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_QUESTIONS_DEMO,\n args: [id],\n params\n }\n },\n {\n name: getPhrase('heatmap'),\n active: active === 'heatmap',\n appLink: {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_HEATMAP_DEMO,\n args: [id],\n params\n }\n }\n ];\n}\n\nexport function getInsightsSeriesTabs(\n id: string,\n active: InsightsTabs,\n params: HashObject\n) {\n const tabs = [\n {\n name: 'Report',\n active: active === 'shareOptions',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.SERIES_SHARE_OPTIONS,\n args: [id],\n params\n }\n },\n {\n name: 'Videos',\n active: active === 'videos',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.SERIES_VIDEOS,\n args: [id],\n params\n }\n }\n ];\n\n return tabs;\n}\n\nexport function getInsightsPlaylistTabs(\n id: string,\n active: InsightsTabs,\n params: HashObject\n) {\n const tabs = [\n {\n name: 'Report',\n active: active === 'shareOptions',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.PLAYLIST_SHARE_OPTIONS,\n args: [id],\n params\n }\n },\n {\n name: 'Videos',\n active: active === 'videos',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.PLAYLIST_VIDEOS,\n args: [id],\n params\n }\n }\n ];\n\n return tabs;\n}","// extracted by mini-css-extract-plugin\nexport default {\"pillTabSelector\":\"Hdi6o\",\"tab\":\"RvNxr\",\"minWidth\":\"GHSz9\",\"radiusSmall\":\"VhJJa\",\"tabLink\":\"WFyvo\"};"],"names":["TabContents","props","tab","svgName","className","name","count","type","data","PillTabSelector","ref","containerRef","borderRadius","listClassName","tabs","map","index","active","key","appLink","analyticsData","analyticsOptions","onClick","onSelect","onSelectTab","defaultProps","DragOverlayStyles","opacity","cursor","calculateScrollState","canScrollLeft","current","scrollLeft","canScrollRight","scrollWidth","clientWidth","SortIndicator","column","canSort","isSorted","theme","sortIndicator","SvgContainer","isSortedDesc","size","S","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","renderCells","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","namespace","InsightsAdminAlert","storage","show","setShow","hasAnalytics","phrase","href","video","analyticsUrl","videoRoute","typeId","getAnalyticsUrl","target","getPhrase","InsightsHeader","actions","anonymiseUsers","setAnonymiseUsers","analyticsWebUrl","breadcrumbs","application","action","dropdownToggleClassName","label","args","push","htmlFor","on","LanguageService","StudentResultsEmptyState","filter","EmptyState","src","notCompletedImageUrl","markingRequiredImageUrl","helpingHandImageUrl","emptyStateImageUrl","StudentResultsTableFilterButtons","toggleFilter","selectedFilter","updatedFilter","setFilter","getClassName","isFilterSelected","Text","fixedTableTheme","resultsTableTheme","StudentResultsTable","setSortBy","filterBy","fixedColumns","results","anonSessions","resultColumns","interactive","interactiveMetadata","refreshTable","ArrayHelper","onRowHover","students","viewStudentResults","onRowMouseOver","onRowMouseLeave","PartialInteractiveInsightsStudents","InteractiveInsightsStudents","hasDataLoaded","isFetching","ImageUrls","getInsightsVideoTabs","params","hasShareFlowV2","getInsightsClipTabs","getInsightsInteractiveTabs","getInsightsDemoInteractiveTabs","getInsightsSeriesTabs","getInsightsPlaylistTabs"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[396],{26025:(e,t,r)=>{r.d(t,{B:()=>s});var a=r(1048),n=r(75795),s={getAudienceAppLinkParams:function(){var e=n.O.getCurrentRoute().appLink,t=a.t.isObject(e.params)?e.params:{},r=t.users,s=t.classrooms,o=t.classroomGroups,i=function(e){var r=t[e];if(r)return Array.isArray(r)?r:[r]},c={};return r&&(c.users=i("users")),s&&(c.classrooms=i("classrooms")),o&&(c.classroomGroups=i("classroomGroups")),c},getDateRangeAppLinkParams:function(){var e=n.O.getCurrentRoute().appLink,t=a.t.isObject(e.params)?e.params:{},r=t.from,s=t.to,o=t.rangeName,i={};return r&&(i.from=r),s&&(i.to=s),o&&(i.rangeName=o),i}}},26136:(e,t,r)=>{r.d(t,{B2:()=>i,DV:()=>l,jP:()=>c});var a=r(76198),n=r(23481),s=r(64818),o=n.T.encloseNamespace("shared.analyticsUtils");function i(e,t){return e?t?(0,a._8)((r="sessionId"in e?e.sessionName:e.id,n=+"".concat(r).concat(Math.floor((new Date).getMinutes()/5)),{dictionaries:[a.O9,a.yd],separator:" ",length:2,style:"capital",seed:n})):"sessionId"in e?e.sessionName:s.l.getFullName(e):"";var r,n}function c(e,t){var r={sessionId:e,sessionName:o("anonymousUser")};return e&&t&&t[e]||r}function l(e,t){return e.user?e.user:c(e.sessionId,t)}},74901:(e,t,r)=>{function a(e){return function(e){if(Array.isArray(e))return n(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 n(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)?n(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.")}()}function n(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,a=Array(t);r<t;r++)a[r]=e[r];return a}r.d(t,{K:()=>s});var s=function(e){var t=[],r=[];return e.users&&t.push.apply(t,a(e.users)),e.classrooms&&r.push.apply(r,a(e.classrooms)),e.classroomGroups&&r.push.apply(r,a(e.classroomGroups)),{userId:t,groupId:r}}},40003:(e,t,r)=>{r.d(t,{Hb:()=>i,wO:()=>l});var a=r(23481),n=r(110),s=(r(57266),a.T.encloseNamespace("shared.analyticsUtils"));function o(e){var t=n.O.convertDateToUTC(e);return n.O.format(t,"YYYY-MM-DDTHH:mm:ss")}function i(){var e=new Date(2021,0,1),t=(new Date).getFullYear(),r=t===e.getFullYear();return[{name:s("today"),startDate:new Date,endDate:new Date},{name:s("thisMonth"),startDate:new Date(t,(new Date).getMonth(),1),endDate:new Date},{name:s("lastThreeMonths"),startDate:new Date(t,(new Date).getMonth()-2,1),endDate:new Date},{name:s("lastSixMonths"),startDate:new Date(t,(new Date).getMonth()-5,1),endDate:new Date},{name:s("thisYear"),startDate:new Date(t,0,1),endDate:new Date},{name:s("lastYear"),startDate:new Date(t-1,0,1),endDate:new Date(t,0,0),disabled:r,tooltip:r?s("lastYearDisabled"):""},{name:s("allTime"),startDate:n.O.subtract(new Date,5,"years"),endDate:new Date,default:!0}]}function c(e){return n.O.format(e,"YYYY-MM-DD")}function l(e,t){var r=function(e){return o(n.O.startOf(e,"day"))},a=function(e){return o(n.O.endOf(e,"day"))},s=function(e,t){if(t)return e.find((function(e){return e.name===t}))}(e,t.rangeName);if(s)return{start:r(c(s.startDate)),end:a(c(s.endDate))};if(t.from&&t.to)return{start:r(t.from),end:a(t.to)};var i=e.find((function(e){return!!e.default}));return{start:r(c(i.startDate)),end:a(c(i.endDate))}}},40782:(e,t,r)=>{r.d(t,{I:()=>a,O:()=>c});var a,n=r(32735),s=r(2606),o=r(362);function i(e){var t=n.useCallback((function(t){if(t){var r=t.r.baseVal.value,a=2*Math.PI*r,n=a-e.percentage*a;t.style.strokeDasharray="".concat(a," ").concat(a),t.style.strokeDashoffset=n.toString()}}),[e.percentage]);return n.createElement("svg",null,n.createElement("circle",{r:(0,s.pu)(e.size),className:o.Z.backgroundCircle}),!(0,s.zR)(e.percentage)&&n.createElement("circle",{ref:t,r:(0,s.pu)(e.size),className:(0,s.V4)(e.percentage,e.scoreThresholds)}))}function c(e){var t,r=(0,s.Ki)(e.percentage),c=e.size||(e.layout===a.LabelInside?s.Mk.Large:s.Mk.Small),l=e.customLabel||(0,s.DV)(r);return e.layout===a.LabelOnly?n.createElement("span",{className:(0,s.IA)(r)},l):n.createElement("div",{className:"d-flex align-items-center justify-content-between ".concat(null!==(t=e.className)&&void 0!==t?t:"")},e.layout===a.LabelBefore&&n.createElement("span",{className:"me-2"},l),n.createElement("div",{className:(0,s.tw)(c,r)},n.createElement(i,{percentage:r,size:c,scoreThresholds:e.scoreThresholds}),e.layout===a.LabelInside&&n.createElement("span",{className:o.Z.centredPercentageText},l)))}!function(e){e.CircleOnly="circle_only",e.LabelOnly="label_only",e.LabelBefore="label_before",e.LabelInside="label_inside"}(a||(a={})),c.defaultProps={layout:a.CircleOnly}},2606:(e,t,r)=>{r.d(t,{DV:()=>y,IA:()=>d,Ki:()=>g,Mk:()=>i,V4:()=>f,pu:()=>m,tw:()=>p,zR:()=>v});var a=r(94892),n=r(362);function s(e){return s="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},s(e)}function o(e,t,r){return(t=function(e){var t=function(e){if("object"!=s(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var r=t.call(e,"string");if("object"!=s(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==s(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var i,c=.2,l=.36;!function(e){e.Small="small",e.Large="large",e.ExtraSmall="extraSmall"}(i||(i={}));var u=o(o(o({},i.ExtraSmall,{size:2}),i.Small,{size:2}),i.Large,{size:5.8});function m(e){var t=u[e].size,r=e===i.Large?l:c;return"".concat(t/2-2*r,"rem")}function f(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:a.i;return e>=t.HIGH?n.Z.circleSuccess:e>=t.MODERATE?n.Z.circleWarning:n.Z.circleDanger}function d(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:a.i;return e>=t.HIGH?"text-success":e>=t.MODERATE?"text-warning":"text-danger"}function p(e,t){var r="d-inline-block ".concat(n.Z.circleContainer);return e===i.Large&&(r+=" ".concat(n.Z.lgCircleContainer)),e===i.ExtraSmall&&(r+=" ".concat(n.Z.xsCircleContainer)),v(t)&&(r+=" ".concat(n.Z.pendingCircle)),r}function g(e){if(!v(e))return+e.toFixed(2)}function y(e){return v(e)?"--%":"".concat(Math.round(100*e),"%")}function v(e){return"number"!=typeof e}},94892:(e,t,r)=>{r.d(t,{T:()=>n,i:()=>a});var a={HIGH:.75,MODERATE:.5},n={HIGH:.7,MODERATE:.7}},62875:(e,t,r)=>{function a(e,t,r){var a="".concat(e,":").concat(t.start,":").concat(t.end),n=Array.isArray(t.userId)?t.userId.sort().join(":"):t.userId,s=Array.isArray(t.groupId)?t.groupId.sort().join(":"):t.groupId;return n&&(a+=":".concat(n)),s&&(a+=":".concat(s)),r&&(a+=":".concat(r)),a}r.d(t,{H:()=>a})},57266:(e,t,r)=>{r.d(t,{e:()=>o});var a=r(81886),n=r(1048),s=r(75795),o={updateParams:function(e,t){var r=s.O.getCurrentRoute().appLink,o="string"==typeof r.params?a.Q.Ab.DeserializeQueryParams(r.params):r.params;t.keysToRemove&&(o=n.t.omit(o,t.keysToRemove));var i=(null==t?void 0:t.merge)?Object.assign(Object.assign({},o),e):e,c=Object.assign(Object.assign({},r),{params:i});n.t.isEqual(r,c)||a.Q.C$.trigger(c,n.t.omit(t,["merge","keysToRemove"]))}}},362:(e,t,r)=>{r.d(t,{Z:()=>a});const a={circleContainer:"p8Vgz",backgroundCircle:"asGGE",circleSuccess:"PXLNj",circleWarning:"ZckRN",circleDanger:"slBRg",lgCircleContainer:"N8KCI",xsCircleContainer:"RPqZ2",pendingCircle:"DKrcq",centredPercentageText:"tpmLR"}}}]);
2
- //# sourceMappingURL=396-2ffc09cc70-lite.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/396-2ffc09cc70-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/analytics/utils/AnalyticsFilterUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/AnonymiseUserUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/AudienceUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/DateRangeUtils.ts","file:///app/packages/libs/shared/src/components/percentage-indicator/PercentageIndicator.tsx","file:///app/packages/libs/shared/src/components/percentage-indicator/PercentageIndicatorUtils.ts","file:///app/packages/libs/shared/src/constants/ScoreThresholds.ts","file:///app/packages/libs/shared/src/utils/AnalyticsRequestUtils.ts","file:///app/packages/libs/shared/src/utils/AppRouteHelper.ts","file:///app/packages/libs/shared/src/components/percentage-indicator/percentage-indicator.scss"],"sourcesContent":["import { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AudienceQueryParams } from 'libs/shared/apps/analytics/interfaces/AudienceQueryParams';\nimport { DateRangeQueryParams } from 'libs/shared/apps/analytics/interfaces/DateRangeQueryParams';\nimport { ContextService } from 'libs/shared/services/ContextService';\n\nexport const AnalyticsFilterHelper = {\n getAudienceAppLinkParams: () => {\n const { appLink } = ContextService.getCurrentRoute();\n const params = ObjectHelper.isObject(appLink.params) ? appLink.params as HashObject : {};\n const { users, classrooms, classroomGroups } = params;\n\n const getParam = (key: keyof AudienceQueryParams) => {\n const param = params[key];\n\n if (!param)\n return;\n\n return Array.isArray(param) ? param : [param];\n };\n\n const audienceFilters: AudienceQueryParams = {};\n\n if (users)\n audienceFilters.users = getParam('users');\n\n if (classrooms)\n audienceFilters.classrooms = getParam('classrooms');\n\n if (classroomGroups)\n audienceFilters.classroomGroups = getParam('classroomGroups');\n\n return audienceFilters;\n },\n getDateRangeAppLinkParams: () => {\n const { appLink } = ContextService.getCurrentRoute();\n const params = ObjectHelper.isObject(appLink.params) ? appLink.params as HashObject : {};\n const { from, to, rangeName } = params;\n\n const dateRangeFilters: DateRangeQueryParams = {};\n\n if (from)\n dateRangeFilters.from = from;\n\n if (to)\n dateRangeFilters.to = to;\n\n if (rangeName)\n dateRangeFilters.rangeName = rangeName;\n\n return dateRangeFilters;\n }\n};","import { animals, colors, Config as UniqueNamesConfig, uniqueNamesGenerator } from 'unique-names-generator';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AnonSession, AnonSessions } from 'libs/shared/apps/analytics/hooks/UseAnonSessions';\nimport { UserOrAnonSession } from 'libs/shared/apps/analytics/interfaces/UserOrAnonSession';\nimport { StudentResults } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nconst namespace = 'shared.analyticsUtils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getUniqueNamesConfig(id: string): UniqueNamesConfig {\n /**\n * Generate a seed that is unique to each user but changes every 5 minutes.\n * \n * We use a seed so that if the same user's name is anonymised multiple times\n * in quick succession (e.g. multiple renders), the same name will be returned each time.\n * \n * We change the seed every 5 minutes so that students don't always have the same name.\n */\n const seed = +`${id}${Math.floor((new Date()).getMinutes() / 5)}`;\n\n return {\n dictionaries: [ colors, animals ],\n separator: ' ',\n length: 2,\n style: 'capital',\n seed\n };\n}\n\nexport function anonymiseUserName(user: UserOrAnonSession, shouldAnonymise: boolean): string {\n if (!user)\n return '';\n\n if (!shouldAnonymise)\n return 'sessionId' in user ? user.sessionName : UserHelper.getFullName(user);\n\n return uniqueNamesGenerator(getUniqueNamesConfig('sessionId' in user ? user.sessionName : user.id));\n}\n\nexport function getAnonSession(sessionId: string, anonSessions: AnonSessions): AnonSession {\n const fallback = {\n sessionId: sessionId,\n sessionName: getPhrase('anonymousUser')\n };\n\n if (!sessionId || !anonSessions)\n return fallback;\n\n const anonSession = anonSessions[sessionId];\n\n if (anonSession)\n return anonSession;\n\n return fallback;\n}\n\nexport function getUserOrAnonSession(result: StudentResults, anonSessions: AnonSessions): UserOrAnonSession {\n if (result.user)\n return result.user;\n\n return getAnonSession(result.sessionId, anonSessions);\n}\n","import { AudienceQueryParams } from 'libs/shared/apps/analytics/interfaces/AudienceQueryParams';\n\nexport const getAudienceParams = (queryParams: AudienceQueryParams) => {\n const userId: string[] = [];\n const groupId: string[] = [];\n\n if (queryParams.users)\n userId.push(...queryParams.users);\n\n if (queryParams.classrooms)\n groupId.push(...queryParams.classrooms);\n\n if (queryParams.classroomGroups)\n groupId.push(...queryParams.classroomGroups);\n return {\n userId,\n groupId\n };\n};","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { DateRangeQueryParams } from 'libs/shared/apps/analytics/interfaces/DateRangeQueryParams';\nimport { FilterQueryParams } from 'libs/shared/apps/analytics/interfaces/FilterQueryParams';\nimport { DateRange } from 'libs/shared/interfaces';\nimport { AppRouteHelper } from 'libs/shared/utils/AppRouteHelper';\n\nconst namespace = 'shared.analyticsUtils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function convertDateToUtcDateTimeString(date: Date): string {\n const utc = DateHelper.convertDateToUTC(date);\n return DateHelper.format(utc, 'YYYY-MM-DDTHH:mm:ss');\n}\n\nexport function getMinDate(): Date {\n return new Date(2021, 0, 1);\n}\n\nexport function getMaxDate(): Date {\n return new Date();\n}\n\nexport function getDefaultDateRange(dateRangePresets: DateRange[]): DateRange {\n return dateRangePresets.find(range => !!range.default);\n}\n\nexport function getPresetRangeByName(dateRangePresetss: DateRange[], rangeName: string): DateRange | undefined {\n if (!rangeName)\n return;\n\n const presets = dateRangePresetss;\n \n return presets.find(p => p.name === rangeName);\n}\n\nexport function getGenericDateRangePresets(): DateRange[] {\n const minDate = getMinDate();\n const currentYear = (new Date()).getFullYear();\n\n const isMinDateThisYear = currentYear === minDate.getFullYear();\n\n return [\n {\n name: getPhrase('today'),\n startDate: new Date(),\n endDate: new Date()\n },\n {\n name: getPhrase('thisMonth'),\n startDate: new Date(currentYear, new Date().getMonth(), 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastThreeMonths'),\n startDate: new Date(currentYear, new Date().getMonth() - 2, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastSixMonths'),\n startDate: new Date(currentYear, new Date().getMonth() - 5, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastTwelveMonths'),\n startDate: new Date(currentYear, new Date().getMonth() - 11, 1),\n endDate: new Date(),\n default: true\n },\n {\n name: getPhrase('thisYear'),\n startDate: new Date(currentYear, 0, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastYear'),\n startDate: new Date(currentYear - 1, 0, 1),\n endDate: new Date(currentYear, 0, 0),\n disabled: isMinDateThisYear,\n tooltip: isMinDateThisYear ? getPhrase('lastYearDisabled') : ''\n }\n ];\n}\n\nexport function getInsightsDateRangePresets(): DateRange[] {\n const minDate = getMinDate();\n const currentYear = (new Date()).getFullYear();\n\n const isMinDateThisYear = currentYear === minDate.getFullYear();\n\n return [\n {\n name: getPhrase('today'),\n startDate: new Date(),\n endDate: new Date()\n },\n {\n name: getPhrase('thisMonth'),\n startDate: new Date(currentYear, new Date().getMonth(), 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastThreeMonths'),\n startDate: new Date(currentYear, new Date().getMonth() - 2, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastSixMonths'),\n startDate: new Date(currentYear, new Date().getMonth() - 5, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('thisYear'),\n startDate: new Date(currentYear, 0, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastYear'),\n startDate: new Date(currentYear - 1, 0, 1),\n endDate: new Date(currentYear, 0, 0),\n disabled: isMinDateThisYear,\n tooltip: isMinDateThisYear ? getPhrase('lastYearDisabled') : ''\n },\n {\n name: getPhrase('allTime'),\n startDate: DateHelper.subtract(new Date(), 5, 'years'),\n endDate: new Date(),\n default: true\n }\n ];\n}\n\nexport function formatDateQueryParam(date: Date): string {\n return DateHelper.format(date, 'YYYY-MM-DD');\n}\n\nexport function getRouteQueryParams(dateRange: DateRange): DateRangeQueryParams {\n if (dateRange.name)\n return { rangeName: dateRange.name };\n\n return {\n from: formatDateQueryParam(dateRange.startDate),\n to: formatDateQueryParam(dateRange.endDate)\n };\n}\n\nexport function useGetDateRangeFromQueryParams(\n dateRangePresets: DateRange[],\n dateRangeQueryParams: DateRangeQueryParams\n): DateRange | null {\n const { to, from, rangeName } = dateRangeQueryParams;\n \n const presetRange = getPresetRangeByName(dateRangePresets, rangeName);\n\n if (presetRange) {\n if (!from && !to)\n return presetRange;\n\n /**\n * If a rangeName has been set, we don't use to and from so we remove them from the url params.\n */\n AppRouteHelper.updateParams(\n getRouteQueryParams(presetRange),\n { replace: true, merge: true, keysToRemove: [ 'from', 'to' ]}\n );\n return;\n }\n\n const defaultDateRange = getDefaultDateRange(dateRangePresets);\n\n /**\n * If a param is missing, or one of them isn't a valid date, short-circuit the logic below.\n */\n if (!from || !to || !DateHelper.isValid(from) || !DateHelper.isValid(to)) {\n AppRouteHelper.updateParams(\n getRouteQueryParams(defaultDateRange),\n { replace: true, merge: true, keysToRemove: ['rangeName']}\n );\n return;\n }\n\n let initialDateRangeValid = true;\n\n let startDate = DateHelper.convertDateToUTC(new Date(from));\n let endDate = DateHelper.convertDateToUTC(new Date(to));\n\n if (DateHelper.isBefore(startDate, getMinDate(), 'day')) {\n startDate = getMinDate();\n initialDateRangeValid = false;\n }\n\n if (DateHelper.isAfter(endDate, getMaxDate(), 'day')) {\n endDate = getMaxDate();\n initialDateRangeValid = false;\n }\n\n if (DateHelper.isAfter(startDate, endDate)) {\n startDate = defaultDateRange.startDate;\n endDate = defaultDateRange.endDate;\n initialDateRangeValid = false;\n }\n\n const dateRange: DateRange = {\n startDate,\n endDate,\n name: initialDateRangeValid\n ? rangeName || 'custom'\n : ''\n };\n\n if (initialDateRangeValid)\n return dateRange;\n\n /**\n * If one or both of the date params were invalid, we trigger a route update.\n */\n AppRouteHelper.updateParams(getRouteQueryParams(dateRange), { replace: true, merge: true, keysToRemove: ['rangeName']});\n}\n\nexport function getStartEndParams(\n dateRangePresetss: DateRange[],\n filterParams: FilterQueryParams\n): { start: string; end: string } {\n const getStartDate = (date: string) => convertDateToUtcDateTimeString(DateHelper.startOf(date, 'day'));\n const getEndDate = (date: string) => convertDateToUtcDateTimeString(DateHelper.endOf(date, 'day'));\n\n const presetRange = getPresetRangeByName(dateRangePresetss, filterParams.rangeName);\n\n /**\n * If the user has chosen a preset range, lookup the start and end dates as they won't be\n * in the query params.\n */\n if (presetRange)\n return {\n start: getStartDate(formatDateQueryParam(presetRange.startDate)),\n end: getEndDate(formatDateQueryParam(presetRange.endDate))\n };\n\n /**\n * If they have chosen a custom date range, use their chosen start and end dates.\n */\n if (filterParams.from && filterParams.to)\n return {\n start: getStartDate(filterParams.from),\n end: getEndDate(filterParams.to)\n };\n\n /**\n * The below should never be hit\n */\n const defaultRange = getDefaultDateRange(dateRangePresetss);\n\n return {\n start: getStartDate(formatDateQueryParam(defaultRange.startDate)),\n end: getEndDate(formatDateQueryParam(defaultRange.endDate))\n };\n}","import React from 'react';\n\nimport { ScoreThresholds } from 'libs/shared/constants/ScoreThresholds';\n\nimport {\n getCircleClassName,\n getCircleContainerClassName,\n getCircleRadius,\n getColouredLabelClassName,\n getFormattedPercentage,\n getPercentageToFixed,\n isPending,\n ProgressCircleSize\n} from './PercentageIndicatorUtils';\n\nimport styles from './percentage-indicator.scss';\n\ninterface ProgressCircleProps {\n size: ProgressCircleSize;\n scoreThresholds?: ScoreThresholds;\n percentage?: number;\n}\n\nfunction ProgressCircle(props: ProgressCircleProps): JSX.Element {\n const ref = React.useCallback((circle: SVGCircleElement) => {\n if (!circle)\n return;\n\n const radius = circle.r.baseVal.value;\n const circumference = 2 * Math.PI * radius;\n const offset = circumference - props.percentage * circumference;\n\n circle.style.strokeDasharray = `${circumference} ${circumference}`;\n circle.style.strokeDashoffset = offset.toString();\n }, [props.percentage]);\n\n return (\n <svg>\n <circle r={getCircleRadius(props.size)} className={styles.backgroundCircle} />\n {!isPending(props.percentage) &&\n <circle\n ref={ref}\n r={getCircleRadius(props.size)}\n className={getCircleClassName(props.percentage, props.scoreThresholds)}\n />\n }\n </svg>\n );\n}\n\nexport enum PercentageIndicatorLayout {\n CircleOnly = 'circle_only',\n LabelOnly = 'label_only',\n LabelBefore = 'label_before',\n LabelInside = 'label_inside'\n}\n\ninterface PercentageIndicatorProps {\n layout: PercentageIndicatorLayout;\n percentage?: number; // Between 0 and 1 or undefined for pending\n className?: string;\n customLabel?: string;\n scoreThresholds?: ScoreThresholds;\n size?: ProgressCircleSize;\n}\n\nPercentageIndicator.defaultProps = {\n layout: PercentageIndicatorLayout.CircleOnly\n};\n\nexport function PercentageIndicator(props: PercentageIndicatorProps): JSX.Element {\n const percentageToFixed = getPercentageToFixed(props.percentage);\n\n const size = props.size ||\n (props.layout === PercentageIndicatorLayout.LabelInside\n ? ProgressCircleSize.Large\n : ProgressCircleSize.Small\n );\n\n const label = props.customLabel || getFormattedPercentage(percentageToFixed);\n\n if (props.layout === PercentageIndicatorLayout.LabelOnly)\n return (\n <span className={getColouredLabelClassName(percentageToFixed)}>\n {label}\n </span>\n );\n\n return (\n <div className={`d-flex align-items-center justify-content-between ${props.className ?? ''}`}>\n {props.layout === PercentageIndicatorLayout.LabelBefore &&\n <span className='me-2'>\n {label}\n </span>\n }\n <div className={getCircleContainerClassName(size, percentageToFixed)}>\n <ProgressCircle percentage={percentageToFixed} size={size} scoreThresholds={props.scoreThresholds} />\n {props.layout === PercentageIndicatorLayout.LabelInside &&\n <span className={styles.centredPercentageText}>\n {label}\n </span>\n }\n </div>\n </div>\n );\n}","import { ScoreThresholdDefaults, ScoreThresholds } from 'libs/shared/constants/ScoreThresholds';\n\nimport styles from './percentage-indicator.scss';\n\n/**\n * Values for width and strokeWidth are taken from progress-circle.scss.\n * If either are changed, they must be updated in both places.\n */\nconst CIRCLE_WIDTH = 2; // rem\nconst CIRCLE_WIDTH_LG = 5.8; // rem\nconst CIRCLE_STROKE_WIDTH = 0.2; // rem\nconst CIRCLE_STROKE_WIDTH_LG = 0.36; // rem\n \nexport enum ProgressCircleSize {\n Small = 'small',\n Large = 'large',\n ExtraSmall = 'extraSmall'\n}\n\nconst ProgressCircleSizeMap = {\n [ProgressCircleSize.ExtraSmall]: {\n size: CIRCLE_WIDTH\n },\n [ProgressCircleSize.Small]: {\n size: CIRCLE_WIDTH\n },\n [ProgressCircleSize.Large]: {\n size: CIRCLE_WIDTH_LG\n }\n};\n\n/**\n * radius = width / 2 - strokeWidth * 2\n */\nexport function getCircleRadius(size: ProgressCircleSize): string {\n const width = ProgressCircleSizeMap[size].size;\n const strokeWidth = size === ProgressCircleSize.Large ? CIRCLE_STROKE_WIDTH_LG : CIRCLE_STROKE_WIDTH;\n return `${width / 2 - strokeWidth * 2}rem`;\n}\n \nexport function getCircleClassName(\n percentage: number,\n scoreThresholds: ScoreThresholds = ScoreThresholdDefaults\n): string {\n if (percentage >= scoreThresholds.HIGH)\n return styles.circleSuccess;\n \n if (percentage >= scoreThresholds.MODERATE)\n return styles.circleWarning;\n \n return styles.circleDanger;\n}\n \nexport function getColouredLabelClassName(\n percentage: number,\n scoreThresholds: ScoreThresholds = ScoreThresholdDefaults\n): string {\n if (percentage >= scoreThresholds.HIGH)\n return 'text-success';\n \n if (percentage >= scoreThresholds.MODERATE)\n return 'text-warning';\n \n return 'text-danger';\n}\n \nexport function getCircleContainerClassName(size: ProgressCircleSize, percentage?: number): string {\n let className = `d-inline-block ${styles.circleContainer}`;\n \n if (size === ProgressCircleSize.Large)\n className += ` ${styles.lgCircleContainer}`;\n\n if (size === ProgressCircleSize.ExtraSmall)\n className += ` ${styles.xsCircleContainer}`;\n\n if (isPending(percentage))\n className += ` ${styles.pendingCircle}`;\n \n return className;\n}\n\nexport function getPercentageToFixed(percentage?: number): number | undefined {\n if (isPending(percentage))\n return;\n \n return +percentage.toFixed(2);\n}\n \nexport function getFormattedPercentage(percentage?: number): string {\n if (isPending(percentage))\n return `--%`;\n\n return `${Math.round(percentage * 100)}%`;\n}\n\nexport function isPending(percentage?: number): boolean {\n return typeof percentage !== 'number';\n}","export interface ScoreThresholds {\n HIGH: number;\n MODERATE: number;\n}\n\nexport const ScoreThresholdDefaults: ScoreThresholds = {\n HIGH: 0.75,\n MODERATE: 0.5\n};\n\nexport const ScoreThresholdInsights: ScoreThresholds = {\n HIGH: 0.7,\n MODERATE: 0.7\n};","import { AnalyticsRequestFilter } from 'libs/shared/interfaces';\n\nexport function getAnalyticsRequestKey(baseKey: string, filter: AnalyticsRequestFilter, sharerId?: string): string {\n let key = `${baseKey}:${filter.start}:${filter.end}`;\n\n const userIdKey = Array.isArray(filter.userId) ? filter.userId.sort().join(':') : filter.userId;\n const groupIdKey = Array.isArray(filter.groupId) ? filter.groupId.sort().join(':') : filter.groupId;\n\n if (userIdKey)\n key += `:${userIdKey}`;\n\n if (groupIdKey)\n key += `:${groupIdKey}`;\n\n if (sharerId)\n key += `:${sharerId}`;\n\n return key;\n}","import { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { ContextService } from 'libs/shared/services/ContextService';\n\ninterface UpdateParamsOptions extends Core.AppLinkOptions {\n merge?: boolean;\n keysToRemove?: string[]\n}\n\nexport const AppRouteHelper = {\n /**\n * Utility to update the params on the current appRoute.\n * \n * This is built on top of ContextService rather than build into AppLink\n * as we will generally only want to update params on appRoutes, not appLinks.\n */\n updateParams(params: HashObject, options?: UpdateParamsOptions): void {\n const { appLink } = ContextService.getCurrentRoute();\n\n let currentParams = typeof(appLink.params) === 'string'\n ? Core.LocationUtils.DeserializeQueryParams(appLink.params)\n : appLink.params as HashObject;\n\n if (options.keysToRemove)\n currentParams = ObjectHelper.omit(currentParams, options.keysToRemove);\n\n const updatedParams = options?.merge\n ? { ...currentParams, ...params }\n : params;\n\n const updatedAppLink = {\n ...appLink,\n params: updatedParams\n };\n\n /**\n * This prevents us pointlessly re-triggering if we're already on the right applink.\n */\n if (ObjectHelper.isEqual(appLink, updatedAppLink))\n return;\n \n Core.AppLinkHelper.trigger(updatedAppLink, ObjectHelper.omit(options, [ 'merge', 'keysToRemove' ]));\n }\n};","// extracted by mini-css-extract-plugin\nexport default {\"circleContainer\":\"p8Vgz\",\"backgroundCircle\":\"asGGE\",\"circleSuccess\":\"PXLNj\",\"circleWarning\":\"ZckRN\",\"circleDanger\":\"slBRg\",\"lgCircleContainer\":\"N8KCI\",\"xsCircleContainer\":\"RPqZ2\",\"pendingCircle\":\"DKrcq\",\"centredPercentageText\":\"tpmLR\"};"],"names":["AnalyticsFilterHelper","getAudienceAppLinkParams","appLink","params","users","classrooms","classroomGroups","getParam","key","param","Array","isArray","audienceFilters","getDateRangeAppLinkParams","from","to","rangeName","dateRangeFilters","getPhrase","anonymiseUserName","user","shouldAnonymise","id","sessionName","seed","Math","floor","Date","getMinutes","dictionaries","separator","length","style","getAnonSession","sessionId","anonSessions","fallback","getUserOrAnonSession","result","getAudienceParams","queryParams","userId","groupId","push","convertDateToUtcDateTimeString","date","utc","getInsightsDateRangePresets","minDate","currentYear","getFullYear","isMinDateThisYear","name","startDate","endDate","getMonth","disabled","tooltip","default","formatDateQueryParam","getStartEndParams","dateRangePresetss","filterParams","getStartDate","getEndDate","presetRange","find","p","getPresetRangeByName","start","end","defaultRange","range","PercentageIndicatorLayout","ProgressCircle","props","ref","circle","radius","r","baseVal","value","circumference","PI","offset","percentage","strokeDasharray","strokeDashoffset","toString","size","className","scoreThresholds","PercentageIndicator","percentageToFixed","layout","LabelInside","label","customLabel","LabelOnly","LabelBefore","defaultProps","CircleOnly","ProgressCircleSize","CIRCLE_STROKE_WIDTH","CIRCLE_STROKE_WIDTH_LG","ProgressCircleSizeMap","ExtraSmall","Small","Large","getCircleRadius","width","strokeWidth","getCircleClassName","HIGH","MODERATE","getColouredLabelClassName","getCircleContainerClassName","isPending","getPercentageToFixed","toFixed","getFormattedPercentage","round","ScoreThresholdDefaults","ScoreThresholdInsights","getAnalyticsRequestKey","baseKey","filter","sharerId","userIdKey","sort","join","groupIdKey","AppRouteHelper","updateParams","options","currentParams","keysToRemove","updatedParams","merge","updatedAppLink"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[4377],{70376:(e,t,n)=>{n.d(t,{W:()=>o});var r=n(32735),i=n(91967);function a(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 s=5e3;function o(e){var t,n,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:s,u=(t=r.useState(!1),n=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,i,a,s,o=[],u=!0,l=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;u=!1}else for(;!(u=(r=a.call(n)).done)&&(o.push(r.value),o.length!==t);u=!0);}catch(e){l=!0,i=e}finally{try{if(!u&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(l)throw i}}return o}}(t,n)||function(e,t){if(e){if("string"==typeof e)return a(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)?a(e,t):void 0}}(t,n)||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=u[0],c=u[1],d=r.useRef(null),m=function(){c((function(e){return!e})),d.current=window.setTimeout(m,o)};return r.useEffect((function(){d.current=window.setTimeout(m,o)}),[]),r.useEffect((function(){i.q.isFunction(e)&&e()}),[l]),function(){return window.clearTimeout(d.current)}}},5255:(e,t,n)=>{n.d(t,{Y:()=>o});var r=n(70376),i=n(20354),a=n(30439);function s(e){return s="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},s(e)}function o(e){var t,n=i.a.useGetFetch(),o=e&&a.o.getAnonSessions(e),u=i.a.useBasicFetch(o);return(0,r.W)((function(){return n(o)}),5e3),(null===(t=u.data)||void 0===t?void 0:t.length)?u.data.reduce((function(e,t){return Object.assign(Object.assign({},e),(n={},r=t.sessionId,i=t,(r=function(e){var t=function(e){if("object"!=s(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=s(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==s(t)?t:t+""}(r))in n?Object.defineProperty(n,r,{value:i,enumerable:!0,configurable:!0,writable:!0}):n[r]=i,n));var n,r,i}),{}):{}}},26136:(e,t,n)=>{n.d(t,{B2:()=>o,DV:()=>l,jP:()=>u});var r=n(76198),i=n(23481),a=n(64818),s=i.T.encloseNamespace("shared.analyticsUtils");function o(e,t){return e?t?(0,r._8)((n="sessionId"in e?e.sessionName:e.id,i=+"".concat(n).concat(Math.floor((new Date).getMinutes()/5)),{dictionaries:[r.O9,r.yd],separator:" ",length:2,style:"capital",seed:i})):"sessionId"in e?e.sessionName:a.l.getFullName(e):"";var n,i}function u(e,t){var n={sessionId:e,sessionName:s("anonymousUser")};return e&&t&&t[e]||n}function l(e,t){return e.user?e.user:u(e.sessionId,t)}},3218:(e,t,n)=>{n.d(t,{R:()=>S});var r=n(32735),i=n(69087),a=n(26136),s=n(39157),o=n(69186),u=n(86572),l=n(28972),c=n(83140),d=n(80845),m=n(23481),f=n(2102),v=n(36532),y=m.T.encloseNamespace("interactives.studentResponseList");function b(e){var t=Object.keys(e.markedAnswers).length;return r.createElement("div",{className:"d-flex justify-content-end pt-3"},r.createElement("div",null,!e.showSubmitButtonSpinner&&r.createElement("button",{className:"btn btn-link",onClick:e.onClickClose},y("close")),!!e.interactionsToMark.length&&r.createElement(r.Fragment,null,e.isDemo?r.createElement(v.u,{id:"submitAnswers",title:y("demoOnly"),spanHack:!0,spanHackClassName:"d-inline-flex"},r.createElement("button",{className:"btn btn-outline-dark pointer-events-none",disabled:!t},y("submitAnswers"))):r.createElement(f.m,{variant:"outline-dark",onClick:e.onClickSubmit,disabled:!t,showSpinner:e.showSubmitButtonSpinner},y("submitAnswers")))))}var g=m.T.encloseNamespace("interactives.studentResponseList");function p(e){var t=Object.keys(e.markedAnswers).length;return r.createElement("div",{className:"d-flex justify-content-between pb-3"},r.createElement("div",{className:"d-flex"},!!e.summary.unanswered&&r.createElement("div",{className:"bg-light rounded p-2 me-2"},r.createElement("strong",{className:"me-2"},g("unanswered")),e.summary.unanswered),r.createElement("div",{className:"bg-light rounded p-2 me-2"},r.createElement("strong",{className:"me-2"},g("score")),e.summary.awaitingMarking?r.createElement("em",null,g("pending")):"".concat(Math.round(100*e.summary.percentCorrect),"%"))),!!e.interactionsToMark.length&&r.createElement(r.Fragment,null,e.isDemo?r.createElement(v.u,{id:"submitAnswers",title:g("demoOnly"),spanHack:!0},r.createElement("button",{className:"btn btn-outline-dark pointer-events-none",disabled:!t},g("submitAnswers"))):r.createElement(f.m,{variant:"outline-dark",onClick:e.onClickSubmit,disabled:!t,showSpinner:e.showSubmitButtonSpinner},g("submitAnswers"))))}const h={awaitingMarking:"MvGb5"};function w(e,t){return 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,i,a,s,o=[],u=!0,l=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;u=!1}else for(;!(u=(r=a.call(n)).done)&&(o.push(r.value),o.length!==t);u=!0);}catch(e){l=!0,i=e}finally{try{if(!u&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(l)throw i}}return o}}(e,t)||function(e,t){if(e){if("string"==typeof e)return k(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)?k(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.")}()}function k(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){var t,n,m,f,v=w(r.useState(!1),2),y=v[0],g=v[1],k=(t=r.useRef(null),n=w(r.useState(!1),2),m=n[0],f=n[1],r.useEffect((function(){t.current&&!m&&(f(!0),requestAnimationFrame((function(){return t.current.scrollIntoView({behavior:"smooth",block:"center"})})))}),[t.current,m]),t),S=(0,s.Rt)(e.interactive,e.studentResults),A=(0,d.Q)(e.interactive),E=function(e,t){return e.filter((function(e){return c.A.isInteractionCorrect(e,(0,d.j_)(t))===l.w.AwaitingMarking}))}(A,e.studentResults);function I(){g(!0),e.submitMarkedAnswers()}return r.createElement(r.Fragment,null,r.createElement(p,{summary:S,interactionsToMark:E,markedAnswers:e.markedAnswers,onClickSubmit:I,showSubmitButtonSpinner:y,isDemo:e.isDemo}),r.createElement("ul",{className:"list-unstyled"},A.map((function(t,n){var l,c=t.id.toString()===(null===(l=e.selectedInteractionId)||void 0===l?void 0:l.toString()),d=E.some((function(e){return e.id===t.id})),m=(0,a.B2)((0,a.DV)(e.studentResults,e.anonSessions),e.anonymiseUsers),f="p-2 mb-3 rounded";return c&&(f+=" border-2 border-info shadow"),f+=d?" ".concat(h.awaitingMarking):" border",r.createElement("li",{key:n,className:f,ref:c?k:null},r.createElement("div",{className:"d-flex mb-2"},r.createElement(u.y,{interaction:t,iconClassName:"flex-shrink-0"})),e.reportsStyling?r.createElement(o.O,{interaction:t,studentResults:e.studentResults,markedStatus:(0,s.HI)(t.id,e.studentResults,e.markedAnswers),markInteraction:e.addMarkedAnswers,imageCdnUrl:e.imageCdnUrl,anonymisedUserName:m,className:"bg-light ps-2",showFeedback:!0,reportsStyling:!0,responseComponentClass:"mx-n2"}):r.createElement(i.d,{interaction:t,studentResults:e.studentResults,markedStatus:(0,s.HI)(t.id,e.studentResults,e.markedAnswers),markInteraction:e.addMarkedAnswers,imageCdnUrl:e.imageCdnUrl,anonymisedUserName:m,showFeedback:!0}))}))),r.createElement(b,{interactionsToMark:E,markedAnswers:e.markedAnswers,onClickSubmit:I,onClickClose:e.onClickClose,showSubmitButtonSpinner:y,isDemo:e.isDemo}))}},94892:(e,t,n)=>{n.d(t,{T:()=>i,i:()=>r});var r={HIGH:.75,MODERATE:.5},i={HIGH:.7,MODERATE:.7}},94644:(e,t,n)=>{n.d(t,{r:()=>c});var r=n(50242),i=n(81886),a=n(67058),s=n(14553),o=n(49267),u=n(49075),l={notFound:a.d,forbidden:{rating:s.q,yearLevel:s.q,region:o.a,privacy:s.q},badRequest:u._,internalServerError:u._};function c(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e){var a;a="number"==typeof e?e:e.status;var s=Object.assign(Object.assign({},l),t);a&&i.Q.Ry.isStatusCodeError(a)&&(a!==r.o.InternalServer?a!==r.o.NotFound?a!==r.o.Forbidden?n.badRequest||i.Q.Ry.throw(new s.badRequest):n.forbidden||i.Q.Ry.throw(new s.forbidden.privacy):n.notFound||i.Q.Ry.throw(new s.notFound):n.internalServerError||i.Q.Ry.throw(new u._))}}},54405:(e,t,n)=>{n.d(t,{X:()=>r});var r={interactive:function(){return{url:"/mocks/insights/interactive.json",key:"demo:interactive",normalize:!1}},interactiveMetadata:function(){return{url:"/mocks/insights/interactive-metadata.json",key:"demo:interactive:metadata",normalize:!1}},interactiveResults:function(){return{url:"/mocks/insights/interactive-results.json",key:"demo:interactive:results",normalize:!1}},videoViews:function(){return{url:"/mocks/insights/video-views.json",key:"demo:video:views",normalize:!1}},users:function(){return{url:"/mocks/insights/users.json",key:"demo:users",normalize:!1}},individualHeatmap:function(){return{url:"/mocks/insights/individual-heatmap.json",key:"demo:individual:heatmap",normalize:!1}},aggregateHeatmap:function(){return{url:"/mocks/insights/aggregate-heatmap.json",key:"demo:aggregate:heatmap",normalize:!1}}}},91286:(e,t,n)=>{n.d(t,{v:()=>s});var r=n(32735),i=n(94644);function a(e){return e.map((function(e){return e.statusCode})).join(":")}function s(e,t,n){var s=Array.isArray(e)?e:[e];(0,r.useEffect)((function(){s.forEach((function(e){(0,i.r)(e.statusCode,t,n)}))}),[a(s),t,n])}},62875:(e,t,n)=>{function r(e,t,n){var r="".concat(e,":").concat(t.start,":").concat(t.end),i=Array.isArray(t.userId)?t.userId.sort().join(":"):t.userId,a=Array.isArray(t.groupId)?t.groupId.sort().join(":"):t.groupId;return i&&(r+=":".concat(i)),a&&(r+=":".concat(a)),n&&(r+=":".concat(n)),r}n.d(t,{H:()=>r})},55588:(e,t,n)=>{n.r(t),n.d(t,{InteractiveStudentResultsDemoView:()=>w});var r=n(32735),i=n(23481),a=n(20354),s=n(2948),o=n(5255),u=n(9193),l=n(26136),c=n(3218),d=n(9111),m=n(38143),f=n(39151),v=n(54405),y=n(26304),b=n(91286),g=n(93322);function p(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 h=i.T.encloseNamespace("shared.interactiveStudentResults");function w(e){var t,n,i,w,k,S=(w=(0,s.D)(m.g.ANONYMISE_USERS),k=1,function(e){if(Array.isArray(e))return e}(w)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,i,a,s,o=[],u=!0,l=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;u=!1}else for(;!(u=(r=a.call(n)).done)&&(o.push(r.value),o.length!==t);u=!0);}catch(e){l=!0,i=e}finally{try{if(!u&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(l)throw i}}return o}}(w,k)||function(e,t){if(e){if("string"==typeof e)return p(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)?p(e,t):void 0}}(w,k)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];(0,g.F)();var A=a.a.useBasicFetch(v.X.interactiveMetadata()),E=a.a.useBasicFetch(v.X.interactive()),I=a.a.useBasicFetch(v.X.interactiveResults()),j=a.a.useBasicFetch(f.L.config()),C=(0,o.Y)(e.shareId);(0,b.v)([A,I]),(0,y.b)(A);var R=(0,u.D)(null===(t=E.data)||void 0===t?void 0:t.id,null===(n=A.data)||void 0===n?void 0:n.id,e.closePopup),N=R.markedAnswers,M=R.addMarkedAnswers,O=R.submitMarkedAnswers,F=null===(i=I.data)||void 0===i?void 0:i.students.find((function(t){var n,r,i,a,s;return e.userId?(null===(r=null===(n=t.user)||void 0===n?void 0:n.id)||void 0===r?void 0:r.toString())===(null===(i=e.userId)||void 0===i?void 0:i.toString()):!!e.sessionId&&(null===(a=t.sessionId)||void 0===a?void 0:a.toString())===(null===(s=e.sessionId)||void 0===s?void 0:s.toString())})),T=F?h("heading",{studentName:(0,l.B2)((0,l.DV)(F,C),S)}):"",D=!!E.data&&!!I.data&&!!j.data;return r.createElement(d.G,{title:T,showLoadingSpinner:!D,closePopup:e.closePopup,size:"lg"},D&&r.createElement(c.R,{interactive:E.data,studentResults:F,markedAnswers:N,addMarkedAnswers:M,submitMarkedAnswers:O,imageCdnUrl:j.data.imageCdnUrl,selectedInteractionId:e.interactionId,onClickClose:e.closePopup,anonymiseUsers:S,reportsStyling:e.reportsStyling,isDemo:!0}))}}}]);
2
- //# sourceMappingURL=4377-001a8ee263-lite.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/4377-001a8ee263-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/common/src/react/hooks/UsePolling.ts","file:///app/packages/libs/shared/src/apps/analytics/hooks/UseAnonSessions.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/AnonymiseUserUtils.ts","file:///app/packages/libs/shared/src/apps/student-response-list/StudentResponseListFooter.tsx","file:///app/packages/libs/shared/src/apps/student-response-list/StudentResponseListHeader.tsx","file:///app/packages/libs/shared/src/apps/student-response-list/student-response-list.scss","file:///app/packages/libs/shared/src/apps/student-response-list/StudentResponseList.tsx","file:///app/packages/libs/shared/src/constants/ScoreThresholds.ts","file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/flight-requests/InsightsDemoRequests.ts","file:///app/packages/libs/shared/src/hooks/UseHandleObjectError.ts","file:///app/packages/libs/shared/src/utils/AnalyticsRequestUtils.ts","file:///app/packages/projects/lite/src/apps/my-shares/views/demo/interactive-student-results/InteractiveStudentResultsDemoView.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst DEFAULT_POLLING_INTERVAL = 5000; // 5 seconds.\n\n/**\n * Hook to fire a callback at a set interval.\n * @param callback \n * @param pollingInterval \n * \n * Returns a function to clear the timeout.\n */\nexport function usePolling(callback: () => void, pollingInterval: number = DEFAULT_POLLING_INTERVAL): () => void {\n const [ pollingTrigger, setPollingTrigger ] = React.useState(false);\n\n const timeoutRef = React.useRef<number>(null);\n\n const poll = () => {\n setPollingTrigger(t => !t);\n\n timeoutRef.current = window.setTimeout(poll, pollingInterval);\n };\n\n React.useEffect(() => {\n timeoutRef.current = window.setTimeout(poll, pollingInterval);\n }, []);\n\n React.useEffect(() => {\n if (FunctionHelper.isFunction(callback))\n callback();\n }, [pollingTrigger]);\n\n return () => window.clearTimeout(timeoutRef.current);\n}","import { usePolling } from 'libs/common/react/hooks/UsePolling';\nimport { Flight } from 'libs/common/react/index';\n\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\n\nexport interface AnonSession {\n sessionId: string;\n sessionName: string;\n}\n\nexport interface AnonSessions extends Record<string, AnonSession> {}\n\nexport function useAnonSessions(shareId: string): AnonSessions {\n const fetch = Flight.useGetFetch();\n const anonSessionsRequest = shareId && ShareRequests.getAnonSessions(shareId);\n const anonSessionsResponse = Flight.useBasicFetch<AnonSession[]>(anonSessionsRequest);\n\n usePolling(() => fetch(anonSessionsRequest), 5000);\n\n if (!anonSessionsResponse.data?.length)\n return {};\n\n return anonSessionsResponse.data.reduce((prev, current) => ({ ...prev, [current.sessionId]: current }), {});\n}","import { animals, colors, Config as UniqueNamesConfig, uniqueNamesGenerator } from 'unique-names-generator';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AnonSession, AnonSessions } from 'libs/shared/apps/analytics/hooks/UseAnonSessions';\nimport { UserOrAnonSession } from 'libs/shared/apps/analytics/interfaces/UserOrAnonSession';\nimport { StudentResults } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nconst namespace = 'shared.analyticsUtils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getUniqueNamesConfig(id: string): UniqueNamesConfig {\n /**\n * Generate a seed that is unique to each user but changes every 5 minutes.\n * \n * We use a seed so that if the same user's name is anonymised multiple times\n * in quick succession (e.g. multiple renders), the same name will be returned each time.\n * \n * We change the seed every 5 minutes so that students don't always have the same name.\n */\n const seed = +`${id}${Math.floor((new Date()).getMinutes() / 5)}`;\n\n return {\n dictionaries: [ colors, animals ],\n separator: ' ',\n length: 2,\n style: 'capital',\n seed\n };\n}\n\nexport function anonymiseUserName(user: UserOrAnonSession, shouldAnonymise: boolean): string {\n if (!user)\n return '';\n\n if (!shouldAnonymise)\n return 'sessionId' in user ? user.sessionName : UserHelper.getFullName(user);\n\n return uniqueNamesGenerator(getUniqueNamesConfig('sessionId' in user ? user.sessionName : user.id));\n}\n\nexport function getAnonSession(sessionId: string, anonSessions: AnonSessions): AnonSession {\n const fallback = {\n sessionId: sessionId,\n sessionName: getPhrase('anonymousUser')\n };\n\n if (!sessionId || !anonSessions)\n return fallback;\n\n const anonSession = anonSessions[sessionId];\n\n if (anonSession)\n return anonSession;\n\n return fallback;\n}\n\nexport function getUserOrAnonSession(result: StudentResults, anonSessions: AnonSessions): UserOrAnonSession {\n if (result.user)\n return result.user;\n\n return getAnonSession(result.sessionId, anonSessions);\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { Interaction } from 'libs/shared/interfaces';\n\nconst namespace = 'interactives.studentResponseList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface StudentResponseListFooterProps {\n interactionsToMark: Interaction[];\n markedAnswers: MarkedAnswerHash;\n onClickSubmit: () => void;\n onClickClose: () => void;\n showSubmitButtonSpinner: boolean;\n isDemo?: boolean;\n}\n\nexport function StudentResponseListFooter(props: StudentResponseListFooterProps): JSX.Element {\n const numMarkedAnswers = Object.keys(props.markedAnswers).length;\n\n return (\n <div className='d-flex justify-content-end pt-3'>\n <div>\n {!props.showSubmitButtonSpinner &&\n <button className='btn btn-link' onClick={props.onClickClose}>\n {getPhrase('close')}\n </button>\n }\n {!!props.interactionsToMark.length && (\n <>\n {props.isDemo ? (\n <Tooltip\n id='submitAnswers'\n title={getPhrase('demoOnly')}\n spanHack\n spanHackClassName='d-inline-flex'\n >\n <button\n className='btn btn-outline-dark pointer-events-none'\n disabled={!numMarkedAnswers}\n >\n {getPhrase('submitAnswers')}\n </button>\n </Tooltip>\n ) : (\n <SpinnerButton\n variant='outline-dark'\n onClick={props.onClickSubmit}\n disabled={!numMarkedAnswers}\n showSpinner={props.showSubmitButtonSpinner}\n >\n {getPhrase('submitAnswers')}\n </SpinnerButton>\n )}\n </>\n )}\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { ResultsSummary } from 'libs/shared/apps/analytics/interfaces/ResultsSummary';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { Interaction } from 'libs/shared/interfaces';\n\nconst namespace = 'interactives.studentResponseList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface StudentResponseListHeaderProps {\n summary: ResultsSummary;\n interactionsToMark: Interaction[];\n markedAnswers: MarkedAnswerHash;\n onClickSubmit: () => void;\n showSubmitButtonSpinner: boolean;\n isDemo?: boolean;\n}\n\nexport function StudentResponseListHeader(props: StudentResponseListHeaderProps): JSX.Element {\n const numMarkedAnswers = Object.keys(props.markedAnswers).length;\n\n return (\n <div className='d-flex justify-content-between pb-3'>\n <div className='d-flex'>\n {!!props.summary.unanswered &&\n <div className='bg-light rounded p-2 me-2'>\n <strong className='me-2'>{getPhrase('unanswered')}</strong>\n {props.summary.unanswered}\n </div>\n }\n <div className='bg-light rounded p-2 me-2'>\n <strong className='me-2'>{getPhrase('score')}</strong>\n {props.summary.awaitingMarking\n ? <em>{getPhrase('pending')}</em>\n : `${Math.round(props.summary.percentCorrect * 100)}%`\n }\n </div>\n </div>\n {!!props.interactionsToMark.length && (\n <>\n {props.isDemo ? (\n <Tooltip id='submitAnswers' title={getPhrase('demoOnly')} spanHack>\n <button\n className='btn btn-outline-dark pointer-events-none'\n disabled={!numMarkedAnswers}\n >\n {getPhrase('submitAnswers')}\n </button>\n </Tooltip>\n ) : (\n <SpinnerButton\n variant='outline-dark'\n onClick={props.onClickSubmit}\n disabled={!numMarkedAnswers}\n showSpinner={props.showSubmitButtonSpinner}\n >\n {getPhrase('submitAnswers')}\n </SpinnerButton>\n )}\n </>\n )}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"awaitingMarking\":\"MvGb5\"};","import React from 'react';\n\nimport { InteractionResponseItem } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/InteractionResponseItem';\nimport { AnonSessions } from 'libs/shared/apps/analytics/hooks/UseAnonSessions';\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { anonymiseUserName, getUserOrAnonSession } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { getMarkedStatus, getStudentResultsSummary } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { InteractionResponse } from 'libs/shared/components/interaction-response/InteractionResponse';\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, Interactive, StudentAnswer, StudentResults } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { getInteractions, getStudentResult } from 'libs/shared/utils/InteractiveHelper';\n\nimport { StudentResponseListFooter } from './StudentResponseListFooter';\nimport { StudentResponseListHeader } from './StudentResponseListHeader';\n\nimport styles from './student-response-list.scss';\n\nfunction getInteractionsToMark(\n interactions: Interaction[],\n studentResults: StudentResults\n): Interaction[] {\n return interactions.filter(i => {\n return InteractiveCorrectnessHelper.isInteractionCorrect(\n i,\n getStudentResult(studentResults)\n ) === InteractionCorrectness.AwaitingMarking;\n });\n}\n\n// eslint-disable-next-line rulesdir/require-view-title\nfunction useScrollSelectedInteractionIntoView(): React.MutableRefObject<HTMLLIElement> {\n const ref = React.useRef<HTMLLIElement>(null);\n const [ scrolled, setScrolled ] = React.useState(false);\n\n // Only scroll once\n React.useEffect(() => {\n if (!ref.current || scrolled)\n return;\n\n setScrolled(true);\n requestAnimationFrame(() => ref.current.scrollIntoView({ behavior: 'smooth', block: 'center' }));\n }, [ ref.current, scrolled ]);\n\n return ref;\n}\n\ninterface StudentResponseListProps {\n interactive: Interactive;\n markedAnswers: MarkedAnswerHash;\n studentResults: StudentResults;\n addMarkedAnswers: (answer: StudentAnswer[], status: InteractiveAnswerStatus) => void;\n submitMarkedAnswers: () => void;\n onClickClose: () => void;\n imageCdnUrl: string;\n selectedInteractionId?: string;\n anonymiseUsers: boolean;\n reportsStyling?: boolean;\n isDemo?: boolean;\n anonSessions?: AnonSessions;\n}\n\nexport function StudentResponseList(props: StudentResponseListProps): JSX.Element {\n const [ showSpinner, setShowSpinner ] = React.useState(false);\n const selectedInteractionRef = useScrollSelectedInteractionIntoView();\n\n const summary = getStudentResultsSummary(props.interactive, props.studentResults);\n const interactions = getInteractions(props.interactive);\n const questionsToMark = getInteractionsToMark(interactions, props.studentResults);\n\n function onClickSubmit(): void {\n setShowSpinner(true);\n props.submitMarkedAnswers();\n }\n\n return (\n <>\n <StudentResponseListHeader\n summary={summary}\n interactionsToMark={questionsToMark}\n markedAnswers={props.markedAnswers}\n onClickSubmit={onClickSubmit}\n showSubmitButtonSpinner={showSpinner}\n isDemo={props.isDemo}\n />\n <ul className='list-unstyled'>\n {interactions.map((interaction, idx) => {\n const isSelected = interaction.id.toString() === props.selectedInteractionId?.toString();\n const markingRequired = questionsToMark.some(q => q.id === interaction.id);\n const anonymisedUserName = anonymiseUserName(\n getUserOrAnonSession(props.studentResults, props.anonSessions),\n props.anonymiseUsers\n );\n\n let className = 'p-2 mb-3 rounded';\n\n if (isSelected)\n className += ' border-2 border-info shadow';\n\n if (markingRequired)\n className += ` ${styles.awaitingMarking}`;\n else\n className += ' border';\n\n return (\n <li key={idx} className={className} ref={isSelected ? selectedInteractionRef : null}>\n <div className='d-flex mb-2'>\n <InteractionLabel\n interaction={interaction}\n iconClassName='flex-shrink-0'\n />\n </div>\n {props.reportsStyling ? (\n <InteractionResponse\n interaction={interaction}\n studentResults={props.studentResults}\n markedStatus={getMarkedStatus(interaction.id, props.studentResults, props.markedAnswers)}\n markInteraction={props.addMarkedAnswers}\n imageCdnUrl={props.imageCdnUrl}\n anonymisedUserName={anonymisedUserName}\n className='bg-light ps-2'\n showFeedback\n reportsStyling\n responseComponentClass='mx-n2'\n />\n ) : (\n <InteractionResponseItem\n interaction={interaction}\n studentResults={props.studentResults}\n markedStatus={getMarkedStatus(interaction.id, props.studentResults, props.markedAnswers)}\n markInteraction={props.addMarkedAnswers}\n imageCdnUrl={props.imageCdnUrl}\n anonymisedUserName={anonymisedUserName}\n showFeedback\n />\n )}\n </li>\n );\n })}\n </ul>\n <StudentResponseListFooter\n interactionsToMark={questionsToMark}\n markedAnswers={props.markedAnswers}\n onClickSubmit={onClickSubmit}\n onClickClose={props.onClickClose}\n showSubmitButtonSpinner={showSpinner}\n isDemo={props.isDemo}\n />\n </>\n );\n}","export interface ScoreThresholds {\n HIGH: number;\n MODERATE: number;\n}\n\nexport const ScoreThresholdDefaults: ScoreThresholds = {\n HIGH: 0.75,\n MODERATE: 0.5\n};\n\nexport const ScoreThresholdInsights: ScoreThresholds = {\n HIGH: 0.7,\n MODERATE: 0.7\n};","import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n internalServerError?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError,\n internalServerError: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.InternalServer) {\n if (!ignoreMap.internalServerError)\n Core.ErrorHelper.throw(new UnspecifiedError());\n return;\n }\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import { Flight } from 'libs/common/react/index';\n\nexport const InsightsDemoRequests = {\n interactive(): Flight.Request {\n return {\n url: `/mocks/insights/interactive.json`,\n key: `demo:interactive`,\n normalize: false\n };\n },\n\n interactiveMetadata(): Flight.Request {\n return {\n url: `/mocks/insights/interactive-metadata.json`,\n key: `demo:interactive:metadata`,\n normalize: false\n };\n },\n\n interactiveResults(): Flight.Request {\n return {\n url: `/mocks/insights/interactive-results.json`,\n key: `demo:interactive:results`,\n normalize: false\n };\n },\n\n videoViews(): Flight.Request {\n return {\n url: `/mocks/insights/video-views.json`,\n key: `demo:video:views`,\n normalize: false\n };\n },\n\n users(): Flight.Request {\n return {\n url: `/mocks/insights/users.json`,\n key: `demo:users`,\n normalize: false\n };\n },\n\n individualHeatmap(): Flight.Request {\n return {\n url: `/mocks/insights/individual-heatmap.json`,\n key: `demo:individual:heatmap`,\n normalize: false\n };\n },\n\n aggregateHeatmap(): Flight.Request {\n return {\n url: `/mocks/insights/aggregate-heatmap.json`,\n key: `demo:aggregate:heatmap`,\n normalize: false\n };\n }\n};","import { useEffect } from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { handleHttpError, HttpErrorMap, IgnoreHttpErrorMap } from 'libs/shared/errors/handlers/HttpErrorHandlers';\n\nfunction generateCacheKey(flightObjs: Array<Flight.Response<any>>): string {\n return flightObjs.map(obj => obj.statusCode).join(':');\n}\n\n// TODO: Change this to just `useHandleHttpError` and only accept a status code.\nexport function useHandleObjectError(\n _flightObjs: Flight.Response<any> | Array<Flight.Response<any>>,\n customErrors?: HttpErrorMap,\n ignoreErrors?: IgnoreHttpErrorMap\n): void {\n const flightObjs = Array.isArray(_flightObjs) ? _flightObjs : [_flightObjs];\n\n useEffect(() => {\n flightObjs.forEach(obj => {\n handleHttpError(obj.statusCode, customErrors, ignoreErrors);\n });\n }, [ generateCacheKey(flightObjs), customErrors, ignoreErrors ]);\n}","import { AnalyticsRequestFilter } from 'libs/shared/interfaces';\n\nexport function getAnalyticsRequestKey(baseKey: string, filter: AnalyticsRequestFilter, sharerId?: string): string {\n let key = `${baseKey}:${filter.start}:${filter.end}`;\n\n const userIdKey = Array.isArray(filter.userId) ? filter.userId.sort().join(':') : filter.userId;\n const groupIdKey = Array.isArray(filter.groupId) ? filter.groupId.sort().join(':') : filter.groupId;\n\n if (userIdKey)\n key += `:${userIdKey}`;\n\n if (groupIdKey)\n key += `:${groupIdKey}`;\n\n if (sharerId)\n key += `:${sharerId}`;\n\n return key;\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { useAnonSessions } from 'libs/shared/apps/analytics/hooks/UseAnonSessions';\nimport { useMarkAnswers } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { anonymiseUserName, getUserOrAnonSession } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { StudentResponseList } from 'libs/shared/apps/student-response-list/StudentResponseList';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { InsightsDemoRequests } from 'libs/shared/flight-requests/InsightsDemoRequests';\nimport { useCannotConsumeError } from 'libs/shared/hooks/useCannotConsumeError';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { useLockContentWidth } from 'libs/shared/hooks/useLockContentWidth';\nimport { Config, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { PopupViewProps } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.interactiveStudentResults';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractiveStudentResultsViewProps extends PopupViewProps {\n userId: string;\n interactiveId: string;\n interactionId?: string;\n reportsStyling?: boolean;\n sessionId?: string;\n shareId?: string;\n}\n\nexport function InteractiveStudentResultsDemoView(props: InteractiveStudentResultsViewProps): JSX.Element {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n useLockContentWidth();\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n InsightsDemoRequests.interactiveMetadata()\n );\n const interactive = Flight.useBasicFetch<Interactive>(InsightsDemoRequests.interactive());\n\n const results = Flight.useBasicFetch<InteractiveResultSet>(InsightsDemoRequests.interactiveResults());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const anonSessions = useAnonSessions(props.shareId);\n\n useHandleObjectError([ interactiveMetadata, results ]);\n useCannotConsumeError(interactiveMetadata);\n\n const { markedAnswers, addMarkedAnswers, submitMarkedAnswers } = useMarkAnswers(\n interactive.data?.id,\n interactiveMetadata.data?.id,\n props.closePopup\n );\n\n const studentResults = results.data?.students.find(s => {\n if (props.userId)\n return s.user?.id?.toString() === props.userId?.toString();\n\n if (props.sessionId)\n return s.sessionId?.toString() === props.sessionId?.toString();\n\n return false;\n });\n\n const popupTitle = studentResults\n ? getPhrase('heading', { studentName: anonymiseUserName(getUserOrAnonSession(studentResults, anonSessions), anonymiseUsers) })\n : '';\n const dataLoaded = !!interactive.data && !!results.data && !!config.data;\n\n return (\n <Popup\n title={popupTitle}\n showLoadingSpinner={!dataLoaded}\n closePopup={props.closePopup}\n size='lg'\n >\n {dataLoaded &&\n <StudentResponseList\n interactive={interactive.data}\n studentResults={studentResults}\n markedAnswers={markedAnswers}\n addMarkedAnswers={addMarkedAnswers}\n submitMarkedAnswers={submitMarkedAnswers}\n imageCdnUrl={config.data.imageCdnUrl}\n selectedInteractionId={props.interactionId}\n onClickClose={props.closePopup}\n anonymiseUsers={anonymiseUsers}\n reportsStyling={props.reportsStyling}\n isDemo\n />\n }\n </Popup>\n );\n}"],"names":["DEFAULT_POLLING_INTERVAL","usePolling","callback","pollingInterval","pollingTrigger","setPollingTrigger","timeoutRef","t","current","window","setTimeout","clearTimeout","useAnonSessions","shareId","fetch","anonSessionsRequest","anonSessionsResponse","data","length","reduce","prev","sessionId","getPhrase","anonymiseUserName","user","shouldAnonymise","id","sessionName","seed","Math","floor","Date","getMinutes","dictionaries","separator","style","getAnonSession","anonSessions","fallback","getUserOrAnonSession","result","LanguageService","StudentResponseListFooter","props","numMarkedAnswers","Object","keys","markedAnswers","className","showSubmitButtonSpinner","onClick","onClickClose","interactionsToMark","isDemo","Tooltip","title","spanHack","spanHackClassName","disabled","SpinnerButton","variant","onClickSubmit","showSpinner","StudentResponseListHeader","summary","unanswered","awaitingMarking","round","percentCorrect","StudentResponseList","ref","scrolled","setScrolled","setShowSpinner","selectedInteractionRef","requestAnimationFrame","scrollIntoView","behavior","block","interactive","studentResults","interactions","questionsToMark","filter","i","InteractiveCorrectnessHelper","InteractionCorrectness","getInteractionsToMark","submitMarkedAnswers","map","interaction","idx","isSelected","toString","selectedInteractionId","markingRequired","some","q","anonymisedUserName","anonymiseUsers","key","InteractionLabel","iconClassName","reportsStyling","InteractionResponse","markedStatus","markInteraction","addMarkedAnswers","imageCdnUrl","showFeedback","responseComponentClass","InteractionResponseItem","ScoreThresholdDefaults","HIGH","MODERATE","ScoreThresholdInsights","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","internalServerError","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","InsightsDemoRequests","url","normalize","interactiveMetadata","interactiveResults","videoViews","users","individualHeatmap","aggregateHeatmap","generateCacheKey","flightObjs","obj","join","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","Array","isArray","useEffect","forEach","getAnalyticsRequestKey","baseKey","sharerId","start","end","userIdKey","userId","sort","groupIdKey","groupId","InteractiveStudentResultsDemoView","results","config","closePopup","students","find","s","popupTitle","studentName","dataLoaded","showLoadingSpinner","size","interactionId"],"sourceRoot":""}