@clickview/lite 0.58.1 → 0.58.2-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/dist/bundles.json +1 -1
  2. package/dist/scripts/1041-29107d9409-lite.chunk.js +2 -0
  3. package/dist/scripts/1041-29107d9409-lite.chunk.js.map +1 -0
  4. package/dist/scripts/{1080-563b65eb58-lite.chunk.js → 1080-48ce32d627-lite.chunk.js} +2 -2
  5. package/dist/scripts/1080-48ce32d627-lite.chunk.js.map +1 -0
  6. package/dist/scripts/{1169-f2120c91cc-lite.chunk.js → 1169-1443c8a778-lite.chunk.js} +2 -2
  7. package/dist/scripts/1169-1443c8a778-lite.chunk.js.map +1 -0
  8. package/dist/scripts/143-efbc6a41c5-lite.chunk.js +2 -0
  9. package/dist/scripts/143-efbc6a41c5-lite.chunk.js.map +1 -0
  10. package/dist/scripts/{170-94b806dc73-lite.chunk.js → 170-233a87b708-lite.chunk.js} +3 -3
  11. package/dist/scripts/170-233a87b708-lite.chunk.js.map +1 -0
  12. package/dist/scripts/2015-d1bc58c0eb-lite.chunk.js +2 -0
  13. package/dist/scripts/2015-d1bc58c0eb-lite.chunk.js.map +1 -0
  14. package/dist/scripts/204-4f5b47b73f-lite.chunk.js +2 -0
  15. package/dist/scripts/204-4f5b47b73f-lite.chunk.js.map +1 -0
  16. package/dist/scripts/{2153-7663eb7803-lite.chunk.js → 2153-02090c64f8-lite.chunk.js} +2 -2
  17. package/dist/scripts/2153-02090c64f8-lite.chunk.js.map +1 -0
  18. package/dist/scripts/2215-39ee2a2b3f-lite.chunk.js +2 -0
  19. package/dist/scripts/2215-39ee2a2b3f-lite.chunk.js.map +1 -0
  20. package/dist/scripts/{2340-d1548f6362-lite.chunk.js → 2340-62c86fabb2-lite.chunk.js} +2 -2
  21. package/dist/scripts/2340-62c86fabb2-lite.chunk.js.map +1 -0
  22. package/dist/scripts/2571-c280e72eff-lite.chunk.js +2 -0
  23. package/dist/scripts/2571-c280e72eff-lite.chunk.js.map +1 -0
  24. package/dist/scripts/{4013-3d2edd41fb-lite.chunk.js → 4013-2aff1769f5-lite.chunk.js} +3 -3
  25. package/dist/scripts/4013-2aff1769f5-lite.chunk.js.map +1 -0
  26. package/dist/scripts/{490-002054a946-lite.chunk.js → 490-62ca33b520-lite.chunk.js} +2 -2
  27. package/dist/scripts/490-62ca33b520-lite.chunk.js.map +1 -0
  28. package/dist/scripts/4944-a780ed2439-lite.chunk.js +2 -0
  29. package/dist/scripts/4944-a780ed2439-lite.chunk.js.map +1 -0
  30. package/dist/scripts/{5220-40dd0842b5-lite.chunk.js → 5220-e0074ed079-lite.chunk.js} +3 -3
  31. package/dist/scripts/5220-e0074ed079-lite.chunk.js.map +1 -0
  32. package/dist/scripts/{5224-09e451b12f-lite.chunk.js → 5224-53cabe5c40-lite.chunk.js} +2 -2
  33. package/dist/scripts/5224-53cabe5c40-lite.chunk.js.map +1 -0
  34. package/dist/scripts/{5836-f212660b94-lite.chunk.js → 5836-03975cbcf8-lite.chunk.js} +2 -2
  35. package/dist/scripts/5836-03975cbcf8-lite.chunk.js.map +1 -0
  36. package/dist/scripts/{5936-f1e642e93f-lite.chunk.js → 5936-71d764494c-lite.chunk.js} +2 -2
  37. package/dist/scripts/5936-71d764494c-lite.chunk.js.map +1 -0
  38. package/dist/scripts/{6118-d069072bb6-lite.chunk.js → 6118-e4ebf5a2c1-lite.chunk.js} +2 -2
  39. package/dist/scripts/6118-e4ebf5a2c1-lite.chunk.js.map +1 -0
  40. package/dist/scripts/{6263-c665ac8df6-lite.chunk.js → 6263-fca75a8668-lite.chunk.js} +2 -2
  41. package/dist/scripts/6263-fca75a8668-lite.chunk.js.map +1 -0
  42. package/dist/scripts/{6599-c87f4f5ec1-lite.chunk.js → 6599-d8f1b255c5-lite.chunk.js} +3 -3
  43. package/dist/scripts/6599-d8f1b255c5-lite.chunk.js.map +1 -0
  44. package/dist/scripts/{6741-1ee9b683c7-lite.chunk.js → 6741-638b658087-lite.chunk.js} +3 -3
  45. package/dist/scripts/6741-638b658087-lite.chunk.js.map +1 -0
  46. package/dist/scripts/6934-5688ca7ce7-lite.chunk.js +2 -0
  47. package/dist/scripts/6934-5688ca7ce7-lite.chunk.js.map +1 -0
  48. package/dist/scripts/{7234-d1a173cb25-lite.chunk.js → 7234-8664150dd4-lite.chunk.js} +2 -2
  49. package/dist/scripts/7234-8664150dd4-lite.chunk.js.map +1 -0
  50. package/dist/scripts/{7556-69f8cb3b20-lite.chunk.js → 7556-276466341c-lite.chunk.js} +3 -3
  51. package/dist/scripts/7556-276466341c-lite.chunk.js.map +1 -0
  52. package/dist/scripts/{7709-57c48d288e-lite.chunk.js → 7709-adf3f9328f-lite.chunk.js} +2 -2
  53. package/dist/scripts/7709-adf3f9328f-lite.chunk.js.map +1 -0
  54. package/dist/scripts/{839-f8478d27f8-lite.chunk.js → 839-aaf4cad363-lite.chunk.js} +1 -1
  55. package/dist/scripts/{839-f8478d27f8-lite.chunk.js.map → 839-aaf4cad363-lite.chunk.js.map} +1 -1
  56. package/dist/scripts/{9139-456a0f14a5-lite.chunk.js → 9139-e8c1a686af-lite.chunk.js} +2 -2
  57. package/dist/scripts/9139-e8c1a686af-lite.chunk.js.map +1 -0
  58. package/dist/scripts/{9173-e03b30b436-lite.chunk.js → 9173-90aa484be4-lite.chunk.js} +2 -2
  59. package/dist/scripts/9173-90aa484be4-lite.chunk.js.map +1 -0
  60. package/dist/scripts/9284-c0cee27d0e-lite.chunk.js +2 -0
  61. package/dist/scripts/9284-c0cee27d0e-lite.chunk.js.map +1 -0
  62. package/dist/scripts/{9395-70cd9ae3a1-lite.chunk.js → 9395-355efbc0e7-lite.chunk.js} +3 -3
  63. package/dist/scripts/{9395-70cd9ae3a1-lite.chunk.js.map → 9395-355efbc0e7-lite.chunk.js.map} +1 -1
  64. package/dist/scripts/{953-45aa51744b-lite.chunk.js → 953-b3b777612b-lite.chunk.js} +3 -3
  65. package/dist/scripts/{953-45aa51744b-lite.chunk.js.map → 953-b3b777612b-lite.chunk.js.map} +1 -1
  66. package/dist/scripts/bundle-22b3c87b82.min.js +3 -0
  67. package/dist/scripts/bundle-22b3c87b82.min.js.map +1 -0
  68. package/package.json +1 -1
  69. package/dist/scripts/1080-563b65eb58-lite.chunk.js.map +0 -1
  70. package/dist/scripts/1169-f2120c91cc-lite.chunk.js.map +0 -1
  71. package/dist/scripts/143-4ea7a69434-lite.chunk.js +0 -2
  72. package/dist/scripts/143-4ea7a69434-lite.chunk.js.map +0 -1
  73. package/dist/scripts/170-94b806dc73-lite.chunk.js.map +0 -1
  74. package/dist/scripts/204-2b19b80cc1-lite.chunk.js +0 -2
  75. package/dist/scripts/204-2b19b80cc1-lite.chunk.js.map +0 -1
  76. package/dist/scripts/2153-7663eb7803-lite.chunk.js.map +0 -1
  77. package/dist/scripts/2215-5e8af1456d-lite.chunk.js +0 -2
  78. package/dist/scripts/2215-5e8af1456d-lite.chunk.js.map +0 -1
  79. package/dist/scripts/2340-d1548f6362-lite.chunk.js.map +0 -1
  80. package/dist/scripts/3525-45e28232cf-lite.chunk.js +0 -2
  81. package/dist/scripts/3525-45e28232cf-lite.chunk.js.map +0 -1
  82. package/dist/scripts/4013-3d2edd41fb-lite.chunk.js.map +0 -1
  83. package/dist/scripts/490-002054a946-lite.chunk.js.map +0 -1
  84. package/dist/scripts/4944-b565b5c501-lite.chunk.js +0 -2
  85. package/dist/scripts/4944-b565b5c501-lite.chunk.js.map +0 -1
  86. package/dist/scripts/5220-40dd0842b5-lite.chunk.js.map +0 -1
  87. package/dist/scripts/5224-09e451b12f-lite.chunk.js.map +0 -1
  88. package/dist/scripts/5836-f212660b94-lite.chunk.js.map +0 -1
  89. package/dist/scripts/5936-f1e642e93f-lite.chunk.js.map +0 -1
  90. package/dist/scripts/6118-d069072bb6-lite.chunk.js.map +0 -1
  91. package/dist/scripts/6263-c665ac8df6-lite.chunk.js.map +0 -1
  92. package/dist/scripts/6599-c87f4f5ec1-lite.chunk.js.map +0 -1
  93. package/dist/scripts/6741-1ee9b683c7-lite.chunk.js.map +0 -1
  94. package/dist/scripts/6934-1f439ec9a2-lite.chunk.js +0 -2
  95. package/dist/scripts/6934-1f439ec9a2-lite.chunk.js.map +0 -1
  96. package/dist/scripts/7234-d1a173cb25-lite.chunk.js.map +0 -1
  97. package/dist/scripts/7556-69f8cb3b20-lite.chunk.js.map +0 -1
  98. package/dist/scripts/7709-57c48d288e-lite.chunk.js.map +0 -1
  99. package/dist/scripts/8813-1e58ad1895-lite.chunk.js +0 -2
  100. package/dist/scripts/8813-1e58ad1895-lite.chunk.js.map +0 -1
  101. package/dist/scripts/9139-456a0f14a5-lite.chunk.js.map +0 -1
  102. package/dist/scripts/9173-e03b30b436-lite.chunk.js.map +0 -1
  103. package/dist/scripts/9284-80c3abfe62-lite.chunk.js +0 -2
  104. package/dist/scripts/9284-80c3abfe62-lite.chunk.js.map +0 -1
  105. package/dist/scripts/bundle-7da429ea24.min.js +0 -3
  106. package/dist/scripts/bundle-7da429ea24.min.js.map +0 -1
  107. /package/dist/css/{3525-lite-6ab6e749cb.chunk.css → 1041-lite-6ab6e749cb.chunk.css} +0 -0
  108. /package/dist/css/{8813-lite-6ab6e749cb.chunk.css → 2015-lite-6ab6e749cb.chunk.css} +0 -0
  109. /package/dist/scripts/{170-94b806dc73-lite.chunk.js.LICENSE.txt → 170-233a87b708-lite.chunk.js.LICENSE.txt} +0 -0
  110. /package/dist/scripts/{4013-3d2edd41fb-lite.chunk.js.LICENSE.txt → 4013-2aff1769f5-lite.chunk.js.LICENSE.txt} +0 -0
  111. /package/dist/scripts/{5220-40dd0842b5-lite.chunk.js.LICENSE.txt → 5220-e0074ed079-lite.chunk.js.LICENSE.txt} +0 -0
  112. /package/dist/scripts/{6599-c87f4f5ec1-lite.chunk.js.LICENSE.txt → 6599-d8f1b255c5-lite.chunk.js.LICENSE.txt} +0 -0
  113. /package/dist/scripts/{6741-1ee9b683c7-lite.chunk.js.LICENSE.txt → 6741-638b658087-lite.chunk.js.LICENSE.txt} +0 -0
  114. /package/dist/scripts/{7556-69f8cb3b20-lite.chunk.js.LICENSE.txt → 7556-276466341c-lite.chunk.js.LICENSE.txt} +0 -0
  115. /package/dist/scripts/{9395-70cd9ae3a1-lite.chunk.js.LICENSE.txt → 9395-355efbc0e7-lite.chunk.js.LICENSE.txt} +0 -0
  116. /package/dist/scripts/{953-45aa51744b-lite.chunk.js.LICENSE.txt → 953-b3b777612b-lite.chunk.js.LICENSE.txt} +0 -0
  117. /package/dist/scripts/{bundle-7da429ea24.min.js.LICENSE.txt → bundle-22b3c87b82.min.js.LICENSE.txt} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"scripts/839-f8478d27f8-lite.chunk.js","mappings":"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","sources":["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/breadcrumbs/Breadcrumbs.tsx","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/components/pill-tab-selector/PillTabSelector.tsx","file:///app/packages/libs/shared/src/constants/ScoreThresholds.ts","file:///app/packages/libs/shared/src/utils/PartialLoadingHelper.ts","file:///app/packages/projects/lite/src/apps/insights/utils/InsightsAppLinkUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/views/date-range-selector/components/custom-date-range-selector/custom-date-range-selector.scss","file:///app/packages/libs/shared/src/apps/analytics/views/date-range-selector/components/custom-date-range-selector/CustomDateRangeSelector.tsx","file:///app/packages/libs/shared/src/apps/analytics/views/date-range-selector/components/custom-date-range-selector/CustomDateRangeSelectorHooks.ts","file:///app/packages/libs/shared/src/apps/analytics/views/date-range-selector/components/date-range-input/date-range-input.scss","file:///app/packages/libs/shared/src/apps/analytics/views/date-range-selector/components/date-range-input/DateRangeInput.tsx","file:///app/packages/libs/shared/src/apps/analytics/views/date-range-selector/components/preset-date-range-selector/PresetDateRangeSelectorUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/views/date-range-selector/components/preset-date-range-selector/preset-date-range-selector.scss","file:///app/packages/libs/shared/src/apps/analytics/views/date-range-selector/components/preset-date-range-selector/PresetDateRangeSelector.tsx","file:///app/packages/libs/shared/src/apps/analytics/views/date-range-selector/DateRangeSelectorUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/views/date-range-selector/DateRangeSelectorView.tsx","file:///app/packages/projects/lite/src/apps/insights/hooks/useClassroomBreadcrumbs.ts","file:///app/packages/projects/lite/src/apps/insights/views/header/InsightsHeaderView.tsx","file:///app/packages/libs/shared/src/components/percentage-indicator/percentage-indicator.scss","file:///app/packages/libs/shared/src/components/pill-tab-selector/pill-tab-selector.scss"],"sourcesContent":["import { animals, colors, Config as UniqueNamesConfig, uniqueNamesGenerator } from 'unique-names-generator';\n\nimport { User } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\n\nfunction getUniqueNamesConfig(user: User): 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 = +`${user.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: User, shouldAnonymise: boolean): string {\n if (!shouldAnonymise)\n return UserHelper.getFullName(user);\n\n return uniqueNamesGenerator(getUniqueNamesConfig(user));\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(dateRangePresetss: DateRange[]): DateRange {\n return dateRangePresetss.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 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 = { startDate, endDate, name: initialDateRangeValid ? rangeName : '' };\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 * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { PartialLoadingHelper } from 'libs/shared/utils/PartialLoadingHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { SvgContainer, SvgContainerSize } from '../svg-container/SvgContainer';\n\nconst namespace = 'shared.breadcrumbComponent';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst COLLAPSE_CHARACTER_COUNT = 64;\nconst MAX_SEGMENT_LENGTH = 48;\n\nexport interface Breadcrumb {\n name: string;\n appLink?: Core.AppLink;\n active?: boolean;\n}\n\ninterface BreadcrumbItemProps {\n breadcrumb: Breadcrumb;\n withBackIcon?: boolean;\n}\n\nexport const BreadcrumbItem = React.forwardRef((\n props: BreadcrumbItemProps,\n ref: React.ForwardedRef<HTMLElement>\n) => {\n const { breadcrumb: { name, appLink, active }, withBackIcon } = props;\n\n let trimmedName = name;\n let title: string = null;\n\n if (trimmedName.length > MAX_SEGMENT_LENGTH) {\n trimmedName = name.slice(0, MAX_SEGMENT_LENGTH) + '...';\n\n // Only setting the title when we trim, because otherwise it's really not needed - Sha\n title = name;\n }\n\n return (\n <li\n className={`breadcrumb-item${active ? ' active' : ''}`}\n title={title}\n >\n {active\n ? <strong>{trimmedName}</strong>\n : <AppLink appLink={appLink} ref={ref}>\n {withBackIcon && <SvgContainer svgName={cvSvgLibrary.ChevronLeft} size={SvgContainerSize.Small} />}\n <span className={withBackIcon ? 'ms-2' : ''}>{trimmedName}</span>\n </AppLink>\n }\n </li>\n );\n});\n\ninterface BreadcrumbsProps {\n breadcrumbs: Breadcrumb[];\n}\n\nexport const Breadcrumbs = ({ breadcrumbs }: BreadcrumbsProps) => {\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n\n const length = breadcrumbs?.length || 0;\n \n const [ collapse, setCollapse ] = React.useState(false);\n const [ shouldFocus, setShouldFocus ] = React.useState(false);\n const expandRef = React.useRef<HTMLElement>();\n\n React.useEffect(() => {\n const characterLength = breadcrumbs?.reduce((prev, next) => prev + next.name.length, 0) ?? 0;\n\n if (length > 4 && characterLength > COLLAPSE_CHARACTER_COUNT)\n setCollapse(true);\n }, [breadcrumbs?.length]);\n\n /**\n * Focus our first expanded item the first time it appears.\n */\n React.useLayoutEffect(() => {\n if (shouldFocus)\n expandRef.current?.focus();\n }, [ expandRef.current, shouldFocus ]);\n\n function onClickExpand() {\n setCollapse(false);\n setShouldFocus(true);\n }\n\n if (!length || (isMobile && length < 2))\n return <></>;\n\n if (isMobile)\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n <BreadcrumbItem breadcrumb={breadcrumbs[length - 2]} withBackIcon />\n </ol>\n </nav>\n );\n\n const first = <BreadcrumbItem breadcrumb={breadcrumbs[0]} />;\n const second = length > 2 ? <BreadcrumbItem breadcrumb={breadcrumbs[1]} /> : <></>;\n const secondLast = length > 3 ? <BreadcrumbItem breadcrumb={breadcrumbs[length - 2]} /> : <></>;\n const last = length > 1 ? <BreadcrumbItem breadcrumb={breadcrumbs[length - 1]} /> : <></>;\n const rest = breadcrumbs.slice(2, length - 2);\n\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {first}\n {second}\n {collapse ?\n <li className='breadcrumb-item'>\n <button\n className='btn-link'\n onClick={onClickExpand}\n aria-label={getPhrase('expand')}\n >\n ...\n </button>\n </li> :\n rest.map((breadcrumb, idx) => (\n <BreadcrumbItem\n key={idx}\n breadcrumb={breadcrumb}\n ref={idx === 0 ? expandRef : null}\n />\n ))\n }\n {secondLast}\n {last}\n </ol>\n </nav>\n );\n};\n\nexport const PartialBreadcrumbs = React.memo(function({ numItems = 3 }: { numItems?: number; }) {\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n\n if (isMobile) {\n return (\n <div className='partial-loading-background' style={{ height: '1.3125rem', width: '6rem' }} />\n );\n }\n\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {PartialLoadingHelper.getPartialLoadingItems({ numItems }).map(({ width }, idx) => (\n <li key={idx} className='breadcrumb-item'>\n <span className='d-inline-block partial-loading-background' style={{ width }} dangerouslySetInnerHTML={{ __html: '&nbsp' }} />\n </li>\n ))}\n </ol>\n </nav>\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}\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.layout === PercentageIndicatorLayout.LabelInside\n ? ProgressCircleSize.Large\n : ProgressCircleSize.Small;\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}\n\n/**\n * radius = width / 2 - strokeWidth * 2\n */\nexport function getCircleRadius(size: ProgressCircleSize): string {\n const width = size === ProgressCircleSize.Large ? CIRCLE_WIDTH_LG : CIRCLE_WIDTH;\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 (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}","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 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};","const DEFAULT_PARTIAL_LOADING_OPTIONS: PartialLoadingOptions = {\n numItems: 5,\n minWidth: 50, // px\n maxWidth: 100 // px\n};\n\nexport interface PartialLoadingOptions {\n numItems?: number;\n minWidth?: number;\n maxWidth?: number;\n}\n\ninterface PartialLoadingItem {\n width: string;\n}\n\nexport const PartialLoadingHelper = {\n getPartialLoadingItems(options: PartialLoadingOptions = {}): PartialLoadingItem[] {\n const opts = {\n ...DEFAULT_PARTIAL_LOADING_OPTIONS,\n ...options\n };\n\n const getRandomFilterWidth = () => Math.max(Math.floor(Math.random() * opts.maxWidth), opts.minWidth);\n\n return [...Array(opts.numItems)].map(() => ({ width: `${getRandomFilterWidth()}px` }));\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 = 'overview' | 'heatmap' | 'results' | 'questions';\n\nexport function getInsightsVideoTabs(id: string, active: InsightsTabs, params: HashObject) {\n return [\n {\n name: getPhrase('overview'),\n active: active === 'overview',\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\nexport function getInsightsClipTabs(id: string, active: InsightsTabs, params: HashObject) {\n return [\n {\n name: getPhrase('overview'),\n active: active === 'overview',\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\nexport function getInsightsInteractiveTabs(id: string, active: InsightsTabs, params: HashObject) {\n return [\n {\n name: getPhrase('overview'),\n active: active === 'overview',\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_RESULTS,\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}","// extracted by mini-css-extract-plugin\nexport default {\"dateInputLabel\":\"CLYvu\",\"dateInput\":\"gnEqJ\"};","import React from 'react';\nimport { DayPicker } from 'react-day-picker';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { DateRange } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { useSetInputFocus } from './CustomDateRangeSelectorHooks';\n\nimport './custom-date-range-selector.scss';\nimport './day-picker-styles.scss';\nimport styles from './custom-date-range-selector.scss';\n\nconst namespace = 'shared.customDateRangeSelector';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst NUM_MONTHS_TO_DISPLAY = 2;\nconst DATE_DISPLAY_FORMAT = 'DD/MM/YYYY';\n\ninterface CustomDateRangeSelectorProps {\n startDate: Date | null;\n endDate: Date | null;\n setDateRange: (dateRange: DateRange) => void;\n minDate: Date;\n maxDate: Date;\n onClickApply: () => void;\n close: () => void;\n}\n\nexport function CustomDateRangeSelector(props: CustomDateRangeSelectorProps): JSX.Element {\n const [ focusedInput, setFocusedInput ] = React.useState<'startDate' | 'endDate'>('startDate');\n const [ startDateInputRef, endDateInputRef ] = useSetInputFocus(focusedInput);\n\n function handleDayClick(day: any) {\n if (focusedInput === 'startDate') {\n props.setDateRange({\n startDate: day,\n endDate: DateHelper.isAfter(day, props.endDate) ? undefined : props.endDate\n });\n setFocusedInput(s => s === 'endDate' ? 'startDate' : 'endDate');\n } else {\n props.setDateRange({\n startDate: DateHelper.isAfter(props.startDate, day) ? day : props.startDate,\n endDate: DateHelper.isAfter(props.startDate, day) ? undefined : day\n });\n\n if (!DateHelper.isAfter(props.startDate, day)) {\n setFocusedInput(s => s === 'endDate' ? 'startDate' : 'endDate');\n }\n }\n }\n\n return (\n <div className='d-inline-block'>\n <div className='d-flex align-items-center border-bottom p-3'>\n <div className='me-auto invisible'>\n <SvgContainer svgName={cvSvgLibrary.Close} />\n </div>\n <form className='d-flex align-items-center'>\n <div className='position-relative'>\n <strong className={styles.dateInputLabel}>{getPhrase('from')}</strong>\n <input\n ref={startDateInputRef}\n className={`form-control cursor-pointer ${styles.dateInput}`}\n value={DateHelper.format(props.startDate, DATE_DISPLAY_FORMAT) ?? ''}\n onChange={() => {}}\n onFocus={() => setFocusedInput('startDate')}\n />\n </div>\n <span className='px-3'>\n <SvgContainer svgName={cvSvgLibrary.ArrowRight} />\n </span>\n <div className='position-relative'>\n <strong className={styles.dateInputLabel}>{getPhrase('to')}</strong>\n <input\n ref={endDateInputRef}\n className={`form-control cursor-pointer ${styles.dateInput}`}\n value={DateHelper.format(props.endDate, DATE_DISPLAY_FORMAT) ?? ''}\n onChange={() => {}}\n onFocus={() => setFocusedInput('endDate')}\n />\n </div>\n </form>\n <div className='ms-auto cursor-pointer'>\n <SvgContainer svgName={cvSvgLibrary.Close} onClick={props.close} />\n </div>\n </div>\n <div className='p-3'>\n <DayPicker\n mode='range'\n numberOfMonths={NUM_MONTHS_TO_DISPLAY}\n selected={{ from: props.startDate, to: props.endDate }}\n onDayClick={handleDayClick}\n captionLayout='dropdown-buttons'\n fromDate={props.minDate}\n toDate={props.maxDate}\n modifiersClassNames={{\n selected: 'my-selected',\n today: 'my-today'\n }}\n defaultMonth={props.startDate}\n />\n </div>\n <div className='pb-3 px-3 text-end'>\n <button className='btn btn-outline-dark' onClick={props.onClickApply}>\n {getPhrase('apply')}\n </button>\n </div>\n </div>\n );\n}","import React from 'react';\n\ntype InputRef = React.MutableRefObject<HTMLInputElement>;\n\nexport function useSetInputFocus(focusedInput: 'startDate' | 'endDate'): [InputRef, InputRef] {\n const startDateInputRef = React.useRef<HTMLInputElement>();\n const endDateInputRef = React.useRef<HTMLInputElement>();\n\n React.useEffect(() => {\n if (focusedInput === 'startDate')\n startDateInputRef.current?.focus();\n\n if (focusedInput === 'endDate')\n endDateInputRef.current?.focus();\n }, [focusedInput]);\n\n return [ startDateInputRef, endDateInputRef ];\n}","// extracted by mini-css-extract-plugin\nexport default {\"inputContainer\":\"YQJPT\",\"clearButton\":\"w2hAw\",\"inputBtnContainer\":\"iSXkk\",\"input\":\"IBR6Q\"};","import React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './date-range-input.scss';\n\ninterface DateRangeInputProps {\n value: string;\n hideRange?: boolean;\n}\n\nexport function DateRangeInput(props: DateRangeInputProps): JSX.Element {\n return (\n <Dropdown.Toggle as='div' id='date-range-dropdown' className={`no-caret ${!props.hideRange ? styles.inputContainer : ''}`}>\n <input\n className={`form-control cursor-pointer border-dark ${styles.input}`}\n value={props.value}\n onChange={() => {}}\n onKeyDown={(e: React.KeyboardEvent) => e.preventDefault()} // Prevent keyboard input\n autoComplete='off'\n />\n <div className={styles.inputBtnContainer}>\n <div className='d-inline-block cursor-pointer'>\n <SvgContainer\n svgName={cvSvgLibrary.Calendar}\n size={SvgContainerSize.Standard}\n />\n </div>\n </div>\n </Dropdown.Toggle>\n );\n}","import { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { DateRange } from 'libs/shared/interfaces';\n\nfunction isDateInFuture(date: Date): boolean {\n return DateHelper.isAfter(date, new Date(), 'day');\n}\n\nexport function isRangeInFuture(range: DateRange): boolean {\n return isDateInFuture(range.startDate);\n}\n\nexport function getDynamicRangeSubLabel(range: DateRange): string {\n return `(${DateHelper.format(range.startDate, 'ddd, D MMM')}`\n + ` - ${DateHelper.format(range.endDate, 'ddd, D MMM')})`;\n}\n\nexport function validateRange(range: DateRange): DateRange | null {\n if (isRangeInFuture(range))\n return;\n\n if (isDateInFuture(range.endDate))\n return {\n ...range,\n endDate: new Date()\n };\n\n return range;\n}","// extracted by mini-css-extract-plugin\nexport default {\"containerWithDynamicRanges\":\"pvYdJ\",\"selectedDateRange\":\"JU7bd\",\"rangeList\":\"DBlzu\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { DateRange } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { getDynamicRangeSubLabel, isRangeInFuture, validateRange } from './PresetDateRangeSelectorUtils';\n\nimport styles from './preset-date-range-selector.scss';\n\nconst namespace = 'shared.presetDateRangeSelector';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getButtonClassName(isSelected: boolean): string {\n const buttonClassName = 'btn btn-link d-flex align-items-center py-1 px-0 text-decoration-none';\n\n if (isSelected)\n return buttonClassName + ` fw-bold text-info ${styles.selectedDateRange}`;\n\n return buttonClassName + ' text-body';\n}\n\ninterface DateRangeItemProps {\n range: DateRange;\n onClick: (range: DateRange) => void;\n selectedRangeName?: string;\n isDynamic?: boolean;\n}\n\nfunction DateRangeItem(props: DateRangeItemProps): JSX.Element {\n const selected = props.range.name === props.selectedRangeName;\n const isDisabled = isRangeInFuture(props.range) || props.range.disabled;\n\n const DateRangeButton = () => (\n <button className={getButtonClassName(selected)} onClick={() => props.onClick(props.range)} disabled={isDisabled}>\n {selected && <SvgContainer svgName={cvSvgLibrary.Check} />}\n <span className={`${isDisabled ? 'text-secondary' : ''} ${props.isDynamic ? 'fw-bold' : ''}`}>\n {props.range.name}\n </span>\n {!!props.isDynamic &&\n <>\n &nbsp;\n <span className='text-secondary'>{getDynamicRangeSubLabel(props.range)}</span>\n </>\n }\n </button>\n );\n\n if (!props.range.tooltip)\n return <DateRangeButton />;\n\n return (\n <Tooltip\n title={props.range.tooltip}\n placement='left'\n spanHack\n spanHackClassName='justify-content-start'\n >\n <DateRangeButton />\n </Tooltip>\n );\n}\n\n\ninterface PresetDateRangeSelectorProps {\n genericDateRanges: DateRange[];\n setDateRange: (dateRange: DateRange) => void;\n showCustomRangeSelector: () => void;\n dynamicDateRanges?: DateRange[];\n selectedRangeName?: string;\n}\n\nexport function PresetDateRangeSelector(props: PresetDateRangeSelectorProps): JSX.Element {\n function onClickRange(range: DateRange): void {\n const validatedRange = validateRange(range);\n\n if (!validatedRange)\n return;\n\n props.setDateRange(validatedRange);\n }\n\n const hasDynamicDateRanges = !!props.dynamicDateRanges?.length;\n\n return (\n <div className={hasDynamicDateRanges ? `py-3 ${styles.containerWithDynamicRanges}` : 'py-2'}>\n <div className='row px-2'>\n <div className={hasDynamicDateRanges ? 'col-4 pe-2 border-end' : 'col-12'}>\n <ul className={`list-unstyled ${styles.rangeList}`}>\n {props.genericDateRanges.map((range, idx) => (\n <li key={idx}>\n <DateRangeItem\n range={range}\n onClick={onClickRange}\n selectedRangeName={props.selectedRangeName}\n />\n </li>\n ))}\n </ul>\n </div>\n {hasDynamicDateRanges &&\n <div className='col-8 ps-2'>\n <ul className={`list-unstyled ${styles.rangeList}`}>\n {props.dynamicDateRanges.map((range, idx) => (\n <li key={idx}>\n <DateRangeItem\n range={range}\n onClick={onClickRange}\n selectedRangeName={props.selectedRangeName}\n isDynamic\n />\n </li>\n ))}\n </ul>\n </div>\n }\n </div>\n <div className='row px-2'>\n <div className='col-12'>\n <div className={hasDynamicDateRanges ? 'pe-2 text-end' : styles.rangeList}>\n <button className='btn btn-link p-0' onClick={props.showCustomRangeSelector}>\n <strong>{getPhrase('customRange')}</strong>\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n}","import { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { getPresetRangeByName } from 'libs/shared/apps/analytics/utils/DateRangeUtils';\nimport { DateRange } from 'libs/shared/interfaces';\n\n\nfunction isThisYear(date: Date): boolean {\n return date.getFullYear() === (new Date()).getFullYear();\n}\n\nfunction formatDate(date: Date, showYear: boolean): string {\n const format = showYear\n ? 'ddd, D MMM YYYY'\n : 'ddd, D MMM';\n\n return DateHelper.format(date, format);\n}\n\nexport function getInputValue(dateRangePreset: DateRange[], queryRange: DateRange, hideRange?: boolean): string {\n const presetRange = getPresetRangeByName(dateRangePreset, queryRange.name);\n\n const inputRange = presetRange || queryRange;\n\n if (!inputRange.startDate || !inputRange.endDate)\n return '';\n\n const showYear = !isThisYear(inputRange.startDate) || !isThisYear(inputRange.endDate);\n\n const value = !hideRange && `${formatDate(inputRange.startDate, showYear)} - ${formatDate(inputRange.endDate, showYear)}`;\n\n if (!inputRange.name)\n return value;\n\n return `${inputRange.name}${!hideRange ? ` (${value})` : ''}`;\n}","import React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { DateRangeQueryParams } from 'libs/shared/apps/analytics/interfaces/DateRangeQueryParams';\nimport {\n getMaxDate, getMinDate, getRouteQueryParams,\n useGetDateRangeFromQueryParams\n} from 'libs/shared/apps/analytics/utils/DateRangeUtils';\nimport { DateRange } from 'libs/shared/interfaces';\nimport { AppRouteHelper } from 'libs/shared/utils/AppRouteHelper';\n\nimport { CustomDateRangeSelector } from './components/custom-date-range-selector/CustomDateRangeSelector';\nimport { DateRangeInput } from './components/date-range-input/DateRangeInput';\nimport { PresetDateRangeSelector } from './components/preset-date-range-selector/PresetDateRangeSelector';\nimport { getInputValue } from './DateRangeSelectorUtils';\n\ntype DropdownState = 'none' | 'preset' | 'custom';\n\ninterface DateRangeSelectorViewProps {\n dateRangeQueryParams: DateRangeQueryParams;\n dateRangePresets: DateRange[];\n hideRange?: boolean;\n}\n\nexport function DateRangeSelectorView(props: DateRangeSelectorViewProps): JSX.Element {\n const queryParamDateRange = useGetDateRangeFromQueryParams(props.dateRangePresets, props.dateRangeQueryParams);\n const [ customDateRange, setCustomDateRange ] = React.useState<DateRange>(queryParamDateRange);\n const [ dropdownState, setDropdownState ] = React.useState<DropdownState>('none');\n\n React.useEffect(() => {\n setCustomDateRange(queryParamDateRange);\n }, [!!queryParamDateRange]);\n\n function onSelectPresetDateRange(range: DateRange): void {\n setCustomDateRange(range);\n applyDateRange(range);\n }\n\n function onToggleCustomDateRangeSelector(): void {\n setDropdownState('none');\n applyDateRange(customDateRange);\n }\n\n function applyDateRange(range: DateRange): void {\n setDropdownState('none');\n\n AppRouteHelper.updateParams(getRouteQueryParams(range), { merge: true, keysToRemove: ['rangeName']});\n }\n\n /**\n * If useGetDateRangeFromQueryParams doesn't return a DateRange then it will have\n * triggered an app route update with a new, valid DateRange, so we wait for that.\n */\n if (!queryParamDateRange)\n return <></>;\n\n /**\n * This is rendered as two separate dropdowns so that the menus are sized correctly.\n * The first menu is triggered by clicking on the Dropdown.Toggle in DateRangeInput\n * which fires onToggle.\n * The second menu is only accessible by clicking `Custom Range` in the first menu.\n */\n return (\n <div className='position-relative'>\n <Dropdown\n show={dropdownState === 'preset'}\n onToggle={show => setDropdownState(show ? 'preset' : 'none')}\n className={dropdownState === 'custom' ? 'd-none' : ''}\n >\n <DateRangeInput\n value={getInputValue(props.dateRangePresets, queryParamDateRange, props.hideRange)}\n hideRange={props.hideRange}\n />\n <Dropdown.Menu className='p-0' align='end'>\n <PresetDateRangeSelector\n genericDateRanges={props.dateRangePresets}\n setDateRange={onSelectPresetDateRange}\n showCustomRangeSelector={() => setDropdownState('custom')}\n selectedRangeName={queryParamDateRange.name}\n />\n </Dropdown.Menu>\n </Dropdown>\n <Dropdown\n show={dropdownState === 'custom'}\n onToggle={onToggleCustomDateRangeSelector}\n className={dropdownState === 'custom' ? '' : 'd-none'}\n >\n <DateRangeInput value={getInputValue(props.dateRangePresets, queryParamDateRange)} />\n <Dropdown.Menu className='p-0' align='end'>\n <CustomDateRangeSelector\n startDate={customDateRange?.startDate}\n endDate={customDateRange?.endDate}\n setDateRange={setCustomDateRange}\n maxDate={getMaxDate()}\n minDate={getMinDate()}\n onClickApply={() => applyDateRange(customDateRange)}\n close={() => setDropdownState('none')}\n />\n </Dropdown.Menu>\n </Dropdown>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { ClassroomRequests } from 'libs/shared/apps/analytics/flight-requests/ClassroomRequests';\nimport { AudienceQueryParams } from 'libs/shared/apps/analytics/interfaces/AudienceQueryParams';\nimport { Classroom, ClassroomGroup } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'insights.hooks';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function useClassroomBreadcrumbs(params: AudienceQueryParams) {\n const classroomId = params.classrooms?.length === 1 && !params.classroomGroups?.length\n ? ArrayHelper.first(params.classrooms)\n : null;\n const classroom = Flight.useBasicFetch<Classroom>(classroomId && ClassroomRequests.classroom(classroomId));\n const classroomGroupId = params.classroomGroups?.length === 1 && !params.classrooms?.length\n ? ArrayHelper.first(params.classroomGroups)\n : null;\n const classroomGroup = Flight.useBasicFetch<ClassroomGroup>(\n classroomGroupId && ClassroomRequests.classroomGroup(classroomGroupId)\n );\n \n const paramsKey = JSON.stringify(params);\n\n const breadcrumbs = React.useMemo(() => {\n if (((params.classrooms?.length || 0) + (params.classroomGroups?.length || 0)) > 1) {\n return [\n {\n name: getPhrase('classrooms'),\n appLink: {\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.HOME\n }\n }\n ];\n }\n\n if (classroom.data || classroomGroup.data) {\n const classroomData = classroom.data || classroomGroup.data?.classroom;\n\n return [\n {\n name: getPhrase('classrooms'),\n appLink: {\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.HOME\n }\n },\n {\n name: classroomData.name,\n appLink: {\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.CLASSROOM_OVERVIEW,\n args: [classroomData.id]\n }\n }\n ];\n }\n\n return [\n {\n name: getPhrase('insights'),\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.HOME\n }\n }\n ];\n }, [ paramsKey, classroom.data, classroomGroup.data ]);\n\n return breadcrumbs;\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 { AudienceQueryParams } from 'libs/shared/apps/analytics/interfaces/AudienceQueryParams';\nimport { DateRangeQueryParams } from 'libs/shared/apps/analytics/interfaces/DateRangeQueryParams';\nimport { getInsightsDateRangePresets } from 'libs/shared/apps/analytics/utils/DateRangeUtils';\nimport { AudienceFilterView } from 'libs/shared/apps/analytics/views/audience-filter/AudienceFilterView';\nimport { DateRangeSelectorView } from 'libs/shared/apps/analytics/views/date-range-selector/DateRangeSelectorView';\nimport { ActionsDropdown } from 'libs/shared/components/actions/ActionsDropdown';\nimport { Breadcrumbs, PartialBreadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { PillTab, PillTabSelector } from 'libs/shared/components/pill-tab-selector/PillTabSelector';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { useClassroomBreadcrumbs } from 'apps/insights/hooks/useClassroomBreadcrumbs';\n\nconst namespace = 'shared.insightsHeaderView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightsHeaderProps {\n audienceAppLinkParams: AudienceQueryParams;\n dateRangeAppLinkParams: DateRangeQueryParams;\n video: VideoTypes;\n tabs: PillTab[];\n}\n\nexport function InsightsHeaderView(props: InsightsHeaderProps) {\n const [ anonymiseUsers, setAnonymiseUsers ] = useViewModel<boolean>(\n SharedViewModelKeys.ANONYMISE_USERS,\n false,\n { storage: StorageType.LocalStorage }\n );\n\n const classroomBreadcrumbs = useClassroomBreadcrumbs(props.audienceAppLinkParams);\n\n function getBreadcrumbs() {\n return [\n ...classroomBreadcrumbs,\n {\n name: props.video.name,\n active: true\n }\n ];\n }\n\n return (\n <>\n <section className='mb-3'>\n <div className='d-flex justify-content-between mb-2'>\n <h1 className='mb-0'>{props.video.name}</h1>\n <div className='d-flex gap-2'>\n <AudienceFilterView />\n <DateRangeSelectorView\n dateRangeQueryParams={props.dateRangeAppLinkParams}\n dateRangePresets={getInsightsDateRangePresets()}\n hideRange />\n <ActionsDropdown\n dropdownToggleClassName='btn btn-outline-dark'\n actions={[\n {\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 label: getPhrase('goTo'),\n appLink: VideoAppLinkHelper.getAppLink(props.video)\n\n },\n {\n label: getPhrase(anonymiseUsers ? 'showNames' : 'hideNames'),\n onClick: () => setAnonymiseUsers(!anonymiseUsers)\n }\n ]}\n />\n </div>\n </div>\n {classroomBreadcrumbs.length ? <Breadcrumbs breadcrumbs={getBreadcrumbs()} /> : <PartialBreadcrumbs />}\n <div className='mb-3'>\n </div>\n <div>\n <PillTabSelector tabs={props.tabs} />\n </div>\n </section>\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"circleContainer\":\"p8Vgz\",\"backgroundCircle\":\"asGGE\",\"circleSuccess\":\"PXLNj\",\"circleWarning\":\"ZckRN\",\"circleDanger\":\"slBRg\",\"lgCircleContainer\":\"N8KCI\",\"pendingCircle\":\"DKrcq\",\"centredPercentageText\":\"tpmLR\"};","// extracted by mini-css-extract-plugin\nexport default {\"pillTabSelector\":\"Hdi6o\",\"tab\":\"RvNxr\",\"minWidth\":\"GHSz9\",\"radiusSmall\":\"VhJJa\",\"tabLink\":\"WFyvo\"};"],"names":["anonymiseUserName","user","shouldAnonymise","seed","id","Math","floor","Date","getMinutes","dictionaries","separator","length","style","getUniqueNamesConfig","getAudienceParams","queryParams","userId","groupId","users","push","classrooms","classroomGroups","getPhrase","convertDateToUtcDateTimeString","date","utc","getMinDate","getMaxDate","getDefaultDateRange","dateRangePresetss","find","range","getPresetRangeByName","rangeName","p","name","getInsightsDateRangePresets","minDate","currentYear","getFullYear","isMinDateThisYear","startDate","endDate","getMonth","disabled","tooltip","default","formatDateQueryParam","getRouteQueryParams","dateRange","from","to","useGetDateRangeFromQueryParams","dateRangePresets","dateRangeQueryParams","presetRange","replace","merge","keysToRemove","defaultDateRange","initialDateRangeValid","getStartEndParams","filterParams","getStartDate","getEndDate","start","end","defaultRange","BreadcrumbItem","props","ref","breadcrumb","appLink","active","withBackIcon","trimmedName","title","slice","className","svgName","size","S","Breadcrumbs","breadcrumbs","isMobile","collapse","setCollapse","shouldFocus","setShouldFocus","expandRef","characterLength","reduce","prev","next","current","focus","first","second","secondLast","last","rest","onClick","map","idx","key","PartialBreadcrumbs","numItems","height","width","dangerouslySetInnerHTML","__html","PercentageIndicatorLayout","ProgressCircle","circle","radius","r","baseVal","value","circumference","PI","offset","percentage","strokeDasharray","strokeDashoffset","toString","scoreThresholds","PercentageIndicator","percentageToFixed","layout","LabelInside","label","customLabel","LabelOnly","LabelBefore","defaultProps","CircleOnly","ProgressCircleSize","CIRCLE_WIDTH","CIRCLE_WIDTH_LG","CIRCLE_STROKE_WIDTH","CIRCLE_STROKE_WIDTH_LG","getCircleRadius","Large","strokeWidth","getCircleClassName","HIGH","MODERATE","getColouredLabelClassName","getCircleContainerClassName","isPending","getPercentageToFixed","toFixed","getFormattedPercentage","round","TabContents","tab","count","type","data","PillTabSelector","containerRef","borderRadius","listClassName","tabs","index","analyticsData","analyticsOptions","onSelect","onSelectTab","ScoreThresholdDefaults","ScoreThresholdInsights","DEFAULT_PARTIAL_LOADING_OPTIONS","minWidth","maxWidth","PartialLoadingHelper","getPartialLoadingItems","options","opts","Array","max","random","getInsightsVideoTabs","params","application","action","args","getInsightsClipTabs","getInsightsInteractiveTabs","LanguageService","NUM_MONTHS_TO_DISPLAY","DATE_DISPLAY_FORMAT","CustomDateRangeSelector","focusedInput","setFocusedInput","startDateInputRef","endDateInputRef","useSetInputFocus","SvgContainer","DateHelper","onChange","onFocus","close","mode","numberOfMonths","selected","onDayClick","day","setDateRange","undefined","s","captionLayout","fromDate","toDate","maxDate","modifiersClassNames","today","defaultMonth","onClickApply","DateRangeInput","Dropdown","as","hideRange","onKeyDown","e","preventDefault","autoComplete","isDateInFuture","isRangeInFuture","DateRangeItem","selectedRangeName","isDisabled","DateRangeButton","isSelected","buttonClassName","isDynamic","Tooltip","placement","spanHack","spanHackClassName","PresetDateRangeSelector","onClickRange","validatedRange","validateRange","hasDynamicDateRanges","dynamicDateRanges","genericDateRanges","showCustomRangeSelector","isThisYear","formatDate","showYear","format","getInputValue","dateRangePreset","queryRange","inputRange","DateRangeSelectorView","queryParamDateRange","customDateRange","setCustomDateRange","dropdownState","setDropdownState","applyDateRange","AppRouteHelper","show","onToggle","align","InsightsHeaderView","classroomId","classroom","classroomGroupId","classroomGroup","paramsKey","SharedViewModelKeys","storage","anonymiseUsers","setAnonymiseUsers","classroomBreadcrumbs","audienceAppLinkParams","ArrayHelper","ClassroomRequests","JSON","stringify","classroomData","video","AudienceFilterView","dateRangeAppLinkParams","ActionsDropdown","dropdownToggleClassName","actions","VideoAppLinkHelper"],"sourceRoot":""}
1
+ {"version":3,"file":"scripts/839-aaf4cad363-lite.chunk.js","mappings":"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","sources":["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/breadcrumbs/Breadcrumbs.tsx","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/components/pill-tab-selector/PillTabSelector.tsx","file:///app/packages/libs/shared/src/constants/ScoreThresholds.ts","file:///app/packages/libs/shared/src/utils/PartialLoadingHelper.ts","file:///app/packages/projects/lite/src/apps/insights/utils/InsightsAppLinkUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/views/date-range-selector/components/custom-date-range-selector/custom-date-range-selector.scss","file:///app/packages/libs/shared/src/apps/analytics/views/date-range-selector/components/custom-date-range-selector/CustomDateRangeSelector.tsx","file:///app/packages/libs/shared/src/apps/analytics/views/date-range-selector/components/custom-date-range-selector/CustomDateRangeSelectorHooks.ts","file:///app/packages/libs/shared/src/apps/analytics/views/date-range-selector/components/date-range-input/date-range-input.scss","file:///app/packages/libs/shared/src/apps/analytics/views/date-range-selector/components/date-range-input/DateRangeInput.tsx","file:///app/packages/libs/shared/src/apps/analytics/views/date-range-selector/components/preset-date-range-selector/PresetDateRangeSelectorUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/views/date-range-selector/components/preset-date-range-selector/preset-date-range-selector.scss","file:///app/packages/libs/shared/src/apps/analytics/views/date-range-selector/components/preset-date-range-selector/PresetDateRangeSelector.tsx","file:///app/packages/libs/shared/src/apps/analytics/views/date-range-selector/DateRangeSelectorUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/views/date-range-selector/DateRangeSelectorView.tsx","file:///app/packages/projects/lite/src/apps/insights/hooks/useClassroomBreadcrumbs.ts","file:///app/packages/projects/lite/src/apps/insights/views/header/InsightsHeaderView.tsx","file:///app/packages/libs/shared/src/components/percentage-indicator/percentage-indicator.scss","file:///app/packages/libs/shared/src/components/pill-tab-selector/pill-tab-selector.scss"],"sourcesContent":["import { animals, colors, Config as UniqueNamesConfig, uniqueNamesGenerator } from 'unique-names-generator';\n\nimport { User } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\n\nfunction getUniqueNamesConfig(user: User): 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 = +`${user.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: User, shouldAnonymise: boolean): string {\n if (!shouldAnonymise)\n return UserHelper.getFullName(user);\n\n return uniqueNamesGenerator(getUniqueNamesConfig(user));\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(dateRangePresetss: DateRange[]): DateRange {\n return dateRangePresetss.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 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 = { startDate, endDate, name: initialDateRangeValid ? rangeName : '' };\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 * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { PartialLoadingHelper } from 'libs/shared/utils/PartialLoadingHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { SvgContainer, SvgContainerSize } from '../svg-container/SvgContainer';\n\nconst namespace = 'shared.breadcrumbComponent';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst COLLAPSE_CHARACTER_COUNT = 64;\nconst MAX_SEGMENT_LENGTH = 48;\n\nexport interface Breadcrumb {\n name: string;\n appLink?: Core.AppLink;\n active?: boolean;\n}\n\ninterface BreadcrumbItemProps {\n breadcrumb: Breadcrumb;\n withBackIcon?: boolean;\n}\n\nexport const BreadcrumbItem = React.forwardRef((\n props: BreadcrumbItemProps,\n ref: React.ForwardedRef<HTMLElement>\n) => {\n const { breadcrumb: { name, appLink, active }, withBackIcon } = props;\n\n let trimmedName = name;\n let title: string = null;\n\n if (trimmedName.length > MAX_SEGMENT_LENGTH) {\n trimmedName = name.slice(0, MAX_SEGMENT_LENGTH) + '...';\n\n // Only setting the title when we trim, because otherwise it's really not needed - Sha\n title = name;\n }\n\n return (\n <li\n className={`breadcrumb-item${active ? ' active' : ''}`}\n title={title}\n >\n {active\n ? <strong>{trimmedName}</strong>\n : <AppLink appLink={appLink} ref={ref}>\n {withBackIcon && <SvgContainer svgName={cvSvgLibrary.ChevronLeft} size={SvgContainerSize.Small} />}\n <span className={withBackIcon ? 'ms-2' : ''}>{trimmedName}</span>\n </AppLink>\n }\n </li>\n );\n});\n\ninterface BreadcrumbsProps {\n breadcrumbs: Breadcrumb[];\n}\n\nexport const Breadcrumbs = ({ breadcrumbs }: BreadcrumbsProps) => {\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n\n const length = breadcrumbs?.length || 0;\n \n const [ collapse, setCollapse ] = React.useState(false);\n const [ shouldFocus, setShouldFocus ] = React.useState(false);\n const expandRef = React.useRef<HTMLElement>();\n\n React.useEffect(() => {\n const characterLength = breadcrumbs?.reduce((prev, next) => prev + next.name.length, 0) ?? 0;\n\n if (length > 4 && characterLength > COLLAPSE_CHARACTER_COUNT)\n setCollapse(true);\n }, [breadcrumbs?.length]);\n\n /**\n * Focus our first expanded item the first time it appears.\n */\n React.useLayoutEffect(() => {\n if (shouldFocus)\n expandRef.current?.focus();\n }, [ expandRef.current, shouldFocus ]);\n\n function onClickExpand() {\n setCollapse(false);\n setShouldFocus(true);\n }\n\n if (!length || (isMobile && length < 2))\n return <></>;\n\n if (isMobile)\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n <BreadcrumbItem breadcrumb={breadcrumbs[length - 2]} withBackIcon />\n </ol>\n </nav>\n );\n\n const first = <BreadcrumbItem breadcrumb={breadcrumbs[0]} />;\n const second = length > 2 ? <BreadcrumbItem breadcrumb={breadcrumbs[1]} /> : <></>;\n const secondLast = length > 3 ? <BreadcrumbItem breadcrumb={breadcrumbs[length - 2]} /> : <></>;\n const last = length > 1 ? <BreadcrumbItem breadcrumb={breadcrumbs[length - 1]} /> : <></>;\n const rest = breadcrumbs.slice(2, length - 2);\n\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {first}\n {second}\n {collapse ?\n <li className='breadcrumb-item'>\n <button\n className='btn-link'\n onClick={onClickExpand}\n aria-label={getPhrase('expand')}\n >\n ...\n </button>\n </li> :\n rest.map((breadcrumb, idx) => (\n <BreadcrumbItem\n key={idx}\n breadcrumb={breadcrumb}\n ref={idx === 0 ? expandRef : null}\n />\n ))\n }\n {secondLast}\n {last}\n </ol>\n </nav>\n );\n};\n\nexport const PartialBreadcrumbs = React.memo(function({ numItems = 3 }: { numItems?: number; }) {\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n\n if (isMobile) {\n return (\n <div className='partial-loading-background' style={{ height: '1.3125rem', width: '6rem' }} />\n );\n }\n\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {PartialLoadingHelper.getPartialLoadingItems({ numItems }).map(({ width }, idx) => (\n <li key={idx} className='breadcrumb-item'>\n <span className='d-inline-block partial-loading-background' style={{ width }} dangerouslySetInnerHTML={{ __html: '&nbsp' }} />\n </li>\n ))}\n </ol>\n </nav>\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}\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.layout === PercentageIndicatorLayout.LabelInside\n ? ProgressCircleSize.Large\n : ProgressCircleSize.Small;\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}\n\n/**\n * radius = width / 2 - strokeWidth * 2\n */\nexport function getCircleRadius(size: ProgressCircleSize): string {\n const width = size === ProgressCircleSize.Large ? CIRCLE_WIDTH_LG : CIRCLE_WIDTH;\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 (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}","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 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};","const DEFAULT_PARTIAL_LOADING_OPTIONS: PartialLoadingOptions = {\n numItems: 5,\n minWidth: 50, // px\n maxWidth: 100 // px\n};\n\nexport interface PartialLoadingOptions {\n numItems?: number;\n minWidth?: number;\n maxWidth?: number;\n}\n\ninterface PartialLoadingItem {\n width: string;\n}\n\nexport const PartialLoadingHelper = {\n getPartialLoadingItems(options: PartialLoadingOptions = {}): PartialLoadingItem[] {\n const opts = {\n ...DEFAULT_PARTIAL_LOADING_OPTIONS,\n ...options\n };\n\n const getRandomFilterWidth = () => Math.max(Math.floor(Math.random() * opts.maxWidth), opts.minWidth);\n\n return [...Array(opts.numItems)].map(() => ({ width: `${getRandomFilterWidth()}px` }));\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 = 'overview' | 'heatmap' | 'results' | 'questions';\n\nexport function getInsightsVideoTabs(id: string, active: InsightsTabs, params: HashObject) {\n return [\n {\n name: getPhrase('overview'),\n active: active === 'overview',\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\nexport function getInsightsClipTabs(id: string, active: InsightsTabs, params: HashObject) {\n return [\n {\n name: getPhrase('overview'),\n active: active === 'overview',\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\nexport function getInsightsInteractiveTabs(id: string, active: InsightsTabs, params: HashObject) {\n return [\n {\n name: getPhrase('overview'),\n active: active === 'overview',\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_RESULTS,\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}","// extracted by mini-css-extract-plugin\nexport default {\"dateInputLabel\":\"CLYvu\",\"dateInput\":\"gnEqJ\"};","import React from 'react';\nimport { DayPicker } from 'react-day-picker';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { DateRange } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { useSetInputFocus } from './CustomDateRangeSelectorHooks';\n\nimport './custom-date-range-selector.scss';\nimport './day-picker-styles.scss';\nimport styles from './custom-date-range-selector.scss';\n\nconst namespace = 'shared.customDateRangeSelector';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst NUM_MONTHS_TO_DISPLAY = 2;\nconst DATE_DISPLAY_FORMAT = 'DD/MM/YYYY';\n\ninterface CustomDateRangeSelectorProps {\n startDate: Date | null;\n endDate: Date | null;\n setDateRange: (dateRange: DateRange) => void;\n minDate: Date;\n maxDate: Date;\n onClickApply: () => void;\n close: () => void;\n}\n\nexport function CustomDateRangeSelector(props: CustomDateRangeSelectorProps): JSX.Element {\n const [ focusedInput, setFocusedInput ] = React.useState<'startDate' | 'endDate'>('startDate');\n const [ startDateInputRef, endDateInputRef ] = useSetInputFocus(focusedInput);\n\n function handleDayClick(day: any) {\n if (focusedInput === 'startDate') {\n props.setDateRange({\n startDate: day,\n endDate: DateHelper.isAfter(day, props.endDate) ? undefined : props.endDate\n });\n setFocusedInput(s => s === 'endDate' ? 'startDate' : 'endDate');\n } else {\n props.setDateRange({\n startDate: DateHelper.isAfter(props.startDate, day) ? day : props.startDate,\n endDate: DateHelper.isAfter(props.startDate, day) ? undefined : day\n });\n\n if (!DateHelper.isAfter(props.startDate, day)) {\n setFocusedInput(s => s === 'endDate' ? 'startDate' : 'endDate');\n }\n }\n }\n\n return (\n <div className='d-inline-block'>\n <div className='d-flex align-items-center border-bottom p-3'>\n <div className='me-auto invisible'>\n <SvgContainer svgName={cvSvgLibrary.Close} />\n </div>\n <form className='d-flex align-items-center'>\n <div className='position-relative'>\n <strong className={styles.dateInputLabel}>{getPhrase('from')}</strong>\n <input\n ref={startDateInputRef}\n className={`form-control cursor-pointer ${styles.dateInput}`}\n value={DateHelper.format(props.startDate, DATE_DISPLAY_FORMAT) ?? ''}\n onChange={() => {}}\n onFocus={() => setFocusedInput('startDate')}\n />\n </div>\n <span className='px-3'>\n <SvgContainer svgName={cvSvgLibrary.ArrowRight} />\n </span>\n <div className='position-relative'>\n <strong className={styles.dateInputLabel}>{getPhrase('to')}</strong>\n <input\n ref={endDateInputRef}\n className={`form-control cursor-pointer ${styles.dateInput}`}\n value={DateHelper.format(props.endDate, DATE_DISPLAY_FORMAT) ?? ''}\n onChange={() => {}}\n onFocus={() => setFocusedInput('endDate')}\n />\n </div>\n </form>\n <div className='ms-auto cursor-pointer'>\n <SvgContainer svgName={cvSvgLibrary.Close} onClick={props.close} />\n </div>\n </div>\n <div className='p-3'>\n <DayPicker\n mode='range'\n numberOfMonths={NUM_MONTHS_TO_DISPLAY}\n selected={{ from: props.startDate, to: props.endDate }}\n onDayClick={handleDayClick}\n captionLayout='dropdown-buttons'\n fromDate={props.minDate}\n toDate={props.maxDate}\n modifiersClassNames={{\n selected: 'my-selected',\n today: 'my-today'\n }}\n defaultMonth={props.startDate}\n />\n </div>\n <div className='pb-3 px-3 text-end'>\n <button className='btn btn-outline-dark' onClick={props.onClickApply}>\n {getPhrase('apply')}\n </button>\n </div>\n </div>\n );\n}","import React from 'react';\n\ntype InputRef = React.MutableRefObject<HTMLInputElement>;\n\nexport function useSetInputFocus(focusedInput: 'startDate' | 'endDate'): [InputRef, InputRef] {\n const startDateInputRef = React.useRef<HTMLInputElement>();\n const endDateInputRef = React.useRef<HTMLInputElement>();\n\n React.useEffect(() => {\n if (focusedInput === 'startDate')\n startDateInputRef.current?.focus();\n\n if (focusedInput === 'endDate')\n endDateInputRef.current?.focus();\n }, [focusedInput]);\n\n return [ startDateInputRef, endDateInputRef ];\n}","// extracted by mini-css-extract-plugin\nexport default {\"inputContainer\":\"YQJPT\",\"clearButton\":\"w2hAw\",\"inputBtnContainer\":\"iSXkk\",\"input\":\"IBR6Q\"};","import React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './date-range-input.scss';\n\ninterface DateRangeInputProps {\n value: string;\n hideRange?: boolean;\n}\n\nexport function DateRangeInput(props: DateRangeInputProps): JSX.Element {\n return (\n <Dropdown.Toggle as='div' id='date-range-dropdown' className={`no-caret ${!props.hideRange ? styles.inputContainer : ''}`}>\n <input\n className={`form-control cursor-pointer border-dark ${styles.input}`}\n value={props.value}\n onChange={() => {}}\n onKeyDown={(e: React.KeyboardEvent) => e.preventDefault()} // Prevent keyboard input\n autoComplete='off'\n />\n <div className={styles.inputBtnContainer}>\n <div className='d-inline-block cursor-pointer'>\n <SvgContainer\n svgName={cvSvgLibrary.Calendar}\n size={SvgContainerSize.Standard}\n />\n </div>\n </div>\n </Dropdown.Toggle>\n );\n}","import { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { DateRange } from 'libs/shared/interfaces';\n\nfunction isDateInFuture(date: Date): boolean {\n return DateHelper.isAfter(date, new Date(), 'day');\n}\n\nexport function isRangeInFuture(range: DateRange): boolean {\n return isDateInFuture(range.startDate);\n}\n\nexport function getDynamicRangeSubLabel(range: DateRange): string {\n return `(${DateHelper.format(range.startDate, 'ddd, D MMM')}`\n + ` - ${DateHelper.format(range.endDate, 'ddd, D MMM')})`;\n}\n\nexport function validateRange(range: DateRange): DateRange | null {\n if (isRangeInFuture(range))\n return;\n\n if (isDateInFuture(range.endDate))\n return {\n ...range,\n endDate: new Date()\n };\n\n return range;\n}","// extracted by mini-css-extract-plugin\nexport default {\"containerWithDynamicRanges\":\"pvYdJ\",\"selectedDateRange\":\"JU7bd\",\"rangeList\":\"DBlzu\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { DateRange } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { getDynamicRangeSubLabel, isRangeInFuture, validateRange } from './PresetDateRangeSelectorUtils';\n\nimport styles from './preset-date-range-selector.scss';\n\nconst namespace = 'shared.presetDateRangeSelector';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getButtonClassName(isSelected: boolean): string {\n const buttonClassName = 'btn btn-link d-flex align-items-center py-1 px-0 text-decoration-none';\n\n if (isSelected)\n return buttonClassName + ` fw-bold text-info ${styles.selectedDateRange}`;\n\n return buttonClassName + ' text-body';\n}\n\ninterface DateRangeItemProps {\n range: DateRange;\n onClick: (range: DateRange) => void;\n selectedRangeName?: string;\n isDynamic?: boolean;\n}\n\nfunction DateRangeItem(props: DateRangeItemProps): JSX.Element {\n const selected = props.range.name === props.selectedRangeName;\n const isDisabled = isRangeInFuture(props.range) || props.range.disabled;\n\n const DateRangeButton = () => (\n <button className={getButtonClassName(selected)} onClick={() => props.onClick(props.range)} disabled={isDisabled}>\n {selected && <SvgContainer svgName={cvSvgLibrary.Check} />}\n <span className={`${isDisabled ? 'text-secondary' : ''} ${props.isDynamic ? 'fw-bold' : ''}`}>\n {props.range.name}\n </span>\n {!!props.isDynamic &&\n <>\n &nbsp;\n <span className='text-secondary'>{getDynamicRangeSubLabel(props.range)}</span>\n </>\n }\n </button>\n );\n\n if (!props.range.tooltip)\n return <DateRangeButton />;\n\n return (\n <Tooltip\n title={props.range.tooltip}\n placement='left'\n spanHack\n spanHackClassName='justify-content-start'\n >\n <DateRangeButton />\n </Tooltip>\n );\n}\n\n\ninterface PresetDateRangeSelectorProps {\n genericDateRanges: DateRange[];\n setDateRange: (dateRange: DateRange) => void;\n showCustomRangeSelector: () => void;\n dynamicDateRanges?: DateRange[];\n selectedRangeName?: string;\n}\n\nexport function PresetDateRangeSelector(props: PresetDateRangeSelectorProps): JSX.Element {\n function onClickRange(range: DateRange): void {\n const validatedRange = validateRange(range);\n\n if (!validatedRange)\n return;\n\n props.setDateRange(validatedRange);\n }\n\n const hasDynamicDateRanges = !!props.dynamicDateRanges?.length;\n\n return (\n <div className={hasDynamicDateRanges ? `py-3 ${styles.containerWithDynamicRanges}` : 'py-2'}>\n <div className='row px-2'>\n <div className={hasDynamicDateRanges ? 'col-4 pe-2 border-end' : 'col-12'}>\n <ul className={`list-unstyled ${styles.rangeList}`}>\n {props.genericDateRanges.map((range, idx) => (\n <li key={idx}>\n <DateRangeItem\n range={range}\n onClick={onClickRange}\n selectedRangeName={props.selectedRangeName}\n />\n </li>\n ))}\n </ul>\n </div>\n {hasDynamicDateRanges &&\n <div className='col-8 ps-2'>\n <ul className={`list-unstyled ${styles.rangeList}`}>\n {props.dynamicDateRanges.map((range, idx) => (\n <li key={idx}>\n <DateRangeItem\n range={range}\n onClick={onClickRange}\n selectedRangeName={props.selectedRangeName}\n isDynamic\n />\n </li>\n ))}\n </ul>\n </div>\n }\n </div>\n <div className='row px-2'>\n <div className='col-12'>\n <div className={hasDynamicDateRanges ? 'pe-2 text-end' : styles.rangeList}>\n <button className='btn btn-link p-0' onClick={props.showCustomRangeSelector}>\n <strong>{getPhrase('customRange')}</strong>\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n}","import { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { getPresetRangeByName } from 'libs/shared/apps/analytics/utils/DateRangeUtils';\nimport { DateRange } from 'libs/shared/interfaces';\n\n\nfunction isThisYear(date: Date): boolean {\n return date.getFullYear() === (new Date()).getFullYear();\n}\n\nfunction formatDate(date: Date, showYear: boolean): string {\n const format = showYear\n ? 'ddd, D MMM YYYY'\n : 'ddd, D MMM';\n\n return DateHelper.format(date, format);\n}\n\nexport function getInputValue(dateRangePreset: DateRange[], queryRange: DateRange, hideRange?: boolean): string {\n const presetRange = getPresetRangeByName(dateRangePreset, queryRange.name);\n\n const inputRange = presetRange || queryRange;\n\n if (!inputRange.startDate || !inputRange.endDate)\n return '';\n\n const showYear = !isThisYear(inputRange.startDate) || !isThisYear(inputRange.endDate);\n\n const value = !hideRange && `${formatDate(inputRange.startDate, showYear)} - ${formatDate(inputRange.endDate, showYear)}`;\n\n if (!inputRange.name)\n return value;\n\n return `${inputRange.name}${!hideRange ? ` (${value})` : ''}`;\n}","import React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { DateRangeQueryParams } from 'libs/shared/apps/analytics/interfaces/DateRangeQueryParams';\nimport {\n getMaxDate, getMinDate, getRouteQueryParams,\n useGetDateRangeFromQueryParams\n} from 'libs/shared/apps/analytics/utils/DateRangeUtils';\nimport { DateRange } from 'libs/shared/interfaces';\nimport { AppRouteHelper } from 'libs/shared/utils/AppRouteHelper';\n\nimport { CustomDateRangeSelector } from './components/custom-date-range-selector/CustomDateRangeSelector';\nimport { DateRangeInput } from './components/date-range-input/DateRangeInput';\nimport { PresetDateRangeSelector } from './components/preset-date-range-selector/PresetDateRangeSelector';\nimport { getInputValue } from './DateRangeSelectorUtils';\n\ntype DropdownState = 'none' | 'preset' | 'custom';\n\ninterface DateRangeSelectorViewProps {\n dateRangeQueryParams: DateRangeQueryParams;\n dateRangePresets: DateRange[];\n hideRange?: boolean;\n}\n\nexport function DateRangeSelectorView(props: DateRangeSelectorViewProps): JSX.Element {\n const queryParamDateRange = useGetDateRangeFromQueryParams(props.dateRangePresets, props.dateRangeQueryParams);\n const [ customDateRange, setCustomDateRange ] = React.useState<DateRange>(queryParamDateRange);\n const [ dropdownState, setDropdownState ] = React.useState<DropdownState>('none');\n\n React.useEffect(() => {\n setCustomDateRange(queryParamDateRange);\n }, [!!queryParamDateRange]);\n\n function onSelectPresetDateRange(range: DateRange): void {\n setCustomDateRange(range);\n applyDateRange(range);\n }\n\n function onToggleCustomDateRangeSelector(): void {\n setDropdownState('none');\n applyDateRange(customDateRange);\n }\n\n function applyDateRange(range: DateRange): void {\n setDropdownState('none');\n\n AppRouteHelper.updateParams(getRouteQueryParams(range), { merge: true, keysToRemove: ['rangeName']});\n }\n\n /**\n * If useGetDateRangeFromQueryParams doesn't return a DateRange then it will have\n * triggered an app route update with a new, valid DateRange, so we wait for that.\n */\n if (!queryParamDateRange)\n return <></>;\n\n /**\n * This is rendered as two separate dropdowns so that the menus are sized correctly.\n * The first menu is triggered by clicking on the Dropdown.Toggle in DateRangeInput\n * which fires onToggle.\n * The second menu is only accessible by clicking `Custom Range` in the first menu.\n */\n return (\n <div className='position-relative'>\n <Dropdown\n show={dropdownState === 'preset'}\n onToggle={show => setDropdownState(show ? 'preset' : 'none')}\n className={dropdownState === 'custom' ? 'd-none' : ''}\n >\n <DateRangeInput\n value={getInputValue(props.dateRangePresets, queryParamDateRange, props.hideRange)}\n hideRange={props.hideRange}\n />\n <Dropdown.Menu className='p-0' align='end'>\n <PresetDateRangeSelector\n genericDateRanges={props.dateRangePresets}\n setDateRange={onSelectPresetDateRange}\n showCustomRangeSelector={() => setDropdownState('custom')}\n selectedRangeName={queryParamDateRange.name}\n />\n </Dropdown.Menu>\n </Dropdown>\n <Dropdown\n show={dropdownState === 'custom'}\n onToggle={onToggleCustomDateRangeSelector}\n className={dropdownState === 'custom' ? '' : 'd-none'}\n >\n <DateRangeInput value={getInputValue(props.dateRangePresets, queryParamDateRange)} />\n <Dropdown.Menu className='p-0' align='end'>\n <CustomDateRangeSelector\n startDate={customDateRange?.startDate}\n endDate={customDateRange?.endDate}\n setDateRange={setCustomDateRange}\n maxDate={getMaxDate()}\n minDate={getMinDate()}\n onClickApply={() => applyDateRange(customDateRange)}\n close={() => setDropdownState('none')}\n />\n </Dropdown.Menu>\n </Dropdown>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { ClassroomRequests } from 'libs/shared/apps/analytics/flight-requests/ClassroomRequests';\nimport { AudienceQueryParams } from 'libs/shared/apps/analytics/interfaces/AudienceQueryParams';\nimport { Classroom, ClassroomGroup } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'insights.hooks';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function useClassroomBreadcrumbs(params: AudienceQueryParams) {\n const classroomId = params.classrooms?.length === 1 && !params.classroomGroups?.length\n ? ArrayHelper.first(params.classrooms)\n : null;\n const classroom = Flight.useBasicFetch<Classroom>(classroomId && ClassroomRequests.classroom(classroomId));\n const classroomGroupId = params.classroomGroups?.length === 1 && !params.classrooms?.length\n ? ArrayHelper.first(params.classroomGroups)\n : null;\n const classroomGroup = Flight.useBasicFetch<ClassroomGroup>(\n classroomGroupId && ClassroomRequests.classroomGroup(classroomGroupId)\n );\n \n const paramsKey = JSON.stringify(params);\n\n const breadcrumbs = React.useMemo(() => {\n if (((params.classrooms?.length || 0) + (params.classroomGroups?.length || 0)) > 1) {\n return [\n {\n name: getPhrase('classrooms'),\n appLink: {\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.HOME\n }\n }\n ];\n }\n\n if (classroom.data || classroomGroup.data) {\n const classroomData = classroom.data || classroomGroup.data?.classroom;\n\n return [\n {\n name: getPhrase('classrooms'),\n appLink: {\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.HOME\n }\n },\n {\n name: classroomData.name,\n appLink: {\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.CLASSROOM_OVERVIEW,\n args: [classroomData.id]\n }\n }\n ];\n }\n\n return [\n {\n name: getPhrase('insights'),\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.HOME\n }\n }\n ];\n }, [ paramsKey, classroom.data, classroomGroup.data ]);\n\n return breadcrumbs;\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 { AudienceQueryParams } from 'libs/shared/apps/analytics/interfaces/AudienceQueryParams';\nimport { DateRangeQueryParams } from 'libs/shared/apps/analytics/interfaces/DateRangeQueryParams';\nimport { getInsightsDateRangePresets } from 'libs/shared/apps/analytics/utils/DateRangeUtils';\nimport { AudienceFilterView } from 'libs/shared/apps/analytics/views/audience-filter/AudienceFilterView';\nimport { DateRangeSelectorView } from 'libs/shared/apps/analytics/views/date-range-selector/DateRangeSelectorView';\nimport { ActionsDropdown } from 'libs/shared/components/actions/ActionsDropdown';\nimport { Breadcrumbs, PartialBreadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { PillTab, PillTabSelector } from 'libs/shared/components/pill-tab-selector/PillTabSelector';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { useClassroomBreadcrumbs } from 'apps/insights/hooks/useClassroomBreadcrumbs';\n\nconst namespace = 'shared.insightsHeaderView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightsHeaderProps {\n audienceAppLinkParams: AudienceQueryParams;\n dateRangeAppLinkParams: DateRangeQueryParams;\n video: VideoTypes;\n tabs: PillTab[];\n}\n\nexport function InsightsHeaderView(props: InsightsHeaderProps) {\n const [ anonymiseUsers, setAnonymiseUsers ] = useViewModel<boolean>(\n SharedViewModelKeys.ANONYMISE_USERS,\n false,\n { storage: StorageType.LocalStorage }\n );\n\n const classroomBreadcrumbs = useClassroomBreadcrumbs(props.audienceAppLinkParams);\n\n function getBreadcrumbs() {\n return [\n ...classroomBreadcrumbs,\n {\n name: props.video.name,\n active: true\n }\n ];\n }\n\n return (\n <>\n <section className='mb-3'>\n <div className='d-flex justify-content-between mb-2'>\n <h1 className='mb-0'>{props.video.name}</h1>\n <div className='d-flex gap-2'>\n <AudienceFilterView />\n <DateRangeSelectorView\n dateRangeQueryParams={props.dateRangeAppLinkParams}\n dateRangePresets={getInsightsDateRangePresets()}\n hideRange />\n <ActionsDropdown\n dropdownToggleClassName='btn btn-outline-dark'\n actions={[\n {\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 label: getPhrase('goTo'),\n appLink:\n VideoAppLinkHelper.getAppLink(props.video)\n },\n {\n label: getPhrase(anonymiseUsers ? 'showNames' : 'hideNames'),\n onClick: () => setAnonymiseUsers(!anonymiseUsers)\n }\n ]}\n />\n </div>\n </div>\n {classroomBreadcrumbs.length ? <Breadcrumbs breadcrumbs={getBreadcrumbs()} /> : <PartialBreadcrumbs />}\n <div className='mb-3'>\n </div>\n <div>\n <PillTabSelector tabs={props.tabs} />\n </div>\n </section>\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"circleContainer\":\"p8Vgz\",\"backgroundCircle\":\"asGGE\",\"circleSuccess\":\"PXLNj\",\"circleWarning\":\"ZckRN\",\"circleDanger\":\"slBRg\",\"lgCircleContainer\":\"N8KCI\",\"pendingCircle\":\"DKrcq\",\"centredPercentageText\":\"tpmLR\"};","// extracted by mini-css-extract-plugin\nexport default {\"pillTabSelector\":\"Hdi6o\",\"tab\":\"RvNxr\",\"minWidth\":\"GHSz9\",\"radiusSmall\":\"VhJJa\",\"tabLink\":\"WFyvo\"};"],"names":["anonymiseUserName","user","shouldAnonymise","seed","id","Math","floor","Date","getMinutes","dictionaries","separator","length","style","getUniqueNamesConfig","getAudienceParams","queryParams","userId","groupId","users","push","classrooms","classroomGroups","getPhrase","convertDateToUtcDateTimeString","date","utc","getMinDate","getMaxDate","getDefaultDateRange","dateRangePresetss","find","range","getPresetRangeByName","rangeName","p","name","getInsightsDateRangePresets","minDate","currentYear","getFullYear","isMinDateThisYear","startDate","endDate","getMonth","disabled","tooltip","default","formatDateQueryParam","getRouteQueryParams","dateRange","from","to","useGetDateRangeFromQueryParams","dateRangePresets","dateRangeQueryParams","presetRange","replace","merge","keysToRemove","defaultDateRange","initialDateRangeValid","getStartEndParams","filterParams","getStartDate","getEndDate","start","end","defaultRange","BreadcrumbItem","props","ref","breadcrumb","appLink","active","withBackIcon","trimmedName","title","slice","className","svgName","size","S","Breadcrumbs","breadcrumbs","isMobile","collapse","setCollapse","shouldFocus","setShouldFocus","expandRef","characterLength","reduce","prev","next","current","focus","first","second","secondLast","last","rest","onClick","map","idx","key","PartialBreadcrumbs","numItems","height","width","dangerouslySetInnerHTML","__html","PercentageIndicatorLayout","ProgressCircle","circle","radius","r","baseVal","value","circumference","PI","offset","percentage","strokeDasharray","strokeDashoffset","toString","scoreThresholds","PercentageIndicator","percentageToFixed","layout","LabelInside","label","customLabel","LabelOnly","LabelBefore","defaultProps","CircleOnly","ProgressCircleSize","CIRCLE_WIDTH","CIRCLE_WIDTH_LG","CIRCLE_STROKE_WIDTH","CIRCLE_STROKE_WIDTH_LG","getCircleRadius","Large","strokeWidth","getCircleClassName","HIGH","MODERATE","getColouredLabelClassName","getCircleContainerClassName","isPending","getPercentageToFixed","toFixed","getFormattedPercentage","round","TabContents","tab","count","type","data","PillTabSelector","containerRef","borderRadius","listClassName","tabs","index","analyticsData","analyticsOptions","onSelect","onSelectTab","ScoreThresholdDefaults","ScoreThresholdInsights","DEFAULT_PARTIAL_LOADING_OPTIONS","minWidth","maxWidth","PartialLoadingHelper","getPartialLoadingItems","options","opts","Array","max","random","getInsightsVideoTabs","params","application","action","args","getInsightsClipTabs","getInsightsInteractiveTabs","LanguageService","NUM_MONTHS_TO_DISPLAY","DATE_DISPLAY_FORMAT","CustomDateRangeSelector","focusedInput","setFocusedInput","startDateInputRef","endDateInputRef","useSetInputFocus","SvgContainer","DateHelper","onChange","onFocus","close","mode","numberOfMonths","selected","onDayClick","day","setDateRange","undefined","s","captionLayout","fromDate","toDate","maxDate","modifiersClassNames","today","defaultMonth","onClickApply","DateRangeInput","Dropdown","as","hideRange","onKeyDown","e","preventDefault","autoComplete","isDateInFuture","isRangeInFuture","DateRangeItem","selectedRangeName","isDisabled","DateRangeButton","isSelected","buttonClassName","isDynamic","Tooltip","placement","spanHack","spanHackClassName","PresetDateRangeSelector","onClickRange","validatedRange","validateRange","hasDynamicDateRanges","dynamicDateRanges","genericDateRanges","showCustomRangeSelector","isThisYear","formatDate","showYear","format","getInputValue","dateRangePreset","queryRange","inputRange","DateRangeSelectorView","queryParamDateRange","customDateRange","setCustomDateRange","dropdownState","setDropdownState","applyDateRange","AppRouteHelper","show","onToggle","align","InsightsHeaderView","classroomId","classroom","classroomGroupId","classroomGroup","paramsKey","SharedViewModelKeys","storage","anonymiseUsers","setAnonymiseUsers","classroomBreadcrumbs","audienceAppLinkParams","ArrayHelper","ClassroomRequests","JSON","stringify","classroomData","video","AudienceFilterView","dateRangeAppLinkParams","ActionsDropdown","dropdownToggleClassName","actions","VideoAppLinkHelper"],"sourceRoot":""}
@@ -1,2 +1,2 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[9139],{72553:(e,t,n)=>{n.d(t,{j:()=>m});var r=n(32735),a=n(49606),l=n(83345),i=n(49439);const c={copyrightDisclaimer:"z8YoI",overlayContainer:"eJDbJ"};function u(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 o="shared.copyrightDisclaimer",s=150;function m(e){var t,n,m,d=(n=(0,i.L)({}),m=2,function(e){if(Array.isArray(e))return e}(n)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,l,i,c=[],u=!0,o=!1;try{if(l=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;u=!1}else for(;!(u=(r=l.call(n)).done)&&(c.push(r.value),c.length!==t);u=!0);}catch(e){o=!0,a=e}finally{try{if(!u&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(o)throw a}}return c}}(n,m)||function(e,t){if(e){if("string"==typeof e)return u(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)?u(e,t):void 0}}(n,m)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),p=d[0],f=d[1];return r.createElement("div",{ref:p,className:e.className},r.createElement("p",{className:"".concat(c.copyrightDisclaimer," ").concat(null!==(t=e.phraseClassName)&&void 0!==t?t:"mb-1")},r.createElement(l.x,{namespace:o,phrase:"copyrightDisclaimer"})),r.createElement(a.Z,{target:p.current,show:f,placement:e.overflowPlacement&&function(){var e;return document.documentElement.clientHeight-(null===(e=p.current)||void 0===e?void 0:e.getBoundingClientRect().bottom)<s}()?e.overflowPlacement:e.placement},r.createElement("div",{className:"".concat(c.overlayContainer," mw-100 bg-white border rounded-3 p-2")},r.createElement("p",null,r.createElement(l.x,{namespace:o,phrase:"warning"})),r.createElement("p",{className:"fw-semibold mb-0"},r.createElement(l.x,{namespace:o,phrase:"sharing"})))))}},93439:(e,t,n)=>{n.d(t,{h:()=>b});var r=n(32735),a=n(44599),l=n(83345),i=n(85597),c=n(54610),u=n(67453),o=n(38496),s=n(22161);function m(e){return m="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},m(e)}function d(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=m(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,"string");if("object"!=m(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==m(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function p(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,a,l,i,c=[],u=!0,o=!1;try{if(l=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;u=!1}else for(;!(u=(r=l.call(n)).done)&&(c.push(r.value),c.length!==t);u=!0);}catch(e){o=!0,a=e}finally{try{if(!u&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(o)throw a}}return c}}(e,t)||function(e,t){if(e){if("string"==typeof e)return f(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)?f(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 f(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 v=/(.*)\s\((.*)?\)/i,h="shared.curriculumLinks",y="text-nowrap font-size-normal rounded-pill py-1 px-2 my-0 d-inline-block";function g(e){function t(){var t=y+" bg-white border";return!e.leaf.name&&e.uiContainsCodes?t+" border-secondary text-secondary":t+" border-dark"}var n=r.useRef();return r.useEffect((function(){if(n.current){var t=n.current.getBoundingClientRect().width;e.trySetMaxCodeWidth(t)}}),[n.current]),r.createElement("div",{className:"d-flex"},e.leaf.description?!e.leaf.name&&e.uiContainsCodes?r.createElement(r.Fragment,null,r.createElement("div",{className:"me-1 align-self-start",style:{minWidth:e.codeWidth?"".concat(e.codeWidth,"px"):"auto"}},r.createElement("h5",{ref:n,className:t()},r.createElement(l.x,{namespace:h,phrase:"noCode"}))),r.createElement("p",{className:"m-0 align-self-center",dangerouslySetInnerHTML:{__html:e.leaf.description}})):e.leaf.name||e.uiContainsCodes?r.createElement(r.Fragment,null,r.createElement("div",{className:"me-1 align-self-start",style:{minWidth:e.codeWidth?"".concat(e.codeWidth,"px"):"auto"}},r.createElement("h5",{ref:n,className:t()},e.leaf.name)),r.createElement("p",{className:"m-0 align-self-center",dangerouslySetInnerHTML:{__html:e.leaf.description}})):r.createElement("p",{className:"m-0",dangerouslySetInnerHTML:{__html:e.leaf.description}}):r.createElement("p",{className:"m-0",dangerouslySetInnerHTML:{__html:e.leaf.name}}))}function E(e){var t,n,a,l={},c=!1;function u(e){var t="mb-2";return e.name||c?t:t+" ms-4 "+s.Z.leafDescriptionOnly}return e.linkSet.areasAndLeaves.forEach((function(e){var t=e[i.k.Area].map((function(e){return e.name})).join(" - ");l[t]?e[i.k.Leaf].forEach((function(e){l[t].find((function(t){return t.name===e.name}))||(l[t].push(e),e.name&&(c=!0))})):l[t]=e[i.k.Leaf]})),r.createElement(r.Fragment,null,r.createElement("h3",{className:"".concat(y," text-white bg-dark-blue fw-normal me-1 mb-2")},(t=e.linkSet[i.k.Audience].name,n=e.linkSet[i.k.Subject].name,(a=t.match(v))?"".concat(a[1]," • ").concat(a[2]," • ").concat(n):"".concat(t," • ").concat(n))),r.createElement("div",{className:"me-2 ".concat(s.Z.curriculumSubject)},Object.keys(l).map((function(t,n){return r.createElement("div",{key:n,className:s.Z.areaLeafSet},t&&r.createElement("h4",{className:"mb-1 font-size-normal"},t),r.createElement("ul",{className:"list-unstyled"},l[t].map((function(t){return r.createElement("li",{key:t.id,className:u(t)},r.createElement(g,{leaf:t,codeWidth:e.codeWidth,trySetMaxCodeWidth:e.trySetMaxCodeWidth,uiContainsCodes:c}))}))))}))))}function b(e){var t,n,m=p(r.useState(0),2),f=m[0],v=m[1],y=p(r.useState(!1),2),g=y[0],b=y[1],C=p(r.useState(!1),2),k=C[0],S=C[1],A=p(r.useState([]),2),I=A[0],N=A[1];function L(e){v((function(t){return t>=e?t:e}))}r.useEffect((function(){var t,n;e.checkAllCurriculums&&e.curriculumLinks&&!(null===(t=e.curriculumLinks)||void 0===t?void 0:t.length)&&(S(!0),e.checkAllCurriculums().then((function(e){e.length&&b(!0),N(e)})).finally((function(){return S(!1)}))),(null===(n=e.curriculumLinks)||void 0===n?void 0:n.length)&&g&&b(!1)}),[null===(t=e.curriculumLinks)||void 0===t?void 0:t.length]);var w=r.useMemo((function(){var t,n={};return null===(t=e.curriculumLinks)||void 0===t||t.forEach((function(e){var t=null,r=null,a=[],l=[];e.forEach((function(e){switch(e.type){case i.k.Subject:t=e;break;case i.k.Audience:r=e;break;case i.k.Area:a.push(e);break;case i.k.Leaf:l.push(e)}}));var c="".concat(t.id,":").concat(r.id);n[c]?n[c].areasAndLeaves.push(d(d({},i.k.Area,a),i.k.Leaf,l)):n[c]=d(d(d({},i.k.Subject,t),i.k.Audience,r),"areasAndLeaves",[d(d({},i.k.Area,a),i.k.Leaf,l)])})),n}),[e.curriculumLinks]);return k?r.createElement(a.Z,null):(null===(n=e.curriculumLinks)||void 0===n?void 0:n.length)||e.hasNonEmptyCurriculums||!e.emptyStateUrl||g||k?g?r.createElement("div",null,r.createElement("div",{className:"mb-3"},r.createElement(l.x,{namespace:h,phrase:"currentEmpty"})),r.createElement("div",{className:"mb-3"},r.createElement(l.x,{namespace:h,phrase:"currentEmptyInfo"})),r.createElement("ul",{className:"list-unstyled mb-0"},I.map((function(t){return r.createElement("li",{key:t.id,className:"p-1 pe-2 rounded-pill d-inline-flex align-items-center cursor-pointer ".concat(s.Z.tag," me-2"),onClick:function(){return e.onChangeCurriculum(t.id.toString())}},r.createElement("div",{className:"bg-white ".concat(s.Z.cover," rounded-circle")},r.createElement("img",{src:u.j.createUrl(t.cover.url,{size:c.h2.Small}),alt:t.name,className:"rounded-circle"})),t.name)})))):r.createElement("ul",{className:"list-unstyled m-0"},Object.keys(w).map((function(e,t){return r.createElement("li",{key:"linkset-".concat(t),className:s.Z.curriculumSet},r.createElement(E,{linkSet:w[e],trySetMaxCodeWidth:L,codeWidth:f}))}))):r.createElement(o.p,{emptyStateUrl:e.emptyStateUrl})}},38496:(e,t,n)=>{n.d(t,{p:()=>o});var r=n(32735),a=n(23481),l=n(23232),i=n(83345),c="shared.curriculumLinks",u=a.T.encloseNamespace(c);function o(e){return r.createElement(l.u,{className:"pt-3"},r.createElement(l.u.Image,{src:e.emptyStateUrl,altText:u("emptyInfo"),size:"small"}),r.createElement(l.u.Heading,null,r.createElement(i.x,{namespace:c,phrase:"emptyHeading"})),r.createElement(l.u.Info,null,r.createElement(i.x,{namespace:c,phrase:"emptyInfo"})))}},44599:(e,t,n)=>{n.d(t,{Z:()=>l});var r=n(32735);var a=function(){return r.createElement(r.Fragment,null,r.createElement("div",{className:"partial-loading-background rounded-pill py-1 px-2 d-inline-block me-1 mb-2 ".concat("vDcrq")}),r.createElement("div",null,r.createElement("div",{className:"partial-loading-background mb-1 ".concat("GXhoW")}),r.createElement("div",{className:"mb-2 d-flex"},r.createElement("div",{className:"me-1 align-self-start ".concat("goKaS")},r.createElement("div",{className:"partial-loading-background rounded-pill py-1 px-2 d-inline-block w-100 h-100"})),r.createElement("div",{className:"partial-loading-background ".concat("vFew6")}))))};function l(){return r.createElement("div",null,r.createElement("div",{className:"mb-3"},r.createElement(a,null)),r.createElement("div",{className:"mb-3"},r.createElement(a,null)),r.createElement("div",null,r.createElement(a,null)))}},85597:(e,t,n)=>{var r;n.d(t,{k:()=>r}),function(e){e.Subject="CurriculumSubject",e.Audience="CurriculumAudience",e.Area="CurriculumArea",e.Leaf="CurriculumLeaf"}(r||(r={}))},5988:(e,t,n)=>{n.d(t,{j:()=>ee});var r=n(32735),a=n(23481),l=n(28400),i=n(65858),c=n(72553),u=n(42648),o=n(75896),s=n(83345),m=n(69883),d=n(44599),p=2;function f(e){var t;return(null===(t=e.availableCurriculums)||void 0===t?void 0:t.length)<p||!e.selectedCurriculum?r.createElement(r.Fragment,null):r.createElement("select",{className:"mb-3 form-select ".concat(e.className),onChange:function(t){return e.onChangeCurriculum(t.target.value)},value:e.selectedCurriculum.id},e.availableCurriculums.map((function(e){return r.createElement("option",{key:e.id,id:e.id,value:e.id},e.name)})))}var v=n(93439),h=n(22161);function y(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,a,l,i,c=[],u=!0,o=!1;try{if(l=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;u=!1}else for(;!(u=(r=l.call(n)).done)&&(c.push(r.value),c.length!==t);u=!0);}catch(e){o=!0,a=e}finally{try{if(!u&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(o)throw a}}return c}}(e,t)||function(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}}(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 g(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var E="shared.curriculumLinks",b=a.T.encloseNamespace(E);function C(e){var t=e.curriculums,n=t.hasLoaded,a=t.activeCurriculum,l=t.availableCurriculums,i=t.curriculumLinks,c=t.updateCurriculum,p=t.nonEmptyCurriculums,g=y(r.useState(!n),2),C=g[0],k=g[1],S=y(r.useState(),2),A=S[0],I=S[1],N=(0,m.Z)();function L(e){var t,n,r=l.find((function(t){return t.id.toString()===e}));(null==r?void 0:r.id)&&(null===(t=null==A?void 0:A.id)||void 0===t?void 0:t.toString())!==(null===(n=null==r?void 0:r.id)||void 0===n?void 0:n.toString())&&(I(r),k(!0),c(r,null,(function(){I(A),k(!1),N.error(b("updateFailed"))})))}r.useEffect((function(){n&&(A||I(null!=a?a:o.m.first(l)),a&&k(!1))}),[null==a?void 0:a.id,n]);var w="function"==typeof e.onClickClose;return r.createElement("div",{className:"rounded border mb-3 position-relative"},r.createElement(u.$B,{autoHeight:!0,autoHeightMax:e.height},r.createElement("div",{className:"p-3"},r.createElement("h2",{className:"h6 me-2 h-100"},r.createElement(s.x,{namespace:E,phrase:"heading"})),r.createElement(f,{availableCurriculums:l,onChangeCurriculum:L,selectedCurriculum:A,className:h.Z.dropdown}),C?r.createElement(d.Z,null):r.createElement(v.h,{curriculumLinks:i,emptyStateUrl:e.emptyStateUrl,checkAllCurriculums:e.checkAllCurriculums,onChangeCurriculum:L,hasNonEmptyCurriculums:!!p.length}))),w&&r.createElement("button",{type:"button",className:"btn-close ".concat(h.Z.closeButton),"aria-label":"Close",onClick:e.onClickClose}))}var k=n(19670),S=n(80385),A=n(73804),I=n(92805),N=n(11518),L=n(15446),w=n(47862),x=n(26733),T=n(40178),j=n(71063),U=n(10439),R=n(35429),O=n(4594),P=n(16714),M=n(58704),V=n(22902),_=n(76196),W=n(59598),D=n(31908),G=n(26492),Z=n(91479),F=n(47938),H=n(81024),B=n(78166),z=n(99742),K=n(14070),Y=n(97291),$=n(22490),q=n(99092);function X(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 J="shared.playPage",Q=a.T.encloseNamespace(J);function ee(e){var t,n,a,u,o,m,d,p,f,v,h,y=(0,R.g)(),g=(0,V.T)().hasPermissions,E=D.M.getCanBeConsumed(e.video).canConsume,b=e.imageCdnUrl,ee=D.M.isVideoTypeArchived(e.video),te=g(P.C.StudentExperience),ne=r.useRef(null),re=r.useRef(null);(0,_.P)([ne.current,re.current],e.tableOfContentsId);var ae,le,ie=r.useRef(!1),ce=(0,S.Wp)(e.video,e.glanceTheme)&&e.featureAccess.canViewGlance,ue=(ae=r.useState({view:"loading",referrer:null}),le=2,function(e){if(Array.isArray(e))return e}(ae)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,l,i,c=[],u=!0,o=!1;try{if(l=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;u=!1}else for(;!(u=(r=l.call(n)).done)&&(c.push(r.value),c.length!==t);u=!0);}catch(e){o=!0,a=e}finally{try{if(!u&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(o)throw a}}return c}}(ae,le)||function(e,t){if(e){if("string"==typeof e)return X(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)?X(e,t):void 0}}(ae,le)||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.")}()),oe=ue[0],se=ue[1];r.useEffect((function(){e.glanceLoaded&&se({view:e.glanceTheme?"v@g":"details",referrer:null})}),[e.glanceLoaded,e.glanceTheme]);var me=(0,q.lU)(),de=(0,q.jh)(e.video,te),pe="picture-in-picture"===y.mode||e.featureAccess.canViewPublicLayout,fe=!(!e.featureAccess.canViewCurriculumLinks||!e.curriculums.customerHasCurriculumLinks);return r.createElement(s.D.Provider,{value:J},r.createElement(F.W,{restrictions:e.video._restrictions,yearGroups:e.yearGroups,objectId:e.video.id,objectTypeId:O.E.Video,canManageVideoAccess:e.canManageVideoAccess}),ee&&r.createElement(G.T,{typeId:e.video.typeId,hasStudentExperience:te}),r.createElement("section",{className:"mb-2 ".concat(j.M.GLOBAL_PLAYER_SELECTOR)},E&&r.createElement(U.r,{key:e.video.id,objectId:e.video.id,objectTypeId:e.video.typeId,shareId:e.shareId,context:null===(t=e.params)||void 0===t?void 0:t.context,contextId:null===(n=e.params)||void 0===n?void 0:n.contextId,playNext:null===(a=e.params)||void 0===a?void 0:a.playNext,moviesAndTv:null===(u=e.params)||void 0===u?void 0:u.mtv,startTime:null!==(m=null===(o=e.params)||void 0===o?void 0:o.t)&&void 0!==m?m:null===(d=e.params)||void 0===d?void 0:d.startTime,endTime:null===(p=e.params)||void 0===p?void 0:p.endTime,mode:"default",location:"play-page"}),r.createElement("div",{className:pe?"":"d-none"},r.createElement(H.S,{video:e.video,appLink:{application:Y.O.SIGN_UP,action:K.e.SignUp.SIGN_UP},type:"picture-in-picture"===y.mode?"pip":"public"}))),r.createElement(Z.v,{media:e.video,yearGroups:e.yearGroups,audiences:e.audiences,getSeriesAppLink:function(t){return me.getSeriesAppLink(t,e.params.mtv)},featureAccess:e.featureAccess,shareId:e.shareId}),r.createElement("section",{className:"".concat("v@g"===oe.view?"d-block":"d-none")},r.createElement(k.o,{theme:e.glanceTheme,video:e.video,pointsOfInterest:e.pointsOfInterest,onClickShowDescription:function(){return se({view:"details",referrer:"v@g"})},onClickShowCurriculumLinks:fe&&function(){return se({view:"curriculumLinks",referrer:"v@g"})},setStartTime:function(e){var t;return null===(t=y.playerRef.current)||void 0===t?void 0:t.currentTime(e)},getTagAppLink:me.getTagAppLink,suppressInteractivity:e.featureAccess.canViewPublicLayout})),r.createElement("section",{className:"".concat("details"===oe.view?"d-block":"d-none")},r.createElement(A.X,{video:e.video,currentUser:e.currentUser,onLaunchImmersiveReader:function(){var e,t,n,r;ie.current=!(null===(t=null===(e=null==y?void 0:y.playerRef)||void 0===e?void 0:e.current)||void 0===t?void 0:t.isPaused()),null===(r=null===(n=null==y?void 0:y.playerRef)||void 0===n?void 0:n.current)||void 0===r||r.pause()},onExitImmersiveReader:function(){var e,t;ie.current&&(null===(t=null===(e=null==y?void 0:y.playerRef)||void 0===e?void 0:e.current)||void 0===t||t.play())},hideTags:ce,onClickClose:ce&&function(){return se({view:"v@g",referrer:"details"})},onClickShowCurriculumLinks:fe&&function(){return se({view:"curriculumLinks",referrer:"details"})},getTagAppLink:me.getTagAppLink,suppressInteractivity:e.featureAccess.canViewPublicLayout})),"curriculumLinks"===oe.view&&r.createElement("section",null,r.createElement(C,{height:T.x,curriculums:e.curriculums,onClickClose:function(){return se({view:oe.referrer,referrer:"curriculumLinks"})},emptyStateUrl:z.W.EmptyStates.CURRICULUM_LINKS,checkAllCurriculums:e.checkAllCurriculum})),r.createElement("section",{className:"".concat("loading"===oe.view?"d-block":"d-none")},r.createElement(I.H,null)),D.M.isBroadcast(e.video)&&r.createElement(c.j,{placement:"bottom-end",className:"d-flex justify-content-end mt-n2"}),!!(null==de?void 0:de.length)&&r.createElement("section",{className:"pb-3",id:W.K.Resources,ref:ne},r.createElement(N.kM,{name:Q("resources",{count:de.length}),contents:M.z.PlayPageResources,collection:de,prefetched:!0,childComponent:x.R,extraChildComponentProps:{imageCdnUrl:b,imageErrorFallbackUrl:z.W.Fallbacks.RESOURCE_THUMBNAIL,actionBehaviour:e.featureAccess.canViewResourceItems?"normal":"public",location:"play-page",titlePosition:"above",hideTypeBadge:!0},getChildAppLink:me.getResourceAppLink(null===(f=e.video)||void 0===f?void 0:f.id,e.shareId,e.featureAccess.canViewResourceItems),analyticsOptions:e.featureAccess.canViewResourceItems?{}:{workflowPhase:i.eu.Start,descriptor:i.Yu.SignUp},analyticsData:{widgetId:"resources"}})),e.featureAccess.canViewInteractives&&!!(null===(v=e.interactives)||void 0===v?void 0:v.length)&&r.createElement("section",{className:"pb-3",id:W.K.Interactives,ref:re},r.createElement(N.kM,{name:Q("interactives",{count:e.interactives.length}),contents:M.z.Interactives,collection:e.interactives,prefetched:!0,getChildAppLink:function(e){return{application:Y.O.INTERACTIVES,action:K.e.Interactives.VIEW_INTERACTIVE,args:[e.id,l.m.slugify(e.name)]}},childComponent:w.K,extraChildComponentProps:{video:e.video,questionsAppLink:{application:Y.O.INTERACTIVES,action:K.e.Interactives.PREVIEW_QUESTIONS},imageCdnUrl:e.imageCdnUrl},analyticsData:{widgetId:"interactives"}})),e.featureAccess.canViewClips&&!!(null===(h=e.clips)||void 0===h?void 0:h.length)&&r.createElement("section",{className:"pb-3"},r.createElement(N.kM,{name:Q("clips",{count:e.clips.length}),contents:M.z.Clips,collection:e.clips,prefetched:!0,getChildAppLink:function(e){return{application:Y.O.CLIPS,action:K.e.Clips.PLAY_CLIP,args:[e.id,l.m.slugify(e.name)]}},childComponent:L.C,extraChildComponentProps:{video:e.video,imageCdnUrl:e.imageCdnUrl},analyticsData:{widgetId:"clips"}})),r.createElement("section",null,r.createElement(B.Z,{currentVideo:e.video,yearGroups:e.yearGroups,relatedVideos:e.relatedVideos,currentUser:e.currentUser,setFavourite:e.setFavourite,canFavourite:e.canFavourite,getVideoAppLink:function(t,n){return $.W.getAppLink(t,Object.assign(Object.assign({},n),{context:e.params.context,contextId:e.params.contextId,playNext:e.params.playNext,shareId:e.shareId,moviesAndTv:e.params.mtv}))},audiences:e.audiences,moviesAndTv:e.params.mtv,isPlugin:e.isPlugin})))}},22161:(e,t,n)=>{n.d(t,{Z:()=>r});const r={curriculumSubject:"GvGYH",curriculumSet:"d7RK0",areaLeafSet:"XRTAe",closeButton:"N3l5Q",heading:"hAxR4",leafDescriptionOnly:"h66ke",dropdown:"CsG6G",tag:"rdLqY",cover:"etwaD",active:"aDLMe",selected:"BMrSd"}}}]);
2
- //# sourceMappingURL=9139-456a0f14a5-lite.chunk.js.map
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[9139],{72553:(e,t,n)=>{n.d(t,{j:()=>m});var r=n(32735),a=n(49606),l=n(83345),i=n(49439);const c={copyrightDisclaimer:"z8YoI",overlayContainer:"eJDbJ"};function u(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 o="shared.copyrightDisclaimer",s=150;function m(e){var t,n,m,d=(n=(0,i.L)({}),m=2,function(e){if(Array.isArray(e))return e}(n)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,l,i,c=[],u=!0,o=!1;try{if(l=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;u=!1}else for(;!(u=(r=l.call(n)).done)&&(c.push(r.value),c.length!==t);u=!0);}catch(e){o=!0,a=e}finally{try{if(!u&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(o)throw a}}return c}}(n,m)||function(e,t){if(e){if("string"==typeof e)return u(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)?u(e,t):void 0}}(n,m)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),p=d[0],v=d[1];return r.createElement("div",{ref:p,className:e.className},r.createElement("p",{className:"".concat(c.copyrightDisclaimer," ").concat(null!==(t=e.phraseClassName)&&void 0!==t?t:"mb-1")},r.createElement(l.x,{namespace:o,phrase:"copyrightDisclaimer"})),r.createElement(a.Z,{target:p.current,show:v,placement:e.overflowPlacement&&function(){var e;return document.documentElement.clientHeight-(null===(e=p.current)||void 0===e?void 0:e.getBoundingClientRect().bottom)<s}()?e.overflowPlacement:e.placement},r.createElement("div",{className:"".concat(c.overlayContainer," mw-100 bg-white border rounded-3 p-2")},r.createElement("p",null,r.createElement(l.x,{namespace:o,phrase:"warning"})),r.createElement("p",{className:"fw-semibold mb-0"},r.createElement(l.x,{namespace:o,phrase:"sharing"})))))}},93439:(e,t,n)=>{n.d(t,{h:()=>b});var r=n(32735),a=n(44599),l=n(83345),i=n(85597),c=n(54610),u=n(67453),o=n(38496),s=n(22161);function m(e){return m="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},m(e)}function d(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=m(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,"string");if("object"!=m(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==m(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function p(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,a,l,i,c=[],u=!0,o=!1;try{if(l=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;u=!1}else for(;!(u=(r=l.call(n)).done)&&(c.push(r.value),c.length!==t);u=!0);}catch(e){o=!0,a=e}finally{try{if(!u&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(o)throw a}}return c}}(e,t)||function(e,t){if(e){if("string"==typeof e)return v(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)?v(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 v(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 f=/(.*)\s\((.*)?\)/i,h="shared.curriculumLinks",y="text-nowrap font-size-normal rounded-pill py-1 px-2 my-0 d-inline-block";function g(e){function t(){var t=y+" bg-white border";return!e.leaf.name&&e.uiContainsCodes?t+" border-secondary text-secondary":t+" border-dark"}var n=r.useRef();return r.useEffect((function(){if(n.current){var t=n.current.getBoundingClientRect().width;e.trySetMaxCodeWidth(t)}}),[n.current]),r.createElement("div",{className:"d-flex"},e.leaf.description?!e.leaf.name&&e.uiContainsCodes?r.createElement(r.Fragment,null,r.createElement("div",{className:"me-1 align-self-start",style:{minWidth:e.codeWidth?"".concat(e.codeWidth,"px"):"auto"}},r.createElement("h5",{ref:n,className:t()},r.createElement(l.x,{namespace:h,phrase:"noCode"}))),r.createElement("p",{className:"m-0 align-self-center",dangerouslySetInnerHTML:{__html:e.leaf.description}})):e.leaf.name||e.uiContainsCodes?r.createElement(r.Fragment,null,r.createElement("div",{className:"me-1 align-self-start",style:{minWidth:e.codeWidth?"".concat(e.codeWidth,"px"):"auto"}},r.createElement("h5",{ref:n,className:t()},e.leaf.name)),r.createElement("p",{className:"m-0 align-self-center",dangerouslySetInnerHTML:{__html:e.leaf.description}})):r.createElement("p",{className:"m-0",dangerouslySetInnerHTML:{__html:e.leaf.description}}):r.createElement("p",{className:"m-0",dangerouslySetInnerHTML:{__html:e.leaf.name}}))}function E(e){var t,n,a,l={},c=!1;function u(e){var t="mb-2";return e.name||c?t:t+" ms-4 "+s.Z.leafDescriptionOnly}return e.linkSet.areasAndLeaves.forEach((function(e){var t=e[i.k.Area].map((function(e){return e.name})).join(" - ");l[t]?e[i.k.Leaf].forEach((function(e){l[t].find((function(t){return t.name===e.name}))||(l[t].push(e),e.name&&(c=!0))})):l[t]=e[i.k.Leaf]})),r.createElement(r.Fragment,null,r.createElement("h3",{className:"".concat(y," text-white bg-dark-blue fw-normal me-1 mb-2")},(t=e.linkSet[i.k.Audience].name,n=e.linkSet[i.k.Subject].name,(a=t.match(f))?"".concat(a[1]," • ").concat(a[2]," • ").concat(n):"".concat(t," • ").concat(n))),r.createElement("div",{className:"me-2 ".concat(s.Z.curriculumSubject)},Object.keys(l).map((function(t,n){return r.createElement("div",{key:n,className:s.Z.areaLeafSet},t&&r.createElement("h4",{className:"mb-1 font-size-normal"},t),r.createElement("ul",{className:"list-unstyled"},l[t].map((function(t){return r.createElement("li",{key:t.id,className:u(t)},r.createElement(g,{leaf:t,codeWidth:e.codeWidth,trySetMaxCodeWidth:e.trySetMaxCodeWidth,uiContainsCodes:c}))}))))}))))}function b(e){var t,n,m=p(r.useState(0),2),v=m[0],f=m[1],y=p(r.useState(!1),2),g=y[0],b=y[1],C=p(r.useState(!1),2),k=C[0],S=C[1],A=p(r.useState([]),2),I=A[0],N=A[1];function L(e){f((function(t){return t>=e?t:e}))}r.useEffect((function(){var t,n;e.checkAllCurriculums&&e.curriculumLinks&&!(null===(t=e.curriculumLinks)||void 0===t?void 0:t.length)&&(S(!0),e.checkAllCurriculums().then((function(e){e.length&&b(!0),N(e)})).finally((function(){return S(!1)}))),(null===(n=e.curriculumLinks)||void 0===n?void 0:n.length)&&g&&b(!1)}),[null===(t=e.curriculumLinks)||void 0===t?void 0:t.length]);var w=r.useMemo((function(){var t,n={};return null===(t=e.curriculumLinks)||void 0===t||t.forEach((function(e){var t=null,r=null,a=[],l=[];e.forEach((function(e){switch(e.type){case i.k.Subject:t=e;break;case i.k.Audience:r=e;break;case i.k.Area:a.push(e);break;case i.k.Leaf:l.push(e)}}));var c="".concat(t.id,":").concat(r.id);n[c]?n[c].areasAndLeaves.push(d(d({},i.k.Area,a),i.k.Leaf,l)):n[c]=d(d(d({},i.k.Subject,t),i.k.Audience,r),"areasAndLeaves",[d(d({},i.k.Area,a),i.k.Leaf,l)])})),n}),[e.curriculumLinks]);return k?r.createElement(a.Z,null):(null===(n=e.curriculumLinks)||void 0===n?void 0:n.length)||e.hasNonEmptyCurriculums||!e.emptyStateUrl||g||k?g?r.createElement("div",null,r.createElement("div",{className:"mb-3"},r.createElement(l.x,{namespace:h,phrase:"currentEmpty"})),r.createElement("div",{className:"mb-3"},r.createElement(l.x,{namespace:h,phrase:"currentEmptyInfo"})),r.createElement("ul",{className:"list-unstyled mb-0"},I.map((function(t){return r.createElement("li",{key:t.id,className:"p-1 pe-2 rounded-pill d-inline-flex align-items-center cursor-pointer ".concat(s.Z.tag," me-2"),onClick:function(){return e.onChangeCurriculum(t.id.toString())}},r.createElement("div",{className:"bg-white ".concat(s.Z.cover," rounded-circle")},r.createElement("img",{src:u.j.createUrl(t.cover.url,{size:c.h2.Small}),alt:t.name,className:"rounded-circle"})),t.name)})))):r.createElement("ul",{className:"list-unstyled m-0"},Object.keys(w).map((function(e,t){return r.createElement("li",{key:"linkset-".concat(t),className:s.Z.curriculumSet},r.createElement(E,{linkSet:w[e],trySetMaxCodeWidth:L,codeWidth:v}))}))):r.createElement(o.p,{emptyStateUrl:e.emptyStateUrl})}},38496:(e,t,n)=>{n.d(t,{p:()=>o});var r=n(32735),a=n(23481),l=n(23232),i=n(83345),c="shared.curriculumLinks",u=a.T.encloseNamespace(c);function o(e){return r.createElement(l.u,{className:"pt-3"},r.createElement(l.u.Image,{src:e.emptyStateUrl,altText:u("emptyInfo"),size:"small"}),r.createElement(l.u.Heading,null,r.createElement(i.x,{namespace:c,phrase:"emptyHeading"})),r.createElement(l.u.Info,null,r.createElement(i.x,{namespace:c,phrase:"emptyInfo"})))}},44599:(e,t,n)=>{n.d(t,{Z:()=>l});var r=n(32735);var a=function(){return r.createElement(r.Fragment,null,r.createElement("div",{className:"partial-loading-background rounded-pill py-1 px-2 d-inline-block me-1 mb-2 ".concat("vDcrq")}),r.createElement("div",null,r.createElement("div",{className:"partial-loading-background mb-1 ".concat("GXhoW")}),r.createElement("div",{className:"mb-2 d-flex"},r.createElement("div",{className:"me-1 align-self-start ".concat("goKaS")},r.createElement("div",{className:"partial-loading-background rounded-pill py-1 px-2 d-inline-block w-100 h-100"})),r.createElement("div",{className:"partial-loading-background ".concat("vFew6")}))))};function l(){return r.createElement("div",null,r.createElement("div",{className:"mb-3"},r.createElement(a,null)),r.createElement("div",{className:"mb-3"},r.createElement(a,null)),r.createElement("div",null,r.createElement(a,null)))}},85597:(e,t,n)=>{var r;n.d(t,{k:()=>r}),function(e){e.Subject="CurriculumSubject",e.Audience="CurriculumAudience",e.Area="CurriculumArea",e.Leaf="CurriculumLeaf"}(r||(r={}))},5988:(e,t,n)=>{n.d(t,{j:()=>ee});var r=n(32735),a=n(23481),l=n(28400),i=n(65858),c=n(72553),u=n(42648),o=n(75896),s=n(83345),m=n(69883),d=n(44599),p=2;function v(e){var t;return(null===(t=e.availableCurriculums)||void 0===t?void 0:t.length)<p||!e.selectedCurriculum?r.createElement(r.Fragment,null):r.createElement("select",{className:"mb-3 form-select ".concat(e.className),onChange:function(t){return e.onChangeCurriculum(t.target.value)},value:e.selectedCurriculum.id},e.availableCurriculums.map((function(e){return r.createElement("option",{key:e.id,id:e.id,value:e.id},e.name)})))}var f=n(93439),h=n(22161);function y(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,a,l,i,c=[],u=!0,o=!1;try{if(l=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;u=!1}else for(;!(u=(r=l.call(n)).done)&&(c.push(r.value),c.length!==t);u=!0);}catch(e){o=!0,a=e}finally{try{if(!u&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(o)throw a}}return c}}(e,t)||function(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}}(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 g(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var E="shared.curriculumLinks",b=a.T.encloseNamespace(E);function C(e){var t=e.curriculums,n=t.hasLoaded,a=t.activeCurriculum,l=t.availableCurriculums,i=t.curriculumLinks,c=t.updateCurriculum,p=t.nonEmptyCurriculums,g=y(r.useState(!n),2),C=g[0],k=g[1],S=y(r.useState(),2),A=S[0],I=S[1],N=(0,m.Z)();function L(e){var t,n,r=l.find((function(t){return t.id.toString()===e}));(null==r?void 0:r.id)&&(null===(t=null==A?void 0:A.id)||void 0===t?void 0:t.toString())!==(null===(n=null==r?void 0:r.id)||void 0===n?void 0:n.toString())&&(I(r),k(!0),c(r,null,(function(){I(A),k(!1),N.error(b("updateFailed"))})))}r.useEffect((function(){n&&(A||I(null!=a?a:o.m.first(l)),a&&k(!1))}),[null==a?void 0:a.id,n]);var w="function"==typeof e.onClickClose;return r.createElement("div",{className:"rounded border mb-3 position-relative"},r.createElement(u.$B,{autoHeight:!0,autoHeightMax:e.height},r.createElement("div",{className:"p-3"},r.createElement("h2",{className:"h6 me-2 h-100"},r.createElement(s.x,{namespace:E,phrase:"heading"})),r.createElement(v,{availableCurriculums:l,onChangeCurriculum:L,selectedCurriculum:A,className:h.Z.dropdown}),C?r.createElement(d.Z,null):r.createElement(f.h,{curriculumLinks:i,emptyStateUrl:e.emptyStateUrl,checkAllCurriculums:e.checkAllCurriculums,onChangeCurriculum:L,hasNonEmptyCurriculums:!!p.length}))),w&&r.createElement("button",{type:"button",className:"btn-close ".concat(h.Z.closeButton),"aria-label":"Close",onClick:e.onClickClose}))}var k=n(19670),S=n(80385),A=n(73804),I=n(92805),N=n(11518),L=n(15446),w=n(47862),x=n(26733),T=n(40178),j=n(71063),U=n(10439),R=n(35429),O=n(4594),P=n(16714),M=n(58704),V=n(22902),_=n(76196),W=n(59598),D=n(31908),G=n(26492),Z=n(91479),F=n(47938),H=n(81024),B=n(78166),z=n(99742),K=n(14070),Y=n(97291),$=n(22490),q=n(99092);function X(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 J="shared.playPage",Q=a.T.encloseNamespace(J);function ee(e){var t,n,a,u,o,m,d,p,v,f,h,y=(0,R.g)(),g=(0,V.T)().hasPermissions,E=D.M.getCanBeConsumed(e.video).canConsume,b=e.imageCdnUrl,ee=D.M.isVideoTypeArchived(e.video),te=g(P.C.StudentExperience),ne=r.useRef(null),re=r.useRef(null);(0,_.P)([ne.current,re.current],e.tableOfContentsId);var ae,le,ie=r.useRef(!1),ce=(0,S.Wp)(e.video,e.glanceTheme)&&e.featureAccess.canViewGlance,ue=(ae=r.useState({view:"loading",referrer:null}),le=2,function(e){if(Array.isArray(e))return e}(ae)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,l,i,c=[],u=!0,o=!1;try{if(l=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;u=!1}else for(;!(u=(r=l.call(n)).done)&&(c.push(r.value),c.length!==t);u=!0);}catch(e){o=!0,a=e}finally{try{if(!u&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(o)throw a}}return c}}(ae,le)||function(e,t){if(e){if("string"==typeof e)return X(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)?X(e,t):void 0}}(ae,le)||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.")}()),oe=ue[0],se=ue[1];r.useEffect((function(){e.glanceLoaded&&se({view:e.glanceTheme?"v@g":"details",referrer:null})}),[e.glanceLoaded,e.glanceTheme]);var me=(0,q.lU)(),de=(0,q.jh)(e.video,te),pe="picture-in-picture"===y.mode||e.featureAccess.canViewPublicLayout,ve=!(!e.featureAccess.canViewCurriculumLinks||!e.curriculums.customerHasCurriculumLinks);return r.createElement(s.D.Provider,{value:J},r.createElement(F.W,{restrictions:e.video._restrictions,yearGroups:e.yearGroups,objectId:e.video.id,objectTypeId:O.E.Video,canManageVideoAccess:e.canManageVideoAccess}),ee&&r.createElement(G.T,{typeId:e.video.typeId,hasStudentExperience:te}),r.createElement("section",{className:"mb-2 ".concat(j.M.GLOBAL_PLAYER_SELECTOR)},E&&r.createElement(U.r,{key:e.video.id,objectId:e.video.id,objectTypeId:e.video.typeId,shareId:e.shareId,context:null===(t=e.params)||void 0===t?void 0:t.context,contextId:null===(n=e.params)||void 0===n?void 0:n.contextId,playNext:null===(a=e.params)||void 0===a?void 0:a.playNext,moviesAndTv:null===(u=e.params)||void 0===u?void 0:u.mtv,startTime:null!==(m=null===(o=e.params)||void 0===o?void 0:o.t)&&void 0!==m?m:null===(d=e.params)||void 0===d?void 0:d.startTime,endTime:null===(p=e.params)||void 0===p?void 0:p.endTime,mode:"default",location:"play-page"}),r.createElement("div",{className:pe?"":"d-none"},r.createElement(H.S,{video:e.video,appLink:{application:Y.O.SIGN_UP,action:K.e.SignUp.SIGN_UP},type:"picture-in-picture"===y.mode?"pip":"public"}))),r.createElement(Z.v,{media:e.video,yearGroups:e.yearGroups,audiences:e.audiences,getSeriesAppLink:function(t){return me.getSeriesAppLink(t,e.params.mtv)},featureAccess:e.featureAccess,shareId:e.shareId}),r.createElement("section",{className:"".concat("v@g"===oe.view?"d-block":"d-none")},r.createElement(k.o,{theme:e.glanceTheme,video:e.video,pointsOfInterest:e.pointsOfInterest,onClickShowDescription:function(){return se({view:"details",referrer:"v@g"})},onClickShowCurriculumLinks:ve&&function(){return se({view:"curriculumLinks",referrer:"v@g"})},setStartTime:function(e){var t;return null===(t=y.playerRef.current)||void 0===t?void 0:t.currentTime(e)},getTagAppLink:me.getTagAppLink,suppressInteractivity:e.featureAccess.canViewPublicLayout})),r.createElement("section",{className:"".concat("details"===oe.view?"d-block":"d-none")},r.createElement(A.X,{video:e.video,currentUser:e.currentUser,onLaunchImmersiveReader:function(){var e,t,n,r;ie.current=!(null===(t=null===(e=null==y?void 0:y.playerRef)||void 0===e?void 0:e.current)||void 0===t?void 0:t.isPaused()),null===(r=null===(n=null==y?void 0:y.playerRef)||void 0===n?void 0:n.current)||void 0===r||r.pause()},onExitImmersiveReader:function(){var e,t;ie.current&&(null===(t=null===(e=null==y?void 0:y.playerRef)||void 0===e?void 0:e.current)||void 0===t||t.play())},hideTags:ce,onClickClose:ce&&function(){return se({view:"v@g",referrer:"details"})},onClickShowCurriculumLinks:ve&&function(){return se({view:"curriculumLinks",referrer:"details"})},getTagAppLink:me.getTagAppLink,suppressInteractivity:e.featureAccess.canViewPublicLayout})),"curriculumLinks"===oe.view&&r.createElement("section",null,r.createElement(C,{height:T.x,curriculums:e.curriculums,onClickClose:function(){return se({view:oe.referrer,referrer:"curriculumLinks"})},emptyStateUrl:z.W.EmptyStates.CURRICULUM_LINKS,checkAllCurriculums:e.checkAllCurriculum})),r.createElement("section",{className:"".concat("loading"===oe.view?"d-block":"d-none")},r.createElement(I.H,null)),D.M.isBroadcast(e.video)&&r.createElement(c.j,{placement:"bottom-end",className:"d-flex justify-content-end mt-n2"}),!!(null==de?void 0:de.length)&&r.createElement("section",{className:"pb-3",id:W.K.Resources,ref:ne},r.createElement(N.kM,{name:Q("resources",{count:de.length}),contents:M.z.PlayPageResources,collection:de,prefetched:!0,childComponent:x.R,extraChildComponentProps:{imageCdnUrl:b,imageErrorFallbackUrl:z.W.Fallbacks.RESOURCE_THUMBNAIL,actionBehaviour:e.featureAccess.canViewResourceItems?"normal":"public",location:"play-page",titlePosition:"above",hideTypeBadge:!0},getChildAppLink:me.getResourceAppLink(null===(v=e.video)||void 0===v?void 0:v.id,e.shareId,e.featureAccess.canViewResourceItems),analyticsOptions:e.featureAccess.canViewResourceItems?{}:{workflowPhase:i.eu.Start,descriptor:i.Yu.SignUp},analyticsData:{widgetId:"resources"}})),e.featureAccess.canViewInteractives&&!!(null===(f=e.interactives)||void 0===f?void 0:f.length)&&r.createElement("section",{className:"pb-3",id:W.K.Interactives,ref:re},r.createElement(N.kM,{name:Q("interactives",{count:e.interactives.length}),contents:M.z.Interactives,collection:e.interactives,prefetched:!0,getChildAppLink:function(e){return{application:Y.O.INTERACTIVES,action:K.e.Interactives.VIEW_INTERACTIVE,args:[e.id,l.m.slugify(e.name)]}},childComponent:w.K,extraChildComponentProps:{video:e.video,questionsAppLink:{application:Y.O.INTERACTIVES,action:K.e.Interactives.PREVIEW_QUESTIONS},imageCdnUrl:e.imageCdnUrl},analyticsData:{widgetId:"interactives"}})),e.featureAccess.canViewClips&&!!(null===(h=e.clips)||void 0===h?void 0:h.length)&&r.createElement("section",{className:"pb-3"},r.createElement(N.kM,{name:Q("clips",{count:e.clips.length}),contents:M.z.Clips,collection:e.clips,prefetched:!0,getChildAppLink:function(e){return{application:Y.O.CLIPS,action:K.e.Clips.PLAY_CLIP,args:[e.id,l.m.slugify(e.name)]}},childComponent:L.C,extraChildComponentProps:{video:e.video,imageCdnUrl:e.imageCdnUrl},analyticsData:{widgetId:"clips"}})),r.createElement("section",null,r.createElement(B.Z,{currentVideo:e.video,yearGroups:e.yearGroups,relatedVideos:e.relatedVideos,currentUser:e.currentUser,setFavourite:e.setFavourite,canFavourite:e.canFavourite,getVideoAppLink:function(t,n){var r;return $.W.getAppLink(t,Object.assign(Object.assign({},n),{context:e.params.context,contextId:e.params.contextId,playNext:e.params.playNext,shareId:e.shareId,moviesAndTv:e.params.mtv,includeContext:null===(r=e.currentUser)||void 0===r?void 0:r.isAuthenticated}))},audiences:e.audiences,moviesAndTv:e.params.mtv,isPlugin:e.isPlugin})))}},22161:(e,t,n)=>{n.d(t,{Z:()=>r});const r={curriculumSubject:"GvGYH",curriculumSet:"d7RK0",areaLeafSet:"XRTAe",closeButton:"N3l5Q",heading:"hAxR4",leafDescriptionOnly:"h66ke",dropdown:"CsG6G",tag:"rdLqY",cover:"etwaD",active:"aDLMe",selected:"BMrSd"}}}]);
2
+ //# sourceMappingURL=9139-e8c1a686af-lite.chunk.js.map