@clickview/lite 0.73.1 → 0.74.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundles.json +2 -2
- package/dist/css/{7122-lite-a094f8fe17.chunk.css → 7122-lite-e0652641e4.chunk.css} +1 -1
- package/dist/css/{4499-lite-c43d17524f.chunk.css → 7150-lite-60d455ba66.chunk.css} +1 -1
- package/dist/css/{lite-app-10d57977f3.css → lite-app-98b3200025.css} +1 -1
- package/dist/languages/en.json +1 -1
- package/dist/scripts/{1362-061cd588c0-lite.chunk.js → 1362-56810ef4c8-lite.chunk.js} +3 -3
- package/dist/scripts/1362-56810ef4c8-lite.chunk.js.map +1 -0
- package/dist/scripts/{1367-12750422b0-lite.chunk.js → 1367-e0481edee3-lite.chunk.js} +2 -2
- package/dist/scripts/1367-e0481edee3-lite.chunk.js.map +1 -0
- package/dist/scripts/{1735-c0f3f1238a-lite.chunk.js → 1735-e4cdbc46ed-lite.chunk.js} +3 -3
- package/dist/scripts/1735-e4cdbc46ed-lite.chunk.js.map +1 -0
- package/dist/scripts/{324-6d6ee95d5d-lite.chunk.js → 324-e7a99b7d52-lite.chunk.js} +2 -2
- package/dist/scripts/{324-6d6ee95d5d-lite.chunk.js.map → 324-e7a99b7d52-lite.chunk.js.map} +1 -1
- package/dist/scripts/{3252-22fac3da15-lite.chunk.js → 3252-50b5c19f19-lite.chunk.js} +1 -1
- package/dist/scripts/{3252-22fac3da15-lite.chunk.js.map → 3252-50b5c19f19-lite.chunk.js.map} +1 -1
- package/dist/scripts/3677-4904f30c6a-lite.chunk.js +2 -0
- package/dist/scripts/3677-4904f30c6a-lite.chunk.js.map +1 -0
- package/dist/scripts/{3781-7a9ddc7736-lite.chunk.js → 3781-e092f92668-lite.chunk.js} +2 -2
- package/dist/scripts/{3781-7a9ddc7736-lite.chunk.js.map → 3781-e092f92668-lite.chunk.js.map} +1 -1
- package/dist/scripts/{3823-e38a508a3c-lite.chunk.js → 3823-0dc1972eb2-lite.chunk.js} +2 -2
- package/dist/scripts/3823-0dc1972eb2-lite.chunk.js.map +1 -0
- package/dist/scripts/3915-abd9a65a08-lite.chunk.js +2 -0
- package/dist/scripts/3915-abd9a65a08-lite.chunk.js.map +1 -0
- package/dist/scripts/{3978-09fb1f250e-lite.chunk.js → 3978-a551dd2648-lite.chunk.js} +2 -2
- package/dist/scripts/3978-a551dd2648-lite.chunk.js.map +1 -0
- package/dist/scripts/{4013-d31272b42a-lite.chunk.js → 4013-6f68d7031e-lite.chunk.js} +1 -1
- package/dist/scripts/{4013-d31272b42a-lite.chunk.js.map → 4013-6f68d7031e-lite.chunk.js.map} +1 -1
- package/dist/scripts/{4014-4225ce1eb6-lite.chunk.js → 4014-3eccce2f89-lite.chunk.js} +3 -3
- package/dist/scripts/4014-3eccce2f89-lite.chunk.js.map +1 -0
- package/dist/scripts/{4050-cf35c4ec45-lite.chunk.js → 4050-ffe5b6ae6d-lite.chunk.js} +2 -2
- package/dist/scripts/{4050-cf35c4ec45-lite.chunk.js.map → 4050-ffe5b6ae6d-lite.chunk.js.map} +1 -1
- package/dist/scripts/{4061-525ef00f69-lite.chunk.js → 4061-100002abf6-lite.chunk.js} +2 -2
- package/dist/scripts/4061-100002abf6-lite.chunk.js.map +1 -0
- package/dist/scripts/4191-9a08c4b205-lite.chunk.js +2 -0
- package/dist/scripts/4191-9a08c4b205-lite.chunk.js.map +1 -0
- package/dist/scripts/{4358-b21c24f96a-lite.chunk.js → 4358-a1bbca8249-lite.chunk.js} +1 -1
- package/dist/scripts/{4358-b21c24f96a-lite.chunk.js.map → 4358-a1bbca8249-lite.chunk.js.map} +1 -1
- package/dist/scripts/{4400-8c36fb4ab5-lite.chunk.js → 4400-755a158a52-lite.chunk.js} +2 -2
- package/dist/scripts/4400-755a158a52-lite.chunk.js.map +1 -0
- package/dist/scripts/4806-13c9302b2c-lite.chunk.js +2 -0
- package/dist/scripts/4806-13c9302b2c-lite.chunk.js.map +1 -0
- package/dist/scripts/{5135-864055ab0b-lite.chunk.js → 5135-166ec46620-lite.chunk.js} +2 -2
- package/dist/scripts/5135-166ec46620-lite.chunk.js.map +1 -0
- package/dist/scripts/{5143-286c66de2b-lite.chunk.js → 5143-d6c4a357ea-lite.chunk.js} +2 -2
- package/dist/scripts/5143-d6c4a357ea-lite.chunk.js.map +1 -0
- package/dist/scripts/{5743-a764171a6d-lite.chunk.js → 5743-14700e4f76-lite.chunk.js} +2 -2
- package/dist/scripts/5743-14700e4f76-lite.chunk.js.map +1 -0
- package/dist/scripts/{6030-5db8cc1bc4-lite.chunk.js → 6030-c2e07df714-lite.chunk.js} +2 -2
- package/dist/scripts/6030-c2e07df714-lite.chunk.js.map +1 -0
- package/dist/scripts/{618-4334f9451b-lite.chunk.js → 618-996d8b560b-lite.chunk.js} +2 -2
- package/dist/scripts/618-996d8b560b-lite.chunk.js.map +1 -0
- package/dist/scripts/{6207-f444184025-lite.chunk.js → 6207-be843186e0-lite.chunk.js} +1 -1
- package/dist/scripts/{6207-f444184025-lite.chunk.js.map → 6207-be843186e0-lite.chunk.js.map} +1 -1
- package/dist/scripts/{6413-c4333e80d4-lite.chunk.js → 6413-caaae6a383-lite.chunk.js} +3 -3
- package/dist/scripts/{6413-c4333e80d4-lite.chunk.js.map → 6413-caaae6a383-lite.chunk.js.map} +1 -1
- package/dist/scripts/{6646-24a34f7d99-lite.chunk.js → 6646-c5775f6553-lite.chunk.js} +3 -3
- package/dist/scripts/6646-c5775f6553-lite.chunk.js.map +1 -0
- package/dist/scripts/{6909-8a45942b63-lite.chunk.js → 6909-6805b6a0d9-lite.chunk.js} +2 -2
- package/dist/scripts/6909-6805b6a0d9-lite.chunk.js.map +1 -0
- package/dist/scripts/7064-b3bafc599f-lite.chunk.js +2 -0
- package/dist/scripts/7064-b3bafc599f-lite.chunk.js.map +1 -0
- package/dist/scripts/7122-dbf374af58-lite.chunk.js +2 -0
- package/dist/scripts/7122-dbf374af58-lite.chunk.js.map +1 -0
- package/dist/scripts/7150-93a205975c-lite.chunk.js +2 -0
- package/dist/scripts/7150-93a205975c-lite.chunk.js.map +1 -0
- package/dist/scripts/{7234-85d4acaa33-lite.chunk.js → 7234-bcddfe2112-lite.chunk.js} +2 -2
- package/dist/scripts/7234-bcddfe2112-lite.chunk.js.map +1 -0
- package/dist/scripts/{7383-690bc234f1-lite.chunk.js → 7383-02d4956304-lite.chunk.js} +2 -2
- package/dist/scripts/7383-02d4956304-lite.chunk.js.map +1 -0
- package/dist/scripts/{7873-2e64f4eb37-lite.chunk.js → 7873-0ce0523a28-lite.chunk.js} +2 -2
- package/dist/scripts/{7873-2e64f4eb37-lite.chunk.js.map → 7873-0ce0523a28-lite.chunk.js.map} +1 -1
- package/dist/scripts/{8248-050265ed2d-lite.chunk.js → 8248-41dad9bf71-lite.chunk.js} +3 -3
- package/dist/scripts/8248-41dad9bf71-lite.chunk.js.map +1 -0
- package/dist/scripts/8385-6ef08fa319-lite.chunk.js +2 -0
- package/dist/scripts/8385-6ef08fa319-lite.chunk.js.map +1 -0
- package/dist/scripts/{8451-1cb649a3f3-lite.chunk.js → 8451-0103210a8f-lite.chunk.js} +2 -2
- package/dist/scripts/8451-0103210a8f-lite.chunk.js.map +1 -0
- package/dist/scripts/8630-80f676dcda-lite.chunk.js +2 -0
- package/dist/scripts/8630-80f676dcda-lite.chunk.js.map +1 -0
- package/dist/scripts/8891-5118c47b59-lite.chunk.js +2 -0
- package/dist/scripts/8891-5118c47b59-lite.chunk.js.map +1 -0
- package/dist/scripts/8982-b9e53e43ec-lite.chunk.js +2 -0
- package/dist/scripts/8982-b9e53e43ec-lite.chunk.js.map +1 -0
- package/dist/scripts/{9186-daf77d7174-lite.chunk.js → 9186-c1d2615458-lite.chunk.js} +2 -2
- package/dist/scripts/9186-c1d2615458-lite.chunk.js.map +1 -0
- package/dist/scripts/{9241-dbac9cb9f9-lite.chunk.js → 9241-2386134dd3-lite.chunk.js} +2 -2
- package/dist/scripts/9241-2386134dd3-lite.chunk.js.map +1 -0
- package/dist/scripts/{9345-30ccf524c5-lite.chunk.js → 9345-0a7f58bb53-lite.chunk.js} +3 -3
- package/dist/scripts/9345-0a7f58bb53-lite.chunk.js.map +1 -0
- package/dist/scripts/9352-d4b2dc16a8-lite.chunk.js +2 -0
- package/dist/scripts/9352-d4b2dc16a8-lite.chunk.js.map +1 -0
- package/dist/scripts/{9503-275c13891d-lite.chunk.js → 9503-715c46ecc1-lite.chunk.js} +2 -2
- package/dist/scripts/9503-715c46ecc1-lite.chunk.js.map +1 -0
- package/dist/scripts/9630-ca2a850260-lite.chunk.js +2 -0
- package/dist/scripts/9630-ca2a850260-lite.chunk.js.map +1 -0
- package/dist/scripts/{9767-d69fdc31b0-lite.chunk.js → 9767-1b583ceb6c-lite.chunk.js} +2 -2
- package/dist/scripts/9767-1b583ceb6c-lite.chunk.js.map +1 -0
- package/dist/scripts/9894-7c119a8fe3-lite.chunk.js +2 -0
- package/dist/scripts/9894-7c119a8fe3-lite.chunk.js.map +1 -0
- package/dist/scripts/bundle-5b65703152.min.js +3 -0
- package/dist/scripts/{bundle-0075afb6af.min.js.map → bundle-5b65703152.min.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/1362-061cd588c0-lite.chunk.js.map +0 -1
- package/dist/scripts/1367-12750422b0-lite.chunk.js.map +0 -1
- package/dist/scripts/1735-c0f3f1238a-lite.chunk.js.map +0 -1
- package/dist/scripts/3677-20958f59d3-lite.chunk.js +0 -2
- package/dist/scripts/3677-20958f59d3-lite.chunk.js.map +0 -1
- package/dist/scripts/3823-e38a508a3c-lite.chunk.js.map +0 -1
- package/dist/scripts/3915-a1f15d687a-lite.chunk.js +0 -2
- package/dist/scripts/3915-a1f15d687a-lite.chunk.js.map +0 -1
- package/dist/scripts/3978-09fb1f250e-lite.chunk.js.map +0 -1
- package/dist/scripts/4014-4225ce1eb6-lite.chunk.js.map +0 -1
- package/dist/scripts/4061-525ef00f69-lite.chunk.js.map +0 -1
- package/dist/scripts/4191-7612e1713c-lite.chunk.js +0 -2
- package/dist/scripts/4191-7612e1713c-lite.chunk.js.map +0 -1
- package/dist/scripts/4400-8c36fb4ab5-lite.chunk.js.map +0 -1
- package/dist/scripts/4499-1365934bf2-lite.chunk.js +0 -2
- package/dist/scripts/4499-1365934bf2-lite.chunk.js.map +0 -1
- package/dist/scripts/4806-384760d9c9-lite.chunk.js +0 -2
- package/dist/scripts/4806-384760d9c9-lite.chunk.js.map +0 -1
- package/dist/scripts/5135-864055ab0b-lite.chunk.js.map +0 -1
- package/dist/scripts/5143-286c66de2b-lite.chunk.js.map +0 -1
- package/dist/scripts/5743-a764171a6d-lite.chunk.js.map +0 -1
- package/dist/scripts/6030-5db8cc1bc4-lite.chunk.js.map +0 -1
- package/dist/scripts/618-4334f9451b-lite.chunk.js.map +0 -1
- package/dist/scripts/6646-24a34f7d99-lite.chunk.js.map +0 -1
- package/dist/scripts/6909-8a45942b63-lite.chunk.js.map +0 -1
- package/dist/scripts/7064-3ccf1b82d1-lite.chunk.js +0 -2
- package/dist/scripts/7064-3ccf1b82d1-lite.chunk.js.map +0 -1
- package/dist/scripts/7122-352fdd3516-lite.chunk.js +0 -2
- package/dist/scripts/7122-352fdd3516-lite.chunk.js.map +0 -1
- package/dist/scripts/7234-85d4acaa33-lite.chunk.js.map +0 -1
- package/dist/scripts/7383-690bc234f1-lite.chunk.js.map +0 -1
- package/dist/scripts/8248-050265ed2d-lite.chunk.js.map +0 -1
- package/dist/scripts/8385-083e882d77-lite.chunk.js +0 -2
- package/dist/scripts/8385-083e882d77-lite.chunk.js.map +0 -1
- package/dist/scripts/8451-1cb649a3f3-lite.chunk.js.map +0 -1
- package/dist/scripts/8630-0945271ea2-lite.chunk.js +0 -2
- package/dist/scripts/8630-0945271ea2-lite.chunk.js.map +0 -1
- package/dist/scripts/8891-393bb5bdaf-lite.chunk.js +0 -2
- package/dist/scripts/8891-393bb5bdaf-lite.chunk.js.map +0 -1
- package/dist/scripts/8982-8c21fab48a-lite.chunk.js +0 -2
- package/dist/scripts/8982-8c21fab48a-lite.chunk.js.map +0 -1
- package/dist/scripts/9186-daf77d7174-lite.chunk.js.map +0 -1
- package/dist/scripts/9241-dbac9cb9f9-lite.chunk.js.map +0 -1
- package/dist/scripts/9345-30ccf524c5-lite.chunk.js.map +0 -1
- package/dist/scripts/9352-04db4c533d-lite.chunk.js +0 -2
- package/dist/scripts/9352-04db4c533d-lite.chunk.js.map +0 -1
- package/dist/scripts/9503-275c13891d-lite.chunk.js.map +0 -1
- package/dist/scripts/9630-285237c980-lite.chunk.js +0 -2
- package/dist/scripts/9630-285237c980-lite.chunk.js.map +0 -1
- package/dist/scripts/9767-d69fdc31b0-lite.chunk.js.map +0 -1
- package/dist/scripts/9894-10943e41f7-lite.chunk.js +0 -2
- package/dist/scripts/9894-10943e41f7-lite.chunk.js.map +0 -1
- package/dist/scripts/bundle-0075afb6af.min.js +0 -3
- /package/dist/scripts/{1362-061cd588c0-lite.chunk.js.LICENSE.txt → 1362-56810ef4c8-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{1735-c0f3f1238a-lite.chunk.js.LICENSE.txt → 1735-e4cdbc46ed-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{4014-4225ce1eb6-lite.chunk.js.LICENSE.txt → 4014-3eccce2f89-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{4050-cf35c4ec45-lite.chunk.js.LICENSE.txt → 4050-ffe5b6ae6d-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{6413-c4333e80d4-lite.chunk.js.LICENSE.txt → 6413-caaae6a383-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{6646-24a34f7d99-lite.chunk.js.LICENSE.txt → 6646-c5775f6553-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{8248-050265ed2d-lite.chunk.js.LICENSE.txt → 8248-41dad9bf71-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{9345-30ccf524c5-lite.chunk.js.LICENSE.txt → 9345-0a7f58bb53-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{bundle-0075afb6af.min.js.LICENSE.txt → bundle-5b65703152.min.js.LICENSE.txt} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/9186-daf77d7174-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\",\"svgFill\":\"xnG9h\"};","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 showCorrectnessIcons?: boolean;\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(null);\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 if (!props.showCorrectnessIcons) {\n className = a.isCorrect ?\n 'bg-success text-white' :\n `bg-danger text-white ${styles.incorrect}`;\n }\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 <div>\n {props.showCorrectnessIcons && (\n <div className={`${styles.svgFill} position-absolute top-0 start-0 p-2 z-1`}>\n {a.isCorrect\n ? <SvgContainer svgName={cvSvgLibrary.CheckCircle} size={SvgContainerSize.ExtraLarge} className='svg-container text-success' />\n : <SvgContainer svgName={cvSvgLibrary.CrossCircleFilled} size={SvgContainerSize.Large} className='svg-container text-red' />\n }\n </div>\n )}\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 `}\n style={{ backgroundImage: imageUrl ? `url(${imageUrl})` : undefined }}\n title={a.name || alphabet[index]}\n />\n </span>\n </div>\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.userAvatar && !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> </>}\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='position-relative mt-2'>\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 </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","showCorrectnessIcons","isCorrect","hideFeedbackIcons","SvgContainer","S","svgName","accessibility","role","tabIndex","onKeyDown","e","hasImageClass","showImagePreview","toString","leftHandSidePortalNode","node","ref","src","alt","DivButton","onClick","style","backgroundImage","undefined","title","userAvatar","Avatar","imageCdnUrl","imageApi","initials","userInitials","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":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/9241-dbac9cb9f9-lite.chunk.js","mappings":"qNACA,SAAgB,QAAU,SCa1B,IAAMA,EAAY,kBAgBZ,SAAUC,EAAeC,G,gBAC7B,IAAKA,EAAMC,KACT,OAAO,iCAET,GAAID,EAAMC,OAAS,cAA6BD,EAAME,qBACpD,OACE,uBAAKC,UAAU,QACb,sBAAIA,UAAU,WACZ,gBAACC,EAAA,EAAI,CAACN,UAAWA,EAAWO,OAAO,cAM3C,IAAMC,EAAO,CAAC,CACZC,KAAMC,EAAA,YAA0BV,EAAW,UAC3CW,QAAuB,QAAd,EAAAT,EAAMU,gBAAQ,eAAEC,OACzBC,OAAyB,WAAjBZ,EAAMY,OACdC,cAAe,CACbN,KAAMC,EAAA,YAA0BV,EAAW,UAC3CgB,IAAK,aAAoC,QAAd,EAAAd,EAAMU,gBAAQ,eAAEC,SAE7CI,iBAAkB,CAChBC,WAAY,WACZC,OAAQ,SACRC,SAAU,iBAEX,CACDX,KAAMC,EAAA,YAA0BV,EAAW,YAC3CW,QAAuB,QAAd,EAAAT,EAAMU,gBAAQ,eAAES,SACzBP,OAAyB,aAAjBZ,EAAMY,OACdC,cAAe,CACbN,KAAMC,EAAA,YAA0BV,EAAW,YAC3CgB,IAAK,aAAoC,QAAd,EAAAd,EAAMU,gBAAQ,eAAES,WAE7CJ,iBAAkB,CAChBC,WAAY,WACZC,OAAQ,SACRC,SAAU,kBAqBd,OAjBIlB,EAAMoB,cACRd,EAAKe,KAAK,CACRd,KAAMC,EAAA,YAA0BV,EAAW,YAC3CW,QAAuB,QAAd,EAAAT,EAAMU,gBAAQ,eAAEY,SACzBV,OAAyB,aAAjBZ,EAAMY,OACdC,cAAe,CACbN,KAAMC,EAAA,YAA0BV,EAAW,YAC3CgB,IAAK,aAAoC,QAAd,EAAAd,EAAMU,gBAAQ,eAAEY,WAE7CP,iBAAkB,CAChBC,WAAY,WACZC,OAAQ,SACRC,SAAU,kBAMd,uBAAKf,UAAU,0BACb,gBAACoB,EAAA,EAAe,CACdjB,KAAMA,EACNH,UAAW,YAInB,C,oHC7EA,SAASqB,EAAYxB,GACnB,OACE,kCACKA,EAAMyB,IAAIC,SACX,uBAAKvB,UAAWH,EAAMyB,IAAIlB,KAAO,OAAS,IACxC,gBAAC,IAAY,CAACmB,QAAS1B,EAAMyB,IAAIC,WAIpC1B,EAAMyB,IAAIlB,KAEmB,iBAArBP,EAAMyB,IAAIE,OACjB,uBAAKxB,UAAU,QACb,gBAAC,IAAK,CAACF,KAAM,UAAiB2B,KAAM5B,EAAMyB,IAAIE,SAKxD,CA8BM,SAAUJ,EAAgBvB,G,MAW9B,OACE,uBAAKG,UAA0B,QAAf,EAAAH,EAAMG,iBAAS,QAAI,GAAI0B,IAAK7B,EAAM8B,cAChD,sBAAI3B,UAAS,qDACwB,oBAAsB,qBACvDH,EAAM+B,aAAe,gBAAqB,GAAE,qBAC5C/B,EAAMgC,cAAa,aAEpBhC,EAAMM,KAAK2B,KAAI,SAACR,EAAKS,GACpB,OACE,sBACE/B,UAAS,gCACD,QAAU,YAAIsB,EAAIb,OAAS,eAAiB,uBAAsB,6BACtEa,EAAIlB,KAAO,aAAkB,GAAE,YAAIkB,EAAItB,UAAS,oBAEpDgC,IAAKD,GAEJT,EAAIhB,QACH,gBAAC,IAAO,CACNA,QAASgB,EAAIhB,QACbI,cAAeY,EAAIZ,cACnBE,iBAAkBU,EAAIV,iBACtBZ,UAAS,sKAE4C,YAAc,yBAGnE,gBAACqB,EAAW,CAACC,IAAKA,KAGpB,gBAAC,IAAS,CACRtB,UAAS,sKAE4C,YAAc,wBAEnEiC,QAAS,WAAF,OA5CvB,SAAqBX,IACfA,EAAIb,QAAWa,EAAIY,WAGvBZ,EAAIY,WAEAZ,EAAIZ,eAAiBY,EAAIV,kBAC3B,kBAA8BU,EAAIZ,cAAeY,EAAIV,kBACzD,CAoC+BuB,CAAYb,EAAI,GAE/B,gBAACD,EAAW,CAACC,IAAKA,KAK5B,KAIR,CA5DAF,EAAgBgB,aAAe,CAC7BR,aAAc,K,o6CC1DhB,IAAMS,EAAa,GAiBb,SAAUC,EACdC,EACAC,GAEA,IAEMC,EAFS,UAA0BF,EAASF,GAE1BP,KAAI,SAAAY,GAAK,OAAIF,EAAW,SAAiBE,GAAO,IAElEC,EAAY,qBAA6BF,GAEzCG,EAAW,YAAoBD,EAAUlB,MACzCoB,EAAQF,EAAUlB,KAAKqB,OACzBF,EAASG,QAAO,SAACC,EAAKC,GAAI,OAAK,+BAAMD,GAAG,KAAGC,EAAKC,GAAKD,GAAI,GAAK,CAAC,GAC/D,KAEJ,MAAO,CACLL,SAAAA,EACAC,MAAAA,EACAM,WAAYR,EAAUQ,WAE1B,CAQM,SAAUC,EACdC,EACAb,EACAc,G,YAEMC,EAASD,GAAY,SAACE,GAC1B,MAAmB,WAAf,EAAOA,GACFA,EAAIN,GAENM,CACT,EAEMC,EAAe,SAA0B,IAAIC,KAEmB,G,EAApC,WAAiC,I,EAAG,E,unBAA9DjB,EAAQ,KAAEkB,EAAW,KAE7B,aAAgB,WACd,GAAKN,aAAI,EAAJA,EAAMP,OAAX,CAGA,IAAMc,EAAsB,GAE5BP,EAAKQ,SAAQ,SAAAL,GACX,IAAMxB,EAAMuB,EAAOC,GAEfC,EAAaK,QAAQC,IAAI/B,KAG7B4B,EAAe1C,KAAKsC,GACpBC,EAAaK,QAAQE,IAAIhC,GAC3B,IAEK4B,EAAed,QAGpBa,GAAY,SAAAM,GAAC,kBAAUA,GAAC,EAAK,UAAqBL,EAAgBvB,GAAYP,IAAIU,IAAW,GAjBrF,CAkBV,GAAG,CAACa,aAAI,EAAJA,EAAMP,SAEV,IAAMH,EAAY,qBAA6BF,GAEzCG,EAAW,YAAoBD,EAAUlB,MACzCoB,EAAQF,EAAUlB,KAAKqB,OACzBF,EAASG,QAAO,SAACC,EAAKC,GAAI,OAAK,+BAAMD,GAAG,KAAGO,EAAON,GAAQA,GAAI,GAAK,CAAC,GACpE,KAEJ,MAAO,CACLiB,4BAAoD,QAAxB,EAAmB,QAAnB,EAAAvB,EAAUA,iBAAS,eAAG,UAAE,eAAEwB,cACtDvB,SAAAA,EACAC,MAAAA,EACAM,WAAYR,EAAUQ,WAE1B,C,yICtGA,SAAgB,OAAS,S,sGCezB,IAAM,EAAY,sCAYZ,SAAUiB,EAAqBvE,GACnC,I,IAAQwE,EAAuExE,EAAvEwE,eAAgBC,EAAuDzE,EAAvDyE,cAAeC,EAAwC1E,EAAxC0E,SAAUC,EAA8B3E,EAA9B2E,OAAQC,EAAsB5E,EAAtB4E,kBAElDC,G,GAAmB,OACxBC,EAAA,uBACAC,EACA,CAAEC,QAAS,sB,EACZ,E,o4BAJqB,GAMtB,OACE,uBACE7E,UAAS,gFAA2E,UACpF8E,MAAO,CAAEC,gBAAiB,QAAF,OAAUT,EAAa,QAE/C,gBAAC,IAAO,CAACtE,UAAU,yBAAyBM,QAAST,EAAMmF,yBAAyBX,EAAgBK,IAClG,sBAAI1E,UAAU,WAAWqE,EAAejE,OAGzCP,EAAMoF,WACL,gBAACC,EAAA,EAAU,CACTlF,UAAS,yBAAoBuE,EAAW,mBAAqB,YAC7DhD,QAASgD,EAAW,gBAA0B,UAC9CtC,QAAS,WAAF,OAAQuC,EAAOH,EAAenB,GAAImB,EAAejE,MAAOmE,EAAS,GAEvEE,EACG,gBAACU,EAAA,EAAO,CAACC,GAAG,OAAOC,UAAU,SAASC,KAAK,SAASC,KAAK,OACzD,gBAAC,IAAI,CAAC5F,UAAW,EAAWO,OAAQqE,EAAW,YAAc,YAM3E,C,mbC5CM5E,EAAY,oCAeZ,SAAU6F,EAA4B3F,GAC1C,IAAQwE,EAA+CxE,EAA/CwE,eAAgBoB,EAA+B5F,EAA/B4F,OAAQC,EAAuB7F,EAAvB6F,SAAUnB,EAAa1E,EAAb0E,SAElCoB,GAAmB,EAAAC,EAAA,KAAnBD,eAER,IAAKtB,EACH,OAAO,iCAET,IAAM1D,EAAMkF,EAAA,kBAA4BxB,EAAeyB,OAAQ,CAC7DC,gBAAiBlG,EAAMmG,iBAAiBC,YACxCC,qBAAsB7B,EAAejE,KACrCN,KAAM,cACL,CAAEyF,KAAM,YAAkBY,WAAY,aAEzC,OACE,uBAAKnG,UAAU,QACb,gBAAC,IAAoB,CACnBqE,eAAgBA,EAChBC,cAAe3D,EACfqE,yBAA0BnF,EAAMU,SAASyE,yBACzCT,SAAUA,EACVC,OAAQ3E,EAAM2E,OACdS,UAAWpF,EAAMoF,UACjBR,kBAAmB5E,EAAM4E,oBAE3B,gBAAC2B,EAAA,GAAS,CACRX,OAAQA,EACRY,gBAAiBxG,EAAMU,SAAS8F,gBAChCC,sBAAuBzG,EAAM0G,UAC7BZ,eAAgBA,EAChBa,2BAA4B,SAAAC,GAAW,OAAIC,EAAA,6BAA8CD,EAAY,EACrGT,iBAAkBnG,EAAMmG,mBAEzBN,GACC,uBAAK1F,UAAW,aACd,gBAAC2G,EAAA,EAAO,CAAC3G,UAAU,YAAYM,QAAST,EAAMU,SAASqG,+BAA+BvC,IACpF,gBAACpE,EAAA,EAAI,CAACN,UAAWA,EAAWO,OAAO,WAAW2G,QAAS,CACrDC,mBAAoBzC,EAAejE,UAOjD,C,cC1EA,SAAgB,cAAgB,SCK1B,SAAU2G,IACd,OACE,gCACGC,MAAM,GAAGC,KAAK,MAAMnF,KAAI,SAACoF,EAAGC,GAAC,OAC5B,uBAAKnF,IAAKmF,EAAGnH,UAAU,QACrB,uBAAKA,UAAS,0CAAqC,mBACnD,gBAACoH,EAAA,EAAgB,MACb,IAId,C,ytBCqBA,IAAMC,EAAsB,EACtB,EAAY,oCACZC,EAAYjH,EAAA,mBAAiC,GA8B7C,SAAUkH,EAAmB1H,G,gBACkD,G,EAArC,WAAkC,CAAC,G,EAAE,E,o4BAA3E2H,EAAc,KAAEC,EAAiB,KAEnCC,GAAW,UACXC,GAAS,SAEPhC,GAAmB,EAAAC,EAAA,KAAnBD,eACFiC,EAAoBjC,EAAekC,EAAA,kBAEnCC,EAAO,IAAIC,KACXC,EAAOC,EAAA,SAAkBA,EAAA,QAAiBA,EAAA,WAAoBH,EAAM,EAAG,QAAS,OAAQ,cACxFI,EAAKD,EAAA,SAAkBA,EAAA,QAAiBH,EAAM,OAAQ,cAEpDK,GAAuB,EAAAC,EAAA,GAAgB,CAAEC,iBAAiB,IAA1DF,oBAER,EAAAG,EAAA,GAAmBC,EAAA,sBAAsC,CACvDC,MAAOL,aAAkB,EAAlBA,EAAoB/H,KAC3BqI,cAAe,CACbC,cAAepB,EACfqB,YAAa,YACbC,kBAAmB,mBAErBC,cAAeC,EAAA,qBACfC,cAAeD,EAAA,kBACfE,SAAUF,EAAA,yBACRX,aAAkB,EAAlBA,EAAoBc,eACpB,iBAAO,CAAEC,YAAa,oBAA6BC,OAAQ,mCAAwC,OAIvG,IAAMC,EAAwBC,EAAA,oBAAwClB,aAAkB,EAAlBA,EAAoBjF,GAAI8E,EAAME,GAC9FoB,GAAiB,kBACrBnB,GAAsBiB,GAElBG,GAAqB,kBAAuC3B,GAChE4B,EAAA,0BAEIjD,IAAY,EAAAkD,EAAA,KAGZC,GAA8B,GAChCjE,GAAkB,GACtB6D,GAAe7H,MAAQ6H,GAAe7H,KAAKoC,SAAQ,SAAA8F,GACjDD,GAAkBxI,KAAKyI,EAAEzG,IACzBuC,GAASA,GAAOmE,OAAOD,EAAElE,OAC3B,IAGA,IAAeoE,IAAoB,OACjCH,IACA,SAACI,GAAa,OAAKT,EAAA,qBAAyCS,EAAI,IAF1DjH,MAKFkH,IAAe,EAAAC,EAAA,GAAgB,CAAEjJ,SAAU,iBAEjD,EAAAkJ,EAAA,GAAcxE,GAAQ,CACpByE,gBAAuD,QAAtC,EAAAd,EAAsBe,wBAAgB,eAAExK,YAG3D,QAA2D,EAAAyK,EAAA,GAAoB,CAC7EC,gBAAiB,oBACjBH,gBAAuD,QAAtC,EAAAd,EAAsBe,wBAAgB,eAAExK,YAFnDqG,GAAgB,GAAhBA,iBAAkBsE,GAA4B,GAA5BA,6BAM1B,SAASC,GAASC,EAA0B1D,EAA4BtC,GACtEiD,GAAkB,SAAAgD,GAAY,OAAI,+BAC7BA,GAAY,KACdD,GAAmB,GAAI,IAG1B,IAAME,EAAY,W,MAChBjD,GAAkB,SAAAgD,GAAY,OAAI,+BAC7BA,GAAY,KACdD,GAAmB,GAAK,IAG3BG,EAAA,gBAA8B,CAC5BzH,GAAIsH,EACJpK,KAAM0G,GACL,CACD/F,SAAU,wCACV6J,cAAe,cACfC,WAAYrG,EAAS,QAAsB,SAC3C3D,WAAY,YACZC,OAAQ,sBAGV6G,EAAOmD,QAAQxD,EACb9C,EAAS,WAAa,aACtB,CAAEH,eAAiD,QAAjC,EAAAwF,GAAgBW,UAAiB,eAAEpK,KAAM2K,YAAY,IAE3E,EAEMC,EAAU,WACdvD,GAAkB,SAAAgD,GAAY,OAAI,+BAC7BA,GAAY,KACdD,GAAmB,GAAK,IAG3B7C,EAAOsD,MAAM3D,EAAU,SACzB,EAEM4D,EAAU1G,EACdgF,EAAA,iBAAkC,CAACgB,GAAmBE,EAAWM,GACjExB,EAAA,mBAAoC,CAACgB,GAAmBE,EAAWM,GAErE,UAAatD,EAAUwD,EACzB,CAEA,QAAoC,EAAAC,EAAA,KAA5BlK,GAAY,GAAZA,aAAcmK,GAAS,GAATA,UAEhBC,MACJ/B,GAAenF,eACfoC,GAAUpC,cACRyD,IAAqB2B,GAAmBpF,eAC1C0F,IACCuB,KACDd,IAIIgB,GAtJR,SACEhC,EACAO,GAEA,OAAKP,GAAmBO,EAGjBP,EAAexH,KAAI,SAAC6H,GACzB,MAAO,CACLjE,SAAUiE,EAAElE,OAAO3C,OAASuE,EAC5BhD,eAAgBwF,EAAgBF,EAAEzG,IAClCuC,OAAQkE,EAAElE,OAAO8F,MAAM,EAAGlE,GAAqBvF,KAAI,SAAC0J,GAElD,OADAA,EAAEnH,eAAiBwF,EAAgB2B,EAAEtI,IAC9BsI,CACT,IAAGC,QAAO,SAAAC,GAAC,OAAIA,CAAC,IAEpB,IAAGD,QAAO,SAAAC,GAAC,OAAIA,EAAErH,cAAc,IAXtB,IAYX,CAqIwBvC,CAAIwH,GAAe7H,KAAMoI,IACzC8B,GAAyE,QAAnD,EAAuB,QAAvB,EAAApC,GAAmB9H,YAAI,eAAEK,KAAI,SAAA8J,GAAO,OAAIA,EAAQ1I,EAAE,WAAC,QAAI,GAE7E2I,GAAoBlG,EAAekC,EAAA,4BACnCiE,GAAoBnG,EAAekC,EAAA,qBAEzC,OACE,gBAACkE,EAAA,WAA4B,CAACC,MAAOjC,IACnC,uBAAK/J,UAAU,kBACXoL,IAAa,gBAACxL,EAAA,EAAc,CAC5BE,KAAM,WACNS,SAAU,CACRC,OAAQX,EAAMU,SAAS0L,iBACvBjL,SAAUnB,EAAMU,SAAS2L,gBACzB/K,SAAUtB,EAAMU,SAAS4L,iBAE3BlL,aAAcA,GACdR,OAAO,aAET,0BAAI,gBAACR,EAAA,EAAI,CAACN,UAAW,EAAWO,OAAO,cACrC2L,IAAqBC,KACrB,yBACGD,IACC,gCACE,gBAAC5L,EAAA,EAAI,CAACN,UAAW,EAAWO,OAAO,iBAAiB,IACpD,gBAACyG,EAAA,EAAO,CACN3G,UAAU,YACVM,QAAS,CACP4I,YAAa,aACbC,OAAQ,iCAGV,gBAAClJ,EAAA,EAAI,CAACN,UAAW,EAAWO,OAAO,wBAIxC4L,IACC,wBAAM9L,UAAU,WACd,gBAAC2G,EAAA,EAAO,CACN3G,UAAU,YACVM,QAAS,CACP4I,YAAa,aACbC,OAAQ,8BAGV,gBAAClJ,EAAA,EAAI,CAACN,UAAW,EAAWO,OAAO,qBAO5CmL,GACC,gCACGC,GAAcxJ,KAAI,SAAC6H,EAAkB3H,G,QAAgB,OACpD,gBAACwD,EAA2B,CAC1BxD,IAAKA,EACLqC,eAAgBsF,EAAEtF,eAClBoB,OAAQkE,EAAElE,OACVC,SAAUiE,EAAEjE,SACZnF,SAAUV,EAAMU,SAChBgE,SAAUoH,GAAoBS,SAAyB,QAAhB,EAAAzC,EAAEtF,sBAAc,eAAEnB,IACzDsB,OAAQ+F,GACR9F,kBAAmB+C,EAA+B,QAAhB,EAAAmC,EAAEtF,sBAAc,eAAEnB,IACpD+B,UAAW2C,EACXrB,UAAWA,GAAU9E,KACrBuE,iBAAkBA,I,KAKxB,gBAACe,EAAqB,OAKhC,C,+JC3OM,SAAUqD,EAAoBvD,G,UAClC,EAAkEA,GAAW,CAAC,EAAtEwD,EAAe,EAAfA,gBAAiBgC,EAAG,EAAHA,IAAKnC,EAAe,EAAfA,gBAAiBoC,EAAc,EAAdA,eAEvCC,GAAa,SAAbA,SACR,GAAuC,IAAAC,GAAkBnC,EAAiBH,GAAlEuC,EAAY,EAAZA,aAAcC,EAAY,EAAZA,aACtB,GAAmD,OAAY,MAAvDC,EAAmB,EAAnBA,oBAAqBC,EAAiB,EAAjBA,kBAC7B,GAA2D,SAAnDjH,EAAc,EAAdA,eAA0BkH,EAAoB,EAA9BC,SAClB/M,EAAuB4F,EAAe,uBAEtCoH,EAAS,kBAA6B,cACtCC,EAAc,kBAAkC,mBAChDC,EAAa,mBACD,QAAhB,EAAAD,EAAYvL,YAAI,eAAEyL,kBAAmB,eAA4BF,EAAYvL,KAAK0L,aA4BpF,MAAO,CACL7C,8BARCsC,GACDC,GACAE,EAAO5I,cACP6I,EAAY7I,iBACM,QAAhB,EAAA6I,EAAYvL,YAAI,eAAEyL,kBAAmBD,EAAW9I,cAKlD6B,iBAAkB,CAChBoH,YAAa,SACbC,kBA7BJ,SAA2BC,G,MACzB,MAAM,WAAYA,EAUdhB,KAAmC,QAAhB,EAAAU,EAAYvL,YAAI,eAAEyL,iBAChC,KAEF,qBAAqCI,EAAMC,OAAQ,CAAElB,IAAAA,IAZnD,IAaX,EAeIE,SAAAA,EACAG,aAAAA,EACAD,aAAAA,EACAxG,YAAwB,QAAX,EAAA8G,EAAOtL,YAAI,eAAEwE,YAC1BgH,WAAYA,EAAWxL,KACvB+L,yBAA0B,6BAC1BC,8BAA+B,kCAC/BC,2BAA4B,+BAC5BC,sBAAuBhB,EACvBiB,uBAAwB,KACxB7N,qBAAAA,GAGN,C,wECpFa0J,EAA2B,WACtC,OAAwD,OAAgB,CAAEpB,iBAAiB,IAAnFF,EAAkB,EAAlBA,mBAAoB0F,EAAuB,EAAvBA,wBAEtBC,EAAe3F,GAAsB0F,IAO3C,OALkB,oBACdC,GACF,0BAAuCA,EAAa5K,IAIxD,C,6vDCJA,IAAM6K,EAAiC,eACpC,OAAmB,CAElB,cAED,OAAmB,CAElB,cAED,OAAmB,CAElB,cAED,SAAqB,CAEpB,cAED,OAAmB,IACnB,WAAuB,IAGpB,SAAU5C,I,MACd,GAAuD,OAAY,MAA3D6C,EAAuB,EAAvBA,wBAAyBpB,EAAiB,EAAjBA,kBAG/BzE,GACE,OAAgB,CAAEE,iBAAiB,IADrCF,mBAGI6E,EAAc,kBAAkC,mBAEhDiB,EAAwBF,EAAkD,QAAhB,EAAAf,EAAYvL,YAAI,eAAEyM,eAC5EjF,EAAgB,+BAAwCd,aAAkB,EAAlBA,EAAoBc,eAC5EkF,IAA2BF,aAAqB,EAArBA,EAAuBG,MAAK,SAAAC,GAC3D,OAAOA,EAAEC,cAAgBrF,aAAa,EAAbA,EAA6CqF,WACxE,KAEMC,GAAa3B,IAAsBoB,EAEgE,IAA/D,YAAyBO,IAAcJ,GAAwB,GAAjGlN,EAAY,KAAEuN,EAAe,KAE2D,IAA5D,WAAe5B,KAAsBzE,aAAkB,EAAlBA,EAAoBjF,KAAG,GAAxFkI,EAAS,KAAEqD,EAAY,KAW/B,OATA,aAAgB,WACVF,GAAaJ,EACfK,GAAgB,GACNpD,GACVoD,GAAgB,GAElBC,EAAa7B,KAAsBzE,aAAkB,EAAlBA,EAAoBjF,IACzD,GAAG,CAAE8K,EAAyB7F,aAAkB,EAAlBA,EAAoBjF,GAAIkI,IAElD,kBACK,CAAEnK,cAAc,EAAMmK,WAAW,GAEnC,CAAEnK,aAAAA,EAAcmK,UAAAA,EACzB,C,uECzCM,SAAUnB,EAAcyE,GAA+C,IAA/B7H,EAAA,uDAA6B,CAAC,EACpE8H,EAtBR,SAAyBD,GACvB,OAAKA,EAGD1H,MAAM4H,QAAQF,GACTA,EAAQjD,QAAO,SAAAoD,GAAC,QAAMA,IAAM,YAAoBA,IAAM,WAAmBA,GAAG,IAEjF,SAAUH,EACLA,EAAQjN,KAAKgK,QAAO,SAAAoD,GAAC,QAAMA,IAAM,YAAoBA,IAAM,WAAmBA,GAAG,IAEnF,GARE,EASX,CAWmBC,CAAgBJ,GAAS5M,KAAI,SAAA4J,GAAC,OAAIA,EAAExI,EAAE,KAEvD,OAAqByL,GAAU,SAAA7E,GAAG,OAAI,qBAA+BA,EAAKjD,EAAQqD,gBAAgB,GACpG,C,mCC/BA,SAAgB,gBAAkB,QAAQ,IAAM,QAAQ,SAAW,QAAQ,YAAc,QAAQ,QAAU,Q","sources":["file:///app/packages/libs/shared/src/apps/discover/components/header/discover-header.scss","file:///app/packages/libs/shared/src/apps/discover/components/header/DiscoverHeader.tsx","file:///app/packages/libs/shared/src/components/pill-tab-selector/PillTabSelector.tsx","file:///app/packages/libs/shared/src/hooks/UseBatchFetch.ts","file:///app/packages/projects/lite/src/apps/content-updates/components/classification-banner/classification-banner.scss","file:///app/packages/projects/lite/src/apps/content-updates/components/classification-banner/ClassificationBanner.tsx","file:///app/packages/projects/lite/src/apps/content-updates/views/content-updates/components/ContentUpdateClassification.tsx","file:///app/packages/projects/lite/src/apps/content-updates/views/content-updates/partial-loading/partial-content-updates.scss","file:///app/packages/projects/lite/src/apps/content-updates/views/content-updates/partial-loading/PartialContentUpdates.tsx","file:///app/packages/projects/lite/src/apps/content-updates/views/content-updates/ContentUpdatesView.tsx","file:///app/packages/projects/lite/src/shared/hooks/useCommonVideoProps.ts","file:///app/packages/projects/lite/src/shared/hooks/usePresentationAudiences.ts","file:///app/packages/projects/lite/src/shared/hooks/useShowCalendar.ts","file:///app/packages/projects/lite/src/shared/hooks/useVideoMixin.ts","file:///app/packages/libs/shared/src/components/pill-tab-selector/pill-tab-selector.scss"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"pillTab\":\"bMJM0\"};","import React from 'react';\n\nimport { AppLinkHelper } from 'libs/common/backbone/core';\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { PillTabSelector } from 'libs/shared/components/pill-tab-selector/PillTabSelector';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { DashboardUserType } from 'libs/shared/interfaces';\n\nimport styles from './discover-header.scss';\n\nconst namespace = 'discover.header';\n\nexport interface DiscoverHeaderAppLinks {\n forYou: Core.AppLink;\n whatsNew: Core.AppLink;\n calendar: Core.AppLink;\n}\n\ninterface DiscoverHeaderProps {\n type: DashboardUserType;\n hasStudentExperience?: boolean;\n appLinks?: DiscoverHeaderAppLinks;\n showCalendar: boolean;\n active: keyof DiscoverHeaderAppLinks;\n}\n\nexport function DiscoverHeader(props: DiscoverHeaderProps): JSX.Element {\n if (!props.type)\n return <></>;\n\n if (props.type === DashboardUserType.Learner || props.hasStudentExperience) {\n return (\n <div className='py-3'>\n <h1 className='h2 mb-0'>\n <Text namespace={namespace} phrase='heading' />\n </h1>\n </div>\n );\n }\n\n const tabs = [{\n name: LanguageService.getPhrase(namespace, 'forYou'),\n appLink: props.appLinks?.forYou,\n active: props.active === 'forYou',\n analyticsData: {\n name: LanguageService.getPhrase(namespace, 'forYou'),\n url: AppLinkHelper.getHref(props.appLinks?.forYou)\n },\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.Url,\n location: LocationContext.MagicTabs\n }\n }, {\n name: LanguageService.getPhrase(namespace, 'whatsNew'),\n appLink: props.appLinks?.whatsNew,\n active: props.active === 'whatsNew',\n analyticsData: {\n name: LanguageService.getPhrase(namespace, 'whatsNew'),\n url: AppLinkHelper.getHref(props.appLinks?.whatsNew)\n },\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.Url,\n location: LocationContext.MagicTabs\n }\n }];\n\n if (props.showCalendar) {\n tabs.push({\n name: LanguageService.getPhrase(namespace, 'calendar'),\n appLink: props.appLinks?.calendar,\n active: props.active === 'calendar',\n analyticsData: {\n name: LanguageService.getPhrase(namespace, 'calendar'),\n url: AppLinkHelper.getHref(props.appLinks?.calendar)\n },\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.Url,\n location: LocationContext.MagicTabs\n }\n });\n }\n\n return (\n <div className='py-3 text-center mx-n3'>\n <PillTabSelector\n tabs={tabs}\n className={styles.pillTab}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\n\nimport { SvgContainer } from '../svg-container/SvgContainer';\n\nimport styles from './pill-tab-selector.scss';\n\ninterface TabContentsProps {\n tab: PillTab;\n}\n\nfunction TabContents(props: TabContentsProps): JSX.Element {\n return (\n <>\n {!!props.tab.svgName && (\n <div className={props.tab.name ? 'pe-1' : ''}>\n <SvgContainer svgName={props.tab.svgName} />\n </div>\n )}\n\n {props.tab.name}\n\n {typeof (props.tab.count) === 'number' && (\n <div className='ps-2'>\n <Badge type={BadgeType.Count} data={props.tab.count} />\n </div>\n )}\n </>\n );\n}\n\nexport interface PillTab {\n name: string;\n active: boolean;\n svgName?: string;\n\n className?: string;\n\n appLink?: Core.AppLink;\n onSelect?: () => void;\n\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n\n count?: number;\n}\n\ninterface PillTabSelectorProps {\n tabs: PillTab[];\n containerRef?: (el: HTMLElement) => void;\n listClassName?: string;\n className?: string;\n borderRadius?: 'sm' | 'lg'\n}\n\nPillTabSelector.defaultProps = {\n borderRadius: 'lg'\n};\n\nexport function PillTabSelector(props: PillTabSelectorProps): JSX.Element {\n function onSelectTab(tab: PillTab): void {\n if (tab.active || !tab.onSelect)\n return;\n\n tab.onSelect();\n\n if (tab.analyticsData && tab.analyticsOptions)\n AnalyticsHelper.logUserAction(tab.analyticsData, tab.analyticsOptions);\n }\n\n return (\n <nav className={props.className ?? ''} ref={props.containerRef}>\n <ul className={`\n list-unstyled d-inline-block m-0 ${styles.pillTabSelector}\n ${props.borderRadius ? styles.radiusSmall : ''}\n ${props.listClassName}\n `}>\n {props.tabs.map((tab, index) => {\n return (\n <li\n className={`\n p-0 ${styles.tab} ${tab.active ? 'btn btn-dark' : 'btn btn-outline-dark'}\n ${tab.name ? styles.minWidth : ''} ${tab.className}\n `}\n key={index}\n >\n {tab.appLink ? (\n <AppLink\n appLink={tab.appLink}\n analyticsData={tab.analyticsData}\n analyticsOptions={tab.analyticsOptions}\n className={`\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ${styles.tabLink}\n `}\n >\n <TabContents tab={tab} />\n </AppLink>\n ) : (\n <DivButton\n className={`\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ${styles.tabLink}\n `}\n onClick={() => onSelectTab(tab)}\n >\n <TabContents tab={tab} />\n </DivButton>\n )}\n </li>\n );\n })}\n </ul>\n </nav>\n );\n}\n","import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { BaseObject } from 'libs/shared/interfaces';\n\nconst CHUNK_SIZE = 50;\n\nexport interface UseBatchFetchResult<T extends BaseObject> {\n itemsArr: T[];\n items: { [key: string]: T} | null;\n isFetching: boolean;\n}\n\n/**\n * Used to fetch multiple items by id with Flight. Will fetch 25 items at a time firing off multiple\n * requests if there are more than 25 items.\n * This will return items as null until we have all our items. Items will be returned as an object with\n * their ids as they key for easy mapping\n * \n * @param itemIds \n * @param getRequest \n */\nexport function useBatchFetch<T extends BaseObject>(\n itemIds: string[],\n getRequest: (ids: string[]) => Flight.Request\n): UseBatchFetchResult<T> {\n const chunks = ArrayHelper.chunk<string>(itemIds, CHUNK_SIZE);\n\n const requests = chunks.map(chunk => getRequest(ArrayHelper.uniq(chunk)));\n\n const responses = Flight.useBasicFetchAll<T[]>(requests);\n\n const itemsArr = ArrayHelper.flatten(responses.data);\n const items = responses.data.length\n ? itemsArr.reduce((acc, item) => ({ ...acc, [item.id]: item }), {})\n : null;\n\n return {\n itemsArr,\n items,\n isFetching: responses.isFetching\n };\n}\n\n/**\n * When you need the useBatchFetch() behavior, but your list of objects to hydrate\n * will grow, such as on a scrolling page. useGrowingBatchFetch() will use local state\n * to determine what we've already built a request for and what items are new\n * as to not re-fetch items - Sha\n */\nexport function useGrowingBatchFetch<T>(\n objs: T[],\n getRequest: (items: T[]) => Flight.Request,\n _getKey?: (obj: T) => string\n) {\n const getKey = _getKey || ((obj: any) => {\n if (typeof obj === 'object')\n return obj.id;\n\n return obj;\n });\n\n const fetchedItems = React.useRef<Set<string>>(new Set<string>());\n\n const [ requests, setRequests ] = React.useState<Flight.Request[]>([]);\n\n React.useEffect(() => {\n if (!objs?.length)\n return;\n\n const unfetchedItems: T[] = [];\n \n objs.forEach(obj => {\n const key = getKey(obj);\n\n if (fetchedItems.current.has(key))\n return;\n\n unfetchedItems.push(obj);\n fetchedItems.current.add(key);\n });\n \n if (!unfetchedItems.length)\n return;\n\n setRequests(r => ([ ...r, ...ArrayHelper.chunk<T>(unfetchedItems, CHUNK_SIZE).map(getRequest) ]));\n }, [objs?.length]);\n\n const responses = Flight.useBasicFetchAll<T[]>(requests);\n\n const itemsArr = ArrayHelper.flatten(responses.data);\n const items = responses.data.length\n ? itemsArr.reduce((acc, item) => ({ ...acc, [getKey(item)]: item }), {})\n : null;\n\n return {\n hasFirstRequestCompleted: !!responses.responses?.[0]?.hasCompleted,\n itemsArr,\n items,\n isFetching: responses.isFetching\n };\n}","// extracted by mini-css-extract-plugin\nexport default {\"banner\":\"B7jhq\"};","import * as React from 'react';\nimport { Spinner } from 'react-bootstrap';\n\nimport { StorageType } from 'libs/common/backbone/utils/LocalStorageHelper';\nimport { Core } from 'libs/common/core';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { Classification, PresentationAudience } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './classification-banner.scss';\n\nconst namespace = 'contentUpdates.classificationBanner';\n\ninterface ClassificationBannerProps {\n classification: Classification;\n backgroundUrl: string;\n getClassificationAppLink: (classification: Classification, activeAudiences: PresentationAudience[]) => Core.AppLink;\n followed: boolean;\n follow: (classificationId: string, classificationName: string, follow: boolean) => void;\n showFollowSpinner: boolean;\n canFollow: boolean;\n}\n\nexport function ClassificationBanner(props: ClassificationBannerProps): JSX.Element {\n const { classification, backgroundUrl, followed, follow, showFollowSpinner } = props;\n\n const [activeAudiences] = useViewModel<PresentationAudience[]>(\n SharedViewModelKeys.AUDIENCE_FILTER,\n undefined,\n { storage: StorageType.SessionStorage }\n );\n\n return (\n <div\n className={`banner mb-2 d-flex justify-content-between align-items-center rounded ${styles.banner}`}\n style={{ backgroundImage: `url('${backgroundUrl}')` }}\n >\n <AppLink className='text-white text-shadow' appLink={props.getClassificationAppLink(classification, activeAudiences)}>\n <h2 className='h3 mb-0'>{classification.name}</h2>\n </AppLink>\n\n {props.canFollow && (\n <IconButton\n className={`btn follow-btn ${followed ? 'btn-outline-dark' : 'btn-dark'}`}\n svgName={followed ? cvSvgLibrary.BellFilled : cvSvgLibrary.Bell}\n onClick={() => follow(classification.id, classification.name, !followed)}\n >\n {showFollowSpinner\n ? <Spinner as='span' animation='border' role='status' size='sm' />\n : <Text namespace={namespace} phrase={followed ? 'following' : 'follow'} />\n }\n </IconButton>\n )}\n </div>\n );\n}\n","import * as React from 'react';\n\nimport { ContentUpdateAppLinks, VideoWithClassification } from 'libs/shared/apps/content-updates/interfaces';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoList } from 'libs/shared/components/video-list/VideoList';\nimport { ImageSize, ImageType, ResizeType } from 'libs/shared/enums/Images';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { Classification, PresentationAudience } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\n\nimport { InteractiveHelpers } from 'shared/utils/InteractiveHelper';\n\nimport { ClassificationBanner } from 'apps/content-updates/components';\n\nconst namespace = 'contentUpdates.contentUpdatesView';\n\ninterface ClassificationProps {\n classification: Classification;\n videos: VideoWithClassification[];\n showMore: boolean;\n appLinks: ContentUpdateAppLinks;\n followed: boolean;\n follow: (classificationId: string, classificationName: string, follow: boolean) => void;\n showFollowSpinner: boolean;\n canFollow: boolean;\n audiences: PresentationAudience[];\n commonVideoProps: CommonVideoProps;\n}\n\nexport function ContentUpdateClassification(props: ClassificationProps): JSX.Element {\n const { classification, videos, showMore, followed } = props;\n\n const { hasPermissions } = usePermissions();\n\n if (!classification)\n return <></>;\n \n const url = ImageHelper.createBannerUrl(classification.banner, {\n fallbackBaseUrl: props.commonVideoProps.imageCdnUrl,\n fallbackCategoryName: classification.name,\n type: ImageType.Banners\n }, { size: ImageSize.Medium, resizeType: ResizeType.Cover });\n\n return (\n <div className='mb-3'>\n <ClassificationBanner\n classification={classification}\n backgroundUrl={url}\n getClassificationAppLink={props.appLinks.getClassificationAppLink}\n followed={followed}\n follow={props.follow}\n canFollow={props.canFollow}\n showFollowSpinner={props.showFollowSpinner}\n />\n <VideoList\n videos={videos}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n presentationAudiences={props.audiences}\n hasPermissions={hasPermissions}\n getPreviewQuestionsAppLink={interactive => InteractiveHelpers.getPreviewQuestionsAppLink(interactive)}\n commonVideoProps={props.commonVideoProps}\n />\n {showMore &&\n <div className={'show-more'}>\n <AppLink className='info-link' appLink={props.appLinks.getClassificationUpdateAppLink(classification)}>\n <Text namespace={namespace} phrase='showMore' options={{\n classificationName: classification.name\n }} />\n </AppLink>\n </div>\n }\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialBanner\":\"bxaA6\"};","import React from 'react';\n\nimport { PartialVideoList } from 'libs/shared/components/video-list/partial-loading/PartialVideoList';\n\nimport styles from './partial-content-updates.scss';\n\nexport function PartialContentUpdates(): JSX.Element {\n return (\n <>\n {Array(4).fill(null).map((s, i) => (\n <div key={i} className='mb-3'>\n <div className={`partial-loading-background mb-2 ${styles.partialBanner}`} />\n <PartialVideoList />\n </div>\n ))}\n </>\n );\n}","import * as React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, ToggleDescriptor, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { ContentUpdateRequests } from 'libs/shared/apps/content-updates/flight-requests/ContentUpdateRequests';\nimport { ClassificationVideosGrouping, ContentUpdate, ContentUpdateAppLinks } from 'libs/shared/apps/content-updates/interfaces';\nimport { DiscoverHeader } from 'libs/shared/apps/discover/components/header/DiscoverHeader';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { PreferenceRequests } from 'libs/shared/flight-requests/PreferenceRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useBatchFetch } from 'libs/shared/hooks/UseBatchFetch';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Classification, DashboardUserType, Video } from 'libs/shared/interfaces';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { useCommonVideoProps } from 'shared/hooks/useCommonVideoProps';\nimport { usePresentation } from 'shared/hooks/usePresentation';\nimport { usePresentationAudiences } from 'shared/hooks/usePresentationAudiences';\nimport { useShowCalendar } from 'shared/hooks/useShowCalendar';\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\nimport { SeoHelper } from 'shared/utils/SeoHelper';\n\nimport { ContentUpdateClassification } from './components/ContentUpdateClassification';\nimport { PartialContentUpdates } from './partial-loading/PartialContentUpdates';\n\nconst INITIAL_VIDEO_COUNT = 5;\nconst namespace = 'contentUpdates.contentUpdatesView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction map(\n contentUpdates: ClassificationVideosGrouping[],\n classifications: {[key: string]: Classification}\n): ContentUpdate[] {\n if (!contentUpdates || !classifications)\n return null;\n\n return contentUpdates.map((c): ContentUpdate => {\n return {\n showMore: c.videos.length > INITIAL_VIDEO_COUNT,\n classification: classifications[c.id],\n videos: c.videos.slice(0, INITIAL_VIDEO_COUNT).map((m: any) => {\n m.classification = classifications[m.id];\n return m;\n }).filter(v => v)\n };\n }).filter(v => v.classification);\n}\n\ninterface FollowSpinnersMap {\n [classificationId: string]: boolean;\n}\n\ninterface ContentUpdatesViewProps {\n appLinks: ContentUpdateAppLinks;\n presentationSlug?: string;\n}\n\nexport function ContentUpdatesView(props: ContentUpdatesViewProps): JSX.Element {\n const [ followSpinners, setFollowSpinners ] = React.useState<FollowSpinnersMap>({});\n\n const dispatch = useDispatch();\n const alerts = useAlerts();\n\n const { hasPermissions } = usePermissions();\n const canFollowSubjects = hasPermissions(PermissionName.FollowSubjects);\n\n const date = new Date();\n const from = DateHelper.format(DateHelper.endOf(DateHelper.subtract(date, 1, 'year'), 'day'), 'YYYY-MM-DD');\n const to = DateHelper.format(DateHelper.endOf(date, 'day'), 'YYYY-MM-DD');\n\n const { activePresentation } = usePresentation({ redirectOnError: true });\n\n useSetPageMetadata(PageMetadataHelper.getDefaultMetadata({\n title: activePresentation?.name,\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n },\n canonicalLink: SeoHelper.getCanonicalLink(),\n allowIndexing: SeoHelper.allowIndexing(),\n hrefLang: SeoHelper.getStaticRouteHrefLang(\n activePresentation?.learningLevel,\n () => ({ application: AppChannels.CONTENT_UPDATES, action: Actions.ContentUpdates.CONTENT_UPDATES })\n )\n }));\n\n const contentUpdatesRequest = ContentUpdateRequests.getContentUpdates(activePresentation?.id, from, to);\n const contentUpdates = Flight.useBasicFetch<ClassificationVideosGrouping[]>(\n activePresentation && contentUpdatesRequest\n );\n const subjectPreferences = Flight.useBasicFetch<Classification[]>(canFollowSubjects &&\n PreferenceRequests.mySubjectPreferences());\n\n const audiences = usePresentationAudiences();\n\n /* Map content update response into list of video ids and classification ids*/\n const classificationIds: string[] = [];\n let videos: Video[] = [];\n contentUpdates.data && contentUpdates.data.forEach(c => {\n classificationIds.push(c.id);\n videos = videos.concat(c.videos);\n });\n\n /* Batch fetch the videos and classifications by id */\n const { items: classifications } = useBatchFetch<Classification>(\n classificationIds,\n (ids: string[]) => ContentUpdateRequests.getClassifications(ids)\n );\n\n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n \n useVideoMixin(videos, {\n flightNamespace: contentUpdatesRequest.normalizeOptions?.namespace\n });\n\n const { commonVideoProps, hasCommonVideoPropsCompleted } = useCommonVideoProps({\n locationContext: LocationContext.VideoThumbnail,\n flightNamespace: contentUpdatesRequest.normalizeOptions?.namespace\n });\n\n /** Callbacks */\n function onFollow(classificationId: string, classificationName: string, follow: boolean): void {\n setFollowSpinners(currentState => ({\n ...currentState,\n [classificationId]: true\n }));\n\n const onSuccess = () => {\n setFollowSpinners(currentState => ({\n ...currentState,\n [classificationId]: false\n }));\n\n AnalyticsHelper.logUserAction({\n id: classificationId,\n name: classificationName\n }, {\n location: LocationContext.ContentUpdatesClassificationBanner,\n workflowPhase: WorkflowPhase.Complete,\n descriptor: follow ? ToggleDescriptor.On : ToggleDescriptor.Off,\n actionType: UserAction.Follow,\n entity: EntityType.Classification\n });\n\n alerts.success(getPhrase(\n follow ? 'followed' : 'unfollowed',\n { classification: classifications[classificationId]?.name, escapeText: true }\n ));\n };\n\n const onError = () => {\n setFollowSpinners(currentState => ({\n ...currentState,\n [classificationId]: false\n }));\n\n alerts.error(getPhrase('error'));\n };\n\n const request = follow ?\n PreferenceRequests.followSubjects([classificationId], onSuccess, onError) :\n PreferenceRequests.unfollowSubjects([classificationId], onSuccess, onError);\n\n Flight.fetch(dispatch, request);\n }\n\n const { showCalendar, isLoading } = useShowCalendar();\n\n const dataLoaded = !!(\n contentUpdates.hasCompleted &&\n audiences.hasCompleted &&\n (!canFollowSubjects || subjectPreferences.hasCompleted) &&\n classifications &&\n !isLoading &&\n hasCommonVideoPropsCompleted\n );\n\n /* Build out array of content updates from our lists of videos and classifications */\n const mappedUpdates = map(contentUpdates.data, classifications);\n const preferredSubjectIds = subjectPreferences.data?.map(subject => subject.id) ?? [];\n\n const managePreferences = hasPermissions(PermissionName.ManageSubjectPreferences);\n const manageVideoAccess = hasPermissions(PermissionName.ManageVideoAccess);\n\n return (\n <VideoActionsContext.Provider value={videoActions}>\n <div className='bg-white px-3'>\n {!isLoading && <DiscoverHeader\n type={DashboardUserType.Staff} // Students never see this page\n appLinks={{\n forYou: props.appLinks.dashboardAppLink,\n whatsNew: props.appLinks.whatsNewAppLink,\n calendar: props.appLinks.calendarAppLink\n }}\n showCalendar={showCalendar}\n active='whatsNew'\n />}\n <h1><Text namespace={namespace} phrase='heading' /></h1>\n {(managePreferences || manageVideoAccess) && (\n <p>\n {managePreferences &&\n <>\n <Text namespace={namespace} phrase='onlyRelevant' /> \n <AppLink\n className='info-link'\n appLink={{\n application: AppChannels.SETTINGS,\n action: Actions.Settings.TOPIC_PREFERENCES\n }}\n >\n <Text namespace={namespace} phrase='updatePreferences' />\n </AppLink>\n </>\n }\n {manageVideoAccess &&\n <span className='d-block'>\n <AppLink\n className='info-link'\n appLink={{\n application: AppChannels.SETTINGS,\n action: Actions.Settings.CONTENT_REVIEW\n }}\n >\n <Text namespace={namespace} phrase='contentReview' />\n </AppLink>\n </span>\n }\n </p>\n )}\n\n {dataLoaded ? (\n <>\n {mappedUpdates.map((c: ContentUpdate, key: number) => (\n <ContentUpdateClassification\n key={key}\n classification={c.classification}\n videos={c.videos}\n showMore={c.showMore}\n appLinks={props.appLinks}\n followed={preferredSubjectIds.includes(c.classification?.id)}\n follow={onFollow}\n showFollowSpinner={followSpinners[c.classification?.id]}\n canFollow={canFollowSubjects}\n audiences={audiences.data}\n commonVideoProps={commonVideoProps}\n />\n ))}\n </>\n ) : (\n <PartialContentUpdates />\n )}\n </div>\n </VideoActionsContext.Provider>\n );\n}\n","import { Core } from 'libs/common/backbone/index';\nimport { Flight } from 'libs/common/react/index';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, CurrentUser, VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\n\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { SeriesAppLinkHelper } from 'apps/series/SeriesAppLinkHelper';\n\nimport { usePluginHelper } from './use-plugin-helper/usePluginHelper';\nimport { useLiteFavourites } from './useLiteFavourites';\n\ninterface UseCommonVideoPropsResult {\n hasCommonVideoPropsCompleted: boolean;\n commonVideoProps: CommonVideoProps;\n}\n\ninterface UseCommonVideoPropsOptions {\n locationContext: LocationContext,\n mtv?: boolean;\n flightNamespace?: string;\n sharedPlaylist?: boolean;\n}\n\nexport function useCommonVideoProps(options: UseCommonVideoPropsOptions): UseCommonVideoPropsResult {\n const { locationContext, mtv, flightNamespace, sharedPlaylist } = options || {};\n\n const { isPlugin } = usePluginHelper();\n const { setFavourite, canFavourite } = useLiteFavourites(locationContext, flightNamespace);\n const { hasTopicDirectories, isLoadingSettings } = useSettings(null);\n const { hasPermissions, isLoaded: hasLoadedPermissions } = usePermissions();\n const hasStudentExperience = hasPermissions(PermissionName.StudentExperience);\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n function getSubTextAppLink(video: VideoTypes): Core.AppLink {\n if (!('series' in video))\n return null;\n\n /**\n * We do not allow navigating to series on shared playlists when the user is not signed in\n * because most series are customer created and will be empty for public users\n * \n * We do not have to do this for shared series, because all the series links are self referencing\n * - Sha\n */\n if (sharedPlaylist && !currentUser.data?.isAuthenticated)\n return null;\n \n return SeriesAppLinkHelper.getSeriesAppLink(video.series, { mtv });\n }\n\n const hasCommonVideoPropsCompleted = (\n !isLoadingSettings &&\n hasLoadedPermissions &&\n config.hasCompleted &&\n currentUser.hasCompleted &&\n (!currentUser.data?.isAuthenticated || yearGroups.hasCompleted)\n );\n\n return {\n hasCommonVideoPropsCompleted,\n commonVideoProps: {\n subTextType: 'series',\n getSubTextAppLink,\n isPlugin,\n canFavourite,\n setFavourite,\n imageCdnUrl: config.data?.imageCdnUrl,\n yearGroups: yearGroups.data,\n getClassroomGuideAppLink: VideoAppLinkHelper.getClassroomGuideAppLink,\n getInteractiveGuidanceAppLink: VideoAppLinkHelper.getInteractiveGuidanceAppLink,\n getResourceGuidanceAppLink: VideoAppLinkHelper.getResourceGuidanceAppLink,\n showNewVideoIndicator: hasTopicDirectories,\n companyLogoFallbackUrl: null,\n hasStudentExperience\n }\n };\n}","import { Flight } from 'libs/common/react/index';\n\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nimport { usePresentation } from 'shared/hooks/usePresentation';\n\nexport const usePresentationAudiences = () => {\n const { activePresentation, getFallbackPresentation } = usePresentation({ redirectOnError: true });\n\n const presentation = activePresentation || getFallbackPresentation();\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n !!presentation &&\n AudienceRequests.presentationAudiences(presentation.id)\n );\n\n return audiences;\n};","import React from 'react';\n\nimport { EnvironmentVariables } from 'libs/common/backbone/services/EnvironmentVariables';\nimport { Flight } from 'libs/common/react/index';\n\nimport { ContentRegion } from 'libs/shared/enums/ContentRegion';\nimport { PresentationLearningLevel } from 'libs/shared/enums/PresentationLearningLevel';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { CurrentUser } from 'libs/shared/interfaces';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\n\nimport { usePresentation } from 'shared/hooks/usePresentation';\n\nconst ALLOWED_LEARNING_LEVELS_BY_REGION: Record<ContentRegion, PresentationLearningLevel[]> = {\n [ContentRegion.AU]: [\n // AU Primary Calendar\n PresentationLearningLevel.Level_1\n ],\n [ContentRegion.US]: [\n // US Elementary Calendar\n PresentationLearningLevel.Level_1\n ],\n [ContentRegion.UK]: [\n // UK Primary Calendar\n PresentationLearningLevel.Level_1\n ],\n [ContentRegion.SCOT]: [\n // Scotland Primary Calendar\n PresentationLearningLevel.Level_1\n ],\n [ContentRegion.NZ]: [],\n [ContentRegion.GLOBAL]: []\n};\n\nexport function useShowCalendar() {\n const { hasSpecialEventCalendar, isLoadingSettings } = useSettings(null);\n\n const {\n activePresentation\n } = usePresentation({ redirectOnError: true });\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const allowedLearningLevels = ALLOWED_LEARNING_LEVELS_BY_REGION[currentUser.data?.contentRegion];\n const learningLevel = TopicsHelper.getMappedPresentationLevel(activePresentation?.learningLevel);\n const learningLevelCantAccess = !allowedLearningLevels?.find(l => {\n return l.toString() === (learningLevel as PresentationLearningLevel)?.toString();\n });\n\n const noSetting = !isLoadingSettings && !hasSpecialEventCalendar;\n\n const [ showCalendar, setShowCalendar ] = React.useState<boolean>(!noSetting && !learningLevelCantAccess);\n\n const [ isLoading, setIsLoading ] = React.useState(isLoadingSettings || !activePresentation?.id);\n\n React.useEffect(() => {\n if (noSetting || learningLevelCantAccess) {\n setShowCalendar(false);\n } else if (!isLoading) {\n setShowCalendar(true);\n }\n setIsLoading(isLoadingSettings || !activePresentation?.id);\n }, [ hasSpecialEventCalendar, activePresentation?.id, isLoading ]);\n\n if (EnvironmentVariables.isDevelopment)\n return { showCalendar: true, isLoading: false };\n\n return { showCalendar, isLoading };\n}","import { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useGrowingBatchFetch } from 'libs/shared/hooks/UseBatchFetch';\nimport { Clip, ClipCollection, Video, VideoCollection } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\ntype Types = Video[] | VideoCollection | Clip[] | ClipCollection;\n\nfunction getValidObjects(objects: Types): (Video | Clip)[] {\n if (!objects)\n return [];\n\n if (Array.isArray(objects))\n return objects.filter(o => !!o && (VideoHelper.isVideo(o) || VideoHelper.isClip(o)));\n\n if ('data' in objects)\n return objects.data.filter(o => !!o && (VideoHelper.isVideo(o) || VideoHelper.isClip(o)));\n\n return [];\n}\n\ninterface VideoMixinOptions {\n /**\n * If the videos that are having new data mixed into are sitting on an explicit Flight namespace,\n * providing that namespace here is required\n */\n flightNamespace?: string;\n}\n\nexport function useVideoMixin(objects: Types, options: VideoMixinOptions = {}): void {\n const videoIds = getValidObjects(objects).map(v => v.id);\n\n useGrowingBatchFetch(videoIds, ids => VideoRequests.videoMixinAssocs(ids, options.flightNamespace));\n}","// extracted by mini-css-extract-plugin\nexport default {\"pillTabSelector\":\"Hdi6o\",\"tab\":\"RvNxr\",\"minWidth\":\"GHSz9\",\"radiusSmall\":\"VhJJa\",\"tabLink\":\"WFyvo\"};"],"names":["namespace","DiscoverHeader","props","type","hasStudentExperience","className","Text","phrase","tabs","name","LanguageService","appLink","appLinks","forYou","active","analyticsData","url","analyticsOptions","actionType","entity","location","whatsNew","showCalendar","push","calendar","PillTabSelector","TabContents","tab","svgName","count","data","ref","containerRef","borderRadius","listClassName","map","index","key","onClick","onSelect","onSelectTab","defaultProps","CHUNK_SIZE","useBatchFetch","itemIds","getRequest","requests","chunk","responses","itemsArr","items","length","reduce","acc","item","id","isFetching","useGrowingBatchFetch","objs","_getKey","getKey","obj","fetchedItems","Set","setRequests","unfetchedItems","forEach","current","has","add","r","hasFirstRequestCompleted","hasCompleted","ClassificationBanner","classification","backgroundUrl","followed","follow","showFollowSpinner","activeAudiences","SharedViewModelKeys","undefined","storage","style","backgroundImage","getClassificationAppLink","canFollow","IconButton","Spinner","as","animation","role","size","ContentUpdateClassification","videos","showMore","hasPermissions","usePermissions","ImageHelper","banner","fallbackBaseUrl","commonVideoProps","imageCdnUrl","fallbackCategoryName","resizeType","VideoList","getVideoAppLink","presentationAudiences","audiences","getPreviewQuestionsAppLink","interactive","InteractiveHelper","AppLink","getClassificationUpdateAppLink","options","classificationName","PartialContentUpdates","Array","fill","s","i","PartialVideoList","INITIAL_VIDEO_COUNT","getPhrase","ContentUpdatesView","followSpinners","setFollowSpinners","dispatch","alerts","canFollowSubjects","PermissionName","date","Date","from","DateHelper","to","activePresentation","usePresentation","redirectOnError","useSetPageMetadata","PageMetadataHelper","title","phraseContext","phraseHandler","titlePhrase","descriptionPhrase","canonicalLink","SeoHelper","allowIndexing","hrefLang","learningLevel","application","action","contentUpdatesRequest","ContentUpdateRequests","contentUpdates","subjectPreferences","PreferenceRequests","usePresentationAudiences","classificationIds","c","concat","classifications","ids","videoActions","useVideoActions","useVideoMixin","flightNamespace","normalizeOptions","useCommonVideoProps","locationContext","hasCommonVideoPropsCompleted","onFollow","classificationId","currentState","onSuccess","AnalyticsHelper","workflowPhase","descriptor","success","escapeText","onError","error","request","useShowCalendar","isLoading","dataLoaded","mappedUpdates","slice","m","filter","v","preferredSubjectIds","subject","managePreferences","manageVideoAccess","VideoActionsContext","value","dashboardAppLink","whatsNewAppLink","calendarAppLink","includes","mtv","sharedPlaylist","isPlugin","u","setFavourite","canFavourite","hasTopicDirectories","isLoadingSettings","hasLoadedPermissions","isLoaded","config","currentUser","yearGroups","isAuthenticated","customerId","subTextType","getSubTextAppLink","video","series","getClassroomGuideAppLink","getInteractiveGuidanceAppLink","getResourceGuidanceAppLink","showNewVideoIndicator","companyLogoFallbackUrl","getFallbackPresentation","presentation","ALLOWED_LEARNING_LEVELS_BY_REGION","hasSpecialEventCalendar","allowedLearningLevels","contentRegion","learningLevelCantAccess","find","l","toString","noSetting","setShowCalendar","setIsLoading","objects","videoIds","isArray","o","getValidObjects"],"sourceRoot":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/9345-30ccf524c5-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/hooks/UseBatchFetch.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteScroll.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteList.ts","file:///app/packages/projects/lite/src/apps/watch-history/flight-requests/VideoHistoryRequests.ts","file:///app/packages/projects/lite/src/apps/watch-history/components/watch-history-video-list/WatchHistoryVideoList.tsx","file:///app/packages/projects/lite/src/apps/watch-history/hooks/useWatchHistory.ts","file:///app/packages/projects/lite/src/apps/watch-history/hooks/useWatchHistoryVideoActions.ts","file:///app/packages/projects/lite/src/apps/watch-history/views/watch-history/empty-state/WatchHistoryEmptyState.tsx","file:///app/packages/projects/lite/src/apps/watch-history/views/watch-history/partial-loading/partial-watch-history.scss","file:///app/packages/projects/lite/src/apps/watch-history/views/watch-history/partial-loading/PartialWatchHistory.tsx","file:///app/packages/projects/lite/src/apps/watch-history/views/watch-history/WatchHistoryView.tsx","file:///app/packages/projects/lite/src/shared/hooks/useCommonVideoProps.ts","file:///app/packages/projects/lite/src/shared/hooks/usePresentationAudiences.ts","file:///app/packages/projects/lite/src/shared/hooks/useVideoMixin.ts"],"sourcesContent":["import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n internalServerError?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError,\n internalServerError: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.InternalServer) {\n if (!ignoreMap.internalServerError)\n Core.ErrorHelper.throw(new UnspecifiedError());\n return;\n }\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { BaseObject } from 'libs/shared/interfaces';\n\nconst CHUNK_SIZE = 50;\n\nexport interface UseBatchFetchResult<T extends BaseObject> {\n itemsArr: T[];\n items: { [key: string]: T} | null;\n isFetching: boolean;\n}\n\n/**\n * Used to fetch multiple items by id with Flight. Will fetch 25 items at a time firing off multiple\n * requests if there are more than 25 items.\n * This will return items as null until we have all our items. Items will be returned as an object with\n * their ids as they key for easy mapping\n * \n * @param itemIds \n * @param getRequest \n */\nexport function useBatchFetch<T extends BaseObject>(\n itemIds: string[],\n getRequest: (ids: string[]) => Flight.Request\n): UseBatchFetchResult<T> {\n const chunks = ArrayHelper.chunk<string>(itemIds, CHUNK_SIZE);\n\n const requests = chunks.map(chunk => getRequest(ArrayHelper.uniq(chunk)));\n\n const responses = Flight.useBasicFetchAll<T[]>(requests);\n\n const itemsArr = ArrayHelper.flatten(responses.data);\n const items = responses.data.length\n ? itemsArr.reduce((acc, item) => ({ ...acc, [item.id]: item }), {})\n : null;\n\n return {\n itemsArr,\n items,\n isFetching: responses.isFetching\n };\n}\n\n/**\n * When you need the useBatchFetch() behavior, but your list of objects to hydrate\n * will grow, such as on a scrolling page. useGrowingBatchFetch() will use local state\n * to determine what we've already built a request for and what items are new\n * as to not re-fetch items - Sha\n */\nexport function useGrowingBatchFetch<T>(\n objs: T[],\n getRequest: (items: T[]) => Flight.Request,\n _getKey?: (obj: T) => string\n) {\n const getKey = _getKey || ((obj: any) => {\n if (typeof obj === 'object')\n return obj.id;\n\n return obj;\n });\n\n const fetchedItems = React.useRef<Set<string>>(new Set<string>());\n\n const [ requests, setRequests ] = React.useState<Flight.Request[]>([]);\n\n React.useEffect(() => {\n if (!objs?.length)\n return;\n\n const unfetchedItems: T[] = [];\n \n objs.forEach(obj => {\n const key = getKey(obj);\n\n if (fetchedItems.current.has(key))\n return;\n\n unfetchedItems.push(obj);\n fetchedItems.current.add(key);\n });\n \n if (!unfetchedItems.length)\n return;\n\n setRequests(r => ([ ...r, ...ArrayHelper.chunk<T>(unfetchedItems, CHUNK_SIZE).map(getRequest) ]));\n }, [objs?.length]);\n\n const responses = Flight.useBasicFetchAll<T[]>(requests);\n\n const itemsArr = ArrayHelper.flatten(responses.data);\n const items = responses.data.length\n ? itemsArr.reduce((acc, item) => ({ ...acc, [getKey(item)]: item }), {})\n : null;\n\n return {\n hasFirstRequestCompleted: !!responses.responses?.[0]?.hasCompleted,\n itemsArr,\n items,\n isFetching: responses.isFetching\n };\n}","import { useEffect } from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst SCROLL_TOLERANCE = 400; // value in px\n\ninterface UseInfiniteScrollOptions {\n fetchNextPage: () => void;\n hasMore: boolean;\n isFetching: boolean;\n scrollContainer?: HTMLElement;\n}\n\nexport function useInfiniteScroll(options: UseInfiniteScrollOptions): void {\n const handleScroll = (): void => {\n if (options.isFetching)\n return;\n\n if (!options.scrollContainer) {\n const currentScrollHeight = window.innerHeight + document.documentElement.scrollTop;\n \n const totalHeight = document.documentElement.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n } else {\n const { scrollContainer } = options;\n const currentScrollHeight = scrollContainer.getBoundingClientRect().height + scrollContainer.scrollTop;\n \n const totalHeight = scrollContainer.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n }\n\n options.fetchNextPage();\n };\n\n useEffect(() => {\n const onScroll = FunctionHelper.throttle(handleScroll, 200);\n\n const scrollContainer = options.scrollContainer || window;\n\n if (options.hasMore)\n scrollContainer.addEventListener('scroll', onScroll);\n\n return () => scrollContainer.removeEventListener('scroll', onScroll);\n }, [ options.hasMore, options.fetchNextPage, options.scrollContainer ]);\n}","import { useEffect, useState } from 'react';\n\nimport { HttpStatus, HttpStatusClass } from 'libs/common/backbone/enums/HttpStatus';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { BaseObject, BasePaginatedCollection } from 'libs/shared/interfaces';\n\nimport { useInfiniteScroll } from './UseInfiniteScroll';\nimport { useSelectAllPages } from './UseSelectAllPages';\n\nexport interface UseInfiniteListResult<T extends BaseObject> {\n items: T[];\n hasMore: boolean;\n isFetching: boolean;\n nextCursor: string;\n totalItems?: number;\n hasFirstPageCompleted: boolean;\n}\n\n/**\n * Hook to extract an infinite list from the application state,\n * save it locally in state and only update when new data\n * is fetched.\n * \n * @param getRequest - callback function to get the request for each page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n * \n * @param fetchNext - callback function to fetch a page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n */\nexport function useInfiniteList<TObject = BaseObject, TResponse = BasePaginatedCollection<TObject>>(\n getRequest: ((cursor?: string) => Flight.Request) | false,\n fetchNext: ((cursor?: string) => void) | false,\n onError?: (pageNumber: number, statusCode: HttpStatus) => void,\n getItems?: (responseData: TResponse) => TObject[],\n getCursor?: (responseData: TResponse) => string,\n scrollContainer?: HTMLElement\n): UseInfiniteListResult<TObject> {\n const [ pagesFetched, setPagesFetched ] = useState(0);\n\n const fetchNextFn = fetchNext as (cursor?: string) => void;\n\n function getKey(cursor?: string): string {\n if (!getRequest)\n return null;\n\n const request = getRequest(cursor);\n\n if (!request)\n return null;\n\n return request.key;\n }\n\n const response = useSelectAllPages<TObject, TResponse>(\n getKey,\n getItems,\n getCursor\n );\n\n function fetchNextPage(): void {\n if (!fetchNext || !getRequest || !response)\n return;\n\n setPagesFetched(currentVal => currentVal + 1);\n return fetchNextFn(response.nextCursor);\n }\n\n useInfiniteScroll({\n fetchNextPage,\n hasMore: !!response?.nextCursor,\n isFetching: response?.isFetching,\n scrollContainer\n });\n\n useEffect(() => {\n if (!response)\n return;\n\n if (response.shouldInitialFetch && fetchNext) {\n fetchNextFn();\n setPagesFetched(currentVal => currentVal + 1);\n }\n }, [ response?.shouldInitialFetch, fetchNext ]);\n\n useEffect(() => {\n if (!response?.statusCode || !FunctionHelper.isFunction(onError))\n return;\n\n const httpStatusClass: HttpStatusClass = +(response.statusCode?.toString()?.substr(0, 1));\n\n if (httpStatusClass !== HttpStatusClass.ClientError && httpStatusClass !== HttpStatusClass.ServerError)\n return;\n\n onError(pagesFetched, response.statusCode);\n }, [response?.statusCode]);\n\n return {\n items: response?.items,\n hasMore: !!response?.nextCursor,\n nextCursor: response?.nextCursor,\n isFetching: response?.isFetching,\n totalItems: response?.totalItems,\n hasFirstPageCompleted: response?.hasFirstPageCompleted\n };\n}","\nimport { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { VideoHistoryCollection } from 'libs/shared/interfaces';\n\nexport const VideoHistoryRequests = {\n userVideoHistory(\n cursor?: string,\n success?: (data: HashObject) => void,\n error?: (Xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n let key = 'video:history';\n let url = `{gateway}/v1/users/me/watch-history`;\n\n if (cursor) {\n key += `:${cursor}`;\n url += `?cursor=${cursor}`;\n }\n\n return {\n key,\n url,\n formatData: (historyCollection: VideoHistoryCollection) => {\n return {\n data: historyCollection.data.map(historyData => {\n // Convert last watched times from UTC to local time\n const lastTimeWatchedLocal = DateHelper.format(historyData.lastTimeWatched);\n const lastDateWatchedLocal = DateHelper.format(lastTimeWatchedLocal, 'YYYY-MM-DD');\n\n return {\n ...historyData,\n lastTimeWatched: lastTimeWatchedLocal,\n lastDateWatched: lastDateWatchedLocal\n };\n }),\n pagination: historyCollection.pagination\n };\n },\n success,\n error,\n always\n };\n },\n\n videoHistory(\n ids: string[],\n namespace?: string,\n success?: (data: HashObject) => void,\n error?: (Xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n const params = ids.sort().map(i => `videoId=${i}`);\n\n return {\n key: `video:history:videos:${params.join('&')}`,\n url: `{gateway}/v1/videos/history?${params.join('&')}`,\n normalizeOptions: {\n namespace\n },\n formatData: (historyCollection: HashObject[]) => {\n if (!historyCollection?.length)\n return historyCollection;\n\n /**\n * Data is formatted to enable it to be merged with the existing video object in the store\n * Where we need to merge more history properties with the video object, map them below.\n */\n return historyCollection.map((watchHistory: HashObject) => ({\n id: watchHistory.videoId,\n lastProgressPoint: watchHistory.lastProgressPoint\n }));\n },\n success,\n error,\n always\n };\n },\n\n removeFromHistory(videoId: string, invalidationKeys: string[] = []): Flight.Request {\n return {\n url: `{gateway}/v1/users/me/videos/${videoId}/watch-history`,\n key: `remove:video:history:${videoId}`,\n type: HttpVerbs.DELETE,\n invalidationKeys: [\n 'video:history',\n ...invalidationKeys\n ]\n };\n }\n};","import * as 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';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { VideoList } from 'libs/shared/components/video-list/VideoList';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { PresentationAudience, VideoHistory, VideoTypes } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\n\nimport { InteractiveHelpers } from 'shared/utils/InteractiveHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nconst namespace = 'watchHistory.watchHistoryVideoList';\n\nfunction formatDate(date: string): string {\n const diff = DateHelper.timeSince(new Date(date), 'day');\n\n if (diff === 0)\n return LanguageService.getPhrase(namespace, 'today');\n\n if (diff === 1)\n return LanguageService.getPhrase(namespace, 'yesterday');\n\n return DateHelper.format(date, 'Do MMMM');\n}\n\ninterface WatchHistoryVideoListProps {\n videoHistory: VideoHistory[];\n videos: VideoTypes[];\n presentationAudiences?: PresentationAudience[];\n commonVideoProps: CommonVideoProps;\n}\n\nexport function WatchHistoryVideoList(props: WatchHistoryVideoListProps): JSX.Element {\n const { hasPermissions } = usePermissions();\n\n const historyGroups = ArrayHelper.groupBy(props.videoHistory, 'lastDateWatched');\n\n const videoGroups: { [index: string]: VideoTypes[] } = {};\n\n const sortedDates = Object.keys(historyGroups).sort().reverse();\n\n // Map video history to video objects and mixin lastProgressPoint\n sortedDates.forEach(date => {\n videoGroups[date] = historyGroups[date].map(history => {\n const video = props.videos.find(v => v.id.toString() === history.videoId.toString());\n\n if (!video)\n return null;\n\n return {\n ...video,\n lastProgressPoint: history.lastProgressPoint\n };\n }).filter(Boolean);\n });\n\n const sortedDatesGroupCount = sortedDates.reduce((dateCounts: HashObject, currentDate: string) => {\n const dateTotal = videoGroups[currentDate].length;\n const runningTotal = dateTotal + (dateCounts.runningTotal ?? 0);\n\n return {\n ...dateCounts,\n runningTotal,\n [currentDate]: runningTotal - dateTotal\n };\n }, {});\n\n return (\n <>\n {sortedDates.map(date => {\n // TODO: Fix bug where watch history endpoint returns workspace videos that cannot be fetched/displayed.\n // This is caused by 1 user sharing their workspace video with another user.\n if (!videoGroups[date].length)\n return <React.Fragment key={date}></React.Fragment>;\n\n return (\n <div key={date} className='pb-3'>\n <h2 className='h4'>{formatDate(date)}</h2>\n <VideoList\n videos={videoGroups[date]}\n getVideoAppLink={VideoAppLinkHelper.getAppLink}\n hasPermissions={hasPermissions}\n startingPositionIndex={sortedDatesGroupCount[date]}\n presentationAudiences={props.presentationAudiences}\n getPreviewQuestionsAppLink={interactive => InteractiveHelpers.getPreviewQuestionsAppLink(interactive)}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n })}\n </>\n );\n}","import { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { LocalPermissionName } from 'libs/shared/enums/PermissionName';\nimport { handleHttpError } from 'libs/shared/errors/handlers/HttpErrorHandlers';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useGrowingBatchFetch } from 'libs/shared/hooks/UseBatchFetch';\nimport { useInfiniteList } from 'libs/shared/hooks/UseInfiniteList';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { CurrentUser, VideoHistory } from 'libs/shared/interfaces';\n\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\n\nimport { VideoHistoryRequests } from '../flight-requests/VideoHistoryRequests';\n\nconst namespace = 'watchHistory.hooks';\n\nexport function useWatchHistory() {\n const fetch = Flight.useGetFetch();\n const alerts = useAlerts();\n const { hasLocalPermissions } = usePermissions();\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n function getUserVideoHistoryRequest(cursor?: string) {\n return VideoHistoryRequests.userVideoHistory(cursor);\n }\n\n function fetchNext(cursor?: string) {\n return fetch(getUserVideoHistoryRequest(cursor));\n }\n\n function onError(pageNumber: number, httpStatus: HttpStatus): void {\n if (pageNumber === 1)\n return handleHttpError(httpStatus);\n \n alerts.error(LanguageService.getPhrase(namespace, 'error'));\n }\n\n const shouldFetch = !hasLocalPermissions(LocalPermissionName.ViewWatchHistoryLanding) && currentUser.hasCompleted;\n\n const {\n items: videoHistory,\n hasMore,\n isFetching\n } = useInfiniteList<VideoHistory>(shouldFetch ? getUserVideoHistoryRequest : false, fetchNext, onError);\n\n const videos = videoHistory?.map(v => v.object) ?? [];\n \n // Hydrate the videos\n const hydratedVideos = useGrowingBatchFetch(videos.map(v => v.id), VideoRequests.watchHistoryVideos);\n\n useVideoMixin(videos);\n\n return {\n videoHistory,\n videos,\n fetchNext,\n isFetching,\n hasMore,\n hasFetchedFirstPage: hydratedVideos.hasFirstRequestCompleted\n };\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { VideoActionsOptions } from 'libs/shared/context/VideoActionsContext';\nimport { Video, VideoTypes } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\n\nconst namespace = 'watchHistory.hooks';\n\nexport function useWatchHistoryViewActions(removeFromVideoHistory: (v: Video) => void) {\n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n\n const getVideoActions = (video: VideoTypes, options?: VideoActionsOptions) => {\n const removeFromWatchHistoryAction = {\n label: LanguageService.getPhrase(namespace, 'removeFromWatchHistory'),\n button: false,\n svgName: cvSvgLibrary.Delete,\n className: 'text-danger',\n onClick: () => {\n removeFromVideoHistory(video);\n },\n // Event logging for this action is handled by the `removeFromVideoHistory` callback\n group: 'delete'\n };\n\n return [ ...videoActions.getVideoActions(video, options), removeFromWatchHistoryAction ];\n };\n\n return {\n ...videoActions,\n getVideoActions\n };\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType, LocationContext, SignUpDescriptors, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'watchHistory.watchHistoryEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface WatchHistoryEmptyStateProps {\n hasDiscover: boolean;\n}\n\nexport function WatchHistoryEmptyState({ hasDiscover }: WatchHistoryEmptyStateProps): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.WATCH_HISTORY} altText={getPhrase('info')} />\n\n <EmptyState.Heading><Text phrase='heading' /></EmptyState.Heading>\n <EmptyState.Info><Text phrase='info' /></EmptyState.Info>\n\n {hasDiscover &&\n <EmptyState.Cta\n text={LanguageService.getPhrase(namespace, 'cta')}\n appLink={{\n application: AppChannels.DASHBOARD,\n action: Actions.Dashboard.HOME\n }}\n />\n }\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}\n\nexport function WatchHistoryPublicEmptyState(): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.WATCH_HISTORY_PUBLIC} altText={getPhrase('publicInfo')}/>\n <EmptyState.Heading><Text phrase='publicHeading' /></EmptyState.Heading>\n <EmptyState.Info><Text phrase='publicInfo' /></EmptyState.Info>\n <EmptyState.Cta\n text={LanguageService.getPhrase(namespace, 'publicCta')}\n appLink={{\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.SIGN_UP\n }}\n analyticsData={{}}\n analyticsOptions={{\n actionType: UserAction.Click,\n location: LocationContext.WatchHistoryLanding,\n entity: EntityType.AppLink,\n workflowPhase: WorkflowPhase.Start,\n descriptor: SignUpDescriptors.SignUp\n }}\n />\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialDate\":\"vq4eE\"};","import React from 'react';\n\nimport { PartialVideoList } from 'libs/shared/components/video-list/partial-loading/PartialVideoList';\n\nimport styles from './partial-watch-history.scss';\n\nexport function PartialWatchHistory(): JSX.Element {\n return (\n <>\n <div className='mb-3'>\n <div className={`${styles.partialDate} mb-2 partial-loading-background`} />\n <PartialVideoList numVideos={2} />\n </div>\n\n <div className='mb-3'>\n <div className={`${styles.partialDate} mb-2 partial-loading-background`} />\n <PartialVideoList numVideos={3} />\n </div>\n\n <div className='mb-3'>\n <div className={`${styles.partialDate} mb-2 partial-loading-background`} />\n <PartialVideoList numVideos={2} />\n </div>\n\n <div className='mb-3'>\n <div className={`${styles.partialDate} mb-2 partial-loading-background`} />\n <PartialVideoList numVideos={5} />\n </div>\n </>\n );\n}","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction, VideoActionDescriptor } from 'libs/analytics/interfaces';\n\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { LocalPermissionName, PermissionName } from 'libs/shared/enums/PermissionName';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Video } from 'libs/shared/interfaces';\n\nimport { useCommonVideoProps } from 'shared/hooks/useCommonVideoProps';\nimport { usePresentationAudiences } from 'shared/hooks/usePresentationAudiences';\n\nimport { WatchHistoryVideoList } from 'apps/watch-history/components/watch-history-video-list/WatchHistoryVideoList';\nimport { VideoHistoryRequests } from 'apps/watch-history/flight-requests/VideoHistoryRequests';\nimport { useWatchHistory } from 'apps/watch-history/hooks/useWatchHistory';\nimport { useWatchHistoryViewActions } from 'apps/watch-history/hooks/useWatchHistoryVideoActions';\n\nimport { WatchHistoryEmptyState, WatchHistoryPublicEmptyState } from './empty-state/WatchHistoryEmptyState';\nimport { PartialWatchHistory } from './partial-loading/PartialWatchHistory';\n\nconst namespace = 'watchHistory.watchHistory';\n\nexport function WatchHistoryView(): JSX.Element {\n useSetPageMetadata({ title: LanguageService.getPhrase(namespace, 'pageTitle') });\n const fetchAsync = Flight.useGetFetchAsync();\n const { hasPermissions, hasLocalPermissions } = usePermissions();\n const alerts = useAlerts();\n\n const { commonVideoProps } = useCommonVideoProps({ locationContext: LocationContext.VideoThumbnail });\n const videoActions = useWatchHistoryViewActions(removeFromVideoHistory);\n\n const {\n videoHistory,\n videos,\n fetchNext,\n hasMore,\n hasFetchedFirstPage,\n isFetching\n } = useWatchHistory();\n\n async function removeFromVideoHistory(video: Video): Promise<void> {\n try {\n await fetchAsync<void>(VideoHistoryRequests.removeFromHistory(video.id));\n\n alerts.success(LanguageService.getPhrase(namespace, 'removeFromHistorySuccess'));\n\n AnalyticsHelper.logUserAction({\n id: video.id,\n name: video.name\n }, {\n entity: EntityType.Video,\n actionType: UserAction.Click,\n descriptor: VideoActionDescriptor.RemoveFromWatchHistory,\n location: LocationContext.VideoListItem\n });\n } catch {\n alerts.error(LanguageService.getPhrase(namespace, 'removeFromHistoryError', { name: video.name }));\n }\n }\n \n const audiences = usePresentationAudiences();\n\n if (hasLocalPermissions(LocalPermissionName.ViewWatchHistoryLanding))\n return <WatchHistoryPublicEmptyState />;\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <div className='px-3'>\n <h1 className='h2'><Text phrase='heading' /></h1>\n {(() => {\n if (!hasFetchedFirstPage)\n return <PartialWatchHistory />;\n\n if (!videos.length)\n return <WatchHistoryEmptyState hasDiscover={hasPermissions(PermissionName.ViewDiscover)} />;\n\n return (\n <VideoActionsContext.Provider value={videoActions}>\n <WatchHistoryVideoList\n videoHistory={videoHistory}\n videos={videos}\n presentationAudiences={audiences.data}\n commonVideoProps={commonVideoProps}\n />\n {(hasMore || isFetching) && <InfiniteScrollFooter isFetching={isFetching} fetchNext={fetchNext} />}\n </VideoActionsContext.Provider>\n );\n })()}\n </div>\n </LanguageNamespaceContext.Provider>\n );\n}","import { Core } from 'libs/common/backbone/index';\nimport { Flight } from 'libs/common/react/index';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, CurrentUser, VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\n\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { SeriesAppLinkHelper } from 'apps/series/SeriesAppLinkHelper';\n\nimport { usePluginHelper } from './use-plugin-helper/usePluginHelper';\nimport { useLiteFavourites } from './useLiteFavourites';\n\ninterface UseCommonVideoPropsResult {\n hasCommonVideoPropsCompleted: boolean;\n commonVideoProps: CommonVideoProps;\n}\n\ninterface UseCommonVideoPropsOptions {\n locationContext: LocationContext,\n mtv?: boolean;\n flightNamespace?: string;\n sharedPlaylist?: boolean;\n}\n\nexport function useCommonVideoProps(options: UseCommonVideoPropsOptions): UseCommonVideoPropsResult {\n const { locationContext, mtv, flightNamespace, sharedPlaylist } = options || {};\n\n const { isPlugin } = usePluginHelper();\n const { setFavourite, canFavourite } = useLiteFavourites(locationContext, flightNamespace);\n const { hasTopicDirectories, isLoadingSettings } = useSettings(null);\n const { hasPermissions, isLoaded: hasLoadedPermissions } = usePermissions();\n const hasStudentExperience = hasPermissions(PermissionName.StudentExperience);\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n function getSubTextAppLink(video: VideoTypes): Core.AppLink {\n if (!('series' in video))\n return null;\n\n /**\n * We do not allow navigating to series on shared playlists when the user is not signed in\n * because most series are customer created and will be empty for public users\n * \n * We do not have to do this for shared series, because all the series links are self referencing\n * - Sha\n */\n if (sharedPlaylist && !currentUser.data?.isAuthenticated)\n return null;\n \n return SeriesAppLinkHelper.getSeriesAppLink(video.series, { mtv });\n }\n\n const hasCommonVideoPropsCompleted = (\n !isLoadingSettings &&\n hasLoadedPermissions &&\n config.hasCompleted &&\n currentUser.hasCompleted &&\n (!currentUser.data?.isAuthenticated || yearGroups.hasCompleted)\n );\n\n return {\n hasCommonVideoPropsCompleted,\n commonVideoProps: {\n subTextType: 'series',\n getSubTextAppLink,\n isPlugin,\n canFavourite,\n setFavourite,\n imageCdnUrl: config.data?.imageCdnUrl,\n yearGroups: yearGroups.data,\n getClassroomGuideAppLink: VideoAppLinkHelper.getClassroomGuideAppLink,\n getInteractiveGuidanceAppLink: VideoAppLinkHelper.getInteractiveGuidanceAppLink,\n getResourceGuidanceAppLink: VideoAppLinkHelper.getResourceGuidanceAppLink,\n showNewVideoIndicator: hasTopicDirectories,\n companyLogoFallbackUrl: null,\n hasStudentExperience\n }\n };\n}","import { Flight } from 'libs/common/react/index';\n\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nimport { usePresentation } from 'shared/hooks/usePresentation';\n\nexport const usePresentationAudiences = () => {\n const { activePresentation, getFallbackPresentation } = usePresentation({ redirectOnError: true });\n\n const presentation = activePresentation || getFallbackPresentation();\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n !!presentation &&\n AudienceRequests.presentationAudiences(presentation.id)\n );\n\n return audiences;\n};","import { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useGrowingBatchFetch } from 'libs/shared/hooks/UseBatchFetch';\nimport { Clip, ClipCollection, Video, VideoCollection } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\ntype Types = Video[] | VideoCollection | Clip[] | ClipCollection;\n\nfunction getValidObjects(objects: Types): (Video | Clip)[] {\n if (!objects)\n return [];\n\n if (Array.isArray(objects))\n return objects.filter(o => !!o && (VideoHelper.isVideo(o) || VideoHelper.isClip(o)));\n\n if ('data' in objects)\n return objects.data.filter(o => !!o && (VideoHelper.isVideo(o) || VideoHelper.isClip(o)));\n\n return [];\n}\n\ninterface VideoMixinOptions {\n /**\n * If the videos that are having new data mixed into are sitting on an explicit Flight namespace,\n * providing that namespace here is required\n */\n flightNamespace?: string;\n}\n\nexport function useVideoMixin(objects: Types, options: VideoMixinOptions = {}): void {\n const videoIds = getValidObjects(objects).map(v => v.id);\n\n useGrowingBatchFetch(videoIds, ids => VideoRequests.videoMixinAssocs(ids, options.flightNamespace));\n}"],"names":["defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","internalServerError","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","CHUNK_SIZE","useBatchFetch","itemIds","getRequest","requests","map","chunk","responses","itemsArr","data","items","length","reduce","acc","item","id","isFetching","useGrowingBatchFetch","objs","_getKey","getKey","obj","fetchedItems","Set","setRequests","unfetchedItems","forEach","key","current","has","push","add","r","hasFirstRequestCompleted","hasCompleted","SCROLL_TOLERANCE","useInfiniteList","fetchNext","onError","getItems","getCursor","scrollContainer","options","handleScroll","useState","pagesFetched","setPagesFetched","fetchNextFn","response","cursor","request","fetchNextPage","currentVal","nextCursor","hasMore","getBoundingClientRect","height","scrollTop","scrollHeight","window","innerHeight","document","documentElement","useEffect","onScroll","FunctionHelper","addEventListener","removeEventListener","shouldInitialFetch","httpStatusClass","toString","substr","HttpStatus","totalItems","hasFirstPageCompleted","VideoHistoryRequests","userVideoHistory","success","error","always","url","formatData","historyCollection","historyData","lastTimeWatchedLocal","lastTimeWatched","lastDateWatchedLocal","lastDateWatched","pagination","videoHistory","ids","namespace","params","sort","i","join","normalizeOptions","watchHistory","videoId","lastProgressPoint","removeFromHistory","invalidationKeys","type","WatchHistoryVideoList","props","hasPermissions","usePermissions","historyGroups","ArrayHelper","videoGroups","sortedDates","Object","keys","reverse","date","history","video","videos","find","v","filter","Boolean","sortedDatesGroupCount","dateCounts","currentDate","dateTotal","runningTotal","className","diff","DateHelper","Date","LanguageService","formatDate","VideoList","getVideoAppLink","VideoAppLinkHelper","startingPositionIndex","presentationAudiences","getPreviewQuestionsAppLink","interactive","InteractiveHelper","commonVideoProps","getPhrase","WatchHistoryEmptyState","hasDiscover","value","EmptyState","src","ImageUrls","altText","Text","phrase","text","appLink","application","action","WatchHistoryPublicEmptyState","analyticsData","analyticsOptions","actionType","location","entity","workflowPhase","descriptor","SignUp","PartialWatchHistory","PartialVideoList","numVideos","WatchHistoryView","useSetPageMetadata","title","fetchAsync","hasLocalPermissions","alerts","useCommonVideoProps","locationContext","videoActions","useVideoActions","getVideoActions","removeFromWatchHistoryAction","label","button","svgName","onClick","AnalyticsHelper","name","removeFromVideoHistory","group","useWatchHistoryViewActions","fetch","currentUser","UserRequests","getUserVideoHistoryRequest","shouldFetch","pageNumber","httpStatus","object","hydratedVideos","VideoRequests","useVideoMixin","hasFetchedFirstPage","useWatchHistory","audiences","usePresentationAudiences","VideoActionsContext","InfiniteScrollFooter","PermissionName","mtv","flightNamespace","sharedPlaylist","isPlugin","u","setFavourite","canFavourite","hasTopicDirectories","isLoadingSettings","hasLoadedPermissions","isLoaded","hasStudentExperience","config","yearGroups","isAuthenticated","customerId","hasCommonVideoPropsCompleted","subTextType","getSubTextAppLink","series","imageCdnUrl","getClassroomGuideAppLink","getInteractiveGuidanceAppLink","getResourceGuidanceAppLink","showNewVideoIndicator","companyLogoFallbackUrl","redirectOnError","activePresentation","getFallbackPresentation","presentation","objects","videoIds","Array","isArray","o","getValidObjects"],"sourceRoot":""}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[9352],{39157:(e,t,n)=>{n.d(t,{HI:()=>d,R6:()=>o,Rt:()=>g,UU:()=>m,Zs:()=>u,nq:()=>p});var r=n(75896),a=n(94892),s=n(28972),i=n(8246),c=n(83140),l=n(80845);function o(e,t,n){var s={markingRequired:[],lowScore:[],highScore:[],completed:[],notCompleted:[]},i=(0,l.Q)(e).length;t.students.forEach((function(t){var c=Object.assign(Object.assign({},t),{summary:g(e,t)});c.summary.awaitingMarking?s.markingRequired.push(c):r.m.last(t.results).attempts.length===i?(s.completed.push(c),c.summary.percentCorrect>=((null==n?void 0:n.HIGH)||a.i.HIGH)&&s.highScore.push(c),c.summary.percentCorrect<((null==n?void 0:n.MODERATE)||a.i.MODERATE)&&s.lowScore.push(c)):s.notCompleted.push(c)}));var c=r.m.sortBy(s.lowScore,(function(e){return e.summary.percentCorrect})),o=r.m.sortBy(s.highScore,(function(e){return-e.summary.percentCorrect}));return Object.assign(Object.assign({},s),{lowScore:c,highScore:o})}function u(e,t){return(0,l.Wn)(e).find((function(e){return e.id.toString()===t.toString()}))}function m(e){return"".concat(e.questionId,":").concat(e.resultId)}function d(e,t,n){var r=(0,l.j_)(t),a=(0,l.f6)(e,r);return(null==a?void 0:a.answers.every((function(e){var t;return(null===(t=n[m(e)])||void 0===t?void 0:t.status)===i.N.Correct})))?i.N.Correct:(null==a?void 0:a.answers.every((function(e){var t;return(null===(t=n[m(e)])||void 0===t?void 0:t.status)===i.N.Incorrect})))?i.N.Incorrect:void 0}function p(e,t){var n=t.students.length,r=0,a=0,i=0,o=0,u=0;return t.students.forEach((function(t){var n=(0,l.j_)(t);if(n){u+=t.results.length;var m=c.A.isInteractionCorrect(e,n);m===s.w.Correct&&r++,m===s.w.UnAnswered&&i++,m===s.w.AwaitingMarking&&o++,m!==s.w.UnAnswered&&a++}})),{percentCorrect:n>0?r/n:0,correct:r,answered:a,unanswered:i,awaitingMarking:o,attempts:u}}function g(e,t){var n=(0,l.j_)(t),r=(0,l.Q)(e),a=r.length,i=0,o=0;r.forEach((function(e){var t=c.A.isInteractionCorrect(e,n);t===s.w.Correct&&i++,t===s.w.AwaitingMarking&&o++}));var u=a>0?i/a:0,m=new Set(r.map((function(e){return e.id}))),d=n.attempts.filter((function(e){var t;return!!m.has(null===(t=null==e?void 0:e.answers[0])||void 0===t?void 0:t.questionId)})).length;return{answered:d,attempts:t.results.length,unanswered:a-d,percentCorrect:u,correct:i,awaitingMarking:o}}},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:()=>v});var r=n(28972),a=n(8246),s=n(38129);function i(e){return i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i(e)}function c(e,t,n){return(t=function(e){var t=function(e){if("object"!=i(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=i(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==i(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(){return r.w.NotApplicable}function o(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 p(e,t){return function(e,t){var n;return e.actionableItems.forEach((function(e){var s=t(e.id);n=s?s.status!==a.N.Correct?s.status!==a.N.Incorrect?r.w.AwaitingMarking:r.w.Incorrect:r.w.Correct:r.w.UnAnswered})),n}(e,m(e,t))}var g=c(c(c(c(c(c(c({},s.Z9.Annotation,l),s.Z9.Image,l),s.Z9.MissingWord,(function(e,t){var n=m(e,t);return o(e,(function(e){var t=n(e);return null==t?void 0:t.text}))})),s.Z9.MultipleChoice,d),s.Z9.ShortAnswer,p),s.Z9.TrueOrFalse,d),s.Z9.Illustration,p),v={notApplicable:l,awaitingMarking:function(){return r.w.AwaitingMarking},isMissingWordCorrect:o,isMultipleChoiceCorrect:u,isInteractionCorrect:function(e,t){return(0,g[e.typeId])(e,t)}}},80845:(e,t,n)=>{n.d(t,{Q:()=>o,Wn:()=>i,f6:()=>l,j_:()=>c});var r=n(75896),a=n(38129);function s(e){return e.typeId!==a.Z9.Annotation&&e.typeId!==a.Z9.Image}function i(e){return r.m.flatten(e.timepoints.map((function(e){return e.interactions})))}function c(e){return r.m.last(e.results)}function l(e,t){return r.m.findWhere(null==t?void 0:t.attempts,{id:e})}function o(e){return i(e).filter(s)}},89352:(e,t,n)=>{n.d(t,{m:()=>ie});var r=n(32735),a=n(23481),s=n(84621),i=n(21976),c=n(70072),l=n(83345),o=n(35223);const u={tealChart:"lZZf0",grayChart:"wJQc4"};function m(e){return m="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},m(e)}function d(e){return function(e){if(Array.isArray(e))return g(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||p(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function p(e,t){if(e){if("string"==typeof e)return g(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)?g(e,t):void 0}}function g(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 v="shared.insightAverageAttempts",f=a.T.encloseNamespace(v);function h(e){var t,n,a=function(){var t=e.students.reduce((function(e,t){var n,r,a,s=t.summary.attempts.toString();return s in e||Object.assign(e,(n={},a=0,(r=function(e){var t=function(e){if("object"!=m(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=m(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==m(t)?t:t+""}(r=s))in n?Object.defineProperty(n,r,{value:a,enumerable:!0,configurable:!0,writable:!0}):n[r]=a,n)),e[s]++,e}),{});return Object.keys(t).length?t:{0:0}}(),g=Math.max.apply(Math,d(Object.keys(a).map((function(e){return a[e]})))),h=Object.keys(a).reduce((function(e,t){return a[t]===g?[].concat(d(e),[t]):e}),[]),y=(t=0===a[0],{categories:Object.keys(a),series:[{type:"column",color:a[0]?"#EAEAEA":"#40C2BB",borderRadius:4,dataLabels:{enabled:!t,style:c.d,inside:!1,overflow:"allow",crop:!1},data:Object.keys(a).map((function(e){var n=0!==g&&a[e]===g;return{className:"".concat(t?u.grayChart:u.tealChart," ").concat(a[e]!==g&&0!==a[e]?"opacity-25":""),borderWidth:n?2:0,borderColor:n?"black":"",y:a[e]}}))}]});return r.createElement(s.L,{title:f("title"),svgName:o.vn.Refresh,svgClassName:"bg-light-purple text-purple"},r.createElement("p",null,h.length?r.createElement(l.x,{namespace:v,phrase:"averageAttempts",options:{smartCount:(n=Object.entries(a).reduce((function(e,t){var n,r,a=(r=2,function(e){if(Array.isArray(e))return e}(n=t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,s,i,c=[],l=!0,o=!1;try{if(s=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=s.call(n)).done)&&(c.push(r.value),c.length!==t);l=!0);}catch(e){o=!0,a=e}finally{try{if(!l&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(o)throw a}}return c}}(n,r)||p(n,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.")}()),s=a[0],i=a[1];return e.totalAttempts+=+s*i,e.totalUsers+=i,e}),{totalAttempts:0,totalUsers:0}),0===n.totalUsers?0:Math.round(n.totalAttempts/n.totalUsers*100)/100)}}):r.createElement(l.x,{namespace:v,phrase:"noAttempts"})),r.createElement("div",{className:"mt-auto"},r.createElement(i.x,{label:f("attempts"),chartData:y})))}var y=n(75896);const b={redChart:"G7zOw",yellowChart:"k34mm",greenChart:"vBneA",blueChart:"RPTWm",grayChart:"k4JFZ",borderDark:"LWor3"};var E="shared.insightAverageScore",k=a.T.encloseNamespace(E);function A(e){return r.createElement(s.L,{title:k("title"),svgName:o.vn.Analytics,svgClassName:"bg-light-orange text-orange"},r.createElement("p",null,e.students.length?r.createElement(l.x,{namespace:E,phrase:"averageScore",options:(c=e.students.map((function(e){return e.summary.percentCorrect})),u=c.reduce((function(e,t){return e+t}),0)/c.length,m=y.m.last(y.m.last(e.students).results).attempts.length,{averageScore:Math.round(m*u),totalQuestions:m,averagePercentage:(100*u).toFixed(1)})}):r.createElement(l.x,{namespace:E,phrase:"noAnswers"})),r.createElement(i.x,{label:"".concat(k("studentScores")," (%)"),chartData:(t=Array(11).fill(0),n=e.students.reduce((function(e,t){return e[Math.floor(10*t.summary.percentCorrect)]++,e}),t),a=["0","10","20","30","40","50","60","70","80","90","100"],{categories:a,series:[{type:"column",color:"#4E9ACE",borderRadius:4,data:n.map((function(e,t){var n=Number(a[t]);return{className:"".concat(function(e,t){return 0===t?b.grayChart:e<50?b.redChart:e<70?b.yellowChart:e<90?b.greenChart:b.blueChart}(n,e)),y:e}}))}]})}));var t,n,a,c,u,m}var w=n(98551),C=a.T.encloseNamespace("shared.insightCompletedStudents");function N(e){return r.createElement(s.L,{title:C("title"),svgName:o.vn.Flag,svgClassName:"bg-light-indigo text-indigo",count:e.students.length},r.createElement(w.y,{students:e.students.map((function(e){return Object.assign(Object.assign({},e.user),{percentage:e.summary.percentCorrect})})),imageCdnUrl:e.imageCdnUrl,imageUrl:e.imageUrl,description:C("completedStudents"),appLink:e.resultsAppLink,appLinkText:C("viewAll"),anonymiseUsers:e.anonymiseUsers}))}var S=n(51870),I=n(39157),U=n(15611),L=n(86572),j=n(40782),O=n(80845),M="shared.insightEasiestQuestion",x=a.T.encloseNamespace(M);function q(e){var t,n=r.useMemo((function(){return t=e.interactive,n=e.results,r=(0,O.Q)(t).map((function(e){return Object.assign(Object.assign({},e),{resultsSummary:(0,I.nq)(e,n)})})).filter((function(e){return!!e.resultsSummary.answered&&!e.resultsSummary.awaitingMarking})),a=y.m.sortBy(r,(function(e){return e.resultsSummary.percentCorrect})),y.m.last(a);var t,n,r,a}),[e.results.students.length]);return r.createElement(s.L,{title:x("title"),svgName:o.vn.StarOutline,svgClassName:"bg-light-blue text-blue"},r.createElement("div",{className:"d-flex align-items-center"},r.createElement(j.O,{percentage:null===(t=null==n?void 0:n.resultsSummary)||void 0===t?void 0:t.percentCorrect,layout:j.I.LabelInside}),n?r.createElement("div",{className:"d-flex ms-2"},r.createElement(L.y,{interaction:n,iconClassName:"flex-shrink-0"})):r.createElement("span",{className:"ms-2"},x("noAnswers"))),n&&r.createElement(U.F,{appLink:Object.assign(Object.assign({},e.questionsAppLink),{params:Object.assign(Object.assign({},e.questionsAppLink.params),{sortBy:"score_desc"})}),className:"text-info"},r.createElement(l.x,{namespace:M,phrase:"viewQuestions"})))}var R="shared.insightHardestQuestion",T=a.T.encloseNamespace(R);function _(e){var t,n=r.useMemo((function(){return t=e.interactive,n=e.results,r=(0,O.Q)(t).map((function(e){return Object.assign(Object.assign({},e),{resultsSummary:(0,I.nq)(e,n)})})).filter((function(e){return!!e.resultsSummary.answered&&!e.resultsSummary.awaitingMarking})),a=y.m.sortBy(r,(function(e){return e.resultsSummary.percentCorrect})),y.m.first(a);var t,n,r,a}),[e.results.students.length]);return r.createElement(s.L,{title:T("title"),svgName:o.vn.QuestionMark,svgClassName:"bg-light-orange text-orange"},r.createElement("div",{className:"d-flex align-items-center"},r.createElement(j.O,{percentage:null===(t=null==n?void 0:n.resultsSummary)||void 0===t?void 0:t.percentCorrect,layout:j.I.LabelInside}),n?r.createElement("div",{className:"d-flex ms-2"},r.createElement(L.y,{interaction:n,iconClassName:"flex-shrink-0"})):r.createElement("span",{className:"ms-2"},T("noAnswers"))),n&&r.createElement(U.F,{appLink:Object.assign(Object.assign({},e.questionsAppLink),{params:Object.assign(Object.assign({},e.questionsAppLink.params),{sortBy:"score_asc"})}),className:"text-info"},r.createElement(l.x,{namespace:R,phrase:"viewQuestions"})))}var B=n(50916),W=a.T.encloseNamespace("shared.insightHighScoringStudents");function H(e){return r.createElement(s.L,{title:W("title"),svgName:o.vn.Trophy,svgClassName:"bg-light-teal text-teal",count:e.students.length},r.createElement(w.y,{students:e.students.map((function(e){return Object.assign(Object.assign({},e.user),{percentage:e.summary.percentCorrect})})),imageCdnUrl:e.imageCdnUrl,imageUrl:e.greenChartImageUrl,description:W(e.completed.length?"noStudents":"highScore"),appLink:Object.assign(Object.assign({},e.resultsAppLink),{params:Object.assign(Object.assign({},e.resultsAppLink.params),{sortBy:"score_desc"})}),appLinkText:W("viewByHighest"),anonymiseUsers:e.anonymiseUsers}))}var P=a.T.encloseNamespace("shared.insightLowScoringStudents");function Z(e){return r.createElement(s.L,{title:P("title"),svgName:o.vn.Hand,svgClassName:"bg-light-red text-red",count:e.students.length},r.createElement(w.y,{students:e.students.map((function(e){return Object.assign(Object.assign({},e.user),{percentage:e.summary.percentCorrect})})),imageCdnUrl:e.imageCdnUrl,imageUrl:e.completed.length?e.heartImageUrl:e.redChartImageUrl,description:P(e.completed.length?"doingWell":"lowScore"),appLink:Object.assign(Object.assign({},e.resultsAppLink),{params:Object.assign(Object.assign({},e.resultsAppLink.params),{sortBy:"score_asc"})}),appLinkText:P("viewByLowest"),anonymiseUsers:e.anonymiseUsers}))}var Q=a.T.encloseNamespace("shared.insightMarkingRequired");function D(e){return r.createElement(s.L,{title:Q("title"),svgName:o.vn.Hand,svgClassName:"bg-light-blue text-blue",count:e.students.length},r.createElement(w.y,{students:e.students,imageCdnUrl:e.imageCdnUrl,imageUrl:e.imageUrl,description:Q("studentsRequireMarking"),appLink:Object.assign(Object.assign({},e.resultsAppLink),{params:{filterBy:"marking_required"}}),appLinkText:Q("viewAll"),anonymiseUsers:e.anonymiseUsers}))}function F(e){return function(e){if(Array.isArray(e))return G(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return G(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)?G(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function G(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 z=a.T.encloseNamespace("shared.insightNotCompletedStudents");function J(e){var t,n,a,i=(t=e.markingRequiredStudents.map((function(e){return null==e?void 0:e.user.id})),n=e.completedStudents.map((function(e){return null==e?void 0:e.user.id})),a=e.classroomStudents.filter((function(e){return!t.includes(e.id)&&!n.includes(e.id)})),y.m.uniq([].concat(F(e.notCompletedStudents.map((function(e){return e.user}))),F(a)),"id"));return r.createElement(s.L,{title:z("title"),svgName:o.vn.Puzzle,svgClassName:"bg-light-teal text-teal",count:i.length},r.createElement(w.y,{students:i,imageCdnUrl:e.imageCdnUrl,imageUrl:e.imageUrl,description:z("completed"),appLink:Object.assign(Object.assign({},e.resultsAppLink),{params:"not_completed"}),appLinkText:z("viewAll"),anonymiseUsers:e.anonymiseUsers}))}var $=n(94892),K=n(99742),V=n(91693),X=n(13759),Y="lite.insightsMask";function ee(e){return r.createElement("div",{className:"".concat(e.requiresMarking&&X.Z.mask," position-relative")},r.createElement("div",{className:e.requiresMarking?"position-absolute top-0":""},e.children),r.createElement("div",{className:e.requiresMarking?"".concat(X.Z.backdrop," d-flex flex-column align-items-center justify-content-start py-5"):""},!!e.requiresMarking&&r.createElement("div",{className:"text-center w-50"},r.createElement("img",{src:K.W.Insights.MARKING_RESPONSES,className:"mb-3",width:288}),r.createElement("h2",{className:"h3 mb-3"},r.createElement(l.x,{namespace:Y,phrase:"markHeading"})),r.createElement("p",{className:"mb-3"},r.createElement(l.x,{namespace:Y,phrase:"markDescription"})),r.createElement(V.h,{svgName:o.vn.Check,className:"btn btn-dark mb-3",appLink:Object.assign(Object.assign({},e.appLink),{params:Object.assign(Object.assign({},e.appLink.params),{filterBy:"marking_required"})})},r.createElement(l.x,{namespace:Y,phrase:"markResponses",options:{smartCount:e.requiresMarking}})),r.createElement("button",{className:"btn btn-link d-block p-0 mx-auto",onClick:e.hideMarkingRequiredMask},r.createElement(l.x,{namespace:Y,phrase:"seeIncomplete"})))))}var te=n(49673);const ne={partialInsights:"jf2hT"};function re(){return r.createElement("div",null,r.createElement("h2",{className:"h4 w-25 partial-loading-background"}," "),r.createElement("div",{className:"row g-3 mb-5"},r.createElement("div",{className:"col-6"},r.createElement("div",{className:"".concat(ne.partialInsights," rounded partial-loading-background")})),r.createElement("div",{className:"col-6"},r.createElement("div",{className:"".concat(ne.partialInsights," rounded partial-loading-background")}))),r.createElement("h2",{className:"h4 w-25 partial-loading-background"}," "),r.createElement("div",{className:"row g-3 mb-5"},r.createElement("div",{className:"col-6"},r.createElement("div",{className:"".concat(ne.partialInsights," rounded partial-loading-background")})),r.createElement("div",{className:"col-6"},r.createElement("div",{className:"".concat(ne.partialInsights," rounded partial-loading-background")})),r.createElement("div",{className:"col-6"},r.createElement("div",{className:"".concat(ne.partialInsights," rounded partial-loading-background")})),r.createElement("div",{className:"col-6"},r.createElement("div",{className:"".concat(ne.partialInsights," rounded partial-loading-background")}))),r.createElement("h2",{className:"h4 w-25 partial-loading-background"}," "),r.createElement("div",{className:"row g-3 mb-5"},r.createElement("div",{className:"col-6"},r.createElement("div",{className:"".concat(ne.partialInsights," rounded partial-loading-background")})),r.createElement("div",{className:"col-6"},r.createElement("div",{className:"".concat(ne.partialInsights," rounded partial-loading-background")})),r.createElement("div",{className:"col-6"},r.createElement("div",{className:"".concat(ne.partialInsights," rounded partial-loading-background")})),r.createElement("div",{className:"col-6"},r.createElement("div",{className:"".concat(ne.partialInsights," rounded partial-loading-background")}))))}function ae(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 se="insights.interactiveInsightsOverview";function ie(e){var t,n,a,s,i=(a=r.useState(!1),s=2,function(e){if(Array.isArray(e))return e}(a)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,s,i,c=[],l=!0,o=!1;try{if(s=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=s.call(n)).done)&&(c.push(r.value),c.length!==t);l=!0);}catch(e){o=!0,a=e}finally{try{if(!l&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(o)throw a}}return c}}(a,s)||function(e,t){if(e){if("string"==typeof e)return ae(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)?ae(e,t):void 0}}(a,s)||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=i[0],o=i[1],u=e.hasDataLoaded&&(0,I.R6)(e.interactive,e.results,$.T);return r.createElement(r.Fragment,null,!e.hasDataLoaded&&r.createElement(re,null),e.hasDataLoaded&&r.createElement(te.u,{video:e.interactiveMetadata,hasShared:e.hasShared},r.createElement("section",{className:"mb-5"},r.createElement("h2",{className:"h4"},r.createElement(l.x,{namespace:se,phrase:"studentResponses"}),r.createElement("span",null,": ",e.results.students.length,e.classroomStudents?"/".concat(e.classroomStudents.data.length):"")),r.createElement("div",{className:"row g-3"},r.createElement("div",{className:"col"},r.createElement(D,{imageUrl:K.W.Insights.SPEECH_BUBBLE_ASTERISK,resultsAppLink:e.interactiveInsightsAppLinks.resultsAppLink,imageCdnUrl:e.config.imageCdnUrl,students:(n=u.markingRequired,n.map((function(e){return e.user||e.publicUser}))),anonymiseUsers:e.anonymiseUsers})),e.classroomFilterOnly&&r.createElement("div",{className:"col"},r.createElement(J,{markingRequiredStudents:u.markingRequired,completedStudents:u.completed,notCompletedStudents:u.notCompleted,classroomStudents:e.classroomStudents.data,imageCdnUrl:e.config.imageCdnUrl,imageUrl:K.W.Insights.JIGSAW,resultsAppLink:e.interactiveInsightsAppLinks.resultsAppLink,anonymiseUsers:e.anonymiseUsers})),r.createElement("div",{className:"col"},r.createElement(N,{students:u.completed,imageCdnUrl:e.config.imageCdnUrl,imageUrl:K.W.Insights.AVATAR,resultsAppLink:e.interactiveInsightsAppLinks.resultsAppLink,anonymiseUsers:e.anonymiseUsers})))),r.createElement(ee,{requiresMarking:!c&&u.markingRequired.length,appLink:e.interactiveInsightsAppLinks.resultsAppLink,hideMarkingRequiredMask:function(){return o(!0)}},r.createElement("section",{className:"mb-5"},r.createElement("h2",{className:"h4"},r.createElement(l.x,{namespace:se,phrase:"studentsPerformance"})),r.createElement("div",{className:"row g-3"},r.createElement("div",{className:"col-6"},r.createElement(Z,{redChartImageUrl:K.W.Insights.RED_CHART,heartImageUrl:K.W.Insights.SPEECH_BUBBLE_HEART,resultsAppLink:e.interactiveInsightsAppLinks.resultsAppLink,imageCdnUrl:e.config.imageCdnUrl,students:u.lowScore,completed:u.completed,anonymiseUsers:e.anonymiseUsers})),r.createElement("div",{className:"col-6"},r.createElement(H,{greenChartImageUrl:K.W.Insights.GREEN_CHART,resultsAppLink:e.interactiveInsightsAppLinks.resultsAppLink,imageCdnUrl:e.config.imageCdnUrl,students:u.highScore,completed:u.completed,anonymiseUsers:e.anonymiseUsers})),r.createElement("div",{className:"col-6"},r.createElement(_,{interactive:e.interactive,interactiveMetadata:e.interactiveMetadata,results:e.results,questionsAppLink:e.interactiveInsightsAppLinks.questionsAppLink})),r.createElement("div",{className:"col-6"},r.createElement(q,{interactive:e.interactive,interactiveMetadata:e.interactiveMetadata,results:e.results,questionsAppLink:e.interactiveInsightsAppLinks.questionsAppLink})))),r.createElement("section",{className:"mb-5"},r.createElement("h2",{className:"h4"},r.createElement(l.x,{namespace:se,phrase:"classPerformance"})),r.createElement("div",{className:"row g-3"},r.createElement("div",{className:"col-6"},r.createElement(A,{students:u.completed})),r.createElement("div",{className:"col-6"},r.createElement(h,{students:u.completed})),r.createElement("div",{className:"col-6"},r.createElement(S.i,{osCount:null===(t=e.videoViews)||void 0===t?void 0:t.osCount})),r.createElement("div",{className:"col-6"},r.createElement(B.b,{engagement:e.aggregateEngagement,heatmapAppLink:e.interactiveInsightsAppLinks.heatmapAppLink})))))))}}}]);
|
|
2
|
-
//# sourceMappingURL=9352-04db4c533d-lite.chunk.js.map
|