@clickview/lite 0.73.1 → 0.74.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundles.json +2 -2
- package/dist/css/{7122-lite-a094f8fe17.chunk.css → 7122-lite-e0652641e4.chunk.css} +1 -1
- package/dist/css/{4499-lite-c43d17524f.chunk.css → 7150-lite-60d455ba66.chunk.css} +1 -1
- package/dist/css/{lite-app-10d57977f3.css → lite-app-98b3200025.css} +1 -1
- package/dist/languages/en.json +1 -1
- package/dist/scripts/{1362-061cd588c0-lite.chunk.js → 1362-56810ef4c8-lite.chunk.js} +3 -3
- package/dist/scripts/1362-56810ef4c8-lite.chunk.js.map +1 -0
- package/dist/scripts/{1367-12750422b0-lite.chunk.js → 1367-e0481edee3-lite.chunk.js} +2 -2
- package/dist/scripts/1367-e0481edee3-lite.chunk.js.map +1 -0
- package/dist/scripts/{1735-c0f3f1238a-lite.chunk.js → 1735-e4cdbc46ed-lite.chunk.js} +3 -3
- package/dist/scripts/1735-e4cdbc46ed-lite.chunk.js.map +1 -0
- package/dist/scripts/{324-6d6ee95d5d-lite.chunk.js → 324-e7a99b7d52-lite.chunk.js} +2 -2
- package/dist/scripts/{324-6d6ee95d5d-lite.chunk.js.map → 324-e7a99b7d52-lite.chunk.js.map} +1 -1
- package/dist/scripts/{3252-22fac3da15-lite.chunk.js → 3252-50b5c19f19-lite.chunk.js} +1 -1
- package/dist/scripts/{3252-22fac3da15-lite.chunk.js.map → 3252-50b5c19f19-lite.chunk.js.map} +1 -1
- package/dist/scripts/3677-4904f30c6a-lite.chunk.js +2 -0
- package/dist/scripts/3677-4904f30c6a-lite.chunk.js.map +1 -0
- package/dist/scripts/{3781-7a9ddc7736-lite.chunk.js → 3781-e092f92668-lite.chunk.js} +2 -2
- package/dist/scripts/{3781-7a9ddc7736-lite.chunk.js.map → 3781-e092f92668-lite.chunk.js.map} +1 -1
- package/dist/scripts/{3823-e38a508a3c-lite.chunk.js → 3823-0dc1972eb2-lite.chunk.js} +2 -2
- package/dist/scripts/3823-0dc1972eb2-lite.chunk.js.map +1 -0
- package/dist/scripts/3915-abd9a65a08-lite.chunk.js +2 -0
- package/dist/scripts/3915-abd9a65a08-lite.chunk.js.map +1 -0
- package/dist/scripts/{3978-09fb1f250e-lite.chunk.js → 3978-a551dd2648-lite.chunk.js} +2 -2
- package/dist/scripts/3978-a551dd2648-lite.chunk.js.map +1 -0
- package/dist/scripts/{4013-d31272b42a-lite.chunk.js → 4013-6f68d7031e-lite.chunk.js} +1 -1
- package/dist/scripts/{4013-d31272b42a-lite.chunk.js.map → 4013-6f68d7031e-lite.chunk.js.map} +1 -1
- package/dist/scripts/{4014-4225ce1eb6-lite.chunk.js → 4014-3eccce2f89-lite.chunk.js} +3 -3
- package/dist/scripts/4014-3eccce2f89-lite.chunk.js.map +1 -0
- package/dist/scripts/{4050-cf35c4ec45-lite.chunk.js → 4050-ffe5b6ae6d-lite.chunk.js} +2 -2
- package/dist/scripts/{4050-cf35c4ec45-lite.chunk.js.map → 4050-ffe5b6ae6d-lite.chunk.js.map} +1 -1
- package/dist/scripts/{4061-525ef00f69-lite.chunk.js → 4061-100002abf6-lite.chunk.js} +2 -2
- package/dist/scripts/4061-100002abf6-lite.chunk.js.map +1 -0
- package/dist/scripts/4191-9a08c4b205-lite.chunk.js +2 -0
- package/dist/scripts/4191-9a08c4b205-lite.chunk.js.map +1 -0
- package/dist/scripts/{4358-b21c24f96a-lite.chunk.js → 4358-a1bbca8249-lite.chunk.js} +1 -1
- package/dist/scripts/{4358-b21c24f96a-lite.chunk.js.map → 4358-a1bbca8249-lite.chunk.js.map} +1 -1
- package/dist/scripts/{4400-8c36fb4ab5-lite.chunk.js → 4400-755a158a52-lite.chunk.js} +2 -2
- package/dist/scripts/4400-755a158a52-lite.chunk.js.map +1 -0
- package/dist/scripts/4806-13c9302b2c-lite.chunk.js +2 -0
- package/dist/scripts/4806-13c9302b2c-lite.chunk.js.map +1 -0
- package/dist/scripts/{5135-864055ab0b-lite.chunk.js → 5135-166ec46620-lite.chunk.js} +2 -2
- package/dist/scripts/5135-166ec46620-lite.chunk.js.map +1 -0
- package/dist/scripts/{5143-286c66de2b-lite.chunk.js → 5143-d6c4a357ea-lite.chunk.js} +2 -2
- package/dist/scripts/5143-d6c4a357ea-lite.chunk.js.map +1 -0
- package/dist/scripts/{5743-a764171a6d-lite.chunk.js → 5743-14700e4f76-lite.chunk.js} +2 -2
- package/dist/scripts/5743-14700e4f76-lite.chunk.js.map +1 -0
- package/dist/scripts/{6030-5db8cc1bc4-lite.chunk.js → 6030-c2e07df714-lite.chunk.js} +2 -2
- package/dist/scripts/6030-c2e07df714-lite.chunk.js.map +1 -0
- package/dist/scripts/{618-4334f9451b-lite.chunk.js → 618-996d8b560b-lite.chunk.js} +2 -2
- package/dist/scripts/618-996d8b560b-lite.chunk.js.map +1 -0
- package/dist/scripts/{6207-f444184025-lite.chunk.js → 6207-be843186e0-lite.chunk.js} +1 -1
- package/dist/scripts/{6207-f444184025-lite.chunk.js.map → 6207-be843186e0-lite.chunk.js.map} +1 -1
- package/dist/scripts/{6413-c4333e80d4-lite.chunk.js → 6413-caaae6a383-lite.chunk.js} +3 -3
- package/dist/scripts/{6413-c4333e80d4-lite.chunk.js.map → 6413-caaae6a383-lite.chunk.js.map} +1 -1
- package/dist/scripts/{6646-24a34f7d99-lite.chunk.js → 6646-c5775f6553-lite.chunk.js} +3 -3
- package/dist/scripts/6646-c5775f6553-lite.chunk.js.map +1 -0
- package/dist/scripts/{6909-8a45942b63-lite.chunk.js → 6909-6805b6a0d9-lite.chunk.js} +2 -2
- package/dist/scripts/6909-6805b6a0d9-lite.chunk.js.map +1 -0
- package/dist/scripts/7064-b3bafc599f-lite.chunk.js +2 -0
- package/dist/scripts/7064-b3bafc599f-lite.chunk.js.map +1 -0
- package/dist/scripts/7122-dbf374af58-lite.chunk.js +2 -0
- package/dist/scripts/7122-dbf374af58-lite.chunk.js.map +1 -0
- package/dist/scripts/7150-93a205975c-lite.chunk.js +2 -0
- package/dist/scripts/7150-93a205975c-lite.chunk.js.map +1 -0
- package/dist/scripts/{7234-85d4acaa33-lite.chunk.js → 7234-bcddfe2112-lite.chunk.js} +2 -2
- package/dist/scripts/7234-bcddfe2112-lite.chunk.js.map +1 -0
- package/dist/scripts/{7383-690bc234f1-lite.chunk.js → 7383-02d4956304-lite.chunk.js} +2 -2
- package/dist/scripts/7383-02d4956304-lite.chunk.js.map +1 -0
- package/dist/scripts/{7873-2e64f4eb37-lite.chunk.js → 7873-0ce0523a28-lite.chunk.js} +2 -2
- package/dist/scripts/{7873-2e64f4eb37-lite.chunk.js.map → 7873-0ce0523a28-lite.chunk.js.map} +1 -1
- package/dist/scripts/{8248-050265ed2d-lite.chunk.js → 8248-41dad9bf71-lite.chunk.js} +3 -3
- package/dist/scripts/8248-41dad9bf71-lite.chunk.js.map +1 -0
- package/dist/scripts/8385-6ef08fa319-lite.chunk.js +2 -0
- package/dist/scripts/8385-6ef08fa319-lite.chunk.js.map +1 -0
- package/dist/scripts/{8451-1cb649a3f3-lite.chunk.js → 8451-0103210a8f-lite.chunk.js} +2 -2
- package/dist/scripts/8451-0103210a8f-lite.chunk.js.map +1 -0
- package/dist/scripts/8630-80f676dcda-lite.chunk.js +2 -0
- package/dist/scripts/8630-80f676dcda-lite.chunk.js.map +1 -0
- package/dist/scripts/8891-5118c47b59-lite.chunk.js +2 -0
- package/dist/scripts/8891-5118c47b59-lite.chunk.js.map +1 -0
- package/dist/scripts/8982-b9e53e43ec-lite.chunk.js +2 -0
- package/dist/scripts/8982-b9e53e43ec-lite.chunk.js.map +1 -0
- package/dist/scripts/{9186-daf77d7174-lite.chunk.js → 9186-c1d2615458-lite.chunk.js} +2 -2
- package/dist/scripts/9186-c1d2615458-lite.chunk.js.map +1 -0
- package/dist/scripts/{9241-dbac9cb9f9-lite.chunk.js → 9241-2386134dd3-lite.chunk.js} +2 -2
- package/dist/scripts/9241-2386134dd3-lite.chunk.js.map +1 -0
- package/dist/scripts/{9345-30ccf524c5-lite.chunk.js → 9345-0a7f58bb53-lite.chunk.js} +3 -3
- package/dist/scripts/9345-0a7f58bb53-lite.chunk.js.map +1 -0
- package/dist/scripts/9352-d4b2dc16a8-lite.chunk.js +2 -0
- package/dist/scripts/9352-d4b2dc16a8-lite.chunk.js.map +1 -0
- package/dist/scripts/{9503-275c13891d-lite.chunk.js → 9503-715c46ecc1-lite.chunk.js} +2 -2
- package/dist/scripts/9503-715c46ecc1-lite.chunk.js.map +1 -0
- package/dist/scripts/9630-ca2a850260-lite.chunk.js +2 -0
- package/dist/scripts/9630-ca2a850260-lite.chunk.js.map +1 -0
- package/dist/scripts/{9767-d69fdc31b0-lite.chunk.js → 9767-1b583ceb6c-lite.chunk.js} +2 -2
- package/dist/scripts/9767-1b583ceb6c-lite.chunk.js.map +1 -0
- package/dist/scripts/9894-7c119a8fe3-lite.chunk.js +2 -0
- package/dist/scripts/9894-7c119a8fe3-lite.chunk.js.map +1 -0
- package/dist/scripts/bundle-5b65703152.min.js +3 -0
- package/dist/scripts/{bundle-0075afb6af.min.js.map → bundle-5b65703152.min.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/1362-061cd588c0-lite.chunk.js.map +0 -1
- package/dist/scripts/1367-12750422b0-lite.chunk.js.map +0 -1
- package/dist/scripts/1735-c0f3f1238a-lite.chunk.js.map +0 -1
- package/dist/scripts/3677-20958f59d3-lite.chunk.js +0 -2
- package/dist/scripts/3677-20958f59d3-lite.chunk.js.map +0 -1
- package/dist/scripts/3823-e38a508a3c-lite.chunk.js.map +0 -1
- package/dist/scripts/3915-a1f15d687a-lite.chunk.js +0 -2
- package/dist/scripts/3915-a1f15d687a-lite.chunk.js.map +0 -1
- package/dist/scripts/3978-09fb1f250e-lite.chunk.js.map +0 -1
- package/dist/scripts/4014-4225ce1eb6-lite.chunk.js.map +0 -1
- package/dist/scripts/4061-525ef00f69-lite.chunk.js.map +0 -1
- package/dist/scripts/4191-7612e1713c-lite.chunk.js +0 -2
- package/dist/scripts/4191-7612e1713c-lite.chunk.js.map +0 -1
- package/dist/scripts/4400-8c36fb4ab5-lite.chunk.js.map +0 -1
- package/dist/scripts/4499-1365934bf2-lite.chunk.js +0 -2
- package/dist/scripts/4499-1365934bf2-lite.chunk.js.map +0 -1
- package/dist/scripts/4806-384760d9c9-lite.chunk.js +0 -2
- package/dist/scripts/4806-384760d9c9-lite.chunk.js.map +0 -1
- package/dist/scripts/5135-864055ab0b-lite.chunk.js.map +0 -1
- package/dist/scripts/5143-286c66de2b-lite.chunk.js.map +0 -1
- package/dist/scripts/5743-a764171a6d-lite.chunk.js.map +0 -1
- package/dist/scripts/6030-5db8cc1bc4-lite.chunk.js.map +0 -1
- package/dist/scripts/618-4334f9451b-lite.chunk.js.map +0 -1
- package/dist/scripts/6646-24a34f7d99-lite.chunk.js.map +0 -1
- package/dist/scripts/6909-8a45942b63-lite.chunk.js.map +0 -1
- package/dist/scripts/7064-3ccf1b82d1-lite.chunk.js +0 -2
- package/dist/scripts/7064-3ccf1b82d1-lite.chunk.js.map +0 -1
- package/dist/scripts/7122-352fdd3516-lite.chunk.js +0 -2
- package/dist/scripts/7122-352fdd3516-lite.chunk.js.map +0 -1
- package/dist/scripts/7234-85d4acaa33-lite.chunk.js.map +0 -1
- package/dist/scripts/7383-690bc234f1-lite.chunk.js.map +0 -1
- package/dist/scripts/8248-050265ed2d-lite.chunk.js.map +0 -1
- package/dist/scripts/8385-083e882d77-lite.chunk.js +0 -2
- package/dist/scripts/8385-083e882d77-lite.chunk.js.map +0 -1
- package/dist/scripts/8451-1cb649a3f3-lite.chunk.js.map +0 -1
- package/dist/scripts/8630-0945271ea2-lite.chunk.js +0 -2
- package/dist/scripts/8630-0945271ea2-lite.chunk.js.map +0 -1
- package/dist/scripts/8891-393bb5bdaf-lite.chunk.js +0 -2
- package/dist/scripts/8891-393bb5bdaf-lite.chunk.js.map +0 -1
- package/dist/scripts/8982-8c21fab48a-lite.chunk.js +0 -2
- package/dist/scripts/8982-8c21fab48a-lite.chunk.js.map +0 -1
- package/dist/scripts/9186-daf77d7174-lite.chunk.js.map +0 -1
- package/dist/scripts/9241-dbac9cb9f9-lite.chunk.js.map +0 -1
- package/dist/scripts/9345-30ccf524c5-lite.chunk.js.map +0 -1
- package/dist/scripts/9352-04db4c533d-lite.chunk.js +0 -2
- package/dist/scripts/9352-04db4c533d-lite.chunk.js.map +0 -1
- package/dist/scripts/9503-275c13891d-lite.chunk.js.map +0 -1
- package/dist/scripts/9630-285237c980-lite.chunk.js +0 -2
- package/dist/scripts/9630-285237c980-lite.chunk.js.map +0 -1
- package/dist/scripts/9767-d69fdc31b0-lite.chunk.js.map +0 -1
- package/dist/scripts/9894-10943e41f7-lite.chunk.js +0 -2
- package/dist/scripts/9894-10943e41f7-lite.chunk.js.map +0 -1
- package/dist/scripts/bundle-0075afb6af.min.js +0 -3
- /package/dist/scripts/{1362-061cd588c0-lite.chunk.js.LICENSE.txt → 1362-56810ef4c8-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{1735-c0f3f1238a-lite.chunk.js.LICENSE.txt → 1735-e4cdbc46ed-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{4014-4225ce1eb6-lite.chunk.js.LICENSE.txt → 4014-3eccce2f89-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{4050-cf35c4ec45-lite.chunk.js.LICENSE.txt → 4050-ffe5b6ae6d-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{6413-c4333e80d4-lite.chunk.js.LICENSE.txt → 6413-caaae6a383-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{6646-24a34f7d99-lite.chunk.js.LICENSE.txt → 6646-c5775f6553-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{8248-050265ed2d-lite.chunk.js.LICENSE.txt → 8248-41dad9bf71-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{9345-30ccf524c5-lite.chunk.js.LICENSE.txt → 9345-0a7f58bb53-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{bundle-0075afb6af.min.js.LICENSE.txt → bundle-5b65703152.min.js.LICENSE.txt} +0 -0
package/dist/scripts/{6207-f444184025-lite.chunk.js.map → 6207-be843186e0-lite.chunk.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/6207-f444184025-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/AnalyticsFilterUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/AnonymiseUserUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/DateRangeUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/views/interactive-student-results/InteractiveStudentResultsView.tsx","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/libs/shared/src/utils/AppRouteHelper.ts"],"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 includePublicResults?: boolean\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 && (!!requestFilter);\n\n return Flight.useBasicFetch<InteractiveResultSet>(shouldFetchResults &&\n InteractiveResultsRequests.interactiveResultSet(\n interactiveMetadata.data.interactiveId,\n interactiveMetadata.data.id,\n currentUser.data,\n requestFilter,\n includePublicResults\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 { User } from 'libs/shared/interfaces';\nimport { PublicInteractiveUser } from 'libs/shared/interfaces/models/interactive-results/PublicInteractiveUser';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\n\nfunction getUniqueNamesConfig(id: string): UniqueNamesConfig {\n /**\n * Generate a seed that is unique to each user but changes every 5 minutes.\n * \n * We use a seed so that if the same user's name is anonymised multiple times\n * in quick succession (e.g. multiple renders), the same name will be returned each time.\n * \n * We change the seed every 5 minutes so that students don't always have the same name.\n */\n const seed = +`${id}${Math.floor((new Date()).getMinutes() / 5)}`;\n\n return {\n dictionaries: [ colors, animals ],\n separator: ' ',\n length: 2,\n style: 'capital',\n seed\n };\n}\n\nexport function anonymiseUserName(user: User | PublicInteractiveUser, shouldAnonymise: boolean): string {\n if (!user)\n return '';\n\n if (!shouldAnonymise)\n return 'profileId' in user ? user.name : UserHelper.getFullName(user);\n\n return uniqueNamesGenerator(getUniqueNamesConfig('profileId' in user ? user.profileId : user.id));\n}\n","import { 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 { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { useFetchInteractiveResults } from 'libs/shared/apps/analytics/hooks/UseFetchInteractiveResults';\nimport { useMarkAnswers } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { AnalyticsFilterHelper } from 'libs/shared/apps/analytics/utils/AnalyticsFilterUtils';\nimport { anonymiseUserName } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { getInsightsDateRangePresets, getStartEndParams } from 'libs/shared/apps/analytics/utils/DateRangeUtils';\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 { useCannotConsumeError } from 'libs/shared/hooks/useCannotConsumeError';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { useLockContentWidth } from 'libs/shared/hooks/useLockContentWidth';\nimport { Config, Interactive, InteractiveMetadata } from 'libs/shared/interfaces';\nimport { PopupViewProps } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.interactiveStudentResults';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractiveStudentResultsViewProps extends PopupViewProps {\n userId: string;\n interactiveId: string;\n interactionId?: string;\n reportsStyling?: boolean;\n profileId?: string;\n}\n\nexport function InteractiveStudentResultsView(props: InteractiveStudentResultsViewProps): JSX.Element {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n useLockContentWidth();\n\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));\n\n const dateRangeAppLinkParams = AnalyticsFilterHelper.getDateRangeAppLinkParams();\n\n const results = useFetchInteractiveResults(\n props.interactiveId,\n getStartEndParams(getInsightsDateRangePresets(), dateRangeAppLinkParams)\n );\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n useHandleObjectError([ interactiveMetadata, results ]);\n useCannotConsumeError(interactiveMetadata);\n\n const { markedAnswers, addMarkedAnswers, submitMarkedAnswers } = useMarkAnswers(\n interactive.data?.id,\n interactiveMetadata.data?.id,\n props.closePopup\n );\n\n const studentResults = results.data?.students.find(s => {\n if (props.userId)\n return s.user?.id?.toString() === props.userId?.toString();\n\n if (props.profileId)\n return s.publicUser?.profileId?.toString() === props.profileId?.toString();\n\n return false;\n });\n\n const popupTitle = studentResults\n ? getPhrase('heading', { studentName: anonymiseUserName(studentResults.user || studentResults.publicUser, anonymiseUsers) })\n : '';\n const dataLoaded = !!interactive.data && !!results.data && !!config.data;\n\n return (\n <Popup\n title={popupTitle}\n showLoadingSpinner={!dataLoaded}\n closePopup={props.closePopup}\n size='lg'\n >\n {dataLoaded &&\n <StudentResponseList\n interactive={interactive.data}\n studentResults={studentResults}\n markedAnswers={markedAnswers}\n addMarkedAnswers={addMarkedAnswers}\n submitMarkedAnswers={submitMarkedAnswers}\n imageCdnUrl={config.data.imageCdnUrl}\n selectedInteractionId={props.interactionId}\n onClickClose={props.closePopup}\n anonymiseUsers={anonymiseUsers}\n reportsStyling={props.reportsStyling}\n />\n }\n </Popup>\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 || props.studentResults.publicUser,\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 { 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};"],"names":["useFetchInteractiveResults","interactiveMetadataId","requestFilter","includePublicResults","currentUser","interactiveMetadata","interactive","data","interactiveId","shouldFetchResults","I","id","AnalyticsFilterHelper","getAudienceAppLinkParams","appLink","params","users","classrooms","classroomGroups","getParam","key","param","Array","isArray","audienceFilters","getDateRangeAppLinkParams","from","to","rangeName","dateRangeFilters","anonymiseUserName","user","shouldAnonymise","profileId","seed","Math","floor","Date","getMinutes","dictionaries","separator","length","style","name","getPhrase","convertDateToUtcDateTimeString","date","utc","getMinDate","getMaxDate","getDefaultDateRange","dateRangePresets","find","range","getPresetRangeByName","dateRangePresetss","p","getInsightsDateRangePresets","minDate","currentYear","getFullYear","isMinDateThisYear","startDate","endDate","getMonth","disabled","tooltip","default","formatDateQueryParam","getRouteQueryParams","dateRange","useGetDateRangeFromQueryParams","dateRangeQueryParams","presetRange","replace","merge","keysToRemove","defaultDateRange","initialDateRangeValid","getStartEndParams","filterParams","getStartDate","getEndDate","start","end","defaultRange","InteractiveStudentResultsView","props","anonymiseUsers","dateRangeAppLinkParams","results","config","closePopup","markedAnswers","addMarkedAnswers","submitMarkedAnswers","studentResults","students","s","userId","toString","publicUser","popupTitle","studentName","dataLoaded","title","showLoadingSpinner","size","imageCdnUrl","selectedInteractionId","interactionId","onClickClose","reportsStyling","LanguageService","StudentResponseListFooter","numMarkedAnswers","Object","keys","className","showSubmitButtonSpinner","onClick","interactionsToMark","isDemo","Tooltip","spanHack","spanHackClassName","SpinnerButton","variant","onClickSubmit","showSpinner","StudentResponseListHeader","summary","unanswered","awaitingMarking","round","percentCorrect","StudentResponseList","ref","scrolled","setScrolled","setShowSpinner","selectedInteractionRef","current","requestAnimationFrame","scrollIntoView","behavior","block","interactions","questionsToMark","filter","i","InteractiveCorrectnessHelper","InteractionCorrectness","getInteractionsToMark","map","interaction","idx","isSelected","markingRequired","some","q","anonymisedUserName","InteractionLabel","iconClassName","InteractionResponse","markedStatus","markInteraction","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","join","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","useEffect","forEach","AppRouteHelper","updateParams","options","currentParams","updatedParams","updatedAppLink"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"scripts/6207-be843186e0-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/AnalyticsFilterUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/AnonymiseUserUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/DateRangeUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/views/interactive-student-results/InteractiveStudentResultsView.tsx","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/libs/shared/src/utils/AppRouteHelper.ts"],"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 includePublicResults?: boolean\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 && (!!requestFilter);\n\n return Flight.useBasicFetch<InteractiveResultSet>(shouldFetchResults &&\n InteractiveResultsRequests.interactiveResultSet(\n interactiveMetadata.data.interactiveId,\n interactiveMetadata.data.id,\n currentUser.data,\n requestFilter,\n includePublicResults\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 { User } from 'libs/shared/interfaces';\nimport { PublicInteractiveUser } from 'libs/shared/interfaces/models/interactive-results/PublicInteractiveUser';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\n\nfunction getUniqueNamesConfig(id: string): UniqueNamesConfig {\n /**\n * Generate a seed that is unique to each user but changes every 5 minutes.\n * \n * We use a seed so that if the same user's name is anonymised multiple times\n * in quick succession (e.g. multiple renders), the same name will be returned each time.\n * \n * We change the seed every 5 minutes so that students don't always have the same name.\n */\n const seed = +`${id}${Math.floor((new Date()).getMinutes() / 5)}`;\n\n return {\n dictionaries: [ colors, animals ],\n separator: ' ',\n length: 2,\n style: 'capital',\n seed\n };\n}\n\nexport function anonymiseUserName(user: User | PublicInteractiveUser, shouldAnonymise: boolean): string {\n if (!user)\n return '';\n\n if (!shouldAnonymise)\n return 'profileId' in user ? user.name : UserHelper.getFullName(user);\n\n return uniqueNamesGenerator(getUniqueNamesConfig('profileId' in user ? user.profileId : user.id));\n}\n","import { 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 { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { useFetchInteractiveResults } from 'libs/shared/apps/analytics/hooks/UseFetchInteractiveResults';\nimport { useMarkAnswers } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { AnalyticsFilterHelper } from 'libs/shared/apps/analytics/utils/AnalyticsFilterUtils';\nimport { anonymiseUserName } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { getInsightsDateRangePresets, getStartEndParams } from 'libs/shared/apps/analytics/utils/DateRangeUtils';\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 { useCannotConsumeError } from 'libs/shared/hooks/useCannotConsumeError';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { useLockContentWidth } from 'libs/shared/hooks/useLockContentWidth';\nimport { Config, Interactive, InteractiveMetadata } from 'libs/shared/interfaces';\nimport { PopupViewProps } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.interactiveStudentResults';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractiveStudentResultsViewProps extends PopupViewProps {\n userId: string;\n interactiveId: string;\n interactionId?: string;\n reportsStyling?: boolean;\n profileId?: string;\n}\n\nexport function InteractiveStudentResultsView(props: InteractiveStudentResultsViewProps): JSX.Element {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n useLockContentWidth();\n\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));\n\n const dateRangeAppLinkParams = AnalyticsFilterHelper.getDateRangeAppLinkParams();\n\n const results = useFetchInteractiveResults(\n props.interactiveId,\n getStartEndParams(getInsightsDateRangePresets(), dateRangeAppLinkParams)\n );\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n useHandleObjectError([ interactiveMetadata, results ]);\n useCannotConsumeError(interactiveMetadata);\n\n const { markedAnswers, addMarkedAnswers, submitMarkedAnswers } = useMarkAnswers(\n interactive.data?.id,\n interactiveMetadata.data?.id,\n props.closePopup\n );\n\n const studentResults = results.data?.students.find(s => {\n if (props.userId)\n return s.user?.id?.toString() === props.userId?.toString();\n\n if (props.profileId)\n return s.publicUser?.profileId?.toString() === props.profileId?.toString();\n\n return false;\n });\n\n const popupTitle = studentResults\n ? getPhrase('heading', { studentName: anonymiseUserName(studentResults.user || studentResults.publicUser, anonymiseUsers) })\n : '';\n const dataLoaded = !!interactive.data && !!results.data && !!config.data;\n\n return (\n <Popup\n title={popupTitle}\n showLoadingSpinner={!dataLoaded}\n closePopup={props.closePopup}\n size='lg'\n >\n {dataLoaded &&\n <StudentResponseList\n interactive={interactive.data}\n studentResults={studentResults}\n markedAnswers={markedAnswers}\n addMarkedAnswers={addMarkedAnswers}\n submitMarkedAnswers={submitMarkedAnswers}\n imageCdnUrl={config.data.imageCdnUrl}\n selectedInteractionId={props.interactionId}\n onClickClose={props.closePopup}\n anonymiseUsers={anonymiseUsers}\n reportsStyling={props.reportsStyling}\n />\n }\n </Popup>\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 || props.studentResults.publicUser,\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 { 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};"],"names":["useFetchInteractiveResults","interactiveMetadataId","requestFilter","includePublicResults","currentUser","interactiveMetadata","interactive","data","interactiveId","shouldFetchResults","I","id","AnalyticsFilterHelper","getAudienceAppLinkParams","appLink","params","users","classrooms","classroomGroups","getParam","key","param","Array","isArray","audienceFilters","getDateRangeAppLinkParams","from","to","rangeName","dateRangeFilters","anonymiseUserName","user","shouldAnonymise","profileId","seed","Math","floor","Date","getMinutes","dictionaries","separator","length","style","name","getPhrase","convertDateToUtcDateTimeString","date","utc","getMinDate","getMaxDate","getDefaultDateRange","dateRangePresets","find","range","getPresetRangeByName","dateRangePresetss","p","getInsightsDateRangePresets","minDate","currentYear","getFullYear","isMinDateThisYear","startDate","endDate","getMonth","disabled","tooltip","default","formatDateQueryParam","getRouteQueryParams","dateRange","useGetDateRangeFromQueryParams","dateRangeQueryParams","presetRange","replace","merge","keysToRemove","defaultDateRange","initialDateRangeValid","getStartEndParams","filterParams","getStartDate","getEndDate","start","end","defaultRange","InteractiveStudentResultsView","props","anonymiseUsers","dateRangeAppLinkParams","results","config","closePopup","markedAnswers","addMarkedAnswers","submitMarkedAnswers","studentResults","students","s","userId","toString","publicUser","popupTitle","studentName","dataLoaded","title","showLoadingSpinner","size","imageCdnUrl","selectedInteractionId","interactionId","onClickClose","reportsStyling","LanguageService","StudentResponseListFooter","numMarkedAnswers","Object","keys","className","showSubmitButtonSpinner","onClick","interactionsToMark","isDemo","Tooltip","spanHack","spanHackClassName","SpinnerButton","variant","onClickSubmit","showSpinner","StudentResponseListHeader","summary","unanswered","awaitingMarking","round","percentCorrect","StudentResponseList","ref","scrolled","setScrolled","setShowSpinner","selectedInteractionRef","current","requestAnimationFrame","scrollIntoView","behavior","block","interactions","questionsToMark","filter","i","InteractiveCorrectnessHelper","InteractionCorrectness","getInteractionsToMark","map","interaction","idx","isSelected","markingRequired","some","q","anonymisedUserName","InteractionLabel","iconClassName","InteractionResponse","markedStatus","markInteraction","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","join","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","useEffect","forEach","AppRouteHelper","updateParams","options","currentParams","updatedParams","updatedAppLink"],"sourceRoot":""}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
/*! For license information please see 6413-
|
|
2
|
-
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[6413],{41661:(e,t,n)=>{var r;n.d(t,{D:()=>r}),function(e){e.GoogleClassroom="google-classroom",e.MicrosoftTeams="microsoft-teams",e.Vivi="vivi",e.AppleTv="apply-tv"}(r||(r={}))},99705:(e,t,n)=>{var r,a;n.d(t,{b:()=>a}),function(e){e.AddToPlaylist="115005679748",e.EditSsoAccounts="8202508040345",e.LibraryEditor="360001974533",e.VideoAccess="360000153947",e.AddFromOnline="360011718234",e.UploadToLibraryEditor="360012069334",e.PBTErrorCodes="360012421153",e.ManuelReview="360020004534",e.LibraryReview="360000163788"}(r||(r={})),function(e){e.Integrations="4407268725529",e.Classrooms="4405362551833",e.MakeInteractive="4405370510873",e.EditSsoAccounts="8202605666073",e.UploadToLibraryEditor="10672936659865",e.AddFromLite="10671345281561",e.ManageSsoYearGroups="14691130889241",e.ContentReview="18525199576601",e.ContentPermissions="14692125209497",e.AccessSettings="27927466562201",e.ContentGuidelines="24133696186009",e.FoxtelFaq="24133519542169",e.ViviIntegration="23826297956377",e.AppleTvIntegration="25832373739929",e.RssFeed="32567445635097",e.ManageGroupPermissions="35407217335705"}(a||(a={}))},81803:(e,t,n)=>{n.d(t,{d:()=>p});var r=n(32735),a=n(81886),i=n(23481),o=n(49935),c=n(22902),s=n(14070),l=n(97291),u=n(96368);function m(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var f="settings.settingsLayout",d=function(e){var t=(0,c.T)().hasPermissions,n=(0,u.e)();if(e)return t(e);var r=a.Q.C$.getCurrentAppLink();return r.application!==l.O.SETTINGS||n.some((function(e){return e.modules.some((function(e){return"appLink"in e&&e.appLink.action===r.action}))}))};function p(e){var t,n=d(e.requiredPermissions);if(r.useEffect((function(){n||a.Q.C$.trigger({application:l.O.SETTINGS,action:s.e.Settings.HOME},{replace:!0})}),[n]),!n)return r.createElement(r.Fragment,null);var c,u=e.breadcrumbs.map((function(t,n){return{name:t,appLink:{application:l.O.SETTINGS,action:s.e.Settings.HOME},active:n===e.breadcrumbs.length-1}}));return r.createElement("div",{className:"px-3"},r.createElement("div",{className:"d-flex align-items-center justify-content-between"},r.createElement("h1",{className:"h2"},e.heading),null===(t=e.headingButton)||void 0===t?void 0:t.call(e)),r.createElement("div",{className:"pb-3"},r.createElement(o.Oo,{breadcrumbs:[{name:i.T.getPhrase(f,"settingsBreadcrumb"),appLink:{application:l.O.SETTINGS,action:s.e.Settings.HOME}}].concat((c=u,function(e){if(Array.isArray(e))return m(e)}(c)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(c)||function(e,t){if(e){if("string"==typeof e)return m(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?m(e,t):void 0}}(c)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()))})),e.description&&r.createElement(r.Fragment,null,r.createElement("p",null,e.description),r.createElement("hr",null)),e.children)}},24973:(e,t,n)=>{n.d(t,{i:()=>i});var r=n(32735);const a={numberContainer:"JBRDi"};function i(e){var t=e.number,n=e.children,i=e.className,o=void 0===i?"":i;return r.createElement("div",{className:"d-flex align-items-center mb-3 ".concat(o)},r.createElement("div",{className:"d-flex align-items-center justify-content-center bg-dark rounded-circle ".concat(a.numberContainer)},r.createElement("span",{className:"text-light"},t)),r.createElement("div",{className:"ms-2"},n))}},56413:(e,t,n)=>{n.r(t),n.d(t,{ViviSettingsView:()=>ee});var r=n(32735),a=n(70680),i=n(39202),o=n(23481),c=n(97395),s=n(20354),l=n(49985),u=n(65858),m=n(41661),f=n(33514),d=n(16714),p=n(77963),h=n(65728),v=n(99705),g=n(39151),y=n(2744),E=n(31949),b=n(69883),S=n(79612),x=n(37802),w=n(12778),N=n(81803),C=n(91693),k=n(83914),L=n(83345),T=n(83523),A=n(35223),I=n(99742),P=n(24973);const O={image:"pt8vC"};var V="settings.viviSettings.connectedState";function _(e){var t=e.studentCastingEnabled,n=e.onDisconnect,a=e.onToggleStudentCasting;return r.createElement(r.Fragment,null,r.createElement("div",{className:"text-center d-flex flex-column align-items-center pt-5"},r.createElement("img",{className:"".concat(O.image," img-fluid"),role:"presentation",src:I.W.Devices.VIVI_CONNECTED}),r.createElement("h2",{className:"h3 mt-3"},r.createElement(L.x,{namespace:V,phrase:"connectedStateHeading"})),r.createElement("p",{className:"mb-3 w-50"},r.createElement(L.x,{namespace:V,phrase:"connectedStateInfo"})),r.createElement(C.h,{svgName:A.vn.Delete,className:"btn btn-outline-dark",onClick:n},r.createElement(L.x,{namespace:V,phrase:"disconnectViviButton"})),r.createElement("div",null,r.createElement("div",{className:"rounded-3 px-4 py-3 mt-3 bg-light-blue text-info text-dark text-start"},r.createElement("h3",{className:"h6 mb-3"},r.createElement(L.x,{namespace:V,phrase:"instructionsHeading"})),r.createElement(P.i,{number:1},r.createElement(L.x,{namespace:V,phrase:"instructionsStep1"})),r.createElement(P.i,{number:2,className:"mt-2"},r.createElement(L.x,{namespace:V,phrase:"instructionsStep2Fragment1"}),r.createElement(k.x,{svgName:A.vn.Vivi,size:k.S.Small}),r.createElement(L.x,{namespace:V,phrase:"instructionsStep2Fragment2"})),r.createElement(P.i,{number:3,className:"mt-2"},r.createElement(L.x,{namespace:V,phrase:"instructionsStep3"})),r.createElement(P.i,{number:4,className:"my-2"},r.createElement(L.x,{namespace:V,phrase:"instructionsStep4Fragment1"}),r.createElement(k.x,{svgName:A.vn.Cast,size:k.S.Small}),r.createElement(L.x,{namespace:V,phrase:"instructionsStep4Fragment2"})),r.createElement("a",{href:w.o.getLiteArticle(v.b.ViviIntegration),target:"_blank",className:"text-info"},r.createElement(L.x,{namespace:V,phrase:"learnMore"}))),r.createElement("div",{className:"rounded-3 px-4 py-3 mt-3 border text-dark text-start"},r.createElement("div",{className:"d-flex flex-row"},r.createElement("div",{className:"flex-grow-1"},r.createElement("h3",{className:"h6 mb-2"},r.createElement(L.x,{namespace:V,phrase:"studentCastingHeading"})),r.createElement("p",{className:"mb-0"},r.createElement(L.x,{namespace:V,phrase:"studentCastingInfo"}))),r.createElement("div",{className:"ms-3"},r.createElement(T.Z,{onClick:function(){a()},on:t,disabled:!1})))))))}var F=n(9111),j=n(13876),G="settings.viviSettings.disconnectPopup",M=o.T.encloseNamespace(G);function B(e){var t=e.showSpinner,n=e.onClickConfirm;return r.createElement(F.G,{title:M("disconnectPopupTitle"),closePopup:e.closePopup},r.createElement("p",null,r.createElement(L.x,{namespace:G,phrase:"disconnectPopupWarning"})),r.createElement("p",null,r.createElement(L.x,{namespace:G,phrase:"disconnectPopupSubWarning"})),r.createElement(j.u,null,r.createElement(j.u.Cancel,{onClick:e.closePopup}),r.createElement(j.u.Submit,{variant:"danger",text:M("disconnectPopupConfirmButton"),onClick:n,showSpinner:t})))}const D={image:"XPUBh"};var U="settings.viviSettings.disconnectedState",H=o.T.encloseNamespace(U);function W(e){var t=e.onConnect,n=e.onTroubleshoot;return r.createElement("div",{className:"text-center d-flex flex-column align-items-center pt-5"},r.createElement("img",{className:"".concat(D.image," img-fluid"),role:"presentation",src:I.W.Devices.VIVI_DISCONNECTED}),r.createElement("h2",{className:"h3 mt-3"},H("disconnectedStateHeading")),r.createElement("p",{className:"mb-3 w-50"},H("disconnectedStateInfo")),r.createElement(C.h,{svgName:A.vn.NewWindow,className:"btn btn-dark mb-3",onClick:t},H("connectViviButton")),r.createElement("a",{onClick:n,className:"text-info",role:"button"},r.createElement(L.x,{namespace:U,phrase:"troubleshootLink"})))}const q={container:"vgMQp",image:"cZeWA",heading:"ESuYg",button:"zFxDC"};function z(){return r.createElement("div",{className:"".concat(q.container," pt-5")},r.createElement("div",{className:"".concat(q.image," partial-loading-background mb-2 rounded")}),r.createElement("div",{className:"".concat(q.heading," partial-loading-background mb-2 rounded")}),r.createElement("div",{className:"".concat(q.button," partial-loading-background mb-2 rounded")}))}function R(e){return R="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},R(e)}function Z(){Z=function(){return t};var e,t={},n=Object.prototype,r=n.hasOwnProperty,a=Object.defineProperty||function(e,t,n){e[t]=n.value},i="function"==typeof Symbol?Symbol:{},o=i.iterator||"@@iterator",c=i.asyncIterator||"@@asyncIterator",s=i.toStringTag||"@@toStringTag";function l(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{l({},"")}catch(e){l=function(e,t,n){return e[t]=n}}function u(e,t,n,r){var i=t&&t.prototype instanceof g?t:g,o=Object.create(i.prototype),c=new I(r||[]);return a(o,"_invoke",{value:k(e,n,c)}),o}function m(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}t.wrap=u;var f="suspendedStart",d="suspendedYield",p="executing",h="completed",v={};function g(){}function y(){}function E(){}var b={};l(b,o,(function(){return this}));var S=Object.getPrototypeOf,x=S&&S(S(P([])));x&&x!==n&&r.call(x,o)&&(b=x);var w=E.prototype=g.prototype=Object.create(b);function N(e){["next","throw","return"].forEach((function(t){l(e,t,(function(e){return this._invoke(t,e)}))}))}function C(e,t){function n(a,i,o,c){var s=m(e[a],e,i);if("throw"!==s.type){var l=s.arg,u=l.value;return u&&"object"==R(u)&&r.call(u,"__await")?t.resolve(u.__await).then((function(e){n("next",e,o,c)}),(function(e){n("throw",e,o,c)})):t.resolve(u).then((function(e){l.value=e,o(l)}),(function(e){return n("throw",e,o,c)}))}c(s.arg)}var i;a(this,"_invoke",{value:function(e,r){function a(){return new t((function(t,a){n(e,r,t,a)}))}return i=i?i.then(a,a):a()}})}function k(t,n,r){var a=f;return function(i,o){if(a===p)throw Error("Generator is already running");if(a===h){if("throw"===i)throw o;return{value:e,done:!0}}for(r.method=i,r.arg=o;;){var c=r.delegate;if(c){var s=L(c,r);if(s){if(s===v)continue;return s}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(a===f)throw a=h,r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);a=p;var l=m(t,n,r);if("normal"===l.type){if(a=r.done?h:d,l.arg===v)continue;return{value:l.arg,done:r.done}}"throw"===l.type&&(a=h,r.method="throw",r.arg=l.arg)}}}function L(t,n){var r=n.method,a=t.iterator[r];if(a===e)return n.delegate=null,"throw"===r&&t.iterator.return&&(n.method="return",n.arg=e,L(t,n),"throw"===n.method)||"return"!==r&&(n.method="throw",n.arg=new TypeError("The iterator does not provide a '"+r+"' method")),v;var i=m(a,t.iterator,n.arg);if("throw"===i.type)return n.method="throw",n.arg=i.arg,n.delegate=null,v;var o=i.arg;return o?o.done?(n[t.resultName]=o.value,n.next=t.nextLoc,"return"!==n.method&&(n.method="next",n.arg=e),n.delegate=null,v):o:(n.method="throw",n.arg=new TypeError("iterator result is not an object"),n.delegate=null,v)}function T(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function A(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function I(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(T,this),this.reset(!0)}function P(t){if(t||""===t){var n=t[o];if(n)return n.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var a=-1,i=function n(){for(;++a<t.length;)if(r.call(t,a))return n.value=t[a],n.done=!1,n;return n.value=e,n.done=!0,n};return i.next=i}}throw new TypeError(R(t)+" is not iterable")}return y.prototype=E,a(w,"constructor",{value:E,configurable:!0}),a(E,"constructor",{value:y,configurable:!0}),y.displayName=l(E,s,"GeneratorFunction"),t.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===y||"GeneratorFunction"===(t.displayName||t.name))},t.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,E):(e.__proto__=E,l(e,s,"GeneratorFunction")),e.prototype=Object.create(w),e},t.awrap=function(e){return{__await:e}},N(C.prototype),l(C.prototype,c,(function(){return this})),t.AsyncIterator=C,t.async=function(e,n,r,a,i){void 0===i&&(i=Promise);var o=new C(u(e,n,r,a),i);return t.isGeneratorFunction(n)?o:o.next().then((function(e){return e.done?e.value:o.next()}))},N(w),l(w,s,"Generator"),l(w,o,(function(){return this})),l(w,"toString",(function(){return"[object Generator]"})),t.keys=function(e){var t=Object(e),n=[];for(var r in t)n.push(r);return n.reverse(),function e(){for(;n.length;){var r=n.pop();if(r in t)return e.value=r,e.done=!1,e}return e.done=!0,e}},t.values=P,I.prototype={constructor:I,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=e,this.done=!1,this.delegate=null,this.method="next",this.arg=e,this.tryEntries.forEach(A),!t)for(var n in this)"t"===n.charAt(0)&&r.call(this,n)&&!isNaN(+n.slice(1))&&(this[n]=e)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var n=this;function a(r,a){return c.type="throw",c.arg=t,n.next=r,a&&(n.method="next",n.arg=e),!!a}for(var i=this.tryEntries.length-1;i>=0;--i){var o=this.tryEntries[i],c=o.completion;if("root"===o.tryLoc)return a("end");if(o.tryLoc<=this.prev){var s=r.call(o,"catchLoc"),l=r.call(o,"finallyLoc");if(s&&l){if(this.prev<o.catchLoc)return a(o.catchLoc,!0);if(this.prev<o.finallyLoc)return a(o.finallyLoc)}else if(s){if(this.prev<o.catchLoc)return a(o.catchLoc,!0)}else{if(!l)throw Error("try statement without catch or finally");if(this.prev<o.finallyLoc)return a(o.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var a=this.tryEntries[n];if(a.tryLoc<=this.prev&&r.call(a,"finallyLoc")&&this.prev<a.finallyLoc){var i=a;break}}i&&("break"===e||"continue"===e)&&i.tryLoc<=t&&t<=i.finallyLoc&&(i=null);var o=i?i.completion:{};return o.type=e,o.arg=t,i?(this.method="next",this.next=i.finallyLoc,v):this.complete(o)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),v},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),A(n),v}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var a=r.arg;A(n)}return a}}throw Error("illegal catch attempt")},delegateYield:function(t,n,r){return this.delegate={iterator:P(t),resultName:n,nextLoc:r},"next"===this.method&&(this.arg=e),v}},t}function Y(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,i,o,c=[],s=!0,l=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(r=i.call(n)).done)&&(c.push(r.value),c.length!==t);s=!0);}catch(e){l=!0,a=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(l)throw a}}return c}}(e,t)||function(e,t){if(e){if("string"==typeof e)return $(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?$(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function $(e,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 Q=function(e,t,n,r){return new(n||(n=Promise))((function(a,i){function o(e){try{s(r.next(e))}catch(e){i(e)}}function c(e){try{s(r.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,c)}s((r=r.apply(e,t||[])).next())}))},J="vivi/connect",X="settings/integrations/vivi",K=o.T.encloseNamespace("settings.viviSettings");function ee(e){var t,n=e.queryParams;(0,S.M)({title:K("pageTitle")});var o=Y(r.useState(!1),2),C=o[0],k=o[1],L=Y(r.useState(!1),2),T=L[0],A=L[1],I=s.a.useBasicFetch(E.N.currentUser()),P=s.a.useBasicFetch(g.L.config()),O=s.a.useBasicFetch((null===(t=I.data)||void 0===t?void 0:t.isAuthenticated)&&y.z.getViviIntegrationStatus()),V=(0,x.r)(u.LZ.Settings),F=V.hasEnabledViviPlayback,j=V.hasEnabledViviStudentCasting,G=V.isLoadingSettings,M=V.updateSetting,D=(0,b.Z)(),U=(0,a.I0)(),H=I.isFetching,q=O.isFetching,R=!q&&O.data===f.I.Connected,$=!q&&!R;return r.useEffect((function(){var e;if(!(H||q||G||"true"!==(null==n?void 0:n.success)||O.data!==f.I.Connected||F)){var t={name:h.E.HasEnabledViviPlayback,value:!0,kind:p.g.Temporary};M(null===(e=I.data)||void 0===e?void 0:e.customerId,t,(function(){return D.success(K("enableViviSuccess"))}),(function(){return D.error(K("enableViviError"))}))}}),[H,q,G]),r.createElement(N.d,{heading:K("heading"),breadcrumbs:[K("heading")],requiredPermissions:d.C.ManageIntegrations},C&&r.createElement(B,{showSpinner:T,onClickConfirm:function(){return Q(this,void 0,void 0,Z().mark((function e(){return Z().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(I.data.isAuthenticated){e.next=2;break}return e.abrupt("return");case 2:return e.prev=2,A(!0),e.next=6,s.a.fetchAsync(U,y.z.disconnectViviAccount());case 6:k(!1),D.success(K("disconnectPopupSuccessMessage")),e.next=14;break;case 10:e.prev=10,e.t0=e.catch(2),console.error(e.t0),D.error(K("disconnectPopupErrorMessage"));case 14:return e.prev=14,A(!1),e.finish(14);case 17:case"end":return e.stop()}}),e,null,[[2,10,14,17]])})))},closePopup:function(){return k(!1)}}),q&&r.createElement(z,null),R&&r.createElement(_,{studentCastingEnabled:j,onDisconnect:function(){return k(!0)},onToggleStudentCasting:function(){var e,t=!j,n=t?"enableStudentCastingSuccess":"disableStudentCastingSuccess",r=t?"enableStudentCastingError":"disableStudentCastingError",a={name:h.E.HasEnabledViviStudentCasting,value:t,kind:p.g.Temporary};M(null===(e=I.data)||void 0===e?void 0:e.customerId,a,(function(){return D.success(K(n))}),(function(){return D.error(K(r))}))}}),$&&r.createElement(W,{onConnect:function(){var e;if(!P.isFetching){var t=c._.safeUrlConcat(null!==(e=P.data.integrationsApiUrl)&&void 0!==e?e:"",J),n=c._.safeUrlConcat(location.origin,X),r=c._.urlBuilder(t,{returnUrl:n});location.href=r}},onTroubleshoot:function(){l.k.logUserAction({id:m.D.Vivi,status:O.data},{entity:u.py.Integration,actionType:u.Vw.Click,workflowPhase:u.eu.Complete,location:u.LZ.Settings,descriptor:u.N3.Troubleshoot,eventVersion:u.eq.V1}),i.Ab.PageLoad("".concat(w.o.getLiteArticle(v.b.ViviIntegration),"#troubleshooting"),!0)}}))}}}]);
|
|
3
|
-
//# sourceMappingURL=6413-
|
|
1
|
+
/*! For license information please see 6413-caaae6a383-lite.chunk.js.LICENSE.txt */
|
|
2
|
+
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[6413],{41661:(e,t,n)=>{var r;n.d(t,{D:()=>r}),function(e){e.GoogleClassroom="google-classroom",e.MicrosoftTeams="microsoft-teams",e.Vivi="vivi",e.AppleTv="apply-tv"}(r||(r={}))},99705:(e,t,n)=>{var r,a;n.d(t,{b:()=>a}),function(e){e.AddToPlaylist="115005679748",e.EditSsoAccounts="8202508040345",e.LibraryEditor="360001974533",e.VideoAccess="360000153947",e.AddFromOnline="360011718234",e.UploadToLibraryEditor="360012069334",e.PBTErrorCodes="360012421153",e.ManuelReview="360020004534",e.LibraryReview="360000163788"}(r||(r={})),function(e){e.Integrations="4407268725529",e.Classrooms="4405362551833",e.MakeInteractive="4405370510873",e.EditSsoAccounts="8202605666073",e.UploadToLibraryEditor="10672936659865",e.AddFromLite="10671345281561",e.ManageSsoYearGroups="14691130889241",e.ContentReview="18525199576601",e.ContentPermissions="14692125209497",e.AccessSettings="27927466562201",e.ContentGuidelines="24133696186009",e.FoxtelFaq="24133519542169",e.ViviIntegration="23826297956377",e.AppleTvIntegration="25832373739929",e.RssFeed="32567445635097",e.ManageGroupPermissions="35407217335705"}(a||(a={}))},81803:(e,t,n)=>{n.d(t,{d:()=>p});var r=n(32735),a=n(81886),i=n(23481),o=n(49935),c=n(22902),s=n(14070),l=n(97291),u=n(96368);function m(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var f="settings.settingsLayout",d=function(e){var t=(0,c.T)().hasPermissions,n=(0,u.e)();if(e)return t(e);var r=a.Q.C$.getCurrentAppLink();return r.application!==l.O.SETTINGS||n.some((function(e){return e.modules.some((function(e){return"appLink"in e&&e.appLink.action===r.action}))}))};function p(e){var t,n=d(e.requiredPermissions);if(r.useEffect((function(){n||a.Q.C$.trigger({application:l.O.SETTINGS,action:s.e.Settings.HOME},{replace:!0})}),[n]),!n)return r.createElement(r.Fragment,null);var c,u=e.breadcrumbs.map((function(t,n){return{name:t,appLink:{application:l.O.SETTINGS,action:s.e.Settings.HOME},active:n===e.breadcrumbs.length-1}}));return r.createElement("div",{className:"px-3"},r.createElement("div",{className:"d-flex align-items-center justify-content-between"},r.createElement("h1",{className:"h2"},e.heading),null===(t=e.headingButton)||void 0===t?void 0:t.call(e)),r.createElement("div",{className:"pb-3"},r.createElement(o.Oo,{breadcrumbs:[{name:i.T.getPhrase(f,"settingsBreadcrumb"),appLink:{application:l.O.SETTINGS,action:s.e.Settings.HOME}}].concat((c=u,function(e){if(Array.isArray(e))return m(e)}(c)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(c)||function(e,t){if(e){if("string"==typeof e)return m(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?m(e,t):void 0}}(c)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()))})),e.description&&r.createElement(r.Fragment,null,r.createElement("p",null,e.description),r.createElement("hr",null)),e.children)}},24973:(e,t,n)=>{n.d(t,{i:()=>i});var r=n(32735);const a={numberContainer:"JBRDi"};function i(e){var t=e.number,n=e.children,i=e.className,o=void 0===i?"":i;return r.createElement("div",{className:"d-flex align-items-center mb-3 ".concat(o)},r.createElement("div",{className:"d-flex align-items-center justify-content-center bg-dark rounded-circle ".concat(a.numberContainer)},r.createElement("span",{className:"text-light"},t)),r.createElement("div",{className:"ms-2"},n))}},56413:(e,t,n)=>{n.r(t),n.d(t,{ViviSettingsView:()=>ee});var r=n(32735),a=n(70680),i=n(39202),o=n(23481),c=n(97395),s=n(20354),l=n(49985),u=n(65858),m=n(41661),f=n(33514),d=n(16714),p=n(77963),h=n(65728),v=n(99705),g=n(39151),y=n(2744),E=n(31949),b=n(69883),S=n(79612),x=n(37802),w=n(12778),N=n(81803),C=n(91693),k=n(83914),L=n(83345),T=n(83523),A=n(35223),I=n(99742),P=n(24973);const O={image:"pt8vC"};var F="settings.viviSettings.connectedState";function V(e){var t=e.studentCastingEnabled,n=e.onDisconnect,a=e.onToggleStudentCasting;return r.createElement(r.Fragment,null,r.createElement("div",{className:"text-center d-flex flex-column align-items-center pt-5"},r.createElement("img",{className:"".concat(O.image," img-fluid"),role:"presentation",src:I.W.Devices.VIVI_CONNECTED}),r.createElement("h2",{className:"h3 mt-3"},r.createElement(L.x,{namespace:F,phrase:"connectedStateHeading"})),r.createElement("p",{className:"mb-3 w-50"},r.createElement(L.x,{namespace:F,phrase:"connectedStateInfo"})),r.createElement(C.h,{svgName:A.vn.Delete,className:"btn btn-outline-dark",onClick:n},r.createElement(L.x,{namespace:F,phrase:"disconnectViviButton"})),r.createElement("div",null,r.createElement("div",{className:"rounded-3 px-4 py-3 mt-3 bg-light-blue text-info text-dark text-start"},r.createElement("h3",{className:"h6 mb-3"},r.createElement(L.x,{namespace:F,phrase:"instructionsHeading"})),r.createElement(P.i,{number:1},r.createElement(L.x,{namespace:F,phrase:"instructionsStep1"})),r.createElement(P.i,{number:2,className:"mt-2"},r.createElement(L.x,{namespace:F,phrase:"instructionsStep2Fragment1"}),r.createElement(k.x,{svgName:A.vn.Vivi,size:k.S.Small}),r.createElement(L.x,{namespace:F,phrase:"instructionsStep2Fragment2"})),r.createElement(P.i,{number:3,className:"mt-2"},r.createElement(L.x,{namespace:F,phrase:"instructionsStep3"})),r.createElement(P.i,{number:4,className:"my-2"},r.createElement(L.x,{namespace:F,phrase:"instructionsStep4Fragment1"}),r.createElement(k.x,{svgName:A.vn.Cast,size:k.S.Small}),r.createElement(L.x,{namespace:F,phrase:"instructionsStep4Fragment2"})),r.createElement("a",{href:w.o.getLiteArticle(v.b.ViviIntegration),target:"_blank",className:"text-info"},r.createElement(L.x,{namespace:F,phrase:"learnMore"}))),r.createElement("div",{className:"rounded-3 px-4 py-3 mt-3 border text-dark text-start"},r.createElement("div",{className:"d-flex flex-row"},r.createElement("div",{className:"flex-grow-1"},r.createElement("h3",{className:"h6 mb-2"},r.createElement(L.x,{namespace:F,phrase:"studentCastingHeading"})),r.createElement("p",{className:"mb-0"},r.createElement(L.x,{namespace:F,phrase:"studentCastingInfo"}))),r.createElement("div",{className:"ms-3"},r.createElement(T.Z,{onClick:function(){a()},on:t,disabled:!1})))))))}var _=n(9111),j=n(13876),G="settings.viviSettings.disconnectPopup",M=o.T.encloseNamespace(G);function B(e){var t=e.showSpinner,n=e.onClickConfirm;return r.createElement(_.G,{title:M("disconnectPopupTitle"),closePopup:e.closePopup},r.createElement("p",null,r.createElement(L.x,{namespace:G,phrase:"disconnectPopupWarning"})),r.createElement("p",null,r.createElement(L.x,{namespace:G,phrase:"disconnectPopupSubWarning"})),r.createElement(j.u,null,r.createElement(j.u.Cancel,{onClick:e.closePopup}),r.createElement(j.u.Submit,{variant:"danger",text:M("disconnectPopupConfirmButton"),onClick:n,showSpinner:t})))}const D={image:"XPUBh"};var U="settings.viviSettings.disconnectedState",H=o.T.encloseNamespace(U);function W(e){var t=e.onConnect,n=e.onTroubleshoot;return r.createElement("div",{className:"text-center d-flex flex-column align-items-center pt-5"},r.createElement("img",{className:"".concat(D.image," img-fluid"),role:"presentation",src:I.W.Devices.VIVI_DISCONNECTED}),r.createElement("h2",{className:"h3 mt-3"},H("disconnectedStateHeading")),r.createElement("p",{className:"mb-3 w-50"},H("disconnectedStateInfo")),r.createElement(C.h,{svgName:A.vn.NewWindow,className:"btn btn-dark mb-3",onClick:t},H("connectViviButton")),r.createElement("a",{onClick:n,className:"text-info",role:"button"},r.createElement(L.x,{namespace:U,phrase:"troubleshootLink"})))}const q={container:"vgMQp",image:"cZeWA",heading:"ESuYg",button:"zFxDC"};function z(){return r.createElement("div",{className:"".concat(q.container," pt-5")},r.createElement("div",{className:"".concat(q.image," partial-loading-background mb-2 rounded")}),r.createElement("div",{className:"".concat(q.heading," partial-loading-background mb-2 rounded")}),r.createElement("div",{className:"".concat(q.button," partial-loading-background mb-2 rounded")}))}function R(e){return R="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},R(e)}function Z(){Z=function(){return t};var e,t={},n=Object.prototype,r=n.hasOwnProperty,a=Object.defineProperty||function(e,t,n){e[t]=n.value},i="function"==typeof Symbol?Symbol:{},o=i.iterator||"@@iterator",c=i.asyncIterator||"@@asyncIterator",s=i.toStringTag||"@@toStringTag";function l(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{l({},"")}catch(e){l=function(e,t,n){return e[t]=n}}function u(e,t,n,r){var i=t&&t.prototype instanceof g?t:g,o=Object.create(i.prototype),c=new I(r||[]);return a(o,"_invoke",{value:k(e,n,c)}),o}function m(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}t.wrap=u;var f="suspendedStart",d="suspendedYield",p="executing",h="completed",v={};function g(){}function y(){}function E(){}var b={};l(b,o,(function(){return this}));var S=Object.getPrototypeOf,x=S&&S(S(P([])));x&&x!==n&&r.call(x,o)&&(b=x);var w=E.prototype=g.prototype=Object.create(b);function N(e){["next","throw","return"].forEach((function(t){l(e,t,(function(e){return this._invoke(t,e)}))}))}function C(e,t){function n(a,i,o,c){var s=m(e[a],e,i);if("throw"!==s.type){var l=s.arg,u=l.value;return u&&"object"==R(u)&&r.call(u,"__await")?t.resolve(u.__await).then((function(e){n("next",e,o,c)}),(function(e){n("throw",e,o,c)})):t.resolve(u).then((function(e){l.value=e,o(l)}),(function(e){return n("throw",e,o,c)}))}c(s.arg)}var i;a(this,"_invoke",{value:function(e,r){function a(){return new t((function(t,a){n(e,r,t,a)}))}return i=i?i.then(a,a):a()}})}function k(t,n,r){var a=f;return function(i,o){if(a===p)throw Error("Generator is already running");if(a===h){if("throw"===i)throw o;return{value:e,done:!0}}for(r.method=i,r.arg=o;;){var c=r.delegate;if(c){var s=L(c,r);if(s){if(s===v)continue;return s}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(a===f)throw a=h,r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);a=p;var l=m(t,n,r);if("normal"===l.type){if(a=r.done?h:d,l.arg===v)continue;return{value:l.arg,done:r.done}}"throw"===l.type&&(a=h,r.method="throw",r.arg=l.arg)}}}function L(t,n){var r=n.method,a=t.iterator[r];if(a===e)return n.delegate=null,"throw"===r&&t.iterator.return&&(n.method="return",n.arg=e,L(t,n),"throw"===n.method)||"return"!==r&&(n.method="throw",n.arg=new TypeError("The iterator does not provide a '"+r+"' method")),v;var i=m(a,t.iterator,n.arg);if("throw"===i.type)return n.method="throw",n.arg=i.arg,n.delegate=null,v;var o=i.arg;return o?o.done?(n[t.resultName]=o.value,n.next=t.nextLoc,"return"!==n.method&&(n.method="next",n.arg=e),n.delegate=null,v):o:(n.method="throw",n.arg=new TypeError("iterator result is not an object"),n.delegate=null,v)}function T(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function A(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function I(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(T,this),this.reset(!0)}function P(t){if(t||""===t){var n=t[o];if(n)return n.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var a=-1,i=function n(){for(;++a<t.length;)if(r.call(t,a))return n.value=t[a],n.done=!1,n;return n.value=e,n.done=!0,n};return i.next=i}}throw new TypeError(R(t)+" is not iterable")}return y.prototype=E,a(w,"constructor",{value:E,configurable:!0}),a(E,"constructor",{value:y,configurable:!0}),y.displayName=l(E,s,"GeneratorFunction"),t.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===y||"GeneratorFunction"===(t.displayName||t.name))},t.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,E):(e.__proto__=E,l(e,s,"GeneratorFunction")),e.prototype=Object.create(w),e},t.awrap=function(e){return{__await:e}},N(C.prototype),l(C.prototype,c,(function(){return this})),t.AsyncIterator=C,t.async=function(e,n,r,a,i){void 0===i&&(i=Promise);var o=new C(u(e,n,r,a),i);return t.isGeneratorFunction(n)?o:o.next().then((function(e){return e.done?e.value:o.next()}))},N(w),l(w,s,"Generator"),l(w,o,(function(){return this})),l(w,"toString",(function(){return"[object Generator]"})),t.keys=function(e){var t=Object(e),n=[];for(var r in t)n.push(r);return n.reverse(),function e(){for(;n.length;){var r=n.pop();if(r in t)return e.value=r,e.done=!1,e}return e.done=!0,e}},t.values=P,I.prototype={constructor:I,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=e,this.done=!1,this.delegate=null,this.method="next",this.arg=e,this.tryEntries.forEach(A),!t)for(var n in this)"t"===n.charAt(0)&&r.call(this,n)&&!isNaN(+n.slice(1))&&(this[n]=e)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var n=this;function a(r,a){return c.type="throw",c.arg=t,n.next=r,a&&(n.method="next",n.arg=e),!!a}for(var i=this.tryEntries.length-1;i>=0;--i){var o=this.tryEntries[i],c=o.completion;if("root"===o.tryLoc)return a("end");if(o.tryLoc<=this.prev){var s=r.call(o,"catchLoc"),l=r.call(o,"finallyLoc");if(s&&l){if(this.prev<o.catchLoc)return a(o.catchLoc,!0);if(this.prev<o.finallyLoc)return a(o.finallyLoc)}else if(s){if(this.prev<o.catchLoc)return a(o.catchLoc,!0)}else{if(!l)throw Error("try statement without catch or finally");if(this.prev<o.finallyLoc)return a(o.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var a=this.tryEntries[n];if(a.tryLoc<=this.prev&&r.call(a,"finallyLoc")&&this.prev<a.finallyLoc){var i=a;break}}i&&("break"===e||"continue"===e)&&i.tryLoc<=t&&t<=i.finallyLoc&&(i=null);var o=i?i.completion:{};return o.type=e,o.arg=t,i?(this.method="next",this.next=i.finallyLoc,v):this.complete(o)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),v},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),A(n),v}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var a=r.arg;A(n)}return a}}throw Error("illegal catch attempt")},delegateYield:function(t,n,r){return this.delegate={iterator:P(t),resultName:n,nextLoc:r},"next"===this.method&&(this.arg=e),v}},t}function Y(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,i,o,c=[],s=!0,l=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(r=i.call(n)).done)&&(c.push(r.value),c.length!==t);s=!0);}catch(e){l=!0,a=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(l)throw a}}return c}}(e,t)||function(e,t){if(e){if("string"==typeof e)return $(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?$(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function $(e,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 Q=function(e,t,n,r){return new(n||(n=Promise))((function(a,i){function o(e){try{s(r.next(e))}catch(e){i(e)}}function c(e){try{s(r.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,c)}s((r=r.apply(e,t||[])).next())}))},J="vivi/connect",X="settings/integrations/vivi",K=o.T.encloseNamespace("settings.viviSettings");function ee(e){var t,n=e.queryParams;(0,S.M)({title:K("pageTitle")});var o=Y(r.useState(!1),2),C=o[0],k=o[1],L=Y(r.useState(!1),2),T=L[0],A=L[1],I=s.a.useBasicFetch(E.N.currentUser()),P=s.a.useBasicFetch(g.L.config()),O=s.a.useBasicFetch((null===(t=I.data)||void 0===t?void 0:t.isAuthenticated)&&y.z.getViviIntegrationStatus()),F=(0,x.r)(u.LZ.Settings),_=F.hasEnabledViviPlayback,j=F.hasEnabledViviStudentCasting,G=F.isLoadingSettings,M=F.updateSetting,D=(0,b.Z)(),U=(0,a.I0)(),H=I.isFetching,q=O.isFetching,R=!q&&O.data===f.I.Connected,$=!q&&!R;return r.useEffect((function(){var e;if(!(H||q||G||"true"!==(null==n?void 0:n.success)||O.data!==f.I.Connected||_)){var t={name:h.E.HasEnabledViviPlayback,value:!0,kind:p.g.FeatureFlag};M(null===(e=I.data)||void 0===e?void 0:e.customerId,t,(function(){return D.success(K("enableViviSuccess"))}),(function(){return D.error(K("enableViviError"))}))}}),[H,q,G]),r.createElement(N.d,{heading:K("heading"),breadcrumbs:[K("heading")],requiredPermissions:d.C.ManageIntegrations},C&&r.createElement(B,{showSpinner:T,onClickConfirm:function(){return Q(this,void 0,void 0,Z().mark((function e(){return Z().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(I.data.isAuthenticated){e.next=2;break}return e.abrupt("return");case 2:return e.prev=2,A(!0),e.next=6,s.a.fetchAsync(U,y.z.disconnectViviAccount());case 6:k(!1),D.success(K("disconnectPopupSuccessMessage")),e.next=14;break;case 10:e.prev=10,e.t0=e.catch(2),console.error(e.t0),D.error(K("disconnectPopupErrorMessage"));case 14:return e.prev=14,A(!1),e.finish(14);case 17:case"end":return e.stop()}}),e,null,[[2,10,14,17]])})))},closePopup:function(){return k(!1)}}),q&&r.createElement(z,null),R&&r.createElement(V,{studentCastingEnabled:j,onDisconnect:function(){return k(!0)},onToggleStudentCasting:function(){var e,t=!j,n=t?"enableStudentCastingSuccess":"disableStudentCastingSuccess",r=t?"enableStudentCastingError":"disableStudentCastingError",a={name:h.E.HasEnabledViviStudentCasting,value:t,kind:p.g.FeatureFlag};M(null===(e=I.data)||void 0===e?void 0:e.customerId,a,(function(){return D.success(K(n))}),(function(){return D.error(K(r))}))}}),$&&r.createElement(W,{onConnect:function(){var e;if(!P.isFetching){var t=c._.safeUrlConcat(null!==(e=P.data.integrationsApiUrl)&&void 0!==e?e:"",J),n=c._.safeUrlConcat(location.origin,X),r=c._.urlBuilder(t,{returnUrl:n});location.href=r}},onTroubleshoot:function(){l.k.logUserAction({id:m.D.Vivi,status:O.data},{entity:u.py.Integration,actionType:u.Vw.Click,workflowPhase:u.eu.Complete,location:u.LZ.Settings,descriptor:u.N3.Troubleshoot,eventVersion:u.eq.V1}),i.Ab.PageLoad("".concat(w.o.getLiteArticle(v.b.ViviIntegration),"#troubleshooting"),!0)}}))}}}]);
|
|
3
|
+
//# sourceMappingURL=6413-caaae6a383-lite.chunk.js.map
|
package/dist/scripts/{6413-c4333e80d4-lite.chunk.js.map → 6413-caaae6a383-lite.chunk.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/6413-c4333e80d4-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/enums/IntegrationId.ts","file:///app/packages/libs/shared/src/enums/SupportArticle.ts","file:///app/packages/projects/lite/src/apps/settings/components/settings-layout/SettingsLayout.tsx","file:///app/packages/projects/lite/src/apps/settings/components/settings-ordered-list-item/settings-ordered-list-item.scss","file:///app/packages/projects/lite/src/apps/settings/components/settings-ordered-list-item/SettingsOrderedListItem.tsx","file:///app/packages/projects/lite/src/apps/settings/views/integration-settings/vivi-settings/connected-state/vivi-settings-connected-state.scss","file:///app/packages/projects/lite/src/apps/settings/views/integration-settings/vivi-settings/connected-state/ViviSettingsConnectedState.tsx","file:///app/packages/projects/lite/src/apps/settings/views/integration-settings/vivi-settings/disconnect-popup/ViviSettingsDisconnectPopup.tsx","file:///app/packages/projects/lite/src/apps/settings/views/integration-settings/vivi-settings/disconnected-state/vivi-settings-connected-state.scss","file:///app/packages/projects/lite/src/apps/settings/views/integration-settings/vivi-settings/disconnected-state/ViviSettingsDisconnectedState.tsx","file:///app/packages/projects/lite/src/apps/settings/views/integration-settings/vivi-settings/partial-loading-state/vivi-settings-partial-loaded-state.scss","file:///app/packages/projects/lite/src/apps/settings/views/integration-settings/vivi-settings/partial-loading-state/VIviSettingsPartialLoadingState.tsx","file:///app/packages/projects/lite/src/apps/settings/views/integration-settings/vivi-settings/ViviSettingsView.tsx"],"sourcesContent":["export enum IntegrationId {\n GoogleClassroom = 'google-classroom',\n MicrosoftTeams = 'microsoft-teams',\n Vivi = 'vivi',\n AppleTv = 'apply-tv'\n}","// Article name mapped to article ID on support site. Used by `ArticleHelper`\n\nexport enum OnlineSupportArticle {\n AddToPlaylist = '115005679748',\n EditSsoAccounts = '8202508040345',\n\n // LE\n LibraryEditor = '360001974533',\n VideoAccess = '360000153947',\n AddFromOnline = '360011718234',\n UploadToLibraryEditor = '360012069334',\n PBTErrorCodes = '360012421153',\n ManuelReview = '360020004534',\n LibraryReview = '360000163788',\n}\n\nexport enum LiteSupportArticle {\n Integrations = '4407268725529',\n Classrooms = '4405362551833',\n MakeInteractive = '4405370510873',\n EditSsoAccounts = '8202605666073',\n UploadToLibraryEditor = '10672936659865',\n AddFromLite = '10671345281561',\n ManageSsoYearGroups = '14691130889241',\n ContentReview = '18525199576601',\n ContentPermissions = '14692125209497',\n AccessSettings = '27927466562201',\n ContentGuidelines = '24133696186009',\n FoxtelFaq = '24133519542169',\n ViviIntegration = '23826297956377',\n AppleTvIntegration = '25832373739929',\n RssFeed = '32567445635097',\n ManageGroupPermissions = '35407217335705'\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { useGetSettingsGroups } from 'apps/settings/hooks/useGetSettingsGroups';\n\nconst namespace = 'settings.settingsLayout';\n\n/**\n * Checks if the current user has permission to access the settings module\n */\nexport const useCanAccessSettings = (requiredPermissions: PermissionName | PermissionName[]): boolean => {\n const { hasPermissions } = usePermissions();\n const settingsGroups = useGetSettingsGroups();\n\n /**\n * TODO: Update all settings pages to pasas required permissions, because checking the \n * `useGetSettingsGroups()` values clearly doesnt work for settings pages with multiple\n * applinks inside of them. - Sha\n */\n if (requiredPermissions)\n return hasPermissions(requiredPermissions);\n\n const currentRoute = Core.AppLinkHelper.getCurrentAppLink();\n\n /**\n * Allows us to have popups sitting in other locations be used\n * by our settings pages. For example the manage video access popup\n * in the \"videos with restricted access\" page - Sha\n */\n if (currentRoute.application !== AppChannels.SETTINGS)\n return true;\n\n return settingsGroups.some(group => {\n return group.modules.some(settingsModule => {\n if ('appLink' in settingsModule) {\n return settingsModule.appLink.action === currentRoute.action;\n }\n\n return false;\n });\n });\n};\n\ninterface SettingsLayoutProps {\n heading: string;\n breadcrumbs: string[];\n description?: string;\n requiredPermissions?: PermissionName | PermissionName[];\n headingButton?: () => JSX.Element;\n}\n\nexport function SettingsLayout(props: React.PropsWithChildren<SettingsLayoutProps>): JSX.Element {\n const canAccess = useCanAccessSettings(props.requiredPermissions);\n\n React.useEffect(() => {\n if (!canAccess) {\n Core.AppLinkHelper.trigger({\n application: AppChannels.SETTINGS,\n action: Actions.Settings.HOME\n }, { replace: true });\n }\n }, [canAccess]);\n\n if (!canAccess)\n return <></>;\n\n const breadcrumbs = props.breadcrumbs.map((name, i) => ({\n name,\n appLink: {\n application: AppChannels.SETTINGS,\n action: Actions.Settings.HOME\n },\n active: i === props.breadcrumbs.length - 1\n }));\n\n return (\n <div className='px-3'>\n <div className='d-flex align-items-center justify-content-between'>\n <h1 className='h2'>{props.heading}</h1>\n {props.headingButton?.()}\n </div>\n <div className='pb-3'>\n <Breadcrumbs\n breadcrumbs={[\n {\n name: LanguageService.getPhrase(namespace, 'settingsBreadcrumb'),\n appLink: {\n application: AppChannels.SETTINGS,\n action: Actions.Settings.HOME\n }\n },\n ...breadcrumbs\n ]}\n />\n </div>\n {props.description &&\n <>\n <p>{props.description}</p>\n <hr />\n </>\n }\n\n {props.children}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"numberContainer\":\"JBRDi\"};","import React from 'react';\n\nimport styles from './settings-ordered-list-item.scss';\n\ninterface SettingsOrderedListItemProps {\n number: number;\n children: React.ReactNode;\n className?: string;\n}\n\nexport function SettingsOrderedListItem({ number, children, className = '' }: SettingsOrderedListItemProps): JSX.Element {\n return (\n <div className={`d-flex align-items-center mb-3 ${className}`}>\n <div className={`d-flex align-items-center justify-content-center bg-dark rounded-circle ${styles.numberContainer}`}>\n <span className='text-light'>{number}</span>\n </div>\n <div className='ms-2'>\n {children}\n </div>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"image\":\"pt8vC\"};","import React from 'react';\n\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\nimport { LiteSupportArticle } from 'libs/shared/enums/SupportArticle';\nimport { ArticleHelper } from 'libs/shared/utils/ArticleHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport { SettingsOrderedListItem } from 'apps/settings/components/settings-ordered-list-item/SettingsOrderedListItem';\n\nimport styles from './vivi-settings-connected-state.scss';\n\nconst namespace = 'settings.viviSettings.connectedState';\n\ninterface ViviSettingsConnectedStateProps {\n studentCastingEnabled: boolean;\n onDisconnect: () => void;\n onToggleStudentCasting: () => void;\n}\n\nexport function ViviSettingsConnectedState({\n studentCastingEnabled,\n onDisconnect,\n onToggleStudentCasting\n}: ViviSettingsConnectedStateProps): JSX.Element {\n return (\n <>\n <div className='text-center d-flex flex-column align-items-center pt-5'>\n <img className={`${styles.image} img-fluid`} role='presentation' src={ImageUrls.Devices.VIVI_CONNECTED} />\n\n <h2 className='h3 mt-3'>\n <Text namespace={namespace} phrase='connectedStateHeading' />\n </h2>\n\n <p className='mb-3 w-50'>\n <Text namespace={namespace} phrase='connectedStateInfo' />\n </p>\n\n <IconButton\n svgName={cvSvgLibrary.Delete}\n className='btn btn-outline-dark'\n onClick={onDisconnect}\n >\n <Text namespace={namespace} phrase='disconnectViviButton' />\n </IconButton>\n \n <div>\n <div className='rounded-3 px-4 py-3 mt-3 bg-light-blue text-info text-dark text-start'>\n <h3 className='h6 mb-3'>\n <Text namespace={namespace} phrase='instructionsHeading' />\n </h3>\n\n <SettingsOrderedListItem number={1}>\n <Text namespace={namespace} phrase='instructionsStep1' />\n </SettingsOrderedListItem>\n\n <SettingsOrderedListItem number={2} className='mt-2'>\n <Text namespace={namespace} phrase='instructionsStep2Fragment1' />\n <SvgContainer svgName={cvSvgLibrary.Vivi} size={SvgContainerSize.Small} />\n <Text namespace={namespace} phrase='instructionsStep2Fragment2' />\n </SettingsOrderedListItem>\n\n <SettingsOrderedListItem number={3} className='mt-2'>\n <Text namespace={namespace} phrase='instructionsStep3' />\n </SettingsOrderedListItem>\n\n <SettingsOrderedListItem number={4} className='my-2'>\n <Text namespace={namespace} phrase='instructionsStep4Fragment1' />\n <SvgContainer svgName={cvSvgLibrary.Cast} size={SvgContainerSize.Small} />\n <Text namespace={namespace} phrase='instructionsStep4Fragment2' />\n </SettingsOrderedListItem>\n\n <a\n href={ArticleHelper.getLiteArticle(LiteSupportArticle.ViviIntegration)}\n target='_blank'\n className='text-info'\n >\n <Text namespace={namespace} phrase='learnMore' />\n </a>\n </div>\n <div className='rounded-3 px-4 py-3 mt-3 border text-dark text-start'>\n <div className='d-flex flex-row'>\n <div className='flex-grow-1'>\n <h3 className='h6 mb-2'>\n <Text namespace={namespace} phrase='studentCastingHeading' />\n </h3>\n <p className='mb-0'>\n <Text namespace={namespace} phrase='studentCastingInfo' />\n </p>\n </div>\n <div className='ms-3'>\n <ToggleSwitch\n onClick={() => {\n onToggleStudentCasting();\n }}\n on={studentCastingEnabled}\n disabled={false}\n />\n </div>\n </div>\n </div>\n </div>\n </div>\n </>\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PopupViewProps } from 'libs/shared/interfaces';\n\nconst namespace = 'settings.viviSettings.disconnectPopup';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ViviSettingsDisconnectPopupProps extends PopupViewProps {\n showSpinner: boolean;\n onClickConfirm: () => void;\n}\n\nexport function ViviSettingsDisconnectPopup(props: ViviSettingsDisconnectPopupProps): JSX.Element {\n const { showSpinner, onClickConfirm } = props;\n\n return (\n <Popup title={getPhrase('disconnectPopupTitle')} closePopup={props.closePopup}>\n <p>\n <Text namespace={namespace} phrase='disconnectPopupWarning' />\n </p>\n\n <p>\n <Text namespace={namespace} phrase='disconnectPopupSubWarning' />\n </p>\n\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.closePopup} />\n <PopupButtons.Submit\n variant='danger'\n text={getPhrase('disconnectPopupConfirmButton')}\n onClick={onClickConfirm}\n showSpinner={showSpinner}\n />\n </PopupButtons>\n </Popup>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"image\":\"XPUBh\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport styles from './vivi-settings-connected-state.scss';\n\nconst namespace = 'settings.viviSettings.disconnectedState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ViviSettingsDisconnectedStateProps {\n onConnect: () => void;\n onTroubleshoot: () => void;\n}\n\nexport function ViviSettingsDisconnectedState({\n onConnect,\n onTroubleshoot\n}: ViviSettingsDisconnectedStateProps): JSX.Element {\n return (\n <div className='text-center d-flex flex-column align-items-center pt-5'>\n <img className={`${styles.image} img-fluid`} role='presentation' src={ImageUrls.Devices.VIVI_DISCONNECTED} />\n\n <h2 className='h3 mt-3'>\n {getPhrase('disconnectedStateHeading')}\n </h2>\n\n <p className='mb-3 w-50'>\n {getPhrase('disconnectedStateInfo')}\n </p>\n\n <IconButton\n svgName={cvSvgLibrary.NewWindow}\n className='btn btn-dark mb-3'\n onClick={onConnect}\n >\n {getPhrase('connectViviButton')}\n </IconButton>\n\n <a\n onClick={onTroubleshoot}\n className='text-info'\n role='button'\n >\n <Text namespace={namespace} phrase='troubleshootLink' />\n </a>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"container\":\"vgMQp\",\"image\":\"cZeWA\",\"heading\":\"ESuYg\",\"button\":\"zFxDC\"};","import React from 'react';\n\nimport styles from './vivi-settings-partial-loaded-state.scss';\n\nexport function ViviSettingsPartialLoadingState(): JSX.Element {\n return (\n <div className={`${styles.container} pt-5`}>\n <div className={`${styles.image} partial-loading-background mb-2 rounded`} />\n <div className={`${styles.heading} partial-loading-background mb-2 rounded`} />\n <div className={`${styles.button} partial-loading-background mb-2 rounded`} />\n </div>\n );\n}","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LocationUtils } from 'libs/common/backbone/core';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, EventVersion, IntegrationsDescriptor, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { IntegrationId } from 'libs/shared/enums/IntegrationId';\nimport { IntegrationStatus } from 'libs/shared/enums/IntegrationStatus';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { SettingKind } from 'libs/shared/enums/SettingKind';\nimport { SettingName } from 'libs/shared/enums/SettingName';\nimport { LiteSupportArticle } from 'libs/shared/enums/SupportArticle';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { PlayerIntegrationsRequests } from 'libs/shared/flight-requests/PlayerIntegrationsRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, CurrentUser } from 'libs/shared/interfaces';\nimport { ViviSettingsViewQueryParams } from 'libs/shared/interfaces/query-params/ViviSettingsViewQueryParams';\nimport { ArticleHelper } from 'libs/shared/utils/ArticleHelper';\n\nimport { SettingsLayout } from 'apps/settings/components/settings-layout/SettingsLayout';\n\nimport { ViviSettingsConnectedState } from './connected-state/ViviSettingsConnectedState';\nimport { ViviSettingsDisconnectPopup } from './disconnect-popup/ViviSettingsDisconnectPopup';\nimport { ViviSettingsDisconnectedState } from './disconnected-state/ViviSettingsDisconnectedState';\nimport { ViviSettingsPartialLoadingState } from './partial-loading-state/VIviSettingsPartialLoadingState';\n\n// Don't alter the Vivi constants below without consulting with Cam or Boris\nconst VIVI_CONNECT_ENDPOINT = 'vivi/connect';\nconst VIVI_OAUTH_RETURN_URL_PATH = 'settings/integrations/vivi';\n\nconst namespace = 'settings.viviSettings';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ViviSettingsViewProps {\n queryParams?: ViviSettingsViewQueryParams;\n}\n\nexport function ViviSettingsView({ queryParams }: ViviSettingsViewProps): JSX.Element {\n useSetPageMetadata({ title: getPhrase('pageTitle') });\n\n const [ showDisconnectPopup, setShowDisconnectPopup ] = React.useState(false);\n const [ showSpinner, setShowSpinner ] = React.useState(false);\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const viviStatus = Flight.useBasicFetch<IntegrationStatus>(\n currentUser.data?.isAuthenticated && PlayerIntegrationsRequests.getViviIntegrationStatus()\n );\n const {\n hasEnabledViviPlayback,\n hasEnabledViviStudentCasting,\n isLoadingSettings,\n updateSetting\n } = useSettings(LocationContext.Settings);\n const alerts = useAlerts();\n const dispatch = useDispatch();\n\n const isLoadingUser = currentUser.isFetching;\n const isLoadingStatus = viviStatus.isFetching;\n const isConnected = !isLoadingStatus && viviStatus.data === IntegrationStatus.Connected;\n const requiresConnection = !isLoadingStatus && !isConnected;\n\n /*\n * This effect will try to enable the Vivi playback setting domain option \n * when (and if) the OAuth flow successfully completes. It does not enable the domain \n * setting if the user just navigates to the Vivi settings page via normal browsing.\n */\n React.useEffect(() => {\n // Ensure all data has been loaded\n if (isLoadingUser || isLoadingStatus || isLoadingSettings) return;\n\n // Ensure we have just returned from a successful OAuth flow\n if (queryParams?.success !== 'true') return;\n\n // Ensure the integration's status is connected\n if (viviStatus.data !== IntegrationStatus.Connected) return;\n\n // Ensure the domain option is not already enabled (avoid unnecessary API calls)\n if (hasEnabledViviPlayback) return;\n\n const viviPlaybackSetting = {\n name: SettingName.HasEnabledViviPlayback,\n value: true,\n kind: SettingKind.Temporary\n };\n\n const onSuccess = () => alerts.success(getPhrase('enableViviSuccess'));\n const onError = () => alerts.error(getPhrase('enableViviError'));\n\n updateSetting(currentUser.data?.customerId, viviPlaybackSetting, onSuccess, onError);\n }, [ isLoadingUser, isLoadingStatus, isLoadingSettings ]);\n\n /**\n * This function will kick-off the Vivi OAuth flow. It will redirect the user to the Vivi login page.\n * After the user has logged in, they will be redirected back to the Lite app.\n */\n function connectToVivi(): void {\n if (config.isFetching) return;\n \n const connectEndpoint = UrlHelper.safeUrlConcat(config.data.integrationsApiUrl ?? '', VIVI_CONNECT_ENDPOINT);\n const returnUrl = UrlHelper.safeUrlConcat(location.origin, VIVI_OAUTH_RETURN_URL_PATH);\n const connectUrl = UrlHelper.urlBuilder(connectEndpoint, { returnUrl });\n \n location.href = connectUrl;\n }\n\n async function disconnectVivi(): Promise<void> {\n if (!currentUser.data.isAuthenticated)\n return;\n\n try {\n setShowSpinner(true);\n await Flight.fetchAsync(dispatch, PlayerIntegrationsRequests.disconnectViviAccount());\n setShowDisconnectPopup(false);\n \n alerts.success(getPhrase('disconnectPopupSuccessMessage'));\n } catch (e) {\n console.error(e);\n alerts.error(getPhrase('disconnectPopupErrorMessage'));\n } finally {\n setShowSpinner(false);\n }\n }\n\n function openTroubleshootingArticle(): void {\n AnalyticsHelper.logUserAction({\n id: IntegrationId.Vivi,\n status: viviStatus.data\n }, {\n entity: EntityType.Integration,\n actionType: UserAction.Click,\n workflowPhase: WorkflowPhase.Complete,\n location: LocationContext.Settings,\n descriptor: IntegrationsDescriptor.Troubleshoot,\n eventVersion: EventVersion.V1\n });\n\n LocationUtils.PageLoad(`${ArticleHelper.getLiteArticle(LiteSupportArticle.ViviIntegration)}#troubleshooting`, true);\n }\n\n function toggleViviStudentCasting(): void {\n const enable = !hasEnabledViviStudentCasting;\n const successPhraseKey = enable ? 'enableStudentCastingSuccess' : 'disableStudentCastingSuccess';\n const errorPhraseKey = enable ? 'enableStudentCastingError' : 'disableStudentCastingError';\n\n const viviStudentCastingSetting = {\n name: SettingName.HasEnabledViviStudentCasting,\n value: enable,\n kind: SettingKind.Temporary\n };\n\n const onSuccess = () => alerts.success(getPhrase(successPhraseKey));\n const onError = () => alerts.error(getPhrase(errorPhraseKey));\n\n updateSetting(currentUser.data?.customerId, viviStudentCastingSetting, onSuccess, onError);\n }\n\n return (\n <SettingsLayout\n heading={getPhrase('heading')}\n breadcrumbs={[getPhrase('heading')]}\n requiredPermissions={PermissionName.ManageIntegrations}\n >\n { showDisconnectPopup &&\n <ViviSettingsDisconnectPopup\n showSpinner={showSpinner}\n onClickConfirm={disconnectVivi}\n closePopup={() => setShowDisconnectPopup(false)}\n /> }\n { isLoadingStatus && <ViviSettingsPartialLoadingState /> }\n { isConnected &&\n <ViviSettingsConnectedState\n studentCastingEnabled={hasEnabledViviStudentCasting}\n onDisconnect={() => setShowDisconnectPopup(true)}\n onToggleStudentCasting={toggleViviStudentCasting}\n /> }\n { requiresConnection &&\n <ViviSettingsDisconnectedState\n onConnect={connectToVivi}\n onTroubleshoot={openTroubleshootingArticle}\n /> }\n </SettingsLayout>\n );\n}"],"names":["IntegrationId","OnlineSupportArticle","LiteSupportArticle","namespace","useCanAccessSettings","requiredPermissions","hasPermissions","settingsGroups","currentRoute","application","some","group","modules","settingsModule","appLink","action","SettingsLayout","props","canAccess","replace","breadcrumbs","map","name","i","active","length","className","heading","headingButton","description","children","SettingsOrderedListItem","number","ViviSettingsConnectedState","studentCastingEnabled","onDisconnect","onToggleStudentCasting","role","src","ImageUrls","Text","phrase","IconButton","svgName","onClick","SvgContainer","size","S","href","ArticleHelper","target","ToggleSwitch","on","disabled","getPhrase","LanguageService","ViviSettingsDisconnectPopup","showSpinner","onClickConfirm","Popup","title","closePopup","PopupButtons","variant","text","ViviSettingsDisconnectedState","onConnect","onTroubleshoot","ViviSettingsPartialLoadingState","VIVI_CONNECT_ENDPOINT","VIVI_OAUTH_RETURN_URL_PATH","ViviSettingsView","queryParams","useSetPageMetadata","showDisconnectPopup","setShowDisconnectPopup","setShowSpinner","currentUser","UserRequests","config","ConfigRequests","viviStatus","data","isAuthenticated","PlayerIntegrationsRequests","useSettings","hasEnabledViviPlayback","hasEnabledViviStudentCasting","isLoadingSettings","updateSetting","alerts","dispatch","isLoadingUser","isFetching","isLoadingStatus","isConnected","IntegrationStatus","I","requiresConnection","success","viviPlaybackSetting","SettingName","value","kind","SettingKind","customerId","error","PermissionName","console","enable","successPhraseKey","errorPhraseKey","viviStudentCastingSetting","connectEndpoint","UrlHelper","integrationsApiUrl","returnUrl","location","origin","connectUrl","AnalyticsHelper","id","status","entity","actionType","workflowPhase","descriptor","eventVersion"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"scripts/6413-caaae6a383-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/enums/IntegrationId.ts","file:///app/packages/libs/shared/src/enums/SupportArticle.ts","file:///app/packages/projects/lite/src/apps/settings/components/settings-layout/SettingsLayout.tsx","file:///app/packages/projects/lite/src/apps/settings/components/settings-ordered-list-item/settings-ordered-list-item.scss","file:///app/packages/projects/lite/src/apps/settings/components/settings-ordered-list-item/SettingsOrderedListItem.tsx","file:///app/packages/projects/lite/src/apps/settings/views/integration-settings/vivi-settings/connected-state/vivi-settings-connected-state.scss","file:///app/packages/projects/lite/src/apps/settings/views/integration-settings/vivi-settings/connected-state/ViviSettingsConnectedState.tsx","file:///app/packages/projects/lite/src/apps/settings/views/integration-settings/vivi-settings/disconnect-popup/ViviSettingsDisconnectPopup.tsx","file:///app/packages/projects/lite/src/apps/settings/views/integration-settings/vivi-settings/disconnected-state/vivi-settings-connected-state.scss","file:///app/packages/projects/lite/src/apps/settings/views/integration-settings/vivi-settings/disconnected-state/ViviSettingsDisconnectedState.tsx","file:///app/packages/projects/lite/src/apps/settings/views/integration-settings/vivi-settings/partial-loading-state/vivi-settings-partial-loaded-state.scss","file:///app/packages/projects/lite/src/apps/settings/views/integration-settings/vivi-settings/partial-loading-state/VIviSettingsPartialLoadingState.tsx","file:///app/packages/projects/lite/src/apps/settings/views/integration-settings/vivi-settings/ViviSettingsView.tsx"],"sourcesContent":["export enum IntegrationId {\n GoogleClassroom = 'google-classroom',\n MicrosoftTeams = 'microsoft-teams',\n Vivi = 'vivi',\n AppleTv = 'apply-tv'\n}","// Article name mapped to article ID on support site. Used by `ArticleHelper`\n\nexport enum OnlineSupportArticle {\n AddToPlaylist = '115005679748',\n EditSsoAccounts = '8202508040345',\n\n // LE\n LibraryEditor = '360001974533',\n VideoAccess = '360000153947',\n AddFromOnline = '360011718234',\n UploadToLibraryEditor = '360012069334',\n PBTErrorCodes = '360012421153',\n ManuelReview = '360020004534',\n LibraryReview = '360000163788',\n}\n\nexport enum LiteSupportArticle {\n Integrations = '4407268725529',\n Classrooms = '4405362551833',\n MakeInteractive = '4405370510873',\n EditSsoAccounts = '8202605666073',\n UploadToLibraryEditor = '10672936659865',\n AddFromLite = '10671345281561',\n ManageSsoYearGroups = '14691130889241',\n ContentReview = '18525199576601',\n ContentPermissions = '14692125209497',\n AccessSettings = '27927466562201',\n ContentGuidelines = '24133696186009',\n FoxtelFaq = '24133519542169',\n ViviIntegration = '23826297956377',\n AppleTvIntegration = '25832373739929',\n RssFeed = '32567445635097',\n ManageGroupPermissions = '35407217335705'\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { useGetSettingsGroups } from 'apps/settings/hooks/useGetSettingsGroups';\n\nconst namespace = 'settings.settingsLayout';\n\n/**\n * Checks if the current user has permission to access the settings module\n */\nexport const useCanAccessSettings = (requiredPermissions: PermissionName | PermissionName[]): boolean => {\n const { hasPermissions } = usePermissions();\n const settingsGroups = useGetSettingsGroups();\n\n /**\n * TODO: Update all settings pages to pasas required permissions, because checking the \n * `useGetSettingsGroups()` values clearly doesnt work for settings pages with multiple\n * applinks inside of them. - Sha\n */\n if (requiredPermissions)\n return hasPermissions(requiredPermissions);\n\n const currentRoute = Core.AppLinkHelper.getCurrentAppLink();\n\n /**\n * Allows us to have popups sitting in other locations be used\n * by our settings pages. For example the manage video access popup\n * in the \"videos with restricted access\" page - Sha\n */\n if (currentRoute.application !== AppChannels.SETTINGS)\n return true;\n\n return settingsGroups.some(group => {\n return group.modules.some(settingsModule => {\n if ('appLink' in settingsModule) {\n return settingsModule.appLink.action === currentRoute.action;\n }\n\n return false;\n });\n });\n};\n\ninterface SettingsLayoutProps {\n heading: string;\n breadcrumbs: string[];\n description?: string;\n requiredPermissions?: PermissionName | PermissionName[];\n headingButton?: () => JSX.Element;\n}\n\nexport function SettingsLayout(props: React.PropsWithChildren<SettingsLayoutProps>): JSX.Element {\n const canAccess = useCanAccessSettings(props.requiredPermissions);\n\n React.useEffect(() => {\n if (!canAccess) {\n Core.AppLinkHelper.trigger({\n application: AppChannels.SETTINGS,\n action: Actions.Settings.HOME\n }, { replace: true });\n }\n }, [canAccess]);\n\n if (!canAccess)\n return <></>;\n\n const breadcrumbs = props.breadcrumbs.map((name, i) => ({\n name,\n appLink: {\n application: AppChannels.SETTINGS,\n action: Actions.Settings.HOME\n },\n active: i === props.breadcrumbs.length - 1\n }));\n\n return (\n <div className='px-3'>\n <div className='d-flex align-items-center justify-content-between'>\n <h1 className='h2'>{props.heading}</h1>\n {props.headingButton?.()}\n </div>\n <div className='pb-3'>\n <Breadcrumbs\n breadcrumbs={[\n {\n name: LanguageService.getPhrase(namespace, 'settingsBreadcrumb'),\n appLink: {\n application: AppChannels.SETTINGS,\n action: Actions.Settings.HOME\n }\n },\n ...breadcrumbs\n ]}\n />\n </div>\n {props.description &&\n <>\n <p>{props.description}</p>\n <hr />\n </>\n }\n\n {props.children}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"numberContainer\":\"JBRDi\"};","import React from 'react';\n\nimport styles from './settings-ordered-list-item.scss';\n\ninterface SettingsOrderedListItemProps {\n number: number;\n children: React.ReactNode;\n className?: string;\n}\n\nexport function SettingsOrderedListItem({ number, children, className = '' }: SettingsOrderedListItemProps): JSX.Element {\n return (\n <div className={`d-flex align-items-center mb-3 ${className}`}>\n <div className={`d-flex align-items-center justify-content-center bg-dark rounded-circle ${styles.numberContainer}`}>\n <span className='text-light'>{number}</span>\n </div>\n <div className='ms-2'>\n {children}\n </div>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"image\":\"pt8vC\"};","import React from 'react';\n\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\nimport { LiteSupportArticle } from 'libs/shared/enums/SupportArticle';\nimport { ArticleHelper } from 'libs/shared/utils/ArticleHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport { SettingsOrderedListItem } from 'apps/settings/components/settings-ordered-list-item/SettingsOrderedListItem';\n\nimport styles from './vivi-settings-connected-state.scss';\n\nconst namespace = 'settings.viviSettings.connectedState';\n\ninterface ViviSettingsConnectedStateProps {\n studentCastingEnabled: boolean;\n onDisconnect: () => void;\n onToggleStudentCasting: () => void;\n}\n\nexport function ViviSettingsConnectedState({\n studentCastingEnabled,\n onDisconnect,\n onToggleStudentCasting\n}: ViviSettingsConnectedStateProps): JSX.Element {\n return (\n <>\n <div className='text-center d-flex flex-column align-items-center pt-5'>\n <img className={`${styles.image} img-fluid`} role='presentation' src={ImageUrls.Devices.VIVI_CONNECTED} />\n\n <h2 className='h3 mt-3'>\n <Text namespace={namespace} phrase='connectedStateHeading' />\n </h2>\n\n <p className='mb-3 w-50'>\n <Text namespace={namespace} phrase='connectedStateInfo' />\n </p>\n\n <IconButton\n svgName={cvSvgLibrary.Delete}\n className='btn btn-outline-dark'\n onClick={onDisconnect}\n >\n <Text namespace={namespace} phrase='disconnectViviButton' />\n </IconButton>\n \n <div>\n <div className='rounded-3 px-4 py-3 mt-3 bg-light-blue text-info text-dark text-start'>\n <h3 className='h6 mb-3'>\n <Text namespace={namespace} phrase='instructionsHeading' />\n </h3>\n\n <SettingsOrderedListItem number={1}>\n <Text namespace={namespace} phrase='instructionsStep1' />\n </SettingsOrderedListItem>\n\n <SettingsOrderedListItem number={2} className='mt-2'>\n <Text namespace={namespace} phrase='instructionsStep2Fragment1' />\n <SvgContainer svgName={cvSvgLibrary.Vivi} size={SvgContainerSize.Small} />\n <Text namespace={namespace} phrase='instructionsStep2Fragment2' />\n </SettingsOrderedListItem>\n\n <SettingsOrderedListItem number={3} className='mt-2'>\n <Text namespace={namespace} phrase='instructionsStep3' />\n </SettingsOrderedListItem>\n\n <SettingsOrderedListItem number={4} className='my-2'>\n <Text namespace={namespace} phrase='instructionsStep4Fragment1' />\n <SvgContainer svgName={cvSvgLibrary.Cast} size={SvgContainerSize.Small} />\n <Text namespace={namespace} phrase='instructionsStep4Fragment2' />\n </SettingsOrderedListItem>\n\n <a\n href={ArticleHelper.getLiteArticle(LiteSupportArticle.ViviIntegration)}\n target='_blank'\n className='text-info'\n >\n <Text namespace={namespace} phrase='learnMore' />\n </a>\n </div>\n <div className='rounded-3 px-4 py-3 mt-3 border text-dark text-start'>\n <div className='d-flex flex-row'>\n <div className='flex-grow-1'>\n <h3 className='h6 mb-2'>\n <Text namespace={namespace} phrase='studentCastingHeading' />\n </h3>\n <p className='mb-0'>\n <Text namespace={namespace} phrase='studentCastingInfo' />\n </p>\n </div>\n <div className='ms-3'>\n <ToggleSwitch\n onClick={() => {\n onToggleStudentCasting();\n }}\n on={studentCastingEnabled}\n disabled={false}\n />\n </div>\n </div>\n </div>\n </div>\n </div>\n </>\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PopupViewProps } from 'libs/shared/interfaces';\n\nconst namespace = 'settings.viviSettings.disconnectPopup';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ViviSettingsDisconnectPopupProps extends PopupViewProps {\n showSpinner: boolean;\n onClickConfirm: () => void;\n}\n\nexport function ViviSettingsDisconnectPopup(props: ViviSettingsDisconnectPopupProps): JSX.Element {\n const { showSpinner, onClickConfirm } = props;\n\n return (\n <Popup title={getPhrase('disconnectPopupTitle')} closePopup={props.closePopup}>\n <p>\n <Text namespace={namespace} phrase='disconnectPopupWarning' />\n </p>\n\n <p>\n <Text namespace={namespace} phrase='disconnectPopupSubWarning' />\n </p>\n\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.closePopup} />\n <PopupButtons.Submit\n variant='danger'\n text={getPhrase('disconnectPopupConfirmButton')}\n onClick={onClickConfirm}\n showSpinner={showSpinner}\n />\n </PopupButtons>\n </Popup>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"image\":\"XPUBh\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport styles from './vivi-settings-connected-state.scss';\n\nconst namespace = 'settings.viviSettings.disconnectedState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ViviSettingsDisconnectedStateProps {\n onConnect: () => void;\n onTroubleshoot: () => void;\n}\n\nexport function ViviSettingsDisconnectedState({\n onConnect,\n onTroubleshoot\n}: ViviSettingsDisconnectedStateProps): JSX.Element {\n return (\n <div className='text-center d-flex flex-column align-items-center pt-5'>\n <img className={`${styles.image} img-fluid`} role='presentation' src={ImageUrls.Devices.VIVI_DISCONNECTED} />\n\n <h2 className='h3 mt-3'>\n {getPhrase('disconnectedStateHeading')}\n </h2>\n\n <p className='mb-3 w-50'>\n {getPhrase('disconnectedStateInfo')}\n </p>\n\n <IconButton\n svgName={cvSvgLibrary.NewWindow}\n className='btn btn-dark mb-3'\n onClick={onConnect}\n >\n {getPhrase('connectViviButton')}\n </IconButton>\n\n <a\n onClick={onTroubleshoot}\n className='text-info'\n role='button'\n >\n <Text namespace={namespace} phrase='troubleshootLink' />\n </a>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"container\":\"vgMQp\",\"image\":\"cZeWA\",\"heading\":\"ESuYg\",\"button\":\"zFxDC\"};","import React from 'react';\n\nimport styles from './vivi-settings-partial-loaded-state.scss';\n\nexport function ViviSettingsPartialLoadingState(): JSX.Element {\n return (\n <div className={`${styles.container} pt-5`}>\n <div className={`${styles.image} partial-loading-background mb-2 rounded`} />\n <div className={`${styles.heading} partial-loading-background mb-2 rounded`} />\n <div className={`${styles.button} partial-loading-background mb-2 rounded`} />\n </div>\n );\n}","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LocationUtils } from 'libs/common/backbone/core';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, EventVersion, IntegrationsDescriptor, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { IntegrationId } from 'libs/shared/enums/IntegrationId';\nimport { IntegrationStatus } from 'libs/shared/enums/IntegrationStatus';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { SettingKind } from 'libs/shared/enums/SettingKind';\nimport { SettingName } from 'libs/shared/enums/SettingName';\nimport { LiteSupportArticle } from 'libs/shared/enums/SupportArticle';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { PlayerIntegrationsRequests } from 'libs/shared/flight-requests/PlayerIntegrationsRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, CurrentUser } from 'libs/shared/interfaces';\nimport { ViviSettingsViewQueryParams } from 'libs/shared/interfaces/query-params/ViviSettingsViewQueryParams';\nimport { ArticleHelper } from 'libs/shared/utils/ArticleHelper';\n\nimport { SettingsLayout } from 'apps/settings/components/settings-layout/SettingsLayout';\n\nimport { ViviSettingsConnectedState } from './connected-state/ViviSettingsConnectedState';\nimport { ViviSettingsDisconnectPopup } from './disconnect-popup/ViviSettingsDisconnectPopup';\nimport { ViviSettingsDisconnectedState } from './disconnected-state/ViviSettingsDisconnectedState';\nimport { ViviSettingsPartialLoadingState } from './partial-loading-state/VIviSettingsPartialLoadingState';\n\n// Don't alter the Vivi constants below without consulting with Cam or Boris\nconst VIVI_CONNECT_ENDPOINT = 'vivi/connect';\nconst VIVI_OAUTH_RETURN_URL_PATH = 'settings/integrations/vivi';\n\nconst namespace = 'settings.viviSettings';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ViviSettingsViewProps {\n queryParams?: ViviSettingsViewQueryParams;\n}\n\nexport function ViviSettingsView({ queryParams }: ViviSettingsViewProps): JSX.Element {\n useSetPageMetadata({ title: getPhrase('pageTitle') });\n\n const [ showDisconnectPopup, setShowDisconnectPopup ] = React.useState(false);\n const [ showSpinner, setShowSpinner ] = React.useState(false);\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const viviStatus = Flight.useBasicFetch<IntegrationStatus>(\n currentUser.data?.isAuthenticated && PlayerIntegrationsRequests.getViviIntegrationStatus()\n );\n const {\n hasEnabledViviPlayback,\n hasEnabledViviStudentCasting,\n isLoadingSettings,\n updateSetting\n } = useSettings(LocationContext.Settings);\n const alerts = useAlerts();\n const dispatch = useDispatch();\n\n const isLoadingUser = currentUser.isFetching;\n const isLoadingStatus = viviStatus.isFetching;\n const isConnected = !isLoadingStatus && viviStatus.data === IntegrationStatus.Connected;\n const requiresConnection = !isLoadingStatus && !isConnected;\n\n /*\n * This effect will try to enable the Vivi playback setting domain option \n * when (and if) the OAuth flow successfully completes. It does not enable the domain \n * setting if the user just navigates to the Vivi settings page via normal browsing.\n */\n React.useEffect(() => {\n // Ensure all data has been loaded\n if (isLoadingUser || isLoadingStatus || isLoadingSettings) return;\n\n // Ensure we have just returned from a successful OAuth flow\n if (queryParams?.success !== 'true') return;\n\n // Ensure the integration's status is connected\n if (viviStatus.data !== IntegrationStatus.Connected) return;\n\n // Ensure the domain option is not already enabled (avoid unnecessary API calls)\n if (hasEnabledViviPlayback) return;\n\n const viviPlaybackSetting = {\n name: SettingName.HasEnabledViviPlayback,\n value: true,\n kind: SettingKind.FeatureFlag\n };\n\n const onSuccess = () => alerts.success(getPhrase('enableViviSuccess'));\n const onError = () => alerts.error(getPhrase('enableViviError'));\n\n updateSetting(currentUser.data?.customerId, viviPlaybackSetting, onSuccess, onError);\n }, [ isLoadingUser, isLoadingStatus, isLoadingSettings ]);\n\n /**\n * This function will kick-off the Vivi OAuth flow. It will redirect the user to the Vivi login page.\n * After the user has logged in, they will be redirected back to the Lite app.\n */\n function connectToVivi(): void {\n if (config.isFetching) return;\n \n const connectEndpoint = UrlHelper.safeUrlConcat(config.data.integrationsApiUrl ?? '', VIVI_CONNECT_ENDPOINT);\n const returnUrl = UrlHelper.safeUrlConcat(location.origin, VIVI_OAUTH_RETURN_URL_PATH);\n const connectUrl = UrlHelper.urlBuilder(connectEndpoint, { returnUrl });\n \n location.href = connectUrl;\n }\n\n async function disconnectVivi(): Promise<void> {\n if (!currentUser.data.isAuthenticated)\n return;\n\n try {\n setShowSpinner(true);\n await Flight.fetchAsync(dispatch, PlayerIntegrationsRequests.disconnectViviAccount());\n setShowDisconnectPopup(false);\n \n alerts.success(getPhrase('disconnectPopupSuccessMessage'));\n } catch (e) {\n console.error(e);\n alerts.error(getPhrase('disconnectPopupErrorMessage'));\n } finally {\n setShowSpinner(false);\n }\n }\n\n function openTroubleshootingArticle(): void {\n AnalyticsHelper.logUserAction({\n id: IntegrationId.Vivi,\n status: viviStatus.data\n }, {\n entity: EntityType.Integration,\n actionType: UserAction.Click,\n workflowPhase: WorkflowPhase.Complete,\n location: LocationContext.Settings,\n descriptor: IntegrationsDescriptor.Troubleshoot,\n eventVersion: EventVersion.V1\n });\n\n LocationUtils.PageLoad(`${ArticleHelper.getLiteArticle(LiteSupportArticle.ViviIntegration)}#troubleshooting`, true);\n }\n\n function toggleViviStudentCasting(): void {\n const enable = !hasEnabledViviStudentCasting;\n const successPhraseKey = enable ? 'enableStudentCastingSuccess' : 'disableStudentCastingSuccess';\n const errorPhraseKey = enable ? 'enableStudentCastingError' : 'disableStudentCastingError';\n\n const viviStudentCastingSetting = {\n name: SettingName.HasEnabledViviStudentCasting,\n value: enable,\n kind: SettingKind.FeatureFlag\n };\n\n const onSuccess = () => alerts.success(getPhrase(successPhraseKey));\n const onError = () => alerts.error(getPhrase(errorPhraseKey));\n\n updateSetting(currentUser.data?.customerId, viviStudentCastingSetting, onSuccess, onError);\n }\n\n return (\n <SettingsLayout\n heading={getPhrase('heading')}\n breadcrumbs={[getPhrase('heading')]}\n requiredPermissions={PermissionName.ManageIntegrations}\n >\n { showDisconnectPopup &&\n <ViviSettingsDisconnectPopup\n showSpinner={showSpinner}\n onClickConfirm={disconnectVivi}\n closePopup={() => setShowDisconnectPopup(false)}\n /> }\n { isLoadingStatus && <ViviSettingsPartialLoadingState /> }\n { isConnected &&\n <ViviSettingsConnectedState\n studentCastingEnabled={hasEnabledViviStudentCasting}\n onDisconnect={() => setShowDisconnectPopup(true)}\n onToggleStudentCasting={toggleViviStudentCasting}\n /> }\n { requiresConnection &&\n <ViviSettingsDisconnectedState\n onConnect={connectToVivi}\n onTroubleshoot={openTroubleshootingArticle}\n /> }\n </SettingsLayout>\n );\n}"],"names":["IntegrationId","OnlineSupportArticle","LiteSupportArticle","namespace","useCanAccessSettings","requiredPermissions","hasPermissions","settingsGroups","currentRoute","application","some","group","modules","settingsModule","appLink","action","SettingsLayout","props","canAccess","replace","breadcrumbs","map","name","i","active","length","className","heading","headingButton","description","children","SettingsOrderedListItem","number","ViviSettingsConnectedState","studentCastingEnabled","onDisconnect","onToggleStudentCasting","role","src","ImageUrls","Text","phrase","IconButton","svgName","onClick","SvgContainer","size","S","href","ArticleHelper","target","ToggleSwitch","on","disabled","getPhrase","LanguageService","ViviSettingsDisconnectPopup","showSpinner","onClickConfirm","Popup","title","closePopup","PopupButtons","variant","text","ViviSettingsDisconnectedState","onConnect","onTroubleshoot","ViviSettingsPartialLoadingState","VIVI_CONNECT_ENDPOINT","VIVI_OAUTH_RETURN_URL_PATH","ViviSettingsView","queryParams","useSetPageMetadata","showDisconnectPopup","setShowDisconnectPopup","setShowSpinner","currentUser","UserRequests","config","ConfigRequests","viviStatus","data","isAuthenticated","PlayerIntegrationsRequests","useSettings","hasEnabledViviPlayback","hasEnabledViviStudentCasting","isLoadingSettings","updateSetting","alerts","dispatch","isLoadingUser","isFetching","isLoadingStatus","isConnected","IntegrationStatus","I","requiresConnection","success","viviPlaybackSetting","SettingName","value","kind","SettingKind","customerId","error","PermissionName","console","enable","successPhraseKey","errorPhraseKey","viviStudentCastingSetting","connectEndpoint","UrlHelper","integrationsApiUrl","returnUrl","location","origin","connectUrl","AnalyticsHelper","id","status","entity","actionType","workflowPhase","descriptor","eventVersion"],"sourceRoot":""}
|