@clickview/lite 0.57.2-rc.0 → 0.57.2-rc.2

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 (100) hide show
  1. package/dist/bundles.json +2 -2
  2. package/dist/css/{3918-lite-9bd35b2c4c.chunk.css → 3918-lite-88ef54ffc6.chunk.css} +3 -1
  3. package/dist/css/{1057-lite-04173a371f.chunk.css → 8849-lite-1ad0b22428.chunk.css} +2 -1
  4. package/dist/css/{lite-app-5335e8e07a.css → lite-app-560655620c.css} +1 -1
  5. package/dist/languages/en.json +1 -1
  6. package/dist/scripts/1734-f5ffd39591-lite.chunk.js +2 -0
  7. package/dist/scripts/1734-f5ffd39591-lite.chunk.js.map +1 -0
  8. package/dist/scripts/2506-aee0b1f275-lite.chunk.js +2 -0
  9. package/dist/scripts/2506-aee0b1f275-lite.chunk.js.map +1 -0
  10. package/dist/scripts/{2564-cd82320188-lite.chunk.js → 2564-98ba0d782a-lite.chunk.js} +3 -3
  11. package/dist/scripts/{2564-cd82320188-lite.chunk.js.map → 2564-98ba0d782a-lite.chunk.js.map} +1 -1
  12. package/dist/scripts/2615-e9b2938c18-lite.chunk.js +3 -0
  13. package/dist/scripts/2615-e9b2938c18-lite.chunk.js.map +1 -0
  14. package/dist/scripts/2788-86687fd69d-lite.chunk.js +2 -0
  15. package/dist/scripts/2788-86687fd69d-lite.chunk.js.map +1 -0
  16. package/dist/scripts/2820-b3d1688da0-lite.chunk.js +2 -0
  17. package/dist/scripts/2820-b3d1688da0-lite.chunk.js.map +1 -0
  18. package/dist/scripts/2978-b7bcc3eac4-lite.chunk.js +2 -0
  19. package/dist/scripts/2978-b7bcc3eac4-lite.chunk.js.map +1 -0
  20. package/dist/scripts/3391-5e26ca5ece-lite.chunk.js +2 -0
  21. package/dist/scripts/3391-5e26ca5ece-lite.chunk.js.map +1 -0
  22. package/dist/scripts/{3667-f9f546136c-lite.chunk.js → 3667-149e98454c-lite.chunk.js} +3 -3
  23. package/dist/scripts/{3667-f9f546136c-lite.chunk.js.map → 3667-149e98454c-lite.chunk.js.map} +1 -1
  24. package/dist/scripts/3918-43b95cb315-lite.chunk.js +2 -0
  25. package/dist/scripts/3918-43b95cb315-lite.chunk.js.map +1 -0
  26. package/dist/scripts/4113-d6411052c4-lite.chunk.js +2 -0
  27. package/dist/scripts/4113-d6411052c4-lite.chunk.js.map +1 -0
  28. package/dist/scripts/4137-bef0be4a57-lite.chunk.js +3 -0
  29. package/dist/scripts/4137-bef0be4a57-lite.chunk.js.map +1 -0
  30. package/dist/scripts/4266-42463e0c33-lite.chunk.js +3 -0
  31. package/dist/scripts/4266-42463e0c33-lite.chunk.js.map +1 -0
  32. package/dist/scripts/5817-84b8e83c19-lite.chunk.js +3 -0
  33. package/dist/scripts/5817-84b8e83c19-lite.chunk.js.map +1 -0
  34. package/dist/scripts/{6433-ff27a3c867-lite.chunk.js → 6433-ad3992c23a-lite.chunk.js} +2 -2
  35. package/dist/scripts/{6433-ff27a3c867-lite.chunk.js.map → 6433-ad3992c23a-lite.chunk.js.map} +1 -1
  36. package/dist/scripts/7434-34137ad94a-lite.chunk.js +2 -0
  37. package/dist/scripts/7434-34137ad94a-lite.chunk.js.map +1 -0
  38. package/dist/scripts/{7556-79099a07fc-lite.chunk.js → 7556-69f8cb3b20-lite.chunk.js} +3 -3
  39. package/dist/scripts/7556-69f8cb3b20-lite.chunk.js.map +1 -0
  40. package/dist/scripts/{8095-777a5c5ddf-lite.chunk.js → 8095-afb976fac0-lite.chunk.js} +2 -2
  41. package/dist/scripts/8095-afb976fac0-lite.chunk.js.map +1 -0
  42. package/dist/scripts/839-f8478d27f8-lite.chunk.js +2 -0
  43. package/dist/scripts/839-f8478d27f8-lite.chunk.js.map +1 -0
  44. package/dist/scripts/8489-7779fd40b3-lite.chunk.js +3 -0
  45. package/dist/scripts/8489-7779fd40b3-lite.chunk.js.map +1 -0
  46. package/dist/scripts/8849-020bfd8cdd-lite.chunk.js +2 -0
  47. package/dist/scripts/8849-020bfd8cdd-lite.chunk.js.map +1 -0
  48. package/dist/scripts/bundle-fb8200eefd.min.js +3 -0
  49. package/dist/scripts/bundle-fb8200eefd.min.js.map +1 -0
  50. package/package.json +1 -1
  51. package/dist/scripts/1057-3c48d4553a-lite.chunk.js +0 -2
  52. package/dist/scripts/1057-3c48d4553a-lite.chunk.js.map +0 -1
  53. package/dist/scripts/1683-57c0175d4e-lite.chunk.js +0 -2
  54. package/dist/scripts/1683-57c0175d4e-lite.chunk.js.map +0 -1
  55. package/dist/scripts/1734-bbca52585c-lite.chunk.js +0 -2
  56. package/dist/scripts/1734-bbca52585c-lite.chunk.js.map +0 -1
  57. package/dist/scripts/232-278263e5f8-lite.chunk.js +0 -3
  58. package/dist/scripts/232-278263e5f8-lite.chunk.js.map +0 -1
  59. package/dist/scripts/2615-90d4cdd835-lite.chunk.js +0 -3
  60. package/dist/scripts/2615-90d4cdd835-lite.chunk.js.map +0 -1
  61. package/dist/scripts/2788-013bbba554-lite.chunk.js +0 -2
  62. package/dist/scripts/2788-013bbba554-lite.chunk.js.map +0 -1
  63. package/dist/scripts/312-2458059ebb-lite.chunk.js +0 -2
  64. package/dist/scripts/312-2458059ebb-lite.chunk.js.map +0 -1
  65. package/dist/scripts/3918-2855f0da2a-lite.chunk.js +0 -2
  66. package/dist/scripts/3918-2855f0da2a-lite.chunk.js.map +0 -1
  67. package/dist/scripts/4137-f0ac17da1f-lite.chunk.js +0 -3
  68. package/dist/scripts/4137-f0ac17da1f-lite.chunk.js.map +0 -1
  69. package/dist/scripts/4654-6fedfb863f-lite.chunk.js +0 -2
  70. package/dist/scripts/4654-6fedfb863f-lite.chunk.js.map +0 -1
  71. package/dist/scripts/5817-900efca702-lite.chunk.js +0 -3
  72. package/dist/scripts/5817-900efca702-lite.chunk.js.map +0 -1
  73. package/dist/scripts/7237-86c18f2701-lite.chunk.js +0 -2
  74. package/dist/scripts/7237-86c18f2701-lite.chunk.js.map +0 -1
  75. package/dist/scripts/7434-366d4ae5e0-lite.chunk.js +0 -2
  76. package/dist/scripts/7434-366d4ae5e0-lite.chunk.js.map +0 -1
  77. package/dist/scripts/7556-79099a07fc-lite.chunk.js.map +0 -1
  78. package/dist/scripts/8095-777a5c5ddf-lite.chunk.js.map +0 -1
  79. package/dist/scripts/839-889090dc50-lite.chunk.js +0 -2
  80. package/dist/scripts/839-889090dc50-lite.chunk.js.map +0 -1
  81. package/dist/scripts/8489-6e8c4dd60f-lite.chunk.js +0 -3
  82. package/dist/scripts/8489-6e8c4dd60f-lite.chunk.js.map +0 -1
  83. package/dist/scripts/897-399a877281-lite.chunk.js +0 -2
  84. package/dist/scripts/897-399a877281-lite.chunk.js.map +0 -1
  85. package/dist/scripts/9201-899c885914-lite.chunk.js +0 -2
  86. package/dist/scripts/9201-899c885914-lite.chunk.js.map +0 -1
  87. package/dist/scripts/bundle-4b58e56927.min.js +0 -3
  88. package/dist/scripts/bundle-4b58e56927.min.js.map +0 -1
  89. /package/dist/css/{1683-lite-bdd5b6edf8.chunk.css → 2506-lite-bdd5b6edf8.chunk.css} +0 -0
  90. /package/dist/css/{7237-lite-a8e87f096f.chunk.css → 2820-lite-a8e87f096f.chunk.css} +0 -0
  91. /package/dist/scripts/{2564-cd82320188-lite.chunk.js.LICENSE.txt → 2564-98ba0d782a-lite.chunk.js.LICENSE.txt} +0 -0
  92. /package/dist/scripts/{2615-90d4cdd835-lite.chunk.js.LICENSE.txt → 2615-e9b2938c18-lite.chunk.js.LICENSE.txt} +0 -0
  93. /package/dist/scripts/{3667-f9f546136c-lite.chunk.js.LICENSE.txt → 3667-149e98454c-lite.chunk.js.LICENSE.txt} +0 -0
  94. /package/dist/scripts/{4137-f0ac17da1f-lite.chunk.js.LICENSE.txt → 4137-bef0be4a57-lite.chunk.js.LICENSE.txt} +0 -0
  95. /package/dist/scripts/{232-278263e5f8-lite.chunk.js.LICENSE.txt → 4266-42463e0c33-lite.chunk.js.LICENSE.txt} +0 -0
  96. /package/dist/scripts/{5817-900efca702-lite.chunk.js.LICENSE.txt → 5817-84b8e83c19-lite.chunk.js.LICENSE.txt} +0 -0
  97. /package/dist/scripts/{6433-ff27a3c867-lite.chunk.js.LICENSE.txt → 6433-ad3992c23a-lite.chunk.js.LICENSE.txt} +0 -0
  98. /package/dist/scripts/{7556-79099a07fc-lite.chunk.js.LICENSE.txt → 7556-69f8cb3b20-lite.chunk.js.LICENSE.txt} +0 -0
  99. /package/dist/scripts/{8489-6e8c4dd60f-lite.chunk.js.LICENSE.txt → 8489-7779fd40b3-lite.chunk.js.LICENSE.txt} +0 -0
  100. /package/dist/scripts/{bundle-4b58e56927.min.js.LICENSE.txt → bundle-fb8200eefd.min.js.LICENSE.txt} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/3918-43b95cb315-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/analytics/components/engagement-heat-map/engagement-heat-map.scss","file:///app/packages/libs/shared/src/apps/analytics/components/engagement-heat-map/EngagementHeatMap.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insight-card/insight-card.scss","file:///app/packages/libs/shared/src/apps/analytics/components/insight-card/InsightCard.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insight-chart/InsightChart.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insight-chart/insight-chart.scss","file:///app/packages/libs/shared/src/apps/analytics/components/insight-student-list/insight-student-list.scss","file:///app/packages/libs/shared/src/apps/analytics/components/insight-student-list/InsightStudentList.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/devices/insight-devices.scss","file:///app/packages/libs/shared/src/apps/analytics/components/insights/devices/InsightDevices.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/heatmap/insight-heatmap.scss","file:///app/packages/libs/shared/src/apps/analytics/components/insights/heatmap/InsightHeatmap.tsx","file:///app/packages/libs/shared/src/apps/analytics/utils/EngagementUtils.ts","file:///app/packages/libs/shared/src/apps/share/components/recipient-item/user-recipient-item-metadata/UserRecipientItemMetadata.tsx","file:///app/packages/libs/shared/src/flight-requests/VideoViewRequests.ts","file:///app/packages/libs/shared/src/apps/analytics/components/insights/students-not-watched/InsightStudentsNotWatched.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/students-watched/InsightStudentsWatched.tsx","file:///app/packages/projects/lite/src/apps/insights/views/video/overview/VideoInsightsOverviewView.tsx","file:///app/packages/projects/lite/src/apps/insights/views/video/overview/VideoInsightsOverviewUtils.ts","file:///app/packages/libs/shared/src/apps/share/components/recipient-item/recipient-item.scss"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"heatMap\":\"epapa\",\"legend\":\"uhH4p\"};","import React from 'react';\nimport chroma from 'chroma-js';\n\nimport { getFullHeatMap } from 'libs/shared/apps/analytics/utils/EngagementUtils';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Engagement } from 'libs/shared/interfaces';\n\nimport styles from './engagement-heat-map.scss';\n\nconst namespace = 'shared.engagementHeatMap';\n\nconst ZERO_COLOUR = '#f1f1f1';\nconst MIN_COLOUR = '#daf07d';\nconst MAX_COLOUR = '#08bd1a';\n\nconst COLOUR_SCALE = chroma.scale([ MIN_COLOUR, MAX_COLOUR ]);\n\nconst LEGEND_VALUES = [ 0, 0.01, 0.25, 0.5, 0.75, 1 ];\n\nfunction getBackgroundColor(value: number, max: number): string {\n if (!value)\n return ZERO_COLOUR;\n\n return COLOUR_SCALE(value / max).hex();\n}\n\nfunction getGradient(data: number[], max: number): string {\n const gradient: string[] = [];\n\n for (let i = 0; i < data.length; i++) {\n const previousValue = i > 0 && data[i - 1];\n const currentValue = data[i];\n const nextValue = i < data.length - 1 && data[i + 1];\n\n /**\n * We want to capture colour changes but if a value has the same value\n * of both of its neighbours, we can skip it.\n */\n if (currentValue === previousValue && currentValue === nextValue)\n continue;\n\n gradient.push(`${getBackgroundColor(currentValue, max)} ${100 / data.length * i}%`);\n }\n\n return `linear-gradient(to right, ${gradient.join(',')})`;\n}\n\nexport function EngagementHeatMapLegend(): JSX.Element {\n const max = Math.max(...LEGEND_VALUES);\n const legendSquareWidthPercentage = 100 / LEGEND_VALUES.length;\n\n return (\n <div className='d-flex justify-content-between w-100'>\n <Text namespace={namespace} phrase='less' />\n <div className={`d-flex mx-1 flex-grow-1 ${styles.legend}`}>\n {LEGEND_VALUES.map((val, idx) => (\n <div\n key={idx}\n style={{\n width: `${legendSquareWidthPercentage}%`,\n backgroundColor: getBackgroundColor(val, max)\n }}\n />\n ))}\n </div>\n <Text namespace={namespace} phrase='more' />\n </div>\n );\n}\n\ninterface EngagementHeatMapProps {\n engagement: Engagement;\n max?: number;\n className?: string;\n}\n\nexport function EngagementHeatMap(props: EngagementHeatMapProps): JSX.Element {\n const heatMap = getFullHeatMap(props.engagement);\n const max = props.max ?? Math.max(...heatMap);\n\n return (\n <div\n className={`border rounded ${styles.heatMap} ${props.className ?? ''}`}\n style={{\n background: getGradient(heatMap, max)\n }}\n />\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"icon\":\"sAmpy\",\"count\":\"faDs4\"};","import React from 'react';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\n\nimport styles from './insight-card.scss';\n\ninterface InsightCardProps extends React.PropsWithChildren {\n svgName: string;\n svgClassName: string;\n title: string;\n subtitle?: string;\n count?: number;\n}\n\nexport function InsightCard(props: InsightCardProps) {\n return (\n <section className='d-flex flex-column border border-light rounded p-3 h-100'>\n <div className='d-flex align-items-center mb-2'>\n <div className={`${styles.icon} ${props.svgClassName} rounded-circle d-flex align-items-center justify-content-center`}>\n <SvgContainer svgName={props.svgName} />\n </div>\n <div className='d-flex flex-column ms-2'>\n <h2 className='h6 mb-0'>{props.title}</h2>\n {props.subtitle && <p className='text-secondary font-size-sm mb-0'>{props.subtitle}</p>}\n </div>\n {typeof props.count === 'number' && (\n <div className={`${styles.count} d-flex justify-content-center align-items-center bg-light rounded-circle ms-auto`}>\n {props.count}\n </div>\n )}\n </div>\n {props.children}\n </section>\n );\n}","import React from 'react';\nimport Highcharts from 'highcharts';\nimport HighchartsReact from 'highcharts-react-official';\n\nimport { ChartData } from 'libs/shared/apps/analytics/interfaces/ChartData';\n\nimport styles from './insight-chart.scss';\n\nconst getStaticChartOptions = (label: string): Highcharts.Options => {\n return {\n title: {\n text: null\n },\n credits: {\n enabled: false\n },\n yAxis: {\n title: {\n text: null\n },\n labels: {\n enabled: false\n },\n gridLineWidth: 0,\n min: 0,\n tickAmount: 1\n },\n xAxis: {\n title: {\n text: label,\n style: {\n color: '#313543',\n fontSize: '12px'\n }\n },\n labels: {\n style: {\n color: '#313543',\n fontSize: '12px'\n }\n },\n className: styles.font,\n lineWidth: 0\n },\n legend: {\n enabled: false\n },\n chart: {\n type: 'column',\n backgroundColor: 'transparent',\n height: '160px',\n spacingTop: 20\n },\n plotOptions: {\n column: {\n dataLabels: {\n enabled: false\n },\n enableMouseTracking: false,\n minPointLength: 8\n }\n }\n };\n};\n\ninterface InsightChartProps {\n label: string;\n chartData: ChartData;\n}\n\nexport function InsightChart(props: InsightChartProps) {\n function getChartOptions(): Highcharts.Options {\n const data = props.chartData;\n const staticChartOptions = getStaticChartOptions(props.label);\n\n return {\n ...staticChartOptions,\n xAxis: {\n ...staticChartOptions.xAxis,\n categories: data.categories\n },\n series: data.series\n };\n }\n\n return (\n <HighchartsReact\n highcharts={Highcharts}\n options={getChartOptions()}\n />\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"font\":\"nSTtI\"};","// extracted by mini-css-extract-plugin\nexport default {\"avatar\":\"uMuZt\",\"image\":\"WdKiU\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { UserRecipientItemMetadata } from 'libs/shared/apps/share/components/recipient-item/user-recipient-item-metadata/UserRecipientItemMetadata';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { PercentageIndicator } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { User } from 'libs/shared/interfaces';\n\nimport styles from './insight-student-list.scss';\n\nconst MAX_ITEMS = 3;\n\ninterface UserPercentage extends User {\n percentage?: number;\n}\n\ninterface InsightStudentListProps {\n students: UserPercentage[];\n imageUrl: string;\n imageCdnUrl: string;\n appLink: Core.AppLink;\n description: string;\n appLinkText: string;\n percentages?: number[];\n anonymiseUsers: boolean;\n}\n\nexport function InsightStudentList(props: InsightStudentListProps) {\n return (\n <>\n {props.students.length ? (\n <ul className='list-unstyled mb-2'>\n {props.students.slice(0, MAX_ITEMS).map((student, index) => (\n <li key={index} className='d-flex align-items-center mb-2'>\n <UserRecipientItemMetadata\n user={student}\n imageCdnUrl={props.imageCdnUrl}\n avatarClassName={styles.avatar}\n detailsClassName='ms-2'\n showDisplayName\n showSubText={false}\n anonymiseUsers={props.anonymiseUsers}\n />\n\n <div className='d-flex align-items-center ms-auto'>\n <span className='me-1'>{student.percentage === undefined ? '- ' : Math.round(student.percentage * 100)}%</span>\n <PercentageIndicator percentage={student.percentage} />\n </div>\n </li>\n ))}\n </ul>\n ) : (\n <div className='text-center'>\n <img className={`${styles.image} mb-2`} src={props.imageUrl} />\n <p className='text-secondary mb-0' dangerouslySetInnerHTML={{ __html: props.description }} />\n </div>\n )}\n\n {!!props.students.length && (\n <AppLink appLink={props.appLink} className='text-info mt-auto'>\n {props.appLinkText}\n </AppLink>\n )}\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"font\":\"xTiKg\",\"purpleChart\":\"OPcvi\",\"grayChart\":\"HlWj7\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightChart } from 'libs/shared/apps/analytics/components/insight-chart/InsightChart';\nimport { GroupedAnalyticsCount } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { ChartData } from 'libs/shared/apps/analytics/interfaces/ChartData';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './insight-devices.scss';\n\nconst namespace = 'shared.insightDevices';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\n// Names from UserAgentHelper.getOperatingSystem()\nfunction getDeviceType(name: string) {\n switch (name) {\n case 'Android':\n case 'Windows Phone':\n case 'iOS':\n case 'BlackBerry':\n return 'Mobile';\n case 'Linux':\n case 'Unix':\n case 'Macintosh':\n case 'Windows':\n return 'Computer';\n }\n}\n\ninterface InsightDevicesProps {\n osCount: GroupedAnalyticsCount[]\n}\n\nexport function InsightDevices(props: InsightDevicesProps) {\n const categoriesData = getCategoriesData();\n const highestDeviceCount = getHighestDeviceCount();\n\n function getCategoriesData() {\n const defaultDevices: HashObject = { Phone: 0, Computer: 0 };\n\n if (!props.osCount?.length)\n return defaultDevices;\n\n return props.osCount.reduce((acc, group) => {\n if (!group.name) return acc;\n\n const deviceCategory = getDeviceType(group.name);\n\n acc[deviceCategory] = acc[deviceCategory] + group.count;\n\n return acc;\n }, defaultDevices);\n }\n\n function getHighestDeviceCount() {\n if (!props.osCount?.length) return null;\n\n return props.osCount.reduce((acc, group) => group.name && group.count > acc.count\n ? group\n : ArrayHelper.first(props.osCount));\n }\n\n function getChartData(): ChartData {\n return {\n categories: Object.keys(categoriesData),\n series: [{\n type: 'column',\n borderRadius: 4,\n dataLabels: {\n enabled: true,\n style: {\n fontSize: '12px',\n fontWeight: 'normal'\n },\n inside: false,\n overflow: 'allow',\n crop: false,\n className: styles.font\n },\n data: Object.keys(categoriesData).map(category => ({\n className: `${categoriesData[category] === 0 ? styles.grayChart : styles.purpleChart} ${categoriesData[category] !== highestDeviceCount?.count ? 'opacity-25' : ''}`,\n y: categoriesData[category]\n }))\n }]\n };\n }\n\n const chartData = getChartData();\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgClassName='bg-light-ultramarine text-ultramarine'\n svgName={cvSvgLibrary.Monitor}\n >\n <p className='mb-0'>\n {props.osCount?.filter(group => group.name).length\n ? (\n <Text\n namespace={namespace}\n phrase='description'\n options={{ device: getDeviceType(highestDeviceCount?.name)?.toLowerCase() }}\n />\n ) : (\n <Text\n namespace={namespace}\n phrase='notViewed'\n />\n )}\n </p>\n\n <div className='position-relative mt-auto'>\n <InsightChart label={getPhrase('title')} chartData={chartData} />\n </div>\n </InsightCard>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"heatMap\":\"Rfr9N\",\"heatMapTimepointIndicator\":\"s6JbA\",\"heatMapTimepointIndicatorVisible\":\"mgjWX\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EngagementHeatMap } from 'libs/shared/apps/analytics/components/engagement-heat-map/EngagementHeatMap';\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Engagement } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './insight-heatmap.scss';\n\nconst namespace = 'shared.insightHeatmap';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightHeatmapProps {\n engagement: Engagement;\n heatmapAppLink: Core.AppLink;\n}\n\nexport function InsightHeatmap(props: InsightHeatmapProps) {\n const engagementRate = props.engagement.engagementRate > 0 ? Math.round(props.engagement.engagementRate * 100) : null;\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Timer}\n svgClassName='bg-light-green text-green'\n >\n <div className='mb-2'>\n <p className='mb-0'>\n {engagementRate\n ? (\n <Text namespace={namespace} phrase='everyoneWatched' options={{ engagementRate }} />\n )\n : <Text namespace={namespace} phrase='notWatched' />\n }\n </p>\n {engagementRate &&\n <AppLink appLink={props.heatmapAppLink} className='text-info'>\n <Text namespace={namespace} phrase='viewHeatmap' />\n </AppLink>\n }\n </div>\n\n <div className='mb-2'>\n <EngagementHeatMap\n engagement={props.engagement}\n className={styles.heatMap}\n />\n </div>\n\n <p className='h3 text-center mb-2'>{engagementRate || '--'}%</p>\n <p className='text-center mb-0 font-size-sm'><Text namespace={namespace} phrase='amountWatched' /></p>\n </InsightCard>\n );\n}","import { Engagement } from 'libs/shared/interfaces';\n\n/**\n * The heat map in the API response won't contain trailing zeros so we need to add those\n * in manually.\n */\nexport function getFullHeatMap(engagement: Engagement): number[] {\n return (new Array(Math.ceil(engagement.videoDuration))).fill(null).map((t, idx) => engagement.heatMap[idx] || 0);\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { anonymiseUserName } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { BaseObject, User } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from '../recipient-item.scss';\n\nconst namespace = 'shared.userRecipientItemMetadata';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getSubText(user: User): string {\n const userType = UserHelper.getUserType(user);\n const role = UserHelper.getUserRole(user);\n\n if (userType === UserGroup.Staff) {\n if (role === UserRole.Admin)\n return getPhrase('admin');\n\n return getPhrase('staff');\n }\n\n const yearGroup = UserHelper.getYearGroup(user);\n\n if (yearGroup?.name)\n return yearGroup.name;\n\n return getPhrase('student');\n}\n\nUserRecipientItemMetadata.defaults = {\n showSubText: true\n};\n\ninterface UserRecipientItemMetadataProps {\n user: User;\n imageCdnUrl: string;\n detailsClassName?: string;\n avatarClassName?: string;\n showDisplayName: boolean;\n showSubText?: boolean;\n anonymiseUsers?: boolean;\n getSubText?: (user: BaseObject) => string;\n}\n\nexport function UserRecipientItemMetadata(props: UserRecipientItemMetadataProps): JSX.Element {\n return (\n <>\n <div className={`${styles.avatarContainer} ${props.avatarClassName} d-inline-block`}>\n <Avatar\n imageUrl={props.user.avatar?.url}\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(props.user.name, props.user.surname)}\n />\n </div>\n\n <div className={props.detailsClassName}>\n <h4 className='font-size-normal fw-normal m-0'>\n {props.anonymiseUsers\n ? anonymiseUserName(props.user, true)\n : props.showDisplayName\n ? UserHelper.getDisplayName(props.user)\n : UserHelper.getFullName(props.user)\n }\n </h4>\n {props.showSubText && <p className='text-secondary m-0'>{props.getSubText ? props.getSubText(props.user) : getSubText(props.user)}</p>}\n </div>\n </>\n );\n}","import { Xhr } from 'libs/common/backbone/interfaces/Xhr';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { VideoViewEventResponse } from 'libs/shared/apps/analytics/interfaces/VideoViewEvent';\nimport { AnalyticsRequestFilter, Engagement, IndividualEngagementResponse } from 'libs/shared/interfaces';\nimport { getAnalyticsRequestKey } from 'libs/shared/utils/AnalyticsRequestUtils';\n\nexport const VideoViewRequests = {\n individualEngagement(\n objectId: string,\n filter: AnalyticsRequestFilter,\n sharerId?: string,\n success?: (data: IndividualEngagementResponse) => void,\n error?: (xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n const queryParams: HashObject = {\n objectId,\n ...filter\n };\n\n if (sharerId)\n queryParams.sharerId = sharerId;\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/analytics/heat-map', queryParams),\n key: getAnalyticsRequestKey(`engagement:${objectId}`, filter, sharerId),\n formatData: (data: any) => {\n return {\n ...data,\n data: data.data?.map((d: any) => ({\n ...d,\n heatMap: d.heatMap ?? []\n }))\n };\n },\n normalize: false,\n success,\n error,\n always\n };\n },\n \n aggregateEngagement(\n objectId: string,\n filter: AnalyticsRequestFilter,\n sharerId?: string,\n success?: (data: Engagement) => void,\n error?: (xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n const queryParams: HashObject = {\n objectId,\n ...filter\n };\n\n if (sharerId)\n queryParams.sharerId = sharerId;\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/analytics/heat-map/aggregations', queryParams),\n key: getAnalyticsRequestKey(`aggregate:engagement:${objectId}`, filter, sharerId),\n formatData: (data: Engagement) => {\n return {\n ...data,\n heatMap: data.heatMap ?? []\n };\n },\n normalize: false,\n success,\n error,\n always\n };\n },\n \n views(\n filter: AnalyticsRequestFilter,\n objectId?: string,\n sharerId?: string,\n success?: (data: VideoViewEventResponse) => void,\n error?: (xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n let baseKey = 'video:views';\n\n if (objectId)\n baseKey += `:${objectId}`;\n\n const queryParams: HashObject = {\n objectId,\n ...filter,\n timeOffset: DateHelper.getTimezoneOffset()\n };\n\n if (sharerId)\n queryParams.sharerId = sharerId;\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/analytics/video-views', queryParams),\n key: getAnalyticsRequestKey(baseKey, filter, sharerId),\n normalize: false,\n success,\n error,\n always\n };\n }\n};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { User } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightStudentsNotWatched';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightStudentsNotWatchedProps {\n students: User[];\n imageCdnUrl: string;\n imageUrl: string;\n heatmapAppLink: Core.AppLink;\n watchedIds: string[];\n anonymiseUsers: boolean;\n}\n\nexport function InsightStudentsNotWatched(props: InsightStudentsNotWatchedProps) {\n const studentsNotWatched = props.students?.filter(student => !props.watchedIds?.includes(student.id)) || [];\n\n return (\n <InsightCard\n title={getPhrase('title')}\n // TODO: Replace icon\n svgName={cvSvgLibrary.Trending}\n svgClassName='bg-light-teal text-teal'\n >\n <InsightStudentList\n students={studentsNotWatched}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.imageUrl}\n description={getPhrase('studentsDisplay')}\n appLink={props.heatmapAppLink}\n appLinkText={getPhrase('viewAll')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { User } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightStudentsWatched';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightWatchedProps {\n students: User[];\n imageCdnUrl: string;\n heatmapAppLink: Core.AppLink;\n imageUrl: string;\n anonymiseUsers: boolean;\n}\n\nexport function InsightStudentsWatched(props: InsightWatchedProps) {\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Flag}\n svgClassName='bg-light-indigo text-indigo'\n count={props.students.length}\n >\n <InsightStudentList\n students={props.students}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.imageUrl}\n description={getPhrase('studentsDisplay')}\n appLink={props.heatmapAppLink}\n appLinkText={getPhrase('viewAll')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { InsightDevices } from 'libs/shared/apps/analytics/components/insights/devices/InsightDevices';\nimport { InsightHeatmap } from 'libs/shared/apps/analytics/components/insights/heatmap/InsightHeatmap';\nimport { InsightStudentsNotWatched } from 'libs/shared/apps/analytics/components/insights/students-not-watched/InsightStudentsNotWatched';\nimport { InsightStudentsWatched } from 'libs/shared/apps/analytics/components/insights/students-watched/InsightStudentsWatched';\nimport { BaseAnalyticsEventResponse } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\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 { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoViewRequests } from 'libs/shared/flight-requests/VideoViewRequests';\nimport { BasePaginatedCollection, Config, CurrentUser, Engagement, User, VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { getInsightsClipTabs, getInsightsVideoTabs } from 'apps/insights/utils/InsightsAppLinkUtils';\nimport { InsightsHeaderView } from 'apps/insights/views/header/InsightsHeaderView';\nimport { getVideoInsightsAppLinks } from 'apps/insights/views/video/overview/VideoInsightsOverviewUtils';\n\nconst namespace = 'insights.videoInsightsOverview';\n\ninterface VideoInsightsViewProps {\n videoId: string;\n typeId: MasterType;\n}\n\nexport function VideoInsightsOverviewView(props: VideoInsightsViewProps) {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const videoRequest = VideoHelper.getVideoRequest(props.videoId, props.typeId);\n const video = Flight.useBasicFetch<VideoTypes>(videoRequest);\n\n const audienceAppLinkParams = AnalyticsFilterHelper.getAudienceAppLinkParams();\n const dateRangeAppLinkParams = AnalyticsFilterHelper.getDateRangeAppLinkParams();\n const requestFilter = {\n ...getStartEndParams(getInsightsDateRangePresets(), dateRangeAppLinkParams),\n ...getAudienceParams(audienceAppLinkParams)\n };\n\n const aggregateEngagement = Flight.useBasicFetch<Engagement>(\n VideoViewRequests.aggregateEngagement(\n props.videoId,\n requestFilter,\n currentUser.data.id\n )\n );\n\n const classroomFilterOnly =\n audienceAppLinkParams.classrooms?.length === 1 && !audienceAppLinkParams.classroomGroups?.length;\n const classroomStudents = Flight.useBasicFetch<BasePaginatedCollection<User>>(classroomFilterOnly &&\n ClassroomRequests.getClassroomStudents(ArrayHelper.first(audienceAppLinkParams.classrooms)));\n\n const shareRecipients = Flight.useBasicFetch<User[]>(aggregateEngagement.data?.userIds &&\n ShareRequests.getRecipientsById(aggregateEngagement.data.userIds, currentUser.data.customerId));\n\n const videoViews = Flight.useBasicFetch<BaseAnalyticsEventResponse>(currentUser.data &&\n VideoViewRequests.views(requestFilter, props.videoId, currentUser.data.id));\n\n function getStudentsList() {\n if (!shareRecipients.data) return [];\n\n return Object.values(shareRecipients.data);\n }\n\n const hasDataLoaded =\n currentUser.data &&\n config.data &&\n video.data &&\n aggregateEngagement.data &&\n (!classroomFilterOnly || classroomStudents.data);\n\n if (!hasDataLoaded) return <></>;\n\n const params = {\n ...audienceAppLinkParams,\n ...dateRangeAppLinkParams\n };\n\n const videoInsightsAppLinks = getVideoInsightsAppLinks(props.videoId, params);\n\n function getInsightsOverviewTabs() {\n if (video.data.typeId === MasterType.Clip) {\n return getInsightsClipTabs(video.data.id, 'overview', params);\n }\n\n return getInsightsVideoTabs(video.data.id, 'overview', params);\n }\n\n return (\n <div className='px-3'>\n <InsightsHeaderView\n video={video.data}\n audienceAppLinkParams={audienceAppLinkParams}\n dateRangeAppLinkParams={dateRangeAppLinkParams}\n tabs={getInsightsOverviewTabs()}\n />\n\n <section className='mb-5'>\n <h2 className='h4'>\n <Text namespace={namespace} phrase='studentViewing' />\n <span>: {getStudentsList().length}{classroomStudents.data ? `/${classroomStudents.data.data.length}` : ''}</span>\n </h2>\n <div className='row g-3'>\n {classroomFilterOnly && (\n <div className='col-12 col-md'>\n <InsightStudentsNotWatched\n students={classroomStudents.data.data}\n watchedIds={aggregateEngagement.data.userIds}\n imageCdnUrl={config.data.imageCdnUrl}\n heatmapAppLink={videoInsightsAppLinks.heatmapAppLink}\n imageUrl={ImageUrls.Insights.AVATAR}\n anonymiseUsers={anonymiseUsers}\n />\n </div>\n )}\n <div className='col-12 col-md'>\n <InsightStudentsWatched\n students={getStudentsList()}\n imageCdnUrl={config.data.imageCdnUrl}\n heatmapAppLink={videoInsightsAppLinks.heatmapAppLink}\n imageUrl={ImageUrls.Insights.AVATAR}\n anonymiseUsers={anonymiseUsers}\n />\n </div>\n </div>\n </section>\n\n <section className='mb-5'>\n <h2 className='h4'><Text namespace={namespace} phrase='classEngagement' /></h2>\n\n <div className='row g-3'>\n <div className='col-12 col-md-6'>\n <InsightDevices\n osCount={videoViews.data?.osCount}\n />\n </div>\n <div className='col-12 col-md-6'>\n <InsightHeatmap\n engagement={aggregateEngagement.data}\n heatmapAppLink={videoInsightsAppLinks.heatmapAppLink}\n />\n </div>\n </div>\n </section>\n </div>\n );\n}","import { HashObject } from 'libs/common/react/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nexport function getVideoInsightsAppLinks(id: string, params?: HashObject) {\n return {\n heatmapAppLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.VIDEO_HEATMAP,\n args: [id],\n params\n }\n };\n}","// extracted by mini-css-extract-plugin\nexport default {\"removeRecipient\":\"mCbMC\",\"recipientItem\":\"kdcb0\",\"showSpinner\":\"xH6Mu\",\"avatarContainer\":\"Zcpg3\",\"recipientDetails\":\"v5EmV\",\"recipientDetailsWithRemoveButton\":\"_V928\"};"],"names":["namespace","ZERO_COLOUR","COLOUR_SCALE","LEGEND_VALUES","getBackgroundColor","value","max","hex","getGradient","data","gradient","i","length","previousValue","currentValue","nextValue","push","join","EngagementHeatMapLegend","Math","legendSquareWidthPercentage","className","Text","phrase","map","val","idx","key","style","width","backgroundColor","EngagementHeatMap","props","heatMap","engagement","background","InsightCard","svgClassName","SvgContainer","svgName","title","subtitle","count","children","getStaticChartOptions","label","text","credits","enabled","yAxis","labels","gridLineWidth","min","tickAmount","xAxis","color","fontSize","lineWidth","legend","chart","type","height","spacingTop","plotOptions","column","dataLabels","enableMouseTracking","minPointLength","InsightChart","highcharts","options","chartData","staticChartOptions","categories","series","MAX_ITEMS","InsightStudentList","students","slice","student","index","UserRecipientItemMetadata","user","imageCdnUrl","avatarClassName","detailsClassName","showDisplayName","showSubText","anonymiseUsers","undefined","percentage","round","PercentageIndicator","src","imageUrl","dangerouslySetInnerHTML","__html","description","AppLink","appLink","appLinkText","getPhrase","LanguageService","getDeviceType","name","InsightDevices","categoriesData","defaultDevices","Phone","Computer","osCount","reduce","acc","group","deviceCategory","getCategoriesData","highestDeviceCount","ArrayHelper","getHighestDeviceCount","Object","keys","borderRadius","fontWeight","inside","overflow","crop","category","y","filter","device","toLowerCase","InsightHeatmap","engagementRate","heatmapAppLink","getFullHeatMap","Array","ceil","videoDuration","fill","t","avatar","url","initials","surname","getSubText","userType","role","yearGroup","defaults","VideoViewRequests","individualEngagement","objectId","sharerId","success","error","always","queryParams","formatData","d","normalize","aggregateEngagement","views","baseKey","timeOffset","InsightStudentsNotWatched","studentsNotWatched","watchedIds","includes","id","InsightStudentsWatched","VideoInsightsOverviewView","SharedViewModelKeys","currentUser","UserRequests","config","ConfigRequests","videoRequest","VideoHelper","videoId","typeId","video","audienceAppLinkParams","dateRangeAppLinkParams","requestFilter","classroomFilterOnly","classrooms","classroomGroups","classroomStudents","ClassroomRequests","shareRecipients","userIds","ShareRequests","customerId","videoViews","getStudentsList","values","params","videoInsightsAppLinks","application","action","args","getVideoInsightsAppLinks","InsightsHeaderView","tabs","MasterType","ImageUrls"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[4113],{79671:(e,t,n)=>{n.d(t,{n:()=>v});var r=n(32735),a=n(38750),i=n(4234),c=n(20789),o=n(11607),l=n(83914),s=n(35223);const u={incorrect:"yodaE",answer:"KpbWq",avatarContainer:"uKRg2",avatarContainerImage:"_LpCq",image:"zWcu2",previewContainer:"CSRwX",imageContainer:"TeByp"};function m(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var d=["A","B","C","D"];function v(e){var t,n,v=(t=r.useState(null),n=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,i,c,o=[],l=!0,s=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=i.call(n)).done)&&(o.push(r.value),o.length!==t);l=!0);}catch(e){s=!0,a=e}finally{try{if(!l&&null!=n.return&&(c=n.return(),Object(c)!==c))return}finally{if(s)throw a}}return o}}(t,n)||function(e,t){if(e){if("string"==typeof e)return m(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?m(e,t):void 0}}(t,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),f=v[0],g=v[1],w=!!e.interaction.actionableItems.find((function(e){var t;return!!(null===(t=e.data)||void 0===t?void 0:t.imageUrl)})),b=r.useRef(),p="sm"===e.size||w&&e.interaction.actionableItems.length>2;return r.createElement("ul",{className:"".concat(w?"row ".concat(p&&!e.isDisplayOnly?"px-lg-5 p-0":""):""," list-unstyled")},e.interaction.actionableItems.map((function(t,n){var m,v=e.getSelectedAnswer(t.id),y=null===(m=t.data)||void 0===m?void 0:m.imageUrl,E=!!t.name;function h(){e.submitted||(e.onSelectAnswer&&e.onSelectAnswer(t,!v),g(v?null:t.id))}if(e.onlyShowSelectedAnswer&&!v)return r.createElement(r.Fragment,{key:n});var N=v?"bg-blue text-white":e.unCheckedBackground,C=function(){return r.createElement(r.Fragment,null,d[n])};e.showFeedback&&(N=t.isCorrect?"bg-success text-white":"bg-danger text-white ".concat(u.incorrect),e.hideFeedbackIcons||(C=function(){return r.createElement(r.Fragment,null,t.isCorrect?r.createElement(l.x,{size:l.S.Small,svgName:s.vn.Check}):r.createElement(l.x,{size:l.S.Small,svgName:s.vn.Close}))}));var k=e.showFeedback?{}:{role:"button",tabIndex:0,onKeyDown:function(e){return"Enter"===e.key&&h()}},S="";w&&(S="col-6");var x=t.id.toString()===(null==f?void 0:f.toString())&&e.leftHandSidePortalNode&&y&&!e.submitted;return r.createElement(r.Fragment,{key:n},x&&r.createElement(a.Nq,{node:e.leftHandSidePortalNode},r.createElement(i.Z,{className:"h-100",ref:b},r.createElement("div",{className:"p-3 d-flex flex-column h-100"},r.createElement("div",{className:"flex-grow-1"},r.createElement("div",{className:"cv-image-container text-center"},r.createElement("img",{className:"img-fluid rounded",src:y,alt:t.name||d[n]})),r.createElement("div",{className:"".concat(u.answer," h6 text-center text-dark p-3")},r.createElement("span",{className:"d-inline-block ".concat(E?"me-3":""," cv-multiple-choice-bullet")},r.createElement(C,null)),E&&r.createElement("span",{className:"flex-grow-1 pe-4"},t.name))),r.createElement("div",{className:"text-end"},r.createElement(o.L,{className:"btn btn-link",onClick:function(){return g(null)}},"Close"))))),r.createElement("li",{className:"".concat(S," mb-3")},r.createElement("label",Object.assign({className:"\n d-block\n rounded-3\n shadow-sm\n position-relative\n ".concat(e.showFeedback?"":"cursor-pointer","\n ").concat(u.answer,"\n ").concat(N,"\n ").concat(w?"mb-0 h-100":"","\n "),key:n,onClick:h},k),w&&r.createElement("span",{className:"d-block position-relative ".concat(u.imageContainer)},r.createElement("span",{className:"\n ".concat(u.image,"\n position-absolute\n start-0\n end-0\n top-0\n bottom-0\n rounded-top\n bg-gray-400\n "),style:{backgroundImage:y?"url(".concat(y,")"):void 0},title:t.name||d[n]})),r.createElement("span",{className:"d-flex ".concat(E||e.isDisplayOnly?"justify-content-between":"justify-content-center"," ").concat(p?"p-2":"p-3")},r.createElement("span",{className:"d-inline-block ".concat(E?"me-3":""," cv-multiple-choice-bullet")},r.createElement(C,null)),E&&r.createElement("span",{className:"flex-grow-1 pe-4"},t.name),!e.onlyShowSelectedAnswer&&r.createElement("span",{className:"".concat(u.avatarContainer," ").concat(w?u.avatarContainerImage:"")},v&&r.createElement(c.q,{imageCdnUrl:e.imageApi,initials:e.userInitials,imageUrl:e.userAvatar,extraClasses:"border border-white"}))))))})))}v.defaultProps={size:"lg",unCheckedBackground:"bg-white"}},12892:(e,t,n)=>{n.d(t,{x:()=>l});var r=n(32735),a=n(20789),i=n(83914),c=n(35223);const o={feedback:"CBgCv",avatarContainer:"CVTEm",avatarContainerSmall:"tbPTs",avatarSmall:"GUAUz",incorrect:"ZCkyL",large:"TKjXy",small:"_2qC40"};function l(e){function t(t){e.onSelectAnswer&&e.onSelectAnswer(t)}return r.createElement("div",{className:"d-flex ".concat(e.className?e.className:""," ").concat("sm"===e.size?"mx-n1":"mx-n2")},e.interaction.actionableItems.map((function(n,l){var s=e.getSelectedAnswer(n.id),u=s?"bg-blue text-white":e.unCheckedBackground,m=function(){return r.createElement(r.Fragment,null)};e.showFeedback&&(u=n.isCorrect?"bg-success text-white":"bg-danger text-white ".concat(o.incorrect),e.hideFeedbackIcons||(m=function(){return r.createElement(r.Fragment,null,n.isCorrect?r.createElement(i.x,{size:i.S.Small,svgName:c.vn.Check}):r.createElement(i.x,{size:i.S.Small,svgName:c.vn.Close}))}));var d=e.showFeedback?{}:{role:"button",tabIndex:0,onKeyDown:function(e){return"Enter"===e.key&&t(n)}};return r.createElement("label",Object.assign({key:l,htmlFor:n.id,className:"\n rounded-3\n shadow-sm\n my-0\n position-relative\n overflow-hidden\n d-flex\n align-items-center\n justify-content-center\n ".concat("sm"===e.size?"".concat(o.small," mx-1 h5"):"".concat(o.large," mx-2 h4"),"\n ").concat(e.showFeedback?"":"cursor-pointer","\n ").concat(u)},d),r.createElement("input",{id:n.id,type:"radio",name:"multiple-choice",checked:!!s,onChange:function(){return t(n)},disabled:e.showFeedback,hidden:!0}),n.name,r.createElement("span",{className:"position-absolute p-2 ".concat(o.feedback)},r.createElement(m,null)),r.createElement("span",{className:"".concat(o.avatarContainer).concat("sm"===e.size?" ".concat(o.avatarContainerSmall):"")},s&&r.createElement(a.q,{imageCdnUrl:e.imageApi,initials:e.userInitials,imageUrl:e.userAvatar,extraClasses:"border border-white ".concat("sm"===e.size?o.avatarSmall:"")})))})))}l.defaultProps={size:"lg",unCheckedBackground:"bg-white"}},44113:(e,t,n)=>{n.d(t,{O:()=>k});var r=n(32735),a=n(20789),i=n(83140),c=n(80845),o=n(64818),l=n(69737),s=n(75896),u=n(40424),m=n(8246),d="cv-missing-word-",v=n(79671);const f="Y7ls8";var g=n(12892);function w(e){return w="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},w(e)}function b(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=w(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,"string");if("object"!=w(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==w(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var p=function(){return r.createElement(r.Fragment,null)},y=b(b(b(b(b(b(b({},u.Z9.Annotation,p),u.Z9.Image,p),u.Z9.MissingWord,(function(e){var t=e.interaction.data.sentence.replace(/{([^{}]*)}/g,(function(e,t){return"{".concat(d).concat(t,"}")})).split(/{([^{}]*)}/g),n="p-2";return e.reportsStyling||(n+=" border rounded"),r.createElement("div",{className:n},t.map((function(t,n){if(!t.startsWith(d))return t;var a=t.replace(d,""),i=e.interaction.actionableItems.find((function(e){return e.order.toString()===a}));if(i){var c=e.answers.find((function(e){return e.id==i.id}));if(c){if(!e.showFeedback)return r.createElement("strong",{key:n,className:"text-info"},c.text);var o=c.status===m.N.Correct;return r.createElement(r.Fragment,{key:n},!o&&r.createElement(r.Fragment,null,r.createElement("del",{className:"text-danger"},r.createElement("strong",null,c.text))," "),r.createElement("strong",{className:"text-success"},i.name))}}})))})),u.Z9.MultipleChoice,(function(e){var t,n,a,i,c="my-2";return e.reportsStyling&&(c+=" mx-2"),r.createElement("div",{className:c},r.createElement(v.n,{interaction:e.interaction,showFeedback:e.showFeedback,getSelectedAnswer:function(t){var n=e.answers.find((function(e){return e.id==t}));return null==n?void 0:n.id},imageApi:e.imageCdnUrl,userInitials:e.anonymisedUserName?o.l.getInitialsFromFullName(e.anonymisedUserName):o.l.getInitials(null===(t=e.user)||void 0===t?void 0:t.name,null===(n=e.user)||void 0===n?void 0:n.surname),userAvatar:e.anonymisedUserName?null:null===(i=null===(a=e.user)||void 0===a?void 0:a.avatar)||void 0===i?void 0:i.url,onlyShowSelectedAnswer:!e.showAvatar,size:"sm",unCheckedBackground:e.showFeedback?"":"".concat(f," text-white"),isDisplayOnly:!0}))})),u.Z9.TrueOrFalse,(function(e){var t,n,a,i,c="justify-content-start";return e.reportsStyling&&(c="justify-content-center"),r.createElement("div",{className:"my-2"},r.createElement(g.x,{className:c,interaction:e.interaction,showFeedback:e.showFeedback,hideFeedbackIcons:!e.showAvatar,getSelectedAnswer:function(t){var n=e.answers.find((function(e){return e.id==t}));return null==n?void 0:n.text},imageApi:e.imageCdnUrl,userInitials:e.anonymisedUserName?o.l.getInitialsFromFullName(e.anonymisedUserName):o.l.getInitials(null===(t=e.user)||void 0===t?void 0:t.name,null===(n=e.user)||void 0===n?void 0:n.surname),userAvatar:e.anonymisedUserName?null:null===(i=null===(a=e.user)||void 0===a?void 0:a.avatar)||void 0===i?void 0:i.url,size:"sm",unCheckedBackground:e.showFeedback?"":"".concat(f," text-white")}))})),u.Z9.ShortAnswer,(function(e){var t=s.m.first(e.answers);if(!t)return r.createElement(r.Fragment,null);var n="rounded p-2 mb-2";return e.reportsStyling||(n+=" bg-blue text-white"),r.createElement("div",{className:n},t.text)})),u.Z9.Illustration,(function(e){var t=s.m.first(e.answers);if(!t)return r.createElement(r.Fragment,null);var n="rounded p-2 mb-2 w-50";return e.reportsStyling||(n+=" text-white"),r.createElement("div",{className:n},r.createElement("img",{className:"img-fluid border rounded",src:t.text,alt:"Illustrated answer to the question: ".concat(e.interaction.name)}))})),E=n(44526),h=n(56151),N=n(3894);const C={avatarContainer:"FEdgT"};function k(e){var t,n,s,u,m,d=y[e.interaction.typeId];if(!d)return r.createElement(r.Fragment,null);var v=(0,c.j_)(e.studentResults),f=(0,c.f6)(e.interaction.id,v),g=i.A.isInteractionCorrect(e.interaction,v);return r.createElement("div",{className:"rounded ".concat(null!==(t=e.className)&&void 0!==t?t:"")},r.createElement("div",{className:"d-flex"},!!e.showStudentDetails&&r.createElement("div",{className:"me-2"},r.createElement("div",{className:C.avatarContainer},r.createElement(a.q,{imageCdnUrl:e.imageCdnUrl,initials:e.anonymisedUserName?o.l.getInitialsFromFullName(e.anonymisedUserName):o.l.getInitials(null===(n=e.studentResults.user)||void 0===n?void 0:n.name,null===(s=e.studentResults.user)||void 0===s?void 0:s.surname),imageUrl:e.anonymisedUserName?null:null===(m=null===(u=e.studentResults.user)||void 0===u?void 0:u.avatar)||void 0===m?void 0:m.url}))),r.createElement("div",{className:"flex-grow-1"},!!e.showStudentDetails&&r.createElement(h.U,{studentResults:e.studentResults,correctness:g,anonymisedUserName:e.anonymisedUserName}),r.createElement("div",{className:"d-flex justify-content-between"},r.createElement("div",{className:"flex-grow-1 ".concat(e.responseComponentClass?e.responseComponentClass:"")},f?r.createElement(d,{interaction:e.interaction,answers:f.answers,imageCdnUrl:e.imageCdnUrl,user:e.studentResults.user,showFeedback:e.showFeedback,showAvatar:e.showAvatar,reportsStyling:e.reportsStyling}):r.createElement(l.R,null)),!e.showStudentDetails&&r.createElement(E.Y,{correctness:g})))),r.createElement(N.Z,{studentAttempt:f,correctness:g,markInteraction:e.markInteraction,markedStatus:e.markedStatus}))}},44526:(e,t,n)=>{n.d(t,{Y:()=>o});var r=n(32735),a=n(83914),i=n(28972),c=n(35223);function o(e){return r.createElement(r.Fragment,null,e.correctness===i.w.Correct&&r.createElement("div",{className:"ms-2 text-success"},r.createElement(a.x,{svgName:c.vn.Tick})),e.correctness===i.w.Incorrect&&r.createElement("div",{className:"ms-2 text-danger"},r.createElement(a.x,{svgName:c.vn.Close})))}},56151:(e,t,n)=>{n.d(t,{U:()=>c});var r=n(32735),a=n(64818),i=n(44526);function c(e){return r.createElement("div",{className:"d-flex align-items-center justify-content-between mb-2"},r.createElement("p",{className:"fw-semibold mb-0"},e.anonymisedUserName||a.l.getFullName(e.studentResults.user)),r.createElement(i.Y,{correctness:e.correctness}))}},3894:(e,t,n)=>{n.d(t,{Z:()=>l});var r=n(32735),a=n(83914),i=n(28972),c=n(8246),o=n(35223);function l(e){return e.correctness!==i.w.AwaitingMarking?r.createElement(r.Fragment,null):r.createElement("div",{className:"d-flex justify-content-end gap-2 mt-2"},r.createElement("div",{className:"d-flex flex-column justify-content-end cursor-pointer\n ".concat(e.markedStatus===c.N.Correct?"text-success":"")},r.createElement(a.x,{svgName:e.markedStatus===c.N.Correct?o.vn.CheckCircle:o.vn.CheckCircleOutline,onClick:function(){return e.markInteraction(e.studentAttempt.answers,c.N.Correct)}})),r.createElement("div",{className:"d-flex flex-column justify-content-end cursor-pointer\n ".concat(e.markedStatus===c.N.Incorrect?" text-danger":"")},r.createElement(a.x,{svgName:e.markedStatus===c.N.Incorrect?o.vn.CrossCircleFilled:o.vn.CrossCircle,onClick:function(){return e.markInteraction(e.studentAttempt.answers,c.N.Incorrect)}})))}},69737:(e,t,n)=>{n.d(t,{R:()=>i});var r=n(32735),a=n(23481).T.encloseNamespace("interactives.responseTypes");function i(){return r.createElement("p",{className:"p-2"},r.createElement("em",null,a("noResponse")))}},28972:(e,t,n)=>{var r;n.d(t,{w:()=>r}),function(e){e[e.Correct=0]="Correct",e[e.Incorrect=1]="Incorrect",e[e.AwaitingMarking=2]="AwaitingMarking",e[e.Answered=3]="Answered",e[e.UnAnswered=4]="UnAnswered",e[e.NotApplicable=5]="NotApplicable"}(r||(r={}))},8246:(e,t,n)=>{var r;n.d(t,{N:()=>r}),function(e){e[e.Incorrect=0]="Incorrect",e[e.Correct=1]="Correct",e[e.PendingReview=2]="PendingReview"}(r||(r={}))},83140:(e,t,n)=>{n.d(t,{A:()=>g});var r=n(28972),a=n(8246),i=n(40424);function c(e){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},c(e)}function o(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=c(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,"string");if("object"!=c(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==c(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(){return r.w.NotApplicable}function s(e,t){var n=e.actionableItems.filter((function(e){return e.isCorrect}));return n.every((function(e){return!t(e.id)}))?r.w.UnAnswered:n.every((function(e){var n;return e.name.trim().toLowerCase()===(null===(n=t(e.id))||void 0===n?void 0:n.trim().toLowerCase())}))?r.w.Correct:r.w.Incorrect}function u(e,t){return e.actionableItems.every((function(e){return!t(e.id)}))?r.w.UnAnswered:e.actionableItems.filter((function(e){return e.isCorrect})).every((function(e){var n,r=t(e.id);return(null==r?void 0:r.toString())===(null===(n=e.id)||void 0===n?void 0:n.toString())||r===e.name}))?r.w.Correct:r.w.Incorrect}function m(e,t){return function(n){var r=t.attempts.find((function(t){return t.id===e.id}));return null==r?void 0:r.answers.find((function(e){return e.id===n}))}}function d(e,t){var n=m(e,t);return u(e,(function(e){var t=n(e);return null==t?void 0:t.text}))}function v(e,t){return function(e,t){var n;return e.actionableItems.forEach((function(e){var i=t(e.id);n=i?i.status!==a.N.Correct?i.status!==a.N.Incorrect?r.w.AwaitingMarking:r.w.Incorrect:r.w.Correct:r.w.UnAnswered})),n}(e,m(e,t))}var f=o(o(o(o(o(o(o({},i.Z9.Annotation,l),i.Z9.Image,l),i.Z9.MissingWord,(function(e,t){var n=m(e,t);return s(e,(function(e){var t=n(e);return null==t?void 0:t.text}))})),i.Z9.MultipleChoice,d),i.Z9.ShortAnswer,v),i.Z9.TrueOrFalse,d),i.Z9.Illustration,v),g={notApplicable:l,awaitingMarking:function(){return r.w.AwaitingMarking},isMissingWordCorrect:s,isMultipleChoiceCorrect:u,isInteractionCorrect:function(e,t){return(0,f[e.typeId])(e,t)}}},80845:(e,t,n)=>{n.d(t,{Q:()=>s,Wn:()=>c,f6:()=>l,j_:()=>o});var r=n(75896),a=n(40424);function i(e){return e.typeId!==a.Z9.Annotation&&e.typeId!==a.Z9.Image}function c(e){return r.m.flatten(e.timepoints.map((function(e){return e.interactions})))}function o(e){return r.m.last(e.results)}function l(e,t){return r.m.findWhere(null==t?void 0:t.attempts,{id:e})}function s(e){return c(e).filter(i)}}}]);
2
+ //# sourceMappingURL=4113-d6411052c4-lite.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/4113-d6411052c4-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/interaction-answers/multiple-choice/multiple-choice-interaction-answers.scss","file:///app/packages/libs/shared/src/components/interaction-answers/multiple-choice/MultipleChoiceInteractionAnswers.tsx","file:///app/packages/libs/shared/src/components/interaction-answers/true-or-false/true-or-false-interaction-answers.scss","file:///app/packages/libs/shared/src/components/interaction-answers/true-or-false/TrueOrFalseInteractionAnswers.tsx","file:///app/packages/libs/shared/src/components/interaction-response/response-types/MissingWordResponse.tsx","file:///app/packages/libs/shared/src/components/interaction-response/response-types/response-types.scss","file:///app/packages/libs/shared/src/components/interaction-response/response-types/ResponseComponentLookup.tsx","file:///app/packages/libs/shared/src/components/interaction-response/response-types/MultipleChoiceResponse.tsx","file:///app/packages/libs/shared/src/components/interaction-response/response-types/TrueOrFalseResponse.tsx","file:///app/packages/libs/shared/src/components/interaction-response/response-types/ShortAnswerResponse.tsx","file:///app/packages/libs/shared/src/components/interaction-response/response-types/IllustrationResponse.tsx","file:///app/packages/libs/shared/src/components/interaction-response/interaction-response.scss","file:///app/packages/libs/shared/src/components/interaction-response/InteractionResponse.tsx","file:///app/packages/libs/shared/src/components/interaction-response/InteractionResponseCorrectness.tsx","file:///app/packages/libs/shared/src/components/interaction-response/InteractionStudentDetailsHeader.tsx","file:///app/packages/libs/shared/src/components/interaction-response/MarkResponse.tsx","file:///app/packages/libs/shared/src/components/interaction-response/response-types/NoResponse.tsx","file:///app/packages/libs/shared/src/enums/InteractionCorrectness.ts","file:///app/packages/libs/shared/src/enums/InteractiveAnswerStatus.ts","file:///app/packages/libs/shared/src/utils/InteractiveCorrectnessHelper.ts","file:///app/packages/libs/shared/src/utils/InteractiveHelper.ts"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"incorrect\":\"yodaE\",\"answer\":\"KpbWq\",\"avatarContainer\":\"uKRg2\",\"avatarContainerImage\":\"_LpCq\",\"image\":\"zWcu2\",\"previewContainer\":\"CSRwX\",\"imageContainer\":\"TeByp\"};","import React from 'react';\nimport { HtmlPortalNode, InPortal } from 'react-reverse-portal';\nimport SimpleBar from 'simplebar-react';\n\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { ActionableItem, Interaction } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './multiple-choice-interaction-answers.scss';\n\nconst alphabet = [ 'A', 'B', 'C', 'D' ];\n\ninterface MultipleChoiceInteractionAnswersProps {\n interaction: Interaction;\n showFeedback: boolean;\n getSelectedAnswer: (actionableItemId: string) => string;\n imageApi: string;\n userInitials: string;\n userAvatar: string;\n submitted?: boolean;\n size?: 'sm' | 'lg';\n \n /**\n * onSelectAnswer can be omitted when showing read-only results.\n */\n onSelectAnswer?: (answer: ActionableItem, checked: boolean) => void;\n\n onlyShowSelectedAnswer?: boolean;\n\n /**\n * Will hide the tick and cross from the answer tiles\n */\n hideFeedbackIcons?: boolean;\n unCheckedBackground?: string;\n\n leftHandSidePortalNode?: HtmlPortalNode;\n\n /**\n * Used when displaying the answer in reports\n */\n isDisplayOnly?: boolean;\n}\n\nMultipleChoiceInteractionAnswers.defaultProps = {\n size: 'lg',\n unCheckedBackground: 'bg-white'\n};\n\nexport function MultipleChoiceInteractionAnswers(props: MultipleChoiceInteractionAnswersProps): JSX.Element {\n const [ previewAnswer, setPreviewAnswer ] = React.useState<string>(null);\n\n const hasImages = !!props.interaction.actionableItems.find(a => !!a.data?.imageUrl);\n\n const scrollRef = React.useRef();\n\n const small = props.size === 'sm' || (hasImages && props.interaction.actionableItems.length > 2);\n\n return (\n <ul className={`${hasImages ? `row ${small && !props.isDisplayOnly ? 'px-lg-5 p-0' : ''}` : ''} list-unstyled`}>\n {props.interaction.actionableItems.map((a, index) => {\n const answer = props.getSelectedAnswer(a.id);\n const imageUrl = a.data?.imageUrl;\n const hasText = !!a.name;\n\n function onSelectAnswer(): void {\n if (props.submitted)\n return;\n\n if (props.onSelectAnswer)\n props.onSelectAnswer(a, !answer);\n\n setPreviewAnswer(answer ? null : a.id);\n }\n\n if (props.onlyShowSelectedAnswer && !answer)\n return <React.Fragment key={index}></React.Fragment>;\n \n let className = answer ?\n 'bg-blue text-white' :\n props.unCheckedBackground;\n\n let LeftPart = () => <>{alphabet[index]}</>;\n\n if (props.showFeedback) {\n className = a.isCorrect ?\n 'bg-success text-white' :\n `bg-danger text-white ${styles.incorrect}`;\n\n if (!props.hideFeedbackIcons) {\n LeftPart = () => {\n return (\n <>\n {a.isCorrect ?\n <SvgContainer size={SvgContainerSize.Small} svgName={cvSvgLibrary.Check} /> :\n <SvgContainer size={SvgContainerSize.Small} svgName={cvSvgLibrary.Close} />}\n </>\n );\n };\n }\n }\n\n /**\n * Allow keyboard controls, but not when we show feedback\n */\n const accessibility = props.showFeedback ? {} : {\n role: 'button',\n tabIndex: 0,\n onKeyDown: (e: React.KeyboardEvent) => e.key === 'Enter' && onSelectAnswer()\n };\n\n let hasImageClass = '';\n if (hasImages) {\n hasImageClass = 'col-6';\n }\n\n const showImagePreview = a.id.toString() === previewAnswer?.toString()\n && props.leftHandSidePortalNode\n && imageUrl\n && !props.submitted;\n\n return (\n <React.Fragment key={index}>\n {showImagePreview &&\n <InPortal node={props.leftHandSidePortalNode}>\n <SimpleBar className='h-100' ref={scrollRef}>\n <div className='p-3 d-flex flex-column h-100'>\n <div className='flex-grow-1'>\n <div className='cv-image-container text-center'>\n <img\n className='img-fluid rounded'\n src={imageUrl}\n alt={a.name || alphabet[index]}\n />\n </div>\n <div className={`${styles.answer} h6 text-center text-dark p-3`}>\n <span className={`d-inline-block ${hasText ? 'me-3' : ''} cv-multiple-choice-bullet`}><LeftPart /></span>\n {hasText && <span className='flex-grow-1 pe-4'>{a.name}</span>}\n </div>\n </div>\n <div className='text-end'>\n <DivButton\n className='btn btn-link'\n onClick={() => setPreviewAnswer(null)}\n >\n Close\n </DivButton>\n </div>\n </div>\n </SimpleBar>\n </InPortal>\n }\n <li className={`${hasImageClass} mb-3`}>\n <label\n className={`\n d-block\n rounded-3\n shadow-sm\n position-relative\n ${props.showFeedback ? '' : 'cursor-pointer'}\n ${styles.answer}\n ${className}\n ${hasImages ? 'mb-0 h-100' : ''}\n `}\n key={index}\n onClick={onSelectAnswer}\n {...accessibility}\n >\n {hasImages &&\n <span className={`d-block position-relative ${styles.imageContainer}`}>\n <span\n className={`\n ${styles.image}\n position-absolute\n start-0\n end-0\n top-0\n bottom-0\n rounded-top\n bg-gray-400\n `}\n style={{ backgroundImage: imageUrl ? `url(${imageUrl})` : undefined }}\n title={a.name || alphabet[index]}\n />\n </span>\n }\n <span className={`d-flex ${hasText || props.isDisplayOnly ? 'justify-content-between' : 'justify-content-center'} ${small ? 'p-2' : 'p-3'}`}>\n <span className={`d-inline-block ${hasText ? 'me-3' : ''} cv-multiple-choice-bullet`}><LeftPart /></span>\n {hasText && <span className='flex-grow-1 pe-4'>{a.name}</span>}\n {!props.onlyShowSelectedAnswer &&\n <span className={`${styles.avatarContainer} ${hasImages ? styles.avatarContainerImage : ''}`}>\n {answer &&\n <Avatar\n imageCdnUrl={props.imageApi}\n initials={props.userInitials}\n imageUrl={props.userAvatar}\n extraClasses={'border border-white'}\n />\n }\n </span>\n }\n </span>\n </label>\n </li>\n </React.Fragment>\n );\n })}\n </ul>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"feedback\":\"CBgCv\",\"avatarContainer\":\"CVTEm\",\"avatarContainerSmall\":\"tbPTs\",\"avatarSmall\":\"GUAUz\",\"incorrect\":\"ZCkyL\",\"large\":\"TKjXy\",\"small\":\"_2qC40\"};","import React from 'react';\n\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { ActionableItem, Interaction } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './true-or-false-interaction-answers.scss';\n\ninterface TrueOrFalseInteractionAnswersProps {\n className?: string;\n interaction: Interaction;\n showFeedback: boolean;\n getSelectedAnswer: (actionableItemId: string) => string;\n imageApi: string;\n userInitials: string;\n userAvatar: string;\n size?: 'sm' | 'lg'\n \n /**\n * onSelectAnswer can be omitted when showing read-only results.\n */\n onSelectAnswer?: (answer: ActionableItem) => void;\n\n /**\n * Will hide the tick and cross from the answer tiles\n */\n hideFeedbackIcons?: boolean;\n unCheckedBackground?: string;\n}\n\nTrueOrFalseInteractionAnswers.defaultProps = {\n size: 'lg',\n unCheckedBackground: 'bg-white'\n};\n\nexport function TrueOrFalseInteractionAnswers(props: TrueOrFalseInteractionAnswersProps): JSX.Element {\n function onSelectAnswer(answer: ActionableItem): void {\n if (props.onSelectAnswer)\n props.onSelectAnswer(answer);\n }\n \n return (\n <div\n className={`d-flex ${props.className ? props.className : ''} ${props.size === 'sm' ? 'mx-n1' : 'mx-n2'}`}>\n {props.interaction.actionableItems.map((a, index) => {\n const answer = props.getSelectedAnswer(a.id);\n\n let className = answer ?\n 'bg-blue text-white' :\n props.unCheckedBackground;\n\n let LeftPart = () => <></>;\n\n if (props.showFeedback) {\n className = a.isCorrect ?\n 'bg-success text-white' :\n `bg-danger text-white ${styles.incorrect}`;\n\n if (!props.hideFeedbackIcons) {\n LeftPart = () => {\n return (\n <>\n {a.isCorrect ?\n <SvgContainer size={SvgContainerSize.Small} svgName={cvSvgLibrary.Check} /> :\n <SvgContainer size={SvgContainerSize.Small} svgName={cvSvgLibrary.Close} />}\n </>\n );\n };\n }\n }\n\n /**\n * Allow keyboard controls, but not when we show feedback\n */\n const accessibility = props.showFeedback ? {} : {\n role: 'button',\n tabIndex: 0,\n onKeyDown: (e: React.KeyboardEvent) => e.key === 'Enter' && onSelectAnswer(a)\n };\n\n return (\n <label\n key={index}\n htmlFor={a.id}\n className={`\n rounded-3\n shadow-sm\n my-0\n position-relative\n overflow-hidden\n d-flex\n align-items-center\n justify-content-center\n ${props.size === 'sm' ? `${styles.small} mx-1 h5` : `${styles.large} mx-2 h4`}\n ${props.showFeedback ? '' : 'cursor-pointer'}\n ${className}`}\n {...accessibility}\n >\n <input\n id={a.id}\n type={'radio'}\n name='multiple-choice'\n checked={!!answer}\n onChange={() => onSelectAnswer(a)}\n disabled={props.showFeedback}\n hidden\n />\n {a.name}\n <span className={`position-absolute p-2 ${styles.feedback}`}><LeftPart /></span>\n <span className={`${styles.avatarContainer}${props.size === 'sm' ? ` ${styles.avatarContainerSmall}` : ''}`}>\n {answer &&\n <Avatar\n imageCdnUrl={props.imageApi}\n initials={props.userInitials}\n imageUrl={props.userAvatar}\n extraClasses={`border border-white ${props.size === 'sm' ? styles.avatarSmall : ''}`}\n />\n }\n </span>\n </label>\n );\n })}\n </div>\n );\n}","import React from 'react';\n\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\n\nimport { ResponseComponentProps } from './ResponseComponentLookup';\n\nconst PLACEHOLDER = 'cv-missing-word-';\n\nexport function MissingWordResponse(props: ResponseComponentProps): JSX.Element {\n const cleanedUp = (props.interaction.data.sentence as string).replace(/{([^{}]*)}/g, (match: string, val: string) => {\n return `{${PLACEHOLDER}${val}}`;\n });\n\n const items = cleanedUp.split(/{([^{}]*)}/g);\n\n let className = 'p-2';\n\n if (!props.reportsStyling)\n className += ' border rounded';\n\n return (\n <div className={className}>\n {items.map((item, idx) => {\n if (!item.startsWith(PLACEHOLDER))\n return item;\n\n const order = item.replace(PLACEHOLDER, '');\n\n const actionableItem = props.interaction.actionableItems.find(a => a.order.toString() === order);\n\n if (!actionableItem)\n return;\n\n // eslint-disable-next-line\n const answer = props.answers.find(a => a.id == actionableItem.id);\n \n if (!answer)\n return;\n\n if (!props.showFeedback)\n return <strong key={idx} className='text-info'>{answer.text}</strong>;\n\n const isCorrect = answer.status === InteractiveAnswerStatus.Correct;\n\n return (\n <React.Fragment key={idx}>\n {!isCorrect && <><del className='text-danger'><strong>{answer.text}</strong></del>&nbsp;</>}\n <strong className='text-success'>{actionableItem.name}</strong>\n </React.Fragment>\n );\n })}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"uncheckedBackground\":\"Y7ls8\"};","import React from 'react';\n\nimport { IllustrationResponse } from 'libs/shared/components/interaction-response/response-types/IllustrationResponse';\nimport { Interaction, InteractionTypeId, StudentAnswer, User } from 'libs/shared/interfaces';\n\nimport { MissingWordResponse } from './MissingWordResponse';\nimport { MultipleChoiceResponse } from './MultipleChoiceResponse';\nimport { ShortAnswerResponse } from './ShortAnswerResponse';\nimport { TrueOrFalseResponse } from './TrueOrFalseResponse';\n\nexport interface ResponseComponentProps {\n interaction: Interaction;\n answers: StudentAnswer[];\n imageCdnUrl: string;\n user: User;\n showFeedback?: boolean;\n showAvatar?: boolean;\n anonymisedUserName?: string;\n reportsStyling?: boolean;\n}\nconst NoResponseRequired = () => <></>;\n\nexport const ResponseComponentLookup: {\n [typeId: number]: (props: ResponseComponentProps) => JSX.Element\n} = {\n [InteractionTypeId.Annotation]: NoResponseRequired,\n [InteractionTypeId.Image]: NoResponseRequired,\n [InteractionTypeId.MissingWord]: MissingWordResponse,\n [InteractionTypeId.MultipleChoice]: MultipleChoiceResponse,\n [InteractionTypeId.TrueOrFalse]: TrueOrFalseResponse,\n [InteractionTypeId.ShortAnswer]: ShortAnswerResponse,\n [InteractionTypeId.Illustration]: IllustrationResponse\n};","import React from 'react';\n\nimport { MultipleChoiceInteractionAnswers } from 'libs/shared/components/interaction-answers/multiple-choice/MultipleChoiceInteractionAnswers';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport { ResponseComponentProps } from './ResponseComponentLookup';\n\nimport styles from './response-types.scss';\n\nexport function MultipleChoiceResponse(props: ResponseComponentProps): JSX.Element {\n function getAnswer(id: string): string {\n // eslint-disable-next-line\n const answer = props.answers.find(a => a.id == id);\n return answer?.id;\n }\n\n let className = 'my-2';\n\n if (props.reportsStyling)\n className += ' mx-2';\n\n return (\n <div className={className}>\n <MultipleChoiceInteractionAnswers\n interaction={props.interaction}\n showFeedback={props.showFeedback}\n getSelectedAnswer={getAnswer}\n imageApi={props.imageCdnUrl}\n userInitials={props.anonymisedUserName\n ? UserHelper.getInitialsFromFullName(props.anonymisedUserName)\n : UserHelper.getInitials(props.user?.name, props.user?.surname)\n }\n userAvatar={props.anonymisedUserName ? null : props.user?.avatar?.url}\n onlyShowSelectedAnswer={!props.showAvatar}\n size='sm'\n unCheckedBackground={props.showFeedback ? '' : `${styles.uncheckedBackground} text-white`}\n isDisplayOnly\n />\n </div>\n );\n}","import React from 'react';\n\nimport { TrueOrFalseInteractionAnswers } from 'libs/shared/components/interaction-answers/true-or-false/TrueOrFalseInteractionAnswers';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport { ResponseComponentProps } from './ResponseComponentLookup';\n\nimport styles from './response-types.scss';\n\nexport function TrueOrFalseResponse(props: ResponseComponentProps): JSX.Element {\n function getAnswer(id: string): string {\n // eslint-disable-next-line\n const answer = props.answers.find(a => a.id == id);\n return answer?.text;\n }\n\n let className = 'justify-content-start';\n\n if (props.reportsStyling)\n className = 'justify-content-center';\n \n return (\n <div className='my-2'>\n <TrueOrFalseInteractionAnswers\n className={className}\n interaction={props.interaction}\n showFeedback={props.showFeedback}\n hideFeedbackIcons={!props.showAvatar}\n getSelectedAnswer={getAnswer}\n imageApi={props.imageCdnUrl}\n userInitials={props.anonymisedUserName\n ? UserHelper.getInitialsFromFullName(props.anonymisedUserName)\n : UserHelper.getInitials(props.user?.name, props.user?.surname)\n }\n userAvatar={props.anonymisedUserName ? null : props.user?.avatar?.url}\n size='sm'\n unCheckedBackground={props.showFeedback ? '' : `${styles.uncheckedBackground} text-white`}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { ResponseComponentProps } from './ResponseComponentLookup';\n\nexport function ShortAnswerResponse(props: ResponseComponentProps): JSX.Element {\n // There should only be one answer.\n const answer = ArrayHelper.first(props.answers);\n\n if (!answer)\n return <></>;\n\n let className = 'rounded p-2 mb-2';\n\n if (!props.reportsStyling)\n className += ' bg-blue text-white';\n \n return (\n <div className={className}>\n {answer.text}\n </div>\n );\n}","import React from 'react';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { ResponseComponentProps } from './ResponseComponentLookup';\n\nexport function IllustrationResponse(props: ResponseComponentProps): JSX.Element {\n // There should only be one answer.\n const answer = ArrayHelper.first(props.answers);\n\n if (!answer)\n return <></>;\n\n let className = 'rounded p-2 mb-2 w-50';\n\n if (!props.reportsStyling)\n className += ' text-white';\n \n return (\n <div className={className}>\n <img\n className='img-fluid border rounded'\n src={answer.text}\n alt={`Illustrated answer to the question: ${props.interaction.name}`}\n />\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"avatarContainer\":\"FEdgT\"};","import React from 'react';\n\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, StudentAnswer, StudentResults } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { getStudentAttempt, getStudentResult } from 'libs/shared/utils/InteractiveHelper';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport { NoResponse } from './response-types/NoResponse';\nimport { ResponseComponentLookup } from './response-types/ResponseComponentLookup';\nimport { InteractionResponseCorrectness } from './InteractionResponseCorrectness';\nimport { InteractionStudentDetailsHeader } from './InteractionStudentDetailsHeader';\nimport { MarkResponse } from './MarkResponse';\n\nimport styles from './interaction-response.scss';\n\n\ninterface InteractionResponseProps {\n interaction: Interaction;\n studentResults: StudentResults;\n imageCdnUrl: string;\n markInteraction: (answers: StudentAnswer[], status: InteractiveAnswerStatus) => void;\n markedStatus?: InteractiveAnswerStatus;\n showStudentDetails?: boolean;\n className?: string;\n showFeedback?: boolean;\n showAvatar?: boolean;\n anonymisedUserName?: string;\n reportsStyling?: boolean;\n responseComponentClass?: string;\n}\n\nexport function InteractionResponse(props: InteractionResponseProps): JSX.Element {\n const ResponseComponent = ResponseComponentLookup[props.interaction.typeId];\n\n if (!ResponseComponent)\n return <></>;\n\n const result = getStudentResult(props.studentResults);\n\n const studentAttempt = getStudentAttempt(props.interaction.id, result);\n\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(props.interaction, result);\n\n return (\n <div className={`rounded ${props.className ?? ''}`}>\n <div className='d-flex'>\n {!!props.showStudentDetails &&\n <div className='me-2'>\n <div className={styles.avatarContainer}>\n <Avatar\n imageCdnUrl={props.imageCdnUrl}\n initials={props.anonymisedUserName\n ? UserHelper.getInitialsFromFullName(props.anonymisedUserName)\n : UserHelper.getInitials(props.studentResults.user?.name, props.studentResults.user?.surname)\n }\n imageUrl={props.anonymisedUserName ? null : props.studentResults.user?.avatar?.url}\n />\n </div>\n </div>\n }\n <div className='flex-grow-1'>\n {!!props.showStudentDetails &&\n <InteractionStudentDetailsHeader\n studentResults={props.studentResults}\n correctness={correctness}\n anonymisedUserName={props.anonymisedUserName}\n />\n }\n <div className='d-flex justify-content-between'>\n <div className={`flex-grow-1 ${props.responseComponentClass ? props.responseComponentClass : ''}`}>\n {studentAttempt\n ? <ResponseComponent\n interaction={props.interaction}\n answers={studentAttempt.answers}\n imageCdnUrl={props.imageCdnUrl}\n user={props.studentResults.user}\n showFeedback={props.showFeedback}\n showAvatar={props.showAvatar}\n reportsStyling={props.reportsStyling}\n />\n : <NoResponse />\n }\n </div>\n {!props.showStudentDetails &&\n <InteractionResponseCorrectness correctness={correctness} />\n }\n </div>\n </div>\n </div>\n <MarkResponse\n studentAttempt={studentAttempt}\n correctness={correctness}\n markInteraction={props.markInteraction}\n markedStatus={props.markedStatus}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\ninterface InteractionResponseCorrectnessProps {\n correctness: InteractionCorrectness;\n}\n\nexport function InteractionResponseCorrectness(props: InteractionResponseCorrectnessProps): JSX.Element {\n return (\n <>\n {props.correctness === InteractionCorrectness.Correct &&\n <div className='ms-2 text-success'>\n <SvgContainer svgName={cvSvgLibrary.Tick} />\n </div>\n }\n {props.correctness === InteractionCorrectness.Incorrect &&\n <div className='ms-2 text-danger'>\n <SvgContainer svgName={cvSvgLibrary.Close} />\n </div>\n }\n </>\n );\n}","import React from 'react';\n\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { StudentResults } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport { InteractionResponseCorrectness } from './InteractionResponseCorrectness';\n\ninterface InteractionStudentDetailsProps {\n studentResults: StudentResults;\n correctness: InteractionCorrectness;\n anonymisedUserName?: string;\n}\n\nexport function InteractionStudentDetailsHeader(props: InteractionStudentDetailsProps): JSX.Element {\n return (\n <div className='d-flex align-items-center justify-content-between mb-2'>\n <p className='fw-semibold mb-0'>\n {props.anonymisedUserName || UserHelper.getFullName(props.studentResults.user)}\n </p>\n <InteractionResponseCorrectness correctness={props.correctness} />\n </div>\n );\n}","import React from 'react';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { StudentAnswer, StudentAttempt } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\ninterface MarkResponseProps {\n studentAttempt: StudentAttempt;\n correctness: InteractionCorrectness;\n markInteraction: (answers: StudentAnswer[], status: InteractiveAnswerStatus) => void;\n markedStatus?: InteractiveAnswerStatus;\n}\n\nexport function MarkResponse(props: MarkResponseProps): JSX.Element {\n if (props.correctness !== InteractionCorrectness.AwaitingMarking)\n return <></>;\n\n return (\n <div className='d-flex justify-content-end gap-2 mt-2'>\n <div className={\n `d-flex flex-column justify-content-end cursor-pointer\n ${props.markedStatus === InteractiveAnswerStatus.Correct ? 'text-success' : ''}`\n }>\n <SvgContainer\n svgName={props.markedStatus === InteractiveAnswerStatus.Correct\n ? cvSvgLibrary.CheckCircle\n : cvSvgLibrary.CheckCircleOutline\n }\n onClick={\n () => props.markInteraction(props.studentAttempt.answers, InteractiveAnswerStatus.Correct)\n }\n />\n </div>\n <div className={\n `d-flex flex-column justify-content-end cursor-pointer\n ${props.markedStatus === InteractiveAnswerStatus.Incorrect ? ' text-danger' : ''}`\n }>\n <SvgContainer\n svgName={props.markedStatus === InteractiveAnswerStatus.Incorrect\n ? cvSvgLibrary.CrossCircleFilled\n : cvSvgLibrary.CrossCircle\n }\n onClick={\n () => props.markInteraction(props.studentAttempt.answers, InteractiveAnswerStatus.Incorrect)\n }\n />\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst namespace = 'interactives.responseTypes';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function NoResponse(): JSX.Element {\n return (\n <p className='p-2'><em>{getPhrase('noResponse')}</em></p>\n );\n}","export enum InteractionCorrectness {\n Correct,\n Incorrect,\n AwaitingMarking,\n \n Answered,\n UnAnswered,\n NotApplicable\n}","export enum InteractiveAnswerStatus {\n Incorrect = 0,\n Correct = 1,\n PendingReview = 2\n}","import { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, InteractionTypeId, InteractiveResult, StudentAnswer } from 'libs/shared/interfaces';\n\ntype GetStudentAnswerByActionableItemId = (id: string) => string;\n\nfunction notApplicable(): InteractionCorrectness {\n return InteractionCorrectness.NotApplicable;\n}\n\nfunction awaitingMarking(): InteractionCorrectness {\n return InteractionCorrectness.AwaitingMarking;\n}\n\nfunction isMissingWordCorrect(\n interaction: Interaction,\n getStudentAnswer: GetStudentAnswerByActionableItemId\n): InteractionCorrectness {\n const items = interaction.actionableItems.filter(a => a\n .isCorrect);\n\n if (items.every(a => !getStudentAnswer(a.id)))\n return InteractionCorrectness.UnAnswered;\n\n const correct = items.every(a => a.name.trim().toLowerCase() === getStudentAnswer(a.id)?.trim().toLowerCase());\n return correct ? InteractionCorrectness.Correct : InteractionCorrectness.Incorrect;\n}\n\nfunction isMultipleChoiceCorrect(\n interaction: Interaction,\n getStudentAnswer: GetStudentAnswerByActionableItemId\n): InteractionCorrectness {\n if (interaction.actionableItems.every(a => !getStudentAnswer(a.id)))\n return InteractionCorrectness.UnAnswered;\n \n const correctItems = interaction.actionableItems.filter(a => a.isCorrect);\n\n const correct = correctItems.every(a => {\n const studentAnswer = getStudentAnswer(a.id);\n\n /**\n * In the past we've only ever checked the answer name. But since we introduced the ability to have image interactions\n * with no question text, we've need to swap to saving the id. But past submissions still have the name\n * - Sha\n */\n return studentAnswer?.toString() === a.id?.toString() || studentAnswer === a.name;\n });\n return correct ? InteractionCorrectness.Correct : InteractionCorrectness.Incorrect;\n}\n\nfunction isMarkableAnswerMarkedCorrect(\n interaction: Interaction,\n getStudentAnswer: (id: string) => StudentAnswer\n): InteractionCorrectness {\n let correctness: InteractionCorrectness;\n\n // There should only be one actionableItem\n interaction.actionableItems.forEach(item => {\n const studentAnswer = getStudentAnswer(item.id);\n\n if (!studentAnswer) {\n correctness = InteractionCorrectness.UnAnswered;\n return;\n }\n\n if (studentAnswer.status === InteractiveAnswerStatus.Correct) {\n correctness = InteractionCorrectness.Correct;\n return;\n }\n\n if (studentAnswer.status === InteractiveAnswerStatus.Incorrect) {\n correctness = InteractionCorrectness.Incorrect;\n return;\n }\n\n correctness = InteractionCorrectness.AwaitingMarking;\n });\n\n return correctness;\n}\n\ntype IsCorrectFunction = (interaction: Interaction, result: InteractiveResult) => InteractionCorrectness;\n\nfunction getGetStudentAnswer(interaction: Interaction, result: InteractiveResult): (id: string) => StudentAnswer {\n return (id: string) => {\n const attempt = result.attempts.find(a => a.id === interaction.id);\n return attempt?.answers.find(s => s.id === id);\n };\n}\n\nfunction wrapIsMissingWordCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n\n return isMissingWordCorrect(interaction, (id: string) => {\n const answer = getStudentAnswer(id);\n return answer?.text;\n });\n}\n\nfunction wrapIsMultipleChoiceCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n\n return isMultipleChoiceCorrect(interaction, (id: string) => {\n const answer = getStudentAnswer(id);\n return answer?.text;\n });\n}\n\nfunction wrapIsMarkableAnswerMarkedCorrect(\n interaction: Interaction,\n result: InteractiveResult\n): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n return isMarkableAnswerMarkedCorrect(interaction, getStudentAnswer);\n}\n\nconst IsCorrectLookup: {[typeId: number]: IsCorrectFunction} = {\n [InteractionTypeId.Annotation]: notApplicable,\n [InteractionTypeId.Image]: notApplicable,\n [InteractionTypeId.MissingWord]: wrapIsMissingWordCorrect,\n [InteractionTypeId.MultipleChoice]: wrapIsMultipleChoiceCorrect,\n [InteractionTypeId.ShortAnswer]: wrapIsMarkableAnswerMarkedCorrect,\n [InteractionTypeId.TrueOrFalse]: wrapIsMultipleChoiceCorrect,\n [InteractionTypeId.Illustration]: wrapIsMarkableAnswerMarkedCorrect\n};\n\nfunction isInteractionCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const isCorrectFn = IsCorrectLookup[interaction.typeId];\n\n return isCorrectFn(interaction, result);\n}\n\nexport const InteractiveCorrectnessHelper = {\n notApplicable,\n awaitingMarking,\n isMissingWordCorrect,\n isMultipleChoiceCorrect,\n isInteractionCorrect\n};\n","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport {\n Interaction,\n InteractionTypeId,\n Interactive,\n InteractiveResult,\n StudentAttempt,\n StudentResults\n} from 'libs/shared/interfaces';\n\nfunction interactionRequiresAnswer(interaction: Interaction): boolean {\n return interaction.typeId !== InteractionTypeId.Annotation && interaction.typeId !== InteractionTypeId.Image;\n}\n\nexport function flattenInteractions(interactive: Interactive): Interaction[] {\n return ArrayHelper.flatten(interactive.timepoints.map(i => i.interactions));\n}\n\n/**\n * Centralised logic for using the most recent student result.\n */\nexport function getStudentResult(studentResults: StudentResults): InteractiveResult {\n return ArrayHelper.last(studentResults.results);\n}\n\nexport function getStudentAttempt(interactionId: string, result: InteractiveResult): StudentAttempt {\n return ArrayHelper.findWhere(result?.attempts, { id: interactionId });\n}\n\n/**\n * Returns a flat list of interactions on an interactive and filters out\n * those that don't require an answer (annotations and images).\n */\nexport function getInteractions(interactive: Interactive): Interaction [] {\n return flattenInteractions(interactive).filter(interactionRequiresAnswer);\n}"],"names":["alphabet","MultipleChoiceInteractionAnswers","props","previewAnswer","setPreviewAnswer","hasImages","interaction","actionableItems","find","a","data","imageUrl","scrollRef","small","size","length","className","isDisplayOnly","map","index","answer","getSelectedAnswer","id","hasText","name","onSelectAnswer","submitted","onlyShowSelectedAnswer","key","unCheckedBackground","LeftPart","showFeedback","isCorrect","hideFeedbackIcons","SvgContainer","S","svgName","accessibility","role","tabIndex","onKeyDown","e","hasImageClass","showImagePreview","toString","leftHandSidePortalNode","node","ref","src","alt","DivButton","onClick","style","backgroundImage","undefined","title","Avatar","imageCdnUrl","imageApi","initials","userInitials","userAvatar","extraClasses","defaultProps","TrueOrFalseInteractionAnswers","htmlFor","type","checked","onChange","disabled","hidden","PLACEHOLDER","NoResponseRequired","ResponseComponentLookup","items","sentence","replace","match","val","split","reportsStyling","item","idx","startsWith","order","actionableItem","answers","text","status","InteractiveAnswerStatus","anonymisedUserName","UserHelper","user","surname","avatar","url","showAvatar","ArrayHelper","InteractionResponse","ResponseComponent","typeId","result","studentResults","studentAttempt","correctness","InteractiveCorrectnessHelper","showStudentDetails","InteractionStudentDetailsHeader","responseComponentClass","NoResponse","InteractionResponseCorrectness","MarkResponse","markInteraction","markedStatus","getPhrase","InteractionCorrectness","notApplicable","isMissingWordCorrect","getStudentAnswer","filter","every","trim","toLowerCase","isMultipleChoiceCorrect","studentAnswer","getGetStudentAnswer","attempt","attempts","s","wrapIsMultipleChoiceCorrect","wrapIsMarkableAnswerMarkedCorrect","forEach","isMarkableAnswerMarkedCorrect","IsCorrectLookup","awaitingMarking","isInteractionCorrect","isCorrectFn","interactionRequiresAnswer","flattenInteractions","interactive","timepoints","i","interactions","getStudentResult","results","getStudentAttempt","interactionId","getInteractions"],"sourceRoot":""}
@@ -0,0 +1,3 @@
1
+ /*! For license information please see 4137-bef0be4a57-lite.chunk.js.LICENSE.txt */
2
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[4137],{34079:(e,t,r)=>{r.d(t,{O:()=>l});var n=r(32735),a=r(23481),i=r(40782),o=r(36532),c=a.T.encloseNamespace("interactives.pendingIndicator");function s(e){var t="d-flex align-items-center h-100";return t+=e.showLabel?" justify-content-between":" justify-content-center",e.className&&(t+=" ".concat(e.className)),t}function l(e){var t=function(){return n.createElement("div",{className:s(e)},!!e.showLabel&&n.createElement("em",null,c("pending")),n.createElement(i.O,null))};return e.title?n.createElement(o.u,{title:e.title,spanHack:!0,spanHackClassName:e.tooltipClassName||"h-100 w-100 d-flex align-items-center"},n.createElement(t,null)):n.createElement(t,null)}},83134:(e,t,r)=>{function n(e,t){switch(e){case"score_desc":return[{id:t,desc:!0}];case"score_asc":return[{id:t,desc:!1}];default:return[]}}r.d(t,{P:()=>n})},1704:(e,t,r)=>{r.d(t,{l:()=>l});var n=r(32735),a=r(23481),i=r(9111),o=r(13876);function c(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 s=a.T.encloseNamespace("shared.confirmationPopup");function l(e){var t,r,a=(t=n.useState(!1),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,i,o,c=[],s=!0,l=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;s=!1}else for(;!(s=(n=i.call(r)).done)&&(c.push(n.value),c.length!==t);s=!0);}catch(e){l=!0,a=e}finally{try{if(!s&&null!=r.return&&(o=r.return(),Object(o)!==o))return}finally{if(l)throw a}}return c}}(t,r)||function(e,t){if(e){if("string"==typeof e)return c(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)?c(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.")}()),l=a[0],u=a[1];return n.createElement(i.G,{title:e.title,closePopup:e.closePopup},n.createElement(n.Fragment,null,e.children,n.createElement(o.u,null,n.createElement(o.u.Cancel,{onClick:e.closePopup,variant:e.cancelButtonVariant,text:e.cancelButtonText||s("cancel")}),n.createElement(o.u.Submit,{onClick:function(){u(!0),e.onClickConfirm()},text:e.confirmButtonText||s("confirm"),variant:e.confirmButtonVariant,showSpinner:l,disabled:e.disabledConfirmButton}))))}l.defaultProps={confirmButtonVariant:"primary",cancelButtonVariant:"link"}},11165:(e,t,r)=>{r.r(t),r.d(t,{InteractiveInsightsQuestionsView:()=>pe});var n=r(32735),a=r(81886),i=r(23481),o=r(2948),c=r(20354),s=r(75896),l=r(9570),u=r(86572),m=i.T.encloseNamespace("interactives.interactionResponseListHeader");function d(e){var t,r=null===(t=e.interaction.data)||void 0===t?void 0:t.suggestedResponse;return n.createElement("div",{className:"rounded bg-white"},n.createElement("div",{className:"p-2 position-relative"},n.createElement("div",{className:"d-flex"},n.createElement(u.y,{interaction:e.interaction,iconClassName:"flex-shrink-0"})),!!r&&n.createElement("div",{className:"mt-2"},n.createElement("strong",null,m("suggestedResponse")),n.createElement("p",{className:"m-0"},r))))}var f=i.T.encloseNamespace("shared.submitMarkedAnswers");function p(e){return n.createElement("div",{className:"d-flex justify-content-end"},n.createElement("button",{className:"btn btn-outline-dark",onClick:e.submit,disabled:e.disabled},f("submitAnswers")))}var h=r(26136),g=r(39157),v=r(23232),y=r(44113),b=r(83345),w=r(28972),E=r(83140),N=r(80845);const S={awaitingMarking:"PPNkp"};var k="shared.interactionResponseList",x=i.T.encloseNamespace(k);function I(e){var t,r,a=(r=e.interaction,e.results.students.filter((function(e){return E.A.isInteractionCorrect(r,(0,N.j_)(e))===w.w.AwaitingMarking}))),i=Object.keys(e.markedAnswers).length;return(null===(t=e.results.students)||void 0===t?void 0:t.length)?n.createElement(n.Fragment,null,e.reportsStyling&&n.createElement(d,{interaction:e.interaction}),n.createElement("div",{className:e.reportsStyling?"d-flex justify-content-end":"d-flex align-items-center justify-content-between border-bottom border-light px-3 py-2"},!e.reportsStyling&&n.createElement("p",{className:"fw-semibold mb-0"},n.createElement(b.x,{namespace:k,phrase:"studentAnswers"})),!!a.length&&n.createElement(p,{submit:e.submitMarkedAnswers,disabled:!i})),n.createElement(n.Fragment,null,n.createElement("ul",{className:"list-unstyled mb-0"},e.results.students.map((function(t,r){var i=a.some((function(e){return e.user.id===t.user.id})),o=e.reportsStyling?"bg-white p-2":"bg-white px-3 pt-3 pb-2";return i&&(o+=" ".concat(S.awaitingMarking)),n.createElement("li",{key:r,className:e.reportsStyling?"position-relative mt-2":"position-relative border-bottom border-light"},e.reportsStyling?n.createElement(y.O,{interaction:e.interaction,studentResults:t,markedStatus:(0,g.HI)(e.interaction.id,t,e.markedAnswers),markInteraction:e.addMarkedAnswers,imageCdnUrl:e.imageCdnUrl,showStudentDetails:!0,anonymisedUserName:e.anonymiseUsers?(0,h.B)(t.user,!0):null,className:o,showFeedback:!0,reportsStyling:!0,responseComponentClass:"mx-n2"}):n.createElement(l.d,{interaction:e.interaction,studentResults:t,markedStatus:(0,g.HI)(e.interaction.id,t,e.markedAnswers),markInteraction:e.addMarkedAnswers,imageCdnUrl:e.imageCdnUrl,showStudentDetails:!0,anonymisedUserName:e.anonymiseUsers?(0,h.B)(t.user,!0):null,className:o,showFeedback:!0}))}))),!!a.length&&n.createElement("div",{className:"mt-2"},n.createElement(p,{submit:e.submitMarkedAnswers,disabled:!i})))):n.createElement("div",{className:"d-flex flex-column h-100"},n.createElement(v.u,{className:"bg-white rounded mt-2 py-5 flex-grow-1 justify-content-center"},n.createElement(v.u.Image,{src:e.emptyStateImageUrl}),n.createElement(v.u.Heading,null,x("emptyStateHeading")),n.createElement(v.u.Info,{className:"w-100"},x("emptyStateDescription"))))}var A=i.T.encloseNamespace("shared.selectedInteractionEmptyState");function C(e){return n.createElement(v.u,{className:"rounded h-100 bg-white justify-content-center py-4"},n.createElement(v.u.Image,{src:e.emptyStateUrl,className:"w-75 h-auto"}),n.createElement(v.u.Info,{className:"w-100"},A("emptyStateText")))}var O=r(83134),j=r(69674),L=r(57266),T=r(34079),U=r(10874),M=r(83914),P=r(40424),R=r(35223);const _={row:"it1bR",answerImage:"WveSa",answerWidth:"xMLqI",svgFill:"yi9Ev"};var B="shared.questionTable";function F(e){var t,r;function a(e){return String.fromCharCode(e+"A".charCodeAt(0))}switch(e.interaction.typeId){case P.Z9.MultipleChoice:return n.createElement("ul",{className:"".concat(_.answerWidth," list-unstyled row g-2")},e.interaction.actionableItems.map((function(e){var t;return(null===(t=e.data)||void 0===t?void 0:t.imageUrl)?n.createElement("li",{key:e.id,className:"col-6 position-relative"},n.createElement("div",{className:"".concat(_.svgFill," position-absolute top-0 start-0 px-2 pt-1 z-1")},e.isCorrect?n.createElement(M.x,{svgName:R.vn.CheckCircle,size:M.S.XXL,className:"svg-container text-success"}):n.createElement(M.x,{svgName:R.vn.CrossCircleFilled,size:M.S.Large,className:"svg-container text-red"})),n.createElement("div",{className:"".concat(e.isCorrect?"":"opacity-50"," d-flex flex-column rounded-3 overflow-hidden shadow h-100")},n.createElement("img",{src:e.data.imageUrl,className:"".concat(_.answerImage," w-100")}),n.createElement("div",{className:"bg-white flex-grow-1"},n.createElement("p",{className:"p-2 mb-0"},e.name)))):n.createElement("li",{key:e.id,className:"col-12"},n.createElement("div",{className:"".concat(e.isCorrect?"bg-light-green border-green":"bg-light-red border-red"," rounded border py-1 px-2 m-0")},n.createElement("span",{className:"fw-semibold"},a(e.order),". "),n.createElement("span",null,e.name)))})));case P.Z9.TrueOrFalse:return n.createElement("ul",{className:"list-unstyled d-flex gap-2"},e.interaction.actionableItems.map((function(e){return n.createElement("li",{key:e.id,className:"".concat(e.isCorrect?"bg-light-green border-green":"bg-light-red border-red"," rounded border px-2 py-1 mb-2 w-50")},n.createElement("span",{className:"fw-semibold"},a(e.order),". "),n.createElement("span",null,e.name))})));case P.Z9.ShortAnswer:var i=null===(t=e.interaction.data)||void 0===t?void 0:t.suggestedResponse;return i?n.createElement("div",{className:"".concat(_.answerWidth," bg-light-blue rounded p-2 mb-2")},n.createElement("div",{className:"d-flex justify-content-between"},n.createElement("p",{className:"fw-semibold mb-2"},n.createElement(b.x,{namespace:B,phrase:"suggestedResponse"})),n.createElement(U.h,{svgName:R.vn.Edit,onClick:function(){return e.editSuggestedResponse()}})),n.createElement("p",{className:"mb-0"},i)):n.createElement(U.h,{svgName:R.vn.Edit,className:"btn btn-outline-dark mb-2",onClick:e.editSuggestedResponse},n.createElement(b.x,{namespace:B,phrase:"createSuggestedResponse"}));case P.Z9.MissingWord:return n.createElement("div",null,n.createElement("p",{className:"mb-0"},(r=e.interaction.data.sentence)?r.split(/({\d+})/).map((function(t,r){var a=t.match(/{(\d+)}/);if(a){var i=a[1],o=e.interaction.actionableItems.find((function(e){return+e.order==+i}));if(o)return n.createElement("span",{className:"bg-white border border-gray-300 rounded p-1 lh-lg",key:r},o.name)}return t})):""))}}var G=r(40782),H=i.T.encloseNamespace("shared.questionTable");function D(e,t,r){var n=e.cells.find((function(e){return e.column.id===r})).value,a=t.cells.find((function(e){return e.column.id===r})).value;return n.awaitingMarking?-1:a.awaitingMarking||n.percentCorrect>=a.percentCorrect?1:-1}function W(e){var t;return n.createElement("div",{className:"d-flex ".concat(null!==(t=e.className)&&void 0!==t?t:"")},e.children)}function q(e){return n.createElement(W,{className:e.column.isSorted&&"fw-bold"},H(e.phraseKey))}function V(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 Q(e){var t,r,a,i,o=(a=n.useState((0,O.P)(e.sortBy,"correctlyAnswered")),i=2,function(e){if(Array.isArray(e))return e}(a)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,i,o,c=[],s=!0,l=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;s=!1}else for(;!(s=(n=i.call(r)).done)&&(c.push(n.value),c.length!==t);s=!0);}catch(e){l=!0,a=e}finally{try{if(!s&&null!=r.return&&(o=r.return(),Object(o)!==o))return}finally{if(l)throw a}}return c}}(a,i)||function(e,t){if(e){if("string"==typeof e)return V(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)?V(e,t):void 0}}(a,i)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),c=o[0],l=o[1],m=function(e,t,r,a){return n.useMemo((function(){var r=(0,N.Q)(e).map((function(e){return Object.assign(Object.assign({},e),{resultsSummary:(0,g.nq)(e,t)})}));if("correctlyAnswered"===(null==a?void 0:a.id)){var n=s.m.sortBy(r,(function(e){return e.resultsSummary.awaitingMarking?-1:e.resultsSummary.percentCorrect}));return a.desc?n.reverse():n}return r}),[r,a])}(e.interactive,e.results,e.refreshTable,s.m.first(c)),d=e.selectedInteractionId&&(0,g.Zs)(e.interactive,e.selectedInteractionId);return n.createElement("div",{className:"row"},n.createElement("div",{className:"col-6"},n.createElement(j.i,{key:e.selectedInteractionId,columns:(t=e.showAnswersInTable,r=e.editSuggestedResponse,[{Header:function(e){var t=e.column;return n.createElement(q,{column:t,phraseKey:"#"})},accessor:"data",id:"index",Cell:function(e){var t=e.row.index;return n.createElement(W,null,t+1,".")},width:15,disableSortBy:!0},{Header:function(e){var t=e.column;return n.createElement(q,{column:t,phraseKey:"question"})},accessor:"data",Cell:function(e){var a=e.row.original,i=e.initialState.selectedRowIds,o=null==i?void 0:i[null==a?void 0:a.id];return n.createElement(W,{className:"flex-column"},n.createElement("div",{className:"".concat(o?"":"clamp-1"," pe-2")},n.createElement(u.y,{interaction:a,containerClassName:o?"d-flex":""})),t&&o&&n.createElement("div",{className:"mt-3 w-100"},n.createElement(F,{interaction:a,editSuggestedResponse:r})))},disableSortBy:!0},{Header:function(e){var t=e.column;return n.createElement(q,{column:t,phraseKey:"score"})},accessor:"resultsSummary",id:"correctlyAnswered",Cell:function(e){var t=e.value,r=t.percentCorrect;return t.awaitingMarking?n.createElement(T.O,{title:H("markingRequired"),className:"flex-grow-1",tooltipClassName:"d-block",showLabel:!0}):n.createElement(G.O,{percentage:r,layout:G.I.LabelBefore})},width:60,sortDescFirst:!0,sortType:D}]),data:m,theme:e.theme,onSelectRow:function(e){var t=e.original;L.e.updateParams({interactionId:t.id},{merge:!0})},initialSelectedRowIds:d?[d.id]:null,getRowId:function(e){return e.id},enableSort:!0,manualSort:!0,onSort:l,initialSortBy:c})),n.createElement("div",{className:"col-6"},n.createElement("div",{className:"border border-light rounded h-100"},!!d&&n.createElement(I,{interaction:d,results:e.results,markedAnswers:e.markedAnswers,addMarkedAnswers:e.addMarkedAnswers,submitMarkedAnswers:e.submitMarkedAnswers,imageCdnUrl:e.imageCdnUrl,anonymiseUsers:e.anonymiseUsers,emptyStateImageUrl:e.emptyStateImageUrl,reportsStyling:e.reportsStyling}),!d&&n.createElement(C,{emptyStateUrl:e.selectQuestionImageUrl}))))}var K=r(41196),Z=r(9193),$=r(26025),z=r(74901),Y=r(40003),X=r(1704),J=r(38143),ee=r(39151),te=r(20768),re=r(99742),ne=r(14070),ae=r(97291),ie=r(5672),oe=r(83590);function ce(e){return ce="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},ce(e)}function se(){se=function(){return t};var e,t={},r=Object.prototype,n=r.hasOwnProperty,a=Object.defineProperty||function(e,t,r){e[t]=r.value},i="function"==typeof Symbol?Symbol:{},o=i.iterator||"@@iterator",c=i.asyncIterator||"@@asyncIterator",s=i.toStringTag||"@@toStringTag";function l(e,t,r){return Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{l({},"")}catch(e){l=function(e,t,r){return e[t]=r}}function u(e,t,r,n){var i=t&&t.prototype instanceof v?t:v,o=Object.create(i.prototype),c=new j(n||[]);return a(o,"_invoke",{value:I(e,r,c)}),o}function m(e,t,r){try{return{type:"normal",arg:e.call(t,r)}}catch(e){return{type:"throw",arg:e}}}t.wrap=u;var d="suspendedStart",f="suspendedYield",p="executing",h="completed",g={};function v(){}function y(){}function b(){}var w={};l(w,o,(function(){return this}));var E=Object.getPrototypeOf,N=E&&E(E(L([])));N&&N!==r&&n.call(N,o)&&(w=N);var S=b.prototype=v.prototype=Object.create(w);function k(e){["next","throw","return"].forEach((function(t){l(e,t,(function(e){return this._invoke(t,e)}))}))}function x(e,t){function r(a,i,o,c){var s=m(e[a],e,i);if("throw"!==s.type){var l=s.arg,u=l.value;return u&&"object"==ce(u)&&n.call(u,"__await")?t.resolve(u.__await).then((function(e){r("next",e,o,c)}),(function(e){r("throw",e,o,c)})):t.resolve(u).then((function(e){l.value=e,o(l)}),(function(e){return r("throw",e,o,c)}))}c(s.arg)}var i;a(this,"_invoke",{value:function(e,n){function a(){return new t((function(t,a){r(e,n,t,a)}))}return i=i?i.then(a,a):a()}})}function I(t,r,n){var a=d;return function(i,o){if(a===p)throw Error("Generator is already running");if(a===h){if("throw"===i)throw o;return{value:e,done:!0}}for(n.method=i,n.arg=o;;){var c=n.delegate;if(c){var s=A(c,n);if(s){if(s===g)continue;return s}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(a===d)throw a=h,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);a=p;var l=m(t,r,n);if("normal"===l.type){if(a=n.done?h:f,l.arg===g)continue;return{value:l.arg,done:n.done}}"throw"===l.type&&(a=h,n.method="throw",n.arg=l.arg)}}}function A(t,r){var n=r.method,a=t.iterator[n];if(a===e)return r.delegate=null,"throw"===n&&t.iterator.return&&(r.method="return",r.arg=e,A(t,r),"throw"===r.method)||"return"!==n&&(r.method="throw",r.arg=new TypeError("The iterator does not provide a '"+n+"' method")),g;var i=m(a,t.iterator,r.arg);if("throw"===i.type)return r.method="throw",r.arg=i.arg,r.delegate=null,g;var o=i.arg;return o?o.done?(r[t.resultName]=o.value,r.next=t.nextLoc,"return"!==r.method&&(r.method="next",r.arg=e),r.delegate=null,g):o:(r.method="throw",r.arg=new TypeError("iterator result is not an object"),r.delegate=null,g)}function C(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function O(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function j(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(C,this),this.reset(!0)}function L(t){if(t||""===t){var r=t[o];if(r)return r.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var a=-1,i=function r(){for(;++a<t.length;)if(n.call(t,a))return r.value=t[a],r.done=!1,r;return r.value=e,r.done=!0,r};return i.next=i}}throw new TypeError(ce(t)+" is not iterable")}return y.prototype=b,a(S,"constructor",{value:b,configurable:!0}),a(b,"constructor",{value:y,configurable:!0}),y.displayName=l(b,s,"GeneratorFunction"),t.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===y||"GeneratorFunction"===(t.displayName||t.name))},t.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,b):(e.__proto__=b,l(e,s,"GeneratorFunction")),e.prototype=Object.create(S),e},t.awrap=function(e){return{__await:e}},k(x.prototype),l(x.prototype,c,(function(){return this})),t.AsyncIterator=x,t.async=function(e,r,n,a,i){void 0===i&&(i=Promise);var o=new x(u(e,r,n,a),i);return t.isGeneratorFunction(r)?o:o.next().then((function(e){return e.done?e.value:o.next()}))},k(S),l(S,s,"Generator"),l(S,o,(function(){return this})),l(S,"toString",(function(){return"[object Generator]"})),t.keys=function(e){var t=Object(e),r=[];for(var n in t)r.push(n);return r.reverse(),function e(){for(;r.length;){var n=r.pop();if(n in t)return e.value=n,e.done=!1,e}return e.done=!0,e}},t.values=L,j.prototype={constructor:j,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=e,this.done=!1,this.delegate=null,this.method="next",this.arg=e,this.tryEntries.forEach(O),!t)for(var r in this)"t"===r.charAt(0)&&n.call(this,r)&&!isNaN(+r.slice(1))&&(this[r]=e)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var r=this;function a(n,a){return c.type="throw",c.arg=t,r.next=n,a&&(r.method="next",r.arg=e),!!a}for(var i=this.tryEntries.length-1;i>=0;--i){var o=this.tryEntries[i],c=o.completion;if("root"===o.tryLoc)return a("end");if(o.tryLoc<=this.prev){var s=n.call(o,"catchLoc"),l=n.call(o,"finallyLoc");if(s&&l){if(this.prev<o.catchLoc)return a(o.catchLoc,!0);if(this.prev<o.finallyLoc)return a(o.finallyLoc)}else if(s){if(this.prev<o.catchLoc)return a(o.catchLoc,!0)}else{if(!l)throw Error("try statement without catch or finally");if(this.prev<o.finallyLoc)return a(o.finallyLoc)}}}},abrupt:function(e,t){for(var r=this.tryEntries.length-1;r>=0;--r){var a=this.tryEntries[r];if(a.tryLoc<=this.prev&&n.call(a,"finallyLoc")&&this.prev<a.finallyLoc){var i=a;break}}i&&("break"===e||"continue"===e)&&i.tryLoc<=t&&t<=i.finallyLoc&&(i=null);var o=i?i.completion:{};return o.type=e,o.arg=t,i?(this.method="next",this.next=i.finallyLoc,g):this.complete(o)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),g},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),O(r),g}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var a=n.arg;O(r)}return a}}throw Error("illegal catch attempt")},delegateYield:function(t,r,n){return this.delegate={iterator:L(t),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=e),g}},t}function le(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,i,o,c=[],s=!0,l=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;s=!1}else for(;!(s=(n=i.call(r)).done)&&(c.push(n.value),c.length!==t);s=!0);}catch(e){l=!0,a=e}finally{try{if(!s&&null!=r.return&&(o=r.return(),Object(o)!==o))return}finally{if(l)throw a}}return c}}(e,t)||function(e,t){if(e){if("string"==typeof e)return ue(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)?ue(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 ue(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 me=function(e,t,r,n){return new(r||(r=Promise))((function(a,i){function o(e){try{s(n.next(e))}catch(e){i(e)}}function c(e){try{s(n.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?a(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(o,c)}s((n=n.apply(e,t||[])).next())}))},de=i.T.encloseNamespace("shared.interactiveInsightsQuestions"),fe={table:"bg-white rounded border border-light pb-2",header:"border-bottom px-3 py-2 mb-2",headerCell:"d-flex align-items-center",cell:"",row:"px-3 py-2 bg-light-blue-hover",selectedRow:"bg-gray-100",sortIndicator:"ms-2"};function pe(e){var t,r,i,s,l=le((0,o.D)(J.g.ANONYMISE_USERS),1)[0],u=le(n.useState(!1),2),m=u[0],d=u[1],f=c.a.useBasicFetch(ee.L.config()),p=c.a.useBasicFetch(te.b.interactiveMetadata(e.interactiveId)),h=c.a.useBasicFetch((null===(t=p.data)||void 0===t?void 0:t.interactiveId)&&te.b.interactive(p.data.interactiveId)),g=$.B.getAudienceAppLinkParams(),v=$.B.getDateRangeAppLinkParams(),y=(0,K.W)(e.interactiveId,Object.assign(Object.assign({},(0,Y.wO)((0,Y.Hb)(),v)),(0,z.K)(g))),b=(0,Z.D)(null===(r=h.data)||void 0===r?void 0:r.id,null===(i=p.data)||void 0===i?void 0:i.id,(function(){return d(!1)})),w=b.markedAnswers,E=b.addMarkedAnswers,N=b.submitMarkedAnswers;if(!(h.data&&p.data&&y.data))return n.createElement(n.Fragment,null);var S=Object.assign(Object.assign({},g),v);return n.createElement("div",{className:"px-3"},n.createElement(oe.m,{audienceAppLinkParams:g,dateRangeAppLinkParams:v,tabs:(0,ie.kj)(e.interactiveId,"questions",S),video:p.data}),n.createElement(Q,{interactive:h.data,results:y.data,markedAnswers:w,addMarkedAnswers:E,submitMarkedAnswers:function(){return d(!0)},imageCdnUrl:f.data.imageCdnUrl,selectedInteractionId:e.interactionId,refreshTable:y.isFetching||h.isFetching,emptyStateImageUrl:re.W.Insights.NO_RESPONSES,selectQuestionImageUrl:re.W.Insights.NO_DATA,anonymiseUsers:l,editSuggestedResponse:function(){return me(this,void 0,void 0,se().mark((function t(){return se().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:a.Q.C$.trigger({application:ae.O.INSIGHTS,action:ne.e.Insights.INTERACTIVE_SUGGESTED_RESPONSE,args:[e.interactiveId],params:{interactionId:e.interactionId}});case 1:case"end":return t.stop()}}),t)})))},sortBy:e.sortBy,showAnswersInTable:!0,theme:fe}),m&&n.createElement(X.l,{title:de("markPopupTitle",{smartCount:null!==(s=Object.keys(w).length)&&void 0!==s?s:0}),closePopup:function(){return d(!1)},confirmButtonText:de("submit"),confirmButtonVariant:"dark",onClickConfirm:N},n.createElement("p",null,de("markPopupBody"))))}}}]);
3
+ //# sourceMappingURL=4137-bef0be4a57-lite.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/4137-bef0be4a57-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/analytics/components/pending-indicator/PendingIndicator.tsx","file:///app/packages/libs/shared/src/apps/analytics/utils/StudentTableSortUtils.ts","file:///app/packages/libs/shared/src/components/confirmation-popup/ConfirmationPopup.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-list/InteractionResponseListHeader.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/submit-marked-answers/SubmitMarkedAnswers.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-list/interaction-response-list.scss","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-list/InteractionResponseList.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/selected-interaction-empty-state/SelectedInteractionEmptyState.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/question-table/question-table.scss","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/question-table/QuestionTableAnswers.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/question-table/QuestionTableUtils.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/question-table/QuestionTable.tsx","file:///app/packages/projects/lite/src/apps/insights/views/interactive/questions/InteractiveInsightsQuestionsView.tsx"],"sourcesContent":["import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { PercentageIndicator } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\n\nconst namespace = 'interactives.pendingIndicator';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getClassName(props: PendingIndicatorProps): string {\n let className = 'd-flex align-items-center h-100';\n\n className += props.showLabel ? ' justify-content-between' : ' justify-content-center';\n\n if (props.className)\n className += ` ${props.className}`;\n\n return className;\n}\n\ninterface PendingIndicatorProps {\n title?: string;\n className?: string;\n showLabel?: boolean;\n tooltipClassName?: string;\n}\n\nexport function PendingIndicator(props: PendingIndicatorProps): JSX.Element {\n const Indicator = () => (\n <div className={getClassName(props)}>\n {!!props.showLabel &&\n <em>{getPhrase('pending')}</em>\n }\n <PercentageIndicator />\n </div>\n );\n\n if (!props.title)\n return <Indicator />;\n\n return (\n <Tooltip title={props.title} spanHack spanHackClassName={props.tooltipClassName || 'h-100 w-100 d-flex align-items-center'}>\n <Indicator />\n </Tooltip>\n );\n}","import { SortingRule } from 'react-table';\n\nexport type SortStudentsBy = 'score_desc' | 'score_asc';\n\nexport function getSortStudents(sortBy: SortStudentsBy, id: string): SortingRule<any>[] {\n switch (sortBy) {\n case 'score_desc': return [{ id, desc: true }];\n case 'score_asc': return [{ id, desc: false }];\n default: return [];\n }\n}","import * as React from 'react';\nimport { ButtonProps } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { PopupViewProps } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.confirmationPopup';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ConfirmationPopupProps {\n title: string;\n onClickConfirm: () => void;\n confirmButtonText?: string;\n cancelButtonText?: string;\n confirmButtonVariant?: ButtonProps['variant'];\n cancelButtonVariant?: ButtonProps['variant'];\n disabledConfirmButton?: boolean;\n}\n\nConfirmationPopup.defaultProps = {\n confirmButtonVariant: 'primary',\n cancelButtonVariant: 'link'\n};\n\ntype PropTypes = React.PropsWithChildren<ConfirmationPopupProps & PopupViewProps>;\n\nexport function ConfirmationPopup(props: PropTypes): React.ReactElement {\n const [ showButtonSpinner, setShowButtonSpinner ] = React.useState(false);\n\n return (\n <Popup title={props.title} closePopup={props.closePopup}>\n <>\n {props.children}\n <PopupButtons>\n <PopupButtons.Cancel\n onClick={props.closePopup}\n variant={props.cancelButtonVariant}\n text={props.cancelButtonText || getPhrase('cancel')}\n />\n <PopupButtons.Submit\n onClick={() => { setShowButtonSpinner(true); props.onClickConfirm(); }}\n text={props.confirmButtonText || getPhrase('confirm')}\n variant={props.confirmButtonVariant}\n showSpinner={showButtonSpinner}\n disabled={props.disabledConfirmButton}\n />\n </PopupButtons>\n </>\n </Popup>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { Interaction } from 'libs/shared/interfaces';\n\nconst namespace = 'interactives.interactionResponseListHeader';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractionResponseListHeaderProps {\n interaction: Interaction;\n}\n\nexport function InteractionResponseListHeader(props: InteractionResponseListHeaderProps): JSX.Element {\n const suggestedResponse = props.interaction.data?.suggestedResponse;\n\n return (\n <div className='rounded bg-white'>\n <div className='p-2 position-relative'>\n <div className='d-flex'>\n <InteractionLabel\n interaction={props.interaction}\n iconClassName='flex-shrink-0'\n />\n </div>\n {!!suggestedResponse &&\n <div className='mt-2'>\n <strong>{getPhrase('suggestedResponse')}</strong>\n <p className='m-0'>{suggestedResponse}</p>\n </div>\n }\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst namespace = 'shared.submitMarkedAnswers';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SubmitMarkedAnswersProps {\n submit: () => void;\n disabled: boolean\n}\n\nexport function SubmitMarkedAnswers(props: SubmitMarkedAnswersProps): JSX.Element {\n return (\n <div className='d-flex justify-content-end'>\n <button\n className='btn btn-outline-dark'\n onClick={props.submit}\n disabled={props.disabled}\n >\n {getPhrase('submitAnswers')}\n </button>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"awaitingMarking\":\"PPNkp\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InteractionResponseItem } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/InteractionResponseItem';\nimport { InteractionResponseListHeader } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-list/InteractionResponseListHeader';\nimport { SubmitMarkedAnswers } from 'libs/shared/apps/analytics/components/questions-list/submit-marked-answers/SubmitMarkedAnswers';\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { anonymiseUserName } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { getMarkedStatus } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { InteractionResponse } from 'libs/shared/components/interaction-response/InteractionResponse';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, InteractiveResultSet, StudentAnswer, StudentResults } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { getStudentResult } from 'libs/shared/utils/InteractiveHelper';\n\nimport styles from './interaction-response-list.scss';\n\nconst namespace = 'shared.interactionResponseList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getResponsesToMark(\n interaction: Interaction,\n studentResults: StudentResults[]\n): StudentResults[] {\n return studentResults.filter(s =>\n InteractiveCorrectnessHelper.isInteractionCorrect(\n interaction,\n getStudentResult(s)\n ) === InteractionCorrectness.AwaitingMarking);\n}\ninterface InteractionResponseListProps {\n interaction: Interaction\n results: InteractiveResultSet;\n markedAnswers: MarkedAnswerHash;\n addMarkedAnswers: (answer: StudentAnswer[], status: InteractiveAnswerStatus) => void;\n submitMarkedAnswers: () => void;\n imageCdnUrl: string;\n anonymiseUsers: boolean;\n emptyStateImageUrl: string;\n reportsStyling?: boolean;\n}\n\nexport function InteractionResponseList(props: InteractionResponseListProps): JSX.Element {\n const responsesToMark = getResponsesToMark(props.interaction, props.results.students);\n const numMarkedAnswers = Object.keys(props.markedAnswers).length;\n\n if (!props.results.students?.length)\n return (\n <div className='d-flex flex-column h-100'>\n <EmptyState className='bg-white rounded mt-2 py-5 flex-grow-1 justify-content-center'>\n <EmptyState.Image src={props.emptyStateImageUrl} />\n <EmptyState.Heading>\n {getPhrase('emptyStateHeading')}\n </EmptyState.Heading>\n <EmptyState.Info className='w-100'>\n {getPhrase('emptyStateDescription')}\n </EmptyState.Info>\n </EmptyState>\n </div>\n );\n\n return (\n <>\n {props.reportsStyling && <InteractionResponseListHeader interaction={props.interaction} />}\n <div className={props.reportsStyling\n ? 'd-flex justify-content-end'\n : 'd-flex align-items-center justify-content-between border-bottom border-light px-3 py-2'\n }>\n {!props.reportsStyling && <p className='fw-semibold mb-0'><Text namespace={namespace} phrase='studentAnswers' /></p>}\n {!!responsesToMark.length &&\n <SubmitMarkedAnswers submit={props.submitMarkedAnswers} disabled={!numMarkedAnswers} />\n }\n </div>\n <>\n <ul className='list-unstyled mb-0'>\n {props.results.students.map((s, idx) => {\n const markingRequired = responsesToMark.some(r => r.user.id === s.user.id);\n\n let className = props.reportsStyling ? 'bg-white p-2' : 'bg-white px-3 pt-3 pb-2';\n\n if (markingRequired)\n className += ` ${styles.awaitingMarking}`;\n\n return (\n <li key={idx} className={props.reportsStyling ? 'position-relative mt-2' : 'position-relative border-bottom border-light'}>\n {props.reportsStyling ? (\n <InteractionResponse\n interaction={props.interaction}\n studentResults={s}\n markedStatus={getMarkedStatus(props.interaction.id, s, props.markedAnswers)}\n markInteraction={props.addMarkedAnswers}\n imageCdnUrl={props.imageCdnUrl}\n showStudentDetails\n anonymisedUserName={props.anonymiseUsers ? anonymiseUserName(s.user, true) : null}\n className={className}\n showFeedback\n reportsStyling\n responseComponentClass='mx-n2'\n />\n ) : (\n <InteractionResponseItem\n interaction={props.interaction}\n studentResults={s}\n markedStatus={getMarkedStatus(props.interaction.id, s, props.markedAnswers)}\n markInteraction={props.addMarkedAnswers}\n imageCdnUrl={props.imageCdnUrl}\n showStudentDetails\n anonymisedUserName={props.anonymiseUsers ? anonymiseUserName(s.user, true) : null}\n className={className}\n showFeedback\n />\n )}\n </li>\n );\n })}\n </ul>\n {!!responsesToMark.length &&\n <div className='mt-2'>\n <SubmitMarkedAnswers submit={props.submitMarkedAnswers} disabled={!numMarkedAnswers} />\n </div>\n }\n </>\n </>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\n\nconst namespace = 'shared.selectedInteractionEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SelectedInteractionEmptyStateProps {\n emptyStateUrl: string;\n}\n\nexport function SelectedInteractionEmptyState(props: SelectedInteractionEmptyStateProps): JSX.Element {\n return (\n <EmptyState className='rounded h-100 bg-white justify-content-center py-4'>\n <EmptyState.Image\n src={props.emptyStateUrl}\n className='w-75 h-auto'\n />\n <EmptyState.Info className='w-100'>\n {getPhrase('emptyStateText')}\n </EmptyState.Info>\n </EmptyState>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"row\":\"it1bR\",\"answerImage\":\"WveSa\",\"answerWidth\":\"xMLqI\",\"svgFill\":\"yi9Ev\"};","import React from 'react';\n\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Interaction, InteractionTypeId } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './question-table.scss';\n\nconst namespace = 'shared.questionTable';\n\ninterface QuestionTableAnswersProps {\n interaction: Interaction;\n editSuggestedResponse?: () => void;\n}\n\nexport function QuestionTableAnswers(props: QuestionTableAnswersProps) {\n function indexToLetter(index: number) {\n return String.fromCharCode(index + 'A'.charCodeAt(0));\n }\n\n switch (props.interaction.typeId) {\n case InteractionTypeId.MultipleChoice: return (\n <ul className={`${styles.answerWidth} list-unstyled row g-2`}>\n {props.interaction.actionableItems.map(option => {\n if (option.data?.imageUrl) {\n return (\n <li key={option.id} className='col-6 position-relative'>\n <div className={`${styles.svgFill} position-absolute top-0 start-0 px-2 pt-1 z-1`}>\n {option.isCorrect\n ? <SvgContainer svgName={cvSvgLibrary.CheckCircle} size={SvgContainerSize.XXL} className='svg-container text-success' />\n : <SvgContainer svgName={cvSvgLibrary.CrossCircleFilled} size={SvgContainerSize.Large} className='svg-container text-red' />\n }\n\n </div>\n <div className={`${!option.isCorrect ? 'opacity-50' : ''} d-flex flex-column rounded-3 overflow-hidden shadow h-100`}>\n <img src={option.data.imageUrl} className={`${styles.answerImage} w-100`} />\n <div className='bg-white flex-grow-1'>\n <p className='p-2 mb-0'>{option.name}</p>\n </div>\n </div>\n </li>\n );\n }\n\n\n return (\n <li key={option.id} className='col-12'>\n <div className={`${option.isCorrect ? 'bg-light-green border-green' : 'bg-light-red border-red'} rounded border py-1 px-2 m-0`}>\n <span className='fw-semibold'>{indexToLetter(option.order)}. </span>\n <span>{option.name}</span>\n </div>\n </li>\n );\n })}\n </ul>\n );\n case InteractionTypeId.TrueOrFalse: return (\n <ul className='list-unstyled d-flex gap-2'>\n {props.interaction.actionableItems.map(option => {\n return (\n <li\n key={option.id}\n className={`${option.isCorrect ? 'bg-light-green border-green' : 'bg-light-red border-red'} rounded border px-2 py-1 mb-2 w-50`}\n >\n <span className='fw-semibold'>{indexToLetter(option.order)}. </span>\n <span>{option.name}</span>\n </li>\n );\n })}\n </ul>\n );\n case InteractionTypeId.ShortAnswer: {\n const suggestedResponse = props.interaction.data?.suggestedResponse;\n\n if (!suggestedResponse) {\n return (\n <IconButton svgName={cvSvgLibrary.Edit} className='btn btn-outline-dark mb-2' onClick={props.editSuggestedResponse}>\n <Text namespace={namespace} phrase='createSuggestedResponse' />\n </IconButton>\n );\n }\n\n return (\n <div className={`${styles.answerWidth} bg-light-blue rounded p-2 mb-2`}>\n <div className='d-flex justify-content-between'>\n <p className='fw-semibold mb-2'>\n <Text namespace={namespace} phrase='suggestedResponse' />\n </p>\n\n <IconButton svgName={cvSvgLibrary.Edit} onClick={() => props.editSuggestedResponse()} />\n </div>\n\n <p className='mb-0'>{suggestedResponse}</p>\n </div>\n );\n }\n case InteractionTypeId.MissingWord: {\n const replacePlaceholders = (str: string) => {\n if (!str) return '';\n\n return str.split(/({\\d+})/).map((part, index) => {\n const match = part.match(/{(\\d+)}/);\n\n if (match) {\n const key = match[1];\n\n const replacement = props.interaction.actionableItems.find(answer => +answer.order === +key);\n\n\n if (replacement) {\n return <span className='bg-white border border-gray-300 rounded p-1 lh-lg' key={index}>{replacement.name}</span>;\n }\n }\n\n return part;\n });\n };\n\n return (\n <div>\n <p className='mb-0'>{replacePlaceholders(props.interaction.data.sentence)}</p>\n </div>\n );\n }\n }\n}","import React from 'react';\nimport { Column, ColumnInstance, Row, SortingRule } from 'react-table';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { PendingIndicator } from 'libs/shared/apps/analytics/components/pending-indicator/PendingIndicator';\nimport { QuestionTableAnswers } from 'libs/shared/apps/analytics/components/questions-list/question-table/QuestionTableAnswers';\nimport { InteractionWithResultsSummary } from 'libs/shared/apps/analytics/interfaces/InteractionWithResultsSummary';\nimport { getInteractionResultsSummary } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { PercentageIndicator, PercentageIndicatorLayout } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Interactive, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { getInteractions } from 'libs/shared/utils/InteractiveHelper';\n\nconst namespace = 'shared.questionTable';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction sortScore(\n rowA: Row<InteractionWithResultsSummary>,\n rowB: Row<InteractionWithResultsSummary>,\n columnId: string\n): 1 | -1 {\n const cellA = rowA.cells.find(cell => cell.column.id === columnId).value;\n const cellB = rowB.cells.find(cell => cell.column.id === columnId).value;\n\n if (cellA.awaitingMarking)\n return -1;\n\n if (cellB.awaitingMarking)\n return 1;\n\n return cellA.percentCorrect >= cellB.percentCorrect\n ? 1\n : -1;\n}\ninterface CellWrapperProps {\n className?: string;\n}\n\nfunction CellWrapper(props: React.PropsWithChildren<CellWrapperProps>): JSX.Element {\n return (\n <div className={`d-flex ${props.className ?? ''}`}>\n {props.children}\n </div>\n );\n}\n\ninterface HeaderCellProps {\n column: ColumnInstance<InteractionWithResultsSummary>;\n phraseKey: string;\n}\n\nfunction HeaderCell(props: HeaderCellProps): JSX.Element {\n return (\n <CellWrapper className={props.column.isSorted && 'fw-bold'}>\n {getPhrase(props.phraseKey)}\n </CellWrapper>\n );\n}\n\nexport function getColumns(\n showAnswersInTable: boolean,\n editSuggestedResponse?: () => void\n): Column<InteractionWithResultsSummary>[] {\n return [\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='#' />,\n accessor: 'data', // This isn't used but it's needed for the typings on row\n id: 'index',\n Cell: ({ row: { index } }) => <CellWrapper>{index + 1}.</CellWrapper>,\n width: 15,\n disableSortBy: true\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='question' />,\n accessor: 'data', // This isn't used but it's needed for the typings on row,\n Cell: ({ row: { original: interaction }, initialState: { selectedRowIds } }) => {\n const selectedRow = selectedRowIds?.[interaction?.id];\n\n return (\n <CellWrapper className='flex-column'>\n <div className={`${!selectedRow ? 'clamp-1' : ''} pe-2`}>\n <InteractionLabel interaction={interaction} containerClassName={selectedRow ? 'd-flex' : ''} />\n </div>\n\n {showAnswersInTable && selectedRow && (\n <div className='mt-3 w-100'>\n <QuestionTableAnswers interaction={interaction} editSuggestedResponse={editSuggestedResponse} />\n </div>\n )}\n </CellWrapper>\n );\n },\n disableSortBy: true\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='score' />,\n accessor: 'resultsSummary',\n id: 'correctlyAnswered',\n Cell: ({ value: { percentCorrect, awaitingMarking } }) => {\n if (awaitingMarking) {\n return (\n <PendingIndicator\n title={getPhrase('markingRequired')}\n className='flex-grow-1'\n tooltipClassName='d-block'\n showLabel\n />\n );\n }\n\n return (\n <PercentageIndicator\n percentage={percentCorrect}\n layout={PercentageIndicatorLayout.LabelBefore}\n />\n );\n },\n width: 60,\n sortDescFirst: true,\n sortType: sortScore\n }\n ];\n}\n\n/**\n * Returns memoized table data. To trigger a recalculation, toggle the value of `refreshData`.\n */\nexport function useGetTableData(\n interactive: Interactive,\n results: InteractiveResultSet,\n refreshData: boolean,\n sortBy?: SortingRule<InteractionWithResultsSummary>\n): InteractionWithResultsSummary[] {\n return React.useMemo(() => {\n const interactions = getInteractions(interactive).map(i => ({\n ...i,\n resultsSummary: getInteractionResultsSummary(i, results)\n }));\n\n if (sortBy?.id === 'correctlyAnswered') {\n const sorted = ArrayHelper.sortBy(interactions, interaction => {\n if (interaction.resultsSummary.awaitingMarking)\n return -1;\n\n return interaction.resultsSummary.percentCorrect;\n });\n\n return sortBy.desc ? sorted.reverse() : sorted;\n }\n\n return interactions;\n }, [ refreshData, sortBy ]);\n}","import React from 'react';\nimport { Row, SortingRule } from 'react-table';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { InteractionResponseList } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-list/InteractionResponseList';\nimport { SelectedInteractionEmptyState } from 'libs/shared/apps/analytics/components/questions-list/selected-interaction-empty-state/SelectedInteractionEmptyState';\nimport { InteractionWithResultsSummary } from 'libs/shared/apps/analytics/interfaces/InteractionWithResultsSummary';\nimport { getInteractionById } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { getSortStudents, SortStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableSortUtils';\nimport { Table, TableTheme } from 'libs/shared/components/table/Table';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interactive, InteractiveResultSet, StudentAnswer } from 'libs/shared/interfaces';\nimport { AppRouteHelper } from 'libs/shared/utils/AppRouteHelper';\n\nimport { getColumns, useGetTableData } from './QuestionTableUtils';\n\ninterface QuestionTableProps {\n interactive: Interactive;\n results: InteractiveResultSet;\n markedAnswers: { [id: string]: StudentAnswer };\n addMarkedAnswers: (answer: StudentAnswer[], status: InteractiveAnswerStatus) => void;\n submitMarkedAnswers: () => void;\n editSuggestedResponse?: () => void;\n imageCdnUrl: string;\n emptyStateImageUrl: string;\n selectQuestionImageUrl: string;\n anonymiseUsers: boolean;\n sortBy?: SortStudentsBy;\n\n /**\n * As the table data is memoized, it must be prompted to recalculate.\n * Toggle `refreshTable` to do so.\n */\n refreshTable: boolean;\n selectedInteractionId?: string;\n showAnswersInTable?: boolean;\n theme: TableTheme;\n reportsStyling?: boolean;\n}\n\nexport function QuestionTable(props: QuestionTableProps): JSX.Element {\n const [ sortBy, setSortBy ] = React.useState<SortingRule<InteractionWithResultsSummary>[]>(\n getSortStudents(props.sortBy, 'correctlyAnswered')\n );\n const data = useGetTableData(props.interactive, props.results, props.refreshTable, ArrayHelper.first(sortBy));\n\n const selectedInteraction = props.selectedInteractionId &&\n getInteractionById(props.interactive, props.selectedInteractionId);\n\n function onSelectRow({ original: interaction }: Row<InteractionWithResultsSummary>): void {\n AppRouteHelper.updateParams(\n { interactionId: interaction.id },\n { merge: true }\n );\n }\n\n return (\n <div className='row'>\n <div className='col-6'>\n <Table\n key={props.selectedInteractionId}\n columns={getColumns(props.showAnswersInTable, props.editSuggestedResponse)}\n data={data}\n theme={props.theme}\n onSelectRow={onSelectRow}\n initialSelectedRowIds={selectedInteraction ? [selectedInteraction.id] : null}\n getRowId={(row: InteractionWithResultsSummary) => row.id}\n enableSort\n manualSort\n onSort={setSortBy}\n initialSortBy={sortBy}\n />\n </div>\n <div className='col-6'>\n <div className='border border-light rounded h-100'>\n {!!selectedInteraction &&\n <InteractionResponseList\n interaction={selectedInteraction}\n results={props.results}\n markedAnswers={props.markedAnswers}\n addMarkedAnswers={props.addMarkedAnswers}\n submitMarkedAnswers={props.submitMarkedAnswers}\n imageCdnUrl={props.imageCdnUrl}\n anonymiseUsers={props.anonymiseUsers}\n emptyStateImageUrl={props.emptyStateImageUrl}\n reportsStyling={props.reportsStyling}\n />\n }\n {!selectedInteraction && <SelectedInteractionEmptyState emptyStateUrl={props.selectQuestionImageUrl} />}\n </div>\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { QuestionTable } from 'libs/shared/apps/analytics/components/questions-list/question-table/QuestionTable';\nimport { useFetchInteractiveResults } from 'libs/shared/apps/analytics/hooks/UseFetchInteractiveResults';\nimport { useMarkAnswers } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { AnalyticsFilterHelper } from 'libs/shared/apps/analytics/utils/AnalyticsFilterUtils';\nimport { getAudienceParams } from 'libs/shared/apps/analytics/utils/AudienceUtils';\nimport { getInsightsDateRangePresets, getStartEndParams } from 'libs/shared/apps/analytics/utils/DateRangeUtils';\nimport { SortStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableSortUtils';\nimport { ConfirmationPopup } from 'libs/shared/components/confirmation-popup/ConfirmationPopup';\nimport { TableTheme } from 'libs/shared/components/table/Table';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { Config, Interactive, InteractiveMetadata } from 'libs/shared/interfaces';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { getInsightsInteractiveTabs } from 'apps/insights/utils/InsightsAppLinkUtils';\nimport { InsightsHeaderView } from 'apps/insights/views/header/InsightsHeaderView';\n\nconst namespace = 'shared.interactiveInsightsQuestions';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\n\nconst theme: TableTheme = {\n table: 'bg-white rounded border border-light pb-2',\n header: 'border-bottom px-3 py-2 mb-2',\n headerCell: 'd-flex align-items-center',\n cell: '',\n row: `px-3 py-2 bg-light-blue-hover`,\n selectedRow: 'bg-gray-100',\n sortIndicator: 'ms-2'\n};\n\ninterface InteractiveInsightsQuestionsViewProps {\n interactiveId: string;\n interactionId: string;\n sortBy: SortStudentsBy;\n}\n\nexport function InteractiveInsightsQuestionsView(props: InteractiveInsightsQuestionsViewProps) {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n const [ showMarkConfirmationPopup, setShowMarkConfirmationPopup ] = React.useState(false);\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n InteractiveRequests.interactiveMetadata(props.interactiveId)\n );\n\n const interactive = Flight.useBasicFetch<Interactive>(interactiveMetadata.data?.interactiveId &&\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId));\n\n const audienceAppLinkParams = AnalyticsFilterHelper.getAudienceAppLinkParams();\n const dateRangeAppLinkParams = AnalyticsFilterHelper.getDateRangeAppLinkParams();\n\n const results = useFetchInteractiveResults(props.interactiveId, {\n ...getStartEndParams(getInsightsDateRangePresets(), dateRangeAppLinkParams),\n ...getAudienceParams(audienceAppLinkParams)\n });\n\n const { markedAnswers, addMarkedAnswers, submitMarkedAnswers } = useMarkAnswers(\n interactive.data?.id,\n interactiveMetadata.data?.id,\n () => setShowMarkConfirmationPopup(false)\n );\n\n const dataLoaded = interactive.data && interactiveMetadata.data && results.data;\n\n if (!dataLoaded) return <></>;\n\n async function editSuggestedResponse() {\n Core.AppLinkHelper.trigger({\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_SUGGESTED_RESPONSE,\n args: [props.interactiveId],\n params: { interactionId: props.interactionId }\n });\n }\n\n const params = {\n ...audienceAppLinkParams,\n ...dateRangeAppLinkParams\n };\n\n return (\n <div className='px-3'>\n <InsightsHeaderView\n audienceAppLinkParams={audienceAppLinkParams}\n dateRangeAppLinkParams={dateRangeAppLinkParams}\n tabs={getInsightsInteractiveTabs(props.interactiveId, 'questions', params)}\n video={interactiveMetadata.data}\n />\n\n <QuestionTable\n interactive={interactive.data}\n results={results.data}\n markedAnswers={markedAnswers}\n addMarkedAnswers={addMarkedAnswers}\n submitMarkedAnswers={() => setShowMarkConfirmationPopup(true)}\n imageCdnUrl={config.data.imageCdnUrl}\n selectedInteractionId={props.interactionId}\n refreshTable={results.isFetching || interactive.isFetching}\n emptyStateImageUrl={ImageUrls.Insights.NO_RESPONSES}\n selectQuestionImageUrl={ImageUrls.Insights.NO_DATA}\n anonymiseUsers={anonymiseUsers}\n editSuggestedResponse={editSuggestedResponse}\n sortBy={props.sortBy}\n showAnswersInTable\n theme={theme}\n />\n\n {showMarkConfirmationPopup &&\n <ConfirmationPopup\n title={getPhrase('markPopupTitle', { smartCount: Object.keys(markedAnswers).length ?? 0 })}\n closePopup={() => setShowMarkConfirmationPopup(false)}\n confirmButtonText={getPhrase('submit')}\n confirmButtonVariant='dark'\n onClickConfirm={submitMarkedAnswers}\n >\n <p>{getPhrase('markPopupBody')}</p>\n </ConfirmationPopup>\n }\n </div>\n );\n}"],"names":["getPhrase","getClassName","props","className","showLabel","PendingIndicator","Indicator","title","spanHack","spanHackClassName","tooltipClassName","getSortStudents","sortBy","id","desc","ConfirmationPopup","showButtonSpinner","setShowButtonSpinner","closePopup","children","onClick","variant","cancelButtonVariant","text","cancelButtonText","onClickConfirm","confirmButtonText","confirmButtonVariant","showSpinner","disabled","disabledConfirmButton","defaultProps","LanguageService","InteractionResponseListHeader","suggestedResponse","interaction","data","InteractionLabel","iconClassName","SubmitMarkedAnswers","submit","InteractionResponseList","responsesToMark","results","students","filter","s","InteractiveCorrectnessHelper","InteractionCorrectness","numMarkedAnswers","Object","keys","markedAnswers","length","reportsStyling","Text","namespace","phrase","submitMarkedAnswers","map","idx","markingRequired","some","r","user","key","InteractionResponse","studentResults","markedStatus","markInteraction","addMarkedAnswers","imageCdnUrl","showStudentDetails","anonymisedUserName","anonymiseUsers","showFeedback","responseComponentClass","InteractionResponseItem","EmptyState","src","emptyStateImageUrl","SelectedInteractionEmptyState","emptyStateUrl","QuestionTableAnswers","str","indexToLetter","index","String","fromCharCode","charCodeAt","typeId","actionableItems","option","imageUrl","isCorrect","SvgContainer","svgName","size","S","name","order","IconButton","editSuggestedResponse","sentence","split","part","match","replacement","find","answer","sortScore","rowA","rowB","columnId","cellA","cells","cell","column","value","cellB","awaitingMarking","percentCorrect","CellWrapper","HeaderCell","isSorted","phraseKey","QuestionTable","showAnswersInTable","setSortBy","interactive","refreshData","interactions","i","resultsSummary","sorted","ArrayHelper","reverse","useGetTableData","refreshTable","selectedInteraction","selectedInteractionId","Table","columns","Header","accessor","Cell","row","width","disableSortBy","original","selectedRowIds","initialState","selectedRow","containerClassName","PercentageIndicator","percentage","layout","sortDescFirst","sortType","theme","onSelectRow","AppRouteHelper","interactionId","merge","initialSelectedRowIds","getRowId","enableSort","manualSort","onSort","initialSortBy","selectQuestionImageUrl","table","header","headerCell","sortIndicator","InteractiveInsightsQuestionsView","SharedViewModelKeys","showMarkConfirmationPopup","setShowMarkConfirmationPopup","config","ConfigRequests","interactiveMetadata","InteractiveRequests","interactiveId","audienceAppLinkParams","dateRangeAppLinkParams","params","InsightsHeaderView","tabs","video","isFetching","ImageUrls","application","action","args","smartCount"],"sourceRoot":""}