@clickview/lite 0.64.0-rc.0 → 0.64.0-rc.2

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 (147) hide show
  1. package/dist/bundles.json +1 -1
  2. package/dist/css/{7153-lite-0cc5db0db7.chunk.css → 2962-lite-2002c62a24.chunk.css} +0 -1
  3. package/dist/css/{1857-lite-324255d395.chunk.css → 6173-lite-911f35513f.chunk.css} +0 -1
  4. package/dist/css/{2083-lite-6cb1775e12.chunk.css → 7324-lite-238bd550b7.chunk.css} +0 -1
  5. package/dist/css/{9013-lite-620f218839.chunk.css → 9013-lite-3c31b606c5.chunk.css} +2 -2
  6. package/dist/languages/en.json +1 -1
  7. package/dist/scripts/1216-899540dc73-lite.chunk.js +2 -0
  8. package/dist/scripts/1216-899540dc73-lite.chunk.js.map +1 -0
  9. package/dist/scripts/1820-b572681b3a-lite.chunk.js +2 -0
  10. package/dist/scripts/1820-b572681b3a-lite.chunk.js.map +1 -0
  11. package/dist/scripts/{2056-84f388df20-lite.chunk.js → 2056-a9e8d17a46-lite.chunk.js} +3 -3
  12. package/dist/scripts/2056-a9e8d17a46-lite.chunk.js.map +1 -0
  13. package/dist/scripts/229-ac9f12e165-lite.chunk.js +2 -0
  14. package/dist/scripts/229-ac9f12e165-lite.chunk.js.map +1 -0
  15. package/dist/scripts/{2564-65e3fc9619-lite.chunk.js → 2564-f5628d4e56-lite.chunk.js} +3 -3
  16. package/dist/scripts/{2564-65e3fc9619-lite.chunk.js.map → 2564-f5628d4e56-lite.chunk.js.map} +1 -1
  17. package/dist/scripts/2712-a851ddc3c3-lite.chunk.js +2 -0
  18. package/dist/scripts/2712-a851ddc3c3-lite.chunk.js.map +1 -0
  19. package/dist/scripts/{2788-eca70707c6-lite.chunk.js → 2788-c8ae3be73f-lite.chunk.js} +1 -1
  20. package/dist/scripts/2788-c8ae3be73f-lite.chunk.js.map +1 -0
  21. package/dist/scripts/{7153-0ed8513e59-lite.chunk.js → 2962-7f2e4412f0-lite.chunk.js} +2 -2
  22. package/dist/scripts/{7153-0ed8513e59-lite.chunk.js.map → 2962-7f2e4412f0-lite.chunk.js.map} +1 -1
  23. package/dist/scripts/2988-b602b64344-lite.chunk.js +2 -0
  24. package/dist/scripts/2988-b602b64344-lite.chunk.js.map +1 -0
  25. package/dist/scripts/3180-c1f065183d-lite.chunk.js +2 -0
  26. package/dist/scripts/3180-c1f065183d-lite.chunk.js.map +1 -0
  27. package/dist/scripts/3549-111225ff0e-lite.chunk.js +2 -0
  28. package/dist/scripts/3549-111225ff0e-lite.chunk.js.map +1 -0
  29. package/dist/scripts/4591-f78fa6c784-lite.chunk.js +2 -0
  30. package/dist/scripts/4591-f78fa6c784-lite.chunk.js.map +1 -0
  31. package/dist/scripts/4667-5101904582-lite.chunk.js +2 -0
  32. package/dist/scripts/4667-5101904582-lite.chunk.js.map +1 -0
  33. package/dist/scripts/{5056-6057435479-lite.chunk.js → 5056-65c739468f-lite.chunk.js} +1 -1
  34. package/dist/scripts/5056-65c739468f-lite.chunk.js.map +1 -0
  35. package/dist/scripts/5157-e38b666fce-lite.chunk.js +2 -0
  36. package/dist/scripts/5157-e38b666fce-lite.chunk.js.map +1 -0
  37. package/dist/scripts/5201-98ee21febb-lite.chunk.js +2 -0
  38. package/dist/scripts/5201-98ee21febb-lite.chunk.js.map +1 -0
  39. package/dist/scripts/5595-79068997ce-lite.chunk.js +2 -0
  40. package/dist/scripts/5595-79068997ce-lite.chunk.js.map +1 -0
  41. package/dist/scripts/5770-f88f6d9c00-lite.chunk.js +2 -0
  42. package/dist/scripts/5770-f88f6d9c00-lite.chunk.js.map +1 -0
  43. package/dist/scripts/5896-60133bfdad-lite.chunk.js +3 -0
  44. package/dist/scripts/5896-60133bfdad-lite.chunk.js.map +1 -0
  45. package/dist/scripts/6173-7f9939c29e-lite.chunk.js +3 -0
  46. package/dist/scripts/6173-7f9939c29e-lite.chunk.js.map +1 -0
  47. package/dist/scripts/6181-9d7668c9e4-lite.chunk.js +3 -0
  48. package/dist/scripts/6181-9d7668c9e4-lite.chunk.js.map +1 -0
  49. package/dist/scripts/6455-37039eb687-lite.chunk.js +2 -0
  50. package/dist/scripts/6455-37039eb687-lite.chunk.js.map +1 -0
  51. package/dist/scripts/6623-84b33c6856-lite.chunk.js +3 -0
  52. package/dist/scripts/6623-84b33c6856-lite.chunk.js.map +1 -0
  53. package/dist/scripts/6919-0f2cef64e5-lite.chunk.js +2 -0
  54. package/dist/scripts/6919-0f2cef64e5-lite.chunk.js.map +1 -0
  55. package/dist/scripts/7267-1f5006c9c5-lite.chunk.js +2 -0
  56. package/dist/scripts/7267-1f5006c9c5-lite.chunk.js.map +1 -0
  57. package/dist/scripts/{2083-7daacf0112-lite.chunk.js → 7324-ee20e73ac1-lite.chunk.js} +2 -2
  58. package/dist/scripts/{2083-7daacf0112-lite.chunk.js.map → 7324-ee20e73ac1-lite.chunk.js.map} +1 -1
  59. package/dist/scripts/7434-fef3ea4e89-lite.chunk.js +2 -0
  60. package/dist/scripts/7434-fef3ea4e89-lite.chunk.js.map +1 -0
  61. package/dist/scripts/7443-4866d0c9ab-lite.chunk.js +3 -0
  62. package/dist/scripts/7443-4866d0c9ab-lite.chunk.js.map +1 -0
  63. package/dist/scripts/8416-7d71a55a14-lite.chunk.js +2 -0
  64. package/dist/scripts/8416-7d71a55a14-lite.chunk.js.map +1 -0
  65. package/dist/scripts/8465-01b0f72699-lite.chunk.js +2 -0
  66. package/dist/scripts/8465-01b0f72699-lite.chunk.js.map +1 -0
  67. package/dist/scripts/8722-a9eac1941c-lite.chunk.js +2 -0
  68. package/dist/scripts/8722-a9eac1941c-lite.chunk.js.map +1 -0
  69. package/dist/scripts/9013-6fcc58f028-lite.chunk.js +2 -0
  70. package/dist/scripts/9013-6fcc58f028-lite.chunk.js.map +1 -0
  71. package/dist/scripts/9264-998d93d1c2-lite.chunk.js +2 -0
  72. package/dist/scripts/9264-998d93d1c2-lite.chunk.js.map +1 -0
  73. package/dist/scripts/9894-0fba5cf702-lite.chunk.js +3 -0
  74. package/dist/scripts/9894-0fba5cf702-lite.chunk.js.map +1 -0
  75. package/dist/scripts/bundle-2e839958ca.min.js +3 -0
  76. package/dist/scripts/bundle-2e839958ca.min.js.map +1 -0
  77. package/package.json +1 -1
  78. package/dist/scripts/1755-462bcd99e9-lite.chunk.js +0 -2
  79. package/dist/scripts/1755-462bcd99e9-lite.chunk.js.map +0 -1
  80. package/dist/scripts/180-6c4779f6ab-lite.chunk.js +0 -2
  81. package/dist/scripts/180-6c4779f6ab-lite.chunk.js.map +0 -1
  82. package/dist/scripts/1820-3b5d0a340d-lite.chunk.js +0 -2
  83. package/dist/scripts/1820-3b5d0a340d-lite.chunk.js.map +0 -1
  84. package/dist/scripts/1857-d3af9d98eb-lite.chunk.js +0 -3
  85. package/dist/scripts/1857-d3af9d98eb-lite.chunk.js.map +0 -1
  86. package/dist/scripts/2056-84f388df20-lite.chunk.js.map +0 -1
  87. package/dist/scripts/229-900e650427-lite.chunk.js +0 -2
  88. package/dist/scripts/229-900e650427-lite.chunk.js.map +0 -1
  89. package/dist/scripts/2788-eca70707c6-lite.chunk.js.map +0 -1
  90. package/dist/scripts/3180-22edf4c9fc-lite.chunk.js +0 -2
  91. package/dist/scripts/3180-22edf4c9fc-lite.chunk.js.map +0 -1
  92. package/dist/scripts/3549-30d3b1cd05-lite.chunk.js +0 -2
  93. package/dist/scripts/3549-30d3b1cd05-lite.chunk.js.map +0 -1
  94. package/dist/scripts/3776-0027340c98-lite.chunk.js +0 -2
  95. package/dist/scripts/3776-0027340c98-lite.chunk.js.map +0 -1
  96. package/dist/scripts/4591-3e8dddd0e9-lite.chunk.js +0 -2
  97. package/dist/scripts/4591-3e8dddd0e9-lite.chunk.js.map +0 -1
  98. package/dist/scripts/4667-f3882f2379-lite.chunk.js +0 -2
  99. package/dist/scripts/4667-f3882f2379-lite.chunk.js.map +0 -1
  100. package/dist/scripts/5056-6057435479-lite.chunk.js.map +0 -1
  101. package/dist/scripts/5157-ad13101a6e-lite.chunk.js +0 -2
  102. package/dist/scripts/5157-ad13101a6e-lite.chunk.js.map +0 -1
  103. package/dist/scripts/5201-7d3867d027-lite.chunk.js +0 -2
  104. package/dist/scripts/5201-7d3867d027-lite.chunk.js.map +0 -1
  105. package/dist/scripts/5595-10e586779d-lite.chunk.js +0 -2
  106. package/dist/scripts/5595-10e586779d-lite.chunk.js.map +0 -1
  107. package/dist/scripts/5896-5d2f32c59e-lite.chunk.js +0 -3
  108. package/dist/scripts/5896-5d2f32c59e-lite.chunk.js.map +0 -1
  109. package/dist/scripts/6181-50a39979ec-lite.chunk.js +0 -3
  110. package/dist/scripts/6181-50a39979ec-lite.chunk.js.map +0 -1
  111. package/dist/scripts/6455-2f45be17cf-lite.chunk.js +0 -2
  112. package/dist/scripts/6455-2f45be17cf-lite.chunk.js.map +0 -1
  113. package/dist/scripts/6623-ebbffb59b3-lite.chunk.js +0 -3
  114. package/dist/scripts/6623-ebbffb59b3-lite.chunk.js.map +0 -1
  115. package/dist/scripts/6919-cb2de57c2e-lite.chunk.js +0 -2
  116. package/dist/scripts/6919-cb2de57c2e-lite.chunk.js.map +0 -1
  117. package/dist/scripts/7267-c2d30dd339-lite.chunk.js +0 -2
  118. package/dist/scripts/7267-c2d30dd339-lite.chunk.js.map +0 -1
  119. package/dist/scripts/7434-c34ca23a21-lite.chunk.js +0 -2
  120. package/dist/scripts/7434-c34ca23a21-lite.chunk.js.map +0 -1
  121. package/dist/scripts/7443-7c72de0cb9-lite.chunk.js +0 -3
  122. package/dist/scripts/7443-7c72de0cb9-lite.chunk.js.map +0 -1
  123. package/dist/scripts/8022-0656cce655-lite.chunk.js +0 -2
  124. package/dist/scripts/8022-0656cce655-lite.chunk.js.map +0 -1
  125. package/dist/scripts/8722-69c1c7a24f-lite.chunk.js +0 -2
  126. package/dist/scripts/8722-69c1c7a24f-lite.chunk.js.map +0 -1
  127. package/dist/scripts/9013-adc5d3517a-lite.chunk.js +0 -2
  128. package/dist/scripts/9013-adc5d3517a-lite.chunk.js.map +0 -1
  129. package/dist/scripts/9155-87c9030ce9-lite.chunk.js +0 -2
  130. package/dist/scripts/9155-87c9030ce9-lite.chunk.js.map +0 -1
  131. package/dist/scripts/9264-750b3d6ea0-lite.chunk.js +0 -2
  132. package/dist/scripts/9264-750b3d6ea0-lite.chunk.js.map +0 -1
  133. package/dist/scripts/9894-bc34edcd67-lite.chunk.js +0 -3
  134. package/dist/scripts/9894-bc34edcd67-lite.chunk.js.map +0 -1
  135. package/dist/scripts/bundle-3d3d127d98.min.js +0 -3
  136. package/dist/scripts/bundle-3d3d127d98.min.js.map +0 -1
  137. package/dist/css/{6455-lite-fe0bc6d95f.chunk.css → 6455-lite-c07987d46c.chunk.css} +1 -1
  138. /package/dist/css/{9155-lite-447d345417.chunk.css → 8465-lite-447d345417.chunk.css} +0 -0
  139. /package/dist/scripts/{1857-d3af9d98eb-lite.chunk.js.LICENSE.txt → 2056-a9e8d17a46-lite.chunk.js.LICENSE.txt} +0 -0
  140. /package/dist/scripts/{2056-84f388df20-lite.chunk.js.LICENSE.txt → 2564-f5628d4e56-lite.chunk.js.LICENSE.txt} +0 -0
  141. /package/dist/scripts/{2564-65e3fc9619-lite.chunk.js.LICENSE.txt → 5896-60133bfdad-lite.chunk.js.LICENSE.txt} +0 -0
  142. /package/dist/scripts/{5896-5d2f32c59e-lite.chunk.js.LICENSE.txt → 6173-7f9939c29e-lite.chunk.js.LICENSE.txt} +0 -0
  143. /package/dist/scripts/{6181-50a39979ec-lite.chunk.js.LICENSE.txt → 6181-9d7668c9e4-lite.chunk.js.LICENSE.txt} +0 -0
  144. /package/dist/scripts/{6623-ebbffb59b3-lite.chunk.js.LICENSE.txt → 6623-84b33c6856-lite.chunk.js.LICENSE.txt} +0 -0
  145. /package/dist/scripts/{7443-7c72de0cb9-lite.chunk.js.LICENSE.txt → 7443-4866d0c9ab-lite.chunk.js.LICENSE.txt} +0 -0
  146. /package/dist/scripts/{9894-bc34edcd67-lite.chunk.js.LICENSE.txt → 9894-0fba5cf702-lite.chunk.js.LICENSE.txt} +0 -0
  147. /package/dist/scripts/{bundle-3d3d127d98.min.js.LICENSE.txt → bundle-2e839958ca.min.js.LICENSE.txt} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/180-6c4779f6ab-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/flight-requests/VideoViewRequests.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/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/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 { PublicInteractiveUser } from 'libs/shared/interfaces/models/interactive-results/PublicInteractiveUser';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\n\nfunction getUniqueNamesConfig(id: string): UniqueNamesConfig {\n /**\n * Generate a seed that is unique to each user but changes every 5 minutes.\n * \n * We use a seed so that if the same user's name is anonymised multiple times\n * in quick succession (e.g. multiple renders), the same name will be returned each time.\n * \n * We change the seed every 5 minutes so that students don't always have the same name.\n */\n const seed = +`${id}${Math.floor((new Date()).getMinutes() / 5)}`;\n\n return {\n dictionaries: [ colors, animals ],\n separator: ' ',\n length: 2,\n style: 'capital',\n seed\n };\n}\n\nexport function anonymiseUserName(user: User | PublicInteractiveUser, shouldAnonymise: boolean): string {\n if (!user)\n return '';\n\n if (!shouldAnonymise)\n return 'profileId' in user ? user.name : UserHelper.getFullName(user);\n\n return uniqueNamesGenerator(getUniqueNamesConfig('profileId' in user ? user.profileId : user.id));\n}\n","import { AudienceQueryParams } from 'libs/shared/apps/analytics/interfaces/AudienceQueryParams';\n\nexport const getAudienceParams = (queryParams: AudienceQueryParams) => {\n const userId: string[] = [];\n const groupId: string[] = [];\n\n if (queryParams.users)\n userId.push(...queryParams.users);\n\n if (queryParams.classrooms)\n groupId.push(...queryParams.classrooms);\n\n if (queryParams.classroomGroups)\n groupId.push(...queryParams.classroomGroups);\n return {\n userId,\n groupId\n };\n};","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { DateRangeQueryParams } from 'libs/shared/apps/analytics/interfaces/DateRangeQueryParams';\nimport { FilterQueryParams } from 'libs/shared/apps/analytics/interfaces/FilterQueryParams';\nimport { DateRange } from 'libs/shared/interfaces';\nimport { AppRouteHelper } from 'libs/shared/utils/AppRouteHelper';\n\nconst namespace = 'shared.analyticsUtils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function convertDateToUtcDateTimeString(date: Date): string {\n const utc = DateHelper.convertDateToUTC(date);\n return DateHelper.format(utc, 'YYYY-MM-DDTHH:mm:ss');\n}\n\nexport function getMinDate(): Date {\n return new Date(2021, 0, 1);\n}\n\nexport function getMaxDate(): Date {\n return new Date();\n}\n\nexport function getDefaultDateRange(dateRangePresets: DateRange[]): DateRange {\n return dateRangePresets.find(range => !!range.default);\n}\n\nexport function getPresetRangeByName(dateRangePresetss: DateRange[], rangeName: string): DateRange | undefined {\n if (!rangeName)\n return;\n\n const presets = dateRangePresetss;\n \n return presets.find(p => p.name === rangeName);\n}\n\nexport function getGenericDateRangePresets(): DateRange[] {\n const minDate = getMinDate();\n const currentYear = (new Date()).getFullYear();\n\n const isMinDateThisYear = currentYear === minDate.getFullYear();\n\n return [\n {\n name: getPhrase('today'),\n startDate: new Date(),\n endDate: new Date()\n },\n {\n name: getPhrase('thisMonth'),\n startDate: new Date(currentYear, new Date().getMonth(), 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastThreeMonths'),\n startDate: new Date(currentYear, new Date().getMonth() - 2, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastSixMonths'),\n startDate: new Date(currentYear, new Date().getMonth() - 5, 1),\n endDate: new Date(),\n 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 size?: ProgressCircleSize;\n}\n\nPercentageIndicator.defaultProps = {\n layout: PercentageIndicatorLayout.CircleOnly\n};\n\nexport function PercentageIndicator(props: PercentageIndicatorProps): JSX.Element {\n const percentageToFixed = getPercentageToFixed(props.percentage);\n\n const size = props.size ||\n (props.layout === PercentageIndicatorLayout.LabelInside\n ? ProgressCircleSize.Large\n : ProgressCircleSize.Small\n );\n\n const label = props.customLabel || getFormattedPercentage(percentageToFixed);\n\n if (props.layout === PercentageIndicatorLayout.LabelOnly)\n return (\n <span className={getColouredLabelClassName(percentageToFixed)}>\n {label}\n </span>\n );\n\n return (\n <div className={`d-flex align-items-center justify-content-between ${props.className ?? ''}`}>\n {props.layout === PercentageIndicatorLayout.LabelBefore &&\n <span className='me-2'>\n {label}\n </span>\n }\n <div className={getCircleContainerClassName(size, percentageToFixed)}>\n <ProgressCircle percentage={percentageToFixed} size={size} scoreThresholds={props.scoreThresholds} />\n {props.layout === PercentageIndicatorLayout.LabelInside &&\n <span className={styles.centredPercentageText}>\n {label}\n </span>\n }\n </div>\n </div>\n );\n}","import { ScoreThresholdDefaults, ScoreThresholds } from 'libs/shared/constants/ScoreThresholds';\n\nimport styles from './percentage-indicator.scss';\n\n/**\n * Values for width and strokeWidth are taken from progress-circle.scss.\n * If either are changed, they must be updated in both places.\n */\nconst CIRCLE_WIDTH = 2; // rem\nconst CIRCLE_WIDTH_LG = 5.8; // rem\nconst CIRCLE_STROKE_WIDTH = 0.2; // rem\nconst CIRCLE_STROKE_WIDTH_LG = 0.36; // rem\n \nexport enum ProgressCircleSize {\n Small = 'small',\n Large = 'large',\n ExtraSmall = 'extraSmall'\n}\n\nconst ProgressCircleSizeMap = {\n [ProgressCircleSize.ExtraSmall]: {\n size: CIRCLE_WIDTH\n },\n [ProgressCircleSize.Small]: {\n size: CIRCLE_WIDTH\n },\n [ProgressCircleSize.Large]: {\n size: CIRCLE_WIDTH_LG\n }\n};\n\n/**\n * radius = width / 2 - strokeWidth * 2\n */\nexport function getCircleRadius(size: ProgressCircleSize): string {\n const width = ProgressCircleSizeMap[size].size;\n const strokeWidth = size === ProgressCircleSize.Large ? CIRCLE_STROKE_WIDTH_LG : CIRCLE_STROKE_WIDTH;\n return `${width / 2 - strokeWidth * 2}rem`;\n}\n \nexport function getCircleClassName(\n percentage: number,\n scoreThresholds: ScoreThresholds = ScoreThresholdDefaults\n): string {\n if (percentage >= scoreThresholds.HIGH)\n return styles.circleSuccess;\n \n if (percentage >= scoreThresholds.MODERATE)\n return styles.circleWarning;\n \n return styles.circleDanger;\n}\n \nexport function getColouredLabelClassName(\n percentage: number,\n scoreThresholds: ScoreThresholds = ScoreThresholdDefaults\n): string {\n if (percentage >= scoreThresholds.HIGH)\n return 'text-success';\n \n if (percentage >= scoreThresholds.MODERATE)\n return 'text-warning';\n \n return 'text-danger';\n}\n \nexport function getCircleContainerClassName(size: ProgressCircleSize, percentage?: number): string {\n let className = `d-inline-block ${styles.circleContainer}`;\n \n if (size === ProgressCircleSize.Large)\n className += ` ${styles.lgCircleContainer}`;\n\n if (size === ProgressCircleSize.ExtraSmall)\n className += ` ${styles.xsCircleContainer}`;\n\n if (isPending(percentage))\n className += ` ${styles.pendingCircle}`;\n \n return className;\n}\n\nexport function getPercentageToFixed(percentage?: number): number | undefined {\n if (isPending(percentage))\n return;\n \n return +percentage.toFixed(2);\n}\n \nexport function getFormattedPercentage(percentage?: number): string {\n if (isPending(percentage))\n return `--%`;\n\n return `${Math.round(percentage * 100)}%`;\n}\n\nexport function isPending(percentage?: number): boolean {\n return typeof percentage !== 'number';\n}","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};","import { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { AnalyticsRequestFilter, Engagement } from 'libs/shared/interfaces';\nimport { getAnalyticsRequestKey } from 'libs/shared/utils/AnalyticsRequestUtils';\n\nexport const VideoViewRequests = {\n individualEngagement(\n objectId: string,\n filter: AnalyticsRequestFilter,\n sharerId?: string,\n includePublicViews?: boolean\n ): Flight.Request {\n const queryParams: HashObject = {\n objectId,\n ...filter\n };\n\n if (sharerId)\n queryParams.sharerId = sharerId;\n\n if (includePublicViews)\n queryParams.includePublicViews = true;\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/analytics/heat-map', queryParams),\n key: getAnalyticsRequestKey(`engagement:${objectId}`, filter, sharerId),\n formatData: (data: any) => {\n return {\n ...data,\n data: data.data?.map((d: any) => ({\n ...d,\n heatMap: d.heatMap ?? []\n }))\n };\n },\n normalize: false\n };\n },\n \n aggregateEngagement(\n objectId: string,\n filter: AnalyticsRequestFilter,\n sharerId?: string,\n includePublicViews?: boolean\n ): Flight.Request {\n const queryParams: HashObject = {\n objectId,\n ...filter\n };\n\n if (sharerId)\n queryParams.sharerId = sharerId;\n \n if (includePublicViews)\n queryParams.includePublicViews = true;\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/analytics/heat-map/aggregations', queryParams),\n key: getAnalyticsRequestKey(`aggregate:engagement:${objectId}`, filter, sharerId),\n formatData: (data: Engagement) => {\n return {\n ...data,\n heatMap: data.heatMap ?? []\n };\n },\n normalize: false\n };\n },\n \n views(\n filter: AnalyticsRequestFilter,\n objectId?: string,\n sharerId?: string,\n includePublicViews?: boolean\n ): Flight.Request {\n const queryParams: HashObject = {\n ...filter,\n timeOffset: DateHelper.getTimezoneOffset()\n };\n\n if (objectId)\n queryParams.objectId = objectId;\n\n if (sharerId)\n queryParams.sharerId = sharerId;\n \n if (includePublicViews)\n queryParams.includePublicViews = true;\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/analytics/video-views', queryParams),\n key: getAnalyticsRequestKey(`video:views:${objectId}`, filter, sharerId),\n normalize: false\n };\n }\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 = 'insights' | 'heatmap' | 'results' | 'questions';\n\nexport function getInsightsVideoTabs(id: string, active: InsightsTabs, params: HashObject) {\n return [\n {\n name: getPhrase('insights'),\n active: active === 'insights',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.VIDEO_OVERVIEW,\n args: [id],\n params\n }\n },\n {\n name: getPhrase('heatmap'),\n active: active === 'heatmap',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.VIDEO_HEATMAP,\n args: [id],\n params\n }\n }\n ];\n}\n\nexport function getInsightsClipTabs(id: string, active: InsightsTabs, params: HashObject) {\n return [\n {\n name: getPhrase('insights'),\n active: active === 'insights',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.CLIP_OVERVIEW,\n args: [id],\n params\n }\n },\n {\n name: getPhrase('heatmap'),\n active: active === 'heatmap',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.CLIP_HEATMAP,\n args: [id],\n params\n }\n }\n ];\n}\n\nexport function getInsightsInteractiveTabs(id: string, active: InsightsTabs, params: HashObject) {\n return [\n {\n name: getPhrase('insights'),\n active: active === 'insights',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_OVERVIEW,\n args: [id],\n params\n }\n },\n {\n name: getPhrase('results'),\n active: active === 'results',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_STUDENTS,\n args: [id],\n params\n }\n },\n {\n name: getPhrase('questions'),\n active: active === 'questions',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_QUESTIONS,\n args: [id],\n params\n }\n },\n {\n name: getPhrase('heatmap'),\n active: active === 'heatmap',\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_HEATMAP,\n args: [id],\n params\n }\n }\n ];\n}","// 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}","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\ninterface DateRangeInputProps {\n value: string;\n hideRange?: boolean;\n toggleDropdown?: () => void\n}\n\nexport function DateRangeInput(props: DateRangeInputProps): JSX.Element {\n return (\n <Dropdown.Toggle as='div' id='date-range-dropdown' className='no-caret'>\n <button\n className='btn btn-outline-dark d-flex align-items-center pe-5'\n onClick={() => {\n props.toggleDropdown();\n }}\n >\n <span>{props.value}</span>\n <div className='position-absolute translate-middle top-50 end-0 me-n1'>\n <SvgContainer\n svgName={cvSvgLibrary.Calendar}\n size={SvgContainerSize.Standard}\n />\n </div>\n </button>\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 dateRange = `${formatDate(inputRange.startDate, showYear)} - ${formatDate(inputRange.endDate, showYear)}`;\n \n if (!inputRange.name)\n return dateRange;\n\n return `${inputRange.name}${!hideRange ? ` (${dateRange})` : ''}`;\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\n// eslint-disable-next-line rulesdir/require-view-title\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 toggleDropdown={() => setDropdownState(dropdownState === 'preset' ? 'none' : 'preset')}\n />\n <Dropdown.Menu className='p-0 text-nowrap' 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\n value={getInputValue(props.dateRangePresets, queryParamDateRange, props.hideRange)}\n hideRange={props.hideRange}\n />\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';\nimport { format as formatDate } from 'timeago.js';\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';\nimport { Flight } from 'libs/common/react/index';\n\nimport { AudienceQueryParams } from 'libs/shared/apps/analytics/interfaces/AudienceQueryParams';\nimport { BaseAnalyticsEventResponse } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { DateRangeQueryParams } from 'libs/shared/apps/analytics/interfaces/DateRangeQueryParams';\nimport { getAudienceParams } from 'libs/shared/apps/analytics/utils/AudienceUtils';\nimport { getInsightsDateRangePresets, getStartEndParams } 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 { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { SharePrivacyResponse } from 'libs/shared/apps/share/interfaces/responses/SharePrivacyResponse';\nimport { ShareLinkHelper } from 'libs/shared/apps/share/utils/ShareLinkHelper';\nimport { SharableRecipient, ShareViewHelper } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { ActionsDropdown } from 'libs/shared/components/actions/ActionsDropdown';\nimport { Breadcrumb, Breadcrumbs, PartialBreadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { PillTab, PillTabSelector } from 'libs/shared/components/pill-tab-selector/PillTabSelector';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoViewRequests } from 'libs/shared/flight-requests/VideoViewRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, CurrentUser, DirectShare, ShareLink, VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { getShareAppLink } from 'shared/utils/ObjectAppLinkHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { InsightsAdminAlert } from 'apps/insights/views/insights-admin-alert/InsightsAdminAlert';\nimport { SharedToPill } from 'apps/my-shares/components/shared-to-pill/SharedToPill';\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\n// eslint-disable-next-line rulesdir/require-view-title\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 { hasClassrooms } = useSettings(null);\n const { hasPermissions } = usePermissions();\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const requestFilter = {\n ...getStartEndParams(getInsightsDateRangePresets(), props.dateRangeAppLinkParams),\n ...getAudienceParams(props.audienceAppLinkParams)\n };\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const shareLink = Flight.useBasicFetch<ShareLink>(props.video &&\n ShareRequests.getShareLinkByObjectId(props.video.id));\n const sentDirectShare = Flight.useBasicFetch<DirectShare>(props.video &&\n ShareRequests.getSentDirectShareByObjectId(props.video.id));\n const recipients = Flight.useBasicFetch<SharableRecipient[]>(currentUser.data?.customerId &&\n ShareViewHelper.getDirectShareRecipientsRequest(currentUser.data.customerId, sentDirectShare.data));\n const videoViews = Flight.useBasicFetch<BaseAnalyticsEventResponse>(currentUser.data && props.video &&\n VideoViewRequests.views(requestFilter, props.video.id, currentUser.data.id));\n const privacy = Flight.useBasicFetch<SharePrivacyResponse>(props.video && ShareRequests.getPrivacy(props.video.id));\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const notShared =\n (shareLink.hasCompleted && !shareLink.data) &&\n (sentDirectShare.hasCompleted && !sentDirectShare.data);\n\n const hasShareData =\n (shareLink.hasCompleted && shareLink.data) ||\n (sentDirectShare.hasCompleted && sentDirectShare.data) &&\n (!shareLink.data || privacy.data) &&\n (!shareLink.data || yearGroups.data) &&\n recipients.data &&\n videoViews.data;\n\n const shareLinkText = shareLink.data && privacy.data && yearGroups.data &&\n ShareLinkHelper.getIconAndText({\n entity: props.video,\n entityTypeId: props.video.typeId,\n hasStudentExp: false,\n isPasswordProtected: shareLink.data.isPasswordProtected,\n linkExpireDate: shareLink.data.linkExpireDate,\n privacy: privacy.data,\n status: shareLink.data.status,\n yearGroups: yearGroups.data\n });\n\n function getBreadcrumbs(): Breadcrumb[] {\n return [\n {\n name: getPhrase('myShares'),\n appLink: {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.HOME\n }\n },\n {\n name: props.video.name,\n active: true\n }\n ];\n }\n\n function getActions() {\n const actions = [];\n\n if (props.video?.typeId === MasterType.Interactive) {\n actions.push({\n label: getPhrase('generateReport'),\n appLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_GENERATE_REPORT,\n args: [props.video.id]\n }\n });\n }\n\n return actions;\n }\n\n function getVideoEntityPhrase() {\n if (props.video.typeId === MasterType.Interactive) return 'viewInteractive';\n if (props.video.typeId === MasterType.Clip) return 'viewClip';\n\n return 'viewVideo';\n }\n\n return (\n <div>\n <InsightsAdminAlert\n analyticsUrl={config.data?.analyticsWebUrl}\n hasAnalytics={hasPermissions(PermissionName.ViewCustomerAnalytics)}\n />\n\n <section className='mb-4'>\n <div className='mb-3'>\n <div className='d-flex justify-content-between mb-3'>\n <div className='me-2'>\n {props.video && (\n <>\n <h1 className='mb-0 d-inline me-2'>{props.video.name}</h1>\n <Tooltip title={getPhrase(getVideoEntityPhrase())} type='text' spanHack spanHackClassName='d-inline-block align-text-bottom'>\n <IconButton\n svgName={cvSvgLibrary.NewWindow}\n appLink={VideoAppLinkHelper.getAppLink(props.video)}\n svgSize={SvgContainerSize.Large}\n className='d-inline-block'\n customSize\n />\n </Tooltip>\n </>\n )}\n {!props.video && <h1 className='partial-loading-background' style={{ width: '20rem' }}>&nbsp;</h1>}\n </div>\n <div className='d-flex gap-2'>\n <AudienceFilterView hasClassroomsFeature={hasClassrooms} />\n <DateRangeSelectorView\n dateRangeQueryParams={props.dateRangeAppLinkParams}\n dateRangePresets={getInsightsDateRangePresets()}\n hideRange\n />\n <ActionsDropdown\n dropdownToggleClassName='btn btn-outline-dark'\n actions={getActions()}\n />\n </div>\n </div>\n <div className='d-flex justify-content-between mb-3'>\n {props.video\n ? <Breadcrumbs breadcrumbs={getBreadcrumbs()} />\n : <PartialBreadcrumbs />\n }\n <div className='d-flex gap-3'>\n <label htmlFor='anonymiseNames' className='mb-0'><Text namespace={namespace} phrase='anonymiseNames' /></label>\n <ToggleSwitch id='anonymiseNames' on={anonymiseUsers} onClick={() => setAnonymiseUsers(!anonymiseUsers)} />\n </div>\n </div>\n {hasShareData &&\n <div className='d-flex border border-light p-3 rounded-3 align-items-center justify-content-between'>\n <div className='d-flex align-items-center gap-2'>\n <SharedToPill\n shareRecipients={recipients.data}\n imageCdnUrl={config.data.imageCdnUrl}\n hasShareLink={!!shareLink.data}\n maxAvatars={4}\n shareLinkText={shareLinkText?.text}\n />\n ·\n <p className='mb-0'>{formatDate(sentDirectShare.data?.dateCreated)}</p>\n ·\n <p className='mb-0'><Text namespace={namespace} phrase='views' options={{ count: videoViews.data?.data.length }} /></p>\n </div>\n\n <IconButton\n appLink={getShareAppLink(props.video)}\n svgName={cvSvgLibrary.Share}\n className='btn btn-outline-dark'\n >\n <Text namespace={namespace} phrase='share' />\n </IconButton>\n </div>\n }\n\n {!notShared && !hasShareData &&\n <div className='p-3 rounded partial-loading-background'>\n <p className='mb-1'>&nbsp;</p>\n </div>\n }\n </div>\n <div className='d-flex align-items-center mb-4'>\n <PillTabSelector tabs={props.tabs} />\n </div>\n </section>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"circleContainer\":\"p8Vgz\",\"backgroundCircle\":\"asGGE\",\"circleSuccess\":\"PXLNj\",\"circleWarning\":\"ZckRN\",\"circleDanger\":\"slBRg\",\"lgCircleContainer\":\"N8KCI\",\"xsCircleContainer\":\"RPqZ2\",\"pendingCircle\":\"DKrcq\",\"centredPercentageText\":\"tpmLR\"};","// extracted by mini-css-extract-plugin\nexport default {\"pillTabSelector\":\"Hdi6o\",\"tab\":\"RvNxr\",\"minWidth\":\"GHSz9\",\"radiusSmall\":\"VhJJa\",\"tabLink\":\"WFyvo\"};"],"names":["anonymiseUserName","user","shouldAnonymise","id","profileId","seed","Math","floor","Date","getMinutes","dictionaries","separator","length","style","name","getAudienceParams","queryParams","userId","groupId","users","push","classrooms","classroomGroups","getPhrase","convertDateToUtcDateTimeString","date","utc","getMinDate","getMaxDate","getDefaultDateRange","dateRangePresets","find","range","getPresetRangeByName","dateRangePresetss","rangeName","p","getInsightsDateRangePresets","minDate","currentYear","getFullYear","isMinDateThisYear","startDate","endDate","getMonth","disabled","tooltip","default","formatDateQueryParam","getRouteQueryParams","dateRange","from","to","useGetDateRangeFromQueryParams","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_STROKE_WIDTH","CIRCLE_STROKE_WIDTH_LG","ProgressCircleSizeMap","ExtraSmall","Small","Large","getCircleRadius","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","VideoViewRequests","individualEngagement","objectId","filter","sharerId","includePublicViews","url","formatData","d","heatMap","normalize","aggregateEngagement","views","timeOffset","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","toggleDropdown","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","hideRange","inputRange","DateRangeSelectorView","queryParamDateRange","customDateRange","setCustomDateRange","dropdownState","setDropdownState","applyDateRange","AppRouteHelper","show","onToggle","align","InsightsHeaderView","SharedViewModelKeys","storage","anonymiseUsers","setAnonymiseUsers","hasClassrooms","useSettings","hasPermissions","usePermissions","config","ConfigRequests","requestFilter","dateRangeAppLinkParams","audienceAppLinkParams","currentUser","UserRequests","shareLink","video","ShareRequests","sentDirectShare","recipients","customerId","ShareViewHelper","videoViews","privacy","yearGroups","isAuthenticated","CustomerRequests","notShared","hasCompleted","hasShareData","shareLinkText","ShareLinkHelper","entity","entityTypeId","typeId","hasStudentExp","isPasswordProtected","linkExpireDate","status","InsightsAdminAlert","analyticsUrl","analyticsWebUrl","hasAnalytics","PermissionName","MasterType","IconButton","VideoAppLinkHelper","svgSize","customSize","AudienceFilterView","hasClassroomsFeature","ActionsDropdown","dropdownToggleClassName","actions","getActions","htmlFor","Text","namespace","phrase","ToggleSwitch","on","SharedToPill","shareRecipients","imageCdnUrl","hasShareLink","maxAvatars","text","dateCreated"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[1820],{50690:(e,t,n)=>{n.d(t,{b:()=>a});var r=n(12788),a={renderInPortalIfExists:function(e,t){return t?(0,r.createPortal)(e,t):e}}},84963:(e,t,n)=>{n.d(t,{r:()=>u});var r=n(32735),a=n(23481),i=n(83914),o=n(36532),l=n(35223);const s={tag:"XRj8d",tooltip:"X6mLk"};var c="specialEventCalendar.comingSoonTag";function u(e){return r.createElement(o.u,{title:a.T.getPhrase(c,"tooltip"),spanHackClassName:"d-block ".concat(s.tooltip),spanHack:!0},r.createElement("div",{className:"d-flex text-dark align-items-center ".concat(s.tag," ").concat(e.className)},r.createElement(i.x,{svgName:l.vn.Timer}),!e.onlyIcon&&a.T.getPhrase(c,"comingSoon")))}},73679:(e,t,n)=>{n.d(t,{s:()=>o});var r=n(32735),a=n(36848);const i={dateItem:"I3SBm",label:"PRORs",body:"RfiM_",bodyDay:"ZOVny",bodyRange:"vYhXN",bodyMonth:"mYslO",month:"EPkkQ"};function o(e){var t,n,o;return r.createElement(a.F,{appLink:null===(t=e.getAppLink)||void 0===t?void 0:t.call(e),className:"text-decoration-none text-center bg-white text-dark border border-3 ".concat(null===(n=e.theme)||void 0===n?void 0:n.border," rounded-3 d-block fw-semibold ").concat(e.className),analyticsData:e.analyticsData,analyticsOptions:e.analyticsOptions},r.createElement("div",{className:"position-relative ".concat(i.dateItem)},r.createElement("div",{className:"".concat(null===(o=e.theme)||void 0===o?void 0:o.background," py-1 ").concat(i.label," d-flex align-items-center justify-content-center")},e.label?e.label:r.createElement(r.Fragment,null," ")),r.createElement("div",{className:"".concat(function(){switch(e.body.type){case"range":return i.bodyRange;case"day":return i.bodyDay;case"month":return i.bodyMonth}}()," ").concat(i.body," my-2")},e.body.text),r.createElement("div",{className:"mb-0 ".concat(i.month)},e.month)))}},44522:(e,t,n)=>{n.d(t,{p:()=>A,v:()=>O});var r=n(32735),a=n(110),i=n(50690),o=n(84963),l=n(73679),s=n(83657),c=n(23481),u=n(36848),d=n(83914),m=n(35223),f="shared.backButton";function p(e){var t=Object.assign({textShadow:!0},e),n=t.backToName,a=t.appLink,i=t.color,o=t.extraClasses,l=t.textShadow,s=n?c.T.getPhrase(f,"backTo",{backToName:n}):c.T.getPhrase(f,"back"),p="black"===i?"":"text-white",v=l?"text-shadow":"";return r.createElement(u.F,{appLink:a,className:"d-inline-flex align-items-center h5 mb-0 ".concat(o," ").concat(p," ").concat(v)},r.createElement(d.x,{svgName:m.vn.ChevronLeft,size:d.S.Medium}),r.createElement("span",{className:"ms-1"},s))}p.defaultProps={color:"black",extraClasses:""};var v=n(36518),y=n(83345),h=n(10587),g=n(94232),b=n(54610),E=n(79967),w=n(67453);const C={bannerContent:"sSCTB",actionsContainer:"Z5WI2",bannerContentWithLogo:"rgs7Q",container:"M51HJ",logoContainer:"vkeJk",logoContainerLeft:"M3U9B",logoHeading:"EtRwC",specialEventContainer:"rOxDc",headingLarge:"_8pnV",heading:"JXVBH"};var S="".concat(h.y[b.__.Banners].width,":").concat(h.y[b.__.Banners].height);function I(e){return e.length<160?"h1":C.headingLarge}var A=r.memo((function(e){var t,n,c,u,d=e.heading,m=e.banner,f=e.imageCdnUrl,h=e.actions,A=e.sortComponent,O=e.blockColourClass,k=e.specialEvent,N=r.useContext(g.n),L=(0,E.k)().xxl?1920:1200,x=r.useMemo((function(){if(!k||e.showComingSoon)return!1;var t=a.O.format(new Date,"YYYY-MM-DD");return k.endDate?k.startDate<=t&&k.endDate>=t:k.startDate===t}),[k]),P=e.imageOptions||{width:L,ratio:S,resizeType:b.Nq.Cover},j=!!m&&!!f&&w.j.createBannerUrl(m,{fallbackBaseUrl:f,fallbackCategoryName:d,type:b.__.Banners},P),F={className:"banner banner-header ".concat(e.bannerClassName),style:j?{backgroundImage:"url('".concat(j,"')")}:{}};!m&&O&&(delete F.style,F.className+=" ".concat(O));var T=e.detailsComponent;return i.b.renderInPortalIfExists(r.createElement("header",Object.assign({},F),r.createElement("div",{className:"container ".concat(C.container," position-relative inner-banner")},e.backButtonAppLink&&r.createElement("div",{className:"pt-3"},r.createElement(p,{appLink:e.backButtonAppLink,backToName:e.backButtonText,extraClasses:e.backButtonClasses,color:"white"})),r.createElement("div",{className:"".concat(e.alignLogoLeft?"position-absolute top-50 start-0 translate-middle-y w-100 ps-4":"".concat(C.bannerContent," px-2 ").concat((null===(t=e.logo)||void 0===t?void 0:t.url)?C.bannerContentWithLogo:""))},!!k&&r.createElement("div",{className:"position-relative ".concat(C.specialEventContainer)},r.createElement(l.s,{body:{type:k.endDate?"range":"day",text:k.endDate?"".concat(a.O.format(k.startDate,"DD"),"-").concat(a.O.format(k.endDate,"DD")):a.O.format(k.startDate,"DD")},month:function(e){return e.endDate?a.O.isSame(e.startDate,e.endDate,"month")?a.O.format(e.startDate,"MMMM"):"".concat(a.O.format(e.startDate,"MMM")," - ").concat(a.O.format(e.endDate,"MMM")):a.O.format(e.startDate,"MMMM")}(k),theme:e.calendarTheme})),r.createElement("div",null,x&&r.createElement("div",{className:"rounded-pill py-1 px-2 my-1 me-1 fw-semibold bg-light-blue lh-1 d-inline-block"},r.createElement(y.x,{namespace:"shared.bannerHeader",phrase:"onToday"})),e.showComingSoon&&r.createElement(o.r,{className:"pe-2 fw-semibold mb-1 rounded-pill justify-content-start text-nowrap"}),r.createElement("div",{className:"d-flex align-items-center"},e.alignLogoLeft&&r.createElement("div",{className:"".concat(C.logoContainerLeft," d-none d-md-block partial-loading-background rounded-circle overflow-hidden me-3")},(null===(n=e.logo)||void 0===n?void 0:n.url)&&r.createElement(v.w,{src:w.j.createUrl(null===(c=e.logo)||void 0===c?void 0:c.url,{size:b.h2.Medium})})),r.createElement("h1",{className:"text-white text-shadow pe-3 position-static ".concat(C.heading," ").concat(I(d)," ").concat(e.alignLogoLeft?"w-50":"")},d,T&&r.createElement(T,null)))),!!h&&r.createElement("div",{className:C.actionsContainer},r.createElement(s.e,{actions:h,sortComponent:A,actionsDropdownClassName:e.actionsDropdownClassName}))),!e.alignLogoLeft&&!!(null===(u=e.logo)||void 0===u?void 0:u.url)&&r.createElement("div",{className:C.logoContainer},r.createElement("img",{src:w.j.createUrl(e.logo.url,{size:b.h2.Small}),className:"rounded-circle"})))),null==N?void 0:N.container)}),(function(e,t){var n,r;return e.actions===t.actions&&e.heading===t.heading&&(null===(n=e.logo)||void 0===n?void 0:n.url)===(null===(r=t.logo)||void 0===r?void 0:r.url)}));function O(){var e=r.useContext(g.n);return i.b.renderInPortalIfExists(r.createElement("div",{className:"partial-banner partial-loading-background ".concat(C.banner)}),null==e?void 0:e.container)}},49935:(e,t,n)=>{n.d(t,{Oo:()=>v,b2:()=>y});var r=n(32735),a=n(23481),i=n(36848),o=n(86764),l=n(3747),s=n(5859),c=n(35223),u=n(83914);function d(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,i,o,l=[],s=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(r=i.call(n)).done)&&(l.push(r.value),l.length!==t);s=!0);}catch(e){c=!0,a=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(c)throw a}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return m(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)?m(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 m(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=a.T.encloseNamespace("shared.breadcrumbComponent"),p=r.forwardRef((function(e,t){var n=e.breadcrumb,a=n.name,o=n.appLink,l=n.active,s=e.withBackIcon,d=a,m=null;return d.length>48&&(d=a.slice(0,48)+"...",m=a),r.createElement("li",{className:"breadcrumb-item".concat(l?" active":""),title:m},l?r.createElement("strong",null,d):r.createElement(i.F,{appLink:o,ref:t},s&&r.createElement(u.x,{svgName:c.vn.ChevronLeft,size:u.S.Small}),r.createElement("span",{className:s?"ms-2":""},d)))})),v=function(e){var t=e.breadcrumbs,n=(0,l.a)(o.r.XS),a=(null==t?void 0:t.length)||0,i=d(r.useState(!1),2),s=i[0],c=i[1],u=d(r.useState(!1),2),m=u[0],v=u[1],y=r.useRef();if(r.useEffect((function(){var e,n=null!==(e=null==t?void 0:t.reduce((function(e,t){return e+t.name.length}),0))&&void 0!==e?e:0;a>4&&n>64&&c(!0)}),[null==t?void 0:t.length]),r.useLayoutEffect((function(){var e;m&&(null===(e=y.current)||void 0===e||e.focus())}),[y.current,m]),!a||n&&a<2)return r.createElement(r.Fragment,null);if(n)return r.createElement("nav",{"aria-label":"breadcrumb"},r.createElement("ol",{className:"breadcrumb m-0 p-0"},r.createElement(p,{breadcrumb:t[a-2],withBackIcon:!0})));var h=r.createElement(p,{breadcrumb:t[0]}),g=a>2?r.createElement(p,{breadcrumb:t[1]}):r.createElement(r.Fragment,null),b=a>3?r.createElement(p,{breadcrumb:t[a-2]}):r.createElement(r.Fragment,null),E=a>1?r.createElement(p,{breadcrumb:t[a-1]}):r.createElement(r.Fragment,null),w=t.slice(2,a-2);return r.createElement("nav",{"aria-label":"breadcrumb"},r.createElement("ol",{className:"breadcrumb m-0 p-0"},h,g,s?r.createElement("li",{className:"breadcrumb-item"},r.createElement("button",{className:"btn-link",onClick:function(){c(!1),v(!0)},"aria-label":f("expand")},"...")):w.map((function(e,t){return r.createElement(p,{key:t,breadcrumb:e,ref:0===t?y:null})})),b,E))},y=r.memo((function(e){var t=e.numItems,n=void 0===t?3:t;return(0,l.a)(o.r.XS)?r.createElement("div",{className:"partial-loading-background",style:{height:"1.3125rem",width:"6rem"}}):r.createElement("nav",{"aria-label":"breadcrumb"},r.createElement("ol",{className:"breadcrumb m-0 p-0"},s.u.getPartialLoadingItems({numItems:n}).map((function(e,t){var n=e.width;return r.createElement("li",{key:t,className:"breadcrumb-item"},r.createElement("span",{className:"d-inline-block partial-loading-background",style:{width:n},dangerouslySetInnerHTML:{__html:"&nbsp"}}))}))))}))},71020:(e,t,n)=>{n.d(t,{_:()=>u});var r=n(32735),a=n(80247),i=n(34152),o=n(83914),l=n(35223);const s={container:"VwD1b",spinner:"eJ85e"};function c(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function u(e){var t,n,u=(t=(0,i.YD)(),n=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,i,o,l=[],s=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(r=i.call(n)).done)&&(l.push(r.value),l.length!==t);s=!0);}catch(e){c=!0,a=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(c)throw a}}return l}}(t,n)||function(e,t){if(e){if("string"==typeof e)return c(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?c(e,t):void 0}}(t,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),d=u[0],m=u[1];return r.useEffect((function(){var t;e.fetchOnScroll&&m&&!e.isFetching&&(null===(t=e.fetchNext)||void 0===t||t.call(e,e.nextCursor))}),[m,e.isFetching]),r.createElement("div",{className:"p-3 text-center ".concat(s.container),ref:d},e.isFetching?r.createElement(a.Z,{as:"span",animation:"border",role:"status",className:s.spinner}):r.createElement(o.x,{svgName:l.vn.ChevronDown,className:"svg-container cursor-pointer",size:o.S.Large,onClick:function(){var t;return null===(t=e.fetchNext)||void 0===t?void 0:t.call(e,e.nextCursor)}}))}u.defaultProps={fetchOnScroll:!1}},94644:(e,t,n)=>{n.d(t,{r:()=>u});var r=n(50242),a=n(81886),i=n(67058),o=n(14553),l=n(49267),s=n(49075),c={notFound:i.d,forbidden:{rating:o.q,yearLevel:o.q,region:l.a,privacy:o.q},badRequest:s._,internalServerError:s._};function u(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e){var i;i="number"==typeof e?e:e.status;var o=Object.assign(Object.assign({},c),t);i&&a.Q.Ry.isStatusCodeError(i)&&(i!==r.o.InternalServer?i!==r.o.NotFound?i!==r.o.Forbidden?n.badRequest||a.Q.Ry.throw(new o.badRequest):n.forbidden||a.Q.Ry.throw(new o.forbidden.privacy):n.notFound||a.Q.Ry.throw(new o.notFound):n.internalServerError||a.Q.Ry.throw(new s._))}}},91286:(e,t,n)=>{n.d(t,{v:()=>o});var r=n(32735),a=n(94644);function i(e){return e.map((function(e){return e.statusCode})).join(":")}function o(e,t,n){var o=Array.isArray(e)?e:[e];(0,r.useEffect)((function(){o.forEach((function(e){(0,a.r)(e.statusCode,t,n)}))}),[i(o),t,n])}},60115:(e,t,n)=>{n.d(t,{K:()=>c});var r=n(32735),a=n(50242),i=n(91967),o=400,l=n(45719);function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function c(e,t,n,c,u,d){var m,f,p,v,y=(m=(0,r.useState)(0),f=2,function(e){if(Array.isArray(e))return e}(m)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,i,o,l=[],s=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(r=i.call(n)).done)&&(l.push(r.value),l.length!==t);s=!0);}catch(e){c=!0,a=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(c)throw a}}return l}}(m,f)||function(e,t){if(e){if("string"==typeof e)return s(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)?s(e,t):void 0}}(m,f)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),h=y[0],g=y[1],b=t,E=(0,l.P)((function(t){if(!e)return null;var n=e(t);return n?n.key:null}),c,u);return p={fetchNextPage:function(){if(t&&e&&E)return g((function(e){return e+1})),b(E.nextCursor)},hasMore:!!(null==E?void 0:E.nextCursor),isFetching:null==E?void 0:E.isFetching,scrollContainer:d},v=function(){if(!p.isFetching){if(p.scrollContainer){var e=p.scrollContainer;if(e.getBoundingClientRect().height+e.scrollTop<e.scrollHeight-o)return}else if(window.innerHeight+document.documentElement.scrollTop<document.documentElement.scrollHeight-o)return;p.fetchNextPage()}},(0,r.useEffect)((function(){var e=i.q.throttle(v,200),t=p.scrollContainer||window;return p.hasMore&&t.addEventListener("scroll",e),function(){return t.removeEventListener("scroll",e)}}),[p.hasMore,p.fetchNextPage,p.scrollContainer]),(0,r.useEffect)((function(){E&&E.shouldInitialFetch&&t&&(b(),g((function(e){return e+1})))}),[null==E?void 0:E.shouldInitialFetch,t]),(0,r.useEffect)((function(){var e,t;if((null==E?void 0:E.statusCode)&&i.q.isFunction(n)){var r=+(null===(t=null===(e=E.statusCode)||void 0===e?void 0:e.toString())||void 0===t?void 0:t.substr(0,1));r!==a.k.ClientError&&r!==a.k.ServerError||n(h,E.statusCode)}}),[null==E?void 0:E.statusCode]),{items:null==E?void 0:E.items,hasMore:!!(null==E?void 0:E.nextCursor),nextCursor:null==E?void 0:E.nextCursor,isFetching:null==E?void 0:E.isFetching,totalItems:null==E?void 0:E.totalItems,hasFirstPageCompleted:null==E?void 0:E.hasFirstPageCompleted}}},63719:(e,t,n)=>{n.d(t,{h:()=>l});var r=n(32735),a=n(77316);function i(e,t){if(e){if("string"==typeof e)return o(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?o(e,t):void 0}}function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function l(e){var t,n,l=(t=r.useMemo((function(){return a.p.getBuilder()}),[]),n=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,i,o,l=[],s=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(r=i.call(n)).done)&&(l.push(r.value),l.length!==t);s=!0);}catch(e){c=!0,a=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(c)throw a}}return l}}(t,n)||i(t,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),s=l[0],c=(0,l[1])(s);return c&&e?[].concat(function(e){return function(e){if(Array.isArray(e))return o(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||i(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(c),[Object.assign(Object.assign({},e),{active:!0})]):c}},5859:(e,t,n)=>{function r(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}n.d(t,{u:()=>i});var a={numItems:5,minWidth:50,maxWidth:100},i={getPartialLoadingItems:function(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=Object.assign(Object.assign({},a),t);return(e=Array(n.numItems),function(e){if(Array.isArray(e))return r(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return r(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)?r(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()).map((function(){return{width:"".concat(Math.max(Math.floor(Math.random()*n.maxWidth),n.minWidth),"px")}}))}}},6263:(e,t,n)=>{n.r(t),n.d(t,{PlaylistView:()=>je});var r=n(32735),a=n(70680),i=n(23481),o=n(81886),l=n(20354),s=n(65858),c=n(1048),u=n(4594),d={isPlaylist:function(e){return(null==e?void 0:e.typeId)===u.E.Playlist},isOwner:function(e,t){var n;return!(!t||!e||c.t.isEmpty(e._liteOwner))&&e._liteOwner.id.toString()===(null===(n=t.id)||void 0===n?void 0:n.toString())},getVideoCount:function(e){var t,n,r;if(e){var a=0;return(null===(t=e.videos)||void 0===t?void 0:t.count)&&(a+=e.videos.count),(null===(n=e.clips)||void 0===n?void 0:n.count)&&(a+=e.clips.count),(null===(r=e.interactives)||void 0===r?void 0:r.count)&&(a+=e.interactives.count),a}}},m=n(71020),f=n(51365),p=n(183),v=n(89454),y=n(21750),h=n(39151),g=n(1666),b=n(5112),E=n(31949),w=n(69883),C=n(63719),S=n(56520),I=n(91286),A=n(60115),O=n(22902);function k(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var N=n(79612),L=n(76753),x=n(54569),P=n(31908),j=n(14070),F=n(97291),T=n(51855),D=n(7179),M=n(27638),V=n(97816),U=n(10741),B=n(33192),R=n(22490),_=n(110),H=n(28400),Y=n(89725),$=n(83345),q="playlists.playlistHeaderDetails",G=function(e){var t=e.className;return r.createElement("span",{className:t},"•")};function Q(e){var t=e._liteOwner;if(t)return t.name&&t.surname?H.m.toTitleCase(t.name+" "+t.surname.substring(0,1)):t.name?t.name.split(" ")[0]:void 0}function W(e){var t,n,a=d.isOwner(e.playlist,e.currentUser),i=null===(t=e.playlist.followers)||void 0===t?void 0:t.count,o=function(e){if(!e.contentModifiedDate)return"";var t=new Date,n=_.O.convertUTCToLocal(e.contentModifiedDate);return _.O.isBefore(n,_.O.subtract(t,1,"month"))?"":_.O.fromNow(n)}(e.playlist);return r.createElement("div",{className:e.detailsClassName},!e.hideOwnerName&&!a&&r.createElement(r.Fragment,null,(null===(n=e.playlist._isClickViewCurated)||void 0===n?void 0:n.value)?r.createElement(r.Fragment,null,r.createElement("div",{className:e.clickViewAvatarClassName},r.createElement(Y.F,null)),r.createElement("span",null,"ClickView")):r.createElement($.x,{namespace:q,phrase:"createdBy",options:{user:Q(e.playlist)}}),r.createElement(G,{className:e.separatorClassName})),"number"==typeof e.totalVideos&&r.createElement($.x,{namespace:q,phrase:"videos",options:{smartCount:e.totalVideos}}),i>0&&r.createElement(r.Fragment,null,r.createElement(G,{className:e.separatorClassName}),r.createElement($.x,{namespace:q,phrase:"followers",options:{smartCount:i}})),!!o&&r.createElement(r.Fragment,null,r.createElement(G,{className:e.separatorClassName}),r.createElement($.x,{namespace:q,phrase:"lastUpdated",options:{timeAgo:o}})))}var X=n(44522),z=n(49935),Z=n(7733),J=n(86764),K=n(3747),ee=n(9085);const te={partialDescription:"vDX0m"};function ne(){return r.createElement(r.Fragment,null,r.createElement(X.v,null),r.createElement("div",{className:"mb-2"},r.createElement("div",{className:"partial-loading-background my-2 border-bottom ".concat(te.partialDescription)})))}var re=n(49985),ae=n(35223),ie=i.T.encloseNamespace("playlists.playlistHeader"),oe={getPlaylistActions:function(e,t){var n,r,a,i,o,l,c=t.isAuthenticated,u=t.isPlugin,m=t.isMobile,f=t.setIsFollowing,p=t.isFollowing,v=t.setShowFollowSpinner,y=t.showFollowSpinner,h=t.isUserCurator,g=t.openInCuratorLink,b={id:e.playlist.id,name:e.playlist.name,followerCount:null===(n=e.playlist.followers)||void 0===n?void 0:n.count,videoCount:null===(r=e.playlist.videos)||void 0===r?void 0:r.count,interactiveCount:null===(a=e.playlist.interactives)||void 0===a?void 0:a.count,clipCount:null===(i=e.playlist.clips)||void 0===i?void 0:i.count,isClickViewPlaylist:null===(o=e.playlist._isClickViewCurated)||void 0===o?void 0:o.value},E={location:s.LZ.Banner,entity:s.py.Playlist,workflowPhase:s.eu.Start},w=[];if(!c)return w;var C=d.isOwner(e.playlist,e.currentUser);return u||(e.playAllAppLink&&w.push({label:ie("playAll"),appLink:e.playAllAppLink,svgName:ae.vn.Play,className:m?"":"btn btn-outline-dark me-2",button:!m,analyticsData:b,analyticsOptions:Object.assign(Object.assign({},E),{actionType:s.Vw.Play})}),h&&w.push({label:(0,S.eR)(),href:g,openInNewTab:!0}),w.push({label:ie("share"),appLink:{application:F.O.DEFAULT,action:j.e.Default.SHARE,args:[e.playlist.id],params:{entityType:"playlist"}},svgName:ae.vn.Share,className:m?"":"btn btn-outline-dark me-2",button:!m,analyticsData:b,analyticsOptions:Object.assign(Object.assign({},E),{actionType:s.Vw.Share,eventVersion:s.eq.V3})})),C||w.push({label:ie(p?"following":"follow"),onClick:function(){f(!p),v(!0),e.follow(!p,(function(){v(!1),re.k.logUserAction(b,Object.assign(Object.assign({},E),{actionType:s.Vw.Follow,descriptor:p?s.DL.Off:s.DL.On,workflowPhase:s.eu.Complete}))}),(function(){v(!1),f(p)}))},svgName:p?ae.vn.BellFilled:ae.vn.Bell,className:m?"":"btn follow-btn btn-".concat(p?"outline-dark":"dark"," me-2"),button:!m,showSpinner:y}),C&&(w.push({label:ie("edit"),appLink:{application:F.O.PLAYLISTS,action:j.e.Playlists.EDIT_PLAYLIST,args:[e.playlist.id]},svgName:ae.vn.Edit,button:!1,analyticsData:b,analyticsOptions:Object.assign(Object.assign({},E),{actionType:s.Vw.Edit})}),w.push({label:ie("delete"),appLink:{application:F.O.PLAYLISTS,action:j.e.Playlists.DELETE_PLAYLIST,args:[e.playlist.id]},svgName:ae.vn.Delete,className:"text-danger",button:!1,analyticsData:b,analyticsOptions:Object.assign(Object.assign({},E),{actionType:s.Vw.Delete})})),(null===(l=e.playlist._isClickViewCurated)||void 0===l?void 0:l.value)&&w.push({label:ie("copy"),appLink:{application:F.O.PLAYLISTS,action:j.e.Playlists.COPY_PLAYLIST,args:[e.playlist.id]},button:!1,analyticsData:b,analyticsOptions:Object.assign(Object.assign({},E),{actionType:s.Vw.Copy})}),w}};const le={clickViewAvatar:"PHe9c"};function se(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,i,o,l=[],s=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(r=i.call(n)).done)&&(l.push(r.value),l.length!==t);s=!0);}catch(e){c=!0,a=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(c)throw a}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return ce(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)?ce(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 ce(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function ue(e){var t=(0,T.G)().isPlugin,n=se(r.useState(e.isFollowing),2),a=n[0],i=n[1],o=se(r.useState(!1),2),l=o[0],s=o[1];r.useEffect((function(){return i(e.isFollowing)}),[e.isFollowing]);var c=(0,K.a)(J.r.XS);if(e.showPartialLoading)return r.createElement(ne,null);var u=e.playlist.description,d=oe.getPlaylistActions(e,{isAuthenticated:e.currentUser.isAuthenticated,isPlugin:t,isMobile:c,setIsFollowing:i,isFollowing:a,setShowFollowSpinner:s,showFollowSpinner:l,isUserCurator:e.isUserCurator,openInCuratorLink:e.openInCuratorLink}),m=e.getBreadcrumbs();return r.createElement(r.Fragment,null,r.createElement(X.p,{heading:e.playlist.name,banner:e.playlist.banner,imageCdnUrl:e.imageCdnUrl,actions:d.length&&d,actionsDropdownClassName:"btn btn-outline-dark",blockColourClass:(0,ee.x)(e.playlist.name,Z.o),detailsComponent:function(){return r.createElement(W,{playlist:e.playlist,currentUser:e.currentUser,detailsClassName:"mb-n1 font-size-normal fw-normal mt-1",clickViewAvatarClassName:le.clickViewAvatar,separatorClassName:"mx-1",totalVideos:e.totalVideos})}}),(!!u||!!(null==m?void 0:m.length))&&r.createElement("div",{className:"border-bottom py-3"},!e.playlist||e.classificationId&&!e.topicPath?r.createElement(z.b2,null):r.createElement("div",{className:"pb-2"},r.createElement(z.Oo,{breadcrumbs:m})),!!u&&r.createElement("p",{className:"mb-0"},u)))}var de=n(56050),me=n(91967),fe=n(83914),pe=n(74696),ve=n(13231);function ye(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 he=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var a=0;for(r=Object.getOwnPropertySymbols(e);a<r.length;a++)t.indexOf(r[a])<0&&Object.prototype.propertyIsEnumerable.call(e,r[a])&&(n[r[a]]=e[r[a]])}return n};function ge(e){var t,n,a=e.onSortComplete,i=e.onSortStart,l=e.showPartialLoading,s=he(e,["onSortComplete","onSortStart","showPartialLoading"]),c=(t=r.useState(),n=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,i,o,l=[],s=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(r=i.call(n)).done)&&(l.push(r.value),l.length!==t);s=!0);}catch(e){c=!0,a=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(c)throw a}}return l}}(t,n)||function(e,t){if(e){if("string"==typeof e)return ye(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)?ye(e,t):void 0}}(t,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),u=c[0],d=c[1];return l?r.createElement(pe.S,{withReordering:e.canEdit||e.showIndexes}):e.canEdit?r.createElement(ve.NB,Object.assign({},s,{currentSortingIndex:u,onSortStart:function(t){var n=e.videos.findIndex((function(e){return e.id.toString()===t.active.id.toString()}));d(n),me.q.isFunction(i)&&i(n)},onSortEnd:function(t){d(null);var n=t.active,r=t.over,i=e.videos.findIndex((function(e){return e.id.toString()===n.id.toString()})),l=e.videos.findIndex((function(e){return e.id.toString()===r.id.toString()}));me.q.isFunction(a)?a(i,l):o.Q.Ry.throw(new de.H("An onSortComplete callback function must be passed to SortableVideoListComponent"))},dragHandleIcon:ae.vn.Hamburger,dragHandleIconSize:fe.S.XXL,presentationAudiences:e.presentationAudiences})):r.createElement(ve.E4,Object.assign({},s))}var be=n(23232),Ee=n(99742),we="playlists.playlistEmptyState";function Ce(){return r.createElement($.D.Provider,{value:we},r.createElement(be.u,null,r.createElement(be.u.Image,{src:Ee.W.EmptyStates.Playlists.PLAYLIST_VIDEOS}),r.createElement(be.u.Heading,null,r.createElement($.x,{phrase:"heading"})),r.createElement(be.u.Info,null,r.createElement($.x,{phrase:"info"}))))}n(75896);var Se=n(81493),Ie=n(9680),Ae=n(10671);function Oe(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 ke=i.T.encloseNamespace("playlists.playlist");function Ne(e,t,n){re.k.logUserAction({id:t,playlistId:e},{location:s.LZ.VideoList,entity:s.py.Video,actionType:s.Vw.Move,workflowPhase:n})}var Le={notFound:Se.N,forbidden:{privacy:Ie.J}};function xe(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 Pe=i.T.encloseNamespace("playlists.playlist");function je(e){var t,n,i,c,u,_,H,Y,$,q,G,Q,W,X,z=(0,a.I0)(),Z=(0,w.Z)(),J=l.a.useBasicFetch(h.L.config()),K=l.a.useBasicFetch(E.N.currentUser()),ee=(0,S.R0)(),te=ee.isUserCurator,ne=ee.getOpenInCurationStudioLink,re=(0,O.T)().hasPermissions,ie=(0,T.G)().isPlugin,oe=l.a.useBasicFetch((null===(t=K.data)||void 0===t?void 0:t.isAuthenticated)&&g.h.yearGroups(K.data.customerId)),le=l.a.useBasicFetch(e.classificationId&&y.x.path(e.classificationId)),se=l.a.useBasicFetch(e.classificationId&&y.x.classification(e.classificationId,null===(n=K.data)||void 0===n?void 0:n.id)),ce=l.a.useBasicFetch(se.hasCompleted&&y.x.presentationById(null===(i=se.data)||void 0===i?void 0:i.presentationId)),de=l.a.useBasicFetch((!e.classificationId||ce.hasCompleted)&&v.O.presentationAudiences(null===(c=ce.data)||void 0===c?void 0:c.id)),me=(0,M.u)(s.LZ.VideoThumbnail),fe=me.setFavourite,pe=me.canFavourite,ve=e.shareId?b.C.getSharedPlaylist(e.playlistId,e.shareId):b.C.getPlaylist(e.playlistId),ye=e.shareId?b.C.getSharedPlaylistVideosCount(e.playlistId,e.shareId):b.C.getPlaylistVideosCount(e.playlistId),he=l.a.useBasicFetch(ve),be=l.a.useBasicFetch(ye),Ee=function(e,t,n){var r=(0,Ae._)({location:Ae.i.VideoItem,shareId:n});return d.isOwner(e,t)?Object.assign(Object.assign({},r),{getVideoActions:function(t,n){var a,i=P.M.getCanBeConsumed(t).canConsume,o={label:ke("removeFromPlaylist"),button:!1,svgName:ae.vn.Delete,appLink:{application:F.O.PLAYLISTS,action:j.e.Playlists.REMOVE_VIDEO_FROM_PLAYLIST,args:[t.id,e.id],params:{typeId:t.typeId}},className:"text-danger",analyticsOptions:{entity:s.py.Video,actionType:s.Vw.Dissociate,location:s.LZ.VideoListItem,workflowPhase:s.eu.Start,descriptor:s.iF.Playlist},analyticsData:{id:t.id,playlistId:e.id},group:"delete"};return i?[].concat(function(e){if(Array.isArray(e))return Oe(e)}(a=r.getVideoActions(t,n))||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(a)||function(e,t){if(e){if("string"==typeof e)return Oe(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)?Oe(e,t):void 0}}(a)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(),[o]):[o]}}):r}(he.data,K.data,e.shareId);(0,I.v)(he,Le);var we=function(t){return e.shareId?b.C.getSharedPlaylistVideos(e.playlistId,e.shareId,t):b.C.getPlaylistVideos(e.playlistId,t)},Se=l.a.useBasicFetch((null===(u=K.data)||void 0===u?void 0:u.id)&&b.C.getIsFollowingPlaylist(e.playlistId,null===(_=K.data)||void 0===_?void 0:_.id)),Ie=function(e){l.a.getFetch(z)(we(e))},je=(0,A.K)(we,Ie),Fe=je.items,Te=je.hasMore,De=je.isFetching;(0,V.V)(Fe);var Me,Ve,Ue,Be,Re,_e,He=function(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,i,o,l=[],s=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(r=i.call(n)).done)&&(l.push(r.value),l.length!==t);s=!0);}catch(e){c=!0,a=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(c)throw a}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return xe(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)?xe(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.")}()}((Me=Fe,Re=(0,r.useState)(),_e=2,Ve=function(e){if(Array.isArray(e))return e}(Re)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,i,o,l=[],s=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(r=i.call(n)).done)&&(l.push(r.value),l.length!==t);s=!0);}catch(e){c=!0,a=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(c)throw a}}return l}}(Re,_e)||function(e,t){if(e){if("string"==typeof e)return k(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?k(e,t):void 0}}(Re,_e)||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.")}(),Ue=Ve[0],Be=Ve[1],(0,r.useEffect)((function(){Ue&&(Me.length!==Ue.length||function(e,t){var n=!0;if(e.length!==t.length)return!1;for(var r=0;r<e.length;r++)if(e[r].id!==t[r].id){n=!1;break}return n}(Me,Ue))&&Be(null)}),[Me]),[Ue,Be]),2),Ye=He[0],$e=He[1];(0,D.P)({id:e.playlistId,app:"playlists",shareId:e.shareId}),(0,N.M)(L.CG.getPlaylistMetadata({content:he.data,phraseContext:{phraseHandler:Pe,titlePhrase:"pageTitle",descriptionPhrase:"pageDescription"},canonicalLink:B.f.getCanonicalLink({stripPresentationSlug:!0}),allowIndexing:!1}));var qe=!!Fe&&0===Fe.length,Ge=function(t,n){var r,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return R.W.getAppLink(t,Object.assign(Object.assign({},a),{contextId:e.playlistId,context:p.Q.Playlist,shareId:e.shareId,moviesAndTv:e.moviesAndTv,playNext:n,includeContext:null===(r=K.data)||void 0===r?void 0:r.isAuthenticated}))},Qe=!(null===(H=K.data)||void 0===H?void 0:H.isAuthenticated)||!!Se.hasCompleted,We=null==Fe?void 0:Fe.find((function(e){var t;return null===(t=P.M.getCanBeConsumed(e))||void 0===t?void 0:t.canConsume})),Xe=d.isOwner(he.data,K.data),ze=Fe&&K.data&&J.data,Ze=(0,C.h)({name:null===(Y=he.data)||void 0===Y?void 0:Y.name});return r.createElement(f.M.Provider,{value:(null===($=K.data)||void 0===$?void 0:$.isAuthenticated)&&Ee},r.createElement("div",{className:"bg-white px-3"},r.createElement(ue,{playlist:he.data,currentUser:K.data,isFollowing:null===(q=Se.data)||void 0===q?void 0:q.isFollowing,follow:function(t,n,r){var a,i=t?b.C.followPlaylist:b.C.unfollowPlaylist;l.a.fetch(z,i(e.playlistId,null===(a=K.data)||void 0===a?void 0:a.id,n,(function(){r(),Z.error(Pe(t?"followError":"unfollowError"))})))},playAllAppLink:We&&Ge(We,!0),showPartialLoading:!he.data||!ze||!Qe,imageCdnUrl:!!J.data&&J.data.imageCdnUrl,getBreadcrumbs:function(){return e.hideBreadCrumbs?null:Ze},topicPath:le.data,moviesAndTv:e.moviesAndTv,classificationId:e.classificationId,isUserCurator:te,openInCuratorLink:ne(null===(G=he.data)||void 0===G?void 0:G.typeId,null===(Q=he.data)||void 0===Q?void 0:Q.id),totalVideos:d.getVideoCount(be.data)}),r.createElement("div",{className:"mt-2"},qe?r.createElement(Ce,null):r.createElement(ge,{videos:Ye||Fe,yearGroups:oe.data,playlistId:!!he.data&&he.data.id,onSortStart:function(t){var n=Fe[t];n&&Ne(e.playlistId,n.id,s.eu.Start)},onSortComplete:function(t,n){if(t!==n){var r=Fe[t];if(r){var a=x.l.reorder(Fe,t,n),i=a.reorderedItems,o=a.reorderRequest;$e(i),Ne(e.playlistId,r.id,s.eu.Complete),l.a.fetch(z,b.C.reorderVideos(e.playlistId,o,null,(function(){$e(null)})))}}},canEdit:Xe,showPartialLoading:!ze,getVideoAppLink:function(e,t){return Ge(e,!1,t)},getSubTextAppLink:function(t){return e.getSeriesAppLink(t.series)},setFavourite:fe,canFavourite:pe,showSignIn:!(null===(W=K.data)||void 0===W?void 0:W.isAuthenticated),getSignInAppLink:function(e){var t=o.Q.C$.getHref(e),n="/"!==t?{redirectUrl:t}:{};return{application:F.O.DEFAULT,action:j.e.Default.CHALLENGE,params:n}},canRemovePrivateVideos:Xe,presentationAudiences:e.moviesAndTv?null:de.data,showIndexes:!0,hasPermissions:re,getPreviewQuestionsAppLink:function(e){return U.j.getPreviewQuestionsAppLink(e)},imageCdnUrl:null===(X=J.data)||void 0===X?void 0:X.imageCdnUrl,isPlugin:ie,getClassroomGuideAppLink:R.W.getClassroomGuideAppLink,getInteractiveGuidanceAppLink:R.W.getInteractiveGuidanceAppLink,getResourceGuidanceAppLink:R.W.getResourceGuidanceAppLink})),(Te||De)&&r.createElement(m._,{isFetching:De,fetchNext:Ie})))}},97816:(e,t,n)=>{n.d(t,{V:()=>f});var r=n(32735),a=n(20354),i=n(75896),o=n(21750),l=n(31949),s=n(1575),c=n(31908);function u(e,t){if(e){if("string"==typeof e)return d(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?d(e,t):void 0}}function d(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 m=50;function f(e){var t,n,f=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},p=a.a.useBasicFetch(l.N.currentUser()),v=r.useRef(new Set),y=function(e){return e?Array.isArray(e)?e.filter((function(e){return!!e&&(c.M.isVideo(e)||c.M.isClip(e))})):"data"in e?e.data.filter((function(e){return!!e&&(c.M.isVideo(e)||c.M.isClip(e))})):[]:[]}(e),h=y.map((function(e){return e.id})),g=(t=r.useState([]),n=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,i,o,l=[],s=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(r=i.call(n)).done)&&(l.push(r.value),l.length!==t);s=!0);}catch(e){c=!0,a=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(c)throw a}}return l}}(t,n)||u(t,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),b=g[0],E=g[1];r.useEffect((function(){if((null==h?void 0:h.length)&&p.hasCompleted){var e=[];h.forEach((function(t){v.current.has(t)||(e.push(t),v.current.add(t))})),e.length&&E((function(t){var n=function(e){return function(e){if(Array.isArray(e))return d(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||u(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(t);return i.m.chunk(e,m).forEach((function(e){var t;n.push(s.R.videoMixinAssocs(e,f.flightNamespace)),(null===(t=p.data)||void 0===t?void 0:t.isAuthenticated)&&n.push(o.x.hasCurriculumLinks(e,null,f.flightNamespace))})),n}))}}),[null==h?void 0:h.length,p.hasCompleted]),a.a.useBasicFetchAll(b)}},68050:(e,t,n)=>{n.d(t,{Z:()=>c});var r=n(95685),a=n.n(r),i=n(32735),o=n(46304),l=n(74512);const s=i.forwardRef((({bsPrefix:e,className:t,as:n="div",...r},i)=>{const s=(0,o.vE)(e,"row"),c=(0,o.pi)(),u=(0,o.zG)(),d=`${s}-cols`,m=[];return c.forEach((e=>{const t=r[e];let n;delete r[e],null!=t&&"object"==typeof t?({cols:n}=t):n=t;const a=e!==u?`-${e}`:"";null!=n&&m.push(`${d}${a}-${n}`)})),(0,l.jsx)(n,{ref:i,...r,className:a()(t,s,...m)})}));s.displayName="Row";const c=s}}]);
2
- //# sourceMappingURL=1820-3b5d0a340d-lite.chunk.js.map