@clickview/lite 0.70.1-dev.5 → 0.70.1-dev.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/dist/bundles.json +1 -1
  2. package/dist/css/{9583-lite-9eda71423d.chunk.css → 3878-lite-877e596a24.chunk.css} +3 -0
  3. package/dist/css/{5797-lite-1dfd2c337d.chunk.css → 5099-lite-7d7c063e62.chunk.css} +3 -0
  4. package/dist/css/{8191-lite-ee877f2ecd.chunk.css → 6984-lite-53c3fa4d18.chunk.css} +3 -0
  5. package/dist/css/{8723-lite-676baa8218.chunk.css → 7103-lite-ee0c975440.chunk.css} +3 -0
  6. package/dist/css/{7783-lite-1dfd2c337d.chunk.css → 7394-lite-7d7c063e62.chunk.css} +3 -0
  7. package/dist/css/7502-lite-9b2ed5bd56.chunk.css +4 -0
  8. package/dist/css/{5721-lite-9eda71423d.chunk.css → 7548-lite-877e596a24.chunk.css} +3 -0
  9. package/dist/css/{549-lite-b49bde8e4d.chunk.css → 7657-lite-ad909396f3.chunk.css} +3 -1
  10. package/dist/css/{6783-lite-e85973335b.chunk.css → 829-lite-27b58d07b3.chunk.css} +3 -0
  11. package/dist/css/{5635-lite-ee877f2ecd.chunk.css → 9673-lite-53c3fa4d18.chunk.css} +3 -0
  12. package/dist/scripts/1107-0fb4769540-lite.chunk.js +2 -0
  13. package/dist/scripts/1107-0fb4769540-lite.chunk.js.map +1 -0
  14. package/dist/scripts/1437-658ad1fe2b-lite.chunk.js +2 -0
  15. package/dist/scripts/1437-658ad1fe2b-lite.chunk.js.map +1 -0
  16. package/dist/scripts/1710-ef798f1e0d-lite.chunk.js +2 -0
  17. package/dist/scripts/1710-ef798f1e0d-lite.chunk.js.map +1 -0
  18. package/dist/scripts/2024-4fec8f175b-lite.chunk.js +2 -0
  19. package/dist/scripts/2024-4fec8f175b-lite.chunk.js.map +1 -0
  20. package/dist/scripts/2435-a846651e83-lite.chunk.js +2 -0
  21. package/dist/scripts/2435-a846651e83-lite.chunk.js.map +1 -0
  22. package/dist/scripts/2809-84ce060e14-lite.chunk.js +2 -0
  23. package/dist/scripts/2809-84ce060e14-lite.chunk.js.map +1 -0
  24. package/dist/scripts/3878-45fd0861cc-lite.chunk.js +2 -0
  25. package/dist/scripts/3878-45fd0861cc-lite.chunk.js.map +1 -0
  26. package/dist/scripts/4096-c834372efb-lite.chunk.js +2 -0
  27. package/dist/scripts/4096-c834372efb-lite.chunk.js.map +1 -0
  28. package/dist/scripts/4456-ada4977b41-lite.chunk.js +2 -0
  29. package/dist/scripts/4456-ada4977b41-lite.chunk.js.map +1 -0
  30. package/dist/scripts/4806-a05a2a3012-lite.chunk.js +2 -0
  31. package/dist/scripts/4806-a05a2a3012-lite.chunk.js.map +1 -0
  32. package/dist/scripts/5099-297f8cd028-lite.chunk.js +2 -0
  33. package/dist/scripts/5099-297f8cd028-lite.chunk.js.map +1 -0
  34. package/dist/scripts/5829-903613bbf0-lite.chunk.js +3 -0
  35. package/dist/scripts/5829-903613bbf0-lite.chunk.js.map +1 -0
  36. package/dist/scripts/5925-937fec8a93-lite.chunk.js +2 -0
  37. package/dist/scripts/5925-937fec8a93-lite.chunk.js.map +1 -0
  38. package/dist/scripts/6459-ac139cb154-lite.chunk.js +2 -0
  39. package/dist/scripts/6459-ac139cb154-lite.chunk.js.map +1 -0
  40. package/dist/scripts/6629-4edaed39c8-lite.chunk.js +3 -0
  41. package/dist/scripts/6629-4edaed39c8-lite.chunk.js.map +1 -0
  42. package/dist/scripts/6984-9d8b378bcc-lite.chunk.js +2 -0
  43. package/dist/scripts/6984-9d8b378bcc-lite.chunk.js.map +1 -0
  44. package/dist/scripts/7103-ef79582538-lite.chunk.js +2 -0
  45. package/dist/scripts/7103-ef79582538-lite.chunk.js.map +1 -0
  46. package/dist/scripts/7394-5448807e14-lite.chunk.js +2 -0
  47. package/dist/scripts/7394-5448807e14-lite.chunk.js.map +1 -0
  48. package/dist/scripts/7502-78b085caad-lite.chunk.js +2 -0
  49. package/dist/scripts/7502-78b085caad-lite.chunk.js.map +1 -0
  50. package/dist/scripts/7548-5eb0d3b7a0-lite.chunk.js +2 -0
  51. package/dist/scripts/7548-5eb0d3b7a0-lite.chunk.js.map +1 -0
  52. package/dist/scripts/7593-cc4e09c847-lite.chunk.js +2 -0
  53. package/dist/scripts/7593-cc4e09c847-lite.chunk.js.map +1 -0
  54. package/dist/scripts/7657-e302fda4f2-lite.chunk.js +2 -0
  55. package/dist/scripts/7657-e302fda4f2-lite.chunk.js.map +1 -0
  56. package/dist/scripts/8057-431c6be34c-lite.chunk.js +2 -0
  57. package/dist/scripts/8057-431c6be34c-lite.chunk.js.map +1 -0
  58. package/dist/scripts/8224-b9b5d3b1a5-lite.chunk.js +2 -0
  59. package/dist/scripts/8224-b9b5d3b1a5-lite.chunk.js.map +1 -0
  60. package/dist/scripts/829-aff9937989-lite.chunk.js +3 -0
  61. package/dist/scripts/829-aff9937989-lite.chunk.js.map +1 -0
  62. package/dist/scripts/{9250-ec244ab17a-lite.chunk.js → 8723-708f2373d6-lite.chunk.js} +3 -3
  63. package/dist/scripts/{9250-ec244ab17a-lite.chunk.js.map → 8723-708f2373d6-lite.chunk.js.map} +1 -1
  64. package/dist/scripts/8960-c159492ba3-lite.chunk.js +2 -0
  65. package/dist/scripts/8960-c159492ba3-lite.chunk.js.map +1 -0
  66. package/dist/scripts/9673-8a2740611a-lite.chunk.js +2 -0
  67. package/dist/scripts/9673-8a2740611a-lite.chunk.js.map +1 -0
  68. package/dist/scripts/9882-f1a9cc55ec-lite.chunk.js +2 -0
  69. package/dist/scripts/9882-f1a9cc55ec-lite.chunk.js.map +1 -0
  70. package/dist/scripts/{bundle-d2cf17c78d.min.js → bundle-5a89651ec2.min.js} +3 -3
  71. package/dist/scripts/{bundle-d2cf17c78d.min.js.map → bundle-5a89651ec2.min.js.map} +1 -1
  72. package/package.json +1 -1
  73. package/dist/css/7428-lite-e2d7497beb.chunk.css +0 -8
  74. package/dist/scripts/1565-ba78a2a25c-lite.chunk.js +0 -2
  75. package/dist/scripts/1565-ba78a2a25c-lite.chunk.js.map +0 -1
  76. package/dist/scripts/2024-abf6cf1842-lite.chunk.js +0 -2
  77. package/dist/scripts/2024-abf6cf1842-lite.chunk.js.map +0 -1
  78. package/dist/scripts/2072-50b656cb3b-lite.chunk.js +0 -2
  79. package/dist/scripts/2072-50b656cb3b-lite.chunk.js.map +0 -1
  80. package/dist/scripts/2574-02faf4a2d2-lite.chunk.js +0 -2
  81. package/dist/scripts/2574-02faf4a2d2-lite.chunk.js.map +0 -1
  82. package/dist/scripts/396-2ffc09cc70-lite.chunk.js +0 -2
  83. package/dist/scripts/396-2ffc09cc70-lite.chunk.js.map +0 -1
  84. package/dist/scripts/4377-001a8ee263-lite.chunk.js +0 -2
  85. package/dist/scripts/4377-001a8ee263-lite.chunk.js.map +0 -1
  86. package/dist/scripts/4806-c2dce3650d-lite.chunk.js +0 -2
  87. package/dist/scripts/4806-c2dce3650d-lite.chunk.js.map +0 -1
  88. package/dist/scripts/4948-30af9a446d-lite.chunk.js +0 -2
  89. package/dist/scripts/4948-30af9a446d-lite.chunk.js.map +0 -1
  90. package/dist/scripts/549-2d591052e3-lite.chunk.js +0 -2
  91. package/dist/scripts/549-2d591052e3-lite.chunk.js.map +0 -1
  92. package/dist/scripts/5635-6e2559f04d-lite.chunk.js +0 -2
  93. package/dist/scripts/5635-6e2559f04d-lite.chunk.js.map +0 -1
  94. package/dist/scripts/5679-80c1d8434e-lite.chunk.js +0 -2
  95. package/dist/scripts/5679-80c1d8434e-lite.chunk.js.map +0 -1
  96. package/dist/scripts/5721-2141ed4fb6-lite.chunk.js +0 -2
  97. package/dist/scripts/5721-2141ed4fb6-lite.chunk.js.map +0 -1
  98. package/dist/scripts/5797-f84ce545b9-lite.chunk.js +0 -2
  99. package/dist/scripts/5797-f84ce545b9-lite.chunk.js.map +0 -1
  100. package/dist/scripts/581-fe733617bd-lite.chunk.js +0 -2
  101. package/dist/scripts/581-fe733617bd-lite.chunk.js.map +0 -1
  102. package/dist/scripts/5829-689f5be5d1-lite.chunk.js +0 -3
  103. package/dist/scripts/5829-689f5be5d1-lite.chunk.js.map +0 -1
  104. package/dist/scripts/6046-5652117548-lite.chunk.js +0 -2
  105. package/dist/scripts/6046-5652117548-lite.chunk.js.map +0 -1
  106. package/dist/scripts/6629-910e316a83-lite.chunk.js +0 -3
  107. package/dist/scripts/6629-910e316a83-lite.chunk.js.map +0 -1
  108. package/dist/scripts/6783-7efd15103a-lite.chunk.js +0 -3
  109. package/dist/scripts/6783-7efd15103a-lite.chunk.js.map +0 -1
  110. package/dist/scripts/7064-f5e8bc71bc-lite.chunk.js +0 -2
  111. package/dist/scripts/7064-f5e8bc71bc-lite.chunk.js.map +0 -1
  112. package/dist/scripts/7428-546d62999f-lite.chunk.js +0 -2
  113. package/dist/scripts/7428-546d62999f-lite.chunk.js.map +0 -1
  114. package/dist/scripts/7482-9016f79093-lite.chunk.js +0 -2
  115. package/dist/scripts/7482-9016f79093-lite.chunk.js.map +0 -1
  116. package/dist/scripts/7757-9b72774917-lite.chunk.js +0 -2
  117. package/dist/scripts/7757-9b72774917-lite.chunk.js.map +0 -1
  118. package/dist/scripts/7783-18da4064c0-lite.chunk.js +0 -2
  119. package/dist/scripts/7783-18da4064c0-lite.chunk.js.map +0 -1
  120. package/dist/scripts/8191-ff27deee6c-lite.chunk.js +0 -2
  121. package/dist/scripts/8191-ff27deee6c-lite.chunk.js.map +0 -1
  122. package/dist/scripts/8672-094d54cbbd-lite.chunk.js +0 -2
  123. package/dist/scripts/8672-094d54cbbd-lite.chunk.js.map +0 -1
  124. package/dist/scripts/8723-c3aaa1643a-lite.chunk.js +0 -2
  125. package/dist/scripts/8723-c3aaa1643a-lite.chunk.js.map +0 -1
  126. package/dist/scripts/9583-3b2623e754-lite.chunk.js +0 -2
  127. package/dist/scripts/9583-3b2623e754-lite.chunk.js.map +0 -1
  128. /package/dist/css/{4377-lite-856c02f000.chunk.css → 1107-lite-856c02f000.chunk.css} +0 -0
  129. /package/dist/css/{581-lite-a1cdc302ab.chunk.css → 1437-lite-a1cdc302ab.chunk.css} +0 -0
  130. /package/dist/css/{7757-lite-856c02f000.chunk.css → 4456-lite-856c02f000.chunk.css} +0 -0
  131. /package/dist/css/{9250-lite-37216d4207.chunk.css → 8723-lite-37216d4207.chunk.css} +0 -0
  132. /package/dist/scripts/{5829-689f5be5d1-lite.chunk.js.LICENSE.txt → 5829-903613bbf0-lite.chunk.js.LICENSE.txt} +0 -0
  133. /package/dist/scripts/{6629-910e316a83-lite.chunk.js.LICENSE.txt → 6629-4edaed39c8-lite.chunk.js.LICENSE.txt} +0 -0
  134. /package/dist/scripts/{6783-7efd15103a-lite.chunk.js.LICENSE.txt → 829-aff9937989-lite.chunk.js.LICENSE.txt} +0 -0
  135. /package/dist/scripts/{9250-ec244ab17a-lite.chunk.js.LICENSE.txt → 8723-708f2373d6-lite.chunk.js.LICENSE.txt} +0 -0
  136. /package/dist/scripts/{bundle-d2cf17c78d.min.js.LICENSE.txt → bundle-5a89651ec2.min.js.LICENSE.txt} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/4096-c834372efb-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/share/components/shared-to-avatar-list/shared-to-avatar-list.scss","file:///app/packages/libs/shared/src/apps/share/components/shared-to-avatar-list/SharedToAvatarList.tsx","file:///app/packages/libs/shared/src/apps/share/utils/ShareLinkHelper.ts","file:///app/packages/libs/shared/src/components/avatar-list/AvatarList.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/utils/GroupHelper.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/insights/average-attempts/insight-average-attempts.scss","file:///app/packages/libs/shared/src/apps/analytics/components/insights/average-attempts/InsightAverageAttempts.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/average-score/insight-average-score.scss","file:///app/packages/libs/shared/src/apps/analytics/components/insights/average-score/InsightAverageScore.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/completed-students/InsightCompletedStudents.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/easiest-question/InsightEasiestQuestion.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/hardest-question/InsightHardestQuestion.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/high-scoring-students/InsightHighScoringStudents.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/low-scoring-students/InsightLowScoringStudents.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/marking-required/InsightMarkingRequired.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/not-completed-students/InsightNotCompletedStudents.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/insights-mask/InsightsMarkingRequiredMask.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/interactive-insights-overview/partial-loading/partial-interactive-insights-overview.scss","file:///app/packages/projects/lite/src/apps/my-shares/components/interactive-insights-overview/partial-loading/PartialInteractiveInsightsOverview.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/interactive-insights-overview/InteractiveInsightsOverview.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/shared-to-pill/SharedToPill.tsx","file:///app/node_modules/timeago.js/esm/lang/en_US.js","file:///app/node_modules/timeago.js/esm/lang/zh_CN.js","file:///app/node_modules/timeago.js/esm/register.js","file:///app/node_modules/timeago.js/esm/utils/date.js","file:///app/node_modules/timeago.js/esm/format.js","file:///app/node_modules/timeago.js/esm/index.js"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"avatarContainer\":\"ByxQa\",\"sm\":\"EgJ0v\",\"sharedAvatar\":\"cW0NT\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { AvatarItemProps, AvatarList } from 'libs/shared/components/avatar-list/AvatarList';\nimport { IconCircle } from 'libs/shared/components/icon-circle/IconCircle';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { BaseObject, Classroom, ClassroomGroup, User } from 'libs/shared/interfaces';\nimport { mapColourToBsVariant } from 'libs/shared/utils/GroupHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from './shared-to-avatar-list.scss';\n\nconst namespace = 'reportsShare.sharedToAvatarList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getHiddenRecipientText(hiddenRecipients: BaseObject[]): string {\n const counts = ArrayHelper.countBy(hiddenRecipients, 'typeId');\n const userCount = counts[MasterType.User];\n const classroomCount = counts[MasterType.Classroom];\n const groupCount = counts[MasterType.ClassroomGroup];\n\n if (userCount && classroomCount && groupCount)\n return getPhrase('classroomsGroupsAndUsers', { userCount, classroomCount, groupCount });\n\n if (userCount && classroomCount)\n return getPhrase('classroomsAndUsers', { userCount, classroomCount });\n\n if (userCount && groupCount)\n return getPhrase('groupsAndUsers', { userCount, groupCount });\n\n if (classroomCount && groupCount)\n return getPhrase('classroomsAndGroups', { classroomCount, groupCount });\n\n if (userCount)\n return getPhrase('users', { userCount });\n\n if (classroomCount)\n return getPhrase('classrooms', { classroomCount });\n\n if (groupCount)\n return getPhrase('groups', { groupCount });\n}\n\nfunction SharedToAvatar(props: AvatarItemProps): JSX.Element {\n const user: User = props.item?.typeId === MasterType.User && props.item as User;\n const classroom: Classroom = props.item?.typeId === MasterType.Classroom && props.item as Classroom;\n const classroomGroup: ClassroomGroup = props.item?.typeId === MasterType.ClassroomGroup\n && props.item as ClassroomGroup;\n\n const svgContainerClassName = 'd-flex justify-content-center align-items-center text-white rounded-circle h-100 w-100';\n\n return (\n <>\n {!!user &&\n <Tooltip title={`${user.name} ${user.surname}`} spanHack spanHackClassName='h-100 w-100'>\n <Avatar\n imageUrl={user.avatar?.url}\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(user.name, user.surname)}\n extraClasses={styles.sharedAvatar}\n />\n </Tooltip>\n }\n {!!classroom &&\n <Tooltip title={classroom.name} spanHack spanHackClassName='h-100 w-100'>\n <div className={svgContainerClassName}>\n <IconCircle\n svgName={cvSvgLibrary.Classrooms}\n svgSize={SvgContainerSize.Large}\n variant='teal'\n />\n </div>\n </Tooltip>\n }\n {!!classroomGroup &&\n <Tooltip title={classroomGroup.name} spanHack spanHackClassName='h-100 w-100'>\n <div className={svgContainerClassName}>\n <IconCircle\n svgName={cvSvgLibrary.Group}\n variant={mapColourToBsVariant(classroomGroup.metadata?.colour)}\n />\n </div>\n </Tooltip>\n }\n </>\n );\n}\n\n\ninterface AnonymousSharedToAvatarProps {\n avatarSize?: 'md' | 'sm';\n}\n\nexport function AnonymousSharedToAvatar(props: AnonymousSharedToAvatarProps): JSX.Element {\n return (\n <div className={`${styles.avatarContainer} ${props.avatarSize === 'sm' ? styles.sm : ''}`}>\n <Tooltip\n title={getPhrase('anonymous')}\n spanHack\n spanHackClassName='bg-light text-dark d-flex justify-content-center align-items-center rounded-circle h-100 w-100'\n >\n <SvgContainer svgName={cvSvgLibrary.Anonymous} size={props.avatarSize === 'sm' ? SvgContainerSize.Small : null} />\n </Tooltip>\n </div>\n );\n}\n\ninterface SharedLinkAvatarProps {\n text?: string;\n avatarSize?: 'md' | 'sm';\n className?: string;\n}\n\nexport function SharedLinkAvatar(props: SharedLinkAvatarProps): JSX.Element {\n return (\n <div className={`${styles.avatarContainer} ${props.avatarSize === 'sm' ? styles.sm : ''}`}>\n <Tooltip\n title={props.text || getPhrase('sharedLink')}\n spanHack\n spanHackClassName={`bg-light text-dark d-flex justify-content-center align-items-center rounded-circle h-100 w-100 ${props.className || ''}`}\n >\n <SvgContainer svgName={cvSvgLibrary.Link} size={props.avatarSize === 'sm' ? SvgContainerSize.Small : null} />\n </Tooltip>\n </div>\n );\n}\n\ninterface SharedToAvatarListProps {\n recipients: BaseObject[];\n imageCdnUrl: string;\n maxAvatars?: number;\n hasShareLink?: boolean;\n avatarSize?: 'md' | 'sm';\n shareLinkText?: string;\n}\n\nSharedToAvatarList.defaultProps = {\n maxAvatars: 5\n};\n\nexport function SharedToAvatarList(props: SharedToAvatarListProps): JSX.Element {\n return (\n <AvatarList\n {...props}\n items={props.recipients}\n avatarItem={SharedToAvatar}\n avatarContainerClassname={`${styles.avatarContainer} ${props.avatarSize === 'sm' ? styles.sm : ''}`}\n getHiddenTooltip={getHiddenRecipientText}\n hasShareLink={props.hasShareLink}\n shareLinkText={props.shareLinkText}\n />\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { SharePrivacyResponse } from 'libs/shared/apps/share/interfaces/responses/SharePrivacyResponse';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ShareLinkStatus } from 'libs/shared/enums/ShareLinkStatus';\nimport { BaseObject, YearGroup } from 'libs/shared/interfaces';\nimport { RestrictionHelper } from 'libs/shared/utils/RestrictionHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst namespace = 'share.shareLinkInfo';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface GetIconAndTextOptions {\n linkExpireDate: string;\n isPasswordProtected: boolean;\n privacy: SharePrivacyResponse;\n status: ShareLinkStatus;\n entityTypeId: MasterType;\n hasStudentExp: boolean;\n entity: BaseObject;\n yearGroups: YearGroup[];\n}\n\n\nexport const ShareLinkHelper = {\n getPrivateIconAndText: (options: GetIconAndTextOptions) => {\n const { entityTypeId, privacy, hasStudentExp, entity, yearGroups } = options;\n \n if (entityTypeId === MasterType.Topic || entityTypeId === MasterType.Series)\n return { icon: cvSvgLibrary.VisibleOn, text: getPhrase(hasStudentExp ? 'justMySchoolTeachers' : 'justMySchoolDescription') };\n \n /**\n * This is mainly for typescript, privacy will be an array for playlists\n * but that is handled above\n */\n if (Array.isArray(privacy))\n return;\n \n switch (privacy.privacy) {\n case 'public':\n return { icon: cvSvgLibrary.VisibleOn, text: getPhrase('publicDescription') };\n case 'protected':\n if (privacy.overrideRestrictions)\n return { icon: cvSvgLibrary.VisibleOn, text: getPhrase('clickViewOnly') };\n return {\n icon: cvSvgLibrary.Lock,\n text: ShareLinkHelper.getRespectRatingText(entity, yearGroups, hasStudentExp)\n };\n case 'just_my_customer':\n if (privacy.overrideRestrictions)\n return { icon: cvSvgLibrary.Lock, text: getPhrase(hasStudentExp ? 'justMySchoolTeachers' : 'justMySchoolDescription') };\n return {\n icon: cvSvgLibrary.Lock,\n text: ShareLinkHelper.getRespectRatingText(entity, yearGroups, hasStudentExp)\n };\n /**\n * Because we plan to add restricted management later \n * for the time being we treat is the same as private \n */\n case 'restricted':\n case 'private':\n return { icon: cvSvgLibrary.Lock, text: getPhrase('privateDescription') };\n default:\n return {};\n }\n },\n\n getIconAndText: (options: GetIconAndTextOptions) => {\n const { linkExpireDate, isPasswordProtected, status } = options;\n if (!linkExpireDate && !isPasswordProtected)\n return ShareLinkHelper.getPrivateIconAndText(options);\n \n if (!linkExpireDate)\n return { icon: cvSvgLibrary.Lock, text: getPhrase('password') };\n \n const isToday = DateHelper.isToday(linkExpireDate);\n const dayDifference = DateHelper.diffBetween(linkExpireDate, new Date(), 'day');\n \n if (!isPasswordProtected) {\n let text = isToday\n ? getPhrase('expiryToday')\n : getPhrase('expiry', { days: dayDifference });\n \n if (status === ShareLinkStatus.Expired)\n text = getPhrase('expired');\n \n return { icon: cvSvgLibrary.Timer, text };\n }\n \n let text = isToday\n ? getPhrase('passwordExpiryToday')\n : getPhrase('passwordExpiry', { days: dayDifference });\n \n if (status === ShareLinkStatus.Expired)\n text = getPhrase('passwordExpired');\n \n return { icon: cvSvgLibrary.Lock, text };\n },\n\n getRespectRatingText(video: BaseObject, yearGroups: YearGroup[], hasStudentExp: boolean) {\n if (!video || !yearGroups)\n return null;\n \n if (hasStudentExp)\n return getPhrase('justMySchoolTeachers');\n \n if (!VideoHelper.isVideoType(video))\n return getPhrase('collectionRating');\n \n const restriction = RestrictionHelper.getWeightedRestriction(video._restrictions?.value);\n \n /**\n * Restrictions without a year level are teacher restricitons, which means only admins can see it.\n */\n if (restriction && !restriction.yearGroup)\n return getPhrase('onlyAdmins');\n \n const rating = VideoHelper.getRating(video);\n \n let maxYearGroup: YearGroup;\n let minAllowedYearGroup: YearGroup;\n \n for (const yearGroup of yearGroups) {\n /**\n * If our year level is our new highest so far, save it\n */\n if (!maxYearGroup || yearGroup.value > maxYearGroup.value)\n maxYearGroup = yearGroup;\n \n /**\n * If the restriction is higher than this year level, skip it.\n */\n if (restriction && yearGroup.value <= restriction.yearGroup)\n continue;\n \n /**\n * If therating is higher than this year level's rating value, skip it.\n */\n if (rating && yearGroup.rating.value < rating.value)\n continue;\n \n /**\n * If our year level is the new lowest so far, save it\n */\n if (!minAllowedYearGroup || yearGroup.value < minAllowedYearGroup.value)\n minAllowedYearGroup = yearGroup;\n }\n \n /**\n * If no year levels are allowed, then it's staff only.\n */\n if (!minAllowedYearGroup)\n return getPhrase('onlyStaff');\n \n \n /**\n * If there's only one year level, and it's allowed, then we can just\n * say that everyone in your school can access it.\n */\n if (yearGroups.length === 1)\n return getPhrase('clickViewOnly');\n \n /**\n * We differentiate the copy if it's the highest year level or not. \n * Basically if we need to say \"X and above\" or not.\n */\n if (minAllowedYearGroup.value === maxYearGroup.value)\n return getPhrase('maxYearGroup', { yearGroup: maxYearGroup.name });\n \n return getPhrase('yearGroupRange', { yearGroup: minAllowedYearGroup.name });\n }\n};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SharedLinkAvatar } from 'libs/shared/apps/share/components/shared-to-avatar-list/SharedToAvatarList';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { BaseObject } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.avatarList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface AvatarItemProps {\n imageCdnUrl: string;\n index: number;\n item?: BaseObject;\n hiddenItems?: BaseObject[];\n maxAvatars?: number;\n}\n\ninterface AvatarListProps {\n items: BaseObject[];\n imageCdnUrl: string;\n maxAvatars?: number;\n avatarItem?: (props: AvatarItemProps) => JSX.Element;\n getHiddenTooltip?: (hiddenItems: BaseObject[]) => string;\n numberClassname?: string;\n avatarContainerClassname?: string;\n roleToDisplay?: 'student' | 'staff';\n hasShareLink?: boolean;\n avatarSize?: 'md' | 'sm';\n shareLinkText?: string;\n}\n\nAvatarList.defaultProps = {\n maxAvatars: 5\n};\n\nexport function AvatarList(props: AvatarListProps): JSX.Element {\n const itemsToDisplay = props.items.length > props.maxAvatars\n ? props.items.slice(0, props.maxAvatars - 1)\n : props.items;\n\n const hiddenItems = props.items.length > itemsToDisplay.length\n ? props.items.slice(props.maxAvatars - 1)\n : [];\n\n const AvatarItem = props.avatarItem;\n const hiddenItemsCounts = hiddenItems.length;\n const translateX = props.avatarSize === 'sm' ? 4 : 8;\n\n function getTooltip() {\n if (props.getHiddenTooltip)\n return props.getHiddenTooltip(hiddenItems);\n\n if (props.roleToDisplay)\n return getPhrase(props.roleToDisplay === 'staff' ? 'staff' : 'student', { count: hiddenItemsCounts, smartCount: hiddenItemsCounts });\n\n return getPhrase('users', { count: hiddenItemsCounts, smartCount: hiddenItemsCounts });\n }\n\n function getContainerStyles() {\n return {\n marginRight: `-${((itemsToDisplay.length - 1) + (hiddenItems.length ? 1 : 0) + (props.hasShareLink ? 1 : 0)) * translateX}px`\n };\n }\n\n function getAvatarStyles(idx: number) {\n return {\n transform: `translateX(${(props.hasShareLink ? idx + 1 : idx) * -translateX}px)`,\n zIndex: props.maxAvatars - idx\n };\n }\n\n if (itemsToDisplay.length === 0 && hiddenItems.length === 0)\n return <></>;\n\n return (\n <div\n className='d-flex'\n style={getContainerStyles()}\n >\n {props.hasShareLink && (\n <div style={{ zIndex: props.maxAvatars + 1 }}>\n <SharedLinkAvatar text={props.shareLinkText} avatarSize={props.avatarSize} className='bg-dark text-white' />\n </div>\n )}\n {itemsToDisplay.map((item, idx) => (\n <div\n className={`${props.avatarContainerClassname || ''}`} key={item.id}\n style={getAvatarStyles(idx)}\n >\n <AvatarItem\n item={item}\n imageCdnUrl={props.imageCdnUrl}\n index={idx}\n maxAvatars={props.maxAvatars}\n />\n </div>\n ))}\n\n {!!hiddenItems.length && (\n <div\n className={`${props.avatarContainerClassname || ''} bg-white rounded-circle`}\n style={{ transform: `translateX(${itemsToDisplay.length * -translateX}px)`, zIndex: props.maxAvatars - itemsToDisplay.length }}\n >\n <Tooltip title={getTooltip()} spanHack spanHackClassName='h-100 w-100'>\n <div className={`d-flex justify-content-center align-items-center border border-dark rounded-circle h-100 w-100 ${props.numberClassname || ''}`}>\n {`+${hiddenItems.length}`}\n </div>\n </Tooltip>\n </div>\n )}\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 { 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 { 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 {\"tealChart\":\"lZZf0\",\"grayChart\":\"wJQc4\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightChart } from 'libs/shared/apps/analytics/components/insight-chart/InsightChart';\nimport { CHART_FONT_STYLES } from 'libs/shared/apps/analytics/constants/ChartStyles';\nimport { ChartData } from 'libs/shared/apps/analytics/interfaces/ChartData';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './insight-average-attempts.scss';\n\nconst namespace = 'shared.insightAverageAttempts';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightAverageAttemptsProps {\n students: StudentResultsWithSummary[];\n}\n\nexport function InsightAverageAttempts(props: InsightAverageAttemptsProps) {\n const categoriesData = getCategoriesData();\n const highestAttemptsCount = getHighestAttemptsCount();\n const averageAttempts = getAverageAttempts();\n const chartData = getChartData();\n\n function getCategoriesData() {\n const categoriesData = props.students.reduce((acc, student) => {\n const attemptsCategory = student.summary.attempts.toString();\n\n if (!(attemptsCategory in acc)) {\n Object.assign(acc, { [attemptsCategory]: 0 });\n }\n\n acc[attemptsCategory]++;\n\n return acc;\n }, {} as HashObject);\n return Object.keys(categoriesData).length ? categoriesData : { 0: 0 };\n }\n\n function getHighestAttemptsCount() {\n return Math.max(...Object.keys(categoriesData).map(category => categoriesData[category]));\n }\n\n function getAverageAttempts(): number[] {\n return Object.keys(categoriesData).reduce((acc, category) => {\n const userCount = categoriesData[category];\n return userCount === highestAttemptsCount ? [ ...acc, category ] : acc;\n }, []);\n }\n\n function calculateAverage() {\n const total = Object.entries(categoriesData).reduce(\n (acc, [ attemptsCount, usersCount ]) => {\n acc.totalAttempts += +attemptsCount * usersCount;\n acc.totalUsers += usersCount;\n return acc;\n },\n { totalAttempts: 0, totalUsers: 0 }\n );\n\n return total.totalUsers === 0 ? 0 : Math.round(total.totalAttempts / total.totalUsers * 100) / 100;\n }\n\n function getChartData(): ChartData {\n const noAttempts = categoriesData[0] === 0;\n\n return {\n categories: Object.keys(categoriesData),\n series: [{\n type: 'column',\n color: categoriesData[0] ? '#EAEAEA' : '#40C2BB',\n borderRadius: 4,\n dataLabels: {\n enabled: !noAttempts,\n style: CHART_FONT_STYLES,\n inside: false,\n overflow: 'allow',\n crop: false\n },\n data: Object.keys(categoriesData).map(category => {\n const highestCount = highestAttemptsCount !== 0 && categoriesData[category] === highestAttemptsCount;\n\n return {\n className: `${noAttempts ? styles.grayChart : styles.tealChart} ${categoriesData[category] !== highestAttemptsCount && categoriesData[category] !== 0 ? 'opacity-25' : ''}`,\n borderWidth: highestCount ? 2 : 0,\n borderColor: highestCount ? 'black' : '',\n y: categoriesData[category]\n };\n })\n }]\n };\n }\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Refresh}\n svgClassName='bg-light-purple text-purple'\n >\n <p>\n {averageAttempts.length\n ? <Text namespace={namespace} phrase='averageAttempts' options={{ smartCount: calculateAverage() }} />\n : <Text namespace={namespace} phrase='noAttempts' />\n }\n </p>\n\n <div className='mt-auto'>\n <InsightChart label={getPhrase('attempts')} chartData={chartData} />\n </div>\n </InsightCard>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"redChart\":\"G7zOw\",\"yellowChart\":\"k34mm\",\"greenChart\":\"vBneA\",\"blueChart\":\"RPTWm\",\"grayChart\":\"k4JFZ\",\"borderDark\":\"LWor3\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightChart } from 'libs/shared/apps/analytics/components/insight-chart/InsightChart';\nimport { ChartData } from 'libs/shared/apps/analytics/interfaces/ChartData';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './insight-average-score.scss';\n\nconst namespace = 'shared.insightAverageScore';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\n\ninterface InsightAverageScoreProps {\n students: StudentResultsWithSummary[];\n}\n\nexport function InsightAverageScore(props: InsightAverageScoreProps) {\n function getChartData(): ChartData {\n const scoreCount = Array(11).fill(0);\n const scorePercentageData = props.students.reduce((acc, value) => {\n const scoreIndex = Math.floor(value.summary.percentCorrect * 10);\n acc[scoreIndex]++;\n\n return acc;\n }, scoreCount);\n\n const PERCENTAGES = [ '0', '10', '20', '30', '40', '50', '60', '70', '80', '90', '100' ];\n\n return {\n categories: PERCENTAGES,\n series: [{\n type: 'column',\n color: '#4E9ACE',\n borderRadius: 4,\n data: scorePercentageData.map((score, index) => {\n const percentageCategory = Number(PERCENTAGES[index]);\n\n const getChartColour = (percentage: number, score: number) => {\n if (score === 0)\n return styles.grayChart;\n if (percentage < 50)\n return styles.redChart;\n if (percentage < 70)\n return styles.yellowChart;\n if (percentage < 90)\n return styles.greenChart;\n\n return styles.blueChart;\n };\n\n return {\n className: `${getChartColour(percentageCategory, score)}`,\n y: score\n };\n })\n }]\n };\n }\n\n function getAverageNumbers() {\n const averageScores = props.students.map(student => student.summary.percentCorrect);\n const averagePercentage = averageScores.reduce((a, b) => a + b, 0) / averageScores.length;\n const totalQuestions = ArrayHelper.last(\n ArrayHelper.last(props.students).results\n ).attempts.length;\n\n return {\n averageScore: Math.round(totalQuestions * averagePercentage),\n totalQuestions,\n averagePercentage: (averagePercentage * 100).toFixed(1)\n };\n }\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Analytics}\n svgClassName='bg-light-orange text-orange'\n >\n <p>\n {props.students.length\n ? <Text namespace={namespace} phrase='averageScore' options={getAverageNumbers()} />\n : <Text namespace={namespace} phrase='noAnswers' />\n }\n </p>\n\n <InsightChart label={`${getPhrase('studentScores')} (%)`} chartData={getChartData()} />\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { AnonSessions } from 'libs/shared/apps/analytics/hooks/UseAnonSessions';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { getUserOrAnonSession } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightCompletedStudents';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightCompletedStudentsProps {\n students: StudentResultsWithSummary[];\n imageCdnUrl: string;\n imageUrl: string;\n resultsAppLink: Core.AppLink;\n anonymiseUsers: boolean;\n anonSessions?: AnonSessions;\n}\n\nexport function InsightCompletedStudents(props: InsightCompletedStudentsProps) {\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Flag}\n svgClassName='bg-light-indigo text-indigo'\n count={props.students.length}\n >\n <InsightStudentList\n students={props.students.map(student => {\n return { ...getUserOrAnonSession(student, props.anonSessions), percentage: student.summary.percentCorrect };\n })}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.imageUrl}\n description={getPhrase('completedStudents')}\n appLink={props.resultsAppLink}\n appLinkText={getPhrase('viewAll')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}","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';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InteractionWithResultsSummary } from 'libs/shared/apps/analytics/interfaces/InteractionWithResultsSummary';\nimport { getInteractionResultsSummary } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { PercentageIndicator, PercentageIndicatorLayout } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { getInteractions } from 'libs/shared/utils/InteractiveHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightEasiestQuestion';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightEasiestQuestionProps {\n interactive: Interactive;\n interactiveMetadata: InteractiveMetadata;\n results: InteractiveResultSet;\n questionsAppLink: Core.AppLink;\n}\n\nexport function InsightEasiestQuestion(props: InsightEasiestQuestionProps) {\n const easiestQuestion = React.useMemo(\n () => getEasiestQuestion(props.interactive, props.results),\n [props.results.students.length]\n );\n\n function getEasiestQuestion(interactive: Interactive, results: InteractiveResultSet): InteractionWithResultsSummary {\n const interactions: InteractionWithResultsSummary[] = getInteractions(interactive).map(i => ({\n ...i,\n resultsSummary: getInteractionResultsSummary(i, results)\n }));\n\n const answeredInteractions = interactions.filter(i =>\n !!i.resultsSummary.answered && !i.resultsSummary.awaitingMarking);\n\n const sortedInteractions = ArrayHelper.sortBy(\n answeredInteractions,\n i => i.resultsSummary.percentCorrect\n );\n\n return ArrayHelper.last(sortedInteractions);\n }\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.StarOutline}\n svgClassName='bg-light-blue text-blue'\n >\n <div className='d-flex align-items-center'>\n <PercentageIndicator\n percentage={easiestQuestion?.resultsSummary?.percentCorrect}\n layout={PercentageIndicatorLayout.LabelInside}\n />\n {easiestQuestion\n ? <div className='d-flex ms-2'>\n <InteractionLabel interaction={easiestQuestion} iconClassName='flex-shrink-0' />\n </div>\n : <span className='ms-2'>{getPhrase('noAnswers')}</span>\n }\n </div>\n\n {easiestQuestion && (\n <AppLink\n appLink={{\n ...props.questionsAppLink,\n params: {\n ...props.questionsAppLink.params as HashObject,\n sortBy: 'score_desc'\n }\n }}\n className='text-info'>\n <Text namespace={namespace} phrase='viewQuestions' />\n </AppLink>\n )}\n </InsightCard>\n );\n}","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';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InteractionWithResultsSummary } from 'libs/shared/apps/analytics/interfaces/InteractionWithResultsSummary';\nimport { getInteractionResultsSummary } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { PercentageIndicator, PercentageIndicatorLayout } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { getInteractions } from 'libs/shared/utils/InteractiveHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightHardestQuestion';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightHardestQuestionProps {\n interactive: Interactive;\n interactiveMetadata: InteractiveMetadata;\n results: InteractiveResultSet;\n questionsAppLink: Core.AppLink;\n}\n\nexport function InsightHardestQuestion(props: InsightHardestQuestionProps) {\n const hardestQuestion = React.useMemo(\n () => getHardestQuestion(props.interactive, props.results),\n [props.results.students.length]\n );\n\n function getHardestQuestion(interactive: Interactive, results: InteractiveResultSet): InteractionWithResultsSummary {\n const interactions: InteractionWithResultsSummary[] = getInteractions(interactive).map(i => ({\n ...i,\n resultsSummary: getInteractionResultsSummary(i, results)\n }));\n\n const answeredInteractions = interactions.filter(i =>\n !!i.resultsSummary.answered && !i.resultsSummary.awaitingMarking);\n\n const sortedInteractions = ArrayHelper.sortBy(\n answeredInteractions,\n i => i.resultsSummary.percentCorrect\n );\n\n return ArrayHelper.first(sortedInteractions);\n }\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.QuestionMark}\n svgClassName='bg-light-orange text-orange'\n >\n <div className='d-flex align-items-center'>\n <PercentageIndicator\n percentage={hardestQuestion?.resultsSummary?.percentCorrect}\n layout={PercentageIndicatorLayout.LabelInside}\n />\n {hardestQuestion\n ? <div className='d-flex ms-2'>\n <InteractionLabel interaction={hardestQuestion} iconClassName='flex-shrink-0' />\n </div>\n : <span className='ms-2'>{getPhrase('noAnswers')}</span>\n }\n </div>\n\n {hardestQuestion && (\n <AppLink\n appLink={{\n ...props.questionsAppLink,\n params: {\n ...props.questionsAppLink.params as HashObject,\n sortBy: 'score_asc'\n }\n }}\n className='text-info'\n >\n <Text namespace={namespace} phrase='viewQuestions' />\n </AppLink>\n )}\n </InsightCard>\n );\n}","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 { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { AnonSessions } from 'libs/shared/apps/analytics/hooks/UseAnonSessions';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { getUserOrAnonSession } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightHighScoringStudents';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightHighScoringStudentsProps {\n students: StudentResultsWithSummary[];\n imageCdnUrl: string;\n greenChartImageUrl: string;\n resultsAppLink: Core.AppLink;\n completed: StudentResultsWithSummary[];\n anonymiseUsers?: boolean;\n anonSessions?: AnonSessions;\n}\n\nexport function InsightHighScoringStudents(props: InsightHighScoringStudentsProps) {\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Trophy}\n svgClassName='bg-light-teal text-teal'\n count={props.students.length}\n >\n <InsightStudentList\n students={props.students.map(student => {\n return { ...getUserOrAnonSession(student, props.anonSessions), percentage: student.summary.percentCorrect };\n })}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.greenChartImageUrl}\n description={getPhrase(props.completed.length ? 'noStudents' : 'highScore')}\n appLink={{\n ...props.resultsAppLink,\n params: {\n ...props.resultsAppLink.params as HashObject,\n sortBy: 'score_desc'\n }\n }}\n appLinkText={getPhrase('viewByHighest')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}","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 { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { AnonSessions } from 'libs/shared/apps/analytics/hooks/UseAnonSessions';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { getUserOrAnonSession } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightLowScoringStudents';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightLowScoringStudentsProps {\n students: StudentResultsWithSummary[];\n imageCdnUrl: string;\n redChartImageUrl: string;\n heartImageUrl: string;\n resultsAppLink: Core.AppLink;\n completed: StudentResultsWithSummary[];\n anonymiseUsers: boolean;\n anonSessions?: AnonSessions;\n}\n\nexport function InsightLowScoringStudents(props: InsightLowScoringStudentsProps) {\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Hand}\n svgClassName='bg-light-red text-red'\n count={props.students.length}\n >\n <InsightStudentList\n students={props.students.map(student => {\n return { ...getUserOrAnonSession(student, props.anonSessions), percentage: student.summary.percentCorrect };\n })}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.completed.length ? props.heartImageUrl : props.redChartImageUrl}\n description={getPhrase(props.completed.length ? 'doingWell' : 'lowScore')}\n appLink={{\n ...props.resultsAppLink,\n params: {\n ...props.resultsAppLink.params as HashObject,\n sortBy: 'score_asc'\n }\n }}\n appLinkText={getPhrase('viewByLowest')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { UserOrAnonSession } from 'libs/shared/apps/analytics/interfaces/UserOrAnonSession';\nimport { FilterStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\n\nconst namespace = 'shared.insightMarkingRequired';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\n\ninterface InsightMarkingRequiredProps {\n students: UserOrAnonSession[];\n imageCdnUrl: string;\n imageUrl: string;\n resultsAppLink: Core.AppLink;\n anonymiseUsers: boolean;\n}\n\nexport function InsightMarkingRequired(props: InsightMarkingRequiredProps) {\n const markingRequiredFilter: FilterStudentsBy = 'marking_required';\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Hand}\n svgClassName='bg-light-blue text-blue'\n count={props.students.length}\n >\n <InsightStudentList\n students={props.students}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.imageUrl}\n description={getPhrase('studentsRequireMarking')}\n appLink={{\n ...props.resultsAppLink,\n params: {\n filterBy: markingRequiredFilter\n }\n }}\n appLinkText={getPhrase('viewAll')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { FilterStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { User } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightNotCompletedStudents';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightNotCompletedStudentsProps {\n markingRequiredStudents: StudentResultsWithSummary[];\n completedStudents: StudentResultsWithSummary[];\n notCompletedStudents: StudentResultsWithSummary[];\n classroomStudents: User[];\n imageCdnUrl: string;\n imageUrl: string;\n resultsAppLink: Core.AppLink;\n anonymiseUsers: boolean;\n}\n\nexport function InsightNotCompletedStudents(props: InsightNotCompletedStudentsProps) {\n const notCompletedStudents = getNotCompletedStudents();\n \n function getNotCompletedStudents() {\n const markingRequiredStudentIds = props.markingRequiredStudents.map(student => student?.user.id);\n const completedStudentIds = props.completedStudents.map(student => student?.user.id);\n \n const notStartedStudents = props.classroomStudents.filter(student => {\n return !markingRequiredStudentIds.includes(student.id) &&\n !completedStudentIds.includes(student.id);\n });\n \n return ArrayHelper.uniq([\n ...props.notCompletedStudents.map(student => student.user),\n ...notStartedStudents\n ], 'id');\n }\n \n const notCompletedFilter: FilterStudentsBy = 'not_completed';\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Puzzle}\n svgClassName='bg-light-teal text-teal'\n count={notCompletedStudents.length}\n >\n <InsightStudentList\n students={notCompletedStudents}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.imageUrl}\n description={getPhrase('completed')}\n appLink={{\n ...props.resultsAppLink,\n params: notCompletedFilter\n }}\n appLinkText={getPhrase('viewAll')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { FilterStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport styles from './insights-mask.scss';\n\nconst namespace = 'lite.insightsMask';\n\ninterface InsightsMarkingRequiredMaskProps extends React.PropsWithChildren {\n requiresMarking: number;\n appLink: Core.AppLink;\n hideMarkingRequiredMask: () => void;\n}\n\nexport function InsightsMarkingRequiredMask(props: InsightsMarkingRequiredMaskProps) {\n const filterBy: FilterStudentsBy = 'marking_required';\n\n return (\n <div className={`${props.requiresMarking && styles.mask} position-relative`}>\n <div className={props.requiresMarking ? 'position-absolute top-0' : ''}>{props.children}</div>\n <div\n className={props.requiresMarking ? `${styles.backdrop} d-flex flex-column align-items-center justify-content-start py-5` : ''}\n >\n {!!props.requiresMarking && (\n <div className='text-center w-50'>\n <img src={ImageUrls.Insights.MARKING_RESPONSES} className='mb-3' width={288} />\n <h2 className='h3 mb-3'><Text namespace={namespace} phrase='markHeading' /></h2>\n <p className='mb-3'><Text namespace={namespace} phrase='markDescription' /></p>\n <IconButton\n svgName={cvSvgLibrary.Check}\n className='btn btn-dark mb-3'\n appLink={{\n ...props.appLink,\n params: {\n ...props.appLink.params as HashObject,\n filterBy\n }\n }}\n >\n <Text namespace={namespace} phrase='markResponses' options={{ smartCount: props.requiresMarking }} />\n </IconButton>\n <button className='btn btn-link d-block p-0 mx-auto' onClick={props.hideMarkingRequiredMask}><Text namespace={namespace} phrase='seeIncomplete' /></button>\n </div>\n )}\n </div>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialInsights\":\"pG0Jh\"};","import React from 'react';\n\nimport styles from './partial-interactive-insights-overview.scss';\n\nexport function PartialInteractiveInsightsOverview() {\n return (\n <div>\n <h2 className='h4 w-25 partial-loading-background'>&nbsp;</h2>\n <div className='row g-3 mb-5'>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n </div>\n\n <h2 className='h4 w-25 partial-loading-background'>&nbsp;</h2>\n <div className='row g-3 mb-5'>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n </div>\n\n <h2 className='h4 w-25 partial-loading-background'>&nbsp;</h2>\n <div className='row g-3 mb-5'>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { InsightAverageAttempts } from 'libs/shared/apps/analytics/components/insights/average-attempts/InsightAverageAttempts';\nimport { InsightAverageScore } from 'libs/shared/apps/analytics/components/insights/average-score/InsightAverageScore';\nimport { InsightCompletedStudents } from 'libs/shared/apps/analytics/components/insights/completed-students/InsightCompletedStudents';\nimport { InsightDevices } from 'libs/shared/apps/analytics/components/insights/devices/InsightDevices';\nimport { InsightEasiestQuestion } from 'libs/shared/apps/analytics/components/insights/easiest-question/InsightEasiestQuestion';\nimport { InsightHardestQuestion } from 'libs/shared/apps/analytics/components/insights/hardest-question/InsightHardestQuestion';\nimport { InsightHeatmap } from 'libs/shared/apps/analytics/components/insights/heatmap/InsightHeatmap';\nimport { InsightHighScoringStudents } from 'libs/shared/apps/analytics/components/insights/high-scoring-students/InsightHighScoringStudents';\nimport { InsightLowScoringStudents } from 'libs/shared/apps/analytics/components/insights/low-scoring-students/InsightLowScoringStudents';\nimport { InsightMarkingRequired } from 'libs/shared/apps/analytics/components/insights/marking-required/InsightMarkingRequired';\nimport { InsightNotCompletedStudents } from 'libs/shared/apps/analytics/components/insights/not-completed-students/InsightNotCompletedStudents';\nimport { AnonSessions } from 'libs/shared/apps/analytics/hooks/UseAnonSessions';\nimport { BaseAnalyticsEventResponse } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { UserOrAnonSession } from 'libs/shared/apps/analytics/interfaces/UserOrAnonSession';\nimport { getUserOrAnonSession } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { groupStudents } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ScoreThresholdInsights } from 'libs/shared/constants/ScoreThresholds';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { BasePaginatedCollection, Config, Engagement, Interactive, InteractiveMetadata, InteractiveResultSet, User } from 'libs/shared/interfaces';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport { InsightsMarkingRequiredMask } from 'apps/my-shares/components/insights-mask/InsightsMarkingRequiredMask';\nimport { InsightsShareMask } from 'apps/my-shares/components/insights-mask/InsightsShareMask';\nimport { PartialInteractiveInsightsOverview } from 'apps/my-shares/components/interactive-insights-overview/partial-loading/PartialInteractiveInsightsOverview';\n\nconst namespace = 'insights.interactiveInsightsOverview';\n\ninterface InteractiveInsightsOverviewProps {\n interactive: Interactive;\n results: InteractiveResultSet;\n interactiveMetadata: InteractiveMetadata;\n videoViews: BaseAnalyticsEventResponse;\n classroomStudents: BasePaginatedCollection<User>;\n aggregateEngagement: Engagement\n interactiveInsightsAppLinks: HashObject;\n classroomFilterOnly?: boolean;\n config: Config;\n params: HashObject;\n anonymiseUsers: boolean;\n hasShared: boolean;\n hasDataLoaded: boolean;\n shareId?: string;\n anonSessions?: AnonSessions;\n}\n\nexport function InteractiveInsightsOverview(props: InteractiveInsightsOverviewProps) {\n const [ hideMarkingRequiredMask, setHideMarkingRequiredMask ] = React.useState(false);\n\n const { hasShareFlowV2 } = useSettings(null);\n\n const studentGroups = props.hasDataLoaded && groupStudents(props.interactive, props.results, ScoreThresholdInsights);\n\n function getUsers(studentResult: StudentResultsWithSummary[]): UserOrAnonSession[] {\n return studentResult.map(student => getUserOrAnonSession(student, props.anonSessions));\n }\n\n return (\n <>\n {!props.hasDataLoaded && <PartialInteractiveInsightsOverview />}\n\n {props.hasDataLoaded &&\n <InsightsShareMask\n video={props.interactiveMetadata}\n hasShared={props.hasShared}\n hasShareFlowV2={hasShareFlowV2}\n shareId={props.shareId}\n >\n <section className='mb-5'>\n <h2 className='h4'>\n <Text namespace={namespace} phrase='studentResponses' />\n <span>: {props.results.students.length}{props.classroomStudents ? `/${props.classroomStudents.data.length}` : ''}</span>\n </h2>\n <div className='row g-3'>\n <div className='col'>\n <InsightMarkingRequired\n imageUrl={ImageUrls.Insights.SPEECH_BUBBLE_ASTERISK}\n resultsAppLink={props.interactiveInsightsAppLinks.resultsAppLink}\n imageCdnUrl={props.config.imageCdnUrl}\n students={getUsers(studentGroups.markingRequired)}\n anonymiseUsers={props.anonymiseUsers}\n />\n </div>\n {props.classroomFilterOnly && (\n <div className='col'>\n <InsightNotCompletedStudents\n markingRequiredStudents={studentGroups.markingRequired}\n completedStudents={studentGroups.completed}\n notCompletedStudents={studentGroups.notCompleted}\n classroomStudents={props.classroomStudents.data}\n imageCdnUrl={props.config.imageCdnUrl}\n imageUrl={ImageUrls.Insights.JIGSAW}\n resultsAppLink={props.interactiveInsightsAppLinks.resultsAppLink}\n anonymiseUsers={props.anonymiseUsers}\n />\n </div>\n )}\n <div className='col'>\n <InsightCompletedStudents\n students={studentGroups.completed}\n imageCdnUrl={props.config.imageCdnUrl}\n imageUrl={ImageUrls.Insights.AVATAR}\n resultsAppLink={props.interactiveInsightsAppLinks.resultsAppLink}\n anonymiseUsers={props.anonymiseUsers}\n anonSessions={props.anonSessions}\n />\n </div>\n </div>\n </section>\n <InsightsMarkingRequiredMask\n requiresMarking={!hideMarkingRequiredMask && studentGroups.markingRequired.length}\n appLink={props.interactiveInsightsAppLinks.resultsAppLink}\n hideMarkingRequiredMask={() => setHideMarkingRequiredMask(true)}\n >\n <section className='mb-5'>\n <h2 className='h4'>\n <Text namespace={namespace} phrase='studentsPerformance' />\n </h2>\n <div className='row g-3'>\n <div className='col-6'>\n <InsightLowScoringStudents\n redChartImageUrl={ImageUrls.Insights.RED_CHART}\n heartImageUrl={ImageUrls.Insights.SPEECH_BUBBLE_HEART}\n resultsAppLink={props.interactiveInsightsAppLinks.resultsAppLink}\n imageCdnUrl={props.config.imageCdnUrl}\n students={studentGroups.lowScore}\n completed={studentGroups.completed}\n anonymiseUsers={props.anonymiseUsers}\n anonSessions={props.anonSessions}\n />\n </div>\n <div className='col-6'>\n <InsightHighScoringStudents\n greenChartImageUrl={ImageUrls.Insights.GREEN_CHART}\n resultsAppLink={props.interactiveInsightsAppLinks.resultsAppLink}\n imageCdnUrl={props.config.imageCdnUrl}\n students={studentGroups.highScore}\n completed={studentGroups.completed}\n anonymiseUsers={props.anonymiseUsers}\n anonSessions={props.anonSessions}\n />\n </div>\n <div className='col-6'>\n <InsightHardestQuestion\n interactive={props.interactive}\n interactiveMetadata={props.interactiveMetadata}\n results={props.results}\n questionsAppLink={props.interactiveInsightsAppLinks.questionsAppLink}\n />\n </div>\n <div className='col-6'>\n <InsightEasiestQuestion\n interactive={props.interactive}\n interactiveMetadata={props.interactiveMetadata}\n results={props.results}\n questionsAppLink={props.interactiveInsightsAppLinks.questionsAppLink}\n />\n </div>\n </div>\n </section>\n <section className='mb-5'>\n <h2 className='h4'>\n <Text namespace={namespace} phrase='classPerformance' />\n </h2>\n <div className='row g-3'>\n <div className='col-6'>\n <InsightAverageScore\n students={studentGroups.completed}\n />\n </div>\n <div className='col-6'>\n <InsightAverageAttempts\n students={studentGroups.completed}\n />\n </div>\n <div className='col-6'>\n <InsightDevices\n osCount={props.videoViews?.osCount}\n />\n </div>\n <div className='col-6'>\n <InsightHeatmap\n engagement={props.aggregateEngagement}\n heatmapAppLink={props.interactiveInsightsAppLinks.heatmapAppLink}\n />\n </div>\n </div>\n </section>\n </InsightsMarkingRequiredMask>\n </InsightsShareMask>\n }\n </>\n );\n}","import React from 'react';\n\nimport { AnonymousSharedToAvatar, SharedLinkAvatar, SharedToAvatarList } from 'libs/shared/apps/share/components/shared-to-avatar-list/SharedToAvatarList';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { BaseObject } from 'libs/shared/interfaces';\n\nconst namespace = 'myShares.sharedToPill';\n\ninterface SharedToPillProps {\n shareRecipients: BaseObject[];\n hasShareLink?: boolean;\n maxAvatars?: number;\n imageCdnUrl: string;\n shareLinkText?: string;\n}\n\nSharedToPill.defaultProps = {\n maxAvatars: 3\n};\n\nexport function SharedToPill(props: SharedToPillProps) {\n const { shareRecipients } = props;\n\n return (\n <div className='d-flex align-items-center bg-gray-100 rounded-pill w-fit gap-2 p-2'>\n <span className='text-nowrap'><Text namespace={namespace} phrase={!shareRecipients ? 'sharedVia' : 'sharedTo'} /></span>\n\n {!shareRecipients &&\n <SharedLinkAvatar text={props.shareLinkText} avatarSize='sm' className='bg-dark text-white' />\n }\n\n {shareRecipients && !shareRecipients?.length &&\n <AnonymousSharedToAvatar avatarSize='sm' />\n }\n\n {shareRecipients &&\n <SharedToAvatarList\n recipients={shareRecipients}\n imageCdnUrl={props.imageCdnUrl}\n maxAvatars={props.maxAvatars}\n avatarSize='sm'\n hasShareLink={props.hasShareLink}\n shareLinkText={props.shareLinkText}\n />\n }\n </div>\n );\n}","var EN_US = ['second', 'minute', 'hour', 'day', 'week', 'month', 'year'];\nexport default function (diff, idx) {\n if (idx === 0)\n return ['just now', 'right now'];\n var unit = EN_US[Math.floor(idx / 2)];\n if (diff > 1)\n unit += 's';\n return [diff + \" \" + unit + \" ago\", \"in \" + diff + \" \" + unit];\n}\n//# sourceMappingURL=en_US.js.map","var ZH_CN = ['秒', '分钟', '小时', '天', '周', '个月', '年'];\nexport default function (diff, idx) {\n if (idx === 0)\n return ['刚刚', '片刻后'];\n var unit = ZH_CN[~~(idx / 2)];\n return [diff + \" \" + unit + \"\\u524D\", diff + \" \" + unit + \"\\u540E\"];\n}\n//# sourceMappingURL=zh_CN.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\n/**\n * All supported locales\n */\nvar Locales = {};\n/**\n * register a locale\n * @param locale\n * @param func\n */\nexport var register = function (locale, func) {\n Locales[locale] = func;\n};\n/**\n * get a locale, default is en_US\n * @param locale\n * @returns {*}\n */\nexport var getLocale = function (locale) {\n return Locales[locale] || Locales['en_US'];\n};\n//# sourceMappingURL=register.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\nvar SEC_ARRAY = [\n 60,\n 60,\n 24,\n 7,\n 365 / 7 / 12,\n 12,\n];\n/**\n * format Date / string / timestamp to timestamp\n * @param input\n * @returns {*}\n */\nexport function toDate(input) {\n if (input instanceof Date)\n return input;\n // @ts-ignore\n if (!isNaN(input) || /^\\d+$/.test(input))\n return new Date(parseInt(input));\n input = (input || '')\n // @ts-ignore\n .trim()\n .replace(/\\.\\d+/, '') // remove milliseconds\n .replace(/-/, '/')\n .replace(/-/, '/')\n .replace(/(\\d)T(\\d)/, '$1 $2')\n .replace(/Z/, ' UTC') // 2017-2-5T3:57:52Z -> 2017-2-5 3:57:52UTC\n .replace(/([+-]\\d\\d):?(\\d\\d)/, ' $1$2'); // -04:00 -> -0400\n return new Date(input);\n}\n/**\n * format the diff second to *** time ago, with setting locale\n * @param diff\n * @param localeFunc\n * @returns\n */\nexport function formatDiff(diff, localeFunc) {\n /**\n * if locale is not exist, use defaultLocale.\n * if defaultLocale is not exist, use build-in `en`.\n * be sure of no error when locale is not exist.\n *\n * If `time in`, then 1\n * If `time ago`, then 0\n */\n var agoIn = diff < 0 ? 1 : 0;\n /**\n * Get absolute value of number (|diff| is non-negative) value of x\n * |diff| = diff if diff is positive\n * |diff| = -diff if diff is negative\n * |0| = 0\n */\n diff = Math.abs(diff);\n /**\n * Time in seconds\n */\n var totalSec = diff;\n /**\n * Unit of time\n */\n var idx = 0;\n for (; diff >= SEC_ARRAY[idx] && idx < SEC_ARRAY.length; idx++) {\n diff /= SEC_ARRAY[idx];\n }\n /**\n * Math.floor() is alternative of ~~\n *\n * The differences and bugs:\n * Math.floor(3.7) -> 4 but ~~3.7 -> 3\n * Math.floor(1559125440000.6) -> 1559125440000 but ~~1559125440000.6 -> 52311552\n *\n * More information about the performance of algebraic:\n * https://www.youtube.com/watch?v=65-RbBwZQdU\n */\n diff = Math.floor(diff);\n idx *= 2;\n if (diff > (idx === 0 ? 9 : 1))\n idx += 1;\n return localeFunc(diff, idx, totalSec)[agoIn].replace('%s', diff.toString());\n}\n/**\n * calculate the diff second between date to be formatted an now date.\n * @param date\n * @param relativeDate\n * @returns {number}\n */\nexport function diffSec(date, relativeDate) {\n var relDate = relativeDate ? toDate(relativeDate) : new Date();\n return (+relDate - +toDate(date)) / 1000;\n}\n/**\n * nextInterval: calculate the next interval time.\n * - diff: the diff sec between now and date to be formatted.\n *\n * What's the meaning?\n * diff = 61 then return 59\n * diff = 3601 (an hour + 1 second), then return 3599\n * make the interval with high performance.\n **/\nexport function nextInterval(diff) {\n var rst = 1, i = 0, d = Math.abs(diff);\n for (; diff >= SEC_ARRAY[i] && i < SEC_ARRAY.length; i++) {\n diff /= SEC_ARRAY[i];\n rst *= SEC_ARRAY[i];\n }\n d = d % rst;\n d = d ? rst - d : rst;\n return Math.ceil(d);\n}\n//# sourceMappingURL=date.js.map","import { formatDiff, diffSec } from './utils/date';\nimport { getLocale } from './register';\n/**\n * format a TDate into string\n * @param date\n * @param locale\n * @param opts\n */\nexport var format = function (date, locale, opts) {\n // diff seconds\n var sec = diffSec(date, opts && opts.relativeDate);\n // format it with locale\n return formatDiff(sec, getLocale(locale));\n};\n//# sourceMappingURL=format.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\nimport en_US from './lang/en_US';\nimport zh_CN from './lang/zh_CN';\nimport { register } from './register';\nregister('en_US', en_US);\nregister('zh_CN', zh_CN);\nexport { format } from './format';\nexport { render, cancel } from './realtime';\nexport { register };\n//# sourceMappingURL=index.js.map"],"names":["getPhrase","LanguageService","getHiddenRecipientText","hiddenRecipients","counts","ArrayHelper","userCount","MasterType","classroomCount","groupCount","SharedToAvatar","props","user","item","typeId","classroom","classroomGroup","svgContainerClassName","Tooltip","title","name","surname","spanHack","spanHackClassName","Avatar","imageUrl","avatar","url","imageCdnUrl","initials","UserHelper","extraClasses","className","IconCircle","svgName","svgSize","SvgContainer","S","variant","metadata","colour","AnonymousSharedToAvatar","avatarSize","size","SharedLinkAvatar","text","SharedToAvatarList","AvatarList","items","recipients","avatarItem","avatarContainerClassname","getHiddenTooltip","hasShareLink","shareLinkText","defaultProps","maxAvatars","ShareLinkHelper","getPrivateIconAndText","options","entityTypeId","privacy","hasStudentExp","entity","yearGroups","icon","Array","isArray","overrideRestrictions","getRespectRatingText","getIconAndText","linkExpireDate","isPasswordProtected","status","isToday","dayDifference","Date","days","video","restriction","_restrictions","value","yearGroup","maxYearGroup","minAllowedYearGroup","rating","length","itemsToDisplay","slice","hiddenItems","AvatarItem","hiddenItemsCounts","translateX","getAvatarStyles","idx","transform","zIndex","style","marginRight","map","key","id","index","roleToDisplay","count","smartCount","numberClassname","InteractionCorrectness","InteractiveAnswerStatus","mapColourToBsVariant","groupColour","notApplicable","isMissingWordCorrect","interaction","getStudentAnswer","actionableItems","filter","a","isCorrect","every","trim","toLowerCase","isMultipleChoiceCorrect","studentAnswer","toString","getGetStudentAnswer","result","attempt","attempts","find","answers","s","wrapIsMultipleChoiceCorrect","answer","wrapIsMarkableAnswerMarkedCorrect","correctness","forEach","isMarkableAnswerMarkedCorrect","IsCorrectLookup","InteractiveCorrectnessHelper","awaitingMarking","isInteractionCorrect","isCorrectFn","interactionRequiresAnswer","flattenInteractions","interactive","timepoints","i","interactions","getStudentResult","studentResults","results","getStudentAttempt","interactionId","getInteractions","namespace","InsightAverageAttempts","noAttempts","total","categoriesData","students","reduce","acc","student","attemptsCategory","summary","Object","assign","keys","getCategoriesData","highestAttemptsCount","Math","max","category","averageAttempts","chartData","categories","series","type","color","borderRadius","dataLabels","enabled","inside","overflow","crop","data","highestCount","borderWidth","borderColor","y","InsightCard","svgClassName","Text","phrase","entries","attemptsCount","usersCount","totalAttempts","totalUsers","round","InsightChart","label","InsightAverageScore","averageScores","percentCorrect","averagePercentage","b","totalQuestions","averageScore","toFixed","scoreCount","fill","scorePercentageData","floor","PERCENTAGES","score","percentageCategory","Number","percentage","getChartColour","InsightCompletedStudents","InsightStudentList","anonSessions","description","appLink","resultsAppLink","appLinkText","anonymiseUsers","InsightEasiestQuestion","easiestQuestion","answeredInteractions","resultsSummary","answered","sortedInteractions","PercentageIndicator","layout","InteractionLabel","iconClassName","AppLink","questionsAppLink","params","sortBy","InsightHardestQuestion","hardestQuestion","InsightHighScoringStudents","greenChartImageUrl","completed","InsightLowScoringStudents","heartImageUrl","redChartImageUrl","InsightMarkingRequired","filterBy","InsightNotCompletedStudents","markingRequiredStudentIds","completedStudentIds","notStartedStudents","notCompletedStudents","markingRequiredStudents","completedStudents","classroomStudents","includes","InsightsMarkingRequiredMask","requiresMarking","children","src","ImageUrls","width","IconButton","onClick","hideMarkingRequiredMask","PartialInteractiveInsightsOverview","InteractiveInsightsOverview","studentResult","setHideMarkingRequiredMask","hasShareFlowV2","useSettings","studentGroups","hasDataLoaded","InsightsShareMask","interactiveMetadata","hasShared","shareId","interactiveInsightsAppLinks","config","markingRequired","classroomFilterOnly","notCompleted","lowScore","highScore","InsightDevices","osCount","videoViews","InsightHeatmap","engagement","aggregateEngagement","heatmapAppLink","SharedToPill","shareRecipients","EN_US","ZH_CN","Locales","register","locale","func","SEC_ARRAY","toDate","input","isNaN","test","parseInt","replace","format","date","opts","sec","relativeDate","diff","localeFunc","agoIn","totalSec","abs","unit"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[4456],{71553:(e,t,r)=>{r.d(t,{I:()=>s});var n=r(99940),a=r(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 s={interactiveResultSet:function(e,t,r,s,o,c,u,d){return{url:o?"/api/domain/v3/analytics/interactives/".concat(e,"/metadata/").concat(t):"/api/domain/v2/analytics/interactives/".concat(e,"/metadata/").concat(t),key:(0,a.H)("interactive:result:set:".concat(e,":").concat(t),s),data:i(r,s),type:n.k.POST,normalize:!1,success:c,error:u,always:d}},mark:function(e,t,r,a,i,s,o){return{url:"/api/domain/v1/analytics/answers/".concat(r),key:"mark:answer:".concat(r,":").concat(a.resultId),type:n.k.PUT,data:a,normalize:!1,invalidationKeys:"interactive:result:set:".concat(e,":").concat(t),success:i,error:s,always:o}},pendingReviews:function(e){return{url:"/api/domain/v1/analytics/interactives/pending-reviews/summary",key:"interactives:pending:reviews",type:n.k.POST,data:e}},interactiveResultsReport:function(e){return{url:"{gateway}/v2/analytics/interactives/report",key:"interactive:results:report",data:e,type:n.k.POST,normalize:!1}}}},26136:(e,t,r)=>{r.d(t,{B2:()=>o,DV:()=>u,jP:()=>c});var n=r(76198),a=r(23481),i=r(64818),s=a.T.encloseNamespace("shared.analyticsUtils");function o(e,t){return e?t?(0,n._8)((r="sessionId"in e?e.sessionName:e.id,a=+"".concat(r).concat(Math.floor((new Date).getMinutes()/5)),{dictionaries:[n.O9,n.yd],separator:" ",length:2,style:"capital",seed:a})):"sessionId"in e?e.sessionName:i.l.getFullName(e):"";var r,a}function c(e,t){var r={sessionId:e,sessionName:s("anonymousUser")};return e&&t&&t[e]||r}function u(e,t){return e.user?e.user:c(e.sessionId,t)}},39157:(e,t,r)=>{r.d(t,{HI:()=>v,R6:()=>u,Rt:()=>g,UU:()=>l,Zs:()=>d,nq:()=>m});var n=r(75896),a=r(94892),i=r(28972),s=r(8246),o=r(83140),c=r(80845);function u(e,t,r){var i={markingRequired:[],lowScore:[],highScore:[],completed:[],notCompleted:[]},s=(0,c.Q)(e).length;t.students.forEach((function(t){var o=Object.assign(Object.assign({},t),{summary:g(e,t)});o.summary.awaitingMarking?i.markingRequired.push(o):n.m.last(t.results).attempts.length===s?(i.completed.push(o),o.summary.percentCorrect>=((null==r?void 0:r.HIGH)||a.i.HIGH)&&i.highScore.push(o),o.summary.percentCorrect<((null==r?void 0:r.MODERATE)||a.i.MODERATE)&&i.lowScore.push(o)):i.notCompleted.push(o)}));var o=n.m.sortBy(i.lowScore,(function(e){return e.summary.percentCorrect})),u=n.m.sortBy(i.highScore,(function(e){return-e.summary.percentCorrect}));return Object.assign(Object.assign({},i),{lowScore:o,highScore:u})}function d(e,t){return(0,c.Wn)(e).find((function(e){return e.id.toString()===t.toString()}))}function l(e){return"".concat(e.questionId,":").concat(e.resultId)}function v(e,t,r){var n=(0,c.j_)(t),a=(0,c.f6)(e,n);return(null==a?void 0:a.answers.every((function(e){var t;return(null===(t=r[l(e)])||void 0===t?void 0:t.status)===s.N.Correct})))?s.N.Correct:(null==a?void 0:a.answers.every((function(e){var t;return(null===(t=r[l(e)])||void 0===t?void 0:t.status)===s.N.Incorrect})))?s.N.Incorrect:void 0}function m(e,t){var r=t.students.length,n=0,a=0,s=0,u=0,d=0;return t.students.forEach((function(t){var r=(0,c.j_)(t);if(r){d+=t.results.length;var l=o.A.isInteractionCorrect(e,r);l===i.w.Correct&&n++,l===i.w.UnAnswered&&s++,l===i.w.AwaitingMarking&&u++,l!==i.w.UnAnswered&&a++}})),{percentCorrect:r>0?n/r:0,correct:n,answered:a,unanswered:s,awaitingMarking:u,attempts:d}}function g(e,t){var r=(0,c.j_)(t),n=(0,c.Q)(e),a=n.length,s=0,u=0;n.forEach((function(e){var t=o.A.isInteractionCorrect(e,r);t===i.w.Correct&&s++,t===i.w.AwaitingMarking&&u++}));var d=a>0?s/a:0,l=new Set(n.map((function(e){return e.id}))),v=r.attempts.filter((function(e){var t;return!!l.has(null===(t=null==e?void 0:e.answers[0])||void 0===t?void 0:t.questionId)})).length;return{answered:r.attempts.length,attempts:t.results.length,unanswered:a-v,percentCorrect:d,correct:s,awaitingMarking:u}}},94892:(e,t,r)=>{r.d(t,{T:()=>a,i:()=>n});var n={HIGH:.75,MODERATE:.5},a={HIGH:.7,MODERATE:.7}},54405:(e,t,r)=>{r.d(t,{X:()=>n});var n={interactive:function(){return{url:"/mocks/insights/interactive.json",key:"demo:interactive",normalize:!1}},interactiveMetadata:function(){return{url:"/mocks/insights/interactive-metadata.json",key:"demo:interactive:metadata",normalize:!1}},interactiveResults:function(){return{url:"/mocks/insights/interactive-results.json",key:"demo:interactive:results",normalize:!1}},videoViews:function(){return{url:"/mocks/insights/video-views.json",key:"demo:video:views",normalize:!1}},users:function(){return{url:"/mocks/insights/users.json",key:"demo:users",normalize:!1}},individualHeatmap:function(){return{url:"/mocks/insights/individual-heatmap.json",key:"demo:individual:heatmap",normalize:!1}},aggregateHeatmap:function(){return{url:"/mocks/insights/aggregate-heatmap.json",key:"demo:aggregate:heatmap",normalize:!1}}}},62875:(e,t,r)=>{function n(e,t,r){var n="".concat(e,":").concat(t.start,":").concat(t.end),a=Array.isArray(t.userId)?t.userId.sort().join(":"):t.userId,i=Array.isArray(t.groupId)?t.groupId.sort().join(":"):t.groupId;return a&&(n+=":".concat(a)),i&&(n+=":".concat(i)),r&&(n+=":".concat(r)),n}r.d(t,{H:()=>n})},55588:(e,t,r)=>{r.r(t),r.d(t,{InteractiveStudentResultsDemoView:()=>k});var n=r(32735),a=r(23481),i=r(20354),s=r(2948),o=r(5255),c=r(9193),u=r(26136),d=r(3218),l=r(9111),v=r(38143),m=r(39151),g=r(54405),p=r(26304),f=r(91286),y=r(93322);function h(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}var w=a.T.encloseNamespace("shared.interactiveStudentResults");function k(e){var t,r,a,k,I,S=(k=(0,s.D)(v.g.ANONYMISE_USERS),I=1,function(e){if(Array.isArray(e))return e}(k)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,i,s,o=[],c=!0,u=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=i.call(r)).done)&&(o.push(n.value),o.length!==t);c=!0);}catch(e){u=!0,a=e}finally{try{if(!c&&null!=r.return&&(s=r.return(),Object(s)!==s))return}finally{if(u)throw a}}return o}}(k,I)||function(e,t){if(e){if("string"==typeof e)return h(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?h(e,t):void 0}}(k,I)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];(0,y.F)();var A=i.a.useBasicFetch(g.X.interactiveMetadata()),C=i.a.useBasicFetch(g.X.interactive()),j=i.a.useBasicFetch(g.X.interactiveResults()),R=i.a.useBasicFetch(m.L.config()),b=(0,o.Y)(e.shareId);(0,f.v)([A,j]),(0,p.b)(A);var M=(0,c.D)(null===(t=C.data)||void 0===t?void 0:t.id,null===(r=A.data)||void 0===r?void 0:r.id,e.closePopup),E=M.markedAnswers,O=M.addMarkedAnswers,H=M.submitMarkedAnswers,N=null===(a=j.data)||void 0===a?void 0:a.students.find((function(t){var r,n,a,i,s;return e.userId?(null===(n=null===(r=t.user)||void 0===r?void 0:r.id)||void 0===n?void 0:n.toString())===(null===(a=e.userId)||void 0===a?void 0:a.toString()):!!e.sessionId&&(null===(i=t.sessionId)||void 0===i?void 0:i.toString())===(null===(s=e.sessionId)||void 0===s?void 0:s.toString())})),U=N?w("heading",{studentName:(0,u.B2)((0,u.DV)(N,b),S)}):"",T=!!C.data&&!!j.data&&!!R.data;return n.createElement(l.G,{title:U,showLoadingSpinner:!T,closePopup:e.closePopup,size:"lg"},T&&n.createElement(d.R,{interactive:C.data,studentResults:N,markedAnswers:E,addMarkedAnswers:O,submitMarkedAnswers:H,imageCdnUrl:R.data.imageCdnUrl,selectedInteractionId:e.interactionId,onClickClose:e.closePopup,anonymiseUsers:S,reportsStyling:e.reportsStyling,isDemo:!0}))}}}]);
2
+ //# sourceMappingURL=4456-ada4977b41-lite.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/4456-ada4977b41-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/apps/analytics/utils/AnonymiseUserUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/InteractiveUtils.ts","file:///app/packages/libs/shared/src/constants/ScoreThresholds.ts","file:///app/packages/libs/shared/src/flight-requests/InsightsDemoRequests.ts","file:///app/packages/libs/shared/src/utils/AnalyticsRequestUtils.ts","file:///app/packages/projects/lite/src/apps/my-shares/views/demo/interactive-student-results/InteractiveStudentResultsDemoView.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 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: '{gateway}/v2/analytics/interactives/report',\n key: 'interactive:results:report',\n data,\n type: HttpVerbs.POST,\n normalize: false\n };\n }\n};","import { animals, colors, Config as UniqueNamesConfig, uniqueNamesGenerator } from 'unique-names-generator';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AnonSession, AnonSessions } from 'libs/shared/apps/analytics/hooks/UseAnonSessions';\nimport { UserOrAnonSession } from 'libs/shared/apps/analytics/interfaces/UserOrAnonSession';\nimport { StudentResults } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nconst namespace = 'shared.analyticsUtils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getUniqueNamesConfig(id: string): UniqueNamesConfig {\n /**\n * Generate a seed that is unique to each user but changes every 5 minutes.\n * \n * We use a seed so that if the same user's name is anonymised multiple times\n * in quick succession (e.g. multiple renders), the same name will be returned each time.\n * \n * We change the seed every 5 minutes so that students don't always have the same name.\n */\n const seed = +`${id}${Math.floor((new Date()).getMinutes() / 5)}`;\n\n return {\n dictionaries: [ colors, animals ],\n separator: ' ',\n length: 2,\n style: 'capital',\n seed\n };\n}\n\nexport function anonymiseUserName(user: UserOrAnonSession, shouldAnonymise: boolean): string {\n if (!user)\n return '';\n\n if (!shouldAnonymise)\n return 'sessionId' in user ? user.sessionName : UserHelper.getFullName(user);\n\n return uniqueNamesGenerator(getUniqueNamesConfig('sessionId' in user ? user.sessionName : user.id));\n}\n\nexport function getAnonSession(sessionId: string, anonSessions: AnonSessions): AnonSession {\n const fallback = {\n sessionId: sessionId,\n sessionName: getPhrase('anonymousUser')\n };\n\n if (!sessionId || !anonSessions)\n return fallback;\n\n const anonSession = anonSessions[sessionId];\n\n if (anonSession)\n return anonSession;\n\n return fallback;\n}\n\nexport function getUserOrAnonSession(result: StudentResults, anonSessions: AnonSessions): UserOrAnonSession {\n if (result.user)\n return result.user;\n\n return getAnonSession(result.sessionId, anonSessions);\n}\n","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { ResultsSummary } from 'libs/shared/apps/analytics/interfaces/ResultsSummary';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { ScoreThresholdDefaults, ScoreThresholds } from 'libs/shared/constants/ScoreThresholds';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, StudentAnswer, StudentResults } from 'libs/shared/interfaces';\nimport { Interactive, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { flattenInteractions, getInteractions, getStudentAttempt, getStudentResult } from 'libs/shared/utils/InteractiveHelper';\n\ninterface StudentGroups {\n markingRequired: StudentResultsWithSummary[];\n lowScore: StudentResultsWithSummary[];\n highScore: StudentResultsWithSummary[];\n completed: StudentResultsWithSummary[];\n notCompleted: StudentResultsWithSummary[];\n}\n\nexport function groupStudents(\n interactive: Interactive,\n results: InteractiveResultSet,\n scoreThreshold?: ScoreThresholds\n): StudentGroups {\n const groups: StudentGroups = {\n markingRequired: [],\n lowScore: [],\n highScore: [],\n completed: [],\n notCompleted: []\n };\n\n const interactions = getInteractions(interactive);\n\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 >= (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: result.attempts.length,\n attempts: studentResults.results.length,\n unanswered: numInteractions - answeredInteractions,\n percentCorrect,\n correct: numCorrect,\n awaitingMarking\n };\n}","export interface ScoreThresholds {\n HIGH: number;\n MODERATE: number;\n}\n\nexport const ScoreThresholdDefaults: ScoreThresholds = {\n HIGH: 0.75,\n MODERATE: 0.5\n};\n\nexport const ScoreThresholdInsights: ScoreThresholds = {\n HIGH: 0.7,\n MODERATE: 0.7\n};","import { 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 { 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 React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { useAnonSessions } from 'libs/shared/apps/analytics/hooks/UseAnonSessions';\nimport { useMarkAnswers } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { anonymiseUserName, getUserOrAnonSession } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { StudentResponseList } from 'libs/shared/apps/student-response-list/StudentResponseList';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { InsightsDemoRequests } from 'libs/shared/flight-requests/InsightsDemoRequests';\nimport { useCannotConsumeError } from 'libs/shared/hooks/useCannotConsumeError';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { useLockContentWidth } from 'libs/shared/hooks/useLockContentWidth';\nimport { Config, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { PopupViewProps } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.interactiveStudentResults';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractiveStudentResultsViewProps extends PopupViewProps {\n userId: string;\n interactiveId: string;\n interactionId?: string;\n reportsStyling?: boolean;\n sessionId?: string;\n shareId?: string;\n}\n\nexport function InteractiveStudentResultsDemoView(props: InteractiveStudentResultsViewProps): JSX.Element {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n useLockContentWidth();\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n InsightsDemoRequests.interactiveMetadata()\n );\n const interactive = Flight.useBasicFetch<Interactive>(InsightsDemoRequests.interactive());\n\n const results = Flight.useBasicFetch<InteractiveResultSet>(InsightsDemoRequests.interactiveResults());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const anonSessions = useAnonSessions(props.shareId);\n\n useHandleObjectError([ interactiveMetadata, results ]);\n useCannotConsumeError(interactiveMetadata);\n\n const { markedAnswers, addMarkedAnswers, submitMarkedAnswers } = useMarkAnswers(\n interactive.data?.id,\n interactiveMetadata.data?.id,\n props.closePopup\n );\n\n const studentResults = results.data?.students.find(s => {\n if (props.userId)\n return s.user?.id?.toString() === props.userId?.toString();\n\n if (props.sessionId)\n return s.sessionId?.toString() === props.sessionId?.toString();\n\n return false;\n });\n\n const popupTitle = studentResults\n ? getPhrase('heading', { studentName: anonymiseUserName(getUserOrAnonSession(studentResults, anonSessions), anonymiseUsers) })\n : '';\n const dataLoaded = !!interactive.data && !!results.data && !!config.data;\n\n return (\n <Popup\n title={popupTitle}\n showLoadingSpinner={!dataLoaded}\n closePopup={props.closePopup}\n size='lg'\n >\n {dataLoaded &&\n <StudentResponseList\n interactive={interactive.data}\n studentResults={studentResults}\n markedAnswers={markedAnswers}\n addMarkedAnswers={addMarkedAnswers}\n submitMarkedAnswers={submitMarkedAnswers}\n imageCdnUrl={config.data.imageCdnUrl}\n selectedInteractionId={props.interactionId}\n onClickClose={props.closePopup}\n anonymiseUsers={anonymiseUsers}\n reportsStyling={props.reportsStyling}\n isDemo\n />\n }\n </Popup>\n );\n}"],"names":["getInteractiveResultFilters","currentUser","filter","currentUserId","id","currentCustomerId","customerId","dateRange","start","end","userIds","userId","classroomsAndGroups","groupId","InteractiveResultsRequests","interactiveResultSet","interactiveId","interactiveMetadataId","includePublicResults","success","error","always","url","key","data","type","normalize","mark","answerId","resultId","invalidationKeys","pendingReviews","interactiveResultsReport","getPhrase","anonymiseUserName","user","shouldAnonymise","sessionName","seed","Math","floor","Date","getMinutes","dictionaries","separator","length","style","getAnonSession","sessionId","anonSessions","fallback","getUserOrAnonSession","result","groupStudents","interactive","results","scoreThreshold","groups","markingRequired","lowScore","highScore","completed","notCompleted","numInteractions","students","forEach","s","withSummary","summary","getStudentResultsSummary","awaitingMarking","push","attempts","percentCorrect","HIGH","MODERATE","sortedLowScore","sortedHighScore","getInteractionById","interactionId","find","i","toString","getMarkedAnswerId","answer","questionId","getMarkedStatus","studentResults","markedAnswers","studentResponse","answers","every","a","status","getInteractionResultsSummary","interaction","numStudents","numCorrect","answered","unanswered","correctness","correct","interactions","interactionIds","Set","map","answeredInteractions","has","ScoreThresholdDefaults","ScoreThresholdInsights","InsightsDemoRequests","interactiveMetadata","interactiveResults","videoViews","users","individualHeatmap","aggregateHeatmap","getAnalyticsRequestKey","baseKey","sharerId","userIdKey","Array","isArray","sort","join","groupIdKey","InteractiveStudentResultsDemoView","props","anonymiseUsers","config","shareId","closePopup","addMarkedAnswers","submitMarkedAnswers","popupTitle","studentName","dataLoaded","title","showLoadingSpinner","size","imageCdnUrl","selectedInteractionId","onClickClose","reportsStyling","isDemo"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[4806],{34079:(e,t,n)=>{n.d(t,{O:()=>s});var r=n(32735),a=n(23481),i=n(40782),c=n(36532),l=a.T.encloseNamespace("interactives.pendingIndicator");function o(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 s(e){var t=function(){return r.createElement("div",{className:o(e)},!!e.showLabel&&r.createElement("em",null,l("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)}},84806:(e,t,n)=>{n.d(t,{Ju:()=>A,bB:()=>_,l8:()=>P,R7:()=>R,lE:()=>j,Fx:()=>T});var r=n(32735),a=n(23481),i=n(75896),c=n(34079),l=n(26136),o=n(39157),s=n(97364),u=n(40782),m=n(80845),d=n(26378),f=n(71151),v=n(93264),g=n(84120);function p(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]),l=c.id===e.selectedInteraction.id,o=l?g.w.getTypeInfo(c.typeId).bgClassName:"bg-gray-500",s=t.visibleAt/1e3/e.duration*100;return r.createElement("div",{key:n,className:"".concat("Wf1bl"," text-center"),style:{left:"".concat(s,"%")}},r.createElement("div",{className:"".concat("Fpm49"," ").concat(o)}),!!l&&r.createElement("div",null,v.T.ToDisplayDuration(t.visibleAt)))}))):r.createElement(r.Fragment,null)}var y=n(86572);var w=a.T.encloseNamespace("shared.interactionResultsSummary");function b(e){var t,n=r.useMemo((function(){return(0,o.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(y.y,{interaction:e.interaction,iconClassName:"flex-shrink-0"})),r.createElement("div",{className:"my-4 ".concat("FCXQd")},r.createElement(p,{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,w("correctlyAnswered")),r.createElement(u.O,{percentage:n.percentCorrect,layout:u.I.LabelOnly})),!!n.awaitingMarking&&r.createElement("div",{className:"d-flex align-items-center justify-content-center"},r.createElement("strong",null,r.createElement("em",null,w("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,w("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,l=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(f.Z,Object.assign({id:"interaction-results-summary-".concat(n.id),ref:t},l),r.createElement(f.Z.Body,null,r.createElement(b,{interaction:n,interactive:a,interactiveMetadata:i,results:c}))))})),h=n(19912);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(h.Z.interactionHeaderCellInner),onMouseEnter:e.onMouseEnter,onMouseLeave:e.onMouseLeave},r.createElement("div",{className:"p-1 position-relative"},e.interactionNumber)))}var N=n(83914),I=n(28972),M=n(83140),k=n(35223);function x(e){var t="".concat(h.Z.resultsCellInner," h-100 position-relative");return e===I.w.Correct&&(t+=" ".concat(h.Z.correct)),e===I.w.Incorrect&&(t+=" ".concat(h.Z.incorrect," text-danger")),e===I.w.AwaitingMarking&&(t+=" ".concat(h.Z.awaitingMarking)),e===I.w.UnAnswered&&(t+=" ".concat(h.Z.unanswered," text-warning")),t}function Z(e){var t=M.A.isInteractionCorrect(e.interaction,(0,m.j_)(e.studentResults)),n=function(e){return e===I.w.Correct?k.vn.Check:e===I.w.Incorrect?k.vn.Close:e===I.w.UnAnswered?k.vn.Minus:void 0}(t);return r.createElement("div",{className:x(t)},!!n&&r.createElement(N.x,{svgName:n}),t===I.w.AwaitingMarking&&r.createElement(c.O,null))}var S=a.T.encloseNamespace("shared.studentResultsTable"),A=60;function L(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 O(e){return r.createElement(L,{className:e.column.isSorted&&"fw-bold"},S(e.phraseKey))}function R(e,t,n){var a,i=!!(null===(a=e.students)||void 0===a?void 0:a.length);return r.useMemo((function(){return[{id:"name",Header:function(e){var t=e.column;return r.createElement(O,{column:t,phraseKey:"name"})},accessor:function(e){return e},Cell:function(e){var a=e.value;return r.createElement(L,null,r.createElement("span",{className:"text-truncate"},(0,l.B2)((0,l.DV)(a,t),n)))},disableSortBy:!i},{Header:function(e){var t=e.column;return r.createElement(O,{column:t,phraseKey:"unanswered"})},accessor:"summary.unanswered",sortType:"basic",sortDescFirst:!0,disableSortBy:!i,Cell:function(e){var t=e.value;return r.createElement(L,null,t)}},{Header:function(e){var t=e.column;return r.createElement(O,{column:t,phraseKey:"score"})},accessor:"summary",id:"score",Cell:function(e){var t=e.value;return t.awaitingMarking?r.createElement(L,null,r.createElement(c.O,{title:S("markingRequired"),className:"flex-grow-1",showLabel:!0})):r.createElement(L,null,"".concat(t.correct,"/").concat(t.answered+t.unanswered))},width:125,sortDescFirst:!0,disableSortBy:!i},{Header:function(e){var t=e.column;return r.createElement(O,{column:t,phraseKey:"percentage"})},accessor:"summary",id:"percentage",Cell:function(e){var t=e.value;return t.awaitingMarking?r.createElement(L,null,r.createElement(c.O,{title:S("markingRequired"),className:"flex-grow-1",showLabel:!0})):r.createElement(L,null,r.createElement(u.O,{percentage:t.percentCorrect,layout:u.I.LabelBefore,className:"flex-grow-1"}))},width:125,sortDescFirst:!0,disableSortBy:!i}]}),[n,i])}function j(e,t,n,a,i){return r.useMemo((function(){return(0,m.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:A,Cell:function(e){var t=e.row.original;return r.createElement(Z,{interaction:i,studentResults:t})}}}))}),[i])}function T(e,t,n,a,c,u){return r.useMemo((function(){var n=[];if(t.students.forEach((function(t){var r=(0,o.Rt)(e,t);u&&(0,s.C)(u,r)||n.push(Object.assign(Object.assign({},t),{summary:r}))})),"user"===(null==c?void 0:c.id)){var r=i.m.sortBy(n,(function(e){return(0,l.B2)(e.user,a)}));return c.desc?r.reverse():r}if("summary.unanswered"===(null==c?void 0:c.id)){var m=i.m.sortBy(n,(function(e){return e.summary.unanswered}));return c.desc?m.reverse():m}if("score"===(null==c?void 0:c.id)||"percentage"===(null==c?void 0:c.id)){var d=i.m.sortBy(n,(function(e){return e.summary.awaitingMarking?-1:e.summary.percentCorrect}));return c.desc?d.reverse():d}return n}),[n,c,a,u])}function _(e,t){if(e){var n=e.querySelectorAll(".".concat(h.Z.resultsRow));null==n||n.forEach((function(e){e.childNodes.forEach((function(e,n){e.classList.remove(h.Z.highlightColumn),n===t&&e.classList.add(h.Z.highlightColumn)}))}))}}function P(e,t){if(e){var n=e.querySelectorAll(".".concat(h.Z.resultsRow));null==n||n.forEach((function(e,n){e.classList.remove(h.Z.highlightResultsRow),n===t&&e.classList.add(h.Z.highlightResultsRow)}))}}},97364:(e,t,n)=>{n.d(t,{C:()=>i,P:()=>a});var r=n(94892);function a(e,t){switch(e){case"score_desc":return[{id:t,desc:!0}];case"score_asc":return[{id:t,desc:!1}];default:return[]}}function i(e,t){return"marking_required"===e&&!t.awaitingMarking||"helping_hand"===e&&t.percentCorrect>=r.T.HIGH||"not_completed"===e&&!t.unanswered}},40782:(e,t,n)=>{n.d(t,{I:()=>r,O:()=>o});var r,a=n(32735),i=n(2606),c=n(362);function l(e){var t=a.useCallback((function(t){if(t){var n=t.r.baseVal.value,r=2*Math.PI*n,a=r-e.percentage*r;t.style.strokeDasharray="".concat(r," ").concat(r),t.style.strokeDashoffset=a.toString()}}),[e.percentage]);return a.createElement("svg",null,a.createElement("circle",{r:(0,i.pu)(e.size),className:c.Z.backgroundCircle}),!(0,i.zR)(e.percentage)&&a.createElement("circle",{ref:t,r:(0,i.pu)(e.size),className:(0,i.V4)(e.percentage,e.scoreThresholds)}))}function o(e){var t,n=(0,i.Ki)(e.percentage),o=e.size||(e.layout===r.LabelInside?i.Mk.Large:i.Mk.Small),s=e.customLabel||(0,i.DV)(n);return e.layout===r.LabelOnly?a.createElement("span",{className:(0,i.IA)(n)},s):a.createElement("div",{className:"d-flex align-items-center justify-content-between ".concat(null!==(t=e.className)&&void 0!==t?t:"")},e.layout===r.LabelBefore&&a.createElement("span",{className:"me-2"},s),a.createElement("div",{className:(0,i.tw)(o,n)},a.createElement(l,{percentage:n,size:o,scoreThresholds:e.scoreThresholds}),e.layout===r.LabelInside&&a.createElement("span",{className:c.Z.centredPercentageText},s)))}!function(e){e.CircleOnly="circle_only",e.LabelOnly="label_only",e.LabelBefore="label_before",e.LabelInside="label_inside"}(r||(r={})),o.defaultProps={layout:r.CircleOnly}},2606:(e,t,n)=>{n.d(t,{DV:()=>p,IA:()=>f,Ki:()=>g,Mk:()=>l,V4:()=>d,pu:()=>m,tw:()=>v,zR:()=>y});var r=n(94892),a=n(362);function i(e){return i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i(e)}function c(e,t,n){return(t=function(e){var t=function(e){if("object"!=i(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=i(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==i(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var l,o=.2,s=.36;!function(e){e.Small="small",e.Large="large",e.ExtraSmall="extraSmall"}(l||(l={}));var u=c(c(c({},l.ExtraSmall,{size:2}),l.Small,{size:2}),l.Large,{size:5.8});function m(e){var t=u[e].size,n=e===l.Large?s:o;return"".concat(t/2-2*n,"rem")}function d(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:r.i;return e>=t.HIGH?a.Z.circleSuccess:e>=t.MODERATE?a.Z.circleWarning:a.Z.circleDanger}function f(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:r.i;return e>=t.HIGH?"text-success":e>=t.MODERATE?"text-warning":"text-danger"}function v(e,t){var n="d-inline-block ".concat(a.Z.circleContainer);return e===l.Large&&(n+=" ".concat(a.Z.lgCircleContainer)),e===l.ExtraSmall&&(n+=" ".concat(a.Z.xsCircleContainer)),y(t)&&(n+=" ".concat(a.Z.pendingCircle)),n}function g(e){if(!y(e))return+e.toFixed(2)}function p(e){return y(e)?"--%":"".concat(Math.round(100*e),"%")}function y(e){return"number"!=typeof e}},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(38129);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 l(e,t,n){return(t=function(e){var t=function(e){if("object"!=c(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=c(n))return n;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 o(){return r.w.NotApplicable}function s(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 m(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 d(e,t){var n=m(e,t);return u(e,(function(e){var t=n(e);return null==t?void 0:t.text}))}function f(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,m(e,t))}var v=l(l(l(l(l(l(l({},i.Z9.Annotation,o),i.Z9.Image,o),i.Z9.MissingWord,(function(e,t){var n=m(e,t);return s(e,(function(e){var t=n(e);return null==t?void 0:t.text}))})),i.Z9.MultipleChoice,d),i.Z9.ShortAnswer,f),i.Z9.TrueOrFalse,d),i.Z9.Illustration,f),g={notApplicable:o,awaitingMarking:function(){return r.w.AwaitingMarking},isMissingWordCorrect:s,isMultipleChoiceCorrect:u,isInteractionCorrect:function(e,t){return(0,v[e.typeId])(e,t)}}},80845:(e,t,n)=>{n.d(t,{Q:()=>s,Wn:()=>c,f6:()=>o,j_:()=>l});var r=n(75896),a=n(38129);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 l(e){return r.m.last(e.results)}function o(e,t){return r.m.findWhere(null==t?void 0:t.attempts,{id:e})}function s(e){return c(e).filter(i)}},19912:(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"}},362:(e,t,n)=>{n.d(t,{Z:()=>r});const r={circleContainer:"p8Vgz",backgroundCircle:"asGGE",circleSuccess:"PXLNj",circleWarning:"ZckRN",circleDanger:"slBRg",lgCircleContainer:"N8KCI",xsCircleContainer:"RPqZ2",pendingCircle:"DKrcq",centredPercentageText:"tpmLR"}}}]);
2
+ //# sourceMappingURL=4806-a05a2a3012-lite.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/4806-a05a2a3012-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/InteractionsBar.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/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/utils/StudentTableUtils.ts","file:///app/packages/libs/shared/src/components/percentage-indicator/PercentageIndicator.tsx","file:///app/packages/libs/shared/src/components/percentage-indicator/PercentageIndicatorUtils.ts","file:///app/packages/libs/shared/src/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","file:///app/packages/libs/shared/src/components/percentage-indicator/percentage-indicator.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}","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}","// extracted by mini-css-extract-plugin\nexport default {\"container\":\"Wf1bl\",\"interaction\":\"Fpm49\"};","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 { AnonSessions } from 'libs/shared/apps/analytics/hooks/UseAnonSessions';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { anonymiseUserName, getUserOrAnonSession } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { getStudentResultsSummary } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { FilterStudentsBy, shouldFilterStudent } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\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 anonSessions: AnonSessions,\n anonymiseUsers: boolean\n): Column<StudentResultsWithSummary>[] {\n const hasResults = !!results.students?.length;\n\n return React.useMemo(() => {\n const cols: Column<StudentResultsWithSummary>[] = [\n {\n id: 'name',\n Header: ({ column }) => <HeaderCell column={column} phraseKey='name' />,\n accessor: (u: StudentResultsWithSummary) => u,\n Cell: ({ value }: CellProps<StudentResultsWithSummary, StudentResultsWithSummary>) => (\n <CellWrapper>\n <span className='text-truncate'>{anonymiseUserName(getUserOrAnonSession(value, anonSessions), 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 filterBy?: FilterStudentsBy\n): StudentResultsWithSummary[] {\n return React.useMemo(() => {\n const students: StudentResultsWithSummary[] = [];\n\n results.students.forEach(s => {\n const summary = getStudentResultsSummary(interactive, s);\n\n if (filterBy && shouldFilterStudent(filterBy, summary)) return;\n\n students.push({ ...s, summary });\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, filterBy ]);\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 { SortingRule } from 'react-table';\n\nimport { ResultsSummary } from 'libs/shared/apps/analytics/interfaces/ResultsSummary';\nimport { ScoreThresholdInsights } from 'libs/shared/constants/ScoreThresholds';\n\nexport type SortStudentsBy = 'score_desc' | 'score_asc';\n\nexport function getSortStudents(sortBy: SortStudentsBy, id: string): SortingRule<any>[] {\n switch (sortBy) {\n case 'score_desc': return [{ id, desc: true }];\n case 'score_asc': return [{ id, desc: false }];\n default: return [];\n }\n}\n\nexport type FilterStudentsBy = 'not_completed' | 'marking_required' | 'helping_hand';\n\nexport function shouldFilterStudent(filter: FilterStudentsBy, summary: ResultsSummary): boolean {\n if (filter === 'marking_required' && !summary.awaitingMarking)\n return true;\n\n if (filter === 'helping_hand' && summary.percentCorrect >= ScoreThresholdInsights.HIGH)\n return true;\n\n if (filter === 'not_completed' && !summary.unanswered)\n return true;\n \n return false;\n}\n\n","import React from 'react';\n\nimport { ScoreThresholds } from 'libs/shared/constants/ScoreThresholds';\n\nimport {\n getCircleClassName,\n getCircleContainerClassName,\n getCircleRadius,\n getColouredLabelClassName,\n getFormattedPercentage,\n getPercentageToFixed,\n isPending,\n ProgressCircleSize\n} from './PercentageIndicatorUtils';\n\nimport styles from './percentage-indicator.scss';\n\ninterface ProgressCircleProps {\n size: ProgressCircleSize;\n scoreThresholds?: ScoreThresholds;\n percentage?: number;\n}\n\nfunction ProgressCircle(props: ProgressCircleProps): JSX.Element {\n const ref = React.useCallback((circle: SVGCircleElement) => {\n if (!circle)\n return;\n\n const radius = circle.r.baseVal.value;\n const circumference = 2 * Math.PI * radius;\n const offset = circumference - props.percentage * circumference;\n\n circle.style.strokeDasharray = `${circumference} ${circumference}`;\n circle.style.strokeDashoffset = offset.toString();\n }, [props.percentage]);\n\n return (\n <svg>\n <circle r={getCircleRadius(props.size)} className={styles.backgroundCircle} />\n {!isPending(props.percentage) &&\n <circle\n ref={ref}\n r={getCircleRadius(props.size)}\n className={getCircleClassName(props.percentage, props.scoreThresholds)}\n />\n }\n </svg>\n );\n}\n\nexport enum PercentageIndicatorLayout {\n CircleOnly = 'circle_only',\n LabelOnly = 'label_only',\n LabelBefore = 'label_before',\n LabelInside = 'label_inside'\n}\n\ninterface PercentageIndicatorProps {\n layout: PercentageIndicatorLayout;\n percentage?: number; // Between 0 and 1 or undefined for pending\n className?: string;\n customLabel?: string;\n scoreThresholds?: ScoreThresholds;\n size?: ProgressCircleSize;\n}\n\nPercentageIndicator.defaultProps = {\n layout: PercentageIndicatorLayout.CircleOnly\n};\n\nexport function PercentageIndicator(props: PercentageIndicatorProps): JSX.Element {\n const percentageToFixed = getPercentageToFixed(props.percentage);\n\n const size = props.size ||\n (props.layout === PercentageIndicatorLayout.LabelInside\n ? ProgressCircleSize.Large\n : ProgressCircleSize.Small\n );\n\n const label = props.customLabel || getFormattedPercentage(percentageToFixed);\n\n if (props.layout === PercentageIndicatorLayout.LabelOnly)\n return (\n <span className={getColouredLabelClassName(percentageToFixed)}>\n {label}\n </span>\n );\n\n return (\n <div className={`d-flex align-items-center justify-content-between ${props.className ?? ''}`}>\n {props.layout === PercentageIndicatorLayout.LabelBefore &&\n <span className='me-2'>\n {label}\n </span>\n }\n <div className={getCircleContainerClassName(size, percentageToFixed)}>\n <ProgressCircle percentage={percentageToFixed} size={size} scoreThresholds={props.scoreThresholds} />\n {props.layout === PercentageIndicatorLayout.LabelInside &&\n <span className={styles.centredPercentageText}>\n {label}\n </span>\n }\n </div>\n </div>\n );\n}","import { ScoreThresholdDefaults, ScoreThresholds } from 'libs/shared/constants/ScoreThresholds';\n\nimport styles from './percentage-indicator.scss';\n\n/**\n * Values for width and strokeWidth are taken from progress-circle.scss.\n * If either are changed, they must be updated in both places.\n */\nconst CIRCLE_WIDTH = 2; // rem\nconst CIRCLE_WIDTH_LG = 5.8; // rem\nconst CIRCLE_STROKE_WIDTH = 0.2; // rem\nconst CIRCLE_STROKE_WIDTH_LG = 0.36; // rem\n \nexport enum ProgressCircleSize {\n Small = 'small',\n Large = 'large',\n ExtraSmall = 'extraSmall'\n}\n\nconst ProgressCircleSizeMap = {\n [ProgressCircleSize.ExtraSmall]: {\n size: CIRCLE_WIDTH\n },\n [ProgressCircleSize.Small]: {\n size: CIRCLE_WIDTH\n },\n [ProgressCircleSize.Large]: {\n size: CIRCLE_WIDTH_LG\n }\n};\n\n/**\n * radius = width / 2 - strokeWidth * 2\n */\nexport function getCircleRadius(size: ProgressCircleSize): string {\n const width = ProgressCircleSizeMap[size].size;\n const strokeWidth = size === ProgressCircleSize.Large ? CIRCLE_STROKE_WIDTH_LG : CIRCLE_STROKE_WIDTH;\n return `${width / 2 - strokeWidth * 2}rem`;\n}\n \nexport function getCircleClassName(\n percentage: number,\n scoreThresholds: ScoreThresholds = ScoreThresholdDefaults\n): string {\n if (percentage >= scoreThresholds.HIGH)\n return styles.circleSuccess;\n \n if (percentage >= scoreThresholds.MODERATE)\n return styles.circleWarning;\n \n return styles.circleDanger;\n}\n \nexport function getColouredLabelClassName(\n percentage: number,\n scoreThresholds: ScoreThresholds = ScoreThresholdDefaults\n): string {\n if (percentage >= scoreThresholds.HIGH)\n return 'text-success';\n \n if (percentage >= scoreThresholds.MODERATE)\n return 'text-warning';\n \n return 'text-danger';\n}\n \nexport function getCircleContainerClassName(size: ProgressCircleSize, percentage?: number): string {\n let className = `d-inline-block ${styles.circleContainer}`;\n \n if (size === ProgressCircleSize.Large)\n className += ` ${styles.lgCircleContainer}`;\n\n if (size === ProgressCircleSize.ExtraSmall)\n className += ` ${styles.xsCircleContainer}`;\n\n if (isPending(percentage))\n className += ` ${styles.pendingCircle}`;\n \n return className;\n}\n\nexport function getPercentageToFixed(percentage?: number): number | undefined {\n if (isPending(percentage))\n return;\n \n return +percentage.toFixed(2);\n}\n \nexport function getFormattedPercentage(percentage?: number): string {\n if (isPending(percentage))\n return `--%`;\n\n return `${Math.round(percentage * 100)}%`;\n}\n\nexport function isPending(percentage?: number): boolean {\n return typeof percentage !== 'number';\n}","export 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\"};","// extracted by mini-css-extract-plugin\nexport default {\"circleContainer\":\"p8Vgz\",\"backgroundCircle\":\"asGGE\",\"circleSuccess\":\"PXLNj\",\"circleWarning\":\"ZckRN\",\"circleDanger\":\"slBRg\",\"lgCircleContainer\":\"N8KCI\",\"xsCircleContainer\":\"RPqZ2\",\"pendingCircle\":\"DKrcq\",\"centredPercentageText\":\"tpmLR\"};"],"names":["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","anonSessions","anonymiseUsers","hasResults","Header","accessor","u","Cell","value","disableSortBy","sortType","sortDescFirst","correct","answered","width","useGetResultColumns","onColumnHover","refreshData","index","row","original","useGetResultsTableData","sortBy","filterBy","forEach","s","push","sorted","ArrayHelper","student","user","desc","reverse","highlightColumns","tableEl","highlightIndex","rows","querySelectorAll","childNodes","col","colIdx","classList","remove","add","highlightRows","rowIdx","getSortStudents","shouldFilterStudent","filter","PercentageIndicatorLayout","ProgressCircle","circle","radius","r","baseVal","circumference","Math","PI","offset","strokeDasharray","strokeDashoffset","toString","size","scoreThresholds","percentageToFixed","LabelInside","label","customLabel","LabelOnly","LabelBefore","defaultProps","CircleOnly","ProgressCircleSize","CIRCLE_STROKE_WIDTH","CIRCLE_STROKE_WIDTH_LG","ProgressCircleSizeMap","ExtraSmall","Small","Large","getCircleRadius","strokeWidth","getCircleClassName","HIGH","MODERATE","getColouredLabelClassName","getCircleContainerClassName","isPending","getPercentageToFixed","toFixed","getFormattedPercentage","round","InteractiveAnswerStatus","notApplicable","isMissingWordCorrect","getStudentAnswer","items","actionableItems","a","isCorrect","every","name","trim","toLowerCase","isMultipleChoiceCorrect","studentAnswer","getGetStudentAnswer","result","attempt","attempts","answers","wrapIsMultipleChoiceCorrect","answer","text","wrapIsMarkableAnswerMarkedCorrect","item","status","isMarkableAnswerMarkedCorrect","IsCorrectLookup","isInteractionCorrect","isCorrectFn","interactionRequiresAnswer","flattenInteractions","getStudentResult","getStudentAttempt","interactionId","getInteractions"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[5099],{70376:(t,e,r)=>{r.d(e,{W:()=>u});var n=r(32735),a=r(91967);function i(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}var o=5e3;function u(t){var e,r,u=arguments.length>1&&void 0!==arguments[1]?arguments[1]:o,s=(e=n.useState(!1),r=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,a,i,o,u=[],s=!0,c=!1;try{if(i=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;s=!1}else for(;!(s=(n=i.call(r)).done)&&(u.push(n.value),u.length!==e);s=!0);}catch(t){c=!0,a=t}finally{try{if(!s&&null!=r.return&&(o=r.return(),Object(o)!==o))return}finally{if(c)throw a}}return u}}(e,r)||function(t,e){if(t){if("string"==typeof t)return i(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?i(t,e):void 0}}(e,r)||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.")}()),c=s[0],l=s[1],f=n.useRef(null),d=function(){l((function(t){return!t})),f.current=window.setTimeout(d,u)};return n.useEffect((function(){f.current=window.setTimeout(d,u)}),[]),n.useEffect((function(){a.q.isFunction(t)&&t()}),[c]),function(){return window.clearTimeout(f.current)}}},5255:(t,e,r)=>{r.d(e,{Y:()=>u});var n=r(70376),a=r(20354),i=r(30439);function o(t){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},o(t)}function u(t){var e,r=a.a.useGetFetch(),u=t&&i.o.getAnonSessions(t),s=a.a.useBasicFetch(u);return(0,n.W)((function(){return r(u)}),5e3),(null===(e=s.data)||void 0===e?void 0:e.length)?s.data.reduce((function(t,e){return Object.assign(Object.assign({},t),(r={},n=e.sessionId,a=e,(n=function(t){var e=function(t){if("object"!=o(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var r=e.call(t,"string");if("object"!=o(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==o(e)?e:e+""}(n))in r?Object.defineProperty(r,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[n]=a,r));var r,n,a}),{}):{}}},74901:(t,e,r)=>{function n(t){return function(t){if(Array.isArray(t))return a(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(t){if("string"==typeof t)return a(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?a(t,e):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function a(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}r.d(e,{K:()=>i});var i=function(t){var e=[],r=[];return t.users&&e.push.apply(e,n(t.users)),t.classrooms&&r.push.apply(r,n(t.classrooms)),t.classroomGroups&&r.push.apply(r,n(t.classroomGroups)),{userId:e,groupId:r}}},94644:(t,e,r)=>{r.d(e,{r:()=>l});var n=r(50242),a=r(81886),i=r(67058),o=r(14553),u=r(49267),s=r(49075),c={notFound:i.d,forbidden:{rating:o.q,yearLevel:o.q,region:u.a,privacy:o.q},badRequest:s._,internalServerError:s._};function l(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(t){var i;i="number"==typeof t?t:t.status;var o=Object.assign(Object.assign({},c),e);i&&a.Q.Ry.isStatusCodeError(i)&&(i!==n.o.InternalServer?i!==n.o.NotFound?i!==n.o.Forbidden?r.badRequest||a.Q.Ry.throw(new o.badRequest):r.forbidden||a.Q.Ry.throw(new o.forbidden.privacy):r.notFound||a.Q.Ry.throw(new o.notFound):r.internalServerError||a.Q.Ry.throw(new s._))}}},91286:(t,e,r)=>{r.d(e,{v:()=>o});var n=r(32735),a=r(94644);function i(t){return t.map((function(t){return t.statusCode})).join(":")}function o(t,e,r){var o=Array.isArray(t)?t:[t];(0,n.useEffect)((function(){o.forEach((function(t){(0,a.r)(t.statusCode,e,r)}))}),[i(o),e,r])}},24191:(t,e,r)=>{r.r(e),r.d(e,{InteractiveInsightsQuestionsView:()=>F});var n=r(32735),a=r(23481),i=r(2948),o=r(20354),u=r(5255),s=r(41196),c=r(26025),l=r(74901),f=r(40003),d=r(38143),v=r(16714),y=r(39151),b=r(20768),m=r(91286),h=r(93322),p=r(22902),g=r(79612),w=r(37802),S=r(53936),A=r(68536),I=r(10447);function j(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}var O=a.T.encloseNamespace("shared.interactiveInsightsQuestionsView");function F(t){var e,r,a,F,E,R=(F=(0,i.D)(d.g.ANONYMISE_USERS),E=1,function(t){if(Array.isArray(t))return t}(F)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,a,i,o,u=[],s=!0,c=!1;try{if(i=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;s=!1}else for(;!(s=(n=i.call(r)).done)&&(u.push(n.value),u.length!==e);s=!0);}catch(t){c=!0,a=t}finally{try{if(!s&&null!=r.return&&(o=r.return(),Object(o)!==o))return}finally{if(c)throw a}}return u}}(F,E)||function(t,e){if(t){if("string"==typeof t)return j(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?j(t,e):void 0}}(F,E)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];(0,h.F)();var k=(0,w.r)(null).hasShareFlowV2,C=(0,p.T)().hasPermissions,T=o.a.useBasicFetch(y.L.config()),q=o.a.useBasicFetch(b.b.interactiveMetadata(t.interactiveId)),B=o.a.useBasicFetch((null===(e=q.data)||void 0===e?void 0:e.interactiveId)&&b.b.interactive(q.data.interactiveId)),_=(0,u.Y)(t.shareId),M=c.B.getAudienceAppLinkParams(),P=c.B.getDateRangeAppLinkParams(),Q=(0,s.W)(t.interactiveId,Object.assign(Object.assign({},(0,f.wO)((0,f.Hb)(),P)),(0,l.K)(M)),!0);(0,g.M)({title:q.data?O("pageTitle",{video:null===(r=q.data)||void 0===r?void 0:r.name}):null}),(0,m.v)([B,q,Q]);var U=B.data&&q.data&&!!Q.data,L=Object.assign(Object.assign(Object.assign({},M),P),{shareId:t.shareId});return n.createElement("div",{className:"px-3"},n.createElement(S.j,{dateRangeAppLinkParams:P,tabs:(0,I.kj)(t.interactiveId,"questions",L),video:q.data,hasAnalytics:C(v.C.ViewCustomerAnalytics),analyticsWebUrl:null===(a=T.data)||void 0===a?void 0:a.analyticsWebUrl,hasShareFlowV2:k,shareId:t.shareId}),n.createElement(A.x,{interactive:B.data,interactiveMetadata:q.data,interactionId:t.interactionId,config:T.data,sortBy:t.sortBy,isFetching:Q.isFetching||B.isFetching,anonymiseUsers:R,results:Q.data,hasDataLoaded:U,anonSessions:_}))}}}]);
2
+ //# sourceMappingURL=5099-297f8cd028-lite.chunk.js.map