@clickview/lite 0.50.2 → 0.50.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundles.json +1 -1
- package/dist/scripts/{1437-5b1889cf0d-lite.chunk.js → 1437-f76bfeecb0-lite.chunk.js} +1 -1
- package/dist/scripts/{1437-5b1889cf0d-lite.chunk.js.map → 1437-f76bfeecb0-lite.chunk.js.map} +1 -1
- package/dist/scripts/{1820-2fa6cf6cb2-lite.chunk.js → 1820-645f38c1a1-lite.chunk.js} +2 -2
- package/dist/scripts/1820-645f38c1a1-lite.chunk.js.map +1 -0
- package/dist/scripts/3070-d2de8f3807-lite.chunk.js +2 -0
- package/dist/scripts/3070-d2de8f3807-lite.chunk.js.map +1 -0
- package/dist/scripts/4718-d159deec5b-lite.chunk.js +2 -0
- package/dist/scripts/4718-d159deec5b-lite.chunk.js.map +1 -0
- package/dist/scripts/{5940-d841fd31d8-lite.chunk.js → 5940-c55ee9b374-lite.chunk.js} +2 -2
- package/dist/scripts/5940-c55ee9b374-lite.chunk.js.map +1 -0
- package/dist/scripts/6309-6f21942483-lite.chunk.js +3 -0
- package/dist/scripts/6309-6f21942483-lite.chunk.js.map +1 -0
- package/dist/scripts/9016-9eba1d2c42-lite.chunk.js +3 -0
- package/dist/scripts/9016-9eba1d2c42-lite.chunk.js.map +1 -0
- package/dist/scripts/9839-8d44a3235c-lite.chunk.js +3 -0
- package/dist/scripts/9839-8d44a3235c-lite.chunk.js.map +1 -0
- package/dist/scripts/{bundle-83d3367a0c.min.js → bundle-8860d17bb5.min.js} +3 -3
- package/dist/scripts/bundle-8860d17bb5.min.js.map +1 -0
- package/package.json +1 -1
- package/dist/scripts/1820-2fa6cf6cb2-lite.chunk.js.map +0 -1
- package/dist/scripts/3070-47e46e0d89-lite.chunk.js +0 -2
- package/dist/scripts/3070-47e46e0d89-lite.chunk.js.map +0 -1
- package/dist/scripts/4718-6df54d3039-lite.chunk.js +0 -2
- package/dist/scripts/4718-6df54d3039-lite.chunk.js.map +0 -1
- package/dist/scripts/5940-d841fd31d8-lite.chunk.js.map +0 -1
- package/dist/scripts/6309-dd3a8e7f21-lite.chunk.js +0 -3
- package/dist/scripts/6309-dd3a8e7f21-lite.chunk.js.map +0 -1
- package/dist/scripts/9016-df37abbca9-lite.chunk.js +0 -3
- package/dist/scripts/9016-df37abbca9-lite.chunk.js.map +0 -1
- package/dist/scripts/9839-5befd54d51-lite.chunk.js +0 -3
- package/dist/scripts/9839-5befd54d51-lite.chunk.js.map +0 -1
- package/dist/scripts/bundle-83d3367a0c.min.js.map +0 -1
- /package/dist/scripts/{6309-dd3a8e7f21-lite.chunk.js.LICENSE.txt → 6309-6f21942483-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{9016-df37abbca9-lite.chunk.js.LICENSE.txt → 9016-9eba1d2c42-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{9839-5befd54d51-lite.chunk.js.LICENSE.txt → 9839-8d44a3235c-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{bundle-83d3367a0c.min.js.LICENSE.txt → bundle-8860d17bb5.min.js.LICENSE.txt} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts/6309-6f21942483-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/enums/BulkOnboardingPreferencesState.ts","file:///app/packages/libs/shared/src/apps/subjects/utils/OnboardingHelper.ts","file:///app/packages/libs/shared/src/hooks/UseMergeAudiences.ts","file:///app/packages/libs/shared/src/utils/audience-helper/AudienceStringBuilders.ts","file:///app/packages/libs/shared/src/utils/audience-helper/AudienceHelper.ts","file:///app/packages/projects/lite/src/apps/onboarding/components/left-panel-item/left-panel-item.scss","file:///app/packages/projects/lite/src/apps/onboarding/components/left-panel-item/LeftPanelItem.tsx","file:///app/packages/projects/lite/src/apps/onboarding/components/loaders/primitives/OnboardingLoaderContainer.tsx","file:///app/packages/projects/lite/src/apps/onboarding/components/loaders/videos-loader/getOnboardingLoaderVideos.ts","file:///app/packages/projects/lite/src/apps/onboarding/components/loaders/videos-loader/OnboardingVideosLoader.tsx","file:///app/packages/projects/lite/src/apps/onboarding/components/loaders/videos-loader/videos-loader.scss","file:///app/packages/projects/lite/src/apps/onboarding/components/mock-views/layout/mock-layout.scss","file:///app/packages/projects/lite/src/apps/onboarding/components/mock-views/layout/MockLayout.tsx","file:///app/packages/projects/lite/src/apps/onboarding/components/mock-views/playlist/mock-playlist.scss","file:///app/packages/projects/lite/src/apps/onboarding/components/mock-views/playlist/MockPlaylist.tsx","file:///app/packages/projects/lite/src/apps/onboarding/components/classification-videos/classification-videos.scss","file:///app/packages/projects/lite/src/apps/onboarding/components/classification-videos/OnboardingClassificationVideos.tsx","file:///app/packages/projects/lite/src/apps/onboarding/views/select-videos/select-videos.scss","file:///app/packages/projects/lite/src/apps/onboarding/views/select-videos/OnboardingSelectVideosView.tsx","file:///app/packages/projects/lite/src/apps/onboarding/hooks/useGetSuggestedVideos.ts"],"sourcesContent":["export enum BulkOnboardingPreferencesState {\n None = 0,\n AllSubjects = 1,\n AllLevels = 2,\n AllSubjectsAndAllLevels = 3\n}","import { HashObject } from 'libs/common/react/interfaces';\n\nimport { BulkOnboardingPreferencesState } from 'libs/shared/enums/BulkOnboardingPreferencesState';\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { Presentation } from 'libs/shared/interfaces';\n\n/**\n * These are all the valid preference steps in the onboarding worflow\n * Steps are displayed in full workflow order from left to right.\n * \n * Important: Not all customers/users will be required to compelete all steps.\n * \n * School-level = presentation selection for K12\n */\nexport type OnboardingStep = 'welcome' | 'school-level' | 'curriculum' | 'audiences' | 'topics' | 'summary' ;\n\nexport const OnboardingHelper = {\n hasManyPresentationTypes(presentations: Presentation[] = []): HashObject {\n let totalAvailableSubjectPresentations = 0;\n let totalAvailableCurriculumPresentations = 0;\n\n presentations?.forEach(p => {\n if (p.type === PresentationType.Subject)\n totalAvailableSubjectPresentations++;\n\n else if (p.type === PresentationType.Curriculum)\n totalAvailableCurriculumPresentations++;\n });\n\n /**\n * The checks for \"> 1\" are done because we _only_ want to display presentation selectors\n * if the user has more than 1 presentation to select from. If they only have 1 available,\n * then that will always be used by default and they don't have to make any decisions.\n */\n return {\n hasManySubjectPresentations: totalAvailableSubjectPresentations > 1,\n hasManyCurriculumPresentations: totalAvailableCurriculumPresentations > 1\n };\n },\n\n getBulkPreferencesState(state: BulkOnboardingPreferencesState): { [key in 'levels' | 'subjects']: boolean } {\n if (state === BulkOnboardingPreferencesState.AllSubjectsAndAllLevels)\n return {\n levels: true,\n subjects: true\n };\n\n return {\n levels: state === BulkOnboardingPreferencesState.AllLevels,\n subjects: state === BulkOnboardingPreferencesState.AllSubjects\n };\n },\n\n hasBulkSelectedLevels(bulkState: BulkOnboardingPreferencesState): boolean {\n return (\n bulkState === BulkOnboardingPreferencesState.AllLevels ||\n bulkState === BulkOnboardingPreferencesState.AllSubjectsAndAllLevels\n );\n },\n\n hasBulkSelectedTopics(bulkState: BulkOnboardingPreferencesState): boolean {\n return (\n bulkState === BulkOnboardingPreferencesState.AllSubjects ||\n bulkState === BulkOnboardingPreferencesState.AllSubjectsAndAllLevels\n );\n },\n\n getNextBulkState(current: BulkOnboardingPreferencesState, managing: 'topics' | 'audiences'): BulkOnboardingPreferencesState {\n const { None, AllSubjects, AllLevels, AllSubjectsAndAllLevels } = BulkOnboardingPreferencesState;\n\n const isManagingTopics = managing === 'topics';\n\n switch (current) {\n case None:\n default:\n return isManagingTopics ? AllSubjects : AllLevels;\n case AllSubjects:\n return isManagingTopics ? None : AllSubjectsAndAllLevels;\n case AllLevels:\n return isManagingTopics ? AllSubjectsAndAllLevels : None;\n case AllSubjectsAndAllLevels:\n return isManagingTopics ? AllLevels : AllSubjects;\n }\n }\n};\n","import React from 'react';\n\nimport { Audience, PresentationAudience } from '../interfaces';\nimport { AudienceHelper } from '../utils/audience-helper/AudienceHelper';\n\nexport function useMergeAudiences(\n audiences: Audience[],\n presentationAudiences: PresentationAudience[]\n): PresentationAudience {\n // Memoize the audience functions as they are somewhat expensive and the result shouldn't change\n const sortedAudiences = React.useMemo(() => {\n if (!audiences?.length || !presentationAudiences || !AudienceHelper.shouldShowAudiences(presentationAudiences))\n return null;\n\n return AudienceHelper.getSortedPresentationAudiences(audiences, presentationAudiences);\n }, [audiences]);\n\n const mergedAudience = React.useMemo(() => {\n if (!sortedAudiences?.length)\n return null;\n\n return AudienceHelper.getMergedPresentationAudienceString(sortedAudiences);\n }, [sortedAudiences]);\n\n return mergedAudience;\n}","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nconst HAS_NUMBER_REGEX = /\\d/;\nconst COUNT_OFFSET = 1;\n\nexport const AudienceStringBuilders = {\n /**\n * Handles audience sets like:\n * - Year 7, Year 8, etc\n * - Kindergarten, Grade 1, Grade 2, etc\n */\n yearsAndGradesBuilder(audiences: PresentationAudience[]): string {\n /**\n * Create a string with all of the audiences\n */\n const combinedNames = audiences.map(a => a.name).join(' ');\n\n /**\n * Extract all the numbers and matches from the string\n */\n const numberList = combinedNames.split(' ').filter(name => !isNaN(+name)).map(num => +num) || [];\n const wordList = combinedNames.split(' ').filter(name => isNaN(+name)) || [];\n\n // Find an audience that doesn't have a number, like \"Kindergarten\" or \"Foundation\".\n const audienceWithoutNum = audiences.find(p => {\n return !HAS_NUMBER_REGEX.test(p.name);\n });\n\n // Get audience label prefix\n let prefix = wordList.find(name => name !== audienceWithoutNum?.name);\n\n // Pluralise the prefix is there are multiple audiences\n if (audiences.length > 1)\n prefix += 's';\n\n if (audienceWithoutNum && numberList.length)\n return `${prefix} ${audienceWithoutNum.name.charAt(0)} - ${numberList.pop()}`;\n\n /**\n * Build set of logical audience ranges\n */\n const audienceRange = processAudienceRanges(numberList);\n\n return `${prefix} ${audienceRange.join(', ')}`;\n },\n\n internationalSecondaryBuilder(audiences: PresentationAudience[]): string {\n return AudienceStringBuilders.englandSecondaryBuilder(audiences);\n },\n\n scotlandPrimaryBuilder(audiences: PresentationAudience[]): string {\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n let [firstAudienceLevel] = firstAudience.name.split(' ');\n let [lastAudienceLevel] = lastAudience.name.split(' ');\n\n if (firstAudienceLevel === 'First')\n firstAudienceLevel = '1st';\n\n if (lastAudienceLevel === 'First')\n lastAudienceLevel = '1st';\n\n if (firstAudienceLevel === 'Second')\n firstAudienceLevel = '2nd';\n\n if (lastAudienceLevel === 'Second')\n lastAudienceLevel = '2nd';\n\n if (firstAudienceLevel === lastAudienceLevel)\n return `${firstAudienceLevel} Level`;\n\n return `${firstAudienceLevel} - ${lastAudienceLevel} Level`;\n },\n\n internationalPrimaryBuilder(audiences: PresentationAudience[]): string {\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n if (firstAudience.name === lastAudience.name)\n return firstAudience.name;\n\n let [firstAudienceLevel] = firstAudience.name.split(' ');\n let [lastAudienceLevel] = lastAudience.name.split(' ');\n\n if (firstAudienceLevel === 'Lower')\n firstAudienceLevel = 'Low';\n\n if (lastAudienceLevel === 'Lower')\n lastAudienceLevel = 'Low';\n\n if (firstAudienceLevel === 'Middle')\n firstAudienceLevel = 'Mid';\n\n if (lastAudienceLevel === 'Middle')\n lastAudienceLevel = 'Mid';\n\n return `${firstAudienceLevel} - ${lastAudienceLevel} Pri`;\n },\n\n /**\n * Handles the english secondary audiences, which can be: Lower Secondary, Upper Secondary, and Advanced\n */\n englandSecondaryBuilder(audiences: PresentationAudience[]): string {\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n if (firstAudience.name === lastAudience.name)\n return firstAudience.name;\n\n if (lastAudience.name === 'Advanced') {\n const [level] = firstAudience.name.split(' ');\n\n if (level.toLowerCase() === 'lower')\n return 'Lower Sec - Adv';\n\n return 'Upper Sec - Adv';\n }\n\n return 'Lower - Upper Sec';\n },\n\n scotlandSecondaryBuilder(audiences: PresentationAudience[]): string {\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n if (firstAudience.name === lastAudience.name)\n return firstAudience.name;\n\n if (lastAudience.name === 'Senior Phase')\n return `${firstAudience.name} - Senior`;\n\n return 'Third - Fourth Level';\n },\n\n /**\n * Handles the audience set: Reception, Key Stage 1, Lower Key Stage 2, and Upper Key Stage 2\n */\n englandPrimaryBuilder(audiences: PresentationAudience[]): string {\n // The first and last audience will build out the range\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n // The first word in the strings will either be \"Upper\", \"Lower\", \"Key\", or \"Reception\"\n const firstAudienceFirstWord = ArrayHelper.first(firstAudience.name.split(' '));\n const lastAudienceFirstWord = ArrayHelper.first(lastAudience.name.split(' '));\n\n // Each audience in this set except for \"Reception\" has a number. Get the numbers for the first and last audiences\n const firstAudienceNumber = firstAudience.name.split(' ').find(word => !isNaN(+word));\n const lastAudienceNumber = lastAudience.name.split(' ').find(word => !isNaN(+word));\n\n // If there's only one audience on the video:\n if (firstAudience === lastAudience) {\n // For these 2 audiences, return the full name as it's short enough already\n if (firstAudienceFirstWord === 'Key' || firstAudienceFirstWord === 'Reception')\n return firstAudience.name;\n\n // For the Upper/Lower key stage audiences, abbreviate the \"key stage\" part to KS1/KS2\n return `${firstAudienceFirstWord} KS${firstAudienceNumber}`;\n }\n\n /**\n * Handle when the object has >1 audience\n */\n\n let firstAudienceString = '';\n let lastAudienceString = '';\n\n // Reception is always shortened to \"R\" when in a range\n if (firstAudienceFirstWord === 'Reception') {\n firstAudienceString = 'R';\n } else {\n // All other audiences will be abbreviated to \"KS1/KS2\"\n firstAudienceString = `KS${firstAudienceNumber}`;\n }\n\n // The last audience will always be a key stage, so abbreviate this too\n lastAudienceString = `KS${lastAudienceNumber}`;\n\n // If the audience range contains both the \"Lower\" and \"Upper\" audiences, abbreviate those and return\n if (firstAudienceFirstWord === 'Lower' && lastAudienceFirstWord === 'Upper') {\n return `L ${firstAudienceString} - U ${lastAudienceString}`;\n }\n\n // Add \"Lower\" and \"Upper\" to the strings if it's needed\n if (firstAudienceFirstWord === 'Lower') {\n firstAudienceString = `Lower ${firstAudienceString}`;\n }\n\n if (lastAudienceFirstWord === 'Upper') {\n lastAudienceString = `Upper ${lastAudienceString}`;\n }\n\n // This handles a case where the range is Reception - Key Stage 1. In which case we don't abbreviate the key stage part to KS1.\n if (lastAudienceFirstWord === 'Key') {\n lastAudienceString = lastAudience.name;\n }\n\n return `${firstAudienceString} - ${lastAudienceString}`;\n }\n};\n\nfunction processAudienceRanges(audienceValues: number[]): string[] {\n /**\n * Lookahead by increments of offset\n */\n const offset = COUNT_OFFSET;\n\n let initialVal; let nextVal;\n let isContinguous: boolean = false;\n\n const ranges: string[] = [];\n\n // Audience values need to be in ascending order\n audienceValues = audienceValues.sort((a, b) => a - b);\n\n let i; let j;\n\n for (i = 0; i < audienceValues.length; i++) {\n j = i + 1;\n\n // Set our lower boundary to compare against\n if (!isContinguous)\n initialVal = audienceValues[i];\n\n nextVal = audienceValues[j];\n\n /**\n * Where the next number is also the next incremental value\n * we're going to continue iterating until the next value\n * is no longer contiguos.\n */\n if (audienceValues[i] + offset === nextVal) {\n isContinguous = true;\n } else if (isContinguous) {\n /**\n * Where we were tracking a contiguous set, format appropriately \n * and store the vals\n */\n\n ranges.push(`${initialVal} - ${audienceValues[i]}`);\n isContinguous = false;\n } else {\n /**\n * Where the values arent contiguous, just store the current value\n */\n\n ranges.push(`${audienceValues[i]}`);\n isContinguous = false;\n }\n }\n\n return ranges;\n}","import { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { HardCoded } from 'libs/shared/constants/HardCoded';\nimport { Audience, BaseObject, PresentationAudience } from 'libs/shared/interfaces';\n\nimport { AudienceStringBuilders } from './AudienceStringBuilders';\n\nconst DIGIT_REGEX = /([0-9]+)/ig;\nconst SPACE_REGEX = /\\s|\\+/ig;\n\n/**\n * Where there is 1 or less audiences on a presentation, it provides little value to\n * the user's experience, so we'll hide audiences altogether.\n */\nconst MIN_AUDIENCE_THRESHOLD = 1;\n\nexport const AudienceHelper = {\n /**\n * This is needed to sort an object's audiences, as they are not sorted by the backend.\n * To do this, we take the presentation audiences (sorted) and filter them by the object's\n * audiences, leaving behind a sorted array of object audiences.\n */\n getSortedPresentationAudiences(\n objectAudiences: Audience[],\n presentationAudiences: PresentationAudience[]\n ): PresentationAudience[] {\n /**\n * Atm there is a bug in flight's optimize, around multiple parts of the page \n * fetching the same object with a different response. We are filtering out\n * falsey values in our object audience ids until that's fixed. - Sha\n */\n const objectAudienceIds = objectAudiences\n .filter(v => !!v)\n .map(audience => audience.id.toString());\n\n /**\n * Remove audiences that aren't relevant for the user's current presentation\n */\n const filteredAudiences = presentationAudiences.filter(presAudience => {\n return objectAudienceIds.includes(presAudience.masterId.toString());\n });\n\n return filteredAudiences;\n },\n\n /**\n * This function accepts a set of presentation audiences, and returns a single\n * audience where the name is a merged string of the names of all of the audiences passed in.\n *\n * As we add more presentations that have different audience sets, we'll need to extend the `switch`\n * statement below to either include new string builder functions, or to include new presentation IDs\n * for existing string builder functions.\n */\n getMergedPresentationAudienceString(presentationAudiences: PresentationAudience[]): PresentationAudience {\n const { presentationId } = ArrayHelper.first(presentationAudiences);\n\n let mergedAudienceString = '';\n\n switch (+presentationId) {\n // Generic `Name Number`. Sometimes has just name. Examples: Year 12, Grade 4, Kindergarten\n case HardCoded.PresentationIds.DEFAULT:\n case HardCoded.PresentationIds.AU_SECONDARY:\n case HardCoded.PresentationIds.US_ELEMENTARY:\n case HardCoded.PresentationIds.AU_PRIMARY:\n case HardCoded.PresentationIds.STREAMABLE_LEARNING:\n if (presentationAudiences.length === 1)\n return presentationAudiences[0];\n\n mergedAudienceString = AudienceStringBuilders.yearsAndGradesBuilder(presentationAudiences);\n break;\n\n case HardCoded.PresentationIds.INTERNATIONAL_SECONDARY:\n if (presentationAudiences.length === 1)\n return presentationAudiences[0];\n\n // TODO: Implement this properly\n mergedAudienceString = AudienceStringBuilders.internationalSecondaryBuilder(presentationAudiences);\n break;\n\n case HardCoded.PresentationIds.INTERNATIONAL_PRIMARY:\n mergedAudienceString = AudienceStringBuilders.internationalPrimaryBuilder(presentationAudiences);\n break;\n\n case HardCoded.PresentationIds.SCOTLAND_PRIMARY:\n mergedAudienceString = AudienceStringBuilders.scotlandPrimaryBuilder(presentationAudiences);\n break;\n\n case HardCoded.PresentationIds.ENGLISH_SECONDARY:\n mergedAudienceString = AudienceStringBuilders.englandSecondaryBuilder(presentationAudiences);\n break;\n\n \n case HardCoded.PresentationIds.SCOTLAND_SECONDARY:\n mergedAudienceString = AudienceStringBuilders.scotlandSecondaryBuilder(presentationAudiences);\n break;\n\n // Key Stage 1, Lower Key Stage 2, etc.\n case HardCoded.PresentationIds.ENGLAND_PRIMARY:\n mergedAudienceString = AudienceStringBuilders.englandPrimaryBuilder(presentationAudiences);\n break;\n\n // These presentations only have 1 audience mapped. These are never shown as badges in the product.\n case HardCoded.PresentationIds.US_MIDDLE:\n case HardCoded.PresentationIds.US_HIGH:\n default:\n break;\n }\n\n if (!mergedAudienceString)\n return null;\n\n return { name: mergedAudienceString } as PresentationAudience;\n },\n\n /**\n * This function assumes the members array passed in is ordered by `name`.\n */\n sortMembersWithDuplicateNamesByAudience(members: BaseObject[]): BaseObject[] {\n // Returns the lowest level audience out of an array of audience objects by looking at the name\n const getLowestAudience = (audiences: Audience[]) => {\n if (!audiences.length)\n return null;\n\n let lowestAudience: Audience;\n let lowestAudienceDigit: number;\n\n audiences.forEach(audience => {\n const digit = +ArrayHelper.first(audience.name.match(DIGIT_REGEX));\n\n if (!lowestAudience) {\n lowestAudience = audience;\n lowestAudienceDigit = digit;\n return;\n }\n\n if (digit < lowestAudienceDigit)\n lowestAudience = audience;\n });\n\n return lowestAudience;\n };\n\n // This is used to track how many times a member's name appears in the collection\n const nameCountMap: HashObject<number> = {};\n\n let sorted: BaseObject[] = [];\n\n members.forEach(member => {\n if (!nameCountMap[member.name]) {\n nameCountMap[member.name] = 1;\n sorted.push(member);\n return;\n }\n\n sorted.push(member);\n nameCountMap[member.name]++;\n\n // Take the slice of duplicates that we want to sort by audience\n const slice = sorted.splice(sorted.length - nameCountMap[member.name]);\n\n // Sort the slice by lowest audience\n const sortedSlice = slice.sort((a: any, b: any) => {\n const firstObjLowestAudience = getLowestAudience(a.subjectPresentationAudiences.data);\n const secondObjLowestAudience = getLowestAudience(b.subjectPresentationAudiences.data);\n\n if (!firstObjLowestAudience && secondObjLowestAudience)\n return 1;\n\n if (!secondObjLowestAudience)\n return -1;\n\n const comparison = firstObjLowestAudience.name.localeCompare(secondObjLowestAudience.name);\n\n if (comparison === 0) return comparison;\n\n return comparison > 0 ? -1 : 1;\n });\n\n sorted = sorted.concat(sortedSlice);\n });\n\n return sorted;\n },\n\n getActiveAudiencesFromParams(audiences: PresentationAudience[], params: HashObject = {}): PresentationAudience[] {\n if (!ObjectHelper.isObject(params) || ObjectHelper.isEmpty(params))\n return;\n\n if (!audiences || !audiences.length)\n return;\n\n if (!AudienceHelper.shouldShowAudiences(audiences))\n return;\n\n // 'a' is shorthand for audience\n let { a } = params;\n\n if (!a)\n return;\n\n // Only a single query param was passed, we'll wrap it in an array\n if (typeof a === 'string')\n a = [a];\n\n const normalizeAudienceName = (audienceName: string) => {\n return audienceName.replace(SPACE_REGEX, '').toLowerCase();\n };\n\n // Build an audience lookup\n const audienceLookup = a.reduce((state: HashObject, audienceStr: string) => {\n state[normalizeAudienceName(audienceStr)] = audienceStr;\n return state;\n }, {});\n\n // Filter out our active audience based on whether their name matches the lookup object\n return audiences.filter((audience: PresentationAudience) => {\n return audienceLookup[normalizeAudienceName(audience.name)];\n });\n },\n\n getAudienceParams(audiences: PresentationAudience[]): HashObject {\n if (!audiences?.length)\n return null;\n\n return { a: audiences.map(a => a.name) };\n },\n\n shouldShowAudiences(audiences: PresentationAudience[] = []): boolean {\n if (!audiences)\n return false;\n\n return audiences.length > MIN_AUDIENCE_THRESHOLD;\n }\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"annotation\":\"LkdHB\",\"above\":\"ROdbm\",\"below\":\"OzyHx\",\"left\":\"W9EBF\",\"right\":\"zhio2\",\"divider\":\"cdR_p\",\"imageContainer\":\"QZZMF\"};","import React from 'react';\n\nimport styles from './left-panel-item.scss';\n\ninterface LeftPanelItemProps {\n contentPosition?: 'center' | 'right';\n annotationUrl?: string;\n annotationPosition?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n annotationClassName?: string;\n}\n\nLeftPanelItem.defaultProps = {\n contentPosition: 'center'\n};\n\nexport function LeftPanelItem(props: React.PropsWithChildren<LeftPanelItemProps>): JSX.Element {\n function getAnnotationClassName(): string {\n let className = styles.annotation;\n\n switch (props.annotationPosition) {\n case 'top-left': {\n className += ` ${styles.above} ${styles.left}`;\n break;\n }\n\n case 'top-right': {\n className += ` ${styles.above} ${styles.right}`;\n break;\n }\n\n case 'bottom-left': {\n className += ` ${styles.below} ${styles.left}`;\n break;\n }\n\n case 'bottom-right': {\n className += ` ${styles.below} ${styles.right}`;\n break;\n }\n }\n\n if (props.annotationClassName)\n className += ` ${props.annotationClassName}`;\n\n return className;\n }\n\n function getContainerClassName(): string {\n let className = `d-flex align-items-center text-center position-relative w-100 ${styles.imageContainer}`;\n\n if (props.contentPosition === 'center')\n className += ' px-5 justify-content-center';\n\n if (props.contentPosition === 'right')\n className += ' me-n5 justify-content-end';\n\n return className;\n }\n\n return (\n <div className={getContainerClassName()}>\n {!!props.annotationUrl && (\n <div className={getAnnotationClassName()}>\n <img className={`img-fluid`} src={props.annotationUrl} />\n </div>\n )}\n\n {props.children}\n {props.contentPosition === 'right' && (\n <div className={styles.divider} />\n )}\n </div>\n );\n}","import React from 'react';\n\ninterface OnboardingLoaderContainerProps {\n variant: 'blue' | 'dark-blue'\n}\n\nexport function OnboardingLoaderContainer(props: React.PropsWithChildren<OnboardingLoaderContainerProps>): JSX.Element {\n return (\n <div className={`w-100 h-100 position-fixed bg-${props.variant}`}>\n {props.children}\n </div>\n );\n}","function mobile(index: number): React.CSSProperties {\n const indexPositionId = index % 10;\n\n const styles: React.CSSProperties = { top: `${index * 4}%` };\n\n /**\n * This is pretty much random to make the loader look nicer.\n */\n switch (indexPositionId) {\n case 0: {\n styles.left = '12.5%';\n styles.animationDelay = '0.5s';\n return styles;\n }\n\n case 1: {\n styles.right = '7.5%';\n styles.animationDelay = '1s';\n return styles;\n }\n\n case 2: {\n styles.left = '10%';\n return styles;\n }\n\n case 3: {\n styles.right = '2.5%';\n styles.animationDelay = '0.5s';\n return styles;\n }\n\n case 4: {\n styles.left = '2.5%';\n styles.animationDelay = '1.5s';\n return styles;\n }\n\n case 5: {\n styles.right = '10%';\n return styles;\n }\n\n case 6: {\n styles.left = '12.5%';\n styles.animationDelay = '1.5s';\n return styles;\n }\n\n case 7: {\n styles.right = '7.5%';\n styles.animationDelay = '0.5s';\n return styles;\n }\n\n case 8: {\n styles.left = '5%';\n styles.animationDelay = '1s';\n return styles;\n }\n\n case 9: {\n styles.right = '2.5%';\n styles.animationDelay = '1s';\n return styles;\n }\n\n default: {\n styles.left = '10%';\n styles.animationDelay = '1.5s';\n return styles;\n }\n }\n}\n\nfunction halfScreen(index: number): React.CSSProperties {\n const indexPositionId = index % 10;\n\n const styles: React.CSSProperties = { top: `${index * 4}%` };\n\n /**\n * This is pretty much random to make the loader look nicer.\n */\n switch (indexPositionId) {\n case 0: {\n styles.left = '25%';\n styles.animationDelay = '0.5s';\n return styles;\n }\n\n case 1: {\n styles.right = '15%';\n styles.animationDelay = '1s';\n return styles;\n }\n\n case 2: {\n styles.left = '20%';\n return styles;\n }\n\n case 3: {\n styles.right = '5%';\n styles.animationDelay = '0.5s';\n return styles;\n }\n\n case 4: {\n styles.left = '5%';\n styles.animationDelay = '1.5s';\n return styles;\n }\n\n case 5: {\n styles.right = '20%';\n return styles;\n }\n\n case 6: {\n styles.left = '25%';\n styles.animationDelay = '1.5s';\n return styles;\n }\n\n case 7: {\n styles.right = '15%';\n styles.animationDelay = '0.5s';\n return styles;\n }\n\n case 8: {\n styles.left = '10%';\n styles.animationDelay = '1s';\n return styles;\n }\n\n case 9: {\n styles.right = '5%';\n styles.animationDelay = '1s';\n return styles;\n }\n\n default: {\n styles.left = '20%';\n styles.animationDelay = '1.5s';\n return styles;\n }\n }\n}\n\nfunction fullScreen(index: number): React.CSSProperties {\n const indexPositionId = index % 10;\n\n const styles: React.CSSProperties = { top: `${index * 4}%` };\n\n /**\n * This is pretty much random to make the loader look nicer.\n */\n switch (indexPositionId) {\n case 0: {\n styles.left = '25%';\n styles.animationDelay = '0.5s';\n return styles;\n }\n\n case 1: {\n styles.right = '30%';\n styles.animationDelay = '1s';\n return styles;\n }\n\n case 2: {\n styles.left = '40%';\n return styles;\n }\n\n case 3: {\n styles.right = '10%';\n styles.animationDelay = '0.5s';\n return styles;\n }\n\n case 4: {\n styles.left = '10%';\n styles.animationDelay = '1.5s';\n return styles;\n }\n\n case 5: {\n styles.right = '40%';\n return styles;\n }\n\n case 6: {\n styles.left = '30%';\n styles.animationDelay = '1.5s';\n return styles;\n }\n\n case 7: {\n styles.right = '30%';\n styles.animationDelay = '0.5s';\n return styles;\n }\n\n case 8: {\n styles.left = '10%';\n styles.animationDelay = '1s';\n return styles;\n }\n\n case 9: {\n styles.right = '10%';\n styles.animationDelay = '1s';\n return styles;\n }\n\n default: {\n styles.left = '40%';\n styles.animationDelay = '1.5s';\n return styles;\n }\n }\n}\n\n// 2 columns means the images are more off to the sides\n// 3 columns means they approach the center more\nexport function getOnboardingLoaderVideoStyles(index: number, screenSize: '50%' | '100%' | 'mobile'): React.CSSProperties {\n if (screenSize === 'mobile')\n return mobile(index);\n\n if (screenSize === '50%')\n return halfScreen(index);\n\n return fullScreen(index);\n}","import React from 'react';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { HardCoded } from 'libs/shared/constants/HardCoded';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\n\nimport { getOnboardingLoaderVideoStyles } from 'apps/onboarding/components/loaders/videos-loader/getOnboardingLoaderVideos';\n\nimport styles from './videos-loader.scss';\n\ninterface OnboardingVideosLoaderProps {\n screenSize: '50%' | '100%';\n variant: 'dark-blue' | 'blue';\n hideThumbnailMask?: boolean;\n}\n\nexport const OnboardingVideosLoader = React.memo((props: OnboardingVideosLoaderProps) => {\n const thumbnails = ArrayHelper.shuffle(HardCoded.Onboarding.LOADING_THUMBNAILS);\n\n const breakpoints = useBreakpoints();\n\n function getScreenSize(): 'mobile' | OnboardingVideosLoaderProps['screenSize'] {\n if (breakpoints.xs) {\n return 'mobile';\n }\n\n return props.screenSize;\n }\n\n return (\n <div className={`${styles.loading} ${props.screenSize === '50%' ? 'w-50' : 'w-100'}`}>\n {thumbnails.map((thumbnail, index) => {\n return (\n <div\n key={index}\n className={`${styles.loadingImageContainer} position-absolute rounded-3 overflow-hidden`}\n style={getOnboardingLoaderVideoStyles(index, getScreenSize())}\n >\n {!props.hideThumbnailMask && (\n <div className={`${styles.loadingImageMask} ${props.variant === 'blue' ? styles.blue : styles.darkBlue}`} />\n )}\n <img className='img-fluid' src={ImageHelper.createUrl(thumbnail, { size: ImageSize.Small })} />\n </div>\n );\n })}\n </div>\n );\n});","// extracted by mini-css-extract-plugin\nexport default {\"loadingImageContainer\":\"ZlA2t\",\"fadeIn\":\"YmTa1\",\"loadingImageMask\":\"jNop3\",\"darkBlue\":\"YNfFq\",\"blue\":\"jVOWE\",\"loading\":\"n2Qe4\",\"loader\":\"BqV36\"};","// extracted by mini-css-extract-plugin\nexport default {\"dot\":\"AlRQD\",\"logo\":\"L42gR\",\"blackBar\":\"ESCxm\",\"topNav\":\"a3G_4\",\"leftNav\":\"YxGVV\",\"belowHeader\":\"jc_cg\",\"leftNavIcon\":\"U6i6r\",\"leftNavText\":\"LnYlW\",\"presentationPlaceholderIcon\":\"Ljaju\",\"presentationIcon\":\"QdwPq\",\"presentationPlaceholderText\":\"af06V\",\"curriculumIcon\":\"N7T4T\",\"curriculumIconSmall\":\"_6xrUg\",\"curriculumContainer\":\"Z65qX\",\"iconPlaceholder\":\"CKOXL\",\"shadow\":\"zygeJ\",\"presentationName\":\"Oj7Dt\"};","import React from 'react';\n\nimport { IconCircle } from 'libs/shared/components/icon-circle/IconCircle';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { ClickViewLogo, ClickViewPrimaryLogo } from 'libs/shared/components/svgs/clickview-logo/ClickViewLogo';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PresentationLearningLevel } from 'libs/shared/enums/PresentationLearningLevel';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Presentation } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\n\nimport styles from './mock-layout.scss';\n\nconst namespace = 'onboarding.mockLayout';\n\nfunction LeftNavItem(): JSX.Element {\n return (\n <div className='d-flex align-items-center justify-content-center mb-2 px-3'>\n <div className={`${styles.leftNavIcon} rounded-circle`} />\n <div className={`${styles.leftNavText} rounded-pill`} />\n </div>\n );\n}\n\ninterface MockLayoutProps {\n editingCurriculum?: boolean;\n curriculum?: Presentation;\n presentation?: Presentation;\n}\n\nexport function MockLayout(props: React.PropsWithChildren<MockLayoutProps>): JSX.Element {\n const breakpoints = useBreakpoints();\n \n function getPresentationClass(): string {\n if (!props.presentation)\n return styles.presentationPlaceholderIcon;\n\n switch (TopicsHelper.getMappedPresentationLevel(props.presentation.learningLevel)) {\n case PresentationLearningLevel.Level_1:\n return `bg-indigo ${styles.presentationIcon}`;\n\n case PresentationLearningLevel.Level_3:\n return `bg-blue ${styles.presentationIcon}`;\n\n default:\n case PresentationLearningLevel.Level_2:\n return `bg-green ${styles.presentationIcon}`;\n }\n }\n\n return (\n <div className={`border border-dark border-2 bg-white rounded-3 user-select-none overflow-hidden position-relative h-100 w-100`}>\n {!!props.editingCurriculum && (\n <div className={`w-100 h-100 position-absolute ${styles.shadow}`}>\n <div className={`d-flex align-items-center h-100 w-50 ${styles.curriculumContainer}`}>\n <div className='bg-white rounded-3 border p-3 w-100'>\n <h2 className='h6 text-start'><Text namespace={namespace} phrase='curriculum' /></h2>\n\n {props.curriculum ? (\n <div className='d-flex align-items-center'>\n <div className={`${styles.curriculumIcon} rounded-circle me-2 border`}>\n <IconCircle imageUrl={props.curriculum.cover?.url} />\n </div>\n <div className='text-start'>{props.curriculum.name}</div>\n </div>\n ) : (\n <div className='d-flex align-items-center text-secondary'>\n <div className={`me-2 rounded-circle p-1 ${styles.iconPlaceholder}`}>\n <IconCircle svgSize={SvgContainerSize.Large} textVariant='secondary' svgName={cvSvgLibrary.GraduationCap} />\n </div>\n <Text namespace={namespace} phrase='selectCurriculum' />\n </div>\n )}\n </div>\n </div>\n </div>\n )}\n\n {/* Black bar */}\n <div className={`bg-dark d-flex px-3 py-2 ${styles.blackBar}`}>\n <div className={`rounded-circle me-2 ${styles.dot}`} />\n <div className={`rounded-circle me-2 ${styles.dot}`} />\n <div className={`rounded-circle ${styles.dot}`} />\n </div>\n\n {/* Header */}\n <div className={`border-bottom px-3 py-2 d-flex align-items-center ${styles.topNav}`}>\n <div className={`${styles.logo} me-4`}>\n {breakpoints.xs ? (\n <ClickViewPrimaryLogo />\n ) : (\n <ClickViewLogo />\n )}\n </div>\n <div className='form-control w-75 d-flex justify-content-start'>\n <SvgContainer svgName={cvSvgLibrary.Search} />\n </div>\n {!!props.curriculum && (\n <div className={`${styles.curriculumIconSmall} rounded-circle ms-2 me-n1 border`}>\n <IconCircle imageUrl={props.curriculum.cover?.url} />\n </div>\n )}\n </div>\n\n <div className={`d-flex ${styles.belowHeader}`}>\n {/* Left nav */}\n <div className={`${styles.leftNav} border-end`}>\n <div className='d-flex flex-column pt-3 h-100'>\n <LeftNavItem />\n <LeftNavItem />\n <LeftNavItem />\n <LeftNavItem />\n <LeftNavItem />\n\n {/* Presentation */}\n <div className='d-flex align-items-end h-100 w-100'>\n <div className='border-top p-3 w-100'>\n <div className='d-flex align-items-center'>\n <div className={`${getPresentationClass()} text-white rounded`}>\n <SvgContainer svgName={cvSvgLibrary.School} size={SvgContainerSize.Large} />\n </div>\n\n {!props.presentation ? (\n <div className={`${styles.presentationPlaceholderText} fw-semibold`}>\n <Text namespace={namespace} phrase='schoolLevel' />\n </div>\n ) : (\n <span className={`fw-semibold text-truncate ${styles.presentationName}`}>{props.presentation.name}</span>\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Main content */}\n <div className={`w-100 h-100 overflow-hidden`}>\n {props.children}\n </div>\n </div>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"banner\":\"CQxNy\",\"title\":\"NzV5V\",\"description1\":\"kjCZi\",\"description2\":\"cBeyJ\",\"placeholder\":\"Ks_Tl\",\"playlistName\":\"eFPqz\",\"thumbnailCol\":\"dgCQ7\",\"videoInfoCol\":\"pzfE2\"};","import React from 'react';\n\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { Presentation, Video } from 'libs/shared/interfaces';\n\nimport { MockLayout } from 'apps/onboarding/components/mock-views/layout/MockLayout';\n\nimport styles from './mock-playlist.scss';\n\ninterface VideoPlaceholderProps {\n video?: Video;\n}\n\nfunction VideoPlaceholder(props: VideoPlaceholderProps): JSX.Element {\n return (\n <li className='row mb-2'>\n <div className={`col-lg-4 col-5 ${styles.thumbnailCol}`}>\n {props.video ? (\n <VideoThumbnail video={props.video} type='cosmetic' hideDuration imageOptions={{ size: ImageSize.Medium }} />\n ) : (\n <ImageFallback type={ImageFallbackType.Video} extraClasses={`position-relative rounded-3 ${styles.placeholder}`} />\n )}\n </div>\n\n <div className={`col-lg-8 col-7 ${styles.videoInfoCol}`}>\n <div className={`${styles.title} rounded-pill bg-grey mb-1`} />\n <div className={`${styles.description1} rounded-pill bg-grey mb-1`} />\n <div className={`${styles.description2} rounded-pill bg-grey mb-1`} />\n </div>\n </li>\n );\n}\n\ninterface MockPlaylistProps {\n name?: string;\n presentation?: Presentation;\n curriculum?: Presentation;\n videos: Video[];\n hidePlaceholders?: boolean;\n}\n\nexport function MockPlaylist(props: MockPlaylistProps): JSX.Element {\n const placeholderVideos = props.hidePlaceholders ? 0 : Math.max(6 - (props.videos?.length ?? 0), 0);\n\n return (\n <MockLayout presentation={props.presentation} curriculum={props.curriculum}>\n {/* Banner */}\n <div className={`bg-teal ${styles.banner} position-relative`}>\n {props.name && (\n <div className={`h5 text-white mb-0 ${styles.playlistName}`}>{props.name}</div>\n )}\n </div>\n\n {/* Videos */}\n <ul className='list-unstyled mb-0 w-100 p-2'>\n {props.videos?.map(video => {\n return (\n <VideoPlaceholder key={video.id} video={video} />\n );\n })}\n {new Array(placeholderVideos).fill(0).map((_, index) => {\n return (\n <VideoPlaceholder key={index} />\n );\n })}\n </ul>\n </MockLayout>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"selected\":\"ZG5MR\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { CheckMarkButton, CheckMarkStatus } from 'libs/shared/components/check-mark-button/CheckMarkButton';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { PresentationAudience, Video } from 'libs/shared/interfaces';\n\nimport { OnboardingClassificationVideosGrouping } from 'apps/onboarding/hooks/useGetSuggestedVideos';\nimport { ONBOARDING_MAX_VIDEOS } from 'apps/onboarding/views/select-videos/OnboardingSelectVideosView';\n\nimport styles from './classification-videos.scss';\n\nconst namespace = 'onboarding.classificationVideos';\n\ninterface VideoItemProps {\n video: Video;\n onSelectVideo: (video: Video) => void;\n audiences: PresentationAudience[];\n isSelected: boolean;\n disabled?: boolean;\n}\n\nfunction VideoItem(props: VideoItemProps): JSX.Element {\n const audience = useMergeAudiences(props.video.subjectPresentationAudiences?.data, props.audiences);\n\n let className = 'border border-2 rounded-3 overflow-hidden';\n\n if (props.isSelected)\n className += ' border-success';\n else\n className += ' border-transparent';\n\n return (\n <DivButton\n onClick={() => props.onSelectVideo(props.video)}\n disabled={props.disabled}\n >\n <VideoThumbnail\n type='cosmetic'\n video={props.video}\n imageOptions={{ size: ImageSize.Medium }}\n audience={audience}\n checkMarkStatus={props.isSelected ? CheckMarkStatus.Complete : CheckMarkStatus.Incomplete}\n setCheckMarkStatus={!props.disabled ? () => {\n props.onSelectVideo(props.video);\n return Promise.resolve();\n } : null}\n extraClasses={className}\n imageClassName={props.isSelected ? `${styles.selected}` : ''}\n hideDuration\n />\n </DivButton>\n );\n}\n\ninterface OnboardingClassificationVideosProps {\n classificationVideosGrouping: OnboardingClassificationVideosGrouping[];\n onSelectVideo: (video: Video, classificationId: string, classificationName: string) => void;\n onSelectAll: (classificationGrouping: OnboardingClassificationVideosGrouping) => void;\n onDeselectAll: (classificationGrouping: OnboardingClassificationVideosGrouping) => void;\n audiences: PresentationAudience[];\n isSelected: (videoId: string) => boolean;\n totalSelected: number;\n}\n\nexport function OnboardingClassificationVideos(props: OnboardingClassificationVideosProps): JSX.Element {\n function onSelectAll(\n shouldSelect: boolean,\n classification: OnboardingClassificationVideosGrouping\n ): Promise<void> {\n if (shouldSelect) {\n props.onSelectAll(classification);\n } else {\n props.onDeselectAll(classification);\n }\n\n return Promise.resolve();\n }\n\n const isAtLimit = props.totalSelected >= ONBOARDING_MAX_VIDEOS;\n\n return (\n <ul className='list-unstyled'>\n {props.classificationVideosGrouping.map(classification => {\n const selectedVideos = classification.videos.filter(video => props.isSelected(video.id));\n const allSelected = selectedVideos.length === classification.videos.length;\n\n const disabled = (\n !allSelected &&\n (props.totalSelected + classification.videos.length - selectedVideos.length) > ONBOARDING_MAX_VIDEOS\n );\n\n return (\n <li key={classification.classificationId} className='pb-3'>\n <div className='d-flex justify-content-between align-items-center mb-2'>\n <h2 className='h5 mb-1 align-self-end'>{classification.classificationName}</h2>\n\n <Tooltip\n title={disabled\n ? LanguageService.getPhrase(namespace, 'maxVideos', { limit: ONBOARDING_MAX_VIDEOS })\n : ''\n }\n spanHack\n spanHackClassName=''\n >\n <div className='d-flex align-items-center'>\n <DivButton\n disabled={disabled}\n onClick={() => onSelectAll(!allSelected, classification)}\n className={`me-2 text-nowrap ${disabled ? 'text-secondary' : ''}`}\n >\n <Text namespace={namespace} phrase='selectAll' />\n </DivButton>\n <CheckMarkButton\n status={allSelected ? CheckMarkStatus.Complete : CheckMarkStatus.Incomplete}\n setStatus={status => onSelectAll(status === CheckMarkStatus.Complete, classification)}\n style='outline'\n disabled={disabled}\n />\n </div>\n </Tooltip>\n </div>\n\n <ul className='row list-unstyled g-2'>\n {classification.videos.map(video => {\n const isSelected = props.isSelected(video.id);\n const disabled = isAtLimit && !isSelected;\n\n return (\n <li key={video.id} className='col-sm-6 col-md-4 col-lg-6 col-xl-6'>\n <Tooltip\n title={disabled\n ? LanguageService.getPhrase(namespace, 'maxVideos', { limit: ONBOARDING_MAX_VIDEOS })\n : ''\n }\n spanHack\n spanHackClassName=''\n >\n <VideoItem\n video={video}\n onSelectVideo={vid => {\n return props.onSelectVideo(\n vid,\n classification.classificationId,\n classification.classificationName\n );\n }}\n audiences={props.audiences}\n isSelected={props.isSelected(video.id)}\n disabled={disabled}\n />\n </Tooltip>\n </li>\n );\n })}\n </ul>\n </li>\n );\n })}\n </ul>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"loaderText\":\"pg4Oj\",\"annotation\":\"D3Acz\"};","import React from 'react';\n\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 { OnboardingDescriptor, UserAction } from 'libs/analytics/interfaces';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { useIsKDM } from 'libs/shared/hooks/UseIsKdm';\nimport { PresentationAudience, Video } from 'libs/shared/interfaces';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { ViewModelKeys } from 'shared/constants/LiteViewModels';\nimport { useCurriculums } from 'shared/hooks/useCurriculums';\nimport { usePresentation } from 'shared/hooks/usePresentation';\n\nimport { OnboardingClassificationVideos } from 'apps/onboarding/components/classification-videos/OnboardingClassificationVideos';\nimport { OnboardingScreenHeading } from 'apps/onboarding/components/heading/OnboardingScreenHeading';\nimport { OnboardingScreenInfo } from 'apps/onboarding/components/info/OnboardingScreenInfo';\nimport { OnboardingLayout, OnboardingRightPanelProps } from 'apps/onboarding/components/layout/OnboardingLayout';\nimport { LeftPanelItem } from 'apps/onboarding/components/left-panel-item/LeftPanelItem';\nimport { OnboardingLoaderContainer } from 'apps/onboarding/components/loaders/primitives/OnboardingLoaderContainer';\nimport { OnboardingVideosLoader } from 'apps/onboarding/components/loaders/videos-loader/OnboardingVideosLoader';\nimport { MockPlaylist } from 'apps/onboarding/components/mock-views/playlist/MockPlaylist';\nimport { OnboardingClassificationVideosGrouping, useGetSuggestedVideos } from 'apps/onboarding/hooks/useGetSuggestedVideos';\nimport { useOnboardingCallbacks } from 'apps/onboarding/hooks/useOnboardingCallbacks';\nimport { useOnboardingEventLogger } from 'apps/onboarding/hooks/useOnboardingEventLogger';\nimport { OnboardingViewProps } from 'apps/onboarding/interfaces/OnboardingViewProps';\n\nimport styles from './select-videos.scss';\n\nconst FAKE_LOADER_MIN_DURATION = 6000;\nconst MIN_VIDEOS = 3;\nexport const ONBOARDING_MAX_VIDEOS = 100;\n\nconst namespace = 'onboarding.selectVideos';\n\nexport interface SavedOnboardingVideo {\n data: Video;\n classificationId: string;\n classificationName: string;\n}\n\nexport function OnboardingSelectVideosView(props: OnboardingViewProps): JSX.Element {\n const { onClickBack, exitOnboarding, completeStepAsync, onSaveError } = useOnboardingCallbacks(props.redirectUrl);\n const { logEvent } = useOnboardingEventLogger();\n\n const [ videos, setVideos ] = useViewModel<SavedOnboardingVideo[]>(\n ViewModelKeys.ONBOARDING_VIDEOS_V2,\n [],\n { storage: StorageType.LocalStorage }\n );\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(AudienceRequests.presentationAudiences());\n const { preferredPresentation } = usePresentation();\n const { preferredCurriculum } = useCurriculums();\n\n const classificationVideosGrouping = useGetSuggestedVideos();\n\n const [ hasFakeLoaded, setHasFakeLoaded ] = React.useState(classificationVideosGrouping.hasCompleted);\n\n const breakpoints = useBreakpoints();\n \n const halfScreen = breakpoints.lg || breakpoints.xl || breakpoints.xxl;\n\n const isKdm = useIsKDM();\n\n React.useEffect(() => {\n const timeout = window.setTimeout(() => {\n setHasFakeLoaded(true);\n }, FAKE_LOADER_MIN_DURATION);\n\n return () => {\n window.clearTimeout(timeout);\n };\n }, []);\n\n function onSelectVideo(video: Video, classificationId: string, classificationName: string): void {\n logEvent(UserAction.Select, OnboardingDescriptor.SelectVideo, {\n videoId: video.id,\n videoName: video.name,\n videoSubjectId: classificationId,\n videoSubjectName: classificationName,\n presentationId: preferredPresentation.id,\n presentationName: preferredPresentation.name,\n presentationDescription: preferredPresentation.description\n });\n\n if (videos.some(v => v.data.id.toString() === video.id.toString())) {\n setVideos(videos.filter(v => v.data.id.toString() !== video.id.toString()));\n } else {\n setVideos([ ...videos, { data: video, classificationId, classificationName }]);\n }\n }\n\n /**\n * TODO: Update onboarding analytics documentation\n */\n function onSelectAll(classificationVideos: OnboardingClassificationVideosGrouping): void {\n logEvent(UserAction.Click, OnboardingDescriptor.SelectAllVideos, {\n subjectId: classificationVideos.classificationId,\n subjectName: classificationVideos.classificationName,\n videos: classificationVideos.videos.map(v => ({\n id: v.id,\n name: v.name,\n thumbnailUrl: v.thumbnail?.url,\n videoSubjectId: classificationVideos.classificationId,\n videoSubjectName: classificationVideos.classificationName\n })),\n presentationId: preferredPresentation.id,\n presentationDescription: preferredPresentation.description\n });\n\n const currentVideoMap = videos.reduce<Record<string, boolean>>((acc, v) => {\n return {\n ...acc,\n [v.data.id]: true\n };\n }, {});\n\n setVideos([\n ...videos,\n ...classificationVideos.videos\n .filter(v => !currentVideoMap[v.id])\n .map(v => ({\n data: v,\n classificationId: classificationVideos.classificationId,\n classificationName: classificationVideos.classificationName\n }))\n ]);\n }\n\n /**\n * TODO: Update onboarding analytics documentation\n */\n function onDeselectAll(classificationVideos: OnboardingClassificationVideosGrouping): void {\n logEvent(UserAction.Click, OnboardingDescriptor.DeselectAllVideos, {\n subjectId: classificationVideos.classificationId,\n subjectName: classificationVideos.classificationName,\n videos: classificationVideos.videos.map(v => ({\n id: v.id,\n name: v.name,\n thumbnailUrl: v.thumbnail?.url,\n videoSubjectId: classificationVideos.classificationId,\n videoSubjectName: classificationVideos.classificationName\n })),\n presentationId: preferredPresentation.id,\n presentationDescription: preferredPresentation.description\n });\n\n const deselectedVideoMap = classificationVideos.videos.reduce<Record<string, boolean>>((acc, v) => {\n return {\n ...acc,\n [v.id]: true\n };\n }, {});\n\n setVideos(videos.filter(v => !deselectedVideoMap[v.data.id]));\n }\n\n async function onClickNext(): Promise<void> {\n logEvent(UserAction.Click, OnboardingDescriptor.Next, {\n videos: videos.map(v => ({\n id: v.data.id,\n name: v.data.name,\n thumbnailUrl: v.data.thumbnail?.url,\n videoSubjectId: v.classificationId,\n videoSubjectName: v.classificationName\n })),\n presentationId: preferredPresentation.id,\n presentationName: preferredPresentation.name,\n presentationDescription: preferredPresentation.description\n });\n \n try {\n await completeStepAsync();\n } catch {\n onSaveError();\n return Promise.reject();\n }\n }\n\n const dataFetched = classificationVideosGrouping.hasCompleted && audiences.hasCompleted;\n const showLoadingScreen = !hasFakeLoaded || !dataFetched;\n\n const rightPanelProps: OnboardingRightPanelProps = showLoadingScreen ? {\n hasCustomButtons: true\n } : {\n hasCustomButtons: false,\n onClickNext: onClickNext,\n onClickBack: onClickBack,\n onClickComeBackLater: exitOnboarding,\n disableNext: videos.length < MIN_VIDEOS || videos.length > ONBOARDING_MAX_VIDEOS\n };\n\n if (showLoadingScreen && !halfScreen) {\n return (\n <OnboardingLoaderContainer variant='dark-blue'>\n <div className={`w-100 d-flex align-items-center px-4 text-center flex-column text-white ${styles.loaderText}`}>\n <h1 className='h3 mb-4'>\n <Text namespace={namespace} phrase='loadingHeading' />\n </h1>\n <p className='h6 text-center'>\n <Text namespace={namespace} phrase='searching' />\n </p>\n </div>\n <OnboardingVideosLoader variant='dark-blue' screenSize='100%' hideThumbnailMask />\n </OnboardingLoaderContainer>\n );\n }\n\n return (\n <OnboardingLayout namespace={namespace}>\n <OnboardingLayout.Left className='bg-dark-blue d-flex flex-column align-items-end justify-content-center'>\n {showLoadingScreen ? (\n <OnboardingVideosLoader variant='dark-blue' screenSize='50%' />\n ) : (\n <LeftPanelItem\n contentPosition='right'\n annotationUrl={videos.length >= MIN_VIDEOS\n ? ImageUrls.OnboardingV2.SelectVideos.LOOKING_GOOD\n : ImageUrls.OnboardingV2.SelectVideos.BEFORE_SELECTION}\n annotationPosition={videos.length >= MIN_VIDEOS ? 'bottom-left' : 'top-left'}\n annotationClassName={styles.annotation}\n >\n <MockPlaylist\n presentation={preferredPresentation}\n curriculum={preferredCurriculum}\n videos={videos.map(v => v.data)}\n />\n </LeftPanelItem>\n )}\n </OnboardingLayout.Left>\n\n <OnboardingLayout.Right {...rightPanelProps}>\n {showLoadingScreen ? (\n <>\n <OnboardingScreenHeading className='text-center'>\n <Text phrase={isKdm ? 'loadingHeadingKdm' : 'loadingHeading'} />\n </OnboardingScreenHeading>\n <p className='text-center'>\n <Text phrase='searching' />\n </p>\n </>\n ) : (\n <>\n <OnboardingScreenHeading>\n <Text phrase={isKdm ? 'headingKdm' : 'heading'} />\n </OnboardingScreenHeading>\n\n <OnboardingScreenInfo>\n <Text phrase='info' />\n </OnboardingScreenInfo>\n\n <OnboardingClassificationVideos\n classificationVideosGrouping={classificationVideosGrouping.data}\n onSelectVideo={onSelectVideo}\n audiences={audiences.data}\n onSelectAll={onSelectAll}\n onDeselectAll={onDeselectAll}\n isSelected={videoId => videos.some(v => v.data.id.toString() === videoId.toString())}\n totalSelected={videos.length}\n />\n </>\n )}\n </OnboardingLayout.Right>\n </OnboardingLayout>\n );\n}","import { Flight } from 'libs/common/react/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { ClassificationVideosMap } from 'libs/shared/apps/onboarding/constants/ClassificationVideos';\nimport { OnboardingHelper } from 'libs/shared/apps/subjects/utils/OnboardingHelper';\nimport { PreferenceRequests } from 'libs/shared/flight-requests/PreferenceRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Classification, Video } from 'libs/shared/interfaces';\n\nimport { usePresentation } from 'shared/hooks/usePresentation';\n\nexport interface OnboardingClassificationVideosGrouping {\n classificationId: string;\n classificationName: string;\n videos: Video[];\n}\n\ninterface SuggestedVideosResponse {\n hasCompleted: boolean;\n data: OnboardingClassificationVideosGrouping[];\n}\n\nexport function useGetSuggestedVideos(): SuggestedVideosResponse {\n const { preferredPresentation } = usePresentation();\n const { bulkOnboardingPreferencesState, isLoadingSettings } = useSettings(null);\n const preferences = Flight.useBasicFetch<Classification[]>(PreferenceRequests.mySubjectPreferences());\n\n const presentationSubjects = ClassificationVideosMap[preferredPresentation.id] || {};\n\n const subjectIdNameMapping = Object.entries(presentationSubjects).reduce((acc, [ id, { name }]) => {\n acc[id] = name;\n return acc;\n }, {} as Record<string, string>);\n\n let selectedPresentationSubjects = OnboardingHelper.hasBulkSelectedTopics(bulkOnboardingPreferencesState)\n ? presentationSubjects\n : preferences.data?.reduce((acc, preference) => {\n if (!presentationSubjects[preference.id])\n return acc;\n\n acc[preference.id] = presentationSubjects[preference.id];\n return acc;\n }, {} as typeof presentationSubjects) ?? {};\n\n if (!Object.keys(selectedPresentationSubjects).length)\n selectedPresentationSubjects = presentationSubjects;\n\n const suggestedVideoIds: string[] = [];\n\n const videoToSubjectMapping: Record<string, string[]> = {};\n\n Object.entries(selectedPresentationSubjects).forEach(([ subjectId, subjectData ]) => {\n suggestedVideoIds.push(...subjectData.videoIds);\n\n subjectData.videoIds.forEach(videoId => {\n if (!videoToSubjectMapping[videoId]) {\n videoToSubjectMapping[videoId] = [];\n }\n\n videoToSubjectMapping[videoId].push(subjectId);\n });\n });\n \n const suggestedVideosResponse = Flight.useBasicFetchAll<Video[]>(\n ArrayHelper.chunk<string>(ArrayHelper.uniq(suggestedVideoIds), 25).map(videoIds => VideoRequests.videos(videoIds))\n );\n\n const suggestedVideos = ArrayHelper.flatten(suggestedVideosResponse.data || []);\n\n const groupings: Record<string, OnboardingClassificationVideosGrouping> = {};\n \n suggestedVideos?.forEach(video => {\n const subjects = videoToSubjectMapping[video.id];\n\n subjects.forEach(subject => {\n if (!groupings[subject]) {\n groupings[subject] = {\n classificationId: subject,\n classificationName: subjectIdNameMapping[subject],\n videos: []\n };\n }\n\n groupings[subject].videos.push(video);\n });\n });\n\n return {\n hasCompleted: preferences.hasCompleted && suggestedVideosResponse.hasCompleted && !isLoadingSettings,\n data: Object.values(groupings)\n };\n}"],"names":["BulkOnboardingPreferencesState","OnboardingHelper","hasManyPresentationTypes","presentations","totalAvailableSubjectPresentations","totalAvailableCurriculumPresentations","forEach","p","type","PresentationType","hasManySubjectPresentations","hasManyCurriculumPresentations","getBulkPreferencesState","state","AllSubjectsAndAllLevels","levels","subjects","AllLevels","AllSubjects","hasBulkSelectedLevels","bulkState","hasBulkSelectedTopics","getNextBulkState","current","managing","None","isManagingTopics","useMergeAudiences","audiences","presentationAudiences","sortedAudiences","length","HAS_NUMBER_REGEX","AudienceStringBuilders","yearsAndGradesBuilder","combinedNames","map","a","name","join","numberList","split","filter","isNaN","num","wordList","audienceWithoutNum","find","test","prefix","charAt","pop","audienceRange","audienceValues","initialVal","nextVal","i","j","isContinguous","ranges","sort","b","push","processAudienceRanges","internationalSecondaryBuilder","englandSecondaryBuilder","scotlandPrimaryBuilder","firstAudience","ArrayHelper","lastAudience","firstAudienceLevel","lastAudienceLevel","internationalPrimaryBuilder","toLowerCase","scotlandSecondaryBuilder","englandPrimaryBuilder","firstAudienceFirstWord","lastAudienceFirstWord","firstAudienceNumber","word","lastAudienceNumber","firstAudienceString","lastAudienceString","DIGIT_REGEX","SPACE_REGEX","AudienceHelper","getSortedPresentationAudiences","objectAudiences","objectAudienceIds","v","audience","id","toString","presAudience","includes","masterId","getMergedPresentationAudienceString","mergedAudienceString","presentationId","HardCoded","sortMembersWithDuplicateNamesByAudience","members","getLowestAudience","digit","match","lowestAudience","lowestAudienceDigit","nameCountMap","sorted","member","sortedSlice","splice","firstObjLowestAudience","subjectPresentationAudiences","data","secondObjLowestAudience","comparison","localeCompare","concat","getActiveAudiencesFromParams","params","ObjectHelper","shouldShowAudiences","normalizeAudienceName","audienceName","replace","audienceLookup","reduce","audienceStr","getAudienceParams","LeftPanelItem","props","className","contentPosition","annotationUrl","annotationPosition","annotationClassName","getAnnotationClassName","src","children","defaultProps","OnboardingLoaderContainer","variant","getOnboardingLoaderVideoStyles","index","screenSize","indexPositionId","styles","top","left","animationDelay","right","mobile","halfScreen","fullScreen","OnboardingVideosLoader","thumbnails","breakpoints","useBreakpoints","thumbnail","key","style","xs","hideThumbnailMask","ImageHelper","size","namespace","LeftNavItem","MockLayout","editingCurriculum","Text","phrase","curriculum","IconCircle","imageUrl","cover","url","svgSize","SvgContainer","S","textVariant","svgName","ClickViewLogo","presentation","TopicsHelper","learningLevel","PresentationLearningLevel","getPresentationClass","VideoPlaceholder","video","VideoThumbnail","hideDuration","imageOptions","ImageFallback","extraClasses","MockPlaylist","placeholderVideos","hidePlaceholders","Math","max","videos","Array","fill","_","VideoItem","isSelected","DivButton","onClick","onSelectVideo","disabled","checkMarkStatus","setCheckMarkStatus","Promise","resolve","imageClassName","OnboardingClassificationVideos","onSelectAll","shouldSelect","classification","onDeselectAll","isAtLimit","totalSelected","ONBOARDING_MAX_VIDEOS","classificationVideosGrouping","selectedVideos","allSelected","classificationId","classificationName","Tooltip","title","LanguageService","limit","spanHack","spanHackClassName","CheckMarkButton","status","setStatus","vid","FAKE_LOADER_MIN_DURATION","MIN_VIDEOS","OnboardingSelectVideosView","useOnboardingCallbacks","redirectUrl","onClickBack","exitOnboarding","completeStepAsync","onSaveError","logEvent","useOnboardingEventLogger","storage","setVideos","AudienceRequests","preferredPresentation","usePresentation","preferredCurriculum","useCurriculums","useSettings","bulkOnboardingPreferencesState","isLoadingSettings","preferences","PreferenceRequests","presentationSubjects","ClassificationVideos","subjectIdNameMapping","Object","entries","acc","selectedPresentationSubjects","preference","keys","suggestedVideoIds","videoToSubjectMapping","subjectId","subjectData","videoIds","videoId","suggestedVideosResponse","VideoRequests","suggestedVideos","groupings","subject","hasCompleted","values","useGetSuggestedVideos","hasFakeLoaded","setHasFakeLoaded","lg","xl","xxl","isKdm","timeout","window","setTimeout","clearTimeout","dataFetched","showLoadingScreen","rightPanelProps","hasCustomButtons","onClickNext","thumbnailUrl","videoSubjectId","videoSubjectName","presentationName","presentationDescription","description","reject","onClickComeBackLater","disableNext","OnboardingLayout","ImageUrls","OnboardingScreenHeading","OnboardingScreenInfo","videoName","some","classificationVideos","subjectName","currentVideoMap","deselectedVideoMap"],"sourceRoot":""}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/*! For license information please see 9016-9eba1d2c42-lite.chunk.js.LICENSE.txt */
|
|
2
|
+
(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[9016],{9826:(e,t,n)=>{"use strict";n.d(t,{e:()=>f});var r=n(32735),a=n(91967),i=n(86764),c=n(81514),o=n(10038);const l={stickyFooter:"rIUL4",nonStickyFooter:"PuC_F"};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}var u=50;function m(e){var t="justify-content-".concat(e.justify);return r.createElement("div",{className:"py-3 bg-white ".concat(l.stickyFooter)},r.createElement("div",{className:"w-75 mx-auto d-flex ".concat(t)},e.children))}function d(e){var t=(0,c.V)(),n=t===i.r.SM||t===i.r.XS?"w-100":"w-75",a="justify-content-".concat(e.justify);return r.createElement("div",{className:"".concat(n," ").concat(a," ").concat(l.nonStickyFooter," d-flex px-3")},e.children)}function f(e){var t,n,i=function(){return window.innerHeight+window.scrollY>=document.body.offsetHeight-u},c=(t=r.useState(!1),n=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,i,c,o=[],l=!0,s=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=i.call(n)).done)&&(o.push(r.value),o.length!==t);l=!0);}catch(e){s=!0,a=e}finally{try{if(!l&&null!=n.return&&(c=n.return(),Object(c)!==c))return}finally{if(s)throw a}}return o}}(t,n)||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}}(t,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),l=c[0],f=c[1];r.useEffect((function(){return f(!i())}),[]);var p=a.q.throttle((function(){var e=!i();!l||e?!l&&e&&f(!0):f(!1)}),100);return r.useEffect((function(){return window.addEventListener("scroll",p),function(){return window.removeEventListener("scroll",p)}}),[l,f]),(0,o.H)(p,p,[l,f]),l?r.createElement(m,Object.assign({},e),e.children):r.createElement(d,Object.assign({},e),e.children)}f.defaultProps={justify:"between"}},49602:(e,t,n)=>{"use strict";var r;n.d(t,{b:()=>i}),function(e){e[e.None=0]="None",e[e.AllSubjects=1]="AllSubjects",e[e.AllLevels=2]="AllLevels",e[e.AllSubjectsAndAllLevels=3]="AllSubjectsAndAllLevels"}(r||(r={}));var a=n(25925),i={hasManyPresentationTypes:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=0,n=0;return null==e||e.forEach((function(e){e.type===a.R.Subject?t++:e.type===a.R.Curriculum&&n++})),{hasManySubjectPresentations:t>1,hasManyCurriculumPresentations:n>1}},getBulkPreferencesState:function(e){return e===r.AllSubjectsAndAllLevels?{levels:!0,subjects:!0}:{levels:e===r.AllLevels,subjects:e===r.AllSubjects}},hasBulkSelectedLevels:function(e){return e===r.AllLevels||e===r.AllSubjectsAndAllLevels},hasBulkSelectedTopics:function(e){return e===r.AllSubjects||e===r.AllSubjectsAndAllLevels},getNextBulkState:function(e,t){var n=r.None,a=r.AllSubjects,i=r.AllLevels,c=r.AllSubjectsAndAllLevels,o="topics"===t;switch(e){case n:default:return o?a:i;case a:return o?n:c;case i:return o?c:n;case c:return o?i:a}}}},49935:(e,t,n)=>{"use strict";n.d(t,{Oo:()=>m,b2:()=>d});var r=n(32735),a=n(36848),i=n(86764),c=n(3747),o=n(5859),l=n(35223),s=n(83914),u=function(e){var t=e.breadcrumb,n=t.name,i=t.appLink,c=t.active,o=e.withBackIcon;return r.createElement("li",{className:"breadcrumb-item".concat(c?" active":"")},c?r.createElement("strong",null,n):r.createElement(a.F,{appLink:i},o&&r.createElement(s.x,{svgName:l.vn.ChevronLeft,size:s.S.Small}),r.createElement("span",{className:o?"ms-2":""},n)))},m=function(e){var t=e.breadcrumbs,n=(0,c.a)(i.r.XS),a=null==t?void 0:t.length;return!a||n&&a<2?r.createElement(r.Fragment,null):n?r.createElement("nav",{"aria-label":"breadcrumb"},r.createElement("ol",{className:"breadcrumb m-0 p-0"},r.createElement(u,{breadcrumb:t[a-2],withBackIcon:!0}))):r.createElement("nav",{"aria-label":"breadcrumb"},r.createElement("ol",{className:"breadcrumb m-0 p-0"},t.map((function(e,t){return r.createElement(u,{key:t,breadcrumb:e})}))))},d=r.memo((function(e){var t=e.numItems,n=void 0===t?3:t;return(0,c.a)(i.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"},o.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:" "}}))}))))}))},38502:(e,t,n)=>{"use strict";n.d(t,{r:()=>m});var r=n(32735),a=n(49985),i=n(36848),c=n(18559),o=n(11607),l=n(83914),s=n(87432);function u(e){return r.createElement(r.Fragment,null,!!e.tab.svgName&&r.createElement("div",{className:e.tab.name?"pe-1":""},r.createElement(l.x,{svgName:e.tab.svgName})),e.tab.name,"number"==typeof e.tab.count&&r.createElement("div",{className:"ps-2"},r.createElement(c.C,{type:c.g.Count,data:e.tab.count})))}function m(e){var t;return r.createElement("nav",{className:null!==(t=e.className)&&void 0!==t?t:""},r.createElement("ul",{className:"\n list-unstyled d-inline-block m-0 ".concat(s.Z.pillTabSelector,"\n ").concat(e.borderRadius?s.Z.radiusSmall:"","\n ").concat(e.listClassName,"\n ")},e.tabs.map((function(e,t){return r.createElement("li",{className:"\n p-0 ".concat(s.Z.tab," ").concat(e.active?"btn btn-dark":"btn btn-outline-dark","\n ").concat(e.name?s.Z.minWidth:""," ").concat(e.className,"\n "),key:t},e.appLink?r.createElement(i.F,{appLink:e.appLink,analyticsData:e.analyticsData,analyticsOptions:e.analyticsOptions,className:"\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ".concat(s.Z.tabLink,"\n ")},r.createElement(u,{tab:e})):r.createElement(o.L,{className:"\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset p-2 text-nowrap ".concat(s.Z.tabLink,"\n "),onClick:function(){return function(e){!e.active&&e.onSelect&&(e.onSelect(),e.analyticsData&&e.analyticsOptions&&a.k.logUserAction(e.analyticsData,e.analyticsOptions))}(e)}},r.createElement(u,{tab:e})))}))))}m.defaultProps={borderRadius:"lg"}},81514:(e,t,n)=>{"use strict";n.d(t,{V:()=>i});var r=n(86764),a=n(3747);function i(){var e=(0,a.a)(r.r.XS),t=(0,a.a)(r.r.SM),n=(0,a.a)(r.r.MD),i=(0,a.a)(r.r.LG),c=(0,a.a)(r.r.XL),o=(0,a.a)(r.r.XXL),l=r.r.LG;return e&&(l=r.r.XS),t&&(l=r.r.SM),n&&(l=r.r.MD),i&&(l=r.r.LG),c&&(l=r.r.XL),o&&(l=r.r.XXL),l}},5859:(e,t,n)=>{"use strict";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")}}))}}},69454:(e,t,n)=>{"use strict";n.d(t,{T:()=>d});var r=n(75896),a=n(1048),i=n(55171);function c(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,c,o=[],l=!0,s=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=i.call(n)).done)&&(o.push(r.value),o.length!==t);l=!0);}catch(e){s=!0,a=e}finally{try{if(!l&&null!=n.return&&(c=n.return(),Object(c)!==c))return}finally{if(s)throw a}}return o}}(e,t)||function(e,t){if(e){if("string"==typeof e)return o(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?o(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var l=/\d/,s={yearsAndGradesBuilder:function(e){var t=e.map((function(e){return e.name})).join(" "),n=t.split(" ").filter((function(e){return!isNaN(+e)})).map((function(e){return+e}))||[],r=t.split(" ").filter((function(e){return isNaN(+e)}))||[],a=e.find((function(e){return!l.test(e.name)})),i=r.find((function(e){return e!==(null==a?void 0:a.name)}));if(e.length>1&&(i+="s"),a&&n.length)return"".concat(i," ").concat(a.name.charAt(0)," - ").concat(n.pop());var c=function(e){var t,n,r,a,i=!1,c=[];for(e=e.sort((function(e,t){return e-t})),r=0;r<e.length;r++)a=r+1,i||(t=e[r]),n=e[a],e[r]+1===n?i=!0:i?(c.push("".concat(t," - ").concat(e[r])),i=!1):(c.push("".concat(e[r])),i=!1);return c}(n);return"".concat(i," ").concat(c.join(", "))},internationalSecondaryBuilder:function(e){return s.englandSecondaryBuilder(e)},scotlandPrimaryBuilder:function(e){var t=r.m.first(e),n=r.m.last(e),a=c(t.name.split(" "),1)[0],i=c(n.name.split(" "),1)[0];return"First"===a&&(a="1st"),"First"===i&&(i="1st"),"Second"===a&&(a="2nd"),"Second"===i&&(i="2nd"),a===i?"".concat(a," Level"):"".concat(a," - ").concat(i," Level")},internationalPrimaryBuilder:function(e){var t=r.m.first(e),n=r.m.last(e);if(t.name===n.name)return t.name;var a=c(t.name.split(" "),1)[0],i=c(n.name.split(" "),1)[0];return"Lower"===a&&(a="Low"),"Lower"===i&&(i="Low"),"Middle"===a&&(a="Mid"),"Middle"===i&&(i="Mid"),"".concat(a," - ").concat(i," Pri")},englandSecondaryBuilder:function(e){var t=r.m.first(e),n=r.m.last(e);return t.name===n.name?t.name:"Advanced"===n.name?"lower"===c(t.name.split(" "),1)[0].toLowerCase()?"Lower Sec - Adv":"Upper Sec - Adv":"Lower - Upper Sec"},scotlandSecondaryBuilder:function(e){var t=r.m.first(e),n=r.m.last(e);return t.name===n.name?t.name:"Senior Phase"===n.name?"".concat(t.name," - Senior"):"Third - Fourth Level"},englandPrimaryBuilder:function(e){var t=r.m.first(e),n=r.m.last(e),a=r.m.first(t.name.split(" ")),i=r.m.first(n.name.split(" ")),c=t.name.split(" ").find((function(e){return!isNaN(+e)})),o=n.name.split(" ").find((function(e){return!isNaN(+e)}));if(t===n)return"Key"===a||"Reception"===a?t.name:"".concat(a," KS").concat(c);var l="",s="";return l="Reception"===a?"R":"KS".concat(c),s="KS".concat(o),"Lower"===a&&"Upper"===i?"L ".concat(l," - U ").concat(s):("Lower"===a&&(l="Lower ".concat(l)),"Upper"===i&&(s="Upper ".concat(s)),"Key"===i&&(s=n.name),"".concat(l," - ").concat(s))}},u=/([0-9]+)/gi,m=/\s|\+/gi,d={getSortedPresentationAudiences:function(e,t){var n=e.filter((function(e){return!!e})).map((function(e){return e.id.toString()}));return t.filter((function(e){return n.includes(e.masterId.toString())}))},getMergedPresentationAudienceString:function(e){var t="";switch(+r.m.first(e).presentationId){case i.e.PresentationIds.DEFAULT:case i.e.PresentationIds.AU_SECONDARY:case i.e.PresentationIds.US_ELEMENTARY:case i.e.PresentationIds.AU_PRIMARY:case i.e.PresentationIds.STREAMABLE_LEARNING:if(1===e.length)return e[0];t=s.yearsAndGradesBuilder(e);break;case i.e.PresentationIds.INTERNATIONAL_SECONDARY:if(1===e.length)return e[0];t=s.internationalSecondaryBuilder(e);break;case i.e.PresentationIds.INTERNATIONAL_PRIMARY:t=s.internationalPrimaryBuilder(e);break;case i.e.PresentationIds.SCOTLAND_PRIMARY:t=s.scotlandPrimaryBuilder(e);break;case i.e.PresentationIds.ENGLISH_SECONDARY:t=s.englandSecondaryBuilder(e);break;case i.e.PresentationIds.SCOTLAND_SECONDARY:t=s.scotlandSecondaryBuilder(e);break;case i.e.PresentationIds.ENGLAND_PRIMARY:t=s.englandPrimaryBuilder(e);case i.e.PresentationIds.US_MIDDLE:case i.e.PresentationIds.US_HIGH:}return t?{name:t}:null},sortMembersWithDuplicateNamesByAudience:function(e){var t=function(e){return e.length?(e.forEach((function(e){var a=+r.m.first(e.name.match(u));if(!t)return t=e,void(n=a);a<n&&(t=e)})),t):null;var t,n},n={},a=[];return e.forEach((function(e){if(!n[e.name])return n[e.name]=1,void a.push(e);a.push(e),n[e.name]++;var r=a.splice(a.length-n[e.name]).sort((function(e,n){var r=t(e.subjectPresentationAudiences.data),a=t(n.subjectPresentationAudiences.data);if(!r&&a)return 1;if(!a)return-1;var i=r.name.localeCompare(a.name);return 0===i?i:i>0?-1:1}));a=a.concat(r)})),a},getActiveAudiencesFromParams:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(a.t.isObject(t)&&!a.t.isEmpty(t)&&e&&e.length&&d.shouldShowAudiences(e)){var n=t.a;if(n){"string"==typeof n&&(n=[n]);var r=function(e){return e.replace(m,"").toLowerCase()},i=n.reduce((function(e,t){return e[r(t)]=t,e}),{});return e.filter((function(e){return i[r(e.name)]}))}}},getAudienceParams:function(e){return(null==e?void 0:e.length)?{a:e.map((function(e){return e.name}))}:null},shouldShowAudiences:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return!!e&&e.length>1}}},71164:(e,t,n)=>{"use strict";n.d(t,{T:()=>v});var r=n(32735),a=n(23481),i=n(81886),c=n(38502),o=n(75795),l=n(69454),s=n(14070),u=n(97291),m=n(81803),d=n(4312);const f={tabs:"oHDjZ"};var p=a.T.encloseNamespace("settings.preferencesLayout");function v(e){var t,n=null===(t=o.O.getCurrentRoute())||void 0===t?void 0:t.appLink,a=function(e){return e===(null==n?void 0:n.action)},v=function(e){i.Q.C$.trigger({application:u.O.SETTINGS,action:e})};function b(){var t=[{name:p("topics"),active:a(s.e.Settings.TOPIC_PREFERENCES),onSelect:function(){return v(s.e.Settings.TOPIC_PREFERENCES)}}];l.T.shouldShowAudiences(e.audiences)&&t.push({name:p("yearGroups"),active:a(s.e.Settings.AUDIENCE_PREFERENCES),onSelect:function(){return v(s.e.Settings.AUDIENCE_PREFERENCES)}});var n=d.b.hasManyPresentationTypes(e.availablePresentations),r=n.hasManyCurriculumPresentations,i=n.hasManySubjectPresentations;return r&&t.push({name:p("curriculum"),active:a(s.e.Settings.CURRICULUM),onSelect:function(){return v(s.e.Settings.CURRICULUM)}}),i&&t.push({name:p("schoolLevel"),active:a(s.e.Settings.SCHOOL_LEVEL),onSelect:function(){return v(s.e.Settings.SCHOOL_LEVEL)}}),t}var g=b();return r.createElement(m.d,{heading:p("heading"),breadcrumbs:[p("breadcrumb")]},g.length>1&&r.createElement(c.r,{tabs:b(),className:f.tabs}),e.children)}},81803:(e,t,n)=>{"use strict";n.d(t,{d:()=>p});var r=n(32735),a=n(81886),i=n(23481),c=n(49935),o=n(22902),l=n(14070),s=n(97291),u=n(96368);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 d="settings.settingsLayout",f=function(e){var t=(0,o.T)().hasPermissions,n=(0,u.e)();if(e)return t(e);var r=a.Q.C$.getCurrentAppLink();return r.application!==s.O.SETTINGS||n.some((function(e){return e.modules.some((function(e){return"appLink"in e&&e.appLink.action===r.action}))}))};function p(e){var t,n=f(e.requiredPermissions);if(r.useEffect((function(){n||a.Q.C$.trigger({application:s.O.SETTINGS,action:l.e.Settings.HOME},{replace:!0})}),[n]),!n)return r.createElement(r.Fragment,null);var o,u=e.breadcrumbs.map((function(t,n){return{name:t,appLink:{application:s.O.SETTINGS,action:l.e.Settings.HOME},active:n===e.breadcrumbs.length-1}}));return r.createElement("div",{className:"px-3"},r.createElement("div",{className:"d-flex align-items-center justify-content-between"},r.createElement("h1",{className:"h2"},e.heading),null===(t=e.headingButton)||void 0===t?void 0:t.call(e)),r.createElement("div",{className:"pb-3"},r.createElement(c.Oo,{breadcrumbs:[{name:i.T.getPhrase(d,"settingsBreadcrumb"),appLink:{application:s.O.SETTINGS,action:l.e.Settings.HOME}}].concat((o=u,function(e){if(Array.isArray(e))return m(e)}(o)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(o)||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}}(o)||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.")}()))})),e.description&&r.createElement(r.Fragment,null,r.createElement("p",null,e.description),r.createElement("hr",null)),e.children)}},4312:(e,t,n)=>{"use strict";n.d(t,{b:()=>b});var r=n(32735),a=n(49189),i=n.n(a),c=n(81886),o=n(49602),l=n(89961),s=n(14070),u=n(97291),m=n(80247),d=n(83345),f=n(99742);var p="subjects.onboardingLoader";function v(e){return r.useEffect((function(){window.setTimeout(e.onDone,2500)}),[]),r.createElement("div",{className:"d-flex flex-column align-items-center"},r.createElement("div",{className:"py-3"},r.createElement(m.Z,{as:"span",animation:"border",role:"status",className:"SVq72"})),r.createElement("h2",{className:"iS5ZE"},r.createElement(d.x,{namespace:p,phrase:"heading"})),r.createElement("p",{className:"mb-0 pb-4 text-center ".concat("JaUIN")},r.createElement(d.x,{namespace:p,phrase:"info"})),r.createElement("div",{className:"drop-shadow mb-n5"},r.createElement("img",{src:f.W.Onboarding.LOADER,alt:"",role:"presentation",className:"img-fluid"})))}var b=Object.assign(Object.assign({},o.b),{buildAppLink:function(e,t){var n={application:u.O.SUBJECT,action:"welcome"===e?s.e.Subjects.ONBOARDING_WELCOME:"school-level"===e?s.e.Subjects.ONBOARDING_TOPIC_PRESENTATION:"curriculum"===e?s.e.Subjects.ONBOARDING_CURRICULUM_PRESENTATION:void 0};return t&&(n.params={redirectUrl:t}),n},redirect:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t={application:u.O.SUBJECT,action:s.e.Subjects.ONBOARDING};e&&(t.params={redirectUrl:e}),c.Q.C$.trigger(t,{replace:!0})},onCompleteOnboardingSuccess:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"/";i().set("_onboardingComplete",e,{expires:30});var n=function(){return c.Q.Ab.PageLoad(t)};window.setTimeout((function(){l.M.render(r.createElement(v,{onDone:n}),{size:"lg",dialogClassName:"rounded-3",hideButtons:!0,centered:!0,cancelButtonProps:{onClick:n}})}),250)}})},49189:(e,t,n)=>{var r,a,i;void 0===(a="function"==typeof(r=i=function(){function e(){for(var e=0,t={};e<arguments.length;e++){var n=arguments[e];for(var r in n)t[r]=n[r]}return t}function t(e){return e.replace(/(%[0-9A-Z]{2})+/g,decodeURIComponent)}return function n(r){function a(){}function i(t,n,i){if("undefined"!=typeof document){"number"==typeof(i=e({path:"/"},a.defaults,i)).expires&&(i.expires=new Date(1*new Date+864e5*i.expires)),i.expires=i.expires?i.expires.toUTCString():"";try{var c=JSON.stringify(n);/^[\{\[]/.test(c)&&(n=c)}catch(e){}n=r.write?r.write(n,t):encodeURIComponent(String(n)).replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g,decodeURIComponent),t=encodeURIComponent(String(t)).replace(/%(23|24|26|2B|5E|60|7C)/g,decodeURIComponent).replace(/[\(\)]/g,escape);var o="";for(var l in i)i[l]&&(o+="; "+l,!0!==i[l]&&(o+="="+i[l].split(";")[0]));return document.cookie=t+"="+n+o}}function c(e,n){if("undefined"!=typeof document){for(var a={},i=document.cookie?document.cookie.split("; "):[],c=0;c<i.length;c++){var o=i[c].split("="),l=o.slice(1).join("=");n||'"'!==l.charAt(0)||(l=l.slice(1,-1));try{var s=t(o[0]);if(l=(r.read||r)(l,s)||t(l),n)try{l=JSON.parse(l)}catch(e){}if(a[s]=l,e===s)break}catch(e){}}return e?a[e]:a}}return a.set=i,a.get=function(e){return c(e,!1)},a.getJSON=function(e){return c(e,!0)},a.remove=function(t,n){i(t,"",e(n,{expires:-1}))},a.defaults={},a.withConverter=n,a}((function(){}))})?r.call(t,n,t,e):r)||(e.exports=a),e.exports=i()},87432:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r={pillTabSelector:"Hdi6o",tab:"RvNxr",minWidth:"GHSz9",radiusSmall:"VhJJa",tabLink:"WFyvo"}}}]);
|
|
3
|
+
//# sourceMappingURL=9016-9eba1d2c42-lite.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts/9016-9eba1d2c42-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/subjects/components/preferences/footer/onboarding-footer.scss","file:///app/packages/libs/shared/src/apps/subjects/components/preferences/footer/OnboardingFooter.tsx","file:///app/packages/libs/shared/src/enums/BulkOnboardingPreferencesState.ts","file:///app/packages/libs/shared/src/apps/subjects/utils/OnboardingHelper.ts","file:///app/packages/libs/shared/src/components/breadcrumbs/Breadcrumbs.tsx","file:///app/packages/libs/shared/src/components/pill-tab-selector/PillTabSelector.tsx","file:///app/packages/libs/shared/src/hooks/UseGetMediaQueryString.ts","file:///app/packages/libs/shared/src/utils/PartialLoadingHelper.ts","file:///app/packages/libs/shared/src/utils/audience-helper/AudienceStringBuilders.ts","file:///app/packages/libs/shared/src/utils/audience-helper/AudienceHelper.ts","file:///app/packages/projects/lite/src/apps/settings/components/preferences/preferences-layout.scss","file:///app/packages/projects/lite/src/apps/settings/components/preferences/PreferencesLayout.tsx","file:///app/packages/projects/lite/src/apps/settings/components/settings-layout/SettingsLayout.tsx","file:///app/packages/projects/lite/src/apps/subjects/components/onboarding-loader/OnboardingLoader.tsx","file:///app/packages/projects/lite/src/apps/subjects/components/onboarding-loader/onboarding-loader.scss","file:///app/packages/projects/lite/src/apps/subjects/utils/OnboardingHelper.tsx","file:///app/node_modules/js-cookie/src/js.cookie.js","file:///app/packages/libs/shared/src/components/pill-tab-selector/pill-tab-selector.scss"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"stickyFooter\":\"rIUL4\",\"nonStickyFooter\":\"PuC_F\"};","import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useGetMediaQueryString } from 'libs/shared/hooks/UseGetMediaQueryString';\nimport { useResizeListener } from 'libs/shared/hooks/UseResizeListener';\n\nimport styles from './onboarding-footer.scss';\n\nconst SCROLL_TOLERANCE = 50; // value in px\n\ninterface OnboardingFooterProps extends React.PropsWithChildren<unknown> {\n justify?: 'end' | 'center' | 'between';\n}\n\nOnboardingFooter.defaultProps = {\n justify: 'between'\n};\n\nfunction StickyFooter(props: OnboardingFooterProps): JSX.Element {\n const justifyClass = `justify-content-${props.justify}`;\n\n return (\n <div className={`py-3 bg-white ${styles.stickyFooter}`}>\n <div className={`w-75 mx-auto d-flex ${justifyClass}`}>\n {props.children}\n </div>\n </div>\n );\n}\n\nfunction NonStickyFooter(props: OnboardingFooterProps): JSX.Element {\n const mediaQuery = useGetMediaQueryString();\n const widthClass = (mediaQuery === MediaQueryStrings.SM || mediaQuery === MediaQueryStrings.XS) ? 'w-100' : 'w-75';\n\n const justifyClass = `justify-content-${props.justify}`;\n\n return (\n <div className={`${widthClass} ${justifyClass} ${styles.nonStickyFooter} d-flex px-3`}>\n {props.children}\n </div>\n );\n}\n\nexport function OnboardingFooter(props: OnboardingFooterProps): JSX.Element {\n const isScrolledToBottom = () => {\n return (window.innerHeight + window.scrollY) >= (document.body.offsetHeight - SCROLL_TOLERANCE);\n };\n\n const [ isSticky, setIsSticky ] = React.useState(false);\n\n React.useEffect(() => setIsSticky(!isScrolledToBottom()), []);\n\n function onViewportChange(): void {\n const shouldSetToSticky = !isScrolledToBottom();\n\n if (isSticky && !shouldSetToSticky) {\n setIsSticky(false);\n return;\n }\n\n if (!isSticky && shouldSetToSticky)\n setIsSticky(true);\n }\n\n const throttledOnViewportChange = FunctionHelper.throttle(onViewportChange, 100);\n\n React.useEffect(() => {\n window.addEventListener('scroll', throttledOnViewportChange);\n return () => window.removeEventListener('scroll', throttledOnViewportChange);\n }, [ isSticky, setIsSticky ]);\n\n useResizeListener(throttledOnViewportChange, throttledOnViewportChange, [ isSticky, setIsSticky ]);\n\n return isSticky\n ? <StickyFooter {...props}>{props.children}</StickyFooter>\n : <NonStickyFooter {...props}>{props.children}</NonStickyFooter>;\n}","export enum BulkOnboardingPreferencesState {\n None = 0,\n AllSubjects = 1,\n AllLevels = 2,\n AllSubjectsAndAllLevels = 3\n}","import { HashObject } from 'libs/common/react/interfaces';\n\nimport { BulkOnboardingPreferencesState } from 'libs/shared/enums/BulkOnboardingPreferencesState';\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { Presentation } from 'libs/shared/interfaces';\n\n/**\n * These are all the valid preference steps in the onboarding worflow\n * Steps are displayed in full workflow order from left to right.\n * \n * Important: Not all customers/users will be required to compelete all steps.\n * \n * School-level = presentation selection for K12\n */\nexport type OnboardingStep = 'welcome' | 'school-level' | 'curriculum' | 'audiences' | 'topics' | 'summary' ;\n\nexport const OnboardingHelper = {\n hasManyPresentationTypes(presentations: Presentation[] = []): HashObject {\n let totalAvailableSubjectPresentations = 0;\n let totalAvailableCurriculumPresentations = 0;\n\n presentations?.forEach(p => {\n if (p.type === PresentationType.Subject)\n totalAvailableSubjectPresentations++;\n\n else if (p.type === PresentationType.Curriculum)\n totalAvailableCurriculumPresentations++;\n });\n\n /**\n * The checks for \"> 1\" are done because we _only_ want to display presentation selectors\n * if the user has more than 1 presentation to select from. If they only have 1 available,\n * then that will always be used by default and they don't have to make any decisions.\n */\n return {\n hasManySubjectPresentations: totalAvailableSubjectPresentations > 1,\n hasManyCurriculumPresentations: totalAvailableCurriculumPresentations > 1\n };\n },\n\n getBulkPreferencesState(state: BulkOnboardingPreferencesState): { [key in 'levels' | 'subjects']: boolean } {\n if (state === BulkOnboardingPreferencesState.AllSubjectsAndAllLevels)\n return {\n levels: true,\n subjects: true\n };\n\n return {\n levels: state === BulkOnboardingPreferencesState.AllLevels,\n subjects: state === BulkOnboardingPreferencesState.AllSubjects\n };\n },\n\n hasBulkSelectedLevels(bulkState: BulkOnboardingPreferencesState): boolean {\n return (\n bulkState === BulkOnboardingPreferencesState.AllLevels ||\n bulkState === BulkOnboardingPreferencesState.AllSubjectsAndAllLevels\n );\n },\n\n hasBulkSelectedTopics(bulkState: BulkOnboardingPreferencesState): boolean {\n return (\n bulkState === BulkOnboardingPreferencesState.AllSubjects ||\n bulkState === BulkOnboardingPreferencesState.AllSubjectsAndAllLevels\n );\n },\n\n getNextBulkState(current: BulkOnboardingPreferencesState, managing: 'topics' | 'audiences'): BulkOnboardingPreferencesState {\n const { None, AllSubjects, AllLevels, AllSubjectsAndAllLevels } = BulkOnboardingPreferencesState;\n\n const isManagingTopics = managing === 'topics';\n\n switch (current) {\n case None:\n default:\n return isManagingTopics ? AllSubjects : AllLevels;\n case AllSubjects:\n return isManagingTopics ? None : AllSubjectsAndAllLevels;\n case AllLevels:\n return isManagingTopics ? AllSubjectsAndAllLevels : None;\n case AllSubjectsAndAllLevels:\n return isManagingTopics ? AllLevels : AllSubjects;\n }\n }\n};\n","import * as React from 'react';\n\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\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 = ({ breadcrumb: { name, appLink, active }, withBackIcon }: BreadcrumbItemProps) => (\n <li className={`breadcrumb-item${active ? ' active' : ''}`}>\n {active\n ? <strong>{name}</strong>\n : <AppLink appLink={appLink}>\n {withBackIcon && <SvgContainer svgName={cvSvgLibrary.ChevronLeft} size={SvgContainerSize.Small} />}\n <span className={withBackIcon ? 'ms-2' : ''}>{name}</span>\n </AppLink>\n }\n </li>\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;\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 return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {breadcrumbs.map((b, idx) => <BreadcrumbItem key={idx} breadcrumb={b} />)}\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: ' ' }} />\n </li>\n ))}\n </ol>\n </nav>\n );\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 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 ?? ''}>\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 p-2 text-nowrap ${styles.tabLink}\n `}\n onClick={() => onSelectTab(tab)}\n >\n <TabContents tab={tab} />\n </DivButton>\n )}\n </li>\n );\n })}\n </ul>\n </nav>\n );\n}\n","import { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\n\nimport { useMediaQuery } from './UseMediaQuery';\n\n/**\n * @deprecated Please use useBreakpoints() instead\n */\nexport function useGetMediaQueryString(): MediaQueryStrings {\n const isXS = useMediaQuery(MediaQueryStrings.XS);\n const isSM = useMediaQuery(MediaQueryStrings.SM);\n const isMD = useMediaQuery(MediaQueryStrings.MD);\n const isLG = useMediaQuery(MediaQueryStrings.LG);\n const isXL = useMediaQuery(MediaQueryStrings.XL);\n const isXXL = useMediaQuery(MediaQueryStrings.XXL);\n\n let currentString = MediaQueryStrings.LG; // default\n if (isXS) currentString = MediaQueryStrings.XS;\n if (isSM) currentString = MediaQueryStrings.SM;\n if (isMD) currentString = MediaQueryStrings.MD;\n if (isLG) currentString = MediaQueryStrings.LG;\n if (isXL) currentString = MediaQueryStrings.XL;\n if (isXXL) currentString = MediaQueryStrings.XXL;\n\n return currentString;\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 { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nconst HAS_NUMBER_REGEX = /\\d/;\nconst COUNT_OFFSET = 1;\n\nexport const AudienceStringBuilders = {\n /**\n * Handles audience sets like:\n * - Year 7, Year 8, etc\n * - Kindergarten, Grade 1, Grade 2, etc\n */\n yearsAndGradesBuilder(audiences: PresentationAudience[]): string {\n /**\n * Create a string with all of the audiences\n */\n const combinedNames = audiences.map(a => a.name).join(' ');\n\n /**\n * Extract all the numbers and matches from the string\n */\n const numberList = combinedNames.split(' ').filter(name => !isNaN(+name)).map(num => +num) || [];\n const wordList = combinedNames.split(' ').filter(name => isNaN(+name)) || [];\n\n // Find an audience that doesn't have a number, like \"Kindergarten\" or \"Foundation\".\n const audienceWithoutNum = audiences.find(p => {\n return !HAS_NUMBER_REGEX.test(p.name);\n });\n\n // Get audience label prefix\n let prefix = wordList.find(name => name !== audienceWithoutNum?.name);\n\n // Pluralise the prefix is there are multiple audiences\n if (audiences.length > 1)\n prefix += 's';\n\n if (audienceWithoutNum && numberList.length)\n return `${prefix} ${audienceWithoutNum.name.charAt(0)} - ${numberList.pop()}`;\n\n /**\n * Build set of logical audience ranges\n */\n const audienceRange = processAudienceRanges(numberList);\n\n return `${prefix} ${audienceRange.join(', ')}`;\n },\n\n internationalSecondaryBuilder(audiences: PresentationAudience[]): string {\n return AudienceStringBuilders.englandSecondaryBuilder(audiences);\n },\n\n scotlandPrimaryBuilder(audiences: PresentationAudience[]): string {\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n let [firstAudienceLevel] = firstAudience.name.split(' ');\n let [lastAudienceLevel] = lastAudience.name.split(' ');\n\n if (firstAudienceLevel === 'First')\n firstAudienceLevel = '1st';\n\n if (lastAudienceLevel === 'First')\n lastAudienceLevel = '1st';\n\n if (firstAudienceLevel === 'Second')\n firstAudienceLevel = '2nd';\n\n if (lastAudienceLevel === 'Second')\n lastAudienceLevel = '2nd';\n\n if (firstAudienceLevel === lastAudienceLevel)\n return `${firstAudienceLevel} Level`;\n\n return `${firstAudienceLevel} - ${lastAudienceLevel} Level`;\n },\n\n internationalPrimaryBuilder(audiences: PresentationAudience[]): string {\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n if (firstAudience.name === lastAudience.name)\n return firstAudience.name;\n\n let [firstAudienceLevel] = firstAudience.name.split(' ');\n let [lastAudienceLevel] = lastAudience.name.split(' ');\n\n if (firstAudienceLevel === 'Lower')\n firstAudienceLevel = 'Low';\n\n if (lastAudienceLevel === 'Lower')\n lastAudienceLevel = 'Low';\n\n if (firstAudienceLevel === 'Middle')\n firstAudienceLevel = 'Mid';\n\n if (lastAudienceLevel === 'Middle')\n lastAudienceLevel = 'Mid';\n\n return `${firstAudienceLevel} - ${lastAudienceLevel} Pri`;\n },\n\n /**\n * Handles the english secondary audiences, which can be: Lower Secondary, Upper Secondary, and Advanced\n */\n englandSecondaryBuilder(audiences: PresentationAudience[]): string {\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n if (firstAudience.name === lastAudience.name)\n return firstAudience.name;\n\n if (lastAudience.name === 'Advanced') {\n const [level] = firstAudience.name.split(' ');\n\n if (level.toLowerCase() === 'lower')\n return 'Lower Sec - Adv';\n\n return 'Upper Sec - Adv';\n }\n\n return 'Lower - Upper Sec';\n },\n\n scotlandSecondaryBuilder(audiences: PresentationAudience[]): string {\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n if (firstAudience.name === lastAudience.name)\n return firstAudience.name;\n\n if (lastAudience.name === 'Senior Phase')\n return `${firstAudience.name} - Senior`;\n\n return 'Third - Fourth Level';\n },\n\n /**\n * Handles the audience set: Reception, Key Stage 1, Lower Key Stage 2, and Upper Key Stage 2\n */\n englandPrimaryBuilder(audiences: PresentationAudience[]): string {\n // The first and last audience will build out the range\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n // The first word in the strings will either be \"Upper\", \"Lower\", \"Key\", or \"Reception\"\n const firstAudienceFirstWord = ArrayHelper.first(firstAudience.name.split(' '));\n const lastAudienceFirstWord = ArrayHelper.first(lastAudience.name.split(' '));\n\n // Each audience in this set except for \"Reception\" has a number. Get the numbers for the first and last audiences\n const firstAudienceNumber = firstAudience.name.split(' ').find(word => !isNaN(+word));\n const lastAudienceNumber = lastAudience.name.split(' ').find(word => !isNaN(+word));\n\n // If there's only one audience on the video:\n if (firstAudience === lastAudience) {\n // For these 2 audiences, return the full name as it's short enough already\n if (firstAudienceFirstWord === 'Key' || firstAudienceFirstWord === 'Reception')\n return firstAudience.name;\n\n // For the Upper/Lower key stage audiences, abbreviate the \"key stage\" part to KS1/KS2\n return `${firstAudienceFirstWord} KS${firstAudienceNumber}`;\n }\n\n /**\n * Handle when the object has >1 audience\n */\n\n let firstAudienceString = '';\n let lastAudienceString = '';\n\n // Reception is always shortened to \"R\" when in a range\n if (firstAudienceFirstWord === 'Reception') {\n firstAudienceString = 'R';\n } else {\n // All other audiences will be abbreviated to \"KS1/KS2\"\n firstAudienceString = `KS${firstAudienceNumber}`;\n }\n\n // The last audience will always be a key stage, so abbreviate this too\n lastAudienceString = `KS${lastAudienceNumber}`;\n\n // If the audience range contains both the \"Lower\" and \"Upper\" audiences, abbreviate those and return\n if (firstAudienceFirstWord === 'Lower' && lastAudienceFirstWord === 'Upper') {\n return `L ${firstAudienceString} - U ${lastAudienceString}`;\n }\n\n // Add \"Lower\" and \"Upper\" to the strings if it's needed\n if (firstAudienceFirstWord === 'Lower') {\n firstAudienceString = `Lower ${firstAudienceString}`;\n }\n\n if (lastAudienceFirstWord === 'Upper') {\n lastAudienceString = `Upper ${lastAudienceString}`;\n }\n\n // This handles a case where the range is Reception - Key Stage 1. In which case we don't abbreviate the key stage part to KS1.\n if (lastAudienceFirstWord === 'Key') {\n lastAudienceString = lastAudience.name;\n }\n\n return `${firstAudienceString} - ${lastAudienceString}`;\n }\n};\n\nfunction processAudienceRanges(audienceValues: number[]): string[] {\n /**\n * Lookahead by increments of offset\n */\n const offset = COUNT_OFFSET;\n\n let initialVal; let nextVal;\n let isContinguous: boolean = false;\n\n const ranges: string[] = [];\n\n // Audience values need to be in ascending order\n audienceValues = audienceValues.sort((a, b) => a - b);\n\n let i; let j;\n\n for (i = 0; i < audienceValues.length; i++) {\n j = i + 1;\n\n // Set our lower boundary to compare against\n if (!isContinguous)\n initialVal = audienceValues[i];\n\n nextVal = audienceValues[j];\n\n /**\n * Where the next number is also the next incremental value\n * we're going to continue iterating until the next value\n * is no longer contiguos.\n */\n if (audienceValues[i] + offset === nextVal) {\n isContinguous = true;\n } else if (isContinguous) {\n /**\n * Where we were tracking a contiguous set, format appropriately \n * and store the vals\n */\n\n ranges.push(`${initialVal} - ${audienceValues[i]}`);\n isContinguous = false;\n } else {\n /**\n * Where the values arent contiguous, just store the current value\n */\n\n ranges.push(`${audienceValues[i]}`);\n isContinguous = false;\n }\n }\n\n return ranges;\n}","import { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { HardCoded } from 'libs/shared/constants/HardCoded';\nimport { Audience, BaseObject, PresentationAudience } from 'libs/shared/interfaces';\n\nimport { AudienceStringBuilders } from './AudienceStringBuilders';\n\nconst DIGIT_REGEX = /([0-9]+)/ig;\nconst SPACE_REGEX = /\\s|\\+/ig;\n\n/**\n * Where there is 1 or less audiences on a presentation, it provides little value to\n * the user's experience, so we'll hide audiences altogether.\n */\nconst MIN_AUDIENCE_THRESHOLD = 1;\n\nexport const AudienceHelper = {\n /**\n * This is needed to sort an object's audiences, as they are not sorted by the backend.\n * To do this, we take the presentation audiences (sorted) and filter them by the object's\n * audiences, leaving behind a sorted array of object audiences.\n */\n getSortedPresentationAudiences(\n objectAudiences: Audience[],\n presentationAudiences: PresentationAudience[]\n ): PresentationAudience[] {\n /**\n * Atm there is a bug in flight's optimize, around multiple parts of the page \n * fetching the same object with a different response. We are filtering out\n * falsey values in our object audience ids until that's fixed. - Sha\n */\n const objectAudienceIds = objectAudiences\n .filter(v => !!v)\n .map(audience => audience.id.toString());\n\n /**\n * Remove audiences that aren't relevant for the user's current presentation\n */\n const filteredAudiences = presentationAudiences.filter(presAudience => {\n return objectAudienceIds.includes(presAudience.masterId.toString());\n });\n\n return filteredAudiences;\n },\n\n /**\n * This function accepts a set of presentation audiences, and returns a single\n * audience where the name is a merged string of the names of all of the audiences passed in.\n *\n * As we add more presentations that have different audience sets, we'll need to extend the `switch`\n * statement below to either include new string builder functions, or to include new presentation IDs\n * for existing string builder functions.\n */\n getMergedPresentationAudienceString(presentationAudiences: PresentationAudience[]): PresentationAudience {\n const { presentationId } = ArrayHelper.first(presentationAudiences);\n\n let mergedAudienceString = '';\n\n switch (+presentationId) {\n // Generic `Name Number`. Sometimes has just name. Examples: Year 12, Grade 4, Kindergarten\n case HardCoded.PresentationIds.DEFAULT:\n case HardCoded.PresentationIds.AU_SECONDARY:\n case HardCoded.PresentationIds.US_ELEMENTARY:\n case HardCoded.PresentationIds.AU_PRIMARY:\n case HardCoded.PresentationIds.STREAMABLE_LEARNING:\n if (presentationAudiences.length === 1)\n return presentationAudiences[0];\n\n mergedAudienceString = AudienceStringBuilders.yearsAndGradesBuilder(presentationAudiences);\n break;\n\n case HardCoded.PresentationIds.INTERNATIONAL_SECONDARY:\n if (presentationAudiences.length === 1)\n return presentationAudiences[0];\n\n // TODO: Implement this properly\n mergedAudienceString = AudienceStringBuilders.internationalSecondaryBuilder(presentationAudiences);\n break;\n\n case HardCoded.PresentationIds.INTERNATIONAL_PRIMARY:\n mergedAudienceString = AudienceStringBuilders.internationalPrimaryBuilder(presentationAudiences);\n break;\n\n case HardCoded.PresentationIds.SCOTLAND_PRIMARY:\n mergedAudienceString = AudienceStringBuilders.scotlandPrimaryBuilder(presentationAudiences);\n break;\n\n case HardCoded.PresentationIds.ENGLISH_SECONDARY:\n mergedAudienceString = AudienceStringBuilders.englandSecondaryBuilder(presentationAudiences);\n break;\n\n \n case HardCoded.PresentationIds.SCOTLAND_SECONDARY:\n mergedAudienceString = AudienceStringBuilders.scotlandSecondaryBuilder(presentationAudiences);\n break;\n\n // Key Stage 1, Lower Key Stage 2, etc.\n case HardCoded.PresentationIds.ENGLAND_PRIMARY:\n mergedAudienceString = AudienceStringBuilders.englandPrimaryBuilder(presentationAudiences);\n break;\n\n // These presentations only have 1 audience mapped. These are never shown as badges in the product.\n case HardCoded.PresentationIds.US_MIDDLE:\n case HardCoded.PresentationIds.US_HIGH:\n default:\n break;\n }\n\n if (!mergedAudienceString)\n return null;\n\n return { name: mergedAudienceString } as PresentationAudience;\n },\n\n /**\n * This function assumes the members array passed in is ordered by `name`.\n */\n sortMembersWithDuplicateNamesByAudience(members: BaseObject[]): BaseObject[] {\n // Returns the lowest level audience out of an array of audience objects by looking at the name\n const getLowestAudience = (audiences: Audience[]) => {\n if (!audiences.length)\n return null;\n\n let lowestAudience: Audience;\n let lowestAudienceDigit: number;\n\n audiences.forEach(audience => {\n const digit = +ArrayHelper.first(audience.name.match(DIGIT_REGEX));\n\n if (!lowestAudience) {\n lowestAudience = audience;\n lowestAudienceDigit = digit;\n return;\n }\n\n if (digit < lowestAudienceDigit)\n lowestAudience = audience;\n });\n\n return lowestAudience;\n };\n\n // This is used to track how many times a member's name appears in the collection\n const nameCountMap: HashObject<number> = {};\n\n let sorted: BaseObject[] = [];\n\n members.forEach(member => {\n if (!nameCountMap[member.name]) {\n nameCountMap[member.name] = 1;\n sorted.push(member);\n return;\n }\n\n sorted.push(member);\n nameCountMap[member.name]++;\n\n // Take the slice of duplicates that we want to sort by audience\n const slice = sorted.splice(sorted.length - nameCountMap[member.name]);\n\n // Sort the slice by lowest audience\n const sortedSlice = slice.sort((a: any, b: any) => {\n const firstObjLowestAudience = getLowestAudience(a.subjectPresentationAudiences.data);\n const secondObjLowestAudience = getLowestAudience(b.subjectPresentationAudiences.data);\n\n if (!firstObjLowestAudience && secondObjLowestAudience)\n return 1;\n\n if (!secondObjLowestAudience)\n return -1;\n\n const comparison = firstObjLowestAudience.name.localeCompare(secondObjLowestAudience.name);\n\n if (comparison === 0) return comparison;\n\n return comparison > 0 ? -1 : 1;\n });\n\n sorted = sorted.concat(sortedSlice);\n });\n\n return sorted;\n },\n\n getActiveAudiencesFromParams(audiences: PresentationAudience[], params: HashObject = {}): PresentationAudience[] {\n if (!ObjectHelper.isObject(params) || ObjectHelper.isEmpty(params))\n return;\n\n if (!audiences || !audiences.length)\n return;\n\n if (!AudienceHelper.shouldShowAudiences(audiences))\n return;\n\n // 'a' is shorthand for audience\n let { a } = params;\n\n if (!a)\n return;\n\n // Only a single query param was passed, we'll wrap it in an array\n if (typeof a === 'string')\n a = [a];\n\n const normalizeAudienceName = (audienceName: string) => {\n return audienceName.replace(SPACE_REGEX, '').toLowerCase();\n };\n\n // Build an audience lookup\n const audienceLookup = a.reduce((state: HashObject, audienceStr: string) => {\n state[normalizeAudienceName(audienceStr)] = audienceStr;\n return state;\n }, {});\n\n // Filter out our active audience based on whether their name matches the lookup object\n return audiences.filter((audience: PresentationAudience) => {\n return audienceLookup[normalizeAudienceName(audience.name)];\n });\n },\n\n getAudienceParams(audiences: PresentationAudience[]): HashObject {\n if (!audiences?.length)\n return null;\n\n return { a: audiences.map(a => a.name) };\n },\n\n shouldShowAudiences(audiences: PresentationAudience[] = []): boolean {\n if (!audiences)\n return false;\n\n return audiences.length > MIN_AUDIENCE_THRESHOLD;\n }\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"tabs\":\"oHDjZ\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { PillTab, PillTabSelector } from 'libs/shared/components/pill-tab-selector/PillTabSelector';\nimport { Presentation, PresentationAudience } from 'libs/shared/interfaces';\nimport { ContextService } from 'libs/shared/services/ContextService';\nimport { AudienceHelper } from 'libs/shared/utils/audience-helper/AudienceHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { SettingsLayout } from 'apps/settings/components/settings-layout/SettingsLayout';\nimport { OnboardingHelper } from 'apps/subjects/utils/OnboardingHelper';\n\nimport styles from './preferences-layout.scss';\n\nconst namespace = 'settings.preferencesLayout';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ntype PreferencesLayoutProps = React.PropsWithChildren<{\n availablePresentations: Presentation[];\n audiences: PresentationAudience[];\n}>;\n\nexport function PreferencesLayout(props: PreferencesLayoutProps): JSX.Element {\n const currentAppLink = ContextService.getCurrentRoute()?.appLink;\n\n const isActive = (action: string) => action === currentAppLink?.action;\n\n const triggerAppLink = (action: string) => {\n Core.AppLinkHelper.trigger({\n application: AppChannels.SETTINGS,\n action\n });\n };\n\n function getTabs(): PillTab[] {\n const tabs = [{\n name: getPhrase('topics'),\n active: isActive(Actions.Settings.TOPIC_PREFERENCES),\n onSelect: () => triggerAppLink(Actions.Settings.TOPIC_PREFERENCES)\n }];\n \n const hasSelectableLevels = AudienceHelper.shouldShowAudiences(props.audiences);\n\n if (hasSelectableLevels) {\n tabs.push({\n name: getPhrase('yearGroups'),\n active: isActive(Actions.Settings.AUDIENCE_PREFERENCES),\n onSelect: () => triggerAppLink(Actions.Settings.AUDIENCE_PREFERENCES)\n });\n }\n\n const {\n hasManyCurriculumPresentations,\n hasManySubjectPresentations\n } = OnboardingHelper.hasManyPresentationTypes(props.availablePresentations);\n\n if (hasManyCurriculumPresentations) {\n tabs.push({\n name: getPhrase('curriculum'),\n active: isActive(Actions.Settings.CURRICULUM),\n onSelect: () => triggerAppLink(Actions.Settings.CURRICULUM)\n });\n }\n\n if (hasManySubjectPresentations) {\n tabs.push({\n name: getPhrase('schoolLevel'),\n active: isActive(Actions.Settings.SCHOOL_LEVEL),\n onSelect: () => triggerAppLink(Actions.Settings.SCHOOL_LEVEL)\n });\n }\n\n return tabs;\n }\n\n const tabs = getTabs();\n\n return (\n <SettingsLayout\n heading={getPhrase('heading')}\n breadcrumbs={[getPhrase('breadcrumb')]}\n >\n {tabs.length > 1 && (\n <PillTabSelector\n tabs={getTabs()}\n className={styles.tabs}\n />\n )}\n\n {props.children}\n </SettingsLayout>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { useGetSettingsGroups } from 'apps/settings/hooks/useGetSettingsGroups';\n\nconst namespace = 'settings.settingsLayout';\n\n/**\n * Checks if the current user has permission to access the settings module\n */\nexport const useCanAccessSettings = (requiredPermissions: PermissionName | PermissionName[]): boolean => {\n const { hasPermissions } = usePermissions();\n const settingsGroups = useGetSettingsGroups();\n\n /**\n * TODO: Update all settings pages to pasas required permissions, because checking the \n * `useGetSettingsGroups()` values clearly doesnt work for settings pages with multiple\n * applinks inside of them. - Sha\n */\n if (requiredPermissions)\n return hasPermissions(requiredPermissions);\n\n const currentRoute = Core.AppLinkHelper.getCurrentAppLink();\n\n /**\n * Allows us to have popups sitting in other locations be used\n * by our settings pages. For example the manage video access popup\n * in the \"videos with restricted access\" page - Sha\n */\n if (currentRoute.application !== AppChannels.SETTINGS)\n return true;\n\n return settingsGroups.some(group => {\n return group.modules.some(settingsModule => {\n if ('appLink' in settingsModule) {\n return settingsModule.appLink.action === currentRoute.action;\n }\n\n return false;\n });\n });\n};\n\ninterface SettingsLayoutProps {\n heading: string;\n breadcrumbs: string[];\n description?: string;\n requiredPermissions?: PermissionName | PermissionName[];\n headingButton?: () => JSX.Element;\n}\n\nexport function SettingsLayout(props: React.PropsWithChildren<SettingsLayoutProps>): JSX.Element {\n const canAccess = useCanAccessSettings(props.requiredPermissions);\n\n React.useEffect(() => {\n if (!canAccess) {\n Core.AppLinkHelper.trigger({\n application: AppChannels.SETTINGS,\n action: Actions.Settings.HOME\n }, { replace: true });\n }\n }, [canAccess]);\n\n if (!canAccess)\n return <></>;\n\n const breadcrumbs = props.breadcrumbs.map((name, i) => ({\n name,\n appLink: {\n application: AppChannels.SETTINGS,\n action: Actions.Settings.HOME\n },\n active: i === props.breadcrumbs.length - 1\n }));\n\n return (\n <div className='px-3'>\n <div className='d-flex align-items-center justify-content-between'>\n <h1 className='h2'>{props.heading}</h1>\n {props.headingButton?.()}\n </div>\n <div className='pb-3'>\n <Breadcrumbs\n breadcrumbs={[\n {\n name: LanguageService.getPhrase(namespace, 'settingsBreadcrumb'),\n appLink: {\n application: AppChannels.SETTINGS,\n action: Actions.Settings.HOME\n }\n },\n ...breadcrumbs\n ]}\n />\n </div>\n {props.description &&\n <>\n <p>{props.description}</p>\n <hr />\n </>\n }\n\n {props.children}\n </div>\n );\n}","import React from 'react';\nimport { Spinner } from 'react-bootstrap';\n\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport styles from './onboarding-loader.scss';\n\nconst namespace = 'subjects.onboardingLoader';\n\ninterface OnboardingLoaderProps {\n onDone: () => void;\n}\n\nexport function OnboardingLoader(props: OnboardingLoaderProps): JSX.Element {\n React.useEffect(() => {\n window.setTimeout(props.onDone, 2500);\n }, []);\n\n return (\n <div className='d-flex flex-column align-items-center'>\n <div className='py-3'>\n <Spinner as='span' animation='border' role='status' className={styles.spinner} />\n </div>\n\n <h2 className={styles.heading}><Text namespace={namespace} phrase='heading' /></h2>\n <p className={`mb-0 pb-4 text-center ${styles.description}`}>\n <Text namespace={namespace} phrase='info' />\n </p>\n\n <div className='drop-shadow mb-n5'>\n <img\n src={ImageUrls.Onboarding.LOADER}\n alt=''\n role='presentation'\n className='img-fluid'\n />\n </div>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"spinner\":\"SVq72\",\"heading\":\"iS5ZE\",\"description\":\"JaUIN\"};","import React from 'react';\nimport Cookies from 'js-cookie';\n\nimport { Core } from 'libs/common/core';\n\nimport { OnboardingHelper as SharedOnboardingHelper, OnboardingStep } from 'libs/shared/apps/subjects/utils/OnboardingHelper';\nimport { DialogHelper } from 'libs/shared/utils/DialogHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { OnboardingLoader } from 'apps/subjects/components/onboarding-loader/OnboardingLoader';\n\nexport const OnboardingHelper = {\n ...SharedOnboardingHelper,\n\n buildAppLink(step: OnboardingStep, redirectUrl?: string): Core.AppLink {\n const application = AppChannels.SUBJECT;\n\n const action = (() => {\n if (step === 'welcome') return Actions.Subjects.ONBOARDING_WELCOME;\n if (step === 'school-level') return Actions.Subjects.ONBOARDING_TOPIC_PRESENTATION;\n if (step === 'curriculum') return Actions.Subjects.ONBOARDING_CURRICULUM_PRESENTATION;\n })();\n\n const appLink: Core.AppLink = { application, action };\n\n if (redirectUrl)\n appLink.params = { redirectUrl };\n\n return appLink;\n },\n\n redirect(redirectUrl: string = ''): void {\n const appLink: Core.AppLink = {\n application: AppChannels.SUBJECT,\n action: Actions.Subjects.ONBOARDING\n };\n\n if (redirectUrl)\n appLink.params = { redirectUrl };\n\n Core.AppLinkHelper.trigger(appLink, { replace: true });\n },\n\n onCompleteOnboardingSuccess(userId: string, redirectUrl: string = '/'): void {\n Cookies.set('_onboardingComplete', userId, { expires: 30 });\n\n /**\n * For users just completing onboarding, we want to do a full page load so that the top nav items\n * can be loaded back in. The top nav items are hidden for new users who are forced through onboarding.\n */\n const onDone = () => Core.LocationUtils.PageLoad(redirectUrl);\n\n // Artificially make the request take longer so that the button spins for longer\n window.setTimeout(() => {\n DialogHelper.render(<OnboardingLoader onDone={onDone} />, {\n size: 'lg',\n dialogClassName: 'rounded-3',\n hideButtons: true,\n centered: true,\n cancelButtonProps: {\n onClick: onDone\n }\n });\n }, 250);\n }\n};\n","/*!\n * JavaScript Cookie v2.2.1\n * https://github.com/js-cookie/js-cookie\n *\n * Copyright 2006, 2015 Klaus Hartl & Fagner Brack\n * Released under the MIT license\n */\n;(function (factory) {\n\tvar registeredInModuleLoader;\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine(factory);\n\t\tregisteredInModuleLoader = true;\n\t}\n\tif (typeof exports === 'object') {\n\t\tmodule.exports = factory();\n\t\tregisteredInModuleLoader = true;\n\t}\n\tif (!registeredInModuleLoader) {\n\t\tvar OldCookies = window.Cookies;\n\t\tvar api = window.Cookies = factory();\n\t\tapi.noConflict = function () {\n\t\t\twindow.Cookies = OldCookies;\n\t\t\treturn api;\n\t\t};\n\t}\n}(function () {\n\tfunction extend () {\n\t\tvar i = 0;\n\t\tvar result = {};\n\t\tfor (; i < arguments.length; i++) {\n\t\t\tvar attributes = arguments[ i ];\n\t\t\tfor (var key in attributes) {\n\t\t\t\tresult[key] = attributes[key];\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tfunction decode (s) {\n\t\treturn s.replace(/(%[0-9A-Z]{2})+/g, decodeURIComponent);\n\t}\n\n\tfunction init (converter) {\n\t\tfunction api() {}\n\n\t\tfunction set (key, value, attributes) {\n\t\t\tif (typeof document === 'undefined') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tattributes = extend({\n\t\t\t\tpath: '/'\n\t\t\t}, api.defaults, attributes);\n\n\t\t\tif (typeof attributes.expires === 'number') {\n\t\t\t\tattributes.expires = new Date(new Date() * 1 + attributes.expires * 864e+5);\n\t\t\t}\n\n\t\t\t// We're using \"expires\" because \"max-age\" is not supported by IE\n\t\t\tattributes.expires = attributes.expires ? attributes.expires.toUTCString() : '';\n\n\t\t\ttry {\n\t\t\t\tvar result = JSON.stringify(value);\n\t\t\t\tif (/^[\\{\\[]/.test(result)) {\n\t\t\t\t\tvalue = result;\n\t\t\t\t}\n\t\t\t} catch (e) {}\n\n\t\t\tvalue = converter.write ?\n\t\t\t\tconverter.write(value, key) :\n\t\t\t\tencodeURIComponent(String(value))\n\t\t\t\t\t.replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);\n\n\t\t\tkey = encodeURIComponent(String(key))\n\t\t\t\t.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent)\n\t\t\t\t.replace(/[\\(\\)]/g, escape);\n\n\t\t\tvar stringifiedAttributes = '';\n\t\t\tfor (var attributeName in attributes) {\n\t\t\t\tif (!attributes[attributeName]) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tstringifiedAttributes += '; ' + attributeName;\n\t\t\t\tif (attributes[attributeName] === true) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Considers RFC 6265 section 5.2:\n\t\t\t\t// ...\n\t\t\t\t// 3. If the remaining unparsed-attributes contains a %x3B (\";\")\n\t\t\t\t// character:\n\t\t\t\t// Consume the characters of the unparsed-attributes up to,\n\t\t\t\t// not including, the first %x3B (\";\") character.\n\t\t\t\t// ...\n\t\t\t\tstringifiedAttributes += '=' + attributes[attributeName].split(';')[0];\n\t\t\t}\n\n\t\t\treturn (document.cookie = key + '=' + value + stringifiedAttributes);\n\t\t}\n\n\t\tfunction get (key, json) {\n\t\t\tif (typeof document === 'undefined') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar jar = {};\n\t\t\t// To prevent the for loop in the first place assign an empty array\n\t\t\t// in case there are no cookies at all.\n\t\t\tvar cookies = document.cookie ? document.cookie.split('; ') : [];\n\t\t\tvar i = 0;\n\n\t\t\tfor (; i < cookies.length; i++) {\n\t\t\t\tvar parts = cookies[i].split('=');\n\t\t\t\tvar cookie = parts.slice(1).join('=');\n\n\t\t\t\tif (!json && cookie.charAt(0) === '\"') {\n\t\t\t\t\tcookie = cookie.slice(1, -1);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tvar name = decode(parts[0]);\n\t\t\t\t\tcookie = (converter.read || converter)(cookie, name) ||\n\t\t\t\t\t\tdecode(cookie);\n\n\t\t\t\t\tif (json) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tcookie = JSON.parse(cookie);\n\t\t\t\t\t\t} catch (e) {}\n\t\t\t\t\t}\n\n\t\t\t\t\tjar[name] = cookie;\n\n\t\t\t\t\tif (key === name) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {}\n\t\t\t}\n\n\t\t\treturn key ? jar[key] : jar;\n\t\t}\n\n\t\tapi.set = set;\n\t\tapi.get = function (key) {\n\t\t\treturn get(key, false /* read as raw */);\n\t\t};\n\t\tapi.getJSON = function (key) {\n\t\t\treturn get(key, true /* read as json */);\n\t\t};\n\t\tapi.remove = function (key, attributes) {\n\t\t\tset(key, '', extend(attributes, {\n\t\t\t\texpires: -1\n\t\t\t}));\n\t\t};\n\n\t\tapi.defaults = {};\n\n\t\tapi.withConverter = init;\n\n\t\treturn api;\n\t}\n\n\treturn init(function () {});\n}));\n","// extracted by mini-css-extract-plugin\nexport default {\"pillTabSelector\":\"Hdi6o\",\"tab\":\"RvNxr\",\"minWidth\":\"GHSz9\",\"radiusSmall\":\"VhJJa\",\"tabLink\":\"WFyvo\"};"],"names":["SCROLL_TOLERANCE","StickyFooter","props","justifyClass","justify","className","children","NonStickyFooter","mediaQuery","widthClass","OnboardingFooter","isScrolledToBottom","window","innerHeight","scrollY","document","body","offsetHeight","isSticky","setIsSticky","throttledOnViewportChange","FunctionHelper","shouldSetToSticky","addEventListener","removeEventListener","defaultProps","BulkOnboardingPreferencesState","OnboardingHelper","hasManyPresentationTypes","presentations","totalAvailableSubjectPresentations","totalAvailableCurriculumPresentations","forEach","p","type","PresentationType","hasManySubjectPresentations","hasManyCurriculumPresentations","getBulkPreferencesState","state","AllSubjectsAndAllLevels","levels","subjects","AllLevels","AllSubjects","hasBulkSelectedLevels","bulkState","hasBulkSelectedTopics","getNextBulkState","current","managing","None","isManagingTopics","BreadcrumbItem","breadcrumb","name","appLink","active","withBackIcon","svgName","size","S","Breadcrumbs","breadcrumbs","isMobile","length","map","b","idx","key","PartialBreadcrumbs","numItems","style","height","width","dangerouslySetInnerHTML","__html","TabContents","tab","count","data","PillTabSelector","borderRadius","listClassName","tabs","index","analyticsData","analyticsOptions","onClick","onSelect","onSelectTab","useGetMediaQueryString","isXS","isSM","isMD","isLG","isXL","isXXL","currentString","DEFAULT_PARTIAL_LOADING_OPTIONS","minWidth","maxWidth","PartialLoadingHelper","getPartialLoadingItems","options","opts","Array","Math","max","floor","random","HAS_NUMBER_REGEX","AudienceStringBuilders","yearsAndGradesBuilder","audiences","combinedNames","a","join","numberList","split","filter","isNaN","num","wordList","audienceWithoutNum","find","test","prefix","charAt","pop","audienceRange","audienceValues","initialVal","nextVal","i","j","isContinguous","ranges","sort","push","processAudienceRanges","internationalSecondaryBuilder","englandSecondaryBuilder","scotlandPrimaryBuilder","firstAudience","ArrayHelper","lastAudience","firstAudienceLevel","lastAudienceLevel","internationalPrimaryBuilder","toLowerCase","scotlandSecondaryBuilder","englandPrimaryBuilder","firstAudienceFirstWord","lastAudienceFirstWord","firstAudienceNumber","word","lastAudienceNumber","firstAudienceString","lastAudienceString","DIGIT_REGEX","SPACE_REGEX","AudienceHelper","getSortedPresentationAudiences","objectAudiences","presentationAudiences","objectAudienceIds","v","audience","id","toString","presAudience","includes","masterId","getMergedPresentationAudienceString","mergedAudienceString","presentationId","HardCoded","sortMembersWithDuplicateNamesByAudience","members","getLowestAudience","digit","match","lowestAudience","lowestAudienceDigit","nameCountMap","sorted","member","sortedSlice","splice","firstObjLowestAudience","subjectPresentationAudiences","secondObjLowestAudience","comparison","localeCompare","concat","getActiveAudiencesFromParams","params","ObjectHelper","shouldShowAudiences","normalizeAudienceName","audienceName","replace","audienceLookup","reduce","audienceStr","getAudienceParams","getPhrase","LanguageService","PreferencesLayout","currentAppLink","ContextService","isActive","action","triggerAppLink","application","getTabs","availablePresentations","SettingsLayout","heading","namespace","useCanAccessSettings","requiredPermissions","hasPermissions","settingsGroups","currentRoute","some","group","modules","settingsModule","canAccess","headingButton","description","OnboardingLoader","setTimeout","onDone","Spinner","as","animation","role","Text","phrase","src","ImageUrls","alt","buildAppLink","step","redirectUrl","redirect","onCompleteOnboardingSuccess","userId","expires","DialogHelper","dialogClassName","hideButtons","centered","cancelButtonProps","factory","extend","result","arguments","attributes","decode","s","decodeURIComponent","init","converter","api","set","value","path","defaults","Date","toUTCString","JSON","stringify","e","write","encodeURIComponent","String","escape","stringifiedAttributes","attributeName","cookie","get","json","jar","cookies","parts","slice","read","parse","getJSON","remove","withConverter","module","exports"],"sourceRoot":""}
|