@clickview/lite 0.75.0-rc.7 → 0.75.0-rc.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/bundles.json +1 -1
  2. package/dist/scripts/1199-dc45a88be8-lite.chunk.js +2 -0
  3. package/dist/scripts/1199-dc45a88be8-lite.chunk.js.map +1 -0
  4. package/dist/scripts/4208-f22ed7a148-lite.chunk.js +2 -0
  5. package/dist/scripts/4208-f22ed7a148-lite.chunk.js.map +1 -0
  6. package/dist/scripts/6550-1d60d863e8-lite.chunk.js +2 -0
  7. package/dist/scripts/6550-1d60d863e8-lite.chunk.js.map +1 -0
  8. package/dist/scripts/{7148-50ccb48a44-lite.chunk.js → 7148-e314dd9a4e-lite.chunk.js} +2 -2
  9. package/dist/scripts/7148-e314dd9a4e-lite.chunk.js.map +1 -0
  10. package/dist/scripts/8856-361fe76b7a-lite.chunk.js +2 -0
  11. package/dist/scripts/8856-361fe76b7a-lite.chunk.js.map +1 -0
  12. package/dist/scripts/9042-544d97a05d-lite.chunk.js +2 -0
  13. package/dist/scripts/9042-544d97a05d-lite.chunk.js.map +1 -0
  14. package/dist/scripts/{9634-f10e5980bd-lite.chunk.js → 9634-0a07635b99-lite.chunk.js} +2 -2
  15. package/dist/scripts/9634-0a07635b99-lite.chunk.js.map +1 -0
  16. package/dist/scripts/{bundle-67a8b81035.min.js → bundle-cf4c360278.min.js} +3 -3
  17. package/dist/scripts/{bundle-67a8b81035.min.js.map → bundle-cf4c360278.min.js.map} +1 -1
  18. package/package.json +1 -1
  19. package/dist/scripts/1199-1cddf4e0e0-lite.chunk.js +0 -2
  20. package/dist/scripts/1199-1cddf4e0e0-lite.chunk.js.map +0 -1
  21. package/dist/scripts/4208-3ba21abb7c-lite.chunk.js +0 -2
  22. package/dist/scripts/4208-3ba21abb7c-lite.chunk.js.map +0 -1
  23. package/dist/scripts/6550-c621babbcb-lite.chunk.js +0 -2
  24. package/dist/scripts/6550-c621babbcb-lite.chunk.js.map +0 -1
  25. package/dist/scripts/7148-50ccb48a44-lite.chunk.js.map +0 -1
  26. package/dist/scripts/8856-8ac95bf4e0-lite.chunk.js +0 -2
  27. package/dist/scripts/8856-8ac95bf4e0-lite.chunk.js.map +0 -1
  28. package/dist/scripts/9042-3092af11d5-lite.chunk.js +0 -2
  29. package/dist/scripts/9042-3092af11d5-lite.chunk.js.map +0 -1
  30. package/dist/scripts/9634-f10e5980bd-lite.chunk.js.map +0 -1
  31. /package/dist/scripts/{bundle-67a8b81035.min.js.LICENSE.txt → bundle-cf4c360278.min.js.LICENSE.txt} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/6550-1d60d863e8-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/utils/AnalyticsRequestUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/flight-requests/InteractiveResultsRequests.ts","file:///app/packages/libs/shared/src/apps/analytics/hooks/UseFetchInteractiveResults.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/AnalyticsFilterUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/AnonymiseUserUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/InteractiveUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/AudienceUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/DateRangeUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/views/generate-report/GenerateInteractiveResultsReportView.tsx","file:///app/packages/libs/shared/src/components/percentage-indicator/PercentageIndicator.tsx","file:///app/packages/libs/shared/src/components/percentage-indicator/PercentageIndicatorUtils.ts","file:///app/packages/libs/shared/src/constants/ScoreThresholds.ts","file:///app/packages/libs/shared/src/enums/InteractionCorrectness.ts","file:///app/packages/libs/shared/src/enums/InteractiveAnswerStatus.ts","file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/hooks/UseHandleObjectError.ts","file:///app/packages/libs/shared/src/errors/general/verified-email/VerifiedEmailRequiredError.ts","file:///app/packages/libs/shared/src/hooks/useVerifiedEmailRequiredErrorHandler.ts","file:///app/packages/libs/shared/src/utils/AppRouteHelper.ts","file:///app/packages/libs/shared/src/utils/InteractiveCorrectnessHelper.ts","file:///app/packages/libs/shared/src/components/percentage-indicator/percentage-indicator.scss"],"sourcesContent":["import { AnalyticsRequestFilter } from 'libs/shared/interfaces';\n\nexport function getAnalyticsRequestKey(baseKey: string, filter: AnalyticsRequestFilter, extra?: string): string {\n if (!filter)\n return baseKey;\n\n let key = `${baseKey}:${filter.start}:${filter.end}`;\n\n const userIdKey = Array.isArray(filter.userId) ? filter.userId.sort().join(':') : filter.userId;\n const groupIdKey = Array.isArray(filter.groupId) ? filter.groupId.sort().join(':') : filter.groupId;\n const customerIdKey = Array.isArray(filter.customerId) ? filter.customerId.sort().join(':') : filter.customerId;\n\n if (userIdKey)\n key += `:${userIdKey}`;\n\n if (groupIdKey)\n key += `:${groupIdKey}`;\n\n if (customerIdKey)\n key += `:${customerIdKey}`;\n\n if (extra)\n key += `:${extra}`;\n\n return key;\n}","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Flight } from 'libs/common/react/index';\n\nimport { MarkInteractiveAnswer } from 'libs/shared/apps/analytics/interfaces/MarkInteractiveAnswer';\nimport { InteractiveResultsReport } from 'libs/shared/apps/analytics/interfaces/requests/InteractiveResultsReport';\nimport { InteractivesPendingReviewsRequest } from 'libs/shared/apps/analytics/interfaces/requests/InteractivesPendingReviewsRequest';\nimport { AnalyticsRequestFilter, CurrentUser, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { getAnalyticsRequestKey } from 'libs/shared/utils/AnalyticsRequestUtils';\n\ninterface InteractiveResultFilters {\n currentUserId: string;\n currentCustomerId: string;\n dateRange?: { start: string, end: string }\n userIds?: string | string[];\n classroomsAndGroups?: string | string[];\n shareId?: string;\n}\n\nfunction getInteractiveResultFilters(\n currentUser: CurrentUser,\n filter: AnalyticsRequestFilter,\n shareId?: string\n): InteractiveResultFilters {\n return {\n currentUserId: currentUser.id,\n currentCustomerId: currentUser.customerId,\n dateRange: filter ? { start: filter.start, end: filter.end } : undefined,\n userIds: filter?.userId,\n classroomsAndGroups: filter?.groupId,\n shareId: shareId\n };\n}\n\nexport const InteractiveResultsRequests = {\n /** \n * This endpoint returns data with a lot of duplicated ids,\n * e.g. student answers to the same question will have the same id.\n * Because of that, we don't normalize.\n */\n interactiveResultSet(\n interactiveId: string,\n interactiveMetadataId: string,\n currentUser: CurrentUser,\n filter?: AnalyticsRequestFilter,\n shareId?: string,\n success?: (data: InteractiveResultSet) => void,\n error?: (data: any) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: shareId ?\n `/api/domain/v3/analytics/interactives/${interactiveId}/metadata/${interactiveMetadataId}` :\n `/api/domain/v2/analytics/interactives/${interactiveId}/metadata/${interactiveMetadataId}`,\n key: getAnalyticsRequestKey(`interactive:result:set:${interactiveId}:${interactiveMetadataId}:${shareId}`, filter),\n data: getInteractiveResultFilters(currentUser, filter, shareId),\n type: HttpVerbs.POST,\n normalize: false,\n success,\n error,\n always\n };\n },\n \n /**\n * As the response from `interactiveResultSet` isn't normalised, we need to invalidate the cache\n * to update the results data.\n */\n mark(\n interactiveId: string,\n interactiveMetadataId: string,\n answerId: string,\n data: MarkInteractiveAnswer,\n success?: () => void,\n error?: (data: any) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `/api/domain/v1/analytics/answers/${answerId}`,\n key: `mark:answer:${answerId}:${data.resultId}`,\n type: HttpVerbs.PUT,\n data,\n normalize: false,\n invalidationKeys: `interactive:result:set:${interactiveId}:${interactiveMetadataId}`,\n success,\n error,\n always\n };\n },\n\n pendingReviews(data: InteractivesPendingReviewsRequest): Flight.Request {\n return {\n url: `/api/domain/v1/analytics/interactives/pending-reviews/summary`,\n key: `interactives:pending:reviews`,\n type: HttpVerbs.POST,\n data\n };\n },\n\n interactiveResultsReport(data: InteractiveResultsReport): Flight.Request {\n return {\n url: '/api/domain/v3/analytics/interactives/report',\n key: 'interactive:results:report',\n data,\n type: HttpVerbs.POST,\n normalize: false\n };\n }\n};","import { Flight } from 'libs/common/flight';\n\nimport { InteractiveResultsRequests } from 'libs/shared/apps/analytics/flight-requests/InteractiveResultsRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { AnalyticsRequestFilter, CurrentUser, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\n\nexport function useFetchInteractiveResults(\n interactiveMetadataId: string,\n requestFilter?: AnalyticsRequestFilter,\n shareId?: string\n): Flight.Response<InteractiveResultSet> {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(!!interactiveMetadataId &&\n InteractiveRequests.interactiveMetadata(interactiveMetadataId));\n\n const interactive = Flight.useBasicFetch<Interactive>(!!interactiveMetadata.data?.interactiveId &&\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId));\n\n const shouldFetchResults = !!currentUser.data && !!interactive.data;\n\n return Flight.useBasicFetch<InteractiveResultSet>(shouldFetchResults &&\n InteractiveResultsRequests.interactiveResultSet(\n interactiveMetadata.data.interactiveId,\n interactiveMetadata.data.id,\n currentUser.data,\n requestFilter,\n shareId\n ));\n}","import { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AudienceQueryParams } from 'libs/shared/apps/analytics/interfaces/AudienceQueryParams';\nimport { DateRangeQueryParams } from 'libs/shared/apps/analytics/interfaces/DateRangeQueryParams';\nimport { ContextService } from 'libs/shared/services/ContextService';\n\nexport const AnalyticsFilterHelper = {\n getAudienceAppLinkParams: () => {\n const { appLink } = ContextService.getCurrentRoute();\n const params = ObjectHelper.isObject(appLink.params) ? appLink.params as HashObject : {};\n const { users, classrooms, classroomGroups } = params;\n\n const getParam = (key: keyof AudienceQueryParams) => {\n const param = params[key];\n\n if (!param)\n return;\n\n return Array.isArray(param) ? param : [param];\n };\n\n const audienceFilters: AudienceQueryParams = {};\n\n if (users)\n audienceFilters.users = getParam('users');\n\n if (classrooms)\n audienceFilters.classrooms = getParam('classrooms');\n\n if (classroomGroups)\n audienceFilters.classroomGroups = getParam('classroomGroups');\n\n return audienceFilters;\n },\n getDateRangeAppLinkParams: () => {\n const { appLink } = ContextService.getCurrentRoute();\n const params = ObjectHelper.isObject(appLink.params) ? appLink.params as HashObject : {};\n const { from, to, rangeName } = params;\n\n const dateRangeFilters: DateRangeQueryParams = {};\n\n if (from)\n dateRangeFilters.from = from;\n\n if (to)\n dateRangeFilters.to = to;\n\n if (rangeName)\n dateRangeFilters.rangeName = rangeName;\n\n return dateRangeFilters;\n }\n};","import { animals, colors, Config as UniqueNamesConfig, uniqueNamesGenerator } from 'unique-names-generator';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nconst namespace = 'shared.analyticsUtils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction guidToSeed(guid: string): number {\n if (!guid)\n return 0;\n\n // Simple hash function (DJB2-like) for browsers\n let hash = 0;\n for (let i = 0; i < guid.length; i++) {\n const char = guid.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash |= 0; // Convert to 32bit integer\n }\n return Math.abs(hash);\n}\n\nfunction getUniqueNamesConfig(userId: string, sessionId: string): UniqueNamesConfig {\n /**\n * Generate a seed that is unique to each user but changes every 5 minutes.\n * \n * We use a seed so that if the same user's name is anonymised multiple times\n * in quick succession (e.g. multiple renders), the same name will be returned each time.\n * \n * We change the seed every 5 minutes so that students don't always have the same name.\n */\n const seed = +`${userId || guidToSeed(sessionId)}${Math.floor((new Date()).getMinutes() / 5)}`;\n\n return {\n dictionaries: [ colors, animals ],\n separator: ' ',\n length: 2,\n style: 'capital',\n seed\n };\n}\n\nexport function anonymiseUserName(user: AnonUser, shouldAnonymise: boolean): string {\n if (!user) {\n return getPhrase('anonUser');\n }\n\n if (!shouldAnonymise)\n return UserHelper.getFullName(user) || getPhrase('anonUser');\n\n return uniqueNamesGenerator(getUniqueNamesConfig(user.id, user.sessionId));\n}\n","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { ResultsSummary } from 'libs/shared/apps/analytics/interfaces/ResultsSummary';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { ScoreThresholdDefaults, ScoreThresholds } from 'libs/shared/constants/ScoreThresholds';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, StudentAnswer, StudentResults } from 'libs/shared/interfaces';\nimport { Interactive, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { flattenInteractions, getInteractions, getStudentAttempt, getStudentResult } from 'libs/shared/utils/InteractiveHelper';\n\ninterface StudentGroups {\n markingRequired: StudentResultsWithSummary[];\n lowScore: StudentResultsWithSummary[];\n highScore: StudentResultsWithSummary[];\n completed: StudentResultsWithSummary[];\n notCompleted: StudentResultsWithSummary[];\n}\n\nexport function groupStudents(\n interactive: Interactive,\n results: InteractiveResultSet,\n scoreThreshold?: ScoreThresholds\n): StudentGroups {\n const groups: StudentGroups = {\n markingRequired: [],\n lowScore: [],\n highScore: [],\n completed: [],\n notCompleted: []\n };\n\n const interactions = getInteractions(interactive);\n const interactionIds = new Set(interactions.map(i => i.id));\n \n results.students.forEach(s => {\n const withSummary = {\n ...s,\n summary: getStudentResultsSummary(interactive, s)\n };\n \n if (withSummary.summary.awaitingMarking) {\n groups.markingRequired.push(withSummary);\n return;\n }\n\n const result = ArrayHelper.last(s.results);\n const answeredInteractions = result.attempts.filter(a => !!interactionIds.has(a?.answers[0]?.questionId)).length;\n\n if (answeredInteractions === interactionIds.size) {\n groups.completed.push(withSummary);\n } else {\n groups.notCompleted.push(withSummary);\n return;\n }\n \n if (withSummary.summary.percentCorrect >= (scoreThreshold?.HIGH || ScoreThresholdDefaults.HIGH))\n groups.highScore.push(withSummary);\n \n if (withSummary.summary.percentCorrect < (scoreThreshold?.MODERATE || ScoreThresholdDefaults.MODERATE))\n groups.lowScore.push(withSummary);\n });\n \n const sortedLowScore = ArrayHelper.sortBy(groups.lowScore, s => s.summary.percentCorrect);\n const sortedHighScore = ArrayHelper.sortBy(groups.highScore, s => -s.summary.percentCorrect);\n \n return {\n ...groups,\n lowScore: sortedLowScore,\n highScore: sortedHighScore\n };\n}\n\nexport function getInteractionById(interactive: Interactive, interactionId: string): Interaction {\n const flattenedInteractions = flattenInteractions(interactive);\n return flattenedInteractions.find(i => i.id.toString() === interactionId.toString());\n}\n\n/**\n * We need to use the question and result ids as a list of one student's responses\n * to multiple questions will all have the same result id and a list of multiple\n * students responses to one question will all have the same questionId.\n */\nexport function getMarkedAnswerId(answer: StudentAnswer): string {\n return `${answer.questionId}:${answer.resultId}`;\n}\n\nexport function getMarkedStatus(\n interactionId: string,\n studentResults: StudentResults,\n markedAnswers: MarkedAnswerHash\n): InteractiveAnswerStatus {\n const result = getStudentResult(studentResults);\n const studentResponse = getStudentAttempt(interactionId, result);\n\n const isMarkedCorrect = studentResponse?.answers.every(a => {\n return markedAnswers[getMarkedAnswerId(a)]?.status === InteractiveAnswerStatus.Correct;\n });\n\n if (isMarkedCorrect)\n return InteractiveAnswerStatus.Correct;\n\n const isMarkedIncorrect = studentResponse?.answers.every(a => {\n return markedAnswers[getMarkedAnswerId(a)]?.status === InteractiveAnswerStatus.Incorrect;\n });\n\n if (isMarkedIncorrect)\n return InteractiveAnswerStatus.Incorrect;\n}\n\nexport function getInteractionResultsSummary(\n interaction: Interaction,\n results: InteractiveResultSet\n): ResultsSummary {\n const numStudents = results.students.length;\n let numCorrect = 0;\n let answered = 0;\n let unanswered = 0;\n let awaitingMarking = 0;\n let attempts = 0;\n\n results.students.forEach(s => {\n const result = getStudentResult(s);\n\n if (!result)\n return;\n\n attempts = attempts + s.results.length;\n\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(interaction, result);\n\n if (correctness === InteractionCorrectness.Correct)\n numCorrect++;\n\n if (correctness === InteractionCorrectness.UnAnswered)\n unanswered++;\n\n if (correctness === InteractionCorrectness.AwaitingMarking)\n awaitingMarking++;\n\n if (correctness !== InteractionCorrectness.UnAnswered)\n answered++;\n });\n\n\n const percentCorrect = numStudents > 0\n ? numCorrect / numStudents\n : 0;\n\n return {\n percentCorrect,\n correct: numCorrect,\n answered,\n unanswered,\n awaitingMarking,\n attempts\n };\n}\n\nexport function getStudentResultsSummary(interactive: Interactive, studentResults: StudentResults): ResultsSummary {\n const result = getStudentResult(studentResults);\n\n const interactions = getInteractions(interactive);\n\n const numInteractions = interactions.length;\n\n let numCorrect = 0;\n let awaitingMarking = 0;\n\n interactions.forEach(i => {\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(i, result);\n\n if (correctness === InteractionCorrectness.Correct)\n numCorrect++;\n\n if (correctness === InteractionCorrectness.AwaitingMarking)\n awaitingMarking++;\n });\n\n const percentCorrect = numInteractions > 0 ? numCorrect / numInteractions : 0;\n\n /**\n * Our interactions list has images and annotations filtered out.\n * We built a map of valid questions, so that we can calculate the unswered accurately.\n * We're doing this because of a bug that caused annotations and images to record answers in the player.\n * - Sha\n */\n const interactionIds = new Set(interactions.map(i => i.id));\n const answeredInteractions = result.attempts.filter(a => !!interactionIds.has(a?.answers[0]?.questionId)).length;\n\n return {\n answered: answeredInteractions,\n attempts: studentResults.results.length,\n unanswered: numInteractions - answeredInteractions,\n percentCorrect,\n correct: numCorrect,\n awaitingMarking\n };\n}","import { AudienceQueryParams } from 'libs/shared/apps/analytics/interfaces/AudienceQueryParams';\n\nexport const getAudienceParams = (queryParams: AudienceQueryParams) => {\n const userId: string[] = [];\n const groupId: string[] = [];\n\n if (queryParams.users)\n userId.push(...queryParams.users);\n\n if (queryParams.classrooms)\n groupId.push(...queryParams.classrooms);\n\n if (queryParams.classroomGroups)\n groupId.push(...queryParams.classroomGroups);\n return {\n userId,\n groupId\n };\n};","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { DateRangeQueryParams } from 'libs/shared/apps/analytics/interfaces/DateRangeQueryParams';\nimport { FilterQueryParams } from 'libs/shared/apps/analytics/interfaces/FilterQueryParams';\nimport { DateRange } from 'libs/shared/interfaces';\nimport { AppRouteHelper } from 'libs/shared/utils/AppRouteHelper';\n\nconst namespace = 'shared.analyticsUtils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function convertDateToUtcDateTimeString(date: Date): string {\n const utc = DateHelper.convertDateToUTC(date);\n return DateHelper.format(utc, 'YYYY-MM-DDTHH:mm:ss');\n}\n\nexport function getMinDate(): Date {\n return new Date(2021, 0, 1);\n}\n\nexport function getMaxDate(): Date {\n return new Date();\n}\n\nexport function getDefaultDateRange(dateRangePresets: DateRange[]): DateRange {\n return dateRangePresets.find(range => !!range.default);\n}\n\nexport function getPresetRangeByName(dateRangePresetss: DateRange[], rangeName: string): DateRange | undefined {\n if (!rangeName)\n return;\n\n const presets = dateRangePresetss;\n \n return presets.find(p => p.name === rangeName);\n}\n\nexport function getGenericDateRangePresets(): DateRange[] {\n const minDate = getMinDate();\n const currentYear = (new Date()).getFullYear();\n\n const isMinDateThisYear = currentYear === minDate.getFullYear();\n\n return [\n {\n name: getPhrase('today'),\n startDate: new Date(),\n endDate: new Date()\n },\n {\n name: getPhrase('thisMonth'),\n startDate: new Date(currentYear, new Date().getMonth(), 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastThreeMonths'),\n startDate: new Date(currentYear, new Date().getMonth() - 2, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastSixMonths'),\n startDate: new Date(currentYear, new Date().getMonth() - 5, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastTwelveMonths'),\n startDate: new Date(currentYear, new Date().getMonth() - 11, 1),\n endDate: new Date(),\n default: true\n },\n {\n name: getPhrase('thisYear'),\n startDate: new Date(currentYear, 0, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastYear'),\n startDate: new Date(currentYear - 1, 0, 1),\n endDate: new Date(currentYear, 0, 0),\n disabled: isMinDateThisYear,\n tooltip: isMinDateThisYear ? getPhrase('lastYearDisabled') : ''\n }\n ];\n}\n\nexport function getInsightsDateRangePresets(): DateRange[] {\n const minDate = getMinDate();\n const currentYear = (new Date()).getFullYear();\n\n const isMinDateThisYear = currentYear === minDate.getFullYear();\n\n return [\n {\n name: getPhrase('today'),\n startDate: new Date(),\n endDate: new Date()\n },\n {\n name: getPhrase('thisMonth'),\n startDate: new Date(currentYear, new Date().getMonth(), 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastThreeMonths'),\n startDate: new Date(currentYear, new Date().getMonth() - 2, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastSixMonths'),\n startDate: new Date(currentYear, new Date().getMonth() - 5, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('thisYear'),\n startDate: new Date(currentYear, 0, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastYear'),\n startDate: new Date(currentYear - 1, 0, 1),\n endDate: new Date(currentYear, 0, 0),\n disabled: isMinDateThisYear,\n tooltip: isMinDateThisYear ? getPhrase('lastYearDisabled') : ''\n },\n {\n name: getPhrase('allTime'),\n startDate: DateHelper.subtract(new Date(), 5, 'years'),\n endDate: new Date(),\n default: true\n }\n ];\n}\n\nexport function formatDateQueryParam(date: Date): string {\n return DateHelper.format(date, 'YYYY-MM-DD');\n}\n\nexport function getRouteQueryParams(dateRange: DateRange): DateRangeQueryParams {\n if (dateRange.name)\n return { rangeName: dateRange.name };\n\n return {\n from: formatDateQueryParam(dateRange.startDate),\n to: formatDateQueryParam(dateRange.endDate)\n };\n}\n\nexport function useGetDateRangeFromQueryParams(\n dateRangePresets: DateRange[],\n dateRangeQueryParams: DateRangeQueryParams\n): DateRange | null {\n const { to, from, rangeName } = dateRangeQueryParams;\n \n const presetRange = getPresetRangeByName(dateRangePresets, rangeName);\n\n if (presetRange) {\n if (!from && !to)\n return presetRange;\n\n /**\n * If a rangeName has been set, we don't use to and from so we remove them from the url params.\n */\n AppRouteHelper.updateParams(\n getRouteQueryParams(presetRange),\n { replace: true, merge: true, keysToRemove: [ 'from', 'to' ]}\n );\n return;\n }\n\n const defaultDateRange = getDefaultDateRange(dateRangePresets);\n\n /**\n * If a param is missing, or one of them isn't a valid date, short-circuit the logic below.\n */\n if (!from || !to || !DateHelper.isValid(from) || !DateHelper.isValid(to)) {\n AppRouteHelper.updateParams(\n getRouteQueryParams(defaultDateRange),\n { replace: true, merge: true, keysToRemove: ['rangeName']}\n );\n return;\n }\n\n let initialDateRangeValid = true;\n\n let startDate = DateHelper.convertDateToUTC(new Date(from));\n let endDate = DateHelper.convertDateToUTC(new Date(to));\n\n if (DateHelper.isBefore(startDate, getMinDate(), 'day')) {\n startDate = getMinDate();\n initialDateRangeValid = false;\n }\n\n if (DateHelper.isAfter(endDate, getMaxDate(), 'day')) {\n endDate = getMaxDate();\n initialDateRangeValid = false;\n }\n\n if (DateHelper.isAfter(startDate, endDate)) {\n startDate = defaultDateRange.startDate;\n endDate = defaultDateRange.endDate;\n initialDateRangeValid = false;\n }\n\n const dateRange: DateRange = {\n startDate,\n endDate,\n name: initialDateRangeValid\n ? rangeName || 'custom'\n : ''\n };\n\n if (initialDateRangeValid)\n return dateRange;\n\n /**\n * If one or both of the date params were invalid, we trigger a route update.\n */\n AppRouteHelper.updateParams(getRouteQueryParams(dateRange), { replace: true, merge: true, keysToRemove: ['rangeName']});\n}\n\nexport function getStartEndParams(\n dateRangePresetss: DateRange[],\n filterParams: FilterQueryParams\n): { start: string; end: string } {\n const getStartDate = (date: string) => convertDateToUtcDateTimeString(DateHelper.startOf(date, 'day'));\n const getEndDate = (date: string) => convertDateToUtcDateTimeString(DateHelper.endOf(date, 'day'));\n\n const presetRange = getPresetRangeByName(dateRangePresetss, filterParams.rangeName);\n\n /**\n * If the user has chosen a preset range, lookup the start and end dates as they won't be\n * in the query params.\n */\n if (presetRange)\n return {\n start: getStartDate(formatDateQueryParam(presetRange.startDate)),\n end: getEndDate(formatDateQueryParam(presetRange.endDate))\n };\n\n /**\n * If they have chosen a custom date range, use their chosen start and end dates.\n */\n if (filterParams.from && filterParams.to)\n return {\n start: getStartDate(filterParams.from),\n end: getEndDate(filterParams.to)\n };\n\n /**\n * The below should never be hit\n */\n const defaultRange = getDefaultDateRange(dateRangePresetss);\n\n return {\n start: getStartDate(formatDateQueryParam(defaultRange.startDate)),\n end: getEndDate(formatDateQueryParam(defaultRange.endDate))\n };\n}","import React from 'react';\n\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { useGetResultsTableData } from 'libs/shared/apps/analytics/components/student-results/student-results-table/StudentResultsTableUtils';\nimport { InteractiveResultsRequests } from 'libs/shared/apps/analytics/flight-requests/InteractiveResultsRequests';\nimport { useFetchInteractiveResults } from 'libs/shared/apps/analytics/hooks/UseFetchInteractiveResults';\nimport { InteractiveResultsReport } from 'libs/shared/apps/analytics/interfaces/requests/InteractiveResultsReport';\nimport { AnalyticsFilterHelper } from 'libs/shared/apps/analytics/utils/AnalyticsFilterUtils';\nimport { getAudienceParams } from 'libs/shared/apps/analytics/utils/AudienceUtils';\nimport { getInsightsDateRangePresets, getStartEndParams } from 'libs/shared/apps/analytics/utils/DateRangeUtils';\nimport { getFormattedPercentage, getPercentageToFixed } from 'libs/shared/components/percentage-indicator/PercentageIndicatorUtils';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { useVerifiedEmailRequiredErrorHandler } from 'libs/shared/hooks/useVerifiedEmailRequiredErrorHandler';\nimport { CurrentUser, Interactive, InteractiveMetadata, PopupViewProps } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { getInteractions, getStudentResult } from 'libs/shared/utils/InteractiveHelper';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nconst namespace = 'shared.generateReport';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getReportFriendlyDate(date: string): string {\n const localDate = DateHelper.convertUTCToLocal(date).toString();\n return DateHelper.format(localDate, 'Do MMMM YYYY');\n}\n\ninterface GenerateInteractiveResultsReportViewProps extends PopupViewProps {\n interactiveId: string;\n}\n\nexport function GenerateInteractiveResultsReportView(props: GenerateInteractiveResultsReportViewProps): JSX.Element {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n const alerts = useAlerts();\n const fetchAsync = Flight.useGetFetchAsync();\n\n const audienceAppLinkParams = AnalyticsFilterHelper.getAudienceAppLinkParams();\n const dateRangeAppLinkParams = AnalyticsFilterHelper.getDateRangeAppLinkParams();\n const startEndParams = getStartEndParams(getInsightsDateRangePresets(), dateRangeAppLinkParams);\n\n const [ showSpinner, setShowSpinner ] = React.useState(false);\n\n const { loading, handleGenerateReportError } = useVerifiedEmailRequiredErrorHandler();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n InteractiveRequests.interactiveMetadata(props.interactiveId)\n );\n const interactive = Flight.useBasicFetch<Interactive>(interactiveMetadata.data?.interactiveId ?\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId) : null);\n const results = useFetchInteractiveResults(props.interactiveId, {\n ...startEndParams,\n ...getAudienceParams(audienceAppLinkParams)\n });\n\n useHandleObjectError([ interactive, interactiveMetadata, results ]);\n\n const interactions = getInteractions(interactive.data);\n\n const answerData = useGetResultsTableData(interactive.data, results.data, false, anonymiseUsers);\n\n function onClickGenerate(): void {\n setShowSpinner(true);\n\n const body: InteractiveResultsReport = {\n interactiveName: interactiveMetadata.data.name,\n userId: currentUser.data.id,\n customerId: currentUser.data.customerId,\n questions: interactions.map(i => i.name),\n rows: answerData.map(answer => {\n return {\n name: UserHelper.getFullName(answer.user),\n unanswered: answer.summary.unanswered,\n percentage: getFormattedPercentage(getPercentageToFixed(answer.summary.percentCorrect)),\n correct: answer.summary.correct,\n totalQuestions: answer.summary.answered + answer.summary.unanswered,\n results: interactions.map(interaction => {\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(\n interaction,\n getStudentResult(answer)\n );\n\n switch (correctness) {\n case InteractionCorrectness.Correct:\n return getPhrase('correct');\n\n case InteractionCorrectness.Incorrect:\n return getPhrase('incorrect');\n\n case InteractionCorrectness.NotApplicable:\n return '-';\n\n case InteractionCorrectness.AwaitingMarking:\n return getPhrase('awaitingMarking');\n\n case InteractionCorrectness.UnAnswered:\n case InteractionCorrectness.Answered:\n default:\n return '';\n }\n })\n };\n })\n };\n\n fetchAsync(InteractiveResultsRequests.interactiveResultsReport(body))\n .then(() => {\n alerts.success(getPhrase('success'));\n })\n .catch((xhr: Xhr) => handleGenerateReportError(xhr, getPhrase('error'), getPhrase('noEmailError')))\n .finally(props.closePopup);\n }\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <Popup\n title={getPhrase('title')}\n showLoadingSpinner={!currentUser.hasCompleted || loading}\n closePopup={props.closePopup}\n >\n <>\n <p>\n <Text phrase='description' />\n </p>\n <p>\n <Text phrase='dateRange' options={({\n dateFrom: getReportFriendlyDate(startEndParams.start),\n dateTo: getReportFriendlyDate(startEndParams.end)\n })} />\n </p>\n <p>\n <Text phrase='emailDescription' options={({ email: currentUser.data?.email })} />\n </p>\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.closePopup} />\n <PopupButtons.Submit\n variant='dark'\n onClick={onClickGenerate}\n text={getPhrase('generateReport')}\n showSpinner={showSpinner}\n />\n </PopupButtons>\n </>\n </Popup>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\n\nimport { ScoreThresholds } from 'libs/shared/constants/ScoreThresholds';\n\nimport {\n getCircleClassName,\n getCircleContainerClassName,\n getCircleRadius,\n getColouredLabelClassName,\n getFormattedPercentage,\n getPercentageToFixed,\n isPending,\n ProgressCircleSize\n} from './PercentageIndicatorUtils';\n\nimport styles from './percentage-indicator.scss';\n\ninterface ProgressCircleProps {\n size: ProgressCircleSize;\n scoreThresholds?: ScoreThresholds;\n percentage?: number;\n}\n\nfunction ProgressCircle(props: ProgressCircleProps): JSX.Element {\n const ref = React.useCallback((circle: SVGCircleElement) => {\n if (!circle)\n return;\n\n const radius = circle.r.baseVal.value;\n const circumference = 2 * Math.PI * radius;\n const offset = circumference - props.percentage * circumference;\n\n circle.style.strokeDasharray = `${circumference} ${circumference}`;\n circle.style.strokeDashoffset = offset.toString();\n }, [props.percentage]);\n\n return (\n <svg>\n <circle r={getCircleRadius(props.size)} className={styles.backgroundCircle} />\n {!isPending(props.percentage) &&\n <circle\n ref={ref}\n r={getCircleRadius(props.size)}\n className={getCircleClassName(props.percentage, props.scoreThresholds)}\n />\n }\n </svg>\n );\n}\n\nexport enum PercentageIndicatorLayout {\n CircleOnly = 'circle_only',\n LabelOnly = 'label_only',\n LabelBefore = 'label_before',\n LabelInside = 'label_inside'\n}\n\ninterface PercentageIndicatorProps {\n layout: PercentageIndicatorLayout;\n percentage?: number; // Between 0 and 1 or undefined for pending\n className?: string;\n customLabel?: string;\n scoreThresholds?: ScoreThresholds;\n size?: ProgressCircleSize;\n}\n\nPercentageIndicator.defaultProps = {\n layout: PercentageIndicatorLayout.CircleOnly\n};\n\nexport function PercentageIndicator(props: PercentageIndicatorProps): JSX.Element {\n const percentageToFixed = getPercentageToFixed(props.percentage);\n\n const size = props.size ||\n (props.layout === PercentageIndicatorLayout.LabelInside\n ? ProgressCircleSize.Large\n : ProgressCircleSize.Small\n );\n\n const label = props.customLabel || getFormattedPercentage(percentageToFixed);\n\n if (props.layout === PercentageIndicatorLayout.LabelOnly)\n return (\n <span className={getColouredLabelClassName(percentageToFixed)}>\n {label}\n </span>\n );\n\n return (\n <div className={`d-flex align-items-center justify-content-between ${props.className ?? ''}`}>\n {props.layout === PercentageIndicatorLayout.LabelBefore &&\n <span className='me-2'>\n {label}\n </span>\n }\n <div className={getCircleContainerClassName(size, percentageToFixed)}>\n <ProgressCircle percentage={percentageToFixed} size={size} scoreThresholds={props.scoreThresholds} />\n {props.layout === PercentageIndicatorLayout.LabelInside &&\n <span className={styles.centredPercentageText}>\n {label}\n </span>\n }\n </div>\n </div>\n );\n}","import { ScoreThresholdDefaults, ScoreThresholds } from 'libs/shared/constants/ScoreThresholds';\n\nimport styles from './percentage-indicator.scss';\n\n/**\n * Values for width and strokeWidth are taken from progress-circle.scss.\n * If either are changed, they must be updated in both places.\n */\nconst CIRCLE_WIDTH = 2; // rem\nconst CIRCLE_WIDTH_LG = 5.8; // rem\nconst CIRCLE_STROKE_WIDTH = 0.2; // rem\nconst CIRCLE_STROKE_WIDTH_LG = 0.36; // rem\n \nexport enum ProgressCircleSize {\n Small = 'small',\n Large = 'large',\n ExtraSmall = 'extraSmall'\n}\n\nconst ProgressCircleSizeMap = {\n [ProgressCircleSize.ExtraSmall]: {\n size: CIRCLE_WIDTH\n },\n [ProgressCircleSize.Small]: {\n size: CIRCLE_WIDTH\n },\n [ProgressCircleSize.Large]: {\n size: CIRCLE_WIDTH_LG\n }\n};\n\n/**\n * radius = width / 2 - strokeWidth * 2\n */\nexport function getCircleRadius(size: ProgressCircleSize): string {\n const width = ProgressCircleSizeMap[size].size;\n const strokeWidth = size === ProgressCircleSize.Large ? CIRCLE_STROKE_WIDTH_LG : CIRCLE_STROKE_WIDTH;\n return `${width / 2 - strokeWidth * 2}rem`;\n}\n \nexport function getCircleClassName(\n percentage: number,\n scoreThresholds: ScoreThresholds = ScoreThresholdDefaults\n): string {\n if (percentage >= scoreThresholds.HIGH)\n return styles.circleSuccess;\n \n if (percentage >= scoreThresholds.MODERATE)\n return styles.circleWarning;\n \n return styles.circleDanger;\n}\n \nexport function getColouredLabelClassName(\n percentage: number,\n scoreThresholds: ScoreThresholds = ScoreThresholdDefaults\n): string {\n if (percentage >= scoreThresholds.HIGH)\n return 'text-success';\n \n if (percentage >= scoreThresholds.MODERATE)\n return 'text-warning';\n \n return 'text-danger';\n}\n \nexport function getCircleContainerClassName(size: ProgressCircleSize, percentage?: number): string {\n let className = `d-inline-block ${styles.circleContainer}`;\n \n if (size === ProgressCircleSize.Large)\n className += ` ${styles.lgCircleContainer}`;\n\n if (size === ProgressCircleSize.ExtraSmall)\n className += ` ${styles.xsCircleContainer}`;\n\n if (isPending(percentage))\n className += ` ${styles.pendingCircle}`;\n \n return className;\n}\n\nexport function getPercentageToFixed(percentage?: number): number | undefined {\n if (isPending(percentage))\n return;\n \n return +percentage.toFixed(2);\n}\n \nexport function getFormattedPercentage(percentage?: number): string {\n if (isPending(percentage))\n return `--%`;\n\n return `${Math.round(percentage * 100)}%`;\n}\n\nexport function isPending(percentage?: number): boolean {\n return typeof percentage !== 'number';\n}","export interface ScoreThresholds {\n HIGH: number;\n MODERATE: number;\n}\n\nexport const ScoreThresholdDefaults: ScoreThresholds = {\n HIGH: 0.75,\n MODERATE: 0.5\n};\n\nexport const ScoreThresholdInsights: ScoreThresholds = {\n HIGH: 0.7,\n MODERATE: 0.7\n};","export enum InteractionCorrectness {\n Correct,\n Incorrect,\n AwaitingMarking,\n \n Answered,\n UnAnswered,\n NotApplicable\n}","export enum InteractiveAnswerStatus {\n Incorrect = 0,\n Correct = 1,\n PendingReview = 2\n}","import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n internalServerError?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError,\n internalServerError: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.InternalServer) {\n if (!ignoreMap.internalServerError)\n Core.ErrorHelper.throw(new UnspecifiedError());\n return;\n }\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import { useEffect } from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { handleHttpError, HttpErrorMap, IgnoreHttpErrorMap } from 'libs/shared/errors/handlers/HttpErrorHandlers';\n\nfunction generateCacheKey(flightObjs: Array<Flight.Response<any>>): string {\n return flightObjs.map(obj => obj.statusCode).join(':');\n}\n\n// TODO: Change this to just `useHandleHttpError` and only accept a status code.\nexport function useHandleObjectError(\n _flightObjs: Flight.Response<any> | Array<Flight.Response<any>>,\n customErrors?: HttpErrorMap,\n ignoreErrors?: IgnoreHttpErrorMap\n): void {\n const flightObjs = Array.isArray(_flightObjs) ? _flightObjs : [_flightObjs];\n\n useEffect(() => {\n flightObjs.forEach(obj => {\n handleHttpError(obj.statusCode, customErrors, ignoreErrors);\n });\n }, [ generateCacheKey(flightObjs), customErrors, ignoreErrors ]);\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\n\nimport { DialogError } from 'libs/shared/errors/primitives/DialogError';\nimport { DialogOptions } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.verifiedEmailError';\n\nexport class VerifiedEmailRequiredError extends DialogError {\n public message: string;\n public liteUrl: string;\n public hasLite: boolean;\n\n constructor(message: string, liteUrl: string, hasLite: boolean) {\n super('VerifiedEmailRequiredError');\n\n this.message = message;\n this.liteUrl = liteUrl;\n this.hasLite = hasLite;\n }\n\n // @ts-ignore\n public get name(): string {\n return 'VerifiedEmailRequiredError';\n }\n\n // @ts-ignore\n public get dialogOptions(): DialogOptions {\n const href = UrlHelper.safeUrlConcat(this.liteUrl, 'settings/account');\n\n return {\n title: LanguageService.getPhrase(namespace, 'heading'),\n text: this.hasLite\n ? `${this.message} ${LanguageService.getPhrase(namespace, 'visitSettings', { href })}`\n : this.message,\n buttons: [{\n text: LanguageService.getPhrase(namespace, 'close'),\n className: 'btn btn-dark',\n success: true\n }]\n };\n }\n}","import { Core } from 'libs/common/backbone/index';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Flight } from 'libs/common/react/index';\n\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { VerifiedEmailRequiredError } from 'libs/shared/errors/general/verified-email/VerifiedEmailRequiredError';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { Config } from 'libs/shared/interfaces';\n\nexport function useVerifiedEmailRequiredErrorHandler() {\n const alerts = useAlerts();\n const { hasProduct, isLoadingProducts } = useProducts();\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n function handleGenerateReportError(xhr: Xhr, message: string, noEmailError: string) {\n if (!xhr.responseJSON || xhr.responseJSON?.type !== 'no-email') {\n alerts.error(message);\n return;\n }\n\n Core.ErrorHelper.throw(\n new VerifiedEmailRequiredError(noEmailError, config.data.liteUrl, hasProduct(ProductId.Primary))\n );\n }\n\n return {\n handleGenerateReportError,\n loading: !config.hasCompleted || isLoadingProducts\n };\n}","import { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { ContextService } from 'libs/shared/services/ContextService';\n\ninterface UpdateParamsOptions extends Core.AppLinkOptions {\n merge?: boolean;\n keysToRemove?: string[]\n}\n\nexport const AppRouteHelper = {\n /**\n * Utility to update the params on the current appRoute.\n * \n * This is built on top of ContextService rather than build into AppLink\n * as we will generally only want to update params on appRoutes, not appLinks.\n */\n updateParams(params: HashObject, options?: UpdateParamsOptions): void {\n const { appLink } = ContextService.getCurrentRoute();\n\n let currentParams = typeof(appLink.params) === 'string'\n ? Core.LocationUtils.DeserializeQueryParams(appLink.params)\n : appLink.params as HashObject;\n\n if (options.keysToRemove)\n currentParams = ObjectHelper.omit(currentParams, options.keysToRemove);\n\n const updatedParams = options?.merge\n ? { ...currentParams, ...params }\n : params;\n\n const updatedAppLink = {\n ...appLink,\n params: updatedParams\n };\n\n /**\n * This prevents us pointlessly re-triggering if we're already on the right applink.\n */\n if (ObjectHelper.isEqual(appLink, updatedAppLink))\n return;\n \n Core.AppLinkHelper.trigger(updatedAppLink, ObjectHelper.omit(options, [ 'merge', 'keysToRemove' ]));\n }\n};","import { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, InteractionTypeId, InteractiveResult, StudentAnswer } from 'libs/shared/interfaces';\n\ntype GetStudentAnswerByActionableItemId = (id: string) => string;\n\nfunction notApplicable(): InteractionCorrectness {\n return InteractionCorrectness.NotApplicable;\n}\n\nfunction awaitingMarking(): InteractionCorrectness {\n return InteractionCorrectness.AwaitingMarking;\n}\n\nfunction isMissingWordCorrect(\n interaction: Interaction,\n getStudentAnswer: GetStudentAnswerByActionableItemId\n): InteractionCorrectness {\n const items = interaction.actionableItems.filter(a => a\n .isCorrect);\n\n if (items.every(a => !getStudentAnswer(a.id)))\n return InteractionCorrectness.UnAnswered;\n\n const correct = items.every(a => a.name.trim().toLowerCase() === getStudentAnswer(a.id)?.trim().toLowerCase());\n return correct ? InteractionCorrectness.Correct : InteractionCorrectness.Incorrect;\n}\n\nfunction isMultipleChoiceCorrect(\n interaction: Interaction,\n getStudentAnswer: GetStudentAnswerByActionableItemId\n): InteractionCorrectness {\n if (interaction.actionableItems.every(a => !getStudentAnswer(a.id)))\n return InteractionCorrectness.UnAnswered;\n \n const correctItems = interaction.actionableItems.filter(a => a.isCorrect);\n\n const correct = correctItems.every(a => {\n const studentAnswer = getStudentAnswer(a.id);\n\n /**\n * In the past we've only ever checked the answer name. But since we introduced the ability to have image interactions\n * with no question text, we've need to swap to saving the id. But past submissions still have the name\n * - Sha\n */\n return studentAnswer?.toString() === a.id?.toString() || studentAnswer === a.name;\n });\n return correct ? InteractionCorrectness.Correct : InteractionCorrectness.Incorrect;\n}\n\nfunction isMarkableAnswerMarkedCorrect(\n interaction: Interaction,\n getStudentAnswer: (id: string) => StudentAnswer\n): InteractionCorrectness {\n let correctness: InteractionCorrectness;\n\n // There should only be one actionableItem\n interaction.actionableItems.forEach(item => {\n const studentAnswer = getStudentAnswer(item.id);\n\n if (!studentAnswer) {\n correctness = InteractionCorrectness.UnAnswered;\n return;\n }\n\n if (studentAnswer.status === InteractiveAnswerStatus.Correct) {\n correctness = InteractionCorrectness.Correct;\n return;\n }\n\n if (studentAnswer.status === InteractiveAnswerStatus.Incorrect) {\n correctness = InteractionCorrectness.Incorrect;\n return;\n }\n\n correctness = InteractionCorrectness.AwaitingMarking;\n });\n\n return correctness;\n}\n\ntype IsCorrectFunction = (interaction: Interaction, result: InteractiveResult) => InteractionCorrectness;\n\nfunction getGetStudentAnswer(interaction: Interaction, result: InteractiveResult): (id: string) => StudentAnswer {\n return (id: string) => {\n const attempt = result?.attempts.find(a => a.id === interaction.id);\n return attempt?.answers.find(s => s.id === id);\n };\n}\n\nfunction wrapIsMissingWordCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n\n return isMissingWordCorrect(interaction, (id: string) => {\n const answer = getStudentAnswer(id);\n return answer?.text;\n });\n}\n\nfunction wrapIsMultipleChoiceCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n\n return isMultipleChoiceCorrect(interaction, (id: string) => {\n const answer = getStudentAnswer(id);\n return answer?.text;\n });\n}\n\nfunction wrapIsMarkableAnswerMarkedCorrect(\n interaction: Interaction,\n result: InteractiveResult\n): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n return isMarkableAnswerMarkedCorrect(interaction, getStudentAnswer);\n}\n\nconst IsCorrectLookup: {[typeId: number]: IsCorrectFunction} = {\n [InteractionTypeId.Annotation]: notApplicable,\n [InteractionTypeId.Image]: notApplicable,\n [InteractionTypeId.MissingWord]: wrapIsMissingWordCorrect,\n [InteractionTypeId.MultipleChoice]: wrapIsMultipleChoiceCorrect,\n [InteractionTypeId.ShortAnswer]: wrapIsMarkableAnswerMarkedCorrect,\n [InteractionTypeId.TrueOrFalse]: wrapIsMultipleChoiceCorrect,\n [InteractionTypeId.Illustration]: wrapIsMarkableAnswerMarkedCorrect\n};\n\nfunction isInteractionCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const isCorrectFn = IsCorrectLookup[interaction.typeId];\n\n return isCorrectFn(interaction, result);\n}\n\nexport const InteractiveCorrectnessHelper = {\n notApplicable,\n awaitingMarking,\n isMissingWordCorrect,\n isMultipleChoiceCorrect,\n isInteractionCorrect\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"circleContainer\":\"p8Vgz\",\"backgroundCircle\":\"asGGE\",\"circleSuccess\":\"PXLNj\",\"circleWarning\":\"ZckRN\",\"circleDanger\":\"slBRg\",\"lgCircleContainer\":\"N8KCI\",\"xsCircleContainer\":\"RPqZ2\",\"pendingCircle\":\"DKrcq\",\"centredPercentageText\":\"tpmLR\"};"],"names":["getAnalyticsRequestKey","baseKey","filter","extra","key","start","end","userIdKey","Array","isArray","userId","sort","join","groupIdKey","groupId","customerIdKey","customerId","getInteractiveResultFilters","currentUser","shareId","currentUserId","id","currentCustomerId","dateRange","undefined","userIds","classroomsAndGroups","InteractiveResultsRequests","interactiveResultSet","interactiveId","interactiveMetadataId","success","error","always","url","data","type","HttpVerbs","normalize","mark","answerId","resultId","invalidationKeys","pendingReviews","interactiveResultsReport","useFetchInteractiveResults","requestFilter","interactiveMetadata","interactive","shouldFetchResults","I","AnalyticsFilterHelper","getAudienceAppLinkParams","appLink","params","users","classrooms","classroomGroups","getParam","param","audienceFilters","getDateRangeAppLinkParams","from","to","rangeName","dateRangeFilters","getPhrase","anonymiseUserName","user","shouldAnonymise","sessionId","seed","guid","hash","i","length","charCodeAt","Math","abs","guidToSeed","floor","Date","getMinutes","dictionaries","separator","style","groupStudents","results","scoreThreshold","groups","markingRequired","lowScore","highScore","completed","notCompleted","interactions","interactionIds","Set","map","students","forEach","s","withSummary","summary","getStudentResultsSummary","awaitingMarking","push","attempts","a","has","answers","questionId","size","percentCorrect","HIGH","MODERATE","sortedLowScore","sortedHighScore","getInteractionById","interactionId","find","toString","getMarkedAnswerId","answer","getMarkedStatus","studentResults","markedAnswers","result","studentResponse","every","status","getInteractionResultsSummary","interaction","numStudents","numCorrect","answered","unanswered","correctness","correct","numInteractions","answeredInteractions","getAudienceParams","queryParams","LanguageService","convertDateToUtcDateTimeString","date","utc","formatDateQueryParam","getReportFriendlyDate","localDate","GenerateInteractiveResultsReportView","props","minDate","currentYear","isMinDateThisYear","anonymiseUsers","SharedViewModelKeys","alerts","fetchAsync","audienceAppLinkParams","dateRangeAppLinkParams","startEndParams","dateRangePresetss","filterParams","getStartDate","getEndDate","presetRange","p","name","getPresetRangeByName","startDate","endDate","defaultRange","range","getStartEndParams","getFullYear","getMonth","disabled","tooltip","default","showSpinner","setShowSpinner","useVerifiedEmailRequiredErrorHandler","loading","handleGenerateReportError","UserRequests","InteractiveRequests","answerData","value","Popup","title","showLoadingSpinner","hasCompleted","closePopup","Text","phrase","options","dateFrom","dateTo","email","PopupButtons","onClick","variant","body","interactiveName","questions","rows","UserHelper","percentage","totalQuestions","InteractiveCorrectnessHelper","InteractionCorrectness","then","xhr","text","PercentageIndicatorLayout","ProgressCircle","ref","circle","radius","r","baseVal","circumference","PI","offset","strokeDasharray","strokeDashoffset","className","scoreThresholds","PercentageIndicator","percentageToFixed","layout","LabelInside","label","customLabel","LabelOnly","LabelBefore","defaultProps","CircleOnly","ProgressCircleSize","CIRCLE_STROKE_WIDTH","CIRCLE_STROKE_WIDTH_LG","ProgressCircleSizeMap","ExtraSmall","Small","Large","getCircleRadius","width","strokeWidth","getCircleClassName","getColouredLabelClassName","getCircleContainerClassName","isPending","getPercentageToFixed","toFixed","getFormattedPercentage","round","ScoreThresholdDefaults","ScoreThresholdInsights","InteractiveAnswerStatus","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","internalServerError","handleHttpError","info","customErrorMap","ignoreMap","statusCode","errorMap","generateCacheKey","flightObjs","obj","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","useEffect","namespace","VerifiedEmailRequiredError","message","liteUrl","hasLite","href","UrlHelper","this","buttons","DialogError","hasProduct","isLoadingProducts","config","ConfigRequests","noEmailError","responseJSON","ProductId","AppRouteHelper","updateParams","currentParams","keysToRemove","updatedParams","merge","updatedAppLink","notApplicable","isMissingWordCorrect","getStudentAnswer","items","actionableItems","isCorrect","trim","toLowerCase","isMultipleChoiceCorrect","studentAnswer","getGetStudentAnswer","attempt","wrapIsMultipleChoiceCorrect","wrapIsMarkableAnswerMarkedCorrect","item","isMarkableAnswerMarkedCorrect","IsCorrectLookup","isInteractionCorrect","isCorrectFn","typeId"],"sourceRoot":""}
@@ -1,2 +1,2 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[7148],{41196:(e,t,n)=>{n.d(t,{W:()=>o});var r=n(20354),a=n(93479),s=n(20768),i=n(31949);function o(e,t,n){var o,c=r.a.useBasicFetch(i.N.currentUser()),l=r.a.useBasicFetch(!!e&&s.b.interactiveMetadata(e)),u=r.a.useBasicFetch(!!(null===(o=l.data)||void 0===o?void 0:o.interactiveId)&&s.b.interactive(l.data.interactiveId)),d=!!c.data&&!!u.data;return r.a.useBasicFetch(d&&a.I.interactiveResultSet(l.data.interactiveId,l.data.id,c.data,t,n))}},26136:(e,t,n)=>{n.d(t,{B:()=>o});var r=n(76198),a=n(23481),s=n(64818),i=a.T.encloseNamespace("shared.analyticsUtils");function o(e,t){return e?t?(0,r._8)((n=e.id,a=e.sessionId,o=+"".concat(n||function(e){if(!e)return 0;for(var t=0,n=0;n<e.length;n++)t=(t<<5)-t+e.charCodeAt(n),t|=0;return Math.abs(t)}(a)).concat(Math.floor((new Date).getMinutes()/5)),{dictionaries:[r.O9,r.yd],separator:" ",length:2,style:"capital",seed:o})):s.l.getFullName(e)||i("anonUser"):i("anonUser");var n,a,o}},2510:(e,t,n)=>{var r;n.d(t,{y:()=>r}),function(e){e.Link="Link",e.Classroom="Classroom",e.Open="Open",e.Live="Live",e.LegacyDirect="LegacyDirect"}(r||(r={}))},18488:(e,t,n)=>{n.d(t,{o:()=>i});var r=n(99940),a=n(97395),s={namespace:"share-v2"},i={createShare:function(e){return{url:"{gateway}/v2/shares",key:"create:share-v2",type:r.k.POST,data:e,normalizeOptions:s,invalidationKeys:["sent:share-v2","get:share-v2:shares:object"]}},updateShare:function(e,t){return{url:"{gateway}/v2/shares/".concat(e),key:"update:share-v2",type:r.k.PUT,data:t,normalizeOptions:s,invalidationKeys:["share-v2:permanent-link:object","share-v2:".concat(e),"get:share-v2:shares:object"]}},deleteShare:function(e){return{type:r.k.DELETE,url:"{gateway}/v2/shares/".concat(e),key:"delete:share-v2",normalizeOptions:s,invalidationKeys:["share-v2:permanent-link:object","sent:share-v2","share-v2:".concat(e),"get:share-v2:shares:object"]}},getShare:function(e){return{url:"{gateway}/v2/shares/".concat(e),key:"share-v2:".concat(e),bootstrapName:"share-v2:".concat(e),type:r.k.GET,normalizeOptions:s}},getSentShares:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=Object.values(e).sort().join(":");return{url:a._.urlBuilder("{gateway}/v2/shares/sent",e),key:"sent:share-v2:".concat(t),type:r.k.GET,normalize:!1}},getShareLink:function(e){return{url:a._.urlBuilder("{gateway}/v2/shares/permanent-link",{objectId:e}),key:"share-v2:permanent-link:object:".concat(e),normalizeOptions:s}},createShareLink:function(e){return{type:r.k.POST,url:a._.urlBuilder("{gateway}/v2/shares/permanent-link",Object.assign({},e)),key:"create:share-v2:permanent-link:object:".concat(e.objectId),invalidationKeys:["share-v2:permanent-link:object:".concat(e.objectId),"sent:share-v2","get:share-v2:shares:object:".concat(e.objectId)],normalizeOptions:s}},getPrivacy:function(e){return{url:"{gateway}/v1/objects/".concat(e,"/access"),key:"privacy:".concat(e),normalize:!1}},getSharesByObjectId:function(e){return{url:"{gateway}/v2/shares/objects/".concat(e),key:"get:share-v2:shares:object:".concat(e),type:r.k.GET,normalizeOptions:s}},createSharePincode:function(e){return{url:"{gateway}/v2/shares/".concat(e,"/pincode"),key:"create:share-v2:".concat(e,":pincode"),type:r.k.POST}},getPincodeByShareId:function(e){return{url:"{gateway}/v2/shares/".concat(e,"/pincode"),key:"get:share-v2:".concat(e,":pincode")}},getPincodeByCode:function(e){return{url:"{gateway}/v2/shares/pincode?code=".concat(e),key:"get:share-v2:pincode:".concat(e)}}}},3218:(e,t,n)=>{n.d(t,{R:()=>S});var r=n(32735),a=n(69087),s=n(26136),i=n(39157),o=n(69186),c=n(86572),l=n(28972),u=n(83140),d=n(80845),m=n(23481),v=n(2102),h=n(36532),f=m.T.encloseNamespace("interactives.studentResponseList");function y(e){var t=Object.keys(e.markedAnswers).length;return r.createElement("div",{className:"d-flex justify-content-end pt-3"},r.createElement("div",null,!e.showSubmitButtonSpinner&&r.createElement("button",{className:"btn btn-link",onClick:e.onClickClose},f("close")),!!e.interactionsToMark.length&&r.createElement(r.Fragment,null,e.isDemo?r.createElement(h.u,{id:"submitAnswers",title:f("demoOnly"),spanHack:!0,spanHackClassName:"d-inline-flex"},r.createElement("button",{className:"btn btn-outline-dark pointer-events-none",disabled:!t},f("submitAnswers"))):r.createElement(v.m,{variant:"outline-dark",onClick:e.onClickSubmit,disabled:!t,showSpinner:e.showSubmitButtonSpinner},f("submitAnswers")))))}var p=m.T.encloseNamespace("interactives.studentResponseList");function b(e){var t=Object.keys(e.markedAnswers).length;return r.createElement("div",{className:"d-flex justify-content-between pb-3"},r.createElement("div",{className:"d-flex"},!!e.summary.unanswered&&r.createElement("div",{className:"bg-light rounded p-2 me-2"},r.createElement("strong",{className:"me-2"},p("unanswered")),e.summary.unanswered),r.createElement("div",{className:"bg-light rounded p-2 me-2"},r.createElement("strong",{className:"me-2"},p("score")),e.summary.awaitingMarking?r.createElement("em",null,p("pending")):"".concat(Math.round(100*e.summary.percentCorrect),"%"))),!!e.interactionsToMark.length&&r.createElement(r.Fragment,null,e.isDemo?r.createElement(h.u,{id:"submitAnswers",title:p("demoOnly"),spanHack:!0},r.createElement("button",{className:"btn btn-outline-dark pointer-events-none",disabled:!t},p("submitAnswers"))):r.createElement(v.m,{variant:"outline-dark",onClick:e.onClickSubmit,disabled:!t,showSpinner:e.showSubmitButtonSpinner},p("submitAnswers"))))}const g={awaitingMarking:"MvGb5"};function k(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,s,i,o=[],c=!0,l=!1;try{if(s=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=s.call(n)).done)&&(o.push(r.value),o.length!==t);c=!0);}catch(e){l=!0,a=e}finally{try{if(!c&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(l)throw a}}return o}}(e,t)||function(e,t){if(e){if("string"==typeof e)return w(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)?w(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 w(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function S(e){var t,n,m,v,h=k(r.useState(!1),2),f=h[0],p=h[1],w=(t=r.useRef(null),n=k(r.useState(!1),2),m=n[0],v=n[1],r.useEffect(function(){t.current&&!m&&(v(!0),requestAnimationFrame(function(){return t.current.scrollIntoView({behavior:"smooth",block:"center"})}))},[t.current,m]),t),S=(0,i.Rt)(e.interactive,e.studentResults),C=(0,d.Q)(e.interactive),I=function(e,t){return e.filter(function(e){return u.A.isInteractionCorrect(e,(0,d.j_)(t))===l.w.AwaitingMarking})}(C,e.studentResults);function A(){p(!0),e.submitMarkedAnswers()}return r.createElement(r.Fragment,null,r.createElement(b,{summary:S,interactionsToMark:I,markedAnswers:e.markedAnswers,onClickSubmit:A,showSubmitButtonSpinner:f,isDemo:e.isDemo}),r.createElement("ul",{className:"list-unstyled"},C.map(function(t,n){var l,u=t.id.toString()===(null===(l=e.selectedInteractionId)||void 0===l?void 0:l.toString()),d=I.some(function(e){return e.id===t.id}),m=(0,s.B)(e.studentResults.user,e.anonymiseUsers),v="p-2 mb-3 rounded";return u&&(v+=" border-2 border-info shadow"),v+=d?" ".concat(g.awaitingMarking):" border",r.createElement("li",{key:n,className:v,ref:u?w:null},r.createElement("div",{className:"d-flex mb-2"},r.createElement(c.y,{interaction:t,iconClassName:"flex-shrink-0"})),e.reportsStyling?r.createElement(o.O,{interaction:t,studentResults:e.studentResults,markedStatus:(0,i.HI)(t.id,e.studentResults,e.markedAnswers),markInteraction:e.addMarkedAnswers,imageCdnUrl:e.imageCdnUrl,anonymisedUserName:m,className:"bg-light ps-2",showFeedback:!0,reportsStyling:!0,responseComponentClass:"mx-n2"}):r.createElement(a.d,{interaction:t,studentResults:e.studentResults,markedStatus:(0,i.HI)(t.id,e.studentResults,e.markedAnswers),markInteraction:e.addMarkedAnswers,imageCdnUrl:e.imageCdnUrl,anonymisedUserName:m,showFeedback:!0}))})),r.createElement(y,{interactionsToMark:I,markedAnswers:e.markedAnswers,onClickSubmit:A,onClickClose:e.onClickClose,showSubmitButtonSpinner:f,isDemo:e.isDemo}))}},94892:(e,t,n)=>{n.d(t,{T:()=>a,i:()=>r});var r={HIGH:.75,MODERATE:.5},a={HIGH:.7,MODERATE:.7}},94644:(e,t,n)=>{n.d(t,{r:()=>u});var r=n(50242),a=n(81886),s=n(67058),i=n(14553),o=n(49267),c=n(49075),l={notFound:s.d,forbidden:{rating:i.q,yearLevel:i.q,region:o.a,privacy:i.q},badRequest:c._,internalServerError:c._};function u(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e){var s;s="number"==typeof e?e:e.status;var i=Object.assign(Object.assign({},l),t);s&&a.Q.Ry.isStatusCodeError(s)&&(s!==r.o.InternalServer?s!==r.o.NotFound?s!==r.o.Forbidden?n.badRequest||a.Q.Ry.throw(new i.badRequest):n.forbidden||a.Q.Ry.throw(new i.forbidden.privacy):n.notFound||a.Q.Ry.throw(new i.notFound):n.internalServerError||a.Q.Ry.throw(new c._))}}},91286:(e,t,n)=>{n.d(t,{v:()=>i});var r=n(32735),a=n(94644);function s(e){return e.map(function(e){return e.statusCode}).join(":")}function i(e,t,n){var i=Array.isArray(e)?e:[e];(0,r.useEffect)(function(){i.forEach(function(e){(0,a.r)(e.statusCode,t,n)})},[s(i),t,n])}},9447:(e,t,n)=>{n.d(t,{Y:()=>i});var r=n(20354),a=n(30439);function s(e){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},s(e)}function i(e){var t,n=r.a.useBasicFetch(a.o.getAnonSessions(e));return{items:(null===(t=n.data)||void 0===t?void 0:t.reduce(function(e,t){return Object.assign(Object.assign({},e),(n={},r=t.sessionId,a={sessionId:(i=t).sessionId,name:i.sessionName},(r=function(e){var t=function(e){if("object"!=s(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=s(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==s(t)?t:t+""}(r))in n?Object.defineProperty(n,r,{value:a,enumerable:!0,configurable:!0,writable:!0}):n[r]=a,n));var n,r,a,i},{}))||{},hasCompleted:n.hasCompleted}}},5780:(e,t,n)=>{n.d(t,{p:()=>l});var r=n(20354),a=n(2510),s=n(18488),i=n(4594),o=n(3010),c=n(88630);function l(e){var t,n,l,u,d=r.a.useGetFetch(),m=r.a.useBasicFetch(s.o.getShare(e)),v=(null===(t=m.data)||void 0===t?void 0:t.type)===a.y.Classroom&&(null===(u=null===(l=null===(n=m.data)||void 0===n?void 0:n.recipients)||void 0===l?void 0:l.find(function(e){return e.recipientTypeId===i.E.Classroom}))||void 0===u?void 0:u.recipientId),h=function(e){return c.F.getClassroomStudents(v,e)},f=(0,o.i)(v&&h,function(e){return d(h(e))});return Object.assign(Object.assign({},f),{hasCompleted:!v||f.hasCompleted})}},52389:(e,t,n)=>{n.d(t,{_:()=>d});var r=n(20354),a=n(41196),s=n(18488),i=n(91286),o=n(9447),c=n(5780);function l(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=[{id:"0",attempts:[{id:"0",answeredAt:0,answers:[]}]}];function d(e){var t,n,d=r.a.useBasicFetch(s.o.getShare(e)),m=(0,a.W)(null===(t=d.data)||void 0===t?void 0:t.objectId,null,!0),v=(0,o.Y)(e),h=(0,c.p)(e);(0,i.v)(m);var f=m.hasCompleted&&v.hasCompleted&&h.hasCompleted;if(!f)return{data:null,hasCompleted:!1};var y,p=new Set,b=m.data.students.map(function(e){return e.user?(p.add(e.user.id),e):Object.assign(Object.assign({},e),{user:v.items[e.sessionId]||{sessionId:e.sessionId}})});return(null===(n=null==h?void 0:h.items)||void 0===n?void 0:n.length)&&b.push.apply(b,function(e){if(Array.isArray(e))return l(e)}(y=h.items.filter(function(e){return!p.has(e.id)}).map(function(e){return{user:e,results:u}}))||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(y)||function(e,t){if(e){if("string"==typeof e)return l(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)?l(e,t):void 0}}(y)||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.")}()),{hasCompleted:f,data:Object.assign(Object.assign({},m.data),{students:b})}}},2900:(e,t,n)=>{n.r(t),n.d(t,{InsightsStudentResultsView:()=>g});var r=n(32735),a=n(23481),s=n(20354),i=n(2948),o=n(9193),c=n(26136),l=n(18488),u=n(3218),d=n(9111),m=n(38143),v=n(39151),h=n(20768),f=n(91286),y=n(52389);function p(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var b=a.T.encloseNamespace("shared.insightsStudentResults");function g(e){var t,n,a,g,k,w,S,C=(w=(0,i.D)(m.g.ANONYMISE_USERS),S=1,function(e){if(Array.isArray(e))return e}(w)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,s,i,o=[],c=!0,l=!1;try{if(s=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=s.call(n)).done)&&(o.push(r.value),o.length!==t);c=!0);}catch(e){l=!0,a=e}finally{try{if(!c&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(l)throw a}}return o}}(w,S)||function(e,t){if(e){if("string"==typeof e)return p(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?p(e,t):void 0}}(w,S)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0],I=s.a.useBasicFetch(v.L.config()),A=s.a.useBasicFetch(l.o.getShare(e.shareId)),j=s.a.useBasicFetch((null===(t=A.data)||void 0===t?void 0:t.objectId)&&h.b.interactiveMetadata(A.data.objectId)),E=s.a.useBasicFetch((null===(n=j.data)||void 0===n?void 0:n.interactiveId)&&h.b.interactive(j.data.interactiveId)),O=(0,y._)(e.shareId);(0,f.v)([A,E,j]);var N=(0,o.D)(null===(a=E.data)||void 0===a?void 0:a.id,null===(g=j.data)||void 0===g?void 0:g.id,e.closePopup),R=N.markedAnswers,M=N.addMarkedAnswers,B=N.submitMarkedAnswers,F=null===(k=O.data)||void 0===k?void 0:k.students.find(function(t){var n,r,a,s,i;return e.userId?(null===(r=null===(n=t.user)||void 0===n?void 0:n.id)||void 0===r?void 0:r.toString())===(null===(a=e.userId)||void 0===a?void 0:a.toString()):!!e.sessionId&&(null===(s=t.sessionId)||void 0===s?void 0:s.toString())===(null===(i=e.sessionId)||void 0===i?void 0:i.toString())}),T=F?b("heading",{studentName:(0,c.B)(F.user,C)}):"",U=I.hasCompleted&&A.hasCompleted&&j.hasCompleted&&E.hasCompleted&&O.hasCompleted;return r.createElement(d.G,{title:T,showLoadingSpinner:!U,closePopup:e.closePopup,size:"lg"},U&&r.createElement(u.R,{interactive:E.data,studentResults:F,markedAnswers:R,addMarkedAnswers:M,submitMarkedAnswers:B,imageCdnUrl:I.data.imageCdnUrl,selectedInteractionId:e.interactionId,onClickClose:e.closePopup,anonymiseUsers:C}))}}}]);
2
- //# sourceMappingURL=7148-50ccb48a44-lite.chunk.js.map
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[7148],{41196:(e,t,n)=>{n.d(t,{W:()=>o});var r=n(20354),a=n(93479),s=n(20768),i=n(31949);function o(e,t,n){var o,c=r.a.useBasicFetch(i.N.currentUser()),l=r.a.useBasicFetch(!!e&&s.b.interactiveMetadata(e)),u=r.a.useBasicFetch(!!(null===(o=l.data)||void 0===o?void 0:o.interactiveId)&&s.b.interactive(l.data.interactiveId)),d=!!c.data&&!!u.data;return r.a.useBasicFetch(d&&a.I.interactiveResultSet(l.data.interactiveId,l.data.id,c.data,t,n))}},26136:(e,t,n)=>{n.d(t,{B:()=>o});var r=n(76198),a=n(23481),s=n(64818),i=a.T.encloseNamespace("shared.analyticsUtils");function o(e,t){return e?t?(0,r._8)((n=e.id,a=e.sessionId,o=+"".concat(n||function(e){if(!e)return 0;for(var t=0,n=0;n<e.length;n++)t=(t<<5)-t+e.charCodeAt(n),t|=0;return Math.abs(t)}(a)).concat(Math.floor((new Date).getMinutes()/5)),{dictionaries:[r.O9,r.yd],separator:" ",length:2,style:"capital",seed:o})):s.l.getFullName(e)||i("anonUser"):i("anonUser");var n,a,o}},2510:(e,t,n)=>{var r;n.d(t,{y:()=>r}),function(e){e.Link="Link",e.Classroom="Classroom",e.Open="Open",e.Live="Live",e.LegacyDirect="LegacyDirect"}(r||(r={}))},18488:(e,t,n)=>{n.d(t,{o:()=>i});var r=n(99940),a=n(97395),s={namespace:"share-v2"},i={createShare:function(e){return{url:"{gateway}/v2/shares",key:"create:share-v2",type:r.k.POST,data:e,normalizeOptions:s,invalidationKeys:["sent:share-v2","get:share-v2:shares:object"]}},updateShare:function(e,t){return{url:"{gateway}/v2/shares/".concat(e),key:"update:share-v2",type:r.k.PUT,data:t,normalizeOptions:s,invalidationKeys:["share-v2:permanent-link:object","share-v2:".concat(e),"get:share-v2:shares:object"]}},deleteShare:function(e){return{type:r.k.DELETE,url:"{gateway}/v2/shares/".concat(e),key:"delete:share-v2",normalizeOptions:s,invalidationKeys:["share-v2:permanent-link:object","sent:share-v2","share-v2:".concat(e),"get:share-v2:shares:object"]}},getShare:function(e){return{url:"{gateway}/v2/shares/".concat(e),key:"share-v2:".concat(e),bootstrapName:"share-v2:".concat(e),type:r.k.GET,normalizeOptions:s}},getSentShares:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=Object.values(e).sort().join(":");return{url:a._.urlBuilder("{gateway}/v2/shares/sent",e),key:"sent:share-v2:".concat(t),type:r.k.GET,normalize:!1}},getShareLink:function(e){return{url:a._.urlBuilder("{gateway}/v2/shares/permanent-link",{objectId:e}),key:"share-v2:permanent-link:object:".concat(e),normalizeOptions:s}},createShareLink:function(e){return{type:r.k.POST,url:a._.urlBuilder("{gateway}/v2/shares/permanent-link",Object.assign({},e)),key:"create:share-v2:permanent-link:object:".concat(e.objectId),invalidationKeys:["share-v2:permanent-link:object:".concat(e.objectId),"sent:share-v2","get:share-v2:shares:object:".concat(e.objectId)],normalizeOptions:s}},getPrivacy:function(e){return{url:"{gateway}/v1/objects/".concat(e,"/access"),key:"privacy:".concat(e),normalize:!1}},getSharesByObjectId:function(e){return{url:"{gateway}/v2/shares/objects/".concat(e),key:"get:share-v2:shares:object:".concat(e),type:r.k.GET,normalizeOptions:s}},createSharePincode:function(e){return{url:"{gateway}/v2/shares/".concat(e,"/pincode"),key:"create:share-v2:".concat(e,":pincode"),type:r.k.POST}},getPincodeByShareId:function(e){return{url:"{gateway}/v2/shares/".concat(e,"/pincode"),key:"get:share-v2:".concat(e,":pincode")}},getPincodeByCode:function(e){return{url:"{gateway}/v2/shares/pincode?code=".concat(e),key:"get:share-v2:pincode:".concat(e)}}}},3218:(e,t,n)=>{n.d(t,{R:()=>S});var r=n(32735),a=n(69087),s=n(26136),i=n(39157),o=n(69186),c=n(86572),l=n(28972),u=n(83140),d=n(80845),m=n(23481),v=n(2102),h=n(36532),f=m.T.encloseNamespace("interactives.studentResponseList");function y(e){var t=Object.keys(e.markedAnswers).length;return r.createElement("div",{className:"d-flex justify-content-end pt-3"},r.createElement("div",null,!e.showSubmitButtonSpinner&&r.createElement("button",{className:"btn btn-link",onClick:e.onClickClose},f("close")),!!e.interactionsToMark.length&&r.createElement(r.Fragment,null,e.isDemo?r.createElement(h.u,{id:"submitAnswers",title:f("demoOnly"),spanHack:!0,spanHackClassName:"d-inline-flex"},r.createElement("button",{className:"btn btn-outline-dark pointer-events-none",disabled:!t},f("submitAnswers"))):r.createElement(v.m,{variant:"outline-dark",onClick:e.onClickSubmit,disabled:!t,showSpinner:e.showSubmitButtonSpinner},f("submitAnswers")))))}var p=m.T.encloseNamespace("interactives.studentResponseList");function b(e){var t=Object.keys(e.markedAnswers).length;return r.createElement("div",{className:"d-flex justify-content-between pb-3"},r.createElement("div",{className:"d-flex"},!!e.summary.unanswered&&r.createElement("div",{className:"bg-light rounded p-2 me-2"},r.createElement("strong",{className:"me-2"},p("unanswered")),e.summary.unanswered),r.createElement("div",{className:"bg-light rounded p-2 me-2"},r.createElement("strong",{className:"me-2"},p("score")),e.summary.awaitingMarking?r.createElement("em",null,p("pending")):"".concat(Math.round(100*e.summary.percentCorrect),"%"))),!!e.interactionsToMark.length&&r.createElement(r.Fragment,null,e.isDemo?r.createElement(h.u,{id:"submitAnswers",title:p("demoOnly"),spanHack:!0},r.createElement("button",{className:"btn btn-outline-dark pointer-events-none",disabled:!t},p("submitAnswers"))):r.createElement(v.m,{variant:"outline-dark",onClick:e.onClickSubmit,disabled:!t,showSpinner:e.showSubmitButtonSpinner},p("submitAnswers"))))}const g={awaitingMarking:"MvGb5"};function k(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,s,i,o=[],c=!0,l=!1;try{if(s=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=s.call(n)).done)&&(o.push(r.value),o.length!==t);c=!0);}catch(e){l=!0,a=e}finally{try{if(!c&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(l)throw a}}return o}}(e,t)||function(e,t){if(e){if("string"==typeof e)return w(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)?w(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 w(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function S(e){var t,n,m,v,h=k(r.useState(!1),2),f=h[0],p=h[1],w=(t=r.useRef(null),n=k(r.useState(!1),2),m=n[0],v=n[1],r.useEffect(function(){t.current&&!m&&(v(!0),requestAnimationFrame(function(){return t.current.scrollIntoView({behavior:"smooth",block:"center"})}))},[t.current,m]),t),S=(0,i.Rt)(e.interactive,e.studentResults),C=(0,d.Q)(e.interactive),I=function(e,t){return e.filter(function(e){return u.A.isInteractionCorrect(e,(0,d.j_)(t))===l.w.AwaitingMarking})}(C,e.studentResults);function A(){p(!0),e.submitMarkedAnswers()}return r.createElement(r.Fragment,null,r.createElement(b,{summary:S,interactionsToMark:I,markedAnswers:e.markedAnswers,onClickSubmit:A,showSubmitButtonSpinner:f,isDemo:e.isDemo}),r.createElement("ul",{className:"list-unstyled"},C.map(function(t,n){var l,u=t.id.toString()===(null===(l=e.selectedInteractionId)||void 0===l?void 0:l.toString()),d=I.some(function(e){return e.id===t.id}),m=(0,s.B)(e.studentResults.user,e.anonymiseUsers),v="p-2 mb-3 rounded";return u&&(v+=" border-2 border-info shadow"),v+=d?" ".concat(g.awaitingMarking):" border",r.createElement("li",{key:n,className:v,ref:u?w:null},r.createElement("div",{className:"d-flex mb-2"},r.createElement(c.y,{interaction:t,iconClassName:"flex-shrink-0"})),e.reportsStyling?r.createElement(o.O,{interaction:t,studentResults:e.studentResults,markedStatus:(0,i.HI)(t.id,e.studentResults,e.markedAnswers),markInteraction:e.addMarkedAnswers,imageCdnUrl:e.imageCdnUrl,anonymisedUserName:m,className:"bg-light ps-2",showFeedback:!0,reportsStyling:!0,responseComponentClass:"mx-n2"}):r.createElement(a.d,{interaction:t,studentResults:e.studentResults,markedStatus:(0,i.HI)(t.id,e.studentResults,e.markedAnswers),markInteraction:e.addMarkedAnswers,imageCdnUrl:e.imageCdnUrl,anonymisedUserName:m,showFeedback:!0}))})),r.createElement(y,{interactionsToMark:I,markedAnswers:e.markedAnswers,onClickSubmit:A,onClickClose:e.onClickClose,showSubmitButtonSpinner:f,isDemo:e.isDemo}))}},94892:(e,t,n)=>{n.d(t,{T:()=>a,i:()=>r});var r={HIGH:.75,MODERATE:.5},a={HIGH:.7,MODERATE:.7}},94644:(e,t,n)=>{n.d(t,{r:()=>u});var r=n(50242),a=n(81886),s=n(67058),i=n(14553),o=n(49267),c=n(49075),l={notFound:s.d,forbidden:{rating:i.q,yearLevel:i.q,region:o.a,privacy:i.q},badRequest:c._,internalServerError:c._};function u(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e){var s;s="number"==typeof e?e:e.status;var i=Object.assign(Object.assign({},l),t);s&&a.Q.Ry.isStatusCodeError(s)&&(s!==r.o.InternalServer?s!==r.o.NotFound?s!==r.o.Forbidden?n.badRequest||a.Q.Ry.throw(new i.badRequest):n.forbidden||a.Q.Ry.throw(new i.forbidden.privacy):n.notFound||a.Q.Ry.throw(new i.notFound):n.internalServerError||a.Q.Ry.throw(new c._))}}},91286:(e,t,n)=>{n.d(t,{v:()=>i});var r=n(32735),a=n(94644);function s(e){return e.map(function(e){return e.statusCode}).join(":")}function i(e,t,n){var i=Array.isArray(e)?e:[e];(0,r.useEffect)(function(){i.forEach(function(e){(0,a.r)(e.statusCode,t,n)})},[s(i),t,n])}},9447:(e,t,n)=>{n.d(t,{Y:()=>i});var r=n(20354),a=n(30439);function s(e){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},s(e)}function i(e){var t,n=r.a.useBasicFetch(a.o.getAnonSessions(e));return{items:(null===(t=n.data)||void 0===t?void 0:t.reduce(function(e,t){return Object.assign(Object.assign({},e),(n={},r=t.sessionId,a={sessionId:(i=t).sessionId,name:i.sessionName},(r=function(e){var t=function(e){if("object"!=s(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=s(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==s(t)?t:t+""}(r))in n?Object.defineProperty(n,r,{value:a,enumerable:!0,configurable:!0,writable:!0}):n[r]=a,n));var n,r,a,i},{}))||{},hasCompleted:n.hasCompleted}}},5780:(e,t,n)=>{n.d(t,{p:()=>l});var r=n(20354),a=n(2510),s=n(18488),i=n(4594),o=n(3010),c=n(88630);function l(e){var t,n,l,u,d=r.a.useGetFetch(),m=r.a.useBasicFetch(s.o.getShare(e)),v=(null===(t=m.data)||void 0===t?void 0:t.type)===a.y.Classroom&&(null===(u=null===(l=null===(n=m.data)||void 0===n?void 0:n.recipients)||void 0===l?void 0:l.find(function(e){return e.recipientTypeId===i.E.Classroom}))||void 0===u?void 0:u.recipientId),h=function(e){return c.F.getClassroomStudents(v,e)},f=(0,o.i)(v&&h,function(e){return d(h(e))});return Object.assign(Object.assign({},f),{hasCompleted:!v||f.hasCompleted})}},52389:(e,t,n)=>{n.d(t,{_:()=>d});var r=n(20354),a=n(41196),s=n(18488),i=n(91286),o=n(9447),c=n(5780);function l(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=[{id:"0",attempts:[{id:"0",answeredAt:0,answers:[]}]}];function d(e){var t,n,d=r.a.useBasicFetch(s.o.getShare(e)),m=(0,a.W)(null===(t=d.data)||void 0===t?void 0:t.objectId,null,e),v=(0,o.Y)(e),h=(0,c.p)(e);(0,i.v)(m);var f=m.hasCompleted&&v.hasCompleted&&h.hasCompleted;if(!f)return{data:null,hasCompleted:!1};var y,p=new Set,b=m.data.students.map(function(e){return e.user?(p.add(e.user.id),e):Object.assign(Object.assign({},e),{user:v.items[e.sessionId]||{sessionId:e.sessionId}})});return(null===(n=null==h?void 0:h.items)||void 0===n?void 0:n.length)&&b.push.apply(b,function(e){if(Array.isArray(e))return l(e)}(y=h.items.filter(function(e){return!p.has(e.id)}).map(function(e){return{user:e,results:u}}))||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(y)||function(e,t){if(e){if("string"==typeof e)return l(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)?l(e,t):void 0}}(y)||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.")}()),{hasCompleted:f,data:Object.assign(Object.assign({},m.data),{students:b})}}},2900:(e,t,n)=>{n.r(t),n.d(t,{InsightsStudentResultsView:()=>g});var r=n(32735),a=n(23481),s=n(20354),i=n(2948),o=n(9193),c=n(26136),l=n(18488),u=n(3218),d=n(9111),m=n(38143),v=n(39151),h=n(20768),f=n(91286),y=n(52389);function p(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var b=a.T.encloseNamespace("shared.insightsStudentResults");function g(e){var t,n,a,g,k,w,S,C=(w=(0,i.D)(m.g.ANONYMISE_USERS),S=1,function(e){if(Array.isArray(e))return e}(w)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,s,i,o=[],c=!0,l=!1;try{if(s=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=s.call(n)).done)&&(o.push(r.value),o.length!==t);c=!0);}catch(e){l=!0,a=e}finally{try{if(!c&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(l)throw a}}return o}}(w,S)||function(e,t){if(e){if("string"==typeof e)return p(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?p(e,t):void 0}}(w,S)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0],I=s.a.useBasicFetch(v.L.config()),A=s.a.useBasicFetch(l.o.getShare(e.shareId)),j=s.a.useBasicFetch((null===(t=A.data)||void 0===t?void 0:t.objectId)&&h.b.interactiveMetadata(A.data.objectId)),E=s.a.useBasicFetch((null===(n=j.data)||void 0===n?void 0:n.interactiveId)&&h.b.interactive(j.data.interactiveId)),O=(0,y._)(e.shareId);(0,f.v)([A,E,j]);var N=(0,o.D)(null===(a=E.data)||void 0===a?void 0:a.id,null===(g=j.data)||void 0===g?void 0:g.id,e.closePopup),R=N.markedAnswers,M=N.addMarkedAnswers,B=N.submitMarkedAnswers,F=null===(k=O.data)||void 0===k?void 0:k.students.find(function(t){var n,r,a,s,i;return e.userId?(null===(r=null===(n=t.user)||void 0===n?void 0:n.id)||void 0===r?void 0:r.toString())===(null===(a=e.userId)||void 0===a?void 0:a.toString()):!!e.sessionId&&(null===(s=t.sessionId)||void 0===s?void 0:s.toString())===(null===(i=e.sessionId)||void 0===i?void 0:i.toString())}),T=F?b("heading",{studentName:(0,c.B)(F.user,C)}):"",U=I.hasCompleted&&A.hasCompleted&&j.hasCompleted&&E.hasCompleted&&O.hasCompleted;return r.createElement(d.G,{title:T,showLoadingSpinner:!U,closePopup:e.closePopup,size:"lg"},U&&r.createElement(u.R,{interactive:E.data,studentResults:F,markedAnswers:R,addMarkedAnswers:M,submitMarkedAnswers:B,imageCdnUrl:I.data.imageCdnUrl,selectedInteractionId:e.interactionId,onClickClose:e.closePopup,anonymiseUsers:C}))}}}]);
2
+ //# sourceMappingURL=7148-e314dd9a4e-lite.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/7148-e314dd9a4e-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/analytics/hooks/UseFetchInteractiveResults.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/AnonymiseUserUtils.ts","file:///app/packages/libs/shared/src/apps/share-v2/enums/ShareType.ts","file:///app/packages/libs/shared/src/apps/share-v2/flight-requests/ShareRequests.ts","file:///app/packages/libs/shared/src/apps/student-response-list/StudentResponseListFooter.tsx","file:///app/packages/libs/shared/src/apps/student-response-list/StudentResponseListHeader.tsx","file:///app/packages/libs/shared/src/apps/student-response-list/student-response-list.scss","file:///app/packages/libs/shared/src/apps/student-response-list/StudentResponseList.tsx","file:///app/packages/libs/shared/src/constants/ScoreThresholds.ts","file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/hooks/UseHandleObjectError.ts","file:///app/packages/projects/lite/src/apps/my-shares/hooks/useAnonSessions.ts","file:///app/packages/projects/lite/src/apps/my-shares/hooks/useInsightsClassroomStudents.ts","file:///app/packages/projects/lite/src/apps/my-shares/hooks/useInsightsInteractiveResults.ts","file:///app/packages/projects/lite/src/apps/my-shares/views/interactive/insights-student-results/InsightsStudentResultsView.tsx"],"sourcesContent":["import { Flight } from 'libs/common/flight';\n\nimport { InteractiveResultsRequests } from 'libs/shared/apps/analytics/flight-requests/InteractiveResultsRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { AnalyticsRequestFilter, CurrentUser, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\n\nexport function useFetchInteractiveResults(\n interactiveMetadataId: string,\n requestFilter?: AnalyticsRequestFilter,\n shareId?: string\n): Flight.Response<InteractiveResultSet> {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(!!interactiveMetadataId &&\n InteractiveRequests.interactiveMetadata(interactiveMetadataId));\n\n const interactive = Flight.useBasicFetch<Interactive>(!!interactiveMetadata.data?.interactiveId &&\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId));\n\n const shouldFetchResults = !!currentUser.data && !!interactive.data;\n\n return Flight.useBasicFetch<InteractiveResultSet>(shouldFetchResults &&\n InteractiveResultsRequests.interactiveResultSet(\n interactiveMetadata.data.interactiveId,\n interactiveMetadata.data.id,\n currentUser.data,\n requestFilter,\n shareId\n ));\n}","import { animals, colors, Config as UniqueNamesConfig, uniqueNamesGenerator } from 'unique-names-generator';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nconst namespace = 'shared.analyticsUtils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction guidToSeed(guid: string): number {\n if (!guid)\n return 0;\n\n // Simple hash function (DJB2-like) for browsers\n let hash = 0;\n for (let i = 0; i < guid.length; i++) {\n const char = guid.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash |= 0; // Convert to 32bit integer\n }\n return Math.abs(hash);\n}\n\nfunction getUniqueNamesConfig(userId: string, sessionId: string): UniqueNamesConfig {\n /**\n * Generate a seed that is unique to each user but changes every 5 minutes.\n * \n * We use a seed so that if the same user's name is anonymised multiple times\n * in quick succession (e.g. multiple renders), the same name will be returned each time.\n * \n * We change the seed every 5 minutes so that students don't always have the same name.\n */\n const seed = +`${userId || guidToSeed(sessionId)}${Math.floor((new Date()).getMinutes() / 5)}`;\n\n return {\n dictionaries: [ colors, animals ],\n separator: ' ',\n length: 2,\n style: 'capital',\n seed\n };\n}\n\nexport function anonymiseUserName(user: AnonUser, shouldAnonymise: boolean): string {\n if (!user) {\n return getPhrase('anonUser');\n }\n\n if (!shouldAnonymise)\n return UserHelper.getFullName(user) || getPhrase('anonUser');\n\n return uniqueNamesGenerator(getUniqueNamesConfig(user.id, user.sessionId));\n}\n","export enum ShareType {\n Link = 'Link',\n Classroom = 'Classroom',\n Open = 'Open',\n Live = 'Live',\n LegacyDirect = 'LegacyDirect',\n}","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { CreateShareLinkRequest } from 'libs/shared/apps/share-v2/interfaces/CreateShareLinkRequest';\nimport { CreateShareRequest } from 'libs/shared/apps/share-v2/interfaces/CreateShareRequest';\nimport { UpdateShareRequest } from 'libs/shared/apps/share-v2/interfaces/UpdateShareRequest';\n\nconst normalizeOptions: Flight.NormalizeOptions = {\n namespace: 'share-v2'\n};\n\nexport interface GetSentSharesParams {\n cursor?: string;\n scopeId?: string;\n objectTypeId?: number;\n type?: ShareType[];\n}\n\nexport const ShareRequests = {\n createShare(\n data: CreateShareRequest\n ): Flight.Request {\n return {\n url: '{gateway}/v2/shares',\n key: 'create:share-v2',\n type: HttpVerbs.POST,\n data,\n normalizeOptions,\n invalidationKeys: [ 'sent:share-v2', 'get:share-v2:shares:object' ]\n };\n },\n\n updateShare(\n shareId: string,\n data: UpdateShareRequest\n ): Flight.Request {\n return {\n url: `{gateway}/v2/shares/${shareId}`,\n key: `update:share-v2`,\n type: HttpVerbs.PUT,\n data,\n normalizeOptions,\n invalidationKeys: [ 'share-v2:permanent-link:object', `share-v2:${shareId}`, 'get:share-v2:shares:object' ]\n };\n },\n \n deleteShare(\n shareId: string\n ): Flight.Request {\n return {\n type: HttpVerbs.DELETE,\n url: `{gateway}/v2/shares/${shareId}`,\n key: `delete:share-v2`,\n normalizeOptions,\n invalidationKeys: [ 'share-v2:permanent-link:object', 'sent:share-v2', `share-v2:${shareId}`, 'get:share-v2:shares:object' ]\n };\n },\n\n getShare(\n shareId: string\n ): Flight.Request {\n return {\n url: `{gateway}/v2/shares/${shareId}`,\n key: `share-v2:${shareId}`,\n bootstrapName: `share-v2:${shareId}`,\n type: HttpVerbs.GET,\n normalizeOptions\n };\n },\n\n getSentShares(\n params: GetSentSharesParams = {}\n ): Flight.Request {\n const key = Object.values(params).sort().join(':');\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v2/shares/sent', params),\n key: `sent:share-v2:${key}`,\n type: HttpVerbs.GET,\n normalize: false\n };\n },\n\n getShareLink(\n id: string\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder('{gateway}/v2/shares/permanent-link', { objectId: id }),\n key: `share-v2:permanent-link:object:${id}`,\n normalizeOptions\n };\n },\n\n createShareLink(\n data: CreateShareLinkRequest\n ): Flight.Request {\n return {\n type: HttpVerbs.POST,\n url: UrlHelper.urlBuilder('{gateway}/v2/shares/permanent-link', { ...data }),\n key: `create:share-v2:permanent-link:object:${data.objectId}`,\n invalidationKeys: [ `share-v2:permanent-link:object:${data.objectId}`, 'sent:share-v2', `get:share-v2:shares:object:${data.objectId}` ],\n normalizeOptions\n };\n },\n\n getPrivacy(id: string): Flight.Request {\n return {\n url: `{gateway}/v1/objects/${id}/access`,\n key: `privacy:${id}`,\n normalize: false\n };\n },\n \n getSharesByObjectId(\n objectId: string | number\n ): Flight.Request {\n return {\n url: `{gateway}/v2/shares/objects/${objectId}`,\n key: `get:share-v2:shares:object:${objectId}`,\n type: HttpVerbs.GET,\n normalizeOptions\n };\n },\n\n createSharePincode(shareId: string): Flight.Request {\n return {\n url: `{gateway}/v2/shares/${shareId}/pincode`,\n key: `create:share-v2:${shareId}:pincode`,\n type: HttpVerbs.POST\n };\n },\n\n getPincodeByShareId(shareId: string): Flight.Request {\n return {\n url: `{gateway}/v2/shares/${shareId}/pincode`,\n key: `get:share-v2:${shareId}:pincode`\n };\n },\n\n getPincodeByCode(code: string): Flight.Request {\n return {\n url: `{gateway}/v2/shares/pincode?code=${code}`,\n key: `get:share-v2:pincode:${code}`\n };\n }\n};\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { Interaction } from 'libs/shared/interfaces';\n\nconst namespace = 'interactives.studentResponseList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface StudentResponseListFooterProps {\n interactionsToMark: Interaction[];\n markedAnswers: MarkedAnswerHash;\n onClickSubmit: () => void;\n onClickClose: () => void;\n showSubmitButtonSpinner: boolean;\n isDemo?: boolean;\n}\n\nexport function StudentResponseListFooter(props: StudentResponseListFooterProps): JSX.Element {\n const numMarkedAnswers = Object.keys(props.markedAnswers).length;\n\n return (\n <div className='d-flex justify-content-end pt-3'>\n <div>\n {!props.showSubmitButtonSpinner &&\n <button className='btn btn-link' onClick={props.onClickClose}>\n {getPhrase('close')}\n </button>\n }\n {!!props.interactionsToMark.length && (\n <>\n {props.isDemo ? (\n <Tooltip\n id='submitAnswers'\n title={getPhrase('demoOnly')}\n spanHack\n spanHackClassName='d-inline-flex'\n >\n <button\n className='btn btn-outline-dark pointer-events-none'\n disabled={!numMarkedAnswers}\n >\n {getPhrase('submitAnswers')}\n </button>\n </Tooltip>\n ) : (\n <SpinnerButton\n variant='outline-dark'\n onClick={props.onClickSubmit}\n disabled={!numMarkedAnswers}\n showSpinner={props.showSubmitButtonSpinner}\n >\n {getPhrase('submitAnswers')}\n </SpinnerButton>\n )}\n </>\n )}\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { ResultsSummary } from 'libs/shared/apps/analytics/interfaces/ResultsSummary';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { Interaction } from 'libs/shared/interfaces';\n\nconst namespace = 'interactives.studentResponseList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface StudentResponseListHeaderProps {\n summary: ResultsSummary;\n interactionsToMark: Interaction[];\n markedAnswers: MarkedAnswerHash;\n onClickSubmit: () => void;\n showSubmitButtonSpinner: boolean;\n isDemo?: boolean;\n}\n\nexport function StudentResponseListHeader(props: StudentResponseListHeaderProps): JSX.Element {\n const numMarkedAnswers = Object.keys(props.markedAnswers).length;\n\n return (\n <div className='d-flex justify-content-between pb-3'>\n <div className='d-flex'>\n {!!props.summary.unanswered &&\n <div className='bg-light rounded p-2 me-2'>\n <strong className='me-2'>{getPhrase('unanswered')}</strong>\n {props.summary.unanswered}\n </div>\n }\n <div className='bg-light rounded p-2 me-2'>\n <strong className='me-2'>{getPhrase('score')}</strong>\n {props.summary.awaitingMarking\n ? <em>{getPhrase('pending')}</em>\n : `${Math.round(props.summary.percentCorrect * 100)}%`\n }\n </div>\n </div>\n {!!props.interactionsToMark.length && (\n <>\n {props.isDemo ? (\n <Tooltip id='submitAnswers' title={getPhrase('demoOnly')} spanHack>\n <button\n className='btn btn-outline-dark pointer-events-none'\n disabled={!numMarkedAnswers}\n >\n {getPhrase('submitAnswers')}\n </button>\n </Tooltip>\n ) : (\n <SpinnerButton\n variant='outline-dark'\n onClick={props.onClickSubmit}\n disabled={!numMarkedAnswers}\n showSpinner={props.showSubmitButtonSpinner}\n >\n {getPhrase('submitAnswers')}\n </SpinnerButton>\n )}\n </>\n )}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"awaitingMarking\":\"MvGb5\"};","import React from 'react';\n\nimport { InteractionResponseItem } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/InteractionResponseItem';\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { anonymiseUserName } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { getMarkedStatus, getStudentResultsSummary } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { InteractionResponse } from 'libs/shared/components/interaction-response/InteractionResponse';\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, Interactive, StudentAnswer, StudentResults } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { getInteractions, getStudentResult } from 'libs/shared/utils/InteractiveHelper';\n\nimport { StudentResponseListFooter } from './StudentResponseListFooter';\nimport { StudentResponseListHeader } from './StudentResponseListHeader';\n\nimport styles from './student-response-list.scss';\n\nfunction getInteractionsToMark(\n interactions: Interaction[],\n studentResults: StudentResults\n): Interaction[] {\n return interactions.filter(i => {\n return InteractiveCorrectnessHelper.isInteractionCorrect(\n i,\n getStudentResult(studentResults)\n ) === InteractionCorrectness.AwaitingMarking;\n });\n}\n\n// eslint-disable-next-line rulesdir/require-view-title\nfunction useScrollSelectedInteractionIntoView(): React.MutableRefObject<HTMLLIElement> {\n const ref = React.useRef<HTMLLIElement>(null);\n const [ scrolled, setScrolled ] = React.useState(false);\n\n // Only scroll once\n React.useEffect(() => {\n if (!ref.current || scrolled)\n return;\n\n setScrolled(true);\n requestAnimationFrame(() => ref.current.scrollIntoView({ behavior: 'smooth', block: 'center' }));\n }, [ ref.current, scrolled ]);\n\n return ref;\n}\n\ninterface StudentResponseListProps {\n interactive: Interactive;\n markedAnswers: MarkedAnswerHash;\n studentResults: StudentResults;\n addMarkedAnswers: (answer: StudentAnswer[], status: InteractiveAnswerStatus) => void;\n submitMarkedAnswers: () => void;\n onClickClose: () => void;\n imageCdnUrl: string;\n selectedInteractionId?: string;\n anonymiseUsers: boolean;\n reportsStyling?: boolean;\n isDemo?: boolean;\n}\n\nexport function StudentResponseList(props: StudentResponseListProps): JSX.Element {\n const [ showSpinner, setShowSpinner ] = React.useState(false);\n const selectedInteractionRef = useScrollSelectedInteractionIntoView();\n\n const summary = getStudentResultsSummary(props.interactive, props.studentResults);\n const interactions = getInteractions(props.interactive);\n const questionsToMark = getInteractionsToMark(interactions, props.studentResults);\n\n function onClickSubmit(): void {\n setShowSpinner(true);\n props.submitMarkedAnswers();\n }\n\n return (\n <>\n <StudentResponseListHeader\n summary={summary}\n interactionsToMark={questionsToMark}\n markedAnswers={props.markedAnswers}\n onClickSubmit={onClickSubmit}\n showSubmitButtonSpinner={showSpinner}\n isDemo={props.isDemo}\n />\n <ul className='list-unstyled'>\n {interactions.map((interaction, idx) => {\n const isSelected = interaction.id.toString() === props.selectedInteractionId?.toString();\n const markingRequired = questionsToMark.some(q => q.id === interaction.id);\n const anonymisedUserName = anonymiseUserName(\n props.studentResults.user,\n props.anonymiseUsers\n );\n\n let className = 'p-2 mb-3 rounded';\n\n if (isSelected)\n className += ' border-2 border-info shadow';\n\n if (markingRequired)\n className += ` ${styles.awaitingMarking}`;\n else\n className += ' border';\n\n return (\n <li key={idx} className={className} ref={isSelected ? selectedInteractionRef : null}>\n <div className='d-flex mb-2'>\n <InteractionLabel\n interaction={interaction}\n iconClassName='flex-shrink-0'\n />\n </div>\n {props.reportsStyling ? (\n <InteractionResponse\n interaction={interaction}\n studentResults={props.studentResults}\n markedStatus={getMarkedStatus(interaction.id, props.studentResults, props.markedAnswers)}\n markInteraction={props.addMarkedAnswers}\n imageCdnUrl={props.imageCdnUrl}\n anonymisedUserName={anonymisedUserName}\n className='bg-light ps-2'\n showFeedback\n reportsStyling\n responseComponentClass='mx-n2'\n />\n ) : (\n <InteractionResponseItem\n interaction={interaction}\n studentResults={props.studentResults}\n markedStatus={getMarkedStatus(interaction.id, props.studentResults, props.markedAnswers)}\n markInteraction={props.addMarkedAnswers}\n imageCdnUrl={props.imageCdnUrl}\n anonymisedUserName={anonymisedUserName}\n showFeedback\n />\n )}\n </li>\n );\n })}\n </ul>\n <StudentResponseListFooter\n interactionsToMark={questionsToMark}\n markedAnswers={props.markedAnswers}\n onClickSubmit={onClickSubmit}\n onClickClose={props.onClickClose}\n showSubmitButtonSpinner={showSpinner}\n isDemo={props.isDemo}\n />\n </>\n );\n}","export interface ScoreThresholds {\n HIGH: number;\n MODERATE: number;\n}\n\nexport const ScoreThresholdDefaults: ScoreThresholds = {\n HIGH: 0.75,\n MODERATE: 0.5\n};\n\nexport const ScoreThresholdInsights: ScoreThresholds = {\n HIGH: 0.7,\n MODERATE: 0.7\n};","import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n internalServerError?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError,\n internalServerError: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.InternalServer) {\n if (!ignoreMap.internalServerError)\n Core.ErrorHelper.throw(new UnspecifiedError());\n return;\n }\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import { useEffect } from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { handleHttpError, HttpErrorMap, IgnoreHttpErrorMap } from 'libs/shared/errors/handlers/HttpErrorHandlers';\n\nfunction generateCacheKey(flightObjs: Array<Flight.Response<any>>): string {\n return flightObjs.map(obj => obj.statusCode).join(':');\n}\n\n// TODO: Change this to just `useHandleHttpError` and only accept a status code.\nexport function useHandleObjectError(\n _flightObjs: Flight.Response<any> | Array<Flight.Response<any>>,\n customErrors?: HttpErrorMap,\n ignoreErrors?: IgnoreHttpErrorMap\n): void {\n const flightObjs = Array.isArray(_flightObjs) ? _flightObjs : [_flightObjs];\n\n useEffect(() => {\n flightObjs.forEach(obj => {\n handleHttpError(obj.statusCode, customErrors, ignoreErrors);\n });\n }, [ generateCacheKey(flightObjs), customErrors, ignoreErrors ]);\n}","import { Flight } from 'libs/common/react/index';\n\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { AnonSession } from 'libs/shared/apps/share/interfaces/AnonSession';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nfunction toAnonUser(anonSession: AnonSession) {\n return { sessionId: anonSession.sessionId, name: anonSession.sessionName } as AnonUser;\n}\n\nexport function useAnonSessions(shareId: string) {\n const anonSessions = Flight.useBasicFetch<AnonSession[]>(ShareRequests.getAnonSessions(shareId));\n\n const anonSessionMap = anonSessions.data\n ?.reduce<Record<string, AnonUser>>((prev, next) => {\n return {\n ...prev,\n [next.sessionId]: toAnonUser(next)\n };\n }, {});\n\n return {\n items: anonSessionMap || {},\n hasCompleted: anonSessions.hasCompleted\n };\n}","import { Flight } from 'libs/common/react/index';\n\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { ShareRequests } from 'libs/shared/apps/share-v2/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { useFetchAll } from 'libs/shared/hooks/UseFetchAll';\nimport { User } from 'libs/shared/interfaces/models/User';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\n\nexport function useInsightsClassroomStudents(shareId: string) {\n const fetch = Flight.useGetFetch();\n\n const share = Flight.useBasicFetch<Share>(ShareRequests.getShare(shareId));\n \n const classroomId = share.data?.type === ShareType.Classroom &&\n share.data?.recipients?.find(r => r.recipientTypeId === MasterType.Classroom)?.recipientId;\n\n const getRequest = (cursor: string) => ClassroomRequests.getClassroomStudents(classroomId, cursor);\n const result = useFetchAll<User>(classroomId && getRequest, cursor => fetch(getRequest(cursor)));\n\n return {\n ...result,\n hasCompleted: !classroomId || result.hasCompleted\n };\n}","import { Flight } from 'libs/common/react/index';\n\nimport { useFetchInteractiveResults } from 'libs/shared/apps/analytics/hooks/UseFetchInteractiveResults';\nimport { ShareRequests } from 'libs/shared/apps/share-v2/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { InteractiveResult, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport { useAnonSessions } from 'apps/my-shares/hooks/useAnonSessions';\nimport { useInsightsClassroomStudents } from 'apps/my-shares/hooks/useInsightsClassroomStudents';\n\nconst EMPTY_INTERACTIVE_RESULTS: InteractiveResult[] = [\n {\n id: '0',\n attempts: [{ id: '0', answeredAt: 0, answers: []}]\n }\n];\n\nexport function useInsightsInteractiveResults(shareId: string) {\n const share = Flight.useBasicFetch<Share>(ShareRequests.getShare(shareId));\n const results = useFetchInteractiveResults(share.data?.objectId, null, shareId);\n\n const anonSessions = useAnonSessions(shareId);\n\n const classroomStudents = useInsightsClassroomStudents(shareId);\n\n useHandleObjectError(results);\n\n const hasCompleted = (\n results.hasCompleted &&\n anonSessions.hasCompleted &&\n classroomStudents.hasCompleted\n );\n\n if (!hasCompleted) {\n return {\n data: null as InteractiveResultSet,\n hasCompleted: false\n };\n }\n\n const studentHash = new Set<string>();\n const students = results.data.students.map(s => {\n if (s.user) {\n studentHash.add(s.user.id);\n return s;\n }\n\n /**\n * Set the user to our anon user, so we can display the name they entered\n * when completing the interactive - Sha\n */\n return {\n ...s,\n user: anonSessions.items[s.sessionId] || { sessionId: s.sessionId } as AnonUser\n };\n });\n\n /**\n * If we have classroom students, we're adding any students who haven't attempted to the list\n * with an empty attempt. This is so the student list can show all classroom students - Sha\n */\n if (classroomStudents?.items?.length) {\n students.push(...classroomStudents.items\n .filter(s => !studentHash.has(s.id))\n .map(user => ({ user, results: EMPTY_INTERACTIVE_RESULTS })));\n }\n\n return {\n hasCompleted,\n data: {\n ...results.data,\n students\n }\n };\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { useMarkAnswers } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { anonymiseUserName } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { ShareRequests } from 'libs/shared/apps/share-v2/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { StudentResponseList } from 'libs/shared/apps/student-response-list/StudentResponseList';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { Config, Interactive, InteractiveMetadata } from 'libs/shared/interfaces';\nimport { PopupViewProps } from 'libs/shared/interfaces';\n\nimport { useInsightsInteractiveResults } from 'apps/my-shares/hooks/useInsightsInteractiveResults';\n\nconst namespace = 'shared.insightsStudentResults';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractiveStudentResultsViewProps extends PopupViewProps {\n shareId: string;\n interactionId: string;\n userId: string;\n sessionId: string;\n}\n\nexport function InsightsStudentResultsView(props: InteractiveStudentResultsViewProps): JSX.Element {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const share = Flight.useBasicFetch<Share>(ShareRequests.getShare(props.shareId));\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n share.data?.objectId &&\n InteractiveRequests.interactiveMetadata(share.data.objectId)\n );\n\n const interactive = Flight.useBasicFetch<Interactive>(\n interactiveMetadata.data?.interactiveId &&\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId)\n );\n\n const results = useInsightsInteractiveResults(props.shareId);\n\n useHandleObjectError([ share, interactive, interactiveMetadata ]);\n\n const { markedAnswers, addMarkedAnswers, submitMarkedAnswers } = useMarkAnswers(\n interactive.data?.id,\n interactiveMetadata.data?.id,\n props.closePopup\n );\n\n const studentResults = results.data?.students.find(s => {\n if (props.userId)\n return s.user?.id?.toString() === props.userId?.toString();\n\n if (props.sessionId)\n return s.sessionId?.toString() === props.sessionId?.toString();\n\n return false;\n });\n\n const popupTitle = studentResults\n ? getPhrase('heading', { studentName: anonymiseUserName(studentResults.user, anonymiseUsers) })\n : '';\n\n const dataLoaded = (\n config.hasCompleted &&\n share.hasCompleted &&\n interactiveMetadata.hasCompleted &&\n interactive.hasCompleted &&\n results.hasCompleted\n );\n\n return (\n <Popup\n title={popupTitle}\n showLoadingSpinner={!dataLoaded}\n closePopup={props.closePopup}\n size='lg'\n >\n {dataLoaded &&\n <StudentResponseList\n interactive={interactive.data}\n studentResults={studentResults}\n markedAnswers={markedAnswers}\n addMarkedAnswers={addMarkedAnswers}\n submitMarkedAnswers={submitMarkedAnswers}\n imageCdnUrl={config.data.imageCdnUrl}\n selectedInteractionId={props.interactionId}\n onClickClose={props.closePopup}\n anonymiseUsers={anonymiseUsers}\n />\n }\n </Popup>\n );\n}\n"],"names":["useFetchInteractiveResults","interactiveMetadataId","requestFilter","shareId","currentUser","interactiveMetadata","interactive","data","interactiveId","shouldFetchResults","I","id","getPhrase","anonymiseUserName","user","shouldAnonymise","userId","sessionId","seed","guid","hash","i","length","charCodeAt","Math","abs","guidToSeed","floor","Date","getMinutes","dictionaries","separator","style","ShareType","normalizeOptions","namespace","ShareRequests","createShare","url","key","type","invalidationKeys","updateShare","deleteShare","getShare","bootstrapName","getSentShares","params","Object","values","sort","join","normalize","getShareLink","objectId","createShareLink","getPrivacy","getSharesByObjectId","createSharePincode","getPincodeByShareId","getPincodeByCode","code","LanguageService","StudentResponseListFooter","props","numMarkedAnswers","keys","markedAnswers","className","showSubmitButtonSpinner","onClick","onClickClose","interactionsToMark","isDemo","Tooltip","title","spanHack","spanHackClassName","disabled","SpinnerButton","variant","onClickSubmit","showSpinner","StudentResponseListHeader","summary","unanswered","awaitingMarking","round","percentCorrect","StudentResponseList","ref","scrolled","setScrolled","setShowSpinner","selectedInteractionRef","current","requestAnimationFrame","scrollIntoView","behavior","block","studentResults","interactions","questionsToMark","filter","InteractiveCorrectnessHelper","InteractionCorrectness","getInteractionsToMark","submitMarkedAnswers","map","interaction","idx","isSelected","toString","selectedInteractionId","markingRequired","some","q","anonymisedUserName","anonymiseUsers","InteractionLabel","iconClassName","reportsStyling","InteractionResponse","markedStatus","markInteraction","addMarkedAnswers","imageCdnUrl","showFeedback","responseComponentClass","InteractionResponseItem","ScoreThresholdDefaults","HIGH","MODERATE","ScoreThresholdInsights","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","internalServerError","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","generateCacheKey","flightObjs","obj","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","Array","isArray","useEffect","forEach","useAnonSessions","anonSessions","items","reduce","prev","next","anonSession","name","sessionName","hasCompleted","useInsightsClassroomStudents","fetch","share","classroomId","recipients","find","r","recipientTypeId","recipientId","getRequest","cursor","result","EMPTY_INTERACTIVE_RESULTS","attempts","answeredAt","answers","useInsightsInteractiveResults","results","classroomStudents","studentHash","Set","students","s","add","push","has","InsightsStudentResultsView","config","closePopup","popupTitle","studentName","dataLoaded","showLoadingSpinner","size","interactionId"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[8856],{41196:(e,t,a)=>{a.d(t,{W:()=>o});var r=a(20354),n=a(93479),i=a(20768),s=a(31949);function o(e,t,a){var o,l=r.a.useBasicFetch(s.N.currentUser()),c=r.a.useBasicFetch(!!e&&i.b.interactiveMetadata(e)),u=r.a.useBasicFetch(!!(null===(o=c.data)||void 0===o?void 0:o.interactiveId)&&i.b.interactive(c.data.interactiveId)),d=!!l.data&&!!u.data;return r.a.useBasicFetch(d&&n.I.interactiveResultSet(c.data.interactiveId,c.data.id,l.data,t,a))}},18488:(e,t,a)=>{a.d(t,{o:()=>s});var r=a(99940),n=a(97395),i={namespace:"share-v2"},s={createShare:function(e){return{url:"{gateway}/v2/shares",key:"create:share-v2",type:r.k.POST,data:e,normalizeOptions:i,invalidationKeys:["sent:share-v2","get:share-v2:shares:object"]}},updateShare:function(e,t){return{url:"{gateway}/v2/shares/".concat(e),key:"update:share-v2",type:r.k.PUT,data:t,normalizeOptions:i,invalidationKeys:["share-v2:permanent-link:object","share-v2:".concat(e),"get:share-v2:shares:object"]}},deleteShare:function(e){return{type:r.k.DELETE,url:"{gateway}/v2/shares/".concat(e),key:"delete:share-v2",normalizeOptions:i,invalidationKeys:["share-v2:permanent-link:object","sent:share-v2","share-v2:".concat(e),"get:share-v2:shares:object"]}},getShare:function(e){return{url:"{gateway}/v2/shares/".concat(e),key:"share-v2:".concat(e),bootstrapName:"share-v2:".concat(e),type:r.k.GET,normalizeOptions:i}},getSentShares:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=Object.values(e).sort().join(":");return{url:n._.urlBuilder("{gateway}/v2/shares/sent",e),key:"sent:share-v2:".concat(t),type:r.k.GET,normalize:!1}},getShareLink:function(e){return{url:n._.urlBuilder("{gateway}/v2/shares/permanent-link",{objectId:e}),key:"share-v2:permanent-link:object:".concat(e),normalizeOptions:i}},createShareLink:function(e){return{type:r.k.POST,url:n._.urlBuilder("{gateway}/v2/shares/permanent-link",Object.assign({},e)),key:"create:share-v2:permanent-link:object:".concat(e.objectId),invalidationKeys:["share-v2:permanent-link:object:".concat(e.objectId),"sent:share-v2","get:share-v2:shares:object:".concat(e.objectId)],normalizeOptions:i}},getPrivacy:function(e){return{url:"{gateway}/v1/objects/".concat(e,"/access"),key:"privacy:".concat(e),normalize:!1}},getSharesByObjectId:function(e){return{url:"{gateway}/v2/shares/objects/".concat(e),key:"get:share-v2:shares:object:".concat(e),type:r.k.GET,normalizeOptions:i}},createSharePincode:function(e){return{url:"{gateway}/v2/shares/".concat(e,"/pincode"),key:"create:share-v2:".concat(e,":pincode"),type:r.k.POST}},getPincodeByShareId:function(e){return{url:"{gateway}/v2/shares/".concat(e,"/pincode"),key:"get:share-v2:".concat(e,":pincode")}},getPincodeByCode:function(e){return{url:"{gateway}/v2/shares/pincode?code=".concat(e),key:"get:share-v2:pincode:".concat(e)}}}},94644:(e,t,a)=>{a.d(t,{r:()=>u});var r=a(50242),n=a(81886),i=a(67058),s=a(14553),o=a(49267),l=a(49075),c={notFound:i.d,forbidden:{rating:s.q,yearLevel:s.q,region:o.a,privacy:s.q},badRequest:l._,internalServerError:l._};function u(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e){var i;i="number"==typeof e?e:e.status;var s=Object.assign(Object.assign({},c),t);i&&n.Q.Ry.isStatusCodeError(i)&&(i!==r.o.InternalServer?i!==r.o.NotFound?i!==r.o.Forbidden?a.badRequest||n.Q.Ry.throw(new s.badRequest):a.forbidden||n.Q.Ry.throw(new s.forbidden.privacy):a.notFound||n.Q.Ry.throw(new s.notFound):a.internalServerError||n.Q.Ry.throw(new l._))}}},39902:(e,t,a)=>{a.d(t,{FN:()=>v,SW:()=>f,fh:()=>h});var r=a(32735),n=a(20354),i=a(75896);function s(e){return function(e){if(Array.isArray(e))return l(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||o(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function o(e,t){if(e){if("string"==typeof e)return l(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?l(e,t):void 0}}function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,r=Array(t);a<t;a++)r[a]=e[a];return r}function c(e){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},c(e)}function u(e,t,a){return(t=function(e){var t=function(e){if("object"!=c(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var a=t.call(e,"string");if("object"!=c(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==c(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}var d=function(e,t){var a={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(a[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(r=Object.getOwnPropertySymbols(e);n<r.length;n++)t.indexOf(r[n])<0&&Object.prototype.propertyIsEnumerable.call(e,r[n])&&(a[r[n]]=e[r[n]])}return a},m=50;function h(e,t){var a=i.m.chunk(e,m).map(function(e){return t(i.m.uniq(e))}),r=n.a.useBasicFetchAll(a),s=i.m.flatten(r.data),o=r.data.length?s.reduce(function(e,t){return Object.assign(Object.assign({},e),u({},t.id,t))},{}):null;return{itemsArr:s,items:o,isFetching:r.isFetching,hasCompleted:r.hasCompleted}}function v(e,t,a){var n=null!=a?a:function(e){return"object"===c(e)?e.id:e},i=f({getRequest:t,_getKey:a}),s=i.fetchItems,o=d(i,["fetchItems"]);return r.useEffect(function(){(null==e?void 0:e.length)&&s(e)},[null==e?void 0:e.map(n).join(",")]),o}function f(e){var t,a,l,d,h,v=null!==(t=e._getKey)&&void 0!==t?t:function(e){return"object"===c(e)?e.id:e},f=r.useRef(new Set),g=(d=r.useState([]),h=2,function(e){if(Array.isArray(e))return e}(d)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var r,n,i,s,o=[],l=!0,c=!1;try{if(i=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;l=!1}else for(;!(l=(r=i.call(a)).done)&&(o.push(r.value),o.length!==t);l=!0);}catch(e){c=!0,n=e}finally{try{if(!l&&null!=a.return&&(s=a.return(),Object(s)!==s))return}finally{if(c)throw n}}return o}}(d,h)||o(d,h)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),p=g[0],y=g[1],b=n.a.useBasicFetchAll(p),I=i.m.flatten(b.data),E=b.data.length?I.reduce(function(e,t){return Object.assign(Object.assign({},e),u({},v(t),t))},{}):null;return{hasFirstRequestCompleted:!!(null===(l=null===(a=b.responses)||void 0===a?void 0:a[0])||void 0===l?void 0:l.hasCompleted),itemsArr:I,items:E,isFetching:b.isFetching,fetchItems:function(t){if(null==t?void 0:t.length){var a=[];t.forEach(function(e){var t=v(e);f.current.has(t)||(a.push(e),f.current.add(t))}),a.length&&y(function(t){return[].concat(s(t),s(i.m.chunk(a,m).map(e.getRequest)))})}}}}},91286:(e,t,a)=>{a.d(t,{v:()=>s});var r=a(32735),n=a(94644);function i(e){return e.map(function(e){return e.statusCode}).join(":")}function s(e,t,a){var s=Array.isArray(e)?e:[e];(0,r.useEffect)(function(){s.forEach(function(e){(0,n.r)(e.statusCode,t,a)})},[i(s),t,a])}},78057:(e,t,a)=>{a.d(t,{R:()=>C});var r=a(32735),n=a(75896),i=a(23481),s=a(97958),o=i.T.encloseNamespace("shared.studentResultsTable");function l(e){return"not_completed"===e.filter?r.createElement(s.u,{className:"bg-white rounded-bottom py-5"},r.createElement(s.u.Image,{src:e.notCompletedImageUrl,size:"small"}),r.createElement(s.u.Info,null,o("notCompletedDescription"))):"marking_required"===e.filter?r.createElement(s.u,{className:"bg-white rounded-bottom py-5"},r.createElement(s.u.Image,{src:e.markingRequiredImageUrl,size:"small"}),r.createElement(s.u.Info,null,o("markingRequiredDescription"))):"helping_hand"===e.filter?r.createElement(s.u,{className:"bg-white rounded-bottom py-5"},r.createElement(s.u.Image,{src:e.helpingHandImageUrl,size:"small"}),r.createElement(s.u.Info,null,o("helpingHandDescription"))):r.createElement(s.u,{className:"bg-white rounded-bottom py-5"},r.createElement(s.u.Image,{src:e.emptyStateImageUrl,size:"small"}),r.createElement(s.u.Heading,null,o("emptyStateHeading")),r.createElement(s.u.Info,null,o("emptyStateDescription")))}var c=a(83345),u="shared.studentResultsTable";function d(e){function t(t){var a=e.filter===t?null:t;e.setFilter(a)}function a(t){return"btn btn-outline-dark ".concat(function(t){return e.filter===t}(t)?"bg-dark text-white":"")}return r.createElement("div",{className:"d-flex align-items-center mb-3"},r.createElement("p",{className:"h6 mb-0"},r.createElement(c.x,{namespace:u,phrase:"filters"})),r.createElement("div",{className:"d-flex border-start ps-3 ms-3 gap-2"},r.createElement("button",{className:a("not_completed"),onClick:function(){return t("not_completed")}},r.createElement(c.x,{namespace:u,phrase:"notCompletedFilter"})),r.createElement("button",{className:a("marking_required"),onClick:function(){return t("marking_required")}},r.createElement(c.x,{namespace:u,phrase:"markingRequiredFilter"})),r.createElement("button",{className:a("helping_hand"),onClick:function(){return t("helping_hand")}},r.createElement(c.x,{namespace:u,phrase:"helpingHandFilter"}))))}var m=a(97364),h=a(6748),v=a(84806),f=a(19912);function g(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var r,n,i,s,o=[],l=!0,c=!1;try{if(i=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;l=!1}else for(;!(l=(r=i.call(a)).done)&&(o.push(r.value),o.length!==t);l=!0);}catch(e){c=!0,n=e}finally{try{if(!l&&null!=a.return&&(s=a.return(),Object(s)!==s))return}finally{if(c)throw n}}return o}}(e,t)||function(e,t){if(e){if("string"==typeof e)return p(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?p(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 p(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,r=Array(t);a<t;a++)r[a]=e[a];return r}var y={table:"".concat(f.Z.fixedTable," bg-white rounded-start border border-end-0"),header:"".concat(f.Z.header," border-bottom"),headerRow:"h-100",headerCell:"d-flex align-items-center justify-content-start",row:f.Z.row},b={header:"".concat(f.Z.header," fw-bold"),headerRow:"h-100",headerCell:"".concat(f.Z.interactionHeaderCellOuter," bg-white border-bottom"),row:"".concat(f.Z.row," ").concat(f.Z.resultsRow),cell:f.Z.resultsCellOuter};function I(e){var t,a=g(r.useState((0,m.P)(e.sortBy,"score")),2),i=a[0],s=a[1],o=g(r.useState(e.filterBy),2),c=o[0],u=o[1],p=r.useRef(null),I=(0,v.R7)(e.results,e.anonymiseUsers,null===(t=e.config)||void 0===t?void 0:t.imageCdnUrl),E=(0,v.lE)(e.interactive,e.interactiveMetadata,e.results,function(e){(0,v.bB)(p.current,e)},e.refreshTable),S=(0,v.Fx)(e.interactive,e.results,e.refreshTable,e.anonymiseUsers,n.m.first(i),c);function w(e){(0,v.l8)(p.current,e)}return r.createElement("div",null,!!e.results.students.length&&r.createElement(d,{filter:c,setFilter:u}),!S.length&&r.createElement(l,{emptyStateImageUrl:e.emptyStateImageUrl,helpingHandImageUrl:e.helpingHandImageUrl,markingRequiredImageUrl:e.markingRequiredImageUrl,notCompletedImageUrl:e.notCompletedImageUrl,filter:c}),!!S.length&&r.createElement("div",{ref:p,className:"d-flex".concat(S.length?" ".concat(f.Z.hasResults):"")},r.createElement(h.i,{columns:I,data:S,theme:y,onSelectRow:function(t){var a=t.original;e.viewStudentResults(a.user,e.interactiveMetadata.id)},onRowMouseOver:function(e){return w(e.index)},onRowMouseLeave:function(){return w()},enableSort:!0,manualSort:!0,onSort:s,initialSortBy:i}),r.createElement(h.i,{columns:E,data:S,theme:b,enableSlider:!0,scrollIncrement:8*v.Ju,onSelectCell:function(t){e.viewStudentResults(t.row.original.user,e.interactiveMetadata.id,t.column.id)},scrollContainerClassName:"rounded-end border border-start-0 border"})))}var E=a(99742);const S={partialInsights:"qSeTe"};function w(){return r.createElement("div",null,r.createElement("div",{className:"d-flex align-items-center mb-3"},r.createElement("p",{className:"h6 px-4 mb-0 me-4 partial-loading-background"}," "),r.createElement("div",{className:"row g-2 w-50"},r.createElement("div",{className:"col-3"},r.createElement("div",{className:"p-2 rounded-1 partial-loading-background"}," ")),r.createElement("div",{className:"col-3"},r.createElement("div",{className:"p-2 rounded-1 partial-loading-background"}," ")),r.createElement("div",{className:"col-3"},r.createElement("div",{className:"p-2 rounded-1 partial-loading-background"}," ")))),r.createElement("div",{className:"row g-3 mb-5"},r.createElement("div",{className:"col-12"},r.createElement("div",{className:"".concat(S.partialInsights," rounded partial-loading-background")}))))}function C(e){return r.createElement(r.Fragment,null,!e.hasDataLoaded&&r.createElement(w,null),e.hasDataLoaded&&r.createElement(I,{interactive:e.interactive,interactiveMetadata:e.interactiveMetadata,results:e.results,refreshTable:e.isFetching,viewStudentResults:e.viewStudentResults,emptyStateImageUrl:E.W.Insights.NO_RESPONSES,sortBy:e.sortBy,filterBy:e.filterBy,anonymiseUsers:e.anonymiseUsers,notCompletedImageUrl:E.W.Insights.JIGSAW,markingRequiredImageUrl:E.W.Insights.CLIPBOARD,helpingHandImageUrl:E.W.Insights.SPEECH_BUBBLE_HEART,config:e.config}))}},9447:(e,t,a)=>{a.d(t,{Y:()=>s});var r=a(20354),n=a(30439);function i(e){return i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i(e)}function s(e){var t,a=r.a.useBasicFetch(n.o.getAnonSessions(e));return{items:(null===(t=a.data)||void 0===t?void 0:t.reduce(function(e,t){return Object.assign(Object.assign({},e),(a={},r=t.sessionId,n={sessionId:(s=t).sessionId,name:s.sessionName},(r=function(e){var t=function(e){if("object"!=i(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var a=t.call(e,"string");if("object"!=i(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==i(t)?t:t+""}(r))in a?Object.defineProperty(a,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):a[r]=n,a));var a,r,n,s},{}))||{},hasCompleted:a.hasCompleted}}},5780:(e,t,a)=>{a.d(t,{p:()=>c});var r=a(20354),n=a(2510),i=a(18488),s=a(4594),o=a(3010),l=a(88630);function c(e){var t,a,c,u,d=r.a.useGetFetch(),m=r.a.useBasicFetch(i.o.getShare(e)),h=(null===(t=m.data)||void 0===t?void 0:t.type)===n.y.Classroom&&(null===(u=null===(c=null===(a=m.data)||void 0===a?void 0:a.recipients)||void 0===c?void 0:c.find(function(e){return e.recipientTypeId===s.E.Classroom}))||void 0===u?void 0:u.recipientId),v=function(e){return l.F.getClassroomStudents(h,e)},f=(0,o.i)(h&&v,function(e){return d(v(e))});return Object.assign(Object.assign({},f),{hasCompleted:!h||f.hasCompleted})}},52389:(e,t,a)=>{a.d(t,{_:()=>d});var r=a(20354),n=a(41196),i=a(18488),s=a(91286),o=a(9447),l=a(5780);function c(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,r=Array(t);a<t;a++)r[a]=e[a];return r}var u=[{id:"0",attempts:[{id:"0",answeredAt:0,answers:[]}]}];function d(e){var t,a,d=r.a.useBasicFetch(i.o.getShare(e)),m=(0,n.W)(null===(t=d.data)||void 0===t?void 0:t.objectId,null,e),h=(0,o.Y)(e),v=(0,l.p)(e);(0,s.v)(m);var f=m.hasCompleted&&h.hasCompleted&&v.hasCompleted;if(!f)return{data:null,hasCompleted:!1};var g,p=new Set,y=m.data.students.map(function(e){return e.user?(p.add(e.user.id),e):Object.assign(Object.assign({},e),{user:h.items[e.sessionId]||{sessionId:e.sessionId}})});return(null===(a=null==v?void 0:v.items)||void 0===a?void 0:a.length)&&y.push.apply(y,function(e){if(Array.isArray(e))return c(e)}(g=v.items.filter(function(e){return!p.has(e.id)}).map(function(e){return{user:e,results:u}}))||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(g)||function(e,t){if(e){if("string"==typeof e)return c(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?c(e,t):void 0}}(g)||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.")}()),{hasCompleted:f,data:Object.assign(Object.assign({},m.data),{students:y})}}},50808:(e,t,a)=>{a.r(t),a.d(t,{BaseInsightsView:()=>je});var r=a(32735),n=a(81886),i=a(20354),s=a(18488),o=a(86099),l=a(4594),c=a(23481),u=a(2948),d=a(21789),m=a(60051),h=a(16714),v=a(39151),f=a(1666),g=a(47812),p=a(31949),y=a(91286),b=a(93322),I=a(22902),E=a(79612),S=a(31908),w=a(86702),C=a(88630),j=a(9540),A=a(17132),F=function(e,t){return{url:"{gateway}/v2/analytics/streams/shares/".concat(e,"/aggregation/").concat(t),key:"video:views:v2:share:aggregation:".concat(e,":").concat(t),normalize:!1}},B=function(e){return{url:"{gateway}/v2/analytics/streams/shares/".concat(e,"/heat-map"),key:"video:views:v2:share:heatmap:".concat(e),normalize:!1}},k=function(e){return{url:"{gateway}/v2/analytics/streams/shares/".concat(e,"/aggregation/heat-map"),key:"video:views:v2:share:heatmap:aggregation:".concat(e),normalize:!1}},N=a(39902),O=a(9447);function U(e){var t,a,r=i.a.useBasicFetch(B(e)),n=(0,O.Y)(e),s=(null===(t=r.data)||void 0===t?void 0:t.map(function(e){return e.userId}).filter(function(e){return!!e}))||[],o=(0,N.fh)(s,p.N.getById),l=Object.assign(Object.assign({},n.items),o.items),c=null===(a=r.data)||void 0===a?void 0:a.map(function(e){var t=l[e.userId||e.sessionId]||{sessionId:e.sessionId};return Object.assign(Object.assign({},t),{percentage:e.engagementRate})});return{engagement:r.data,users:c,hasCompleted:r.hasCompleted&&n.hasCompleted&&(!(null==s?void 0:s.length)||o.hasCompleted)}}var T=a(5780),R=a(10447);function L(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,r=Array(t);a<t;a++)r[a]=e[a];return r}var x=c.T.encloseNamespace("shared.insightsHeatmap");function _(e){var t,a,n,o,c,B=(o=(0,u.D)(w.y.ANONYMISE_USERS),c=1,function(e){if(Array.isArray(e))return e}(o)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var r,n,i,s,o=[],l=!0,c=!1;try{if(i=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;l=!1}else for(;!(l=(r=i.call(a)).done)&&(o.push(r.value),o.length!==t);l=!0);}catch(e){c=!0,n=e}finally{try{if(!l&&null!=a.return&&(s=a.return(),Object(s)!==s))return}finally{if(c)throw n}}return o}}(o,c)||function(e,t){if(e){if("string"==typeof e)return L(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?L(e,t):void 0}}(o,c)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];(0,b.F)();var N=(0,I.T)().hasPermissions,O=i.a.useBasicFetch(s.o.getShare(e.shareId)),_=d.x.getClassroomIdFromShare(O.data),M=i.a.useBasicFetch(_&&C.F.getClassroom(_)),P=(0,T.p)(e.shareId),q=O.data&&S.M.getVideoRequest(O.data.objectId,O.data.objectTypeId),D=i.a.useBasicFetch(q),W=i.a.useBasicFetch(v.L.config()),z=i.a.useBasicFetch(p.N.currentUser()),V=i.a.useBasicFetch(z.data&&f.h.yearGroups(z.data.customerId)),G=i.a.useBasicFetch(k(e.shareId)),H=U(e.shareId),$=H.users,Z=H.engagement,Q=H.hasCompleted,Y=i.a.useBasicFetch(F(e.shareId,"year_group")),K=i.a.useBasicFetch((null===(t=O.data)||void 0===t?void 0:t.objectId)&&g.k.createViewKey(O.data.objectId,m.f.MasterObject));(0,E.M)({title:D.data?x("pageTitle",{video:null===(a=D.data)||void 0===a?void 0:a.name}):null}),(0,y.v)([O,D]);var J=O.hasCompleted&&D.hasCompleted&&W.hasCompleted&&G.hasCompleted&&Y.hasCompleted&&K.hasCompleted&&V.hasCompleted;return r.createElement("div",{className:"px-3"},r.createElement(j.j,{video:D.data,tabs:function(){var e;return(null===(e=O.data)||void 0===e?void 0:e.objectTypeId)===l.E.Interactive?(0,R.kj)(O.data,"heatmap"):(0,R.$6)(O.data,"heatmap")}(),hasAnalytics:N(h.C.ViewCustomerAnalytics),analyticsWebUrl:null===(n=W.data)||void 0===n?void 0:n.analyticsWebUrl,share:O.data,yearGroups:V.data,classroom:M.data}),r.createElement(A.w,{aggregateEngagement:G.data,individualEngagement:Z,yearGroups:Y.data,config:W.data,users:$,viewKey:K.data,hasDataLoaded:J,tableDataLoaded:Q,anonymiseUsers:B,classroomStudents:P.items}))}var M=a(38143),P=a(20768),q=a(54948),D=a(52389);function W(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,r=Array(t);a<t;a++)r[a]=e[a];return r}var z=c.T.encloseNamespace("insights.interactiveInsightsOverviewView");function V(e){var t,a,n,l,c,m,g=(c=(0,u.D)(M.g.ANONYMISE_USERS),m=1,function(e){if(Array.isArray(e))return e}(c)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var r,n,i,s,o=[],l=!0,c=!1;try{if(i=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;l=!1}else for(;!(l=(r=i.call(a)).done)&&(o.push(r.value),o.length!==t);l=!0);}catch(e){c=!0,n=e}finally{try{if(!l&&null!=a.return&&(s=a.return(),Object(s)!==s))return}finally{if(c)throw n}}return o}}(c,m)||function(e,t){if(e){if("string"==typeof e)return W(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?W(e,t):void 0}}(c,m)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];(0,b.F)();var S=(0,I.T)().hasPermissions,w=i.a.useBasicFetch(v.L.config()),A=i.a.useBasicFetch(p.N.currentUser()),N=i.a.useBasicFetch(A.data&&f.h.yearGroups(A.data.customerId)),O=i.a.useBasicFetch(s.o.getShare(e.shareId)),U=d.x.getClassroomIdFromShare(O.data),L=i.a.useBasicFetch(U&&C.F.getClassroom(U)),x=(0,T.p)(e.shareId),_=i.a.useBasicFetch((null===(t=O.data)||void 0===t?void 0:t.objectId)&&P.b.interactiveMetadata(O.data.objectId)),V=i.a.useBasicFetch((null===(a=_.data)||void 0===a?void 0:a.interactiveId)&&P.b.interactive(_.data.interactiveId)),G=(0,D._)(e.shareId),H=i.a.useBasicFetch(B(e.shareId)),$=i.a.useBasicFetch(k(e.shareId)),Z=i.a.useBasicFetch(F(e.shareId,"os_name"));(0,E.M)({title:_.data?z("pageTitle",{video:null===(n=_.data)||void 0===n?void 0:n.name}):null}),(0,y.v)([O,V,_]);var Q=w.hasCompleted&&_.hasCompleted&&V.data&&$.hasCompleted&&H.hasCompleted&&Z.hasCompleted&&G.hasCompleted&&N.hasCompleted,Y=function(e,t){return{resultsAppLink:(0,o.rq)(e,t),questionsAppLink:(0,o.Sj)(e,t),heatmapAppLink:(0,o.Rv)(e,t)}}(O.data);return r.createElement("div",{className:"px-3"},r.createElement(j.j,{video:_.data,tabs:(0,R.kj)(O.data,"insights"),hasAnalytics:S(h.C.ViewCustomerAnalytics),analyticsWebUrl:null===(l=w.data)||void 0===l?void 0:l.analyticsWebUrl,share:O.data,yearGroups:N.data,classroom:L.data}),r.createElement(q.m,{aggregateEngagement:$.data,individualEngagement:H.data,interactive:V.data,interactiveMetadata:_.data,interactiveInsightsAppLinks:Y,classroomStudents:x.items,results:G.data,osCount:Z.data,config:w.data,anonymiseUsers:g,hasDataLoaded:Q,share:O.data}))}var G=a(48705);function H(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,r=Array(t);a<t;a++)r[a]=e[a];return r}var $=c.T.encloseNamespace("shared.interactiveInsightsQuestionsView");function Z(e){var t,a,n,o,l,c,m,g=(c=(0,u.D)(M.g.ANONYMISE_USERS),m=1,function(e){if(Array.isArray(e))return e}(c)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var r,n,i,s,o=[],l=!0,c=!1;try{if(i=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;l=!1}else for(;!(l=(r=i.call(a)).done)&&(o.push(r.value),o.length!==t);l=!0);}catch(e){c=!0,n=e}finally{try{if(!l&&null!=a.return&&(s=a.return(),Object(s)!==s))return}finally{if(c)throw n}}return o}}(c,m)||function(e,t){if(e){if("string"==typeof e)return H(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?H(e,t):void 0}}(c,m)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];(0,b.F)();var S=(0,I.T)().hasPermissions,w=i.a.useBasicFetch(p.N.currentUser()),A=i.a.useBasicFetch(v.L.config()),F=i.a.useBasicFetch(w.data&&f.h.yearGroups(w.data.customerId)),B=i.a.useBasicFetch(s.o.getShare(e.shareId)),k=d.x.getClassroomIdFromShare(B.data),N=i.a.useBasicFetch(k&&C.F.getClassroom(k)),O=i.a.useBasicFetch((null===(t=B.data)||void 0===t?void 0:t.objectId)&&P.b.interactiveMetadata(null===(a=B.data)||void 0===a?void 0:a.objectId)),U=i.a.useBasicFetch((null===(n=O.data)||void 0===n?void 0:n.interactiveId)&&P.b.interactive(O.data.interactiveId)),T=(0,D._)(e.shareId);(0,E.M)({title:O.data?$("pageTitle",{video:null===(o=O.data)||void 0===o?void 0:o.name}):null}),(0,y.v)([B,U,O]);var L=U.data&&O.data&&!!T.data&&!!F.data;return r.createElement("div",{className:"px-3"},r.createElement(j.j,{tabs:(0,R.kj)(B.data,"questions"),video:O.data,hasAnalytics:S(h.C.ViewCustomerAnalytics),analyticsWebUrl:null===(l=A.data)||void 0===l?void 0:l.analyticsWebUrl,share:B.data,yearGroups:F.data,classroom:N.data}),r.createElement(G.x,{interactive:U.data,interactiveMetadata:O.data,interactionId:e.interactionId,config:A.data,sortBy:e.sortBy,isFetching:!T.hasCompleted||U.isFetching,anonymiseUsers:g,results:T.data,hasDataLoaded:L}))}var Q=a(14070),Y=a(97291),K=a(78057);function J(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,r=Array(t);a<t;a++)r[a]=e[a];return r}var X=c.T.encloseNamespace("insights.interactiveInsightsStudents");function ee(e){var t,a,o,l,c,m,g=(c=(0,u.D)(M.g.ANONYMISE_USERS),m=1,function(e){if(Array.isArray(e))return e}(c)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var r,n,i,s,o=[],l=!0,c=!1;try{if(i=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;l=!1}else for(;!(l=(r=i.call(a)).done)&&(o.push(r.value),o.length!==t);l=!0);}catch(e){c=!0,n=e}finally{try{if(!l&&null!=a.return&&(s=a.return(),Object(s)!==s))return}finally{if(c)throw n}}return o}}(c,m)||function(e,t){if(e){if("string"==typeof e)return J(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?J(e,t):void 0}}(c,m)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0],b=(0,I.T)().hasPermissions,S=i.a.useBasicFetch(p.N.currentUser()),w=i.a.useBasicFetch(v.L.config()),A=i.a.useBasicFetch(S.data&&f.h.yearGroups(S.data.customerId)),F=i.a.useBasicFetch(s.o.getShare(e.shareId)),B=d.x.getClassroomIdFromShare(F.data),k=i.a.useBasicFetch(B&&C.F.getClassroom(B)),N=i.a.useBasicFetch((null===(t=F.data)||void 0===t?void 0:t.objectId)&&P.b.interactiveMetadata(F.data.objectId)),O=i.a.useBasicFetch((null===(a=N.data)||void 0===a?void 0:a.interactiveId)&&P.b.interactive(N.data.interactiveId)),U=(0,D._)(e.shareId),T=O.data&&N.data&&!!U.data&&!!A.data;return(0,E.M)({title:N.data?X("pageTitle",{video:null===(o=N.data)||void 0===o?void 0:o.name}):null}),(0,y.v)([F,O,N]),r.createElement("div",{className:"px-3"},r.createElement(j.j,{tabs:(0,R.kj)(F.data,"results"),video:N.data,hasAnalytics:b(h.C.ViewCustomerAnalytics),analyticsWebUrl:null===(l=w.data)||void 0===l?void 0:l.analyticsWebUrl,share:F.data,yearGroups:A.data,classroom:k.data}),r.createElement(K.R,{interactiveMetadata:N.data,viewStudentResults:function(t,a,r){n.Q.C$.trigger({application:Y.O.MY_SHARES,action:Q.e.MyShares.INTERACTIVE_STUDENT_RESULTS,params:{studentId:t.id,shareId:e.shareId,interactionId:r,sessionId:t.sessionId}})},interactive:O.data,results:U.data,filterBy:e.filterBy,sortBy:e.sortBy,isFetching:!U.hasCompleted,anonymiseUsers:g,hasDataLoaded:T,config:w.data}))}var te=a(37802),ae=a(51870),re=a(50916),ne=a(84621),ie=a(98551),se=a(35223),oe=c.T.encloseNamespace("shared.insightStudentsNotWatched");function le(e){var t,a=(null===(t=e.students)||void 0===t?void 0:t.filter(function(t){var a;return!(null===(a=e.watchedIds)||void 0===a?void 0:a.includes(t.id))}))||[];return r.createElement(ne.L,{title:oe("title"),svgName:se.vn.Puzzle,svgClassName:"bg-light-teal text-teal"},r.createElement(ie.y,{students:a,imageCdnUrl:e.imageCdnUrl,imageUrl:e.imageUrl,description:oe("studentsDisplay"),anonymiseUsers:e.anonymiseUsers}))}var ce=c.T.encloseNamespace("shared.insightStudentsWatched");function ue(e){return r.createElement(ne.L,{title:ce("title"),svgName:se.vn.Flag,svgClassName:"bg-light-indigo text-indigo",count:e.students.length},r.createElement(ie.y,{students:e.students,imageCdnUrl:e.imageCdnUrl,imageUrl:e.imageUrl,description:ce("studentsDisplay"),appLink:e.heatmapAppLink,appLinkText:ce("viewAll"),anonymiseUsers:e.anonymiseUsers}))}var de=a(8604),me=a(83345),he=a(99742),ve=a(53214);const fe="oHwkx";function ge(){return r.createElement("div",null,r.createElement("h2",{className:"h4 w-25 partial-loading-background"}," "),r.createElement("div",{className:"row g-3 mb-5"},r.createElement("div",{className:"col-12"},r.createElement("div",{className:"".concat(fe," rounded partial-loading-background")}))),r.createElement("h2",{className:"h4 w-25 partial-loading-background"}," "),r.createElement("div",{className:"row g-3 mb-5"},r.createElement("div",{className:"col-6"},r.createElement("div",{className:"".concat(fe," rounded partial-loading-background")})),r.createElement("div",{className:"col-6"},r.createElement("div",{className:"".concat(fe," rounded partial-loading-background")}))))}var pe="insights.videoInsightsOverview";function ye(e){var t,a,n,i=e.hasDataLoaded&&!!(null===(t=e.viewers)||void 0===t?void 0:t.length);function s(){return e.viewers?Object.values(e.viewers):[]}return r.createElement(r.Fragment,null,!e.hasDataLoaded&&r.createElement(ge,null),e.hasDataLoaded&&r.createElement(ve.u,{video:e.video,hasData:i,share:e.share},r.createElement("section",{className:"mb-5"},r.createElement("h2",{className:"h4"},r.createElement(me.x,{namespace:pe,phrase:"studentViewing"}),r.createElement("span",null,": ",s().length,e.classroomStudents?"/".concat(e.classroomStudents.length):"")),r.createElement("div",{className:"row g-3"},!!(null===(a=e.classroomStudents)||void 0===a?void 0:a.length)&&r.createElement("div",{className:"col-12 col-md"},r.createElement(le,{students:e.classroomStudents,watchedIds:null===(n=e.viewers)||void 0===n?void 0:n.map(function(e){return e.id}),imageCdnUrl:e.config.imageCdnUrl,heatmapAppLink:e.videoInsightsAppLinks.heatmapAppLink,imageUrl:he.W.Insights.AVATAR,anonymiseUsers:e.anonymiseUsers})),r.createElement("div",{className:"col-12 col-md"},r.createElement(ue,{students:s(),imageCdnUrl:e.config.imageCdnUrl,heatmapAppLink:e.videoInsightsAppLinks.heatmapAppLink,imageUrl:he.W.Insights.AVATAR,anonymiseUsers:e.anonymiseUsers})))),r.createElement("section",{className:"mb-5"},r.createElement("h2",{className:"h4"},r.createElement(me.x,{namespace:pe,phrase:e.hasClassrooms?"classEngagement":"engagement"})),r.createElement("div",{className:"row g-3"},r.createElement("div",{className:"col-12 col-md-6"},r.createElement(ae.i,{osCount:e.osCount})),r.createElement("div",{className:"col-12 col-md-6"},r.createElement(re.b,{engagement:e.aggregateEngagement,heatmapAppLink:e.videoInsightsAppLinks.heatmapAppLink,engagementRate:(0,de.Q)(e.individualEngagement)}))))))}function be(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,r=Array(t);a<t;a++)r[a]=e[a];return r}var Ie=c.T.encloseNamespace("insights.videoInsightsOverviewView");function Ee(e){var t,a,n,l,c=(n=(0,u.D)(M.g.ANONYMISE_USERS),l=1,function(e){if(Array.isArray(e))return e}(n)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var r,n,i,s,o=[],l=!0,c=!1;try{if(i=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;l=!1}else for(;!(l=(r=i.call(a)).done)&&(o.push(r.value),o.length!==t);l=!0);}catch(e){c=!0,n=e}finally{try{if(!l&&null!=a.return&&(s=a.return(),Object(s)!==s))return}finally{if(c)throw n}}return o}}(n,l)||function(e,t){if(e){if("string"==typeof e)return be(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?be(e,t):void 0}}(n,l)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];(0,b.F)();var m=(0,te.r)(null).hasClassrooms,g=(0,I.T)().hasPermissions,w=i.a.useBasicFetch(v.L.config()),A=i.a.useBasicFetch(p.N.currentUser()),N=i.a.useBasicFetch(A.data&&f.h.yearGroups(A.data.customerId)),O=i.a.useBasicFetch(s.o.getShare(e.shareId)),L=d.x.getClassroomIdFromShare(O.data),x=i.a.useBasicFetch(L&&C.F.getClassroom(L)),_=(0,T.p)(e.shareId),P=O.data&&S.M.getVideoRequest(O.data.objectId,O.data.objectTypeId),q=i.a.useBasicFetch(P);(0,E.M)({title:q.data?Ie("pageTitle",{video:null===(t=q.data)||void 0===t?void 0:t.name}):null}),(0,y.v)([O,q]);var D=i.a.useBasicFetch(B(e.shareId)),W=i.a.useBasicFetch(k(e.shareId)),z=i.a.useBasicFetch(F(e.shareId,"os_name")),V=U(e.shareId),G=V.users,H=V.hasCompleted,$=w.hasCompleted&&q.hasCompleted&&D.hasCompleted&&W.hasCompleted&&z.hasCompleted&&N.data&&H,Z=function(e){return{heatmapAppLink:(0,o.Rv)(e,void 0)}}(O.data);return r.createElement("div",{className:"px-3"},r.createElement(j.j,{video:q.data,classroom:x.data,tabs:(0,R.$6)(O.data,"insights"),hasAnalytics:g(h.C.ViewCustomerAnalytics),analyticsWebUrl:null===(a=w.data)||void 0===a?void 0:a.analyticsWebUrl,share:O.data,yearGroups:N.data}),r.createElement(ye,{hasDataLoaded:!!$,hasClassrooms:m,anonymiseUsers:c,videoInsightsAppLinks:Z,config:w.data,video:q.data,classroomStudents:_.items,viewers:G,individualEngagement:D.data,aggregateEngagement:W.data,share:O.data,osCount:z.data}))}function Se(e){return Se="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Se(e)}function we(e,t,a){return(t=function(e){var t=function(e){if("object"!=Se(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var a=t.call(e,"string");if("object"!=Se(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==Se(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}var Ce=we(we(we({},l.E.Video,{insights:function(e){return r.createElement(Ee,{shareId:e.share.shareId})},heatmap:function(e){return r.createElement(_,{shareId:e.share.shareId})}}),l.E.Clip,{insights:function(e){return r.createElement(Ee,{shareId:e.share.shareId})},heatmap:function(e){return r.createElement(_,{shareId:e.share.shareId})}}),l.E.Interactive,{insights:function(e){return r.createElement(V,{shareId:e.share.shareId})},heatmap:function(e){return r.createElement(_,{shareId:e.share.shareId})},questions:function(e){return r.createElement(Z,{interactionId:e.interactionId,sortBy:e.sortBy,shareId:e.share.shareId})},results:function(e){return r.createElement(ee,{filterBy:e.filterBy,sortBy:e.sortBy,shareId:e.share.shareId})}});function je(e){var t=i.a.useBasicFetch(s.o.getShare(e.shareId)),a=function(e){var t,a=e.share,n=e.tab,i=null===(t=Ce[null==a?void 0:a.objectTypeId])||void 0===t?void 0:t[n];return i?i(e):r.createElement(r.Fragment,null)}({share:t.data,tab:e.tab,interactionId:e.interactionId,sortBy:e.sortBy,filterBy:e.filterBy});return r.useEffect(function(){if(e.showShareOptions&&t.data){var a=(0,o.Zm)(t.data);a&&n.Q.C$.trigger(a)}},[t.data,e.showShareOptions]),r.createElement(r.Fragment,null,a)}}}]);
2
+ //# sourceMappingURL=8856-361fe76b7a-lite.chunk.js.map