@clickview/lite 0.75.0-rc.8 → 0.75.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 +1 -1
- package/dist/css/{7103-lite-fef3024f61.chunk.css → 2878-lite-d8e0bf912a.chunk.css} +1 -1
- package/dist/css/{1243-lite-13eda8f6a0.chunk.css → 3615-lite-240342ff8e.chunk.css} +1 -1
- package/dist/css/{1867-lite-8baa8af02b.chunk.css → 4630-lite-0157b1c437.chunk.css} +1 -1
- package/dist/css/{4203-lite-9ffab89741.chunk.css → 8362-lite-10810fdef2.chunk.css} +1 -1
- package/dist/languages/en.json +1 -1
- package/dist/scripts/{104-7ee25cbbb8-lite.chunk.js → 104-da7394bcfa-lite.chunk.js} +2 -2
- package/dist/scripts/104-da7394bcfa-lite.chunk.js.map +1 -0
- package/dist/scripts/1192-bb27568f21-lite.chunk.js +2 -0
- package/dist/scripts/1192-bb27568f21-lite.chunk.js.map +1 -0
- package/dist/scripts/1199-cf2cb206b5-lite.chunk.js +2 -0
- package/dist/scripts/1199-cf2cb206b5-lite.chunk.js.map +1 -0
- package/dist/scripts/1502-9836df10cd-lite.chunk.js +2 -0
- package/dist/scripts/1502-9836df10cd-lite.chunk.js.map +1 -0
- package/dist/scripts/{1610-9ccecc428a-lite.chunk.js → 1610-0edaa98d40-lite.chunk.js} +2 -2
- package/dist/scripts/{1610-9ccecc428a-lite.chunk.js.map → 1610-0edaa98d40-lite.chunk.js.map} +1 -1
- package/dist/scripts/{7103-3b181ec69b-lite.chunk.js → 2878-487c4a8e1a-lite.chunk.js} +2 -2
- package/dist/scripts/2878-487c4a8e1a-lite.chunk.js.map +1 -0
- package/dist/scripts/{3057-1ae8087b3a-lite.chunk.js → 3057-a5bc753736-lite.chunk.js} +1 -1
- package/dist/scripts/{3057-1ae8087b3a-lite.chunk.js.map → 3057-a5bc753736-lite.chunk.js.map} +1 -1
- package/dist/scripts/3268-7be966dc82-lite.chunk.js +3 -0
- package/dist/scripts/3268-7be966dc82-lite.chunk.js.map +1 -0
- package/dist/scripts/{1243-72f3d31787-lite.chunk.js → 3615-a0da361aa5-lite.chunk.js} +2 -2
- package/dist/scripts/3615-a0da361aa5-lite.chunk.js.map +1 -0
- package/dist/scripts/{3872-6fe7371d39-lite.chunk.js → 3872-cf9a6bdae8-lite.chunk.js} +1 -1
- package/dist/scripts/{3872-6fe7371d39-lite.chunk.js.map → 3872-cf9a6bdae8-lite.chunk.js.map} +1 -1
- package/dist/scripts/4125-6d34b8b8f2-lite.chunk.js +2 -0
- package/dist/scripts/4125-6d34b8b8f2-lite.chunk.js.map +1 -0
- package/dist/scripts/4208-f22ed7a148-lite.chunk.js +2 -0
- package/dist/scripts/4208-f22ed7a148-lite.chunk.js.map +1 -0
- package/dist/scripts/4598-e25e9e03d6-lite.chunk.js +2 -0
- package/dist/scripts/4598-e25e9e03d6-lite.chunk.js.map +1 -0
- package/dist/scripts/{1867-0823a787c3-lite.chunk.js → 4630-4a35ecbf2b-lite.chunk.js} +2 -2
- package/dist/scripts/4630-4a35ecbf2b-lite.chunk.js.map +1 -0
- package/dist/scripts/6475-f019242ec2-lite.chunk.js +2 -0
- package/dist/scripts/6475-f019242ec2-lite.chunk.js.map +1 -0
- package/dist/scripts/6550-1d60d863e8-lite.chunk.js +2 -0
- package/dist/scripts/6550-1d60d863e8-lite.chunk.js.map +1 -0
- package/dist/scripts/{6695-4e01b4a18c-lite.chunk.js → 6695-4ae0acad94-lite.chunk.js} +1 -1
- package/dist/scripts/{6695-4e01b4a18c-lite.chunk.js.map → 6695-4ae0acad94-lite.chunk.js.map} +1 -1
- package/dist/scripts/6756-3c7f911759-lite.chunk.js +3 -0
- package/dist/scripts/6756-3c7f911759-lite.chunk.js.map +1 -0
- package/dist/scripts/6790-1695fcf576-lite.chunk.js +2 -0
- package/dist/scripts/6790-1695fcf576-lite.chunk.js.map +1 -0
- package/dist/scripts/{7148-50ccb48a44-lite.chunk.js → 7148-e314dd9a4e-lite.chunk.js} +2 -2
- package/dist/scripts/7148-e314dd9a4e-lite.chunk.js.map +1 -0
- package/dist/scripts/7438-35b887a48e-lite.chunk.js +2 -0
- package/dist/scripts/7438-35b887a48e-lite.chunk.js.map +1 -0
- package/dist/scripts/{8323-d6d1d07ce5-lite.chunk.js → 8323-5694456903-lite.chunk.js} +2 -2
- package/dist/scripts/{8323-d6d1d07ce5-lite.chunk.js.map → 8323-5694456903-lite.chunk.js.map} +1 -1
- package/dist/scripts/{4203-83f90f92f3-lite.chunk.js → 8362-ed5df8f4fc-lite.chunk.js} +3 -3
- package/dist/scripts/8362-ed5df8f4fc-lite.chunk.js.LICENSE.txt +1 -0
- package/dist/scripts/{4203-83f90f92f3-lite.chunk.js.map → 8362-ed5df8f4fc-lite.chunk.js.map} +1 -1
- package/dist/scripts/{8732-3e8332e620-lite.chunk.js → 8732-dc5182fb69-lite.chunk.js} +1 -1
- package/dist/scripts/{8732-3e8332e620-lite.chunk.js.map → 8732-dc5182fb69-lite.chunk.js.map} +1 -1
- package/dist/scripts/8856-08061bbec5-lite.chunk.js +2 -0
- package/dist/scripts/8856-08061bbec5-lite.chunk.js.map +1 -0
- package/dist/scripts/{8957-bc83ea1180-lite.chunk.js → 8957-b3f0dbb85d-lite.chunk.js} +1 -1
- package/dist/scripts/{8957-bc83ea1180-lite.chunk.js.map → 8957-b3f0dbb85d-lite.chunk.js.map} +1 -1
- package/dist/scripts/9042-7c30ffd4f0-lite.chunk.js +2 -0
- package/dist/scripts/9042-7c30ffd4f0-lite.chunk.js.map +1 -0
- package/dist/scripts/9134-b0ae877597-lite.chunk.js +2 -0
- package/dist/scripts/9134-b0ae877597-lite.chunk.js.map +1 -0
- package/dist/scripts/{bundle-58c25f6529.min.js → bundle-941a464ef0.min.js} +3 -3
- package/dist/scripts/{bundle-58c25f6529.min.js.map → bundle-941a464ef0.min.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/104-7ee25cbbb8-lite.chunk.js.map +0 -1
- package/dist/scripts/1074-6dadbd8187-lite.chunk.js +0 -2
- package/dist/scripts/1074-6dadbd8187-lite.chunk.js.map +0 -1
- package/dist/scripts/1192-6ac54d734b-lite.chunk.js +0 -2
- package/dist/scripts/1192-6ac54d734b-lite.chunk.js.map +0 -1
- package/dist/scripts/1199-1cddf4e0e0-lite.chunk.js +0 -2
- package/dist/scripts/1199-1cddf4e0e0-lite.chunk.js.map +0 -1
- package/dist/scripts/1243-72f3d31787-lite.chunk.js.map +0 -1
- package/dist/scripts/1867-0823a787c3-lite.chunk.js.map +0 -1
- package/dist/scripts/3268-aa893d0068-lite.chunk.js +0 -2
- package/dist/scripts/3268-aa893d0068-lite.chunk.js.map +0 -1
- package/dist/scripts/4208-3ba21abb7c-lite.chunk.js +0 -2
- package/dist/scripts/4208-3ba21abb7c-lite.chunk.js.map +0 -1
- package/dist/scripts/4598-f5120153c2-lite.chunk.js +0 -2
- package/dist/scripts/4598-f5120153c2-lite.chunk.js.map +0 -1
- package/dist/scripts/6475-502e390010-lite.chunk.js +0 -2
- package/dist/scripts/6475-502e390010-lite.chunk.js.map +0 -1
- package/dist/scripts/6550-c621babbcb-lite.chunk.js +0 -2
- package/dist/scripts/6550-c621babbcb-lite.chunk.js.map +0 -1
- package/dist/scripts/6756-20c0ab9591-lite.chunk.js +0 -3
- package/dist/scripts/6756-20c0ab9591-lite.chunk.js.map +0 -1
- package/dist/scripts/6790-df00506bec-lite.chunk.js +0 -2
- package/dist/scripts/6790-df00506bec-lite.chunk.js.map +0 -1
- package/dist/scripts/7103-3b181ec69b-lite.chunk.js.map +0 -1
- package/dist/scripts/7148-50ccb48a44-lite.chunk.js.map +0 -1
- package/dist/scripts/7438-1162aba8b6-lite.chunk.js +0 -2
- package/dist/scripts/7438-1162aba8b6-lite.chunk.js.map +0 -1
- package/dist/scripts/8856-8ac95bf4e0-lite.chunk.js +0 -2
- package/dist/scripts/8856-8ac95bf4e0-lite.chunk.js.map +0 -1
- package/dist/scripts/9003-36ab592cc5-lite.chunk.js +0 -2
- package/dist/scripts/9003-36ab592cc5-lite.chunk.js.map +0 -1
- package/dist/scripts/9042-3092af11d5-lite.chunk.js +0 -2
- package/dist/scripts/9042-3092af11d5-lite.chunk.js.map +0 -1
- package/dist/scripts/9134-7037c2c47a-lite.chunk.js +0 -2
- package/dist/scripts/9134-7037c2c47a-lite.chunk.js.map +0 -1
- /package/dist/scripts/{4203-83f90f92f3-lite.chunk.js.LICENSE.txt → 3268-7be966dc82-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{6756-20c0ab9591-lite.chunk.js.LICENSE.txt → 6756-3c7f911759-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{8323-d6d1d07ce5-lite.chunk.js.LICENSE.txt → 8323-5694456903-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{bundle-58c25f6529.min.js.LICENSE.txt → bundle-941a464ef0.min.js.LICENSE.txt} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/1199-1cddf4e0e0-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/utils/AnalyticsRequestUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/flight-requests/InteractiveResultsRequests.ts","file:///app/packages/libs/shared/src/apps/share-v2/flight-requests/ShareRequests.ts","file:///app/packages/libs/shared/src/hooks/UseBatchFetch.ts","file:///app/packages/libs/shared/src/apps/share/components/shared-object-title/SharedObjectTitle.tsx","file:///app/packages/libs/shared/src/apps/share-v2/components/share-status-indicator/share-status-indicator.scss","file:///app/packages/libs/shared/src/apps/share-v2/components/share-status-indicator/ShareStatusIndicator.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/my-shares-table-row/my-shares-table-row.scss","file:///app/packages/projects/lite/src/apps/my-shares/components/my-shares-table-row/MySharesTableRow.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/my-shares-table/MySharesTableUtils.ts","file:///app/packages/projects/lite/src/apps/my-shares/components/my-shares-table/MySharesTable.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/my-shares-table/empty-state/MySharesTableEmptyState.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/my-shares-table/partial-loading/partial-my-shares-table.scss","file:///app/packages/projects/lite/src/apps/my-shares/components/my-shares-table/partial-loading/PartialMySharesTable.tsx","file:///app/packages/projects/lite/src/shared/hooks/useSharesTable.ts"],"sourcesContent":["import { AnalyticsRequestFilter } from 'libs/shared/interfaces';\n\nexport function getAnalyticsRequestKey(baseKey: string, filter: AnalyticsRequestFilter, extra?: string): string {\n if (!filter)\n return baseKey;\n\n let key = `${baseKey}:${filter.start}:${filter.end}`;\n\n const userIdKey = Array.isArray(filter.userId) ? filter.userId.sort().join(':') : filter.userId;\n const groupIdKey = Array.isArray(filter.groupId) ? filter.groupId.sort().join(':') : filter.groupId;\n const customerIdKey = Array.isArray(filter.customerId) ? filter.customerId.sort().join(':') : filter.customerId;\n\n if (userIdKey)\n key += `:${userIdKey}`;\n\n if (groupIdKey)\n key += `:${groupIdKey}`;\n\n if (customerIdKey)\n key += `:${customerIdKey}`;\n\n if (extra)\n key += `:${extra}`;\n\n return key;\n}","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Flight } from 'libs/common/react/index';\n\nimport { MarkInteractiveAnswer } from 'libs/shared/apps/analytics/interfaces/MarkInteractiveAnswer';\nimport { InteractiveResultsReport } from 'libs/shared/apps/analytics/interfaces/requests/InteractiveResultsReport';\nimport { InteractivesPendingReviewsRequest } from 'libs/shared/apps/analytics/interfaces/requests/InteractivesPendingReviewsRequest';\nimport { AnalyticsRequestFilter, CurrentUser, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { getAnalyticsRequestKey } from 'libs/shared/utils/AnalyticsRequestUtils';\n\ninterface InteractiveResultFilters {\n currentUserId: string;\n currentCustomerId: string;\n dateRange?: { start: string, end: string }\n userIds?: string | string[];\n classroomsAndGroups?: string | string[];\n}\n\nfunction getInteractiveResultFilters(\n currentUser: CurrentUser,\n filter: AnalyticsRequestFilter\n): InteractiveResultFilters {\n return {\n currentUserId: currentUser.id,\n currentCustomerId: currentUser.customerId,\n dateRange: filter ? { start: filter.start, end: filter.end } : undefined,\n userIds: filter?.userId,\n classroomsAndGroups: filter?.groupId\n };\n}\n\nexport const InteractiveResultsRequests = {\n /** \n * This endpoint returns data with a lot of duplicated ids,\n * e.g. student answers to the same question will have the same id.\n * Because of that, we don't normalize.\n */\n interactiveResultSet(\n interactiveId: string,\n interactiveMetadataId: string,\n currentUser: CurrentUser,\n filter?: AnalyticsRequestFilter,\n includePublicResults?: boolean,\n success?: (data: InteractiveResultSet) => void,\n error?: (data: any) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: includePublicResults ?\n `/api/domain/v3/analytics/interactives/${interactiveId}/metadata/${interactiveMetadataId}` :\n `/api/domain/v2/analytics/interactives/${interactiveId}/metadata/${interactiveMetadataId}`,\n key: getAnalyticsRequestKey(`interactive:result:set:${interactiveId}:${interactiveMetadataId}`, filter),\n data: getInteractiveResultFilters(currentUser, filter),\n type: HttpVerbs.POST,\n normalize: false,\n success,\n error,\n always\n };\n },\n \n /**\n * As the response from `interactiveResultSet` isn't normalised, we need to invalidate the cache\n * to update the results data.\n */\n mark(\n interactiveId: string,\n interactiveMetadataId: string,\n answerId: string,\n data: MarkInteractiveAnswer,\n success?: () => void,\n error?: (data: any) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `/api/domain/v1/analytics/answers/${answerId}`,\n key: `mark:answer:${answerId}:${data.resultId}`,\n type: HttpVerbs.PUT,\n data,\n normalize: false,\n invalidationKeys: `interactive:result:set:${interactiveId}:${interactiveMetadataId}`,\n success,\n error,\n always\n };\n },\n\n pendingReviews(data: InteractivesPendingReviewsRequest): Flight.Request {\n return {\n url: `/api/domain/v1/analytics/interactives/pending-reviews/summary`,\n key: `interactives:pending:reviews`,\n type: HttpVerbs.POST,\n data\n };\n },\n\n interactiveResultsReport(data: InteractiveResultsReport): Flight.Request {\n return {\n url: '/api/domain/v3/analytics/interactives/report',\n key: 'interactive:results:report',\n data,\n type: HttpVerbs.POST,\n normalize: false\n };\n }\n};","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { CreateShareLinkRequest } from 'libs/shared/apps/share-v2/interfaces/CreateShareLinkRequest';\nimport { CreateShareRequest } from 'libs/shared/apps/share-v2/interfaces/CreateShareRequest';\nimport { UpdateShareRequest } from 'libs/shared/apps/share-v2/interfaces/UpdateShareRequest';\n\nconst normalizeOptions: Flight.NormalizeOptions = {\n namespace: 'share-v2'\n};\n\nexport interface GetSentSharesParams {\n cursor?: string;\n scopeId?: string;\n objectTypeId?: number;\n type?: ShareType[];\n}\n\nexport const ShareRequests = {\n createShare(\n data: CreateShareRequest\n ): Flight.Request {\n return {\n url: '{gateway}/v2/shares',\n key: 'create:share-v2',\n type: HttpVerbs.POST,\n data,\n normalizeOptions,\n invalidationKeys: [ 'sent:share-v2', 'get:share-v2:shares:object' ]\n };\n },\n\n updateShare(\n shareId: string,\n data: UpdateShareRequest\n ): Flight.Request {\n return {\n url: `{gateway}/v2/shares/${shareId}`,\n key: `update:share-v2`,\n type: HttpVerbs.PUT,\n data,\n normalizeOptions,\n invalidationKeys: [ 'share-v2:permanent-link:object', `share-v2:${shareId}`, 'get:share-v2:shares:object' ]\n };\n },\n \n deleteShare(\n shareId: string\n ): Flight.Request {\n return {\n type: HttpVerbs.DELETE,\n url: `{gateway}/v2/shares/${shareId}`,\n key: `delete:share-v2`,\n normalizeOptions,\n invalidationKeys: [ 'share-v2:permanent-link:object', 'sent:share-v2', `share-v2:${shareId}`, 'get:share-v2:shares:object' ]\n };\n },\n\n getShare(\n shareId: string\n ): Flight.Request {\n return {\n url: `{gateway}/v2/shares/${shareId}`,\n key: `share-v2:${shareId}`,\n bootstrapName: `share-v2:${shareId}`,\n type: HttpVerbs.GET,\n normalizeOptions\n };\n },\n\n getSentShares(\n params: GetSentSharesParams = {}\n ): Flight.Request {\n const key = Object.values(params).sort().join(':');\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v2/shares/sent', params),\n key: `sent:share-v2:${key}`,\n type: HttpVerbs.GET,\n normalize: false\n };\n },\n\n getShareLink(\n id: string\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder('{gateway}/v2/shares/permanent-link', { objectId: id }),\n key: `share-v2:permanent-link:object:${id}`,\n normalizeOptions\n };\n },\n\n createShareLink(\n data: CreateShareLinkRequest\n ): Flight.Request {\n return {\n type: HttpVerbs.POST,\n url: UrlHelper.urlBuilder('{gateway}/v2/shares/permanent-link', { ...data }),\n key: `create:share-v2:permanent-link:object:${data.objectId}`,\n invalidationKeys: [ `share-v2:permanent-link:object:${data.objectId}`, 'sent:share-v2', `get:share-v2:shares:object:${data.objectId}` ],\n normalizeOptions\n };\n },\n\n getPrivacy(id: string): Flight.Request {\n return {\n url: `{gateway}/v1/objects/${id}/access`,\n key: `privacy:${id}`,\n normalize: false\n };\n },\n \n getSharesByObjectId(\n objectId: string | number\n ): Flight.Request {\n return {\n url: `{gateway}/v2/shares/objects/${objectId}`,\n key: `get:share-v2:shares:object:${objectId}`,\n type: HttpVerbs.GET,\n normalizeOptions\n };\n },\n\n createSharePincode(shareId: string): Flight.Request {\n return {\n url: `{gateway}/v2/shares/${shareId}/pincode`,\n key: `create:share-v2:${shareId}:pincode`,\n type: HttpVerbs.POST\n };\n },\n\n getPincodeByShareId(shareId: string): Flight.Request {\n return {\n url: `{gateway}/v2/shares/${shareId}/pincode`,\n key: `get:share-v2:${shareId}:pincode`\n };\n },\n\n getPincodeByCode(code: string): Flight.Request {\n return {\n url: `{gateway}/v2/shares/pincode?code=${code}`,\n key: `get:share-v2:pincode:${code}`\n };\n }\n};\n","import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { BaseObject } from 'libs/shared/interfaces';\n\nconst CHUNK_SIZE = 50;\n\nexport interface UseBatchFetchResult<T extends BaseObject> {\n itemsArr: T[];\n items: { [key: string]: T} | null;\n isFetching: boolean;\n hasCompleted: boolean;\n}\n\n/**\n * Used to fetch multiple items by id with Flight. Will fetch 25 items at a time firing off multiple\n * requests if there are more than 25 items.\n * This will return items as null until we have all our items. Items will be returned as an object with\n * their ids as they key for easy mapping\n * \n * @param itemIds \n * @param getRequest \n */\nexport function useBatchFetch<T extends BaseObject>(\n itemIds: string[],\n getRequest: (ids: string[]) => Flight.Request\n): UseBatchFetchResult<T> {\n const chunks = ArrayHelper.chunk<string>(itemIds, CHUNK_SIZE);\n\n const requests = chunks.map(chunk => getRequest(ArrayHelper.uniq(chunk)));\n\n const responses = Flight.useBasicFetchAll<T[]>(requests);\n\n const itemsArr = ArrayHelper.flatten(responses.data);\n const items = responses.data.length\n ? itemsArr.reduce((acc, item) => ({ ...acc, [item.id]: item }), {})\n : null;\n\n return {\n itemsArr,\n items,\n isFetching: responses.isFetching,\n hasCompleted: responses.hasCompleted\n };\n}\n\n/**\n * When you need the useBatchFetch() behavior, but your list of objects to hydrate\n * will grow, such as on a scrolling page. useGrowingBatchFetch() will use local state\n * to determine what we've already built a request for and what items are new\n * as to not re-fetch items - Sha\n */\nexport function useGrowingBatchFetch<TResponse, TObjects = string>(\n objs: TObjects[],\n getRequest: (items: TObjects[]) => Flight.Request,\n _getKey?: (obj: TObjects) => string\n) {\n const getKey = _getKey ?? ((obj: any) => {\n if (typeof obj === 'object')\n return obj.id;\n\n return obj;\n });\n\n const { fetchItems, ...data } = useGrowingBatchFetchFunc<TResponse, TObjects>({ getRequest, _getKey });\n\n React.useEffect(() => {\n if (!objs?.length)\n return;\n\n fetchItems(objs);\n }, [objs?.map(getKey).join(',')]);\n\n return data;\n}\n\ninterface UseGrowingBatchFetchFuncOptions<TObjects> {\n getRequest: (items: TObjects[]) => Flight.Request;\n _getKey?: (obj: TObjects) => string;\n}\n\n/**\n * When you need the useGrowingBatchFetch() behaviour, but need to trigger the\n * fetch manually and update the objects - Nish \n */\nexport function useGrowingBatchFetchFunc<TResponse, TObjects = string>(\n options: UseGrowingBatchFetchFuncOptions<TObjects>\n) {\n const getKey = options._getKey ?? ((obj: any) => {\n if (typeof obj === 'object')\n return obj.id;\n\n return obj;\n });\n\n const fetchedItems = React.useRef<Set<string>>(new Set<string>());\n const [ requests, setRequests ] = React.useState<Flight.Request[]>([]);\n\n function fetchItems(objs: TObjects[]) {\n if (!objs?.length)\n return;\n\n const unfetchedItems: TObjects[] = [];\n \n objs.forEach(obj => {\n const key = getKey(obj);\n\n if (fetchedItems.current.has(key))\n return;\n\n unfetchedItems.push(obj);\n fetchedItems.current.add(key);\n });\n \n if (!unfetchedItems.length)\n return;\n \n setRequests(r => ([ ...r, ...ArrayHelper.chunk<TObjects>(unfetchedItems, CHUNK_SIZE).map(options.getRequest) ]));\n }\n\n const responses = Flight.useBasicFetchAll<TResponse[]>(requests);\n const itemsArr = ArrayHelper.flatten(responses.data);\n const items = responses.data.length\n ? itemsArr.reduce<Record<string, TResponse>>((acc, item) => ({ ...acc, [getKey(item)]: item }), {})\n : null;\n\n return {\n hasFirstRequestCompleted: !!responses.responses?.[0]?.hasCompleted,\n itemsArr,\n items,\n isFetching: responses.isFetching,\n fetchItems\n };\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { SharableEntity, ShareViewHelper } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { TitleSubText } from 'libs/shared/components/title-sub-text/TitleSubText';\nimport { VideoSubText } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { BaseObject } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst namespace = 'shared.sharedObjectTitle';\n\ninterface SharedObjectTitleProps {\n sharedObject: SharableEntity;\n getObjectAppLink?: (object: BaseObject) => Core.AppLink;\n titleClassName?: string;\n subTextClassName?: string;\n}\n\nexport function SharedObjectTitle(props: SharedObjectTitleProps) {\n const { sharedObject, titleClassName, subTextClassName } = props;\n const subTextPhrase = getSubTextPhrase();\n const titleAppLink = props.getObjectAppLink?.(sharedObject);\n\n if (!sharedObject.name) {\n return <Text namespace={namespace} phrase='videoUnavailable' />;\n }\n\n if (VideoHelper.isVideoType(sharedObject) && !VideoHelper.getCanBeConsumed(sharedObject)?.canNavigate) {\n return (\n <span className={`clamp-2 ${titleClassName ?? ''}`}>\n {sharedObject.name}\n </span>\n );\n }\n\n function getSubTextPhrase(): string {\n switch (sharedObject.typeId) {\n case MasterType.Series: return 'series';\n case MasterType.Playlist: return 'playlist';\n }\n }\n\n return (\n <div>\n {VideoHelper.isVideoType(sharedObject) && (\n <VideoSubText\n type='series'\n video={sharedObject}\n appLink={'series' in sharedObject && sharedObject.series ? props.getObjectAppLink?.(sharedObject.series) : null}\n analyticsOptions={{ location: LocationContext.Insights }}\n className={`d-inline clamp-1 ${subTextClassName ?? ''}`}\n />\n )}\n\n { subTextPhrase &&\n <TitleSubText>\n <Text namespace={namespace} phrase={subTextPhrase} />\n </TitleSubText>\n }\n\n { titleAppLink ? (\n <AppLink\n appLink={titleAppLink}\n className='clamp-1'\n analyticsData={{ id: sharedObject.id, name: sharedObject.name }}\n analyticsOptions={{\n entity: ShareViewHelper.getAnalyticsEntity(sharedObject.type),\n actionType: UserAction.Click,\n location: LocationContext.MyShares\n }}\n >\n <span className={`clamp-2 ${titleClassName ?? ''}`}>\n {sharedObject.name}\n </span>\n </AppLink>\n ) : (\n <span className={`clamp-2 ${titleClassName ?? ''}`}>\n {sharedObject.name}\n </span>\n )}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"indicator\":\"sybF_\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { ShareHelper } from 'libs/shared/apps/share-v2/utils/ShareHelper';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\n\nimport styles from './share-status-indicator.scss';\n\nconst namespace = 'share-v2.shareStatusIndicator';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nenum ShareIndicatorStatus {\n Active,\n Expired,\n MarkingRequired\n}\n\nconst statusIndicatorLabels = {\n [ShareIndicatorStatus.Active]: () => getPhrase('activeStatusLabel'),\n [ShareIndicatorStatus.Expired]: () => getPhrase('expiredStatusLabel'),\n [ShareIndicatorStatus.MarkingRequired]: () => getPhrase('markingRequiredStatusLabel')\n};\n\nconst statusIndicatorColors = {\n [ShareIndicatorStatus.Active]: 'bg-success',\n [ShareIndicatorStatus.Expired]: 'bg-danger',\n [ShareIndicatorStatus.MarkingRequired]: 'bg-blue'\n};\n\nconst statusIndicatorTooltips = {\n [ShareIndicatorStatus.Active]: () => getPhrase('activeStatusTooltip'),\n [ShareIndicatorStatus.Expired]: () => getPhrase('expiredStatusTooltip'),\n [ShareIndicatorStatus.MarkingRequired]: () => getPhrase('markingRequiredStatusTooltip')\n};\n\nfunction determineStatus(props: ShareStatusIndicatorProps): ShareIndicatorStatus {\n if (props.markingRequired)\n return ShareIndicatorStatus.MarkingRequired;\n\n if (ShareHelper.hasShareExpired(props.share))\n return ShareIndicatorStatus.Expired;\n\n return ShareIndicatorStatus.Active;\n}\n\nfunction getTooltip(status: ShareIndicatorStatus, expireDate: string): string {\n if (status === ShareIndicatorStatus.Active && expireDate) {\n const localDate = DateHelper.convertUTCToLocal(expireDate);\n const formattedDate = DateHelper.format(localDate, 'MMMM Do');\n\n return getPhrase('expiryTooltip', { date: formattedDate });\n }\n\n return statusIndicatorTooltips[status]();\n}\n\ninterface ShareStatusIndicatorProps {\n share: Share;\n markingRequired: boolean;\n}\n\nexport function ShareStatusIndicator(props: ShareStatusIndicatorProps) {\n const status = determineStatus(props);\n const tooltip = getTooltip(status, props.share.expireDate);\n const color = statusIndicatorColors[status];\n\n function renderDisplayText() {\n const label = statusIndicatorLabels[status]();\n const expireDate = props.share.expireDate;\n \n if (status === ShareIndicatorStatus.Active && expireDate) {\n const remainingDays = ShareHelper.calculateDaysToExpiry(props.share);\n const hint = getPhrase('expiryHint', { smartCount: remainingDays });\n\n return (\n <p className='mb-0'>\n {label} · {hint}\n </p>\n );\n }\n\n return (\n <p className='mb-0'>\n {label}\n </p>\n );\n }\n\n return (\n <Tooltip title={tooltip} spanHack spanHackClassName='d-inline-flex'>\n <div className='d-flex align-items-center'>\n <div className={`${styles.indicator} ${color} me-2 flex-shrink-0`} />\n {renderDisplayText()}\n </div>\n </Tooltip>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"thumbnailContainer\":\"XNQc8\",\"tableRow\":\"R3dYa\",\"viewCta\":\"ssCq6\"};","import React from 'react';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { SharedObjectImage } from 'libs/shared/apps/share/components/shared-object-image/SharedObjectImage';\nimport { SharedObjectTitle } from 'libs/shared/apps/share/components/shared-object-title/SharedObjectTitle';\nimport { ShareStatusIndicator } from 'libs/shared/apps/share-v2/components/share-status-indicator/ShareStatusIndicator';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { ActionsDropdown } from 'libs/shared/components/actions/ActionsDropdown';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { Breakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { YearGroup } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { getInsightsOverviewAppLink } from 'shared/utils/ObjectAppLinkHelper';\n\nimport { MySharesTableData } from 'apps/my-shares/components/my-shares-table/MySharesTableUtils';\n\nimport styles from './my-shares-table-row.scss';\n\nconst namespace = 'myShares.tableRow';\n\ninterface MySharesTableHeadingProps {\n heading: string;\n isFirst: boolean;\n}\n\nexport function MySharesTableHeading(props: MySharesTableHeadingProps) {\n return (\n <div className='d-flex'>\n <div className={`col-auto ${styles.thumbnailContainer}`}>\n <p className='fw-semibold mb-2'>{props.heading}</p>\n </div>\n \n <div className={`${props.isFirst ? 'd-flex' : 'd-none'} col align-items-center`}>\n <div className='col-10 col-md-4' />\n\n <div className='d-none d-md-flex col-6'>\n <div className='col-4'>\n <p className='fw-semibold mb-2'><Text namespace={namespace} phrase='viewsHeading' /></p>\n </div>\n\n <div className='col-3'>\n <p className='fw-semibold mb-2'><Text namespace={namespace} phrase='viewedByHeading' /></p>\n </div>\n\n <div className='col-5'>\n <p className='fw-semibold mb-2'><Text namespace={namespace} phrase='statusHeading' /></p>\n </div>\n </div>\n\n <div className='col-2' />\n </div>\n </div>\n );\n}\n\ninterface MySharesTableRowProps extends React.PropsWithChildren {\n shareData: MySharesTableData;\n breakpoints?: Breakpoints;\n getObjectActions: (row: MySharesTableData) => ActionOptions[];\n yearGroups: YearGroup[];\n imageCdnUrl: string;\n className?: string;\n}\n\nexport function MySharesTableRow(props: MySharesTableRowProps) {\n const { shareData } = props;\n const sharedObject = shareData.sharedObject;\n const isCollection = sharedObject.typeId === MasterType.Playlist || sharedObject.typeId === MasterType.Series;\n const appLink = getInsightsOverviewAppLink(shareData.share);\n\n function renderViewCount() {\n if (isCollection)\n return <p className='mb-0'>-</p>;\n\n return (\n <p className='mb-0'>\n <Text namespace={namespace} phrase='views' options={{ smartCount: shareData.share.viewCount }} />\n </p>\n );\n }\n\n function renderViewedBy() {\n if (isCollection)\n return <p className='mb-0'>-</p>;\n\n return (\n <div className='d-flex align-items-center'>\n <SvgContainer svgName={cvSvgLibrary.User} size={SvgContainerSize.Standard} className='me-2 svg-container' />\n <p className='mb-0'>{shareData.share.accessCount}</p>\n </div>\n );\n }\n\n return (\n <div className={`position-relative hover-bg-light-blue ${styles.tableRow} ${props.className ?? ''}`}>\n <AppLink appLink={appLink} className={`p-2 cursor-pointer d-flex text-decoration-none`}>\n <div className={`col-auto ${styles.thumbnailContainer}`}>\n <SharedObjectImage\n object={sharedObject}\n showVideoMetadata\n locationContext={LocationContext.MyShares}\n imageOptions={{ size: ImageSize.Medium }}\n showCollectionMask={false}\n showVideoCount\n onlyCount\n />\n </div>\n \n <div className='col d-flex align-items-center'>\n <div className='px-3 col-10 col-md-4'>\n <SharedObjectTitle sharedObject={shareData.sharedObject} />\n </div>\n\n <div className='d-none d-md-flex col-6'>\n <div className='col-4'>\n {renderViewCount()}\n </div>\n\n <div className='col-3'>\n {renderViewedBy()}\n </div>\n\n <div className='col-5'>\n <ShareStatusIndicator share={shareData.share} markingRequired={shareData.pendingReview > 0} />\n </div>\n </div>\n </div>\n </AppLink>\n <div className='position-absolute end-0 top-0 bottom-0 d-flex align-items-center pe-2'>\n <AppLink appLink={appLink} className={`me-4 text-info d-none ${styles.viewCta}`}>\n <Text namespace={namespace} phrase='viewCta' />\n </AppLink>\n <ActionsDropdown\n dropdownToggleSvgSize={SvgContainerSize.Standard}\n actions={props.getObjectActions(shareData)}\n dropdownToggleClassName='btn btn-link'\n />\n </div>\n </div>\n );\n}\n","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { InteractivesPendingReviews } from 'libs/shared/apps/analytics/interfaces/response/InteractivesPendingReviewsResponse';\nimport { ShareHelper } from 'libs/shared/apps/share/utils/ShareHelper';\nimport { SharableEntity, SharableRecipient } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { SharePrivacy } from 'libs/shared/apps/share-v2/enums/SharePrivacy';\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { InteractiveMetadata } from 'libs/shared/interfaces';\n\nconst namespace = 'myShares.mySharesTable';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getDateShared(share: Share): string {\n if (share.type === ShareType.Link || !share?.recipients?.length)\n return share.dateCreated;\n\n const datesCreated = share.recipients.map(r => r.dateCreated);\n\n if (!datesCreated.length)\n return '';\n\n datesCreated.sort((date1, date2) => {\n if (DateHelper.isSame(date1, date2))\n return 0;\n\n return DateHelper.isAfter(date1, date2) ? 1 : -2;\n });\n\n return ArrayHelper.last(datesCreated);\n}\n\nexport interface MySharesTableData {\n share: Share;\n sharedObject: SharableEntity;\n dateShared: string;\n shareRecipients?: SharableRecipient[];\n pendingReview?: number;\n privacy?: SharePrivacy;\n}\n\ntype TableDataGroupings = { [date: string]: MySharesTableData[] };\n\nexport function useGetMySharesData(\n sentShares: Share[],\n sharedObjects: Record<string, SharableEntity>,\n shareRecipients: Record<string, SharableRecipient>,\n groupByDate: boolean,\n interactivesPendingReviews: InteractivesPendingReviews[]\n): TableDataGroupings {\n const tableData: MySharesTableData[] = [];\n\n const interactivesPendingReviewsMap = interactivesPendingReviews\n ?.reduce<Record<string, InteractivesPendingReviews>>(\n (map, obj) => ({ [obj.interactiveId]: obj, ...map }),\n {}\n );\n\n sentShares.forEach(s => {\n const sharedObject = sharedObjects?.[s.objectId];\n\n let recipients: SharableRecipient[] | null = null;\n\n if (s.type === ShareType.Classroom) {\n recipients = [];\n\n s.recipients?.forEach(r => {\n const recipient = shareRecipients?.[r.recipientId];\n\n if (recipient)\n recipients.push(recipient);\n });\n }\n\n // Skip if we don't have access to the shared object (e.g. if it's been deleted)\n if (sharedObject) {\n const pendingReview = sharedObject.typeId === MasterType.Interactive &&\n interactivesPendingReviewsMap?.[(sharedObject as InteractiveMetadata).interactiveId];\n\n tableData.push({\n share: s,\n sharedObject,\n shareRecipients: recipients,\n dateShared: getDateShared(s),\n pendingReview: pendingReview?.pendingReviewCount,\n privacy: s.privacy\n });\n }\n });\n\n if (!groupByDate)\n return { [getPhrase('title')]: tableData };\n\n return ShareHelper.groupByDateShared(tableData);\n}","import React from 'react';\n\nimport { InteractivesPendingReviews } from 'libs/shared/apps/analytics/interfaces/response/InteractivesPendingReviewsResponse';\nimport { SharableEntity, SharableRecipient } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { Breakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { YearGroup } from 'libs/shared/interfaces';\n\nimport { MySharesTableData, useGetMySharesData } from 'apps/my-shares/components/my-shares-table/MySharesTableUtils';\nimport { MySharesTableHeading, MySharesTableRow } from 'apps/my-shares/components/my-shares-table-row/MySharesTableRow';\n\ninterface MySharesTableProps {\n sentShares: Share[];\n sharedObjects: Record<string, SharableEntity>;\n shareRecipients: Record<string, SharableRecipient>;\n interactivesPendingReview: InteractivesPendingReviews[];\n getObjectActions: (row: MySharesTableData) => ActionOptions[];\n groupByDateShared?: boolean;\n showStatus?: boolean;\n showViewCount?: boolean;\n dependencies?: any[];\n breakpoints?: Breakpoints;\n hasDemoInsights?: boolean;\n imageCdnUrl: string;\n yearGroups: YearGroup[];\n}\n\nexport function MySharesTable(props: MySharesTableProps): JSX.Element {\n const data = useGetMySharesData(\n props.sentShares,\n props.sharedObjects,\n props.shareRecipients,\n !!props.groupByDateShared,\n props.interactivesPendingReview\n );\n\n return (\n <>\n {Object.keys(data).map((heading, headingIdx) => (\n <div key={headingIdx}>\n <MySharesTableHeading heading={heading} isFirst={!props.hasDemoInsights && headingIdx === 0} />\n\n <div className='d-flex flex-column mb-4'>\n {data[heading].map((shareData, index) => (\n <MySharesTableRow\n key={index}\n shareData={shareData}\n getObjectActions={props.getObjectActions}\n breakpoints={props.breakpoints}\n imageCdnUrl={props.imageCdnUrl}\n yearGroups={props.yearGroups}\n />\n ))}\n </div>\n </div>\n ))}\n </>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'myShares.mySharesTableEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function MySharesTableEmptyState(): JSX.Element {\n return (\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.Share.SHARED_BY_ME} size='small' />\n <EmptyState.Heading>\n {getPhrase('heading')}\n </EmptyState.Heading>\n <EmptyState.Info>{getPhrase('info')}</EmptyState.Info>\n <EmptyState.Cta appLink={{ application: AppChannels.DASHBOARD, action: Actions.Dashboard.HOME }} text={getPhrase('cta')} />\n </EmptyState>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"heading\":\"iWHol\",\"thumbnailContainer\":\"zrcDh\"};","import React from 'react';\n\nimport styles from './partial-my-shares-table.scss';\n\ninterface PartialHeadingProps {\n isFirst?: boolean;\n}\n\nexport function PartialHeading(props: PartialHeadingProps) {\n return (\n <div className='d-flex'>\n <div className={`col-auto ${styles.thumbnailContainer}`}>\n <div className={`partial-loading-background mb-2`}> </div>\n </div>\n \n <div className={`${props.isFirst ? 'd-flex' : 'd-none'} col align-items-center`}>\n <div className='col-10 col-md-4' />\n\n <div className='d-none d-md-flex col-6'>\n <div className='col-4'>\n <div className={`partial-loading-background mb-2 ${styles.heading}`}> </div>\n </div>\n\n <div className='col-3'>\n <div className={`partial-loading-background mb-2 ${styles.heading}`}> </div>\n </div>\n\n <div className='col-5'>\n <div className={`partial-loading-background mb-2 ${styles.heading}`}> </div>\n </div>\n </div>\n\n <div className='col-2' />\n </div>\n </div>\n );\n}\n\nfunction PartialRow(): JSX.Element {\n return (\n <div className={`p-2 d-flex`}>\n <div className={`col-auto ${styles.thumbnailContainer}`}>\n <div className={`partial-loading-background rounded ratio ratio-16x9`} />\n </div>\n \n <div className='col d-flex align-items-center'>\n <div className='px-3 col-10 col-md-4'>\n <div className={`partial-loading-background w-75`}> </div>\n </div>\n\n <div className='d-none d-md-flex col-6'>\n <div className='col-4'>\n <div className={`partial-loading-background w-50`}> </div>\n </div>\n\n <div className='col-3'>\n <div className={`partial-loading-background w-50`}> </div>\n </div>\n\n <div className='col-5'>\n <div className={`partial-loading-background w-75`}> </div>\n </div>\n </div>\n\n <div className='col-2 d-flex justify-content-end align-items-center'>\n <div className={`partial-loading-background w-25`}> </div>\n </div>\n </div>\n </div>\n );\n}\n\nexport function PartialMySharesTable(): JSX.Element {\n return (\n <>\n <div>\n <PartialHeading isFirst={true} />\n\n <div className='d-flex flex-column rounded-3 mb-4 border'>\n <PartialRow />\n <PartialRow />\n <PartialRow />\n <PartialRow />\n </div>\n </div>\n\n <div>\n <PartialHeading />\n\n <div className='d-flex flex-column rounded-3 mb-4 border'>\n <PartialRow />\n <PartialRow />\n <PartialRow />\n <PartialRow />\n </div>\n </div>\n\n <div>\n <PartialHeading />\n\n <div className='d-flex flex-column rounded-3 mb-4 border'>\n <PartialRow />\n <PartialRow />\n <PartialRow />\n <PartialRow />\n <PartialRow />\n <PartialRow />\n <PartialRow />\n <PartialRow />\n <PartialRow />\n <PartialRow />\n </div>\n </div>\n </>\n );\n}","import { Flight } from 'libs/common/react/index';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { InteractiveResultsRequests } from 'libs/shared/apps/analytics/flight-requests/InteractiveResultsRequests';\nimport { InteractivesPendingReviews } from 'libs/shared/apps/analytics/interfaces/response/InteractivesPendingReviewsResponse';\nimport { ShareRequests as ShareRequestsV1 } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { SharableRecipient } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { GetSentSharesParams, ShareRequests as ShareRequestsV2 } from 'libs/shared/apps/share-v2/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { ShareHelper } from 'libs/shared/apps/share-v2/utils/ShareHelper';\nimport { SharableEntity } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { UseBatchFetchResult, useGrowingBatchFetch } from 'libs/shared/hooks/UseBatchFetch';\nimport { useInfiniteList } from 'libs/shared/hooks/UseInfiniteList';\nimport { BaseObject, Config, CurrentUser, YearGroup } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nexport function getBatchFetchResultAsArray(result: UseBatchFetchResult<BaseObject>): BaseObject[] {\n return result.items ? Object.values(result.items) : [];\n}\n\ninterface UseSharesTableOptions {\n params?: GetSentSharesParams;\n interactiveInsights?: boolean;\n shouldFetch: boolean;\n}\n\nexport function useSharesTable({ params, interactiveInsights, shouldFetch }: UseSharesTableOptions) {\n const fetch = Flight.useGetFetch();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n /**\n * Fetch sent shares\n */\n const getRequest = (cursor?: string) => shouldFetch && ShareRequestsV2.getSentShares({\n cursor,\n ...params\n });\n const fetchNext = (cursor?: string) => fetch(getRequest(cursor));\n const {\n items: sentShares,\n hasMore,\n isFetching: isFetchingSentShares,\n nextCursor,\n hasFirstPageCompleted\n } = useInfiniteList<Share>(getRequest, fetchNext);\n\n /**\n * Fetch shared objects\n */\n const sharedObjects = useGrowingBatchFetch<SharableEntity>(\n sentShares?.map(obj => obj.objectId.toString()),\n ShareRequestsV1.sharedObjectsById\n );\n\n /**\n * Fetch recipients\n */\n const shareRecipients = useGrowingBatchFetch<SharableRecipient>(\n ShareHelper.getFlattenedRecipients(sentShares ?? []).map(obj => obj.recipientId.toString()),\n objs => (ShareRequestsV1.getRecipientsById(objs, currentUser.data.customerId))\n );\n\n /**\n * Fetch which interactives required marking\n */\n const interactivesPendingReview = useGrowingBatchFetch<InteractivesPendingReviews, SharableEntity>(\n interactiveInsights ? ObjectHelper.values(sharedObjects.items || []) : [],\n objs => InteractiveResultsRequests.pendingReviews({\n interactives: objs\n .filter(VideoHelper.isInteractive)\n .map(obj => ({ interactiveId: obj.interactiveId, metadataId: obj.id })),\n filters: {\n currentCustomerId: currentUser.data.customerId,\n currentUserId: currentUser.data.id\n }\n }),\n obj => `${obj.id}:${'interactiveId' in obj ? obj.interactiveId : ''}`\n );\n \n const isFetching = isFetchingSentShares\n || sharedObjects.isFetching\n || shareRecipients.isFetching\n || interactivesPendingReview.isFetching\n || yearGroups.isFetching;\n\n const showPartialLoading = !hasFirstPageCompleted || (sentShares?.length && !sharedObjects.hasFirstRequestCompleted);\n\n return {\n sentShares,\n sharedObjects,\n shareRecipients,\n yearGroups: yearGroups.data,\n interactivesPendingReview,\n isFetching,\n showPartialLoading,\n nextCursor,\n hasMore,\n fetchNext,\n imageCdnUrl: config.data?.imageCdnUrl\n };\n}"],"names":["getAnalyticsRequestKey","baseKey","filter","extra","key","start","end","userIdKey","Array","isArray","userId","sort","join","groupIdKey","groupId","customerIdKey","customerId","getInteractiveResultFilters","currentUser","currentUserId","id","currentCustomerId","dateRange","undefined","userIds","classroomsAndGroups","InteractiveResultsRequests","interactiveResultSet","interactiveId","interactiveMetadataId","includePublicResults","success","error","always","url","data","type","HttpVerbs","normalize","mark","answerId","resultId","invalidationKeys","pendingReviews","interactiveResultsReport","normalizeOptions","namespace","ShareRequests","createShare","updateShare","shareId","deleteShare","getShare","bootstrapName","getSentShares","params","Object","values","getShareLink","objectId","createShareLink","getPrivacy","getSharesByObjectId","createSharePincode","getPincodeByShareId","getPincodeByCode","code","CHUNK_SIZE","useBatchFetch","itemIds","getRequest","requests","map","chunk","responses","itemsArr","items","length","reduce","acc","item","isFetching","hasCompleted","useGrowingBatchFetch","objs","_getKey","getKey","obj","useGrowingBatchFetchFunc","fetchItems","options","fetchedItems","Set","setRequests","hasFirstRequestCompleted","unfetchedItems","forEach","current","has","push","add","r","SharedObjectTitle","props","sharedObject","titleClassName","subTextClassName","subTextPhrase","typeId","MasterType","getSubTextPhrase","titleAppLink","getObjectAppLink","name","VideoHelper","canNavigate","className","VideoSubText","video","appLink","series","analyticsOptions","location","TitleSubText","Text","phrase","AppLink","analyticsData","entity","ShareViewHelper","actionType","ShareIndicatorStatus","getPhrase","LanguageService","statusIndicatorLabels","Active","Expired","MarkingRequired","statusIndicatorColors","statusIndicatorTooltips","ShareStatusIndicator","status","markingRequired","ShareHelper","share","determineStatus","tooltip","expireDate","localDate","DateHelper","formattedDate","date","getTooltip","color","Tooltip","title","spanHack","spanHackClassName","label","remainingDays","hint","smartCount","renderDisplayText","MySharesTableHeading","heading","isFirst","MySharesTableRow","shareData","isCollection","SharedObjectImage","object","showVideoMetadata","locationContext","imageOptions","size","showCollectionMask","showVideoCount","onlyCount","viewCount","SvgContainer","svgName","S","accessCount","pendingReview","ActionsDropdown","dropdownToggleSvgSize","actions","getObjectActions","dropdownToggleClassName","getDateShared","ShareType","recipients","dateCreated","datesCreated","date1","date2","ArrayHelper","MySharesTable","sentShares","sharedObjects","shareRecipients","groupByDate","interactivesPendingReviews","tableData","interactivesPendingReviewsMap","groupByDateShared","interactivesPendingReview","s","recipient","recipientId","dateShared","pendingReviewCount","privacy","keys","headingIdx","hasDemoInsights","index","breakpoints","imageCdnUrl","yearGroups","MySharesTableEmptyState","src","application","action","text","PartialHeading","PartialRow","PartialMySharesTable","useSharesTable","interactiveInsights","shouldFetch","fetch","config","isAuthenticated","cursor","fetchNext","hasMore","isFetchingSentShares","nextCursor","hasFirstPageCompleted","toString","I","interactives","metadataId","filters","showPartialLoading"],"sourceRoot":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/1243-72f3d31787-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/analytics/utils/InteractiveUtils.ts","file:///app/packages/libs/shared/src/constants/DragOverlayStyles.ts","file:///app/packages/libs/shared/src/components/table/TableUtils.ts","file:///app/packages/libs/shared/src/components/table/table.scss","file:///app/packages/libs/shared/src/components/table/Table.tsx","file:///app/packages/libs/shared/src/enums/InteractionCorrectness.ts","file:///app/packages/libs/shared/src/enums/InteractiveAnswerStatus.ts","file:///app/packages/libs/shared/src/flight-requests/InsightsDemoRequests.ts","file:///app/packages/libs/shared/src/utils/InteractiveCorrectnessHelper.ts","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/StudentResultsEmptyState.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/StudentResultsTableFilters.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/StudentResultsTable.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/interactive-insights-students/partial-loading/partial-interactive-insights-students.scss","file:///app/packages/projects/lite/src/apps/my-shares/components/interactive-insights-students/partial-loading/PartialInteractiveInsightsStudents.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/interactive-insights-students/InteractiveInsightsStudents.tsx","file:///app/packages/projects/lite/src/apps/my-shares/constants/MySharesDemoInsights.ts","file:///app/packages/projects/lite/src/apps/my-shares/views/demo/students/InteractiveInsightsStudentsDemoView.tsx"],"sourcesContent":["import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { ResultsSummary } from 'libs/shared/apps/analytics/interfaces/ResultsSummary';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { ScoreThresholdDefaults, ScoreThresholds } from 'libs/shared/constants/ScoreThresholds';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, StudentAnswer, StudentResults } from 'libs/shared/interfaces';\nimport { Interactive, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { flattenInteractions, getInteractions, getStudentAttempt, getStudentResult } from 'libs/shared/utils/InteractiveHelper';\n\ninterface StudentGroups {\n markingRequired: StudentResultsWithSummary[];\n lowScore: StudentResultsWithSummary[];\n highScore: StudentResultsWithSummary[];\n completed: StudentResultsWithSummary[];\n notCompleted: StudentResultsWithSummary[];\n}\n\nexport function groupStudents(\n interactive: Interactive,\n results: InteractiveResultSet,\n scoreThreshold?: ScoreThresholds\n): StudentGroups {\n const groups: StudentGroups = {\n markingRequired: [],\n lowScore: [],\n highScore: [],\n completed: [],\n notCompleted: []\n };\n\n const interactions = getInteractions(interactive);\n const interactionIds = new Set(interactions.map(i => i.id));\n \n results.students.forEach(s => {\n const withSummary = {\n ...s,\n summary: getStudentResultsSummary(interactive, s)\n };\n \n if (withSummary.summary.awaitingMarking) {\n groups.markingRequired.push(withSummary);\n return;\n }\n\n const result = ArrayHelper.last(s.results);\n const answeredInteractions = result.attempts.filter(a => !!interactionIds.has(a?.answers[0]?.questionId)).length;\n\n if (answeredInteractions === interactionIds.size) {\n groups.completed.push(withSummary);\n } else {\n groups.notCompleted.push(withSummary);\n return;\n }\n \n if (withSummary.summary.percentCorrect >= (scoreThreshold?.HIGH || ScoreThresholdDefaults.HIGH))\n groups.highScore.push(withSummary);\n \n if (withSummary.summary.percentCorrect < (scoreThreshold?.MODERATE || ScoreThresholdDefaults.MODERATE))\n groups.lowScore.push(withSummary);\n });\n \n const sortedLowScore = ArrayHelper.sortBy(groups.lowScore, s => s.summary.percentCorrect);\n const sortedHighScore = ArrayHelper.sortBy(groups.highScore, s => -s.summary.percentCorrect);\n \n return {\n ...groups,\n lowScore: sortedLowScore,\n highScore: sortedHighScore\n };\n}\n\nexport function getInteractionById(interactive: Interactive, interactionId: string): Interaction {\n const flattenedInteractions = flattenInteractions(interactive);\n return flattenedInteractions.find(i => i.id.toString() === interactionId.toString());\n}\n\n/**\n * We need to use the question and result ids as a list of one student's responses\n * to multiple questions will all have the same result id and a list of multiple\n * students responses to one question will all have the same questionId.\n */\nexport function getMarkedAnswerId(answer: StudentAnswer): string {\n return `${answer.questionId}:${answer.resultId}`;\n}\n\nexport function getMarkedStatus(\n interactionId: string,\n studentResults: StudentResults,\n markedAnswers: MarkedAnswerHash\n): InteractiveAnswerStatus {\n const result = getStudentResult(studentResults);\n const studentResponse = getStudentAttempt(interactionId, result);\n\n const isMarkedCorrect = studentResponse?.answers.every(a => {\n return markedAnswers[getMarkedAnswerId(a)]?.status === InteractiveAnswerStatus.Correct;\n });\n\n if (isMarkedCorrect)\n return InteractiveAnswerStatus.Correct;\n\n const isMarkedIncorrect = studentResponse?.answers.every(a => {\n return markedAnswers[getMarkedAnswerId(a)]?.status === InteractiveAnswerStatus.Incorrect;\n });\n\n if (isMarkedIncorrect)\n return InteractiveAnswerStatus.Incorrect;\n}\n\nexport function getInteractionResultsSummary(\n interaction: Interaction,\n results: InteractiveResultSet\n): ResultsSummary {\n const numStudents = results.students.length;\n let numCorrect = 0;\n let answered = 0;\n let unanswered = 0;\n let awaitingMarking = 0;\n let attempts = 0;\n\n results.students.forEach(s => {\n const result = getStudentResult(s);\n\n if (!result)\n return;\n\n attempts = attempts + s.results.length;\n\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(interaction, result);\n\n if (correctness === InteractionCorrectness.Correct)\n numCorrect++;\n\n if (correctness === InteractionCorrectness.UnAnswered)\n unanswered++;\n\n if (correctness === InteractionCorrectness.AwaitingMarking)\n awaitingMarking++;\n\n if (correctness !== InteractionCorrectness.UnAnswered)\n answered++;\n });\n\n\n const percentCorrect = numStudents > 0\n ? numCorrect / numStudents\n : 0;\n\n return {\n percentCorrect,\n correct: numCorrect,\n answered,\n unanswered,\n awaitingMarking,\n attempts\n };\n}\n\nexport function getStudentResultsSummary(interactive: Interactive, studentResults: StudentResults): ResultsSummary {\n const result = getStudentResult(studentResults);\n\n const interactions = getInteractions(interactive);\n\n const numInteractions = interactions.length;\n\n let numCorrect = 0;\n let awaitingMarking = 0;\n\n interactions.forEach(i => {\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(i, result);\n\n if (correctness === InteractionCorrectness.Correct)\n numCorrect++;\n\n if (correctness === InteractionCorrectness.AwaitingMarking)\n awaitingMarking++;\n });\n\n const percentCorrect = numInteractions > 0 ? numCorrect / numInteractions : 0;\n\n /**\n * Our interactions list has images and annotations filtered out.\n * We built a map of valid questions, so that we can calculate the unswered accurately.\n * We're doing this because of a bug that caused annotations and images to record answers in the player.\n * - Sha\n */\n const interactionIds = new Set(interactions.map(i => i.id));\n const answeredInteractions = result.attempts.filter(a => !!interactionIds.has(a?.answers[0]?.questionId)).length;\n\n return {\n answered: answeredInteractions,\n attempts: studentResults.results.length,\n unanswered: numInteractions - answeredInteractions,\n percentCorrect,\n correct: numCorrect,\n awaitingMarking\n };\n}","export const DragOverlayStyles = { opacity: '0.8', cursor: 'grabbing' };","import React from 'react';\nimport { PluginHook, useBlockLayout, useFilters, useFlexLayout, useGlobalFilter, useRowSelect, useSortBy } from 'react-table';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\n\ninterface PluginOptions {\n allowFiltering?: boolean;\n allowGlobalFiltering?: boolean;\n layout?: 'flex' | 'block';\n}\n\nexport function getPlugins<T extends HashObject>(props: PluginOptions): PluginHook<T>[] {\n let plugins: PluginHook<T>[] = [\n useSortBy,\n useRowSelect,\n props.layout === 'flex' ? useFlexLayout : useBlockLayout\n ];\n\n if (props.allowFiltering)\n plugins = [\n ...plugins,\n useFilters\n ];\n\n if (props.allowGlobalFiltering)\n plugins = [\n ...plugins,\n useGlobalFilter\n ];\n\n return plugins;\n}\n\nexport function getSelectedRowIds(ids: string[]): Record<string, boolean> {\n const idHash: Record<string, boolean> = {};\n\n ids.forEach(id => idHash[id] = true);\n\n return idHash;\n}\n\ninterface TableScrollState {\n canScrollLeft: boolean;\n canScrollRight: boolean;\n}\n\nfunction calculateScrollState(ref: React.MutableRefObject<HTMLDivElement>): TableScrollState {\n const canScrollLeft = ref.current?.scrollLeft > 0;\n const canScrollRight = (ref.current?.scrollLeft + 1) < ref.current?.scrollWidth - ref.current?.clientWidth;\n\n return { canScrollLeft, canScrollRight };\n}\n\ninterface UseTableScroll {\n ref: (el: HTMLDivElement) => void;\n scrollState: TableScrollState;\n scroll: (scrollBy: number) => void;\n}\n\nexport function useTableScroll(): UseTableScroll {\n const elRef = React.useRef<HTMLDivElement>(null);\n const [ scrollState, setScrollState ] = React.useState<TableScrollState>(calculateScrollState(elRef));\n\n function onScroll(): void {\n setScrollState(calculateScrollState(elRef));\n }\n\n function scroll(scrollBy: number): void {\n elRef.current?.scrollBy({ left: scrollBy, top: 0, behavior: 'smooth' });\n }\n\n const throttledOnScroll = FunctionHelper.throttle(onScroll, 200);\n\n const ref = React.useCallback((el: HTMLDivElement) => {\n if (elRef.current) {\n elRef.current?.removeEventListener('scroll', throttledOnScroll);\n }\n\n if (el) {\n setScrollState(calculateScrollState(elRef));\n el.addEventListener('scroll', throttledOnScroll);\n }\n\n elRef.current = el;\n }, []);\n\n React.useEffect(() => {\n if (elRef?.current) {\n setScrollState(calculateScrollState(elRef));\n }\n }, [elRef]);\n\n return { ref, scrollState, scroll };\n}","// extracted by mini-css-extract-plugin\nexport default {\"sortIndicator\":\"gFhu0\",\"scrollContainer\":\"sWUp9\",\"scrollbarTrack\":\"Vn2qM\"};","import React from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\nimport {\n Cell,\n Column as BaseColumn,\n HeaderGroup,\n HeaderProps as BaseHeaderProps,\n IdType,\n Row,\n SortingRule,\n TableOptions,\n TableRowProps,\n useTable } from 'react-table';\nimport { DragEndEvent } from '@dnd-kit/core';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SortableContainerWrapper } from 'libs/shared/components/sortable/SortableContainerWrapper';\nimport { PropsWithSortableItemProps, SortableItemWrapper } from 'libs/shared/components/sortable/SortableItemWrapper';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { WidgetButton, WidgetButtonDirection } from 'libs/shared/components/widgets/widget-button/WidgetButton';\nimport { DragOverlayStyles } from 'libs/shared/constants/DragOverlayStyles';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { getPlugins, getSelectedRowIds, useTableScroll } from './TableUtils';\n\nimport styles from './table.scss';\n\nexport interface TableTheme {\n table?: string;\n header?: string;\n headerRow?: string;\n headerCell?: string;\n body?: string;\n row?: string | ((row: Row<any>) => string);\n selectedRow?: string;\n cell?: string | ((row?: Row<any>, cell?: Cell<any, any>) => string);\n sortIndicator?: string;\n}\n\nexport type HeaderProps<T extends HashObject> = BaseHeaderProps<T> & {\n renderSortIndicator: () => void;\n}\n\nexport type Column<T extends HashObject> = BaseColumn<T> & {\n hideSortIndicator?: boolean;\n}\n\ninterface SortIndicatorProps<T extends HashObject> {\n column: HeaderGroup<T>;\n theme?: TableTheme;\n}\n\nfunction SortIndicator<T extends HashObject>(props: SortIndicatorProps<T>): JSX.Element {\n if (!props.column.canSort)\n return <></>;\n\n return (\n <span\n className={\n `${styles.sortIndicator}\n ${!props.column.isSorted ? 'text-secondary' : ''}\n ${props.theme?.sortIndicator ?? ''}`\n }\n >\n <SvgContainer\n svgName={(props.column.isSortedDesc || !props.column.isSorted)\n ? cvSvgLibrary.ArrowRight\n : cvSvgLibrary.ArrowLeft\n }\n size={SvgContainerSize.Small}\n />\n </span>\n );\n}\n\ninterface BaseTableProps<T extends HashObject> {\n /**\n * Must be memoized.\n */\n data: T[];\n\n /**\n * Must be memoized.\n * \n * For documentation on Column Options, see https://react-table.tanstack.com/docs/api/useTable#column-options\n */\n columns: Column<T>[];\n\n theme?: TableTheme;\n\n onSelectRow?: (row: Row<T>) => void;\n\n onSelectCell?: (cell: Cell<T>) => void;\n\n onRowMouseOver?: (row: Row<T>) => void;\n\n onRowMouseLeave?: (row: Row<T>) => void;\n\n allowSelectMultipleRows?: boolean;\n\n initialSelectedRowIds?: string[];\n\n getRowId?: (row: T) => string;\n\n getRowAppLink?: (row: Row<T>) => Core.AppLink;\n\n enableSort?: boolean;\n\n manualSort?: boolean;\n\n onSort?: (sortingRule: SortingRule<T>[]) => void;\n \n // Opt-in to utilise react-table's useFilter hook.\n allowFiltering?: boolean;\n\n // Opt-in to utilise react-table's useGlobalFilter hook.\n allowGlobalFiltering?: boolean;\n\n // Use either a flex layout or a block layout. Default is flex.\n layout?: 'flex' | 'block';\n\n // Used by useGlobalFilter hook, needs to be enabled by prop above.\n globalFilter?: string;\n\n // Set initial state of hidden columns in react-table.\n hiddenColumns?: IdType<T>[];\n\n // Determine whether hidden columns should be preserved on a table update event.\n autoResetHiddenColumns?: boolean;\n\n // Determine whether sort order state should be preserved on a table update event.\n autoResetSortBy?: boolean;\n\n // Determine whether rows are sortable by drag and drop\n enableSortableRows?: boolean;\n\n onSortingRowsEnd?: (event: DragEndEvent) => void;\n\n // Set initial state of sorting in react-table\n initialSortBy?: SortingRule<T>[];\n\n emptyState?: JSX.Element;\n}\n \ntype SortableRowProps = PropsWithSortableItemProps<TableRowProps>;\n\nfunction BaseTable<T extends HashObject>(props: BaseTableProps<T>): JSX.Element {\n const tableOptions: TableOptions<T> = {\n columns: props.columns,\n data: props.data,\n disableSortBy: !props.enableSort,\n manualSortBy: props.manualSort,\n autoResetHiddenColumns: props.autoResetHiddenColumns,\n autoResetSortBy: props.autoResetSortBy,\n initialState: {\n sortBy: props.initialSortBy || []\n }\n };\n\n if (props.initialSelectedRowIds)\n tableOptions.initialState = { selectedRowIds: getSelectedRowIds(props.initialSelectedRowIds) };\n\n if (props.getRowId)\n tableOptions.getRowId = props.getRowId;\n\n const {\n getTableProps,\n getTableBodyProps,\n headerGroups,\n rows,\n prepareRow,\n toggleAllRowsSelected,\n setGlobalFilter,\n setHiddenColumns,\n state: { sortBy }\n } = useTable<T>(tableOptions, ...getPlugins<T>({ ...props }));\n\n function getTableRowsClass(row: Row<T>) {\n let className = FunctionHelper.isFunction(props.theme?.row)\n ? props.theme.row(row)\n : props.theme?.row ?? '';\n\n if (row.isSelected && props.theme?.selectedRow)\n className += ` ${props.theme?.selectedRow}`;\n\n if (props.onSelectRow)\n className += ' cursor-pointer';\n\n if (props.enableSortableRows)\n className += ' cursor-grab';\n\n return className;\n }\n\n function renderTableRows() {\n if (!rows.length && props.emptyState)\n return props.emptyState;\n \n return rows.map(row => {\n prepareRow(row);\n \n const className = getTableRowsClass(row);\n const rowAppLink = !!props.getRowAppLink && props.getRowAppLink(row);\n\n function onClickRow(): void {\n if (!props.onSelectRow)\n return;\n\n if (!props.allowSelectMultipleRows)\n toggleAllRowsSelected(false);\n \n props.onSelectRow(row);\n row.toggleRowSelected(true);\n }\n\n function getSortableProps(props: TableRowProps | PropsWithSortableItemProps<TableRowProps>, ref?: any) {\n if ('dragAttributes' in props && 'dragListeners' in props) {\n return {\n ...props.dragAttributes,\n ...props.dragListeners,\n 'aria-roledescription': 'Sortable row',\n ref\n };\n }\n\n return {};\n }\n\n function renderRow(props: TableRowProps | PropsWithSortableItemProps<TableRowProps>, ref?: any): JSX.Element {\n const sortableProps = getSortableProps(props, ref);\n\n if (rowAppLink) {\n return (\n <div\n role='row'\n key={row.id}\n >\n <AppLink\n {...props}\n {...sortableProps}\n className={className}\n appLink={rowAppLink}\n >\n {renderCells(row)}\n </AppLink>\n </div>\n );\n }\n\n return (\n <div\n {...props}\n {...sortableProps}\n key={row.id}\n role='row'\n className={className}\n onClick={onClickRow}\n >\n {renderCells(row)}\n </div>\n );\n }\n\n const rowProps = row.getRowProps();\n\n if (props.enableSortableRows) {\n return (\n <SortableItemWrapper\n id={row.original.id}\n key={row.id}\n childProps={rowProps}\n childComponent={React.forwardRef(\n (props: SortableRowProps, ref: React.LegacyRef<HTMLDivElement>) => (renderRow(props, ref))\n )}\n />\n );\n }\n\n return renderRow(rowProps);\n });\n }\n\n function getDragOverlayClassName(theme: TableTheme): string {\n let className = 'g-0 ';\n\n if (theme)\n className += theme.row;\n\n return className;\n }\n\n function getDragOverlay(id: string) {\n const rowIndex = rows.findIndex(item => item.original.id === id);\n const row = rows[rowIndex];\n \n return (\n <div\n {...props}\n className={getDragOverlayClassName(props.theme)}\n style={DragOverlayStyles}\n >\n {renderCells(row)}\n </div>\n );\n }\n\n function getCellClassName(row: Row<T>, cell: Cell<T>): string {\n let cellClassName = '';\n\n if (typeof props.theme?.cell === 'function')\n cellClassName = props.theme.cell(row, cell);\n\n if (typeof props.theme?.cell === 'string')\n cellClassName = props.theme.cell;\n\n if (props.onSelectCell)\n cellClassName += ' cursor-pointer';\n\n return cellClassName;\n }\n\n function renderCells(row: Row<T>): JSX.Element[] {\n return row.cells.map(cell => {\n const cellClassName = getCellClassName(row, cell);\n\n function onClickCell(): void {\n props.onSelectCell && props.onSelectCell(cell);\n }\n\n return (\n <div key={cell.column.id} {...cell.getCellProps()} className={cellClassName} onClick={onClickCell} >\n {cell.render('Cell')}\n </div>\n );\n });\n }\n\n React.useEffect(() => {\n if (!props.onSort)\n return;\n\n props.onSort(sortBy);\n }, [sortBy]);\n\n React.useEffect(() => {\n if (!props.globalFilter)\n return;\n\n setGlobalFilter(props.globalFilter);\n }, [props.globalFilter]);\n\n React.useEffect(() => {\n if (!props.hiddenColumns)\n return;\n\n setHiddenColumns(props.hiddenColumns);\n }, [props.hiddenColumns && props.hiddenColumns.length]);\n\n return (\n <div {...getTableProps()} className={props.theme?.table ?? ''}>\n <div className={props.theme?.header ?? ''}>\n {headerGroups.map(headerGroup => (\n <div {...headerGroup.getHeaderGroupProps()} className={props.theme?.headerRow ?? ''}>\n {headerGroup.headers.map(column => (\n <div {...column.getHeaderProps(column.getSortByToggleProps())} className={props.theme?.headerCell ?? ''}>\n {column.render('Header', { renderSortIndicator: () => <SortIndicator column={column} theme={props.theme} /> })}\n {!(column as Column<T>).hideSortIndicator &&\n <SortIndicator column={column} theme={props.theme} />\n }\n </div>\n ))}\n </div>\n ))}\n </div>\n <div {...getTableBodyProps()} className={props.theme?.body ?? ''}>\n { props.enableSortableRows ? (\n <SortableContainerWrapper\n ids={rows.map(row => row.original.id)}\n getDragOverlay={getDragOverlay}\n onSortEnd={props.onSortingRowsEnd}\n >\n {renderTableRows()}\n </SortableContainerWrapper>\n ) : (\n renderTableRows()\n )}\n </div>\n </div>\n );\n}\n\ninterface TableProps<T extends HashObject> extends BaseTableProps<T> {\n enableSlider?: boolean;\n scrollIncrement?: number;\n scrollContainerClassName?: string;\n scrollable?: boolean;\n initialSortBy?: SortingRule<T>[];\n}\n\nTable.defaultProps = {\n scrollIncrement: 250,\n scrollable: false,\n layout: 'flex'\n};\n\nexport function Table<T extends HashObject>(props: TableProps<T>): JSX.Element {\n const { enableSlider, scrollIncrement, scrollable, ...tableProps } = props;\n\n const { ref, scrollState, scroll } = useTableScroll();\n\n if (scrollable) {\n return (\n <Scrollbars\n renderTrackHorizontal={() => <div className={styles.scrollbarTrack} />}\n autoHeightMax={10000}\n autoHeight\n >\n <BaseTable {...tableProps} />\n </Scrollbars>\n );\n }\n\n if (!enableSlider)\n return <BaseTable {...tableProps} />;\n\n function onClickScroll(direction: 'left' | 'right'): void {\n scroll(scrollIncrement * (direction === 'right' ? 1 : -1));\n }\n\n return (\n <div className='mx-n4 overflow-x-hidden overflow-y-hidden'>\n <div className='px-4'>\n <div className='position-relative'>\n <WidgetButton\n direction={WidgetButtonDirection.Left}\n onClick={() => onClickScroll('left')}\n hide={!scrollState.canScrollLeft}\n />\n <div className={`${styles.scrollContainer} ${props.scrollContainerClassName}`} ref={ref}>\n <BaseTable {...tableProps } />\n </div>\n <WidgetButton\n direction={WidgetButtonDirection.Right}\n onClick={() => onClickScroll('right')}\n hide={!scrollState.canScrollRight}\n />\n </div>\n </div>\n </div>\n );\n}","export enum InteractionCorrectness {\n Correct,\n Incorrect,\n AwaitingMarking,\n \n Answered,\n UnAnswered,\n NotApplicable\n}","export enum InteractiveAnswerStatus {\n Incorrect = 0,\n Correct = 1,\n PendingReview = 2\n}","import { Flight } from 'libs/common/react/index';\n\nexport const InsightsDemoRequests = {\n interactive(): Flight.Request {\n return {\n url: `/mocks/insights/interactive.json`,\n key: `demo:interactive`,\n normalize: false\n };\n },\n\n interactiveMetadata(): Flight.Request {\n return {\n url: `/mocks/insights/interactive-metadata.json`,\n key: `demo:interactive:metadata`,\n normalize: false\n };\n },\n\n interactiveResults(): Flight.Request {\n return {\n url: `/mocks/insights/interactive-results.json`,\n key: `demo:interactive:results`,\n normalize: false\n };\n },\n\n videoViews(): Flight.Request {\n return {\n url: `/mocks/insights/video-views.json`,\n key: `demo:video:views`,\n normalize: false\n };\n },\n\n users(): Flight.Request {\n return {\n url: `/mocks/insights/users.json`,\n key: `demo:users`,\n normalize: false\n };\n },\n\n individualHeatmap(): Flight.Request {\n return {\n url: `/mocks/insights/individual-heatmap.json`,\n key: `demo:individual:heatmap`,\n normalize: false\n };\n },\n\n aggregateHeatmap(): Flight.Request {\n return {\n url: `/mocks/insights/aggregate-heatmap.json`,\n key: `demo:aggregate:heatmap`,\n normalize: false\n };\n }\n};","import { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, InteractionTypeId, InteractiveResult, StudentAnswer } from 'libs/shared/interfaces';\n\ntype GetStudentAnswerByActionableItemId = (id: string) => string;\n\nfunction notApplicable(): InteractionCorrectness {\n return InteractionCorrectness.NotApplicable;\n}\n\nfunction awaitingMarking(): InteractionCorrectness {\n return InteractionCorrectness.AwaitingMarking;\n}\n\nfunction isMissingWordCorrect(\n interaction: Interaction,\n getStudentAnswer: GetStudentAnswerByActionableItemId\n): InteractionCorrectness {\n const items = interaction.actionableItems.filter(a => a\n .isCorrect);\n\n if (items.every(a => !getStudentAnswer(a.id)))\n return InteractionCorrectness.UnAnswered;\n\n const correct = items.every(a => a.name.trim().toLowerCase() === getStudentAnswer(a.id)?.trim().toLowerCase());\n return correct ? InteractionCorrectness.Correct : InteractionCorrectness.Incorrect;\n}\n\nfunction isMultipleChoiceCorrect(\n interaction: Interaction,\n getStudentAnswer: GetStudentAnswerByActionableItemId\n): InteractionCorrectness {\n if (interaction.actionableItems.every(a => !getStudentAnswer(a.id)))\n return InteractionCorrectness.UnAnswered;\n \n const correctItems = interaction.actionableItems.filter(a => a.isCorrect);\n\n const correct = correctItems.every(a => {\n const studentAnswer = getStudentAnswer(a.id);\n\n /**\n * In the past we've only ever checked the answer name. But since we introduced the ability to have image interactions\n * with no question text, we've need to swap to saving the id. But past submissions still have the name\n * - Sha\n */\n return studentAnswer?.toString() === a.id?.toString() || studentAnswer === a.name;\n });\n return correct ? InteractionCorrectness.Correct : InteractionCorrectness.Incorrect;\n}\n\nfunction isMarkableAnswerMarkedCorrect(\n interaction: Interaction,\n getStudentAnswer: (id: string) => StudentAnswer\n): InteractionCorrectness {\n let correctness: InteractionCorrectness;\n\n // There should only be one actionableItem\n interaction.actionableItems.forEach(item => {\n const studentAnswer = getStudentAnswer(item.id);\n\n if (!studentAnswer) {\n correctness = InteractionCorrectness.UnAnswered;\n return;\n }\n\n if (studentAnswer.status === InteractiveAnswerStatus.Correct) {\n correctness = InteractionCorrectness.Correct;\n return;\n }\n\n if (studentAnswer.status === InteractiveAnswerStatus.Incorrect) {\n correctness = InteractionCorrectness.Incorrect;\n return;\n }\n\n correctness = InteractionCorrectness.AwaitingMarking;\n });\n\n return correctness;\n}\n\ntype IsCorrectFunction = (interaction: Interaction, result: InteractiveResult) => InteractionCorrectness;\n\nfunction getGetStudentAnswer(interaction: Interaction, result: InteractiveResult): (id: string) => StudentAnswer {\n return (id: string) => {\n const attempt = result?.attempts.find(a => a.id === interaction.id);\n return attempt?.answers.find(s => s.id === id);\n };\n}\n\nfunction wrapIsMissingWordCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n\n return isMissingWordCorrect(interaction, (id: string) => {\n const answer = getStudentAnswer(id);\n return answer?.text;\n });\n}\n\nfunction wrapIsMultipleChoiceCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n\n return isMultipleChoiceCorrect(interaction, (id: string) => {\n const answer = getStudentAnswer(id);\n return answer?.text;\n });\n}\n\nfunction wrapIsMarkableAnswerMarkedCorrect(\n interaction: Interaction,\n result: InteractiveResult\n): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n return isMarkableAnswerMarkedCorrect(interaction, getStudentAnswer);\n}\n\nconst IsCorrectLookup: {[typeId: number]: IsCorrectFunction} = {\n [InteractionTypeId.Annotation]: notApplicable,\n [InteractionTypeId.Image]: notApplicable,\n [InteractionTypeId.MissingWord]: wrapIsMissingWordCorrect,\n [InteractionTypeId.MultipleChoice]: wrapIsMultipleChoiceCorrect,\n [InteractionTypeId.ShortAnswer]: wrapIsMarkableAnswerMarkedCorrect,\n [InteractionTypeId.TrueOrFalse]: wrapIsMultipleChoiceCorrect,\n [InteractionTypeId.Illustration]: wrapIsMarkableAnswerMarkedCorrect\n};\n\nfunction isInteractionCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const isCorrectFn = IsCorrectLookup[interaction.typeId];\n\n return isCorrectFn(interaction, result);\n}\n\nexport const InteractiveCorrectnessHelper = {\n notApplicable,\n awaitingMarking,\n isMissingWordCorrect,\n isMultipleChoiceCorrect,\n isInteractionCorrect\n};\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { FilterStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\n\n\nconst namespace = 'shared.studentResultsTable';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface StudentResultsEmptyStateProps {\n filter: FilterStudentsBy;\n notCompletedImageUrl: string;\n helpingHandImageUrl: string;\n markingRequiredImageUrl: string;\n emptyStateImageUrl: string;\n}\n\nexport function StudentResultsEmptyState(props: StudentResultsEmptyStateProps) {\n if (props.filter === 'not_completed') {\n return (\n <EmptyState className='bg-white rounded-bottom py-5'>\n <EmptyState.Image src={props.notCompletedImageUrl} size='small' />\n <EmptyState.Info>\n {getPhrase('notCompletedDescription')}\n </EmptyState.Info>\n </EmptyState>\n );\n }\n if (props.filter === 'marking_required') {\n return (\n <EmptyState className='bg-white rounded-bottom py-5'>\n <EmptyState.Image src={props.markingRequiredImageUrl} size='small' />\n <EmptyState.Info>\n {getPhrase('markingRequiredDescription')}\n </EmptyState.Info>\n </EmptyState>\n );\n }\n\n if (props.filter === 'helping_hand') {\n return (\n <EmptyState className='bg-white rounded-bottom py-5'>\n <EmptyState.Image src={props.helpingHandImageUrl} size='small' />\n <EmptyState.Info>\n {getPhrase('helpingHandDescription')}\n </EmptyState.Info>\n </EmptyState>\n );\n }\n\n return (\n <EmptyState className='bg-white rounded-bottom py-5'>\n <EmptyState.Image src={props.emptyStateImageUrl} size='small' />\n <EmptyState.Heading>\n {getPhrase('emptyStateHeading')}\n </EmptyState.Heading>\n <EmptyState.Info>\n {getPhrase('emptyStateDescription')}\n </EmptyState.Info>\n </EmptyState>\n );\n}","import React from 'react';\n\nimport { FilterStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'shared.studentResultsTable';\n\ninterface StudentResultsTableFiltersProps {\n filter: FilterStudentsBy;\n setFilter: (filter: FilterStudentsBy) => void;\n}\n\nexport function StudentResultsTableFilterButtons(props: StudentResultsTableFiltersProps) {\n function toggleFilter(selectedFilter: FilterStudentsBy) {\n const updatedFilter = props.filter === selectedFilter ? null : selectedFilter;\n\n props.setFilter(updatedFilter);\n }\n\n function isFilterSelected(filter: FilterStudentsBy) {\n return props.filter === filter;\n }\n\n function getClassName(filter: FilterStudentsBy) {\n return `btn btn-outline-dark ${isFilterSelected(filter) ? 'bg-dark text-white' : ''}`;\n }\n\n return (\n <div className='d-flex align-items-center mb-3'>\n <p className='h6 mb-0'><Text namespace={namespace} phrase='filters' /></p>\n <div className='d-flex border-start ps-3 ms-3 gap-2'>\n <button className={getClassName('not_completed')} onClick={() => toggleFilter('not_completed')}>\n <Text namespace={namespace} phrase='notCompletedFilter' />\n </button>\n <button className={getClassName('marking_required')} onClick={() => toggleFilter('marking_required')}>\n <Text namespace={namespace} phrase='markingRequiredFilter' />\n </button>\n <button className={getClassName('helping_hand')} onClick={() => toggleFilter('helping_hand')}>\n <Text namespace={namespace} phrase='helpingHandFilter' />\n </button>\n </div>\n </div>\n );\n}","import React from 'react';\nimport { Cell, Row, SortingRule } from 'react-table';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { StudentResultsEmptyState } from 'libs/shared/apps/analytics/components/student-results/student-results-table/StudentResultsEmptyState';\nimport { StudentResultsTableFilterButtons } from 'libs/shared/apps/analytics/components/student-results/student-results-table/StudentResultsTableFilters';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { FilterStudentsBy, getSortStudents, SortStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { Table, TableTheme } from 'libs/shared/components/table/Table';\nimport { Config, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport {\n highlightColumns,\n highlightRows,\n RESULTS_COL_WIDTH,\n useGetFixedColumns,\n useGetResultColumns,\n useGetResultsTableData\n} from './StudentResultsTableUtils';\n\nimport styles from './student-results-table.scss';\n\nconst fixedTableTheme: TableTheme = {\n table: `${styles.fixedTable} bg-white rounded-start border border-end-0`,\n header: `${styles.header} border-bottom`,\n headerRow: 'h-100',\n headerCell: 'd-flex align-items-center justify-content-start',\n row: styles.row\n};\n\nconst resultsTableTheme: TableTheme = {\n header: `${styles.header} fw-bold`,\n headerRow: 'h-100',\n headerCell: `${styles.interactionHeaderCellOuter} bg-white border-bottom`,\n row: `${styles.row} ${styles.resultsRow}`,\n cell: styles.resultsCellOuter\n};\n\ninterface StudentResultsTableProps {\n interactive: Interactive;\n interactiveMetadata: InteractiveMetadata;\n results: InteractiveResultSet;\n\n /**\n * As the table data is memoized, it must be prompted to recalculate.\n * Toggle `refreshTable` to do so.\n */\n refreshTable: boolean;\n config?: Config;\n selectedStudentId?: string;\n emptyStateImageUrl?: string;\n notCompletedImageUrl?: string;\n helpingHandImageUrl?: string;\n markingRequiredImageUrl?: string;\n anonymiseUsers?: boolean;\n sortBy?: SortStudentsBy;\n filterBy?: FilterStudentsBy;\n viewStudentResults: (\n student: AnonUser,\n interactiveMetadataId: string,\n interactionId?: string\n ) => void;\n}\n\nexport function StudentResultsTable(props: StudentResultsTableProps): JSX.Element {\n const [ sortBy, setSortBy ] = React.useState<SortingRule<StudentResultsWithSummary>[]>(\n getSortStudents(props.sortBy, 'score')\n );\n const [ filter, setFilter ] = React.useState<FilterStudentsBy>(props.filterBy);\n\n const ref = React.useRef<HTMLDivElement>(null);\n\n const fixedColumns = useGetFixedColumns(props.results, props.anonymiseUsers, props.config?.imageCdnUrl);\n const resultColumns = useGetResultColumns(\n props.interactive,\n props.interactiveMetadata,\n props.results,\n onColumnHover,\n props.refreshTable\n );\n const data = useGetResultsTableData(\n props.interactive,\n props.results,\n props.refreshTable,\n props.anonymiseUsers,\n ArrayHelper.first(sortBy),\n filter\n );\n\n function onSelectStudent({ original }: Row<StudentResultsWithSummary>): void {\n props.viewStudentResults(original.user, props.interactiveMetadata.id);\n }\n\n function onSelectStudentResponse(cell: Cell<StudentResultsWithSummary>): void {\n props.viewStudentResults(\n cell.row.original.user,\n props.interactiveMetadata.id,\n cell.column.id\n );\n }\n\n function onColumnHover(index?: number): void {\n highlightColumns(ref.current, index);\n }\n\n function onRowHover(index?: number): void {\n highlightRows(ref.current, index);\n }\n\n return (\n <div>\n {!!props.results.students.length && <StudentResultsTableFilterButtons filter={filter} setFilter={setFilter} />}\n\n {!data.length && (\n <StudentResultsEmptyState\n emptyStateImageUrl={props.emptyStateImageUrl}\n helpingHandImageUrl={props.helpingHandImageUrl}\n markingRequiredImageUrl={props.markingRequiredImageUrl}\n notCompletedImageUrl={props.notCompletedImageUrl}\n filter={filter}\n />\n )}\n\n {!!data.length && (\n <div ref={ref} className={`d-flex${data.length ? ` ${styles.hasResults}` : ''}`}>\n <Table\n columns={fixedColumns}\n data={data}\n theme={fixedTableTheme}\n onSelectRow={onSelectStudent}\n onRowMouseOver={row => onRowHover(row.index)}\n onRowMouseLeave={() => onRowHover()}\n enableSort\n manualSort\n onSort={setSortBy}\n initialSortBy={sortBy}\n />\n <Table\n columns={resultColumns}\n data={data}\n theme={resultsTableTheme}\n enableSlider\n scrollIncrement={RESULTS_COL_WIDTH * 8}\n onSelectCell={onSelectStudentResponse}\n scrollContainerClassName='rounded-end border border-start-0 border'\n />\n </div>\n )}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialInsights\":\"qSeTe\"};","import React from 'react';\n\nimport styles from './partial-interactive-insights-students.scss';\n\nexport function PartialInteractiveInsightsStudents() {\n return (\n <div>\n <div className='d-flex align-items-center mb-3'>\n <p className='h6 px-4 mb-0 me-4 partial-loading-background'> </p>\n <div className='row g-2 w-50'>\n <div className='col-3'>\n <div className='p-2 rounded-1 partial-loading-background'> </div>\n </div>\n <div className='col-3'>\n <div className='p-2 rounded-1 partial-loading-background'> </div>\n </div>\n <div className='col-3'>\n <div className='p-2 rounded-1 partial-loading-background'> </div>\n </div>\n </div>\n </div>\n <div className='row g-3 mb-5'>\n <div className='col-12'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { StudentResultsTable } from 'libs/shared/apps/analytics/components/student-results/student-results-table/StudentResultsTable';\nimport { FilterStudentsBy, SortStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { Config, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport { PartialInteractiveInsightsStudents } from 'apps/my-shares/components/interactive-insights-students/partial-loading/PartialInteractiveInsightsStudents';\n\ninterface InteractiveInsightsStudentsProps {\n interactive: Interactive;\n interactiveMetadata: InteractiveMetadata;\n results: InteractiveResultSet;\n isFetching: boolean;\n sortBy: SortStudentsBy;\n filterBy: FilterStudentsBy;\n anonymiseUsers: boolean;\n config: Config;\n viewStudentResults: (\n user: AnonUser,\n interactiveMetadataId: string,\n interactionId?: string\n ) => void;\n hasDataLoaded: boolean;\n}\n\nexport function InteractiveInsightsStudents(props: InteractiveInsightsStudentsProps) {\n return (\n <>\n {!props.hasDataLoaded &&\n <PartialInteractiveInsightsStudents />\n }\n\n {props.hasDataLoaded &&\n <StudentResultsTable\n interactive={props.interactive}\n interactiveMetadata={props.interactiveMetadata}\n results={props.results}\n refreshTable={props.isFetching}\n viewStudentResults={props.viewStudentResults}\n emptyStateImageUrl={ImageUrls.Insights.NO_RESPONSES}\n sortBy={props.sortBy}\n filterBy={props.filterBy}\n anonymiseUsers={props.anonymiseUsers}\n notCompletedImageUrl={ImageUrls.Insights.JIGSAW}\n markingRequiredImageUrl={ImageUrls.Insights.CLIPBOARD}\n helpingHandImageUrl={ImageUrls.Insights.SPEECH_BUBBLE_HEART}\n config={props.config}\n />\n }\n </>\n );\n}","import { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { SharePrivacy } from 'libs/shared/apps/share-v2/enums/SharePrivacy';\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { MySharesTableData } from 'apps/my-shares/components/my-shares-table/MySharesTableUtils';\n\nconst namespace = 'myShares.demoInsights';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst DEMO_INSIGHT_DAYS_AGO = 7;\n\nexport const DEMO_INSIGHTS_SHARE: Share = {\n type: ShareType.Link,\n privacy: SharePrivacy.JustMySchool,\n objectId: '0',\n objectTypeId: MasterType.Interactive,\n viewCount: 28,\n accessCount: 15,\n dateCreated: new Date().toISOString(),\n expireDate: null,\n link: {\n shortenedEmbedUrl: '',\n shortenedUrl: ''\n },\n shareId: '0',\n ownerCustomerId: 0,\n ownerId: 0,\n recipients: [],\n options: {\n preventScrubbing: false,\n immediateFeedback: false\n }\n};\n\nexport const DEMO_INSIGHTS_SHARE_TABLE_DATA: MySharesTableData = {\n share: DEMO_INSIGHTS_SHARE,\n sharedObject: null,\n shareRecipients: null,\n dateShared: DateHelper.subtract(new Date(), DEMO_INSIGHT_DAYS_AGO, 'days').toISOString()\n};\n\nconst DEMO_INSIGHTS_APPLINK: Core.AppLink = {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_OVERVIEW_DEMO\n};\n\nexport const DEMO_INSIGHTS_ACTION: ActionOptions = {\n svgName: cvSvgLibrary.Analytics,\n label: getPhrase('demoInsights'),\n appLink: DEMO_INSIGHTS_APPLINK,\n group: 'insights',\n className: 'btn btn-outline-dark'\n};\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { AnalyticsFilterHelper } from 'libs/shared/apps/analytics/utils/AnalyticsFilterUtils';\nimport { FilterStudentsBy, SortStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { InsightsDemoRequests } from 'libs/shared/flight-requests/InsightsDemoRequests';\nimport { useLockContentWidth } from 'libs/shared/hooks/useLockContentWidth';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Config, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { InsightsHeader } from 'apps/my-shares/components/insights-header/InsightsHeader';\nimport { InteractiveInsightsStudents } from 'apps/my-shares/components/interactive-insights-students/InteractiveInsightsStudents';\nimport { DEMO_INSIGHTS_SHARE } from 'apps/my-shares/constants/MySharesDemoInsights';\nimport { getInsightsDemoInteractiveTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\n\nconst namespace = 'insights.interactiveInsightsStudents';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractiveInsightsStudentsViewProps {\n sortBy: SortStudentsBy;\n filterBy: FilterStudentsBy;\n}\n\nexport function InteractiveInsightsStudentsDemoView(props: InteractiveInsightsStudentsViewProps) {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n useLockContentWidth();\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(InsightsDemoRequests.interactiveMetadata());\n\n const interactive = Flight.useBasicFetch<Interactive>(InsightsDemoRequests.interactive());\n\n const audienceAppLinkParams = AnalyticsFilterHelper.getAudienceAppLinkParams();\n const dateRangeAppLinkParams = AnalyticsFilterHelper.getDateRangeAppLinkParams();\n\n const results = Flight.useBasicFetch<InteractiveResultSet>(InsightsDemoRequests.interactiveResults());\n\n const hasDataLoaded = interactive.data && interactiveMetadata.data && !!results.data;\n\n useSetPageMetadata({ title: interactiveMetadata.data ? getPhrase('pageTitle', { video: interactiveMetadata.data?.name }) : null });\n\n function viewStudentResults(\n user: AnonUser,\n interactiveMetadataId: string,\n interactionId?: string\n ) {\n Core.AppLinkHelper.trigger({\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_STUDENT_RESULTS_DEMO,\n params: {\n studentId: user.id,\n interactiveMetadataId,\n interactionId,\n sessionId: user.sessionId\n }\n });\n }\n\n const params = {\n ...audienceAppLinkParams,\n ...dateRangeAppLinkParams\n };\n\n return (\n <div className='px-3'>\n <InsightsHeader\n tabs={getInsightsDemoInteractiveTabs(interactiveMetadata.data?.id, 'results', params)}\n video={interactiveMetadata.data}\n dateRangeAppLinkParams={dateRangeAppLinkParams}\n share={{\n ...DEMO_INSIGHTS_SHARE,\n objectId: interactiveMetadata.data?.id\n }}\n yearGroups={[]}\n isDemo\n />\n\n <InteractiveInsightsStudents\n interactiveMetadata={interactiveMetadata.data}\n viewStudentResults={viewStudentResults}\n interactive={interactive.data}\n results={results.data}\n filterBy={props.filterBy}\n sortBy={props.sortBy}\n isFetching={results.isFetching}\n anonymiseUsers={anonymiseUsers}\n hasDataLoaded={hasDataLoaded}\n config={config.data}\n />\n </div>\n );\n}"],"names":["groupStudents","interactive","results","scoreThreshold","groups","markingRequired","lowScore","highScore","completed","notCompleted","interactions","interactionIds","Set","map","i","id","students","forEach","s","withSummary","summary","getStudentResultsSummary","awaitingMarking","push","attempts","filter","a","has","answers","questionId","length","size","percentCorrect","HIGH","MODERATE","sortedLowScore","sortedHighScore","getInteractionById","interactionId","find","toString","getMarkedAnswerId","answer","resultId","getMarkedStatus","studentResults","markedAnswers","result","studentResponse","every","status","getInteractionResultsSummary","interaction","numStudents","numCorrect","answered","unanswered","correctness","correct","numInteractions","answeredInteractions","DragOverlayStyles","opacity","cursor","calculateScrollState","ref","canScrollLeft","current","scrollLeft","canScrollRight","scrollWidth","clientWidth","SortIndicator","props","column","canSort","className","isSorted","theme","sortIndicator","SvgContainer","svgName","isSortedDesc","S","BaseTable","ids","idHash","tableOptions","columns","data","disableSortBy","enableSort","manualSortBy","manualSort","autoResetHiddenColumns","autoResetSortBy","initialState","sortBy","initialSortBy","initialSelectedRowIds","selectedRowIds","getRowId","useTable","plugins","useSortBy","useRowSelect","layout","useFlexLayout","useBlockLayout","allowFiltering","useFilters","allowGlobalFiltering","useGlobalFilter","getPlugins","getTableProps","getTableBodyProps","headerGroups","rows","prepareRow","toggleAllRowsSelected","setGlobalFilter","setHiddenColumns","state","renderTableRows","emptyState","row","FunctionHelper","isSelected","selectedRow","onSelectRow","enableSortableRows","getTableRowsClass","rowAppLink","getRowAppLink","onClickRow","allowSelectMultipleRows","toggleRowSelected","renderRow","sortableProps","dragAttributes","dragListeners","getSortableProps","role","key","AppLink","appLink","renderCells","onClick","rowProps","getRowProps","SortableItemWrapper","original","childProps","childComponent","cells","cell","cellClassName","onSelectCell","getCellClassName","getCellProps","render","onSort","globalFilter","hiddenColumns","table","header","headerGroup","getHeaderGroupProps","headerRow","headers","getHeaderProps","getSortByToggleProps","headerCell","renderSortIndicator","hideSortIndicator","body","SortableContainerWrapper","getDragOverlay","rowIndex","findIndex","item","style","onSortEnd","onSortingRowsEnd","Table","enableSlider","scrollIncrement","scrollable","tableProps","elRef","scrollState","setScrollState","throttledOnScroll","el","removeEventListener","addEventListener","scroll","scrollBy","left","top","behavior","useTableScroll","renderTrackHorizontal","autoHeightMax","autoHeight","onClickScroll","direction","WidgetButton","W","hide","scrollContainerClassName","defaultProps","InteractionCorrectness","InteractiveAnswerStatus","InsightsDemoRequests","url","normalize","interactiveMetadata","interactiveResults","videoViews","users","individualHeatmap","aggregateHeatmap","notApplicable","isMissingWordCorrect","getStudentAnswer","items","actionableItems","isCorrect","name","trim","toLowerCase","isMultipleChoiceCorrect","studentAnswer","getGetStudentAnswer","attempt","wrapIsMultipleChoiceCorrect","text","wrapIsMarkableAnswerMarkedCorrect","isMarkableAnswerMarkedCorrect","IsCorrectLookup","InteractiveCorrectnessHelper","isInteractionCorrect","isCorrectFn","typeId","getPhrase","LanguageService","StudentResultsEmptyState","EmptyState","src","notCompletedImageUrl","markingRequiredImageUrl","helpingHandImageUrl","emptyStateImageUrl","StudentResultsTableFilterButtons","toggleFilter","selectedFilter","updatedFilter","setFilter","getClassName","isFilterSelected","Text","namespace","phrase","fixedTableTheme","resultsTableTheme","StudentResultsTable","setSortBy","filterBy","fixedColumns","anonymiseUsers","config","imageCdnUrl","resultColumns","index","refreshTable","ArrayHelper","onRowHover","viewStudentResults","user","onRowMouseOver","onRowMouseLeave","PartialInteractiveInsightsStudents","InteractiveInsightsStudents","hasDataLoaded","isFetching","ImageUrls","DEMO_INSIGHTS_SHARE","type","privacy","objectId","objectTypeId","viewCount","accessCount","dateCreated","Date","toISOString","expireDate","link","shortenedEmbedUrl","shortenedUrl","shareId","ownerCustomerId","ownerId","recipients","options","preventScrubbing","immediateFeedback","DEMO_INSIGHTS_SHARE_TABLE_DATA","share","sharedObject","shareRecipients","dateShared","DEMO_INSIGHTS_APPLINK","application","action","DEMO_INSIGHTS_ACTION","label","group","InteractiveInsightsStudentsDemoView","audienceAppLinkParams","dateRangeAppLinkParams","title","video","params","tabs","yearGroups","isDemo","interactiveMetadataId","studentId","sessionId"],"sourceRoot":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/1867-0823a787c3-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/analytics/components/engagement-heat-map/engagement-heat-map.scss","file:///app/packages/libs/shared/src/apps/analytics/components/engagement-heat-map/EngagementHeatMap.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insight-card/insight-card.scss","file:///app/packages/libs/shared/src/apps/analytics/components/insight-card/InsightCard.tsx","file:///app/packages/libs/shared/src/apps/analytics/constants/ChartStyles.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/EngagementUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/InteractiveUtils.ts","file:///app/packages/libs/shared/src/apps/share/components/recipient-item/user-recipient-item-metadata/UserRecipientItemMetadata.tsx","file:///app/packages/libs/shared/src/enums/InteractionCorrectness.ts","file:///app/packages/libs/shared/src/enums/InteractiveAnswerStatus.ts","file:///app/packages/libs/shared/src/flight-requests/InsightsDemoRequests.ts","file:///app/packages/libs/shared/src/utils/InteractiveCorrectnessHelper.ts","file:///app/packages/projects/lite/src/apps/my-shares/constants/MySharesDemoInsights.ts","file:///app/packages/projects/lite/src/apps/my-shares/views/demo/overview/InteractiveInsightsOverviewDemoView.tsx","file:///app/packages/projects/lite/src/apps/my-shares/views/demo/overview/InteractiveInsightsOverviewDemoUtils.ts","file:///app/packages/libs/shared/src/apps/share/components/recipient-item/recipient-item.scss"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"heatMap\":\"epapa\",\"legend\":\"uhH4p\"};","import React from 'react';\nimport chroma from 'chroma-js';\n\nimport { getFullHeatMap } from 'libs/shared/apps/analytics/utils/EngagementUtils';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Engagement } from 'libs/shared/interfaces';\n\nimport styles from './engagement-heat-map.scss';\n\nconst namespace = 'shared.engagementHeatMap';\n\nconst ZERO_COLOUR = '#f1f1f1';\nconst MIN_COLOUR = '#daf07d';\nconst MAX_COLOUR = '#08bd1a';\n\nconst COLOUR_SCALE = chroma.scale([ MIN_COLOUR, MAX_COLOUR ]);\n\nconst LEGEND_VALUES = [ 0, 0.01, 0.25, 0.5, 0.75, 1 ];\n\nfunction getBackgroundColor(value: number, max: number): string {\n if (!value)\n return ZERO_COLOUR;\n\n return COLOUR_SCALE(value / max).hex();\n}\n\nfunction getGradient(data: number[], max: number): string {\n const gradient: string[] = [];\n\n for (let i = 0; i < data.length; i++) {\n const previousValue = i > 0 && data[i - 1];\n const currentValue = data[i];\n const nextValue = i < data.length - 1 && data[i + 1];\n\n /**\n * We want to capture colour changes but if a value has the same value\n * of both of its neighbours, we can skip it.\n */\n if (currentValue === previousValue && currentValue === nextValue)\n continue;\n\n gradient.push(`${getBackgroundColor(currentValue, max)} ${100 / data.length * i}%`);\n }\n\n return `linear-gradient(to right, ${gradient.join(',')})`;\n}\n\nexport function EngagementHeatMapLegend(): JSX.Element {\n const max = Math.max(...LEGEND_VALUES);\n const legendSquareWidthPercentage = 100 / LEGEND_VALUES.length;\n\n return (\n <div className='d-flex justify-content-between w-100'>\n <Text namespace={namespace} phrase='less' />\n <div className={`d-flex mx-1 flex-grow-1 ${styles.legend}`}>\n {LEGEND_VALUES.map((val, idx) => (\n <div\n key={idx}\n style={{\n width: `${legendSquareWidthPercentage}%`,\n backgroundColor: getBackgroundColor(val, max)\n }}\n />\n ))}\n </div>\n <Text namespace={namespace} phrase='more' />\n </div>\n );\n}\n\ninterface EngagementHeatMapProps {\n engagement: Engagement;\n max?: number;\n className?: string;\n}\n\nexport function EngagementHeatMap(props: EngagementHeatMapProps): JSX.Element {\n const heatMap = getFullHeatMap(props.engagement);\n const max = props.max ?? Math.max(...heatMap);\n\n return (\n <div\n className={`border rounded ${styles.heatMap} ${props.className ?? ''}`}\n style={{\n background: getGradient(heatMap, max)\n }}\n />\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"icon\":\"sAmpy\",\"count\":\"faDs4\"};","import React from 'react';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\n\nimport styles from './insight-card.scss';\n\ninterface InsightCardProps extends React.PropsWithChildren {\n svgName: string;\n svgClassName: string;\n title: string;\n subtitle?: string;\n count?: number;\n}\n\nexport function InsightCard(props: InsightCardProps) {\n return (\n <section className='d-flex flex-column border rounded p-3 h-100'>\n <div className={`d-flex ${props.subtitle ? 'align-items-top' : 'align-items-center'} mb-2`}>\n <div className={`${styles.icon} ${props.svgClassName} rounded-circle d-flex justify-content-center align-items-center`}>\n <SvgContainer svgName={props.svgName} size={SvgContainerSize.Small} />\n </div>\n <div className='d-flex flex-column ms-2'>\n <h2 className='h6 mb-0'>{props.title}</h2>\n </div>\n {typeof props.count === 'number' && (\n <div className={`${styles.count} d-flex justify-content-center align-items-center bg-light rounded-circle ms-auto`}>\n {props.count}\n </div>\n )}\n </div>\n {props.children}\n </section>\n );\n}","export const CHART_FONT_STYLES = {\n fontSize: '12px',\n fontFamily: `\"Inter\",-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,\"Noto Sans\",\"Liberation Sans\",sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\"`,\n fontWeight: '400',\n color: '#313543'\n};","import { Engagement } from 'libs/shared/interfaces';\n\n/**\n * The heat map in the API response won't contain trailing zeros so we need to add those\n * in manually.\n */\nexport function getFullHeatMap(engagement: Engagement): number[] {\n const videoDuration = engagement.videoDuration || 0;\n \n return (new Array(Math.ceil(videoDuration))).fill(null).map((t, idx) => engagement?.heatMap[idx] || 0);\n}\n\nexport function getEngagementRate(engagement: Engagement[]): number {\n return engagement?.reduce((prev, next) => prev + next.engagementRate / engagement.length, 0);\n}","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { ResultsSummary } from 'libs/shared/apps/analytics/interfaces/ResultsSummary';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { ScoreThresholdDefaults, ScoreThresholds } from 'libs/shared/constants/ScoreThresholds';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, StudentAnswer, StudentResults } from 'libs/shared/interfaces';\nimport { Interactive, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { flattenInteractions, getInteractions, getStudentAttempt, getStudentResult } from 'libs/shared/utils/InteractiveHelper';\n\ninterface StudentGroups {\n markingRequired: StudentResultsWithSummary[];\n lowScore: StudentResultsWithSummary[];\n highScore: StudentResultsWithSummary[];\n completed: StudentResultsWithSummary[];\n notCompleted: StudentResultsWithSummary[];\n}\n\nexport function groupStudents(\n interactive: Interactive,\n results: InteractiveResultSet,\n scoreThreshold?: ScoreThresholds\n): StudentGroups {\n const groups: StudentGroups = {\n markingRequired: [],\n lowScore: [],\n highScore: [],\n completed: [],\n notCompleted: []\n };\n\n const interactions = getInteractions(interactive);\n const interactionIds = new Set(interactions.map(i => i.id));\n \n results.students.forEach(s => {\n const withSummary = {\n ...s,\n summary: getStudentResultsSummary(interactive, s)\n };\n \n if (withSummary.summary.awaitingMarking) {\n groups.markingRequired.push(withSummary);\n return;\n }\n\n const result = ArrayHelper.last(s.results);\n const answeredInteractions = result.attempts.filter(a => !!interactionIds.has(a?.answers[0]?.questionId)).length;\n\n if (answeredInteractions === interactionIds.size) {\n groups.completed.push(withSummary);\n } else {\n groups.notCompleted.push(withSummary);\n return;\n }\n \n if (withSummary.summary.percentCorrect >= (scoreThreshold?.HIGH || ScoreThresholdDefaults.HIGH))\n groups.highScore.push(withSummary);\n \n if (withSummary.summary.percentCorrect < (scoreThreshold?.MODERATE || ScoreThresholdDefaults.MODERATE))\n groups.lowScore.push(withSummary);\n });\n \n const sortedLowScore = ArrayHelper.sortBy(groups.lowScore, s => s.summary.percentCorrect);\n const sortedHighScore = ArrayHelper.sortBy(groups.highScore, s => -s.summary.percentCorrect);\n \n return {\n ...groups,\n lowScore: sortedLowScore,\n highScore: sortedHighScore\n };\n}\n\nexport function getInteractionById(interactive: Interactive, interactionId: string): Interaction {\n const flattenedInteractions = flattenInteractions(interactive);\n return flattenedInteractions.find(i => i.id.toString() === interactionId.toString());\n}\n\n/**\n * We need to use the question and result ids as a list of one student's responses\n * to multiple questions will all have the same result id and a list of multiple\n * students responses to one question will all have the same questionId.\n */\nexport function getMarkedAnswerId(answer: StudentAnswer): string {\n return `${answer.questionId}:${answer.resultId}`;\n}\n\nexport function getMarkedStatus(\n interactionId: string,\n studentResults: StudentResults,\n markedAnswers: MarkedAnswerHash\n): InteractiveAnswerStatus {\n const result = getStudentResult(studentResults);\n const studentResponse = getStudentAttempt(interactionId, result);\n\n const isMarkedCorrect = studentResponse?.answers.every(a => {\n return markedAnswers[getMarkedAnswerId(a)]?.status === InteractiveAnswerStatus.Correct;\n });\n\n if (isMarkedCorrect)\n return InteractiveAnswerStatus.Correct;\n\n const isMarkedIncorrect = studentResponse?.answers.every(a => {\n return markedAnswers[getMarkedAnswerId(a)]?.status === InteractiveAnswerStatus.Incorrect;\n });\n\n if (isMarkedIncorrect)\n return InteractiveAnswerStatus.Incorrect;\n}\n\nexport function getInteractionResultsSummary(\n interaction: Interaction,\n results: InteractiveResultSet\n): ResultsSummary {\n const numStudents = results.students.length;\n let numCorrect = 0;\n let answered = 0;\n let unanswered = 0;\n let awaitingMarking = 0;\n let attempts = 0;\n\n results.students.forEach(s => {\n const result = getStudentResult(s);\n\n if (!result)\n return;\n\n attempts = attempts + s.results.length;\n\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(interaction, result);\n\n if (correctness === InteractionCorrectness.Correct)\n numCorrect++;\n\n if (correctness === InteractionCorrectness.UnAnswered)\n unanswered++;\n\n if (correctness === InteractionCorrectness.AwaitingMarking)\n awaitingMarking++;\n\n if (correctness !== InteractionCorrectness.UnAnswered)\n answered++;\n });\n\n\n const percentCorrect = numStudents > 0\n ? numCorrect / numStudents\n : 0;\n\n return {\n percentCorrect,\n correct: numCorrect,\n answered,\n unanswered,\n awaitingMarking,\n attempts\n };\n}\n\nexport function getStudentResultsSummary(interactive: Interactive, studentResults: StudentResults): ResultsSummary {\n const result = getStudentResult(studentResults);\n\n const interactions = getInteractions(interactive);\n\n const numInteractions = interactions.length;\n\n let numCorrect = 0;\n let awaitingMarking = 0;\n\n interactions.forEach(i => {\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(i, result);\n\n if (correctness === InteractionCorrectness.Correct)\n numCorrect++;\n\n if (correctness === InteractionCorrectness.AwaitingMarking)\n awaitingMarking++;\n });\n\n const percentCorrect = numInteractions > 0 ? numCorrect / numInteractions : 0;\n\n /**\n * Our interactions list has images and annotations filtered out.\n * We built a map of valid questions, so that we can calculate the unswered accurately.\n * We're doing this because of a bug that caused annotations and images to record answers in the player.\n * - Sha\n */\n const interactionIds = new Set(interactions.map(i => i.id));\n const answeredInteractions = result.attempts.filter(a => !!interactionIds.has(a?.answers[0]?.questionId)).length;\n\n return {\n answered: answeredInteractions,\n attempts: studentResults.results.length,\n unanswered: numInteractions - answeredInteractions,\n percentCorrect,\n correct: numCorrect,\n awaitingMarking\n };\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { anonymiseUserName } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { BaseObject, User } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from '../recipient-item.scss';\n\nconst namespace = 'shared.userRecipientItemMetadata';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getSubText(user: User): string {\n const userType = UserHelper.getUserType(user);\n const role = UserHelper.getUserRole(user);\n\n if (userType === UserGroup.Staff) {\n if (role === UserRole.Admin)\n return getPhrase('admin');\n\n return getPhrase('staff');\n }\n\n const yearGroup = UserHelper.getYearGroup(user);\n \n /**\n * Tertiary puts all students into a single group called 'Learners'.\n * When a student is in the 'Learners' group, we don't want to display the group name,\n * but instead we want to just show \"Student\". - Sha\n */\n if (yearGroup?.name && yearGroup.name !== 'Learners')\n return yearGroup.name;\n\n return getPhrase('student');\n}\n\nfunction getUserProps({\n user, anonymiseUsers, showDisplayName\n}: {\n user: AnonUser,\n showDisplayName: boolean;\n anonymiseUsers?: boolean;\n}) {\n if (user.sessionId) {\n const anonName = anonymiseUserName(user, anonymiseUsers);\n const nameParts = anonName.split(' ').filter(n => !!n);\n\n return {\n name: anonName,\n surname: nameParts.slice(1).join(' '),\n avatarUrl: null\n };\n }\n\n return {\n name: anonymiseUsers\n ? anonymiseUserName(user, true)\n : showDisplayName\n ? UserHelper.getDisplayName(user)\n : UserHelper.getFullName(user),\n surname: user.surname,\n avatarUrl: user.avatar?.url\n };\n}\n\nUserRecipientItemMetadata.defaults = {\n showSubText: true\n};\n\ninterface UserRecipientItemMetadataProps {\n user: AnonUser;\n imageCdnUrl: string;\n detailsClassName?: string;\n avatarClassName?: string;\n showDisplayName: boolean;\n nameClassName?: string;\n showSubText?: boolean;\n anonymiseUsers?: boolean;\n getSubText?: (user: BaseObject) => string;\n}\n\nexport function UserRecipientItemMetadata(props: UserRecipientItemMetadataProps): JSX.Element {\n const { name, surname, avatarUrl } = getUserProps(props);\n\n return (\n <>\n <div className={`${styles.avatarContainer} ${props.avatarClassName} d-inline-block flex-shrink-0`}>\n <Avatar\n imageUrl={avatarUrl}\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(name, surname)}\n showAnonymousUser={!props.anonymiseUsers && !!props.user.sessionId}\n anonymiseUsers={props.anonymiseUsers}\n anonymousSvgSize={SvgContainerSize.Small}\n />\n </div>\n\n <div className={props.detailsClassName}>\n <h4 className={classNames('font-size-normal fw-normal m-0', props.nameClassName)}>\n {name}\n </h4>\n {props.showSubText && `id` in props.user && <p className='text-secondary m-0'>{props.getSubText ? props.getSubText(props.user) : getSubText(props.user)}</p>}\n </div>\n </>\n );\n}","export enum InteractionCorrectness {\n Correct,\n Incorrect,\n AwaitingMarking,\n \n Answered,\n UnAnswered,\n NotApplicable\n}","export enum InteractiveAnswerStatus {\n Incorrect = 0,\n Correct = 1,\n PendingReview = 2\n}","import { Flight } from 'libs/common/react/index';\n\nexport const InsightsDemoRequests = {\n interactive(): Flight.Request {\n return {\n url: `/mocks/insights/interactive.json`,\n key: `demo:interactive`,\n normalize: false\n };\n },\n\n interactiveMetadata(): Flight.Request {\n return {\n url: `/mocks/insights/interactive-metadata.json`,\n key: `demo:interactive:metadata`,\n normalize: false\n };\n },\n\n interactiveResults(): Flight.Request {\n return {\n url: `/mocks/insights/interactive-results.json`,\n key: `demo:interactive:results`,\n normalize: false\n };\n },\n\n videoViews(): Flight.Request {\n return {\n url: `/mocks/insights/video-views.json`,\n key: `demo:video:views`,\n normalize: false\n };\n },\n\n users(): Flight.Request {\n return {\n url: `/mocks/insights/users.json`,\n key: `demo:users`,\n normalize: false\n };\n },\n\n individualHeatmap(): Flight.Request {\n return {\n url: `/mocks/insights/individual-heatmap.json`,\n key: `demo:individual:heatmap`,\n normalize: false\n };\n },\n\n aggregateHeatmap(): Flight.Request {\n return {\n url: `/mocks/insights/aggregate-heatmap.json`,\n key: `demo:aggregate:heatmap`,\n normalize: false\n };\n }\n};","import { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, InteractionTypeId, InteractiveResult, StudentAnswer } from 'libs/shared/interfaces';\n\ntype GetStudentAnswerByActionableItemId = (id: string) => string;\n\nfunction notApplicable(): InteractionCorrectness {\n return InteractionCorrectness.NotApplicable;\n}\n\nfunction awaitingMarking(): InteractionCorrectness {\n return InteractionCorrectness.AwaitingMarking;\n}\n\nfunction isMissingWordCorrect(\n interaction: Interaction,\n getStudentAnswer: GetStudentAnswerByActionableItemId\n): InteractionCorrectness {\n const items = interaction.actionableItems.filter(a => a\n .isCorrect);\n\n if (items.every(a => !getStudentAnswer(a.id)))\n return InteractionCorrectness.UnAnswered;\n\n const correct = items.every(a => a.name.trim().toLowerCase() === getStudentAnswer(a.id)?.trim().toLowerCase());\n return correct ? InteractionCorrectness.Correct : InteractionCorrectness.Incorrect;\n}\n\nfunction isMultipleChoiceCorrect(\n interaction: Interaction,\n getStudentAnswer: GetStudentAnswerByActionableItemId\n): InteractionCorrectness {\n if (interaction.actionableItems.every(a => !getStudentAnswer(a.id)))\n return InteractionCorrectness.UnAnswered;\n \n const correctItems = interaction.actionableItems.filter(a => a.isCorrect);\n\n const correct = correctItems.every(a => {\n const studentAnswer = getStudentAnswer(a.id);\n\n /**\n * In the past we've only ever checked the answer name. But since we introduced the ability to have image interactions\n * with no question text, we've need to swap to saving the id. But past submissions still have the name\n * - Sha\n */\n return studentAnswer?.toString() === a.id?.toString() || studentAnswer === a.name;\n });\n return correct ? InteractionCorrectness.Correct : InteractionCorrectness.Incorrect;\n}\n\nfunction isMarkableAnswerMarkedCorrect(\n interaction: Interaction,\n getStudentAnswer: (id: string) => StudentAnswer\n): InteractionCorrectness {\n let correctness: InteractionCorrectness;\n\n // There should only be one actionableItem\n interaction.actionableItems.forEach(item => {\n const studentAnswer = getStudentAnswer(item.id);\n\n if (!studentAnswer) {\n correctness = InteractionCorrectness.UnAnswered;\n return;\n }\n\n if (studentAnswer.status === InteractiveAnswerStatus.Correct) {\n correctness = InteractionCorrectness.Correct;\n return;\n }\n\n if (studentAnswer.status === InteractiveAnswerStatus.Incorrect) {\n correctness = InteractionCorrectness.Incorrect;\n return;\n }\n\n correctness = InteractionCorrectness.AwaitingMarking;\n });\n\n return correctness;\n}\n\ntype IsCorrectFunction = (interaction: Interaction, result: InteractiveResult) => InteractionCorrectness;\n\nfunction getGetStudentAnswer(interaction: Interaction, result: InteractiveResult): (id: string) => StudentAnswer {\n return (id: string) => {\n const attempt = result?.attempts.find(a => a.id === interaction.id);\n return attempt?.answers.find(s => s.id === id);\n };\n}\n\nfunction wrapIsMissingWordCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n\n return isMissingWordCorrect(interaction, (id: string) => {\n const answer = getStudentAnswer(id);\n return answer?.text;\n });\n}\n\nfunction wrapIsMultipleChoiceCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n\n return isMultipleChoiceCorrect(interaction, (id: string) => {\n const answer = getStudentAnswer(id);\n return answer?.text;\n });\n}\n\nfunction wrapIsMarkableAnswerMarkedCorrect(\n interaction: Interaction,\n result: InteractiveResult\n): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n return isMarkableAnswerMarkedCorrect(interaction, getStudentAnswer);\n}\n\nconst IsCorrectLookup: {[typeId: number]: IsCorrectFunction} = {\n [InteractionTypeId.Annotation]: notApplicable,\n [InteractionTypeId.Image]: notApplicable,\n [InteractionTypeId.MissingWord]: wrapIsMissingWordCorrect,\n [InteractionTypeId.MultipleChoice]: wrapIsMultipleChoiceCorrect,\n [InteractionTypeId.ShortAnswer]: wrapIsMarkableAnswerMarkedCorrect,\n [InteractionTypeId.TrueOrFalse]: wrapIsMultipleChoiceCorrect,\n [InteractionTypeId.Illustration]: wrapIsMarkableAnswerMarkedCorrect\n};\n\nfunction isInteractionCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const isCorrectFn = IsCorrectLookup[interaction.typeId];\n\n return isCorrectFn(interaction, result);\n}\n\nexport const InteractiveCorrectnessHelper = {\n notApplicable,\n awaitingMarking,\n isMissingWordCorrect,\n isMultipleChoiceCorrect,\n isInteractionCorrect\n};\n","import { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { SharePrivacy } from 'libs/shared/apps/share-v2/enums/SharePrivacy';\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { MySharesTableData } from 'apps/my-shares/components/my-shares-table/MySharesTableUtils';\n\nconst namespace = 'myShares.demoInsights';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst DEMO_INSIGHT_DAYS_AGO = 7;\n\nexport const DEMO_INSIGHTS_SHARE: Share = {\n type: ShareType.Link,\n privacy: SharePrivacy.JustMySchool,\n objectId: '0',\n objectTypeId: MasterType.Interactive,\n viewCount: 28,\n accessCount: 15,\n dateCreated: new Date().toISOString(),\n expireDate: null,\n link: {\n shortenedEmbedUrl: '',\n shortenedUrl: ''\n },\n shareId: '0',\n ownerCustomerId: 0,\n ownerId: 0,\n recipients: [],\n options: {\n preventScrubbing: false,\n immediateFeedback: false\n }\n};\n\nexport const DEMO_INSIGHTS_SHARE_TABLE_DATA: MySharesTableData = {\n share: DEMO_INSIGHTS_SHARE,\n sharedObject: null,\n shareRecipients: null,\n dateShared: DateHelper.subtract(new Date(), DEMO_INSIGHT_DAYS_AGO, 'days').toISOString()\n};\n\nconst DEMO_INSIGHTS_APPLINK: Core.AppLink = {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_OVERVIEW_DEMO\n};\n\nexport const DEMO_INSIGHTS_ACTION: ActionOptions = {\n svgName: cvSvgLibrary.Analytics,\n label: getPhrase('demoInsights'),\n appLink: DEMO_INSIGHTS_APPLINK,\n group: 'insights',\n className: 'btn btn-outline-dark'\n};\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { BaseAnalyticsEventResponse } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { AnalyticsFilterHelper } from 'libs/shared/apps/analytics/utils/AnalyticsFilterUtils';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { InsightsDemoRequests } from 'libs/shared/flight-requests/InsightsDemoRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useLockContentWidth } from 'libs/shared/hooks/useLockContentWidth';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Config, CurrentUser, Engagement, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\n\nimport { InsightsHeader } from 'apps/my-shares/components/insights-header/InsightsHeader';\nimport { InteractiveInsightsOverview } from 'apps/my-shares/components/interactive-insights-overview/InteractiveInsightsOverview';\nimport { DEMO_INSIGHTS_SHARE } from 'apps/my-shares/constants/MySharesDemoInsights';\nimport { getInsightsDemoInteractiveTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\nimport { getInteractiveInsightsAppLinks } from 'apps/my-shares/views/demo/overview/InteractiveInsightsOverviewDemoUtils';\n\nconst namespace = 'insights.interactiveInsightsOverviewView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function InteractiveInsightsOverviewDemoView() {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n useLockContentWidth();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n InsightsDemoRequests.interactiveMetadata()\n );\n\n const interactive = Flight.useBasicFetch<Interactive>(InsightsDemoRequests.interactive());\n\n const audienceAppLinkParams = AnalyticsFilterHelper.getAudienceAppLinkParams();\n const dateRangeAppLinkParams = AnalyticsFilterHelper.getDateRangeAppLinkParams();\n\n const results = Flight.useBasicFetch<InteractiveResultSet>(InsightsDemoRequests.interactiveResults());\n\n const aggregateEngagement = Flight.useBasicFetch<Engagement>(\n InsightsDemoRequests.aggregateHeatmap()\n );\n\n const videoViews = Flight.useBasicFetch<BaseAnalyticsEventResponse>(\n InsightsDemoRequests.videoViews()\n );\n\n useSetPageMetadata({ title: interactiveMetadata.data ? getPhrase('pageTitle', { video: interactiveMetadata.data?.name }) : null });\n\n const hasDataLoaded =\n currentUser.data &&\n config.data &&\n interactiveMetadata.data &&\n interactive.data &&\n results.data &&\n aggregateEngagement.data &&\n !!videoViews.data;\n\n const params = {\n ...audienceAppLinkParams,\n ...dateRangeAppLinkParams\n };\n const interactiveInsightsAppLinks = getInteractiveInsightsAppLinks(\n '',\n params\n );\n\n const share = {\n ...DEMO_INSIGHTS_SHARE,\n objectId: interactiveMetadata.data?.id\n };\n\n return (\n <div className='px-3'>\n <InsightsHeader\n video={interactiveMetadata.data}\n tabs={getInsightsDemoInteractiveTabs(interactiveMetadata.data?.id, 'insights', params)}\n dateRangeAppLinkParams={dateRangeAppLinkParams}\n share={share}\n yearGroups={[]}\n isDemo\n />\n\n <InteractiveInsightsOverview\n aggregateEngagement={aggregateEngagement.data}\n interactive={interactive.data}\n interactiveMetadata={interactiveMetadata.data}\n classroomStudents={null}\n results={results.data}\n osCount={videoViews.data?.osCount}\n config={config.data}\n interactiveInsightsAppLinks={interactiveInsightsAppLinks}\n anonymiseUsers={anonymiseUsers}\n hasDataLoaded={hasDataLoaded}\n share={share}\n />\n </div>\n );\n}","import { HashObject } from 'libs/common/react/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nexport function getInteractiveInsightsAppLinks(id: string, params?: HashObject) {\n return {\n resultsAppLink: {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_STUDENTS_DEMO,\n args: [id],\n params\n },\n questionsAppLink: {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_QUESTIONS_DEMO,\n args: [id],\n params\n },\n heatmapAppLink: {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_HEATMAP_DEMO,\n args: [id],\n params\n }\n };\n}","// extracted by mini-css-extract-plugin\nexport default {\"removeRecipient\":\"mCbMC\",\"recipientItem\":\"kdcb0\",\"showSpinner\":\"xH6Mu\",\"avatarContainer\":\"Zcpg3\",\"recipientDetails\":\"v5EmV\",\"recipientDetailsWithRemoveButton\":\"_V928\"};"],"names":["namespace","ZERO_COLOUR","COLOUR_SCALE","LEGEND_VALUES","getBackgroundColor","value","max","hex","getGradient","data","gradient","i","length","previousValue","currentValue","nextValue","push","join","EngagementHeatMapLegend","Math","legendSquareWidthPercentage","className","Text","phrase","map","val","idx","key","style","width","backgroundColor","EngagementHeatMap","props","heatMap","engagement","background","InsightCard","subtitle","svgClassName","SvgContainer","svgName","size","S","title","count","children","CHART_FONT_STYLES","fontSize","fontFamily","fontWeight","color","getFullHeatMap","videoDuration","Array","ceil","fill","t","getEngagementRate","reduce","prev","next","engagementRate","groupStudents","interactive","results","scoreThreshold","groups","markingRequired","lowScore","highScore","completed","notCompleted","interactions","interactionIds","Set","id","students","forEach","s","withSummary","summary","getStudentResultsSummary","awaitingMarking","attempts","filter","a","has","answers","questionId","percentCorrect","HIGH","MODERATE","sortedLowScore","sortedHighScore","getInteractionById","interactionId","find","toString","getMarkedAnswerId","answer","resultId","getMarkedStatus","studentResults","markedAnswers","result","studentResponse","every","status","getInteractionResultsSummary","interaction","numStudents","numCorrect","answered","unanswered","correctness","correct","numInteractions","answeredInteractions","getPhrase","UserRecipientItemMetadata","user","anonymiseUsers","showDisplayName","sessionId","anonName","nameParts","split","n","name","surname","slice","avatarUrl","avatar","url","getUserProps","avatarClassName","imageUrl","imageCdnUrl","initials","showAnonymousUser","anonymousSvgSize","detailsClassName","nameClassName","showSubText","getSubText","userType","role","yearGroup","defaults","InteractionCorrectness","InteractiveAnswerStatus","InsightsDemoRequests","normalize","interactiveMetadata","interactiveResults","videoViews","users","individualHeatmap","aggregateHeatmap","notApplicable","isMissingWordCorrect","getStudentAnswer","items","actionableItems","isCorrect","trim","toLowerCase","isMultipleChoiceCorrect","studentAnswer","getGetStudentAnswer","attempt","wrapIsMultipleChoiceCorrect","text","wrapIsMarkableAnswerMarkedCorrect","item","isMarkableAnswerMarkedCorrect","IsCorrectLookup","InteractiveCorrectnessHelper","isInteractionCorrect","isCorrectFn","typeId","DEMO_INSIGHTS_SHARE","type","privacy","objectId","objectTypeId","viewCount","accessCount","dateCreated","Date","toISOString","expireDate","link","shortenedEmbedUrl","shortenedUrl","shareId","ownerCustomerId","ownerId","recipients","options","preventScrubbing","immediateFeedback","DEMO_INSIGHTS_SHARE_TABLE_DATA","share","sharedObject","shareRecipients","dateShared","DEMO_INSIGHTS_APPLINK","application","action","DEMO_INSIGHTS_ACTION","label","appLink","group","LanguageService","InteractiveInsightsOverviewDemoView","SharedViewModelKeys","useLockContentWidth","currentUser","UserRequests","config","ConfigRequests","audienceAppLinkParams","dateRangeAppLinkParams","aggregateEngagement","useSetPageMetadata","video","hasDataLoaded","params","interactiveInsightsAppLinks","resultsAppLink","args","questionsAppLink","heatmapAppLink","getInteractiveInsightsAppLinks","InsightsHeader","tabs","yearGroups","isDemo","InteractiveInsightsOverview","classroomStudents","osCount"],"sourceRoot":""}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[3268],{25752:(e,t,n)=>{n.d(t,{q:()=>d});var r=n(32735),a=n(33518),i=n(8233),c=n(83914),o=n(35223),s=n(31138);const l={active:"NV2KW"};function u(e){var t=e.activePrivacy===e.sharePrivacy;return r.createElement("li",null,r.createElement("button",{className:"".concat(t?l.active:""," dropdown-item d-flex align-items-center justify-content-between py-2"),onClick:function(){t||e.onClick(e.sharePrivacy)}},r.createElement("div",{className:"me-4"},r.createElement("p",{className:"font-label mb-1"},e.title),r.createElement("p",{className:"font-size-sm mb-0"},e.description)),t&&r.createElement(c.x,{svgName:o.vn.Check})))}function d(e){var t=e.shareOverrideRestrictions&&!e.hasStudentExp,n=(0,s.f)({entity:e.entity,entityPrivacy:e.entityPrivacy,hasStudentExp:e.hasStudentExp,yearGroups:e.yearGroups}),o=i.R.getPrivateIconAndText({privacy:e.sharePrivacy,entityTypeId:e.entityTypeId,hasStudentExp:e.hasStudentExp,entity:e.entity,yearGroups:e.yearGroups}),l=o.icon,d=o.text;return t?r.createElement("div",{className:"btn-group"},r.createElement("button",{className:"btn border-0 info-link dropdown-toggle p-1 bg-light-blue-hover","data-bs-toggle":"dropdown"},r.createElement(c.x,{svgName:l,className:"svg-container me-1"}),r.createElement("span",{className:"me-1"},d)),r.createElement("ul",{className:"dropdown-menu cursor-pointer"},Object.values(a.e).map(function(t){var a=n[t],i=a.title,c=a.description;if((0,a.predicate)())return r.createElement(u,{key:t,sharePrivacy:t,activePrivacy:e.sharePrivacy,title:i,description:c,onClick:e.onClickSavePrivacy})}))):r.createElement("div",{className:"d-flex align-items-center"},r.createElement(c.x,{svgName:l,className:"svg-container me-1"}),r.createElement("span",null,d))}},81192:(e,t,n)=>{n.d(t,{Z:()=>v});var r=n(32735),a=n(80130),i=n(92802),c=n(23481),o=n(5173),s=(0,o.Ry)().shape({preventScrubbing:(0,o.O7)(),immediateFeedback:(0,o.O7)()}),l=n(82644),u=n(83345),d=n(83523);function m(e){return r.createElement("div",null,r.createElement("div",{className:"d-flex flex-row gap-1 justify-content-between align-items-center w-100 mb-1"},r.createElement("label",{className:"m-0 cursor-pointer",htmlFor:e.id,onClick:e.onClick},e.label),r.createElement(d.Z,{id:e.id,name:e.id,onClick:e.onClick,on:e.checked})),r.createElement("p",{className:"m-0 text-secondary"},e.description))}var p="sharev2.shareSettingsForm",y=c.T.encloseNamespace(p);function f(e){var t=(0,i.u6)();function n(e,n){t.setFieldValue(e,n),t.submitForm()}return r.createElement(a.Z,{className:"d-flex flex-column gap-2"},!e.hideFormHeading&&r.createElement("div",{className:"d-flex flex-row gap-2 justify-content-between align-items-center"},r.createElement("h3",{className:"h6 m-0"},r.createElement(u.x,{namespace:p,phrase:"heading"})),"function"==typeof e.onClickDelete&&r.createElement("a",{onClick:e.onClickDelete,className:"text-danger cursor-pointer"},r.createElement(u.x,{namespace:p,phrase:"delete"}))),r.createElement("div",{className:"d-flex flex-column gap-2"},e.showPreventScrubbingField&&r.createElement(m,{id:"prevent-scrubbing",label:y("preventScrubbingLabel"),description:y("preventScrubbingDescription"),checked:!!t.values.preventScrubbing,onClick:function(){return n("preventScrubbing",!t.values.preventScrubbing)}}),e.showImmediateFeedbackField&&r.createElement(m,{id:"immediate-feedback",label:y("immediateFeedbackLabel"),description:y("immediateFeedbackDescription"),checked:!!t.values.immediateFeedback,onClick:function(){return n("immediateFeedback",!t.values.immediateFeedback)}})))}function v(e){return!e.hideFormHeading||e.showImmediateFeedbackField||e.showPreventScrubbingField?r.createElement(l.n,{initialValues:e.initialValues,onSubmit:e.onSubmit,castInitialValues:!1,validationSchema:s},r.createElement(f,Object.assign({},e))):r.createElement(r.Fragment,null)}},31138:(e,t,n)=>{n.d(t,{B:()=>m,f:()=>d});var r=n(23481),a=n(75896),i=n(33518),c=n(8233);function o(e){return o="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},o(e)}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function l(e,t,n){return(t=function(e){var t=function(e){if("object"!=o(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=o(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==o(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var u=r.T.encloseNamespace("sharev2.getSharePrivacyConfig");function d(e){var t=c.R.getShareLinkAccessType(e.entityPrivacy),n=c.R.getRespectRatingText(e.entity,e.yearGroups,e.hasStudentExp);return l(l(l(l(l(l(l(l({},i.e.JustMySchool,{title:u("respectRatings"),description:n,predicate:function(){return"protected"!==t}}),i.e.Protected,{title:u("respectRatings"),description:n,predicate:function(){return"protected"===t}}),i.e.JustMySchoolOverrideRestriction,{title:u("justMySchool"),description:u("justMySchoolDescription"),predicate:function(){return"protected"!==t}}),i.e.ProtectedOverrideRestriction,{title:u("justMySchool"),description:u("clickViewOnly"),predicate:function(){return"protected"===t}}),i.e.Public,{title:u("public"),description:u("publicDescription"),predicate:function(){return"owner"===t}}),i.e.Direct,{title:"",description:"",predicate:function(){return!1}}),i.e.PasswordProtected,{title:"",description:"",predicate:function(){return!1}}),i.e.PinCode,{title:u("pinCode"),description:u("pinCodeDescription"),predicate:function(){return!1}})}function m(e){var t=d(e),n=Object.entries(t).filter(function(e){return(t=e,n=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,i,c,o=[],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)&&(o.push(r.value),o.length!==t);s=!0);}catch(e){l=!0,a=e}finally{try{if(!s&&null!=n.return&&(c=n.return(),Object(c)!==c))return}finally{if(l)throw a}}return o}}(t,n)||function(e,t){if(e){if("string"==typeof e)return s(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(e,t):void 0}}(t,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[1].predicate();var t,n});if(n.length)return a.m.first(n)[0]}},28161:(e,t,n)=>{n.d(t,{F:()=>y});var r=n(23481),a=n(20354),i=n(93563),c=n(87265),o=n(2267),s=n(16714),l=n(1666),u=n(69883),d=n(22902),m=n(37802),p=r.T.encloseNamespace("sharev2.useMainShareData");function y(e){var t=(0,u.Z)(),n=(0,d.T)().hasPermissions,r=(0,m.r)(null),y=r.shareToGoogleClassroom,f=r.shareToMicrosoftTeams,v=r.isLoadingSettings,b=r.shareOverrideRestrictions,h=(0,c.s)({entityId:e.entityId,entityType:e.entityType}),g=h.currentUser,S=h.entity,E=h.privacy,k=h.share,x=h.config,I=(0,i._)({entityId:e.entityId}),w=I.loaded,P=I.updateShareLink,C=a.a.useBasicFetch(g.data&&l.h.yearGroups(g.data.customerId)),N=o.I.canEmbed(e.entityType),T=o.I.getEnabledIntegrations(y,f),j=n(s.C.ManageIntegrations),F=n(s.C.StudentExperience),O=n(s.C.ManageShareLinkSettings),A=k.data&&o.I.canAddPolicies(e.entityType),M=w&&!!k.data&&!!S.data&&!!E.data&&!!x.data&&!!C&&!v;return{data:{share:k,loaded:M,entity:S,privacy:E,config:x,yearGroups:C,shareOverrideRestrictions:b},canEmbed:N,integrations:T,hasStudentExp:F,canAccessSettings:A,hasManageShareLinkSettings:O,hasManageIntegrationsPermission:j,onClickSavePrivacy:function(n){P(k.data.shareId,{privacy:n}).then(function(n){e.log({type:"update-share-link",share:n}),t.success(p("privaciesSuccess",{name:S.data.name,escapeText:!0}))}).catch(function(){return t.error(p("privaciesError",{name:S.data.name,escapeText:!0}))})}}}},2867:(e,t,n)=>{n.d(t,{W:()=>p});var r=n(23481),a=n(20354),i=n(93563),c=n(87265),o=n(2267),s=n(4594),l=n(20768),u=n(69883),d=n(45778),m=r.T.encloseNamespace("sharev2.useShareSettingsData");function p(e){var t=(0,u.Z)(),n=(0,c.s)({entityId:e.entityId,entityType:e.entityType}),r=n.config,p=n.entity,y=n.share,f=(0,i._)({entityId:e.entityId}),v=f.loaded,b=f.updateShareLink,h=a.a.useBasicFetch(d.G.isType(p.data,s.E.Interactive)&&p.data.interactiveId&&l.b.interactive(p.data.interactiveId));function g(n){e.log({type:"update-share-link",share:n}),t.success(m("editSuccess",{name:p.data.name,escapeText:!0}))}var S=o.I.getShareSettingsInitialValues(y.data,h.data);return{data:{loaded:v&&!!y.data&&!!r.data&&!!p.data},initialValues:S,onClickSaveLink:function(e,n){b(y.data.shareId,e).then(g).catch(function(){t.error(m("editError",{name:p.data.name,escapeText:!0})),n()})}}}},89067:(e,t,n)=>{n.d(t,{r:()=>i});var r=n(32735);function a(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function i(e){var t,n,i,c,o=(i=r.useState(null===(t=e.animate)||void 0===t||t),c=2,function(e){if(Array.isArray(e))return e}(i)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,i,c,o=[],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)&&(o.push(r.value),o.length!==t);s=!0);}catch(e){l=!0,a=e}finally{try{if(!s&&null!=n.return&&(c=n.return(),Object(c)!==c))return}finally{if(l)throw a}}return o}}(i,c)||function(e,t){if(e){if("string"==typeof e)return a(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)?a(e,t):void 0}}(i,c)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),s=o[0],l=o[1],u=e.steps[e.step],d=void 0!==e.loading?{loading:e.loading}:{},m=Object.assign(Object.assign(Object.assign({},e.data),d),{animate:null!==(n=e.animate)&&void 0!==n?n:s,closePopup:function(){e.closePopup()},setStep:function(t){l(!1),e.setStep(t)}});if(!u)return r.createElement(r.Fragment,null);var p=u.view;return r.createElement(p,Object.assign({},m))}}}]);
|
|
2
|
-
//# sourceMappingURL=3268-aa893d0068-lite.chunk.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/3268-aa893d0068-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/share-v2/components/share-link-privacy/share-link-privacy.scss","file:///app/packages/libs/shared/src/apps/share-v2/components/share-link-privacy/ShareLinkPrivacy.tsx","file:///app/packages/libs/shared/src/apps/share-v2/validation/ShareSettingsFormValidationSchema.ts","file:///app/packages/libs/shared/src/apps/share-v2/components/share-settings-field/ShareSettingsField.tsx","file:///app/packages/libs/shared/src/apps/share-v2/components/share-settings-form/ShareSettingsForm.tsx","file:///app/packages/libs/shared/src/apps/share-v2/utils/get-share-privacy-config/getSharePrivacyConfig.ts","file:///app/packages/libs/shared/src/apps/share-v2/views/main-share-view/hooks/use-main-share-data/useMainShareData.ts","file:///app/packages/libs/shared/src/apps/share-v2/views/share-settings-view/hooks/use-share-settings-data/useShareSettingsData.ts","file:///app/packages/libs/shared/src/components/multistep-popup/MultiStepPopup.tsx"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"active\":\"NV2KW\"};","import React from 'react';\n\nimport { SharePrivacy } from 'libs/shared/apps/share-v2/enums/SharePrivacy';\nimport { type SharePrivacyResponse } from 'libs/shared/apps/share-v2/interfaces/SharePrivacyResponse';\nimport { ShareLinkHelper } from 'libs/shared/apps/share-v2/utils/ShareLinkHelper';\nimport { type SharableEntity } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport type { YearGroup } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { getSharePrivacyConfig } from '../../utils/get-share-privacy-config/getSharePrivacyConfig';\n\nimport styles from './share-link-privacy.scss';\n\ninterface SharePrivacyItemProps {\n title: string;\n activePrivacy: SharePrivacy;\n description: string;\n sharePrivacy: SharePrivacy;\n onClick: (sharePrivacy: SharePrivacy) => void\n}\n\nfunction SharePrivacyItem(props: SharePrivacyItemProps) {\n const active = props.activePrivacy === props.sharePrivacy;\n\n function onClick() {\n if (active)\n return;\n\n props.onClick(props.sharePrivacy);\n }\n\n return (\n <li>\n <button\n className={`${active ? styles.active : ''} dropdown-item d-flex align-items-center justify-content-between py-2`}\n onClick={onClick}\n >\n <div className='me-4'>\n <p className='font-label mb-1'>{props.title}</p>\n <p className='font-size-sm mb-0'>{props.description}</p>\n </div>\n {active && <SvgContainer svgName={cvSvgLibrary.Check} />}\n </button>\n </li>\n );\n}\n\ninterface ShareLinkPrivacyProps {\n hasStudentExp: boolean;\n shareOverrideRestrictions: boolean;\n entity: SharableEntity;\n entityTypeId: MasterType;\n yearGroups: YearGroup[];\n sharePrivacy: SharePrivacy;\n entityPrivacy: SharePrivacyResponse;\n onClickSavePrivacy: (privacy: SharePrivacy) => void;\n}\n\nexport function ShareLinkPrivacy(props: ShareLinkPrivacyProps): JSX.Element {\n const canUpdatePrivacy = props.shareOverrideRestrictions && !props.hasStudentExp;\n\n const config = getSharePrivacyConfig({\n entity: props.entity,\n entityPrivacy: props.entityPrivacy,\n hasStudentExp: props.hasStudentExp,\n yearGroups: props.yearGroups\n });\n\n const { icon, text } = ShareLinkHelper.getPrivateIconAndText({\n privacy: props.sharePrivacy,\n entityTypeId: props.entityTypeId,\n hasStudentExp: props.hasStudentExp,\n entity: props.entity,\n yearGroups: props.yearGroups\n });\n\n if (!canUpdatePrivacy) {\n return (\n <div className='d-flex align-items-center'>\n <SvgContainer svgName={icon} className='svg-container me-1' />\n <span>{text}</span>\n </div>\n );\n }\n \n return (\n <div className='btn-group'>\n <button\n className={`btn border-0 info-link dropdown-toggle p-1 bg-light-blue-hover`}\n data-bs-toggle='dropdown'\n >\n <SvgContainer svgName={icon} className='svg-container me-1' />\n <span className='me-1'>{text}</span>\n </button>\n <ul className='dropdown-menu cursor-pointer'>\n {Object.values(SharePrivacy).map(sharePrivacy => {\n const { title, description, predicate } = config[sharePrivacy];\n \n if (!predicate())\n return;\n\n return (\n <SharePrivacyItem\n key={sharePrivacy}\n sharePrivacy={sharePrivacy}\n activePrivacy={props.sharePrivacy}\n title={title}\n description={description}\n onClick={props.onClickSavePrivacy}\n />\n );\n })}\n </ul>\n </div>\n );\n}","import { boolean, object } from 'yup';\n\nexport const ShareSettingsFormValidationSchema = object().shape({\n preventScrubbing: boolean(),\n immediateFeedback: boolean()\n});","import React from 'react';\n\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\n\ninterface ShareSettingsFieldProps {\n id: string;\n label: string;\n description: string;\n onClick: () => void;\n checked: boolean;\n}\n\nexport function ShareSettingsField(props: ShareSettingsFieldProps): JSX.Element {\n return (\n <div>\n <div className='d-flex flex-row gap-1 justify-content-between align-items-center w-100 mb-1'>\n <label className='m-0 cursor-pointer' htmlFor={props.id} onClick={props.onClick}>{props.label}</label>\n <ToggleSwitch\n id={props.id}\n name={props.id}\n onClick={props.onClick}\n on={props.checked}\n />\n </div>\n <p className='m-0 text-secondary'>{props.description}</p>\n </div>\n );\n}","import React from 'react';\nimport { Form } from 'react-bootstrap';\nimport { useFormikContext } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { ShareSettingsFormFields } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { ShareSettingsFormValidationSchema } from 'libs/shared/apps/share-v2/validation/ShareSettingsFormValidationSchema';\nimport { FormSubmissionOptions, FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport { ShareSettingsField } from '../share-settings-field/ShareSettingsField';\n\nconst namespace = 'sharev2.shareSettingsForm';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ShareSettingsFormProps {\n initialValues: ShareSettingsFormFields;\n onSubmit: (\n data: ShareSettingsFormFields,\n onDone: (options?: FormSubmissionOptions<ShareSettingsFormFields>) => void\n ) => void;\n showPreventScrubbingField?: boolean;\n showImmediateFeedbackField?: boolean;\n hideFormHeading?: boolean;\n onClickDelete?: () => void;\n}\n\nfunction ShareSettingsFromComponent(props: ShareSettingsFormProps): JSX.Element {\n const formikProps = useFormikContext<ShareSettingsFormFields>();\n\n function setFormikFieldAndSave\n <T extends keyof ShareSettingsFormFields>(field: T, value: ShareSettingsFormFields[T]) {\n formikProps.setFieldValue(field, value);\n formikProps.submitForm();\n }\n\n return (\n <Form className='d-flex flex-column gap-2'>\n {!props.hideFormHeading &&\n <div className='d-flex flex-row gap-2 justify-content-between align-items-center'>\n <h3 className='h6 m-0'>\n <Text namespace={namespace} phrase='heading' />\n </h3>\n {typeof props.onClickDelete === 'function' &&\n <a onClick={props.onClickDelete} className='text-danger cursor-pointer'><Text namespace={namespace} phrase='delete' /></a>\n }\n </div>\n }\n <div className='d-flex flex-column gap-2'>\n {props.showPreventScrubbingField &&\n <ShareSettingsField\n id='prevent-scrubbing'\n label={getPhrase('preventScrubbingLabel')}\n description={getPhrase('preventScrubbingDescription')}\n checked={!!formikProps.values.preventScrubbing}\n onClick={() => setFormikFieldAndSave('preventScrubbing', !formikProps.values.preventScrubbing)}\n />\n }\n {props.showImmediateFeedbackField &&\n <ShareSettingsField\n id='immediate-feedback'\n label={getPhrase('immediateFeedbackLabel')}\n description={getPhrase('immediateFeedbackDescription')}\n checked={!!formikProps.values.immediateFeedback}\n onClick={() => setFormikFieldAndSave('immediateFeedback', !formikProps.values.immediateFeedback)}\n />\n }\n </div>\n </Form>\n );\n}\n\nexport function ShareSettingsForm(props: ShareSettingsFormProps): JSX.Element {\n const isEverythingHidden = props.hideFormHeading\n && !props.showImmediateFeedbackField\n && !props.showPreventScrubbingField;\n\n if (isEverythingHidden)\n return <></>;\n\n return (\n <FormWrapper<ShareSettingsFormFields>\n initialValues={props.initialValues}\n onSubmit={props.onSubmit}\n castInitialValues={false}\n validationSchema={ShareSettingsFormValidationSchema}\n >\n <ShareSettingsFromComponent {...props} />\n </FormWrapper>\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { SharePrivacy } from 'libs/shared/apps/share-v2/enums/SharePrivacy';\nimport { type SharePrivacyResponse } from 'libs/shared/apps/share-v2/interfaces/SharePrivacyResponse';\nimport { ShareLinkHelper } from 'libs/shared/apps/share-v2/utils/ShareLinkHelper';\nimport { type SharableEntity } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport type { YearGroup } from 'libs/shared/interfaces';\n\nconst namespace = 'sharev2.getSharePrivacyConfig';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ntype SharePrivacyConfigItem = {\n title: string;\n description: string;\n predicate: () => boolean;\n}\n\ninterface UseSharePrivacyConfigOptions {\n entityPrivacy: SharePrivacyResponse;\n entity: SharableEntity;\n yearGroups: YearGroup[];\n hasStudentExp: boolean;\n}\n\nexport function getSharePrivacyConfig(\n options: UseSharePrivacyConfigOptions\n): {[key in SharePrivacy]: SharePrivacyConfigItem} {\n const accessType = ShareLinkHelper.getShareLinkAccessType(options.entityPrivacy);\n const respectRatingText = ShareLinkHelper.getRespectRatingText(\n options.entity,\n options.yearGroups,\n options.hasStudentExp\n );\n\n const SharePrivacyItemConfig: {[key in SharePrivacy]: SharePrivacyConfigItem} = {\n [SharePrivacy.JustMySchool]: {\n title: getPhrase('respectRatings'),\n description: respectRatingText,\n predicate: () => accessType !== 'protected'\n },\n [SharePrivacy.Protected]: {\n title: getPhrase('respectRatings'),\n description: respectRatingText,\n predicate: () => accessType === 'protected'\n },\n [SharePrivacy.JustMySchoolOverrideRestriction]: {\n title: getPhrase('justMySchool'),\n description: getPhrase('justMySchoolDescription'),\n predicate: () => accessType !== 'protected'\n },\n [SharePrivacy.ProtectedOverrideRestriction]: {\n title: getPhrase('justMySchool'),\n description: getPhrase('clickViewOnly'),\n predicate: () => accessType === 'protected'\n },\n [SharePrivacy.Public]: {\n title: getPhrase('public'),\n description: getPhrase('publicDescription'),\n predicate: () => accessType === 'owner'\n },\n /**\n * Not supported\n */\n [SharePrivacy.Direct]: {\n title: '',\n description: '',\n predicate: () => false\n },\n [SharePrivacy.PasswordProtected]: {\n title: '',\n description: '',\n predicate: () => false\n },\n [SharePrivacy.PinCode]: {\n title: getPhrase('pinCode'),\n description: getPhrase('pinCodeDescription'),\n predicate: () => false\n }\n };\n\n return SharePrivacyItemConfig;\n}\n\nexport function getDefaultSharePrivacy(options: UseSharePrivacyConfigOptions): SharePrivacy {\n const items = getSharePrivacyConfig(options);\n\n const validItems = Object.entries(items).filter(([ , config ]) => config.predicate());\n\n if (!validItems.length)\n return;\n\n return ArrayHelper.first(validItems)[0] as SharePrivacy;\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { SharePrivacy } from 'libs/shared/apps/share-v2/enums/SharePrivacy';\nimport { useShareLinkActions } from 'libs/shared/apps/share-v2/hooks/useShareLinkActions';\nimport { useShareLinkData } from 'libs/shared/apps/share-v2/hooks/useShareLinkData';\nimport { ShareLogFn } from 'libs/shared/apps/share-v2/utils/get-share-event-logger/getShareEventLogger';\nimport { SharableEntityType, ShareViewHelper } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport type { YearGroup } from 'libs/shared/interfaces';\n\nconst namespace = 'sharev2.useMainShareData';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface UseMainShareDataOptions {\n entityId: string;\n entityType: SharableEntityType;\n log: ShareLogFn;\n}\n\nexport function useMainShareData(options: UseMainShareDataOptions) {\n const alerts = useAlerts();\n const { hasPermissions } = usePermissions();\n\n const {\n shareToGoogleClassroom,\n shareToMicrosoftTeams,\n isLoadingSettings,\n shareOverrideRestrictions\n } = useSettings(null);\n \n const {\n currentUser,\n entity,\n privacy,\n share,\n config\n } = useShareLinkData({ entityId: options.entityId, entityType: options.entityType });\n \n const {\n loaded: shareActionLoaded,\n updateShareLink\n } = useShareLinkActions({ entityId: options.entityId });\n \n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n function onClickSavePrivacy(updatedPrivacy: SharePrivacy): void {\n updateShareLink(share.data.shareId, { privacy: updatedPrivacy })\n .then(share => {\n options.log({\n type: 'update-share-link',\n share\n });\n alerts.success(getPhrase('privaciesSuccess', { name: entity.data.name, escapeText: true }));\n })\n .catch(\n () => alerts.error(getPhrase('privaciesError', { name: entity.data.name, escapeText: true }))\n );\n }\n \n const canEmbed = ShareViewHelper.canEmbed(options.entityType);\n const integrations = ShareViewHelper.getEnabledIntegrations(shareToGoogleClassroom, shareToMicrosoftTeams);\n const hasManageIntegrationsPermission = hasPermissions(PermissionName.ManageIntegrations);\n const hasStudentExp = hasPermissions(PermissionName.StudentExperience);\n const hasManageShareLinkSettings = hasPermissions(PermissionName.ManageShareLinkSettings);\n const canAccessSettings = share.data && ShareViewHelper.canAddPolicies(options.entityType);\n \n const loaded = shareActionLoaded\n && !!share.data\n && !!entity.data\n && !!privacy.data\n && !!config.data\n && !!yearGroups\n && !isLoadingSettings;\n\n\n return {\n data: {\n share,\n loaded,\n entity,\n privacy,\n config,\n yearGroups,\n shareOverrideRestrictions\n },\n canEmbed,\n integrations,\n hasStudentExp,\n canAccessSettings,\n hasManageShareLinkSettings,\n hasManageIntegrationsPermission,\n onClickSavePrivacy\n };\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { useShareLinkActions } from 'libs/shared/apps/share-v2/hooks/useShareLinkActions';\nimport { useShareLinkData } from 'libs/shared/apps/share-v2/hooks/useShareLinkData';\nimport type { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport type { UpdateShareRequest } from 'libs/shared/apps/share-v2/interfaces/UpdateShareRequest';\nimport { ShareLogFn } from 'libs/shared/apps/share-v2/utils/get-share-event-logger/getShareEventLogger';\nimport { SharableEntityType, ShareViewHelper } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport type { Interactive, InteractiveMetadata } from 'libs/shared/interfaces';\nimport { MasterTypeHelper } from 'libs/shared/utils/MasterTypeHelper';\n\nconst namespace = 'sharev2.useShareSettingsData';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface UseShareSettingsDataOptions {\n entityId: string;\n entityType: SharableEntityType;\n log: ShareLogFn;\n}\n\nexport function useShareSettingsData(options: UseShareSettingsDataOptions) {\n const alerts = useAlerts();\n\n const { config, entity, share } = useShareLinkData({\n entityId: options.entityId,\n entityType: options.entityType\n });\n\n const { loaded: shareLinkActionsLoaded, updateShareLink } = useShareLinkActions({ entityId: options.entityId });\n \n /**\n * Fetch interactive videos options to set them as defaults\n * if the interactive share data does not have any options set\n */\n const interactive = Flight.useBasicFetch<Interactive>(\n MasterTypeHelper.isType<InteractiveMetadata>(entity.data, MasterType.Interactive) && entity.data.interactiveId &&\n InteractiveRequests.interactive(entity.data.interactiveId)\n );\n\n function onSuccess(updatedShare: Share) {\n options.log({\n type: 'update-share-link',\n share: updatedShare\n });\n \n alerts.success(getPhrase('editSuccess', { name: entity.data.name, escapeText: true }));\n }\n \n function onClickSaveLink(data: UpdateShareRequest, onError: () => void): void {\n updateShareLink(share.data.shareId, data)\n .then(onSuccess)\n .catch(() => {\n alerts.error(getPhrase('editError', { name: entity.data.name, escapeText: true }));\n onError();\n });\n }\n \n const initialValues = ShareViewHelper.getShareSettingsInitialValues(share.data, interactive.data);\n \n const loaded = shareLinkActionsLoaded\n && !!share.data\n && !!config.data\n && !!entity.data;\n\n return {\n data: {\n loaded\n },\n initialValues,\n onClickSaveLink\n };\n}","import React from 'react';\n\nimport { PopupViewProps } from 'libs/shared/interfaces';\n\nexport interface MultiStepPopupViewProps extends PopupViewProps {\n animate?: boolean;\n loading?: boolean;\n}\n\nexport type MultiStepItemConfig<TProps, TSteps extends string> = {\n [Key in TSteps]: {\n view: (props: TProps) => JSX.Element;\n }\n}\n\ninterface MultiStepPopupProps<\n TProps,\n TSteps extends string\n> {\n step: TSteps;\n data: TProps;\n steps: MultiStepItemConfig<TProps, TSteps>;\n loading?: boolean;\n animate?: boolean;\n setStep: (step: TSteps) => void;\n closePopup: () => void;\n}\n\nexport function MultiStepPopup<TProps, TSteps extends string>(\n props: MultiStepPopupProps<TProps, TSteps>\n): JSX.Element {\n const [ animate, setAnimate ] = React.useState<boolean>(props.animate ?? true);\n\n function setStep(step: TSteps) {\n /**\n * We want to animate the popup for the first time it loads in.\n * After that every step changes should not animate other popups\n */\n setAnimate(false);\n props.setStep(step);\n }\n\n function closePopup() {\n props.closePopup();\n }\n\n const stepConfig = props.steps[props.step];\n /**\n * This is so that we do not override `loading` prop \n * passed into `ViewComponent` from `props.data` if `props.loading` is undefined.\n * We only want to override the prop if this is set.\n */\n const loading = typeof props.loading !== 'undefined' ? { loading: props.loading } : {};\n \n const viewProps: TProps = {\n ...props.data,\n ...loading,\n animate: props.animate ?? animate,\n closePopup,\n setStep\n };\n\n if (!stepConfig)\n return <></>;\n\n const ViewComponent = stepConfig.view;\n\n return <ViewComponent {...viewProps} />;\n}"],"names":["SharePrivacyItem","props","active","activePrivacy","sharePrivacy","className","onClick","title","description","SvgContainer","svgName","ShareLinkPrivacy","canUpdatePrivacy","shareOverrideRestrictions","hasStudentExp","config","getSharePrivacyConfig","entity","entityPrivacy","yearGroups","ShareLinkHelper","privacy","entityTypeId","icon","text","Object","values","SharePrivacy","map","predicate","key","onClickSavePrivacy","ShareSettingsFormValidationSchema","shape","preventScrubbing","immediateFeedback","ShareSettingsField","htmlFor","id","label","ToggleSwitch","name","on","checked","namespace","getPhrase","LanguageService","ShareSettingsFromComponent","formikProps","setFormikFieldAndSave","field","value","setFieldValue","submitForm","Form","hideFormHeading","Text","phrase","onClickDelete","showPreventScrubbingField","showImmediateFeedbackField","ShareSettingsForm","FormWrapper","initialValues","onSubmit","castInitialValues","validationSchema","options","accessType","respectRatingText","getDefaultSharePrivacy","items","validItems","entries","filter","length","useMainShareData","alerts","hasPermissions","shareToGoogleClassroom","shareToMicrosoftTeams","isLoadingSettings","entityId","entityType","currentUser","share","shareActionLoaded","loaded","updateShareLink","data","customerId","canEmbed","integrations","hasManageIntegrationsPermission","hasManageShareLinkSettings","canAccessSettings","updatedPrivacy","shareId","then","log","type","success","escapeText","error","useShareSettingsData","shareLinkActionsLoaded","interactive","interactiveId","onSuccess","updatedShare","onClickSaveLink","onError","MultiStepPopup","animate","setAnimate","stepConfig","steps","step","loading","viewProps","closePopup","setStep","ViewComponent","view"],"sourceRoot":""}
|