@clickview/lite 0.75.0-rc.8 → 0.75.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/dist/bundles.json +1 -1
  2. package/dist/css/{7103-lite-fef3024f61.chunk.css → 2878-lite-d8e0bf912a.chunk.css} +1 -1
  3. package/dist/css/{1243-lite-13eda8f6a0.chunk.css → 3615-lite-240342ff8e.chunk.css} +1 -1
  4. package/dist/css/{1867-lite-8baa8af02b.chunk.css → 4630-lite-0157b1c437.chunk.css} +1 -1
  5. package/dist/css/{4203-lite-9ffab89741.chunk.css → 8362-lite-10810fdef2.chunk.css} +1 -1
  6. package/dist/languages/en.json +1 -1
  7. package/dist/scripts/{104-7ee25cbbb8-lite.chunk.js → 104-da7394bcfa-lite.chunk.js} +2 -2
  8. package/dist/scripts/104-da7394bcfa-lite.chunk.js.map +1 -0
  9. package/dist/scripts/1192-bb27568f21-lite.chunk.js +2 -0
  10. package/dist/scripts/1192-bb27568f21-lite.chunk.js.map +1 -0
  11. package/dist/scripts/1199-cf2cb206b5-lite.chunk.js +2 -0
  12. package/dist/scripts/1199-cf2cb206b5-lite.chunk.js.map +1 -0
  13. package/dist/scripts/1502-9836df10cd-lite.chunk.js +2 -0
  14. package/dist/scripts/1502-9836df10cd-lite.chunk.js.map +1 -0
  15. package/dist/scripts/{1610-9ccecc428a-lite.chunk.js → 1610-0edaa98d40-lite.chunk.js} +2 -2
  16. package/dist/scripts/{1610-9ccecc428a-lite.chunk.js.map → 1610-0edaa98d40-lite.chunk.js.map} +1 -1
  17. package/dist/scripts/{7103-3b181ec69b-lite.chunk.js → 2878-487c4a8e1a-lite.chunk.js} +2 -2
  18. package/dist/scripts/2878-487c4a8e1a-lite.chunk.js.map +1 -0
  19. package/dist/scripts/{3057-1ae8087b3a-lite.chunk.js → 3057-a5bc753736-lite.chunk.js} +1 -1
  20. package/dist/scripts/{3057-1ae8087b3a-lite.chunk.js.map → 3057-a5bc753736-lite.chunk.js.map} +1 -1
  21. package/dist/scripts/3268-7be966dc82-lite.chunk.js +3 -0
  22. package/dist/scripts/3268-7be966dc82-lite.chunk.js.map +1 -0
  23. package/dist/scripts/{1243-72f3d31787-lite.chunk.js → 3615-a0da361aa5-lite.chunk.js} +2 -2
  24. package/dist/scripts/3615-a0da361aa5-lite.chunk.js.map +1 -0
  25. package/dist/scripts/{3872-6fe7371d39-lite.chunk.js → 3872-cf9a6bdae8-lite.chunk.js} +1 -1
  26. package/dist/scripts/{3872-6fe7371d39-lite.chunk.js.map → 3872-cf9a6bdae8-lite.chunk.js.map} +1 -1
  27. package/dist/scripts/4125-6d34b8b8f2-lite.chunk.js +2 -0
  28. package/dist/scripts/4125-6d34b8b8f2-lite.chunk.js.map +1 -0
  29. package/dist/scripts/4208-f22ed7a148-lite.chunk.js +2 -0
  30. package/dist/scripts/4208-f22ed7a148-lite.chunk.js.map +1 -0
  31. package/dist/scripts/4598-e25e9e03d6-lite.chunk.js +2 -0
  32. package/dist/scripts/4598-e25e9e03d6-lite.chunk.js.map +1 -0
  33. package/dist/scripts/{1867-0823a787c3-lite.chunk.js → 4630-4a35ecbf2b-lite.chunk.js} +2 -2
  34. package/dist/scripts/4630-4a35ecbf2b-lite.chunk.js.map +1 -0
  35. package/dist/scripts/6475-f019242ec2-lite.chunk.js +2 -0
  36. package/dist/scripts/6475-f019242ec2-lite.chunk.js.map +1 -0
  37. package/dist/scripts/6550-1d60d863e8-lite.chunk.js +2 -0
  38. package/dist/scripts/6550-1d60d863e8-lite.chunk.js.map +1 -0
  39. package/dist/scripts/{6695-4e01b4a18c-lite.chunk.js → 6695-4ae0acad94-lite.chunk.js} +1 -1
  40. package/dist/scripts/{6695-4e01b4a18c-lite.chunk.js.map → 6695-4ae0acad94-lite.chunk.js.map} +1 -1
  41. package/dist/scripts/6756-3c7f911759-lite.chunk.js +3 -0
  42. package/dist/scripts/6756-3c7f911759-lite.chunk.js.map +1 -0
  43. package/dist/scripts/6790-1695fcf576-lite.chunk.js +2 -0
  44. package/dist/scripts/6790-1695fcf576-lite.chunk.js.map +1 -0
  45. package/dist/scripts/{7148-50ccb48a44-lite.chunk.js → 7148-e314dd9a4e-lite.chunk.js} +2 -2
  46. package/dist/scripts/7148-e314dd9a4e-lite.chunk.js.map +1 -0
  47. package/dist/scripts/7438-35b887a48e-lite.chunk.js +2 -0
  48. package/dist/scripts/7438-35b887a48e-lite.chunk.js.map +1 -0
  49. package/dist/scripts/{8323-d6d1d07ce5-lite.chunk.js → 8323-5694456903-lite.chunk.js} +2 -2
  50. package/dist/scripts/{8323-d6d1d07ce5-lite.chunk.js.map → 8323-5694456903-lite.chunk.js.map} +1 -1
  51. package/dist/scripts/{4203-83f90f92f3-lite.chunk.js → 8362-ed5df8f4fc-lite.chunk.js} +3 -3
  52. package/dist/scripts/8362-ed5df8f4fc-lite.chunk.js.LICENSE.txt +1 -0
  53. package/dist/scripts/{4203-83f90f92f3-lite.chunk.js.map → 8362-ed5df8f4fc-lite.chunk.js.map} +1 -1
  54. package/dist/scripts/{8732-3e8332e620-lite.chunk.js → 8732-dc5182fb69-lite.chunk.js} +1 -1
  55. package/dist/scripts/{8732-3e8332e620-lite.chunk.js.map → 8732-dc5182fb69-lite.chunk.js.map} +1 -1
  56. package/dist/scripts/8856-08061bbec5-lite.chunk.js +2 -0
  57. package/dist/scripts/8856-08061bbec5-lite.chunk.js.map +1 -0
  58. package/dist/scripts/{8957-bc83ea1180-lite.chunk.js → 8957-b3f0dbb85d-lite.chunk.js} +1 -1
  59. package/dist/scripts/{8957-bc83ea1180-lite.chunk.js.map → 8957-b3f0dbb85d-lite.chunk.js.map} +1 -1
  60. package/dist/scripts/9042-7c30ffd4f0-lite.chunk.js +2 -0
  61. package/dist/scripts/9042-7c30ffd4f0-lite.chunk.js.map +1 -0
  62. package/dist/scripts/9134-b0ae877597-lite.chunk.js +2 -0
  63. package/dist/scripts/9134-b0ae877597-lite.chunk.js.map +1 -0
  64. package/dist/scripts/{bundle-58c25f6529.min.js → bundle-941a464ef0.min.js} +3 -3
  65. package/dist/scripts/{bundle-58c25f6529.min.js.map → bundle-941a464ef0.min.js.map} +1 -1
  66. package/package.json +1 -1
  67. package/dist/scripts/104-7ee25cbbb8-lite.chunk.js.map +0 -1
  68. package/dist/scripts/1074-6dadbd8187-lite.chunk.js +0 -2
  69. package/dist/scripts/1074-6dadbd8187-lite.chunk.js.map +0 -1
  70. package/dist/scripts/1192-6ac54d734b-lite.chunk.js +0 -2
  71. package/dist/scripts/1192-6ac54d734b-lite.chunk.js.map +0 -1
  72. package/dist/scripts/1199-1cddf4e0e0-lite.chunk.js +0 -2
  73. package/dist/scripts/1199-1cddf4e0e0-lite.chunk.js.map +0 -1
  74. package/dist/scripts/1243-72f3d31787-lite.chunk.js.map +0 -1
  75. package/dist/scripts/1867-0823a787c3-lite.chunk.js.map +0 -1
  76. package/dist/scripts/3268-aa893d0068-lite.chunk.js +0 -2
  77. package/dist/scripts/3268-aa893d0068-lite.chunk.js.map +0 -1
  78. package/dist/scripts/4208-3ba21abb7c-lite.chunk.js +0 -2
  79. package/dist/scripts/4208-3ba21abb7c-lite.chunk.js.map +0 -1
  80. package/dist/scripts/4598-f5120153c2-lite.chunk.js +0 -2
  81. package/dist/scripts/4598-f5120153c2-lite.chunk.js.map +0 -1
  82. package/dist/scripts/6475-502e390010-lite.chunk.js +0 -2
  83. package/dist/scripts/6475-502e390010-lite.chunk.js.map +0 -1
  84. package/dist/scripts/6550-c621babbcb-lite.chunk.js +0 -2
  85. package/dist/scripts/6550-c621babbcb-lite.chunk.js.map +0 -1
  86. package/dist/scripts/6756-20c0ab9591-lite.chunk.js +0 -3
  87. package/dist/scripts/6756-20c0ab9591-lite.chunk.js.map +0 -1
  88. package/dist/scripts/6790-df00506bec-lite.chunk.js +0 -2
  89. package/dist/scripts/6790-df00506bec-lite.chunk.js.map +0 -1
  90. package/dist/scripts/7103-3b181ec69b-lite.chunk.js.map +0 -1
  91. package/dist/scripts/7148-50ccb48a44-lite.chunk.js.map +0 -1
  92. package/dist/scripts/7438-1162aba8b6-lite.chunk.js +0 -2
  93. package/dist/scripts/7438-1162aba8b6-lite.chunk.js.map +0 -1
  94. package/dist/scripts/8856-8ac95bf4e0-lite.chunk.js +0 -2
  95. package/dist/scripts/8856-8ac95bf4e0-lite.chunk.js.map +0 -1
  96. package/dist/scripts/9003-36ab592cc5-lite.chunk.js +0 -2
  97. package/dist/scripts/9003-36ab592cc5-lite.chunk.js.map +0 -1
  98. package/dist/scripts/9042-3092af11d5-lite.chunk.js +0 -2
  99. package/dist/scripts/9042-3092af11d5-lite.chunk.js.map +0 -1
  100. package/dist/scripts/9134-7037c2c47a-lite.chunk.js +0 -2
  101. package/dist/scripts/9134-7037c2c47a-lite.chunk.js.map +0 -1
  102. /package/dist/scripts/{4203-83f90f92f3-lite.chunk.js.LICENSE.txt → 3268-7be966dc82-lite.chunk.js.LICENSE.txt} +0 -0
  103. /package/dist/scripts/{6756-20c0ab9591-lite.chunk.js.LICENSE.txt → 6756-3c7f911759-lite.chunk.js.LICENSE.txt} +0 -0
  104. /package/dist/scripts/{8323-d6d1d07ce5-lite.chunk.js.LICENSE.txt → 8323-5694456903-lite.chunk.js.LICENSE.txt} +0 -0
  105. /package/dist/scripts/{bundle-58c25f6529.min.js.LICENSE.txt → bundle-941a464ef0.min.js.LICENSE.txt} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/6475-f019242ec2-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/share-v2/components/share-avatar/ShareAvatar.tsx","file:///app/packages/libs/shared/src/enums/IntegrationId.ts","file:///app/packages/libs/shared/src/utils/IntegrationHelper.ts","file:///app/packages/libs/shared/src/apps/share-v2/components/share-view-count/ShareViewCount.tsx","file:///app/packages/libs/shared/src/apps/share-v2/components/share-viewed-by-count/ShareViewedByCount.tsx","file:///app/packages/projects/lite/src/apps/assign/components/previous-assignments/previous-assignments.scss","file:///app/packages/projects/lite/src/apps/assign/components/previous-assignments/PreviousAssignments.tsx","file:///app/packages/projects/lite/src/apps/assign/views/show-assignments-view/empty-states/shares-and-assignments-empty-state/SharesAndAssignmentsEmptyState.tsx","file:///app/packages/projects/lite/src/apps/assign/views/show-assignments-view/empty-states/shares-empty-state/SharesEmptyState.tsx","file:///app/packages/projects/lite/src/apps/assign/views/show-assignments-view/ShowAssignmentsView.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":["import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { IconCircle } from 'libs/shared/components/icon-circle/IconCircle';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { SharePrivacy } from '../../enums/SharePrivacy';\nimport { ShareType } from '../../enums/ShareType';\n\nconst namespace = 'sharev2.shareAvatar';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst icons = {\n [ShareType.Open]: cvSvgLibrary.Classrooms,\n [ShareType.Link]: cvSvgLibrary.Link,\n [ShareType.Classroom]: cvSvgLibrary.Classrooms,\n [ShareType.Live]: cvSvgLibrary.Play,\n [ShareType.LegacyDirect]: cvSvgLibrary.Share\n};\n\nconst iconColours = {\n [ShareType.Open]: 'blue',\n [ShareType.Link]: 'black',\n [ShareType.Classroom]: 'teal',\n [ShareType.Live]: 'purple',\n [ShareType.LegacyDirect]: 'indigo'\n};\n\nconst shareTypeTitlePhraseMap = {\n [ShareType.Open]: 'openShareType',\n [ShareType.Link]: 'linkShareType',\n [ShareType.Classroom]: 'classroomShareType',\n [ShareType.Live]: 'liveShareType',\n [ShareType.LegacyDirect]: 'legacyDirectShareType'\n};\n\nfunction getTitle({ type, classroomName, additionalTitleText }: ShareAvatarProps) {\n if (type === ShareType.Classroom && classroomName)\n return classroomName;\n\n let title = getPhrase(shareTypeTitlePhraseMap[type]);\n\n if (additionalTitleText)\n title += ' ' + additionalTitleText;\n\n return title;\n}\n\nfunction getClassroomSubtitle(classroomGroupCount: number, studentCount: number): string {\n if (classroomGroupCount && studentCount)\n return `${getPhrase('classroomGroupCount', { smartCount: classroomGroupCount })}, ${getPhrase('studentSubTitle', { smartCount: studentCount })}`;\n\n if (classroomGroupCount)\n return getPhrase('groupSubTitle', { smartCount: classroomGroupCount });\n\n if (studentCount)\n return getPhrase('studentSubTitle', { smartCount: studentCount });\n\n return getPhrase('allStudentsSubTitle');\n}\n\nfunction getLinkSubtitle(privacy: SharePrivacy) {\n if ([ SharePrivacy.JustMySchool, SharePrivacy.Protected ].includes(privacy))\n return getPhrase('respectRatingsSubTitle');\n\n if (privacy === SharePrivacy.JustMySchoolOverrideRestriction)\n return getPhrase('anyoneInSchoolSubTitle');\n\n if (privacy === SharePrivacy.ProtectedOverrideRestriction)\n return getPhrase('anyoneSignedInSubTitle');\n\n if (privacy === SharePrivacy.Public)\n return getPhrase('anyoneWithLinkSubTitle');\n\n if (privacy === SharePrivacy.PinCode)\n return getPhrase('anyoneWithPinSubTitle');\n}\n\nfunction getSubtitle({ type, privacy, studentCount = 0, classroomGroupCount = 0 }: ShareAvatarProps) {\n switch (type) {\n case ShareType.Classroom:\n return getClassroomSubtitle(classroomGroupCount, studentCount);\n\n case ShareType.Open:\n return getPhrase('openShareTypeSubTitle');\n\n case ShareType.Link:\n return getLinkSubtitle(privacy);\n \n case ShareType.Live:\n return getPhrase('liveShareTypeSubTitle');\n\n case ShareType.LegacyDirect:\n return getPhrase('legacyDirectTypeSubTitle');\n\n default:\n return getPhrase('publicShareTypeSubTitle');\n }\n}\n\ninterface ShareAvatarProps {\n type: ShareType;\n privacy: SharePrivacy;\n studentCount?: number;\n classroomGroupCount?: number;\n classroomName?: string;\n hideSubtitle?: boolean;\n subtitleText?: string;\n svgSize?: SvgContainerSize;\n additionalTitleText?: string;\n className?: string;\n}\n\nexport function ShareAvatar(props: ShareAvatarProps): JSX.Element {\n return (\n <div className={classNames('d-flex align-items-center gap-2', props.className)}>\n <div>\n <IconCircle\n svgName={icons[props.type]}\n variant={iconColours[props.type]}\n textVariant='white'\n svgWrapperClassName='p-1'\n svgSize={props.svgSize ?? SvgContainerSize.Standard}\n />\n </div>\n <div className='d-flex flex-column'>\n <p className='m-0'>{getTitle(props)}</p>\n {!props.hideSubtitle && <span className='text-secondary'>{props.subtitleText ?? getSubtitle(props)}</span>}\n </div>\n </div>\n );\n}","export enum IntegrationId {\n GoogleClassroom = 'google-classroom',\n MicrosoftTeams = 'microsoft-teams',\n Vivi = 'vivi',\n AppleTv = 'apply-tv'\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { IntegrationId } from 'libs/shared/enums/IntegrationId';\nimport { SettingName } from 'libs/shared/enums/SettingName';\nimport { Integration } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.shared-utils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const IntegrationHelper = {\n getShareIntegrations(googleClassroomSetting: boolean, msftTeamsSetting: boolean): Integration[] {\n return [\n {\n id: IntegrationId.GoogleClassroom,\n name: getPhrase('googleClassroom'),\n enabled: googleClassroomSetting,\n settingName: SettingName.ShareToGoogleClassroom\n },\n {\n id: IntegrationId.MicrosoftTeams,\n name: getPhrase('msftTeams'),\n enabled: msftTeamsSetting,\n settingName: SettingName.ShareToMicrosoftTeams\n }\n ];\n }\n};\n","import React from 'react';\n\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MasterType } from 'libs/shared/enums/MasterType';\n\nconst namespace = 'sharev2.shareViewCount';\n\ninterface ShareViewCountProps {\n share: Share;\n}\n\nexport function ShareViewCount(props: ShareViewCountProps): JSX.Element {\n const isCollection = [ MasterType.Playlist, MasterType.Series ].includes(props.share.objectTypeId);\n \n if (isCollection)\n return <span>-</span>;\n\n return <Text namespace={namespace} phrase='viewCount' options={{ smartCount: props.share.viewCount || 0 }} />;\n}","import React from 'react';\n\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\ninterface ShareViewedByCountProps {\n share: Share;\n}\n\nexport function ShareViewedByCount(props: ShareViewedByCountProps): JSX.Element {\n const isCollection = [ MasterType.Playlist, MasterType.Series ].includes(props.share.objectTypeId);\n\n if (isCollection)\n return <span>-</span>;\n \n function getViewCount(): string {\n const shareAccessCount = props.share.accessCount || 0;\n if (props.share.type === ShareType.Open)\n return `${shareAccessCount}`;\n\n if (props.share.type === ShareType.Classroom) {\n const totalRecipients = props.share.recipients.length;\n return `${shareAccessCount}/${totalRecipients}`;\n }\n\n return `${shareAccessCount}`;\n }\n \n return (\n <span className='d-inline-flex flex-row gap-2 align-items-center'>\n <SvgContainer svgName={cvSvgLibrary.User} />\n <span>{getViewCount()}</span>\n </span>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"shareListItem\":\"vLROV\",\"visibleOnHover\":\"o2KJH\"};","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\nimport Scrollbars from 'react-custom-scrollbars-2';\nimport { format as formatDate } from 'timeago.js';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { ShareAvatar } from 'libs/shared/apps/share-v2/components/share-avatar/ShareAvatar';\nimport { ShareViewCount } from 'libs/shared/apps/share-v2/components/share-view-count/ShareViewCount';\nimport { ShareViewedByCount } from 'libs/shared/apps/share-v2/components/share-viewed-by-count/ShareViewedByCount';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { ShareHelper } from 'libs/shared/apps/share-v2/utils/ShareHelper';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { Classroom } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './previous-assignments.scss';\n\nconst namespace = 'assign.previousAssignments';\n\ninterface PreviousAssignmentsHeaderProps {\n count: number;\n show: boolean;\n onToggle: () => void;\n}\n\nfunction PreviousAssignmentsHeader(props: PreviousAssignmentsHeaderProps): JSX.Element {\n return (\n <div className={classNames('d-flex align-items-center justify-content-between', props.show && 'mb-3')}>\n <h3 className='h6 m-0 p-0'><Text namespace={namespace} phrase='heading' options={{ count: props.count }} /></h3>\n <IconButton\n svgName={props.show ? cvSvgLibrary.ChevronUp : cvSvgLibrary.ChevronDown}\n onClick={props.onToggle}\n />\n </div>\n );\n}\n\nexport function PreviousAssignmentsListHeader(): JSX.Element {\n const columnClassNames = 'd-flex align-items-end justify-content-start fw-medium';\n \n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <Row className='gx-2 px-3 mb-2'>\n <Col xs={4} className={columnClassNames}>\n <Text phrase='assignedTo' />\n </Col>\n <Col xs={2} className={columnClassNames}>\n <Text phrase='views' />\n </Col>\n <Col xs={2} className={columnClassNames}>\n <Text phrase='viewedBy' />\n </Col>\n <Col xs={4} className={columnClassNames}>\n <Text phrase='dateCreated' />\n </Col>\n </Row>\n </LanguageNamespaceContext.Provider>\n );\n}\n\ntype ItemAnalytics = {\n data: HashObject;\n options: AnalyticsOptions;\n}\ninterface PreviousAssignmentListItemProps {\n share: Share;\n classrooms: Classroom[];\n getItemAppLink: (share: Share) => Core.AppLink;\n\n getItemAnalytics?: (share: Share) => ItemAnalytics;\n className?: string;\n}\n\nfunction PreviousAssignmentListItem(props: PreviousAssignmentListItemProps): JSX.Element {\n const shareClassroom = ShareHelper.getClassroomForShare(props.share, props.classrooms);\n\n const analytics = props.getItemAnalytics?.(props.share);\n\n return (\n <AppLink\n key={props.share.shareId}\n appLink={props.getItemAppLink(props.share)}\n analyticsData={analytics?.data}\n analyticsOptions={analytics?.options}\n className={classNames('d-block p-3 hover-bg-light-blue border border-top-0 no-hover-text-underline', styles.shareListItem, props.className)}\n >\n <Row className='gx-2'>\n <Col xs={4} className='d-flex align-items-center'>\n <ShareAvatar\n type={props.share.type}\n privacy={props.share.privacy}\n classroomName={shareClassroom?.name}\n svgSize={SvgContainerSize.Small}\n hideSubtitle\n />\n </Col>\n <Col xs={2} className='d-flex align-items-center justify-content-start'>\n <ShareViewCount share={props.share} />\n </Col>\n <Col xs={2} className='d-flex align-items-center justify-content-start'>\n <ShareViewedByCount share={props.share} />\n </Col>\n <Col xs={4} lg={3} className='d-flex align-items-center justify-content-start'>\n <span>{formatDate(props.share.dateCreated)}</span>\n </Col>\n <Col lg={1} className='align-items-center justify-content-end d-none d-lg-flex'>\n <span className={classNames('cursor-pointer text-info hover-text-underline', styles.visibleOnHover)}>\n <Text namespace={namespace} phrase='view' />\n </span>\n </Col>\n </Row>\n </AppLink>\n );\n}\n\ninterface PreviousAssignmentsListProps {\n assignments: Share[];\n classrooms: Classroom[];\n getItemAppLink: (share: Share) => Core.AppLink;\n getItemAnalytics?: (share: Share, yIndex: number) => ItemAnalytics;\n scrollHeightMax?: number;\n}\n\nexport function PreviousAssignmentsList(props: PreviousAssignmentsListProps): JSX.Element {\n return (\n <div className={classNames(\n 'd-flex flex-column border-top rounded-top overflow-hidden'\n )}>\n <Scrollbars\n autoHeight\n autoHeightMin={0}\n autoHeightMax={props.scrollHeightMax ?? 215}\n autoHide\n >\n {props.assignments.map((share, idx) => (\n <PreviousAssignmentListItem\n share={share}\n classrooms={props.classrooms}\n getItemAppLink={props.getItemAppLink}\n getItemAnalytics={share => props.getItemAnalytics?.(share, idx)}\n className={classNames(idx % 2 === 0 && 'bg-gray-100')}\n key={share.shareId}\n />\n ))}\n </Scrollbars>\n </div>\n );\n}\n\ninterface PreviousAssignmentsProps {\n show: boolean;\n assignments: Share[];\n classrooms: Classroom[];\n onToggle: () => void;\n getItemAppLink: (share: Share) => Core.AppLink;\n getItemAnalytics?: (share: Share, yIndex: number) => ItemAnalytics;\n}\n\nexport function PreviousAssignments(props: PreviousAssignmentsProps): JSX.Element {\n if (!props.assignments.length)\n return <></>;\n \n const noBottomPadding = props.show && props.assignments.length > 3;\n \n return (\n <div className={classNames('bg-white rounded-3 p-3', noBottomPadding && 'pb-0')}>\n <PreviousAssignmentsHeader count={props.assignments.length} onToggle={props.onToggle} show={props.show} />\n {props.show && (\n <>\n <PreviousAssignmentsListHeader />\n <PreviousAssignmentsList {...props} />\n </>\n )}\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nconst namespace = 'assign.sharesAndAssignmentsEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SharesAndAssignmentsEmptyStateProps {\n assignAppLink: Core.AppLink;\n shareLinkAppLink: Core.AppLink;\n}\n\nexport function SharesAndAssignmentsEmptyState(props: SharesAndAssignmentsEmptyStateProps): JSX.Element {\n return (\n <EmptyState className='py-4'>\n <EmptyState.Image\n size='small'\n src={ImageUrls.EmptyStates.Share.MY_SHARES}\n />\n <EmptyState.Heading><Text phrase='title' namespace={namespace} /></EmptyState.Heading>\n <EmptyState.Info><Text phrase='description' namespace={namespace} /></EmptyState.Info>\n <EmptyState.Cta\n icon={cvSvgLibrary.Share}\n text={getPhrase('ctaAssign')}\n appLink={props.assignAppLink}\n />\n <EmptyState.Cta\n className='text-dark hover-text-underline mt-3 fw-medium'\n text={getPhrase('ctaShareLink')}\n appLink={props.shareLinkAppLink}\n />\n </EmptyState>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nconst namespace = 'assign.sharesEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SharesEmptyStateProps {\n appLink: Core.AppLink;\n}\n\nexport function SharesEmptyState(props: SharesEmptyStateProps): JSX.Element {\n return (\n <EmptyState className='py-4'>\n <EmptyState.Image\n size='small'\n src={ImageUrls.EmptyStates.Share.MY_SHARES}\n />\n <EmptyState.Heading><Text phrase='title' namespace={namespace} /></EmptyState.Heading>\n <EmptyState.Info><Text phrase='description' namespace={namespace} /></EmptyState.Info>\n <EmptyState.Cta\n icon={cvSvgLibrary.Link}\n text={getPhrase('cta')}\n appLink={props.appLink}\n />\n </EmptyState>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { ShareRequests } from 'libs/shared/apps/share-v2/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { ShareHelper } from 'libs/shared/apps/share-v2/utils/ShareHelper';\nimport { SharableEntityType } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Classroom, PopupViewProps } from 'libs/shared/interfaces';\nimport { AnalyticsRouteHelper } from 'libs/shared/utils/AnalyticsRouteHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { getInsightsOverviewAppLink } from 'shared/utils/ObjectAppLinkHelper';\n\nimport { FlowControls } from 'apps/assign/components/flow-controls/FlowControls';\nimport { PreviousAssignmentsList, PreviousAssignmentsListHeader } from 'apps/assign/components/previous-assignments/PreviousAssignments';\nimport { useAssignSharedData } from 'apps/assign/hooks/useAssignSharedData';\nimport { AssignAppLinkHelper } from 'apps/assign/utils/AssignAppLinkHelper';\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { useIsTertiary } from 'apps/onboarding/hooks/useIsTertiary';\n\nimport { SharesAndAssignmentsEmptyState } from './empty-states/shares-and-assignments-empty-state/SharesAndAssignmentsEmptyState';\nimport { SharesEmptyState } from './empty-states/shares-empty-state/SharesEmptyState';\n\nconst namespace = 'assign.showAssignmentsView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst MAX_SCROLL_HEIGHT = 400;\n\nfunction sortByDateCreated(a: Share, b: Share) {\n if (!a || !b)\n return;\n\n if (DateHelper.isSame(a.dateCreated, b.dateCreated))\n return 0;\n\n if (DateHelper.isAfter(a.dateCreated, b.dateCreated))\n return 1;\n\n return -1;\n}\n\ninterface ViewInSchoolAnalyticsButtonProps {\n href: string;\n}\n\nfunction ViewInSchoolAnalyticsButton(props: ViewInSchoolAnalyticsButtonProps): JSX.Element {\n return (\n <a href={props.href} target='_blank' className='btn btn-link text-info'>\n <span className='pe-1'><Text phrase='viewInAnalytics' namespace={namespace} /></span>\n <SvgContainer svgName={cvSvgLibrary.NewWindow} size={SvgContainerSize.Small} />\n </a>\n );\n}\n\ninterface ShowAssignmentsEmptyStateProps {\n type: 'assign-and-shares' | 'shares';\n assignAppLink: Core.AppLink;\n shareAppLink: Core.AppLink;\n}\n\nfunction ShowAssignmentsEmptyState(props: ShowAssignmentsEmptyStateProps): JSX.Element {\n if (props.type === 'assign-and-shares') {\n return (\n <SharesAndAssignmentsEmptyState\n assignAppLink={props.assignAppLink}\n shareLinkAppLink={props.shareAppLink}\n />\n );\n }\n \n return <SharesEmptyState appLink={props.shareAppLink} />;\n}\n\ninterface ShowAssignmentsViewProps extends PopupViewProps {\n objectId: string;\n entityType: SharableEntityType;\n}\n\nexport function ShowAssignmentsView(props: ShowAssignmentsViewProps): JSX.Element {\n const sharedData = useAssignSharedData({\n objectId: props.objectId,\n entityType: props.entityType\n });\n\n const { hasPermissions } = usePermissions();\n const { hasShareFlowV2 } = useSettings(null);\n const isTertiary = useIsTertiary();\n\n const previousShares = Flight.useBasicFetch<Share[]>(ShareRequests.getSharesByObjectId(props.objectId));\n const assignments = previousShares.data?.sort(sortByDateCreated) || [];\n const previousAssignmentClassroomIds = ArrayHelper.uniq(\n assignments.map(ShareHelper.getClassroomIdFromShare).filter(x => !!x)\n );\n const classrooms = Flight.useBasicFetch<Classroom[]>(\n previousShares.hasCompleted &&\n ClassroomRequests.getClassroomsByIds(previousAssignmentClassroomIds, sharedData.currentUser.data?.customerId)\n );\n\n function getItemAppLink(share: Share) {\n const appLink = getInsightsOverviewAppLink(share);\n if (!appLink)\n return;\n\n return appLink;\n }\n\n const analyticsUrl = AnalyticsRouteHelper.getObjectUrl(\n sharedData.config.data?.analyticsWebUrl,\n sharedData.entity.data,\n hasShareFlowV2\n );\n \n const canViewSchoolAnalytics =\n hasPermissions(PermissionName.ViewAnalyticsProduct) &&\n hasPermissions(PermissionName.ViewCustomerAnalytics);\n\n const emptyStateType = (hasShareFlowV2 && isTertiary) ? 'shares' : 'assign-and-shares';\n\n const loaded = sharedData.loaded && !!previousShares.data && !!classrooms.data;\n\n return (\n <Popup\n size='lg'\n title={getPhrase('title')}\n showLoadingSpinner={!loaded}\n closePopup={props.closePopup}\n >\n {!assignments.length &&\n <ShowAssignmentsEmptyState\n assignAppLink={AssignAppLinkHelper.flowSelector({ entityType: props.entityType, objectId: props.objectId })}\n shareAppLink={{\n application: AppChannels.SHARE,\n action: Actions.Share.SHARE,\n args: [props.objectId],\n params: {\n entityType: props.entityType\n }\n }}\n type={emptyStateType}\n />\n }\n \n {!!assignments.length &&\n <>\n <PreviousAssignmentsListHeader />\n <PreviousAssignmentsList\n assignments={assignments.reverse()}\n classrooms={classrooms.data}\n getItemAppLink={getItemAppLink}\n scrollHeightMax={MAX_SCROLL_HEIGHT}\n />\n </>\n }\n <FlowControls\n hideNextButton\n hideCreateClassroomButton\n onClickBack={props.closePopup}\n backButtonText={getPhrase('close')}\n leftComponent={!!analyticsUrl && canViewSchoolAnalytics && <ViewInSchoolAnalyticsButton href={analyticsUrl} />}\n />\n </Popup>\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","icons","iconColours","shareTypeTitlePhraseMap","ShareAvatar","props","className","svgName","type","variant","textVariant","svgWrapperClassName","svgSize","S","classroomName","additionalTitleText","title","getTitle","hideSubtitle","subtitleText","privacy","studentCount","classroomGroupCount","smartCount","getClassroomSubtitle","includes","getLinkSubtitle","getSubtitle","IntegrationId","IntegrationHelper","getShareIntegrations","googleClassroomSetting","msftTeamsSetting","id","name","enabled","settingName","namespace","ShareViewCount","MasterType","share","objectTypeId","Text","phrase","options","viewCount","ShareViewedByCount","SvgContainer","shareAccessCount","accessCount","ShareType","totalRecipients","recipients","length","getViewCount","PreviousAssignmentsHeader","show","count","IconButton","onClick","onToggle","PreviousAssignmentsListHeader","columnClassNames","value","Row","Col","xs","PreviousAssignmentListItem","shareClassroom","ShareHelper","classrooms","analytics","getItemAnalytics","AppLink","key","shareId","appLink","getItemAppLink","analyticsData","data","analyticsOptions","lg","dateCreated","PreviousAssignmentsList","autoHeight","autoHeightMin","autoHeightMax","scrollHeightMax","autoHide","assignments","map","idx","PreviousAssignments","noBottomPadding","LanguageService","SharesAndAssignmentsEmptyState","EmptyState","size","src","ImageUrls","icon","text","assignAppLink","shareLinkAppLink","SharesEmptyState","MAX_SCROLL_HEIGHT","sortByDateCreated","a","b","DateHelper","ViewInSchoolAnalyticsButton","href","target","ShowAssignmentsEmptyState","shareAppLink","ShowAssignmentsView","sharedData","useAssignSharedData","objectId","entityType","hasPermissions","usePermissions","hasShareFlowV2","useSettings","isTertiary","useIsTertiary","previousShares","ShareRequests","sort","previousAssignmentClassroomIds","ArrayHelper","filter","x","hasCompleted","ClassroomRequests","currentUser","customerId","analyticsUrl","AnalyticsRouteHelper","config","analyticsWebUrl","entity","canViewSchoolAnalytics","PermissionName","emptyStateType","loaded","Popup","showLoadingSpinner","closePopup","AssignAppLinkHelper","application","action","args","params","reverse","FlowControls","hideNextButton","hideCreateClassroomButton","onClickBack","backButtonText","leftComponent","EN_US","ZH_CN","Locales","register","locale","func","SEC_ARRAY","toDate","input","Date","isNaN","test","parseInt","trim","replace","format","date","opts","sec","relativeDate","diff","localeFunc","agoIn","totalSec","Math","abs","floor","toString","unit"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[6550],{93479:(e,t,r)=>{r.d(t,{I:()=>i});var n=r(99940);function a(e,t,r){if(!t)return e;var n="".concat(e,":").concat(t.start,":").concat(t.end),a=Array.isArray(t.userId)?t.userId.sort().join(":"):t.userId,o=Array.isArray(t.groupId)?t.groupId.sort().join(":"):t.groupId,i=Array.isArray(t.customerId)?t.customerId.sort().join(":"):t.customerId;return a&&(n+=":".concat(a)),o&&(n+=":".concat(o)),i&&(n+=":".concat(i)),r&&(n+=":".concat(r)),n}function o(e,t,r){return{currentUserId:e.id,currentCustomerId:e.customerId,dateRange:t?{start:t.start,end:t.end}:void 0,userIds:null==t?void 0:t.userId,classroomsAndGroups:null==t?void 0:t.groupId,shareId:r}}var i={interactiveResultSet:function(e,t,r,i,c,s,u,l){return{url:c?"/api/domain/v3/analytics/interactives/".concat(e,"/metadata/").concat(t):"/api/domain/v2/analytics/interactives/".concat(e,"/metadata/").concat(t),key:a("interactive:result:set:".concat(e,":").concat(t,":").concat(c),i),data:o(r,i,c),type:n.k.POST,normalize:!1,success:s,error:u,always:l}},mark:function(e,t,r,a,o,i,c){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:o,error:i,always:c}},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:"/api/domain/v3/analytics/interactives/report",key:"interactive:results:report",data:e,type:n.k.POST,normalize:!1}}}},41196:(e,t,r)=>{r.d(t,{W:()=>c});var n=r(20354),a=r(93479),o=r(20768),i=r(31949);function c(e,t,r){var c,s=n.a.useBasicFetch(i.N.currentUser()),u=n.a.useBasicFetch(!!e&&o.b.interactiveMetadata(e)),l=n.a.useBasicFetch(!!(null===(c=u.data)||void 0===c?void 0:c.interactiveId)&&o.b.interactive(u.data.interactiveId)),d=!!s.data&&!!l.data;return n.a.useBasicFetch(d&&a.I.interactiveResultSet(u.data.interactiveId,u.data.id,s.data,t,r))}},26025:(e,t,r)=>{r.d(t,{B:()=>o});var n=r(1048),a=r(75795),o={getAudienceAppLinkParams:function(){var e=a.O.getCurrentRoute().appLink,t=n.t.isObject(e.params)?e.params:{},r=t.users,o=t.classrooms,i=t.classroomGroups,c=function(e){var r=t[e];if(r)return Array.isArray(r)?r:[r]},s={};return r&&(s.users=c("users")),o&&(s.classrooms=c("classrooms")),i&&(s.classroomGroups=c("classroomGroups")),s},getDateRangeAppLinkParams:function(){var e=a.O.getCurrentRoute().appLink,t=n.t.isObject(e.params)?e.params:{},r=t.from,o=t.to,i=t.rangeName,c={};return r&&(c.from=r),o&&(c.to=o),i&&(c.rangeName=i),c}}},26136:(e,t,r)=>{r.d(t,{B:()=>c});var n=r(76198),a=r(23481),o=r(64818),i=a.T.encloseNamespace("shared.analyticsUtils");function c(e,t){return e?t?(0,n._8)((r=e.id,a=e.sessionId,c=+"".concat(r||function(e){if(!e)return 0;for(var t=0,r=0;r<e.length;r++)t=(t<<5)-t+e.charCodeAt(r),t|=0;return Math.abs(t)}(a)).concat(Math.floor((new Date).getMinutes()/5)),{dictionaries:[n.O9,n.yd],separator:" ",length:2,style:"capital",seed:c})):o.l.getFullName(e)||i("anonUser"):i("anonUser");var r,a,c}},39157:(e,t,r)=>{r.d(t,{HI:()=>f,R6:()=>u,Rt:()=>p,UU:()=>d,Zs:()=>l,nq:()=>m});var n=r(75896),a=r(94892),o=r(28972),i=r(8246),c=r(83140),s=r(80845);function u(e,t,r){var o={markingRequired:[],lowScore:[],highScore:[],completed:[],notCompleted:[]},i=(0,s.Q)(e),c=new Set(i.map(function(e){return e.id}));t.students.forEach(function(t){var i=Object.assign(Object.assign({},t),{summary:p(e,t)});i.summary.awaitingMarking?o.markingRequired.push(i):n.m.last(t.results).attempts.filter(function(e){var t;return!!c.has(null===(t=null==e?void 0:e.answers[0])||void 0===t?void 0:t.questionId)}).length===c.size?(o.completed.push(i),i.summary.percentCorrect>=((null==r?void 0:r.HIGH)||a.i.HIGH)&&o.highScore.push(i),i.summary.percentCorrect<((null==r?void 0:r.MODERATE)||a.i.MODERATE)&&o.lowScore.push(i)):o.notCompleted.push(i)});var u=n.m.sortBy(o.lowScore,function(e){return e.summary.percentCorrect}),l=n.m.sortBy(o.highScore,function(e){return-e.summary.percentCorrect});return Object.assign(Object.assign({},o),{lowScore:u,highScore:l})}function l(e,t){return(0,s.Wn)(e).find(function(e){return e.id.toString()===t.toString()})}function d(e){return"".concat(e.questionId,":").concat(e.resultId)}function f(e,t,r){var n=(0,s.j_)(t),a=(0,s.f6)(e,n);return(null==a?void 0:a.answers.every(function(e){var t;return(null===(t=r[d(e)])||void 0===t?void 0:t.status)===i.N.Correct}))?i.N.Correct:(null==a?void 0:a.answers.every(function(e){var t;return(null===(t=r[d(e)])||void 0===t?void 0:t.status)===i.N.Incorrect}))?i.N.Incorrect:void 0}function m(e,t){var r=t.students.length,n=0,a=0,i=0,u=0,l=0;return t.students.forEach(function(t){var r=(0,s.j_)(t);if(r){l+=t.results.length;var d=c.A.isInteractionCorrect(e,r);d===o.w.Correct&&n++,d===o.w.UnAnswered&&i++,d===o.w.AwaitingMarking&&u++,d!==o.w.UnAnswered&&a++}}),{percentCorrect:r>0?n/r:0,correct:n,answered:a,unanswered:i,awaitingMarking:u,attempts:l}}function p(e,t){var r=(0,s.j_)(t),n=(0,s.Q)(e),a=n.length,i=0,u=0;n.forEach(function(e){var t=c.A.isInteractionCorrect(e,r);t===o.w.Correct&&i++,t===o.w.AwaitingMarking&&u++});var l=a>0?i/a:0,d=new Set(n.map(function(e){return e.id})),f=r.attempts.filter(function(e){var t;return!!d.has(null===(t=null==e?void 0:e.answers[0])||void 0===t?void 0:t.questionId)}).length;return{answered:f,attempts:t.results.length,unanswered:a-f,percentCorrect:l,correct:i,awaitingMarking:u}}},56543:(e,t,r)=>{r.r(t),r.d(t,{GenerateInteractiveResultsReportView:()=>x});var n=r(32735),a=r(23481),o=r(2948),i=r(20354),c=r(110),s=r(84806),u=r(93479),l=r(41196),d=r(26025);function f(e){return function(e){if(Array.isArray(e))return m(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return m(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)?m(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function m(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 p=function(e){var t=[],r=[];return e.users&&t.push.apply(t,f(e.users)),e.classrooms&&r.push.apply(r,f(e.classrooms)),e.classroomGroups&&r.push.apply(r,f(e.classroomGroups)),{userId:t,groupId:r}},v=(r(57266),a.T.encloseNamespace("shared.analyticsUtils"));function y(e){var t=c.O.convertDateToUTC(e);return c.O.format(t,"YYYY-MM-DDTHH:mm:ss")}function g(e){return c.O.format(e,"YYYY-MM-DD")}var b=r(2606),w=r(9111),h=r(13876),I=r(83345),S=r(38143),C=r(28972),A=r(20768),E=r(31949),O=r(69883),D=r(91286),k=r(52921),R=r(83140),j=r(80845),M=r(64818);function P(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,o,i,c=[],s=!0,u=!1;try{if(o=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;s=!1}else for(;!(s=(n=o.call(r)).done)&&(c.push(n.value),c.length!==t);s=!0);}catch(e){u=!0,a=e}finally{try{if(!s&&null!=r.return&&(i=r.return(),Object(i)!==i))return}finally{if(u)throw a}}return c}}(e,t)||function(e,t){if(e){if("string"==typeof e)return T(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)?T(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function T(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 N="shared.generateReport",L=a.T.encloseNamespace(N);function U(e){var t=c.O.convertUTCToLocal(e).toString();return c.O.format(t,"Do MMMM YYYY")}function x(e){var t,r,a,f,m,T=P((0,o.D)(S.g.ANONYMISE_USERS),1)[0],x=(0,O.Z)(),_=i.a.useGetFetchAsync(),F=d.B.getAudienceAppLinkParams(),Z=d.B.getDateRangeAppLinkParams(),B=function(e,t){var r=function(e){return y(c.O.startOf(e,"day"))},n=function(e){return y(c.O.endOf(e,"day"))},a=function(e,t){if(t)return e.find(function(e){return e.name===t})}(e,t.rangeName);if(a)return{start:r(g(a.startDate)),end:n(g(a.endDate))};if(t.from&&t.to)return{start:r(t.from),end:n(t.to)};var o=e.find(function(e){return!!e.default});return{start:r(g(o.startDate)),end:n(g(o.endDate))}}((a=new Date(2021,0,1),m=(f=(new Date).getFullYear())===a.getFullYear(),[{name:v("today"),startDate:new Date,endDate:new Date},{name:v("thisMonth"),startDate:new Date(f,(new Date).getMonth(),1),endDate:new Date},{name:v("lastThreeMonths"),startDate:new Date(f,(new Date).getMonth()-2,1),endDate:new Date},{name:v("lastSixMonths"),startDate:new Date(f,(new Date).getMonth()-5,1),endDate:new Date},{name:v("thisYear"),startDate:new Date(f,0,1),endDate:new Date},{name:v("lastYear"),startDate:new Date(f-1,0,1),endDate:new Date(f,0,0),disabled:m,tooltip:m?v("lastYearDisabled"):""},{name:v("allTime"),startDate:c.O.subtract(new Date,5,"years"),endDate:new Date,default:!0}]),Z),G=P(n.useState(!1),2),q=G[0],Y=G[1],z=(0,k.b)(),H=z.loading,Q=z.handleGenerateReportError,V=i.a.useBasicFetch(E.N.currentUser()),W=i.a.useBasicFetch(A.b.interactiveMetadata(e.interactiveId)),K=i.a.useBasicFetch((null===(t=W.data)||void 0===t?void 0:t.interactiveId)?A.b.interactive(W.data.interactiveId):null),$=(0,l.W)(e.interactiveId,Object.assign(Object.assign({},B),p(F)));(0,D.v)([K,W,$]);var J=(0,j.Q)(K.data),X=(0,s.Fx)(K.data,$.data,!1,T);return n.createElement(I.D.Provider,{value:N},n.createElement(w.G,{title:L("title"),showLoadingSpinner:!V.hasCompleted||H,closePopup:e.closePopup},n.createElement(n.Fragment,null,n.createElement("p",null,n.createElement(I.x,{phrase:"description"})),n.createElement("p",null,n.createElement(I.x,{phrase:"dateRange",options:{dateFrom:U(B.start),dateTo:U(B.end)}})),n.createElement("p",null,n.createElement(I.x,{phrase:"emailDescription",options:{email:null===(r=V.data)||void 0===r?void 0:r.email}})),n.createElement(h.u,null,n.createElement(h.u.Cancel,{onClick:e.closePopup}),n.createElement(h.u.Submit,{variant:"dark",onClick:function(){Y(!0);var t={interactiveName:W.data.name,userId:V.data.id,customerId:V.data.customerId,questions:J.map(function(e){return e.name}),rows:X.map(function(e){return{name:M.l.getFullName(e.user),unanswered:e.summary.unanswered,percentage:(0,b.DV)((0,b.Ki)(e.summary.percentCorrect)),correct:e.summary.correct,totalQuestions:e.summary.answered+e.summary.unanswered,results:J.map(function(t){switch(R.A.isInteractionCorrect(t,(0,j.j_)(e))){case C.w.Correct:return L("correct");case C.w.Incorrect:return L("incorrect");case C.w.NotApplicable:return"-";case C.w.AwaitingMarking:return L("awaitingMarking");case C.w.UnAnswered:case C.w.Answered:default:return""}})}})};_(u.I.interactiveResultsReport(t)).then(function(){x.success(L("success"))}).catch(function(e){return Q(e,L("error"),L("noEmailError"))}).finally(e.closePopup)},text:L("generateReport"),showSpinner:q})))))}},40782:(e,t,r)=>{r.d(t,{I:()=>n,O:()=>s});var n,a=r(32735),o=r(2606),i=r(362);function c(e){var t=a.useCallback(function(t){if(t){var r=t.r.baseVal.value,n=2*Math.PI*r,a=n-e.percentage*n;t.style.strokeDasharray="".concat(n," ").concat(n),t.style.strokeDashoffset=a.toString()}},[e.percentage]);return a.createElement("svg",null,a.createElement("circle",{r:(0,o.pu)(e.size),className:i.Z.backgroundCircle}),!(0,o.zR)(e.percentage)&&a.createElement("circle",{ref:t,r:(0,o.pu)(e.size),className:(0,o.V4)(e.percentage,e.scoreThresholds)}))}function s(e){var t,r=(0,o.Ki)(e.percentage),s=e.size||(e.layout===n.LabelInside?o.Mk.Large:o.Mk.Small),u=e.customLabel||(0,o.DV)(r);return e.layout===n.LabelOnly?a.createElement("span",{className:(0,o.IA)(r)},u):a.createElement("div",{className:"d-flex align-items-center justify-content-between ".concat(null!==(t=e.className)&&void 0!==t?t:"")},e.layout===n.LabelBefore&&a.createElement("span",{className:"me-2"},u),a.createElement("div",{className:(0,o.tw)(s,r)},a.createElement(c,{percentage:r,size:s,scoreThresholds:e.scoreThresholds}),e.layout===n.LabelInside&&a.createElement("span",{className:i.Z.centredPercentageText},u)))}!function(e){e.CircleOnly="circle_only",e.LabelOnly="label_only",e.LabelBefore="label_before",e.LabelInside="label_inside"}(n||(n={})),s.defaultProps={layout:n.CircleOnly}},2606:(e,t,r)=>{r.d(t,{DV:()=>y,IA:()=>m,Ki:()=>v,Mk:()=>c,V4:()=>f,pu:()=>d,tw:()=>p,zR:()=>g});var n=r(94892),a=r(362);function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function i(e,t,r){return(t=function(e){var t=function(e){if("object"!=o(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var r=t.call(e,"string");if("object"!=o(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==o(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var c,s=.2,u=.36;!function(e){e.Small="small",e.Large="large",e.ExtraSmall="extraSmall"}(c||(c={}));var l=i(i(i({},c.ExtraSmall,{size:2}),c.Small,{size:2}),c.Large,{size:5.8});function d(e){var t=l[e].size,r=e===c.Large?u:s;return"".concat(t/2-2*r,"rem")}function f(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:n.i;return e>=t.HIGH?a.Z.circleSuccess:e>=t.MODERATE?a.Z.circleWarning:a.Z.circleDanger}function m(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:n.i;return e>=t.HIGH?"text-success":e>=t.MODERATE?"text-warning":"text-danger"}function p(e,t){var r="d-inline-block ".concat(a.Z.circleContainer);return e===c.Large&&(r+=" ".concat(a.Z.lgCircleContainer)),e===c.ExtraSmall&&(r+=" ".concat(a.Z.xsCircleContainer)),g(t)&&(r+=" ".concat(a.Z.pendingCircle)),r}function v(e){if(!g(e))return+e.toFixed(2)}function y(e){return g(e)?"--%":"".concat(Math.round(100*e),"%")}function g(e){return"number"!=typeof e}},94892:(e,t,r)=>{r.d(t,{T:()=>a,i:()=>n});var n={HIGH:.75,MODERATE:.5},a={HIGH:.7,MODERATE:.7}},28972:(e,t,r)=>{var n;r.d(t,{w:()=>n}),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"}(n||(n={}))},8246:(e,t,r)=>{var n;r.d(t,{N:()=>n}),function(e){e[e.Incorrect=0]="Incorrect",e[e.Correct=1]="Correct",e[e.PendingReview=2]="PendingReview"}(n||(n={}))},94644:(e,t,r)=>{r.d(t,{r:()=>l});var n=r(50242),a=r(81886),o=r(67058),i=r(14553),c=r(49267),s=r(49075),u={notFound:o.d,forbidden:{rating:i.q,yearLevel:i.q,region:c.a,privacy:i.q},badRequest:s._,internalServerError:s._};function l(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e){var o;o="number"==typeof e?e:e.status;var i=Object.assign(Object.assign({},u),t);o&&a.Q.Ry.isStatusCodeError(o)&&(o!==n.o.InternalServer?o!==n.o.NotFound?o!==n.o.Forbidden?r.badRequest||a.Q.Ry.throw(new i.badRequest):r.forbidden||a.Q.Ry.throw(new i.forbidden.privacy):r.notFound||a.Q.Ry.throw(new i.notFound):r.internalServerError||a.Q.Ry.throw(new s._))}}},91286:(e,t,r)=>{r.d(t,{v:()=>i});var n=r(32735),a=r(94644);function o(e){return e.map(function(e){return e.statusCode}).join(":")}function i(e,t,r){var i=Array.isArray(e)?e:[e];(0,n.useEffect)(function(){i.forEach(function(e){(0,a.r)(e.statusCode,t,r)})},[o(i),t,r])}},52921:(e,t,r)=>{r.d(t,{b:()=>h});var n=r(81886),a=r(20354),o=r(12754),i=r(23481),c=r(97395),s=r(47663);function u(e){return u="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},u(e)}function l(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,d(n.key),n)}}function d(e){var t=function(e){if("object"!=u(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var r=t.call(e,"string");if("object"!=u(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==u(t)?t:t+""}function f(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(f=function(){return!!e})()}function m(e){return m=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},m(e)}function p(e,t){return p=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},p(e,t)}var v="shared.verifiedEmailError",y=function(e){function t(e,r,n){var a;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),(a=function(e,t,r){return t=m(t),function(e,t){if(t&&("object"==u(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}(e,f()?Reflect.construct(t,r||[],m(e).constructor):t.apply(e,r))}(this,t,["VerifiedEmailRequiredError"])).message=e,a.liteUrl=r,a.hasLite=n,a}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&p(e,t)}(t,e),r=t,(n=[{key:"name",get:function(){return"VerifiedEmailRequiredError"}},{key:"dialogOptions",get:function(){var e=c._.safeUrlConcat(this.liteUrl,"settings/account");return{title:i.T.getPhrase(v,"heading"),text:this.hasLite?"".concat(this.message," ").concat(i.T.getPhrase(v,"visitSettings",{href:e})):this.message,buttons:[{text:i.T.getPhrase(v,"close"),className:"btn btn-dark",success:!0}]}}}])&&l(r.prototype,n),Object.defineProperty(r,"prototype",{writable:!1}),r;var r,n}(s.S),g=r(39151),b=r(69883),w=r(15311);function h(){var e=(0,b.Z)(),t=(0,w.r)(),r=t.hasProduct,i=t.isLoadingProducts,c=a.a.useBasicFetch(g.L.config());return{handleGenerateReportError:function(t,a,i){var s;t.responseJSON&&"no-email"===(null===(s=t.responseJSON)||void 0===s?void 0:s.type)?n.Q.Ry.throw(new y(i,c.data.liteUrl,r(o.x.Primary))):e.error(a)},loading:!c.hasCompleted||i}}},57266:(e,t,r)=>{r.d(t,{e:()=>i});var n=r(81886),a=r(1048),o=r(75795),i={updateParams:function(e,t){var r=o.O.getCurrentRoute().appLink,i="string"==typeof r.params?n.Q.Ab.DeserializeQueryParams(r.params):r.params;t.keysToRemove&&(i=a.t.omit(i,t.keysToRemove));var c=(null==t?void 0:t.merge)?Object.assign(Object.assign({},i),e):e,s=Object.assign(Object.assign({},r),{params:c});a.t.isEqual(r,s)||n.Q.C$.trigger(s,a.t.omit(t,["merge","keysToRemove"]))}}},83140:(e,t,r)=>{r.d(t,{A:()=>v});var n=r(28972),a=r(8246),o=r(38129);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,r){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 r=t.call(e,"string");if("object"!=i(r))return r;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:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function s(){return n.w.NotApplicable}function u(e,t){var r=e.actionableItems.filter(function(e){return e.isCorrect});return r.every(function(e){return!t(e.id)})?n.w.UnAnswered:r.every(function(e){var r;return e.name.trim().toLowerCase()===(null===(r=t(e.id))||void 0===r?void 0:r.trim().toLowerCase())})?n.w.Correct:n.w.Incorrect}function l(e,t){return e.actionableItems.every(function(e){return!t(e.id)})?n.w.UnAnswered:e.actionableItems.filter(function(e){return e.isCorrect}).every(function(e){var r,n=t(e.id);return(null==n?void 0:n.toString())===(null===(r=e.id)||void 0===r?void 0:r.toString())||n===e.name})?n.w.Correct:n.w.Incorrect}function d(e,t){return function(r){var n=null==t?void 0:t.attempts.find(function(t){return t.id===e.id});return null==n?void 0:n.answers.find(function(e){return e.id===r})}}function f(e,t){var r=d(e,t);return l(e,function(e){var t=r(e);return null==t?void 0:t.text})}function m(e,t){return function(e,t){var r;return e.actionableItems.forEach(function(e){var o=t(e.id);r=o?o.status!==a.N.Correct?o.status!==a.N.Incorrect?n.w.AwaitingMarking:n.w.Incorrect:n.w.Correct:n.w.UnAnswered}),r}(e,d(e,t))}var p=c(c(c(c(c(c(c({},o.Z9.Annotation,s),o.Z9.Image,s),o.Z9.MissingWord,function(e,t){var r=d(e,t);return u(e,function(e){var t=r(e);return null==t?void 0:t.text})}),o.Z9.MultipleChoice,f),o.Z9.ShortAnswer,m),o.Z9.TrueOrFalse,f),o.Z9.Illustration,m),v={notApplicable:s,awaitingMarking:function(){return n.w.AwaitingMarking},isMissingWordCorrect:u,isMultipleChoiceCorrect:l,isInteractionCorrect:function(e,t){return(0,p[e.typeId])(e,t)}}},362:(e,t,r)=>{r.d(t,{Z:()=>n});const n={circleContainer:"p8Vgz",backgroundCircle:"asGGE",circleSuccess:"PXLNj",circleWarning:"ZckRN",circleDanger:"slBRg",lgCircleContainer:"N8KCI",xsCircleContainer:"RPqZ2",pendingCircle:"DKrcq",centredPercentageText:"tpmLR"}}}]);
2
+ //# sourceMappingURL=6550-1d60d863e8-lite.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/6550-1d60d863e8-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/utils/AnalyticsRequestUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/flight-requests/InteractiveResultsRequests.ts","file:///app/packages/libs/shared/src/apps/analytics/hooks/UseFetchInteractiveResults.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/AnalyticsFilterUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/AnonymiseUserUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/InteractiveUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/AudienceUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/DateRangeUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/views/generate-report/GenerateInteractiveResultsReportView.tsx","file:///app/packages/libs/shared/src/components/percentage-indicator/PercentageIndicator.tsx","file:///app/packages/libs/shared/src/components/percentage-indicator/PercentageIndicatorUtils.ts","file:///app/packages/libs/shared/src/constants/ScoreThresholds.ts","file:///app/packages/libs/shared/src/enums/InteractionCorrectness.ts","file:///app/packages/libs/shared/src/enums/InteractiveAnswerStatus.ts","file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/hooks/UseHandleObjectError.ts","file:///app/packages/libs/shared/src/errors/general/verified-email/VerifiedEmailRequiredError.ts","file:///app/packages/libs/shared/src/hooks/useVerifiedEmailRequiredErrorHandler.ts","file:///app/packages/libs/shared/src/utils/AppRouteHelper.ts","file:///app/packages/libs/shared/src/utils/InteractiveCorrectnessHelper.ts","file:///app/packages/libs/shared/src/components/percentage-indicator/percentage-indicator.scss"],"sourcesContent":["import { AnalyticsRequestFilter } from 'libs/shared/interfaces';\n\nexport function getAnalyticsRequestKey(baseKey: string, filter: AnalyticsRequestFilter, extra?: string): string {\n if (!filter)\n return baseKey;\n\n let key = `${baseKey}:${filter.start}:${filter.end}`;\n\n const userIdKey = Array.isArray(filter.userId) ? filter.userId.sort().join(':') : filter.userId;\n const groupIdKey = Array.isArray(filter.groupId) ? filter.groupId.sort().join(':') : filter.groupId;\n const customerIdKey = Array.isArray(filter.customerId) ? filter.customerId.sort().join(':') : filter.customerId;\n\n if (userIdKey)\n key += `:${userIdKey}`;\n\n if (groupIdKey)\n key += `:${groupIdKey}`;\n\n if (customerIdKey)\n key += `:${customerIdKey}`;\n\n if (extra)\n key += `:${extra}`;\n\n return key;\n}","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Flight } from 'libs/common/react/index';\n\nimport { MarkInteractiveAnswer } from 'libs/shared/apps/analytics/interfaces/MarkInteractiveAnswer';\nimport { InteractiveResultsReport } from 'libs/shared/apps/analytics/interfaces/requests/InteractiveResultsReport';\nimport { InteractivesPendingReviewsRequest } from 'libs/shared/apps/analytics/interfaces/requests/InteractivesPendingReviewsRequest';\nimport { AnalyticsRequestFilter, CurrentUser, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { getAnalyticsRequestKey } from 'libs/shared/utils/AnalyticsRequestUtils';\n\ninterface InteractiveResultFilters {\n currentUserId: string;\n currentCustomerId: string;\n dateRange?: { start: string, end: string }\n userIds?: string | string[];\n classroomsAndGroups?: string | string[];\n shareId?: string;\n}\n\nfunction getInteractiveResultFilters(\n currentUser: CurrentUser,\n filter: AnalyticsRequestFilter,\n shareId?: string\n): InteractiveResultFilters {\n return {\n currentUserId: currentUser.id,\n currentCustomerId: currentUser.customerId,\n dateRange: filter ? { start: filter.start, end: filter.end } : undefined,\n userIds: filter?.userId,\n classroomsAndGroups: filter?.groupId,\n shareId: shareId\n };\n}\n\nexport const InteractiveResultsRequests = {\n /** \n * This endpoint returns data with a lot of duplicated ids,\n * e.g. student answers to the same question will have the same id.\n * Because of that, we don't normalize.\n */\n interactiveResultSet(\n interactiveId: string,\n interactiveMetadataId: string,\n currentUser: CurrentUser,\n filter?: AnalyticsRequestFilter,\n shareId?: string,\n success?: (data: InteractiveResultSet) => void,\n error?: (data: any) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: shareId ?\n `/api/domain/v3/analytics/interactives/${interactiveId}/metadata/${interactiveMetadataId}` :\n `/api/domain/v2/analytics/interactives/${interactiveId}/metadata/${interactiveMetadataId}`,\n key: getAnalyticsRequestKey(`interactive:result:set:${interactiveId}:${interactiveMetadataId}:${shareId}`, filter),\n data: getInteractiveResultFilters(currentUser, filter, shareId),\n type: HttpVerbs.POST,\n normalize: false,\n success,\n error,\n always\n };\n },\n \n /**\n * As the response from `interactiveResultSet` isn't normalised, we need to invalidate the cache\n * to update the results data.\n */\n mark(\n interactiveId: string,\n interactiveMetadataId: string,\n answerId: string,\n data: MarkInteractiveAnswer,\n success?: () => void,\n error?: (data: any) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `/api/domain/v1/analytics/answers/${answerId}`,\n key: `mark:answer:${answerId}:${data.resultId}`,\n type: HttpVerbs.PUT,\n data,\n normalize: false,\n invalidationKeys: `interactive:result:set:${interactiveId}:${interactiveMetadataId}`,\n success,\n error,\n always\n };\n },\n\n pendingReviews(data: InteractivesPendingReviewsRequest): Flight.Request {\n return {\n url: `/api/domain/v1/analytics/interactives/pending-reviews/summary`,\n key: `interactives:pending:reviews`,\n type: HttpVerbs.POST,\n data\n };\n },\n\n interactiveResultsReport(data: InteractiveResultsReport): Flight.Request {\n return {\n url: '/api/domain/v3/analytics/interactives/report',\n key: 'interactive:results:report',\n data,\n type: HttpVerbs.POST,\n normalize: false\n };\n }\n};","import { Flight } from 'libs/common/flight';\n\nimport { InteractiveResultsRequests } from 'libs/shared/apps/analytics/flight-requests/InteractiveResultsRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { AnalyticsRequestFilter, CurrentUser, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\n\nexport function useFetchInteractiveResults(\n interactiveMetadataId: string,\n requestFilter?: AnalyticsRequestFilter,\n shareId?: string\n): Flight.Response<InteractiveResultSet> {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(!!interactiveMetadataId &&\n InteractiveRequests.interactiveMetadata(interactiveMetadataId));\n\n const interactive = Flight.useBasicFetch<Interactive>(!!interactiveMetadata.data?.interactiveId &&\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId));\n\n const shouldFetchResults = !!currentUser.data && !!interactive.data;\n\n return Flight.useBasicFetch<InteractiveResultSet>(shouldFetchResults &&\n InteractiveResultsRequests.interactiveResultSet(\n interactiveMetadata.data.interactiveId,\n interactiveMetadata.data.id,\n currentUser.data,\n requestFilter,\n shareId\n ));\n}","import { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AudienceQueryParams } from 'libs/shared/apps/analytics/interfaces/AudienceQueryParams';\nimport { DateRangeQueryParams } from 'libs/shared/apps/analytics/interfaces/DateRangeQueryParams';\nimport { ContextService } from 'libs/shared/services/ContextService';\n\nexport const AnalyticsFilterHelper = {\n getAudienceAppLinkParams: () => {\n const { appLink } = ContextService.getCurrentRoute();\n const params = ObjectHelper.isObject(appLink.params) ? appLink.params as HashObject : {};\n const { users, classrooms, classroomGroups } = params;\n\n const getParam = (key: keyof AudienceQueryParams) => {\n const param = params[key];\n\n if (!param)\n return;\n\n return Array.isArray(param) ? param : [param];\n };\n\n const audienceFilters: AudienceQueryParams = {};\n\n if (users)\n audienceFilters.users = getParam('users');\n\n if (classrooms)\n audienceFilters.classrooms = getParam('classrooms');\n\n if (classroomGroups)\n audienceFilters.classroomGroups = getParam('classroomGroups');\n\n return audienceFilters;\n },\n getDateRangeAppLinkParams: () => {\n const { appLink } = ContextService.getCurrentRoute();\n const params = ObjectHelper.isObject(appLink.params) ? appLink.params as HashObject : {};\n const { from, to, rangeName } = params;\n\n const dateRangeFilters: DateRangeQueryParams = {};\n\n if (from)\n dateRangeFilters.from = from;\n\n if (to)\n dateRangeFilters.to = to;\n\n if (rangeName)\n dateRangeFilters.rangeName = rangeName;\n\n return dateRangeFilters;\n }\n};","import { animals, colors, Config as UniqueNamesConfig, uniqueNamesGenerator } from 'unique-names-generator';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nconst namespace = 'shared.analyticsUtils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction guidToSeed(guid: string): number {\n if (!guid)\n return 0;\n\n // Simple hash function (DJB2-like) for browsers\n let hash = 0;\n for (let i = 0; i < guid.length; i++) {\n const char = guid.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash |= 0; // Convert to 32bit integer\n }\n return Math.abs(hash);\n}\n\nfunction getUniqueNamesConfig(userId: string, sessionId: string): UniqueNamesConfig {\n /**\n * Generate a seed that is unique to each user but changes every 5 minutes.\n * \n * We use a seed so that if the same user's name is anonymised multiple times\n * in quick succession (e.g. multiple renders), the same name will be returned each time.\n * \n * We change the seed every 5 minutes so that students don't always have the same name.\n */\n const seed = +`${userId || guidToSeed(sessionId)}${Math.floor((new Date()).getMinutes() / 5)}`;\n\n return {\n dictionaries: [ colors, animals ],\n separator: ' ',\n length: 2,\n style: 'capital',\n seed\n };\n}\n\nexport function anonymiseUserName(user: AnonUser, shouldAnonymise: boolean): string {\n if (!user) {\n return getPhrase('anonUser');\n }\n\n if (!shouldAnonymise)\n return UserHelper.getFullName(user) || getPhrase('anonUser');\n\n return uniqueNamesGenerator(getUniqueNamesConfig(user.id, user.sessionId));\n}\n","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { ResultsSummary } from 'libs/shared/apps/analytics/interfaces/ResultsSummary';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { ScoreThresholdDefaults, ScoreThresholds } from 'libs/shared/constants/ScoreThresholds';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, StudentAnswer, StudentResults } from 'libs/shared/interfaces';\nimport { Interactive, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { flattenInteractions, getInteractions, getStudentAttempt, getStudentResult } from 'libs/shared/utils/InteractiveHelper';\n\ninterface StudentGroups {\n markingRequired: StudentResultsWithSummary[];\n lowScore: StudentResultsWithSummary[];\n highScore: StudentResultsWithSummary[];\n completed: StudentResultsWithSummary[];\n notCompleted: StudentResultsWithSummary[];\n}\n\nexport function groupStudents(\n interactive: Interactive,\n results: InteractiveResultSet,\n scoreThreshold?: ScoreThresholds\n): StudentGroups {\n const groups: StudentGroups = {\n markingRequired: [],\n lowScore: [],\n highScore: [],\n completed: [],\n notCompleted: []\n };\n\n const interactions = getInteractions(interactive);\n const interactionIds = new Set(interactions.map(i => i.id));\n \n results.students.forEach(s => {\n const withSummary = {\n ...s,\n summary: getStudentResultsSummary(interactive, s)\n };\n \n if (withSummary.summary.awaitingMarking) {\n groups.markingRequired.push(withSummary);\n return;\n }\n\n const result = ArrayHelper.last(s.results);\n const answeredInteractions = result.attempts.filter(a => !!interactionIds.has(a?.answers[0]?.questionId)).length;\n\n if (answeredInteractions === interactionIds.size) {\n groups.completed.push(withSummary);\n } else {\n groups.notCompleted.push(withSummary);\n return;\n }\n \n if (withSummary.summary.percentCorrect >= (scoreThreshold?.HIGH || ScoreThresholdDefaults.HIGH))\n groups.highScore.push(withSummary);\n \n if (withSummary.summary.percentCorrect < (scoreThreshold?.MODERATE || ScoreThresholdDefaults.MODERATE))\n groups.lowScore.push(withSummary);\n });\n \n const sortedLowScore = ArrayHelper.sortBy(groups.lowScore, s => s.summary.percentCorrect);\n const sortedHighScore = ArrayHelper.sortBy(groups.highScore, s => -s.summary.percentCorrect);\n \n return {\n ...groups,\n lowScore: sortedLowScore,\n highScore: sortedHighScore\n };\n}\n\nexport function getInteractionById(interactive: Interactive, interactionId: string): Interaction {\n const flattenedInteractions = flattenInteractions(interactive);\n return flattenedInteractions.find(i => i.id.toString() === interactionId.toString());\n}\n\n/**\n * We need to use the question and result ids as a list of one student's responses\n * to multiple questions will all have the same result id and a list of multiple\n * students responses to one question will all have the same questionId.\n */\nexport function getMarkedAnswerId(answer: StudentAnswer): string {\n return `${answer.questionId}:${answer.resultId}`;\n}\n\nexport function getMarkedStatus(\n interactionId: string,\n studentResults: StudentResults,\n markedAnswers: MarkedAnswerHash\n): InteractiveAnswerStatus {\n const result = getStudentResult(studentResults);\n const studentResponse = getStudentAttempt(interactionId, result);\n\n const isMarkedCorrect = studentResponse?.answers.every(a => {\n return markedAnswers[getMarkedAnswerId(a)]?.status === InteractiveAnswerStatus.Correct;\n });\n\n if (isMarkedCorrect)\n return InteractiveAnswerStatus.Correct;\n\n const isMarkedIncorrect = studentResponse?.answers.every(a => {\n return markedAnswers[getMarkedAnswerId(a)]?.status === InteractiveAnswerStatus.Incorrect;\n });\n\n if (isMarkedIncorrect)\n return InteractiveAnswerStatus.Incorrect;\n}\n\nexport function getInteractionResultsSummary(\n interaction: Interaction,\n results: InteractiveResultSet\n): ResultsSummary {\n const numStudents = results.students.length;\n let numCorrect = 0;\n let answered = 0;\n let unanswered = 0;\n let awaitingMarking = 0;\n let attempts = 0;\n\n results.students.forEach(s => {\n const result = getStudentResult(s);\n\n if (!result)\n return;\n\n attempts = attempts + s.results.length;\n\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(interaction, result);\n\n if (correctness === InteractionCorrectness.Correct)\n numCorrect++;\n\n if (correctness === InteractionCorrectness.UnAnswered)\n unanswered++;\n\n if (correctness === InteractionCorrectness.AwaitingMarking)\n awaitingMarking++;\n\n if (correctness !== InteractionCorrectness.UnAnswered)\n answered++;\n });\n\n\n const percentCorrect = numStudents > 0\n ? numCorrect / numStudents\n : 0;\n\n return {\n percentCorrect,\n correct: numCorrect,\n answered,\n unanswered,\n awaitingMarking,\n attempts\n };\n}\n\nexport function getStudentResultsSummary(interactive: Interactive, studentResults: StudentResults): ResultsSummary {\n const result = getStudentResult(studentResults);\n\n const interactions = getInteractions(interactive);\n\n const numInteractions = interactions.length;\n\n let numCorrect = 0;\n let awaitingMarking = 0;\n\n interactions.forEach(i => {\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(i, result);\n\n if (correctness === InteractionCorrectness.Correct)\n numCorrect++;\n\n if (correctness === InteractionCorrectness.AwaitingMarking)\n awaitingMarking++;\n });\n\n const percentCorrect = numInteractions > 0 ? numCorrect / numInteractions : 0;\n\n /**\n * Our interactions list has images and annotations filtered out.\n * We built a map of valid questions, so that we can calculate the unswered accurately.\n * We're doing this because of a bug that caused annotations and images to record answers in the player.\n * - Sha\n */\n const interactionIds = new Set(interactions.map(i => i.id));\n const answeredInteractions = result.attempts.filter(a => !!interactionIds.has(a?.answers[0]?.questionId)).length;\n\n return {\n answered: answeredInteractions,\n attempts: studentResults.results.length,\n unanswered: numInteractions - answeredInteractions,\n percentCorrect,\n correct: numCorrect,\n awaitingMarking\n };\n}","import { AudienceQueryParams } from 'libs/shared/apps/analytics/interfaces/AudienceQueryParams';\n\nexport const getAudienceParams = (queryParams: AudienceQueryParams) => {\n const userId: string[] = [];\n const groupId: string[] = [];\n\n if (queryParams.users)\n userId.push(...queryParams.users);\n\n if (queryParams.classrooms)\n groupId.push(...queryParams.classrooms);\n\n if (queryParams.classroomGroups)\n groupId.push(...queryParams.classroomGroups);\n return {\n userId,\n groupId\n };\n};","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { DateRangeQueryParams } from 'libs/shared/apps/analytics/interfaces/DateRangeQueryParams';\nimport { FilterQueryParams } from 'libs/shared/apps/analytics/interfaces/FilterQueryParams';\nimport { DateRange } from 'libs/shared/interfaces';\nimport { AppRouteHelper } from 'libs/shared/utils/AppRouteHelper';\n\nconst namespace = 'shared.analyticsUtils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function convertDateToUtcDateTimeString(date: Date): string {\n const utc = DateHelper.convertDateToUTC(date);\n return DateHelper.format(utc, 'YYYY-MM-DDTHH:mm:ss');\n}\n\nexport function getMinDate(): Date {\n return new Date(2021, 0, 1);\n}\n\nexport function getMaxDate(): Date {\n return new Date();\n}\n\nexport function getDefaultDateRange(dateRangePresets: DateRange[]): DateRange {\n return dateRangePresets.find(range => !!range.default);\n}\n\nexport function getPresetRangeByName(dateRangePresetss: DateRange[], rangeName: string): DateRange | undefined {\n if (!rangeName)\n return;\n\n const presets = dateRangePresetss;\n \n return presets.find(p => p.name === rangeName);\n}\n\nexport function getGenericDateRangePresets(): DateRange[] {\n const minDate = getMinDate();\n const currentYear = (new Date()).getFullYear();\n\n const isMinDateThisYear = currentYear === minDate.getFullYear();\n\n return [\n {\n name: getPhrase('today'),\n startDate: new Date(),\n endDate: new Date()\n },\n {\n name: getPhrase('thisMonth'),\n startDate: new Date(currentYear, new Date().getMonth(), 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastThreeMonths'),\n startDate: new Date(currentYear, new Date().getMonth() - 2, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastSixMonths'),\n startDate: new Date(currentYear, new Date().getMonth() - 5, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastTwelveMonths'),\n startDate: new Date(currentYear, new Date().getMonth() - 11, 1),\n endDate: new Date(),\n default: true\n },\n {\n name: getPhrase('thisYear'),\n startDate: new Date(currentYear, 0, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastYear'),\n startDate: new Date(currentYear - 1, 0, 1),\n endDate: new Date(currentYear, 0, 0),\n disabled: isMinDateThisYear,\n tooltip: isMinDateThisYear ? getPhrase('lastYearDisabled') : ''\n }\n ];\n}\n\nexport function getInsightsDateRangePresets(): DateRange[] {\n const minDate = getMinDate();\n const currentYear = (new Date()).getFullYear();\n\n const isMinDateThisYear = currentYear === minDate.getFullYear();\n\n return [\n {\n name: getPhrase('today'),\n startDate: new Date(),\n endDate: new Date()\n },\n {\n name: getPhrase('thisMonth'),\n startDate: new Date(currentYear, new Date().getMonth(), 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastThreeMonths'),\n startDate: new Date(currentYear, new Date().getMonth() - 2, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastSixMonths'),\n startDate: new Date(currentYear, new Date().getMonth() - 5, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('thisYear'),\n startDate: new Date(currentYear, 0, 1),\n endDate: new Date()\n },\n {\n name: getPhrase('lastYear'),\n startDate: new Date(currentYear - 1, 0, 1),\n endDate: new Date(currentYear, 0, 0),\n disabled: isMinDateThisYear,\n tooltip: isMinDateThisYear ? getPhrase('lastYearDisabled') : ''\n },\n {\n name: getPhrase('allTime'),\n startDate: DateHelper.subtract(new Date(), 5, 'years'),\n endDate: new Date(),\n default: true\n }\n ];\n}\n\nexport function formatDateQueryParam(date: Date): string {\n return DateHelper.format(date, 'YYYY-MM-DD');\n}\n\nexport function getRouteQueryParams(dateRange: DateRange): DateRangeQueryParams {\n if (dateRange.name)\n return { rangeName: dateRange.name };\n\n return {\n from: formatDateQueryParam(dateRange.startDate),\n to: formatDateQueryParam(dateRange.endDate)\n };\n}\n\nexport function useGetDateRangeFromQueryParams(\n dateRangePresets: DateRange[],\n dateRangeQueryParams: DateRangeQueryParams\n): DateRange | null {\n const { to, from, rangeName } = dateRangeQueryParams;\n \n const presetRange = getPresetRangeByName(dateRangePresets, rangeName);\n\n if (presetRange) {\n if (!from && !to)\n return presetRange;\n\n /**\n * If a rangeName has been set, we don't use to and from so we remove them from the url params.\n */\n AppRouteHelper.updateParams(\n getRouteQueryParams(presetRange),\n { replace: true, merge: true, keysToRemove: [ 'from', 'to' ]}\n );\n return;\n }\n\n const defaultDateRange = getDefaultDateRange(dateRangePresets);\n\n /**\n * If a param is missing, or one of them isn't a valid date, short-circuit the logic below.\n */\n if (!from || !to || !DateHelper.isValid(from) || !DateHelper.isValid(to)) {\n AppRouteHelper.updateParams(\n getRouteQueryParams(defaultDateRange),\n { replace: true, merge: true, keysToRemove: ['rangeName']}\n );\n return;\n }\n\n let initialDateRangeValid = true;\n\n let startDate = DateHelper.convertDateToUTC(new Date(from));\n let endDate = DateHelper.convertDateToUTC(new Date(to));\n\n if (DateHelper.isBefore(startDate, getMinDate(), 'day')) {\n startDate = getMinDate();\n initialDateRangeValid = false;\n }\n\n if (DateHelper.isAfter(endDate, getMaxDate(), 'day')) {\n endDate = getMaxDate();\n initialDateRangeValid = false;\n }\n\n if (DateHelper.isAfter(startDate, endDate)) {\n startDate = defaultDateRange.startDate;\n endDate = defaultDateRange.endDate;\n initialDateRangeValid = false;\n }\n\n const dateRange: DateRange = {\n startDate,\n endDate,\n name: initialDateRangeValid\n ? rangeName || 'custom'\n : ''\n };\n\n if (initialDateRangeValid)\n return dateRange;\n\n /**\n * If one or both of the date params were invalid, we trigger a route update.\n */\n AppRouteHelper.updateParams(getRouteQueryParams(dateRange), { replace: true, merge: true, keysToRemove: ['rangeName']});\n}\n\nexport function getStartEndParams(\n dateRangePresetss: DateRange[],\n filterParams: FilterQueryParams\n): { start: string; end: string } {\n const getStartDate = (date: string) => convertDateToUtcDateTimeString(DateHelper.startOf(date, 'day'));\n const getEndDate = (date: string) => convertDateToUtcDateTimeString(DateHelper.endOf(date, 'day'));\n\n const presetRange = getPresetRangeByName(dateRangePresetss, filterParams.rangeName);\n\n /**\n * If the user has chosen a preset range, lookup the start and end dates as they won't be\n * in the query params.\n */\n if (presetRange)\n return {\n start: getStartDate(formatDateQueryParam(presetRange.startDate)),\n end: getEndDate(formatDateQueryParam(presetRange.endDate))\n };\n\n /**\n * If they have chosen a custom date range, use their chosen start and end dates.\n */\n if (filterParams.from && filterParams.to)\n return {\n start: getStartDate(filterParams.from),\n end: getEndDate(filterParams.to)\n };\n\n /**\n * The below should never be hit\n */\n const defaultRange = getDefaultDateRange(dateRangePresetss);\n\n return {\n start: getStartDate(formatDateQueryParam(defaultRange.startDate)),\n end: getEndDate(formatDateQueryParam(defaultRange.endDate))\n };\n}","import React from 'react';\n\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { useGetResultsTableData } from 'libs/shared/apps/analytics/components/student-results/student-results-table/StudentResultsTableUtils';\nimport { InteractiveResultsRequests } from 'libs/shared/apps/analytics/flight-requests/InteractiveResultsRequests';\nimport { useFetchInteractiveResults } from 'libs/shared/apps/analytics/hooks/UseFetchInteractiveResults';\nimport { InteractiveResultsReport } from 'libs/shared/apps/analytics/interfaces/requests/InteractiveResultsReport';\nimport { AnalyticsFilterHelper } from 'libs/shared/apps/analytics/utils/AnalyticsFilterUtils';\nimport { getAudienceParams } from 'libs/shared/apps/analytics/utils/AudienceUtils';\nimport { getInsightsDateRangePresets, getStartEndParams } from 'libs/shared/apps/analytics/utils/DateRangeUtils';\nimport { getFormattedPercentage, getPercentageToFixed } from 'libs/shared/components/percentage-indicator/PercentageIndicatorUtils';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { useVerifiedEmailRequiredErrorHandler } from 'libs/shared/hooks/useVerifiedEmailRequiredErrorHandler';\nimport { CurrentUser, Interactive, InteractiveMetadata, PopupViewProps } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { getInteractions, getStudentResult } from 'libs/shared/utils/InteractiveHelper';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nconst namespace = 'shared.generateReport';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getReportFriendlyDate(date: string): string {\n const localDate = DateHelper.convertUTCToLocal(date).toString();\n return DateHelper.format(localDate, 'Do MMMM YYYY');\n}\n\ninterface GenerateInteractiveResultsReportViewProps extends PopupViewProps {\n interactiveId: string;\n}\n\nexport function GenerateInteractiveResultsReportView(props: GenerateInteractiveResultsReportViewProps): JSX.Element {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n const alerts = useAlerts();\n const fetchAsync = Flight.useGetFetchAsync();\n\n const audienceAppLinkParams = AnalyticsFilterHelper.getAudienceAppLinkParams();\n const dateRangeAppLinkParams = AnalyticsFilterHelper.getDateRangeAppLinkParams();\n const startEndParams = getStartEndParams(getInsightsDateRangePresets(), dateRangeAppLinkParams);\n\n const [ showSpinner, setShowSpinner ] = React.useState(false);\n\n const { loading, handleGenerateReportError } = useVerifiedEmailRequiredErrorHandler();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n InteractiveRequests.interactiveMetadata(props.interactiveId)\n );\n const interactive = Flight.useBasicFetch<Interactive>(interactiveMetadata.data?.interactiveId ?\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId) : null);\n const results = useFetchInteractiveResults(props.interactiveId, {\n ...startEndParams,\n ...getAudienceParams(audienceAppLinkParams)\n });\n\n useHandleObjectError([ interactive, interactiveMetadata, results ]);\n\n const interactions = getInteractions(interactive.data);\n\n const answerData = useGetResultsTableData(interactive.data, results.data, false, anonymiseUsers);\n\n function onClickGenerate(): void {\n setShowSpinner(true);\n\n const body: InteractiveResultsReport = {\n interactiveName: interactiveMetadata.data.name,\n userId: currentUser.data.id,\n customerId: currentUser.data.customerId,\n questions: interactions.map(i => i.name),\n rows: answerData.map(answer => {\n return {\n name: UserHelper.getFullName(answer.user),\n unanswered: answer.summary.unanswered,\n percentage: getFormattedPercentage(getPercentageToFixed(answer.summary.percentCorrect)),\n correct: answer.summary.correct,\n totalQuestions: answer.summary.answered + answer.summary.unanswered,\n results: interactions.map(interaction => {\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(\n interaction,\n getStudentResult(answer)\n );\n\n switch (correctness) {\n case InteractionCorrectness.Correct:\n return getPhrase('correct');\n\n case InteractionCorrectness.Incorrect:\n return getPhrase('incorrect');\n\n case InteractionCorrectness.NotApplicable:\n return '-';\n\n case InteractionCorrectness.AwaitingMarking:\n return getPhrase('awaitingMarking');\n\n case InteractionCorrectness.UnAnswered:\n case InteractionCorrectness.Answered:\n default:\n return '';\n }\n })\n };\n })\n };\n\n fetchAsync(InteractiveResultsRequests.interactiveResultsReport(body))\n .then(() => {\n alerts.success(getPhrase('success'));\n })\n .catch((xhr: Xhr) => handleGenerateReportError(xhr, getPhrase('error'), getPhrase('noEmailError')))\n .finally(props.closePopup);\n }\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <Popup\n title={getPhrase('title')}\n showLoadingSpinner={!currentUser.hasCompleted || loading}\n closePopup={props.closePopup}\n >\n <>\n <p>\n <Text phrase='description' />\n </p>\n <p>\n <Text phrase='dateRange' options={({\n dateFrom: getReportFriendlyDate(startEndParams.start),\n dateTo: getReportFriendlyDate(startEndParams.end)\n })} />\n </p>\n <p>\n <Text phrase='emailDescription' options={({ email: currentUser.data?.email })} />\n </p>\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.closePopup} />\n <PopupButtons.Submit\n variant='dark'\n onClick={onClickGenerate}\n text={getPhrase('generateReport')}\n showSpinner={showSpinner}\n />\n </PopupButtons>\n </>\n </Popup>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\n\nimport { ScoreThresholds } from 'libs/shared/constants/ScoreThresholds';\n\nimport {\n getCircleClassName,\n getCircleContainerClassName,\n getCircleRadius,\n getColouredLabelClassName,\n getFormattedPercentage,\n getPercentageToFixed,\n isPending,\n ProgressCircleSize\n} from './PercentageIndicatorUtils';\n\nimport styles from './percentage-indicator.scss';\n\ninterface ProgressCircleProps {\n size: ProgressCircleSize;\n scoreThresholds?: ScoreThresholds;\n percentage?: number;\n}\n\nfunction ProgressCircle(props: ProgressCircleProps): JSX.Element {\n const ref = React.useCallback((circle: SVGCircleElement) => {\n if (!circle)\n return;\n\n const radius = circle.r.baseVal.value;\n const circumference = 2 * Math.PI * radius;\n const offset = circumference - props.percentage * circumference;\n\n circle.style.strokeDasharray = `${circumference} ${circumference}`;\n circle.style.strokeDashoffset = offset.toString();\n }, [props.percentage]);\n\n return (\n <svg>\n <circle r={getCircleRadius(props.size)} className={styles.backgroundCircle} />\n {!isPending(props.percentage) &&\n <circle\n ref={ref}\n r={getCircleRadius(props.size)}\n className={getCircleClassName(props.percentage, props.scoreThresholds)}\n />\n }\n </svg>\n );\n}\n\nexport enum PercentageIndicatorLayout {\n CircleOnly = 'circle_only',\n LabelOnly = 'label_only',\n LabelBefore = 'label_before',\n LabelInside = 'label_inside'\n}\n\ninterface PercentageIndicatorProps {\n layout: PercentageIndicatorLayout;\n percentage?: number; // Between 0 and 1 or undefined for pending\n className?: string;\n customLabel?: string;\n scoreThresholds?: ScoreThresholds;\n size?: ProgressCircleSize;\n}\n\nPercentageIndicator.defaultProps = {\n layout: PercentageIndicatorLayout.CircleOnly\n};\n\nexport function PercentageIndicator(props: PercentageIndicatorProps): JSX.Element {\n const percentageToFixed = getPercentageToFixed(props.percentage);\n\n const size = props.size ||\n (props.layout === PercentageIndicatorLayout.LabelInside\n ? ProgressCircleSize.Large\n : ProgressCircleSize.Small\n );\n\n const label = props.customLabel || getFormattedPercentage(percentageToFixed);\n\n if (props.layout === PercentageIndicatorLayout.LabelOnly)\n return (\n <span className={getColouredLabelClassName(percentageToFixed)}>\n {label}\n </span>\n );\n\n return (\n <div className={`d-flex align-items-center justify-content-between ${props.className ?? ''}`}>\n {props.layout === PercentageIndicatorLayout.LabelBefore &&\n <span className='me-2'>\n {label}\n </span>\n }\n <div className={getCircleContainerClassName(size, percentageToFixed)}>\n <ProgressCircle percentage={percentageToFixed} size={size} scoreThresholds={props.scoreThresholds} />\n {props.layout === PercentageIndicatorLayout.LabelInside &&\n <span className={styles.centredPercentageText}>\n {label}\n </span>\n }\n </div>\n </div>\n );\n}","import { ScoreThresholdDefaults, ScoreThresholds } from 'libs/shared/constants/ScoreThresholds';\n\nimport styles from './percentage-indicator.scss';\n\n/**\n * Values for width and strokeWidth are taken from progress-circle.scss.\n * If either are changed, they must be updated in both places.\n */\nconst CIRCLE_WIDTH = 2; // rem\nconst CIRCLE_WIDTH_LG = 5.8; // rem\nconst CIRCLE_STROKE_WIDTH = 0.2; // rem\nconst CIRCLE_STROKE_WIDTH_LG = 0.36; // rem\n \nexport enum ProgressCircleSize {\n Small = 'small',\n Large = 'large',\n ExtraSmall = 'extraSmall'\n}\n\nconst ProgressCircleSizeMap = {\n [ProgressCircleSize.ExtraSmall]: {\n size: CIRCLE_WIDTH\n },\n [ProgressCircleSize.Small]: {\n size: CIRCLE_WIDTH\n },\n [ProgressCircleSize.Large]: {\n size: CIRCLE_WIDTH_LG\n }\n};\n\n/**\n * radius = width / 2 - strokeWidth * 2\n */\nexport function getCircleRadius(size: ProgressCircleSize): string {\n const width = ProgressCircleSizeMap[size].size;\n const strokeWidth = size === ProgressCircleSize.Large ? CIRCLE_STROKE_WIDTH_LG : CIRCLE_STROKE_WIDTH;\n return `${width / 2 - strokeWidth * 2}rem`;\n}\n \nexport function getCircleClassName(\n percentage: number,\n scoreThresholds: ScoreThresholds = ScoreThresholdDefaults\n): string {\n if (percentage >= scoreThresholds.HIGH)\n return styles.circleSuccess;\n \n if (percentage >= scoreThresholds.MODERATE)\n return styles.circleWarning;\n \n return styles.circleDanger;\n}\n \nexport function getColouredLabelClassName(\n percentage: number,\n scoreThresholds: ScoreThresholds = ScoreThresholdDefaults\n): string {\n if (percentage >= scoreThresholds.HIGH)\n return 'text-success';\n \n if (percentage >= scoreThresholds.MODERATE)\n return 'text-warning';\n \n return 'text-danger';\n}\n \nexport function getCircleContainerClassName(size: ProgressCircleSize, percentage?: number): string {\n let className = `d-inline-block ${styles.circleContainer}`;\n \n if (size === ProgressCircleSize.Large)\n className += ` ${styles.lgCircleContainer}`;\n\n if (size === ProgressCircleSize.ExtraSmall)\n className += ` ${styles.xsCircleContainer}`;\n\n if (isPending(percentage))\n className += ` ${styles.pendingCircle}`;\n \n return className;\n}\n\nexport function getPercentageToFixed(percentage?: number): number | undefined {\n if (isPending(percentage))\n return;\n \n return +percentage.toFixed(2);\n}\n \nexport function getFormattedPercentage(percentage?: number): string {\n if (isPending(percentage))\n return `--%`;\n\n return `${Math.round(percentage * 100)}%`;\n}\n\nexport function isPending(percentage?: number): boolean {\n return typeof percentage !== 'number';\n}","export interface ScoreThresholds {\n HIGH: number;\n MODERATE: number;\n}\n\nexport const ScoreThresholdDefaults: ScoreThresholds = {\n HIGH: 0.75,\n MODERATE: 0.5\n};\n\nexport const ScoreThresholdInsights: ScoreThresholds = {\n HIGH: 0.7,\n MODERATE: 0.7\n};","export enum InteractionCorrectness {\n Correct,\n Incorrect,\n AwaitingMarking,\n \n Answered,\n UnAnswered,\n NotApplicable\n}","export enum InteractiveAnswerStatus {\n Incorrect = 0,\n Correct = 1,\n PendingReview = 2\n}","import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n internalServerError?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError,\n internalServerError: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.InternalServer) {\n if (!ignoreMap.internalServerError)\n Core.ErrorHelper.throw(new UnspecifiedError());\n return;\n }\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import { useEffect } from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { handleHttpError, HttpErrorMap, IgnoreHttpErrorMap } from 'libs/shared/errors/handlers/HttpErrorHandlers';\n\nfunction generateCacheKey(flightObjs: Array<Flight.Response<any>>): string {\n return flightObjs.map(obj => obj.statusCode).join(':');\n}\n\n// TODO: Change this to just `useHandleHttpError` and only accept a status code.\nexport function useHandleObjectError(\n _flightObjs: Flight.Response<any> | Array<Flight.Response<any>>,\n customErrors?: HttpErrorMap,\n ignoreErrors?: IgnoreHttpErrorMap\n): void {\n const flightObjs = Array.isArray(_flightObjs) ? _flightObjs : [_flightObjs];\n\n useEffect(() => {\n flightObjs.forEach(obj => {\n handleHttpError(obj.statusCode, customErrors, ignoreErrors);\n });\n }, [ generateCacheKey(flightObjs), customErrors, ignoreErrors ]);\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\n\nimport { DialogError } from 'libs/shared/errors/primitives/DialogError';\nimport { DialogOptions } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.verifiedEmailError';\n\nexport class VerifiedEmailRequiredError extends DialogError {\n public message: string;\n public liteUrl: string;\n public hasLite: boolean;\n\n constructor(message: string, liteUrl: string, hasLite: boolean) {\n super('VerifiedEmailRequiredError');\n\n this.message = message;\n this.liteUrl = liteUrl;\n this.hasLite = hasLite;\n }\n\n // @ts-ignore\n public get name(): string {\n return 'VerifiedEmailRequiredError';\n }\n\n // @ts-ignore\n public get dialogOptions(): DialogOptions {\n const href = UrlHelper.safeUrlConcat(this.liteUrl, 'settings/account');\n\n return {\n title: LanguageService.getPhrase(namespace, 'heading'),\n text: this.hasLite\n ? `${this.message} ${LanguageService.getPhrase(namespace, 'visitSettings', { href })}`\n : this.message,\n buttons: [{\n text: LanguageService.getPhrase(namespace, 'close'),\n className: 'btn btn-dark',\n success: true\n }]\n };\n }\n}","import { Core } from 'libs/common/backbone/index';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Flight } from 'libs/common/react/index';\n\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { VerifiedEmailRequiredError } from 'libs/shared/errors/general/verified-email/VerifiedEmailRequiredError';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { Config } from 'libs/shared/interfaces';\n\nexport function useVerifiedEmailRequiredErrorHandler() {\n const alerts = useAlerts();\n const { hasProduct, isLoadingProducts } = useProducts();\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n function handleGenerateReportError(xhr: Xhr, message: string, noEmailError: string) {\n if (!xhr.responseJSON || xhr.responseJSON?.type !== 'no-email') {\n alerts.error(message);\n return;\n }\n\n Core.ErrorHelper.throw(\n new VerifiedEmailRequiredError(noEmailError, config.data.liteUrl, hasProduct(ProductId.Primary))\n );\n }\n\n return {\n handleGenerateReportError,\n loading: !config.hasCompleted || isLoadingProducts\n };\n}","import { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { ContextService } from 'libs/shared/services/ContextService';\n\ninterface UpdateParamsOptions extends Core.AppLinkOptions {\n merge?: boolean;\n keysToRemove?: string[]\n}\n\nexport const AppRouteHelper = {\n /**\n * Utility to update the params on the current appRoute.\n * \n * This is built on top of ContextService rather than build into AppLink\n * as we will generally only want to update params on appRoutes, not appLinks.\n */\n updateParams(params: HashObject, options?: UpdateParamsOptions): void {\n const { appLink } = ContextService.getCurrentRoute();\n\n let currentParams = typeof(appLink.params) === 'string'\n ? Core.LocationUtils.DeserializeQueryParams(appLink.params)\n : appLink.params as HashObject;\n\n if (options.keysToRemove)\n currentParams = ObjectHelper.omit(currentParams, options.keysToRemove);\n\n const updatedParams = options?.merge\n ? { ...currentParams, ...params }\n : params;\n\n const updatedAppLink = {\n ...appLink,\n params: updatedParams\n };\n\n /**\n * This prevents us pointlessly re-triggering if we're already on the right applink.\n */\n if (ObjectHelper.isEqual(appLink, updatedAppLink))\n return;\n \n Core.AppLinkHelper.trigger(updatedAppLink, ObjectHelper.omit(options, [ 'merge', 'keysToRemove' ]));\n }\n};","import { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, InteractionTypeId, InteractiveResult, StudentAnswer } from 'libs/shared/interfaces';\n\ntype GetStudentAnswerByActionableItemId = (id: string) => string;\n\nfunction notApplicable(): InteractionCorrectness {\n return InteractionCorrectness.NotApplicable;\n}\n\nfunction awaitingMarking(): InteractionCorrectness {\n return InteractionCorrectness.AwaitingMarking;\n}\n\nfunction isMissingWordCorrect(\n interaction: Interaction,\n getStudentAnswer: GetStudentAnswerByActionableItemId\n): InteractionCorrectness {\n const items = interaction.actionableItems.filter(a => a\n .isCorrect);\n\n if (items.every(a => !getStudentAnswer(a.id)))\n return InteractionCorrectness.UnAnswered;\n\n const correct = items.every(a => a.name.trim().toLowerCase() === getStudentAnswer(a.id)?.trim().toLowerCase());\n return correct ? InteractionCorrectness.Correct : InteractionCorrectness.Incorrect;\n}\n\nfunction isMultipleChoiceCorrect(\n interaction: Interaction,\n getStudentAnswer: GetStudentAnswerByActionableItemId\n): InteractionCorrectness {\n if (interaction.actionableItems.every(a => !getStudentAnswer(a.id)))\n return InteractionCorrectness.UnAnswered;\n \n const correctItems = interaction.actionableItems.filter(a => a.isCorrect);\n\n const correct = correctItems.every(a => {\n const studentAnswer = getStudentAnswer(a.id);\n\n /**\n * In the past we've only ever checked the answer name. But since we introduced the ability to have image interactions\n * with no question text, we've need to swap to saving the id. But past submissions still have the name\n * - Sha\n */\n return studentAnswer?.toString() === a.id?.toString() || studentAnswer === a.name;\n });\n return correct ? InteractionCorrectness.Correct : InteractionCorrectness.Incorrect;\n}\n\nfunction isMarkableAnswerMarkedCorrect(\n interaction: Interaction,\n getStudentAnswer: (id: string) => StudentAnswer\n): InteractionCorrectness {\n let correctness: InteractionCorrectness;\n\n // There should only be one actionableItem\n interaction.actionableItems.forEach(item => {\n const studentAnswer = getStudentAnswer(item.id);\n\n if (!studentAnswer) {\n correctness = InteractionCorrectness.UnAnswered;\n return;\n }\n\n if (studentAnswer.status === InteractiveAnswerStatus.Correct) {\n correctness = InteractionCorrectness.Correct;\n return;\n }\n\n if (studentAnswer.status === InteractiveAnswerStatus.Incorrect) {\n correctness = InteractionCorrectness.Incorrect;\n return;\n }\n\n correctness = InteractionCorrectness.AwaitingMarking;\n });\n\n return correctness;\n}\n\ntype IsCorrectFunction = (interaction: Interaction, result: InteractiveResult) => InteractionCorrectness;\n\nfunction getGetStudentAnswer(interaction: Interaction, result: InteractiveResult): (id: string) => StudentAnswer {\n return (id: string) => {\n const attempt = result?.attempts.find(a => a.id === interaction.id);\n return attempt?.answers.find(s => s.id === id);\n };\n}\n\nfunction wrapIsMissingWordCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n\n return isMissingWordCorrect(interaction, (id: string) => {\n const answer = getStudentAnswer(id);\n return answer?.text;\n });\n}\n\nfunction wrapIsMultipleChoiceCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n\n return isMultipleChoiceCorrect(interaction, (id: string) => {\n const answer = getStudentAnswer(id);\n return answer?.text;\n });\n}\n\nfunction wrapIsMarkableAnswerMarkedCorrect(\n interaction: Interaction,\n result: InteractiveResult\n): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n return isMarkableAnswerMarkedCorrect(interaction, getStudentAnswer);\n}\n\nconst IsCorrectLookup: {[typeId: number]: IsCorrectFunction} = {\n [InteractionTypeId.Annotation]: notApplicable,\n [InteractionTypeId.Image]: notApplicable,\n [InteractionTypeId.MissingWord]: wrapIsMissingWordCorrect,\n [InteractionTypeId.MultipleChoice]: wrapIsMultipleChoiceCorrect,\n [InteractionTypeId.ShortAnswer]: wrapIsMarkableAnswerMarkedCorrect,\n [InteractionTypeId.TrueOrFalse]: wrapIsMultipleChoiceCorrect,\n [InteractionTypeId.Illustration]: wrapIsMarkableAnswerMarkedCorrect\n};\n\nfunction isInteractionCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const isCorrectFn = IsCorrectLookup[interaction.typeId];\n\n return isCorrectFn(interaction, result);\n}\n\nexport const InteractiveCorrectnessHelper = {\n notApplicable,\n awaitingMarking,\n isMissingWordCorrect,\n isMultipleChoiceCorrect,\n isInteractionCorrect\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"circleContainer\":\"p8Vgz\",\"backgroundCircle\":\"asGGE\",\"circleSuccess\":\"PXLNj\",\"circleWarning\":\"ZckRN\",\"circleDanger\":\"slBRg\",\"lgCircleContainer\":\"N8KCI\",\"xsCircleContainer\":\"RPqZ2\",\"pendingCircle\":\"DKrcq\",\"centredPercentageText\":\"tpmLR\"};"],"names":["getAnalyticsRequestKey","baseKey","filter","extra","key","start","end","userIdKey","Array","isArray","userId","sort","join","groupIdKey","groupId","customerIdKey","customerId","getInteractiveResultFilters","currentUser","shareId","currentUserId","id","currentCustomerId","dateRange","undefined","userIds","classroomsAndGroups","InteractiveResultsRequests","interactiveResultSet","interactiveId","interactiveMetadataId","success","error","always","url","data","type","HttpVerbs","normalize","mark","answerId","resultId","invalidationKeys","pendingReviews","interactiveResultsReport","useFetchInteractiveResults","requestFilter","interactiveMetadata","interactive","shouldFetchResults","I","AnalyticsFilterHelper","getAudienceAppLinkParams","appLink","params","users","classrooms","classroomGroups","getParam","param","audienceFilters","getDateRangeAppLinkParams","from","to","rangeName","dateRangeFilters","getPhrase","anonymiseUserName","user","shouldAnonymise","sessionId","seed","guid","hash","i","length","charCodeAt","Math","abs","guidToSeed","floor","Date","getMinutes","dictionaries","separator","style","groupStudents","results","scoreThreshold","groups","markingRequired","lowScore","highScore","completed","notCompleted","interactions","interactionIds","Set","map","students","forEach","s","withSummary","summary","getStudentResultsSummary","awaitingMarking","push","attempts","a","has","answers","questionId","size","percentCorrect","HIGH","MODERATE","sortedLowScore","sortedHighScore","getInteractionById","interactionId","find","toString","getMarkedAnswerId","answer","getMarkedStatus","studentResults","markedAnswers","result","studentResponse","every","status","getInteractionResultsSummary","interaction","numStudents","numCorrect","answered","unanswered","correctness","correct","numInteractions","answeredInteractions","getAudienceParams","queryParams","LanguageService","convertDateToUtcDateTimeString","date","utc","formatDateQueryParam","getReportFriendlyDate","localDate","GenerateInteractiveResultsReportView","props","minDate","currentYear","isMinDateThisYear","anonymiseUsers","SharedViewModelKeys","alerts","fetchAsync","audienceAppLinkParams","dateRangeAppLinkParams","startEndParams","dateRangePresetss","filterParams","getStartDate","getEndDate","presetRange","p","name","getPresetRangeByName","startDate","endDate","defaultRange","range","getStartEndParams","getFullYear","getMonth","disabled","tooltip","default","showSpinner","setShowSpinner","useVerifiedEmailRequiredErrorHandler","loading","handleGenerateReportError","UserRequests","InteractiveRequests","answerData","value","Popup","title","showLoadingSpinner","hasCompleted","closePopup","Text","phrase","options","dateFrom","dateTo","email","PopupButtons","onClick","variant","body","interactiveName","questions","rows","UserHelper","percentage","totalQuestions","InteractiveCorrectnessHelper","InteractionCorrectness","then","xhr","text","PercentageIndicatorLayout","ProgressCircle","ref","circle","radius","r","baseVal","circumference","PI","offset","strokeDasharray","strokeDashoffset","className","scoreThresholds","PercentageIndicator","percentageToFixed","layout","LabelInside","label","customLabel","LabelOnly","LabelBefore","defaultProps","CircleOnly","ProgressCircleSize","CIRCLE_STROKE_WIDTH","CIRCLE_STROKE_WIDTH_LG","ProgressCircleSizeMap","ExtraSmall","Small","Large","getCircleRadius","width","strokeWidth","getCircleClassName","getColouredLabelClassName","getCircleContainerClassName","isPending","getPercentageToFixed","toFixed","getFormattedPercentage","round","ScoreThresholdDefaults","ScoreThresholdInsights","InteractiveAnswerStatus","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","internalServerError","handleHttpError","info","customErrorMap","ignoreMap","statusCode","errorMap","generateCacheKey","flightObjs","obj","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","useEffect","namespace","VerifiedEmailRequiredError","message","liteUrl","hasLite","href","UrlHelper","this","buttons","DialogError","hasProduct","isLoadingProducts","config","ConfigRequests","noEmailError","responseJSON","ProductId","AppRouteHelper","updateParams","currentParams","keysToRemove","updatedParams","merge","updatedAppLink","notApplicable","isMissingWordCorrect","getStudentAnswer","items","actionableItems","isCorrect","trim","toLowerCase","isMultipleChoiceCorrect","studentAnswer","getGetStudentAnswer","attempt","wrapIsMultipleChoiceCorrect","wrapIsMarkableAnswerMarkedCorrect","item","isMarkableAnswerMarkedCorrect","IsCorrectLookup","isInteractionCorrect","isCorrectFn","typeId"],"sourceRoot":""}
@@ -1,2 +1,2 @@
1
1
  "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[6695],{27150:(e,t,r)=>{r.d(t,{A:()=>U,$:()=>w});var n=r(32735),a=r(23481),s=r(81886),i=r(15611),o=r(83345),l="userManager.userWizardBackButtons";function c(e){return"status"===e.currentStep?n.createElement(n.Fragment,null):n.createElement(i.F,{className:"btn btn-link me-2",appLink:e.appLinks.userManager},n.createElement(o.x,{namespace:l,phrase:"cancel"}))}var u=r(98269),d=r(24453),p=r(45541),m=r(96728),v="userManager.userWizardHeader";function b(e){var t=(0,p.V)(),r=t.duplicateSets,a=t.hasExistingUsers,s=n.useContext(m.e),l=s.disableNext,c=s.onClickConfirm,b=!!(null==r?void 0:r.length),f=d.O.getCurrentContext().appLink;return f.action===e.appLinks.userUploadStatus.polling.action||f.action===e.appLinks.userUploadStatus.complete.action?n.createElement(n.Fragment,null):function(){switch(f.action){case e.appLinks.userUploadPopup.action:case e.appLinks.userUploadReviewAccounts.action:return!b&&!a;case e.appLinks.userUploadFixDuplicates.action:case e.appLinks.userUploadReviewExistingAccounts.action:return!a;default:return!0}}()?n.createElement(u.Z,{className:l?"disabled":"",variant:"dark",onClick:c,disabled:l},n.createElement(o.x,{namespace:v,phrase:"create"})):n.createElement(i.F,{className:"btn btn-dark ".concat(l?"disabled":""),appLink:function(){switch(f.action){case e.appLinks.userUploadReviewAccounts.action:if(b)return e.appLinks.userUploadFixDuplicates;if(a&&e.canAddExistingUsers)return e.appLinks.userUploadReviewExistingAccounts;case e.appLinks.userUploadFixDuplicates.action:if(a&&e.canAddExistingUsers)return e.appLinks.userUploadReviewExistingAccounts;case e.appLinks.userUploadReviewExistingAccounts.action:if(e.canAddExistingUsers)return e.appLinks.userUploadConfirmation;default:return null}}(),disabled:l},n.createElement(o.x,{namespace:v,phrase:"next"}))}var f=r(19717),g=r(17291),y=r(79352),h=r(76881),k=r(89476);const E={wizardContent:"hHr3C"};var x="userManager.bulkUserUploadWizardLayout",U="bulk:user:upload:nav:lock";function w(e){var t=(0,p.V)(),r=t.users,i=t.setUsers,o=(0,k.f)();return n.useEffect(function(){if(r)return o.lock({id:U,title:a.T.getPhrase(x,"navLockTitle"),text:a.T.getPhrase(x,"navLockBody"),appLinkWhitelist:f.b.getWizardAppLinks(e.appLinks),onConfirmUnlock:function(){i(null)}}),function(){o.unlock(U)};s.Q.C$.trigger(e.appLinks.userManager,{replace:!0})},[]),n.useEffect(function(){(null==r?void 0:r.length)||(o.unlock(U),s.Q.C$.trigger(e.appLinks.userManager,{replace:!0}))},[null==r?void 0:r.length]),r?n.createElement(m.D,null,n.createElement("div",{className:"px-3"},n.createElement(g.C,{title:a.T.getPhrase(x,"bulkUpload"),currentStep:e.currentStep,loaded:!0,continueButton:n.createElement(b,{currentStep:e.currentStep,appLinks:e.appLinks,canAddExistingUsers:e.canAddExistingUsers}),backButton:n.createElement(c,{currentStep:e.currentStep,appLinks:e.appLinks}),breadcrumbs:[{name:a.T.getPhrase(x,"settingsBreadcrumb"),appLink:e.appLinks.settings},{name:a.T.getPhrase(x,e.userType===h.Y.Learner?"studentManager":"staffManager"),appLink:e.appLinks.userManager},{name:a.T.getPhrase(x,"bulkUpload"),active:!0}]}),n.createElement("div",{className:"row g-0"},n.createElement("div",{className:"col-2"},n.createElement(y.a,{steps:f.b.getSteps(e.userType,e.canAddExistingUsers),currentStep:e.currentStep})),n.createElement("div",{className:"col-10 ".concat(E.wizardContent)},e.children)))):n.createElement(n.Fragment,null)}},26055:(e,t,r)=>{r.d(t,{A:()=>n});var n=r(32735).createContext(null)},45541:(e,t,r)=>{r.d(t,{V:()=>u});var n=r(2948),a=r(38143),s=r(39739);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 o(e,t,r){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 r=t.call(e,"string");if("object"!=i(r))return r;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:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(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}function c(e,t){return Object.keys(e||{}).reduce(function(r,n){return t[n]||(r[n]=e[n]),r},{})}var u=function(){var e,t,r,i=(t=(0,n.D)(a.g.BULK_USER_UPLOAD),r=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,s,i,o=[],l=!0,c=!1;try{if(s=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;l=!1}else for(;!(l=(n=s.call(r)).done)&&(o.push(n.value),o.length!==t);l=!0);}catch(e){c=!0,a=e}finally{try{if(!l&&null!=r.return&&(i=r.return(),Object(i)!==i))return}finally{if(c)throw a}}return o}}(t,r)||function(e,t){if(e){if("string"==typeof e)return l(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)?l(e,t):void 0}}(t,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.")}()),u=i[0],d=i[1];function p(e){var t=s.P.getNewDuplicates(e);d("duplicateSets",t)}return{users:null==u?void 0:u.users,invalidUsers:null==u?void 0:u.invalidUsers,hasValidatedUsers:!!(null==u?void 0:u.invalidUsers),existingUsersHash:(null==u?void 0:u.existingUsersHash)||{},hasExistingUsers:!!Object.keys((null==u?void 0:u.existingUsersHash)||{}).length,existingUserToAdd:null==u?void 0:u.existingUserToAdd,duplicateSets:null==u?void 0:u.duplicateSets,newUsers:(null===(e=null==u?void 0:u.users)||void 0===e?void 0:e.filter(function(e){var t;return!(null===(t=null==u?void 0:u.existingUsersHash)||void 0===t?void 0:t[e.lookupId])}))||[],setUsers:function(e){d({users:e,invalidUsers:null,existingUsersHash:null}),p(e)},setInvalidUsers:function(e){return d("invalidUsers",e)},setExistingUsers:function(e){return d("existingUsersHash",e)},updateUser:function(e){var t=u.users.map(function(t){return t.lookupId!==e.lookupId?t:e});d({users:t,invalidUsers:c(null==u?void 0:u.invalidUsers,o({},e.lookupId,!0)),existingUsersHash:null==u?void 0:u.existingUsersHash}),p(t)},deleteUsers:function(e){var t,r=e.reduce(function(e,t){return e[t]=!0,e},{}),n=u.users.filter(function(e){return!r[e.lookupId]});d({users:n,invalidUsers:c(null==u?void 0:u.invalidUsers,r),existingUsersHash:c(null==u?void 0:u.existingUsersHash,r),existingUserToAdd:null===(t=null==u?void 0:u.existingUserToAdd)||void 0===t?void 0:t.filter(function(e){return!!(null==u?void 0:u.existingUsersHash[e.lookupId])})}),p(n)}}}},17291:(e,t,r)=>{r.d(t,{C:()=>i});var n=r(32735),a=r(49935),s=r(96728);function i(e){var t=n.useContext(s.e).showButtons;return n.createElement("div",{className:"d-flex justify-content-between"},e.hideHeader?n.createElement("div",null):n.createElement("div",null,n.createElement("h1",{className:"h2"},e.title),e.breadcrumbs&&n.createElement("div",{className:"pb-3"},n.createElement(a.Oo,{breadcrumbs:e.breadcrumbs}))),e.loaded&&t&&n.createElement("div",{className:"d-flex align-items-center"},e.backButton,e.continueButton))}},14177:(e,t,r)=>{r.d(t,{$:()=>w});var n=r(32735),a=r(70680),s=r(81886),i=r(20354),o=r(79447),l=r(83914),c=r(83345),u=r(4594),d=r(76881),p=r(35223),m="userManager.wizardInProgress";function v(e){var t=Math.floor(e.totalItemsComplete/e.totalItems*100)||0;return n.createElement("div",null,n.createElement("div",{className:"d-flex align-items-center mb-2"},n.createElement("h2",{className:"h5 mb-0"},n.createElement(c.x,{namespace:m,phrase:"heading",options:{percentage:t,actionName:e.actionName}})),n.createElement(l.x,{svgName:p.vn.CheckCircle})),n.createElement("p",null,n.createElement(c.x,{namespace:m,phrase:"info".concat(e.actionVerb)})),n.createElement("p",{className:"mb-1"},n.createElement("span",{className:"text-info"},e.progressVerbPhrase?n.createElement("span",null,e.progressVerbPhrase):n.createElement(c.x,{namespace:m,phrase:"progressVerb".concat(e.actionVerb)}))," ",e.objectType===u.E.User&&e.userType?n.createElement(c.x,{namespace:m,phrase:e.userType===d.Y.Learner?"progressStudents":"progressStaff",options:{totalComplete:e.totalItemsComplete,total:e.totalItems,smartCount:e.totalItems}}):e.objectType===u.E.Video?n.createElement(c.x,{namespace:m,phrase:"progressVideos",options:{totalComplete:e.totalItemsComplete,total:e.totalItems,smartCount:e.totalItems}}):n.createElement(c.x,{namespace:m,phrase:"progressItems",options:{totalComplete:e.totalItemsComplete,total:e.totalItems,smartCount:e.totalItems}})),n.createElement(o.Z,{variant:"info",now:t}))}var b="userManager.wizardSubmitted";function f(e){return n.createElement("div",null,n.createElement("div",{className:"d-flex align-items-center mb-2"},n.createElement("h2",{className:"h5 mb-0"},e.actionName?n.createElement(c.x,{namespace:b,phrase:"heading",options:{actionName:e.actionName}}):n.createElement(c.x,{namespace:b,phrase:"headingGeneric"})),n.createElement(l.x,{svgName:p.vn.CheckCircle})),n.createElement("p",null,n.createElement(c.x,{namespace:b,phrase:"info".concat(e.actionVerb)})),n.createElement("p",{className:"mb-1 text-info"},n.createElement(c.x,{namespace:b,phrase:"preparing"})),n.createElement(o.Z,{variant:"info",now:0}))}var g=r(58739),y=r(94644),h=r(89476);function k(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,s,i,o=[],l=!0,c=!1;try{if(s=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;l=!1}else for(;!(l=(n=s.call(r)).done)&&(o.push(n.value),o.length!==t);l=!0);}catch(e){c=!0,a=e}finally{try{if(!l&&null!=r.return&&(i=r.return(),Object(i)!==i))return}finally{if(c)throw a}}return o}}(e,t)||function(e,t){if(e){if("string"==typeof e)return E(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)?E(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function E(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 x=2e3,U=3;function w(e){var t=k(n.useState(null),2),r=t[0],o=t[1],l=k(n.useState(0),2),c=l[0],u=l[1],d=n.useRef(null),p=(0,h.f)(),m=(0,a.I0)();function b(){e.pollJob(E,w)}function E(t){o(t),t.status===g.K.Completed||t.status===g.K.CompletedWithError||t.status===g.K.Failed?window.setTimeout(function(){!function(){var t;e.navLockId&&p.unlock(e.navLockId);var r={jobId:e.jobId};e.userType&&(r.userType=e.userType,m({type:i.a.Actions.INVALIDATE,keys:["school:users","user:count","search:aggregation","search:users"],request:null})),e.statusCompleteAppLink?s.Q.C$.trigger(Object.assign(Object.assign({},e.statusCompleteAppLink),{params:r})):null===(t=e.onStatusCompleted)||void 0===t||t.call(e)}()},2e3):d.current=window.setTimeout(b,x)}function w(t){c===U&&(window.clearTimeout(d.current),e.navLockId&&p.unlock(e.navLockId),(0,y.r)(t)),u(function(e){return e+1}),d.current=window.setTimeout(b,x)}return n.useEffect(function(){return b(),function(){d.current&&window.clearTimeout(d.current)}},[]),r&&r.status!==g.K.Submitted&&r.status!==g.K.Queued&&r.status!==g.K.Pending&&0!==r.totalItems?n.createElement(v,{totalItems:r.totalItems,totalItemsComplete:r.processedItems,userType:e.userType,objectType:e.objectType,actionName:e.actionName,actionVerb:e.actionVerb,progressVerbPhrase:e.progressVerbPhrase}):n.createElement(f,{actionName:e.actionName,actionVerb:e.actionVerb})}},79352:(e,t,r)=>{r.d(t,{a:()=>l});var n=r(32735),a=r(23481),s=r(15611),i=a.T.encloseNamespace("shared.wizardStepList");function o(e){var t,r,a,i,o,l=n.createElement(n.Fragment,null,n.createElement("div",{className:"d-flex"},!e.hideStepNumber&&n.createElement("div",{className:"flex-shrink-0 flex-grow-0"},"".concat(e.index+1,".")," "),n.createElement("div",null,e.text)),e.subText&&n.createElement("div",{className:"ms-2 ps-1 pt-1"},e.subText)),c="px-2 py-1 mb-1 rounded d-inline-block";return e.isSelected&&(c+=" ".concat((null===(t=e.theme)||void 0===t?void 0:t.isSelectedOverride)||"bg-light-blue fw-semibold")),!e.isSelected&&e.isCompleted&&(c+=" ".concat((null===(r=e.theme)||void 0===r?void 0:r.isCompletedOverride)||"text-info")),n.createElement("li",{className:null===(a=e.theme)||void 0===a?void 0:a.item},e.isCompleted&&e.appLink?n.createElement(s.F,{appLink:e.appLink,className:"".concat(c," ").concat((null===(i=e.theme)||void 0===i?void 0:i.itemContent)||"")},l):n.createElement("div",{className:"".concat(c," ").concat((null===(o=e.theme)||void 0===o?void 0:o.itemContent)||"")},l))}function l(e){var t,r=e.steps.reduce(function(t,r,n){return r.id===e.currentStep&&(t=n+1),t},1);return n.createElement(n.Fragment,null,n.createElement("h2",{className:"h4"},i("stepNumber",{currentStep:r,totalSteps:e.steps.length})),n.createElement("ol",{className:"list-unstyled ".concat((null===(t=e.theme)||void 0===t?void 0:t.itemsContainer)||"")},e.steps.map(function(t,a){var s=t.id===e.currentStep,i=r>a+1;return n.createElement(o,{index:a,key:t.id,text:t.text,subText:t.subText,isSelected:s,isCompleted:i,appLink:!e.disableAppLinks&&t.appLink,disabled:t.disabled,theme:e.theme})})))}},58739:(e,t,r)=>{var n;r.d(t,{K:()=>n}),function(e){e[e.Submitted=0]="Submitted",e[e.Queued=1]="Queued",e[e.Pending=2]="Pending",e[e.InProgress=3]="InProgress",e[e.Completed=4]="Completed",e[e.CompletedWithError=5]="CompletedWithError",e[e.Failed=6]="Failed"}(n||(n={}))},94644:(e,t,r)=>{r.d(t,{r:()=>u});var n=r(50242),a=r(81886),s=r(67058),i=r(14553),o=r(49267),l=r(49075),c={notFound:s.d,forbidden:{rating:i.q,yearLevel:i.q,region:o.a,privacy:i.q},badRequest:l._,internalServerError:l._};function u(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e){var s;s="number"==typeof e?e:e.status;var i=Object.assign(Object.assign({},c),t);s&&a.Q.Ry.isStatusCodeError(s)&&(s!==n.o.InternalServer?s!==n.o.NotFound?s!==n.o.Forbidden?r.badRequest||a.Q.Ry.throw(new i.badRequest):r.forbidden||a.Q.Ry.throw(new i.forbidden.privacy):r.notFound||a.Q.Ry.throw(new i.notFound):r.internalServerError||a.Q.Ry.throw(new l._))}}},16695:(e,t,r)=>{r.r(t),r.d(t,{BulkUserUploadStatusPollingView:()=>f});var n=r(32735),a=r(70680),s=r(23481),i=r(20354),o=r(27150),l=r(26055),c=r(43820),u=r(14177),d=r(4594),p=r(79612),m=r(29613),v=r(18087),b="userManager.bulkUserUploadStatusPolling";function f(e){var t=(0,a.I0)(),r=(0,v.Y)(e.userType);return(0,p.M)({title:s.T.getPhrase(b,"pageTitle")}),n.createElement(l.A.Provider,{value:c.a.Primary},n.createElement(o.$,{appLinks:r,userType:e.userType,currentStep:"status",canAddExistingUsers:!0},n.createElement(u.$,{jobId:e.jobId,pollJob:function(r,n){i.a.fetch(t,m.q.getJobProgress(e.jobId,r,n))},objectType:d.E.User,userType:e.userType,statusCompleteAppLink:r.userUploadStatus.complete,actionName:s.T.getPhrase(b,"bulkUpload"),navLockId:o.A,actionVerb:"Create"})))}},29613:(e,t,r)=>{r.d(t,{q:()=>i});var n=r(99940),a=r(97395),s=r(149),i={createJob:function(e,t,r){return{url:"{gateway}/v1/batch/jobs",key:"create:job",type:n.k.POST,data:e,success:t,error:r}},getJobs:function(e){var t={},r=[],n=[];return e.cursor&&(t.cursor=e.cursor),e.sort&&("oldest"===e.sort?t.order="ASC":t.order="DESC"),e.bulkActionType?(r=Array.isArray(e.bulkActionType)?e.bulkActionType:[e.bulkActionType],t.type=r):t.type=s.O,e.userType&&(n=Array.isArray(e.userType)?e.userType:[e.userType],t.dataType=n),{url:a._.urlBuilder("{gateway}/v1/batch/jobs",t),key:"batch:jobs:".concat(e.cursor,":").concat(e.sort,":").concat(r.sort().join(":"),":").concat(n.sort().join(":"))}},getJob:function(e){return{url:"{gateway}/v1/batch/jobs/".concat(e),key:"job:".concat(e)}},getJobProgress:function(e,t,r){return{url:"{gateway}/v1/batch/jobs/".concat(e,"/progress"),key:"job:".concat(e,":progress"),invalidationKeys:"job:".concat(e,":progress"),success:t,error:r}},getJobResults:function(e,t,r,n,s){var i={status:t};return r&&(i.cursor=r),{url:a._.urlBuilder("{gateway}/v1/batch/jobs/".concat(e,"/results"),i),key:"job:".concat(e,":results:").concat(t,":").concat(r),success:n,error:s}},getYearGroupRolloverStatus:function(e){return{url:"{gateway}/v1/batch/validations/customers/".concat(e,"/year-group-roll-over"),key:"year:group:rollover:status"}},sendJobReports:function(e){return{url:"{gateway}/v1/batch/results/export",key:"send:job:reports:".concat(e.sort().join(":")),type:n.k.POST,data:{jobIds:e}}},getJobSummary:function(e){return{url:"{gateway}/v1/batch/jobs/".concat(e,"/summary"),key:"job:summary:".concat(e)}}}},79447:(e,t,r)=>{r.d(t,{Z:()=>p});var n=r(95685),a=r.n(n),s=r(32735),i=r(46304),o=r(58661),l=r(74512);function c(e,t,r){const n=(e-t)/(r-t)*100;return Math.round(1e3*n)/1e3}function u({min:e,now:t,max:r,label:n,visuallyHidden:s,striped:i,animated:o,className:u,style:d,variant:p,bsPrefix:m,...v},b){return(0,l.jsx)("div",{ref:b,...v,role:"progressbar",className:a()(u,`${m}-bar`,{[`bg-${p}`]:p,[`${m}-bar-animated`]:o,[`${m}-bar-striped`]:o||i}),style:{width:`${c(t,e,r)}%`,...d},"aria-valuenow":t,"aria-valuemin":e,"aria-valuemax":r,children:s?(0,l.jsx)("span",{className:"visually-hidden",children:n}):n})}const d=s.forwardRef(({isChild:e=!1,...t},r)=>{const n={min:0,max:100,animated:!1,visuallyHidden:!1,striped:!1,...t};if(n.bsPrefix=(0,i.vE)(n.bsPrefix,"progress"),e)return u(n,r);const{min:c,now:d,max:p,label:m,visuallyHidden:v,striped:b,animated:f,bsPrefix:g,variant:y,className:h,children:k,...E}=n;return(0,l.jsx)("div",{ref:r,...E,className:a()(h,g),children:k?(0,o.UI)(k,e=>(0,s.cloneElement)(e,{isChild:!0})):u({min:c,now:d,max:p,label:m,visuallyHidden:v,striped:b,animated:f,bsPrefix:g,variant:y},r)})});d.displayName="ProgressBar";const p=d}}]);
2
- //# sourceMappingURL=6695-4e01b4a18c-lite.chunk.js.map
2
+ //# sourceMappingURL=6695-4ae0acad94-lite.chunk.js.map