@clickview/lite 0.75.0-rc.9 → 0.75.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundles.json +1 -1
- package/dist/css/{7103-lite-fef3024f61.chunk.css → 2878-lite-d8e0bf912a.chunk.css} +1 -1
- package/dist/css/{1243-lite-13eda8f6a0.chunk.css → 3615-lite-240342ff8e.chunk.css} +1 -1
- package/dist/css/{1867-lite-8baa8af02b.chunk.css → 4630-lite-0157b1c437.chunk.css} +1 -1
- package/dist/css/{4203-lite-9ffab89741.chunk.css → 8362-lite-10810fdef2.chunk.css} +1 -1
- package/dist/languages/en.json +1 -1
- package/dist/scripts/{104-7ee25cbbb8-lite.chunk.js → 104-da7394bcfa-lite.chunk.js} +2 -2
- package/dist/scripts/104-da7394bcfa-lite.chunk.js.map +1 -0
- package/dist/scripts/1192-bb27568f21-lite.chunk.js +2 -0
- package/dist/scripts/1192-bb27568f21-lite.chunk.js.map +1 -0
- package/dist/scripts/1199-cf2cb206b5-lite.chunk.js +2 -0
- package/dist/scripts/1199-cf2cb206b5-lite.chunk.js.map +1 -0
- package/dist/scripts/1502-9836df10cd-lite.chunk.js +2 -0
- package/dist/scripts/1502-9836df10cd-lite.chunk.js.map +1 -0
- package/dist/scripts/{1610-9ccecc428a-lite.chunk.js → 1610-0edaa98d40-lite.chunk.js} +2 -2
- package/dist/scripts/{1610-9ccecc428a-lite.chunk.js.map → 1610-0edaa98d40-lite.chunk.js.map} +1 -1
- package/dist/scripts/{7103-3b181ec69b-lite.chunk.js → 2878-487c4a8e1a-lite.chunk.js} +2 -2
- package/dist/scripts/2878-487c4a8e1a-lite.chunk.js.map +1 -0
- package/dist/scripts/{3057-1ae8087b3a-lite.chunk.js → 3057-a5bc753736-lite.chunk.js} +1 -1
- package/dist/scripts/{3057-1ae8087b3a-lite.chunk.js.map → 3057-a5bc753736-lite.chunk.js.map} +1 -1
- package/dist/scripts/3268-7be966dc82-lite.chunk.js +3 -0
- package/dist/scripts/3268-7be966dc82-lite.chunk.js.map +1 -0
- package/dist/scripts/{1243-72f3d31787-lite.chunk.js → 3615-a0da361aa5-lite.chunk.js} +2 -2
- package/dist/scripts/3615-a0da361aa5-lite.chunk.js.map +1 -0
- package/dist/scripts/{3872-6fe7371d39-lite.chunk.js → 3872-cf9a6bdae8-lite.chunk.js} +1 -1
- package/dist/scripts/{3872-6fe7371d39-lite.chunk.js.map → 3872-cf9a6bdae8-lite.chunk.js.map} +1 -1
- package/dist/scripts/4125-6d34b8b8f2-lite.chunk.js +2 -0
- package/dist/scripts/4125-6d34b8b8f2-lite.chunk.js.map +1 -0
- package/dist/scripts/4598-e25e9e03d6-lite.chunk.js +2 -0
- package/dist/scripts/4598-e25e9e03d6-lite.chunk.js.map +1 -0
- package/dist/scripts/{1867-0823a787c3-lite.chunk.js → 4630-4a35ecbf2b-lite.chunk.js} +2 -2
- package/dist/scripts/4630-4a35ecbf2b-lite.chunk.js.map +1 -0
- package/dist/scripts/{4806-e1b17af1de-lite.chunk.js → 4806-e65d319357-lite.chunk.js} +2 -2
- package/dist/scripts/4806-e65d319357-lite.chunk.js.map +1 -0
- package/dist/scripts/6475-f019242ec2-lite.chunk.js +2 -0
- package/dist/scripts/6475-f019242ec2-lite.chunk.js.map +1 -0
- package/dist/scripts/{6695-4e01b4a18c-lite.chunk.js → 6695-4ae0acad94-lite.chunk.js} +1 -1
- package/dist/scripts/{6695-4e01b4a18c-lite.chunk.js.map → 6695-4ae0acad94-lite.chunk.js.map} +1 -1
- package/dist/scripts/6756-3c7f911759-lite.chunk.js +3 -0
- package/dist/scripts/6756-3c7f911759-lite.chunk.js.map +1 -0
- package/dist/scripts/6790-1695fcf576-lite.chunk.js +2 -0
- package/dist/scripts/6790-1695fcf576-lite.chunk.js.map +1 -0
- package/dist/scripts/{7252-941e7573cf-lite.chunk.js → 7252-3540b11acb-lite.chunk.js} +3 -3
- package/dist/scripts/{7252-941e7573cf-lite.chunk.js.map → 7252-3540b11acb-lite.chunk.js.map} +1 -1
- package/dist/scripts/7438-35b887a48e-lite.chunk.js +2 -0
- package/dist/scripts/7438-35b887a48e-lite.chunk.js.map +1 -0
- package/dist/scripts/{8323-d6d1d07ce5-lite.chunk.js → 8323-5694456903-lite.chunk.js} +2 -2
- package/dist/scripts/{8323-d6d1d07ce5-lite.chunk.js.map → 8323-5694456903-lite.chunk.js.map} +1 -1
- package/dist/scripts/{4203-83f90f92f3-lite.chunk.js → 8362-ed5df8f4fc-lite.chunk.js} +3 -3
- package/dist/scripts/8362-ed5df8f4fc-lite.chunk.js.LICENSE.txt +1 -0
- package/dist/scripts/{4203-83f90f92f3-lite.chunk.js.map → 8362-ed5df8f4fc-lite.chunk.js.map} +1 -1
- package/dist/scripts/{8732-3e8332e620-lite.chunk.js → 8732-dc5182fb69-lite.chunk.js} +1 -1
- package/dist/scripts/{8732-3e8332e620-lite.chunk.js.map → 8732-dc5182fb69-lite.chunk.js.map} +1 -1
- package/dist/scripts/8856-08061bbec5-lite.chunk.js +2 -0
- package/dist/scripts/8856-08061bbec5-lite.chunk.js.map +1 -0
- package/dist/scripts/{8957-bc83ea1180-lite.chunk.js → 8957-b3f0dbb85d-lite.chunk.js} +1 -1
- package/dist/scripts/{8957-bc83ea1180-lite.chunk.js.map → 8957-b3f0dbb85d-lite.chunk.js.map} +1 -1
- package/dist/scripts/{9042-544d97a05d-lite.chunk.js → 9042-7c30ffd4f0-lite.chunk.js} +2 -2
- package/dist/scripts/9042-7c30ffd4f0-lite.chunk.js.map +1 -0
- package/dist/scripts/9134-b0ae877597-lite.chunk.js +2 -0
- package/dist/scripts/9134-b0ae877597-lite.chunk.js.map +1 -0
- package/dist/scripts/{bundle-cf4c360278.min.js → bundle-e578e457e2.min.js} +3 -3
- package/dist/scripts/{bundle-cf4c360278.min.js.map → bundle-e578e457e2.min.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/104-7ee25cbbb8-lite.chunk.js.map +0 -1
- package/dist/scripts/1074-6dadbd8187-lite.chunk.js +0 -2
- package/dist/scripts/1074-6dadbd8187-lite.chunk.js.map +0 -1
- package/dist/scripts/1192-6ac54d734b-lite.chunk.js +0 -2
- package/dist/scripts/1192-6ac54d734b-lite.chunk.js.map +0 -1
- package/dist/scripts/1199-dc45a88be8-lite.chunk.js +0 -2
- package/dist/scripts/1199-dc45a88be8-lite.chunk.js.map +0 -1
- package/dist/scripts/1243-72f3d31787-lite.chunk.js.map +0 -1
- package/dist/scripts/1867-0823a787c3-lite.chunk.js.map +0 -1
- package/dist/scripts/3268-aa893d0068-lite.chunk.js +0 -2
- package/dist/scripts/3268-aa893d0068-lite.chunk.js.map +0 -1
- package/dist/scripts/4598-f5120153c2-lite.chunk.js +0 -2
- package/dist/scripts/4598-f5120153c2-lite.chunk.js.map +0 -1
- package/dist/scripts/4806-e1b17af1de-lite.chunk.js.map +0 -1
- package/dist/scripts/6475-502e390010-lite.chunk.js +0 -2
- package/dist/scripts/6475-502e390010-lite.chunk.js.map +0 -1
- package/dist/scripts/6756-20c0ab9591-lite.chunk.js +0 -3
- package/dist/scripts/6756-20c0ab9591-lite.chunk.js.map +0 -1
- package/dist/scripts/6790-df00506bec-lite.chunk.js +0 -2
- package/dist/scripts/6790-df00506bec-lite.chunk.js.map +0 -1
- package/dist/scripts/7103-3b181ec69b-lite.chunk.js.map +0 -1
- package/dist/scripts/7438-1162aba8b6-lite.chunk.js +0 -2
- package/dist/scripts/7438-1162aba8b6-lite.chunk.js.map +0 -1
- package/dist/scripts/8856-361fe76b7a-lite.chunk.js +0 -2
- package/dist/scripts/8856-361fe76b7a-lite.chunk.js.map +0 -1
- package/dist/scripts/9003-36ab592cc5-lite.chunk.js +0 -2
- package/dist/scripts/9003-36ab592cc5-lite.chunk.js.map +0 -1
- package/dist/scripts/9042-544d97a05d-lite.chunk.js.map +0 -1
- package/dist/scripts/9134-7037c2c47a-lite.chunk.js +0 -2
- package/dist/scripts/9134-7037c2c47a-lite.chunk.js.map +0 -1
- /package/dist/scripts/{4203-83f90f92f3-lite.chunk.js.LICENSE.txt → 3268-7be966dc82-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{6756-20c0ab9591-lite.chunk.js.LICENSE.txt → 6756-3c7f911759-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{7252-941e7573cf-lite.chunk.js.LICENSE.txt → 7252-3540b11acb-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{8323-d6d1d07ce5-lite.chunk.js.LICENSE.txt → 8323-5694456903-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{bundle-cf4c360278.min.js.LICENSE.txt → bundle-e578e457e2.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":""}
|