@clickview/lite 0.49.7 → 0.49.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/dist/bundles.json +1 -1
  2. package/dist/scripts/1285-db42ee1c76-lite.chunk.js +2 -0
  3. package/dist/scripts/1285-db42ee1c76-lite.chunk.js.map +1 -0
  4. package/dist/scripts/1863-bb98f2e617-lite.chunk.js +2 -0
  5. package/dist/scripts/1863-bb98f2e617-lite.chunk.js.map +1 -0
  6. package/dist/scripts/{2355-78b307e130-lite.chunk.js → 2355-b2345e9449-lite.chunk.js} +2 -2
  7. package/dist/scripts/{2355-78b307e130-lite.chunk.js.map → 2355-b2345e9449-lite.chunk.js.map} +1 -1
  8. package/dist/scripts/7301-49c2341e97-lite.chunk.js +2 -0
  9. package/dist/scripts/7301-49c2341e97-lite.chunk.js.map +1 -0
  10. package/dist/scripts/{7855-cbf70d4453-lite.chunk.js → 7855-76f000d339-lite.chunk.js} +2 -2
  11. package/dist/scripts/7855-76f000d339-lite.chunk.js.map +1 -0
  12. package/dist/scripts/8243-e9d7716ffe-lite.chunk.js +2 -0
  13. package/dist/scripts/8243-e9d7716ffe-lite.chunk.js.map +1 -0
  14. package/dist/scripts/bundle-d3e8783756.min.js +3 -0
  15. package/dist/scripts/bundle-d3e8783756.min.js.map +1 -0
  16. package/package.json +1 -1
  17. package/dist/scripts/1285-93d485e012-lite.chunk.js +0 -2
  18. package/dist/scripts/1285-93d485e012-lite.chunk.js.map +0 -1
  19. package/dist/scripts/1863-5502813c32-lite.chunk.js +0 -2
  20. package/dist/scripts/1863-5502813c32-lite.chunk.js.map +0 -1
  21. package/dist/scripts/7301-98679776b7-lite.chunk.js +0 -2
  22. package/dist/scripts/7301-98679776b7-lite.chunk.js.map +0 -1
  23. package/dist/scripts/7855-cbf70d4453-lite.chunk.js.map +0 -1
  24. package/dist/scripts/8243-ddaa0ed22d-lite.chunk.js +0 -2
  25. package/dist/scripts/8243-ddaa0ed22d-lite.chunk.js.map +0 -1
  26. package/dist/scripts/bundle-0fc905d3a4.min.js +0 -3
  27. package/dist/scripts/bundle-0fc905d3a4.min.js.map +0 -1
  28. /package/dist/scripts/{bundle-0fc905d3a4.min.js.LICENSE.txt → bundle-d3e8783756.min.js.LICENSE.txt} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/7301-98679776b7-lite.chunk.js","mappings":"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","sources":["file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/components/embed-size/EmbedSize.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/components/link-expiry/LinkExpiry.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/components/set-password-input/set-password-input.scss","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/components/set-password-input/SetPasswordInput.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/components/link-password/LinkPassword.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/utils/LinkExpiryHelper.ts","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/validation/ShareLinkSettingsValidationSchema.ts","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/components/copy-embed-html/copy-embed-html.scss","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/components/copy-embed-html/CopyEmbedHtml.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/views/share/components/copy-embed/CopyEmbed.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/components/get-embed-code/get-embed-code.scss","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/components/get-embed-code/GetEmbedCode.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/components/share-link-info/getRespectRatingText.ts","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/components/share-link-info/share-link-info.scss","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/components/share-link-info/ShareLinkInfo.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/views/share/components/share-integrations/avatars/GoogleClassroomAvatar.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/views/share/components/share-integrations/avatars/MicrosoftTeamsAvatar.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/views/share/components/share-integrations/ShareIntegrationsStack.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/views/share/components/share-as-link/ShareAsLink.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/views/share/components/share-message/ShareMessage.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/views/share/components/main-share/MainShare.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/views/share/components/share-settings/ShareSettings.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/views/share/ShareView.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/forms/form-checkbox/FormCheckbox.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/forms/form-field/CharacterCounter.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/forms/form-field/form-field.scss","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/forms/form-field/FormField.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/forms/form-wrapper/FormWrapper.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/utils/FormHelper.ts"],"sourcesContent":["import React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { EmbedResolution } from 'libs/shared/utils/EmbedHelper';\n\nconst namespace = 'share.embedSize';\n\ninterface EmbedSizeProps {\n autoplay: boolean;\n setAutoplay: (autoplay: boolean) => void;\n videoSize: EmbedResolution;\n setVideoSize: (videoSize: EmbedResolution) => void;\n videoSizes: EmbedResolution[];\n}\n\nexport function EmbedSize(props: EmbedSizeProps): React.ReactElement {\n const {\n autoplay,\n setAutoplay,\n videoSize,\n setVideoSize,\n videoSizes\n } = props;\n\n return (\n <div className='d-flex align-items-center'>\n {!!videoSizes.length &&\n <>\n <div className='me-1'>\n <Text namespace={namespace} phrase='videoSize' />\n </div>\n <div className='pe-3'>\n <Dropdown>\n <Dropdown.Toggle id='embed-resolution' variant='outline-dark'>\n {videoSize.label}\n </Dropdown.Toggle>\n\n <Dropdown.Menu>\n {videoSizes.map(size => (\n <Dropdown.Item\n key={`${size.width}x${size.height}`}\n onClick={() => setVideoSize(size)}\n >\n {size.label}\n </Dropdown.Item>\n ))}\n </Dropdown.Menu>\n </Dropdown>\n </div>\n </>\n }\n <div className='me-2'>\n <Text namespace={namespace} phrase='autoplay' />\n </div>\n <Checkbox id='autoplay-checkbox' checked={autoplay} onChange={() => setAutoplay(!autoplay)} />\n </div>\n );\n}","import React from 'react';\nimport { useFormikContext } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EditShareLinkRequest } from 'libs/shared/apps/share/interfaces/requests/EditShareLinkRequest';\nimport { getLinkExpiryDate } from 'libs/shared/apps/share/utils/LinkExpiryHelper';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\n\nconst namespace = 'shared.linkExpiry';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface LinkExpiryProps {\n passwordProtectLink: boolean;\n}\n\nexport function LinkExpiry(props: LinkExpiryProps): React.ReactElement {\n const formikProps = useFormikContext<EditShareLinkRequest>();\n\n function setLinkExpireDate(): void {\n if (props.passwordProtectLink)\n return;\n\n formikProps.setFieldValue('linkExpireDate', getLinkExpiryDate(!formikProps.values.linkExpireDate));\n }\n\n return (\n <div className='d-flex justify-content-between align-items-center pb-3'>\n <div>\n <label className='m-0' htmlFor=''><Text namespace={namespace} phrase='linkExpirationHeading' /></label>\n <p className='m-0'><Text namespace={namespace} phrase='linkExpirationInfo' /></p>\n </div>\n <Tooltip\n title={getPhrase('passwordProtected')}\n disable={!props.passwordProtectLink}\n spanHack\n trigger='hover'\n >\n <ToggleSwitch\n onClick={setLinkExpireDate}\n on={!!formikProps.values.linkExpireDate}\n disabled={props.passwordProtectLink}\n showStateWhenDisabled\n />\n </Tooltip>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"passwordButton\":\"W9Jl8\"};","import * as React from 'react';\nimport { Form } from 'react-bootstrap';\nimport { useFormikContext } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EditShareLinkRequest } from 'libs/shared/apps/share/interfaces/requests/EditShareLinkRequest';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './set-password-input.scss';\n\nconst namespace = 'share.setPasswordInput';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SetPasswordInputProps {\n value: string;\n onChange: (value: string) => void;\n onReset?: () => void;\n /**\n * Allow user to view and edit current value.\n */\n canEdit?: boolean;\n /**\n * Don't allow user to view/edit current value\n * but allow them to clear it and enter a new value.\n */\n canReset?: boolean;\n placeholder?: string;\n}\n\nexport function SetPasswordInput(props: SetPasswordInputProps): JSX.Element {\n const [ revealPassword, setRevealPassword ] = React.useState(false);\n\n const formikProps = useFormikContext<EditShareLinkRequest>();\n\n const errorMsg = formikProps.errors?.password;\n\n return (\n <>\n <input\n className={`form-control ${errorMsg ? 'is-invalid' : ''}`}\n value={props.value}\n onChange={e => {\n !!props.canEdit && props.onChange(e.target.value);\n }}\n type={revealPassword ? 'text' : 'password'}\n placeholder={props.placeholder || getPhrase('passwordPlaceholder')}\n readOnly={!props.canEdit}\n />\n {!!errorMsg && (\n <Form.Control.Feedback type='invalid'>{errorMsg}</Form.Control.Feedback>\n )}\n {!!props.canEdit &&\n <DivButton className={styles.passwordButton} onClick={() => setRevealPassword(!revealPassword)}>\n <SvgContainer\n svgName={revealPassword ? cvSvgLibrary.VisibleOn : cvSvgLibrary.VisibleOff}\n title={getPhrase(revealPassword ? 'hidePassword' : 'revealPassword')}\n tooltipPlacement='top'\n />\n </DivButton>\n }\n {!props.canEdit && !!props.canReset && !!props.onReset &&\n <DivButton className={styles.passwordButton} onClick={props.onReset}>\n <SvgContainer\n svgName={cvSvgLibrary.Close} title={getPhrase('resetPassword')}\n tooltipPlacement='top'\n />\n </DivButton>\n }\n </>\n );\n}","import React from 'react';\nimport { useFormikContext } from 'formik';\n\nimport { SetPasswordInput } from 'libs/shared/apps/share/components/set-password-input/SetPasswordInput';\nimport { EditShareLinkRequest } from 'libs/shared/apps/share/interfaces/requests/EditShareLinkRequest';\nimport { getLinkExpiryDate } from 'libs/shared/apps/share/utils/LinkExpiryHelper';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\nimport { ShareLink } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.linkPassword';\n\nconst PASSWORD_PLACEHOLDER = '********';\n\ninterface LinkPasswordProps {\n shareLink: ShareLink;\n passwordProtectLink: boolean;\n setPasswordProtectLink: (protect: boolean) => void;\n}\n\nexport function LinkPassword(props: LinkPasswordProps): React.ReactElement {\n const { passwordProtectLink, setPasswordProtectLink } = props;\n\n const formikProps = useFormikContext<EditShareLinkRequest>();\n \n const [ readonlyPassword, setReadonlyPassword ] = React.useState(!!props.shareLink?.isPasswordProtected);\n\n function onTogglePasswordProtect(): void {\n if (props.shareLink?.isPasswordProtected)\n formikProps.setFieldValue('removePassword', passwordProtectLink);\n\n formikProps.setFieldValue('password', '');\n\n setPasswordProtectLink(!passwordProtectLink);\n formikProps.setFieldValue('linkExpireDate', getLinkExpiryDate(!passwordProtectLink));\n }\n\n function setPassword(password: string): void {\n formikProps.setFieldValue('password', password);\n }\n\n function resetPassword(): void {\n formikProps.setFieldValue('password', '');\n formikProps.setFieldValue('removePassword', true);\n setReadonlyPassword(false);\n }\n\n return (\n <div className='pb-3'>\n <div className='d-flex justify-content-between align-items-center'>\n <div>\n <label className='m-0' htmlFor=''><Text namespace={namespace} phrase='passwordProtectHeading' /></label>\n <p className='m-0'><Text namespace={namespace} phrase='passwordProtectInfo' /></p>\n </div>\n <ToggleSwitch onClick={onTogglePasswordProtect} on={passwordProtectLink} />\n </div>\n\n {passwordProtectLink &&\n <div className='position-relative mt-2'>\n <SetPasswordInput\n value={readonlyPassword ? PASSWORD_PLACEHOLDER : formikProps.values.password}\n onChange={setPassword}\n onReset={resetPassword}\n canEdit={!readonlyPassword}\n canReset\n />\n </div>\n }\n </div>\n );\n}","const LINK_EXPIRY_TIME = 30; // days\nexport function getLinkExpiryDate(shouldExpire: boolean): string | null {\n if (!shouldExpire)\n return null;\n\n const date = new Date();\n date.setDate(date.getDate() + LINK_EXPIRY_TIME);\n\n return date.toISOString();\n}","import { boolean, object, string } from 'yup';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst namespace = 'share.validation';\n\nexport const ShareLinkSettingsValidationSchema = object().shape({\n removePassword: boolean(),\n resourceId: string(),\n linkExpireDate: string().nullable(),\n password: string()\n .test({\n name: 'password-length',\n exclusive: false,\n params: {},\n message: LanguageService.getPhrase(namespace, 'minPassword'),\n test: val => {\n const removePassword = ((this as any)?.parent as any)?.removePassword;\n\n if (removePassword)\n return true;\n\n if (!val?.length)\n return true;\n\n if (val.length < 3)\n return false;\n\n return true;\n }\n })\n .default('')\n});","// extracted by mini-css-extract-plugin\nexport default {\"embedHtmlInput\":\"mwvd0\",\"copyBtnContainer\":\"myePx\"};","import React from 'react';\nimport { CopyToClipboard } from 'react-copy-to-clipboard';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EventVersion, ShareDescriptors, UserAction } from 'libs/analytics/interfaces';\n\nimport { EmbedSize } from 'libs/shared/apps/share/components/embed-size/EmbedSize';\nimport { SharableEntityType, ShareViewHelper } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { BaseObject, Config, PropsWithAnalyticsOptions } from 'libs/shared/interfaces';\nimport { EmbedHelper, EmbedResolution } from 'libs/shared/utils/EmbedHelper';\n\nimport styles from './copy-embed-html.scss';\n\nconst namespace = 'share.copyEmbedHtml';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ntype CopyEmbedHtmlProps = PropsWithAnalyticsOptions<{\n entity: BaseObject;\n entityType: SharableEntityType;\n config: Config;\n entityId: string;\n shareId: string;\n embedUrl: string;\n}>;\n\nexport function CopyEmbedHtml(props: CopyEmbedHtmlProps): JSX.Element {\n const videoSizes = EmbedHelper.getEmbedResolutions();\n\n const [ copyBtnPhrase, setCopyBtnPhrase ] = React.useState<'copy' | 'copied'>('copy');\n const [ autoplay, setAutoplay ] = React.useState(false);\n const [ videoSize, setVideoSize ] = React.useState<EmbedResolution>(videoSizes.find(s => s.width === '100%'));\n\n const [ logged, setLogged ] = React.useState(false);\n function onCopy(): void {\n setCopyBtnPhrase('copied');\n setTimeout(() => setCopyBtnPhrase('copy'), 2000);\n\n // Because our users are double clickers\n if (logged)\n return;\n\n setLogged(true);\n\n AnalyticsHelper.logUserAction({\n ...props.entity,\n embedDetails: {\n size: videoSize,\n autoplay\n }\n }, AnalyticsHelper.mergeOptions(ShareViewHelper.getAnalyticsOptions(props.entityType), {\n actionType: UserAction.Share,\n descriptor: ShareDescriptors.CopyEmbedHtml,\n eventVersion: EventVersion.V3\n }));\n }\n\n const url = EmbedHelper.buildEmbedUrl({\n embedUrl: props.embedUrl,\n host: props.config.primaryUrl,\n shareId: props.shareId,\n autoplay\n });\n \n const embedString = EmbedHelper.getEmbedString({\n url,\n size: videoSize\n });\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <label><Text namespace={namespace} phrase='label' /></label>\n <div className='position-relative mb-3'>\n <textarea\n className={`form-control rounded w-100 h-100 ${styles.embedHtmlInput}`}\n spellCheck={false}\n value={embedString}\n rows={7}\n readOnly\n />\n <CopyToClipboard onCopy={onCopy} text={embedString}>\n <button className={`btn btn-outline-dark border border-secondary position-absolute bottom-0 end-0 ${styles.copyBtnContainer}`} type='button'>\n {getPhrase(copyBtnPhrase)}\n </button>\n </CopyToClipboard>\n </div>\n <EmbedSize\n autoplay={autoplay}\n setAutoplay={setAutoplay}\n videoSize={videoSize}\n setVideoSize={setVideoSize}\n videoSizes={videoSizes}\n />\n </LanguageNamespaceContext.Provider>\n );\n}\n","import React from 'react';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { CopyEmbedHtml } from 'libs/shared/apps/share/components/copy-embed-html/CopyEmbedHtml';\nimport { SharableEntityType } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { BaseObject, Config, ShareLink } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.share';\n\ninterface CopyEmbedProps {\n entity: BaseObject;\n entityType: SharableEntityType;\n shareLink: ShareLink;\n config: Config;\n entityId: string;\n analyticsOptions: AnalyticsOptions;\n onClickCancel: () => void;\n}\n\nexport function CopyEmbed(props: CopyEmbedProps) {\n return (\n <>\n <div className='mb-3'>\n <CopyEmbedHtml\n embedUrl={props.shareLink.embedUrl}\n entity={props.entity}\n entityType={props.entityType}\n config={props.config}\n entityId={props.entityId}\n shareId={props.shareLink.id}\n analyticsOptions={props.analyticsOptions}\n />\n </div>\n\n <PopupButtons>\n <DivButton onClick={props.onClickCancel} className='btn btn-outline-dark'>\n <Text namespace={namespace} phrase='back'/>\n </DivButton>\n </PopupButtons>\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"hoverBackground\":\"ICTmv\"};","import React from 'react';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer, 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 styles from './get-embed-code.scss';\n\nconst namespace = 'share.getEmbedCode';\n\ninterface GetEmbedCodeProps {\n onClickGetEmbedCode: () => void\n}\n\nexport function GetEmbedCode(props: GetEmbedCodeProps) {\n return (\n <DivButton\n onClick={props.onClickGetEmbedCode}\n className={`d-inline-block p-1 pe-2 rounded-1 ${styles.hoverBackground}`}\n >\n <div className='d-flex align-items-center'>\n <div className='bg-dark text-white rounded-1 me-2'>\n <SvgContainer svgName={cvSvgLibrary.Code} size={SvgContainerSize.Large} />\n </div>\n <Text namespace={namespace} phrase='getEmbedCode' />\n </div>\n </DivButton>\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { BaseObject } from 'libs/analytics/interfaces';\n\nimport { YearGroup } from 'libs/shared/interfaces';\nimport { RestrictionHelper } from 'libs/shared/utils/RestrictionHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst namespace = 'share.shareLinkInfo';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function getRespectRatingText(video: BaseObject, yearGroups: YearGroup[], hasStudentExp: boolean) {\n if (!video || !yearGroups)\n return null;\n\n if (hasStudentExp)\n return getPhrase('justMySchoolTeachers');\n\n if (!VideoHelper.isVideoType(video))\n return getPhrase('collectionRating');\n\n const restriction = RestrictionHelper.getWeightedRestriction(video._restrictions?.value);\n\n /**\n * Restrictions without a year group are teacher restricitons, which means only admins can see it.\n */\n if (restriction && !restriction.yearGroup)\n return getPhrase('onlyAdmins');\n\n const rating = VideoHelper.getRating(video);\n\n let maxYearGroup: YearGroup;\n let minAllowedYearGroup: YearGroup;\n\n for (const yearGroup of yearGroups) {\n /**\n * If our year group is our new highest so far, save it\n */\n if (!maxYearGroup || yearGroup.value > maxYearGroup.value)\n maxYearGroup = yearGroup;\n\n /**\n * If the restriction is higher than this year group, skip it.\n */\n if (restriction && yearGroup.value <= restriction.yearGroup)\n continue;\n\n /**\n * If therating is higher than this year group's rating value, skip it.\n */\n if (rating && yearGroup.rating.value < rating.value)\n continue;\n\n /**\n * If our year group is the new lowest so far, save it\n */\n if (!minAllowedYearGroup || yearGroup.value < minAllowedYearGroup.value)\n minAllowedYearGroup = yearGroup;\n }\n\n /**\n * If no year groups are allowed, then it's staff only.\n */\n if (!minAllowedYearGroup)\n return getPhrase('onlyStaff');\n\n /**\n * We differentiate the copy if it's the highest year group or not. \n * Basically if we need to say \"X and above\" or not.\n */\n if (minAllowedYearGroup.value === maxYearGroup.value)\n return getPhrase('maxYearGroup', { yearGroup: maxYearGroup.name });\n\n return getPhrase('yearGroupRange', { yearGroup: minAllowedYearGroup.name });\n}","// extracted by mini-css-extract-plugin\nexport default {\"hoverBackground\":\"R3fNE\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { getRespectRatingText } from 'libs/shared/apps/share/components/share-link-info/getRespectRatingText';\nimport { SharePrivacy } from 'libs/shared/apps/share/interfaces/SharePrivacy';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ShareLinkStatus } from 'libs/shared/enums/ShareLinkStatus';\nimport { BaseObject, YearGroup } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { SharePrivacyResponse } from '../../interfaces/responses/SharePrivacyResponse';\n\nimport styles from './share-link-info.scss';\n\nconst namespace = 'share.shareLinkInfo';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ShareLinkInfoProps {\n linkExpireDate: string;\n isPasswordProtected: boolean;\n privacy: SharePrivacyResponse;\n status: ShareLinkStatus;\n entityTypeId: MasterType;\n hasStudentExp: boolean;\n onClickSavePrivacy?: (privacy: SharePrivacy, onClickSavePrivacy: boolean) => void;\n entity: BaseObject;\n yearGroups: YearGroup[];\n shareOverrideRestrictions: boolean;\n}\n\ninterface GetIconAndTextOptions extends ShareLinkInfoProps {}\n\nconst getPrivateIconAndText = (options: GetIconAndTextOptions) => {\n const { entityTypeId, privacy, hasStudentExp, entity, yearGroups } = options;\n\n if (entityTypeId === MasterType.Topic || entityTypeId === MasterType.Series)\n return { icon: cvSvgLibrary.VisibleOn, text: getPhrase(hasStudentExp ? 'justMySchoolTeachers' : 'justMySchoolDescription') };\n\n /**\n * This is mainly for typescript, privacy will be an array for playlists\n * but that is handled above\n */\n if (Array.isArray(privacy))\n return;\n\n switch (privacy.privacy) {\n case 'public':\n return { icon: cvSvgLibrary.VisibleOn, text: getPhrase('publicDescription') };\n case 'protected':\n if (privacy.overrideRestrictions)\n return { icon: cvSvgLibrary.VisibleOn, text: getPhrase('clickViewOnly') };\n return { icon: cvSvgLibrary.Lock, text: getRespectRatingText(entity, yearGroups, hasStudentExp) };\n case 'just_my_customer':\n if (privacy.overrideRestrictions)\n return { icon: cvSvgLibrary.Lock, text: getPhrase(hasStudentExp ? 'justMySchoolTeachers' : 'justMySchoolDescription') };\n return { icon: cvSvgLibrary.Lock, text: getRespectRatingText(entity, yearGroups, hasStudentExp) };\n /**\n * Because we plan to add restricted management later \n * for the time being we treat is the same as private \n */\n case 'restricted':\n case 'private':\n return { icon: cvSvgLibrary.Lock, text: getPhrase('privateDescription') };\n default:\n return {};\n }\n};\n\nconst getIconAndText = (options: GetIconAndTextOptions) => {\n const { linkExpireDate, isPasswordProtected, status } = options;\n if (!linkExpireDate && !isPasswordProtected)\n return getPrivateIconAndText(options);\n\n if (!linkExpireDate)\n return { icon: cvSvgLibrary.Lock, text: getPhrase('password') };\n\n const isToday = DateHelper.isToday(linkExpireDate);\n const dayDifference = DateHelper.diffBetween(linkExpireDate, new Date(), 'day');\n\n if (!isPasswordProtected) {\n let text = isToday\n ? getPhrase('expiryToday')\n : getPhrase('expiry', { days: dayDifference });\n\n if (status === ShareLinkStatus.Expired)\n text = getPhrase('expired');\n\n return { icon: cvSvgLibrary.Timer, text };\n }\n\n let text = isToday\n ? getPhrase('passwordExpiryToday')\n : getPhrase('passwordExpiry', { days: dayDifference });\n\n if (status === ShareLinkStatus.Expired)\n text = getPhrase('passwordExpired');\n\n return { icon: cvSvgLibrary.Lock, text };\n};\n\ninterface ShareLinkItemProps {\n active: boolean;\n title: string;\n description: string;\n onClick: () => void\n}\n\nfunction ShareLinkItem(props: ShareLinkItemProps) {\n const { active, title, description, onClick } = props;\n\n return (\n <li className={`${active ? 'bg-light-blue' : ''} dropdown-item`} onClick={!active ? onClick : null}>\n <p className='fw-semibold mb-1'>{title}</p>\n <p className='font-size-sm mb-0'>{description}</p>\n </li>\n );\n}\n\nexport function ShareLinkInfo(props: ShareLinkInfoProps): JSX.Element {\n const [ canManageAccess, setCanManageAccess ] = React.useState(false);\n const [ privacy, setPrivacy ] = React.useState<SharePrivacy>(null);\n\n const { icon, text } = getIconAndText(props);\n\n React.useEffect(() => {\n setCanManageAccess(props.privacy.canManageAccess);\n setPrivacy(props.privacy.privacy);\n }, [props.privacy]);\n\n const canManageAccessPrivacy = canManageAccess ? 'just_my_customer' : 'protected';\n\n const canUpdatePrivacy = (\n !props.isPasswordProtected &&\n !props.linkExpireDate &&\n (props.shareOverrideRestrictions && !props.hasStudentExp)\n );\n\n return (\n <div className='d-flex align-items-center'>\n {(canUpdatePrivacy)\n ? (\n <div className='btn-group'>\n <button className={`btn border-0 info-link dropdown-toggle p-1 ${styles.hoverBackground}`} data-bs-toggle='dropdown'>\n <SvgContainer svgName={icon} className='svg-container me-1' />\n <span className='me-1'>{text}</span>\n </button>\n <ul\n className='dropdown-menu cursor-pointer'\n >\n {canManageAccess &&\n <ShareLinkItem\n active={privacy === 'public'}\n title={getPhrase('public')}\n description={getPhrase('publicDescription')}\n onClick={() => props.onClickSavePrivacy('public', false)}\n />\n }\n <ShareLinkItem\n active={privacy === canManageAccessPrivacy && props.privacy.overrideRestrictions}\n title={getPhrase('justMySchool')}\n description={canManageAccess ? getPhrase('justMySchoolDescription') : getPhrase('clickViewOnly')}\n onClick={() => props.onClickSavePrivacy(canManageAccessPrivacy, true)}\n />\n <ShareLinkItem\n active={privacy === canManageAccessPrivacy && !props.privacy.overrideRestrictions}\n title={getPhrase('respectRatings')}\n description={getRespectRatingText(props.entity, props.yearGroups, props.hasStudentExp)}\n onClick={() => props.onClickSavePrivacy(canManageAccessPrivacy, false)}\n />\n <ShareLinkItem\n active={privacy === 'private'}\n title={getPhrase('private')}\n description={getPhrase('privateDescription')}\n onClick={() => props.onClickSavePrivacy('private', false)}\n />\n </ul>\n </div>\n )\n : (\n <>\n <SvgContainer svgName={icon} className='svg-container me-1' />\n <span>{text}</span>\n </>\n )\n }\n </div>\n );\n}","import React from 'react';\n\nexport function GoogleClassroomAvatar(): JSX.Element {\n return (\n <svg width='24' height='24' viewBox='0 0 24 24' fill='none'>\n <circle cx='12' cy='12' r='12' fill='url(#pattern0)'/>\n <defs>\n <pattern id='pattern0' patternContentUnits='objectBoundingBox' width='1' height='1'>\n <use xlinkHref='#image0_3558_14996' transform='scale(0.00520833)'/>\n </pattern>\n <image id='image0_3558_14996' width='192' height='192' xlinkHref='data:image/png;base64,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'/>\n </defs>\n </svg>\n );\n}","import React from 'react';\n\nexport function MicrosoftTeamsAvatar(): JSX.Element {\n return (\n <svg viewBox='0 0 40 40' fill='none'>\n <path d='M29.692 15.31c.58 0 1.146-.173 1.628-.5a2.96 2.96 0 001.078-1.331 3.004 3.004 0 00-.634-3.235 2.918 2.918 0 00-1.5-.812 2.894 2.894 0 00-1.693.169 2.938 2.938 0 00-1.314 1.093 2.997 2.997 0 00.364 3.748 2.91 2.91 0 002.071.869zM20.043 26.267V13.849a.9.9 0 00-.259-.633.877.877 0 00-.624-.262H6.883a.877.877 0 00-.624.262.9.9 0 00-.259.633v12.418c0 .24.092.469.257.64.165.172.39.27.626.276H19.16a.899.899 0 00.626-.276.923.923 0 00.257-.64zm-3.51-10.389v1.92h-2.37v6.68H11.88V17.93H9.51v-2.182h7.022v.13z' fill='#fff'/>\n <path d='M21.874 14.132v.917a4.03 4.03 0 002.05-1.47c.512-.699.79-1.545.793-2.415 0-1.1-.431-2.154-1.199-2.932a4.065 4.065 0 00-2.893-1.214 4.065 4.065 0 00-2.894 1.214 4.175 4.175 0 00-1.199 2.932h2.391a2.996 2.996 0 012.061.887c.55.552.868 1.297.89 2.081zM26.332 17.1h-4.458v8.883c0 .8-.309 1.566-.86 2.138-.552.57-1.302.9-2.091.917h-4.588a7.047 7.047 0 003.265 3.317c1.427.7 3.046.887 4.593.532a6.99 6.99 0 003.918-2.486 7.152 7.152 0 001.535-4.418v-7.551a1.348 1.348 0 00-.385-.942 1.313 1.313 0 00-.929-.39zM32.772 17.1h-3.597c.206.414.316.87.323 1.332v7.551a9.1 9.1 0 01-.516 2.859c.236.021.474.021.71 0a4.28 4.28 0 003.046-1.278A4.394 4.394 0 0034 24.477v-6.045c0-.339-.126-.665-.354-.912a1.307 1.307 0 00-.874-.42z' fill='#fff'/>\n </svg>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\n\nimport { GoogleClassroomAvatar } from './avatars/GoogleClassroomAvatar';\nimport { MicrosoftTeamsAvatar } from './avatars/MicrosoftTeamsAvatar';\n\nimport styles from './share-integrations.scss';\n\nconst namespace = 'share.shareIntegrations';\n\nexport function ShareIntegrationsStack(): JSX.Element {\n const className = `${styles.avatar} border border-light rounded-circle overflow-hidden`;\n\n return (\n <Tooltip title={LanguageService.getPhrase(namespace, 'shareThroughIntegrations')} spanHack>\n <ul className='list-unstyled d-flex mb-0'>\n <li className={className} style={{ zIndex: 1 }}>\n <GoogleClassroomAvatar />\n </li>\n\n <li className={`${className} ${styles.msTeamsContainer}`} style={{ zIndex: 0 }}>\n <MicrosoftTeamsAvatar />\n </li>\n </ul>\n </Tooltip>\n );\n}","import React from 'react';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EventVersion, ShareDescriptors, UserAction } from 'libs/analytics/interfaces';\n\nimport { ShareLinkInfo } from 'libs/shared/apps/share/components/share-link-info/ShareLinkInfo';\nimport { SharePrivacyResponse } from 'libs/shared/apps/share/interfaces/responses/SharePrivacyResponse';\nimport { SharePrivacy } from 'libs/shared/apps/share/interfaces/SharePrivacy';\nimport { ShareIntegrationsStack } from 'libs/shared/apps/share/views/share/components/share-integrations/ShareIntegrationsStack';\nimport { SharableEntityType, ShareViewHelper } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { CopyInput } from 'libs/shared/components/copy-input/CopyInput';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { BaseObject, ShareLink, YearGroup } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'share.shareAsLink';\n\ninterface ShareAsLinkProps {\n entity: BaseObject;\n entityType: SharableEntityType;\n shareLink: ShareLink;\n onClickShowSettings: () => void;\n onClickCreateLink: () => void;\n shareLinkIsLoading?: boolean;\n canAddPolicies: boolean;\n privacy: SharePrivacyResponse;\n entityTypeId: MasterType;\n onClickSavePrivacy: (privacy: SharePrivacy, overrideRestrictions: boolean) => void;\n enableIntegrations: boolean;\n hasStudentExp: boolean;\n yearGroups: YearGroup[];\n shareOverrideRestrictions: boolean;\n}\n\nexport function ShareAsLink(props: ShareAsLinkProps): React.ReactElement {\n const [ logged, setLogged ] = React.useState(false);\n\n function onCopy(): void {\n // Because our users are double clickers\n if (logged)\n return;\n\n setLogged(true);\n\n AnalyticsHelper.logUserAction({\n ...props.entity\n }, AnalyticsHelper.mergeOptions(ShareViewHelper.getAnalyticsOptions(props.entityType), {\n actionType: UserAction.Share,\n descriptor: ShareDescriptors.CopyLink,\n eventVersion: EventVersion.V3\n }));\n }\n\n return (\n <>\n <div className='d-flex justify-content-between align-items-center'>\n <div className={`${props.shareLink ? 'w-100' : 'w-75 d-flex align-items-center'}`}>\n {props.shareLink\n ? (\n <>\n <div className='d-flex justify-content-between align-items-center mb-1'>\n <ShareLinkInfo\n linkExpireDate={props.shareLink.linkExpireDate}\n isPasswordProtected={props.shareLink.isPasswordProtected}\n privacy={props.privacy}\n entityTypeId={props.shareLink.objectTypeId}\n status={props.shareLink.status}\n onClickSavePrivacy={props.onClickSavePrivacy}\n hasStudentExp={props.hasStudentExp}\n entity={props.entity}\n yearGroups={props.yearGroups}\n shareOverrideRestrictions={props.shareOverrideRestrictions}\n />\n </div>\n <CopyInput value={props.shareLink.url} onCopy={onCopy} />\n </>\n ) : (\n <div className='d-flex align-items-center'>\n <div className='me-2'>\n {props.enableIntegrations ? (\n <ShareIntegrationsStack />\n ) : (\n <SvgContainer svgName={cvSvgLibrary.Link} className='svg-container' />\n )}\n </div>\n \n <span className='fw-semibold'><Text namespace={namespace} phrase='createLink' /></span>\n </div>\n )\n }\n </div>\n {!props.shareLink &&\n <DivButton className='info-link' onClick={props.onClickCreateLink}>\n <Text phrase='createLink' />\n </DivButton>\n }\n </div>\n </>\n );\n}","import React from 'react';\nimport { Form as FormikForm } from 'formik';\nimport * as Yup from 'yup';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { FormField } from 'libs/shared/components/forms/form-field/FormField';\nimport { FormWrapper, useFormikContextWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\n\nconst getPhrase = LanguageService.encloseNamespace('share.shareMessage');\n\nconst MessageValidationSchema = Yup.object().shape({\n message: Yup.string()\n .max(280, () => getPhrase('maxMessageLen'))\n});\n\ninterface ShareMessageRequest {\n message?: string;\n}\n\nfunction ShareMessageForm(): React.ReactElement {\n const formikProps = useFormikContextWrapper<ShareMessageRequest>();\n\n return (\n <FormikForm>\n <FormField\n component='textarea'\n name='message'\n id='message'\n placeholder={getPhrase('placeholder')}\n value={formikProps.values.message}\n label={getPhrase('label')}\n showOptionalLabel\n />\n <PopupButtons>\n <PopupButtons.Submit variant='dark' text={getPhrase('share')} />\n </PopupButtons>\n </FormikForm>\n );\n}\n\ninterface ShareMessageProps {\n onClickShare: (message: string, onDone: () => void) => void\n}\n\nexport function ShareMessage(props: ShareMessageProps): React.ReactElement {\n function onSubmit(data: ShareMessageRequest, onDone: () => void): void {\n let message: string = null;\n\n if (data.message)\n message = data.message;\n\n props.onClickShare(message, onDone);\n }\n\n return (\n <FormWrapper<ShareMessageRequest>\n initialValues={{ message: '' }}\n validationSchema={MessageValidationSchema}\n onSubmit={onSubmit}\n allowInitialSubmit={true}\n >\n <ShareMessageForm />\n </FormWrapper>\n );\n}","import React from 'react';\nimport { Spinner } from 'react-bootstrap';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { TypeFilter } from 'libs/shared/apps/search/interfaces/TypedFilter';\nimport { GetEmbedCode } from 'libs/shared/apps/share/components/get-embed-code/GetEmbedCode';\nimport { RecipientItem } from 'libs/shared/apps/share/components/recipient-item/RecipientItem';\nimport { TOKENIZED_TYPEAHEAD_SUGGESTIONS_LIMIT, TokenizedTypeahead } from 'libs/shared/apps/share/components/tokenized-typeahead/TokenizedTypeahead';\nimport { SharePrivacyResponse } from 'libs/shared/apps/share/interfaces/responses/SharePrivacyResponse';\nimport { SharePrivacy } from 'libs/shared/apps/share/interfaces/SharePrivacy';\nimport { ShareAsLink } from 'libs/shared/apps/share/views/share/components/share-as-link/ShareAsLink';\nimport { ShareIntegrations } from 'libs/shared/apps/share/views/share/components/share-integrations/ShareIntegrations';\nimport { ShareMessage } from 'libs/shared/apps/share/views/share/components/share-message/ShareMessage';\nimport { SharableEntityType } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { IntegrationId } from 'libs/shared/enums/IntegrationId';\nimport { ObjectStatus } from 'libs/shared/enums/ObjectStatus';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { BaseObject, Classroom, ClassroomGroup, CurrentUser, PropsWithAnalyticsOptions, ShareLink, ShareRecipient, ShareSearchResponse, UserCollection, YearGroup } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.share';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction filterSearchResults(\n recipientsToFilter: BaseObject[],\n currentSelections: BaseObject[],\n existingShareRecipients: BaseObject[],\n currentUserId: string\n): BaseObject[] {\n if (!recipientsToFilter)\n return [];\n\n const selectedIds = [ ...currentSelections, ...existingShareRecipients ].map(s => s.id);\n\n return recipientsToFilter.filter(s => {\n // Prevent users from sharing to other users who have already been shared this resource\n if (selectedIds.includes(s.id))\n return false;\n\n // Prevent users from sharing to themselves\n if (s.id === currentUserId)\n return false;\n\n return true;\n });\n}\n\ntype MainShareProps = PropsWithAnalyticsOptions<{\n entity: BaseObject;\n entityType: SharableEntityType,\n directShareRecipients: BaseObject[];\n recentlySharedTo: BaseObject[];\n onClickCreateLink: () => void;\n onClickShowSettings: () => void;\n onClickShare: (recipients: ShareRecipient[], message: string, onDone?: () => void) => void;\n onClickRemoveRecipient: (recipientId: string, onError?: () => void) => void;\n onClickSavePrivacy: (privacy: SharePrivacy, overrideRestrictions: boolean) => void;\n onClickGetEmbedCode: () => void;\n gatewayApiUrl: string;\n imageCdnUrl: string;\n currentUser: CurrentUser;\n searchRequestHeaders?: HashObject;\n emptyStateImageUrl: string;\n errorStateImageUrl: string;\n integrations: IntegrationId[];\n shareLink?: ShareLink;\n shareLinkIsLoading?: boolean;\n fetchRecipientUsers?: (id: string, callback: (users: UserCollection) => void) => void;\n canAddPolicies: boolean;\n privacy: SharePrivacyResponse;\n integrationSettingAppLink?: Core.AppLink;\n messagePopupAppLink?: Core.AppLink;\n closePopup: () => void;\n enableIntegrationBanner?: boolean;\n canEmbed?: boolean;\n yearGroups: YearGroup[];\n shareOverrideRestrictions: boolean;\n}>;\n\nexport function MainShare(props: MainShareProps): JSX.Element {\n const [ selections, setSelections ] = React.useState<BaseObject[]>([]);\n const [ showShareLinkSpinner, setShowShareLinkSpinner ] = React.useState(false);\n\n const { hasPermissions } = usePermissions();\n const hasManageIntegrationsPermission = hasPermissions(PermissionName.ManageIntegrations);\n\n function onClickShare(message: string, onDone: () => void): void {\n props.onClickShare(\n selections.map(s => ({ id: s.id, typeId: s.typeId })),\n message,\n () => {\n setSelections([]);\n onDone();\n }\n );\n }\n\n function fetchSelectionMembers(id: string): void {\n if (!props.fetchRecipientUsers)\n return;\n\n const callback = (users: UserCollection) => {\n const newSelections: BaseObject[] = [];\n\n selections.forEach(selection => {\n if (selection.id !== id)\n return newSelections.push(selection);\n\n const updatedSelection = ObjectHelper.deepClone<Classroom | ClassroomGroup>(selection);\n\n if (!users?.data?.length) {\n updatedSelection.users = { count: 0, data: [], pagination: null };\n } else {\n updatedSelection.users = users;\n }\n\n newSelections.push(updatedSelection);\n });\n\n setSelections(ArrayHelper.uniq(newSelections, 'id'));\n };\n\n props.fetchRecipientUsers(id, callback);\n }\n\n function getRemotePostBody(query: string): HashObject {\n const indices: TypeFilter[] = [];\n\n if (hasPermissions(PermissionName.ShareToUsers)) {\n indices.push({\n index: 'user',\n filters: {\n userProfile: {\n status: [`${ObjectStatus.Active.toLowerCase()}`],\n customerId: props.currentUser.customerId\n }\n }\n });\n }\n\n if (hasPermissions(PermissionName.ShareToClassrooms))\n indices.push({ index: 'classroom' });\n\n if (hasPermissions(PermissionName.ShareToClassroomGroups))\n indices.push({ index: 'classroom_group' });\n\n return {\n query,\n indices,\n searchType: 'user',\n limit: TOKENIZED_TYPEAHEAD_SUGGESTIONS_LIMIT\n };\n }\n\n const canDirectShare = hasPermissions(PermissionName.ShareToUsers) ||\n hasPermissions(PermissionName.ShareToClassrooms) ||\n hasPermissions(PermissionName.ShareToClassroomGroups);\n\n const recentSearches = filterSearchResults(\n props.recentlySharedTo,\n selections,\n props.directShareRecipients,\n props.currentUser.id\n );\n \n function onClickCreateShareLink(): void {\n setShowShareLinkSpinner(true);\n props.onClickCreateLink();\n }\n\n React.useEffect(() => {\n setShowShareLinkSpinner(!!props.shareLinkIsLoading);\n }, [props.shareLinkIsLoading]);\n\n return (\n <>\n {canDirectShare && (\n <div className='bg-white rounded-bottom-3 pt-3 px-3 mb-2'>\n <div className={`d-flex justify-content-between align-items-center pb-3`}>\n <TokenizedTypeahead\n // This key is used to re-initialize TokenizedTypeahead whenever recentSearches changes\n key={recentSearches?.map(s => s.id).join(':') ?? 'share:search'}\n getRemoteUrl={() => UrlHelper.safeUrlConcat(props.gatewayApiUrl, 'v4/search')}\n getRemotePostBody={getRemotePostBody}\n requestHeaders={props.searchRequestHeaders}\n formatRemoteSuggestions={(suggestions: ShareSearchResponse) =>\n filterSearchResults(\n suggestions?.results,\n selections,\n props.directShareRecipients,\n props.currentUser.id\n )\n }\n recentSearches={recentSearches}\n selections={selections}\n onSuggestionSelected={selection => setSelections([ ...selections, selection ])}\n removeSelection={selection => setSelections(selections.filter(s => s.id !== selection.id))}\n placeholder={getPhrase('searchPlaceholder')}\n imageCdnUrl={props.imageCdnUrl}\n activationLength={2}\n fetchSelectionMembers={props.fetchRecipientUsers && fetchSelectionMembers}\n debounceTime={300}\n emptyStateImageUrl={props.emptyStateImageUrl}\n errorStateImageUrl={props.errorStateImageUrl}\n hasStudentExperience={hasPermissions(PermissionName.StudentExperience)}\n />\n </div>\n \n {(!selections.length && props.directShareRecipients.length)\n ? (\n <div>\n <h3 className='font-size-normal'><Text phrase='sharedTo' /></h3>\n <Scrollbars autoHeight>\n <ul className='list-unstyled'>\n {props.directShareRecipients.map(d => (\n <li key={d.id} className='mb-2 pe-1'>\n <RecipientItem\n entity={d}\n imageCdnUrl={props.imageCdnUrl}\n removeRecipient={props.onClickRemoveRecipient}\n showDisplayName={hasPermissions(PermissionName.StudentExperience)}\n />\n </li>\n ))}\n </ul>\n </Scrollbars>\n </div>\n ) : <></>\n }\n {!!selections.length && (\n // The form submit inside of ShareMessage is used as the Share button\n <div className='pb-3'>\n <ShareMessage\n onClickShare={onClickShare}\n />\n </div>\n )}\n </div>\n )}\n\n {!selections.length && !showShareLinkSpinner && (\n <div className={`bg-white p-3 ${canDirectShare ? 'rounded-3' : 'rounded-bottom-3'}`}>\n <div>\n {props.shareLink && (\n <div className='fw-semibold mb-2'><Text namespace={namespace} phrase='shareLink' /></div>\n )}\n <ShareAsLink\n entity={props.entity}\n entityType={props.entityType}\n shareLink={props.shareLink}\n onClickShowSettings={props.onClickShowSettings}\n onClickCreateLink={onClickCreateShareLink}\n shareLinkIsLoading={props.shareLinkIsLoading}\n canAddPolicies={props.canAddPolicies}\n privacy={props.privacy}\n entityTypeId={props.entity.typeId}\n onClickSavePrivacy={props.onClickSavePrivacy}\n enableIntegrations={props.enableIntegrationBanner}\n hasStudentExp={hasPermissions(PermissionName.StudentExperience)}\n yearGroups={props.yearGroups}\n shareOverrideRestrictions={props.shareOverrideRestrictions}\n />\n {props.shareLink && props.enableIntegrationBanner && (\n <div className={`${props.integrations?.length && props.canEmbed ? 'float-end' : ''} mt-1 pt-1`}>\n <ShareIntegrations\n integrations={props.integrations}\n url={props.shareLink.url}\n closePopup={props.closePopup}\n appLink={hasManageIntegrationsPermission\n ? props.integrationSettingAppLink\n : props.messagePopupAppLink\n }\n />\n </div>\n )}\n {props.shareLink && props.canEmbed && (\n <div className='mt-1'>\n <GetEmbedCode onClickGetEmbedCode={props.onClickGetEmbedCode} />\n </div>\n )}\n {props.shareLink && props.canAddPolicies &&\n <button className='btn btn-link text-info mt-2 p-0' onClick={props.onClickShowSettings}>\n <Text namespace={namespace} phrase='advancedSettings' />\n </button>\n }\n </div>\n </div>\n )}\n \n {showShareLinkSpinner && (\n <div className='bg-white rounded-3 p-3 text-center'>\n <Spinner as='div' animation='border' role='status' />\n </div>\n )}\n </>\n );\n}\n","import React from 'react';\nimport { Form } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { LinkExpiry } from 'libs/shared/apps/share/components/link-expiry/LinkExpiry';\nimport { LinkPassword } from 'libs/shared/apps/share/components/link-password/LinkPassword';\nimport { EditShareLinkRequest } from 'libs/shared/apps/share/interfaces/requests/EditShareLinkRequest';\nimport { SharePrivacyResponse } from 'libs/shared/apps/share/interfaces/responses/SharePrivacyResponse';\nimport { ShareLinkSettingsValidationSchema } from 'libs/shared/apps/share/validation/ShareLinkSettingsValidationSchema';\nimport { SharableEntityType } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { BaseObject, Config } from 'libs/shared/interfaces';\nimport { PropsWithAnalyticsOptions, ShareLink } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.share';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ntype ShareSettingsFormProps = PropsWithAnalyticsOptions<{\n entity: BaseObject;\n entityType: SharableEntityType;\n config: Config;\n shareLink: ShareLink;\n entityId: string;\n onClickCancel: () => void;\n onClickDeleteLink: () => void;\n canEmbed?: boolean;\n privacy: SharePrivacyResponse;\n hasStudentExp: boolean;\n shareOverrideRestrictions: boolean;\n}>;\n\nfunction ShareSettingsForm(props: ShareSettingsFormProps): JSX.Element {\n const { hasPermissions } = usePermissions();\n\n const [ passwordProtectLink, setPasswordProtectLink ] = React.useState(!!props.shareLink.isPasswordProtected);\n\n return (\n <Form>\n <div className='d-flex justify-content-between align-items-center pb-3'>\n <div>\n <label className='mb-0'><Text namespace={namespace} phrase='deleteLinkLabel' /></label>\n <p className='mb-0'><Text namespace={namespace} phrase='deleteLinkDescription' /></p>\n </div>\n <DivButton onClick={props.onClickDeleteLink} className='info-link justify-self-start'>\n <Text phrase='deleteLink' />\n </DivButton>\n </div>\n\n {hasPermissions(PermissionName.ManageShareLinkSettings) && (\n <>\n <LinkExpiry passwordProtectLink={passwordProtectLink} />\n {props.shareOverrideRestrictions &&\n <LinkPassword\n shareLink={props.shareLink}\n passwordProtectLink={passwordProtectLink}\n setPasswordProtectLink={setPasswordProtectLink}\n />\n }\n </>\n )}\n\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.onClickCancel} text={getPhrase('back')} variant='outline-dark' />\n <PopupButtons.Submit variant='dark' />\n </PopupButtons>\n </Form>\n );\n}\n\ninterface ShareSettingsProps {\n entity: BaseObject;\n entityType: SharableEntityType;\n config: Config;\n shareLink: ShareLink;\n entityId: string;\n privacy: SharePrivacyResponse;\n onClickSaveLink: (data: EditShareLinkRequest, onError: () => void) => void;\n onClickCancel: () => void;\n onClickDeleteLink: () => void;\n hasStudentExp: boolean;\n shareOverrideRestrictions: boolean;\n}\n\nexport function ShareSettings(props: PropsWithAnalyticsOptions<ShareSettingsProps>): JSX.Element {\n const initialValues: EditShareLinkRequest = {\n password: '',\n removePassword: false,\n linkExpireDate: props.shareLink.linkExpireDate,\n overrideRestrictions: props.shareLink.overrideRestrictions\n };\n\n return (\n <>\n <FormWrapper<EditShareLinkRequest>\n initialValues={initialValues}\n onSubmit={props.onClickSaveLink}\n castInitialValues={false}\n validationSchema={ShareLinkSettingsValidationSchema}\n >\n <ShareSettingsForm\n entity={props.entity}\n entityType={props.entityType}\n config={props.config}\n shareLink={props.shareLink}\n entityId={props.entityId}\n onClickCancel={props.onClickCancel}\n analyticsOptions={props.analyticsOptions}\n privacy={props.privacy}\n onClickDeleteLink={props.onClickDeleteLink}\n hasStudentExp={props.hasStudentExp}\n shareOverrideRestrictions={props.shareOverrideRestrictions}\n />\n </FormWrapper>\n </>\n );\n}\n","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { AppLink } from 'libs/common/backbone/core';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { EditShareLinkRequest } from 'libs/shared/apps/share/interfaces/requests/EditShareLinkRequest';\nimport { SharePrivacyResponse } from 'libs/shared/apps/share/interfaces/responses/SharePrivacyResponse';\nimport { SharePrivacy } from 'libs/shared/apps/share/interfaces/SharePrivacy';\nimport { RecentShareHelper } from 'libs/shared/apps/share/utils/RecentShareHelper';\nimport { CopyEmbed } from 'libs/shared/apps/share/views/share/components/copy-embed/CopyEmbed';\nimport { MainShare } from 'libs/shared/apps/share/views/share/components/main-share/MainShare';\nimport { ShareSettings } from 'libs/shared/apps/share/views/share/components/share-settings/ShareSettings';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { LanguageNamespaceContext } from 'libs/shared/components/text/Text';\nimport { IntegrationId } from 'libs/shared/enums/IntegrationId';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport {\n BaseObject, Config, CurrentUser,\n DirectShare, PopupViewProps, ShareLink, ShareRecipient, UserCollection, YearGroup\n} from 'libs/shared/interfaces';\nimport { IntegrationHelper } from 'libs/shared/utils/IntegrationHelper';\n\nimport { SharableEntityType, ShareViewHelper } from './ShareViewHelper';\n\nconst namespace = 'shared.share';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getTitle(type: SharableEntityType): string {\n switch (type) {\n case 'video': return getPhrase('titleVideo');\n case 'clip': return getPhrase('titleClip');\n case 'interactive': return getPhrase('titleInteractive');\n case 'series': return getPhrase('titleSeries');\n case 'playlist': return getPhrase('titlePlaylist');\n case 'subject': return getPhrase('titleTopic');\n }\n}\n\nfunction getEnabledIntegrations(googleClassroomSetting: boolean, msftTeamsSetting: boolean): IntegrationId[] {\n const integrations = IntegrationHelper.getShareIntegrations(googleClassroomSetting, msftTeamsSetting);\n return integrations.filter(i => i.enabled).map(i => i.id);\n}\n\n/**\n * I realise these are all the same right now, but they're technically different things - Sha\n */\nconst canEmbed = (type: SharableEntityType) => type === 'video' || type === 'interactive' || type === 'clip';\nconst canAddPolicies = (type: SharableEntityType) => type === 'video' || type === 'interactive' || type === 'clip';\n\ntype ShareScreen = 'main' | 'link-settings' | 'copy-embed';\n\ninterface ShareViewProps extends PopupViewProps {\n entityId: string;\n entityType: SharableEntityType;\n emptyStateImageUrl: string;\n errorStateImageUrl: string;\n gatewayApiUrl?: string;\n integrationSettingAppLink?: AppLink;\n messagePopupAppLink?: AppLink;\n enableIntegrationBanner?: boolean\n}\n\nexport function ShareView(props: ShareViewProps): JSX.Element {\n const dispatch = useDispatch();\n\n const alerts = useAlerts();\n\n // If the gateway api url is passed down in props and not pulled from the config, we don't need to fetch the user token\n const shouldFetchUserToken = !props.gatewayApiUrl;\n\n /**\n * Our screen is initially set to null, and it is set to it's initial state\n * by ShareViewHelper.useRestrictionWarning.\n */\n const [ screen, setScreen ] = React.useState<ShareScreen>('main');\n\n const { hasPermissions } = usePermissions();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const entity = ShareViewHelper.getFetchFunctionByType(props.entityType)(props.entityId, currentUser.data?.id);\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const userToken = Flight.useBasicFetch<HashObject>(shouldFetchUserToken && UserRequests.token());\n const shareLink = Flight.useBasicFetch<ShareLink>(ShareRequests.getShareLinkByObjectId(props.entityId));\n const sentDirectShare = Flight.useBasicFetch<DirectShare>(\n ShareRequests.getSentDirectShareByObjectId(props.entityId)\n );\n const recipients = Flight.useBasicFetch<BaseObject[]>(currentUser.data?.customerId &&\n ShareViewHelper.getDirectShareRecipientsRequest(currentUser.data.customerId, sentDirectShare.data));\n\n const recentlySharedToIds = currentUser.data && RecentShareHelper.getRecentlySharedTo(currentUser.data.id);\n\n const hasRecentlySharedRecipients = !!recentlySharedToIds?.length;\n const recentlySharedTo = Flight.useBasicFetch<BaseObject[]>(hasRecentlySharedRecipients &&\n ShareRequests.getRecipientsById(recentlySharedToIds, currentUser.data.customerId));\n\n const privacy = Flight.useBasicFetch<SharePrivacyResponse>(ShareRequests.getPrivacy(props.entityId));\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const {\n shareToGoogleClassroom,\n shareToMicrosoftTeams,\n shareOverrideRestrictions,\n isLoadingSettings\n } = useSettings(null);\n\n /**\n * We need to manually re-fetch the recipients they're updated on the directShare object.\n * See ShareRequests.getDirectShareRecipientsById for an explanation\n * of why we are doing this.\n */\n function fetchRecipients(customerId: string, directShare: DirectShare): void {\n if (directShare.recipients?.length)\n Flight.getFetch(dispatch)(ShareViewHelper.getDirectShareRecipientsRequest(customerId, directShare));\n }\n\n function fetchRecipientUsers(id: string, callback: (users: UserCollection) => void): void {\n Flight.getFetch(dispatch)(ShareRequests.getRecipientUsers(id, callback));\n }\n\n function onClickCreateLink(): void {\n if (shareLink.data)\n return;\n\n ShareViewHelper.createLink({\n dispatch,\n entity: entity.data,\n entityType: props.entityType,\n alerts\n });\n }\n\n function onClickSaveLink(data: EditShareLinkRequest, onError: () => void): void {\n ShareViewHelper.updateLink(\n dispatch,\n entity.data,\n props.entityType,\n shareLink.data,\n data,\n alerts,\n () => setScreen('main'),\n onError\n );\n }\n\n function onClickDeleteLink(): void {\n ShareViewHelper.deleteLink(\n dispatch,\n entity.data,\n props.entityType,\n shareLink.data,\n alerts,\n () => setScreen('main')\n );\n }\n\n function onClickShare(recipients: ShareRecipient[], message: string, onDone?: () => void): void {\n ShareViewHelper.createOrUpdateDirectShare({\n dispatch,\n entity: entity.data,\n entityType: props.entityType,\n currentUser: currentUser.data,\n recipients,\n message,\n sentDirectShare: sentDirectShare.data,\n onSuccess: directShare => fetchRecipients(currentUser.data.customerId, directShare),\n onError: () => alerts.error(getPhrase('directShareError', { name: entity.data.name })),\n onDone\n });\n }\n\n function onClickRemoveRecipient(recipientId: string, onError?: () => void): void {\n ShareViewHelper.removeDirectShareRecipient(\n dispatch,\n recipientId,\n props.entityType,\n sentDirectShare.data,\n directShare => fetchRecipients(currentUser.data.customerId, directShare),\n () => {\n alerts.error(getPhrase('removeDirectShareError'));\n onError && onError();\n }\n );\n }\n\n function onClickSavePrivacy(privacy: SharePrivacy, overrideRestrictions: boolean): void {\n if (privacy === 'private') {\n onClickDeleteLink();\n return;\n }\n\n Flight.fetch(\n dispatch,\n ShareRequests.updatePrivacy(\n shareLink.data.id,\n privacy,\n overrideRestrictions,\n () => alerts.success(getPhrase('privaciesSuccess', { name: entity.data.name })),\n () => alerts.error(getPhrase('privaciesError', { name: entity.data.name }))\n )\n );\n }\n\n function getSearchRequestHeaders(): HashObject {\n if (!shouldFetchUserToken)\n return null;\n\n return {\n authorization: `Bearer ${userToken.data.value}`\n };\n }\n\n /**\n * We are intentionally not checking to see if recipients.data or recentlySharedTo.data\n * have loaded because:\n * 1. Adding the first recipient will trigger fetching recipients for the first time\n * which would trigger the loading spinner.\n * 2. Adding and recipient will update the list of recently shared to which causes\n * recentlySharedTo to be re-fetched.\n */\n const dataLoaded = !!currentUser.data\n && !!config.data\n && (!shouldFetchUserToken || !!userToken.data)\n && !!sentDirectShare.hasCompleted\n && !!privacy.data\n && !!entity.data\n && !isLoadingSettings\n && !!yearGroups.hasCompleted;\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <Popup\n title={getTitle(props.entityType)}\n closePopup={props.closePopup}\n showLoadingSpinner={!dataLoaded}\n contentClassName={(dataLoaded && screen) ? 'bg-transparent border-0' : ''}\n bodyClassName='p-0'\n >\n {(() => {\n if (!dataLoaded)\n return <></>;\n\n switch (screen) {\n case 'main':\n return (\n <MainShare\n shareLink={shareLink.data}\n shareLinkIsLoading={shareLink.isFetching}\n entity={entity.data}\n entityType={props.entityType}\n directShareRecipients={recipients.data || []}\n recentlySharedTo={recentlySharedTo.data || []}\n onClickCreateLink={onClickCreateLink}\n onClickShowSettings={() => setScreen('link-settings')}\n onClickShare={onClickShare}\n onClickRemoveRecipient={onClickRemoveRecipient}\n onClickGetEmbedCode={() => setScreen('copy-embed')}\n analyticsOptions={ShareViewHelper.getAnalyticsOptions(props.entityType)}\n gatewayApiUrl={props.gatewayApiUrl || config.data.gatewayApiUrl}\n imageCdnUrl={config.data.imageCdnUrl}\n searchRequestHeaders={getSearchRequestHeaders()}\n currentUser={currentUser.data}\n fetchRecipientUsers={fetchRecipientUsers}\n privacy={privacy.data}\n onClickSavePrivacy={onClickSavePrivacy}\n canAddPolicies={canAddPolicies(props.entityType)}\n emptyStateImageUrl={props.emptyStateImageUrl}\n errorStateImageUrl={props.errorStateImageUrl}\n integrations={getEnabledIntegrations(shareToGoogleClassroom, shareToMicrosoftTeams)}\n integrationSettingAppLink={props.integrationSettingAppLink}\n messagePopupAppLink={props.messagePopupAppLink}\n closePopup={props.closePopup}\n enableIntegrationBanner={props.enableIntegrationBanner}\n canEmbed={canEmbed(props.entityType)}\n yearGroups={yearGroups.data}\n shareOverrideRestrictions={shareOverrideRestrictions}\n />\n );\n case 'link-settings':\n return (\n <div className='bg-white p-3 rounded-bottom-3'>\n <ShareSettings\n entity={entity.data}\n entityType={props.entityType}\n config={config.data}\n shareLink={shareLink.data}\n entityId={props.entityId}\n analyticsOptions={ShareViewHelper.getAnalyticsOptions(props.entityType)}\n onClickSaveLink={onClickSaveLink}\n onClickDeleteLink={onClickDeleteLink}\n onClickCancel={() => setScreen('main')}\n privacy={privacy.data}\n hasStudentExp={hasPermissions(PermissionName.StudentExperience)}\n shareOverrideRestrictions={shareOverrideRestrictions}\n />\n </div>\n );\n case 'copy-embed':\n return (\n <div className='bg-white p-3 rounded-bottom-3'>\n <CopyEmbed\n entity={entity.data}\n entityType={props.entityType}\n config={config.data}\n shareLink={shareLink.data}\n entityId={props.entityId}\n analyticsOptions={ShareViewHelper.getAnalyticsOptions(props.entityType)}\n onClickCancel={() => setScreen('main')}\n />\n </div>\n );\n }\n })()}\n </Popup>\n </LanguageNamespaceContext.Provider>\n );\n}\n","import * as React from 'react';\nimport { Form } from 'react-bootstrap';\nimport { FieldAttributes } from 'formik';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\n\nimport { FieldWrapper, FormFieldProps } from '../form-field/FormField';\n\n/**\n * Use this checkbox within Formik contexts\n */\nexport function FormCheckbox(props: FieldAttributes<FormFieldProps>): JSX.Element {\n const { label, checkboxLabelClassName, checkboxLabelFontWeight, className, ...fieldProps } = props;\n\n return (\n <Form.Group className='form-group'>\n <div className={`form-check ${className || ''}`}>\n <FieldWrapper className='form-check-input' {...fieldProps} />\n <Form.Label\n className={`form-check-label cursor-pointer ${checkboxLabelFontWeight === 'normal' ? 'fw-normal' : ''} \n ${checkboxLabelClassName}`}\n htmlFor={fieldProps.id}\n >\n {label}\n </Form.Label>\n {props.checkboxAppLink && props.checkboxAppLinkText && (\n <>\n <span>&nbsp;</span>\n <AppLink appLink={props.checkboxAppLink} className='info-link'>\n {props.checkboxAppLinkText}\n </AppLink>\n </>\n )}\n </div>\n </Form.Group>\n );\n}\n\n","import * as React from 'react';\nimport { useFormikContext } from 'formik';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\ninterface CharacterCounterProps<Values extends HashObject> {\n fieldName: keyof Values;\n limit: number;\n}\n\nexport function CharacterCounter<Values extends HashObject>(props: CharacterCounterProps<Values>): JSX.Element {\n const { values } = useFormikContext<Values>();\n\n const field = values[props.fieldName];\n\n if (typeof field !== 'string')\n return <></>;\n\n return (\n <div className='float-end text-secondary fw-normal'>\n {field.length}/{props.limit} characters\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"revealPassword\":\"jCfI0\",\"passwordInput\":\"RBJnf\",\"passwordContainer\":\"d78lK\",\"passwordContainerDisabled\":\"asbVo\",\"infoTooltip\":\"wzyOG\",\"spinner\":\"CycFx\"};","import * as React from 'react';\nimport { Form, Spinner } from 'react-bootstrap';\nimport { Placement } from 'react-bootstrap/esm/types';\nimport { ErrorMessage, Field, FieldAttributes, FieldProps, useFormikContext } from 'formik';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { FormCheckbox } from 'libs/shared/components/forms/form-checkbox/FormCheckbox';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { FormHelper } from 'libs/shared/utils/FormHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { CharacterCounter } from './CharacterCounter';\n\nimport styles from './form-field.scss';\n\nconst namespace = 'shared.formField';\n\nexport type FormSize = 'lg' | 'sm';\n\n// If checkboxLabelFontWeight is not specified, it will be bold by default\nexport type CheckboxLabelFontWeight = 'normal' | 'bold'\n\nexport interface FormFieldProps {\n /**\n * The name prop MUST be the same as the attribute\n * name of the value that the field is bound to.\n */\n name: string;\n label?: string;\n children?: any;\n showCharacterCounter?: boolean;\n showRequiredStar?: boolean;\n checkboxAppLink?: Core.AppLink;\n checkboxAppLinkText?: string;\n checkboxLabelClassName?: string;\n checkboxLabelFontWeight?: CheckboxLabelFontWeight\n infoTooltip?: string;\n infoTooltipPlacement?: Placement;\n infoText?: string;\n formSize?: FormSize;\n showOptionalLabel?: boolean;\n showLoadingSpinner?: boolean;\n}\n\nFieldWrapper.defaultProps = {\n autoComplete: 'off'\n};\n\nexport function FieldWrapper(\n props: FieldAttributes<FormFieldProps> & { className: string }\n): React.ReactElement {\n const { children, showLoadingSpinner, ...fieldProps } = props;\n\n const [ type, setType ] = React.useState(props.type);\n\n function onClickTogglePassword(): void {\n if (type === 'password')\n setType('text');\n else\n setType('password');\n }\n\n const resolvedChildren = FunctionHelper.isFunction(children)\n ? (f: FieldProps) => children(f)\n : React.Children.count(children) ? children : null;\n\n if (fieldProps.type !== 'password') {\n if (showLoadingSpinner) {\n return (\n <div className='position-relative'>\n <Field {...(ObjectHelper.omit(fieldProps, ['formSize']))}>\n {resolvedChildren}\n </Field>\n\n <div className={styles.spinner}>\n <Spinner animation='border' size='sm' />\n </div>\n </div>\n );\n }\n\n return (\n <Field {...(ObjectHelper.omit(fieldProps, ['formSize']))}>\n {resolvedChildren}\n </Field>\n );\n }\n\n let containerClassName = `position-relative ${styles.passwordContainer}`;\n\n if (fieldProps.className)\n containerClassName += ` ${fieldProps.className}`;\n\n if (fieldProps.disabled)\n containerClassName += ` ${styles.passwordContainerDisabled}`;\n\n /**\n * We need to wrap out input with a relatively positioned element in order to absolutely\n * position our visibility icon to reveal the password - Sha\n */\n return (\n <div className={containerClassName}>\n <Field\n {...(ObjectHelper.omit(fieldProps, [ 'formSize', 'type', 'className' ]))}\n type={type}\n className={`${styles.passwordInput} border-0 w-100 h-100 outline-none rounded`}\n >\n {resolvedChildren}\n </Field>\n {fieldProps.type === 'password' &&\n <SvgContainer\n svgName={type === 'password' ? cvSvgLibrary.VisibleOn : cvSvgLibrary.VisibleOff}\n className={`svg-container cursor-pointer ${styles.revealPassword}`}\n onClick={onClickTogglePassword}\n />\n }\n </div>\n );\n}\n\nFormField.defaultProps = {\n autoComplete: 'off',\n infoTooltipPlacement: 'top'\n};\n\nexport function FormField<Values extends HashObject>(props: FieldAttributes<FormFieldProps>): React.ReactElement {\n const {\n label,\n className,\n showCharacterCounter,\n showRequiredStar,\n infoTooltip,\n infoTooltipPlacement,\n infoText,\n formSize,\n showOptionalLabel,\n ...fieldProps\n } = props;\n\n const { errors, touched } = useFormikContext<Values>();\n\n // This function overwrites the default `onChange` function whenever `props.disabled` is set.\n // This prevents users from \"undisabling\" form fields via inspect element, then editing the field.\n const disabledOnChange = () => {};\n\n if (fieldProps.type === 'checkbox') {\n const _props = ObjectHelper.omit(props, [ 'formSize', 'infoTooltipPlacement' ]);\n\n if (props.disabled)\n _props.onChange = disabledOnChange;\n\n return <FormCheckbox {..._props} />;\n }\n\n const fieldWrapperProps = {\n ...fieldProps,\n className: FormHelper.getCustomFormControlClassName(\n errors,\n touched,\n fieldProps.name,\n formSize,\n className,\n typeof props.as === 'string' ? props.as : null\n )\n };\n\n if (props.disabled)\n fieldWrapperProps.onChange = disabledOnChange;\n\n return (\n <Form.Group className='form-group'>\n {!!label && (\n <Form.Label htmlFor={fieldProps.id} className='d-flex align-items-center'>\n {label}\n {showRequiredStar && <span className='text-danger'>*</span>}\n {infoTooltip && (\n <SvgContainer\n className={`svg-container text-secondary ${styles.infoTooltip}`}\n svgName={cvSvgLibrary.Info}\n title={infoTooltip}\n tooltipPlacement={infoTooltipPlacement}\n tooltipSpanHack\n />\n )}\n {showOptionalLabel && <span className='text-secondary'>&nbsp;<Text namespace={namespace} phrase='optional' /></span>}\n \n {!!showCharacterCounter && !!(fieldProps as React.HTMLProps<HTMLInputElement>).maxLength &&\n <div className='ms-auto'>\n <CharacterCounter\n fieldName={(fieldProps.name as keyof Values)}\n limit={(fieldProps as React.HTMLProps<HTMLInputElement>).maxLength}\n />\n </div>\n }\n </Form.Label>\n )}\n\n <FieldWrapper {...fieldWrapperProps} />\n\n {!!infoText &&\n <Form.Text className='text-secondary'>\n {infoText}\n </Form.Text>\n }\n\n <ErrorMessage name={fieldProps.name}>\n {(errorMessage: string) => <Form.Control.Feedback type='invalid'>{errorMessage}</Form.Control.Feedback>}\n </ErrorMessage>\n </Form.Group>\n );\n}","import * as React from 'react';\nimport { Formik, FormikConfig, FormikContextType, FormikErrors, FormikHelpers, FormikProps, FormikValues, useFormikContext } from 'formik';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\n/**\n * Note: This currently doesn't support arrays, but the need for arrays as initial\n * form data has not yet come up\n */\nfunction omitNullInitialValues<Values extends FormikValues>(initialValues: Values): Values {\n if (!initialValues)\n return {} as Values;\n\n const values = ObjectHelper.deepClone(initialValues);\n\n function omitChildValues(child: Values): void {\n Object.keys(values).forEach((key: keyof Values) => {\n if (!values.hasOwnProperty(key))\n return;\n \n if (ObjectHelper.isObject(child[key]))\n omitChildValues(child[key]);\n else if (values[key] === null)\n delete values[key];\n });\n }\n\n omitChildValues(values);\n return values;\n}\n\n// Omit attributes from FormikConfig that are defined in FormWrapperProps.\ntype ModifiedFormikConfig<Values extends FormikValues> = Omit<FormikConfig<Values>, 'initialValues' | 'onSubmit'>;\n\ninterface InitialStatus {\n allowInitialSubmit: boolean;\n}\n\nexport type FormSubmissionOptions<FormValues = FormikValues> = {\n reset?: boolean;\n errors?: FormikErrors<FormValues>;\n};\n\ninterface FormWrapperProps<FormValues extends FormikValues, ApiValues extends FormikValues> {\n initialValues: Partial<FormValues | ApiValues>;\n onSubmit: (data: FormValues, onDone: (options?: FormSubmissionOptions<FormValues>) => void) => void;\n castInitialValues?: boolean; // cast to validationSchema\n castValuesOnSubmit?: boolean; // cast to validationSchema\n allowInitialSubmit?: boolean; // if true, useCanSubmitForm will allow submit without any user changes.\n}\n\nFormWrapper.defaultProps = {\n castInitialValues: true,\n castValuesOnSubmit: true\n};\n\nexport function FormWrapper<\n FormValues extends FormikValues = FormikValues,\n ApiValues extends FormikValues = FormValues,\n ExtraProps = HashObject\n>(props: ModifiedFormikConfig<FormValues> & ExtraProps & FormWrapperProps<FormValues, ApiValues>): JSX.Element {\n const { castInitialValues, castValuesOnSubmit, initialValues, onSubmit, ...formikProps } = props;\n\n /**\n * If castInitialValues is true, cast initialValues to the validationSchema.\n * This will ensure that any data fetched from the api conforms to the expected form data shape.\n */\n const formattedInitialValues: FormValues = castInitialValues && props.validationSchema\n ? props.validationSchema.cast(omitNullInitialValues(initialValues))\n : initialValues;\n\n const onSubmitHandler = (\n values: FormValues,\n { setSubmitting, resetForm, setFieldError }: FormikHelpers<FormValues>\n ) => {\n /**\n * validationSchema.cast will coerce the values to the types defined in validationSchema.\n * This is useful for trimming inputs:\n * e.g. if a value field has type Yup.string().trim(), it will be automatically trimmed.\n */\n const formattedData = castValuesOnSubmit && props.validationSchema\n ? props.validationSchema.cast(values)\n : values;\n\n onSubmit(formattedData, (options: FormSubmissionOptions<FormValues> = {}) => {\n options.reset && resetForm();\n\n if (options.errors) {\n for (const [ key, value ] of Object.entries(options.errors)) {\n setFieldError(key, value);\n }\n }\n\n setSubmitting(false);\n });\n };\n\n const initialStatus: InitialStatus = {\n allowInitialSubmit: props.allowInitialSubmit\n };\n\n return (\n <Formik<FormValues, ExtraProps>\n enableReinitialize\n {...(formikProps as ModifiedFormikConfig<FormValues> & ExtraProps)}\n initialValues={formattedInitialValues}\n onSubmit={onSubmitHandler}\n initialStatus={initialStatus}\n >\n {FunctionHelper.isFunction(props.children)\n ? (f: FormikProps<FormValues>) => (props.children as (f: FormikProps<FormValues>) => React.ReactNode)(f)\n : React.Children.count(props.children) ? props.children : null\n }\n </Formik>\n );\n}\n\nexport function useFormikContextWrapper<T>(): FormikContextType<T> {\n return useFormikContext<T>();\n}","import { FormikErrors, FormikTouched, getIn } from 'formik';\n\nimport { FormSize } from 'libs/shared/components/forms/form-field/FormField';\n\nfunction getTypeSize(type: string, size: FormSize) {\n let className = '';\n\n switch (type) {\n case 'select':\n className = 'form-select';\n break;\n default:\n className = 'form-control';\n }\n\n if (size === 'sm')\n className += ` ${className}-sm`;\n\n if (size === 'lg')\n className += ` ${className}-lg`;\n\n return className;\n}\n\nexport const FormHelper = {\n getCustomFormControlClassName<T>(\n errors: FormikErrors<T>,\n touched: FormikTouched<T>,\n attribute: string,\n size?: FormSize,\n additionalClassName?: string,\n type?: string\n ): string {\n let className = '';\n\n className = getTypeSize(type, size);\n\n // Using getIn as it supports dot notation\n if (getIn(touched, attribute) && getIn(errors, attribute))\n className += ' is-invalid';\n\n if (additionalClassName)\n className += ` ${additionalClassName}`;\n\n return className;\n }\n};"],"names":["namespace","EmbedSize","props","autoplay","setAutoplay","videoSize","setVideoSize","videoSizes","className","length","phrase","id","variant","label","map","size","key","width","height","onClick","checked","onChange","getPhrase","LinkExpiry","formikProps","htmlFor","title","disable","passwordProtectLink","spanHack","trigger","setFieldValue","values","linkExpireDate","on","disabled","showStateWhenDisabled","LanguageService","SetPasswordInput","revealPassword","setRevealPassword","errorMsg","errors","password","value","e","canEdit","target","type","placeholder","readOnly","Form","DivButton","SvgContainer","svgName","tooltipPlacement","canReset","onReset","PASSWORD_PLACEHOLDER","LinkPassword","setPasswordProtectLink","shareLink","isPasswordProtected","readonlyPassword","setReadonlyPassword","Text","ToggleSwitch","LINK_EXPIRY_TIME","getLinkExpiryDate","shouldExpire","date","Date","setDate","getDate","toISOString","ShareLinkSettingsValidationSchema","shape","removePassword","resourceId","nullable","test","name","exclusive","params","message","val","CopyEmbedHtml","EmbedHelper","copyBtnPhrase","setCopyBtnPhrase","find","s","logged","setLogged","url","embedUrl","host","config","primaryUrl","shareId","embedString","spellCheck","rows","CopyToClipboard","onCopy","setTimeout","AnalyticsHelper","entity","embedDetails","ShareViewHelper","entityType","actionType","descriptor","eventVersion","text","CopyEmbed","entityId","analyticsOptions","PopupButtons","onClickCancel","GetEmbedCode","onClickGetEmbedCode","S","getRespectRatingText","video","yearGroups","hasStudentExp","VideoHelper","restriction","RestrictionHelper","_restrictions","yearGroup","maxYearGroup","minAllowedYearGroup","rating","getIconAndText","options","status","entityTypeId","privacy","MasterType","icon","Array","isArray","overrideRestrictions","getPrivateIconAndText","isToday","DateHelper","dayDifference","days","ShareLinkStatus","ShareLinkItem","active","description","ShareLinkInfo","canManageAccess","setCanManageAccess","setPrivacy","canManageAccessPrivacy","canUpdatePrivacy","shareOverrideRestrictions","onClickSavePrivacy","GoogleClassroomAvatar","viewBox","fill","cx","cy","r","patternContentUnits","xlinkHref","transform","MicrosoftTeamsAvatar","d","ShareIntegrationsStack","Tooltip","style","zIndex","ShareAsLink","objectTypeId","CopyInput","enableIntegrations","onClickCreateLink","MessageValidationSchema","max","ShareMessageForm","FormField","component","showOptionalLabel","ShareMessage","FormWrapper","initialValues","validationSchema","onSubmit","data","onDone","onClickShare","allowInitialSubmit","filterSearchResults","recipientsToFilter","currentSelections","existingShareRecipients","currentUserId","selectedIds","filter","includes","MainShare","selections","setSelections","showShareLinkSpinner","setShowShareLinkSpinner","hasPermissions","usePermissions","hasManageIntegrationsPermission","PermissionName","canDirectShare","recentSearches","recentlySharedTo","directShareRecipients","currentUser","shareLinkIsLoading","TokenizedTypeahead","join","getRemoteUrl","UrlHelper","gatewayApiUrl","getRemotePostBody","query","indices","push","index","filters","userProfile","ObjectStatus","customerId","searchType","limit","requestHeaders","searchRequestHeaders","formatRemoteSuggestions","suggestions","results","onSuggestionSelected","selection","removeSelection","imageCdnUrl","activationLength","fetchSelectionMembers","fetchRecipientUsers","users","newSelections","forEach","updatedSelection","ObjectHelper","count","pagination","ArrayHelper","debounceTime","emptyStateImageUrl","errorStateImageUrl","hasStudentExperience","autoHeight","RecipientItem","removeRecipient","onClickRemoveRecipient","showDisplayName","typeId","onClickShowSettings","canAddPolicies","enableIntegrationBanner","integrations","canEmbed","ShareIntegrations","closePopup","appLink","integrationSettingAppLink","messagePopupAppLink","Spinner","as","animation","role","ShareSettingsForm","onClickDeleteLink","ShareSettings","onClickSaveLink","castInitialValues","getTitle","ShareView","dispatch","alerts","shouldFetchUserToken","screen","setScreen","UserRequests","ConfigRequests","userToken","ShareRequests","sentDirectShare","recipients","recentlySharedToIds","RecentShareHelper","R","hasRecentlySharedRecipients","isAuthenticated","CustomerRequests","useSettings","shareToGoogleClassroom","shareToMicrosoftTeams","isLoadingSettings","fetchRecipients","directShare","callback","onError","onSuccess","error","recipientId","success","dataLoaded","hasCompleted","Popup","showLoadingSpinner","contentClassName","bodyClassName","isFetching","authorization","googleClassroomSetting","msftTeamsSetting","IntegrationHelper","i","enabled","FormCheckbox","checkboxLabelClassName","checkboxLabelFontWeight","fieldProps","FieldWrapper","checkboxAppLink","checkboxAppLinkText","AppLink","CharacterCounter","field","fieldName","children","setType","resolvedChildren","FunctionHelper","f","containerClassName","showCharacterCounter","showRequiredStar","infoTooltip","infoTooltipPlacement","infoText","formSize","touched","disabledOnChange","_props","fieldWrapperProps","FormHelper","tooltipSpanHack","maxLength","errorMessage","defaultProps","autoComplete","castValuesOnSubmit","formattedInitialValues","cast","omitChildValues","child","Object","keys","hasOwnProperty","omitNullInitialValues","initialStatus","enableReinitialize","setSubmitting","resetForm","setFieldError","formattedData","reset","entries","useFormikContextWrapper","getCustomFormControlClassName","attribute","additionalClassName","getTypeSize"],"sourceRoot":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/7855-cbf70d4453-lite.chunk.js","mappings":"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","sources":["file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/components/recipient-item/recipient-item.scss","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/components/recipient-item/classroom-group-recipient-item-metadata/ClassroomGroupRecipientItemMetadata.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/components/recipient-item/classroom-recipient-item-metadata/ClassroomRecipientItemMetadata.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/components/recipient-item/user-recipient-item-metadata/UserRecipientItemMetadata.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/components/recipient-item/RecipientItem.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/components/white-avatar/white-avatar.scss","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/components/white-avatar/WhiteAvatar.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/components/tokenized-typeahead/input-selection.scss","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/components/tokenized-typeahead/InputSelectionExpander.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/components/tokenized-typeahead/InputSelection.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/components/tokenized-typeahead/tokenized-typeahead.scss","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/apps/share/components/tokenized-typeahead/TokenizedTypeahead.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/typeahead-empty-state/typeahead-empty-state.scss","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/typeahead-empty-state/TypeaheadEmptyState.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/typeahead-error-state/typeahead-error-state.scss","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/typeahead-error-state/TypeaheadErrorState.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/utils/GroupHelper.ts"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"removeRecipient\":\"mCbMC\",\"recipientItem\":\"kdcb0\",\"showSpinner\":\"xH6Mu\",\"avatarContainer\":\"Zcpg3\",\"recipientDetails\":\"v5EmV\",\"recipientDetailsWithRemoveButton\":\"_V928\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { IconCircle } from 'libs/shared/components/icon-circle/IconCircle';\nimport { ClassroomGroup } from 'libs/shared/interfaces';\nimport { mapColourToBsVariant } from 'libs/shared/utils/GroupHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from '../recipient-item.scss';\n\nconst namespace = 'shared.classroomGroupRecipientItemMetadata';\n\nfunction getSubheading(classroomGroup: ClassroomGroup): string {\n const userCount = classroomGroup.users?.count ?? 0;\n const classroomName = classroomGroup.classroom?.name;\n\n if (classroomName)\n return LanguageService.getPhrase(namespace, 'subheading', { classroomName, smartCount: userCount });\n\n return '';\n}\n\ninterface ClassroomGroupRecipientItemMetadataProps {\n classroomGroup: ClassroomGroup;\n detailsClassName: string;\n}\n\nexport function ClassroomGroupRecipientItemMetadata(props: ClassroomGroupRecipientItemMetadataProps): JSX.Element {\n return (\n <>\n <div className={`${styles.avatarContainer} d-inline-block`}>\n <IconCircle\n svgName={cvSvgLibrary.Group}\n variant={mapColourToBsVariant(props.classroomGroup.metadata?.colour)}\n />\n </div>\n\n <div className={props.detailsClassName}>\n <h4 className='font-size-normal fw-normal m-0'>\n {props.classroomGroup.name}\n </h4>\n <p className='text-secondary m-0'>{getSubheading(props.classroomGroup)}</p>\n </div>\n </>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { IconCircle } from 'libs/shared/components/icon-circle/IconCircle';\nimport { Classroom } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from '../recipient-item.scss';\n\nconst namespace = 'shared.classroomRecipientItemMetadata';\n\nfunction getSubheading(classroom: Classroom): string {\n const userCount = classroom.users?.count;\n\n if (Number.isInteger(userCount))\n return LanguageService.getPhrase(namespace, 'subheading', { smartCount: userCount });\n\n return '';\n}\n\ninterface ClassroomRecipientItemMetadataProps {\n classroom: Classroom;\n detailsClassName: string;\n}\n\nexport function ClassroomRecipientItemMetadata(props: ClassroomRecipientItemMetadataProps): JSX.Element {\n return (\n <>\n <div className={`${styles.avatarContainer} d-inline-block`}>\n <IconCircle svgName={cvSvgLibrary.Classrooms} variant='teal' />\n </div>\n\n <div className={props.detailsClassName}>\n <h4 className='font-size-normal fw-normal m-0'>\n {props.classroom.name}\n </h4>\n <p className='text-secondary m-0'>{getSubheading(props.classroom)}</p>\n </div>\n </>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { BaseObject, User } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from '../recipient-item.scss';\n\nconst namespace = 'shared.userRecipientItemMetadata';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getSubText(user: User): string {\n const userType = UserHelper.getUserType(user);\n const role = UserHelper.getUserRole(user);\n\n if (userType === UserGroup.Staff) {\n if (role === UserRole.Admin)\n return getPhrase('admin');\n\n return getPhrase('staff');\n }\n\n const yearGroup = UserHelper.getYearGroup(user);\n\n if (yearGroup?.name)\n return yearGroup.name;\n\n return getPhrase('student');\n}\n\ninterface UserRecipientItemMetadataProps {\n user: User;\n imageCdnUrl: string;\n detailsClassName: string;\n showDisplayName: boolean;\n getSubText?: (user: BaseObject) => string;\n}\n\nexport function UserRecipientItemMetadata(props: UserRecipientItemMetadataProps): JSX.Element {\n return (\n <>\n <div className={`${styles.avatarContainer} d-inline-block`}>\n <Avatar\n imageUrl={props.user.avatar?.url}\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(props.user.name, props.user.surname)}\n />\n </div>\n\n <div className={props.detailsClassName}>\n <h4 className='font-size-normal fw-normal m-0'>\n {props.showDisplayName\n ? UserHelper.getDisplayName(props.user)\n : UserHelper.getFullName(props.user)\n }\n </h4>\n <p className='text-secondary m-0'>{props.getSubText ? props.getSubText(props.user) : getSubText(props.user)}</p>\n </div>\n </>\n );\n}","import React from 'react';\nimport { Spinner } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { BaseObject, Classroom, ClassroomGroup, User } from 'libs/shared/interfaces';\nimport { MasterTypeHelper } from 'libs/shared/utils/MasterTypeHelper';\n\nimport { ClassroomGroupRecipientItemMetadata } from './classroom-group-recipient-item-metadata/ClassroomGroupRecipientItemMetadata';\nimport { ClassroomRecipientItemMetadata } from './classroom-recipient-item-metadata/ClassroomRecipientItemMetadata';\nimport { UserRecipientItemMetadata } from './user-recipient-item-metadata/UserRecipientItemMetadata';\n\nimport styles from './recipient-item.scss';\n\nconst namespace = 'share.recipientItem';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getRemovePhrase(type: MasterType): string {\n switch (type) {\n case (MasterType.User):\n return getPhrase('removeUser');\n case (MasterType.Classroom):\n return getPhrase('removeClassroom');\n case (MasterType.ClassroomGroup):\n return getPhrase('removeGroup');\n }\n return null;\n}\n\ninterface RecipientItemProps<T extends BaseObject = BaseObject> {\n entity: T;\n imageCdnUrl: string;\n showDisplayName: boolean;\n removeRecipient?: (id: string, onError?: () => void) => void;\n getSubText?: (entity: T) => string;\n}\n\nexport function RecipientItem<T extends BaseObject = BaseObject>(props: RecipientItemProps<T>): JSX.Element {\n const [ showSpinner, setShowSpinner ] = React.useState(false);\n\n let className = `${styles.recipientItem} d-flex`;\n\n if (showSpinner)\n className += ` ${styles.showSpinner}`;\n\n const detailsClassName = `${props.removeRecipient\n ? styles.recipientDetailsWithRemoveButton\n : styles.recipientDetails} d-inline-block ms-2`;\n\n function removeRecipient(): void {\n setShowSpinner(true);\n props.removeRecipient(props.entity.id, () => setShowSpinner(false));\n }\n\n return (\n <div className={className}>\n {(() => {\n if (MasterTypeHelper.isType<User>(props.entity, MasterType.User)) {\n return (\n <UserRecipientItemMetadata\n user={props.entity}\n imageCdnUrl={props.imageCdnUrl}\n detailsClassName={detailsClassName}\n showDisplayName={props.showDisplayName}\n getSubText={props.getSubText}\n />\n );\n }\n\n if (MasterTypeHelper.isType<Classroom>(props.entity, MasterType.Classroom)) {\n return (\n <ClassroomRecipientItemMetadata\n classroom={props.entity}\n detailsClassName={detailsClassName}\n />\n );\n }\n\n if (MasterTypeHelper.isType<ClassroomGroup>(props.entity, MasterType.ClassroomGroup)) {\n return (\n <ClassroomGroupRecipientItemMetadata\n classroomGroup={props.entity}\n detailsClassName={detailsClassName}\n />\n );\n }\n })()}\n\n {FunctionHelper.isFunction(props.removeRecipient) && (\n <div className={`${styles.removeRecipient} d-inline-flex justify-content-center align-items-center`}>\n {showSpinner\n ? <Spinner as='div' size='sm' animation='border' role='status' />\n : (\n <Tooltip title={getRemovePhrase(props.entity.typeId)} spanHack>\n <div\n className='btn-close cursor-pointer'\n role='button'\n aria-label='Close'\n onClick={removeRecipient}\n >\n </div>\n </Tooltip>\n )\n }\n </div>\n )}\n </div>\n );\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"avatar\":\"srrS3\"};","import React from 'react';\n\nimport styles from './white-avatar.scss';\n\ninterface WhiteAvatarProps {\n initials: string;\n imageUrl?: string;\n}\n\nexport function WhiteAvatar(props: WhiteAvatarProps): React.ReactElement {\n const { imageUrl, initials } = props;\n\n const style: React.CSSProperties = {};\n\n if (imageUrl)\n style.backgroundImage = `url('${imageUrl}')`;\n\n return (\n <div className={styles.avatar} style={style}>\n {imageUrl ? <>&nbsp;</> : initials}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"svgContainer\":\"laVU4\",\"selection\":\"vEOCt\",\"expander\":\"d1NHd\",\"iconContainer\":\"rFH4W\",\"icon\":\"BarYz\",\"bubble\":\"HF0E8\",\"spinnerContainer\":\"iKeXW\",\"remove\":\"pyzCM\",\"removeBubble\":\"mgt6Y\"};","import React from 'react';\nimport { Spinner } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { WhiteAvatar } from 'libs/shared/apps/share/components/white-avatar/WhiteAvatar';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { BaseObject, Classroom, ClassroomGroup, User } from 'libs/shared/interfaces';\nimport { mapColourToBsVariant } from 'libs/shared/utils/GroupHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from './input-selection.scss';\n\nconst getPhrase = LanguageService.encloseNamespace('shared.inputSelection');\n\nfunction mapEntityTypeToForegroundColor(entity: BaseObject): string {\n switch (entity.typeId) {\n case MasterType.Classroom: {\n return 'text-teal-hover';\n }\n\n case MasterType.ClassroomGroup: {\n return `text-${mapColourToBsVariant((entity as ClassroomGroup).metadata?.colour)}-hover`;\n }\n }\n}\n\nfunction getColouredIconClass(selection: Classroom | ClassroomGroup): string {\n let iconClass = `${styles.svgContainer} ${styles.icon}`;\n\n if (selection.typeId === MasterType.Classroom)\n iconClass += ' text-teal';\n else\n iconClass += ` text-${mapColourToBsVariant((selection as ClassroomGroup).metadata?.colour)}`;\n\n return iconClass;\n}\n\ninterface InputSelectionExpanderProps {\n canExpand: boolean;\n hasExpanded: boolean;\n selection: BaseObject;\n onClickExpand?: () => void;\n}\n\nexport function InputSelectionExpander(props: InputSelectionExpanderProps): JSX.Element {\n const colourClass = mapEntityTypeToForegroundColor(props.selection);\n\n const isClassroom = props.selection.typeId === MasterType.Classroom;\n\n if (!props.canExpand) {\n if (!props.selection.typeId || props.selection.typeId === MasterType.User) {\n const user = props.selection as User;\n\n return (\n <div className={styles.svgContainer}>\n <WhiteAvatar\n imageUrl={user.avatar?.url}\n initials={UserHelper.getInitials(props.selection.name, (props.selection as User).surname)}\n />\n </div>\n );\n }\n\n return (\n <Tooltip title={getPhrase(isClassroom ? 'emptyClassroom' : 'emptyGroup')}>\n <div className={`align-items-center border border-white bg-white ${styles.iconContainer}`}>\n <SvgContainer\n className={getColouredIconClass(props.selection)}\n svgName={isClassroom ? cvSvgLibrary.Classrooms : cvSvgLibrary.Group}\n />\n </div>\n </Tooltip>\n );\n }\n\n if (!props.hasExpanded) {\n return (\n <>\n {/* Visible on hover */}\n <DivButton\n className={`align-items-center cursor-pointer text-white border border-white rounded-circle ${styles.expander} ${colourClass}`}\n onClick={props.onClickExpand}\n >\n <SvgContainer svgName={cvSvgLibrary.Plus} className={`d-flex align-items-center ${styles.svgContainer}`} />\n </DivButton>\n\n {/* Visible when not hovering */}\n <div className={`align-items-center border border-white bg-white ${styles.iconContainer}`}>\n <SvgContainer\n className={getColouredIconClass(props.selection)}\n svgName={isClassroom ? cvSvgLibrary.Classrooms : cvSvgLibrary.Group}\n />\n </div>\n </>\n );\n }\n\n return (\n <div className={`d-flex align-items-center text-white ${styles.spinnerContainer} ${styles.svgContainer}`}>\n <Spinner as='div' size='sm' animation='border' role='status' />\n </div>\n );\n}","import React from 'react';\nimport { ButtonProps } from 'react-bootstrap';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { Classroom, ClassroomGroup, User } from 'libs/shared/interfaces';\nimport { mapColourToBsVariant } from 'libs/shared/utils/GroupHelper';\nimport { MasterTypeHelper } from 'libs/shared/utils/MasterTypeHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport { InputSelectionExpander } from './InputSelectionExpander';\n\nimport styles from './input-selection.scss';\n\n/**\n * TODO: This entire file needs to be refactored to work\n * better with non standard entities. ATM it's also being used\n * in the invite a colleague UI for trials. - Sha\n */\ninterface OtherEntity {\n id: never;\n typeId: never;\n name: string;\n}\n\ntype Entity = Classroom | ClassroomGroup | User | OtherEntity;\n\nfunction mapEntityTypeToBsVariant(entity: Entity): ButtonProps['variant'] {\n if (!entity.typeId)\n return 'dark-blue';\n\n switch (entity.typeId) {\n case MasterType.User: {\n // TODO: Delete this once https://clickview.atlassian.net/browse/INBOX-2151 is addressed\n if (typeof(entity as User).userType === 'number')\n return ((entity as User).userType as any) === 2 ? 'dark-blue' : 'indigo';\n\n if ((entity as User).userType === UserGroup.Learner)\n return 'dark-blue';\n\n return 'indigo';\n }\n\n case MasterType.Classroom: {\n return 'teal';\n }\n\n case MasterType.ClassroomGroup: {\n return mapColourToBsVariant((entity as ClassroomGroup).metadata?.colour);\n }\n }\n}\n\ninterface InputSelectionProps {\n selection: Entity;\n onClickRemove?: (selection: Entity) => void;\n onClickExpand?: (id: string) => void;\n hasStudentExperience?: boolean;\n}\n\nexport function InputSelection(props: InputSelectionProps): JSX.Element {\n const isClassroom = MasterTypeHelper.isType(props.selection, MasterType.Classroom);\n const isClassroomGroup = MasterTypeHelper.isType(props.selection, MasterType.ClassroomGroup);\n const isExpandable = props.onClickExpand && (isClassroom || isClassroomGroup);\n\n /**\n * We only know that there are no members if props.selections.users.count exists\n * and is 0 as it is set to 0 in <MainShare /> after fetching the users.\n */\n const hasMembers = !!(props.selection as Classroom | ClassroomGroup).users?.count;\n const hasFetchedMembers = !!(props.selection as Classroom | ClassroomGroup).users?.data?.length;\n\n const [ hasExpanded, setHasExpanded ] = React.useState(false);\n const [ canExpand, setCanExpand ] = React.useState(isExpandable && hasMembers);\n\n React.useEffect(() => {\n setCanExpand(isExpandable && hasMembers);\n }, [ isExpandable, hasMembers ]);\n\n function onClickExpand(): void {\n setHasExpanded(true);\n props.onClickExpand(props.selection.id);\n }\n\n if (hasFetchedMembers) {\n const selection: Classroom | ClassroomGroup = props.selection as Classroom | ClassroomGroup;\n\n const colourVariant = mapEntityTypeToBsVariant(props.selection);\n\n return (\n <div className={`d-flex align-items-center flex-wrap me-1 mt-1 pb-1 ps-1 pe-4 position-relative border-${colourVariant} text-${colourVariant} ${styles.bubble}`}>\n {selection.users.data.map(user => (\n <InputToken\n key={`${user.id}:${props.selection.id}`}\n selection={user}\n colourVariant={colourVariant}\n hasStudentExperience={props.hasStudentExperience}\n />\n ))}\n\n <DivButton\n className={`cursor-pointer position-absolute text-${colourVariant} ${styles.removeBubble}`}\n onClick={() => props.onClickRemove(props.selection)}\n >\n <SvgContainer svgName={cvSvgLibrary.Close} className={`d-flex align-items-center ${styles.svgContainer}`} />\n </DivButton>\n </div>\n );\n }\n\n return (\n <InputToken\n selection={props.selection}\n canExpand={canExpand}\n hasExpanded={hasExpanded}\n onClickExpand={onClickExpand}\n onClickRemove={props.onClickRemove}\n colourVariant={mapEntityTypeToBsVariant(props.selection)}\n hasStudentExperience={props.hasStudentExperience}\n />\n );\n}\n\ninterface InputTokenProps<T extends HashObject> {\n selection: T | Entity;\n colourVariant: string;\n canExpand?: boolean;\n hasExpanded?: boolean;\n onClickExpand?: () => void;\n onClickRemove?: (selection: Entity) => void;\n hasStudentExperience?: boolean;\n hideExpander?: boolean;\n}\n\nexport function InputToken<T extends HashObject = Entity>(props: InputTokenProps<T>): JSX.Element {\n const colourVariant = props.colourVariant || mapEntityTypeToBsVariant(props.selection);\n\n let selectionName = props.selection.name;\n\n if (props.selection.typeId === MasterType.User) {\n selectionName = props.hasStudentExperience\n ? UserHelper.getDisplayName(props.selection as User)\n : UserHelper.getFullName(props.selection as User);\n }\n\n return (\n <div className={`${styles.selection} bg-${colourVariant} rounded-pill text-${colourVariant} d-flex align-items-center me-1 mt-1 overflow-hidden`}>\n {!props.hideExpander && (\n <InputSelectionExpander\n canExpand={props.canExpand}\n hasExpanded={props.hasExpanded}\n onClickExpand={props.onClickExpand}\n selection={props.selection}\n />\n )}\n\n <span className='mx-1 text-white text-truncate'>{selectionName}</span>\n\n {FunctionHelper.isFunction(props.onClickRemove) && (\n <DivButton\n className={`d-flex align-items-center cursor-pointer align-self-stretch text-white ${styles.remove}`}\n onClick={() => props.onClickRemove(props.selection)}\n >\n <SvgContainer svgName={cvSvgLibrary.Close} className={`d-flex align-items-center ${styles.svgContainer}`} />\n </DivButton>\n )}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"container\":\"Dc3kX\",\"suggestionsContainerOpen\":\"c5t3e\",\"selectionContainer\":\"kFjoN\",\"sectionContainer\":\"mLrE3\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { RecipientItem } from 'libs/shared/apps/share/components/recipient-item/RecipientItem';\nimport { SearchBar, SearchBarProps } from 'libs/shared/components/search-bar/SearchBar';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { TypeaheadEmptyState } from 'libs/shared/components/typeahead-empty-state/TypeaheadEmptyState';\nimport { TypeaheadErrorState } from 'libs/shared/components/typeahead-error-state/TypeaheadErrorState';\nimport { BaseObject } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { InputSelection } from './InputSelection';\n\nimport styles from './tokenized-typeahead.scss';\n\nconst namespace = 'shared.tokenizedTypeahead';\n\nexport const TOKENIZED_TYPEAHEAD_SUGGESTIONS_LIMIT = 10;\n\ninterface TokenizedTypeaheadProps<T extends BaseObject = BaseObject> extends SearchBarProps<T> {\n selections: T[];\n removeSelection: (selection: T) => void;\n emptyStateImageUrl: string;\n errorStateImageUrl: string;\n hasStudentExperience?: boolean;\n getInputTokenComponent?: (selection: T) => JSX.Element;\n imageCdnUrl?: string;\n className?: string;\n hideIcon?: boolean;\n\n /**\n * If this is passed in groups and classrooms will have the option to expand\n * otherwise they will appear as normal without the + icon\n */\n fetchSelectionMembers?: (id: string) => void;\n sharePermissionsDescription?: string;\n}\n\nTokenizedTypeahead.defaultProps = {\n renderSuggestionsOnInputFocus: true\n};\n\n/**\n * This component extends the functionality of the `SearchBar` component by\n * displaying a list of selections as tokens inside the search bar.\n * \n * Any component using this component is responsible for managing the state of\n * these tokens (selections). See `MainShare.tsx` for an example.\n */\nexport function TokenizedTypeahead<T extends BaseObject = BaseObject>(props: TokenizedTypeaheadProps<T>): JSX.Element {\n return (\n <div className={`form-control h-auto d-flex align-items-top position-relative ${props.hideIcon ? '' : 'py-1 px-0'} ${props.className}`}>\n {!props.hideIcon && <SvgContainer className='svg-container m-1' svgName={cvSvgLibrary.Search} />}\n\n <div className={`${styles.selectionContainer} d-flex flex-wrap align-items-center mt-n1`}>\n {props.selections.map(s => {\n if (props.getInputTokenComponent)\n return props.getInputTokenComponent(s);\n\n return (\n <InputSelection\n key={s.id}\n selection={s}\n onClickRemove={props.removeSelection}\n onClickExpand={props.fetchSelectionMembers}\n hasStudentExperience={props.hasStudentExperience}\n />\n );\n })}\n\n <SearchBar\n {...props}\n onBackspace={() => {\n if (!props.selections.length)\n return;\n\n props.removeSelection(ArrayHelper.last(props.selections));\n }}\n recentSearchHeading={props.recentSearchHeading || LanguageService.getPhrase(namespace, 'recentSearchHeading')}\n placeholder={!props.selections?.length ? props.placeholder : ' '}\n searchIconPlacement={false}\n clearQueryOnSelect\n getSuggestionComponent={suggestion => {\n if (props.getSuggestionComponent)\n return props.getSuggestionComponent(suggestion);\n\n return (\n <RecipientItem\n entity={suggestion}\n imageCdnUrl={props.imageCdnUrl}\n showDisplayName={props.hasStudentExperience}\n />\n );\n }}\n getEmptyStateComponent={query => <TypeaheadEmptyState query={query} imageUrl={props.emptyStateImageUrl} />}\n getErrorStateComponent={onClickTryAgain =>\n <TypeaheadErrorState imageUrl={props.errorStateImageUrl} onClickTryAgain={onClickTryAgain} />\n }\n theme={{\n container: styles.container,\n suggestionsContainerOpen: `bg-white py-1 rounded border mt-1 ${styles.suggestionsContainerOpen}`,\n sectionContainer: `border-bottom py-1 ${styles.sectionContainer}`\n }}\n sectionTitleClassName='ps-2'\n renderSuggestionsOnInputFocus={props.renderSuggestionsOnInputFocus}\n onSuggestionDependencies={[props.selections]}\n />\n </div>\n\n {!!props.sharePermissionsDescription &&\n <span className='px-2 text-secondary text-nowrap'>{props.sharePermissionsDescription}</span>\n }\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"emptyState\":\"bKTf0\"};","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useDebounce } from 'libs/shared/hooks/UseDebounce';\n\nimport styles from './typeahead-empty-state.scss';\n\nconst namespace = 'shared.typeaheadEmptyState';\n\ninterface TypeaheadEmptyStateProps {\n query: string;\n imageUrl: string;\n}\n\nexport function TypeaheadEmptyState({ query = '', imageUrl }: TypeaheadEmptyStateProps): JSX.Element {\n function onClick(e: React.MouseEvent<HTMLDivElement>): void {\n e.stopPropagation();\n }\n\n const debouncedQuery = useDebounce(query, 300);\n\n return (\n <div className='d-flex flex-column align-items-center text-center' onClick={onClick}>\n <img\n alt=''\n role='presentation'\n src={imageUrl}\n className={`pb-2 ${styles.emptyState}`}\n />\n <h2 className='h6'>\n <Text\n namespace={namespace}\n phrase='noResults'\n options={{ query: debouncedQuery, smartCount: debouncedQuery.length }}\n />\n </h2>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"emptyState\":\"k5mEG\"};","import React from 'react';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport styles from './typeahead-error-state.scss';\n\nconst namespace = 'shared.typeaheadErrorState';\n\ninterface TypeaheadErrorStateProps {\n imageUrl: string;\n onClickTryAgain: () => void;\n}\n\nexport function TypeaheadErrorState(props: TypeaheadErrorStateProps): JSX.Element {\n function onClickComponent(e: React.MouseEvent<HTMLDivElement>): void {\n e.stopPropagation();\n }\n\n function onClickTryAgain(e: React.MouseEvent<HTMLDivElement>): void {\n e.stopPropagation();\n \n props.onClickTryAgain();\n }\n\n return (\n <div className='d-flex flex-column align-items-center text-center' onClick={onClickComponent}>\n <img\n alt=''\n role='presentation'\n src={props.imageUrl}\n className={`pb-2 ${styles.emptyState}`}\n />\n <h2 className='h6'>\n <Text namespace={namespace} phrase='error' />\n </h2>\n <DivButton onClick={onClickTryAgain} className='btn btn-link info-link p-0'>\n <Text namespace={namespace} phrase='tryAgain' />\n </DivButton>\n </div>\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"],"names":["namespace","ClassroomGroupRecipientItemMetadata","props","className","IconCircle","svgName","variant","classroomGroup","metadata","colour","detailsClassName","name","userCount","users","count","classroomName","classroom","LanguageService","smartCount","getSubheading","ClassroomRecipientItemMetadata","Number","isInteger","getPhrase","UserRecipientItemMetadata","Avatar","imageUrl","user","avatar","url","imageCdnUrl","initials","UserHelper","surname","showDisplayName","getSubText","userType","role","UserGroup","UserRole","yearGroup","getRemovePhrase","type","MasterType","RecipientItem","showSpinner","setShowSpinner","removeRecipient","MasterTypeHelper","entity","FunctionHelper","Spinner","as","size","animation","Tooltip","title","typeId","spanHack","onClick","id","WhiteAvatar","style","backgroundImage","getColouredIconClass","selection","iconClass","InputSelectionExpander","colourClass","mapEntityTypeToForegroundColor","isClassroom","canExpand","SvgContainer","hasExpanded","DivButton","onClickExpand","mapEntityTypeToBsVariant","InputSelection","isClassroomGroup","isExpandable","hasMembers","hasFetchedMembers","data","length","setHasExpanded","setCanExpand","colourVariant","map","InputToken","key","hasStudentExperience","onClickRemove","selectionName","hideExpander","TOKENIZED_TYPEAHEAD_SUGGESTIONS_LIMIT","TokenizedTypeahead","hideIcon","selections","s","getInputTokenComponent","removeSelection","fetchSelectionMembers","SearchBar","onBackspace","ArrayHelper","recentSearchHeading","placeholder","searchIconPlacement","clearQueryOnSelect","getSuggestionComponent","suggestion","getEmptyStateComponent","query","TypeaheadEmptyState","emptyStateImageUrl","getErrorStateComponent","onClickTryAgain","TypeaheadErrorState","errorStateImageUrl","theme","container","suggestionsContainerOpen","sectionContainer","sectionTitleClassName","renderSuggestionsOnInputFocus","onSuggestionDependencies","sharePermissionsDescription","defaultProps","debouncedQuery","e","stopPropagation","alt","src","Text","phrase","options","mapColourToBsVariant","groupColour"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[8243],{12699:(e,a,t)=>{t.r(a),t.d(a,{GenerateJoinLinkView:()=>F});var n=t(32735),r=t(98269),l=t(70680),s=t(23481),c=t(97395),i=t(81886),m=t(20354),o=t(74231),d=t(66903),u=t(83345),E=t(16714),p=t(39151),N=t(22902),g=t(37802),v=t(40841),f=t(99742),h=t(14070),S=t(97291),k=t(88630),C=t(23232),b="classrooms.joinLinkEmptyState";function L(){return n.createElement(u.D.Provider,{value:b},n.createElement(C.u,null,n.createElement(C.u.Image,{src:f.W.EmptyStates.Classrooms.NO_STUDENTS_IN_CLASSROOM,size:"small"}),n.createElement(C.u.Heading,null,n.createElement(u.x,{phrase:"heading"}))))}var T=t(20789),x=t(64818);const w={avatarContainer:"NSuhj"};function I(e){var a;return n.createElement("div",{className:"col-3 mb-3"},n.createElement("div",{className:"border border-secondary rounded-3 d-flex p-2 align-items-center"},n.createElement("div",{className:"".concat(w.avatarContainer," flex-shrink-0")},n.createElement(T.q,{imageUrl:null===(a=e.user.avatar)||void 0===a?void 0:a.url,imageCdnUrl:e.imageCdnUrl,initials:x.l.getInitials(e.user.name,e.user.surname)})),n.createElement("div",{className:"text-truncate ms-2"},e.user.name," ",e.user.surname)))}const O={orderedListWithBackground:"Qp_SN",number:"inFpq",joinLinkCode:"ZzTdG",horizontalLineWithText:"GwGiF",primary:"S4GPx"};var _="classrooms.generateJoinLink",U=s.T.encloseNamespace(_),A=15e3;function F(e){var a,t,s,C=(0,l.I0)(),b=(0,(0,N.T)().hasPermissions)(E.C.ManageIntegrations),T=m.a.useBasicFetch(k.F.generateJoinLink(e.classroomId)),x=k.F.getClassroomStudents(e.classroomId),w=m.a.useBasicFetch(x),F=m.a.useBasicFetch(p.L.config()),y=(0,g.r)(null),G=y.shareToGoogleClassroom,W=y.shareToMicrosoftTeams,M=y.isLoadingSettings,R="list"===e.source;return n.useEffect((function(){var e=window.setInterval((function(){m.a.fetch(C,x)}),A);return function(){return window.clearInterval(e)}}),[]),T.data&&w.data&&F.data&&!M?n.createElement(u.D.Provider,{value:_},n.createElement("div",{className:"d-flex px-3 "},n.createElement("h1",{className:"h3 mb-3 flex-fill"},n.createElement(u.x,{phrase:"title"})),n.createElement("div",{className:"flex-fill text-end"},n.createElement(r.Z,{variant:"dark",onClick:function(){R?i.Q.C$.trigger({application:S.O.CLASSROOMS,action:h.e.Classrooms.HOME}):i.Q.C$.trigger({application:S.O.CLASSROOMS,action:h.e.Classrooms.CLASSROOM_STUDENTS,args:[e.classroomId]})}},U(R?"backToList":"backToClassroom")))),n.createElement("div",{className:"px-3"},n.createElement("div",{className:"row mt-1"},n.createElement("div",{className:"col-md-6 col-12"},n.createElement("ol",{className:"mb-4 ".concat(O.orderedListWithBackground)},n.createElement("li",{className:"mb-2"},n.createElement("span",{className:O.number},"1"),U("goToUrl"),n.createElement("span",{className:O.primary},(s=new URL(F.data.primaryUrl).hostname,c._.safeUrlConcat(s,"/join")))),n.createElement("li",null,n.createElement("span",{className:O.number},"2"),U("enterCode"),n.createElement("div",{className:"pt-3 pb-4 ms-4 mt-2 border rounded-3 text-center overflow-hidden fw-semibold ".concat(O.joinLinkCode)},T.data.code))),n.createElement("h2",{className:"border-bottom text-center w-100 mb-4 ".concat(O.horizontalLineWithText)},n.createElement("span",{className:"px-2 fw-normal"},U("or"))),n.createElement("ol",{className:O.orderedListWithBackground},n.createElement("li",{className:"mb-3"},n.createElement("span",{className:O.number},"1"),U("copyLinkAndShare"),n.createElement("div",{className:"d-flex flex-column gap-2 mt-2 ms-4"},n.createElement(d.k,{value:T.data.link}),n.createElement(o.T,{integrations:(a=G,t=W,v._.getShareIntegrations(a,t).filter((function(e){return e.enabled})).map((function(e){return e.id}))),url:T.data.link,appLink:b?{application:S.O.SETTINGS,action:h.e.Settings.INTEGRATIONS}:{application:S.O.DEFAULT,action:h.e.Default.INTEGRATIONS_INFO}}))))),n.createElement("div",{className:"col-md-6 col-12 text-center"},n.createElement("img",{src:f.W.AddStudents.JOIN_LINK,className:"rounded-3 w-75 box-shadow img-fluid my-3"}))),n.createElement("hr",null),n.createElement("div",null,U("studentsWillAppear"),!w.data.data.length&&n.createElement(L,null),n.createElement("div",{className:"row mt-3"},w.data.data.map((function(e){return n.createElement(I,{user:e,key:e.id,imageCdnUrl:F.data.imageCdnUrl})})))))):n.createElement(n.Fragment,null)}}}]);
2
- //# sourceMappingURL=8243-ddaa0ed22d-lite.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/8243-ddaa0ed22d-lite.chunk.js","mappings":"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","sources":["file:///Users/joshua.taylor/Projects/clickview/packages/projects/lite/src/apps/classrooms/views/generate-join-link/empty-state/JoinLinkEmptyState.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/projects/lite/src/apps/classrooms/views/generate-join-link/student-pill/student-pill.scss","file:///Users/joshua.taylor/Projects/clickview/packages/projects/lite/src/apps/classrooms/views/generate-join-link/student-pill/StudentPill.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/projects/lite/src/apps/classrooms/views/generate-join-link/generate-join-link.scss","file:///Users/joshua.taylor/Projects/clickview/packages/projects/lite/src/apps/classrooms/views/generate-join-link/GenerateJoinLinkView.tsx"],"sourcesContent":["import React from 'react';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nconst namespace = 'classrooms.joinLinkEmptyState';\n\nexport function JoinLinkEmptyState(): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.Classrooms.NO_STUDENTS_IN_CLASSROOM} size='small'/>\n <EmptyState.Heading><Text phrase='heading' /></EmptyState.Heading>\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"avatarContainer\":\"NSuhj\"};","import React from 'react';\n\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { User } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from './student-pill.scss';\n\ninterface StudentPillProps {\n user: User;\n imageCdnUrl: string;\n}\n\nexport function StudentPill(props: StudentPillProps): React.ReactElement {\n return (\n <div className='col-3 mb-3'>\n <div className='border border-secondary rounded-3 d-flex p-2 align-items-center'>\n <div className={`${styles.avatarContainer} flex-shrink-0`}>\n <Avatar\n imageUrl={props.user.avatar?.url}\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(props.user.name, props.user.surname)}\n />\n </div>\n <div className='text-truncate ms-2'>{props.user.name} {props.user.surname}</div>\n </div>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"orderedListWithBackground\":\"Qp_SN\",\"number\":\"inFpq\",\"joinLinkCode\":\"ZzTdG\",\"horizontalLineWithText\":\"GwGiF\",\"primary\":\"S4GPx\"};","import React from 'react';\nimport { Button } from 'react-bootstrap';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\n\nimport { ShareIntegrations } from 'libs/shared/apps/share/views/share/components/share-integrations/ShareIntegrations';\nimport { CopyInput } from 'libs/shared/components/copy-input/CopyInput';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { IntegrationId } from 'libs/shared/enums/IntegrationId';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, UserCollection } from 'libs/shared/interfaces';\nimport { IntegrationHelper } from 'libs/shared/utils/IntegrationHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { GenerateClassroomLinkResponse } from 'apps/classrooms/interfaces/GenerateClassroomLinkResponse';\nimport { JoinLinkEmptyState } from 'apps/classrooms/views/generate-join-link/empty-state/JoinLinkEmptyState';\nimport { StudentPill } from 'apps/classrooms/views/generate-join-link/student-pill/StudentPill';\n\nimport styles from './generate-join-link.scss';\n\nconst namespace = 'classrooms.generateJoinLink';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst POLLING_INTERVAL = 15000; // 15s\n\nexport interface GenerateJoinLinkViewQueryParams {\n source?: 'list';\n}\n\ninterface GenerateJoinLinkViewProps extends GenerateJoinLinkViewQueryParams{\n classroomId: string;\n}\n\nexport function GenerateJoinLinkView(props: GenerateJoinLinkViewProps): React.ReactElement {\n const dispatch = useDispatch();\n\n const { hasPermissions } = usePermissions();\n const hasManageIntegrationsPermission = hasPermissions(PermissionName.ManageIntegrations);\n\n const joinLink = Flight.useBasicFetch<GenerateClassroomLinkResponse>(\n ClassroomRequests.generateJoinLink(props.classroomId)\n );\n\n const getClassroomStudentsRequest = ClassroomRequests.getClassroomStudents(props.classroomId);\n const students = Flight.useBasicFetch<UserCollection>(getClassroomStudentsRequest);\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const { shareToGoogleClassroom, shareToMicrosoftTeams, isLoadingSettings } = useSettings(null);\n\n const isFromList = props.source === 'list';\n\n function backToClassroom(): void {\n if (isFromList) {\n Core.AppLinkHelper.trigger({\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.HOME\n });\n return;\n }\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.CLASSROOMS,\n // TODO: Change to classroom overview\n action: Actions.Classrooms.CLASSROOM_STUDENTS,\n args: [props.classroomId]\n });\n }\n \n function getEnabledIntegrations(googleClassroomSetting: boolean, msftTeamsSetting: boolean): IntegrationId[] {\n const integrations = IntegrationHelper.getShareIntegrations(googleClassroomSetting, msftTeamsSetting);\n return integrations.filter(i => i.enabled).map(i => i.id);\n }\n\n React.useEffect(() => {\n const interval = window.setInterval(() => {\n Flight.fetch(dispatch, getClassroomStudentsRequest);\n }, POLLING_INTERVAL);\n \n return () => window.clearInterval(interval);\n }, []);\n\n function getJoinUrl(): string {\n const url = new URL(config.data.primaryUrl).hostname;\n\n return UrlHelper.safeUrlConcat(url, '/join');\n }\n\n if (!joinLink.data || !students.data || !config.data || isLoadingSettings)\n return <></>;\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <div className='d-flex px-3 '>\n <h1 className='h3 mb-3 flex-fill'><Text phrase='title' /></h1>\n <div className='flex-fill text-end'>\n <Button variant='dark' onClick={backToClassroom}>\n {getPhrase(isFromList ? 'backToList' : 'backToClassroom')}\n </Button>\n </div>\n </div>\n <div className='px-3'>\n <div className='row mt-1'>\n <div className='col-md-6 col-12'>\n <ol className={`mb-4 ${styles.orderedListWithBackground}`}>\n <li className='mb-2'>\n <span className={styles.number}>1</span>\n {getPhrase('goToUrl')}\n <span className={styles.primary}>{getJoinUrl()}</span>\n </li>\n <li>\n <span className={styles.number}>2</span>\n {getPhrase('enterCode')}\n <div className={`pt-3 pb-4 ms-4 mt-2 border rounded-3 text-center overflow-hidden fw-semibold ${styles.joinLinkCode}`}>\n {joinLink.data.code}\n </div>\n </li>\n </ol>\n <h2 className={`border-bottom text-center w-100 mb-4 ${styles.horizontalLineWithText}`}>\n <span className='px-2 fw-normal'>{getPhrase('or')}</span>\n </h2>\n <ol className={styles.orderedListWithBackground}>\n <li className='mb-3'>\n <span className={styles.number}>1</span>\n {getPhrase('copyLinkAndShare')}\n <div className='d-flex flex-column gap-2 mt-2 ms-4'>\n <CopyInput value={joinLink.data.link} />\n <ShareIntegrations\n integrations={getEnabledIntegrations(shareToGoogleClassroom, shareToMicrosoftTeams)}\n url={joinLink.data.link}\n appLink={hasManageIntegrationsPermission ? {\n application: AppChannels.SETTINGS,\n action: Actions.Settings.INTEGRATIONS\n } : {\n application: AppChannels.DEFAULT,\n action: Actions.Default.INTEGRATIONS_INFO\n }}\n />\n </div>\n </li>\n </ol>\n </div>\n <div className='col-md-6 col-12 text-center'>\n <img src={ImageUrls.AddStudents.JOIN_LINK} className='rounded-3 w-75 box-shadow img-fluid my-3' />\n </div>\n </div>\n <hr />\n <div>\n {getPhrase('studentsWillAppear')}\n {!students.data.data.length && <JoinLinkEmptyState />}\n <div className='row mt-3'>\n {students.data.data.map(s => <StudentPill user={s} key={s.id} imageCdnUrl={config.data.imageCdnUrl} />)}\n </div>\n </div>\n </div>\n </LanguageNamespaceContext.Provider>\n );\n}"],"names":["namespace","JoinLinkEmptyState","value","EmptyState","src","ImageUrls","size","Text","phrase","StudentPill","props","className","Avatar","imageUrl","user","avatar","url","imageCdnUrl","initials","UserHelper","name","surname","getPhrase","LanguageService","POLLING_INTERVAL","GenerateJoinLinkView","googleClassroomSetting","msftTeamsSetting","dispatch","hasManageIntegrationsPermission","hasPermissions","usePermissions","PermissionName","joinLink","ClassroomRequests","classroomId","getClassroomStudentsRequest","students","config","ConfigRequests","useSettings","shareToGoogleClassroom","shareToMicrosoftTeams","isLoadingSettings","isFromList","source","interval","window","setInterval","clearInterval","data","Button","variant","onClick","application","action","args","URL","primaryUrl","hostname","UrlHelper","code","CopyInput","link","ShareIntegrations","integrations","IntegrationHelper","filter","i","enabled","map","id","appLink","length","s","key"],"sourceRoot":""}