@clickview/lite 0.57.2-dev.2 → 0.57.2-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundles.json +1 -1
- package/dist/scripts/1057-3c48d4553a-lite.chunk.js +2 -0
- package/dist/scripts/1057-3c48d4553a-lite.chunk.js.map +1 -0
- package/dist/scripts/1734-bbca52585c-lite.chunk.js +2 -0
- package/dist/scripts/1734-bbca52585c-lite.chunk.js.map +1 -0
- package/dist/scripts/7237-86c18f2701-lite.chunk.js +2 -0
- package/dist/scripts/7237-86c18f2701-lite.chunk.js.map +1 -0
- package/dist/scripts/8095-777a5c5ddf-lite.chunk.js +2 -0
- package/dist/scripts/8095-777a5c5ddf-lite.chunk.js.map +1 -0
- package/dist/scripts/8489-6e8c4dd60f-lite.chunk.js +3 -0
- package/dist/scripts/8489-6e8c4dd60f-lite.chunk.js.map +1 -0
- package/dist/scripts/9201-899c885914-lite.chunk.js +2 -0
- package/dist/scripts/9201-899c885914-lite.chunk.js.map +1 -0
- package/dist/scripts/{bundle-33a0223ac5.min.js → bundle-4b58e56927.min.js} +3 -3
- package/dist/scripts/bundle-4b58e56927.min.js.map +1 -0
- package/package.json +1 -1
- package/dist/scripts/1057-80dd5a1be7-lite.chunk.js +0 -2
- package/dist/scripts/1057-80dd5a1be7-lite.chunk.js.map +0 -1
- package/dist/scripts/1734-4a7f3b5c3e-lite.chunk.js +0 -2
- package/dist/scripts/1734-4a7f3b5c3e-lite.chunk.js.map +0 -1
- package/dist/scripts/7237-bf0cded690-lite.chunk.js +0 -2
- package/dist/scripts/7237-bf0cded690-lite.chunk.js.map +0 -1
- package/dist/scripts/8095-85db09f5b2-lite.chunk.js +0 -2
- package/dist/scripts/8095-85db09f5b2-lite.chunk.js.map +0 -1
- package/dist/scripts/8489-d9860267ec-lite.chunk.js +0 -3
- package/dist/scripts/8489-d9860267ec-lite.chunk.js.map +0 -1
- package/dist/scripts/9201-58ea2d1161-lite.chunk.js +0 -2
- package/dist/scripts/9201-58ea2d1161-lite.chunk.js.map +0 -1
- package/dist/scripts/bundle-33a0223ac5.min.js.map +0 -1
- /package/dist/scripts/{8489-d9860267ec-lite.chunk.js.LICENSE.txt → 8489-6e8c4dd60f-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{bundle-33a0223ac5.min.js.LICENSE.txt → bundle-4b58e56927.min.js.LICENSE.txt} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts/7237-86c18f2701-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/analytics/flight-requests/InteractiveResultsRequests.ts","file:///app/packages/libs/shared/src/utils/AnalyticsRequestUtils.ts","file:///app/packages/libs/shared/src/utils/GroupHelper.ts","file:///app/packages/projects/lite/src/apps/classrooms/views/classroom-overview/ClassroomOverviewView.tsx","file:///app/packages/projects/lite/src/apps/insights/components/insights-list/empty-state/InsightsListEmptyState.tsx","file:///app/packages/projects/lite/src/apps/insights/components/insights-list/table/InsightsListTableUtils.tsx","file:///app/packages/projects/lite/src/apps/insights/components/insights-list/table/InsightsListTable.tsx","file:///app/packages/projects/lite/src/apps/insights/views/insights-list/InsightsListViewUtils.tsx"],"sourcesContent":["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: { start: filter.start, end: filter.end },\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 success?: (data: InteractiveResultSet) => void,\n error?: (data: any) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `/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: '{gateway}/v2/analytics/interactives/report',\n key: 'interactive:results:report',\n data,\n type: HttpVerbs.POST,\n normalize: false\n };\n }\n};","import { AnalyticsRequestFilter } from 'libs/shared/interfaces';\n\nexport function getAnalyticsRequestKey(baseKey: string, filter: AnalyticsRequestFilter, sharerId?: string): string {\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\n if (userIdKey)\n key += `:${userIdKey}`;\n\n if (groupIdKey)\n key += `:${groupIdKey}`;\n\n if (sharerId)\n key += `:${sharerId}`;\n\n return key;\n}","import { ButtonProps } from 'react-bootstrap';\n\nimport { ClassroomGroupColour } from 'libs/shared/interfaces';\n\nexport function mapColourToBsVariant(groupColour: ClassroomGroupColour): ButtonProps['variant'] {\n switch (groupColour) {\n case ClassroomGroupColour.Pink:\n return 'pink';\n case ClassroomGroupColour.Orange:\n return 'orange';\n case ClassroomGroupColour.Green:\n return 'green';\n case ClassroomGroupColour.Blue:\n return 'blue';\n case ClassroomGroupColour.Purple:\n return 'purple';\n case ClassroomGroupColour.Indigo:\n return 'indigo';\n default:\n return 'pink';\n }\n}\n","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { InteractiveResultsRequests } from 'libs/shared/apps/analytics/flight-requests/InteractiveResultsRequests';\nimport { InteractivesPendingReviews } from 'libs/shared/apps/analytics/interfaces/response/InteractivesPendingReviewsResponse';\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { PartialBreadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { PartialPillTabSelector } from 'libs/shared/components/pill-tab-selector/partial-loading/PartialPillTabSelector';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useBatchFetch } from 'libs/shared/hooks/UseBatchFetch';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { useInfiniteList } from 'libs/shared/hooks/UseInfiniteList';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Classroom, Config, CurrentUser, InteractiveMetadata, UnionShareObject } from 'libs/shared/interfaces';\nimport { ShareHelper } from 'libs/shared/utils/ShareHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { ClassroomLayout } from 'apps/classrooms/layouts/ClassroomLayout';\nimport { InsightsListEmptyState } from 'apps/insights/components/insights-list/empty-state/InsightsListEmptyState';\nimport { InsightsListTable } from 'apps/insights/components/insights-list/table/InsightsListTable';\nimport { useGetInsightsObjectActions } from 'apps/insights/views/insights-list/InsightsListViewUtils';\nimport { PartialSharedByMeTable } from 'apps/share/views/shared-by-me/partial-loading/PartialSharedByMeTable';\nimport { getBatchFetchResultAsArray, getObjectAppLink, usePartialLoading } from 'apps/share/views/shared-by-me/SharedByMeViewUtils';\n\nconst namespace = 'lite.insightsList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ClassroomOverviewViewProps {\n classroomId: string;\n}\n\nexport function ClassroomOverviewView(props: ClassroomOverviewViewProps) {\n const dispatch = useDispatch();\n const breakpoints = useBreakpoints();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const classroom = Flight.useBasicFetch<Classroom>(currentUser.data &&\n ClassroomRequests.getClassroom(props.classroomId, currentUser.data.id));\n\n const isRostered = classroom.data?._integrations?.rostered;\n\n const getRequest = (cursor?: string) => ShareRequests.sentShare({\n cursor,\n recipientGroupId: [props.classroomId]\n });\n const fetchNext = (cursor?: string) => Flight.getFetch(dispatch)(getRequest(cursor));\n\n\n const {\n items: sentShares,\n hasMore,\n isFetching: isFetchingSentShares,\n nextCursor\n } = useInfiniteList<UnionShareObject>(getRequest, fetchNext);\n\n const sharedObjectIds = ArrayHelper.uniq(sentShares?.map(s => s.objectId) ?? []);\n\n const sharedObjectsFetchResult = useBatchFetch(sharedObjectIds, (ids: string[]) => {\n return ShareRequests.sharedObjectsById(ids);\n });\n\n const interactiveIds = getInteractiveIds();\n\n const interactivesPendingReview = Flight.useBasicFetch<InteractivesPendingReviews[]>(\n sharedObjectsFetchResult?.items && currentUser.data &&\n InteractiveResultsRequests.pendingReviews({\n interactives: interactiveIds,\n filters: {\n currentCustomerId: currentUser.data.customerId,\n currentUserId: currentUser.data.id\n }\n })\n );\n\n const recipientIds = ShareHelper.getRecipientIds(sentShares);\n\n const shareRecipientsFetchResult = useBatchFetch(recipientIds, (ids: string[]) => {\n return ShareRequests.getRecipientsById(ids, currentUser.data.customerId);\n });\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n useSetPageMetadata({ title: getPhrase('insights') });\n\n const getSharedObjectActions = useGetInsightsObjectActions(breakpoints, { classrooms: [props.classroomId]});\n\n const showPartialLoading = usePartialLoading(\n sentShares,\n !!sharedObjectsFetchResult.items,\n recipientIds,\n !!shareRecipientsFetchResult.items,\n config\n );\n\n // Wait until all data is fetched before telling the table to re-render\n const isFetching = isFetchingSentShares\n || sharedObjectsFetchResult.isFetching\n || shareRecipientsFetchResult.isFetching\n || interactivesPendingReview.isFetching;\n\n const sentSharesMemo = React.useMemo(() => sentShares, [ !!sentShares, isFetching ]);\n const sharedObjects = React.useMemo(() =>\n getBatchFetchResultAsArray(sharedObjectsFetchResult), [ !!sharedObjectsFetchResult.items, isFetching ]);\n const shareRecipients = React.useMemo(\n () =>\n getBatchFetchResultAsArray(shareRecipientsFetchResult),\n [ !!shareRecipientsFetchResult.items, isFetching ]\n );\n\n function getInteractiveIds() {\n return sharedObjectsFetchResult?.items && Object.keys(sharedObjectsFetchResult.items).reduce(\n (acc, value) => {\n const isInteractive = sharedObjectsFetchResult.items[value].typeId === MasterType.Interactive;\n\n if (!isInteractive) return acc;\n\n const interactive = sharedObjectsFetchResult.items[value] as InteractiveMetadata;\n return [ ...acc, { metadataId: interactive.id, interactiveId: interactive.interactiveId }];\n },\n []\n );\n }\n\n function onTogglePin(shouldPin: boolean, onSuccess: () => void, onError: () => void): void {\n if (isRostered)\n return;\n const request = shouldPin\n ? ClassroomRequests.pinClassroom\n : ClassroomRequests.unpinClassroom;\n\n Flight.fetch(dispatch, request(classroom.data, onSuccess, onError));\n }\n\n const classroomDataLoaded = currentUser.data && classroom.data;\n\n if (!classroomDataLoaded)\n return (\n <div className='px-3'>\n <div className={`mb-1 partial-loading-background`} />\n\n <div className='pb-3'>\n <PartialBreadcrumbs numItems={2} />\n </div>\n\n <div className='pb-2'>\n <PartialPillTabSelector />\n </div>\n </div>\n );\n\n return (\n <ClassroomLayout\n activeTab='overview'\n classroom={classroom.data}\n currentUser={currentUser.data}\n onTogglePin={onTogglePin}\n isRostered={isRostered}\n >\n {(() => {\n if (showPartialLoading)\n return <PartialSharedByMeTable />;\n\n if (!sentShares.length)\n return (\n <InsightsListEmptyState\n appLink={{ application: AppChannels.DASHBOARD, action: Actions.Dashboard.HOME }}\n imageUrl={ImageUrls.EmptyStates.Share.SHARED_WITH_ME}\n />\n );\n\n return (\n <>\n <InsightsListTable\n sentShares={sentSharesMemo}\n sharedObjects={sharedObjects}\n shareRecipients={shareRecipients}\n interactivesPendingReviews={interactivesPendingReview.data}\n getObjectAppLink={getObjectAppLink}\n getObjectActions={getSharedObjectActions}\n imageCdnUrl={config.data.imageCdnUrl}\n groupByDateShared\n dependencies={[isFetching]}\n breakpoints={breakpoints}\n hideViews\n />\n {(hasMore || isFetching) &&\n <InfiniteScrollFooter isFetching={isFetching} fetchNext={fetchNext} nextCursor={nextCursor} />\n }\n </>\n );\n })()}\n </ClassroomLayout>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\n\nconst namespace = 'insights.insightsListEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightsListEmptyStateProps {\n imageUrl: string;\n appLink?: Core.AppLink;\n useInteractiveCopy?: boolean;\n}\n\nexport function InsightsListEmptyState(props: InsightsListEmptyStateProps): JSX.Element {\n return (\n <EmptyState>\n <EmptyState.Image src={props.imageUrl} size='small'/>\n <EmptyState.Heading>\n {getPhrase(props.useInteractiveCopy ? 'interactivesHeading' : 'genericHeading')}\n </EmptyState.Heading>\n <EmptyState.Info>{getPhrase(props.useInteractiveCopy ? 'interactivesInfo' : 'genericInfo')}</EmptyState.Info>\n {!!props.appLink &&\n <EmptyState.Cta appLink={props.appLink} text={getPhrase('cta')} />\n }\n </EmptyState>\n );\n}","import React from 'react';\nimport { Column } from 'react-table';\nimport { format as formatDate } from 'timeago.js';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { InteractivesPendingReviews } from 'libs/shared/apps/analytics/interfaces/response/InteractivesPendingReviewsResponse';\nimport { SharedObjectImage } from 'libs/shared/apps/share/components/shared-object-image/SharedObjectImage';\nimport {\n AnonymousSharedToAvatar,\n SharedLinkAvatar,\n SharedToAvatarList\n} from 'libs/shared/apps/share/components/shared-to-avatar-list/SharedToAvatarList';\nimport { SharableEntity, ShareViewHelper } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { ActionOptions, Actions } from 'libs/shared/components/actions/Actions';\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 { MasterType } from 'libs/shared/enums/MasterType';\nimport { ShareType } from 'libs/shared/enums/ShareType';\nimport { Breakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { BaseObject, InteractiveMetadata, UnionShareObject } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst namespace = 'insights.insightsListTable';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getDateShared(share: UnionShareObject): string {\n if (share.type === ShareType.ShareLink || !share?.recipients?.length)\n return share.dateCreated;\n\n const datesShared = share.recipients.map(r => r.dateShared);\n\n datesShared.sort((date1, date2) => {\n if (DateHelper.isSame(date1, date2))\n return 0;\n\n return DateHelper.isAfter(date1, date2) ? 1 : -2;\n });\n\n\n if (!datesShared.length)\n return '';\n\n return ArrayHelper.last(datesShared);\n}\n\ninterface SharedByMeTableData {\n share: UnionShareObject;\n sharedObject: SharableEntity;\n dateShared: string;\n shareRecipients?: BaseObject[];\n viewCount: number;\n pendingReview: number;\n}\n\nexport function getColumns(\n getObjectAppLink: (object: BaseObject) => Core.AppLink,\n getObjectActions: (object: BaseObject) => ActionOptions[],\n imageCdnUrl: string,\n breakpoints?: Breakpoints,\n hideViews?: boolean\n): Column<SharedByMeTableData>[] {\n const isMobile = breakpoints && (breakpoints.xs || breakpoints.sm || breakpoints.md);\n\n const columns: Column<SharedByMeTableData>[] = [\n {\n Header: getPhrase('title'),\n accessor: 'sharedObject',\n id: 'image',\n Cell: ({ value }) => (\n <div className='w-100'>\n <SharedObjectImage\n object={value}\n appLink={getObjectAppLink(value)}\n showVideoMetadata\n locationContext={LocationContext.SharedByMe}\n />\n </div>\n ),\n minWidth: 140,\n maxWidth: 30\n },\n {\n accessor: 'sharedObject',\n id: 'name',\n Cell: ({ value, row, data }) => {\n if (value.name) {\n if (VideoHelper.isVideoType(value) && !VideoHelper.getCanBeConsumed(value)?.canNavigate) {\n return (\n <span className='clamp-2'>\n {value.name}\n </span>\n );\n }\n\n const pendingReview = data[row.index]?.pendingReview;\n\n return (\n <div>\n <AppLink\n appLink={getObjectAppLink(value)}\n className='clamp-2'\n analyticsData={{ id: value.id, name: value.name }}\n analyticsOptions={{\n entity: ShareViewHelper.getAnalyticsEntity(value.type),\n actionType: UserAction.Click,\n location: LocationContext.SharedByMe\n }}\n >\n {value.name}\n </AppLink>\n \n {!!pendingReview && (\n <div className='bg-light-indigo text-dark-blue fw-semibold font-size-sm rounded-pill w-fit mt-1 px-2'>\n <Text namespace={namespace} phrase='requireMarking' options={{ count: pendingReview }} />\n </div>\n )}\n </div>\n );\n }\n\n return <span><Text namespace={namespace} phrase='videoUnavailable' /></span>;\n },\n width: 100\n },\n {\n Header: getPhrase('sharedTo'),\n accessor: 'shareRecipients',\n Cell: ({ value }) => {\n if (!value)\n return <SharedLinkAvatar />;\n\n if (!value.length)\n return <AnonymousSharedToAvatar />;\n\n return <SharedToAvatarList recipients={value} imageCdnUrl={imageCdnUrl} maxAvatars={isMobile ? 1 : 2} />;\n },\n width: 30\n },\n !hideViews && {\n Header: getPhrase('views'),\n accessor: 'share',\n Cell: ({ value }) => {\n return (\n <div className='d-flex align-items-center'>\n <SvgContainer svgName={cvSvgLibrary.User} />\n <span>{value.accessedCount}{value.totalAccessible ? `/${value.totalAccessible}` : ''}</span>\n </div>\n );\n },\n width: 30\n },\n !isMobile && {\n Header: getPhrase('shared'),\n id: 'dateShared',\n accessor: s => formatDate(s.dateShared),\n width: 40\n },\n {\n accessor: 'sharedObject',\n id: 'actions',\n Cell: ({ value }) => (\n <Actions\n actions={getObjectActions(value)}\n className='w-100 justify-content-end align-items-center gap-2'\n actionsDropdownClassName='bg-transparent'\n dropdownToggleSvgSize={SvgContainerSize.Standard}\n />\n ),\n width: 40\n }\n ];\n\n return columns.filter((Boolean));\n}\n\nexport function useGetData(\n sentShares: UnionShareObject[],\n sharedObjects: BaseObject[],\n shareRecipients: BaseObject[],\n interactivesPendingReviews: InteractivesPendingReviews[],\n dependencies: any[]\n): SharedByMeTableData[] {\n return React.useMemo(() => {\n const tableData: SharedByMeTableData[] = [];\n\n sentShares.forEach(s => {\n const sharedObject = sharedObjects.find(o => o.id === s.objectId);\n\n let recipients: BaseObject[] | null = null;\n\n if (s.type === ShareType.DirectShare) {\n recipients = [];\n\n s.recipients?.forEach(r => {\n const recipient = shareRecipients.find(s => s.id === r.id);\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 && interactivesPendingReviews?.find(\n pendingReview => pendingReview.interactiveId === (sharedObject as InteractiveMetadata).interactiveId\n );\n\n tableData.push({\n share: s,\n sharedObject,\n shareRecipients: recipients,\n dateShared: getDateShared(s),\n viewCount: s.viewCount ?? 0,\n pendingReview: pendingReview?.pendingReviewCount\n });\n }\n });\n\n return tableData;\n }, dependencies);\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { InteractivesPendingReviews } from 'libs/shared/apps/analytics/interfaces/response/InteractivesPendingReviewsResponse';\nimport { SHARES_TABLE_THEME } from 'libs/shared/apps/share/constants/TableTheme';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { Table } from 'libs/shared/components/table/Table';\nimport { Breakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { BaseObject, UnionShareObject } from 'libs/shared/interfaces';\n\nimport { getColumns, useGetData } from './InsightsListTableUtils';\n\ninterface InsightsListTableProps {\n sentShares: UnionShareObject[];\n sharedObjects: BaseObject[];\n shareRecipients: BaseObject[];\n interactivesPendingReviews: InteractivesPendingReviews[];\n getObjectAppLink: (object: BaseObject) => Core.AppLink;\n getObjectActions: (object: BaseObject) => ActionOptions[];\n imageCdnUrl: string;\n groupByDateShared?: boolean;\n showStatus?: boolean;\n showViewCount?: boolean;\n dependencies?: any[];\n breakpoints?: Breakpoints;\n hideViews?: boolean\n}\n\nfunction InsightsListTableMemo(props: InsightsListTableProps): JSX.Element {\n const data = useGetData(\n props.sentShares,\n props.sharedObjects,\n props.shareRecipients,\n props.interactivesPendingReviews,\n props.dependencies\n );\n\n return (\n <>\n <Table\n columns={getColumns(\n props.getObjectAppLink,\n props.getObjectActions,\n props.imageCdnUrl,\n props.breakpoints,\n props.hideViews\n )}\n data={data}\n theme={SHARES_TABLE_THEME}\n />\n </>\n );\n}\n\nexport const InsightsListTable = React.memo(InsightsListTableMemo);","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AudienceQueryParams } from 'libs/shared/apps/analytics/interfaces/AudienceQueryParams';\nimport { SharableEntityType } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { Breakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { BaseObject } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\n\nconst namespace = 'lite.insightsList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getInsightsObjectActions(\n sharedObject: BaseObject,\n audienceParams: AudienceQueryParams,\n isMobile: boolean\n): ActionOptions[] {\n let entityType: SharableEntityType;\n let insightsAppLink: Core.AppLink;\n\n if (VideoHelper.isVideo(sharedObject)) {\n entityType = 'video';\n insightsAppLink = {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.VIDEO_OVERVIEW,\n args: [sharedObject.id]\n };\n }\n\n if (VideoHelper.isInteractive(sharedObject)) {\n entityType = 'interactive';\n insightsAppLink = {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_OVERVIEW,\n args: [sharedObject.id]\n };\n }\n\n if (VideoHelper.isClip(sharedObject)) {\n entityType = 'clip';\n insightsAppLink = {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.CLIP_OVERVIEW,\n args: [sharedObject.id]\n };\n }\n\n if (sharedObject.typeId === MasterType.Series)\n entityType = 'series';\n\n if (sharedObject.typeId === MasterType.Playlist)\n entityType = 'playlist';\n\n \n const insightObjectActions: ActionOptions[] = [\n {\n label: getPhrase('editShareSettings'),\n appLink: {\n application: AppChannels.DEFAULT,\n action: Actions.Default.SHARE,\n args: [sharedObject.id],\n params: { entityType }\n }\n }\n ];\n\n if (VideoHelper.isVideoType(sharedObject)) {\n const { canConsume } = VideoHelper.getCanBeConsumed(sharedObject);\n\n if (!canConsume)\n return [];\n\n insightObjectActions.unshift({\n label: getPhrase('viewInsights'),\n className: 'btn btn-outline-dark',\n button: !isMobile,\n svgName: cvSvgLibrary.Chart,\n appLink: { ...insightsAppLink, params: audienceParams }\n });\n }\n\n return insightObjectActions;\n}\n\nexport function useGetInsightsObjectActions(\n breakpoints: Breakpoints,\n audienceParams?: AudienceQueryParams\n): ((object: BaseObject) => ActionOptions[]) | null {\n const isMobile = breakpoints.xs || breakpoints.sm || breakpoints.md;\n const audienceParamsKey = JSON.stringify(audienceParams);\n\n return React.useCallback(\n (object: BaseObject) => getInsightsObjectActions(\n object,\n audienceParams,\n isMobile\n ),\n [ isMobile, audienceParamsKey ]\n );\n}\n\n\nexport function getTypeIdParams(appLink: Core.AppLink): MasterType[] {\n const typeIdParams = (appLink.params as HashObject)?.typeId;\n\n if (!typeIdParams) return [];\n\n if (typeof typeIdParams === 'string')\n return [+typeIdParams];\n\n return (appLink.params as HashObject)?.typeId.map((typeId: MasterType) => +typeId) || [];\n}"],"names":["getInteractiveResultFilters","currentUser","filter","currentUserId","id","currentCustomerId","customerId","dateRange","start","end","userIds","userId","classroomsAndGroups","groupId","InteractiveResultsRequests","interactiveResultSet","interactiveId","interactiveMetadataId","success","error","always","url","key","data","type","normalize","mark","answerId","resultId","invalidationKeys","pendingReviews","interactiveResultsReport","getAnalyticsRequestKey","baseKey","sharerId","userIdKey","Array","isArray","sort","join","groupIdKey","mapColourToBsVariant","groupColour","getPhrase","ClassroomOverviewView","props","dispatch","breakpoints","classroom","classroomId","isRostered","_integrations","rostered","getRequest","cursor","recipientGroupId","fetchNext","sentShares","items","hasMore","isFetchingSentShares","isFetching","nextCursor","sharedObjectIds","map","s","objectId","sharedObjectsFetchResult","ids","interactiveIds","Object","keys","reduce","acc","value","typeId","interactive","metadataId","interactivesPendingReview","I","interactives","filters","recipientIds","shareRecipientsFetchResult","config","title","getSharedObjectActions","classrooms","showPartialLoading","sentSharesMemo","sharedObjects","shareRecipients","activeTab","onTogglePin","shouldPin","onSuccess","onError","request","length","interactivesPendingReviews","getObjectAppLink","getObjectActions","imageCdnUrl","groupByDateShared","dependencies","hideViews","appLink","application","action","imageUrl","className","numItems","InsightsListEmptyState","src","size","useInteractiveCopy","text","namespace","LanguageService","getDateShared","share","ShareType","recipients","dateCreated","datesShared","r","dateShared","date1","date2","DateHelper","ArrayHelper","InsightsListTable","isMobile","tableData","forEach","sharedObject","find","o","recipient","push","pendingReview","MasterType","viewCount","pendingReviewCount","Table","columns","xs","sm","md","Header","accessor","Cell","SharedObjectImage","object","showVideoMetadata","locationContext","minWidth","maxWidth","row","name","VideoHelper","canNavigate","index","AppLink","analyticsData","analyticsOptions","entity","ShareViewHelper","actionType","location","Text","phrase","options","count","width","SharedToAvatarList","maxAvatars","SvgContainer","svgName","accessedCount","totalAccessible","Actions","actions","actionsDropdownClassName","dropdownToggleSvgSize","S","Boolean","theme","useGetInsightsObjectActions","audienceParams","audienceParamsKey","JSON","stringify","entityType","insightsAppLink","args","insightObjectActions","label","params","canConsume","unshift","button","getInsightsObjectActions","getTypeIdParams","typeIdParams"],"sourceRoot":""}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[8095],{34079:(e,t,n)=>{n.d(t,{O:()=>l});var r=n(32735),a=n(23481),i=n(40782),c=n(36532),o=a.T.encloseNamespace("interactives.pendingIndicator");function s(e){var t="d-flex align-items-center h-100";return t+=e.showLabel?" justify-content-between":" justify-content-center",e.className&&(t+=" ".concat(e.className)),t}function l(e){var t=function(){return r.createElement("div",{className:s(e)},!!e.showLabel&&r.createElement("em",null,o("pending")),r.createElement(i.O,null))};return e.title?r.createElement(c.u,{title:e.title,spanHack:!0,spanHackClassName:e.tooltipClassName||"h-100 w-100 d-flex align-items-center"},r.createElement(t,null)):r.createElement(t,null)}},48258:(e,t,n)=>{n.d(t,{Ju:()=>O,bB:()=>T,l8:()=>_,R7:()=>j,lE:()=>B,Fx:()=>L});var r=n(32735),a=n(23481),i=n(75896),c=n(34079),o=n(26136),s=n(39157),l=n(40782),u=n(80845),d=n(9601),m=n(71151),v=n(93264),f=n(84120);const g={container:"Wf1bl",interaction:"Fpm49"};function w(e){return e.duration?r.createElement(r.Fragment,null,e.interactive.timepoints.map((function(t,n){if(!t.interactions.length)return r.createElement(r.Fragment,null);var a,i,c=(a=t,i=e.selectedInteraction,a.interactions.find((function(e){return e.id===i.id}))||a.interactions[0]),o=c.id===e.selectedInteraction.id,s=o?f.w.getTypeInfo(c.typeId).bgClassName:"bg-gray-500",l=t.visibleAt/1e3/e.duration*100;return r.createElement("div",{key:n,className:"".concat(g.container," text-center"),style:{left:"".concat(l,"%")}},r.createElement("div",{className:"".concat(g.interaction," ").concat(s)}),!!o&&r.createElement("div",null,v.T.ToDisplayDuration(t.visibleAt)))}))):r.createElement(r.Fragment,null)}var p=n(86572);var y=a.T.encloseNamespace("shared.interactionResultsSummary");function h(e){var t,n=r.useMemo((function(){return(0,s.nq)(e.interaction,e.results)}),[e.interaction,e.results]);return r.createElement("div",{className:"px-1 pt-1"},r.createElement("div",{className:"d-flex"},r.createElement(p.y,{interaction:e.interaction,iconClassName:"flex-shrink-0"})),r.createElement("div",{className:"my-4 ".concat("FCXQd")},r.createElement(w,{interactive:e.interactive,duration:(t=e.interactiveMetadata,t._parentClip?t._parentClip.endTime-t._parentClip.startTime:t._parentVideo.duration?t._parentVideo.duration/1e3:0),selectedInteraction:e.interaction})),r.createElement("div",{className:"row pt-1 pb-2"},r.createElement("div",{className:"col-6 pe-1"},r.createElement("div",{className:"bg-light rounded p-2 h-100"},!n.awaitingMarking&&r.createElement("div",{className:"d-flex align-items-center justify-content-between"},r.createElement("strong",null,y("correctlyAnswered")),r.createElement(l.O,{percentage:n.percentCorrect,layout:l.I.LabelOnly})),!!n.awaitingMarking&&r.createElement("div",{className:"d-flex align-items-center justify-content-center"},r.createElement("strong",null,r.createElement("em",null,y("pending")))))),r.createElement("div",{className:"col-6 ps-1"},r.createElement("div",{className:"bg-light rounded h-100 p-2 d-flex align-items-center justify-content-between"},r.createElement("strong",null,y("unanswered")),r.createElement("span",null,n.unanswered)))))}var E=r.forwardRef((function(e,t){var n=e.interaction,a=e.interactive,i=e.interactiveMetadata,c=e.results,o=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var a=0;for(r=Object.getOwnPropertySymbols(e);a<r.length;a++)t.indexOf(r[a])<0&&Object.prototype.propertyIsEnumerable.call(e,r[a])&&(n[r[a]]=e[r[a]])}return n}(e,["interaction","interactive","interactiveMetadata","results"]);return r.createElement("div",{className:"popover-lg"},r.createElement(m.Z,Object.assign({id:"interaction-results-summary-".concat(n.id),ref:t},o),r.createElement(m.Z.Body,null,r.createElement(h,{interaction:n,interactive:a,interactiveMetadata:i,results:c}))))})),b=n(22517);function C(e){var t;return r.createElement(d.Z,{trigger:(null===(t=e.results.students)||void 0===t?void 0:t.length)?"click":null,placement:"bottom",overlay:r.createElement(E,{interaction:e.interaction,interactive:e.interactive,interactiveMetadata:e.interactiveMetadata,results:e.results}),rootClose:!0},r.createElement("div",{className:"text-center h-100\n d-flex align-items-center justify-content-center\n ".concat(b.Z.interactionHeaderCellInner),onMouseEnter:e.onMouseEnter,onMouseLeave:e.onMouseLeave},r.createElement("div",{className:"p-1 position-relative"},e.interactionNumber)))}var I=n(83914),N=n(28972),k=n(83140),M=n(35223);function A(e){var t="".concat(b.Z.resultsCellInner," h-100 position-relative");return e===N.w.Correct&&(t+=" ".concat(b.Z.correct)),e===N.w.Incorrect&&(t+=" ".concat(b.Z.incorrect," text-danger")),e===N.w.AwaitingMarking&&(t+=" ".concat(b.Z.awaitingMarking)),e===N.w.UnAnswered&&(t+=" ".concat(b.Z.unanswered," text-warning")),t}function S(e){var t=k.A.isInteractionCorrect(e.interaction,(0,u.j_)(e.studentResults)),n=function(e){return e===N.w.Correct?M.vn.Check:e===N.w.Incorrect?M.vn.Close:e===N.w.UnAnswered?M.vn.Minus:void 0}(t);return r.createElement("div",{className:A(t)},!!n&&r.createElement(I.x,{svgName:n}),t===N.w.AwaitingMarking&&r.createElement(c.O,null))}var R=a.T.encloseNamespace("shared.studentResultsTable"),O=60;function x(e){var t;return r.createElement("div",{className:"d-flex align-items-center p-2 h-100 ".concat(null!==(t=e.className)&&void 0!==t?t:"")},e.children)}function Z(e){return r.createElement(x,{className:e.column.isSorted&&"fw-bold"},R(e.phraseKey))}function j(e,t){var n,a=!!(null===(n=e.students)||void 0===n?void 0:n.length);return r.useMemo((function(){return[{Header:function(e){var t=e.column;return r.createElement(Z,{column:t,phraseKey:"name"})},accessor:"user",Cell:function(e){var n=e.value;return r.createElement(x,null,r.createElement("span",{className:"text-truncate"},(0,o.B)(n,t)))},disableSortBy:!a},{Header:function(e){var t=e.column;return r.createElement(Z,{column:t,phraseKey:"unanswered"})},accessor:"summary.unanswered",sortType:"basic",sortDescFirst:!0,disableSortBy:!a,Cell:function(e){var t=e.value;return r.createElement(x,null,t)}},{Header:function(e){var t=e.column;return r.createElement(Z,{column:t,phraseKey:"score"})},accessor:"summary",id:"score",Cell:function(e){var t=e.value;return t.awaitingMarking?r.createElement(x,null,r.createElement(c.O,{title:R("markingRequired"),className:"flex-grow-1",showLabel:!0})):r.createElement(x,null,"".concat(t.correct,"/").concat(t.answered+t.unanswered))},width:125,sortDescFirst:!0,disableSortBy:!a},{Header:function(e){var t=e.column;return r.createElement(Z,{column:t,phraseKey:"percentage"})},accessor:"summary",id:"percentage",Cell:function(e){var t=e.value;return t.awaitingMarking?r.createElement(x,null,r.createElement(c.O,{title:R("markingRequired"),className:"flex-grow-1",showLabel:!0})):r.createElement(x,null,r.createElement(l.O,{percentage:t.percentCorrect,layout:l.I.LabelBefore,className:"flex-grow-1"}))},width:125,sortDescFirst:!0,disableSortBy:!a}]}),[t,a])}function B(e,t,n,a,i){return r.useMemo((function(){return(0,u.Q)(e).map((function(i,c){return{Header:function(){return r.createElement(C,{interaction:i,results:n,interactive:e,interactiveMetadata:t,interactionNumber:c+1,onMouseEnter:function(){return a(c)},onMouseLeave:function(){return a(null)}})},accessor:"results",id:i.id,disableSortBy:!0,width:O,Cell:function(e){var t=e.row.original;return r.createElement(S,{interaction:i,studentResults:t})}}}))}),[i])}function L(e,t,n,a,c){return r.useMemo((function(){var n=[];if(t.students.forEach((function(t){n.push(Object.assign(Object.assign({},t),{summary:(0,s.Rt)(e,t)}))})),"user"===(null==c?void 0:c.id)){var r=i.m.sortBy(n,(function(e){return(0,o.B)(e.user,a)}));return c.desc?r.reverse():r}if("summary.unanswered"===(null==c?void 0:c.id)){var l=i.m.sortBy(n,(function(e){return e.summary.unanswered}));return c.desc?l.reverse():l}if("score"===(null==c?void 0:c.id)||"percentage"===(null==c?void 0:c.id)){var u=i.m.sortBy(n,(function(e){return e.summary.awaitingMarking?-1:e.summary.percentCorrect}));return c.desc?u.reverse():u}return n}),[n,c,a])}function T(e,t){if(e){var n=e.querySelectorAll(".".concat(b.Z.resultsRow));null==n||n.forEach((function(e){e.childNodes.forEach((function(e,n){e.classList.remove(b.Z.highlightColumn),n===t&&e.classList.add(b.Z.highlightColumn)}))}))}}function _(e,t){if(e){var n=e.querySelectorAll(".".concat(b.Z.resultsRow));null==n||n.forEach((function(e,n){e.classList.remove(b.Z.highlightResultsRow),n===t&&e.classList.add(b.Z.highlightResultsRow)}))}}},71553:(e,t,n)=>{n.d(t,{I:()=>c});var r=n(99940),a=n(62875);function i(e,t){return{currentUserId:e.id,currentCustomerId:e.customerId,dateRange:{start:t.start,end:t.end},userIds:t.userId,classroomsAndGroups:t.groupId}}var c={interactiveResultSet:function(e,t,n,c,o,s,l){return{url:"/api/domain/v2/analytics/interactives/".concat(e,"/metadata/").concat(t),key:(0,a.H)("interactive:result:set:".concat(e,":").concat(t),c),data:i(n,c),type:r.k.POST,normalize:!1,success:o,error:s,always:l}},mark:function(e,t,n,a,i,c,o){return{url:"/api/domain/v1/analytics/answers/".concat(n),key:"mark:answer:".concat(n,":").concat(a.resultId),type:r.k.PUT,data:a,normalize:!1,invalidationKeys:"interactive:result:set:".concat(e,":").concat(t),success:i,error:c,always:o}},pendingReviews:function(e){return{url:"/api/domain/v1/analytics/interactives/pending-reviews/summary",key:"interactives:pending:reviews",type:r.k.POST,data:e}},interactiveResultsReport:function(e){return{url:"{gateway}/v2/analytics/interactives/report",key:"interactive:results:report",data:e,type:r.k.POST,normalize:!1}}}},41196:(e,t,n)=>{n.d(t,{W:()=>o});var r=n(20354),a=n(71553),i=n(20768),c=n(31949);function o(e,t){var n,o=r.a.useBasicFetch(c.N.currentUser()),s=r.a.useBasicFetch(!!e&&i.b.interactiveMetadata(e)),l=r.a.useBasicFetch(!!(null===(n=s.data)||void 0===n?void 0:n.interactiveId)&&i.b.interactive(s.data.interactiveId)),u=!!o.data&&!!l.data&&!!t;return r.a.useBasicFetch(u&&a.I.interactiveResultSet(s.data.interactiveId,s.data.id,o.data,t))}},39157:(e,t,n)=>{n.d(t,{HI:()=>m,R6:()=>l,Rt:()=>f,UU:()=>d,Zs:()=>u,nq:()=>v});var r=n(75896),a=n(94892),i=n(28972),c=n(8246),o=n(83140),s=n(80845);function l(e,t){var n={markingRequired:[],lowScore:[],highScore:[],completed:[],notCompleted:[]},i=(0,s.Q)(e).length;t.students.forEach((function(t){var c=Object.assign(Object.assign({},t),{summary:f(e,t)});c.summary.awaitingMarking?n.markingRequired.push(c):r.m.last(t.results).attempts.length===i?(n.completed.push(c),c.summary.percentCorrect>=a.i.HIGH&&n.highScore.push(c),c.summary.percentCorrect<a.i.MODERATE&&n.lowScore.push(c)):n.notCompleted.push(c)}));var c=r.m.sortBy(n.lowScore,(function(e){return e.summary.percentCorrect})),o=r.m.sortBy(n.highScore,(function(e){return e.summary.percentCorrect})).reverse();return Object.assign(Object.assign({},n),{lowScore:c,highScore:o})}function u(e,t){return(0,s.Wn)(e).find((function(e){return e.id.toString()===t.toString()}))}function d(e){return"".concat(e.questionId,":").concat(e.resultId)}function m(e,t,n){var r=(0,s.j_)(t),a=(0,s.f6)(e,r);return(null==a?void 0:a.answers.every((function(e){var t;return(null===(t=n[d(e)])||void 0===t?void 0:t.status)===c.N.Correct})))?c.N.Correct:(null==a?void 0:a.answers.every((function(e){var t;return(null===(t=n[d(e)])||void 0===t?void 0:t.status)===c.N.Incorrect})))?c.N.Incorrect:void 0}function v(e,t){var n=t.students.length,r=0,a=0,c=0,l=0,u=0;return t.students.forEach((function(t){var n=(0,s.j_)(t);if(n){u+=t.results.length;var d=o.A.isInteractionCorrect(e,n);d===i.w.Correct&&r++,d===i.w.UnAnswered&&c++,d===i.w.AwaitingMarking&&l++,d!==i.w.UnAnswered&&a++}})),{percentCorrect:n>0?r/n:0,correct:r,answered:a,unanswered:c,awaitingMarking:l,attempts:u}}function f(e,t){var n=(0,s.j_)(t),r=(0,s.Q)(e),a=r.length,c=0,l=0;r.forEach((function(e){var t=o.A.isInteractionCorrect(e,n);t===i.w.Correct&&c++,t===i.w.AwaitingMarking&&l++}));var u=a>0?c/a:0,d=new Set(r.map((function(e){return e.id}))),m=n.attempts.filter((function(e){var t;return!!d.has(null===(t=null==e?void 0:e.answers[0])||void 0===t?void 0:t.questionId)})).length;return{answered:n.attempts.length,attempts:t.results.length,unanswered:a-m,percentCorrect:u,correct:c,awaitingMarking:l}}},28972:(e,t,n)=>{var r;n.d(t,{w:()=>r}),function(e){e[e.Correct=0]="Correct",e[e.Incorrect=1]="Incorrect",e[e.AwaitingMarking=2]="AwaitingMarking",e[e.Answered=3]="Answered",e[e.UnAnswered=4]="UnAnswered",e[e.NotApplicable=5]="NotApplicable"}(r||(r={}))},8246:(e,t,n)=>{var r;n.d(t,{N:()=>r}),function(e){e[e.Incorrect=0]="Incorrect",e[e.Correct=1]="Correct",e[e.PendingReview=2]="PendingReview"}(r||(r={}))},83140:(e,t,n)=>{n.d(t,{A:()=>g});var r=n(28972),a=n(8246),i=n(40424);function c(e){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},c(e)}function o(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=c(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,"string");if("object"!=c(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==c(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(){return r.w.NotApplicable}function l(e,t){var n=e.actionableItems.filter((function(e){return e.isCorrect}));return n.every((function(e){return!t(e.id)}))?r.w.UnAnswered:n.every((function(e){var n;return e.name.trim().toLowerCase()===(null===(n=t(e.id))||void 0===n?void 0:n.trim().toLowerCase())}))?r.w.Correct:r.w.Incorrect}function u(e,t){return e.actionableItems.every((function(e){return!t(e.id)}))?r.w.UnAnswered:e.actionableItems.filter((function(e){return e.isCorrect})).every((function(e){var n,r=t(e.id);return(null==r?void 0:r.toString())===(null===(n=e.id)||void 0===n?void 0:n.toString())||r===e.name}))?r.w.Correct:r.w.Incorrect}function d(e,t){return function(n){var r=t.attempts.find((function(t){return t.id===e.id}));return null==r?void 0:r.answers.find((function(e){return e.id===n}))}}function m(e,t){var n=d(e,t);return u(e,(function(e){var t=n(e);return null==t?void 0:t.text}))}function v(e,t){return function(e,t){var n;return e.actionableItems.forEach((function(e){var i=t(e.id);n=i?i.status!==a.N.Correct?i.status!==a.N.Incorrect?r.w.AwaitingMarking:r.w.Incorrect:r.w.Correct:r.w.UnAnswered})),n}(e,d(e,t))}var f=o(o(o(o(o(o(o({},i.Z9.Annotation,s),i.Z9.Image,s),i.Z9.MissingWord,(function(e,t){var n=d(e,t);return l(e,(function(e){var t=n(e);return null==t?void 0:t.text}))})),i.Z9.MultipleChoice,m),i.Z9.ShortAnswer,v),i.Z9.TrueOrFalse,m),i.Z9.Illustration,v),g={notApplicable:s,awaitingMarking:function(){return r.w.AwaitingMarking},isMissingWordCorrect:l,isMultipleChoiceCorrect:u,isInteractionCorrect:function(e,t){return(0,f[e.typeId])(e,t)}}},80845:(e,t,n)=>{n.d(t,{Q:()=>l,Wn:()=>c,f6:()=>s,j_:()=>o});var r=n(75896),a=n(40424);function i(e){return e.typeId!==a.Z9.Annotation&&e.typeId!==a.Z9.Image}function c(e){return r.m.flatten(e.timepoints.map((function(e){return e.interactions})))}function o(e){return r.m.last(e.results)}function s(e,t){return r.m.findWhere(null==t?void 0:t.attempts,{id:e})}function l(e){return c(e).filter(i)}},22517:(e,t,n)=>{n.d(t,{Z:()=>r});const r={header:"hnMke",row:"ILLa_",fixedTable:"_fdpt",interactionHeaderCellOuter:"kjXYB",hasResults:"M4qgr",interactionHeaderCellInner:"cnFvB",resultsCellOuter:"bdzRb",correct:"xANR6",incorrect:"_44sb",awaitingMarking:"eQ9sh",unanswered:"xRUK8",highlightColumn:"f9Zqr",resultsCellInner:"LAFwi",highlightResultsRow:"TwwLO",resultsRow:"xZ5iP"}}}]);
|
|
2
|
+
//# sourceMappingURL=8095-777a5c5ddf-lite.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts/8095-777a5c5ddf-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/analytics/components/pending-indicator/PendingIndicator.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/interactions-bar/interactions-bar.scss","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/interactions-bar/InteractionsBar.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/interaction-results-summary/InteractionResultsSummary.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/interaction-results-summary/interaction-results-summary.scss","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/InteractionHeaderCell.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/StudentResultCell.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/StudentResultsTableUtils.tsx","file:///app/packages/libs/shared/src/apps/analytics/flight-requests/InteractiveResultsRequests.ts","file:///app/packages/libs/shared/src/apps/analytics/hooks/UseFetchInteractiveResults.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/InteractiveUtils.ts","file:///app/packages/libs/shared/src/enums/InteractionCorrectness.ts","file:///app/packages/libs/shared/src/enums/InteractiveAnswerStatus.ts","file:///app/packages/libs/shared/src/utils/InteractiveCorrectnessHelper.ts","file:///app/packages/libs/shared/src/utils/InteractiveHelper.ts","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/student-results-table.scss"],"sourcesContent":["import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { PercentageIndicator } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\n\nconst namespace = 'interactives.pendingIndicator';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getClassName(props: PendingIndicatorProps): string {\n let className = 'd-flex align-items-center h-100';\n\n className += props.showLabel ? ' justify-content-between' : ' justify-content-center';\n\n if (props.className)\n className += ` ${props.className}`;\n\n return className;\n}\n\ninterface PendingIndicatorProps {\n title?: string;\n className?: string;\n showLabel?: boolean;\n tooltipClassName?: string;\n}\n\nexport function PendingIndicator(props: PendingIndicatorProps): JSX.Element {\n const Indicator = () => (\n <div className={getClassName(props)}>\n {!!props.showLabel &&\n <em>{getPhrase('pending')}</em>\n }\n <PercentageIndicator />\n </div>\n );\n\n if (!props.title)\n return <Indicator />;\n\n return (\n <Tooltip title={props.title} spanHack spanHackClassName={props.tooltipClassName || 'h-100 w-100 d-flex align-items-center'}>\n <Indicator />\n </Tooltip>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"container\":\"Wf1bl\",\"interaction\":\"Fpm49\"};","import React from 'react';\n\nimport { Interaction, Interactive, Timepoint } from 'libs/shared/interfaces';\nimport { DurationHelper } from 'libs/shared/utils/DurationHelper';\nimport { InteractionTypeHelper } from 'libs/shared/utils/interaction-type-helper/InteractionTypeHelper';\n\nimport styles from './interactions-bar.scss';\n\nfunction getInteraction(timepoint: Timepoint, selectedInteraction: Interaction): Interaction {\n return timepoint.interactions.find(i => i.id === selectedInteraction.id) || timepoint.interactions[0];\n}\n\ninterface InteractionBarProps {\n interactive: Interactive;\n duration: number;\n selectedInteraction: Interaction;\n}\n\nexport function InteractionsBar(props: InteractionBarProps): React.ReactElement {\n if (!props.duration)\n return <></>;\n\n return (\n <>\n {props.interactive.timepoints.map((t, i) => {\n if (!t.interactions.length)\n return <></>;\n\n const interaction = getInteraction(t, props.selectedInteraction);\n const isSelected = interaction.id === props.selectedInteraction.id;\n\n const bgClassName = isSelected ? (InteractionTypeHelper.getTypeInfo(interaction.typeId)).bgClassName : 'bg-gray-500';\n\n const left = ((t.visibleAt / 1000) / props.duration) * 100;\n\n return (\n <div\n key={i}\n className={`${styles.container} text-center`}\n style={{ left: `${left}%` }}\n >\n <div className={`${styles.interaction} ${bgClassName}`} />\n {!!isSelected &&\n <div>\n {DurationHelper.ToDisplayDuration(t.visibleAt)}\n </div>\n }\n </div>\n );\n })}\n </>\n );\n}","import React from 'react';\nimport { Popover } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InteractionsBar } from 'libs/shared/apps/analytics/components/student-results/interactions-bar/InteractionsBar';\nimport { getInteractionResultsSummary } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { PercentageIndicator, PercentageIndicatorLayout } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Interaction, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\n\nimport styles from './interaction-results-summary.scss';\n\nconst namespace = 'shared.interactionResultsSummary';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getDuration(interactiveMetadata: InteractiveMetadata): number {\n if (interactiveMetadata._parentClip)\n return interactiveMetadata._parentClip.endTime - interactiveMetadata._parentClip.startTime;\n\n if (!interactiveMetadata._parentVideo.duration)\n return 0;\n\n return interactiveMetadata._parentVideo.duration / 1000;\n}\n\ninterface InteractionResultsSummaryProps {\n interaction: Interaction;\n interactive: Interactive;\n interactiveMetadata: InteractiveMetadata;\n results: InteractiveResultSet;\n}\n\nfunction InteractionResultsSummary(props: InteractionResultsSummaryProps): JSX.Element {\n const summary = React.useMemo(\n () => getInteractionResultsSummary(props.interaction, props.results),\n [ props.interaction, props.results ]\n );\n\n return (\n <div className='px-1 pt-1'>\n <div className='d-flex'>\n <InteractionLabel\n interaction={props.interaction}\n iconClassName='flex-shrink-0'\n />\n </div>\n <div className={`my-4 ${styles.bar}`}>\n <InteractionsBar\n interactive={props.interactive}\n duration={getDuration(props.interactiveMetadata)}\n selectedInteraction={props.interaction}\n />\n </div>\n <div className='row pt-1 pb-2'>\n <div className='col-6 pe-1'>\n <div className='bg-light rounded p-2 h-100'>\n {!summary.awaitingMarking &&\n <div className='d-flex align-items-center justify-content-between'>\n <strong>{getPhrase('correctlyAnswered')}</strong>\n <PercentageIndicator\n percentage={summary.percentCorrect}\n layout={PercentageIndicatorLayout.LabelOnly}\n />\n </div>\n }\n {!!summary.awaitingMarking &&\n <div className='d-flex align-items-center justify-content-center'>\n <strong>\n <em>{getPhrase('pending')}</em>\n </strong>\n </div>\n }\n </div>\n </div>\n <div className='col-6 ps-1'>\n <div className='bg-light rounded h-100 p-2 d-flex align-items-center justify-content-between'>\n <strong>{getPhrase('unanswered')}</strong>\n <span>{summary.unanswered}</span>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nconst InteractionResultsSummaryPopover = React.forwardRef((\n { interaction, interactive, interactiveMetadata, results, ...popoverProps }: InteractionResultsSummaryProps,\n ref: React.MutableRefObject<HTMLElement>\n) => {\n return (\n <div className='popover-lg'>\n <Popover\n id={`interaction-results-summary-${interaction.id}`}\n ref={ref as any}\n {...popoverProps}\n >\n <Popover.Body>\n <InteractionResultsSummary\n interaction={interaction}\n interactive={interactive}\n interactiveMetadata={interactiveMetadata}\n results={results}\n />\n </Popover.Body>\n </Popover>\n </div>\n );\n});\n\nexport { InteractionResultsSummaryPopover as InteractionResultsSummary };","// extracted by mini-css-extract-plugin\nexport default {\"bar\":\"FCXQd\"};","import React from 'react';\nimport { OverlayTrigger } from 'react-bootstrap';\n\nimport { InteractionResultsSummary } from 'libs/shared/apps/analytics/components/student-results/interaction-results-summary/InteractionResultsSummary';\nimport { Interaction, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\n\nimport styles from './student-results-table.scss';\n\ninterface InteractionHeaderCellProps {\n interaction: Interaction;\n results: InteractiveResultSet;\n interactionNumber: number;\n interactive: Interactive;\n interactiveMetadata: InteractiveMetadata;\n onMouseEnter?: () => void;\n onMouseLeave?: () => void;\n}\n\nexport function InteractionHeaderCell(props: InteractionHeaderCellProps): JSX.Element {\n return (\n <OverlayTrigger\n trigger={props.results.students?.length ? 'click' : null}\n placement='bottom'\n overlay={\n <InteractionResultsSummary\n interaction={props.interaction}\n interactive={props.interactive}\n interactiveMetadata={props.interactiveMetadata}\n results={props.results}\n />\n }\n rootClose\n >\n <div\n className={\n `text-center h-100\n d-flex align-items-center justify-content-center\n ${styles.interactionHeaderCellInner}`\n }\n onMouseEnter={props.onMouseEnter}\n onMouseLeave={props.onMouseLeave}\n >\n <div className='p-1 position-relative'>\n {props.interactionNumber}\n </div>\n </div>\n </OverlayTrigger>\n );\n}","import React from 'react';\n\nimport { PendingIndicator } from 'libs/shared/apps/analytics/components/pending-indicator/PendingIndicator';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { Interaction, StudentResults } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { getStudentResult } from 'libs/shared/utils/InteractiveHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './student-results-table.scss';\n\nfunction getSvgName(correctness: InteractionCorrectness): string {\n if (correctness === InteractionCorrectness.Correct)\n return cvSvgLibrary.Check;\n\n if (correctness === InteractionCorrectness.Incorrect)\n return cvSvgLibrary.Close;\n\n if (correctness === InteractionCorrectness.UnAnswered)\n return cvSvgLibrary.Minus;\n\n return;\n}\n\nfunction getClassName(correctness: InteractionCorrectness): string {\n let className = `${styles.resultsCellInner} h-100 position-relative`;\n\n if (correctness === InteractionCorrectness.Correct)\n className += ` ${styles.correct}`;\n\n if (correctness === InteractionCorrectness.Incorrect)\n className += ` ${styles.incorrect} text-danger`;\n\n if (correctness === InteractionCorrectness.AwaitingMarking)\n className += ` ${styles.awaitingMarking}`;\n\n if (correctness === InteractionCorrectness.UnAnswered)\n className += ` ${styles.unanswered} text-warning`;\n\n return className;\n}\n\ninterface StudentResultCellProps {\n interaction: Interaction;\n studentResults: StudentResults;\n}\n\nexport function StudentResultCell(props: StudentResultCellProps): JSX.Element {\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(\n props.interaction,\n getStudentResult(props.studentResults)\n );\n\n const svgName = getSvgName(correctness);\n\n return (\n <div className={getClassName(correctness)}>\n {!!svgName && <SvgContainer svgName={svgName} />}\n {correctness === InteractionCorrectness.AwaitingMarking &&\n <PendingIndicator />\n }\n </div>\n );\n}","import React from 'react';\nimport { CellProps, Column, ColumnInstance, SortingRule } from 'react-table';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { PendingIndicator } from 'libs/shared/apps/analytics/components/pending-indicator/PendingIndicator';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { anonymiseUserName } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { getStudentResultsSummary } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { PercentageIndicator, PercentageIndicatorLayout } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { getInteractions } from 'libs/shared/utils/InteractiveHelper';\n\nimport { InteractionHeaderCell } from './InteractionHeaderCell';\nimport { StudentResultCell } from './StudentResultCell';\n\nimport styles from './student-results-table.scss';\n\nconst namespace = 'shared.studentResultsTable';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const RESULTS_COL_WIDTH = 60;\n\ninterface CellWrapperProps {\n className?: string;\n}\n\nfunction CellWrapper(props: React.PropsWithChildren<CellWrapperProps>): JSX.Element {\n return (\n <div className={`d-flex align-items-center p-2 h-100 ${props.className ?? ''}`}>\n {props.children}\n </div>\n );\n}\n\ninterface HeaderCellProps {\n column: ColumnInstance<StudentResultsWithSummary>;\n phraseKey: string;\n}\n\nfunction HeaderCell(props: HeaderCellProps): JSX.Element {\n return (\n <CellWrapper className={props.column.isSorted && 'fw-bold'}>\n {getPhrase(props.phraseKey)}\n </CellWrapper>\n );\n}\n\nexport function useGetFixedColumns(\n results: InteractiveResultSet,\n anonymiseUsers: boolean\n): Column<StudentResultsWithSummary>[] {\n const hasResults = !!results.students?.length;\n\n return React.useMemo(() => {\n const cols: Column<StudentResultsWithSummary>[] = [\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='name' />,\n accessor: 'user',\n Cell: ({ value }) => (\n <CellWrapper>\n <span className='text-truncate'>{anonymiseUserName(value, anonymiseUsers)}</span>\n </CellWrapper>\n ),\n disableSortBy: !hasResults\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='unanswered' />,\n accessor: 'summary.unanswered' as keyof StudentResultsWithSummary,\n sortType: 'basic', // Default is 'alphanumeric' which would treat the numbers as strings\n sortDescFirst: true,\n disableSortBy: !hasResults,\n Cell: ({ value }: CellProps<StudentResultsWithSummary, any>) => <CellWrapper>{value}</CellWrapper>\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='score' />,\n accessor: 'summary',\n id: 'score',\n Cell: ({ value }) => {\n if (value.awaitingMarking) {\n return (\n <CellWrapper>\n <PendingIndicator\n title={getPhrase('markingRequired')}\n className='flex-grow-1'\n showLabel\n />\n </CellWrapper>\n );\n }\n\n return (\n <CellWrapper>\n {`${value.correct}/${value.answered + value.unanswered}`}\n </CellWrapper>\n );\n },\n width: 125,\n sortDescFirst: true,\n disableSortBy: !hasResults\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='percentage' />,\n accessor: 'summary',\n id: 'percentage',\n Cell: ({ value }) => {\n if (value.awaitingMarking) {\n return (\n <CellWrapper>\n <PendingIndicator\n title={getPhrase('markingRequired')}\n className='flex-grow-1'\n showLabel\n />\n </CellWrapper>\n );\n }\n\n return (\n <CellWrapper>\n <PercentageIndicator\n percentage={value.percentCorrect}\n layout={PercentageIndicatorLayout.LabelBefore}\n className='flex-grow-1'\n />\n </CellWrapper>\n );\n },\n width: 125,\n sortDescFirst: true,\n disableSortBy: !hasResults\n }\n ];\n\n return cols;\n }, [ anonymiseUsers, hasResults ]);\n}\n\n/**\n * Returns memoized table columns. To trigger a recalculation, toggle the value of `refreshData`.\n */\nexport function useGetResultColumns(\n interactive: Interactive,\n interactiveMetadata: InteractiveMetadata,\n results: InteractiveResultSet,\n onColumnHover: (index?: number) => void,\n refreshData: boolean\n): Column<StudentResultsWithSummary>[] {\n return React.useMemo(() => {\n const interactions = getInteractions(interactive);\n\n return interactions.map((interaction, index) => {\n const col: Column<StudentResultsWithSummary> = {\n Header: () => {\n return (\n <InteractionHeaderCell\n interaction={interaction}\n results={results}\n interactive={interactive}\n interactiveMetadata={interactiveMetadata}\n interactionNumber={index + 1}\n onMouseEnter={() => onColumnHover(index)}\n onMouseLeave={() => onColumnHover(null)}\n />\n );\n },\n accessor: 'results',\n /**\n * `onSelectStudentResponse` in `StudentResultsTable` expects the column id to the interaction id\n */\n id: interaction.id,\n disableSortBy: true,\n width: RESULTS_COL_WIDTH,\n Cell: ({ row: { original: studentResults } }) => (\n <StudentResultCell interaction={interaction} studentResults={studentResults} />\n )\n };\n return col;\n });\n }, [refreshData]);\n}\n\n/**\n * Returns memoized table data. To trigger a recalculation, toggle the value of `refreshData`.\n */\nexport function useGetResultsTableData(\n interactive: Interactive,\n results: InteractiveResultSet,\n refreshData: boolean,\n anonymiseUsers: boolean,\n sortBy?: SortingRule<StudentResultsWithSummary>\n): StudentResultsWithSummary[] {\n return React.useMemo(() => {\n const students: StudentResultsWithSummary[] = [];\n\n results.students.forEach(s => {\n students.push(({ ...s, summary: getStudentResultsSummary(interactive, s) }));\n });\n\n if (sortBy?.id === 'user') {\n const sorted = ArrayHelper.sortBy(students, student => anonymiseUserName(student.user, anonymiseUsers));\n\n return sortBy.desc ? sorted.reverse() : sorted;\n }\n\n if (sortBy?.id === 'summary.unanswered') {\n const sorted = ArrayHelper.sortBy(students, student => student.summary.unanswered);\n\n return sortBy.desc ? sorted.reverse() : sorted;\n }\n\n if (sortBy?.id === 'score' || sortBy?.id === 'percentage') {\n const sorted = ArrayHelper.sortBy(students, student => {\n if (student.summary.awaitingMarking)\n return -1;\n\n return student.summary.percentCorrect;\n });\n\n return sortBy.desc ? sorted.reverse() : sorted;\n }\n\n return students;\n }, [ refreshData, sortBy, anonymiseUsers ]);\n}\n\nexport function highlightColumns(tableEl: HTMLElement, highlightIndex?: number): void {\n if (!tableEl)\n return;\n\n const rows = tableEl.querySelectorAll(`.${styles.resultsRow}`);\n\n rows?.forEach(row => {\n row.childNodes.forEach((col: HTMLElement, colIdx: number) => {\n col.classList.remove(styles.highlightColumn);\n\n if (colIdx === highlightIndex)\n col.classList.add(styles.highlightColumn);\n });\n });\n}\n\nexport function highlightRows(tableEl: HTMLElement, highlightIndex?: number): void {\n if (!tableEl)\n return;\n\n const rows = tableEl.querySelectorAll(`.${styles.resultsRow}`);\n\n rows?.forEach((row, rowIdx) => {\n row.classList.remove(styles.highlightResultsRow);\n\n if (rowIdx === highlightIndex)\n row.classList.add(styles.highlightResultsRow);\n });\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: { start: filter.start, end: filter.end },\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 success?: (data: InteractiveResultSet) => void,\n error?: (data: any) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `/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: '{gateway}/v2/analytics/interactives/report',\n key: 'interactive:results:report',\n data,\n type: HttpVerbs.POST,\n normalize: false\n };\n }\n};","import { Flight } from 'libs/common/flight';\n\nimport { InteractiveResultsRequests } from 'libs/shared/apps/analytics/flight-requests/InteractiveResultsRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { AnalyticsRequestFilter, CurrentUser, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\n\nexport function useFetchInteractiveResults(\n interactiveMetadataId: string,\n requestFilter: AnalyticsRequestFilter\n): Flight.Response<InteractiveResultSet> {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(!!interactiveMetadataId &&\n InteractiveRequests.interactiveMetadata(interactiveMetadataId));\n\n const interactive = Flight.useBasicFetch<Interactive>(!!interactiveMetadata.data?.interactiveId &&\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId));\n\n const shouldFetchResults = !!currentUser.data && !!interactive.data && (!!requestFilter);\n\n return Flight.useBasicFetch<InteractiveResultSet>(shouldFetchResults &&\n InteractiveResultsRequests.interactiveResultSet(\n interactiveMetadata.data.interactiveId,\n interactiveMetadata.data.id,\n currentUser.data,\n requestFilter\n ));\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 } 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(interactive: Interactive, results: InteractiveResultSet): StudentGroups {\n const groups: StudentGroups = {\n markingRequired: [],\n lowScore: [],\n highScore: [],\n completed: [],\n notCompleted: []\n };\n\n const interactions = getInteractions(interactive);\n\n const numInteractions = interactions.length;\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 if (ArrayHelper.last(s.results).attempts.length === numInteractions) {\n groups.completed.push(withSummary);\n } else {\n groups.notCompleted.push(withSummary);\n return;\n }\n \n if (withSummary.summary.percentCorrect >= ScoreThresholdDefaults.HIGH)\n groups.highScore.push(withSummary);\n \n if (withSummary.summary.percentCorrect < 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).reverse();\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: result.attempts.length,\n attempts: studentResults.results.length,\n unanswered: numInteractions - answeredInteractions,\n percentCorrect,\n correct: numCorrect,\n awaitingMarking\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 { 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 { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport {\n Interaction,\n InteractionTypeId,\n Interactive,\n InteractiveResult,\n StudentAttempt,\n StudentResults\n} from 'libs/shared/interfaces';\n\nfunction interactionRequiresAnswer(interaction: Interaction): boolean {\n return interaction.typeId !== InteractionTypeId.Annotation && interaction.typeId !== InteractionTypeId.Image;\n}\n\nexport function flattenInteractions(interactive: Interactive): Interaction[] {\n return ArrayHelper.flatten(interactive.timepoints.map(i => i.interactions));\n}\n\n/**\n * Centralised logic for using the most recent student result.\n */\nexport function getStudentResult(studentResults: StudentResults): InteractiveResult {\n return ArrayHelper.last(studentResults.results);\n}\n\nexport function getStudentAttempt(interactionId: string, result: InteractiveResult): StudentAttempt {\n return ArrayHelper.findWhere(result?.attempts, { id: interactionId });\n}\n\n/**\n * Returns a flat list of interactions on an interactive and filters out\n * those that don't require an answer (annotations and images).\n */\nexport function getInteractions(interactive: Interactive): Interaction [] {\n return flattenInteractions(interactive).filter(interactionRequiresAnswer);\n}","// extracted by mini-css-extract-plugin\nexport default {\"header\":\"hnMke\",\"row\":\"ILLa_\",\"fixedTable\":\"_fdpt\",\"interactionHeaderCellOuter\":\"kjXYB\",\"hasResults\":\"M4qgr\",\"interactionHeaderCellInner\":\"cnFvB\",\"resultsCellOuter\":\"bdzRb\",\"correct\":\"xANR6\",\"incorrect\":\"_44sb\",\"awaitingMarking\":\"eQ9sh\",\"unanswered\":\"xRUK8\",\"highlightColumn\":\"f9Zqr\",\"resultsCellInner\":\"LAFwi\",\"highlightResultsRow\":\"TwwLO\",\"resultsRow\":\"xZ5iP\"};"],"names":["getPhrase","getClassName","props","className","showLabel","PendingIndicator","Indicator","title","spanHack","spanHackClassName","tooltipClassName","InteractionsBar","duration","interactive","timepoints","map","t","i","interactions","length","timepoint","selectedInteraction","interaction","find","id","isSelected","bgClassName","InteractionTypeHelper","typeId","left","visibleAt","key","style","DurationHelper","LanguageService","InteractionResultsSummary","interactiveMetadata","summary","results","InteractionLabel","iconClassName","_parentClip","endTime","startTime","_parentVideo","awaitingMarking","PercentageIndicator","percentage","percentCorrect","layout","unanswered","InteractionResultsSummaryPopover","ref","popoverProps","Popover","InteractionHeaderCell","OverlayTrigger","trigger","students","placement","overlay","rootClose","onMouseEnter","onMouseLeave","interactionNumber","correctness","InteractionCorrectness","StudentResultCell","InteractiveCorrectnessHelper","studentResults","svgName","getSvgName","SvgContainer","RESULTS_COL_WIDTH","CellWrapper","children","HeaderCell","column","isSorted","phraseKey","useGetFixedColumns","anonymiseUsers","hasResults","Header","accessor","Cell","value","disableSortBy","sortType","sortDescFirst","correct","answered","width","useGetResultColumns","onColumnHover","refreshData","index","row","original","useGetResultsTableData","sortBy","forEach","s","push","sorted","ArrayHelper","student","user","desc","reverse","highlightColumns","tableEl","highlightIndex","rows","querySelectorAll","childNodes","col","colIdx","classList","remove","add","highlightRows","rowIdx","getInteractiveResultFilters","currentUser","filter","currentUserId","currentCustomerId","customerId","dateRange","start","end","userIds","userId","classroomsAndGroups","groupId","InteractiveResultsRequests","interactiveResultSet","interactiveId","interactiveMetadataId","success","error","always","url","data","type","normalize","mark","answerId","resultId","invalidationKeys","pendingReviews","interactiveResultsReport","useFetchInteractiveResults","requestFilter","shouldFetchResults","I","groupStudents","groups","markingRequired","lowScore","highScore","completed","notCompleted","numInteractions","withSummary","getStudentResultsSummary","attempts","sortedLowScore","sortedHighScore","getInteractionById","interactionId","toString","getMarkedAnswerId","answer","questionId","getMarkedStatus","markedAnswers","result","studentResponse","answers","every","a","status","getInteractionResultsSummary","numStudents","numCorrect","interactionIds","Set","answeredInteractions","has","InteractiveAnswerStatus","notApplicable","isMissingWordCorrect","getStudentAnswer","items","actionableItems","isCorrect","name","trim","toLowerCase","isMultipleChoiceCorrect","studentAnswer","getGetStudentAnswer","attempt","wrapIsMultipleChoiceCorrect","text","wrapIsMarkableAnswerMarkedCorrect","item","isMarkableAnswerMarkedCorrect","IsCorrectLookup","isInteractionCorrect","isCorrectFn","interactionRequiresAnswer","flattenInteractions","getStudentResult","getStudentAttempt","getInteractions"],"sourceRoot":""}
|