@clickview/lite 0.75.0-rc.8 → 0.75.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundles.json +1 -1
- package/dist/css/{7103-lite-fef3024f61.chunk.css → 2878-lite-d8e0bf912a.chunk.css} +1 -1
- package/dist/css/{1243-lite-13eda8f6a0.chunk.css → 3615-lite-240342ff8e.chunk.css} +1 -1
- package/dist/css/{1867-lite-8baa8af02b.chunk.css → 4630-lite-0157b1c437.chunk.css} +1 -1
- package/dist/css/{4203-lite-9ffab89741.chunk.css → 8362-lite-10810fdef2.chunk.css} +1 -1
- package/dist/languages/en.json +1 -1
- package/dist/scripts/{104-7ee25cbbb8-lite.chunk.js → 104-da7394bcfa-lite.chunk.js} +2 -2
- package/dist/scripts/104-da7394bcfa-lite.chunk.js.map +1 -0
- package/dist/scripts/1192-bb27568f21-lite.chunk.js +2 -0
- package/dist/scripts/1192-bb27568f21-lite.chunk.js.map +1 -0
- package/dist/scripts/1199-cf2cb206b5-lite.chunk.js +2 -0
- package/dist/scripts/1199-cf2cb206b5-lite.chunk.js.map +1 -0
- package/dist/scripts/1502-9836df10cd-lite.chunk.js +2 -0
- package/dist/scripts/1502-9836df10cd-lite.chunk.js.map +1 -0
- package/dist/scripts/{1610-9ccecc428a-lite.chunk.js → 1610-0edaa98d40-lite.chunk.js} +2 -2
- package/dist/scripts/{1610-9ccecc428a-lite.chunk.js.map → 1610-0edaa98d40-lite.chunk.js.map} +1 -1
- package/dist/scripts/{7103-3b181ec69b-lite.chunk.js → 2878-487c4a8e1a-lite.chunk.js} +2 -2
- package/dist/scripts/2878-487c4a8e1a-lite.chunk.js.map +1 -0
- package/dist/scripts/{3057-1ae8087b3a-lite.chunk.js → 3057-a5bc753736-lite.chunk.js} +1 -1
- package/dist/scripts/{3057-1ae8087b3a-lite.chunk.js.map → 3057-a5bc753736-lite.chunk.js.map} +1 -1
- package/dist/scripts/3268-7be966dc82-lite.chunk.js +3 -0
- package/dist/scripts/3268-7be966dc82-lite.chunk.js.map +1 -0
- package/dist/scripts/{1243-72f3d31787-lite.chunk.js → 3615-a0da361aa5-lite.chunk.js} +2 -2
- package/dist/scripts/3615-a0da361aa5-lite.chunk.js.map +1 -0
- package/dist/scripts/{3872-6fe7371d39-lite.chunk.js → 3872-cf9a6bdae8-lite.chunk.js} +1 -1
- package/dist/scripts/{3872-6fe7371d39-lite.chunk.js.map → 3872-cf9a6bdae8-lite.chunk.js.map} +1 -1
- package/dist/scripts/4125-6d34b8b8f2-lite.chunk.js +2 -0
- package/dist/scripts/4125-6d34b8b8f2-lite.chunk.js.map +1 -0
- package/dist/scripts/4208-f22ed7a148-lite.chunk.js +2 -0
- package/dist/scripts/4208-f22ed7a148-lite.chunk.js.map +1 -0
- package/dist/scripts/4598-e25e9e03d6-lite.chunk.js +2 -0
- package/dist/scripts/4598-e25e9e03d6-lite.chunk.js.map +1 -0
- package/dist/scripts/{1867-0823a787c3-lite.chunk.js → 4630-4a35ecbf2b-lite.chunk.js} +2 -2
- package/dist/scripts/4630-4a35ecbf2b-lite.chunk.js.map +1 -0
- package/dist/scripts/6475-f019242ec2-lite.chunk.js +2 -0
- package/dist/scripts/6475-f019242ec2-lite.chunk.js.map +1 -0
- package/dist/scripts/6550-1d60d863e8-lite.chunk.js +2 -0
- package/dist/scripts/6550-1d60d863e8-lite.chunk.js.map +1 -0
- package/dist/scripts/{6695-4e01b4a18c-lite.chunk.js → 6695-4ae0acad94-lite.chunk.js} +1 -1
- package/dist/scripts/{6695-4e01b4a18c-lite.chunk.js.map → 6695-4ae0acad94-lite.chunk.js.map} +1 -1
- package/dist/scripts/6756-3c7f911759-lite.chunk.js +3 -0
- package/dist/scripts/6756-3c7f911759-lite.chunk.js.map +1 -0
- package/dist/scripts/6790-1695fcf576-lite.chunk.js +2 -0
- package/dist/scripts/6790-1695fcf576-lite.chunk.js.map +1 -0
- package/dist/scripts/{7148-50ccb48a44-lite.chunk.js → 7148-e314dd9a4e-lite.chunk.js} +2 -2
- package/dist/scripts/7148-e314dd9a4e-lite.chunk.js.map +1 -0
- package/dist/scripts/7438-35b887a48e-lite.chunk.js +2 -0
- package/dist/scripts/7438-35b887a48e-lite.chunk.js.map +1 -0
- package/dist/scripts/{8323-d6d1d07ce5-lite.chunk.js → 8323-5694456903-lite.chunk.js} +2 -2
- package/dist/scripts/{8323-d6d1d07ce5-lite.chunk.js.map → 8323-5694456903-lite.chunk.js.map} +1 -1
- package/dist/scripts/{4203-83f90f92f3-lite.chunk.js → 8362-ed5df8f4fc-lite.chunk.js} +3 -3
- package/dist/scripts/8362-ed5df8f4fc-lite.chunk.js.LICENSE.txt +1 -0
- package/dist/scripts/{4203-83f90f92f3-lite.chunk.js.map → 8362-ed5df8f4fc-lite.chunk.js.map} +1 -1
- package/dist/scripts/{8732-3e8332e620-lite.chunk.js → 8732-dc5182fb69-lite.chunk.js} +1 -1
- package/dist/scripts/{8732-3e8332e620-lite.chunk.js.map → 8732-dc5182fb69-lite.chunk.js.map} +1 -1
- package/dist/scripts/8856-08061bbec5-lite.chunk.js +2 -0
- package/dist/scripts/8856-08061bbec5-lite.chunk.js.map +1 -0
- package/dist/scripts/{8957-bc83ea1180-lite.chunk.js → 8957-b3f0dbb85d-lite.chunk.js} +1 -1
- package/dist/scripts/{8957-bc83ea1180-lite.chunk.js.map → 8957-b3f0dbb85d-lite.chunk.js.map} +1 -1
- package/dist/scripts/9042-7c30ffd4f0-lite.chunk.js +2 -0
- package/dist/scripts/9042-7c30ffd4f0-lite.chunk.js.map +1 -0
- package/dist/scripts/9134-b0ae877597-lite.chunk.js +2 -0
- package/dist/scripts/9134-b0ae877597-lite.chunk.js.map +1 -0
- package/dist/scripts/{bundle-58c25f6529.min.js → bundle-941a464ef0.min.js} +3 -3
- package/dist/scripts/{bundle-58c25f6529.min.js.map → bundle-941a464ef0.min.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/104-7ee25cbbb8-lite.chunk.js.map +0 -1
- package/dist/scripts/1074-6dadbd8187-lite.chunk.js +0 -2
- package/dist/scripts/1074-6dadbd8187-lite.chunk.js.map +0 -1
- package/dist/scripts/1192-6ac54d734b-lite.chunk.js +0 -2
- package/dist/scripts/1192-6ac54d734b-lite.chunk.js.map +0 -1
- package/dist/scripts/1199-1cddf4e0e0-lite.chunk.js +0 -2
- package/dist/scripts/1199-1cddf4e0e0-lite.chunk.js.map +0 -1
- package/dist/scripts/1243-72f3d31787-lite.chunk.js.map +0 -1
- package/dist/scripts/1867-0823a787c3-lite.chunk.js.map +0 -1
- package/dist/scripts/3268-aa893d0068-lite.chunk.js +0 -2
- package/dist/scripts/3268-aa893d0068-lite.chunk.js.map +0 -1
- package/dist/scripts/4208-3ba21abb7c-lite.chunk.js +0 -2
- package/dist/scripts/4208-3ba21abb7c-lite.chunk.js.map +0 -1
- package/dist/scripts/4598-f5120153c2-lite.chunk.js +0 -2
- package/dist/scripts/4598-f5120153c2-lite.chunk.js.map +0 -1
- package/dist/scripts/6475-502e390010-lite.chunk.js +0 -2
- package/dist/scripts/6475-502e390010-lite.chunk.js.map +0 -1
- package/dist/scripts/6550-c621babbcb-lite.chunk.js +0 -2
- package/dist/scripts/6550-c621babbcb-lite.chunk.js.map +0 -1
- package/dist/scripts/6756-20c0ab9591-lite.chunk.js +0 -3
- package/dist/scripts/6756-20c0ab9591-lite.chunk.js.map +0 -1
- package/dist/scripts/6790-df00506bec-lite.chunk.js +0 -2
- package/dist/scripts/6790-df00506bec-lite.chunk.js.map +0 -1
- package/dist/scripts/7103-3b181ec69b-lite.chunk.js.map +0 -1
- package/dist/scripts/7148-50ccb48a44-lite.chunk.js.map +0 -1
- package/dist/scripts/7438-1162aba8b6-lite.chunk.js +0 -2
- package/dist/scripts/7438-1162aba8b6-lite.chunk.js.map +0 -1
- package/dist/scripts/8856-8ac95bf4e0-lite.chunk.js +0 -2
- package/dist/scripts/8856-8ac95bf4e0-lite.chunk.js.map +0 -1
- package/dist/scripts/9003-36ab592cc5-lite.chunk.js +0 -2
- package/dist/scripts/9003-36ab592cc5-lite.chunk.js.map +0 -1
- package/dist/scripts/9042-3092af11d5-lite.chunk.js +0 -2
- package/dist/scripts/9042-3092af11d5-lite.chunk.js.map +0 -1
- package/dist/scripts/9134-7037c2c47a-lite.chunk.js +0 -2
- package/dist/scripts/9134-7037c2c47a-lite.chunk.js.map +0 -1
- /package/dist/scripts/{4203-83f90f92f3-lite.chunk.js.LICENSE.txt → 3268-7be966dc82-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{6756-20c0ab9591-lite.chunk.js.LICENSE.txt → 6756-3c7f911759-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{8323-d6d1d07ce5-lite.chunk.js.LICENSE.txt → 8323-5694456903-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{bundle-58c25f6529.min.js.LICENSE.txt → bundle-941a464ef0.min.js.LICENSE.txt} +0 -0
package/dist/scripts/{8957-bc83ea1180-lite.chunk.js.map → 8957-b3f0dbb85d-lite.chunk.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/8957-bc83ea1180-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-actions-wizard/header/back-buttons/BulkUserUploadBackButton.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-actions-wizard/header/continue-buttons/BulkUserUploadContinueButton.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-upload/layout/bulk-user-upload-wizard-layout.scss","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-upload/layout/BulkUserUploadWizardLayout.tsx","file:///app/packages/libs/shared/src/apps/user-manager/context/UserManagerClientContext.ts","file:///app/packages/libs/shared/src/apps/user-manager/hooks/useBulkUploadUsers.ts","file:///app/packages/libs/shared/src/apps/user-manager/interfaces/viewmodels/BulkUserActionsViewModel.ts","file:///app/packages/libs/shared/src/apps/user-manager/utils/BulkUserActionsAnalyticsHelper.ts","file:///app/packages/libs/shared/src/components/wizard/header/WizardHeader.tsx","file:///app/packages/libs/shared/src/components/wizard/object-list/ObjectList.tsx","file:///app/packages/libs/shared/src/components/wizard/status/statuses/completed-with-error/WizardCompletedWithError.tsx","file:///app/packages/libs/shared/src/components/wizard/status/statuses/failed/wizard-failed.scss","file:///app/packages/libs/shared/src/components/wizard/status/statuses/failed/WizardFailed.tsx","file:///app/packages/libs/shared/src/components/wizard/status/statuses/succeeded/wizard-succeeded.scss","file:///app/packages/libs/shared/src/components/wizard/status/statuses/succeeded/WizardSucceeded.tsx","file:///app/packages/libs/shared/src/enums/BatchJobResultStatus.ts","file:///app/packages/libs/shared/src/components/wizard/status/completed/WizardCompleted.tsx","file:///app/packages/libs/shared/src/hooks/useErroredBulkActions.ts","file:///app/packages/libs/shared/src/components/wizard/step-list/WizardStepList.tsx","file:///app/packages/libs/shared/src/enums/BatchJobStatus.ts","file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/hooks/UseHandleObjectError.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteScroll.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteList.ts","file:///app/packages/projects/lite/src/apps/user-manager/views/bulk-user-upload/status/complete/BulkUserUploadStatusCompleteView.tsx","file:///app/packages/projects/lite/src/shared/flight-requests/JobRequests.ts"],"sourcesContent":["import React from 'react';\n\nimport { BulkUserUploadStepId } from 'libs/shared/apps/user-manager/components/bulk-upload/layout/BulkUserUploadWizardLayout';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'userManager.userWizardBackButtons';\n\ninterface BulkUserUploadBackButtonProps {\n currentStep: BulkUserUploadStepId;\n appLinks: UserManagerAppLinks;\n}\n\nexport function BulkUserUploadBackButton(props: BulkUserUploadBackButtonProps): JSX.Element {\n if (props.currentStep === 'status')\n return <></>;\n\n return (\n <AppLink\n className='btn btn-link me-2'\n appLink={props.appLinks.userManager}\n >\n <Text namespace={namespace} phrase='cancel' />\n </AppLink>\n );\n}","import React from 'react';\nimport { Button } from 'react-bootstrap';\n\nimport { ContextService } from 'libs/analytics/services/ContextService';\n\nimport { BulkUserUploadStepId } from 'libs/shared/apps/user-manager/components/bulk-upload/layout/BulkUserUploadWizardLayout';\nimport { useBulkUploadUsers } from 'libs/shared/apps/user-manager/hooks/useBulkUploadUsers';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardLayoutContext } from 'libs/shared/context/WizardLayoutContext';\n\nconst namespace = 'userManager.userWizardHeader';\n\ninterface BulkUserUploadContinueButtonProps {\n currentStep: BulkUserUploadStepId;\n appLinks: UserManagerAppLinks;\n canAddExistingUsers: boolean;\n}\n\nexport function BulkUserUploadContinueButton(props: BulkUserUploadContinueButtonProps): JSX.Element {\n const { duplicateSets, hasExistingUsers } = useBulkUploadUsers();\n const { disableNext, onClickConfirm } = React.useContext(WizardLayoutContext);\n\n const spreadsheetHasDuplicates = !!duplicateSets?.length;\n\n const currentAppLink = ContextService.getCurrentContext().appLink;\n\n if (currentAppLink.action === props.appLinks.userUploadStatus.polling.action)\n return <></>;\n\n // we hide the button cuz we have one in the success component\n if (currentAppLink.action === props.appLinks.userUploadStatus.complete.action)\n return <></>;\n\n function willUploadOnNext(): boolean {\n switch (currentAppLink.action) {\n case props.appLinks.userUploadPopup.action:\n case props.appLinks.userUploadReviewAccounts.action:\n return !spreadsheetHasDuplicates && !hasExistingUsers;\n\n case props.appLinks.userUploadFixDuplicates.action:\n return !hasExistingUsers;\n\n case props.appLinks.userUploadReviewExistingAccounts.action:\n return !hasExistingUsers;\n\n default:\n return true;\n }\n }\n\n if (willUploadOnNext()) {\n return (\n <Button\n className={disableNext ? 'disabled' : ''}\n variant='dark'\n onClick={onClickConfirm}\n disabled={disableNext}\n >\n <Text\n namespace={namespace}\n phrase='create'\n />\n </Button>\n );\n }\n\n function getNextAppLink() {\n switch (currentAppLink.action) {\n case props.appLinks.userUploadReviewAccounts.action:\n if (spreadsheetHasDuplicates)\n return props.appLinks.userUploadFixDuplicates;\n if (hasExistingUsers && props.canAddExistingUsers)\n return props.appLinks.userUploadReviewExistingAccounts;\n\n case props.appLinks.userUploadFixDuplicates.action:\n if (hasExistingUsers && props.canAddExistingUsers)\n return props.appLinks.userUploadReviewExistingAccounts;\n\n case props.appLinks.userUploadReviewExistingAccounts.action:\n if (props.canAddExistingUsers)\n return props.appLinks.userUploadConfirmation;\n\n default:\n return null;\n }\n }\n\n return (\n <AppLink\n className={`btn btn-dark ${disableNext ? 'disabled' : ''}`}\n appLink={getNextAppLink()}\n disabled={disableNext}\n >\n <Text\n namespace={namespace}\n phrase='next'\n />\n </AppLink>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"wizardContent\":\"hHr3C\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { BulkUserUploadBackButton } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/header/back-buttons/BulkUserUploadBackButton';\nimport { BulkUserUploadContinueButton } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/header/continue-buttons/BulkUserUploadContinueButton';\nimport { useBulkUploadUsers } from 'libs/shared/apps/user-manager/hooks/useBulkUploadUsers';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { BulkUserUploadHelper } from 'libs/shared/apps/user-manager/utils/BulkUserUploadHelper';\nimport { WizardHeader } from 'libs/shared/components/wizard/header/WizardHeader';\nimport { WizardStepList } from 'libs/shared/components/wizard/step-list/WizardStepList';\nimport { WizardLayoutContextProvider } from 'libs/shared/context/WizardLayoutContext';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { useNavLock } from 'libs/shared/hooks/useNavLock';\n\nimport styles from './bulk-user-upload-wizard-layout.scss';\n\nexport type BulkUserUploadStepId = 'review-accounts' | 'fix-duplicates' | 'review-existing-accounts' | 'confirmation' |'status';\n\nconst namespace = 'userManager.bulkUserUploadWizardLayout';\nexport const BULK_USER_UPLOAD_NAV_LOCK_ID = 'bulk:user:upload:nav:lock';\n\ntype BulkUserUploadWizardLayoutProps = React.PropsWithChildren<{\n appLinks: UserManagerAppLinks;\n userType: UserGroup;\n currentStep: BulkUserUploadStepId;\n canAddExistingUsers?: boolean;\n}>;\n\nexport function BulkUserUploadWizardLayout(props: BulkUserUploadWizardLayoutProps): JSX.Element {\n const { users, setUsers } = useBulkUploadUsers();\n\n const navLock = useNavLock();\n\n React.useEffect(() => {\n // If there is no view model, redirect away\n if (!users) {\n Core.AppLinkHelper.trigger(props.appLinks.userManager, { replace: true });\n return;\n }\n\n navLock.lock({\n id: BULK_USER_UPLOAD_NAV_LOCK_ID,\n title: LanguageService.getPhrase(namespace, 'navLockTitle'),\n text: LanguageService.getPhrase(namespace, 'navLockBody'),\n appLinkWhitelist: BulkUserUploadHelper.getWizardAppLinks(props.appLinks),\n onConfirmUnlock: () => {\n setUsers(null);\n }\n });\n\n return () => {\n navLock.unlock(BULK_USER_UPLOAD_NAV_LOCK_ID);\n };\n }, []);\n\n React.useEffect(() => {\n if (users?.length)\n return;\n\n navLock.unlock(BULK_USER_UPLOAD_NAV_LOCK_ID);\n Core.AppLinkHelper.trigger(props.appLinks.userManager, { replace: true });\n }, [users?.length]);\n\n if (!users)\n return <></>;\n\n return (\n <WizardLayoutContextProvider>\n <div className='px-3'>\n <WizardHeader<BulkUserUploadStepId>\n title={LanguageService.getPhrase(namespace, 'bulkUpload')}\n currentStep={props.currentStep}\n loaded\n continueButton={\n <BulkUserUploadContinueButton\n currentStep={props.currentStep}\n appLinks={props.appLinks}\n canAddExistingUsers={props.canAddExistingUsers}\n />\n }\n backButton={<BulkUserUploadBackButton currentStep={props.currentStep} appLinks={props.appLinks} />}\n breadcrumbs={[\n {\n name: LanguageService.getPhrase(namespace, 'settingsBreadcrumb'),\n appLink: props.appLinks.settings\n },\n {\n name: LanguageService.getPhrase(namespace, props.userType === UserGroup.Learner ? 'studentManager' : 'staffManager'),\n appLink: props.appLinks.userManager\n },\n {\n name: LanguageService.getPhrase(namespace, 'bulkUpload'),\n active: true\n }\n ]}\n />\n\n <div className='row g-0'>\n <div className='col-2'>\n <WizardStepList<BulkUserUploadStepId>\n steps={BulkUserUploadHelper.getSteps(props.userType, props.canAddExistingUsers)}\n currentStep={props.currentStep}\n />\n </div>\n\n <div className={`col-10 ${styles.wizardContent}`}>\n {props.children}\n </div>\n </div>\n </div>\n </WizardLayoutContextProvider>\n );\n}","import React from 'react';\n\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\n\nexport const UserManagerClientContext = React.createContext<UserManagerClient>(null);","import { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\n\nimport { EditUserRequest } from '../interfaces';\nimport { BulkUserUploadViewModel, UserHash } from '../interfaces/viewmodels/BulkUserUploadViewModel';\nimport { UserManagerHelper } from '../utils/UserManagerHelper';\n\nfunction updateUserHash(userHash: UserHash, updatedUserIdsHash: HashObject<boolean>): UserHash {\n const updatedUsers = Object.keys(userHash || {}).reduce((updatedObj: UserHash, lookupId) => {\n if (!updatedUserIdsHash[lookupId])\n updatedObj[lookupId] = userHash[lookupId];\n return updatedObj;\n }, {});\n\n return updatedUsers;\n}\n\nexport const useBulkUploadUsers = () => {\n const [ viewModel, setViewModel ] = useViewModel<BulkUserUploadViewModel>(SharedViewModelKeys.BULK_USER_UPLOAD);\n\n function initializeUsers(users?: EditUserRequest[]): void {\n setViewModel({\n users,\n invalidUsers: null,\n existingUsersHash: null\n });\n\n updateDuplicates(users);\n }\n\n function updateUser(updatedUser: EditUserRequest): void {\n const updatedUsers = viewModel.users.map(user => {\n if (user.lookupId !== updatedUser.lookupId)\n return user;\n\n return updatedUser;\n });\n\n setViewModel({\n users: updatedUsers,\n invalidUsers: updateUserHash(viewModel?.invalidUsers, { [updatedUser.lookupId]: true }),\n existingUsersHash: viewModel?.existingUsersHash\n });\n\n updateDuplicates(updatedUsers);\n }\n\n function deleteUsers(deletedUsers: string[]): void {\n const userIdHash = deletedUsers.reduce((prev: HashObject, curr) => {\n prev[curr] = true;\n return prev;\n }, {});\n\n const updatedUsers = viewModel.users.filter(user => !userIdHash[user.lookupId]);\n\n setViewModel({\n users: updatedUsers,\n invalidUsers: updateUserHash(viewModel?.invalidUsers, userIdHash),\n existingUsersHash: updateUserHash(viewModel?.existingUsersHash, userIdHash),\n existingUserToAdd: viewModel?.existingUserToAdd?.filter(u => !!viewModel?.existingUsersHash[u.lookupId])\n });\n\n updateDuplicates(updatedUsers);\n }\n\n function updateDuplicates(users?: EditUserRequest[]): void {\n const duplicateSets = UserManagerHelper.getNewDuplicates(users);\n setViewModel('duplicateSets', duplicateSets);\n }\n\n return {\n users: viewModel?.users,\n invalidUsers: viewModel?.invalidUsers,\n hasValidatedUsers: !!viewModel?.invalidUsers,\n existingUsersHash: viewModel?.existingUsersHash || {},\n hasExistingUsers: !!Object.keys(viewModel?.existingUsersHash || {}).length,\n existingUserToAdd: viewModel?.existingUserToAdd,\n duplicateSets: viewModel?.duplicateSets,\n newUsers: viewModel?.users?.filter(u => !viewModel?.existingUsersHash?.[u.lookupId]) || [],\n\n setUsers: initializeUsers,\n setInvalidUsers: (invalidUsers: UserHash) => setViewModel('invalidUsers', invalidUsers),\n setExistingUsers: (existingUsers: UserHash) => setViewModel('existingUsersHash', existingUsers),\n updateUser,\n deleteUsers\n };\n};","import { Classroom, YearGroup } from 'libs/shared/interfaces';\n\nimport { BulkUserActionOptions, BulkUserSubAction } from '../../components/bulk-actions-wizard/layout/BulkUserActionsWizardLayout';\nimport { UserManagerQueryParams } from '../query-params/UserManagerQueryParams';\n\n// Please keep this array up to date with the interface below, so that the data we log to analytics remains accurate\nexport const BaseBulkUserActionsViewModelKeys: Array<keyof BulkUserActionsViewModel> = [\n 'userIdMap', 'params', 'action', 'subAction', 'allUsersSelected', 'allUsersCount', 'scrollContainer'\n];\n\nexport interface BulkUserActionsViewModel {\n userIdMap?: Map<string, boolean>;\n params?: UserManagerQueryParams;\n\n action?: BulkUserActionOptions; // TODO: Rename this to \"actionCategory\"\n subAction?: BulkUserSubAction; // TODO: Rename this to \"action\"\n\n // Used to determine if we can show year level rollover\n allUsersSelected?: boolean;\n allUsersCount?: number;\n scrollContainer?: HTMLElement;\n}\n\nexport interface BulkUserActionsYearGroupRolloverViewModel extends BulkUserActionsViewModel {\n yearGroup: YearGroup;\n}\n\nexport interface BulkUserActionsAddToClassroomViewModel extends BulkUserActionsViewModel {\n classroom: Classroom;\n}\n\nexport interface BulkUserActionsResetPasswordViewModel extends BulkUserActionsViewModel {\n password: string;\n changeOnNextLogin: boolean;\n}","import { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { BatchJobStatus } from 'libs/shared/enums/BatchJobStatus';\n\nimport { BulkUserActionStepId } from '../components/bulk-actions-wizard/layout/BulkUserActionsWizardLayout';\nimport { BaseBulkUserActionsViewModelKeys, BulkUserActionsViewModel } from '../interfaces/viewmodels/BulkUserActionsViewModel';\n\nexport const BulkUserActionsAnalyticsHelper = {\n getAnalyticsActionName(viewModel: BulkUserActionsViewModel): string | null {\n if (!viewModel?.action)\n return null;\n\n switch (viewModel.action) {\n case 'activation': {\n if (!viewModel?.subAction)\n return 'Deactivate / reactivate';\n\n if (viewModel.subAction === 'deactivate')\n return 'Deactivate';\n\n return 'Reactivate';\n }\n case 'addToClassroom':\n return 'Add to classroom';\n case 'changeYearGroup':\n return 'Change year level';\n case 'delete':\n return 'Delete user';\n case 'resetEmail':\n return 'Send password reset email';\n case 'activationEmail':\n return 'Send account activation email';\n case 'resetPassword':\n return 'Reset password';\n case 'yearGroupRollover':\n return 'Annual year level rollover';\n case 'removeFromSchool':\n return 'Remove user';\n default:\n return null;\n }\n },\n\n onClickNext(viewModel: BulkUserActionsViewModel, currentStep: BulkUserActionStepId): void {\n if (!viewModel)\n return;\n\n const analyticsData: HashObject = {\n userCount: viewModel.userIdMap.size,\n step: currentStep\n };\n\n const actionName = BulkUserActionsAnalyticsHelper.getAnalyticsActionName(viewModel);\n\n if (actionName)\n analyticsData.action = actionName;\n\n const actionData = ObjectHelper.omit(viewModel, BaseBulkUserActionsViewModelKeys);\n\n // Adds extra items like the `yearGroup` on year level actions or `password` on the reset pw action\n if (Object.keys(actionData).length)\n analyticsData.actionData = actionData;\n\n AnalyticsHelper.logUserAction(analyticsData, {\n location: LocationContext.BulkUserActionsWizard,\n workflowPhase: WorkflowPhase.Next,\n actionType: UserAction.BulkAction,\n entity: EntityType.User\n });\n },\n\n logYearGroupRolloverEntry(location: LocationContext): void {\n AnalyticsHelper.logUserAction({\n action: BulkUserActionsAnalyticsHelper.getAnalyticsActionName({ action: 'yearGroupRollover' })\n }, {\n entity: EntityType.User,\n actionType: UserAction.BulkAction,\n workflowPhase: WorkflowPhase.Start,\n location\n });\n },\n\n getJobStatus(status: BatchJobStatus): string | null {\n switch (status) {\n case BatchJobStatus.Completed:\n return 'Success';\n case BatchJobStatus.CompletedWithError:\n return 'Completed with some errors';\n case BatchJobStatus.Failed:\n return 'Failed';\n default:\n return null;\n }\n }\n};","import React from 'react';\n\nimport { Breadcrumb, Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { WizardLayoutContext } from 'libs/shared/context/WizardLayoutContext';\n\ninterface WizardHeaderProps<TStepId> {\n currentStep: TStepId;\n title: string;\n continueButton: JSX.Element;\n backButton: JSX.Element;\n breadcrumbs?: Breadcrumb[];\n hideHeader?: boolean;\n loaded: boolean;\n}\n\nexport function WizardHeader<TStepId>(props: WizardHeaderProps<TStepId>): JSX.Element {\n const { showButtons } = React.useContext(WizardLayoutContext);\n\n return (\n <div className='d-flex justify-content-between'>\n {!props.hideHeader ? (\n <div>\n <h1 className='h2'>{props.title}</h1>\n\n {props.breadcrumbs &&\n <div className='pb-3'>\n <Breadcrumbs breadcrumbs={props.breadcrumbs} />\n </div>\n }\n </div>\n ) : <div/>}\n\n {props.loaded && showButtons && (\n <div className='d-flex align-items-center'>\n {props.backButton}\n {props.continueButton}\n </div>\n )}\n </div>\n );\n}","import React from 'react';\n\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { BaseObject } from 'libs/shared/interfaces';\n\ninterface ObjectListProps<T extends BaseObject = BaseObject> {\n objects: T[];\n objectType: MasterType;\n childComponent: (props: BaseObjectItemProps<T>) => JSX.Element;\n}\n\nexport interface BaseObjectItemProps<T extends BaseObject = BaseObject> {\n object: T;\n objectType: MasterType;\n}\n\nexport function ObjectList<T extends BaseObject = BaseObject>(props: ObjectListProps<T>): JSX.Element {\n const ChildComponent = props.childComponent;\n\n return (\n <ul className='m-0 list-unstyled striped-list'>\n {props.objects.map(object => {\n return (\n <ChildComponent\n key={object.id}\n object={object}\n objectType={props.objectType}\n />\n );\n })}\n </ul>\n );\n}","import React from 'react';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { ObjectList } from 'libs/shared/components/wizard/object-list/ObjectList';\nimport { BatchJobResultErrorCode } from 'libs/shared/enums/BatchJobResultErrorCode';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { BaseObject, CurrentUser, WizardActionVerb } from 'libs/shared/interfaces';\n\nexport type ObjectWithErrorCode<TObject extends BaseObject> = TObject & {\n errorCode: BatchJobResultErrorCode;\n}\n\nexport interface WizardErrorActionButton<TObject = BaseObject> {\n onClick: (erroredObject: ObjectWithErrorCode<TObject>[]) => void;\n text: string;\n}\n\nconst namespace = 'userManager.wizardCompletedWithError';\n\ninterface WizardCompletedWithErrorProps<TObject> {\n erroredObjects: ObjectWithErrorCode<TObject>[];\n totalObjects: number;\n objectType?: MasterType;\n totalErroredResults: number;\n userType?: UserGroup;\n imageCdnUrl: string;\n actionVerb: WizardActionVerb;\n currentUser?: CurrentUser;\n getErrorListItem?: (erroredObjects: ObjectWithErrorCode<TObject>) => JSX.Element;\n actionButton?: WizardErrorActionButton;\n}\n\nexport function WizardCompletedWithError<\n TObject extends BaseObject = BaseObject\n>(\n props: WizardCompletedWithErrorProps<TObject>\n): JSX.Element {\n if (!props.erroredObjects?.length)\n return <></>;\n\n const getTotalUpdatedPhrase = () => {\n if (props.objectType === MasterType.User) {\n if (props.actionVerb === 'Create')\n return props.userType === UserGroup.Learner ? 'totalCreatedStudents' : 'totalCreatedStaff';\n \n return props.userType === UserGroup.Learner ? 'totalActionedStudents' : 'totalActionedStaff';\n }\n if (props.objectType === MasterType.Video) {\n return 'totalActionedVideos';\n }\n return 'totalActionedItems';\n };\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <div className='pb-3'>\n <div className='d-flex justify-content-between'>\n <div>\n <h2 className='h4 mb-3'>\n <Text phrase={props.actionVerb === 'Create' ? 'headingCreate' : 'headingAction'} />\n </h2>\n\n <p>\n <Text\n phrase={getTotalUpdatedPhrase()}\n options={{\n totalUpdated: props.totalObjects - props.totalErroredResults,\n totalObjects: props.totalObjects\n }}\n />\n </p>\n </div>\n </div>\n\n <div className='d-flex align-items-cetner justify-content-between mb-2'>\n <p className='fw-semibold mb-0'>\n <Text\n phrase={props.actionVerb === 'Create' ? 'unsuccessfulCreations' : 'unsuccessfulActions'}\n options={{ smartCount: props.totalErroredResults }}\n />\n </p>\n\n {!!props.actionButton && (\n <DivButton\n className='info-link'\n onClick={() => props.actionButton.onClick(props.erroredObjects)}\n >\n {props.actionButton.text}\n </DivButton>\n )}\n </div>\n\n <ObjectList<ObjectWithErrorCode<TObject>>\n objects={props.erroredObjects}\n objectType={props.objectType}\n childComponent={childProps => props.getErrorListItem(childProps.object)}\n />\n </div>\n </LanguageNamespaceContext.Provider>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"imageWidth\":\"Gjry1\"};","import React from 'react';\nimport { Button } from 'react-bootstrap';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardActionVerb } from 'libs/shared/interfaces';\nimport { ArticleHelper } from 'libs/shared/utils/ArticleHelper';\n\nimport styles from './wizard-failed.scss';\n\nconst namespace = 'userManager.wizardFailed';\n\ninterface WizardFailedProps {\n onClickTryAgain?: () => void;\n failedImageUrl: string;\n actionVerb: WizardActionVerb;\n}\n\ntype Props = React.PropsWithChildren<WizardFailedProps>;\n\nexport function WizardFailed(props: Props): JSX.Element {\n const supportUrl = ArticleHelper.getSupportRequestUrl();\n\n return (\n <div className='d-flex flex-column align-items-center'>\n <div className={`${styles.imageWidth} text-center py-4`}>\n <img\n className='img-fluid'\n src={props.failedImageUrl}\n />\n </div>\n <h2 className='h3'>\n <Text namespace={namespace} phrase='heading' />\n </h2>\n\n <p className='mb-0'>\n <Text namespace={namespace} phrase={props.actionVerb === 'Create' ? 'failedCreate' : 'failedAction'} />\n </p>\n\n {!!supportUrl && (\n <p>\n <Text\n namespace={namespace}\n phrase='contactSupport'\n options={{ href: supportUrl, linkClass: 'info-link' }}\n />\n </p>\n )}\n\n {props.onClickTryAgain && (\n <Button variant='outline-dark' className={!supportUrl ? 'mt-3' : ''} onClick={props.onClickTryAgain}>\n <Text namespace={namespace} phrase='tryAgain' />\n </Button>\n )}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"imageWidth\":\"picjj\"};","import React from 'react';\n\nimport { AppLink } from 'libs/common/backbone/core';\n\nimport { AppLink as AppLinkComponent } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardActionVerb } from 'libs/shared/interfaces';\n\nimport styles from './wizard-succeeded.scss';\n\nconst namespace = 'userManager.wizardSucceeded';\n\ninterface WizardSucceededProps {\n finishAppLink?: AppLink;\n message: string;\n successImageUrl: string;\n actionVerb?: WizardActionVerb;\n onFinish?: () => void;\n}\n\ntype Props = React.PropsWithChildren<WizardSucceededProps>;\n\nexport function WizardSucceeded(props: Props): JSX.Element {\n return (\n <div className='d-flex flex-column align-items-center'>\n <div className={`${styles.imageWidth} text-center pt-4 pb-2`}>\n <img\n className='img-fluid'\n src={props.successImageUrl}\n />\n </div>\n <h2 className='h3'>\n <Text namespace={namespace} phrase='success' />\n </h2>\n <p className='text-center' dangerouslySetInnerHTML={{ __html: props.message }} />\n {props.finishAppLink && (\n <AppLinkComponent className='btn btn-dark' appLink={props.finishAppLink} onClick={props.onFinish}>\n <Text namespace={namespace} phrase='finish' />\n </AppLinkComponent>\n )}\n </div>\n );\n}","export enum BatchJobResultStatus {\n All = 0,\n NoAction = 1,\n Succeed = 2,\n Failed = 3\n}","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { AppLink } from 'libs/common/backbone/core';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { BulkUserActionsAnalyticsHelper } from 'libs/shared/apps/user-manager/utils/BulkUserActionsAnalyticsHelper';\nimport { ObjectWithErrorCode, WizardCompletedWithError, WizardErrorActionButton } from 'libs/shared/components/wizard/status/statuses/completed-with-error/WizardCompletedWithError';\nimport { WizardFailed } from 'libs/shared/components/wizard/status/statuses/failed/WizardFailed';\nimport { WizardSucceeded } from 'libs/shared/components/wizard/status/statuses/succeeded/WizardSucceeded';\nimport { WizardLayoutContext } from 'libs/shared/context/WizardLayoutContext';\nimport { BatchJobStatus } from 'libs/shared/enums/BatchJobStatus';\nimport { BatchJobType } from 'libs/shared/enums/BatchJobType';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { GetResultsRequest, useErroredBulkActions } from 'libs/shared/hooks/useErroredBulkActions';\nimport { useNavLock } from 'libs/shared/hooks/useNavLock';\nimport { BaseObject, BatchJob, BatchJobSummary, CurrentUser, WizardActionVerb } from 'libs/shared/interfaces';\n\ninterface WizardCompletedProps<TObject> {\n job: BatchJob;\n summary: BatchJobSummary;\n userType?: UserGroup;\n objectCount: number;\n objectType: MasterType;\n getResultsRequest: GetResultsRequest;\n onClickTryAgain?: () => void;\n actionSucceededMessage: string;\n actionVerb: WizardActionVerb;\n navLockId?: string;\n onFinish?: () => void;\n\n analyticsOptions?: AnalyticsOptions;\n analyticsData?: HashObject;\n preventLoggingAnalytics: boolean;\n\n imageCdnUrl: string;\n failedImageUrl: string;\n successImageUrl: string;\n \n currentUser?: CurrentUser;\n\n finishAppLink?: AppLink;\n \n getErrorListItem?: (erroredObjects: ObjectWithErrorCode<TObject>) => JSX.Element;\n errorActionButton?: WizardErrorActionButton;\n}\n\nexport function WizardCompleted<\n TObject extends BaseObject = BaseObject\n>(\n props: WizardCompletedProps<TObject>\n): JSX.Element {\n const dispatch = useDispatch();\n const erroredObjects = useErroredBulkActions<TObject>(props.job.id, props.getResultsRequest);\n const navLock = useNavLock();\n const { setShowButtons, showButtons } = React.useContext(WizardLayoutContext);\n\n const [ hasLoggedEvent, setHasLoggedEvent ] = React.useState(false);\n\n React.useEffect(() => {\n if (props.job.type === BatchJobType.RolloverYearGroup) {\n // Clear year level rollover status\n dispatch({\n type: Flight.Actions.INVALIDATE,\n keys: ['year:group:rollover:status'],\n request: null\n });\n }\n }, [props.job.type]);\n\n React.useEffect(() => {\n if (props.preventLoggingAnalytics || hasLoggedEvent)\n return;\n\n setHasLoggedEvent(true);\n\n const analyticsData: HashObject = {\n ...(props.analyticsData ?? {}),\n id: props.job.id,\n userCount: props.summary.totalProcessed,\n totalSucceeded: props.summary.totalSucceeded,\n totalErrored: props.summary.totalErrored,\n totalNoAction: props.summary.totalNoAction\n };\n\n const status = BulkUserActionsAnalyticsHelper.getJobStatus(props.job.status);\n\n if (status)\n analyticsData.status = status;\n \n let analyticsOptionsData: AnalyticsOptions = { workflowPhase: WorkflowPhase.Complete };\n\n if (props.analyticsOptions) {\n analyticsOptionsData = AnalyticsHelper.mergeOptions(props.analyticsOptions, analyticsOptionsData);\n }\n\n AnalyticsHelper.logUserAction(analyticsData, analyticsOptionsData);\n }, [ props.preventLoggingAnalytics, hasLoggedEvent ]);\n\n React.useEffect(() => {\n if (props.navLockId)\n navLock.unlock(props.navLockId);\n }, []);\n\n React.useEffect(() => {\n switch (props.job.status) {\n case BatchJobStatus.Completed:\n case BatchJobStatus.Failed:\n if (showButtons) {\n setShowButtons(false);\n }\n break;\n\n case BatchJobStatus.CompletedWithError:\n if (!showButtons) {\n setShowButtons(true);\n }\n break;\n\n default:\n break;\n }\n }, [props.job.status]);\n\n if (props.job.status === BatchJobStatus.Completed) {\n return (\n <WizardSucceeded\n message={props.actionSucceededMessage}\n successImageUrl={props.successImageUrl}\n actionVerb={props.actionVerb}\n finishAppLink={props.finishAppLink}\n onFinish={props.onFinish}\n />\n );\n }\n\n if (props.job.status === BatchJobStatus.CompletedWithError) {\n return (\n <WizardCompletedWithError<TObject>\n erroredObjects={erroredObjects.objects}\n totalObjects={props.objectCount}\n totalErroredResults={erroredObjects.count}\n userType={props?.userType}\n currentUser={props.currentUser}\n imageCdnUrl={props.imageCdnUrl}\n actionVerb={props.actionVerb}\n objectType={props.objectType}\n getErrorListItem={props.getErrorListItem}\n actionButton={props.errorActionButton}\n />\n );\n }\n\n return (\n <WizardFailed\n onClickTryAgain={props.onClickTryAgain}\n failedImageUrl={props.failedImageUrl}\n actionVerb={props.actionVerb}\n />\n );\n}","import { useDispatch } from 'react-redux';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { ObjectWithErrorCode } from 'libs/shared/components/wizard/status/statuses/completed-with-error/WizardCompletedWithError';\nimport { BatchJobResultStatus } from 'libs/shared/enums/BatchJobResultStatus';\nimport { useInfiniteList } from 'libs/shared/hooks/UseInfiniteList';\nimport { BaseObject, BatchJobResult } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\n\ninterface GetErroredObjects<TObject> {\n objects: ObjectWithErrorCode<TObject>[];\n isFetching: boolean;\n count: number;\n}\n\nexport type GetResultsRequest = (jobId: string, status: BatchJobResultStatus, cursor?: string) => Flight.Request;\n\nexport function useErroredBulkActions<TObject extends BaseObject>(\n jobId: string,\n getResultsRequest: GetResultsRequest\n): GetErroredObjects<TObject> {\n const dispatch = useDispatch();\n\n const getResultsPage = (cursor?: string) => {\n return getResultsRequest(\n jobId,\n BatchJobResultStatus.Failed,\n cursor\n );\n };\n\n const fetchNext = (cursor?: string) => {\n return Flight.getFetch(dispatch)(getResultsPage(cursor));\n };\n\n const {\n items: erroredResults,\n isFetching: isFetchingErroredResults\n } = useInfiniteList<BatchJobResult<TObject>>(getResultsPage, fetchNext);\n\n const objects: ObjectWithErrorCode<TObject>[] = erroredResults?.map(result => {\n if (!result.objectData && result.metadata && 'firstname' in result.metadata) {\n return {\n name: result.metadata.firstname,\n surname: result.metadata.surname,\n userType: UserHelper.getUserType(result.metadata as any),\n username: result.metadata.username,\n errorCode: result.status\n } as unknown as ObjectWithErrorCode<TObject>;\n }\n\n return {\n ...result.objectData,\n errorCode: result.status\n };\n }) ?? [];\n\n return {\n isFetching: isFetchingErroredResults,\n objects: objects,\n count: objects.length // TODO: Get a proper count from the backend\n };\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\n\nconst namespace = 'shared.wizardStepList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface WizardStep<StepId extends string> {\n id: StepId;\n text: string;\n appLink?: Core.AppLink;\n subText?: string;\n disabled?: boolean;\n}\n\ninterface WizardStepListTheme {\n item?: string;\n itemsContainer?: string;\n itemContent?: string;\n isSelectedOverride?: string;\n isCompletedOverride?: string;\n}\n\ninterface WizardStepListItemProps {\n appLink: Core.AppLink;\n isSelected: boolean;\n isCompleted: boolean;\n text: string;\n subText?: string;\n disabled: boolean;\n index: number;\n hideStepNumber?: boolean;\n theme?: WizardStepListTheme;\n}\n\nfunction WizardStepListItem(props: WizardStepListItemProps): JSX.Element {\n const content = (\n <>\n <div className='d-flex'>\n {!props.hideStepNumber && <div className='flex-shrink-0 flex-grow-0'>{`${props.index + 1}.`} </div>}\n <div>{props.text}</div>\n </div>\n\n {props.subText && (\n <div className='ms-2 ps-1 pt-1'>\n {props.subText}\n </div>\n )}\n </>\n );\n\n \n let className = 'px-2 py-1 mb-1 rounded d-inline-block';\n\n if (props.isSelected) {\n className += ` ${props.theme?.isSelectedOverride || 'bg-light-blue fw-semibold'}`;\n }\n\n if ((!props.isSelected && props.isCompleted))\n className += ` ${props.theme?.isCompletedOverride || 'text-info'}`;\n\n return (\n <li className={props.theme?.item}>\n {(props.isCompleted && props.appLink)\n ? (\n <AppLink appLink={props.appLink} className={`${className} ${props.theme?.itemContent || ''}`}>\n {content}\n </AppLink>\n ) : (\n <div className={`${className} ${props.theme?.itemContent || ''}`}>\n {content}\n </div>\n )\n }\n </li>\n );\n}\n\ninterface WizardStepListProps<StepId extends string> {\n currentStep: StepId;\n steps: WizardStep<StepId>[];\n disableAppLinks?: boolean;\n theme?: WizardStepListTheme;\n}\n\nexport function WizardStepList<StepId extends string>(props: WizardStepListProps<StepId>): JSX.Element {\n const currentStepNumber = props.steps.reduce((acc, step, i) => {\n if (step.id === props.currentStep)\n acc = i + 1;\n\n return acc;\n }, 1);\n\n return (\n <>\n <h2 className='h4'>\n {getPhrase('stepNumber', { currentStep: currentStepNumber, totalSteps: props.steps.length })}\n </h2>\n\n <ol className={`list-unstyled ${props.theme?.itemsContainer || ''}`}>\n {props.steps.map((step, i) => {\n const isSelected = step.id === props.currentStep;\n const isCompleted = currentStepNumber > i + 1;\n\n return (\n <WizardStepListItem\n index={i}\n key={step.id}\n text={step.text}\n subText={step.subText}\n isSelected={isSelected}\n isCompleted={isCompleted}\n appLink={!props.disableAppLinks && step.appLink}\n disabled={step.disabled}\n theme={props.theme}\n />\n );\n })}\n </ol>\n </>\n );\n}","export enum BatchJobStatus {\n Submitted = 0,\n Queued = 1,\n Pending = 2,\n InProgress = 3,\n Completed = 4,\n CompletedWithError = 5,\n Failed = 6\n}","import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n internalServerError?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError,\n internalServerError: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.InternalServer) {\n if (!ignoreMap.internalServerError)\n Core.ErrorHelper.throw(new UnspecifiedError());\n return;\n }\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import { useEffect } from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { handleHttpError, HttpErrorMap, IgnoreHttpErrorMap } from 'libs/shared/errors/handlers/HttpErrorHandlers';\n\nfunction generateCacheKey(flightObjs: Array<Flight.Response<any>>): string {\n return flightObjs.map(obj => obj.statusCode).join(':');\n}\n\n// TODO: Change this to just `useHandleHttpError` and only accept a status code.\nexport function useHandleObjectError(\n _flightObjs: Flight.Response<any> | Array<Flight.Response<any>>,\n customErrors?: HttpErrorMap,\n ignoreErrors?: IgnoreHttpErrorMap\n): void {\n const flightObjs = Array.isArray(_flightObjs) ? _flightObjs : [_flightObjs];\n\n useEffect(() => {\n flightObjs.forEach(obj => {\n handleHttpError(obj.statusCode, customErrors, ignoreErrors);\n });\n }, [ generateCacheKey(flightObjs), customErrors, ignoreErrors ]);\n}","import { useEffect } from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst SCROLL_TOLERANCE = 400; // value in px\n\ninterface UseInfiniteScrollOptions {\n fetchNextPage: () => void;\n hasMore: boolean;\n isFetching: boolean;\n scrollContainer?: HTMLElement;\n}\n\nexport function useInfiniteScroll(options: UseInfiniteScrollOptions): void {\n const handleScroll = (): void => {\n if (options.isFetching)\n return;\n\n if (!options.scrollContainer) {\n const currentScrollHeight = window.innerHeight + document.documentElement.scrollTop;\n \n const totalHeight = document.documentElement.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n } else {\n const { scrollContainer } = options;\n const currentScrollHeight = scrollContainer.getBoundingClientRect().height + scrollContainer.scrollTop;\n \n const totalHeight = scrollContainer.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n }\n\n options.fetchNextPage();\n };\n\n useEffect(() => {\n const onScroll = FunctionHelper.throttle(handleScroll, 200);\n\n const scrollContainer = options.scrollContainer || window;\n\n if (options.hasMore)\n scrollContainer.addEventListener('scroll', onScroll);\n\n return () => scrollContainer.removeEventListener('scroll', onScroll);\n }, [ options.hasMore, options.fetchNextPage, options.scrollContainer ]);\n}","import { useEffect, useState } from 'react';\n\nimport { HttpStatus, HttpStatusClass } from 'libs/common/backbone/enums/HttpStatus';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { BaseObject, BasePaginatedCollection } from 'libs/shared/interfaces';\n\nimport { useInfiniteScroll } from './UseInfiniteScroll';\nimport { useSelectAllPages } from './UseSelectAllPages';\n\nexport interface UseInfiniteListResult<T extends BaseObject> {\n items: T[];\n hasMore: boolean;\n isFetching: boolean;\n nextCursor: string;\n totalItems?: number;\n hasFirstPageCompleted: boolean;\n}\n\n/**\n * Hook to extract an infinite list from the application state,\n * save it locally in state and only update when new data\n * is fetched.\n * \n * @param getRequest - callback function to get the request for each page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n * \n * @param fetchNext - callback function to fetch a page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n */\nexport function useInfiniteList<TObject = BaseObject, TResponse = BasePaginatedCollection<TObject>>(\n getRequest: ((cursor?: string) => Flight.Request) | false,\n fetchNext: ((cursor?: string) => void) | false,\n onError?: (pageNumber: number, statusCode: HttpStatus) => void,\n getItems?: (responseData: TResponse) => TObject[],\n getCursor?: (responseData: TResponse) => string,\n scrollContainer?: HTMLElement\n): UseInfiniteListResult<TObject> {\n const [ pagesFetched, setPagesFetched ] = useState(0);\n\n const fetchNextFn = fetchNext as (cursor?: string) => void;\n\n function getKey(cursor?: string): string {\n if (!getRequest)\n return null;\n\n const request = getRequest(cursor);\n\n if (!request)\n return null;\n\n return request.key;\n }\n\n const response = useSelectAllPages<TObject, TResponse>(\n getKey,\n getItems,\n getCursor\n );\n\n function fetchNextPage(): void {\n if (!fetchNext || !getRequest || !response)\n return;\n\n setPagesFetched(currentVal => currentVal + 1);\n return fetchNextFn(response.nextCursor);\n }\n\n useInfiniteScroll({\n fetchNextPage,\n hasMore: !!response?.nextCursor,\n isFetching: response?.isFetching,\n scrollContainer\n });\n\n useEffect(() => {\n if (!response)\n return;\n\n if (response.shouldInitialFetch && fetchNext) {\n fetchNextFn();\n setPagesFetched(currentVal => currentVal + 1);\n }\n }, [ response?.shouldInitialFetch, fetchNext ]);\n\n useEffect(() => {\n if (!response?.statusCode || !FunctionHelper.isFunction(onError))\n return;\n\n const httpStatusClass: HttpStatusClass = +(response.statusCode?.toString()?.substr(0, 1));\n\n if (httpStatusClass !== HttpStatusClass.ClientError && httpStatusClass !== HttpStatusClass.ServerError)\n return;\n\n onError(pagesFetched, response.statusCode);\n }, [response?.statusCode]);\n\n return {\n items: response?.items,\n hasMore: !!response?.nextCursor,\n nextCursor: response?.nextCursor,\n isFetching: response?.isFetching,\n totalItems: response?.totalItems,\n hasFirstPageCompleted: response?.hasFirstPageCompleted\n };\n}","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\n\nimport { EntityType, LocationContext, OperationDescriptor, UserAction } from 'libs/analytics/interfaces';\n\nimport { BULK_USER_UPLOAD_NAV_LOCK_ID, BulkUserUploadWizardLayout } from 'libs/shared/apps/user-manager/components/bulk-upload/layout/BulkUserUploadWizardLayout';\nimport { UserManagerClientContext } from 'libs/shared/apps/user-manager/context/UserManagerClientContext';\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\nimport { useBulkUploadUsers } from 'libs/shared/apps/user-manager/hooks/useBulkUploadUsers';\nimport { UserWizardStatusParams } from 'libs/shared/apps/user-manager/interfaces/query-params/UserWizardParams';\nimport { BulkUserActionsHelper } from 'libs/shared/apps/user-manager/utils/BulkUserActionsHelper';\nimport { BulkUserUploadHelper } from 'libs/shared/apps/user-manager/utils/BulkUserUploadHelper';\nimport { WizardCompleted } from 'libs/shared/components/wizard/status/completed/WizardCompleted';\nimport { ObjectWithErrorCode } from 'libs/shared/components/wizard/status/statuses/completed-with-error/WizardCompletedWithError';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { BatchJob, BatchJobSummary, Config, CurrentUser, User } from 'libs/shared/interfaces';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { JobRequests } from 'shared/flight-requests/JobRequests';\n\nimport { getUserManagerAppLinks } from 'apps/user-manager/utils/LiteUserManagerAppLinks';\n\nconst namespace = 'userManager.bulkUserUploadStatusCompleted';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function BulkUserUploadStatusCompleteView(props: UserWizardStatusParams): JSX.Element {\n const { users, existingUserToAdd, existingUsersHash } = useBulkUploadUsers();\n\n const appLinks = getUserManagerAppLinks(props.userType);\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const job = Flight.useBasicFetch<BatchJob>(JobRequests.getJob(props.jobId));\n const summary = Flight.useBasicFetch<BatchJobSummary>(JobRequests.getJobSummary(props.jobId));\n\n useHandleObjectError(job);\n\n useSetPageMetadata({ title: LanguageService.getPhrase(namespace, 'pageTitle') });\n\n const dispatch = useDispatch();\n\n const onCreateJobError = BulkUserActionsHelper.useCreateJobErrorAlert();\n\n const newUsers = BulkUserUploadHelper.getNewUsers(users, existingUsersHash);\n\n function onClickTryAgain(): void {\n const jobData = BulkUserUploadHelper.getJobData({\n users: newUsers,\n existingUsers: existingUserToAdd,\n customerId: currentUser.data.customerId,\n userType: props.userType\n });\n\n Flight.fetch(dispatch, JobRequests.createJob(jobData, onCreateJob, onCreateJobError));\n }\n\n function onCreateJob(job: BatchJob): void {\n Core.AppLinkHelper.trigger({\n ...appLinks.userUploadStatus.polling,\n params: {\n userType: props.userType,\n jobId: job.id\n }\n });\n }\n const totalUsersCount = (newUsers?.length ?? 0) + (existingUserToAdd?.length ?? 0);\n\n function getSuccessMessage(): string {\n return props.userType === UserGroup.Learner\n ? getPhrase('createStudentsSuccess', { smartCount: totalUsersCount })\n : getPhrase('createStaffSuccess', { smartCount: totalUsersCount });\n }\n\n const dataLoaded = !!job.data && !!config.data && !!currentUser.data && !!summary.data;\n\n return (\n <UserManagerClientContext.Provider value={UserManagerClient.Primary}>\n <BulkUserUploadWizardLayout\n appLinks={appLinks}\n userType={props.userType}\n currentStep='status'\n canAddExistingUsers\n >\n {!!dataLoaded && (\n <WizardCompleted\n job={job.data}\n summary={summary.data}\n objectCount={users.length}\n objectType={MasterType.User}\n userType={props.userType}\n finishAppLink={appLinks.userManager}\n imageCdnUrl={config.data.imageCdnUrl}\n successImageUrl={ImageUrls.SUCCESS}\n failedImageUrl={ImageUrls.WIZARD_ERROR}\n currentUser={currentUser.data}\n onClickTryAgain={onClickTryAgain}\n getResultsRequest={JobRequests.getJobResults}\n actionSucceededMessage={getSuccessMessage()}\n navLockId={BULK_USER_UPLOAD_NAV_LOCK_ID}\n actionVerb='Create'\n analyticsOptions={{\n location: LocationContext.BulkUserUploadWizard,\n entity: EntityType.User,\n actionType: UserAction.Create,\n descriptor: OperationDescriptor.Bulk\n }}\n preventLoggingAnalytics={!users}\n getErrorListItem={(object: ObjectWithErrorCode<User>) =>\n BulkUserActionsHelper.getErrorListItem(object, config.data.imageCdnUrl, currentUser.data)\n }\n />\n )}\n </BulkUserUploadWizardLayout>\n </UserManagerClientContext.Provider>\n );\n}","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { UserAuditLogQueryParams } from 'libs/shared/apps/user-manager/components/audit-log/components/audit-log-filters/UserAuditLogFilters';\nimport { SUPPORTED_BATCH_JOB_TYPES } from 'libs/shared/apps/user-manager/utils/BulkUserActionsHelper';\nimport { BatchJobResultStatus } from 'libs/shared/enums/BatchJobResultStatus';\nimport { BatchJobType } from 'libs/shared/enums/BatchJobType';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { BaseObject, BatchJob, BatchJobProgress, BatchJobResultsResponse, CreateBatchJobRequest } from 'libs/shared/interfaces';\n\nexport const JobRequests = {\n createJob(\n data: CreateBatchJobRequest,\n success?: (job: BatchJob) => void,\n error?: () => void\n ): Flight.Request {\n return {\n url: '{gateway}/v1/batch/jobs',\n key: 'create:job',\n type: HttpVerbs.POST,\n data,\n success,\n error\n };\n },\n\n getJobs(queryParams: UserAuditLogQueryParams): Flight.Request {\n const params: HashObject = {};\n\n let bulkActionTypes: BatchJobType[] = [];\n let userTypes: UserGroup[] = [];\n\n if (queryParams.cursor)\n params.cursor = queryParams.cursor;\n\n if (queryParams.sort) {\n if (queryParams.sort === 'oldest')\n params.order = 'ASC';\n else\n params.order = 'DESC';\n }\n\n if (queryParams.bulkActionType) {\n bulkActionTypes = Array.isArray(queryParams.bulkActionType)\n ? queryParams.bulkActionType\n : [queryParams.bulkActionType];\n\n params.type = bulkActionTypes;\n } else {\n // only show supported type in the table by default\n params.type = SUPPORTED_BATCH_JOB_TYPES;\n }\n\n if (queryParams.userType) {\n userTypes = Array.isArray(queryParams.userType)\n ? queryParams.userType\n : [queryParams.userType];\n\n params.dataType = userTypes;\n }\n \n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/batch/jobs', params),\n key: `batch:jobs:${queryParams.cursor}:${queryParams.sort}:${bulkActionTypes.sort().join(':')}:${userTypes.sort().join(':')}`\n };\n },\n\n getJob(id: string): Flight.Request {\n return {\n url: `{gateway}/v1/batch/jobs/${id}`,\n key: `job:${id}`\n };\n },\n\n getJobProgress(\n id: string,\n success?: (progress: BatchJobProgress) => void,\n error?: (xhr?: Xhr) => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/batch/jobs/${id}/progress`,\n key: `job:${id}:progress`,\n invalidationKeys: `job:${id}:progress`,\n success,\n error\n };\n },\n\n getJobResults<TObject extends BaseObject>(\n id: string,\n status: BatchJobResultStatus,\n cursor?: string,\n success?: (results: BatchJobResultsResponse<TObject>) => void,\n error?: (xhr?: Xhr) => void\n ): Flight.Request {\n const params: HashObject = {\n status\n };\n\n if (cursor)\n params.cursor = cursor;\n\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v1/batch/jobs/${id}/results`, params),\n key: `job:${id}:results:${status}:${cursor}`,\n success,\n error\n };\n },\n\n getYearGroupRolloverStatus(customerId: string): Flight.Request {\n return {\n url: `{gateway}/v1/batch/validations/customers/${customerId}/year-group-roll-over`,\n key: 'year:group:rollover:status'\n };\n },\n\n sendJobReports(ids: string[]): Flight.Request {\n return {\n url: '{gateway}/v1/batch/results/export',\n key: `send:job:reports:${ids.sort().join(':')}`,\n type: HttpVerbs.POST,\n data: {\n jobIds: ids\n }\n };\n },\n\n getJobSummary(id: string): Flight.Request {\n return {\n url: `{gateway}/v1/batch/jobs/${id}/summary`,\n key: `job:summary:${id}`\n };\n }\n};"],"names":["namespace","BulkUserUploadBackButton","props","currentStep","AppLink","className","appLink","appLinks","userManager","Text","phrase","BulkUserUploadContinueButton","useBulkUploadUsers","duplicateSets","hasExistingUsers","WizardLayoutContext","disableNext","onClickConfirm","spreadsheetHasDuplicates","length","currentAppLink","ContextService","action","userUploadStatus","polling","complete","userUploadPopup","userUploadReviewAccounts","userUploadFixDuplicates","userUploadReviewExistingAccounts","willUploadOnNext","Button","variant","onClick","disabled","canAddExistingUsers","userUploadConfirmation","getNextAppLink","BULK_USER_UPLOAD_NAV_LOCK_ID","BulkUserUploadWizardLayout","users","setUsers","navLock","useNavLock","lock","id","title","LanguageService","text","appLinkWhitelist","BulkUserUploadHelper","onConfirmUnlock","unlock","replace","WizardHeader","loaded","continueButton","backButton","breadcrumbs","name","settings","userType","UserGroup","active","WizardStepList","steps","children","UserManagerClientContext","updateUserHash","userHash","updatedUserIdsHash","Object","keys","reduce","updatedObj","lookupId","viewModel","setViewModel","updateDuplicates","invalidUsers","hasValidatedUsers","existingUsersHash","existingUserToAdd","newUsers","filter","u","setInvalidUsers","setExistingUsers","existingUsers","updateUser","updatedUser","updatedUsers","map","user","deleteUsers","deletedUsers","userIdHash","prev","curr","BaseBulkUserActionsViewModelKeys","BulkUserActionsAnalyticsHelper","getAnalyticsActionName","subAction","onClickNext","analyticsData","userCount","userIdMap","size","step","actionName","actionData","ObjectHelper","AnalyticsHelper","location","workflowPhase","actionType","entity","logYearGroupRolloverEntry","getJobStatus","status","BatchJobStatus","showButtons","hideHeader","ObjectList","ChildComponent","childComponent","objects","object","key","objectType","WizardCompletedWithError","erroredObjects","value","actionVerb","MasterType","options","totalUpdated","totalObjects","totalErroredResults","smartCount","actionButton","DivButton","childProps","getErrorListItem","WizardFailed","supportUrl","ArticleHelper","src","failedImageUrl","href","linkClass","onClickTryAgain","WizardSucceeded","successImageUrl","dangerouslySetInnerHTML","__html","message","finishAppLink","onFinish","BatchJobResultStatus","WizardCompleted","dispatch","jobId","getResultsRequest","getResultsPage","cursor","Failed","erroredResults","items","isFetchingErroredResults","isFetching","result","objectData","metadata","firstname","surname","UserHelper","username","errorCode","count","useErroredBulkActions","job","setShowButtons","hasLoggedEvent","setHasLoggedEvent","type","BatchJobType","request","preventLoggingAnalytics","summary","totalProcessed","totalSucceeded","totalErrored","totalNoAction","analyticsOptionsData","analyticsOptions","navLockId","actionSucceededMessage","objectCount","currentUser","imageCdnUrl","errorActionButton","getPhrase","WizardStepListItem","content","hideStepNumber","index","subText","isSelected","theme","isSelectedOverride","isCompleted","isCompletedOverride","item","itemContent","currentStepNumber","acc","i","totalSteps","itemsContainer","disableAppLinks","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","internalServerError","handleHttpError","info","customErrorMap","ignoreMap","statusCode","errorMap","generateCacheKey","flightObjs","obj","join","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","Array","isArray","useEffect","forEach","SCROLL_TOLERANCE","useInfiniteList","getRequest","fetchNext","onError","getItems","getCursor","scrollContainer","handleScroll","useState","pagesFetched","setPagesFetched","fetchNextFn","response","fetchNextPage","currentVal","nextCursor","hasMore","getBoundingClientRect","height","scrollTop","scrollHeight","window","innerHeight","document","documentElement","onScroll","FunctionHelper","addEventListener","removeEventListener","shouldInitialFetch","httpStatusClass","toString","substr","HttpStatus","totalItems","hasFirstPageCompleted","BulkUserUploadStatusCompleteView","config","onCreateJobError","onCreateJob","params","totalUsersCount","dataLoaded","data","jobData","customerId","descriptor","JobRequests","createJob","success","error","url","getJobs","queryParams","bulkActionTypes","userTypes","sort","order","bulkActionType","dataType","getJob","getJobProgress","invalidationKeys","getJobResults","getYearGroupRolloverStatus","sendJobReports","ids","jobIds","getJobSummary"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"scripts/8957-b3f0dbb85d-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-actions-wizard/header/back-buttons/BulkUserUploadBackButton.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-actions-wizard/header/continue-buttons/BulkUserUploadContinueButton.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-upload/layout/bulk-user-upload-wizard-layout.scss","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-upload/layout/BulkUserUploadWizardLayout.tsx","file:///app/packages/libs/shared/src/apps/user-manager/context/UserManagerClientContext.ts","file:///app/packages/libs/shared/src/apps/user-manager/hooks/useBulkUploadUsers.ts","file:///app/packages/libs/shared/src/apps/user-manager/interfaces/viewmodels/BulkUserActionsViewModel.ts","file:///app/packages/libs/shared/src/apps/user-manager/utils/BulkUserActionsAnalyticsHelper.ts","file:///app/packages/libs/shared/src/components/wizard/header/WizardHeader.tsx","file:///app/packages/libs/shared/src/components/wizard/object-list/ObjectList.tsx","file:///app/packages/libs/shared/src/components/wizard/status/statuses/completed-with-error/WizardCompletedWithError.tsx","file:///app/packages/libs/shared/src/components/wizard/status/statuses/failed/wizard-failed.scss","file:///app/packages/libs/shared/src/components/wizard/status/statuses/failed/WizardFailed.tsx","file:///app/packages/libs/shared/src/components/wizard/status/statuses/succeeded/wizard-succeeded.scss","file:///app/packages/libs/shared/src/components/wizard/status/statuses/succeeded/WizardSucceeded.tsx","file:///app/packages/libs/shared/src/enums/BatchJobResultStatus.ts","file:///app/packages/libs/shared/src/components/wizard/status/completed/WizardCompleted.tsx","file:///app/packages/libs/shared/src/hooks/useErroredBulkActions.ts","file:///app/packages/libs/shared/src/components/wizard/step-list/WizardStepList.tsx","file:///app/packages/libs/shared/src/enums/BatchJobStatus.ts","file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/hooks/UseHandleObjectError.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteScroll.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteList.ts","file:///app/packages/projects/lite/src/apps/user-manager/views/bulk-user-upload/status/complete/BulkUserUploadStatusCompleteView.tsx","file:///app/packages/projects/lite/src/shared/flight-requests/JobRequests.ts"],"sourcesContent":["import React from 'react';\n\nimport { BulkUserUploadStepId } from 'libs/shared/apps/user-manager/components/bulk-upload/layout/BulkUserUploadWizardLayout';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'userManager.userWizardBackButtons';\n\ninterface BulkUserUploadBackButtonProps {\n currentStep: BulkUserUploadStepId;\n appLinks: UserManagerAppLinks;\n}\n\nexport function BulkUserUploadBackButton(props: BulkUserUploadBackButtonProps): JSX.Element {\n if (props.currentStep === 'status')\n return <></>;\n\n return (\n <AppLink\n className='btn btn-link me-2'\n appLink={props.appLinks.userManager}\n >\n <Text namespace={namespace} phrase='cancel' />\n </AppLink>\n );\n}","import React from 'react';\nimport { Button } from 'react-bootstrap';\n\nimport { ContextService } from 'libs/analytics/services/ContextService';\n\nimport { BulkUserUploadStepId } from 'libs/shared/apps/user-manager/components/bulk-upload/layout/BulkUserUploadWizardLayout';\nimport { useBulkUploadUsers } from 'libs/shared/apps/user-manager/hooks/useBulkUploadUsers';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardLayoutContext } from 'libs/shared/context/WizardLayoutContext';\n\nconst namespace = 'userManager.userWizardHeader';\n\ninterface BulkUserUploadContinueButtonProps {\n currentStep: BulkUserUploadStepId;\n appLinks: UserManagerAppLinks;\n canAddExistingUsers: boolean;\n}\n\nexport function BulkUserUploadContinueButton(props: BulkUserUploadContinueButtonProps): JSX.Element {\n const { duplicateSets, hasExistingUsers } = useBulkUploadUsers();\n const { disableNext, onClickConfirm } = React.useContext(WizardLayoutContext);\n\n const spreadsheetHasDuplicates = !!duplicateSets?.length;\n\n const currentAppLink = ContextService.getCurrentContext().appLink;\n\n if (currentAppLink.action === props.appLinks.userUploadStatus.polling.action)\n return <></>;\n\n // we hide the button cuz we have one in the success component\n if (currentAppLink.action === props.appLinks.userUploadStatus.complete.action)\n return <></>;\n\n function willUploadOnNext(): boolean {\n switch (currentAppLink.action) {\n case props.appLinks.userUploadPopup.action:\n case props.appLinks.userUploadReviewAccounts.action:\n return !spreadsheetHasDuplicates && !hasExistingUsers;\n\n case props.appLinks.userUploadFixDuplicates.action:\n return !hasExistingUsers;\n\n case props.appLinks.userUploadReviewExistingAccounts.action:\n return !hasExistingUsers;\n\n default:\n return true;\n }\n }\n\n if (willUploadOnNext()) {\n return (\n <Button\n className={disableNext ? 'disabled' : ''}\n variant='dark'\n onClick={onClickConfirm}\n disabled={disableNext}\n >\n <Text\n namespace={namespace}\n phrase='create'\n />\n </Button>\n );\n }\n\n function getNextAppLink() {\n switch (currentAppLink.action) {\n case props.appLinks.userUploadReviewAccounts.action:\n if (spreadsheetHasDuplicates)\n return props.appLinks.userUploadFixDuplicates;\n if (hasExistingUsers && props.canAddExistingUsers)\n return props.appLinks.userUploadReviewExistingAccounts;\n\n case props.appLinks.userUploadFixDuplicates.action:\n if (hasExistingUsers && props.canAddExistingUsers)\n return props.appLinks.userUploadReviewExistingAccounts;\n\n case props.appLinks.userUploadReviewExistingAccounts.action:\n if (props.canAddExistingUsers)\n return props.appLinks.userUploadConfirmation;\n\n default:\n return null;\n }\n }\n\n return (\n <AppLink\n className={`btn btn-dark ${disableNext ? 'disabled' : ''}`}\n appLink={getNextAppLink()}\n disabled={disableNext}\n >\n <Text\n namespace={namespace}\n phrase='next'\n />\n </AppLink>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"wizardContent\":\"hHr3C\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { BulkUserUploadBackButton } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/header/back-buttons/BulkUserUploadBackButton';\nimport { BulkUserUploadContinueButton } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/header/continue-buttons/BulkUserUploadContinueButton';\nimport { useBulkUploadUsers } from 'libs/shared/apps/user-manager/hooks/useBulkUploadUsers';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { BulkUserUploadHelper } from 'libs/shared/apps/user-manager/utils/BulkUserUploadHelper';\nimport { WizardHeader } from 'libs/shared/components/wizard/header/WizardHeader';\nimport { WizardStepList } from 'libs/shared/components/wizard/step-list/WizardStepList';\nimport { WizardLayoutContextProvider } from 'libs/shared/context/WizardLayoutContext';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { useNavLock } from 'libs/shared/hooks/useNavLock';\n\nimport styles from './bulk-user-upload-wizard-layout.scss';\n\nexport type BulkUserUploadStepId = 'review-accounts' | 'fix-duplicates' | 'review-existing-accounts' | 'confirmation' |'status';\n\nconst namespace = 'userManager.bulkUserUploadWizardLayout';\nexport const BULK_USER_UPLOAD_NAV_LOCK_ID = 'bulk:user:upload:nav:lock';\n\ntype BulkUserUploadWizardLayoutProps = React.PropsWithChildren<{\n appLinks: UserManagerAppLinks;\n userType: UserGroup;\n currentStep: BulkUserUploadStepId;\n canAddExistingUsers?: boolean;\n}>;\n\nexport function BulkUserUploadWizardLayout(props: BulkUserUploadWizardLayoutProps): JSX.Element {\n const { users, setUsers } = useBulkUploadUsers();\n\n const navLock = useNavLock();\n\n React.useEffect(() => {\n // If there is no view model, redirect away\n if (!users) {\n Core.AppLinkHelper.trigger(props.appLinks.userManager, { replace: true });\n return;\n }\n\n navLock.lock({\n id: BULK_USER_UPLOAD_NAV_LOCK_ID,\n title: LanguageService.getPhrase(namespace, 'navLockTitle'),\n text: LanguageService.getPhrase(namespace, 'navLockBody'),\n appLinkWhitelist: BulkUserUploadHelper.getWizardAppLinks(props.appLinks),\n onConfirmUnlock: () => {\n setUsers(null);\n }\n });\n\n return () => {\n navLock.unlock(BULK_USER_UPLOAD_NAV_LOCK_ID);\n };\n }, []);\n\n React.useEffect(() => {\n if (users?.length)\n return;\n\n navLock.unlock(BULK_USER_UPLOAD_NAV_LOCK_ID);\n Core.AppLinkHelper.trigger(props.appLinks.userManager, { replace: true });\n }, [users?.length]);\n\n if (!users)\n return <></>;\n\n return (\n <WizardLayoutContextProvider>\n <div className='px-3'>\n <WizardHeader<BulkUserUploadStepId>\n title={LanguageService.getPhrase(namespace, 'bulkUpload')}\n currentStep={props.currentStep}\n loaded\n continueButton={\n <BulkUserUploadContinueButton\n currentStep={props.currentStep}\n appLinks={props.appLinks}\n canAddExistingUsers={props.canAddExistingUsers}\n />\n }\n backButton={<BulkUserUploadBackButton currentStep={props.currentStep} appLinks={props.appLinks} />}\n breadcrumbs={[\n {\n name: LanguageService.getPhrase(namespace, 'settingsBreadcrumb'),\n appLink: props.appLinks.settings\n },\n {\n name: LanguageService.getPhrase(namespace, props.userType === UserGroup.Learner ? 'studentManager' : 'staffManager'),\n appLink: props.appLinks.userManager\n },\n {\n name: LanguageService.getPhrase(namespace, 'bulkUpload'),\n active: true\n }\n ]}\n />\n\n <div className='row g-0'>\n <div className='col-2'>\n <WizardStepList<BulkUserUploadStepId>\n steps={BulkUserUploadHelper.getSteps(props.userType, props.canAddExistingUsers)}\n currentStep={props.currentStep}\n />\n </div>\n\n <div className={`col-10 ${styles.wizardContent}`}>\n {props.children}\n </div>\n </div>\n </div>\n </WizardLayoutContextProvider>\n );\n}","import React from 'react';\n\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\n\nexport const UserManagerClientContext = React.createContext<UserManagerClient>(null);","import { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\n\nimport { EditUserRequest } from '../interfaces';\nimport { BulkUserUploadViewModel, UserHash } from '../interfaces/viewmodels/BulkUserUploadViewModel';\nimport { UserManagerHelper } from '../utils/UserManagerHelper';\n\nfunction updateUserHash(userHash: UserHash, updatedUserIdsHash: HashObject<boolean>): UserHash {\n const updatedUsers = Object.keys(userHash || {}).reduce((updatedObj: UserHash, lookupId) => {\n if (!updatedUserIdsHash[lookupId])\n updatedObj[lookupId] = userHash[lookupId];\n return updatedObj;\n }, {});\n\n return updatedUsers;\n}\n\nexport const useBulkUploadUsers = () => {\n const [ viewModel, setViewModel ] = useViewModel<BulkUserUploadViewModel>(SharedViewModelKeys.BULK_USER_UPLOAD);\n\n function initializeUsers(users?: EditUserRequest[]): void {\n setViewModel({\n users,\n invalidUsers: null,\n existingUsersHash: null\n });\n\n updateDuplicates(users);\n }\n\n function updateUser(updatedUser: EditUserRequest): void {\n const updatedUsers = viewModel.users.map(user => {\n if (user.lookupId !== updatedUser.lookupId)\n return user;\n\n return updatedUser;\n });\n\n setViewModel({\n users: updatedUsers,\n invalidUsers: updateUserHash(viewModel?.invalidUsers, { [updatedUser.lookupId]: true }),\n existingUsersHash: viewModel?.existingUsersHash\n });\n\n updateDuplicates(updatedUsers);\n }\n\n function deleteUsers(deletedUsers: string[]): void {\n const userIdHash = deletedUsers.reduce((prev: HashObject, curr) => {\n prev[curr] = true;\n return prev;\n }, {});\n\n const updatedUsers = viewModel.users.filter(user => !userIdHash[user.lookupId]);\n\n setViewModel({\n users: updatedUsers,\n invalidUsers: updateUserHash(viewModel?.invalidUsers, userIdHash),\n existingUsersHash: updateUserHash(viewModel?.existingUsersHash, userIdHash),\n existingUserToAdd: viewModel?.existingUserToAdd?.filter(u => !!viewModel?.existingUsersHash[u.lookupId])\n });\n\n updateDuplicates(updatedUsers);\n }\n\n function updateDuplicates(users?: EditUserRequest[]): void {\n const duplicateSets = UserManagerHelper.getNewDuplicates(users);\n setViewModel('duplicateSets', duplicateSets);\n }\n\n return {\n users: viewModel?.users,\n invalidUsers: viewModel?.invalidUsers,\n hasValidatedUsers: !!viewModel?.invalidUsers,\n existingUsersHash: viewModel?.existingUsersHash || {},\n hasExistingUsers: !!Object.keys(viewModel?.existingUsersHash || {}).length,\n existingUserToAdd: viewModel?.existingUserToAdd,\n duplicateSets: viewModel?.duplicateSets,\n newUsers: viewModel?.users?.filter(u => !viewModel?.existingUsersHash?.[u.lookupId]) || [],\n\n setUsers: initializeUsers,\n setInvalidUsers: (invalidUsers: UserHash) => setViewModel('invalidUsers', invalidUsers),\n setExistingUsers: (existingUsers: UserHash) => setViewModel('existingUsersHash', existingUsers),\n updateUser,\n deleteUsers\n };\n};","import { Classroom, YearGroup } from 'libs/shared/interfaces';\n\nimport { BulkUserActionOptions, BulkUserSubAction } from '../../components/bulk-actions-wizard/layout/BulkUserActionsWizardLayout';\nimport { UserManagerQueryParams } from '../query-params/UserManagerQueryParams';\n\n// Please keep this array up to date with the interface below, so that the data we log to analytics remains accurate\nexport const BaseBulkUserActionsViewModelKeys: Array<keyof BulkUserActionsViewModel> = [\n 'userIdMap', 'params', 'action', 'subAction', 'allUsersSelected', 'allUsersCount', 'scrollContainer'\n];\n\nexport interface BulkUserActionsViewModel {\n userIdMap?: Map<string, boolean>;\n params?: UserManagerQueryParams;\n\n action?: BulkUserActionOptions; // TODO: Rename this to \"actionCategory\"\n subAction?: BulkUserSubAction; // TODO: Rename this to \"action\"\n\n // Used to determine if we can show year level rollover\n allUsersSelected?: boolean;\n allUsersCount?: number;\n scrollContainer?: HTMLElement;\n}\n\nexport interface BulkUserActionsYearGroupRolloverViewModel extends BulkUserActionsViewModel {\n yearGroup: YearGroup;\n}\n\nexport interface BulkUserActionsAddToClassroomViewModel extends BulkUserActionsViewModel {\n classroom: Classroom;\n}\n\nexport interface BulkUserActionsResetPasswordViewModel extends BulkUserActionsViewModel {\n password: string;\n changeOnNextLogin: boolean;\n}","import { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { BatchJobStatus } from 'libs/shared/enums/BatchJobStatus';\n\nimport { BulkUserActionStepId } from '../components/bulk-actions-wizard/layout/BulkUserActionsWizardLayout';\nimport { BaseBulkUserActionsViewModelKeys, BulkUserActionsViewModel } from '../interfaces/viewmodels/BulkUserActionsViewModel';\n\nexport const BulkUserActionsAnalyticsHelper = {\n getAnalyticsActionName(viewModel: BulkUserActionsViewModel): string | null {\n if (!viewModel?.action)\n return null;\n\n switch (viewModel.action) {\n case 'activation': {\n if (!viewModel?.subAction)\n return 'Deactivate / reactivate';\n\n if (viewModel.subAction === 'deactivate')\n return 'Deactivate';\n\n return 'Reactivate';\n }\n case 'addToClassroom':\n return 'Add to classroom';\n case 'changeYearGroup':\n return 'Change year level';\n case 'delete':\n return 'Delete user';\n case 'resetEmail':\n return 'Send password reset email';\n case 'activationEmail':\n return 'Send account activation email';\n case 'resetPassword':\n return 'Reset password';\n case 'yearGroupRollover':\n return 'Annual year level rollover';\n case 'removeFromSchool':\n return 'Remove user';\n default:\n return null;\n }\n },\n\n onClickNext(viewModel: BulkUserActionsViewModel, currentStep: BulkUserActionStepId): void {\n if (!viewModel)\n return;\n\n const analyticsData: HashObject = {\n userCount: viewModel.userIdMap.size,\n step: currentStep\n };\n\n const actionName = BulkUserActionsAnalyticsHelper.getAnalyticsActionName(viewModel);\n\n if (actionName)\n analyticsData.action = actionName;\n\n const actionData = ObjectHelper.omit(viewModel, BaseBulkUserActionsViewModelKeys);\n\n // Adds extra items like the `yearGroup` on year level actions or `password` on the reset pw action\n if (Object.keys(actionData).length)\n analyticsData.actionData = actionData;\n\n AnalyticsHelper.logUserAction(analyticsData, {\n location: LocationContext.BulkUserActionsWizard,\n workflowPhase: WorkflowPhase.Next,\n actionType: UserAction.BulkAction,\n entity: EntityType.User\n });\n },\n\n logYearGroupRolloverEntry(location: LocationContext): void {\n AnalyticsHelper.logUserAction({\n action: BulkUserActionsAnalyticsHelper.getAnalyticsActionName({ action: 'yearGroupRollover' })\n }, {\n entity: EntityType.User,\n actionType: UserAction.BulkAction,\n workflowPhase: WorkflowPhase.Start,\n location\n });\n },\n\n getJobStatus(status: BatchJobStatus): string | null {\n switch (status) {\n case BatchJobStatus.Completed:\n return 'Success';\n case BatchJobStatus.CompletedWithError:\n return 'Completed with some errors';\n case BatchJobStatus.Failed:\n return 'Failed';\n default:\n return null;\n }\n }\n};","import React from 'react';\n\nimport { Breadcrumb, Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { WizardLayoutContext } from 'libs/shared/context/WizardLayoutContext';\n\ninterface WizardHeaderProps<TStepId> {\n currentStep: TStepId;\n title: string;\n continueButton: JSX.Element;\n backButton: JSX.Element;\n breadcrumbs?: Breadcrumb[];\n hideHeader?: boolean;\n loaded: boolean;\n}\n\nexport function WizardHeader<TStepId>(props: WizardHeaderProps<TStepId>): JSX.Element {\n const { showButtons } = React.useContext(WizardLayoutContext);\n\n return (\n <div className='d-flex justify-content-between'>\n {!props.hideHeader ? (\n <div>\n <h1 className='h2'>{props.title}</h1>\n\n {props.breadcrumbs &&\n <div className='pb-3'>\n <Breadcrumbs breadcrumbs={props.breadcrumbs} />\n </div>\n }\n </div>\n ) : <div/>}\n\n {props.loaded && showButtons && (\n <div className='d-flex align-items-center'>\n {props.backButton}\n {props.continueButton}\n </div>\n )}\n </div>\n );\n}","import React from 'react';\n\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { BaseObject } from 'libs/shared/interfaces';\n\ninterface ObjectListProps<T extends BaseObject = BaseObject> {\n objects: T[];\n objectType: MasterType;\n childComponent: (props: BaseObjectItemProps<T>) => JSX.Element;\n}\n\nexport interface BaseObjectItemProps<T extends BaseObject = BaseObject> {\n object: T;\n objectType: MasterType;\n}\n\nexport function ObjectList<T extends BaseObject = BaseObject>(props: ObjectListProps<T>): JSX.Element {\n const ChildComponent = props.childComponent;\n\n return (\n <ul className='m-0 list-unstyled striped-list'>\n {props.objects.map(object => {\n return (\n <ChildComponent\n key={object.id}\n object={object}\n objectType={props.objectType}\n />\n );\n })}\n </ul>\n );\n}","import React from 'react';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { ObjectList } from 'libs/shared/components/wizard/object-list/ObjectList';\nimport { BatchJobResultErrorCode } from 'libs/shared/enums/BatchJobResultErrorCode';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { BaseObject, CurrentUser, WizardActionVerb } from 'libs/shared/interfaces';\n\nexport type ObjectWithErrorCode<TObject extends BaseObject> = TObject & {\n errorCode: BatchJobResultErrorCode;\n}\n\nexport interface WizardErrorActionButton<TObject = BaseObject> {\n onClick: (erroredObject: ObjectWithErrorCode<TObject>[]) => void;\n text: string;\n}\n\nconst namespace = 'userManager.wizardCompletedWithError';\n\ninterface WizardCompletedWithErrorProps<TObject> {\n erroredObjects: ObjectWithErrorCode<TObject>[];\n totalObjects: number;\n objectType?: MasterType;\n totalErroredResults: number;\n userType?: UserGroup;\n imageCdnUrl: string;\n actionVerb: WizardActionVerb;\n currentUser?: CurrentUser;\n getErrorListItem?: (erroredObjects: ObjectWithErrorCode<TObject>) => JSX.Element;\n actionButton?: WizardErrorActionButton;\n}\n\nexport function WizardCompletedWithError<\n TObject extends BaseObject = BaseObject\n>(\n props: WizardCompletedWithErrorProps<TObject>\n): JSX.Element {\n if (!props.erroredObjects?.length)\n return <></>;\n\n const getTotalUpdatedPhrase = () => {\n if (props.objectType === MasterType.User) {\n if (props.actionVerb === 'Create')\n return props.userType === UserGroup.Learner ? 'totalCreatedStudents' : 'totalCreatedStaff';\n \n return props.userType === UserGroup.Learner ? 'totalActionedStudents' : 'totalActionedStaff';\n }\n if (props.objectType === MasterType.Video) {\n return 'totalActionedVideos';\n }\n return 'totalActionedItems';\n };\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <div className='pb-3'>\n <div className='d-flex justify-content-between'>\n <div>\n <h2 className='h4 mb-3'>\n <Text phrase={props.actionVerb === 'Create' ? 'headingCreate' : 'headingAction'} />\n </h2>\n\n <p>\n <Text\n phrase={getTotalUpdatedPhrase()}\n options={{\n totalUpdated: props.totalObjects - props.totalErroredResults,\n totalObjects: props.totalObjects\n }}\n />\n </p>\n </div>\n </div>\n\n <div className='d-flex align-items-cetner justify-content-between mb-2'>\n <p className='fw-semibold mb-0'>\n <Text\n phrase={props.actionVerb === 'Create' ? 'unsuccessfulCreations' : 'unsuccessfulActions'}\n options={{ smartCount: props.totalErroredResults }}\n />\n </p>\n\n {!!props.actionButton && (\n <DivButton\n className='info-link'\n onClick={() => props.actionButton.onClick(props.erroredObjects)}\n >\n {props.actionButton.text}\n </DivButton>\n )}\n </div>\n\n <ObjectList<ObjectWithErrorCode<TObject>>\n objects={props.erroredObjects}\n objectType={props.objectType}\n childComponent={childProps => props.getErrorListItem(childProps.object)}\n />\n </div>\n </LanguageNamespaceContext.Provider>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"imageWidth\":\"Gjry1\"};","import React from 'react';\nimport { Button } from 'react-bootstrap';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardActionVerb } from 'libs/shared/interfaces';\nimport { ArticleHelper } from 'libs/shared/utils/ArticleHelper';\n\nimport styles from './wizard-failed.scss';\n\nconst namespace = 'userManager.wizardFailed';\n\ninterface WizardFailedProps {\n onClickTryAgain?: () => void;\n failedImageUrl: string;\n actionVerb: WizardActionVerb;\n}\n\ntype Props = React.PropsWithChildren<WizardFailedProps>;\n\nexport function WizardFailed(props: Props): JSX.Element {\n const supportUrl = ArticleHelper.getSupportRequestUrl();\n\n return (\n <div className='d-flex flex-column align-items-center'>\n <div className={`${styles.imageWidth} text-center py-4`}>\n <img\n className='img-fluid'\n src={props.failedImageUrl}\n />\n </div>\n <h2 className='h3'>\n <Text namespace={namespace} phrase='heading' />\n </h2>\n\n <p className='mb-0'>\n <Text namespace={namespace} phrase={props.actionVerb === 'Create' ? 'failedCreate' : 'failedAction'} />\n </p>\n\n {!!supportUrl && (\n <p>\n <Text\n namespace={namespace}\n phrase='contactSupport'\n options={{ href: supportUrl, linkClass: 'info-link' }}\n />\n </p>\n )}\n\n {props.onClickTryAgain && (\n <Button variant='outline-dark' className={!supportUrl ? 'mt-3' : ''} onClick={props.onClickTryAgain}>\n <Text namespace={namespace} phrase='tryAgain' />\n </Button>\n )}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"imageWidth\":\"picjj\"};","import React from 'react';\n\nimport { AppLink } from 'libs/common/backbone/core';\n\nimport { AppLink as AppLinkComponent } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardActionVerb } from 'libs/shared/interfaces';\n\nimport styles from './wizard-succeeded.scss';\n\nconst namespace = 'userManager.wizardSucceeded';\n\ninterface WizardSucceededProps {\n finishAppLink?: AppLink;\n message: string;\n successImageUrl: string;\n actionVerb?: WizardActionVerb;\n onFinish?: () => void;\n}\n\ntype Props = React.PropsWithChildren<WizardSucceededProps>;\n\nexport function WizardSucceeded(props: Props): JSX.Element {\n return (\n <div className='d-flex flex-column align-items-center'>\n <div className={`${styles.imageWidth} text-center pt-4 pb-2`}>\n <img\n className='img-fluid'\n src={props.successImageUrl}\n />\n </div>\n <h2 className='h3'>\n <Text namespace={namespace} phrase='success' />\n </h2>\n <p className='text-center' dangerouslySetInnerHTML={{ __html: props.message }} />\n {props.finishAppLink && (\n <AppLinkComponent className='btn btn-dark' appLink={props.finishAppLink} onClick={props.onFinish}>\n <Text namespace={namespace} phrase='finish' />\n </AppLinkComponent>\n )}\n </div>\n );\n}","export enum BatchJobResultStatus {\n All = 0,\n NoAction = 1,\n Succeed = 2,\n Failed = 3\n}","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { AppLink } from 'libs/common/backbone/core';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { BulkUserActionsAnalyticsHelper } from 'libs/shared/apps/user-manager/utils/BulkUserActionsAnalyticsHelper';\nimport { ObjectWithErrorCode, WizardCompletedWithError, WizardErrorActionButton } from 'libs/shared/components/wizard/status/statuses/completed-with-error/WizardCompletedWithError';\nimport { WizardFailed } from 'libs/shared/components/wizard/status/statuses/failed/WizardFailed';\nimport { WizardSucceeded } from 'libs/shared/components/wizard/status/statuses/succeeded/WizardSucceeded';\nimport { WizardLayoutContext } from 'libs/shared/context/WizardLayoutContext';\nimport { BatchJobStatus } from 'libs/shared/enums/BatchJobStatus';\nimport { BatchJobType } from 'libs/shared/enums/BatchJobType';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { GetResultsRequest, useErroredBulkActions } from 'libs/shared/hooks/useErroredBulkActions';\nimport { useNavLock } from 'libs/shared/hooks/useNavLock';\nimport { BaseObject, BatchJob, BatchJobSummary, CurrentUser, WizardActionVerb } from 'libs/shared/interfaces';\n\ninterface WizardCompletedProps<TObject> {\n job: BatchJob;\n summary: BatchJobSummary;\n userType?: UserGroup;\n objectCount: number;\n objectType: MasterType;\n getResultsRequest: GetResultsRequest;\n onClickTryAgain?: () => void;\n actionSucceededMessage: string;\n actionVerb: WizardActionVerb;\n navLockId?: string;\n onFinish?: () => void;\n\n analyticsOptions?: AnalyticsOptions;\n analyticsData?: HashObject;\n preventLoggingAnalytics: boolean;\n\n imageCdnUrl: string;\n failedImageUrl: string;\n successImageUrl: string;\n \n currentUser?: CurrentUser;\n\n finishAppLink?: AppLink;\n \n getErrorListItem?: (erroredObjects: ObjectWithErrorCode<TObject>) => JSX.Element;\n errorActionButton?: WizardErrorActionButton;\n}\n\nexport function WizardCompleted<\n TObject extends BaseObject = BaseObject\n>(\n props: WizardCompletedProps<TObject>\n): JSX.Element {\n const dispatch = useDispatch();\n const erroredObjects = useErroredBulkActions<TObject>(props.job.id, props.getResultsRequest);\n const navLock = useNavLock();\n const { setShowButtons, showButtons } = React.useContext(WizardLayoutContext);\n\n const [ hasLoggedEvent, setHasLoggedEvent ] = React.useState(false);\n\n React.useEffect(() => {\n if (props.job.type === BatchJobType.RolloverYearGroup) {\n // Clear year level rollover status\n dispatch({\n type: Flight.Actions.INVALIDATE,\n keys: ['year:group:rollover:status'],\n request: null\n });\n }\n }, [props.job.type]);\n\n React.useEffect(() => {\n if (props.preventLoggingAnalytics || hasLoggedEvent)\n return;\n\n setHasLoggedEvent(true);\n\n const analyticsData: HashObject = {\n ...(props.analyticsData ?? {}),\n id: props.job.id,\n userCount: props.summary.totalProcessed,\n totalSucceeded: props.summary.totalSucceeded,\n totalErrored: props.summary.totalErrored,\n totalNoAction: props.summary.totalNoAction\n };\n\n const status = BulkUserActionsAnalyticsHelper.getJobStatus(props.job.status);\n\n if (status)\n analyticsData.status = status;\n \n let analyticsOptionsData: AnalyticsOptions = { workflowPhase: WorkflowPhase.Complete };\n\n if (props.analyticsOptions) {\n analyticsOptionsData = AnalyticsHelper.mergeOptions(props.analyticsOptions, analyticsOptionsData);\n }\n\n AnalyticsHelper.logUserAction(analyticsData, analyticsOptionsData);\n }, [ props.preventLoggingAnalytics, hasLoggedEvent ]);\n\n React.useEffect(() => {\n if (props.navLockId)\n navLock.unlock(props.navLockId);\n }, []);\n\n React.useEffect(() => {\n switch (props.job.status) {\n case BatchJobStatus.Completed:\n case BatchJobStatus.Failed:\n if (showButtons) {\n setShowButtons(false);\n }\n break;\n\n case BatchJobStatus.CompletedWithError:\n if (!showButtons) {\n setShowButtons(true);\n }\n break;\n\n default:\n break;\n }\n }, [props.job.status]);\n\n if (props.job.status === BatchJobStatus.Completed) {\n return (\n <WizardSucceeded\n message={props.actionSucceededMessage}\n successImageUrl={props.successImageUrl}\n actionVerb={props.actionVerb}\n finishAppLink={props.finishAppLink}\n onFinish={props.onFinish}\n />\n );\n }\n\n if (props.job.status === BatchJobStatus.CompletedWithError) {\n return (\n <WizardCompletedWithError<TObject>\n erroredObjects={erroredObjects.objects}\n totalObjects={props.objectCount}\n totalErroredResults={erroredObjects.count}\n userType={props?.userType}\n currentUser={props.currentUser}\n imageCdnUrl={props.imageCdnUrl}\n actionVerb={props.actionVerb}\n objectType={props.objectType}\n getErrorListItem={props.getErrorListItem}\n actionButton={props.errorActionButton}\n />\n );\n }\n\n return (\n <WizardFailed\n onClickTryAgain={props.onClickTryAgain}\n failedImageUrl={props.failedImageUrl}\n actionVerb={props.actionVerb}\n />\n );\n}","import { useDispatch } from 'react-redux';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { ObjectWithErrorCode } from 'libs/shared/components/wizard/status/statuses/completed-with-error/WizardCompletedWithError';\nimport { BatchJobResultStatus } from 'libs/shared/enums/BatchJobResultStatus';\nimport { useInfiniteList } from 'libs/shared/hooks/UseInfiniteList';\nimport { BaseObject, BatchJobResult } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\n\ninterface GetErroredObjects<TObject> {\n objects: ObjectWithErrorCode<TObject>[];\n isFetching: boolean;\n count: number;\n}\n\nexport type GetResultsRequest = (jobId: string, status: BatchJobResultStatus, cursor?: string) => Flight.Request;\n\nexport function useErroredBulkActions<TObject extends BaseObject>(\n jobId: string,\n getResultsRequest: GetResultsRequest\n): GetErroredObjects<TObject> {\n const dispatch = useDispatch();\n\n const getResultsPage = (cursor?: string) => {\n return getResultsRequest(\n jobId,\n BatchJobResultStatus.Failed,\n cursor\n );\n };\n\n const fetchNext = (cursor?: string) => {\n return Flight.getFetch(dispatch)(getResultsPage(cursor));\n };\n\n const {\n items: erroredResults,\n isFetching: isFetchingErroredResults\n } = useInfiniteList<BatchJobResult<TObject>>(getResultsPage, fetchNext);\n\n const objects: ObjectWithErrorCode<TObject>[] = erroredResults?.map(result => {\n if (!result.objectData && result.metadata && 'firstname' in result.metadata) {\n return {\n name: result.metadata.firstname,\n surname: result.metadata.surname,\n userType: UserHelper.getUserType(result.metadata as any),\n username: result.metadata.username,\n errorCode: result.status\n } as unknown as ObjectWithErrorCode<TObject>;\n }\n\n return {\n ...result.objectData,\n errorCode: result.status\n };\n }) ?? [];\n\n return {\n isFetching: isFetchingErroredResults,\n objects: objects,\n count: objects.length // TODO: Get a proper count from the backend\n };\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\n\nconst namespace = 'shared.wizardStepList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface WizardStep<StepId extends string> {\n id: StepId;\n text: string;\n appLink?: Core.AppLink;\n subText?: string;\n disabled?: boolean;\n openInNewTab?: boolean;\n}\n\ninterface WizardStepListTheme {\n item?: string;\n itemsContainer?: string;\n itemContent?: string;\n isSelectedOverride?: string;\n isCompletedOverride?: string;\n}\n\ninterface WizardStepListItemProps {\n appLink: Core.AppLink;\n isSelected: boolean;\n isCompleted: boolean;\n text: string;\n subText?: string;\n disabled: boolean;\n index: number;\n hideStepNumber?: boolean;\n theme?: WizardStepListTheme;\n}\n\nfunction WizardStepListItem(props: WizardStepListItemProps): JSX.Element {\n const content = (\n <>\n <div className='d-flex'>\n {!props.hideStepNumber && <div className='flex-shrink-0 flex-grow-0'>{`${props.index + 1}.`} </div>}\n <div>{props.text}</div>\n </div>\n\n {props.subText && (\n <div className='ms-2 ps-1 pt-1'>\n {props.subText}\n </div>\n )}\n </>\n );\n\n \n let className = 'px-2 py-1 mb-1 rounded d-inline-block';\n\n if (props.isSelected) {\n className += ` ${props.theme?.isSelectedOverride || 'bg-light-blue fw-semibold'}`;\n }\n\n if ((!props.isSelected && props.isCompleted))\n className += ` ${props.theme?.isCompletedOverride || 'text-info'}`;\n\n return (\n <li className={props.theme?.item}>\n {(props.isCompleted && props.appLink)\n ? (\n <AppLink appLink={props.appLink} className={`${className} ${props.theme?.itemContent || ''}`}>\n {content}\n </AppLink>\n ) : (\n <div className={`${className} ${props.theme?.itemContent || ''}`}>\n {content}\n </div>\n )\n }\n </li>\n );\n}\n\ninterface WizardStepListProps<StepId extends string> {\n currentStep: StepId;\n steps: WizardStep<StepId>[];\n disableAppLinks?: boolean;\n theme?: WizardStepListTheme;\n}\n\nexport function WizardStepList<StepId extends string>(props: WizardStepListProps<StepId>): JSX.Element {\n const currentStepNumber = props.steps.reduce((acc, step, i) => {\n if (step.id === props.currentStep)\n acc = i + 1;\n\n return acc;\n }, 1);\n\n return (\n <>\n <h2 className='h4'>\n {getPhrase('stepNumber', { currentStep: currentStepNumber, totalSteps: props.steps.length })}\n </h2>\n\n <ol className={`list-unstyled ${props.theme?.itemsContainer || ''}`}>\n {props.steps.map((step, i) => {\n const isSelected = step.id === props.currentStep;\n const isCompleted = currentStepNumber > i + 1;\n\n return (\n <WizardStepListItem\n index={i}\n key={step.id}\n text={step.text}\n subText={step.subText}\n isSelected={isSelected}\n isCompleted={isCompleted}\n appLink={!props.disableAppLinks && step.appLink}\n disabled={step.disabled}\n theme={props.theme}\n />\n );\n })}\n </ol>\n </>\n );\n}","export enum BatchJobStatus {\n Submitted = 0,\n Queued = 1,\n Pending = 2,\n InProgress = 3,\n Completed = 4,\n CompletedWithError = 5,\n Failed = 6\n}","import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n internalServerError?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError,\n internalServerError: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.InternalServer) {\n if (!ignoreMap.internalServerError)\n Core.ErrorHelper.throw(new UnspecifiedError());\n return;\n }\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import { useEffect } from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { handleHttpError, HttpErrorMap, IgnoreHttpErrorMap } from 'libs/shared/errors/handlers/HttpErrorHandlers';\n\nfunction generateCacheKey(flightObjs: Array<Flight.Response<any>>): string {\n return flightObjs.map(obj => obj.statusCode).join(':');\n}\n\n// TODO: Change this to just `useHandleHttpError` and only accept a status code.\nexport function useHandleObjectError(\n _flightObjs: Flight.Response<any> | Array<Flight.Response<any>>,\n customErrors?: HttpErrorMap,\n ignoreErrors?: IgnoreHttpErrorMap\n): void {\n const flightObjs = Array.isArray(_flightObjs) ? _flightObjs : [_flightObjs];\n\n useEffect(() => {\n flightObjs.forEach(obj => {\n handleHttpError(obj.statusCode, customErrors, ignoreErrors);\n });\n }, [ generateCacheKey(flightObjs), customErrors, ignoreErrors ]);\n}","import { useEffect } from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst SCROLL_TOLERANCE = 400; // value in px\n\ninterface UseInfiniteScrollOptions {\n fetchNextPage: () => void;\n hasMore: boolean;\n isFetching: boolean;\n scrollContainer?: HTMLElement;\n}\n\nexport function useInfiniteScroll(options: UseInfiniteScrollOptions): void {\n const handleScroll = (): void => {\n if (options.isFetching)\n return;\n\n if (!options.scrollContainer) {\n const currentScrollHeight = window.innerHeight + document.documentElement.scrollTop;\n \n const totalHeight = document.documentElement.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n } else {\n const { scrollContainer } = options;\n const currentScrollHeight = scrollContainer.getBoundingClientRect().height + scrollContainer.scrollTop;\n \n const totalHeight = scrollContainer.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n }\n\n options.fetchNextPage();\n };\n\n useEffect(() => {\n const onScroll = FunctionHelper.throttle(handleScroll, 200);\n\n const scrollContainer = options.scrollContainer || window;\n\n if (options.hasMore)\n scrollContainer.addEventListener('scroll', onScroll);\n\n return () => scrollContainer.removeEventListener('scroll', onScroll);\n }, [ options.hasMore, options.fetchNextPage, options.scrollContainer ]);\n}","import { useEffect, useState } from 'react';\n\nimport { HttpStatus, HttpStatusClass } from 'libs/common/backbone/enums/HttpStatus';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { BaseObject, BasePaginatedCollection } from 'libs/shared/interfaces';\n\nimport { useInfiniteScroll } from './UseInfiniteScroll';\nimport { useSelectAllPages } from './UseSelectAllPages';\n\nexport interface UseInfiniteListResult<T extends BaseObject> {\n items: T[];\n hasMore: boolean;\n isFetching: boolean;\n nextCursor: string;\n totalItems?: number;\n hasFirstPageCompleted: boolean;\n}\n\n/**\n * Hook to extract an infinite list from the application state,\n * save it locally in state and only update when new data\n * is fetched.\n * \n * @param getRequest - callback function to get the request for each page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n * \n * @param fetchNext - callback function to fetch a page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n */\nexport function useInfiniteList<TObject = BaseObject, TResponse = BasePaginatedCollection<TObject>>(\n getRequest: ((cursor?: string) => Flight.Request) | false,\n fetchNext: ((cursor?: string) => void) | false,\n onError?: (pageNumber: number, statusCode: HttpStatus) => void,\n getItems?: (responseData: TResponse) => TObject[],\n getCursor?: (responseData: TResponse) => string,\n scrollContainer?: HTMLElement\n): UseInfiniteListResult<TObject> {\n const [ pagesFetched, setPagesFetched ] = useState(0);\n\n const fetchNextFn = fetchNext as (cursor?: string) => void;\n\n function getKey(cursor?: string): string {\n if (!getRequest)\n return null;\n\n const request = getRequest(cursor);\n\n if (!request)\n return null;\n\n return request.key;\n }\n\n const response = useSelectAllPages<TObject, TResponse>(\n getKey,\n getItems,\n getCursor\n );\n\n function fetchNextPage(): void {\n if (!fetchNext || !getRequest || !response)\n return;\n\n setPagesFetched(currentVal => currentVal + 1);\n return fetchNextFn(response.nextCursor);\n }\n\n useInfiniteScroll({\n fetchNextPage,\n hasMore: !!response?.nextCursor,\n isFetching: response?.isFetching,\n scrollContainer\n });\n\n useEffect(() => {\n if (!response)\n return;\n\n if (response.shouldInitialFetch && fetchNext) {\n fetchNextFn();\n setPagesFetched(currentVal => currentVal + 1);\n }\n }, [ response?.shouldInitialFetch, fetchNext ]);\n\n useEffect(() => {\n if (!response?.statusCode || !FunctionHelper.isFunction(onError))\n return;\n\n const httpStatusClass: HttpStatusClass = +(response.statusCode?.toString()?.substr(0, 1));\n\n if (httpStatusClass !== HttpStatusClass.ClientError && httpStatusClass !== HttpStatusClass.ServerError)\n return;\n\n onError(pagesFetched, response.statusCode);\n }, [response?.statusCode]);\n\n return {\n items: response?.items,\n hasMore: !!response?.nextCursor,\n nextCursor: response?.nextCursor,\n isFetching: response?.isFetching,\n totalItems: response?.totalItems,\n hasFirstPageCompleted: response?.hasFirstPageCompleted\n };\n}","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\n\nimport { EntityType, LocationContext, OperationDescriptor, UserAction } from 'libs/analytics/interfaces';\n\nimport { BULK_USER_UPLOAD_NAV_LOCK_ID, BulkUserUploadWizardLayout } from 'libs/shared/apps/user-manager/components/bulk-upload/layout/BulkUserUploadWizardLayout';\nimport { UserManagerClientContext } from 'libs/shared/apps/user-manager/context/UserManagerClientContext';\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\nimport { useBulkUploadUsers } from 'libs/shared/apps/user-manager/hooks/useBulkUploadUsers';\nimport { UserWizardStatusParams } from 'libs/shared/apps/user-manager/interfaces/query-params/UserWizardParams';\nimport { BulkUserActionsHelper } from 'libs/shared/apps/user-manager/utils/BulkUserActionsHelper';\nimport { BulkUserUploadHelper } from 'libs/shared/apps/user-manager/utils/BulkUserUploadHelper';\nimport { WizardCompleted } from 'libs/shared/components/wizard/status/completed/WizardCompleted';\nimport { ObjectWithErrorCode } from 'libs/shared/components/wizard/status/statuses/completed-with-error/WizardCompletedWithError';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { BatchJob, BatchJobSummary, Config, CurrentUser, User } from 'libs/shared/interfaces';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { JobRequests } from 'shared/flight-requests/JobRequests';\n\nimport { getUserManagerAppLinks } from 'apps/user-manager/utils/LiteUserManagerAppLinks';\n\nconst namespace = 'userManager.bulkUserUploadStatusCompleted';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function BulkUserUploadStatusCompleteView(props: UserWizardStatusParams): JSX.Element {\n const { users, existingUserToAdd, existingUsersHash } = useBulkUploadUsers();\n\n const appLinks = getUserManagerAppLinks(props.userType);\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const job = Flight.useBasicFetch<BatchJob>(JobRequests.getJob(props.jobId));\n const summary = Flight.useBasicFetch<BatchJobSummary>(JobRequests.getJobSummary(props.jobId));\n\n useHandleObjectError(job);\n\n useSetPageMetadata({ title: LanguageService.getPhrase(namespace, 'pageTitle') });\n\n const dispatch = useDispatch();\n\n const onCreateJobError = BulkUserActionsHelper.useCreateJobErrorAlert();\n\n const newUsers = BulkUserUploadHelper.getNewUsers(users, existingUsersHash);\n\n function onClickTryAgain(): void {\n const jobData = BulkUserUploadHelper.getJobData({\n users: newUsers,\n existingUsers: existingUserToAdd,\n customerId: currentUser.data.customerId,\n userType: props.userType\n });\n\n Flight.fetch(dispatch, JobRequests.createJob(jobData, onCreateJob, onCreateJobError));\n }\n\n function onCreateJob(job: BatchJob): void {\n Core.AppLinkHelper.trigger({\n ...appLinks.userUploadStatus.polling,\n params: {\n userType: props.userType,\n jobId: job.id\n }\n });\n }\n const totalUsersCount = (newUsers?.length ?? 0) + (existingUserToAdd?.length ?? 0);\n\n function getSuccessMessage(): string {\n return props.userType === UserGroup.Learner\n ? getPhrase('createStudentsSuccess', { smartCount: totalUsersCount })\n : getPhrase('createStaffSuccess', { smartCount: totalUsersCount });\n }\n\n const dataLoaded = !!job.data && !!config.data && !!currentUser.data && !!summary.data;\n\n return (\n <UserManagerClientContext.Provider value={UserManagerClient.Primary}>\n <BulkUserUploadWizardLayout\n appLinks={appLinks}\n userType={props.userType}\n currentStep='status'\n canAddExistingUsers\n >\n {!!dataLoaded && (\n <WizardCompleted\n job={job.data}\n summary={summary.data}\n objectCount={users.length}\n objectType={MasterType.User}\n userType={props.userType}\n finishAppLink={appLinks.userManager}\n imageCdnUrl={config.data.imageCdnUrl}\n successImageUrl={ImageUrls.SUCCESS}\n failedImageUrl={ImageUrls.WIZARD_ERROR}\n currentUser={currentUser.data}\n onClickTryAgain={onClickTryAgain}\n getResultsRequest={JobRequests.getJobResults}\n actionSucceededMessage={getSuccessMessage()}\n navLockId={BULK_USER_UPLOAD_NAV_LOCK_ID}\n actionVerb='Create'\n analyticsOptions={{\n location: LocationContext.BulkUserUploadWizard,\n entity: EntityType.User,\n actionType: UserAction.Create,\n descriptor: OperationDescriptor.Bulk\n }}\n preventLoggingAnalytics={!users}\n getErrorListItem={(object: ObjectWithErrorCode<User>) =>\n BulkUserActionsHelper.getErrorListItem(object, config.data.imageCdnUrl, currentUser.data)\n }\n />\n )}\n </BulkUserUploadWizardLayout>\n </UserManagerClientContext.Provider>\n );\n}","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { UserAuditLogQueryParams } from 'libs/shared/apps/user-manager/components/audit-log/components/audit-log-filters/UserAuditLogFilters';\nimport { SUPPORTED_BATCH_JOB_TYPES } from 'libs/shared/apps/user-manager/utils/BulkUserActionsHelper';\nimport { BatchJobResultStatus } from 'libs/shared/enums/BatchJobResultStatus';\nimport { BatchJobType } from 'libs/shared/enums/BatchJobType';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { BaseObject, BatchJob, BatchJobProgress, BatchJobResultsResponse, CreateBatchJobRequest } from 'libs/shared/interfaces';\n\nexport const JobRequests = {\n createJob(\n data: CreateBatchJobRequest,\n success?: (job: BatchJob) => void,\n error?: () => void\n ): Flight.Request {\n return {\n url: '{gateway}/v1/batch/jobs',\n key: 'create:job',\n type: HttpVerbs.POST,\n data,\n success,\n error\n };\n },\n\n getJobs(queryParams: UserAuditLogQueryParams): Flight.Request {\n const params: HashObject = {};\n\n let bulkActionTypes: BatchJobType[] = [];\n let userTypes: UserGroup[] = [];\n\n if (queryParams.cursor)\n params.cursor = queryParams.cursor;\n\n if (queryParams.sort) {\n if (queryParams.sort === 'oldest')\n params.order = 'ASC';\n else\n params.order = 'DESC';\n }\n\n if (queryParams.bulkActionType) {\n bulkActionTypes = Array.isArray(queryParams.bulkActionType)\n ? queryParams.bulkActionType\n : [queryParams.bulkActionType];\n\n params.type = bulkActionTypes;\n } else {\n // only show supported type in the table by default\n params.type = SUPPORTED_BATCH_JOB_TYPES;\n }\n\n if (queryParams.userType) {\n userTypes = Array.isArray(queryParams.userType)\n ? queryParams.userType\n : [queryParams.userType];\n\n params.dataType = userTypes;\n }\n \n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/batch/jobs', params),\n key: `batch:jobs:${queryParams.cursor}:${queryParams.sort}:${bulkActionTypes.sort().join(':')}:${userTypes.sort().join(':')}`\n };\n },\n\n getJob(id: string): Flight.Request {\n return {\n url: `{gateway}/v1/batch/jobs/${id}`,\n key: `job:${id}`\n };\n },\n\n getJobProgress(\n id: string,\n success?: (progress: BatchJobProgress) => void,\n error?: (xhr?: Xhr) => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/batch/jobs/${id}/progress`,\n key: `job:${id}:progress`,\n invalidationKeys: `job:${id}:progress`,\n success,\n error\n };\n },\n\n getJobResults<TObject extends BaseObject>(\n id: string,\n status: BatchJobResultStatus,\n cursor?: string,\n success?: (results: BatchJobResultsResponse<TObject>) => void,\n error?: (xhr?: Xhr) => void\n ): Flight.Request {\n const params: HashObject = {\n status\n };\n\n if (cursor)\n params.cursor = cursor;\n\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v1/batch/jobs/${id}/results`, params),\n key: `job:${id}:results:${status}:${cursor}`,\n success,\n error\n };\n },\n\n getYearGroupRolloverStatus(customerId: string): Flight.Request {\n return {\n url: `{gateway}/v1/batch/validations/customers/${customerId}/year-group-roll-over`,\n key: 'year:group:rollover:status'\n };\n },\n\n sendJobReports(ids: string[]): Flight.Request {\n return {\n url: '{gateway}/v1/batch/results/export',\n key: `send:job:reports:${ids.sort().join(':')}`,\n type: HttpVerbs.POST,\n data: {\n jobIds: ids\n }\n };\n },\n\n getJobSummary(id: string): Flight.Request {\n return {\n url: `{gateway}/v1/batch/jobs/${id}/summary`,\n key: `job:summary:${id}`\n };\n }\n};"],"names":["namespace","BulkUserUploadBackButton","props","currentStep","AppLink","className","appLink","appLinks","userManager","Text","phrase","BulkUserUploadContinueButton","useBulkUploadUsers","duplicateSets","hasExistingUsers","WizardLayoutContext","disableNext","onClickConfirm","spreadsheetHasDuplicates","length","currentAppLink","ContextService","action","userUploadStatus","polling","complete","userUploadPopup","userUploadReviewAccounts","userUploadFixDuplicates","userUploadReviewExistingAccounts","willUploadOnNext","Button","variant","onClick","disabled","canAddExistingUsers","userUploadConfirmation","getNextAppLink","BULK_USER_UPLOAD_NAV_LOCK_ID","BulkUserUploadWizardLayout","users","setUsers","navLock","useNavLock","lock","id","title","LanguageService","text","appLinkWhitelist","BulkUserUploadHelper","onConfirmUnlock","unlock","replace","WizardHeader","loaded","continueButton","backButton","breadcrumbs","name","settings","userType","UserGroup","active","WizardStepList","steps","children","UserManagerClientContext","updateUserHash","userHash","updatedUserIdsHash","Object","keys","reduce","updatedObj","lookupId","viewModel","setViewModel","updateDuplicates","invalidUsers","hasValidatedUsers","existingUsersHash","existingUserToAdd","newUsers","filter","u","setInvalidUsers","setExistingUsers","existingUsers","updateUser","updatedUser","updatedUsers","map","user","deleteUsers","deletedUsers","userIdHash","prev","curr","BaseBulkUserActionsViewModelKeys","BulkUserActionsAnalyticsHelper","getAnalyticsActionName","subAction","onClickNext","analyticsData","userCount","userIdMap","size","step","actionName","actionData","ObjectHelper","AnalyticsHelper","location","workflowPhase","actionType","entity","logYearGroupRolloverEntry","getJobStatus","status","BatchJobStatus","showButtons","hideHeader","ObjectList","ChildComponent","childComponent","objects","object","key","objectType","WizardCompletedWithError","erroredObjects","value","actionVerb","MasterType","options","totalUpdated","totalObjects","totalErroredResults","smartCount","actionButton","DivButton","childProps","getErrorListItem","WizardFailed","supportUrl","ArticleHelper","src","failedImageUrl","href","linkClass","onClickTryAgain","WizardSucceeded","successImageUrl","dangerouslySetInnerHTML","__html","message","finishAppLink","onFinish","BatchJobResultStatus","WizardCompleted","dispatch","jobId","getResultsRequest","getResultsPage","cursor","Failed","erroredResults","items","isFetchingErroredResults","isFetching","result","objectData","metadata","firstname","surname","UserHelper","username","errorCode","count","useErroredBulkActions","job","setShowButtons","hasLoggedEvent","setHasLoggedEvent","type","BatchJobType","request","preventLoggingAnalytics","summary","totalProcessed","totalSucceeded","totalErrored","totalNoAction","analyticsOptionsData","analyticsOptions","navLockId","actionSucceededMessage","objectCount","currentUser","imageCdnUrl","errorActionButton","getPhrase","WizardStepListItem","content","hideStepNumber","index","subText","isSelected","theme","isSelectedOverride","isCompleted","isCompletedOverride","item","itemContent","currentStepNumber","acc","i","totalSteps","itemsContainer","disableAppLinks","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","internalServerError","handleHttpError","info","customErrorMap","ignoreMap","statusCode","errorMap","generateCacheKey","flightObjs","obj","join","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","Array","isArray","useEffect","forEach","SCROLL_TOLERANCE","useInfiniteList","getRequest","fetchNext","onError","getItems","getCursor","scrollContainer","handleScroll","useState","pagesFetched","setPagesFetched","fetchNextFn","response","fetchNextPage","currentVal","nextCursor","hasMore","getBoundingClientRect","height","scrollTop","scrollHeight","window","innerHeight","document","documentElement","onScroll","FunctionHelper","addEventListener","removeEventListener","shouldInitialFetch","httpStatusClass","toString","substr","HttpStatus","totalItems","hasFirstPageCompleted","BulkUserUploadStatusCompleteView","config","onCreateJobError","onCreateJob","params","totalUsersCount","dataLoaded","data","jobData","customerId","descriptor","JobRequests","createJob","success","error","url","getJobs","queryParams","bulkActionTypes","userTypes","sort","order","bulkActionType","dataType","getJob","getJobProgress","invalidationKeys","getJobResults","getYearGroupRolloverStatus","sendJobReports","ids","jobIds","getJobSummary"],"sourceRoot":""}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[9042],{93479:(e,t,a)=>{a.d(t,{I:()=>s});var n=a(99940);function r(e,t,a){if(!t)return e;var n="".concat(e,":").concat(t.start,":").concat(t.end),r=Array.isArray(t.userId)?t.userId.sort().join(":"):t.userId,i=Array.isArray(t.groupId)?t.groupId.sort().join(":"):t.groupId,s=Array.isArray(t.customerId)?t.customerId.sort().join(":"):t.customerId;return r&&(n+=":".concat(r)),i&&(n+=":".concat(i)),s&&(n+=":".concat(s)),a&&(n+=":".concat(a)),n}function i(e,t,a){return{currentUserId:e.id,currentCustomerId:e.customerId,dateRange:t?{start:t.start,end:t.end}:void 0,userIds:null==t?void 0:t.userId,classroomsAndGroups:null==t?void 0:t.groupId,shareId:a}}var s={interactiveResultSet:function(e,t,a,s,o,c,l,u){return{url:o?"/api/domain/v3/analytics/interactives/".concat(e,"/metadata/").concat(t):"/api/domain/v2/analytics/interactives/".concat(e,"/metadata/").concat(t),key:r("interactive:result:set:".concat(e,":").concat(t,":").concat(o),s),data:i(a,s,o),type:n.k.POST,normalize:!1,success:c,error:l,always:u}},mark:function(e,t,a,r,i,s,o){return{url:"/api/domain/v1/analytics/answers/".concat(a),key:"mark:answer:".concat(a,":").concat(r.resultId),type:n.k.PUT,data:r,normalize:!1,invalidationKeys:"interactive:result:set:".concat(e,":").concat(t),success:i,error:s,always:o}},pendingReviews:function(e){return{url:"/api/domain/v1/analytics/interactives/pending-reviews/summary",key:"interactives:pending:reviews",type:n.k.POST,data:e}},interactiveResultsReport:function(e){return{url:"/api/domain/v3/analytics/interactives/report",key:"interactive:results:report",data:e,type:n.k.POST,normalize:!1}}}},2510:(e,t,a)=>{var n;a.d(t,{y:()=>n}),function(e){e.Link="Link",e.Classroom="Classroom",e.Open="Open",e.Live="Live",e.LegacyDirect="LegacyDirect"}(n||(n={}))},21789:(e,t,a)=>{a.d(t,{x:()=>s});var n=a(75896),r=a(110),i=a(4594),s={getFlattenedRecipients:function(e){return n.m.flatten(e.map(function(e){var t;return null!==(t=e.recipients)&&void 0!==t?t:[]}))},getFlattenedUniqueScopes:function(e){var t=s.getFlattenedRecipients(e);return n.m.uniq(t.map(function(e){var t;return null===(t=e.scopeId)||void 0===t?void 0:t.toString()})).filter(function(e){return!!e})},getClassroomIdFromShare:function(e){var t,a=null===(t=e.recipients)||void 0===t?void 0:t[0];if(a)return a.scopeId?a.scopeId.toString():a.recipientId&&a.recipientTypeId===i.E.Classroom?a.recipientId.toString():void 0},getClassroomForShare:function(e,t){var a=s.getClassroomIdFromShare(e);if(a)return t.find(function(e){return e.id.toString()===a.toString()})},getRecipientsCount:function(e,t){var a,n,r,i;return t?null!==(i=null===(r=e.recipients)||void 0===r?void 0:r.filter(function(e){return e.recipientTypeId===t}).length)&&void 0!==i?i:0:null!==(n=null===(a=e.recipients)||void 0===a?void 0:a.length)&&void 0!==n?n:0},hasShareExpired:function(e){if(e.expireDate){var t=new Date,a=new Date(e.expireDate);if(r.O.isAfter(t,a))return!0}return!1},calculateDaysToExpiry:function(e){if(e.expireDate){var t=r.O.diffBetween(new Date(e.expireDate),new Date,"day")||1;return 0===t?1:t}},getShareLocalExpiry:function(e,t){if(!e.expireDate)return null;var a=r.O.convertUTCToLocal(e.expireDate);return r.O.format(a,t)}}},49863:(e,t,a)=>{a.d(t,{m9:()=>S,Ad:()=>E,Kh:()=>I});var n=a(32735),r=a(23481),i=a(75896),s=a(97408),o=a(18995),c=a(12528),l=a(83914),u=a(36532),d=a(4594),m=a(36511),p=a(35223),v=a(64818);const y={avatarContainer:"ByxQa",sm:"EgJ0v",sharedAvatar:"cW0NT"};var f=r.T.encloseNamespace("reportsShare.sharedToAvatarList");function h(e){var t=i.m.countBy(e,"typeId"),a=t[d.E.User],n=t[d.E.Classroom],r=t[d.E.ClassroomGroup];return a&&n&&r?f("classroomsGroupsAndUsers",{userCount:a,classroomCount:n,groupCount:r}):a&&n?f("classroomsAndUsers",{userCount:a,classroomCount:n}):a&&r?f("groupsAndUsers",{userCount:a,groupCount:r}):n&&r?f("classroomsAndGroups",{classroomCount:n,groupCount:r}):a?f("users",{userCount:a}):n?f("classrooms",{classroomCount:n}):r?f("groups",{groupCount:r}):void 0}function g(e){var t,a,r,i,o,f=(null===(t=e.item)||void 0===t?void 0:t.typeId)===d.E.User&&e.item,h=(null===(a=e.item)||void 0===a?void 0:a.typeId)===d.E.Classroom&&e.item,g=(null===(r=e.item)||void 0===r?void 0:r.typeId)===d.E.ClassroomGroup&&e.item,S="d-flex justify-content-center align-items-center text-white rounded-circle h-100 w-100";return n.createElement(n.Fragment,null,!!f&&n.createElement(u.u,{title:"".concat(f.name," ").concat(f.surname),spanHack:!0,spanHackClassName:"h-100 w-100"},n.createElement(s.q,{imageUrl:null===(i=f.avatar)||void 0===i?void 0:i.url,imageCdnUrl:e.imageCdnUrl,initials:v.l.getInitials(f.name,f.surname),extraClasses:y.sharedAvatar})),!!h&&n.createElement(u.u,{title:h.name,spanHack:!0,spanHackClassName:"h-100 w-100"},n.createElement("div",{className:S},n.createElement(c.f,{svgName:p.vn.Classrooms,svgSize:l.S.Large,variant:"teal"}))),!!g&&n.createElement(u.u,{title:g.name,spanHack:!0,spanHackClassName:"h-100 w-100"},n.createElement("div",{className:S},n.createElement(c.f,{svgName:p.vn.Group,variant:(0,m.I)(null===(o=g.metadata)||void 0===o?void 0:o.colour)}))))}function S(e){return n.createElement("div",{className:"".concat(y.avatarContainer," ").concat("sm"===e.avatarSize?y.sm:"")},n.createElement(u.u,{title:f("anonymous"),spanHack:!0,spanHackClassName:"bg-light text-dark d-flex justify-content-center align-items-center rounded-circle h-100 w-100"},n.createElement(l.x,{svgName:p.vn.Anonymous,size:"sm"===e.avatarSize?l.S.Small:null})))}function E(e){return n.createElement("div",{className:"".concat(y.avatarContainer," ").concat("sm"===e.avatarSize?y.sm:"")},n.createElement(u.u,{title:e.text||f("sharedLink"),spanHack:!0,spanHackClassName:"bg-light text-dark d-flex justify-content-center align-items-center rounded-circle h-100 w-100 ".concat(e.className||"")},n.createElement(l.x,{svgName:p.vn.Link,size:"sm"===e.avatarSize?l.S.Small:null})))}function I(e){return n.createElement(o.e,Object.assign({},e,{items:e.recipients,avatarItem:g,avatarContainerClassname:"".concat(y.avatarContainer," ").concat("sm"===e.avatarSize?y.sm:""),getHiddenTooltip:h,hasShareLink:e.hasShareLink,shareLinkText:e.shareLinkText}))}I.defaultProps={maxAvatars:5}},65853:(e,t,a)=>{a.d(t,{R:()=>m});var n=a(23481),r=a(110),i=a(4594),s=a(49080),o=a(26361),c=a(35223),l=a(31908);function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,n=Array(t);a<t;a++)n[a]=e[a];return n}var d=n.T.encloseNamespace("share.shareLinkInfo"),m={getPrivateIconAndText:function(e){var t=e.entityTypeId,a=e.privacy,n=e.hasStudentExp,r=e.entity,s=e.yearGroups;if(t===i.E.Topic||t===i.E.Series)return{icon:c.vn.VisibleOn,text:d(n?"justMySchoolTeachers":"justMySchoolDescription")};if(!Array.isArray(a))switch(a.privacy){case"public":return{icon:c.vn.VisibleOn,text:d("publicDescription")};case"protected":return a.overrideRestrictions?{icon:c.vn.VisibleOn,text:d("clickViewOnly")}:{icon:c.vn.Lock,text:m.getRespectRatingText(r,s,n)};case"just_my_customer":return a.overrideRestrictions?{icon:c.vn.Lock,text:d(n?"justMySchoolTeachers":"justMySchoolDescription")}:{icon:c.vn.Lock,text:m.getRespectRatingText(r,s,n)};case"restricted":case"private":return{icon:c.vn.Lock,text:d("privateDescription")};default:return{}}},getIconAndText:function(e){var t=e.linkExpireDate,a=e.isPasswordProtected,n=e.status;if(!t&&!a)return m.getPrivateIconAndText(e);if(!t)return{icon:c.vn.Lock,text:d("password")};var i=r.O.isToday(t),o=r.O.diffBetween(t,new Date,"day");if(!a){var l=i?d("expiryToday"):d("expiry",{days:o});return n===s.F.Expired&&(l=d("expired")),{icon:c.vn.Timer,text:l}}var u=i?d("passwordExpiryToday"):d("passwordExpiry",{days:o});return n===s.F.Expired&&(u=d("passwordExpired")),{icon:c.vn.Lock,text:u}},getRespectRatingText:function(e,t,a){var n;if(!e||!t)return null;if(a)return d("justMySchoolTeachers");if(!l.M.isVideoType(e))return d("collectionRating");var r=o.l.getWeightedRestriction(null===(n=e._restrictions)||void 0===n?void 0:n.value);if(r&&!r.yearGroup)return d("onlyAdmins");var i,s,c,m=l.M.getRating(e),p=function(e,t){var a="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!a){if(Array.isArray(e)||(a=function(e,t){if(e){if("string"==typeof e)return u(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?u(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){a&&(e=a);var n=0,r=function(){};return{s:r,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,s=!0,o=!1;return{s:function(){a=a.call(e)},n:function(){var e=a.next();return s=e.done,e},e:function(e){o=!0,i=e},f:function(){try{s||null==a.return||a.return()}finally{if(o)throw i}}}}(t);try{for(p.s();!(c=p.n()).done;){var v=c.value;(!i||v.value>i.value)&&(i=v),r&&v.value<=r.yearGroup||m&&v.rating.value<m.value||(!s||v.value<s.value)&&(s=v)}}catch(e){p.e(e)}finally{p.f()}return s?1===t.length?d("clickViewOnly"):s.value===i.value?d("maxYearGroup",{yearGroup:i.name}):d("yearGroupRange",{yearGroup:s.name}):d("onlyStaff")}}},18995:(e,t,a)=>{a.d(t,{e:()=>c});var n=a(32735),r=a(23481),i=a(49863),s=a(36532),o=r.T.encloseNamespace("shared.avatarList");function c(e){var t=e.items.length>e.maxAvatars?e.items.slice(0,e.maxAvatars-1):e.items,a=e.items.length>t.length?e.items.slice(e.maxAvatars-1):[],r=e.avatarItem,c=a.length,l="sm"===e.avatarSize?4:8;function u(t){return{transform:"translateX(".concat((e.hasShareLink?t+1:t)*-l,"px)"),zIndex:e.maxAvatars-t}}return 0===t.length&&0===a.length?n.createElement(n.Fragment,null):n.createElement("div",{className:"d-flex",style:{marginRight:"-".concat((t.length-1+(a.length?1:0)+(e.hasShareLink?1:0))*l,"px")}},e.hasShareLink&&n.createElement("div",{style:{zIndex:e.maxAvatars+1}},n.createElement(i.Ad,{text:e.shareLinkText,avatarSize:e.avatarSize,className:"bg-dark text-white"})),t.map(function(t,a){return n.createElement("div",{className:"".concat(e.avatarContainerClassname||""),key:t.id,style:u(a)},n.createElement(r,{item:t,imageCdnUrl:e.imageCdnUrl,index:a,maxAvatars:e.maxAvatars}))}),!!a.length&&n.createElement("div",{className:"".concat(e.avatarContainerClassname||""," bg-white rounded-circle"),style:{transform:"translateX(".concat(t.length*-l,"px)"),zIndex:e.maxAvatars-t.length}},n.createElement(s.u,{title:e.getHiddenTooltip?e.getHiddenTooltip(a):e.roleToDisplay?o("staff"===e.roleToDisplay?"staff":"student",{count:c,smartCount:c}):o("users",{count:c,smartCount:c}),spanHack:!0,spanHackClassName:"h-100 w-100"},n.createElement("div",{className:"d-flex justify-content-center align-items-center border border-dark rounded-circle h-100 w-100 ".concat(e.numberClassname||"")},"+".concat(a.length)))))}c.defaultProps={maxAvatars:5}},39902:(e,t,a)=>{a.d(t,{FN:()=>v,SW:()=>y,fh:()=>p});var n=a(32735),r=a(20354),i=a(75896);function s(e){return function(e){if(Array.isArray(e))return c(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||o(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function o(e,t){if(e){if("string"==typeof e)return c(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?c(e,t):void 0}}function c(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,n=Array(t);a<t;a++)n[a]=e[a];return n}function l(e){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},l(e)}function u(e,t,a){return(t=function(e){var t=function(e){if("object"!=l(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var a=t.call(e,"string");if("object"!=l(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==l(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}var d=function(e,t){var a={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(a[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(n=Object.getOwnPropertySymbols(e);r<n.length;r++)t.indexOf(n[r])<0&&Object.prototype.propertyIsEnumerable.call(e,n[r])&&(a[n[r]]=e[n[r]])}return a},m=50;function p(e,t){var a=i.m.chunk(e,m).map(function(e){return t(i.m.uniq(e))}),n=r.a.useBasicFetchAll(a),s=i.m.flatten(n.data),o=n.data.length?s.reduce(function(e,t){return Object.assign(Object.assign({},e),u({},t.id,t))},{}):null;return{itemsArr:s,items:o,isFetching:n.isFetching,hasCompleted:n.hasCompleted}}function v(e,t,a){var r=null!=a?a:function(e){return"object"===l(e)?e.id:e},i=y({getRequest:t,_getKey:a}),s=i.fetchItems,o=d(i,["fetchItems"]);return n.useEffect(function(){(null==e?void 0:e.length)&&s(e)},[null==e?void 0:e.map(r).join(",")]),o}function y(e){var t,a,c,d,p,v=null!==(t=e._getKey)&&void 0!==t?t:function(e){return"object"===l(e)?e.id:e},y=n.useRef(new Set),f=(d=n.useState([]),p=2,function(e){if(Array.isArray(e))return e}(d)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var n,r,i,s,o=[],c=!0,l=!1;try{if(i=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;c=!1}else for(;!(c=(n=i.call(a)).done)&&(o.push(n.value),o.length!==t);c=!0);}catch(e){l=!0,r=e}finally{try{if(!c&&null!=a.return&&(s=a.return(),Object(s)!==s))return}finally{if(l)throw r}}return o}}(d,p)||o(d,p)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),h=f[0],g=f[1],S=r.a.useBasicFetchAll(h),E=i.m.flatten(S.data),I=S.data.length?E.reduce(function(e,t){return Object.assign(Object.assign({},e),u({},v(t),t))},{}):null;return{hasFirstRequestCompleted:!!(null===(c=null===(a=S.responses)||void 0===a?void 0:a[0])||void 0===c?void 0:c.hasCompleted),itemsArr:E,items:I,isFetching:S.isFetching,fetchItems:function(t){if(null==t?void 0:t.length){var a=[];t.forEach(function(e){var t=v(e);y.current.has(t)||(a.push(e),y.current.add(t))}),a.length&&g(function(t){return[].concat(s(t),s(i.m.chunk(a,m).map(e.getRequest)))})}}}}},36511:(e,t,a)=>{a.d(t,{I:()=>r});var n=a(38129);function r(e){switch(e){case n.R.Pink:return"pink";case n.R.Orange:return"orange";case n.R.Green:return"green";case n.R.Blue:return"blue";case n.R.Purple:return"purple";case n.R.Indigo:return"indigo";default:return"pink"}}},58647:(e,t,a)=>{a.r(t),a.d(t,{SharedByMeView:()=>Se});var n=a(32735),r=a(81886),i=a(23481),s=a(97958),o=i.T.encloseNamespace("share.sharedByMeEmptyState");function c(e){return n.createElement(s.u,null,n.createElement(s.u.Image,{src:e.imageUrl,size:"small"}),n.createElement(s.u.Heading,null,o(e.useInteractiveCopy?"interactivesHeading":"genericHeading")),n.createElement(s.u.Info,null,o(e.useInteractiveCopy?"interactivesInfo":"genericInfo")),!!e.appLink&&n.createElement(s.u.Cta,{appLink:e.appLink,text:o("cta")}))}var l=a(95834),u=a(6748),d=a(82602),m=a(75896),p=a(110),v=a(65858),y=a(83914),f=a(36532),h=a(49080),g=a(85063),S=a(35223);const E={indicatorContainer:"T6YAv",indicator:"_MRHG"};var I=i.T.encloseNamespace("share.shareStatusIndicator");function b(e){if(e.type===g.y.DirectShare)return I("active");switch(e.status){case h.F.Active:return I("active");case h.F.Expired:return I("expired")}}function C(e){if(e.type===g.y.DirectShare)return"bg-success";switch(e.status){case h.F.Active:return"bg-success";case h.F.Expired:return"bg-gray-500"}}function O(e){var t;return e.share.type!==g.y.DirectShare||(null===(t=e.share.recipients)||void 0===t?void 0:t.length)?e.share.type===g.y.ShareLink&&e.share.isPasswordProtected?n.createElement(f.u,{title:I("passwordProtected"),spanHack:!0},n.createElement(y.x,{svgName:S.vn.Lock,size:y.S.Small})):n.createElement(f.u,{title:b(e.share),spanHack:!0,spanHackClassName:E.indicatorContainer},n.createElement("div",{className:"".concat(E.indicator," ").concat(C(e.share))})):n.createElement(n.Fragment,null)}var A=a(9806),x=a(49863),T=a(31754),k=a(65853),N=a(64249),w=a(83657),L=a(15611),R=a(83345),j=a(62335),M=a(26339),H=a(4594),_=a(31908);function F(e){return F="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},F(e)}var D="share.sharedByMeTable",P=i.T.encloseNamespace(D);function U(e){var t;if(e.type===g.y.ShareLink||!(null===(t=null==e?void 0:e.recipients)||void 0===t?void 0:t.length))return e.dateCreated;var a=e.recipients.map(function(e){return e.dateShared});return a.sort(function(e,t){return p.O.isSame(e,t)?0:p.O.isAfter(e,t)?1:-2}),a.length?m.m.last(a):""}function G(e){var t=e.index,a=e.dateHeading,r=e.getObjectAppLink,i=e.getObjectActions,s=e.imageCdnUrl,o=e.showStatus,c=e.showViewCount,l=e.breakpoints,u=e.yearGroups,m=l&&(l.xs||l.sm),p=[{Header:o?"":a,accessor:"sharedObject",id:"image",Cell:function(e){var t=e.value;return n.createElement("div",{className:"w-100"},n.createElement(A.k,{object:t,appLink:r(t),showVideoMetadata:!0,locationContext:v.LZ.SharedByMe}))},minWidth:140,maxWidth:30},{accessor:"sharedObject",id:"name",Cell:function(e){var t,a=e.value;if(a.name){if(_.M.isVideoType(a)&&!(null===(t=_.M.getCanBeConsumed(a))||void 0===t?void 0:t.canNavigate))return n.createElement("span",{className:"clamp-2"},a.name);var i=function(){switch(a.typeId){case H.E.Series:return"series";case H.E.Playlist:return"playlist"}}();return n.createElement("div",{className:"clamp-2"},i&&n.createElement(j.m,null,n.createElement(R.x,{namespace:D,phrase:i})),_.M.isVideoType(a)&&n.createElement(M.$,{type:"series",video:a,appLink:"series"in a&&a.series?r(a.series):null,analyticsOptions:{location:v.LZ.Insights}}),n.createElement(L.F,{appLink:r(a),analyticsData:{id:a.id,name:a.name},analyticsOptions:{entity:N.I.getAnalyticsEntity(a.type),actionType:v.Vw.Click,location:v.LZ.SharedByMe}},a.name))}return n.createElement("span",null,n.createElement(R.x,{namespace:D,phrase:"videoUnavailable"}))},width:60},{Header:0===t?P("sharedTo"):"",accessor:"sharedToData",Cell:function(e){var t=e.value,a=t.share,r=t.sharedObject,i=t.recipients;if(!i){var o=a.type===g.y.ShareLink&&k.R.getIconAndText({entity:r,entityTypeId:r.typeId,hasStudentExp:!1,isPasswordProtected:a.isPasswordProtected,linkExpireDate:a.linkExpireDate,privacy:{privacy:a.privacy,overrideRestrictions:a.overrideRestrictions},status:a.status,yearGroups:null!=u?u:[]});return n.createElement(x.Ad,{text:null==o?void 0:o.text})}return(null==i?void 0:i.length)?n.createElement(x.Kh,{recipients:i,imageCdnUrl:s,maxAvatars:m?1:2}):n.createElement(x.m9,null)},width:40},!m&&{Header:0===t?P("shared"):"",id:"dateShared",accessor:function(e){return(0,d.WU)(e.dateShared)},width:40},{accessor:"sharedObject",id:"actions",Cell:function(e){var t=e.value;return n.createElement(w.e,{actions:i(t),className:"w-100 justify-content-end pe-2"})},width:20}],y={Header:a,accessor:"share",id:"status",Cell:function(e){var t=e.value;return n.createElement(O,{share:t})},width:5},f={Header:P("views"),accessor:"viewCount",width:30};return o&&p.splice(0,0,y),c&&p.splice(p.length-1,0,f),p.filter(Boolean)}function V(e){var t,a,r,i,s,o,c,d,m=(t=e.sentShares,a=e.sharedObjects,r=e.shareRecipients,i=!!e.groupByDateShared,s=[],t.forEach(function(e){var t,n,i=null==a?void 0:a[e.objectId],o=null;e.type===g.y.DirectShare&&(o=[],null===(t=e.recipients)||void 0===t||t.forEach(function(e){var t=null==r?void 0:r[e.id];t&&o.push(t)})),i&&s.push({share:e,sharedObject:i,sharedToData:{share:e,sharedObject:i,recipients:o},dateShared:U(e),viewCount:null!==(n=e.viewCount)&&void 0!==n?n:0})}),i?T.x.groupByDateShared(s):(o={},c=P("title"),d=s,(c=function(e){var t=function(e){if("object"!=F(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var a=t.call(e,"string");if("object"!=F(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==F(t)?t:t+""}(c))in o?Object.defineProperty(o,c,{value:d,enumerable:!0,configurable:!0,writable:!0}):o[c]=d,o));return n.createElement(n.Fragment,null,Object.keys(m).map(function(t,a){return n.createElement(u.i,{key:a,columns:G({index:a,dateHeading:t,getObjectAppLink:e.getObjectAppLink,getObjectActions:e.getObjectActions,imageCdnUrl:e.imageCdnUrl,showStatus:e.showStatus,showViewCount:e.showViewCount,breakpoints:e.breakpoints,yearGroups:e.yearGroups}),data:m[t],theme:l.J})}))}var B=a(87801),z=a(16714),Y=a(79967),W=a(22902),q=a(79612),K=a(37802),Q=a(99742),X=a(14070),Z=a(97291),$=a(20354),J=a(1048),ee=a(93479),te=a(30439),ae=a(39151),ne=a(1666),re=a(31949),ie=a(39902),se=a(60115),oe={getDirectShares:function(e){var t;return null!==(t=null==e?void 0:e.filter(function(e){return e.type===g.y.DirectShare}))&&void 0!==t?t:[]},getRecipients:function(e){return m.m.flatten(oe.getDirectShares(e).map(function(e){var t;return null!==(t=e.recipients)&&void 0!==t?t:[]}))}},ce=a(86099),le=a(2523);const ue={imageColumn:"uIOaA",nameColumn:"Nta2B",sharedToColumn:"XTJBC",dateSharedColumn:"HdARK",actionsColumn:"DXyZw",heading:"XZ6o7",image:"MolfU",name:"MM43m",avatar:"EboYM",date:"by_XM",actions:"_S2M_"};function de(){return n.createElement("div",{className:"d-flex striped-row rounded"},n.createElement("div",{className:"d-flex align-items-center justify-content-center p-2 ".concat(ue.imageColumn)},n.createElement("div",{className:"partial-loading-background rounded w-100 ".concat(ue.image)})),n.createElement("div",{className:"d-flex align-items-center p-2 ".concat(ue.nameColumn)},n.createElement("div",{className:"partial-loading-background w-75 ".concat(ue.name)})),n.createElement("div",{className:"d-flex align-items-center p-2 ".concat(ue.sharedToColumn)},n.createElement("div",{className:"partial-loading-background ".concat(ue.avatar)})),n.createElement("div",{className:"d-none d-md-flex align-items-center p-2 ".concat(ue.dateSharedColumn)},n.createElement("div",{className:"partial-loading-background ".concat(ue.date)})),n.createElement("div",{className:"d-flex align-items-center justify-content-end p-2 ".concat(ue.actionsColumn)},n.createElement("div",{className:"partial-loading-background rounded me-2 ".concat(ue.actions)})))}function me(e){return n.createElement("div",{className:"d-flex mb-1"},n.createElement("div",{className:"".concat(ue.imageColumn," p-2")},n.createElement("div",{className:"partial-loading-background ".concat(ue.heading)})),n.createElement("div",{className:"".concat(ue.nameColumn," p-2")}," "),n.createElement("div",{className:"".concat(ue.sharedToColumn," p-2")},e.fullHeader?n.createElement("div",{className:"partial-loading-background ".concat(ue.heading)}):n.createElement(n.Fragment,null," ")),n.createElement("div",{className:"".concat(ue.dateSharedColumn," p-2 d-none d-md-flex")},e.fullHeader?n.createElement("div",{className:"partial-loading-background ".concat(ue.heading)}):n.createElement(n.Fragment,null," ")),n.createElement("div",{className:"".concat(ue.actionsColumn," p-2")}," "))}function pe(){return n.createElement(n.Fragment,null,n.createElement("div",{className:"mb-3"},n.createElement(me,{fullHeader:!0}),n.createElement("div",{className:"striped-list no-full-width"},n.createElement(de,null),n.createElement(de,null),n.createElement(de,null))),n.createElement("div",{className:"mb-3"},n.createElement(me,null),n.createElement("div",{className:"striped-list no-full-width"},n.createElement(de,null),n.createElement(de,null),n.createElement(de,null),n.createElement(de,null))),n.createElement("div",{className:"mb-3"},n.createElement(me,null),n.createElement("div",{className:"striped-list no-full-width"},n.createElement(de,null),n.createElement(de,null),n.createElement(de,null),n.createElement(de,null),n.createElement(de,null),n.createElement(de,null),n.createElement(de,null),n.createElement(de,null),n.createElement(de,null),n.createElement(de,null))))}var ve=a(70227),ye=i.T.encloseNamespace("liteShare.sharedByMe");function fe(e,t){return{label:ye("editShareSettings"),appLink:{application:Z.O.SHARE,action:X.e.Share.SHARE,args:[e.id],params:{entityType:t}}}}function he(e){return n.createElement(f.u,{title:e.label,spanHack:!0},n.createElement("a",{href:e.url,target:"_blank"},n.createElement(y.x,{svgName:S.vn.Analytics})))}var ge=i.T.encloseNamespace("liteShare.sharedByMe");function Se(){var e=(0,W.T)().hasPermissions,t=(0,K.r)(null).hasShareFlowV2,a=(0,Y.k)(),i=function(e,t){var a,n,r=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],i=$.a.useGetFetch(),s=$.a.useBasicFetch(re.N.currentUser()),o=$.a.useBasicFetch(ae.L.config()),c=$.a.useBasicFetch((null===(a=s.data)||void 0===a?void 0:a.isAuthenticated)&&ne.h.yearGroups(s.data.customerId)),l=function(t){return r&&te.o.sentShare(Object.assign({cursor:t},e))},u=function(e){return i(l(e))},d=(0,se.K)(l,u),m=d.items,p=d.hasMore,v=d.isFetching,y=d.nextCursor,f=d.hasFirstPageCompleted,h=(0,ie.FN)(null==m?void 0:m.map(function(e){return e.objectId}),te.o.sharedObjectsById),g=(0,ie.FN)(oe.getRecipients(m).map(function(e){return e.id}),function(e){return te.o.getRecipientsById(e,s.data.customerId)}),S=(0,ie.FN)(t?J.t.values(h.items||[]):[],function(e){return ee.I.pendingReviews({interactives:e.filter(_.M.isInteractive).map(function(e){return{interactiveId:e.interactiveId,metadataId:e.id}}),filters:{currentCustomerId:s.data.customerId,currentUserId:s.data.id}})},function(e){return"".concat(e.id,":").concat(e.interactiveId)}),E=v||h.isFetching||g.isFetching||S.isFetching||c.isFetching,I=!f||(null==m?void 0:m.length)&&!h.hasFirstRequestCompleted;return{sentShares:m,sharedObjects:h,shareRecipients:g,yearGroups:c.data,interactivesPendingReview:S,isFetching:E,showPartialLoading:I,nextCursor:y,hasMore:p,fetchNext:u,imageCdnUrl:null===(n=o.data)||void 0===n?void 0:n.imageCdnUrl}}(),s=i.sentShares,o=i.sharedObjects,l=i.shareRecipients,u=i.isFetching,d=i.showPartialLoading,m=i.nextCursor,p=i.hasMore,v=i.fetchNext,y=i.imageCdnUrl,f=i.yearGroups,h=e(z.C.ViewMyShares)&&t;n.useEffect(function(){h&&r.Q.C$.trigger({application:Z.O.MY_SHARES,action:X.e.MyShares.HOME},{replace:!0})},[h]),(0,q.M)({title:ge("sharedByMe")});var g=function(e){var t=$.a.useBasicFetch(ae.L.config()),a=e.xs||e.sm;return n.useCallback(function(e){return function(e,t,a){var r,i="viewUsage";if(_.M.isVideo(e)&&(r="video"),_.M.isInteractive(e)&&(r="interactive",i="viewResults"),_.M.isClip(e)&&(r="clip"),e.typeId===H.E.Series&&(r="series"),e.typeId===H.E.Playlist&&(r="playlist"),_.M.isVideoType(e)&&!_.M.getCanBeConsumed(e).canConsume)return[];var s=[fe(e,r)],o=ve.c.getObjectUrl(null==a?void 0:a.analyticsWebUrl,e);return o&&s.push({label:t?ye(i):function(){return n.createElement(he,{label:ye(i),url:o})},className:"btn btn-link",button:!t,href:ve.c.getObjectUrl(null==a?void 0:a.analyticsWebUrl,e),openInNewTab:!0}),s}(e,a,t.data)},[a])}(a);return n.createElement("div",{className:"px-3"},!h&&n.createElement(le.w,null),d?n.createElement(pe,null):s.length?n.createElement(n.Fragment,null,n.createElement(V,{sentShares:s,sharedObjects:o.items,shareRecipients:l.items,getObjectAppLink:ce.Qh,getObjectActions:g,groupByDateShared:!0,breakpoints:a,yearGroups:f,imageCdnUrl:y}),(p||u)&&n.createElement(B._,{isFetching:u,fetchNext:v,nextCursor:m})):n.createElement(c,{appLink:{application:Z.O.DASHBOARD,action:X.e.Dashboard.HOME},imageUrl:Q.W.EmptyStates.Share.SHARED_WITH_ME}))}},86099:(e,t,a)=>{a.d(t,{BR:()=>I,Qh:()=>y,Rv:()=>h,Sj:()=>g,Zm:()=>E,pY:()=>f,rq:()=>S});var n=a(23481),r=a(28400),i=a(2510),s=a(21789),o=a(4594),c=a(31908),l=a(14070),u=a(97291),d=a(40254),m=a(82431),p=n.T.encloseNamespace("shared.utils"),v=[o.E.Video,o.E.Clip,o.E.Interactive];function y(e){return c.M.isInteractive(e)?{application:u.O.INTERACTIVES,action:l.e.Interactives.VIEW_INTERACTIVE,args:[e.id,r.m.slugify(e.name)]}:c.M.isClip(e)?{application:u.O.CLIPS,action:l.e.Clips.PLAY_CLIP,args:[e.id,r.m.slugify(e.name)]}:c.M.isVideo(e)?{application:u.O.VIDEOS,action:l.e.Videos.PLAY_VIDEO,args:[e.id,r.m.slugify(e.name)]}:e.typeId===o.E.Playlist?{application:u.O.PLAYLISTS,action:l.e.Playlists.PLAYLIST,args:[e.id,r.m.slugify(e.name)]}:e.typeId===o.E.Series?m.j.getSeriesAppLink(e):void 0}function f(e,t){if(!e)return null;if(!v.includes(e.objectTypeId))return y({id:e.objectId.toString(),typeId:e.objectTypeId});if(e.type===i.y.Classroom){var a=s.x.getClassroomIdFromShare(e);return{application:u.O.CLASSROOMS,action:l.e.Classrooms.INSIGHTS_OVERVIEW,args:[a,e.shareId],params:t}}return e.type===i.y.Open?{application:u.O.CLASSROOMS,action:l.e.Classrooms.OPEN_CLASSROOM_INSIGHTS_OVERVIEW,args:[e.shareId],params:t}:{application:u.O.MY_SHARES,action:l.e.MyShares.INSIGHTS_OVERVIEW,args:[e.shareId],params:t}}function h(e,t){if(!e)return null;if(!v.includes(e.objectTypeId))return y({id:e.objectId.toString(),typeId:e.objectTypeId});if(e.type===i.y.Classroom){var a=s.x.getClassroomIdFromShare(e);return{application:u.O.CLASSROOMS,action:l.e.Classrooms.INSIGHTS_HEATMAP,args:[a,e.shareId],params:t}}return e.type===i.y.Open?{application:u.O.CLASSROOMS,action:l.e.Classrooms.OPEN_CLASSROOM_INSIGHTS_HEATMAP,args:[e.shareId],params:t}:{application:u.O.MY_SHARES,action:l.e.MyShares.INSIGHTS_HEATMAP,args:[e.shareId],params:t}}function g(e,t){if(!e)return null;if(!v.includes(e.objectTypeId))return y({id:e.objectId.toString(),typeId:e.objectTypeId});if(e.type===i.y.Classroom){var a=s.x.getClassroomIdFromShare(e);return{application:u.O.CLASSROOMS,action:l.e.Classrooms.INSIGHTS_QUESTIONS,args:[a,e.shareId],params:t}}return e.type===i.y.Open?{application:u.O.CLASSROOMS,action:l.e.Classrooms.OPEN_CLASSROOM_INSIGHTS_QUESTIONS,args:[e.shareId],params:t}:{application:u.O.MY_SHARES,action:l.e.MyShares.INSIGHTS_QUESTIONS,args:[e.shareId],params:t}}function S(e,t){if(!e)return null;if(!v.includes(e.objectTypeId))return y({id:e.objectId.toString(),typeId:e.objectTypeId});if(e.type===i.y.Classroom){var a=s.x.getClassroomIdFromShare(e);return{application:u.O.CLASSROOMS,action:l.e.Classrooms.INSIGHTS_STUDENTS,args:[a,e.shareId],params:t}}return e.type===i.y.Open?{application:u.O.CLASSROOMS,action:l.e.Classrooms.OPEN_CLASSROOM_INSIGHTS_STUDENTS,args:[e.shareId],params:t}:{application:u.O.MY_SHARES,action:l.e.MyShares.INSIGHTS_STUDENTS,args:[e.shareId],params:t}}function E(e){if(e&&e.type!==i.y.LegacyDirect){var t=b(e);return e.type===i.y.Link?{application:u.O.SHARE,action:l.e.Share.SHARE,args:[e.objectId],params:{entityType:t}}:d.W.assignDetails({objectId:e.objectId.toString(),shareId:e.shareId,entityType:t,detailsTitle:p("shareOptions")})}}function I(e){if(e){var t=b(e);return e.type===i.y.Link?{application:u.O.SHARE,action:l.e.Share.DELETE_SHARE_LINK,args:[e.objectId],params:{entityType:t,previousAppLink:{application:u.O.MY_SHARES,action:l.e.MyShares.HOME}}}:e.type===i.y.LegacyDirect?{application:u.O.SHARE,action:l.e.Share.DELETE_LEGACY_SHARE,args:[e.shareId],params:{previousAppLink:{application:u.O.MY_SHARES,action:l.e.MyShares.HOME}}}:e.type===i.y.Classroom?{application:u.O.SHARE,action:l.e.Share.DELETE_ASSIGNMENT,args:[e.shareId],params:{previousAppLink:{application:u.O.CLASSROOMS,action:l.e.Classrooms.CLASSROOM_HOME,args:[s.x.getClassroomIdFromShare(e)]}}}:e.type===i.y.Open?{application:u.O.SHARE,action:l.e.Share.DELETE_OPEN_CLASSROOM,args:[e.shareId],params:{previousAppLink:{application:u.O.CLASSROOMS,action:l.e.Classrooms.OPEN_CLASSROOMS,args:[s.x.getClassroomIdFromShare(e)]}}}:void 0}}function b(e){return e.objectTypeId===o.E.Video?"video":e.objectTypeId===o.E.Interactive?"interactive":e.objectTypeId===o.E.Clip?"clip":e.objectTypeId===o.E.Series?"series":e.objectTypeId===o.E.Playlist?"playlist":void 0}}}]);
|
|
2
|
+
//# sourceMappingURL=9042-7c30ffd4f0-lite.chunk.js.map
|