@clickview/lite 0.78.0-rc.0 → 0.78.0-rc.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/2985-57417d1a16-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/hooks/useCreateShare.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/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/views/classroom-create-prompt-view/components/create-prompt/CreatePrompt.tsx","file:///app/packages/projects/lite/src/apps/assign/views/classroom-create-prompt-view/components/create-prompt/create-prompt.scss","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/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/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-classroom-view/NoClassroomView.tsx","file:///app/packages/projects/lite/src/apps/assign/views/no-existing-classroom-view/NoExistingClassroomView.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/apps/classrooms/hooks/useFetchClassrooms.ts","file:///app/packages/projects/lite/src/apps/classrooms/validation/ClassroomValidationSchema.ts"],"sourcesContent":["import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { IconCircle } from 'libs/shared/components/icon-circle/IconCircle';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { SharePrivacy } from '../../enums/SharePrivacy';\nimport { ShareType } from '../../enums/ShareType';\n\nconst namespace = 'sharev2.shareAvatar';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst icons = {\n [ShareType.Open]: cvSvgLibrary.Classrooms,\n [ShareType.Link]: cvSvgLibrary.Link,\n [ShareType.Classroom]: cvSvgLibrary.Classrooms,\n [ShareType.Live]: cvSvgLibrary.Play,\n [ShareType.LegacyDirect]: cvSvgLibrary.Share\n};\n\nconst iconColours = {\n [ShareType.Open]: 'blue',\n [ShareType.Link]: 'black',\n [ShareType.Classroom]: 'purple',\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, openClassroomName }: ShareAvatarProps) {\n if (type === ShareType.Open && openClassroomName)\n return openClassroomName;\n \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 openClassroomName?: string;\n hideSubtitle?: boolean;\n subtitleText?: string;\n svgSize?: SvgContainerSize;\n additionalTitleText?: string;\n className?: string;\n titleClassName?: string;\n}\n\nexport function ShareAvatar(props: ShareAvatarProps): JSX.Element {\n const title = getTitle(props);\n return (\n <div className={classNames('d-flex align-items-center gap-2', props.className)}>\n <div>\n <IconCircle\n svgName={icons[props.type]}\n variant={iconColours[props.type]}\n textVariant='white'\n svgWrapperClassName='p-1'\n svgSize={props.svgSize ?? SvgContainerSize.Standard}\n />\n </div>\n <div className='d-flex flex-column'>\n <p className={classNames('m-0', props.titleClassName)} title={title}>{title}</p>\n {!props.hideSubtitle && <span className='text-secondary'>{props.subtitleText ?? getSubtitle(props)}</span>}\n </div>\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 { CreateShareRequest } from 'libs/shared/apps/share-v2/interfaces/CreateShareRequest';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { SharePincode } from 'libs/shared/apps/share-v2/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 name: string;\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 request: CreateShareRequest = {\n objectId: options.objectId,\n type: ShareType.Open,\n privacy,\n optionRequest: {\n preventScrubbing: options.preventScrubbing,\n immediateFeedback: options.immediateFeedback\n }\n };\n if (options.name.length)\n request.optionRequest.openClassroomName = options.name;\n\n const share = await fetchAsync<Share>(ShareRequestsV2.createShare(request));\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 { 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';\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 FlowSettingInputItemProps {\n title: string;\n value: string;\n onChange: (value: string) => void;\n hide?: boolean;\n note?: string;\n placeholder?: string;\n className?: string;\n error?: string;\n}\n\nfunction FlowSettingInputItem(props: React.PropsWithChildren<FlowSettingInputItemProps>): 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 flex-column w-100'>\n <label className='mb-1' htmlFor={id}>{props.title}</label>\n <input type='text' id={id} className={classNames('form-control', props.error && 'is-invalid')} placeholder={props.placeholder ?? ''} value={props.value} onChange={e => props.onChange(e.target.value)} />\n {!!props.note && <span className='mt-1 text-secondary'>{props.note}</span>}\n {!!props.error && <span className='mt-1 text-danger'>{props.error}</span>}\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 {!!props.name && <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;\nFlowSettings.Input = FlowSettingInputItem;","// extracted by mini-css-extract-plugin\nexport default {\"textarea\":\"icGmN\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport styles from './create-prompt.scss';\n\nconst namespace = 'classroomCreatePromptView.createPrompt';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\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 <img src={ImageUrls.Assign.CREATE_CLASSROOM} alt={getPhrase('imageAlt')} className={classNames('mb-3', styles.image)} />\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}","// extracted by mini-css-extract-plugin\nexport default {\"image\":\"nUzTr\"};","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';\n\nimport { FlowControls } from 'apps/assign/components/flow-controls/FlowControls';\nimport { getAssignEventLogger } from 'apps/assign/utils/get-assign-event-logger/getAssignEventLogger';\n\nimport { CreatePrompt } from './components/create-prompt/CreatePrompt';\n\nconst namespace = 'assign.classroomCreatePromptView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface ClassroomCreatePromptViewProps extends MultiStepPopupViewProps {\n objectId: string;\n entityType: SharableEntityType;\n goToFlowSelector: () => void;\n goToCreateClassroomForm: () => void;\n hideBackButton?: boolean;\n}\n\nexport function ClassroomCreatePromptView(props: ClassroomCreatePromptViewProps): JSX.Element {\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 goToCreateClassroomForm() {\n log({ type: 'click-create-classroom' });\n \n props.goToCreateClassroomForm();\n }\n\n return (\n <Popup\n size='lg'\n animation={props.animate}\n showLoadingSpinner={props.loading}\n closePopup={props.closePopup}\n title={getPhrase('title')}\n bodyClassName='d-flex flex-column gap-3'\n >\n <CreatePrompt onClick={goToCreateClassroomForm} />\n\n <FlowControls\n hideBackButton={props.hideBackButton}\n onClickBack={props.goToFlowSelector}\n hideNextButton\n hideCreateClassroomButton\n />\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='purple'\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 hideCreateOpenClassroomLink?: boolean;\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 {!props.hideCreateOpenClassroomLink &&\n <>\n &nbsp;\n <Text namespace={namespace} phrase='or' />\n &nbsp;\n <a className='p-0 text-info cursor-pointer' onClick={props.onClickCreateOpenClassroom} >\n <Text namespace={namespace} phrase='createOpenClassroom' />\n </a>\n </>\n }\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 hideBackButton?: boolean;\n hideCreateClassroomLink?: boolean;\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 hideCreateOpenClassroomLink={props.hideCreateClassroomLink}\n />\n \n <FlowControls\n hideBackButton={props.hideBackButton}\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 { 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 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 { classNames } from 'libs/common/react/utils/ClassNameHelper';\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\ninterface AccordionProps {\n className?: string;\n}\n\nexport function Accordion(props: React.PropsWithChildren<AccordionProps>) {\n return (\n <div className={classNames('d-flex flex-column gap-2', props.className)}>\n {props.children}\n </div>\n );\n}\n\nAccordion.Item = AccordionItem;","import React from 'react';\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 className?: string;\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={classNames('d-flex flex-column', props.className)}>\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 </div>\n );\n}","import React from 'react';\nimport Scrollbars from 'react-custom-scrollbars-2';\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 <Scrollbars\n autoHide\n autoHeight\n autoHeightMin={0}\n autoHeightMax={400}\n >\n <Accordion className='pb-3'>\n <Accordion.Item\n intialShow\n title={getPhrase('groupsTitle', { 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', { smartCount: props.learners.length })}\n >\n <div className='px-2 py-1'>\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 <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 className='ms-4'\n />\n </Accordion.Item>\n </Accordion>\n </Scrollbars>\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 <div>\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 </div>\n </Popup>\n );\n}\n","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SharableEntityType } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\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';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { FlowControls } from 'apps/assign/components/flow-controls/FlowControls';\n\nconst namespace = 'assign.noClassroom';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface NoClassroomViewProps extends MultiStepPopupViewProps {\n objectId: string;\n entityType: SharableEntityType;\n goToFlowSelector: () => void;\n goToOpenClassroomFlow: () => void;\n}\n\nexport function NoClassroomView(props: NoClassroomViewProps): JSX.Element {\n return (\n <Popup\n size='lg'\n animation={props.animate}\n closePopup={props.closePopup}\n title={getPhrase('title')}\n >\n <Row className='mb-3'>\n <Col xs={12} md={8} className='offset-md-2 d-flex flex-column align-items-center'>\n <img src={ImageUrls.EmptyStates.Share.NO_CLASSROOM} alt='No Classroom' className='mb-3' />\n <h2 className='h6 text-center mb-3'><Text namespace={namespace} phrase='heading' /></h2>\n <p className='text-center'>\n <Text namespace={namespace} phrase='description' />\n </p>\n <DivButton\n className='btn btn-outline-dark mb-3'\n onClick={props.goToOpenClassroomFlow}\n >\n <Text namespace={namespace} phrase='assignToOpenClassroom' />\n </DivButton>\n <AppLink\n appLink={{\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.UPGRADE\n }}\n className='hover-text-underline'\n >\n <Text namespace={namespace} phrase='requestAccess' />\n </AppLink>\n </Col>\n </Row>\n \n <FlowControls\n onClickBack={props.goToFlowSelector}\n hideNextButton\n hideCreateClassroomButton\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 { SharableEntityType } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\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';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport { FlowControls } from 'apps/assign/components/flow-controls/FlowControls';\n\nconst namespace = 'assign.noExistingClassroom';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface NoExistingClassroomViewProps extends MultiStepPopupViewProps {\n objectId: string;\n entityType: SharableEntityType;\n goToOpenClassroomFlow: () => void;\n goToFlowSelector: () => void;\n}\n\nexport function NoExistingClassroomView(props: NoExistingClassroomViewProps): JSX.Element {\n return (\n <Popup\n size='lg'\n animation={props.animate}\n closePopup={props.closePopup}\n title={getPhrase('title')}\n >\n <Row className='mb-3'>\n <Col xs={12} lg={6} className='mb-3 offset-lg-3 d-flex justify-content-center'>\n <img src={ImageUrls.Assign.NO_EXISTING_CLASSROOMS} alt={getPhrase('imageAlt')} className='w-50' />\n </Col>\n <Col xs={12} md={8} className='offset-md-2 d-flex flex-column align-items-center gap-2 text-center'>\n <h3 className='h6 m-0'>\n <Text namespace={namespace} phrase='heading' />\n </h3>\n <p className='m-0'><Text namespace={namespace} phrase='contactAdmin' /></p>\n <p className='m-0'><Text namespace={namespace} phrase='description' /></p>\n </Col>\n </Row>\n <div className='text-center mb-3'>\n <DivButton\n className='btn btn-outline-dark'\n onClick={props.goToOpenClassroomFlow}\n >\n <Text namespace={namespace} phrase='assignToOpenClassroom' />\n </DivButton>\n </div>\n <FlowControls\n hideNextButton\n hideCreateClassroomButton\n onClickBack={props.goToFlowSelector}\n />\n </Popup>\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 showVideoCount\n onlyCount\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 { NoClassroomView, NoClassroomViewProps } from 'apps/assign/views/no-classroom-view/NoClassroomView';\nimport { NoExistingClassroomView } from 'apps/assign/views/no-existing-classroom-view/NoExistingClassroomView';\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 & NoClassroomViewProps;\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 'no-classroom': { view: NoClassroomView },\n 'no-existing-classroom': { view: NoExistingClassroomView }\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 isEntry?: boolean;\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 selectedClassroom: viewModel.selectedClassroom,\n detailsTitle: getPhrase('existingClassroomTitle'),\n hideBackButton: props.isEntry,\n hideCreateClassroomLink: props.isEntry,\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 { 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});"],"names":["getPhrase","icons","iconColours","shareTypeTitlePhraseMap","ShareAvatar","props","title","type","classroomName","additionalTitleText","openClassroomName","getTitle","className","svgName","variant","textVariant","svgWrapperClassName","svgSize","S","titleClassName","hideSubtitle","subtitleText","privacy","studentCount","classroomGroupCount","smartCount","getClassroomSubtitle","includes","getLinkSubtitle","getSubtitle","useCreateShare","objectId","accessPermissions","fetchAsync","canManageAccess","data","createPincode","options","shareId","createDirectShare","requireSignIn","optionRequest","preventScrubbing","immediateFeedback","recipientRequest","recipients","map","recipientId","message","scopeId","share","createOpenSession","respectRatingsAndRestrictions","request","name","length","hasCompleted","MultiStepPopup","animate","setAnimate","stepConfig","steps","step","loading","viewProps","closePopup","setStep","ViewComponent","view","defaultErrors","notFound","forbidden","rating","yearLevel","region","badRequest","internalServerError","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","SCROLL_TOLERANCE","useInfiniteList","getRequest","fetchNext","onError","getItems","getCursor","scrollContainer","handleScroll","useState","pagesFetched","setPagesFetched","fetchNextFn","response","cursor","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","FlowSettings","hide","Row","Col","xs","childContainerClassName","children","Toggle","id","Checkbox","onChange","onClick","checked","toggled","disabled","htmlFor","description","TextArea","placeholder","value","e","target","Divider","withMargins","Input","error","note","namespace","LanguageService","CreatePrompt","src","ImageUrls","alt","Text","phrase","NarrowSelectionButton","Tooltip","spanHack","placement","disable","hasRecipients","Button","onClickSelectGroupsOrStudents","ClassroomSelectorListItem","isSelected","onSelected","md","Form","IconCircle","SvgContainer","studentsCount","ClassroomSelectorList","classrooms","PopupLoadingSpinner","autoHeight","autoHeightMin","autoHeightMax","classroom","selectedClassroom","onClassroomSelected","getStudentsCount","InfiniteScrollFooter","fetchOnScroll","EmptyState","size","altText","role","query","searchQuery","hideCreateOpenClassroomLink","onClickCreateOpenClassroom","InputGroupText","bsPrefix","as","Component","ref","displayName","InputGroup","hasValidation","contextValue","useMemo","InputGroupContext","Object","assign","Radio","FormCheckInput","SelectedClassroomHeader","ShareType","SharePrivacy","enrolments","count","onClickChangeClassroom","ExistingClassroomFlowSettings","hidePreventScrubbing","hideImmediateFeedback","onTogglePreventScrubbing","disablePreventScrubbing","onToggleImmediateFeedback","disableImmediateFeedback","hideMessage","onToggleMessage","toggleMessage","disableMessage","onChangeMessage","useExistingClassroomFlowSettingsData","sharedData","useAssignSharedData","entityType","yearGroups","CustomerRequests","currentUser","customerId","setLoading","interactive","settings","setSettings","setMessage","loaded","config","entity","shouldShowSpinner","hasStudentExp","toggleSetting","setting","prev","onChangeSetting","onShare","onSuccess","console","SelectionType","Accordion","Item","intialShow","show","setShow","IconButton","ClassroomEntityListItem","showTooltip","isDisabled","tooltipText","DivButton","trigger","icon","ClassroomEntityList","entities","selectedEntities","find","disableSelected","renderTitle","renderIcon","onSelectEntity","emptyState","NarrowClassroomSelectionControls","Students","setType","selectedGroups","setSelectedGroups","selectedLearners","setSelectedLearners","allStudentsSelected","learners","autoHide","groups","group","newSelectedGroups","AssignHelper","Groups","setRecipients","metadata","colour","label","indeterminate","learner","newSelectedStudents","ViewImage","style","backgroundImage","SharedObjectImage","object","locationContext","imageClassName","thumbnailSize","showVideoCount","onlyCount","ExistingClassroomStepConfig","log","getAssignEventLogger","analyticsOptions","location","Popup","animation","showLoadingSpinner","bodyClassName","goToCreateClassroomForm","FlowControls","hideBackButton","onClickBack","goToFlowSelector","hideNextButton","hideCreateClassroomButton","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","hideCreateClassroomLink","goToSettings","onClickCreateClassroom","selectedClassroomLearners","selectedClassroomGroups","useNarrowClassroomSelectionData","goToSelectClassroom","onChangeRecipients","nextButtonTooltip","AssignDetailsView","addStudentsAppLink","application","action","args","hideTitle","AppLink","appLink","lg","ExistingClassroomFlowView","initialStep","setShare","prevStep","setPrevStep","hasPrevStep","hasStudentsInClassroom","students","nextStep","pop","useExistingClassroomFlowData","detailsTitle","isEntry","alerts","dispatch","getClassroomsRequest","pageNumber","httpStatus","results","shape","max","required"],"sourceRoot":""}