@clickview/lite 0.75.0-rc.9 → 0.75.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundles.json +1 -1
- package/dist/css/{7103-lite-fef3024f61.chunk.css → 2878-lite-d8e0bf912a.chunk.css} +1 -1
- package/dist/css/{1243-lite-13eda8f6a0.chunk.css → 3615-lite-240342ff8e.chunk.css} +1 -1
- package/dist/css/{1867-lite-8baa8af02b.chunk.css → 4630-lite-0157b1c437.chunk.css} +1 -1
- package/dist/css/{4203-lite-9ffab89741.chunk.css → 8362-lite-10810fdef2.chunk.css} +1 -1
- package/dist/languages/en.json +1 -1
- package/dist/scripts/{104-7ee25cbbb8-lite.chunk.js → 104-da7394bcfa-lite.chunk.js} +2 -2
- package/dist/scripts/104-da7394bcfa-lite.chunk.js.map +1 -0
- package/dist/scripts/1192-bb27568f21-lite.chunk.js +2 -0
- package/dist/scripts/1192-bb27568f21-lite.chunk.js.map +1 -0
- package/dist/scripts/1199-cf2cb206b5-lite.chunk.js +2 -0
- package/dist/scripts/1199-cf2cb206b5-lite.chunk.js.map +1 -0
- package/dist/scripts/1502-9836df10cd-lite.chunk.js +2 -0
- package/dist/scripts/1502-9836df10cd-lite.chunk.js.map +1 -0
- package/dist/scripts/{1610-9ccecc428a-lite.chunk.js → 1610-0edaa98d40-lite.chunk.js} +2 -2
- package/dist/scripts/{1610-9ccecc428a-lite.chunk.js.map → 1610-0edaa98d40-lite.chunk.js.map} +1 -1
- package/dist/scripts/{7103-3b181ec69b-lite.chunk.js → 2878-487c4a8e1a-lite.chunk.js} +2 -2
- package/dist/scripts/2878-487c4a8e1a-lite.chunk.js.map +1 -0
- package/dist/scripts/{3057-1ae8087b3a-lite.chunk.js → 3057-a5bc753736-lite.chunk.js} +1 -1
- package/dist/scripts/{3057-1ae8087b3a-lite.chunk.js.map → 3057-a5bc753736-lite.chunk.js.map} +1 -1
- package/dist/scripts/3268-7be966dc82-lite.chunk.js +3 -0
- package/dist/scripts/3268-7be966dc82-lite.chunk.js.map +1 -0
- package/dist/scripts/{1243-72f3d31787-lite.chunk.js → 3615-a0da361aa5-lite.chunk.js} +2 -2
- package/dist/scripts/3615-a0da361aa5-lite.chunk.js.map +1 -0
- package/dist/scripts/{3872-6fe7371d39-lite.chunk.js → 3872-cf9a6bdae8-lite.chunk.js} +1 -1
- package/dist/scripts/{3872-6fe7371d39-lite.chunk.js.map → 3872-cf9a6bdae8-lite.chunk.js.map} +1 -1
- package/dist/scripts/4125-6d34b8b8f2-lite.chunk.js +2 -0
- package/dist/scripts/4125-6d34b8b8f2-lite.chunk.js.map +1 -0
- package/dist/scripts/4598-e25e9e03d6-lite.chunk.js +2 -0
- package/dist/scripts/4598-e25e9e03d6-lite.chunk.js.map +1 -0
- package/dist/scripts/{1867-0823a787c3-lite.chunk.js → 4630-4a35ecbf2b-lite.chunk.js} +2 -2
- package/dist/scripts/4630-4a35ecbf2b-lite.chunk.js.map +1 -0
- package/dist/scripts/6475-f019242ec2-lite.chunk.js +2 -0
- package/dist/scripts/6475-f019242ec2-lite.chunk.js.map +1 -0
- package/dist/scripts/{6695-4e01b4a18c-lite.chunk.js → 6695-4ae0acad94-lite.chunk.js} +1 -1
- package/dist/scripts/{6695-4e01b4a18c-lite.chunk.js.map → 6695-4ae0acad94-lite.chunk.js.map} +1 -1
- package/dist/scripts/6756-3c7f911759-lite.chunk.js +3 -0
- package/dist/scripts/6756-3c7f911759-lite.chunk.js.map +1 -0
- package/dist/scripts/6790-1695fcf576-lite.chunk.js +2 -0
- package/dist/scripts/6790-1695fcf576-lite.chunk.js.map +1 -0
- package/dist/scripts/7438-35b887a48e-lite.chunk.js +2 -0
- package/dist/scripts/7438-35b887a48e-lite.chunk.js.map +1 -0
- package/dist/scripts/{8323-d6d1d07ce5-lite.chunk.js → 8323-5694456903-lite.chunk.js} +2 -2
- package/dist/scripts/{8323-d6d1d07ce5-lite.chunk.js.map → 8323-5694456903-lite.chunk.js.map} +1 -1
- package/dist/scripts/{4203-83f90f92f3-lite.chunk.js → 8362-ed5df8f4fc-lite.chunk.js} +3 -3
- package/dist/scripts/8362-ed5df8f4fc-lite.chunk.js.LICENSE.txt +1 -0
- package/dist/scripts/{4203-83f90f92f3-lite.chunk.js.map → 8362-ed5df8f4fc-lite.chunk.js.map} +1 -1
- package/dist/scripts/{8732-3e8332e620-lite.chunk.js → 8732-dc5182fb69-lite.chunk.js} +1 -1
- package/dist/scripts/{8732-3e8332e620-lite.chunk.js.map → 8732-dc5182fb69-lite.chunk.js.map} +1 -1
- package/dist/scripts/8856-08061bbec5-lite.chunk.js +2 -0
- package/dist/scripts/8856-08061bbec5-lite.chunk.js.map +1 -0
- package/dist/scripts/{8957-bc83ea1180-lite.chunk.js → 8957-b3f0dbb85d-lite.chunk.js} +1 -1
- package/dist/scripts/{8957-bc83ea1180-lite.chunk.js.map → 8957-b3f0dbb85d-lite.chunk.js.map} +1 -1
- package/dist/scripts/{9042-544d97a05d-lite.chunk.js → 9042-7c30ffd4f0-lite.chunk.js} +2 -2
- package/dist/scripts/9042-7c30ffd4f0-lite.chunk.js.map +1 -0
- package/dist/scripts/9134-b0ae877597-lite.chunk.js +2 -0
- package/dist/scripts/9134-b0ae877597-lite.chunk.js.map +1 -0
- package/dist/scripts/{bundle-cf4c360278.min.js → bundle-941a464ef0.min.js} +3 -3
- package/dist/scripts/{bundle-cf4c360278.min.js.map → bundle-941a464ef0.min.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/104-7ee25cbbb8-lite.chunk.js.map +0 -1
- package/dist/scripts/1074-6dadbd8187-lite.chunk.js +0 -2
- package/dist/scripts/1074-6dadbd8187-lite.chunk.js.map +0 -1
- package/dist/scripts/1192-6ac54d734b-lite.chunk.js +0 -2
- package/dist/scripts/1192-6ac54d734b-lite.chunk.js.map +0 -1
- package/dist/scripts/1199-dc45a88be8-lite.chunk.js +0 -2
- package/dist/scripts/1199-dc45a88be8-lite.chunk.js.map +0 -1
- package/dist/scripts/1243-72f3d31787-lite.chunk.js.map +0 -1
- package/dist/scripts/1867-0823a787c3-lite.chunk.js.map +0 -1
- package/dist/scripts/3268-aa893d0068-lite.chunk.js +0 -2
- package/dist/scripts/3268-aa893d0068-lite.chunk.js.map +0 -1
- package/dist/scripts/4598-f5120153c2-lite.chunk.js +0 -2
- package/dist/scripts/4598-f5120153c2-lite.chunk.js.map +0 -1
- package/dist/scripts/6475-502e390010-lite.chunk.js +0 -2
- package/dist/scripts/6475-502e390010-lite.chunk.js.map +0 -1
- package/dist/scripts/6756-20c0ab9591-lite.chunk.js +0 -3
- package/dist/scripts/6756-20c0ab9591-lite.chunk.js.map +0 -1
- package/dist/scripts/6790-df00506bec-lite.chunk.js +0 -2
- package/dist/scripts/6790-df00506bec-lite.chunk.js.map +0 -1
- package/dist/scripts/7103-3b181ec69b-lite.chunk.js.map +0 -1
- package/dist/scripts/7438-1162aba8b6-lite.chunk.js +0 -2
- package/dist/scripts/7438-1162aba8b6-lite.chunk.js.map +0 -1
- package/dist/scripts/8856-361fe76b7a-lite.chunk.js +0 -2
- package/dist/scripts/8856-361fe76b7a-lite.chunk.js.map +0 -1
- package/dist/scripts/9003-36ab592cc5-lite.chunk.js +0 -2
- package/dist/scripts/9003-36ab592cc5-lite.chunk.js.map +0 -1
- package/dist/scripts/9042-544d97a05d-lite.chunk.js.map +0 -1
- package/dist/scripts/9134-7037c2c47a-lite.chunk.js +0 -2
- package/dist/scripts/9134-7037c2c47a-lite.chunk.js.map +0 -1
- /package/dist/scripts/{4203-83f90f92f3-lite.chunk.js.LICENSE.txt → 3268-7be966dc82-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{6756-20c0ab9591-lite.chunk.js.LICENSE.txt → 6756-3c7f911759-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{8323-d6d1d07ce5-lite.chunk.js.LICENSE.txt → 8323-5694456903-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{bundle-cf4c360278.min.js.LICENSE.txt → bundle-941a464ef0.min.js.LICENSE.txt} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/6756-20c0ab9591-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/share-v2/components/share-avatar/ShareAvatar.tsx","file:///app/packages/libs/shared/src/apps/share-v2/utils/ShareLinkHelper.ts","file:///app/packages/libs/shared/src/components/multistep-popup/MultiStepPopup.tsx","file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteScroll.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteList.ts","file:///app/packages/libs/shared/src/utils/GroupHelper.ts","file:///app/packages/libs/shared/src/apps/share-v2/components/share-view-count/ShareViewCount.tsx","file:///app/packages/libs/shared/src/apps/share-v2/components/share-viewed-by-count/ShareViewedByCount.tsx","file:///app/packages/projects/lite/src/apps/assign/components/previous-assignments/previous-assignments.scss","file:///app/packages/projects/lite/src/apps/assign/components/previous-assignments/PreviousAssignments.tsx","file:///app/packages/projects/lite/src/apps/assign/views/classroom-create-prompt-view/components/create-prompt/CreatePrompt.tsx","file:///app/packages/projects/lite/src/apps/assign/views/classroom-create-prompt-view/components/integrations-prompt/IntegrationsPrompt.tsx","file:///app/packages/projects/lite/src/apps/assign/views/classroom-create-prompt-view/ClassroomCreatePromptView.tsx","file:///app/packages/projects/lite/src/apps/assign/views/classroom-selector-view/components/narrow-selection-button/NarrowSelectionButton.tsx","file:///app/packages/projects/lite/src/apps/assign/views/classroom-selector-view/components/classroom-selector-list-item/ClassroomSelectorListItem.tsx","file:///app/packages/projects/lite/src/apps/assign/views/classroom-selector-view/components/classroom-selector-list/ClassroomSelectorList.tsx","file:///app/packages/projects/lite/src/apps/assign/views/classroom-selector-view/ClassroomSelectorView.tsx","file:///app/node_modules/react-bootstrap/esm/InputGroupText.js","file:///app/node_modules/react-bootstrap/esm/InputGroup.js","file:///app/packages/projects/lite/src/apps/assign/views/create-new-classroom-view/CreateNewClassroomView.tsx","file:///app/packages/projects/lite/src/apps/assign/components/flow-settings/FlowSettings.tsx","file:///app/packages/projects/lite/src/apps/assign/components/flow-settings/flow-settings.scss","file:///app/packages/projects/lite/src/apps/assign/components/selected-classroom-header/SelectedClassroomHeader.tsx","file:///app/packages/projects/lite/src/apps/assign/views/existing-classroom-flow-settings-view/components/existing-classroom-flow-settings/ExistingClassroomFlowSettings.tsx","file:///app/packages/libs/shared/src/apps/share-v2/hooks/useCreateShare.ts","file:///app/packages/projects/lite/src/apps/assign/views/existing-classroom-flow-settings-view/hooks/useExistingClassroomFlowSettingsData.tsx","file:///app/packages/projects/lite/src/apps/assign/views/existing-classroom-flow-settings-view/ExistingClassroomFlowSettingsView.tsx","file:///app/packages/projects/lite/src/apps/assign/views/narrow-classroom-selection-view/enums/SelectionType.ts","file:///app/packages/projects/lite/src/apps/assign/views/narrow-classroom-selection-view/components/accordion/Accordion.tsx","file:///app/packages/projects/lite/src/apps/assign/views/narrow-classroom-selection-view/components/classroom-entity-list/ClassroomEntityList.tsx","file:///app/packages/projects/lite/src/apps/assign/views/narrow-classroom-selection-view/components/narrow-classroom-selection-controls/NarrowClassroomSelectionControls.tsx","file:///app/packages/projects/lite/src/apps/assign/views/narrow-classroom-selection-view/NarrowClassroomSelectionView.tsx","file:///app/packages/projects/lite/src/apps/assign/views/no-students-details-view/NoStudentsDetailsView.tsx","file:///app/packages/projects/lite/src/apps/assign/views/no-students-details-view/no-students-details-view.scss","file:///app/packages/projects/lite/src/apps/assign/views/existing-classroom-flow-view/config/ExistingClassroomStepConfig.ts","file:///app/packages/projects/lite/src/apps/assign/views/classroom-selector-view/hooks/use-classroom-selector-data/useClassroomSelectorData.tsx","file:///app/packages/projects/lite/src/apps/assign/views/classroom-selector-view/classroom-selector-view.scss","file:///app/packages/projects/lite/src/apps/assign/views/narrow-classroom-selection-view/hooks/useNarrowClassroomSelectionData.tsx","file:///app/packages/projects/lite/src/apps/assign/views/existing-classroom-flow-view/ExistingClassroomFlowView.tsx","file:///app/packages/projects/lite/src/apps/assign/views/existing-classroom-flow-view/hooks/useExistingClassroomFlowData.ts","file:///app/packages/projects/lite/src/shared/components/new-badge/NewBadge.tsx","file:///app/packages/projects/lite/src/shared/components/recommended-badge/RecommendedBadge.tsx","file:///app/packages/projects/lite/src/apps/assign/views/flow-selector-view/components/flow-option-badge/FlowOptionBadge.tsx","file:///app/packages/projects/lite/src/apps/assign/views/flow-selector-view/components/flow-selector-options/flow-selector-options.scss","file:///app/packages/projects/lite/src/apps/assign/views/flow-selector-view/components/flow-selector-options/FlowSelectorOptions.tsx","file:///app/packages/projects/lite/src/apps/assign/views/flow-selector-view/hooks/useFlowSelectorData.ts","file:///app/packages/projects/lite/src/apps/assign/views/flow-selector-view/FlowSelectorView.tsx","file:///app/packages/projects/lite/src/apps/assign/views/open-classroom-flow-settings-view/components/open-classroom-flow-info-header/OpenClassroomFlowInfoHeader.tsx","file:///app/packages/projects/lite/src/apps/assign/views/open-classroom-flow-settings-view/components/open-classroom-flow-settings/OpenClassroomFlowSettings.tsx","file:///app/packages/projects/lite/src/apps/assign/views/open-classroom-flow-settings-view/hooks/use-open-classroom-flow-settings-data/useOpenClassroomFlowSettingsData.ts","file:///app/packages/projects/lite/src/apps/assign/views/open-classroom-flow-settings-view/OpenClassroomFlowSettingsView.tsx","file:///app/packages/projects/lite/src/apps/assign/views/open-classroom-flow-view/OpenClassroomFlowView.tsx","file:///app/packages/projects/lite/src/apps/assign/views/assign-flow-view/AssignFlowView.tsx","file:///app/packages/projects/lite/src/apps/classrooms/hooks/useFetchClassrooms.ts","file:///app/packages/projects/lite/src/apps/classrooms/validation/ClassroomValidationSchema.ts","file:///app/node_modules/timeago.js/esm/lang/en_US.js","file:///app/node_modules/timeago.js/esm/lang/zh_CN.js","file:///app/node_modules/timeago.js/esm/register.js","file:///app/node_modules/timeago.js/esm/utils/date.js","file:///app/node_modules/timeago.js/esm/format.js","file:///app/node_modules/timeago.js/esm/index.js"],"sourcesContent":["import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { IconCircle } from 'libs/shared/components/icon-circle/IconCircle';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { SharePrivacy } from '../../enums/SharePrivacy';\nimport { ShareType } from '../../enums/ShareType';\n\nconst namespace = 'sharev2.shareAvatar';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst icons = {\n [ShareType.Open]: cvSvgLibrary.Classrooms,\n [ShareType.Link]: cvSvgLibrary.Link,\n [ShareType.Classroom]: cvSvgLibrary.Classrooms,\n [ShareType.Live]: cvSvgLibrary.Play,\n [ShareType.LegacyDirect]: cvSvgLibrary.Share\n};\n\nconst iconColours = {\n [ShareType.Open]: 'blue',\n [ShareType.Link]: 'black',\n [ShareType.Classroom]: 'teal',\n [ShareType.Live]: 'purple',\n [ShareType.LegacyDirect]: 'indigo'\n};\n\nconst shareTypeTitlePhraseMap = {\n [ShareType.Open]: 'openShareType',\n [ShareType.Link]: 'linkShareType',\n [ShareType.Classroom]: 'classroomShareType',\n [ShareType.Live]: 'liveShareType',\n [ShareType.LegacyDirect]: 'legacyDirectShareType'\n};\n\nfunction getTitle({ type, classroomName, additionalTitleText }: ShareAvatarProps) {\n if (type === ShareType.Classroom && classroomName)\n return classroomName;\n\n let title = getPhrase(shareTypeTitlePhraseMap[type]);\n\n if (additionalTitleText)\n title += ' ' + additionalTitleText;\n\n return title;\n}\n\nfunction getClassroomSubtitle(classroomGroupCount: number, studentCount: number): string {\n if (classroomGroupCount && studentCount)\n return `${getPhrase('classroomGroupCount', { smartCount: classroomGroupCount })}, ${getPhrase('studentSubTitle', { smartCount: studentCount })}`;\n\n if (classroomGroupCount)\n return getPhrase('groupSubTitle', { smartCount: classroomGroupCount });\n\n if (studentCount)\n return getPhrase('studentSubTitle', { smartCount: studentCount });\n\n return getPhrase('allStudentsSubTitle');\n}\n\nfunction getLinkSubtitle(privacy: SharePrivacy) {\n if ([ SharePrivacy.JustMySchool, SharePrivacy.Protected ].includes(privacy))\n return getPhrase('respectRatingsSubTitle');\n\n if (privacy === SharePrivacy.JustMySchoolOverrideRestriction)\n return getPhrase('anyoneInSchoolSubTitle');\n\n if (privacy === SharePrivacy.ProtectedOverrideRestriction)\n return getPhrase('anyoneSignedInSubTitle');\n\n if (privacy === SharePrivacy.Public)\n return getPhrase('anyoneWithLinkSubTitle');\n\n if (privacy === SharePrivacy.PinCode)\n return getPhrase('anyoneWithPinSubTitle');\n}\n\nfunction getSubtitle({ type, privacy, studentCount = 0, classroomGroupCount = 0 }: ShareAvatarProps) {\n switch (type) {\n case ShareType.Classroom:\n return getClassroomSubtitle(classroomGroupCount, studentCount);\n\n case ShareType.Open:\n return getPhrase('openShareTypeSubTitle');\n\n case ShareType.Link:\n return getLinkSubtitle(privacy);\n \n case ShareType.Live:\n return getPhrase('liveShareTypeSubTitle');\n\n case ShareType.LegacyDirect:\n return getPhrase('legacyDirectTypeSubTitle');\n\n default:\n return getPhrase('publicShareTypeSubTitle');\n }\n}\n\ninterface ShareAvatarProps {\n type: ShareType;\n privacy: SharePrivacy;\n studentCount?: number;\n classroomGroupCount?: number;\n classroomName?: string;\n hideSubtitle?: boolean;\n subtitleText?: string;\n svgSize?: SvgContainerSize;\n additionalTitleText?: string;\n}\n\nexport function ShareAvatar(props: ShareAvatarProps): JSX.Element {\n return (\n <div className='d-flex align-items-center gap-2'>\n <div>\n <IconCircle\n svgName={icons[props.type]}\n variant={iconColours[props.type]}\n textVariant='white'\n svgWrapperClassName='p-1'\n svgSize={props.svgSize ?? SvgContainerSize.Standard}\n />\n </div>\n <div className='d-flex flex-column'>\n <p className='m-0'>{getTitle(props)}</p>\n {!props.hideSubtitle && <span className='text-secondary'>{props.subtitleText ?? getSubtitle(props)}</span>}\n </div>\n </div>\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { SharePrivacy } from 'libs/shared/apps/share-v2/enums/SharePrivacy';\nimport type { SharePrivacyResponse } from 'libs/shared/apps/share-v2/interfaces/SharePrivacyResponse';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ShareLinkStatus } from 'libs/shared/enums/ShareLinkStatus';\nimport type { BaseObject, YearGroup } from 'libs/shared/interfaces';\nimport { RestrictionHelper } from 'libs/shared/utils/RestrictionHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst namespace = 'sharev2.utils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface GetIconAndTextOptions {\n linkExpireDate: string;\n isPasswordProtected: boolean;\n privacy: SharePrivacy;\n status: ShareLinkStatus;\n entityTypeId: MasterType;\n hasStudentExp: boolean;\n entity: BaseObject;\n yearGroups: YearGroup[];\n}\n\ninterface GetPrivateIconAndTextOptions {\n privacy: SharePrivacy;\n entityTypeId: MasterType;\n hasStudentExp: boolean;\n entity: BaseObject;\n yearGroups: YearGroup[];\n}\n\nexport const ShareLinkHelper = {\n getPrivateIconAndText: (options: GetPrivateIconAndTextOptions) => {\n const { entityTypeId, privacy, hasStudentExp, entity, yearGroups } = options;\n \n if (entityTypeId === MasterType.Topic || entityTypeId === MasterType.Series)\n return { icon: cvSvgLibrary.VisibleOn, text: getPhrase(hasStudentExp ? 'justMySchoolTeachers' : 'justMySchoolDescription') };\n \n /**\n * This is mainly for typescript, privacy will be an array for playlists\n * but that is handled above\n */\n if (Array.isArray(privacy))\n return;\n \n switch (privacy) {\n case SharePrivacy.Public:\n return { icon: cvSvgLibrary.VisibleOn, text: getPhrase('publicDescription') };\n case SharePrivacy.ProtectedOverrideRestriction:\n return { icon: cvSvgLibrary.VisibleOn, text: getPhrase('clickViewOnly') };\n case SharePrivacy.Protected:\n return {\n icon: cvSvgLibrary.Lock,\n text: ShareLinkHelper.getRespectRatingText(entity, yearGroups, hasStudentExp)\n };\n case SharePrivacy.JustMySchoolOverrideRestriction:\n return { icon: cvSvgLibrary.Lock, text: getPhrase(hasStudentExp ? 'justMySchoolTeachers' : 'justMySchoolDescription') };\n case SharePrivacy.JustMySchool:\n return {\n icon: cvSvgLibrary.Lock,\n text: ShareLinkHelper.getRespectRatingText(entity, yearGroups, hasStudentExp)\n };\n case SharePrivacy.PinCode:\n return { icon: cvSvgLibrary.Lock, text: getPhrase('pinDescription') };\n case SharePrivacy.PasswordProtected:\n return { icon: cvSvgLibrary.Lock, text: getPhrase('privateDescription') };\n default:\n return {};\n }\n },\n\n getIconAndText: (options: GetIconAndTextOptions) => {\n const { linkExpireDate, isPasswordProtected, status } = options;\n if (!linkExpireDate && !isPasswordProtected)\n return ShareLinkHelper.getPrivateIconAndText(options);\n \n if (!linkExpireDate)\n return { icon: cvSvgLibrary.Lock, text: getPhrase('password') };\n \n const isToday = DateHelper.isToday(linkExpireDate);\n const dayDifference = DateHelper.diffBetween(linkExpireDate, new Date(), 'day');\n \n if (!isPasswordProtected) {\n let text = isToday\n ? getPhrase('expiryToday')\n : getPhrase('expiry', { days: dayDifference });\n \n if (status === ShareLinkStatus.Expired)\n text = getPhrase('expired');\n \n return { icon: cvSvgLibrary.Timer, text };\n }\n \n let text = isToday\n ? getPhrase('passwordExpiryToday')\n : getPhrase('passwordExpiry', { days: dayDifference });\n \n if (status === ShareLinkStatus.Expired)\n text = getPhrase('passwordExpired');\n \n return { icon: cvSvgLibrary.Lock, text };\n },\n\n getRespectRatingText(video: BaseObject, yearGroups: YearGroup[], hasStudentExp: boolean) {\n if (!video || !yearGroups)\n return null;\n \n if (hasStudentExp)\n return getPhrase('justMySchoolTeachers');\n \n if (!VideoHelper.isVideoType(video))\n return getPhrase('collectionRating');\n \n const restriction = RestrictionHelper.getWeightedRestriction(video._restrictions?.value);\n \n /**\n * Restrictions without a year level are teacher restricitons, which means only admins can see it.\n */\n if (restriction && !restriction.yearGroup)\n return getPhrase('onlyAdmins');\n \n const rating = VideoHelper.getRating(video);\n \n let maxYearGroup: YearGroup;\n let minAllowedYearGroup: YearGroup;\n \n for (const yearGroup of yearGroups) {\n /**\n * If our year level is our new highest so far, save it\n */\n if (!maxYearGroup || yearGroup.value > maxYearGroup.value)\n maxYearGroup = yearGroup;\n \n /**\n * If the restriction is higher than this year level, skip it.\n */\n if (restriction && yearGroup.value <= restriction.yearGroup)\n continue;\n \n /**\n * If therating is higher than this year level's rating value, skip it.\n */\n if (rating && yearGroup.rating.value < rating.value)\n continue;\n \n /**\n * If our year level is the new lowest so far, save it\n */\n if (!minAllowedYearGroup || yearGroup.value < minAllowedYearGroup.value)\n minAllowedYearGroup = yearGroup;\n }\n \n /**\n * If no year levels are allowed, then it's staff only.\n */\n if (!minAllowedYearGroup)\n return getPhrase('onlyStaff');\n \n \n /**\n * If there's only one year level, and it's allowed, then we can just\n * say that everyone in your school can access it.\n */\n if (yearGroups.length === 1)\n return getPhrase('clickViewOnly');\n \n /**\n * We differentiate the copy if it's the highest year level or not. \n * Basically if we need to say \"X and above\" or not.\n */\n if (minAllowedYearGroup.value === maxYearGroup.value)\n return getPhrase('maxYearGroup', { yearGroup: maxYearGroup.name });\n \n return getPhrase('yearGroupRange', { yearGroup: minAllowedYearGroup.name });\n },\n\n getShareLinkAccessType(privacy: SharePrivacyResponse): 'private' | 'owner' | 'protected' {\n /**\n * If an entity is not a ClickView content and they cannot manage access\n * settings of the entity (which they can if its their private entity)\n * it means that its a TV content\n */\n if (privacy.isTvContent || privacy.isClickViewContent)\n return 'protected';\n\n if (privacy.canManageAccess)\n return 'owner';\n\n return 'private';\n }\n};","import React from 'react';\n\nimport { PopupViewProps } from 'libs/shared/interfaces';\n\nexport interface MultiStepPopupViewProps extends PopupViewProps {\n animate?: boolean;\n loading?: boolean;\n}\n\nexport type MultiStepItemConfig<TProps, TSteps extends string> = {\n [Key in TSteps]: {\n view: (props: TProps) => JSX.Element;\n }\n}\n\ninterface MultiStepPopupProps<\n TProps,\n TSteps extends string\n> {\n step: TSteps;\n data: TProps;\n steps: MultiStepItemConfig<TProps, TSteps>;\n loading?: boolean;\n animate?: boolean;\n setStep: (step: TSteps) => void;\n closePopup: () => void;\n}\n\nexport function MultiStepPopup<TProps, TSteps extends string>(\n props: MultiStepPopupProps<TProps, TSteps>\n): JSX.Element {\n const [ animate, setAnimate ] = React.useState<boolean>(props.animate ?? true);\n\n function setStep(step: TSteps) {\n /**\n * We want to animate the popup for the first time it loads in.\n * After that every step changes should not animate other popups\n */\n setAnimate(false);\n props.setStep(step);\n }\n\n function closePopup() {\n props.closePopup();\n }\n\n const stepConfig = props.steps[props.step];\n /**\n * This is so that we do not override `loading` prop \n * passed into `ViewComponent` from `props.data` if `props.loading` is undefined.\n * We only want to override the prop if this is set.\n */\n const loading = typeof props.loading !== 'undefined' ? { loading: props.loading } : {};\n \n const viewProps: TProps = {\n ...props.data,\n ...loading,\n animate: props.animate ?? animate,\n closePopup,\n setStep\n };\n\n if (!stepConfig)\n return <></>;\n\n const ViewComponent = stepConfig.view;\n\n return <ViewComponent {...viewProps} />;\n}","import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n internalServerError?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError,\n internalServerError: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.InternalServer) {\n if (!ignoreMap.internalServerError)\n Core.ErrorHelper.throw(new UnspecifiedError());\n return;\n }\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import { useEffect } from 'react';\n\nimport { 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}","import { ButtonProps } from 'react-bootstrap';\n\nimport { ClassroomGroupColour } from 'libs/shared/interfaces';\n\nexport function mapColourToBsVariant(groupColour: ClassroomGroupColour): ButtonProps['variant'] {\n switch (groupColour) {\n case ClassroomGroupColour.Pink:\n return 'pink';\n case ClassroomGroupColour.Orange:\n return 'orange';\n case ClassroomGroupColour.Green:\n return 'green';\n case ClassroomGroupColour.Blue:\n return 'blue';\n case ClassroomGroupColour.Purple:\n return 'purple';\n case ClassroomGroupColour.Indigo:\n return 'indigo';\n default:\n return 'pink';\n }\n}\n","import React from 'react';\n\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MasterType } from 'libs/shared/enums/MasterType';\n\nconst namespace = 'sharev2.shareViewCount';\n\ninterface ShareViewCountProps {\n share: Share;\n}\n\nexport function ShareViewCount(props: ShareViewCountProps): JSX.Element {\n const isCollection = [ MasterType.Playlist, MasterType.Series ].includes(props.share.objectTypeId);\n \n if (isCollection)\n return <span>-</span>;\n\n return <Text namespace={namespace} phrase='viewCount' options={{ smartCount: props.share.viewCount || 0 }} />;\n}","import React from 'react';\n\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\ninterface ShareViewedByCountProps {\n share: Share;\n}\n\nexport function ShareViewedByCount(props: ShareViewedByCountProps): JSX.Element {\n const isCollection = [ MasterType.Playlist, MasterType.Series ].includes(props.share.objectTypeId);\n\n if (isCollection)\n return <span>-</span>;\n \n function getViewCount(): string {\n const shareAccessCount = props.share.accessCount || 0;\n if (props.share.type === ShareType.Open)\n return `${shareAccessCount}`;\n\n if (props.share.type === ShareType.Classroom) {\n const totalRecipients = props.share.recipients.length;\n return `${shareAccessCount}/${totalRecipients}`;\n }\n\n return `${shareAccessCount}`;\n }\n \n return (\n <span className='d-inline-flex flex-row gap-2 align-items-center'>\n <SvgContainer svgName={cvSvgLibrary.User} />\n <span>{getViewCount()}</span>\n </span>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"shareListItem\":\"vLROV\",\"visibleOnHover\":\"o2KJH\"};","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\nimport Scrollbars from 'react-custom-scrollbars-2';\nimport { format as formatDate } from 'timeago.js';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { ShareAvatar } from 'libs/shared/apps/share-v2/components/share-avatar/ShareAvatar';\nimport { ShareViewCount } from 'libs/shared/apps/share-v2/components/share-view-count/ShareViewCount';\nimport { ShareViewedByCount } from 'libs/shared/apps/share-v2/components/share-viewed-by-count/ShareViewedByCount';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { ShareHelper } from 'libs/shared/apps/share-v2/utils/ShareHelper';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { Classroom } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './previous-assignments.scss';\n\nconst namespace = 'assign.previousAssignments';\n\ninterface PreviousAssignmentsHeaderProps {\n count: number;\n show: boolean;\n onToggle: () => void;\n}\n\nfunction PreviousAssignmentsHeader(props: PreviousAssignmentsHeaderProps): JSX.Element {\n return (\n <div className={classNames('d-flex align-items-center justify-content-between', props.show && 'mb-3')}>\n <h3 className='h6 m-0 p-0'><Text namespace={namespace} phrase='heading' options={{ count: props.count }} /></h3>\n <IconButton\n svgName={props.show ? cvSvgLibrary.ChevronUp : cvSvgLibrary.ChevronDown}\n onClick={props.onToggle}\n />\n </div>\n );\n}\n\nexport function PreviousAssignmentsListHeader(): JSX.Element {\n const columnClassNames = 'd-flex align-items-end justify-content-start fw-medium';\n \n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <Row className='gx-2 px-3 mb-2'>\n <Col xs={4} className={columnClassNames}>\n <Text phrase='assignedTo' />\n </Col>\n <Col xs={2} className={columnClassNames}>\n <Text phrase='views' />\n </Col>\n <Col xs={2} className={columnClassNames}>\n <Text phrase='viewedBy' />\n </Col>\n <Col xs={4} className={columnClassNames}>\n <Text phrase='dateCreated' />\n </Col>\n </Row>\n </LanguageNamespaceContext.Provider>\n );\n}\n\ntype ItemAnalytics = {\n data: HashObject;\n options: AnalyticsOptions;\n}\ninterface PreviousAssignmentListItemProps {\n share: Share;\n classrooms: Classroom[];\n getItemAppLink: (share: Share) => Core.AppLink;\n\n getItemAnalytics?: (share: Share) => ItemAnalytics;\n className?: string;\n}\n\nfunction PreviousAssignmentListItem(props: PreviousAssignmentListItemProps): JSX.Element {\n const shareClassroom = ShareHelper.getClassroomForShare(props.share, props.classrooms);\n\n const analytics = props.getItemAnalytics?.(props.share);\n\n return (\n <AppLink\n key={props.share.shareId}\n appLink={props.getItemAppLink(props.share)}\n analyticsData={analytics?.data}\n analyticsOptions={analytics?.options}\n className={classNames('d-block p-3 hover-bg-light-blue border border-top-0 no-hover-text-underline', styles.shareListItem, props.className)}\n >\n <Row className='gx-2'>\n <Col xs={4} className='d-flex align-items-center'>\n <ShareAvatar\n type={props.share.type}\n privacy={props.share.privacy}\n classroomName={shareClassroom?.name}\n svgSize={SvgContainerSize.Small}\n hideSubtitle\n />\n </Col>\n <Col xs={2} className='d-flex align-items-center justify-content-start'>\n <ShareViewCount share={props.share} />\n </Col>\n <Col xs={2} className='d-flex align-items-center justify-content-start'>\n <ShareViewedByCount share={props.share} />\n </Col>\n <Col xs={4} lg={3} className='d-flex align-items-center justify-content-start'>\n <span>{formatDate(props.share.dateCreated)}</span>\n </Col>\n <Col lg={1} className='align-items-center justify-content-end d-none d-lg-flex'>\n <span className={classNames('cursor-pointer text-info hover-text-underline', styles.visibleOnHover)}>\n <Text namespace={namespace} phrase='view' />\n </span>\n </Col>\n </Row>\n </AppLink>\n );\n}\n\ninterface PreviousAssignmentsListProps {\n assignments: Share[];\n classrooms: Classroom[];\n getItemAppLink: (share: Share) => Core.AppLink;\n getItemAnalytics?: (share: Share, yIndex: number) => ItemAnalytics;\n scrollHeightMax?: number;\n}\n\nexport function PreviousAssignmentsList(props: PreviousAssignmentsListProps): JSX.Element {\n return (\n <div className={classNames(\n 'd-flex flex-column border-top rounded-top overflow-hidden'\n )}>\n <Scrollbars\n autoHeight\n autoHeightMin={0}\n autoHeightMax={props.scrollHeightMax ?? 215}\n autoHide\n >\n {props.assignments.map((share, idx) => (\n <PreviousAssignmentListItem\n share={share}\n classrooms={props.classrooms}\n getItemAppLink={props.getItemAppLink}\n getItemAnalytics={share => props.getItemAnalytics?.(share, idx)}\n className={classNames(idx % 2 === 0 && 'bg-gray-100')}\n key={share.shareId}\n />\n ))}\n </Scrollbars>\n </div>\n );\n}\n\ninterface PreviousAssignmentsProps {\n show: boolean;\n assignments: Share[];\n classrooms: Classroom[];\n onToggle: () => void;\n getItemAppLink: (share: Share) => Core.AppLink;\n getItemAnalytics?: (share: Share, yIndex: number) => ItemAnalytics;\n}\n\nexport function PreviousAssignments(props: PreviousAssignmentsProps): JSX.Element {\n if (!props.assignments.length)\n return <></>;\n \n const noBottomPadding = props.show && props.assignments.length > 3;\n \n return (\n <div className={classNames('bg-white rounded-3 p-3', noBottomPadding && 'pb-0')}>\n <PreviousAssignmentsHeader count={props.assignments.length} onToggle={props.onToggle} show={props.show} />\n {props.show && (\n <>\n <PreviousAssignmentsListHeader />\n <PreviousAssignmentsList {...props} />\n </>\n )}\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'classroomCreatePromptView.createPrompt';\n\ninterface CreatePromptProps {\n onClick: () => void;\n}\n\nexport function CreatePrompt(props: CreatePromptProps): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <div className='d-flex flex-column align-items-center'>\n <h6 className='mb-2'><Text phrase='title' /></h6>\n <p className='mb-3'><Text phrase='description' /></p>\n <button className='btn btn-outline-dark px-4' onClick={props.onClick}>\n <Text phrase='createBtn' />\n </button>\n </div>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\n\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { InstanceRegion } from 'libs/shared/enums/InstanceRegion';\n\nimport { IntegrationList } from 'apps/assign/components/assign-details/components/integration-list/IntegrationList';\n\nconst namespace = 'classroomCreatePromptView.integrationsPrompt';\n\ninterface IntegrationsPromptProps {\n instanceRegion: InstanceRegion;\n contactSupportLink: string;\n}\n\nexport function IntegrationsPrompt(props: IntegrationsPromptProps): JSX.Element {\n props;\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <div className='d-flex flex-column align-items-center'>\n <h6 className='mb-2'><Text phrase='title' /></h6>\n <p className='mb-3 text-center w-75'><Text phrase='description' /></p>\n <IntegrationList\n itemClassName='col-12 col-sm-6 col-lg-4'\n maxHeight={200}\n instanceRegion={props.instanceRegion}\n contactSupportLink={props.contactSupportLink}\n />\n </div>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SharableEntityType } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { Divider } from 'libs/shared/components/divider/Divider';\nimport { MultiStepPopupViewProps } from 'libs/shared/components/multistep-popup/MultiStepPopup';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { InstanceRegion } from 'libs/shared/enums/InstanceRegion';\n\nimport { FlowControls } from 'apps/assign/components/flow-controls/FlowControls';\nimport { useAssignSharedData } from 'apps/assign/hooks/useAssignSharedData';\nimport { AssignHelper } from 'apps/assign/utils/AssignHelper';\n\nimport { CreatePrompt } from './components/create-prompt/CreatePrompt';\nimport { IntegrationsPrompt } from './components/integrations-prompt/IntegrationsPrompt';\n\nconst namespace = 'assign.classroomCreatePromptView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface ClassroomCreatePromptViewProps extends MultiStepPopupViewProps {\n objectId: string;\n entityType: SharableEntityType;\n instanceRegion: InstanceRegion;\n goToFlowSelector: () => void;\n goToCreateClassroomForm: () => void;\n}\n\nexport function ClassroomCreatePromptView(props: ClassroomCreatePromptViewProps): JSX.Element {\n const sharedData = useAssignSharedData({\n objectId: props.objectId,\n entityType: props.entityType\n });\n\n const contactSupportLink = AssignHelper.getContactSupportUrl(\n sharedData.config.data?.marketingSiteUrl,\n sharedData.currentUser.data?.instanceRegion\n );\n \n const showLoadingSpinner = props.loading || !sharedData.loaded;\n \n return (\n <Popup\n size='lg'\n animation={props.animate}\n showLoadingSpinner={showLoadingSpinner}\n closePopup={props.closePopup}\n title={getPhrase('title')}\n bodyClassName='d-flex flex-column gap-3'\n >\n <CreatePrompt onClick={props.goToCreateClassroomForm} />\n\n <Divider />\n \n <div>\n <IntegrationsPrompt instanceRegion={props.instanceRegion} contactSupportLink={contactSupportLink} />\n\n <FlowControls\n onClickBack={props.goToFlowSelector}\n hideNextButton\n hideCreateClassroomButton\n />\n </div>\n </Popup>\n );\n}","import React from 'react';\nimport { Button } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\n\nconst namespace = 'assign.narrowSelectionButton';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface NarrowSelectionButtonProps {\n hasRecipients: boolean;\n onClickSelectGroupsOrStudents: () => void;\n}\n\nexport function NarrowSelectionButton(props: NarrowSelectionButtonProps): JSX.Element {\n function onClickSelectGroupsOrStudents() {\n if (!props.hasRecipients)\n return;\n\n props.onClickSelectGroupsOrStudents();\n }\n \n return (\n <Tooltip\n title={getPhrase('noStudentsTooltip')}\n spanHack\n placement='top'\n disable={props.hasRecipients}\n >\n <Button\n variant='link'\n className={classNames(\n 'py-0 px-2',\n props.hasRecipients ? 'cursor-pointer text-info hover-text-underline' : 'text-secondary'\n )}\n onClick={onClickSelectGroupsOrStudents}\n disabled={!props.hasRecipients}\n >\n <Text namespace={namespace} phrase='narrowSelectionPrompt' />\n </Button>\n </Tooltip>\n );\n}","import React from 'react';\nimport { Col, Form, Row } from 'react-bootstrap';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { IconCircle } from 'libs/shared/components/icon-circle/IconCircle';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { NarrowSelectionButton } from '../narrow-selection-button/NarrowSelectionButton';\n\nconst namespace = 'assign.classroomSelectorListItem';\n\ninterface ClassroomSelectorListItemProps {\n id: string;\n name: string;\n isSelected: boolean;\n studentsCount: number;\n onSelected: () => void;\n onClickSelectGroupsOrStudents: () => void;\n}\n\nexport function ClassroomSelectorListItem(props: ClassroomSelectorListItemProps): JSX.Element {\n return (\n <Row\n className={classNames(\n 'px-2 py-1 g-0 w-100 rounded cursor-pointer mb-1',\n props.isSelected ? 'bg-light' : 'bg-light-hover'\n )}\n onClick={props.onSelected}\n >\n <Col md={7} className='d-flex align-items-center gap-2'>\n <Form.Check\n type='radio'\n name='classroom-radio'\n id='classroom-radio'\n className='form-check'\n value={props.id}\n onChange={props.onSelected}\n checked={props.isSelected}\n />\n <div className='d-flex align-items-center gap-2'>\n <div>\n <IconCircle\n svgName={cvSvgLibrary.Classrooms}\n svgSize={SvgContainerSize.Standard}\n variant='teal'\n textVariant='white'\n svgWrapperClassName='p-1'\n />\n </div>\n <div className='w-100'>\n <label className='m-0'>{props.name}</label>\n <p className='m-0 text-muted font-size-sm'>\n <Text namespace={namespace} phrase='studentsCount' options={{ smartCount: props.studentsCount }} />\n </p>\n </div>\n </div>\n </Col>\n <Col md={5} className={classNames(\n !props.studentsCount ? 'd-none' : 'd-inline-block', // hide this for smaller screens if there are no students\n props.isSelected && 'py-2 py-md-0',\n 'd-md-flex justify-content-center align-items-center' // always show this for larger screens with disabled state\n )}>\n {props.isSelected && (\n <NarrowSelectionButton\n hasRecipients={!!props.studentsCount}\n onClickSelectGroupsOrStudents={props.onClickSelectGroupsOrStudents}\n />\n )}\n </Col>\n </Row>\n );\n}","import React from 'react';\nimport Scrollbars from 'react-custom-scrollbars-2';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { PopupLoadingSpinner } from 'libs/shared/components/popup/PopupLoadingSpinner';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Classroom } from 'libs/shared/interfaces';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport { GetClassroomsResponse } from 'apps/classrooms/hooks/useFetchClassrooms';\n\nimport { ClassroomSelectorListItem } from '../classroom-selector-list-item/ClassroomSelectorListItem';\n\n\nconst namespace = 'assign.classroomSelectorList';\nconst MIN_MAX_HEIGHT = 300;\n\ninterface ClassroomSelectorListProps {\n searchQuery: string;\n classrooms: GetClassroomsResponse;\n selectedClassroom?: Classroom;\n onClickCreateOpenClassroom: () => void;\n getStudentsCount: (classroom: Classroom) => number;\n onClickSelectGroupsOrStudents: () => void;\n onClassroomSelected: (classroom: Classroom) => void;\n}\n\nexport function ClassroomSelectorList(props: ClassroomSelectorListProps): JSX.Element {\n const loading = !props.classrooms.hasFirstPageCompleted;\n const classrooms = props.classrooms.items;\n \n if (!loading && !classrooms.length) {\n return (\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.Search.RESULTS} size='small' altText='No results found'/>\n <h3 role='status'>\n <Text phrase='noResultsTitle' namespace={namespace} options={{ query: props.searchQuery }} />\n </h3>\n <EmptyState.Info>\n <Text namespace={namespace} phrase='contactAdminInfo' />\n \n <a className='p-0 text-info cursor-pointer' onClick={props.onClickCreateOpenClassroom} >\n <Text namespace={namespace} phrase='createOpenClassroom' />\n </a>\n </EmptyState.Info>\n </EmptyState>\n );\n }\n \n return (\n <div className='d-flex flex-column gap-2'>\n <h3 className='h6 m-0'><Text namespace={namespace} phrase='listTitle' /></h3>\n <div>\n {loading && <PopupLoadingSpinner />}\n\n {!loading && (\n <Scrollbars\n autoHeight\n autoHeightMin={MIN_MAX_HEIGHT}\n autoHeightMax={MIN_MAX_HEIGHT}\n >\n {classrooms.map(classroom => (\n <ClassroomSelectorListItem\n key={classroom.id}\n id={classroom.id}\n isSelected={props.selectedClassroom?.id === classroom.id}\n name={classroom.name}\n onClickSelectGroupsOrStudents={props.onClickSelectGroupsOrStudents}\n onSelected={() => props.onClassroomSelected(classroom)}\n studentsCount={props.getStudentsCount(classroom)}\n />\n ))}\n {(props.classrooms.hasMore || props.classrooms.isFetching) && (\n <InfiniteScrollFooter\n isFetching={props.classrooms.isFetching}\n fetchNext={props.classrooms.fetchNext}\n nextCursor={props.classrooms.nextCursor}\n fetchOnScroll\n />\n )}\n </Scrollbars>\n )}\n </div>\n </div>\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType, LocationContext } from 'libs/analytics/interfaces';\n\nimport { SharableEntityType } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { MultiStepPopupViewProps } from 'libs/shared/components/multistep-popup/MultiStepPopup';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Classroom } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { FlowControls } from 'apps/assign/components/flow-controls/FlowControls';\nimport { getAssignEventLogger } from 'apps/assign/utils/get-assign-event-logger/getAssignEventLogger';\n\nimport { ClassroomSelectorList } from './components/classroom-selector-list/ClassroomSelectorList';\nimport { useClassroomSelectorData } from './hooks/use-classroom-selector-data/useClassroomSelectorData';\n\nimport styles from './classroom-selector-view.scss';\n\nconst namespace = 'assign.classroomSelectorView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface ClassroomSelectorViewProps extends MultiStepPopupViewProps {\n objectId: string;\n entityType: SharableEntityType;\n selectedClassroom: Classroom;\n setSelectedClassroom: (classroom: Classroom) => void;\n goToFlowSelector: () => void;\n goToOpenClassroomFlow: () => void;\n goToNarrowSelection: () => void;\n goToSettings: () => void;\n goToCreateClassroomForm: () => void;\n}\n\nexport function ClassroomSelectorView(props: ClassroomSelectorViewProps): JSX.Element {\n const { log } = getAssignEventLogger({\n analyticsOptions: {\n entity: EntityType.Assign,\n location: LocationContext.Popup\n },\n data: {\n entity: {\n id: props.objectId,\n type: props.entityType\n }\n }\n });\n \n const viewModel = useClassroomSelectorData({\n selectedClassroom: props.selectedClassroom,\n setSelectedClassroom: props.setSelectedClassroom,\n goToNarrowSelection: () => {\n log({\n type: 'select-narrow-selection',\n classroom: props.selectedClassroom\n });\n \n props.goToNarrowSelection();\n }\n });\n\n const { classrooms } = viewModel.data;\n\n return (\n <Popup\n size='lg'\n title={getPhrase('title')}\n showLoadingSpinner={props.loading}\n closePopup={props.closePopup}\n bodyClassName='d-flex flex-column gap-3'\n animation={props.animate}\n >\n <div className='position-relative'>\n <div className={`position-absolute top-50 start-0 translate-middle-y p-1`}>\n <SvgContainer svgName={cvSvgLibrary.Search} size={SvgContainerSize.Standard} />\n </div>\n <input\n type='text'\n value={viewModel.query}\n placeholder={getPhrase('inputPlaceholder')}\n onChange={e => viewModel.setQuery(e.target.value)}\n className={`form-control pe-1 py-2 border-dark ${styles.searchInput}`}\n />\n </div>\n\n <ClassroomSelectorList\n searchQuery={viewModel.debouncedQuery}\n classrooms={classrooms}\n selectedClassroom={props.selectedClassroom}\n getStudentsCount={viewModel.getStudentsCount}\n onClassroomSelected={viewModel.onClassroomSelected}\n onClickCreateOpenClassroom={props.goToOpenClassroomFlow}\n onClickSelectGroupsOrStudents={viewModel.onClickSelectGroupsOrStudents}\n />\n \n <FlowControls\n hideCreateClassroomButton={!viewModel.canCreateClassrooms}\n onClickBack={props.goToFlowSelector}\n onClickNext={props.goToSettings}\n disableNextButton={!props.selectedClassroom}\n onClickCreateClassroom={props.goToCreateClassroomForm}\n />\n </Popup>\n );\n}","\"use client\";\n\nimport * as React from 'react';\nimport classNames from 'classnames';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst InputGroupText = /*#__PURE__*/React.forwardRef(({\n className,\n bsPrefix,\n as: Component = 'span',\n ...props\n}, ref) => {\n bsPrefix = useBootstrapPrefix(bsPrefix, 'input-group-text');\n return /*#__PURE__*/_jsx(Component, {\n ref: ref,\n className: classNames(className, bsPrefix),\n ...props\n });\n});\nInputGroupText.displayName = 'InputGroupText';\nexport default InputGroupText;","\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { useMemo } from 'react';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport FormCheckInput from './FormCheckInput';\nimport InputGroupContext from './InputGroupContext';\nimport InputGroupText from './InputGroupText';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst InputGroupCheckbox = props => /*#__PURE__*/_jsx(InputGroupText, {\n children: /*#__PURE__*/_jsx(FormCheckInput, {\n type: \"checkbox\",\n ...props\n })\n});\nconst InputGroupRadio = props => /*#__PURE__*/_jsx(InputGroupText, {\n children: /*#__PURE__*/_jsx(FormCheckInput, {\n type: \"radio\",\n ...props\n })\n});\nconst InputGroup = /*#__PURE__*/React.forwardRef(({\n bsPrefix,\n size,\n hasValidation,\n className,\n // Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as: Component = 'div',\n ...props\n}, ref) => {\n bsPrefix = useBootstrapPrefix(bsPrefix, 'input-group');\n\n // Intentionally an empty object. Used in detecting if a dropdown\n // exists under an input group.\n const contextValue = useMemo(() => ({}), []);\n return /*#__PURE__*/_jsx(InputGroupContext.Provider, {\n value: contextValue,\n children: /*#__PURE__*/_jsx(Component, {\n ref: ref,\n ...props,\n className: classNames(className, bsPrefix, size && `${bsPrefix}-${size}`, hasValidation && 'has-validation')\n })\n });\n});\nInputGroup.displayName = 'InputGroup';\nexport default Object.assign(InputGroup, {\n Text: InputGroupText,\n Radio: InputGroupRadio,\n Checkbox: InputGroupCheckbox\n});","import React from 'react';\nimport { Form, InputGroup } from 'react-bootstrap';\nimport { useFormik } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { EntityType, LocationContext } from 'libs/analytics/interfaces';\n\nimport { SharableEntityType } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { MultiStepPopupViewProps } from 'libs/shared/components/multistep-popup/MultiStepPopup';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Classroom } from 'libs/shared/interfaces';\n\nimport { FlowControls } from 'apps/assign/components/flow-controls/FlowControls';\nimport { getAssignEventLogger } from 'apps/assign/utils/get-assign-event-logger/getAssignEventLogger';\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { ClassroomValidationSchema } from 'apps/classrooms/validation/ClassroomValidationSchema';\n\nconst namespace = 'assign.createNewClassroomView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface CreateNewClassroomViewProps extends MultiStepPopupViewProps {\n objectId: string;\n entityType: SharableEntityType;\n goToPrevStep: () => void;\n onCreateNewClassroom: (classroom: Classroom) => void;\n}\n\ninterface CreateNewClassroomFormData {\n name: string;\n}\n\nexport function CreateNewClassroomView(props: CreateNewClassroomViewProps): JSX.Element {\n const fetchAsync = Flight.useGetFetchAsync();\n\n const { log } = getAssignEventLogger({\n analyticsOptions: {\n entity: EntityType.Assign,\n location: LocationContext.Popup\n },\n data: {\n entity: {\n id: props.objectId,\n type: props.entityType\n }\n }\n });\n\n const [ loading, setLoading ] = React.useState<boolean>(false);\n\n const initialValues: CreateNewClassroomFormData = {\n name: ''\n };\n\n const formik = useFormik<CreateNewClassroomFormData>({\n initialValues,\n onSubmit: onCreateNewClassroom,\n validationSchema: ClassroomValidationSchema,\n validateOnChange: true\n });\n\n function onCreateNewClassroom(data: CreateNewClassroomFormData) {\n if (loading || !formik.isValid)\n return;\n\n setLoading(true);\n \n fetchAsync<Classroom>(ClassroomRequests.createClassroom({ name: data.name }))\n .then(newClassroom => {\n log({\n type: 'create-new-classroom',\n classroom: newClassroom\n });\n props.onCreateNewClassroom(newClassroom);\n }).catch(() => {\n formik.setFieldError('name', getPhrase('createClassroomError', { name: data.name }));\n }).finally(() => {\n setLoading(false);\n });\n }\n\n return (\n <Popup\n size='lg'\n title={getPhrase('title')}\n showLoadingSpinner={props.loading}\n animation={props.animate}\n closePopup={props.closePopup}\n bodyClassName='d-flex flex-column gap-3'\n >\n <Form className='w-100' onSubmit={formik.handleSubmit}>\n <Form.Group>\n <Form.Label htmlFor='name' className='mb-1'>\n <Text namespace={namespace} phrase='newClassroomLabel' />\n </Form.Label>\n <InputGroup hasValidation>\n <Form.Control\n type='text'\n className='form-control'\n name='name'\n id='name'\n placeholder={getPhrase('newClassroomPlaceholder')}\n value={formik.values.name}\n onChange={formik.handleChange}\n maxLength={255}\n isInvalid={!!formik.errors.name}\n />\n <Form.Control.Feedback type='invalid'>\n {formik.errors.name}\n </Form.Control.Feedback>\n </InputGroup>\n </Form.Group>\n </Form>\n <FlowControls\n hideCreateClassroomButton\n onClickBack={props.goToPrevStep}\n onClickNext={formik.submitForm}\n disableNextButton={!formik.isValid || loading || !formik.values.name.length}\n showSpinner={loading}\n nextButtonText={getPhrase('nextButton')}\n />\n </Popup>\n );\n}","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\n\nimport styles from './flow-settings.scss';\n\ninterface FlowSettingToggleItemProps {\n title: string;\n description: string;\n toggled: boolean;\n onClick: () => void;\n className?: string;\n hide?: boolean;\n disabled?: boolean;\n}\n\nfunction FlowSettingToggleItem(props: React.PropsWithChildren<FlowSettingToggleItemProps>): JSX.Element {\n const id = React.useId();\n\n if (props.hide)\n return;\n \n return (\n <Col xs={12} className={classNames(props.className)}>\n <div className='d-flex w-100'>\n <Checkbox\n id={id}\n name={id}\n onChange={props.onClick}\n checked={props.toggled}\n disabled={props.disabled}\n />\n <div className='w-100'>\n <div className='mb-1'>\n <label className='mb-1' htmlFor={id}>{props.title}</label>\n <p className='m-0 text-secondary'>{props.description}</p>\n </div>\n {props.children}\n </div>\n </div>\n </Col>\n );\n}\n\ninterface FlowSettingTextAreaItemProps {\n hide?: boolean;\n placeholder: string;\n value: string;\n onChange: (value: string) => void;\n}\n\nfunction FlowSettingTextAreaItem(props: FlowSettingTextAreaItemProps): JSX.Element {\n if (props.hide)\n return;\n\n return (\n <Col xs={12}>\n <textarea className={classNames('form-control', styles.textarea)} placeholder={props.placeholder} value={props.value} onChange={e => props.onChange(e.target.value)} />\n </Col>\n );\n}\n\ninterface FlowSettingItemDividerProps {\n withMargins?: boolean;\n hide?: boolean;\n}\n\nfunction FlowSettingItemDivider(props: FlowSettingItemDividerProps): JSX.Element {\n if (props.hide)\n return;\n \n return (\n <hr className={classNames(!props.withMargins && 'm-0')} />\n );\n}\n\ninterface FlowSettingItemsProps {\n name: string;\n className?: string;\n childContainerClassName?: string;\n hide?: boolean;\n}\n\nexport function FlowSettings(props: React.PropsWithChildren<FlowSettingItemsProps>): JSX.Element {\n if (props.hide)\n return;\n \n return (\n <Row className={classNames('flow-setting-item-group gap-3 gx-0', props.className)}>\n <Col xs={12} className='h6 m-0'>{props.name}</Col>\n <div className={classNames('d-flex flex-column gap-3', props.childContainerClassName)}>\n {props.children}\n </div>\n </Row>\n );\n}\n\nFlowSettings.Toggle = FlowSettingToggleItem;\nFlowSettings.TextArea = FlowSettingTextAreaItem;\nFlowSettings.Divider = FlowSettingItemDivider;","// extracted by mini-css-extract-plugin\nexport default {\"textarea\":\"icGmN\"};","import React from 'react';\nimport { Button } from 'react-bootstrap';\n\nimport { ShareAvatar } from 'libs/shared/apps/share-v2/components/share-avatar/ShareAvatar';\nimport { SharePrivacy } from 'libs/shared/apps/share-v2/enums/SharePrivacy';\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Classroom } from 'libs/shared/interfaces';\n\nconst namespace = 'assign.selectedClassroomHeader';\n\ninterface SelectedClassroomHeaderProps {\n classroom: Classroom;\n hideSubtitle?: boolean;\n subtitleText?: string;\n onClickChangeClassroom?: () => void;\n}\n\nexport function SelectedClassroomHeader(props: SelectedClassroomHeaderProps): JSX.Element {\n return (\n <div className='d-flex align-items-center w-100 gap-2 justify-content-between'>\n <div className='flex-grow-1'>\n <ShareAvatar\n type={ShareType.Classroom}\n privacy={SharePrivacy.Direct}\n classroomName={props.classroom.name}\n studentCount={props.classroom?.enrolments?.count}\n subtitleText={props.subtitleText}\n hideSubtitle={props.hideSubtitle ?? true}\n />\n </div>\n {typeof props.onClickChangeClassroom === 'function' &&\n <Button\n variant='link'\n className='text-info hover-text-underline'\n onClick={props.onClickChangeClassroom}\n >\n <Text namespace={namespace} phrase='changeClassroomButton' />\n </Button>\n }\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Classroom } from 'libs/shared/interfaces';\n\nimport { FlowSettings } from 'apps/assign/components/flow-settings/FlowSettings';\nimport { SelectedClassroomHeader } from 'apps/assign/components/selected-classroom-header/SelectedClassroomHeader';\n\nconst namespace = 'assign.existingClassroomFlowSettings';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SettingsFieldProps {\n // Prevent scrubbing field\n hidePreventScrubbing?: boolean;\n disablePreventScrubbing?: boolean;\n onTogglePreventScrubbing: () => void;\n preventScrubbing: boolean;\n \n // Immediate feedback field\n hideImmediateFeedback?: boolean;\n disableImmediateFeedback?: boolean;\n onToggleImmediateFeedback: () => void;\n immediateFeedback: boolean;\n\n // Message field\n hideMessage?: boolean;\n disableMessage?: boolean;\n message: string;\n onChangeMessage: (message: string) => void;\n onToggleMessage: () => void;\n toggleMessage: boolean;\n}\n\ninterface ExistingClassroomFlowSettingsProps extends SettingsFieldProps {\n selectedClassroom: Classroom;\n}\n\nexport function ExistingClassroomFlowSettings(props: ExistingClassroomFlowSettingsProps): JSX.Element {\n return (\n <div className='d-flex flex-column gap-4'>\n <SelectedClassroomHeader\n classroom={props.selectedClassroom}\n hideSubtitle={false}\n subtitleText={getPhrase('studentsCount', { smartCount: props.selectedClassroom?.enrolments?.count ?? 0 })}\n />\n\n <FlowSettings\n name={getPhrase('videoSettingsTitle')}\n hide={props.hidePreventScrubbing && props.hideImmediateFeedback}\n >\n <FlowSettings.Toggle\n hide={props.hidePreventScrubbing}\n title={getPhrase('preventScrubbingTitle')}\n description={getPhrase('preventScrubbingDescription')}\n onClick={props.onTogglePreventScrubbing}\n toggled={props.preventScrubbing}\n disabled={props.disablePreventScrubbing}\n />\n <FlowSettings.Toggle\n hide={props.hideImmediateFeedback}\n title={getPhrase('immediateFeedbackTitle')}\n description={getPhrase('immediateFeedbackDescription')}\n onClick={props.onToggleImmediateFeedback}\n toggled={props.immediateFeedback}\n disabled={props.disableImmediateFeedback}\n />\n </FlowSettings>\n\n <FlowSettings.Divider hide={props.hidePreventScrubbing && props.hideImmediateFeedback} />\n \n <FlowSettings\n name={getPhrase('moreOptionsTitle')}\n hide={props.hideMessage}\n childContainerClassName='d-flex flex-column gap-2'\n >\n <FlowSettings.Toggle\n hide={props.hideMessage}\n title={getPhrase('messageTitle')}\n description={getPhrase('messageDescription')}\n onClick={props.onToggleMessage}\n toggled={props.toggleMessage}\n disabled={props.disableMessage}\n >\n <FlowSettings.TextArea\n hide={!props.toggleMessage}\n placeholder={getPhrase('messagePlaceholder')}\n onChange={props.onChangeMessage}\n value={props.message}\n />\n </FlowSettings.Toggle>\n </FlowSettings>\n \n </div>\n );\n}","import { Flight } from 'libs/common/react/index';\n\nimport { ShareRequests as ShareRequestsV1 } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { SharePrivacyResponse } from 'libs/shared/apps/share/interfaces/responses/SharePrivacyResponse';\nimport { SharePrivacy } from 'libs/shared/apps/share-v2/enums/SharePrivacy';\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { ShareRequests as ShareRequestsV2 } from 'libs/shared/apps/share-v2/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\n\nimport { SharePincode } from '../interfaces/SharePincode';\n\ninterface CreateDirectShareOptions {\n objectId: string;\n preventScrubbing: boolean;\n immediateFeedback: boolean;\n requireSignIn: boolean;\n message?: string;\n recipients: string[];\n scopeId: string;\n}\n\ninterface CreateOpenSessionOptions {\n objectId: string;\n preventScrubbing: boolean;\n immediateFeedback: boolean;\n requireSignIn: boolean;\n respectRatingsAndRestrictions: boolean;\n}\n\ninterface CreatePincodeOptions {\n shareId: string;\n}\n\nexport function useCreateShare(objectId: string) {\n const accessPermissions = Flight.useBasicFetch<SharePrivacyResponse>(ShareRequestsV1.getPrivacy(objectId));\n const fetchAsync = Flight.useGetFetchAsync();\n const canManageAccess = accessPermissions.data?.canManageAccess;\n\n async function createDirectShare(options: CreateDirectShareOptions) {\n if (!accessPermissions.data) return;\n\n const privacy = options.requireSignIn ? SharePrivacy.Direct : SharePrivacy.PinCode;\n\n const share = await fetchAsync<Share>(ShareRequestsV2.createShare({\n objectId: options.objectId,\n type: ShareType.Classroom,\n privacy,\n optionRequest: {\n preventScrubbing: options.preventScrubbing,\n immediateFeedback: options.immediateFeedback\n },\n recipientRequest: options\n .recipients\n .map(recipientId => ({ recipientId, message: options.message, scopeId: options.scopeId }))\n }));\n\n if (privacy === SharePrivacy.PinCode)\n await createPincode({ shareId: share.shareId });\n\n return share;\n }\n\n async function createOpenSession(options: CreateOpenSessionOptions) {\n if (!accessPermissions.data) return;\n\n let privacy = SharePrivacy.PinCode;\n\n if (options.requireSignIn) {\n if (options.respectRatingsAndRestrictions) {\n privacy = canManageAccess ? SharePrivacy.JustMySchool : SharePrivacy.Protected;\n } else {\n privacy = canManageAccess\n ? SharePrivacy.JustMySchoolOverrideRestriction\n : SharePrivacy.ProtectedOverrideRestriction;\n }\n }\n\n const share = await fetchAsync<Share>(ShareRequestsV2.createShare({\n objectId: options.objectId,\n type: ShareType.Open,\n privacy,\n optionRequest: {\n preventScrubbing: options.preventScrubbing,\n immediateFeedback: options.immediateFeedback\n }\n }));\n\n if (privacy === SharePrivacy.PinCode)\n await createPincode({ shareId: share.shareId });\n\n return share;\n }\n\n async function createPincode(options: CreatePincodeOptions) {\n return await fetchAsync<SharePincode>(ShareRequestsV2.createSharePincode(options.shareId));\n }\n\n return {\n createDirectShare,\n createOpenSession,\n canManageAccess,\n hasCompleted: accessPermissions.hasCompleted\n };\n}\n","import React from 'react';\n\nimport { Flight } from 'libs/common/react/index';\n\nimport { useCreateShare } from 'libs/shared/apps/share-v2/hooks/useCreateShare';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { SharableEntityType } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { Classroom, YearGroup } from 'libs/shared/interfaces';\n\nimport { useAssignSharedData } from 'apps/assign/hooks/useAssignSharedData';\n\ninterface UseExistingClassroomFlowSettingsDataOptions {\n objectId: string;\n entityType: SharableEntityType;\n\n selectedClassroom: Classroom;\n recipients: string[];\n}\n\ntype ExistingClassroomFlowSettings = 'preventScrubbing' | 'immediateFeedback' | 'message';\ntype ExistingClassroomFlowSettingsMap = {[key in ExistingClassroomFlowSettings]: boolean};\n\nexport function useExistingClassroomFlowSettingsData(options: UseExistingClassroomFlowSettingsDataOptions) {\n const sharedData = useAssignSharedData({\n entityType: options.entityType,\n objectId: options.objectId\n });\n\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n CustomerRequests.yearGroups(sharedData.currentUser.data?.customerId)\n );\n\n const { createDirectShare } = useCreateShare(options.objectId);\n const [ loading, setLoading ] = React.useState<boolean>(false);\n\n const [ settings, setSettings ] = React.useState<ExistingClassroomFlowSettingsMap>({\n preventScrubbing: sharedData.interactive.data?.preventScrubbing || false,\n immediateFeedback: sharedData.interactive.data?.immediateFeedback || false,\n message: false\n });\n const [ message, setMessage ] = React.useState('');\n\n const loaded = (\n sharedData.loaded\n && !!yearGroups.data\n );\n\n function onChangeSetting(setting: ExistingClassroomFlowSettings, value: boolean) {\n setSettings(prev => (\n { ...prev,\n [setting]: value\n }\n ));\n }\n\n function toggleSetting(setting: ExistingClassroomFlowSettings) {\n onChangeSetting(setting, !settings[setting]);\n }\n\n function onChangeMessage(message: string) {\n setMessage(message);\n }\n\n async function onShare(onSuccess?: (share: Share) => void) {\n if (!options.selectedClassroom)\n return;\n\n setLoading(true);\n\n try {\n const share = await createDirectShare({\n objectId: options.objectId,\n preventScrubbing: settings.preventScrubbing,\n immediateFeedback: settings.immediateFeedback,\n requireSignIn: true,\n message: message,\n recipients: options.recipients.length ? options.recipients : [options.selectedClassroom?.id],\n scopeId: options.selectedClassroom?.id\n });\n \n typeof onSuccess === 'function' && onSuccess(share);\n \n setLoading(false);\n } catch (ex: unknown) {\n /**\n * @todo Needs better error handling\n */\n console.error('Could not create');\n } finally {\n setLoading(false);\n }\n }\n\n return {\n data: {\n loaded,\n config: sharedData.config,\n entity: sharedData.entity,\n yearGroups\n },\n message,\n settings,\n shouldShowSpinner: loading,\n hasStudentExp: sharedData.hasStudentExp,\n toggleSetting,\n onChangeMessage,\n onShare\n };\n}\n ","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { SharableEntityType } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { MultiStepPopupViewProps } from 'libs/shared/components/multistep-popup/MultiStepPopup';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { Classroom } from 'libs/shared/interfaces';\n\nimport { FlowControls } from 'apps/assign/components/flow-controls/FlowControls';\n\nimport { ExistingClassroomFlowSettings } from './components/existing-classroom-flow-settings/ExistingClassroomFlowSettings';\nimport { useExistingClassroomFlowSettingsData } from './hooks/useExistingClassroomFlowSettingsData';\n\nconst namespace = 'assign.existingClassroomFlowSettingsView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface ExistingClassroomFlowSettingsViewProps extends MultiStepPopupViewProps {\n objectId: string;\n entityType: SharableEntityType;\n recipients: string[];\n selectedClassroom: Classroom;\n goToPrevStep: () => void;\n onShare: (share: Share) => void;\n}\n\nexport function ExistingClassroomFlowSettingsView(props: ExistingClassroomFlowSettingsViewProps): JSX.Element {\n const viewModel = useExistingClassroomFlowSettingsData({\n entityType: props.entityType,\n objectId: props.objectId,\n recipients: props.recipients,\n selectedClassroom: props.selectedClassroom\n });\n\n const { loaded } = viewModel.data;\n\n function onClickNext() {\n viewModel.onShare(props.onShare);\n }\n \n return (\n <Popup\n size='lg'\n title={getPhrase('title')}\n showLoadingSpinner={!loaded || props.loading}\n closePopup={props.closePopup}\n bodyClassName='d-flex flex-column gap-3'\n animation={props.animate}\n >\n <ExistingClassroomFlowSettings\n selectedClassroom={props.selectedClassroom}\n message={viewModel.message}\n toggleMessage={viewModel.settings.message}\n immediateFeedback={viewModel.settings.immediateFeedback}\n preventScrubbing={viewModel.settings.preventScrubbing}\n onChangeMessage={viewModel.onChangeMessage}\n onToggleMessage={() => viewModel.toggleSetting('message')}\n hideImmediateFeedback={props.entityType !== 'interactive'}\n hidePreventScrubbing={props.entityType !== 'interactive'}\n onTogglePreventScrubbing={() => viewModel.toggleSetting('preventScrubbing')}\n onToggleImmediateFeedback={() => viewModel.toggleSetting('immediateFeedback')}\n />\n <FlowControls\n hideCreateClassroomButton\n onClickBack={props.goToPrevStep}\n onClickNext={onClickNext}\n nextButtonText={getPhrase('assignButton')}\n showSpinner={viewModel.shouldShowSpinner}\n />\n </Popup>\n );\n}","export enum SelectionType {\n Groups = 'groups',\n Students = 'students'\n}","import React from 'react';\n\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\ninterface AccordionItemProps {\n title: string;\n intialShow?: boolean;\n}\n\nfunction AccordionItem(props: React.PropsWithChildren<AccordionItemProps>) {\n const [ show, setShow ] = React.useState(props.intialShow || false);\n \n return (\n <div>\n <div className='d-flex align-items-center justify-content-between'>\n <h3 className='h6 m-0 p-0'>{props.title}</h3>\n <IconButton\n svgName={show ? cvSvgLibrary.ChevronUp : cvSvgLibrary.ChevronDown}\n onClick={() => setShow(!show)}\n />\n </div>\n {show && (\n <div>{props.children}</div>\n )}\n </div>\n );\n}\n\nexport function Accordion(props: React.PropsWithChildren) {\n return (\n <div className='d-flex flex-column gap-2'>\n {props.children}\n </div>\n );\n}\n\nAccordion.Item = AccordionItem;","import React from 'react';\nimport Scrollbars from 'react-custom-scrollbars-2';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { BaseObject } from 'libs/shared/interfaces';\n\ninterface ClassroomEntityListItemProps<T extends BaseObject> {\n entity: T;\n isSelected: boolean;\n isDisabled: boolean;\n icon: JSX.Element;\n title: JSX.Element;\n tooltipText?: string;\n onClick: () => void;\n}\n\nfunction ClassroomEntityListItem<T extends BaseObject>(props: ClassroomEntityListItemProps<T>): JSX.Element {\n const showTooltip = props.isDisabled && props.isSelected && !!props.tooltipText;\n\n return (\n <DivButton\n className={classNames(`d-flex align-items-center px-2 py-1 w-100 rounded gap-2 cursor-pointer justify-content-between`, !props.isDisabled && 'bg-light-hover')}\n onClick={props.onClick}\n disabled={props.isDisabled}\n >\n <Tooltip placement='right' title={props.tooltipText} disable={!showTooltip} spanHack trigger={[ 'hover', 'focus' ]}>\n <div className={classNames('d-flex align-items-center', showTooltip && 'pe-2')}>\n <Checkbox\n name={props.entity.id}\n id={props.entity.id}\n onChange={props.onClick}\n checked={props.isSelected}\n disabled={props.isDisabled}\n />\n <div className='d-flex align-items-center gap-2'>\n <div>\n {props.icon}\n </div>\n <div className='w-100'>\n {props.title}\n </div>\n </div>\n </div>\n </Tooltip>\n </DivButton>\n );\n}\n\ninterface ClassroomEntityListProps<T extends BaseObject> {\n entities: T[];\n selectedEntities: T[];\n emptyState: JSX.Element;\n disableSelected?: boolean;\n tooltipText?: string;\n onSelectEntity: (entity: T) => void;\n renderIcon: (entity: T, isSelected: boolean, isDisabled: boolean) => JSX.Element;\n renderTitle?: (entity: T, isSelected: boolean, isDisabled: boolean) => JSX.Element;\n}\n\nexport function ClassroomEntityList<T extends BaseObject>(\n props: ClassroomEntityListProps<T>\n): JSX.Element {\n if (!props.entities.length) {\n return <>{props.emptyState}</>;\n }\n\n return (\n <div className='d-flex flex-column'>\n <Scrollbars\n autoHeight\n autoHeightMin={0}\n autoHeightMax={120}\n >\n {props.entities.map(entity => {\n const isSelected = !!props.selectedEntities.find(e => entity.id.toString() === e.id.toString());\n const isDisabled = isSelected && props.disableSelected;\n const title = typeof props.renderTitle === 'function'\n ? props.renderTitle(entity, isSelected, isDisabled)\n : <span className='m-0'>{entity.name}</span>;\n \n return (\n <ClassroomEntityListItem<T>\n key={entity.id}\n entity={entity}\n title={title}\n isDisabled={isDisabled}\n isSelected={isSelected}\n icon={props.renderIcon(entity, isSelected, isDisabled)}\n onClick={() => props.onSelectEntity(entity)}\n tooltipText={props.tooltipText}\n />\n );\n })}\n </Scrollbars>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { IconCircle } from 'libs/shared/components/icon-circle/IconCircle';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ClassroomGroup, User } from 'libs/shared/interfaces';\nimport { mapColourToBsVariant } from 'libs/shared/utils/GroupHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { AssignHelper } from 'apps/assign/utils/AssignHelper';\n\nimport { SelectionType } from '../../enums/SelectionType';\nimport { Accordion } from '../accordion/Accordion';\nimport { ClassroomEntityList } from '../classroom-entity-list/ClassroomEntityList';\n\nconst namespace = 'assign.narrowClassroomSelectionControls';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface NarrowClassroomSelectionControlsProps {\n learners: User[];\n groups: ClassroomGroup[];\n setRecipients: (recipients: string[]) => void;\n}\n\nexport function NarrowClassroomSelectionControls(props: NarrowClassroomSelectionControlsProps): JSX.Element {\n const [ type, setType ] = React.useState<SelectionType>(SelectionType.Students);\n const [ selectedGroups, setSelectedGroups ] = React.useState<ClassroomGroup[]>([]);\n const [ selectedLearners, setSelectedLearners ] = React.useState<User[]>([]);\n\n const allStudentsSelected = selectedLearners.length === props.learners.length;\n\n function onSelectGroup(group: ClassroomGroup) {\n const newSelectedGroups = AssignHelper.getSelectedEntities(selectedGroups, group);\n \n if (!newSelectedGroups.length) {\n setType(null);\n } else {\n setType(SelectionType.Groups);\n }\n \n setSelectedGroups(newSelectedGroups);\n setSelectedLearners(AssignHelper.getLearnersForGroups(newSelectedGroups));\n props.setRecipients(AssignHelper.getRecipients(newSelectedGroups));\n }\n\n function onSelectLearner(learner: User) {\n const newSelectedStudents = AssignHelper.getSelectedEntities(selectedLearners, learner);\n \n if (!newSelectedStudents.length) {\n setType(null);\n } else {\n setType(SelectionType.Students);\n }\n \n setSelectedGroups([]);\n setSelectedLearners(newSelectedStudents);\n props.setRecipients(AssignHelper.getRecipients(newSelectedStudents));\n }\n\n function onToggleAll() {\n setSelectedGroups([]);\n setType(SelectionType.Students);\n if (allStudentsSelected) {\n setSelectedLearners([]);\n props.setRecipients([]);\n return;\n }\n \n setSelectedLearners(props.learners);\n props.setRecipients(AssignHelper.getRecipients(props.learners));\n }\n \n return (\n <>\n <div className='d-flex flex-column gap-3'>\n <h3 className='h6 m-0'><Text namespace={namespace} phrase='shareToStudents' options={{ smartCount: props.learners.length }} /></h3>\n <div>\n <Checkbox\n id='all'\n checked={type !== SelectionType.Groups && allStudentsSelected}\n label={getPhrase('allStudentsLabel', { smartCount: props.learners.length })}\n onChange={onToggleAll}\n indeterminate={type === SelectionType.Groups}\n />\n </div>\n </div>\n <Accordion>\n <Accordion.Item\n intialShow\n title={getPhrase('groupsTitle', { selected: selectedGroups.length, smartCount: props.groups.length })}\n >\n <ClassroomEntityList\n entities={props.groups}\n selectedEntities={selectedGroups}\n onSelectEntity={onSelectGroup}\n emptyState={<div><Text namespace={namespace} phrase='emptyGroups' /></div>}\n renderIcon={group => (\n <IconCircle\n svgName={cvSvgLibrary.Group}\n svgSize={SvgContainerSize.Small}\n variant={mapColourToBsVariant(group.metadata?.colour)}\n textVariant='white'\n svgWrapperClassName='p-1'\n />\n )}\n />\n </Accordion.Item>\n <Accordion.Item\n intialShow\n title={getPhrase('studentsTitle', { selected: selectedLearners.length, smartCount: props.learners.length })}\n >\n <ClassroomEntityList\n entities={props.learners}\n selectedEntities={selectedLearners}\n onSelectEntity={onSelectLearner}\n emptyState={<div><Text namespace={namespace} phrase='emptyStudents' /></div>}\n renderIcon={() => (\n <IconCircle\n svgName={cvSvgLibrary.User}\n svgSize={SvgContainerSize.Small}\n variant='primary'\n textVariant='white'\n svgWrapperClassName='p-1'\n />\n )}\n disableSelected={type === SelectionType.Groups}\n tooltipText={getPhrase('studentInSelectedGroup')}\n />\n </Accordion.Item>\n </Accordion>\n </>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SharableEntityType } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { MultiStepPopupViewProps } from 'libs/shared/components/multistep-popup/MultiStepPopup';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { Classroom } from 'libs/shared/interfaces';\n\nimport { FlowControls } from 'apps/assign/components/flow-controls/FlowControls';\nimport { SelectedClassroomHeader } from 'apps/assign/components/selected-classroom-header/SelectedClassroomHeader';\n\nimport { NarrowClassroomSelectionControls } from './components/narrow-classroom-selection-controls/NarrowClassroomSelectionControls';\nimport { useNarrowClassroomSelectionData } from './hooks/useNarrowClassroomSelectionData';\n\nconst namespace = 'assign.narrowClassroomSelectionView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface NarrowClassroomSelectionViewProps extends MultiStepPopupViewProps {\n objectId: string;\n entityType: SharableEntityType;\n recipients: string[];\n selectedClassroom: Classroom;\n onChangeRecipients: (r: string[]) => void;\n goToSelectClassroom: () => void;\n goToSettings: () => void;\n goToPrevStep: () => void;\n}\n\nexport function NarrowClassroomSelectionView(props: NarrowClassroomSelectionViewProps): JSX.Element {\n const viewModel = useNarrowClassroomSelectionData({\n selectedClassroom: props.selectedClassroom\n });\n\n const { loaded, groups, learners } = viewModel.data;\n\n return (\n <Popup\n size='lg'\n title={getPhrase('title')}\n showLoadingSpinner={!loaded || props.loading}\n closePopup={props.closePopup}\n bodyClassName='d-flex flex-column gap-3'\n animation={props.animate}\n >\n <SelectedClassroomHeader\n classroom={props.selectedClassroom}\n onClickChangeClassroom={props.goToSelectClassroom}\n />\n\n <NarrowClassroomSelectionControls\n groups={groups}\n learners={learners}\n setRecipients={props.onChangeRecipients}\n />\n\n <FlowControls\n hideCreateClassroomButton\n onClickBack={props.goToPrevStep}\n onClickNext={props.goToSettings}\n nextButtonTooltip={!props.recipients.length && getPhrase('noRecipients')}\n disableNextButton={!props.selectedClassroom || !props.recipients.length}\n />\n </Popup>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { SharedObjectImage } from 'libs/shared/apps/share/components/shared-object-image/SharedObjectImage';\nimport { SharableEntity } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { SharableEntityType } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { MultiStepPopupViewProps } from 'libs/shared/components/multistep-popup/MultiStepPopup';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Classroom } from 'libs/shared/interfaces';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { useAssignSharedData } from 'apps/assign/hooks/useAssignSharedData';\n\nimport styles from './no-students-details-view.scss';\n\nconst namespace = 'assign.noStudentsDetailsView';\n\ninterface ViewImageProps {\n entity: SharableEntity;\n}\n\nfunction ViewImage(props: ViewImageProps): JSX.Element {\n return (\n <div className='position-relative mb-3'>\n <figure className={styles.background} style={{ backgroundImage: `url(${ImageUrls.Assign.NO_STUDENTS.BACKGROUND})` }} />\n <div className={classNames('position-absolute bottom-0', styles.foreground)}>\n <figure className={classNames('position-absolute m-0', styles.plane)} style={{ backgroundImage: `url(${ImageUrls.Assign.NO_STUDENTS.PLANE})` }} />\n <div className={classNames('position-absolute', styles.entity)}>\n <SharedObjectImage\n object={props.entity}\n locationContext={LocationContext.AssignFlowView}\n imageClassName='border border-dark'\n thumbnailSize='sm'\n fixedHeight\n />\n </div>\n <figure className={classNames('position-absolute m-0', styles.flap) } style={{ backgroundImage: `url(${ImageUrls.Assign.NO_STUDENTS.PLANE_FLAP})` }} />\n </div>\n </div>\n );\n}\n\nexport interface NoStudentsDetailsViewProps extends MultiStepPopupViewProps {\n objectId: string;\n entityType: SharableEntityType;\n selectedClassroom: Classroom;\n}\n\nexport function NoStudentsDetailsView(props: NoStudentsDetailsViewProps): JSX.Element {\n const { entity, loaded } = useAssignSharedData({\n entityType: props.entityType,\n objectId: props.objectId\n });\n \n const addStudentsAppLink: Core.AppLink = {\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.CLASSROOM_STUDENTS,\n args: [props.selectedClassroom.id]\n };\n \n return (\n <Popup\n size='lg'\n showLoadingSpinner={!loaded || props.loading}\n closePopup={props.closePopup}\n bodyClassName='d-flex flex-column gap-3'\n animation={props.animate}\n hideTitle\n >\n <div className='d-flex flex-column align-items-center justify-content-center py-2 text-center'>\n <ViewImage entity={entity.data} />\n \n <h3 className='mb-3'>\n <Text namespace={namespace} phrase='title' />\n </h3>\n <p className={classNames('mb-4', styles.description)}>\n <Text namespace={namespace} phrase='description' />\n </p>\n <AppLink\n appLink={addStudentsAppLink}\n className='btn btn-dark'\n >\n <Text namespace={namespace} phrase='addStudentsButton' options={{ classroomName: props.selectedClassroom.name }} />\n </AppLink>\n </div>\n </Popup>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"description\":\"sXT7V\",\"background\":\"LP0Xh\",\"foreground\":\"OPnkT\",\"plane\":\"Xtv19\",\"entity\":\"UX2aX\",\"flap\":\"MaOad\"};","import { MultiStepItemConfig } from 'libs/shared/components/multistep-popup/MultiStepPopup';\n\nimport { ExistingClassroomFlowSteps } from 'apps/assign/interfaces/Assign';\nimport { AssignDetailsView, AssignDetailsViewProps } from 'apps/assign/views/assign-details-view/AssignDetailsView';\nimport { ClassroomCreatePromptView, ClassroomCreatePromptViewProps } from 'apps/assign/views/classroom-create-prompt-view/ClassroomCreatePromptView';\nimport { ClassroomSelectorView, ClassroomSelectorViewProps } from 'apps/assign/views/classroom-selector-view/ClassroomSelectorView';\nimport { CreateNewClassroomView, CreateNewClassroomViewProps } from 'apps/assign/views/create-new-classroom-view/CreateNewClassroomView';\nimport { ExistingClassroomFlowSettingsView, ExistingClassroomFlowSettingsViewProps } from 'apps/assign/views/existing-classroom-flow-settings-view/ExistingClassroomFlowSettingsView';\nimport { NarrowClassroomSelectionView, NarrowClassroomSelectionViewProps } from 'apps/assign/views/narrow-classroom-selection-view/NarrowClassroomSelectionView';\nimport { NoStudentsDetailsView, NoStudentsDetailsViewProps } from 'apps/assign/views/no-students-details-view/NoStudentsDetailsView';\n\nexport type AllExistingClassroomFlowViewProps =\n & ClassroomSelectorViewProps\n & NarrowClassroomSelectionViewProps\n & ExistingClassroomFlowSettingsViewProps\n & ClassroomCreatePromptViewProps\n & CreateNewClassroomViewProps\n & AssignDetailsViewProps\n & NoStudentsDetailsViewProps;\n\nconst config: MultiStepItemConfig<AllExistingClassroomFlowViewProps, ExistingClassroomFlowSteps> = {\n 'create-classroom': { view: ClassroomCreatePromptView },\n 'create-classroom-form': { view: CreateNewClassroomView },\n 'select-classroom': { view: ClassroomSelectorView },\n 'narrow-selection': { view: NarrowClassroomSelectionView },\n 'settings': { view: ExistingClassroomFlowSettingsView },\n 'assign-details': { view: AssignDetailsView },\n 'no-students-details': { view: NoStudentsDetailsView }\n};\n\nexport const ExistingClassroomStepConfig = config;","import React from 'react';\n\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { useDebounce } from 'libs/shared/hooks/UseDebounce';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { Classroom } from 'libs/shared/interfaces';\n\nimport { useFetchClassrooms } from 'apps/classrooms/hooks/useFetchClassrooms';\n\ninterface UseClassroomSelectorDataOptions {\n selectedClassroom: Classroom;\n setSelectedClassroom: (classroom: Classroom) => void;\n goToNarrowSelection: () => void;\n}\n\nconst MIN_SEARCH_LENGTH = 2;\n\nexport function useClassroomSelectorData(options: UseClassroomSelectorDataOptions) {\n const { hasPermissions } = usePermissions();\n \n const [ query, setQuery ] = React.useState<string>('');\n\n const debouncedQuery = useDebounce(query, 300);\n\n const isSearching = debouncedQuery.length >= MIN_SEARCH_LENGTH;\n \n const classrooms = useFetchClassrooms(\n isSearching && debouncedQuery,\n { withStudentsCount: true }\n );\n\n function onClassroomSelected(classroom: Classroom) {\n options.setSelectedClassroom(classroom);\n }\n\n function onClickSelectGroupsOrStudents() {\n if (!options.selectedClassroom)\n return;\n \n options.goToNarrowSelection();\n }\n\n function getStudentsCount(classroom: Classroom): number {\n let count = classroom.enrolments?.count;\n \n if (isSearching)\n count = classroom.users?.count;\n \n return count || 0;\n }\n\n return {\n data: {\n classrooms\n },\n query,\n debouncedQuery,\n canCreateClassrooms: hasPermissions(PermissionName.CreateClassrooms),\n setQuery,\n getStudentsCount,\n onClassroomSelected,\n onClickSelectGroupsOrStudents\n };\n}\n ","// extracted by mini-css-extract-plugin\nexport default {\"searchInput\":\"aDvD8\"};","import { Flight } from 'libs/common/react/index';\n\nimport { Classroom, ClassroomGroupCollection, UserCollection } from 'libs/shared/interfaces';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\n\ninterface useNarrowClassroomSelectionDataOptions {\n selectedClassroom: Classroom;\n}\n\nexport function useNarrowClassroomSelectionData(options: useNarrowClassroomSelectionDataOptions) {\n const selectedClassroomLearners = Flight.useBasicFetch<UserCollection>(\n options.selectedClassroom && ClassroomRequests.getClassroomStudents(options.selectedClassroom.id)\n );\n\n const selectedClassroomGroups = Flight.useBasicFetch<ClassroomGroupCollection>(\n options.selectedClassroom && ClassroomRequests.getClassroomGroups(options.selectedClassroom.id)\n );\n\n const learners = selectedClassroomLearners.data?.data || [];\n const groups = selectedClassroomGroups.data?.data || [];\n const loaded = (\n !!selectedClassroomGroups.data &&\n !!selectedClassroomLearners.data\n );\n\n return {\n data: {\n loaded,\n groups,\n learners\n }\n };\n}\n ","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType, LocationContext } from 'libs/analytics/interfaces';\n\nimport { SharableEntityType } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { MultiStepPopup, MultiStepPopupViewProps } from 'libs/shared/components/multistep-popup/MultiStepPopup';\n\nimport { useAssignSharedData } from 'apps/assign/hooks/useAssignSharedData';\nimport { ExistingClassroomFlowSteps } from 'apps/assign/interfaces/Assign';\nimport { getAssignEventLogger } from 'apps/assign/utils/get-assign-event-logger/getAssignEventLogger';\n\nimport { AllExistingClassroomFlowViewProps, ExistingClassroomStepConfig } from './config/ExistingClassroomStepConfig';\nimport { useExistingClassroomFlowData } from './hooks/useExistingClassroomFlowData';\n\nconst namespace = 'assign.existingClassroomFlowView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\nexport interface ExistingClassroomFlowViewProps extends MultiStepPopupViewProps {\n objectId: string;\n entityType: SharableEntityType;\n initialStep?: ExistingClassroomFlowSteps;\n goToFlowSelector: () => void;\n goToOpenClassroomFlow: () => void;\n}\n\nexport function ExistingClassroomFlowView(props: ExistingClassroomFlowViewProps): JSX.Element {\n const sharedData = useAssignSharedData({\n entityType: props.entityType,\n objectId: props.objectId\n });\n\n const { log } = getAssignEventLogger({\n analyticsOptions: {\n entity: EntityType.Assign,\n location: LocationContext.Popup\n },\n data: {\n entity: {\n id: props.objectId,\n type: props.entityType\n }\n }\n });\n \n const viewModel = useExistingClassroomFlowData({ initialStep: props.initialStep, log });\n\n const data: AllExistingClassroomFlowViewProps = {\n objectId: props.objectId,\n entityType: props.entityType,\n closePopup: props.closePopup,\n goToFlowSelector: props.goToFlowSelector,\n goToOpenClassroomFlow: props.goToOpenClassroomFlow,\n\n shareId: viewModel.share?.shareId,\n loading: !sharedData.loaded,\n recipients: viewModel.recipients,\n instanceRegion: sharedData.currentUser.data?.instanceRegion,\n selectedClassroom: viewModel.selectedClassroom,\n detailsTitle: getPhrase('existingClassroomTitle'),\n onShare: viewModel.onShare,\n onChangeRecipients: viewModel.onChangeRecipients,\n setSelectedClassroom: viewModel.setSelectedClassroom,\n goToPrevStep: viewModel.goToPrevStep,\n onCreateNewClassroom: viewModel.onCreateNewClassroom,\n goToSettings: () => viewModel.setStep('settings'),\n goToSelectClassroom: () => viewModel.setStep('select-classroom'),\n goToNarrowSelection: () => viewModel.setStep('narrow-selection'),\n goToCreateClassroomForm: () => viewModel.setStep('create-classroom-form')\n };\n \n return (\n <MultiStepPopup<AllExistingClassroomFlowViewProps, ExistingClassroomFlowSteps>\n data={data}\n loading={!sharedData.loaded}\n animate={false}\n step={viewModel.step}\n setStep={viewModel.setStep}\n closePopup={props.closePopup}\n steps={ExistingClassroomStepConfig}\n />\n );\n}","import React from 'react';\n\nimport { Flight } from 'libs/common/react/index';\n\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { Classroom, UserCollection } from 'libs/shared/interfaces';\n\nimport { ExistingClassroomFlowSteps } from 'apps/assign/interfaces/Assign';\nimport { AssignLogFn } from 'apps/assign/utils/get-assign-event-logger/getAssignEventLogger';\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\n\ninterface UseExistingClassroomFlowDataOptions {\n initialStep?: ExistingClassroomFlowSteps;\n log: AssignLogFn;\n}\n\nexport function useExistingClassroomFlowData(options: UseExistingClassroomFlowDataOptions) {\n const fetchAsync = Flight.useGetFetchAsync();\n \n const [ step, setStep ] = React.useState<ExistingClassroomFlowSteps>(options.initialStep ?? 'select-classroom');\n const [ share, setShare ] = React.useState<Share>();\n const [ prevStep, setPrevStep ] = React.useState<ExistingClassroomFlowSteps[]>([]);\n const [ selectedClassroom, setSelectedClassroom ] = React.useState<Classroom>();\n const [ recipients, setRecipients ] = React.useState<string[]>([]);\n \n const hasPrevStep = !!prevStep.length;\n\n function onChangeStep(nextStep: ExistingClassroomFlowSteps) {\n setPrevStep([ ...prevStep, step ]);\n setStep(nextStep);\n }\n\n function onChangeRecipients(recipients: string[]) {\n setRecipients(recipients);\n }\n\n function onCreateNewClassroom(classroom: Classroom) {\n setSelectedClassroom(classroom);\n setStep('settings');\n }\n\n function goToPrevStep() {\n if (!hasPrevStep)\n return;\n\n const steps = [...prevStep];\n setStep(steps.pop());\n setPrevStep(steps);\n }\n\n async function hasStudentsInClassroom(): Promise<boolean> {\n if (!selectedClassroom)\n return false;\n\n const students = await fetchAsync<UserCollection>(ClassroomRequests.getClassroomStudents(selectedClassroom.id));\n\n return !!students.data.length;\n }\n\n /**\n * This method is executed after we assign the entity and at this point it has already been shared.\n * We do this check just to see what the next step should be.\n * If the check fails we should just take them to 'assign-details' step since thats generic.\n */\n async function onShare(share: Share) {\n setShare(share);\n\n let step: ExistingClassroomFlowSteps = 'assign-details';\n \n try {\n const hasStudents = await hasStudentsInClassroom();\n \n if (!hasStudents) {\n step = 'no-students-details';\n return;\n }\n } finally {\n options.log({\n type: 'create-existing-classroom',\n share: share,\n nextStep: step\n });\n \n setStep(step);\n }\n }\n\n return {\n step,\n share,\n recipients,\n hasPrevStep,\n selectedClassroom,\n onShare,\n setShare,\n goToPrevStep,\n onChangeRecipients,\n setSelectedClassroom,\n setStep: onChangeStep,\n onCreateNewClassroom\n };\n}\n ","import React from 'react';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'shared.newBadge';\n\ninterface NewBadgeProps {\n invert?: boolean;\n size: 'sm' | 'std';\n}\n\nexport function NewBadge(props: NewBadgeProps): JSX.Element {\n return (\n <span className={classNames(\n 'badge badge-wrapper rounded-pill d-flex justify-content-center',\n 'fw-medium text-green',\n props.size === 'sm' ? 'badge-sm' : 'badge-std',\n props.invert ? 'bg-white' : 'bg-light-green'\n )}>\n <Text phrase='new' namespace={namespace} />\n </span>\n );\n}","import React from 'react';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'shared.recommendedBadge';\n\ninterface RecommendedBadgeProps {\n invert?: boolean;\n size: 'sm' | 'std';\n}\n\nexport function RecommendedBadge(props: RecommendedBadgeProps): JSX.Element {\n return (\n <span className={classNames(\n 'badge badge-wrapper rounded-pill d-flex justify-content-center',\n 'fw-medium text-blue',\n props.size === 'sm' ? 'badge-sm' : 'badge-std',\n props.invert ? 'bg-white' : 'bg-light-blue'\n )}>\n <Text phrase='recommended' namespace={namespace} />\n </span>\n );\n}","import React from 'react';\n\nimport { NewBadge } from 'shared/components/new-badge/NewBadge';\nimport { RecommendedBadge } from 'shared/components/recommended-badge/RecommendedBadge';\n\nimport { AssignFlowSteps } from 'apps/assign/interfaces/Assign';\n\n\ninterface FlowOptionBadgeProps {\n hovered: boolean;\n hasClassrooms: boolean;\n type: AssignFlowSteps;\n}\n\nexport function FlowOptionBadge(props: FlowOptionBadgeProps): JSX.Element {\n if (props.type === 'existing-classroom') {\n if (props.hasClassrooms)\n return <RecommendedBadge size='sm' invert={props.hovered} />;\n return null;\n }\n\n if (props.type === 'open-classroom') {\n if (props.hasClassrooms)\n return <NewBadge size='sm' invert={props.hovered} />;\n return (\n <div className='d-flex align-items-center gap-2'>\n <NewBadge size='sm' invert={props.hovered} />\n <RecommendedBadge size='sm' invert={props.hovered} />\n </div>\n );\n }\n\n return null;\n}","// extracted by mini-css-extract-plugin\nexport default {\"optionImage\":\"iFoIG\",\"optionItem\":\"Lu2bY\"};","import React from 'react';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { useHover } from 'libs/shared/hooks/UseHover';\n\nimport { AssignFlowSteps } from 'apps/assign/interfaces/Assign';\n\nimport styles from './flow-selector-options.scss';\n\nexport interface FlowOptionItem {\n id: AssignFlowSteps;\n imageUrl: string;\n title: string;\n subTitle?: string;\n linkText?: string;\n badgeComponent?: ({ hovered }: {hovered: boolean}) => JSX.Element;\n}\n\ninterface FlowSelectorOptionItemProps {\n item: FlowOptionItem;\n onClick: (option: FlowOptionItem) => void;\n}\n\nfunction FlowSelectorOptionItem(props: FlowSelectorOptionItemProps): JSX.Element {\n const [ hoverRef, hovered ] = useHover<HTMLDivElement>();\n\n const BadgeComponent = props.item.badgeComponent;\n\n return (\n <DivButton\n onClick={() => props.onClick(props.item)}\n className={classNames(\n 'd-flex flex-column gap-4 align-items-center align-self-stretch justify-content-center',\n 'text-center cursor-pointer p-3 border rounded-3 user-select-none hover-bg-light-blue',\n styles.optionItem\n )}\n ref={hoverRef}\n >\n {!!BadgeComponent && <BadgeComponent hovered={hovered} />}\n\n <img src={props.item.imageUrl} className={classNames('img-fluid w-50 d-none d-lg-block', styles.optionImage)} draggable={false} />\n \n <div className='d-flex flex-column gap-2'>\n <h3 className='h4 mb-0'>{props.item.title}</h3>\n {props.item.subTitle && <p className='mb-0 text-gray-900'>{props.item.subTitle}</p>}\n {props.item.linkText && <span className='text-dark text-underline' onClick={() => props.onClick(props.item)}>{props.item.linkText}</span>}\n </div>\n </DivButton>\n );\n}\n\ninterface FlowSelectorOptions {\n title?: string;\n options: [FlowOptionItem, FlowOptionItem];\n onClick: (option: FlowOptionItem) => void;\n}\n\nexport function FlowSelectorOptions(props: FlowSelectorOptions): JSX.Element {\n return (\n <div className='bg-white rounded-bottom-3 p-3 d-flex flex-column gap-3 justify-content-center align-items-center'>\n {!!props.title &&\n <h2 className='h4 m-0'>{props.title}</h2>\n }\n <div className='d-flex flex-column flex-lg-row justify-content-center align-items-center gap-3 w-100'>\n {props.options.map(option => (\n <FlowSelectorOptionItem item={option} onClick={props.onClick} key={option.id} />\n ))}\n </div>\n </div>\n );\n}","import { Core } from 'libs/common/backbone/index';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { ShareRequests } from 'libs/shared/apps/share-v2/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { ShareHelper } from 'libs/shared/apps/share-v2/utils/ShareHelper';\nimport { SharableEntityType } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { BasePaginatedCollection, Classroom } from 'libs/shared/interfaces';\n\nimport { getInsightsOverviewAppLink } from 'shared/utils/ObjectAppLinkHelper';\n\nimport { useAssignSharedData } from 'apps/assign/hooks/useAssignSharedData';\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\n\nconst SHOW_PREVIOUS_ASSIGNMENTS = 'show:previous:assignments';\n\ninterface UseAssignDataOptions {\n objectId: string;\n entityType: SharableEntityType;\n}\n\nexport function useFlowSelectorData(options: UseAssignDataOptions) {\n /**\n * We want to persist if the user has opened previous shares accordion\n * when they hit back or re-open the modal\n */\n const [ showPreviousAssignments, setShowPreviousAssignments ] =\n useViewModel<boolean>(SHOW_PREVIOUS_ASSIGNMENTS, false);\n\n const assignData = useAssignSharedData({\n entityType: options.entityType,\n objectId: options.objectId\n });\n\n const { isLoadingSettings, hasClassrooms } = useSettings(null);\n\n const previousShares = Flight.useBasicFetch<Share[]>(ShareRequests.getSharesByObjectId(options.objectId));\n // @todo Replace with backend filters\n const previousAssignments = previousShares.data?.filter(\n share => [ ShareType.Classroom, ShareType.Open ].includes(share.type)\n ) || [];\n const previousAssignmentClassroomIds = ArrayHelper.uniq(\n previousAssignments.map(ShareHelper.getClassroomIdFromShare).filter(x => !!x)\n );\n const previousAssignmentClassrooms = Flight.useBasicFetch<Classroom[]>(\n previousShares.hasCompleted &&\n ClassroomRequests.getClassroomsByIds(previousAssignmentClassroomIds, assignData.currentUser.data?.customerId)\n );\n const userClassrooms = Flight.useBasicFetch<BasePaginatedCollection<Classroom>>(\n hasClassrooms && ClassroomRequests.getPublished(assignData.currentUser.data?.customerId)\n );\n\n function getPreviousAssignItemAppLink(share: Share): Core.AppLink {\n const appLink = getInsightsOverviewAppLink(share);\n\n if (!appLink)\n return;\n\n return appLink;\n }\n\n function onTogglePreviousAssignment() {\n setShowPreviousAssignments(!showPreviousAssignments);\n }\n\n const dataLoaded = (\n assignData.loaded &&\n !isLoadingSettings &&\n !!previousShares.data &&\n !!previousAssignmentClassrooms.data &&\n !!userClassrooms.data\n );\n\n return {\n data: {\n loaded: dataLoaded,\n previousAssignments,\n previousAssignmentClassrooms\n },\n showPreviousAssignments,\n hasClassrooms: (hasClassrooms && !!userClassrooms.data?.data.length),\n canCreateClassrooms: assignData.canCreateClassrooms,\n getPreviousAssignItemAppLink,\n onTogglePreviousAssignment\n };\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { EntityType, LocationContext } from 'libs/analytics/interfaces';\n\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { SharableEntityType } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { MultiStepPopupViewProps } from 'libs/shared/components/multistep-popup/MultiStepPopup';\nimport { Popup } from 'libs/shared/components/popup/Popup';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport { PreviousAssignments } from 'apps/assign/components/previous-assignments/PreviousAssignments';\nimport { getAssignEventLogger } from 'apps/assign/utils/get-assign-event-logger/getAssignEventLogger';\n\nimport { FlowOptionBadge } from './components/flow-option-badge/FlowOptionBadge';\nimport { FlowOptionItem, FlowSelectorOptions } from './components/flow-selector-options/FlowSelectorOptions';\nimport { useFlowSelectorData } from './hooks/useFlowSelectorData';\n\nconst namespace = 'assign.flowSelectorView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface FlowSelectorViewProps extends MultiStepPopupViewProps {\n objectId: string;\n entityType: SharableEntityType;\n goToCreateClassroomPrompt: () => void;\n goToOpenClassroomFlow: () => void;\n goToExistingClassroomFlow: () => void;\n}\n\nexport function FlowSelectorView(props: FlowSelectorViewProps): JSX.Element {\n const viewModel = useFlowSelectorData({\n entityType: props.entityType,\n objectId: props.objectId\n });\n\n const {\n loaded,\n previousAssignmentClassrooms,\n previousAssignments\n } = viewModel.data;\n\n const { log, getData } = getAssignEventLogger({\n data: {\n entity: {\n id: props.objectId,\n type: props.entityType\n }\n },\n analyticsOptions: {\n location: LocationContext.Popup,\n entity: EntityType.Assign\n }\n });\n \n const choices: [FlowOptionItem, FlowOptionItem] = [\n {\n id: 'existing-classroom',\n title: getPhrase('existingClassroomTitle'),\n subTitle: getPhrase('existingClassroomDescription'),\n imageUrl: ImageUrls.Assign.EXISTING_CLASSROOM,\n linkText: getPhrase('learnMore'),\n badgeComponent: ({ hovered }) => <FlowOptionBadge type='existing-classroom' hasClassrooms={viewModel.hasClassrooms && viewModel.canCreateClassrooms} hovered={hovered} />\n },\n {\n id: 'open-classroom',\n title: getPhrase('openClassroomTitle'),\n subTitle: getPhrase('openClassroomDescription'),\n imageUrl: ImageUrls.Assign.OPEN_CLASSROOM,\n linkText: getPhrase('learnMore'),\n badgeComponent: ({ hovered }) => <FlowOptionBadge type='open-classroom' hasClassrooms={viewModel.hasClassrooms && viewModel.canCreateClassrooms} hovered={hovered} />\n }\n ];\n\n function onClickFlowOption(option: FlowOptionItem) {\n if (option.id === 'existing-classroom') {\n /** \n * If a user clicks 'existing-classroom' flow and they dont have classrooms but can create classrooms then\n * We take them through the 'existing-classroom' flow with 'create-classroom-prompt' as initial step\n */\n if (!viewModel.hasClassrooms && viewModel.canCreateClassrooms) {\n props.goToCreateClassroomPrompt();\n } else {\n props.goToExistingClassroomFlow();\n }\n\n log({\n type: 'select-existing-classroom-flow'\n });\n } else if (option.id === 'open-classroom') {\n props.goToOpenClassroomFlow();\n\n log({\n type: 'select-open-classroom-flow'\n });\n }\n }\n\n function getItemAnalytics(share: Share, yIndex: number) {\n const { analyticsOptions, data } = getData({\n type: 'view-previous-assignment',\n share,\n yIndex\n });\n\n return {\n data,\n options: analyticsOptions\n };\n }\n\n return (\n <Popup\n size='lg'\n animation={props.animate}\n title={getPhrase('title')}\n closePopup={props.closePopup}\n bodyClassName='d-flex flex-column gap-3 p-0'\n contentClassName={classNames(loaded && 'bg-transparent border-0')}\n showLoadingSpinner={!loaded || props.loading}\n >\n <FlowSelectorOptions\n options={choices}\n onClick={onClickFlowOption}\n />\n\n <PreviousAssignments\n assignments={previousAssignments.reverse()}\n show={viewModel.showPreviousAssignments}\n classrooms={previousAssignmentClassrooms.data}\n onToggle={viewModel.onTogglePreviousAssignment}\n getItemAppLink={viewModel.getPreviousAssignItemAppLink}\n getItemAnalytics={getItemAnalytics}\n />\n </Popup>\n );\n}","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nconst namespace = 'assign.openClassroomFlowInfoHeader';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface OpenClassroomFlowInfoHeaderProps {\n onClose: () => void;\n}\n\nexport function OpenClassroomFlowInfoHeader(props: OpenClassroomFlowInfoHeaderProps): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <Row className='p-3 bg-light-green rounded rounded-2 gx-0'>\n <Col lg={2} className='d-none d-lg-block align-self-stretch'>\n <div className='h-100 d-flex align-items-center justify-content-center me-4'>\n <img src={ImageUrls.Assign.OPEN_CLASSROOM} alt={getPhrase('alt')} className='w-100 h-auto' />\n </div>\n </Col>\n <Col xs={12} lg={10} className='position-relative'>\n <h3 className='h6'><Text phrase='title' /></h3>\n <p className='mb-0'><Text phrase='description' /></p>\n <div className='position-absolute top-0 end-0'>\n <IconButton svgName={cvSvgLibrary.Close} onClick={props.onClose} className='btn-close p-2' />\n </div>\n </Col>\n </Row>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { ShareLinkHelper } from 'libs/shared/apps/share-v2/utils/ShareLinkHelper';\nimport { SharableEntity } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { YearGroup } from 'libs/shared/interfaces';\n\nimport { FlowSettings } from 'apps/assign/components/flow-settings/FlowSettings';\n\nimport { OpenClassroomFlowInfoHeader } from '../open-classroom-flow-info-header/OpenClassroomFlowInfoHeader';\n\nconst namespace = 'assign.openClassroomFlowSettings';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SettingsFieldProps {\n // Prevent scrubbing field\n hidePreventScrubbing?: boolean;\n disablePreventScrubbing?: boolean;\n onTogglePreventScrubbing: () => void;\n preventScrubbing: boolean;\n \n // Immediate feedback field\n hideImmediateFeedback?: boolean;\n disableImmediateFeedback?: boolean;\n onToggleImmediateFeedback: () => void;\n immediateFeedback: boolean;\n\n // Require student sign in field\n hideRequiresStudentSignIn?: boolean;\n disableRequiresStudentSignIn?: boolean;\n onToggleRequiresStudentSignIn: () => void;\n toggleRequiresStudentSignIn: boolean;\n\n // Respect ratings and restrictions field\n hideRespectRatingsAndRestrictions?: boolean;\n disableRespectRatingsAndRestrictions?: boolean;\n onToggleRespectRatingsAndRestrictions: () => void;\n toggleRespectRatingsAndRestrictions: boolean;\n \n // Message field\n hideMessage?: boolean;\n disableMessage?: boolean;\n message: string;\n onChangeMessage: (message: string) => void;\n onToggleMessage: () => void;\n toggleMessage: boolean;\n}\n\ninterface OpenClassroomFlowSettingsProps extends SettingsFieldProps {\n hasStudentExp: boolean;\n entity: SharableEntity;\n yearGroups: YearGroup[];\n closeHeader: () => void;\n}\n\nexport function OpenClassroomFlowSettings(props: OpenClassroomFlowSettingsProps): JSX.Element {\n const respectRatingText = ShareLinkHelper.getRespectRatingText(\n props.entity,\n props.yearGroups,\n props.hasStudentExp\n );\n \n return (\n <div className='d-flex flex-column gap-4'>\n <OpenClassroomFlowInfoHeader onClose={props.closeHeader} />\n \n <FlowSettings\n name={getPhrase('videoSettingsTitle')}\n hide={props.hidePreventScrubbing && props.hideImmediateFeedback}\n >\n <FlowSettings.Toggle\n hide={props.hidePreventScrubbing}\n title={getPhrase('preventScrubbingTitle')}\n description={getPhrase('preventScrubbingDescription')}\n onClick={props.onTogglePreventScrubbing}\n toggled={props.preventScrubbing}\n disabled={props.disablePreventScrubbing}\n />\n <FlowSettings.Toggle\n hide={props.hideImmediateFeedback}\n title={getPhrase('immediateFeedbackTitle')}\n description={getPhrase('immediateFeedbackDescription')}\n onClick={props.onToggleImmediateFeedback}\n toggled={props.immediateFeedback}\n disabled={props.disableImmediateFeedback}\n />\n </FlowSettings>\n\n <FlowSettings.Divider hide={props.hidePreventScrubbing && props.hideImmediateFeedback} />\n\n <FlowSettings\n name={getPhrase('studentAccessTitle')}\n hide={props.hideRequiresStudentSignIn && props.hideRespectRatingsAndRestrictions}\n >\n <FlowSettings.Toggle\n hide={props.hideRequiresStudentSignIn}\n title={getPhrase('requiresStudentSignInTitle')}\n description={getPhrase('requiresStudentSignInDescription')}\n onClick={props.onToggleRequiresStudentSignIn}\n toggled={props.toggleRequiresStudentSignIn}\n disabled={props.disableRequiresStudentSignIn}\n />\n <FlowSettings.Toggle\n hide={props.hideRespectRatingsAndRestrictions}\n title={getPhrase('respectRatingsAndRestrictionsTitle')}\n description={respectRatingText}\n onClick={props.onToggleRespectRatingsAndRestrictions}\n toggled={props.toggleRespectRatingsAndRestrictions}\n disabled={props.disableRespectRatingsAndRestrictions}\n />\n </FlowSettings>\n \n <FlowSettings.Divider hide={\n (props.hideRequiresStudentSignIn && props.hideRespectRatingsAndRestrictions)\n || props.hideMessage}\n />\n \n <FlowSettings\n name={getPhrase('moreOptionsTitle')}\n hide={props.hideMessage}\n childContainerClassName='d-flex flex-column gap-2'\n >\n <FlowSettings.Toggle\n hide={props.hideMessage}\n title={getPhrase('messageTitle')}\n description={getPhrase('messageDescription')}\n onClick={props.onToggleMessage}\n toggled={props.toggleMessage}\n disabled={props.disableMessage}\n >\n <FlowSettings.TextArea\n hide={!props.toggleMessage}\n placeholder={getPhrase('messagePlaceholder')}\n onChange={props.onChangeMessage}\n value={props.message}\n />\n </FlowSettings.Toggle>\n </FlowSettings>\n \n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { StorageType } from 'libs/common/backbone/utils/LocalStorageHelper';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { useCreateShare } from 'libs/shared/apps/share-v2/hooks/useCreateShare';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { SharableEntityType } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { YearGroup } from 'libs/shared/interfaces';\n\nimport { useAssignSharedData } from 'apps/assign/hooks/useAssignSharedData';\n\nconst namespace = 'assign.useOpenClassroomFlowData';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface UseOpenClassroomFlowDataOptions {\n objectId: string;\n entityType: SharableEntityType;\n}\n\ntype OpenClassroomFlowSettings = 'preventScrubbing' | 'immediateFeedback' | 'requiresStudentSignIn' | 'respectRatingsAndRestrictions' | 'message';\ntype OpenClassroomFlowSettingsMap = {[key in OpenClassroomFlowSettings]: boolean};\n\nconst initialSettings: OpenClassroomFlowSettingsMap = {\n immediateFeedback: false,\n preventScrubbing: false,\n message: false,\n requiresStudentSignIn: false,\n respectRatingsAndRestrictions: false\n};\n\nconst VIEW_MODEL_KEY = 'assign:open:classroom:flow:settings:header';\n\nexport function useOpenClassroomFlowSettingsData(options: UseOpenClassroomFlowDataOptions) {\n const alert = useAlerts();\n\n /**\n * We store this in Local storage so that if they user deliberatly\n * closes this we dont show this again\n */\n const [ showHeader, setShowHeader ] = useViewModel(VIEW_MODEL_KEY, true, { storage: StorageType.LocalStorage });\n \n const sharedData = useAssignSharedData({\n entityType: options.entityType,\n objectId: options.objectId\n });\n\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n CustomerRequests.yearGroups(sharedData.currentUser.data?.customerId)\n );\n\n const { createOpenSession } = useCreateShare(options.objectId);\n \n const [ settings, setSettings ] = React.useState<OpenClassroomFlowSettingsMap>({\n ...initialSettings,\n preventScrubbing: sharedData.interactive.data?.preventScrubbing || false,\n immediateFeedback: sharedData.interactive.data?.immediateFeedback || false\n });\n const [ message, setMessage ] = React.useState('');\n const [ loading, setLoading ] = React.useState(false);\n\n function onChangeSetting(setting: OpenClassroomFlowSettings, value: boolean) {\n const newSettings: Partial<OpenClassroomFlowSettingsMap> = {\n [setting]: value\n };\n /*\n * If respect ratings and restrictions is toggled\n * we always toggle requires student sign in option too\n * - Nish\n */\n if (setting === 'respectRatingsAndRestrictions') {\n newSettings['requiresStudentSignIn'] = value;\n }\n \n setSettings(prev => ({\n ...prev,\n ...newSettings\n }));\n }\n\n async function onShare(onSuccess?: (share: Share) => void) {\n setLoading(true);\n try {\n const share = await createOpenSession({\n objectId: options.objectId,\n immediateFeedback: settings.immediateFeedback,\n preventScrubbing: settings.preventScrubbing,\n requireSignIn: settings.requiresStudentSignIn,\n respectRatingsAndRestrictions: settings.respectRatingsAndRestrictions\n });\n\n typeof onSuccess === 'function' && onSuccess(share);\n \n setLoading(false);\n } catch (ex: unknown) {\n alert.error(getPhrase('createError'));\n } finally {\n setLoading(false);\n }\n }\n\n function toggleSetting(setting: OpenClassroomFlowSettings) {\n onChangeSetting(setting, !settings[setting]);\n }\n\n const loaded = sharedData.loaded\n && !!yearGroups.data;\n\n return {\n data: {\n loaded,\n entity: sharedData.entity,\n yearGroups: yearGroups\n },\n showHeader,\n hasStudentExp: sharedData.hasStudentExp,\n shouldShowSpinner: loading,\n nextButtonText: getPhrase('nextButton'),\n message,\n settings,\n setMessage,\n setShowHeader,\n toggleSetting,\n onShare\n };\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType, LocationContext } from 'libs/analytics/interfaces';\n\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { SharableEntityType } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { MultiStepPopupViewProps } from 'libs/shared/components/multistep-popup/MultiStepPopup';\nimport { Popup } from 'libs/shared/components/popup/Popup';\n\nimport { FlowControls } from 'apps/assign/components/flow-controls/FlowControls';\nimport { getAssignEventLogger } from 'apps/assign/utils/get-assign-event-logger/getAssignEventLogger';\n\nimport { OpenClassroomFlowSettings } from './components/open-classroom-flow-settings/OpenClassroomFlowSettings';\nimport { useOpenClassroomFlowSettingsData } from './hooks/use-open-classroom-flow-settings-data/useOpenClassroomFlowSettingsData';\n\nconst namespace = 'assign.openClassroomFlowSettingsView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface OpenClassroomFlowSettingsViewProps extends MultiStepPopupViewProps {\n objectId: string;\n entityType: SharableEntityType;\n\n setShare: (share: Share) => void;\n goToFlowSelector: () => void;\n goToAssignDetails: () => void;\n}\n\nexport function OpenClassroomFlowSettingsView(props: OpenClassroomFlowSettingsViewProps): JSX.Element {\n const viewModel = useOpenClassroomFlowSettingsData({\n entityType: props.entityType,\n objectId: props.objectId\n });\n\n const {\n loaded,\n entity,\n yearGroups\n } = viewModel.data;\n\n const { log } = getAssignEventLogger({\n data: {\n entity: {\n id: props.objectId,\n type: props.entityType\n }\n },\n analyticsOptions: {\n location: LocationContext.Popup,\n entity: EntityType.Assign\n }\n });\n\n function onClickNext() {\n viewModel.onShare(share => {\n log({\n type: 'create-open-classroom',\n share\n });\n \n props.setShare(share);\n props.goToAssignDetails();\n });\n }\n\n return (\n <Popup\n size='lg'\n title={getPhrase('title')}\n showLoadingSpinner={!loaded || props.loading}\n closePopup={props.closePopup}\n bodyClassName='d-flex flex-column gap-3'\n animation={props.animate}\n >\n <OpenClassroomFlowSettings\n entity={entity.data}\n message={viewModel.message}\n yearGroups={yearGroups.data}\n hasStudentExp={viewModel.hasStudentExp}\n toggleMessage={viewModel.settings.message}\n immediateFeedback={viewModel.settings.immediateFeedback}\n preventScrubbing={viewModel.settings.preventScrubbing}\n toggleRequiresStudentSignIn={viewModel.settings.requiresStudentSignIn}\n toggleRespectRatingsAndRestrictions={viewModel.settings.respectRatingsAndRestrictions}\n hideMessage={true} // Message field does nothing atm for open classroom\n onChangeMessage={viewModel.setMessage}\n onToggleMessage={() => viewModel.toggleSetting('message')}\n hidePreventScrubbing={props.entityType !== 'interactive'}\n hideImmediateFeedback={props.entityType !== 'interactive'}\n onTogglePreventScrubbing={() => viewModel.toggleSetting('preventScrubbing')}\n onToggleImmediateFeedback={() => viewModel.toggleSetting('immediateFeedback')}\n onToggleRequiresStudentSignIn={() => viewModel.toggleSetting('requiresStudentSignIn')}\n onToggleRespectRatingsAndRestrictions={() => viewModel.toggleSetting('respectRatingsAndRestrictions')}\n closeHeader={() => viewModel.setShowHeader(false)}\n disableRequiresStudentSignIn={viewModel.settings.respectRatingsAndRestrictions}\n />\n <FlowControls\n hideCreateClassroomButton\n onClickBack={props.goToFlowSelector}\n onClickNext={onClickNext}\n nextButtonText={viewModel.nextButtonText}\n showSpinner={viewModel.shouldShowSpinner}\n />\n </Popup>\n );\n}","import React from 'react';\n\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { SharableEntityType } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { MultiStepPopup, MultiStepPopupViewProps } from 'libs/shared/components/multistep-popup/MultiStepPopup';\n\nimport { OpenClassroomFlowSteps } from 'apps/assign/interfaces/Assign';\n\nimport { AssignDetailsView, AssignDetailsViewProps } from '../assign-details-view/AssignDetailsView';\nimport { OpenClassroomFlowSettingsView, OpenClassroomFlowSettingsViewProps } from '../open-classroom-flow-settings-view/OpenClassroomFlowSettingsView';\n\ntype AllOpenClassroomFlowViewProps =\n & OpenClassroomFlowSettingsViewProps\n & AssignDetailsViewProps;\nexport interface OpenClassroomFlowViewProps extends MultiStepPopupViewProps {\n objectId: string;\n entityType: SharableEntityType;\n goToFlowSelector: () => void;\n}\n\nexport function OpenClassroomFlowView(props: OpenClassroomFlowViewProps): JSX.Element {\n const [ flowStep, setFlowStep ] = React.useState<OpenClassroomFlowSteps>('settings');\n const [ share, setShare ] = React.useState<Share>();\n\n const data: AllOpenClassroomFlowViewProps = {\n objectId: props.objectId,\n entityType: props.entityType,\n closePopup: props.closePopup,\n goToFlowSelector: props.goToFlowSelector,\n \n shareId: share?.shareId,\n initialDetailsScreen: 'share-link',\n goToAssignDetails: () => setFlowStep('assign-details'),\n setShare\n };\n\n return (\n <MultiStepPopup<AllOpenClassroomFlowViewProps, OpenClassroomFlowSteps>\n data={data}\n animate={false}\n step={flowStep}\n setStep={setFlowStep}\n closePopup={props.closePopup}\n steps={{\n 'settings': { view: OpenClassroomFlowSettingsView },\n 'assign-details': { view: AssignDetailsView }\n }}\n />\n );\n}","import React from 'react';\n\nimport { SharableEntityType } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { MultiStepPopup } from 'libs/shared/components/multistep-popup/MultiStepPopup';\nimport { PopupViewProps } from 'libs/shared/interfaces';\n\nimport { AssignFlowSteps } from 'apps/assign/interfaces/Assign';\nimport { ExistingClassroomFlowView, ExistingClassroomFlowViewProps } from 'apps/assign/views/existing-classroom-flow-view/ExistingClassroomFlowView';\nimport { FlowSelectorView, FlowSelectorViewProps } from 'apps/assign/views/flow-selector-view/FlowSelectorView';\nimport { OpenClassroomFlowView, OpenClassroomFlowViewProps } from 'apps/assign/views/open-classroom-flow-view/OpenClassroomFlowView';\n\ntype AllAssignFlowViewProps = FlowSelectorViewProps\n & ExistingClassroomFlowViewProps\n & OpenClassroomFlowViewProps;\n\ninterface AssignViewProps extends PopupViewProps {\n objectId: string;\n entityType: SharableEntityType;\n selectedFlow?: AssignFlowSteps\n}\n\nexport function AssignFlowView(props: AssignViewProps): JSX.Element {\n const [ selectedFlow, setSelectedFlow ] = React.useState<AssignFlowSteps>(props.selectedFlow ?? 'flow-selector');\n const [ createClassroom, setCreateClassroom ] = React.useState(false);\n const [ animate, setAnimate ] = React.useState(true);\n\n function setFlow(flow: AssignFlowSteps) {\n setAnimate(false);\n setSelectedFlow(flow);\n }\n\n function goToCreateClassroomPrompt() {\n setCreateClassroom(true);\n setFlow('existing-classroom');\n }\n\n const data: AllAssignFlowViewProps = {\n objectId: props.objectId,\n entityType: props.entityType,\n closePopup: props.closePopup,\n initialStep: createClassroom ? 'create-classroom' : null,\n goToCreateClassroomPrompt,\n goToExistingClassroomFlow: () => setFlow('existing-classroom'),\n goToFlowSelector: () => setFlow('flow-selector'),\n goToOpenClassroomFlow: () => setFlow('open-classroom')\n };\n \n return (\n <MultiStepPopup<AllAssignFlowViewProps, AssignFlowSteps>\n data={data}\n step={selectedFlow}\n setStep={setFlow}\n closePopup={props.closePopup}\n animate={animate}\n steps={{\n 'flow-selector': { view: FlowSelectorView },\n 'open-classroom': { view: OpenClassroomFlowView },\n 'existing-classroom': { view: ExistingClassroomFlowView }\n }}\n />\n );\n}","import { useDispatch } from 'react-redux';\n\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { SearchResults } from 'libs/shared/apps/search/interfaces';\nimport { handleHttpError } from 'libs/shared/errors/handlers/HttpErrorHandlers';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useInfiniteList, UseInfiniteListResult } from 'libs/shared/hooks/UseInfiniteList';\nimport { BasePaginatedCollection, Classroom, CurrentUser } from 'libs/shared/interfaces';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { SearchRequests } from 'apps/search/flight-requests/SearchRequests';\n\nconst namespace = 'classrooms.hooks';\n\nexport type GetClassroomsResponse = UseInfiniteListResult<Classroom> & {\n fetchNext: (cursor?: string) => void;\n};\n\ninterface UseFetchClassroomOptions {\n withStudentsCount?: boolean;\n}\n\nexport const useFetchClassrooms = (query?: string, options?: UseFetchClassroomOptions): GetClassroomsResponse => {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const alerts = useAlerts();\n const dispatch = useDispatch();\n\n const getClassroomsRequest = (cursor?: string) => {\n if (!query) {\n if (options?.withStudentsCount) {\n return ClassroomRequests.getPublishedWithStudents(currentUser.data.id, cursor);\n }\n\n return ClassroomRequests.getPublished(currentUser.data.id, cursor);\n }\n \n if (options?.withStudentsCount) {\n return SearchRequests.searchClassroomsV4(query, cursor);\n }\n \n return SearchRequests.searchClassrooms(query, currentUser.data.customerId, cursor);\n };\n\n const fetchNextPage = (cursor?: string) => Flight.getFetch(dispatch)(getClassroomsRequest(cursor));\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 response = useInfiniteList<Classroom, SearchResults<Classroom> | BasePaginatedCollection<Classroom>>(\n currentUser.data ? getClassroomsRequest : false,\n fetchNextPage,\n onError,\n response => {\n if (query)\n return (response as SearchResults<Classroom>).results;\n\n return (response as BasePaginatedCollection<Classroom>).data;\n }\n );\n\n return {\n ...response,\n fetchNext: fetchNextPage\n };\n};","import { object, string } from 'yup';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst getPhrase = LanguageService.encloseNamespace('classrooms.classroomValidation');\n\nexport const ClassroomValidationSchema = object().shape({\n name: string()\n .max(255, () => getPhrase('nameExceeds'))\n .required(() => getPhrase('nameRequired'))\n .default('')\n});","var EN_US = ['second', 'minute', 'hour', 'day', 'week', 'month', 'year'];\nexport default function (diff, idx) {\n if (idx === 0)\n return ['just now', 'right now'];\n var unit = EN_US[Math.floor(idx / 2)];\n if (diff > 1)\n unit += 's';\n return [diff + \" \" + unit + \" ago\", \"in \" + diff + \" \" + unit];\n}\n//# sourceMappingURL=en_US.js.map","var ZH_CN = ['秒', '分钟', '小时', '天', '周', '个月', '年'];\nexport default function (diff, idx) {\n if (idx === 0)\n return ['刚刚', '片刻后'];\n var unit = ZH_CN[~~(idx / 2)];\n return [diff + \" \" + unit + \"\\u524D\", diff + \" \" + unit + \"\\u540E\"];\n}\n//# sourceMappingURL=zh_CN.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\n/**\n * All supported locales\n */\nvar Locales = {};\n/**\n * register a locale\n * @param locale\n * @param func\n */\nexport var register = function (locale, func) {\n Locales[locale] = func;\n};\n/**\n * get a locale, default is en_US\n * @param locale\n * @returns {*}\n */\nexport var getLocale = function (locale) {\n return Locales[locale] || Locales['en_US'];\n};\n//# sourceMappingURL=register.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\nvar SEC_ARRAY = [\n 60,\n 60,\n 24,\n 7,\n 365 / 7 / 12,\n 12,\n];\n/**\n * format Date / string / timestamp to timestamp\n * @param input\n * @returns {*}\n */\nexport function toDate(input) {\n if (input instanceof Date)\n return input;\n // @ts-ignore\n if (!isNaN(input) || /^\\d+$/.test(input))\n return new Date(parseInt(input));\n input = (input || '')\n // @ts-ignore\n .trim()\n .replace(/\\.\\d+/, '') // remove milliseconds\n .replace(/-/, '/')\n .replace(/-/, '/')\n .replace(/(\\d)T(\\d)/, '$1 $2')\n .replace(/Z/, ' UTC') // 2017-2-5T3:57:52Z -> 2017-2-5 3:57:52UTC\n .replace(/([+-]\\d\\d):?(\\d\\d)/, ' $1$2'); // -04:00 -> -0400\n return new Date(input);\n}\n/**\n * format the diff second to *** time ago, with setting locale\n * @param diff\n * @param localeFunc\n * @returns\n */\nexport function formatDiff(diff, localeFunc) {\n /**\n * if locale is not exist, use defaultLocale.\n * if defaultLocale is not exist, use build-in `en`.\n * be sure of no error when locale is not exist.\n *\n * If `time in`, then 1\n * If `time ago`, then 0\n */\n var agoIn = diff < 0 ? 1 : 0;\n /**\n * Get absolute value of number (|diff| is non-negative) value of x\n * |diff| = diff if diff is positive\n * |diff| = -diff if diff is negative\n * |0| = 0\n */\n diff = Math.abs(diff);\n /**\n * Time in seconds\n */\n var totalSec = diff;\n /**\n * Unit of time\n */\n var idx = 0;\n for (; diff >= SEC_ARRAY[idx] && idx < SEC_ARRAY.length; idx++) {\n diff /= SEC_ARRAY[idx];\n }\n /**\n * Math.floor() is alternative of ~~\n *\n * The differences and bugs:\n * Math.floor(3.7) -> 4 but ~~3.7 -> 3\n * Math.floor(1559125440000.6) -> 1559125440000 but ~~1559125440000.6 -> 52311552\n *\n * More information about the performance of algebraic:\n * https://www.youtube.com/watch?v=65-RbBwZQdU\n */\n diff = Math.floor(diff);\n idx *= 2;\n if (diff > (idx === 0 ? 9 : 1))\n idx += 1;\n return localeFunc(diff, idx, totalSec)[agoIn].replace('%s', diff.toString());\n}\n/**\n * calculate the diff second between date to be formatted an now date.\n * @param date\n * @param relativeDate\n * @returns {number}\n */\nexport function diffSec(date, relativeDate) {\n var relDate = relativeDate ? toDate(relativeDate) : new Date();\n return (+relDate - +toDate(date)) / 1000;\n}\n/**\n * nextInterval: calculate the next interval time.\n * - diff: the diff sec between now and date to be formatted.\n *\n * What's the meaning?\n * diff = 61 then return 59\n * diff = 3601 (an hour + 1 second), then return 3599\n * make the interval with high performance.\n **/\nexport function nextInterval(diff) {\n var rst = 1, i = 0, d = Math.abs(diff);\n for (; diff >= SEC_ARRAY[i] && i < SEC_ARRAY.length; i++) {\n diff /= SEC_ARRAY[i];\n rst *= SEC_ARRAY[i];\n }\n d = d % rst;\n d = d ? rst - d : rst;\n return Math.ceil(d);\n}\n//# sourceMappingURL=date.js.map","import { formatDiff, diffSec } from './utils/date';\nimport { getLocale } from './register';\n/**\n * format a TDate into string\n * @param date\n * @param locale\n * @param opts\n */\nexport var format = function (date, locale, opts) {\n // diff seconds\n var sec = diffSec(date, opts && opts.relativeDate);\n // format it with locale\n return formatDiff(sec, getLocale(locale));\n};\n//# sourceMappingURL=format.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\nimport en_US from './lang/en_US';\nimport zh_CN from './lang/zh_CN';\nimport { register } from './register';\nregister('en_US', en_US);\nregister('zh_CN', zh_CN);\nexport { format } from './format';\nexport { render, cancel } from './realtime';\nexport { register };\n//# sourceMappingURL=index.js.map"],"names":["getPhrase","icons","iconColours","shareTypeTitlePhraseMap","ShareAvatar","props","className","svgName","type","variant","textVariant","svgWrapperClassName","svgSize","S","classroomName","additionalTitleText","title","getTitle","hideSubtitle","subtitleText","privacy","studentCount","classroomGroupCount","smartCount","getClassroomSubtitle","includes","getLinkSubtitle","getSubtitle","ShareLinkHelper","getPrivateIconAndText","options","entityTypeId","hasStudentExp","entity","yearGroups","icon","text","Array","isArray","getRespectRatingText","getIconAndText","linkExpireDate","isPasswordProtected","status","isToday","dayDifference","Date","days","video","restriction","_restrictions","value","yearGroup","maxYearGroup","minAllowedYearGroup","rating","length","name","getShareLinkAccessType","isTvContent","isClickViewContent","canManageAccess","MultiStepPopup","animate","setAnimate","stepConfig","steps","step","loading","viewProps","data","closePopup","setStep","ViewComponent","view","defaultErrors","notFound","forbidden","yearLevel","region","badRequest","internalServerError","handleHttpError","info","customErrorMap","ignoreMap","statusCode","errorMap","SCROLL_TOLERANCE","useInfiniteList","getRequest","fetchNext","onError","getItems","getCursor","scrollContainer","handleScroll","useState","pagesFetched","setPagesFetched","fetchNextFn","response","cursor","request","key","fetchNextPage","currentVal","nextCursor","hasMore","isFetching","getBoundingClientRect","height","scrollTop","scrollHeight","window","innerHeight","document","documentElement","useEffect","onScroll","FunctionHelper","addEventListener","removeEventListener","shouldInitialFetch","httpStatusClass","toString","substr","HttpStatus","items","totalItems","hasFirstPageCompleted","mapColourToBsVariant","groupColour","namespace","ShareViewCount","MasterType","share","objectTypeId","Text","phrase","viewCount","ShareViewedByCount","SvgContainer","shareAccessCount","accessCount","ShareType","totalRecipients","recipients","getViewCount","PreviousAssignmentsHeader","show","count","IconButton","onClick","onToggle","PreviousAssignmentsListHeader","columnClassNames","Row","Col","xs","PreviousAssignmentListItem","shareClassroom","ShareHelper","classrooms","analytics","getItemAnalytics","AppLink","shareId","appLink","getItemAppLink","analyticsData","analyticsOptions","lg","dateCreated","PreviousAssignmentsList","autoHeight","autoHeightMin","autoHeightMax","scrollHeightMax","autoHide","assignments","map","idx","PreviousAssignments","noBottomPadding","CreatePrompt","IntegrationsPrompt","IntegrationList","itemClassName","maxHeight","instanceRegion","contactSupportLink","LanguageService","NarrowSelectionButton","Tooltip","spanHack","placement","disable","hasRecipients","Button","onClickSelectGroupsOrStudents","disabled","ClassroomSelectorListItem","isSelected","onSelected","md","Form","id","onChange","checked","IconCircle","studentsCount","ClassroomSelectorList","PopupLoadingSpinner","classroom","selectedClassroom","onClassroomSelected","getStudentsCount","InfiniteScrollFooter","fetchOnScroll","EmptyState","src","ImageUrls","size","altText","role","query","searchQuery","onClickCreateOpenClassroom","InputGroupText","bsPrefix","as","Component","ref","displayName","InputGroup","hasValidation","contextValue","useMemo","InputGroupContext","children","Object","assign","Radio","FormCheckInput","Checkbox","FlowSettings","hide","childContainerClassName","Toggle","toggled","htmlFor","description","TextArea","placeholder","e","target","Divider","withMargins","SelectedClassroomHeader","SharePrivacy","enrolments","onClickChangeClassroom","ExistingClassroomFlowSettings","hidePreventScrubbing","hideImmediateFeedback","onTogglePreventScrubbing","preventScrubbing","disablePreventScrubbing","onToggleImmediateFeedback","immediateFeedback","disableImmediateFeedback","hideMessage","onToggleMessage","toggleMessage","disableMessage","onChangeMessage","message","useCreateShare","objectId","accessPermissions","ShareRequests","fetchAsync","createPincode","createDirectShare","requireSignIn","optionRequest","recipientRequest","recipientId","scopeId","createOpenSession","respectRatingsAndRestrictions","hasCompleted","useExistingClassroomFlowSettingsData","sharedData","useAssignSharedData","entityType","CustomerRequests","currentUser","customerId","setLoading","interactive","settings","setSettings","setMessage","loaded","config","shouldShowSpinner","toggleSetting","setting","prev","onChangeSetting","onShare","onSuccess","console","error","SelectionType","Accordion","Item","intialShow","setShow","ClassroomEntityListItem","showTooltip","isDisabled","tooltipText","DivButton","trigger","ClassroomEntityList","entities","selectedEntities","find","disableSelected","renderTitle","renderIcon","onSelectEntity","emptyState","NarrowClassroomSelectionControls","Students","setType","selectedGroups","setSelectedGroups","selectedLearners","setSelectedLearners","allStudentsSelected","learners","Groups","label","setRecipients","AssignHelper","indeterminate","selected","groups","group","newSelectedGroups","metadata","colour","learner","newSelectedStudents","ViewImage","style","backgroundImage","SharedObjectImage","object","locationContext","imageClassName","thumbnailSize","fixedHeight","ExistingClassroomStepConfig","marketingSiteUrl","showLoadingSpinner","Popup","animation","bodyClassName","goToCreateClassroomForm","FlowControls","onClickBack","goToFlowSelector","hideNextButton","hideCreateClassroomButton","log","getAssignEventLogger","location","formik","initialValues","onSubmit","isValid","ClassroomRequests","then","newClassroom","onCreateNewClassroom","setFieldError","validationSchema","ClassroomValidationSchema","validateOnChange","handleSubmit","values","handleChange","maxLength","isInvalid","errors","goToPrevStep","onClickNext","submitForm","disableNextButton","showSpinner","nextButtonText","hasPermissions","setQuery","debouncedQuery","isSearching","viewModel","setSelectedClassroom","goToNarrowSelection","usePermissions","useFetchClassrooms","withStudentsCount","canCreateClassrooms","PermissionName","users","goToOpenClassroomFlow","goToSettings","onClickCreateClassroom","selectedClassroomLearners","selectedClassroomGroups","useNarrowClassroomSelectionData","goToSelectClassroom","onChangeRecipients","nextButtonTooltip","AssignDetailsView","addStudentsAppLink","application","action","args","hideTitle","ExistingClassroomFlowView","initialStep","setShare","prevStep","setPrevStep","hasPrevStep","hasStudentsInClassroom","students","nextStep","pop","useExistingClassroomFlowData","detailsTitle","NewBadge","invert","RecommendedBadge","FlowOptionBadge","hasClassrooms","hovered","FlowSelectorOptionItem","hoverRef","BadgeComponent","item","badgeComponent","imageUrl","draggable","subTitle","linkText","FlowSelectorOptions","option","SHOW_PREVIOUS_ASSIGNMENTS","FlowSelectorView","showPreviousAssignments","setShowPreviousAssignments","assignData","useSettings","isLoadingSettings","previousShares","previousAssignments","filter","previousAssignmentClassroomIds","ArrayHelper","x","previousAssignmentClassrooms","userClassrooms","getPreviousAssignItemAppLink","onTogglePreviousAssignment","useFlowSelectorData","getData","choices","contentClassName","goToCreateClassroomPrompt","goToExistingClassroomFlow","reverse","yIndex","OpenClassroomFlowInfoHeader","alt","onClose","OpenClassroomFlowSettings","respectRatingText","closeHeader","hideRequiresStudentSignIn","hideRespectRatingsAndRestrictions","onToggleRequiresStudentSignIn","toggleRequiresStudentSignIn","disableRequiresStudentSignIn","onToggleRespectRatingsAndRestrictions","toggleRespectRatingsAndRestrictions","disableRespectRatingsAndRestrictions","initialSettings","requiresStudentSignIn","VIEW_MODEL_KEY","useOpenClassroomFlowSettingsData","alert","storage","showHeader","setShowHeader","newSettings","OpenClassroomFlowSettingsView","goToAssignDetails","OpenClassroomFlowView","flowStep","setFlowStep","initialDetailsScreen","AssignFlowView","selectedFlow","setSelectedFlow","createClassroom","setCreateClassroom","setFlow","flow","alerts","dispatch","getClassroomsRequest","pageNumber","httpStatus","results","shape","max","required","EN_US","ZH_CN","Locales","register","locale","func","SEC_ARRAY","toDate","input","isNaN","test","parseInt","trim","replace","format","date","opts","sec","relativeDate","diff","localeFunc","agoIn","totalSec","Math","abs","floor","unit"],"sourceRoot":""}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[6790],{29923:(e,t,r)=>{r.d(t,{F:()=>l});var n=r(32735),a=r(23481),o=r(89965),i=r(13876);function c(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}var s=a.T.encloseNamespace("sharev2.deleteShareContent");function l(e){var t,r,a,l=(r=n.useState(!1),a=2,function(e){if(Array.isArray(e))return e}(r)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,o,i,c=[],s=!0,l=!1;try{if(o=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;s=!1}else for(;!(s=(n=o.call(r)).done)&&(c.push(n.value),c.length!==t);s=!0);}catch(e){l=!0,a=e}finally{try{if(!s&&null!=r.return&&(i=r.return(),Object(i)!==i))return}finally{if(l)throw a}}return c}}(r,a)||function(e,t){if(e){if("string"==typeof e)return c(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?c(e,t):void 0}}(r,a)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),u=l[0],d=l[1];return n.createElement("div",{className:"d-flex flex-column gap-3"},n.createElement("p",{className:"m-0"},e.phrases.leadingSentence),n.createElement("ul",{className:"m-0"},e.phrases.bulletPoints.map(function(e,t){return n.createElement("li",{key:t},e)})),n.createElement(o.X,{id:"ack",checked:u,onChange:function(e){return d(e.target.checked)},label:e.phrases.acknowledgement}),n.createElement(i.u,null,e.onBack&&n.createElement(i.u.Cancel,{onClick:e.onBack,text:null!==(t=e.phrases.backButton)&&void 0!==t?t:s("backButton"),variant:"link"}),n.createElement(i.u.Submit,{onClick:function(){u&&!e.loading&&e.onDelete()},text:e.phrases.deleteButton,variant:"danger",disabled:!u||e.loading,showSpinner:e.loading})))}},33518:(e,t,r)=>{var n;r.d(t,{e:()=>n}),function(e){e.Public="Public",e.PinCode="PinCode",e.PasswordProtected="PasswordProtected",e.ProtectedOverrideRestriction="ProtectedOverrideRestriction",e.JustMySchoolOverrideRestriction="JustMySchoolOverrideRestriction",e.Protected="Protected",e.JustMySchool="JustMySchool",e.Direct="Direct"}(n||(n={}))},18488:(e,t,r)=>{r.d(t,{o:()=>i});var n=r(99940),a=r(97395),o={namespace:"share-v2"},i={createShare:function(e){return{url:"{gateway}/v2/shares",key:"create:share-v2",type:n.k.POST,data:e,normalizeOptions:o,invalidationKeys:["sent:share-v2","get:share-v2:shares:object"]}},updateShare:function(e,t){return{url:"{gateway}/v2/shares/".concat(e),key:"update:share-v2",type:n.k.PUT,data:t,normalizeOptions:o,invalidationKeys:["share-v2:permanent-link:object","share-v2:".concat(e),"get:share-v2:shares:object"]}},deleteShare:function(e){return{type:n.k.DELETE,url:"{gateway}/v2/shares/".concat(e),key:"delete:share-v2",normalizeOptions:o,invalidationKeys:["share-v2:permanent-link:object","sent:share-v2","share-v2:".concat(e),"get:share-v2:shares:object"]}},getShare:function(e){return{url:"{gateway}/v2/shares/".concat(e),key:"share-v2:".concat(e),bootstrapName:"share-v2:".concat(e),type:n.k.GET,normalizeOptions:o}},getSentShares:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=Object.values(e).sort().join(":");return{url:a._.urlBuilder("{gateway}/v2/shares/sent",e),key:"sent:share-v2:".concat(t),type:n.k.GET,normalize:!1}},getShareLink:function(e){return{url:a._.urlBuilder("{gateway}/v2/shares/permanent-link",{objectId:e}),key:"share-v2:permanent-link:object:".concat(e),normalizeOptions:o}},createShareLink:function(e){return{type:n.k.POST,url:a._.urlBuilder("{gateway}/v2/shares/permanent-link",Object.assign({},e)),key:"create:share-v2:permanent-link:object:".concat(e.objectId),invalidationKeys:["share-v2:permanent-link:object:".concat(e.objectId),"sent:share-v2","get:share-v2:shares:object:".concat(e.objectId)],normalizeOptions:o}},getPrivacy:function(e){return{url:"{gateway}/v1/objects/".concat(e,"/access"),key:"privacy:".concat(e),normalize:!1}},getSharesByObjectId:function(e){return{url:"{gateway}/v2/shares/objects/".concat(e),key:"get:share-v2:shares:object:".concat(e),type:n.k.GET,normalizeOptions:o}},createSharePincode:function(e){return{url:"{gateway}/v2/shares/".concat(e,"/pincode"),key:"create:share-v2:".concat(e,":pincode"),type:n.k.POST}},getPincodeByShareId:function(e){return{url:"{gateway}/v2/shares/".concat(e,"/pincode"),key:"get:share-v2:".concat(e,":pincode")}},getPincodeByCode:function(e){return{url:"{gateway}/v2/shares/pincode?code=".concat(e),key:"get:share-v2:pincode:".concat(e)}}}},93563:(e,t,r)=>{r.d(t,{_:()=>c});var n=r(20354),a=r(33518),o=r(18488),i=r(8233);function c(e){var t=n.a.useGetFetchAsync(),r=n.a.useBasicFetch(o.o.getPrivacy(e.entityId));return{loaded:!!r.data,updateShareLink:function(e,r){return t(o.o.updateShare(e,r))},createShareLink:function(n){var c=null!=n?n:"protected"===i.R.getShareLinkAccessType(r.data)?a.e.Protected:a.e.JustMySchool;return t(o.o.createShareLink({objectId:e.entityId,privacy:c}))},deleteShareLink:function(e){return t(o.o.deleteShare(e))}}}},8233:(e,t,r)=>{r.d(t,{R:()=>y});var n=r(23481),a=r(110),o=r(33518),i=r(4594),c=r(49080),s=r(26361),l=r(35223),u=r(31908);function d(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}var v=n.T.encloseNamespace("sharev2.utils"),y={getPrivateIconAndText:function(e){var t=e.entityTypeId,r=e.privacy,n=e.hasStudentExp,a=e.entity,c=e.yearGroups;if(t===i.E.Topic||t===i.E.Series)return{icon:l.vn.VisibleOn,text:v(n?"justMySchoolTeachers":"justMySchoolDescription")};if(!Array.isArray(r))switch(r){case o.e.Public:return{icon:l.vn.VisibleOn,text:v("publicDescription")};case o.e.ProtectedOverrideRestriction:return{icon:l.vn.VisibleOn,text:v("clickViewOnly")};case o.e.Protected:return{icon:l.vn.Lock,text:y.getRespectRatingText(a,c,n)};case o.e.JustMySchoolOverrideRestriction:return{icon:l.vn.Lock,text:v(n?"justMySchoolTeachers":"justMySchoolDescription")};case o.e.JustMySchool:return{icon:l.vn.Lock,text:y.getRespectRatingText(a,c,n)};case o.e.PinCode:return{icon:l.vn.Lock,text:v("pinDescription")};case o.e.PasswordProtected:return{icon:l.vn.Lock,text:v("privateDescription")};default:return{}}},getIconAndText:function(e){var t=e.linkExpireDate,r=e.isPasswordProtected,n=e.status;if(!t&&!r)return y.getPrivateIconAndText(e);if(!t)return{icon:l.vn.Lock,text:v("password")};var o=a.O.isToday(t),i=a.O.diffBetween(t,new Date,"day");if(!r){var s=o?v("expiryToday"):v("expiry",{days:i});return n===c.F.Expired&&(s=v("expired")),{icon:l.vn.Timer,text:s}}var u=o?v("passwordExpiryToday"):v("passwordExpiry",{days:i});return n===c.F.Expired&&(u=v("passwordExpired")),{icon:l.vn.Lock,text:u}},getRespectRatingText:function(e,t,r){var n;if(!e||!t)return null;if(r)return v("justMySchoolTeachers");if(!u.M.isVideoType(e))return v("collectionRating");var a=s.l.getWeightedRestriction(null===(n=e._restrictions)||void 0===n?void 0:n.value);if(a&&!a.yearGroup)return v("onlyAdmins");var o,i,c,l=u.M.getRating(e),y=function(e,t){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!r){if(Array.isArray(e)||(r=function(e,t){if(e){if("string"==typeof e)return d(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?d(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,a=function(){};return{s:a,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,i=!0,c=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return i=e.done,e},e:function(e){c=!0,o=e},f:function(){try{i||null==r.return||r.return()}finally{if(c)throw o}}}}(t);try{for(y.s();!(c=y.n()).done;){var h=c.value;(!o||h.value>o.value)&&(o=h),a&&h.value<=a.yearGroup||l&&h.rating.value<l.value||(!i||h.value<i.value)&&(i=h)}}catch(e){y.e(e)}finally{y.f()}return i?1===t.length?v("clickViewOnly"):i.value===o.value?v("maxYearGroup",{yearGroup:o.name}):v("yearGroupRange",{yearGroup:i.name}):v("onlyStaff")},getShareLinkAccessType:function(e){return e.isTvContent||e.isClickViewContent?"protected":e.canManageAccess?"owner":"private"}}},36790:(e,t,r)=>{r.r(t),r.d(t,{DeleteAssignmentConfirmationView:()=>h});var n=r(32735),a=r(6044),o=r(23481),i=r(20354),c=r(29923),s=r(18488),l=r(93563),u=r(9111),d=r(69883);function v(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}var y=o.T.encloseNamespace("sharev2.deleteAssignmentConfirmation");function h(e){var t,r,o,h=(0,d.Z)(),p=i.a.useBasicFetch(s.o.getShare(e.shareId)),f=(r=n.useState(!1),o=2,function(e){if(Array.isArray(e))return e}(r)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,o,i,c=[],s=!0,l=!1;try{if(o=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;s=!1}else for(;!(s=(n=o.call(r)).done)&&(c.push(n.value),c.length!==t);s=!0);}catch(e){l=!0,a=e}finally{try{if(!s&&null!=r.return&&(i=r.return(),Object(i)!==i))return}finally{if(l)throw a}}return c}}(r,o)||function(e,t){if(e){if("string"==typeof e)return v(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?v(e,t):void 0}}(r,o)||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.")}()),g=f[0],m=f[1],k=(0,l._)({entityId:null===(t=p.data)||void 0===t?void 0:t.objectId.toString()}).deleteShareLink,b=p.hasCompleted;return n.createElement(u.G,{title:y("title"),closePopup:e.closePopup,showLoadingSpinner:!b},n.createElement(c.F,{loading:g,phrases:{leadingSentence:y("intro"),bulletPoints:[y("studentsLoseAccessInfo"),y("loseAccessInfo"),y("loseAccessUsage")],acknowledgement:y("acknowledgement"),deleteButton:y("delete")},onDelete:function(){var t;m(!0),k(null===(t=p.data)||void 0===t?void 0:t.shareId).then(function(){m(!1),h.success(y("deleteSuccess")),e.closePopup(),e.previousAppLink&&a.C$.trigger(e.previousAppLink)}).catch(function(){h.error(y("deleteFailed"))}).finally(function(){m(!1)})}}))}}}]);
|
|
2
|
-
//# sourceMappingURL=6790-df00506bec-lite.chunk.js.map
|