@clickview/lite 0.75.0-rc.8 → 0.75.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/dist/bundles.json +1 -1
  2. package/dist/css/{7103-lite-fef3024f61.chunk.css → 2878-lite-d8e0bf912a.chunk.css} +1 -1
  3. package/dist/css/{1243-lite-13eda8f6a0.chunk.css → 3615-lite-240342ff8e.chunk.css} +1 -1
  4. package/dist/css/{1867-lite-8baa8af02b.chunk.css → 4630-lite-0157b1c437.chunk.css} +1 -1
  5. package/dist/css/{4203-lite-9ffab89741.chunk.css → 8362-lite-10810fdef2.chunk.css} +1 -1
  6. package/dist/languages/en.json +1 -1
  7. package/dist/scripts/{104-7ee25cbbb8-lite.chunk.js → 104-da7394bcfa-lite.chunk.js} +2 -2
  8. package/dist/scripts/104-da7394bcfa-lite.chunk.js.map +1 -0
  9. package/dist/scripts/1192-bb27568f21-lite.chunk.js +2 -0
  10. package/dist/scripts/1192-bb27568f21-lite.chunk.js.map +1 -0
  11. package/dist/scripts/1199-cf2cb206b5-lite.chunk.js +2 -0
  12. package/dist/scripts/1199-cf2cb206b5-lite.chunk.js.map +1 -0
  13. package/dist/scripts/1502-9836df10cd-lite.chunk.js +2 -0
  14. package/dist/scripts/1502-9836df10cd-lite.chunk.js.map +1 -0
  15. package/dist/scripts/{1610-9ccecc428a-lite.chunk.js → 1610-0edaa98d40-lite.chunk.js} +2 -2
  16. package/dist/scripts/{1610-9ccecc428a-lite.chunk.js.map → 1610-0edaa98d40-lite.chunk.js.map} +1 -1
  17. package/dist/scripts/{7103-3b181ec69b-lite.chunk.js → 2878-487c4a8e1a-lite.chunk.js} +2 -2
  18. package/dist/scripts/2878-487c4a8e1a-lite.chunk.js.map +1 -0
  19. package/dist/scripts/{3057-1ae8087b3a-lite.chunk.js → 3057-a5bc753736-lite.chunk.js} +1 -1
  20. package/dist/scripts/{3057-1ae8087b3a-lite.chunk.js.map → 3057-a5bc753736-lite.chunk.js.map} +1 -1
  21. package/dist/scripts/3268-7be966dc82-lite.chunk.js +3 -0
  22. package/dist/scripts/3268-7be966dc82-lite.chunk.js.map +1 -0
  23. package/dist/scripts/{1243-72f3d31787-lite.chunk.js → 3615-a0da361aa5-lite.chunk.js} +2 -2
  24. package/dist/scripts/3615-a0da361aa5-lite.chunk.js.map +1 -0
  25. package/dist/scripts/{3872-6fe7371d39-lite.chunk.js → 3872-cf9a6bdae8-lite.chunk.js} +1 -1
  26. package/dist/scripts/{3872-6fe7371d39-lite.chunk.js.map → 3872-cf9a6bdae8-lite.chunk.js.map} +1 -1
  27. package/dist/scripts/4125-6d34b8b8f2-lite.chunk.js +2 -0
  28. package/dist/scripts/4125-6d34b8b8f2-lite.chunk.js.map +1 -0
  29. package/dist/scripts/4208-f22ed7a148-lite.chunk.js +2 -0
  30. package/dist/scripts/4208-f22ed7a148-lite.chunk.js.map +1 -0
  31. package/dist/scripts/4598-e25e9e03d6-lite.chunk.js +2 -0
  32. package/dist/scripts/4598-e25e9e03d6-lite.chunk.js.map +1 -0
  33. package/dist/scripts/{1867-0823a787c3-lite.chunk.js → 4630-4a35ecbf2b-lite.chunk.js} +2 -2
  34. package/dist/scripts/4630-4a35ecbf2b-lite.chunk.js.map +1 -0
  35. package/dist/scripts/6475-f019242ec2-lite.chunk.js +2 -0
  36. package/dist/scripts/6475-f019242ec2-lite.chunk.js.map +1 -0
  37. package/dist/scripts/6550-1d60d863e8-lite.chunk.js +2 -0
  38. package/dist/scripts/6550-1d60d863e8-lite.chunk.js.map +1 -0
  39. package/dist/scripts/{6695-4e01b4a18c-lite.chunk.js → 6695-4ae0acad94-lite.chunk.js} +1 -1
  40. package/dist/scripts/{6695-4e01b4a18c-lite.chunk.js.map → 6695-4ae0acad94-lite.chunk.js.map} +1 -1
  41. package/dist/scripts/6756-3c7f911759-lite.chunk.js +3 -0
  42. package/dist/scripts/6756-3c7f911759-lite.chunk.js.map +1 -0
  43. package/dist/scripts/6790-1695fcf576-lite.chunk.js +2 -0
  44. package/dist/scripts/6790-1695fcf576-lite.chunk.js.map +1 -0
  45. package/dist/scripts/{7148-50ccb48a44-lite.chunk.js → 7148-e314dd9a4e-lite.chunk.js} +2 -2
  46. package/dist/scripts/7148-e314dd9a4e-lite.chunk.js.map +1 -0
  47. package/dist/scripts/7438-35b887a48e-lite.chunk.js +2 -0
  48. package/dist/scripts/7438-35b887a48e-lite.chunk.js.map +1 -0
  49. package/dist/scripts/{8323-d6d1d07ce5-lite.chunk.js → 8323-5694456903-lite.chunk.js} +2 -2
  50. package/dist/scripts/{8323-d6d1d07ce5-lite.chunk.js.map → 8323-5694456903-lite.chunk.js.map} +1 -1
  51. package/dist/scripts/{4203-83f90f92f3-lite.chunk.js → 8362-ed5df8f4fc-lite.chunk.js} +3 -3
  52. package/dist/scripts/8362-ed5df8f4fc-lite.chunk.js.LICENSE.txt +1 -0
  53. package/dist/scripts/{4203-83f90f92f3-lite.chunk.js.map → 8362-ed5df8f4fc-lite.chunk.js.map} +1 -1
  54. package/dist/scripts/{8732-3e8332e620-lite.chunk.js → 8732-dc5182fb69-lite.chunk.js} +1 -1
  55. package/dist/scripts/{8732-3e8332e620-lite.chunk.js.map → 8732-dc5182fb69-lite.chunk.js.map} +1 -1
  56. package/dist/scripts/8856-08061bbec5-lite.chunk.js +2 -0
  57. package/dist/scripts/8856-08061bbec5-lite.chunk.js.map +1 -0
  58. package/dist/scripts/{8957-bc83ea1180-lite.chunk.js → 8957-b3f0dbb85d-lite.chunk.js} +1 -1
  59. package/dist/scripts/{8957-bc83ea1180-lite.chunk.js.map → 8957-b3f0dbb85d-lite.chunk.js.map} +1 -1
  60. package/dist/scripts/9042-7c30ffd4f0-lite.chunk.js +2 -0
  61. package/dist/scripts/9042-7c30ffd4f0-lite.chunk.js.map +1 -0
  62. package/dist/scripts/9134-b0ae877597-lite.chunk.js +2 -0
  63. package/dist/scripts/9134-b0ae877597-lite.chunk.js.map +1 -0
  64. package/dist/scripts/{bundle-58c25f6529.min.js → bundle-941a464ef0.min.js} +3 -3
  65. package/dist/scripts/{bundle-58c25f6529.min.js.map → bundle-941a464ef0.min.js.map} +1 -1
  66. package/package.json +1 -1
  67. package/dist/scripts/104-7ee25cbbb8-lite.chunk.js.map +0 -1
  68. package/dist/scripts/1074-6dadbd8187-lite.chunk.js +0 -2
  69. package/dist/scripts/1074-6dadbd8187-lite.chunk.js.map +0 -1
  70. package/dist/scripts/1192-6ac54d734b-lite.chunk.js +0 -2
  71. package/dist/scripts/1192-6ac54d734b-lite.chunk.js.map +0 -1
  72. package/dist/scripts/1199-1cddf4e0e0-lite.chunk.js +0 -2
  73. package/dist/scripts/1199-1cddf4e0e0-lite.chunk.js.map +0 -1
  74. package/dist/scripts/1243-72f3d31787-lite.chunk.js.map +0 -1
  75. package/dist/scripts/1867-0823a787c3-lite.chunk.js.map +0 -1
  76. package/dist/scripts/3268-aa893d0068-lite.chunk.js +0 -2
  77. package/dist/scripts/3268-aa893d0068-lite.chunk.js.map +0 -1
  78. package/dist/scripts/4208-3ba21abb7c-lite.chunk.js +0 -2
  79. package/dist/scripts/4208-3ba21abb7c-lite.chunk.js.map +0 -1
  80. package/dist/scripts/4598-f5120153c2-lite.chunk.js +0 -2
  81. package/dist/scripts/4598-f5120153c2-lite.chunk.js.map +0 -1
  82. package/dist/scripts/6475-502e390010-lite.chunk.js +0 -2
  83. package/dist/scripts/6475-502e390010-lite.chunk.js.map +0 -1
  84. package/dist/scripts/6550-c621babbcb-lite.chunk.js +0 -2
  85. package/dist/scripts/6550-c621babbcb-lite.chunk.js.map +0 -1
  86. package/dist/scripts/6756-20c0ab9591-lite.chunk.js +0 -3
  87. package/dist/scripts/6756-20c0ab9591-lite.chunk.js.map +0 -1
  88. package/dist/scripts/6790-df00506bec-lite.chunk.js +0 -2
  89. package/dist/scripts/6790-df00506bec-lite.chunk.js.map +0 -1
  90. package/dist/scripts/7103-3b181ec69b-lite.chunk.js.map +0 -1
  91. package/dist/scripts/7148-50ccb48a44-lite.chunk.js.map +0 -1
  92. package/dist/scripts/7438-1162aba8b6-lite.chunk.js +0 -2
  93. package/dist/scripts/7438-1162aba8b6-lite.chunk.js.map +0 -1
  94. package/dist/scripts/8856-8ac95bf4e0-lite.chunk.js +0 -2
  95. package/dist/scripts/8856-8ac95bf4e0-lite.chunk.js.map +0 -1
  96. package/dist/scripts/9003-36ab592cc5-lite.chunk.js +0 -2
  97. package/dist/scripts/9003-36ab592cc5-lite.chunk.js.map +0 -1
  98. package/dist/scripts/9042-3092af11d5-lite.chunk.js +0 -2
  99. package/dist/scripts/9042-3092af11d5-lite.chunk.js.map +0 -1
  100. package/dist/scripts/9134-7037c2c47a-lite.chunk.js +0 -2
  101. package/dist/scripts/9134-7037c2c47a-lite.chunk.js.map +0 -1
  102. /package/dist/scripts/{4203-83f90f92f3-lite.chunk.js.LICENSE.txt → 3268-7be966dc82-lite.chunk.js.LICENSE.txt} +0 -0
  103. /package/dist/scripts/{6756-20c0ab9591-lite.chunk.js.LICENSE.txt → 6756-3c7f911759-lite.chunk.js.LICENSE.txt} +0 -0
  104. /package/dist/scripts/{8323-d6d1d07ce5-lite.chunk.js.LICENSE.txt → 8323-5694456903-lite.chunk.js.LICENSE.txt} +0 -0
  105. /package/dist/scripts/{bundle-58c25f6529.min.js.LICENSE.txt → bundle-941a464ef0.min.js.LICENSE.txt} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"scripts/8732-3e8332e620-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/hooks/useBulkUploadUsers.ts","file:///app/packages/libs/shared/src/constants/DragOverlayStyles.ts","file:///app/packages/libs/shared/src/components/table/TableUtils.ts","file:///app/packages/libs/shared/src/components/table/table.scss","file:///app/packages/libs/shared/src/components/table/Table.tsx","file:///app/packages/libs/shared/src/components/wizard/header/WizardHeader.tsx","file:///app/packages/libs/shared/src/components/wizard/step-list/WizardStepList.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-upload/user-duplicates/empty-state/UserDuplicatesEmptyState.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-upload/user-duplicates/user-duplicate-set/UserDuplicateSetUtils.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-upload/user-duplicates/user-duplicate-set/UserDuplicateSet.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-upload/user-duplicates/UserDuplicates.tsx","file:///app/packages/projects/lite/src/apps/user-manager/views/bulk-user-upload/fix-duplicates/BulkUserUploadFixDuplicatesView.tsx"],"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 { 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};","export const DragOverlayStyles = { opacity: '0.8', cursor: 'grabbing' };","import React from 'react';\nimport { PluginHook, useBlockLayout, useFilters, useFlexLayout, useGlobalFilter, useRowSelect, useSortBy } from 'react-table';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\n\ninterface PluginOptions {\n allowFiltering?: boolean;\n allowGlobalFiltering?: boolean;\n layout?: 'flex' | 'block';\n}\n\nexport function getPlugins<T extends HashObject>(props: PluginOptions): PluginHook<T>[] {\n let plugins: PluginHook<T>[] = [\n useSortBy,\n useRowSelect,\n props.layout === 'flex' ? useFlexLayout : useBlockLayout\n ];\n\n if (props.allowFiltering)\n plugins = [\n ...plugins,\n useFilters\n ];\n\n if (props.allowGlobalFiltering)\n plugins = [\n ...plugins,\n useGlobalFilter\n ];\n\n return plugins;\n}\n\nexport function getSelectedRowIds(ids: string[]): Record<string, boolean> {\n const idHash: Record<string, boolean> = {};\n\n ids.forEach(id => idHash[id] = true);\n\n return idHash;\n}\n\ninterface TableScrollState {\n canScrollLeft: boolean;\n canScrollRight: boolean;\n}\n\nfunction calculateScrollState(ref: React.MutableRefObject<HTMLDivElement>): TableScrollState {\n const canScrollLeft = ref.current?.scrollLeft > 0;\n const canScrollRight = (ref.current?.scrollLeft + 1) < ref.current?.scrollWidth - ref.current?.clientWidth;\n\n return { canScrollLeft, canScrollRight };\n}\n\ninterface UseTableScroll {\n ref: (el: HTMLDivElement) => void;\n scrollState: TableScrollState;\n scroll: (scrollBy: number) => void;\n}\n\nexport function useTableScroll(): UseTableScroll {\n const elRef = React.useRef<HTMLDivElement>(null);\n const [ scrollState, setScrollState ] = React.useState<TableScrollState>(calculateScrollState(elRef));\n\n function onScroll(): void {\n setScrollState(calculateScrollState(elRef));\n }\n\n function scroll(scrollBy: number): void {\n elRef.current?.scrollBy({ left: scrollBy, top: 0, behavior: 'smooth' });\n }\n\n const throttledOnScroll = FunctionHelper.throttle(onScroll, 200);\n\n const ref = React.useCallback((el: HTMLDivElement) => {\n if (elRef.current) {\n elRef.current?.removeEventListener('scroll', throttledOnScroll);\n }\n\n if (el) {\n setScrollState(calculateScrollState(elRef));\n el.addEventListener('scroll', throttledOnScroll);\n }\n\n elRef.current = el;\n }, []);\n\n React.useEffect(() => {\n if (elRef?.current) {\n setScrollState(calculateScrollState(elRef));\n }\n }, [elRef]);\n\n return { ref, scrollState, scroll };\n}","// extracted by mini-css-extract-plugin\nexport default {\"sortIndicator\":\"gFhu0\",\"scrollContainer\":\"sWUp9\",\"scrollbarTrack\":\"Vn2qM\"};","import React from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\nimport {\n Cell,\n Column as BaseColumn,\n HeaderGroup,\n HeaderProps as BaseHeaderProps,\n IdType,\n Row,\n SortingRule,\n TableOptions,\n TableRowProps,\n useTable } from 'react-table';\nimport { DragEndEvent } from '@dnd-kit/core';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SortableContainerWrapper } from 'libs/shared/components/sortable/SortableContainerWrapper';\nimport { PropsWithSortableItemProps, SortableItemWrapper } from 'libs/shared/components/sortable/SortableItemWrapper';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { WidgetButton, WidgetButtonDirection } from 'libs/shared/components/widgets/widget-button/WidgetButton';\nimport { DragOverlayStyles } from 'libs/shared/constants/DragOverlayStyles';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { getPlugins, getSelectedRowIds, useTableScroll } from './TableUtils';\n\nimport styles from './table.scss';\n\nexport interface TableTheme {\n table?: string;\n header?: string;\n headerRow?: string;\n headerCell?: string;\n body?: string;\n row?: string | ((row: Row<any>) => string);\n selectedRow?: string;\n cell?: string | ((row?: Row<any>, cell?: Cell<any, any>) => string);\n sortIndicator?: string;\n}\n\nexport type HeaderProps<T extends HashObject> = BaseHeaderProps<T> & {\n renderSortIndicator: () => void;\n}\n\nexport type Column<T extends HashObject> = BaseColumn<T> & {\n hideSortIndicator?: boolean;\n}\n\ninterface SortIndicatorProps<T extends HashObject> {\n column: HeaderGroup<T>;\n theme?: TableTheme;\n}\n\nfunction SortIndicator<T extends HashObject>(props: SortIndicatorProps<T>): JSX.Element {\n if (!props.column.canSort)\n return <></>;\n\n return (\n <span\n className={\n `${styles.sortIndicator}\n ${!props.column.isSorted ? 'text-secondary' : ''}\n ${props.theme?.sortIndicator ?? ''}`\n }\n >\n <SvgContainer\n svgName={(props.column.isSortedDesc || !props.column.isSorted)\n ? cvSvgLibrary.ArrowRight\n : cvSvgLibrary.ArrowLeft\n }\n size={SvgContainerSize.Small}\n />\n </span>\n );\n}\n\ninterface BaseTableProps<T extends HashObject> {\n /**\n * Must be memoized.\n */\n data: T[];\n\n /**\n * Must be memoized.\n * \n * For documentation on Column Options, see https://react-table.tanstack.com/docs/api/useTable#column-options\n */\n columns: Column<T>[];\n\n theme?: TableTheme;\n\n onSelectRow?: (row: Row<T>) => void;\n\n onSelectCell?: (cell: Cell<T>) => void;\n\n onRowMouseOver?: (row: Row<T>) => void;\n\n onRowMouseLeave?: (row: Row<T>) => void;\n\n allowSelectMultipleRows?: boolean;\n\n initialSelectedRowIds?: string[];\n\n getRowId?: (row: T) => string;\n\n getRowAppLink?: (row: Row<T>) => Core.AppLink;\n\n enableSort?: boolean;\n\n manualSort?: boolean;\n\n onSort?: (sortingRule: SortingRule<T>[]) => void;\n \n // Opt-in to utilise react-table's useFilter hook.\n allowFiltering?: boolean;\n\n // Opt-in to utilise react-table's useGlobalFilter hook.\n allowGlobalFiltering?: boolean;\n\n // Use either a flex layout or a block layout. Default is flex.\n layout?: 'flex' | 'block';\n\n // Used by useGlobalFilter hook, needs to be enabled by prop above.\n globalFilter?: string;\n\n // Set initial state of hidden columns in react-table.\n hiddenColumns?: IdType<T>[];\n\n // Determine whether hidden columns should be preserved on a table update event.\n autoResetHiddenColumns?: boolean;\n\n // Determine whether sort order state should be preserved on a table update event.\n autoResetSortBy?: boolean;\n\n // Determine whether rows are sortable by drag and drop\n enableSortableRows?: boolean;\n\n onSortingRowsEnd?: (event: DragEndEvent) => void;\n\n // Set initial state of sorting in react-table\n initialSortBy?: SortingRule<T>[];\n\n emptyState?: JSX.Element;\n}\n \ntype SortableRowProps = PropsWithSortableItemProps<TableRowProps>;\n\nfunction BaseTable<T extends HashObject>(props: BaseTableProps<T>): JSX.Element {\n const tableOptions: TableOptions<T> = {\n columns: props.columns,\n data: props.data,\n disableSortBy: !props.enableSort,\n manualSortBy: props.manualSort,\n autoResetHiddenColumns: props.autoResetHiddenColumns,\n autoResetSortBy: props.autoResetSortBy,\n initialState: {\n sortBy: props.initialSortBy || []\n }\n };\n\n if (props.initialSelectedRowIds)\n tableOptions.initialState = { selectedRowIds: getSelectedRowIds(props.initialSelectedRowIds) };\n\n if (props.getRowId)\n tableOptions.getRowId = props.getRowId;\n\n const {\n getTableProps,\n getTableBodyProps,\n headerGroups,\n rows,\n prepareRow,\n toggleAllRowsSelected,\n setGlobalFilter,\n setHiddenColumns,\n state: { sortBy }\n } = useTable<T>(tableOptions, ...getPlugins<T>({ ...props }));\n\n function getTableRowsClass(row: Row<T>) {\n let className = FunctionHelper.isFunction(props.theme?.row)\n ? props.theme.row(row)\n : props.theme?.row ?? '';\n\n if (row.isSelected && props.theme?.selectedRow)\n className += ` ${props.theme?.selectedRow}`;\n\n if (props.onSelectRow)\n className += ' cursor-pointer';\n\n if (props.enableSortableRows)\n className += ' cursor-grab';\n\n return className;\n }\n\n function renderTableRows() {\n if (!rows.length && props.emptyState)\n return props.emptyState;\n \n return rows.map(row => {\n prepareRow(row);\n \n const className = getTableRowsClass(row);\n const rowAppLink = !!props.getRowAppLink && props.getRowAppLink(row);\n\n function onClickRow(): void {\n if (!props.onSelectRow)\n return;\n\n if (!props.allowSelectMultipleRows)\n toggleAllRowsSelected(false);\n \n props.onSelectRow(row);\n row.toggleRowSelected(true);\n }\n\n function getSortableProps(props: TableRowProps | PropsWithSortableItemProps<TableRowProps>, ref?: any) {\n if ('dragAttributes' in props && 'dragListeners' in props) {\n return {\n ...props.dragAttributes,\n ...props.dragListeners,\n 'aria-roledescription': 'Sortable row',\n ref\n };\n }\n\n return {};\n }\n\n function renderRow(props: TableRowProps | PropsWithSortableItemProps<TableRowProps>, ref?: any): JSX.Element {\n const sortableProps = getSortableProps(props, ref);\n\n if (rowAppLink) {\n return (\n <div\n role='row'\n key={row.id}\n >\n <AppLink\n {...props}\n {...sortableProps}\n className={className}\n appLink={rowAppLink}\n >\n {renderCells(row)}\n </AppLink>\n </div>\n );\n }\n\n return (\n <div\n {...props}\n {...sortableProps}\n key={row.id}\n role='row'\n className={className}\n onClick={onClickRow}\n >\n {renderCells(row)}\n </div>\n );\n }\n\n const rowProps = row.getRowProps();\n\n if (props.enableSortableRows) {\n return (\n <SortableItemWrapper\n id={row.original.id}\n key={row.id}\n childProps={rowProps}\n childComponent={React.forwardRef(\n (props: SortableRowProps, ref: React.LegacyRef<HTMLDivElement>) => (renderRow(props, ref))\n )}\n />\n );\n }\n\n return renderRow(rowProps);\n });\n }\n\n function getDragOverlayClassName(theme: TableTheme): string {\n let className = 'g-0 ';\n\n if (theme)\n className += theme.row;\n\n return className;\n }\n\n function getDragOverlay(id: string) {\n const rowIndex = rows.findIndex(item => item.original.id === id);\n const row = rows[rowIndex];\n \n return (\n <div\n {...props}\n className={getDragOverlayClassName(props.theme)}\n style={DragOverlayStyles}\n >\n {renderCells(row)}\n </div>\n );\n }\n\n function getCellClassName(row: Row<T>, cell: Cell<T>): string {\n let cellClassName = '';\n\n if (typeof props.theme?.cell === 'function')\n cellClassName = props.theme.cell(row, cell);\n\n if (typeof props.theme?.cell === 'string')\n cellClassName = props.theme.cell;\n\n if (props.onSelectCell)\n cellClassName += ' cursor-pointer';\n\n return cellClassName;\n }\n\n function renderCells(row: Row<T>): JSX.Element[] {\n return row.cells.map(cell => {\n const cellClassName = getCellClassName(row, cell);\n\n function onClickCell(): void {\n props.onSelectCell && props.onSelectCell(cell);\n }\n\n return (\n <div key={cell.column.id} {...cell.getCellProps()} className={cellClassName} onClick={onClickCell} >\n {cell.render('Cell')}\n </div>\n );\n });\n }\n\n React.useEffect(() => {\n if (!props.onSort)\n return;\n\n props.onSort(sortBy);\n }, [sortBy]);\n\n React.useEffect(() => {\n if (!props.globalFilter)\n return;\n\n setGlobalFilter(props.globalFilter);\n }, [props.globalFilter]);\n\n React.useEffect(() => {\n if (!props.hiddenColumns)\n return;\n\n setHiddenColumns(props.hiddenColumns);\n }, [props.hiddenColumns && props.hiddenColumns.length]);\n\n return (\n <div {...getTableProps()} className={props.theme?.table ?? ''}>\n <div className={props.theme?.header ?? ''}>\n {headerGroups.map(headerGroup => (\n <div {...headerGroup.getHeaderGroupProps()} className={props.theme?.headerRow ?? ''}>\n {headerGroup.headers.map(column => (\n <div {...column.getHeaderProps(column.getSortByToggleProps())} className={props.theme?.headerCell ?? ''}>\n {column.render('Header', { renderSortIndicator: () => <SortIndicator column={column} theme={props.theme} /> })}\n {!(column as Column<T>).hideSortIndicator &&\n <SortIndicator column={column} theme={props.theme} />\n }\n </div>\n ))}\n </div>\n ))}\n </div>\n <div {...getTableBodyProps()} className={props.theme?.body ?? ''}>\n { props.enableSortableRows ? (\n <SortableContainerWrapper\n ids={rows.map(row => row.original.id)}\n getDragOverlay={getDragOverlay}\n onSortEnd={props.onSortingRowsEnd}\n >\n {renderTableRows()}\n </SortableContainerWrapper>\n ) : (\n renderTableRows()\n )}\n </div>\n </div>\n );\n}\n\ninterface TableProps<T extends HashObject> extends BaseTableProps<T> {\n enableSlider?: boolean;\n scrollIncrement?: number;\n scrollContainerClassName?: string;\n scrollable?: boolean;\n initialSortBy?: SortingRule<T>[];\n}\n\nTable.defaultProps = {\n scrollIncrement: 250,\n scrollable: false,\n layout: 'flex'\n};\n\nexport function Table<T extends HashObject>(props: TableProps<T>): JSX.Element {\n const { enableSlider, scrollIncrement, scrollable, ...tableProps } = props;\n\n const { ref, scrollState, scroll } = useTableScroll();\n\n if (scrollable) {\n return (\n <Scrollbars\n renderTrackHorizontal={() => <div className={styles.scrollbarTrack} />}\n autoHeightMax={10000}\n autoHeight\n >\n <BaseTable {...tableProps} />\n </Scrollbars>\n );\n }\n\n if (!enableSlider)\n return <BaseTable {...tableProps} />;\n\n function onClickScroll(direction: 'left' | 'right'): void {\n scroll(scrollIncrement * (direction === 'right' ? 1 : -1));\n }\n\n return (\n <div className='mx-n4 overflow-x-hidden overflow-y-hidden'>\n <div className='px-4'>\n <div className='position-relative'>\n <WidgetButton\n direction={WidgetButtonDirection.Left}\n onClick={() => onClickScroll('left')}\n hide={!scrollState.canScrollLeft}\n />\n <div className={`${styles.scrollContainer} ${props.scrollContainerClassName}`} ref={ref}>\n <BaseTable {...tableProps } />\n </div>\n <WidgetButton\n direction={WidgetButtonDirection.Right}\n onClick={() => onClickScroll('right')}\n hide={!scrollState.canScrollRight}\n />\n </div>\n </div>\n </div>\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 { 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}.`}&nbsp;</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}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { useBulkUploadUsers } from 'libs/shared/apps/user-manager/hooks/useBulkUploadUsers';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'userManager.userDuplicatesEmptyState';\n\ninterface UserDuplicatesEmptyStateProps {\n imageUrl: string;\n onClickConfirm: () => void;\n}\n\nexport function UserDuplicatesEmptyState(props: UserDuplicatesEmptyStateProps): JSX.Element {\n const { existingUsersHash } = useBulkUploadUsers();\n\n const goNext = !!Object.keys(existingUsersHash).length;\n\n return (\n <EmptyState>\n <EmptyState.Image src={props.imageUrl} />\n <EmptyState.Heading>\n <Text namespace={namespace} phrase='heading' />\n </EmptyState.Heading>\n <EmptyState.Cta\n text={LanguageService.getPhrase(namespace, goNext ? 'next' : 'create')}\n onClick={props.onClickConfirm}\n className='btn btn-dark'\n />\n </EmptyState>\n );\n}","import React from 'react';\nimport { CellProps, Column } from 'react-table';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { UserValidationCode } from 'libs/shared/apps/user-manager/enums/UserValidationCode';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'userManager.userDuplicateSet';\n\ninterface UserDuplicateData {\n lookupId: string;\n firstName: string;\n surname: string;\n email: string;\n username: string;\n errorCodes: UserValidationCode[];\n}\n\nexport const getColumns = (\n onClickEdit: (id: string) => void,\n onClickDelete: (id: string) => void\n): Column<UserDuplicateData>[] => ([\n {\n Header: LanguageService.getPhrase(namespace, 'firstName'),\n id: 'firstName',\n accessor: 'firstName',\n Cell: ({ value }) => (\n <div className='w-100'>\n {value}\n </div>\n ),\n width: 12.5\n },\n {\n Header: LanguageService.getPhrase(namespace, 'lastName'),\n id: 'surname',\n accessor: 'surname',\n Cell: ({ value }) => (\n <div className='w-100'>\n {value}\n </div>\n ),\n width: 12.5\n },\n {\n Header: LanguageService.getPhrase(namespace, 'email'),\n id: 'email',\n Cell: (cell: CellProps<UserDuplicateData>) => {\n const data = cell.row.original;\n const hasError = data.errorCodes.find(e => e === UserValidationCode.EmailAlreadyExisted);\n\n return (\n <div className={`w-100 ${hasError ? 'text-danger' : ''}`}>\n {data.email}\n </div>\n );\n },\n width: 39\n },\n {\n Header: LanguageService.getPhrase(namespace, 'username'),\n id: 'username',\n Cell: (cell: CellProps<UserDuplicateData>) => {\n const data = cell.row.original;\n const hasError = data.errorCodes.find(e => e === UserValidationCode.UsernameAlreadyExisted);\n\n return (\n <div className={`w-100 ${hasError ? 'text-danger' : ''}`}>\n {data.username}\n </div>\n );\n },\n width: 29\n },\n {\n Header: '',\n id: 'actions',\n accessor: 'lookupId',\n Cell: ({ value: lookupId }) => (\n <div className='w-100 d-flex align-items-center'>\n <DivButton className='me-2 cursor-pointer' onClick={() => onClickEdit(lookupId)}>\n <SvgContainer\n svgName={cvSvgLibrary.Edit}\n title={LanguageService.getPhrase(namespace, 'editTooltip')}\n tooltipPlacement='top'\n tooltipSpanHack\n />\n </DivButton>\n <DivButton className='cursor-pointer' onClick={() => onClickDelete(lookupId)}>\n <SvgContainer\n svgName={cvSvgLibrary.Close}\n title={LanguageService.getPhrase(namespace, 'deleteTooltip')}\n tooltipPlacement='top'\n tooltipSpanHack\n />\n </DivButton>\n </div>\n ),\n width: 7\n }\n]);","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { UserValidationCode } from 'libs/shared/apps/user-manager/enums/UserValidationCode';\nimport { EditUserRequest } from 'libs/shared/apps/user-manager/interfaces';\nimport { DuplicateUserSet } from 'libs/shared/apps/user-manager/interfaces/viewmodels/BulkUserUploadViewModel';\nimport { Table, TableTheme } from 'libs/shared/components/table/Table';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\n\nimport { getColumns } from './UserDuplicateSetUtils';\n\nconst namespace = 'userManager.userDuplicateSet';\n\nconst TABLE_THEME: TableTheme = {\n header: 'fw-semibold pb-1',\n headerCell: 'px-2 py-1',\n cell: 'px-2 py-1'\n};\n\nfunction getErrorMessage(errorCodes: UserValidationCode[], userType: UserGroup): string {\n const isStudent = userType === UserGroup.Learner;\n\n if (errorCodes.length === 2)\n return LanguageService.getPhrase(namespace, isStudent ? 'duplicateUsernameAndEmailStudents' : 'duplicateUsernameAndEmailStaff');\n\n if (errorCodes.find(c => c === UserValidationCode.UsernameAlreadyExisted))\n return LanguageService.getPhrase(namespace, isStudent ? 'duplicateUsernamesStudents' : 'duplicateUsernamesStaff');\n\n if (errorCodes.find(c => c === UserValidationCode.EmailAlreadyExisted))\n return LanguageService.getPhrase(namespace, isStudent ? 'duplicateEmailsStudents' : 'duplicateEmailsStaff');\n\n return '';\n}\n\ninterface UserDuplicateSetProps {\n index: number;\n set: DuplicateUserSet;\n userType: UserGroup;\n\n onClickEdit: (user: EditUserRequest) => void;\n onClickDelete: (users: string[]) => void;\n}\n\nexport function UserDuplicateSet(props: UserDuplicateSetProps): JSX.Element {\n const errorMessage = getErrorMessage(props.set.errorCodes, props.userType);\n\n const onClickEdit = (id: string) => props.onClickEdit(props.set.users.find(u => u.lookupId === id));\n const onClickDelete = (id: string) => props.onClickDelete([id]);\n\n if (!errorMessage)\n return <></>;\n\n return (\n <div className='pb-4'>\n <h3 className='h5'>\n <Text namespace={namespace} phrase='heading' options={{ counter: props.index + 1 }} />\n </h3>\n <p className='text-danger mb-1'>\n {errorMessage}\n </p>\n\n <div className='p-2 border rounded-3'>\n <Table\n columns={getColumns(onClickEdit, onClickDelete)}\n data={props.set.users.map(u => ({\n lookupId: u.lookupId,\n firstName: u.firstName,\n surname: u.surname,\n email: u.email,\n username: u.username,\n errorCodes: props.set.errorCodes\n }))}\n theme={TABLE_THEME}\n />\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { onCloseDeletePopup, onCloseEditPopup } from 'libs/shared/apps/user-manager/components/bulk-upload/BulkUserUploadEvents';\nimport { DeleteUploadedUserPopup } from 'libs/shared/apps/user-manager/components/delete-uploaded-user-popup/DeleteUploadedUserPopup';\nimport { EditUploadedUserPopup } from 'libs/shared/apps/user-manager/components/edit-uploaded-user-popup/EditUploadedUserPopup';\nimport { useBulkUploadUsers } from 'libs/shared/apps/user-manager/hooks/useBulkUploadUsers';\nimport { BulkUserEmailCheckResponse, EditUserRequest, ErroredUsers, UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { SecuritySettingsResponse } from 'libs/shared/apps/user-manager/interfaces/SecuritySettingsResponse';\nimport { DuplicateUserSet } from 'libs/shared/apps/user-manager/interfaces/viewmodels/BulkUserUploadViewModel';\nimport { BulkUserUploadHelper } from 'libs/shared/apps/user-manager/utils/BulkUserUploadHelper';\nimport { FormSize } from 'libs/shared/components/forms/form-field/FormField';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardLayoutContext } from 'libs/shared/context/WizardLayoutContext';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { CurrentUser, PropsWithPopupViewProps, YearGroup } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { UserDuplicatesEmptyState } from './empty-state/UserDuplicatesEmptyState';\nimport { UserDuplicateSet } from './user-duplicate-set/UserDuplicateSet';\n\ntype UserDuplicatesProps = PropsWithPopupViewProps<{\n userType: UserGroup;\n appLinks: UserManagerAppLinks;\n currentUser: CurrentUser;\n yearGroups: YearGroup[];\n validateUser: (user: EditUserRequest) => Promise<ErroredUsers>;\n validateEmail?: (email: string) => Promise<BulkUserEmailCheckResponse>;\n emailRequired: boolean;\n passwordPolicy: SecuritySettingsResponse;\n emptyStateImageUrl: string;\n onClickConfirm: () => void;\n formSize?: FormSize;\n localErrorMessage?: HashObject;\n}>;\n\nexport function UserDuplicates(props: UserDuplicatesProps): JSX.Element {\n const { users, duplicateSets } = useBulkUploadUsers();\n\n const { setDisableNext, setOnClickConfirm } = React.useContext(WizardLayoutContext);\n\n const namespace = props.userType === UserGroup.Learner\n ? 'userManager.studentDuplicates'\n : 'userManager.staffDuplicates';\n\n const getPhrase = LanguageService.encloseNamespace(namespace);\n\n const [ deletingUsers, setDeletingUsers ] = React.useState<string[]>([]);\n const [ editingUser, setEditingUser ] = React.useState<EditUserRequest>();\n\n const [initialSets] = React.useState<DuplicateUserSet[]>(duplicateSets);\n\n React.useEffect(() => {\n setDisableNext(!!duplicateSets?.length);\n }, [duplicateSets?.length]);\n\n React.useEffect(() => {\n setOnClickConfirm(() => props.onClickConfirm);\n }, [props.onClickConfirm]);\n\n if (!users?.length)\n return <></>;\n\n return (\n <>\n <h2 className='h4'><Text namespace={namespace} phrase='heading' /></h2>\n\n <main className='pb-3'>\n {duplicateSets?.length ? (\n <>\n <p className='mb-3 fw-semibold'>\n <Text namespace={namespace} phrase='subheading' />\n </p>\n\n <div className='pb-3'>\n <IconButton svgName={cvSvgLibrary.Upload} appLink={props.appLinks.userUploadPopup} className='btn btn-outline-dark me-2'>\n <Text namespace={namespace} phrase='reupload' />\n </IconButton>\n </div>\n\n {initialSets.map((initialSet, index) => {\n const initialSetIds = initialSet.users.map(u => u.lookupId);\n\n const updatedSet = duplicateSets.find(updatedSet => {\n const updatedSetIds = updatedSet.users.map(u => u.lookupId);\n\n return ObjectHelper.isEqual(initialSetIds, updatedSetIds);\n });\n\n const isResolved = !updatedSet.errorCodes.length;\n\n if (isResolved)\n return <React.Fragment key={index}></React.Fragment>;\n\n return (\n <UserDuplicateSet\n key={index}\n index={index}\n set={updatedSet}\n userType={props.userType}\n onClickEdit={setEditingUser}\n onClickDelete={setDeletingUsers}\n />\n );\n })}\n </>\n ) : (\n <>\n <p className='mb-3'>\n <Text namespace={namespace} phrase='emptyStateSubheading' />\n </p>\n <UserDuplicatesEmptyState imageUrl={props.emptyStateImageUrl} onClickConfirm={props.onClickConfirm} />\n </>\n )}\n \n </main>\n\n {!!editingUser && (\n <EditUploadedUserPopup\n key={editingUser.lookupId}\n user={editingUser}\n setUser={setEditingUser}\n closePopup={() => onCloseEditPopup(setEditingUser, props.closePopup)}\n title={getPhrase('editUser')}\n userType={props.userType}\n analyticsOptions={BulkUserUploadHelper.getAnalyticsOptions(props.userType)}\n currentUser={props.currentUser}\n yearGroups={props.yearGroups}\n validateUser={props.validateUser}\n formSize={props.formSize}\n emailRequired={props.emailRequired}\n passwordPolicy={props.passwordPolicy}\n appLinks={props.appLinks}\n localErrorMessage={props.localErrorMessage}\n validateEmail={props.validateEmail}\n />\n )}\n\n {!!deletingUsers.length && (\n <DeleteUploadedUserPopup\n users={deletingUsers}\n userType={props.userType}\n closePopup={() => onCloseDeletePopup(setDeletingUsers, props.closePopup)}\n analyticsOptions={BulkUserUploadHelper.getAnalyticsOptions(props.userType)}\n />\n )}\n </>\n );\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 { BulkUserUploadWizardLayout } from 'libs/shared/apps/user-manager/components/bulk-upload/layout/BulkUserUploadWizardLayout';\nimport { UserDuplicates } from 'libs/shared/apps/user-manager/components/bulk-upload/user-duplicates/UserDuplicates';\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 { BulkUserEmailCheckRequest, BulkUserEmailCheckResponse, EditUserRequest, ErroredUsers } from 'libs/shared/apps/user-manager/interfaces';\nimport { UserWizardParams } from 'libs/shared/apps/user-manager/interfaces/query-params/UserWizardParams';\nimport { SecuritySettingsResponse } from 'libs/shared/apps/user-manager/interfaces/SecuritySettingsResponse';\nimport { BulkUserActionsHelper } from 'libs/shared/apps/user-manager/utils/BulkUserActionsHelper';\nimport { BulkUserUploadHelper } from 'libs/shared/apps/user-manager/utils/BulkUserUploadHelper';\nimport { UserManagerHelper } from 'libs/shared/apps/user-manager/utils/UserManagerHelper';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { BatchJob, CurrentUser, PropsWithPopupViewProps, YearGroup } from 'libs/shared/interfaces';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { JobRequests } from 'shared/flight-requests/JobRequests';\n\nimport { SecuritySettingsRequests } from 'apps/settings/flight-requests/SecuritySettingsRequests';\nimport { UserManagerRequests } from 'apps/user-manager/flight-requests/UserManagerRequests';\nimport { getUserManagerAppLinks } from 'apps/user-manager/utils/LiteUserManagerAppLinks';\n\nconst namespace = 'userManager.bulkUploadFixDuplicates';\n\nexport function BulkUserUploadFixDuplicatesView(props: PropsWithPopupViewProps<UserWizardParams>): JSX.Element {\n const { users, existingUsersHash } = useBulkUploadUsers();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data && UserManagerRequests.yearGroups(currentUser.data.customerId)\n );\n const passwordPolicy = Flight.useBasicFetch<SecuritySettingsResponse>(currentUser.data &&\n SecuritySettingsRequests.getCustomerSecuritySettings(currentUser.data.customerId));\n\n const dispatch = useDispatch();\n const fetchAsync = Flight.useGetFetchAsync();\n const appLinks = getUserManagerAppLinks(props.userType);\n useSetPageMetadata({ title: LanguageService.getPhrase(namespace, 'pageTitle') });\n\n function validateUser(_user: EditUserRequest): Promise<ErroredUsers> {\n const data = UserManagerHelper.formatCreateOrValidateUserRequest(\n [_user],\n props.userType,\n currentUser.data.customerId\n );\n\n return fetchAsync(UserManagerRequests.bulkValidate(data));\n }\n\n function validateEmail(email: string): Promise<BulkUserEmailCheckResponse> {\n const body: BulkUserEmailCheckRequest = {\n userEmails: [{ email, userType: props.userType }]\n };\n\n return fetchAsync(UserManagerRequests.bulkCheckEmail(body, currentUser.data.customerId));\n }\n\n const onCreateJobError = BulkUserActionsHelper.useCreateJobErrorAlert();\n\n function onClickConfirm() {\n if (Object.keys(existingUsersHash).length) {\n goToNextStep();\n return;\n }\n startBulkUpload();\n }\n\n function goToNextStep() {\n Core.AppLinkHelper.trigger(appLinks.userUploadReviewExistingAccounts);\n return;\n }\n\n function startBulkUpload(): void {\n const jobData = BulkUserUploadHelper.getJobData({\n users, customerId: currentUser.data.customerId, userType: props.userType\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\n if (!currentUser.data || !yearGroups.data)\n return <></>;\n \n return (\n <UserManagerClientContext.Provider value={UserManagerClient.Primary}>\n <BulkUserUploadWizardLayout\n appLinks={appLinks}\n userType={props.userType}\n currentStep='fix-duplicates'\n canAddExistingUsers\n >\n <div className='px-3'>\n <UserDuplicates\n onClickConfirm={onClickConfirm}\n closePopup={props.closePopup}\n appLinks={appLinks}\n userType={props.userType}\n currentUser={currentUser.data}\n yearGroups={yearGroups.data}\n validateUser={validateUser}\n validateEmail={validateEmail}\n emailRequired={props.userType === UserGroup.Staff}\n passwordPolicy={passwordPolicy.data}\n emptyStateImageUrl={ImageUrls.EmptyStates.UserManager.DUPLICATES}\n localErrorMessage={BulkUserUploadHelper.getErrorMessageOverride(props.userType)}\n />\n </div>\n </BulkUserUploadWizardLayout>\n </UserManagerClientContext.Provider>\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","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","DragOverlayStyles","opacity","cursor","calculateScrollState","ref","canScrollLeft","current","scrollLeft","canScrollRight","scrollWidth","clientWidth","SortIndicator","column","canSort","isSorted","theme","sortIndicator","SvgContainer","svgName","isSortedDesc","size","S","BaseTable","ids","idHash","tableOptions","columns","data","disableSortBy","enableSort","manualSortBy","manualSort","autoResetHiddenColumns","autoResetSortBy","initialState","sortBy","initialSortBy","initialSelectedRowIds","selectedRowIds","forEach","getRowId","useTable","plugins","useSortBy","useRowSelect","layout","useFlexLayout","useBlockLayout","allowFiltering","useFilters","allowGlobalFiltering","useGlobalFilter","getPlugins","getTableProps","getTableBodyProps","headerGroups","rows","prepareRow","toggleAllRowsSelected","setGlobalFilter","setHiddenColumns","state","renderTableRows","emptyState","row","FunctionHelper","isSelected","selectedRow","onSelectRow","enableSortableRows","getTableRowsClass","rowAppLink","getRowAppLink","onClickRow","allowSelectMultipleRows","toggleRowSelected","renderRow","sortableProps","dragAttributes","dragListeners","getSortableProps","role","key","renderCells","rowProps","getRowProps","SortableItemWrapper","original","childProps","childComponent","cells","cell","cellClassName","onSelectCell","getCellClassName","getCellProps","render","onSort","globalFilter","hiddenColumns","table","header","headerGroup","getHeaderGroupProps","headerRow","headers","getHeaderProps","getSortByToggleProps","headerCell","renderSortIndicator","hideSortIndicator","body","SortableContainerWrapper","getDragOverlay","rowIndex","findIndex","item","style","onSortEnd","onSortingRowsEnd","Table","enableSlider","scrollIncrement","scrollable","tableProps","elRef","scrollState","setScrollState","throttledOnScroll","el","removeEventListener","addEventListener","scroll","scrollBy","left","top","behavior","useTableScroll","renderTrackHorizontal","autoHeightMax","autoHeight","onClickScroll","direction","WidgetButton","W","hide","scrollContainerClassName","defaultProps","showButtons","hideHeader","getPhrase","WizardStepListItem","content","hideStepNumber","index","subText","isSelectedOverride","isCompleted","isCompletedOverride","itemContent","currentStepNumber","acc","step","i","totalSteps","itemsContainer","disableAppLinks","UserDuplicatesEmptyState","goNext","EmptyState","src","imageUrl","getColumns","onClickEdit","onClickDelete","Header","accessor","Cell","value","width","hasError","errorCodes","find","e","UserValidationCode","email","username","DivButton","tooltipPlacement","tooltipSpanHack","TABLE_THEME","UserDuplicateSet","isStudent","errorMessage","set","c","options","counter","firstName","surname","UserDuplicates","setDisableNext","setOnClickConfirm","deletingUsers","setDeletingUsers","editingUser","setEditingUser","initialSets","IconButton","initialSet","initialSetIds","updatedSet","updatedSetIds","ObjectHelper","emptyStateImageUrl","EditUploadedUserPopup","setUser","closePopup","analyticsOptions","currentUser","yearGroups","validateUser","formSize","emailRequired","passwordPolicy","localErrorMessage","validateEmail","DeleteUploadedUserPopup","BulkUserUploadFixDuplicatesView","UserRequests","UserManagerRequests","customerId","SecuritySettingsRequests","dispatch","fetchAsync","useSetPageMetadata","onCreateJobError","BulkUserActionsHelper","onCreateJob","job","params","jobId","UserManagerClientContext","UserManagerClient","jobData","JobRequests","_user","UserManagerHelper","userEmails","ImageUrls"],"sourceRoot":""}
1
+ {"version":3,"file":"scripts/8732-dc5182fb69-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/hooks/useBulkUploadUsers.ts","file:///app/packages/libs/shared/src/constants/DragOverlayStyles.ts","file:///app/packages/libs/shared/src/components/table/TableUtils.ts","file:///app/packages/libs/shared/src/components/table/table.scss","file:///app/packages/libs/shared/src/components/table/Table.tsx","file:///app/packages/libs/shared/src/components/wizard/header/WizardHeader.tsx","file:///app/packages/libs/shared/src/components/wizard/step-list/WizardStepList.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-upload/user-duplicates/empty-state/UserDuplicatesEmptyState.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-upload/user-duplicates/user-duplicate-set/UserDuplicateSetUtils.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-upload/user-duplicates/user-duplicate-set/UserDuplicateSet.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-upload/user-duplicates/UserDuplicates.tsx","file:///app/packages/projects/lite/src/apps/user-manager/views/bulk-user-upload/fix-duplicates/BulkUserUploadFixDuplicatesView.tsx"],"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 { 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};","export const DragOverlayStyles = { opacity: '0.8', cursor: 'grabbing' };","import React from 'react';\nimport { PluginHook, useBlockLayout, useFilters, useFlexLayout, useGlobalFilter, useRowSelect, useSortBy } from 'react-table';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\n\ninterface PluginOptions {\n allowFiltering?: boolean;\n allowGlobalFiltering?: boolean;\n layout?: 'flex' | 'block';\n}\n\nexport function getPlugins<T extends HashObject>(props: PluginOptions): PluginHook<T>[] {\n let plugins: PluginHook<T>[] = [\n useSortBy,\n useRowSelect,\n props.layout === 'flex' ? useFlexLayout : useBlockLayout\n ];\n\n if (props.allowFiltering)\n plugins = [\n ...plugins,\n useFilters\n ];\n\n if (props.allowGlobalFiltering)\n plugins = [\n ...plugins,\n useGlobalFilter\n ];\n\n return plugins;\n}\n\nexport function getSelectedRowIds(ids: string[]): Record<string, boolean> {\n const idHash: Record<string, boolean> = {};\n\n ids.forEach(id => idHash[id] = true);\n\n return idHash;\n}\n\ninterface TableScrollState {\n canScrollLeft: boolean;\n canScrollRight: boolean;\n}\n\nfunction calculateScrollState(ref: React.MutableRefObject<HTMLDivElement>): TableScrollState {\n const canScrollLeft = ref.current?.scrollLeft > 0;\n const canScrollRight = (ref.current?.scrollLeft + 1) < ref.current?.scrollWidth - ref.current?.clientWidth;\n\n return { canScrollLeft, canScrollRight };\n}\n\ninterface UseTableScroll {\n ref: (el: HTMLDivElement) => void;\n scrollState: TableScrollState;\n scroll: (scrollBy: number) => void;\n}\n\nexport function useTableScroll(): UseTableScroll {\n const elRef = React.useRef<HTMLDivElement>(null);\n const [ scrollState, setScrollState ] = React.useState<TableScrollState>(calculateScrollState(elRef));\n\n function onScroll(): void {\n setScrollState(calculateScrollState(elRef));\n }\n\n function scroll(scrollBy: number): void {\n elRef.current?.scrollBy({ left: scrollBy, top: 0, behavior: 'smooth' });\n }\n\n const throttledOnScroll = FunctionHelper.throttle(onScroll, 200);\n\n const ref = React.useCallback((el: HTMLDivElement) => {\n if (elRef.current) {\n elRef.current?.removeEventListener('scroll', throttledOnScroll);\n }\n\n if (el) {\n setScrollState(calculateScrollState(elRef));\n el.addEventListener('scroll', throttledOnScroll);\n }\n\n elRef.current = el;\n }, []);\n\n React.useEffect(() => {\n if (elRef?.current) {\n setScrollState(calculateScrollState(elRef));\n }\n }, [elRef]);\n\n return { ref, scrollState, scroll };\n}","// extracted by mini-css-extract-plugin\nexport default {\"sortIndicator\":\"gFhu0\",\"scrollContainer\":\"sWUp9\",\"scrollbarTrack\":\"Vn2qM\"};","import React from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\nimport {\n Cell,\n Column as BaseColumn,\n HeaderGroup,\n HeaderProps as BaseHeaderProps,\n IdType,\n Row,\n SortingRule,\n TableOptions,\n TableRowProps,\n useTable } from 'react-table';\nimport { DragEndEvent } from '@dnd-kit/core';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SortableContainerWrapper } from 'libs/shared/components/sortable/SortableContainerWrapper';\nimport { PropsWithSortableItemProps, SortableItemWrapper } from 'libs/shared/components/sortable/SortableItemWrapper';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { WidgetButton, WidgetButtonDirection } from 'libs/shared/components/widgets/widget-button/WidgetButton';\nimport { DragOverlayStyles } from 'libs/shared/constants/DragOverlayStyles';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { getPlugins, getSelectedRowIds, useTableScroll } from './TableUtils';\n\nimport styles from './table.scss';\n\nexport interface TableTheme {\n table?: string;\n header?: string;\n headerRow?: string;\n headerCell?: string;\n body?: string;\n row?: string | ((row: Row<any>) => string);\n selectedRow?: string;\n cell?: string | ((row?: Row<any>, cell?: Cell<any, any>) => string);\n sortIndicator?: string;\n}\n\nexport type HeaderProps<T extends HashObject> = BaseHeaderProps<T> & {\n renderSortIndicator: () => void;\n}\n\nexport type Column<T extends HashObject> = BaseColumn<T> & {\n hideSortIndicator?: boolean;\n}\n\ninterface SortIndicatorProps<T extends HashObject> {\n column: HeaderGroup<T>;\n theme?: TableTheme;\n}\n\nfunction SortIndicator<T extends HashObject>(props: SortIndicatorProps<T>): JSX.Element {\n if (!props.column.canSort)\n return <></>;\n\n return (\n <span\n className={\n `${styles.sortIndicator}\n ${!props.column.isSorted ? 'text-secondary' : ''}\n ${props.theme?.sortIndicator ?? ''}`\n }\n >\n <SvgContainer\n svgName={(props.column.isSortedDesc || !props.column.isSorted)\n ? cvSvgLibrary.ArrowRight\n : cvSvgLibrary.ArrowLeft\n }\n size={SvgContainerSize.Small}\n />\n </span>\n );\n}\n\ninterface BaseTableProps<T extends HashObject> {\n /**\n * Must be memoized.\n */\n data: T[];\n\n /**\n * Must be memoized.\n * \n * For documentation on Column Options, see https://react-table.tanstack.com/docs/api/useTable#column-options\n */\n columns: Column<T>[];\n\n theme?: TableTheme;\n\n onSelectRow?: (row: Row<T>) => void;\n\n onSelectCell?: (cell: Cell<T>) => void;\n\n onRowMouseOver?: (row: Row<T>) => void;\n\n onRowMouseLeave?: (row: Row<T>) => void;\n\n allowSelectMultipleRows?: boolean;\n\n initialSelectedRowIds?: string[];\n\n getRowId?: (row: T) => string;\n\n getRowAppLink?: (row: Row<T>) => Core.AppLink;\n\n enableSort?: boolean;\n\n manualSort?: boolean;\n\n onSort?: (sortingRule: SortingRule<T>[]) => void;\n \n // Opt-in to utilise react-table's useFilter hook.\n allowFiltering?: boolean;\n\n // Opt-in to utilise react-table's useGlobalFilter hook.\n allowGlobalFiltering?: boolean;\n\n // Use either a flex layout or a block layout. Default is flex.\n layout?: 'flex' | 'block';\n\n // Used by useGlobalFilter hook, needs to be enabled by prop above.\n globalFilter?: string;\n\n // Set initial state of hidden columns in react-table.\n hiddenColumns?: IdType<T>[];\n\n // Determine whether hidden columns should be preserved on a table update event.\n autoResetHiddenColumns?: boolean;\n\n // Determine whether sort order state should be preserved on a table update event.\n autoResetSortBy?: boolean;\n\n // Determine whether rows are sortable by drag and drop\n enableSortableRows?: boolean;\n\n onSortingRowsEnd?: (event: DragEndEvent) => void;\n\n // Set initial state of sorting in react-table\n initialSortBy?: SortingRule<T>[];\n\n emptyState?: JSX.Element;\n}\n \ntype SortableRowProps = PropsWithSortableItemProps<TableRowProps>;\n\nfunction BaseTable<T extends HashObject>(props: BaseTableProps<T>): JSX.Element {\n const tableOptions: TableOptions<T> = {\n columns: props.columns,\n data: props.data,\n disableSortBy: !props.enableSort,\n manualSortBy: props.manualSort,\n autoResetHiddenColumns: props.autoResetHiddenColumns,\n autoResetSortBy: props.autoResetSortBy,\n initialState: {\n sortBy: props.initialSortBy || []\n }\n };\n\n if (props.initialSelectedRowIds)\n tableOptions.initialState = { selectedRowIds: getSelectedRowIds(props.initialSelectedRowIds) };\n\n if (props.getRowId)\n tableOptions.getRowId = props.getRowId;\n\n const {\n getTableProps,\n getTableBodyProps,\n headerGroups,\n rows,\n prepareRow,\n toggleAllRowsSelected,\n setGlobalFilter,\n setHiddenColumns,\n state: { sortBy }\n } = useTable<T>(tableOptions, ...getPlugins<T>({ ...props }));\n\n function getTableRowsClass(row: Row<T>) {\n let className = FunctionHelper.isFunction(props.theme?.row)\n ? props.theme.row(row)\n : props.theme?.row ?? '';\n\n if (row.isSelected && props.theme?.selectedRow)\n className += ` ${props.theme?.selectedRow}`;\n\n if (props.onSelectRow)\n className += ' cursor-pointer';\n\n if (props.enableSortableRows)\n className += ' cursor-grab';\n\n return className;\n }\n\n function renderTableRows() {\n if (!rows.length && props.emptyState)\n return props.emptyState;\n \n return rows.map(row => {\n prepareRow(row);\n \n const className = getTableRowsClass(row);\n const rowAppLink = !!props.getRowAppLink && props.getRowAppLink(row);\n\n function onClickRow(): void {\n if (!props.onSelectRow)\n return;\n\n if (!props.allowSelectMultipleRows)\n toggleAllRowsSelected(false);\n \n props.onSelectRow(row);\n row.toggleRowSelected(true);\n }\n\n function getSortableProps(props: TableRowProps | PropsWithSortableItemProps<TableRowProps>, ref?: any) {\n if ('dragAttributes' in props && 'dragListeners' in props) {\n return {\n ...props.dragAttributes,\n ...props.dragListeners,\n 'aria-roledescription': 'Sortable row',\n ref\n };\n }\n\n return {};\n }\n\n function renderRow(props: TableRowProps | PropsWithSortableItemProps<TableRowProps>, ref?: any): JSX.Element {\n const sortableProps = getSortableProps(props, ref);\n\n if (rowAppLink) {\n return (\n <div\n role='row'\n key={row.id}\n >\n <AppLink\n {...props}\n {...sortableProps}\n className={className}\n appLink={rowAppLink}\n >\n {renderCells(row)}\n </AppLink>\n </div>\n );\n }\n\n return (\n <div\n {...props}\n {...sortableProps}\n key={row.id}\n role='row'\n className={className}\n onClick={onClickRow}\n >\n {renderCells(row)}\n </div>\n );\n }\n\n const rowProps = row.getRowProps();\n\n if (props.enableSortableRows) {\n return (\n <SortableItemWrapper\n id={row.original.id}\n key={row.id}\n childProps={rowProps}\n childComponent={React.forwardRef(\n (props: SortableRowProps, ref: React.LegacyRef<HTMLDivElement>) => (renderRow(props, ref))\n )}\n />\n );\n }\n\n return renderRow(rowProps);\n });\n }\n\n function getDragOverlayClassName(theme: TableTheme): string {\n let className = 'g-0 ';\n\n if (theme)\n className += theme.row;\n\n return className;\n }\n\n function getDragOverlay(id: string) {\n const rowIndex = rows.findIndex(item => item.original.id === id);\n const row = rows[rowIndex];\n \n return (\n <div\n {...props}\n className={getDragOverlayClassName(props.theme)}\n style={DragOverlayStyles}\n >\n {renderCells(row)}\n </div>\n );\n }\n\n function getCellClassName(row: Row<T>, cell: Cell<T>): string {\n let cellClassName = '';\n\n if (typeof props.theme?.cell === 'function')\n cellClassName = props.theme.cell(row, cell);\n\n if (typeof props.theme?.cell === 'string')\n cellClassName = props.theme.cell;\n\n if (props.onSelectCell)\n cellClassName += ' cursor-pointer';\n\n return cellClassName;\n }\n\n function renderCells(row: Row<T>): JSX.Element[] {\n return row.cells.map(cell => {\n const cellClassName = getCellClassName(row, cell);\n\n function onClickCell(): void {\n props.onSelectCell && props.onSelectCell(cell);\n }\n\n return (\n <div key={cell.column.id} {...cell.getCellProps()} className={cellClassName} onClick={onClickCell} >\n {cell.render('Cell')}\n </div>\n );\n });\n }\n\n React.useEffect(() => {\n if (!props.onSort)\n return;\n\n props.onSort(sortBy);\n }, [sortBy]);\n\n React.useEffect(() => {\n if (!props.globalFilter)\n return;\n\n setGlobalFilter(props.globalFilter);\n }, [props.globalFilter]);\n\n React.useEffect(() => {\n if (!props.hiddenColumns)\n return;\n\n setHiddenColumns(props.hiddenColumns);\n }, [props.hiddenColumns && props.hiddenColumns.length]);\n\n return (\n <div {...getTableProps()} className={props.theme?.table ?? ''}>\n <div className={props.theme?.header ?? ''}>\n {headerGroups.map(headerGroup => (\n <div {...headerGroup.getHeaderGroupProps()} className={props.theme?.headerRow ?? ''}>\n {headerGroup.headers.map(column => (\n <div {...column.getHeaderProps(column.getSortByToggleProps())} className={props.theme?.headerCell ?? ''}>\n {column.render('Header', { renderSortIndicator: () => <SortIndicator column={column} theme={props.theme} /> })}\n {!(column as Column<T>).hideSortIndicator &&\n <SortIndicator column={column} theme={props.theme} />\n }\n </div>\n ))}\n </div>\n ))}\n </div>\n <div {...getTableBodyProps()} className={props.theme?.body ?? ''}>\n { props.enableSortableRows ? (\n <SortableContainerWrapper\n ids={rows.map(row => row.original.id)}\n getDragOverlay={getDragOverlay}\n onSortEnd={props.onSortingRowsEnd}\n >\n {renderTableRows()}\n </SortableContainerWrapper>\n ) : (\n renderTableRows()\n )}\n </div>\n </div>\n );\n}\n\ninterface TableProps<T extends HashObject> extends BaseTableProps<T> {\n enableSlider?: boolean;\n scrollIncrement?: number;\n scrollContainerClassName?: string;\n scrollable?: boolean;\n initialSortBy?: SortingRule<T>[];\n}\n\nTable.defaultProps = {\n scrollIncrement: 250,\n scrollable: false,\n layout: 'flex'\n};\n\nexport function Table<T extends HashObject>(props: TableProps<T>): JSX.Element {\n const { enableSlider, scrollIncrement, scrollable, ...tableProps } = props;\n\n const { ref, scrollState, scroll } = useTableScroll();\n\n if (scrollable) {\n return (\n <Scrollbars\n renderTrackHorizontal={() => <div className={styles.scrollbarTrack} />}\n autoHeightMax={10000}\n autoHeight\n >\n <BaseTable {...tableProps} />\n </Scrollbars>\n );\n }\n\n if (!enableSlider)\n return <BaseTable {...tableProps} />;\n\n function onClickScroll(direction: 'left' | 'right'): void {\n scroll(scrollIncrement * (direction === 'right' ? 1 : -1));\n }\n\n return (\n <div className='mx-n4 overflow-x-hidden overflow-y-hidden'>\n <div className='px-4'>\n <div className='position-relative'>\n <WidgetButton\n direction={WidgetButtonDirection.Left}\n onClick={() => onClickScroll('left')}\n hide={!scrollState.canScrollLeft}\n />\n <div className={`${styles.scrollContainer} ${props.scrollContainerClassName}`} ref={ref}>\n <BaseTable {...tableProps } />\n </div>\n <WidgetButton\n direction={WidgetButtonDirection.Right}\n onClick={() => onClickScroll('right')}\n hide={!scrollState.canScrollRight}\n />\n </div>\n </div>\n </div>\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 { 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}.`}&nbsp;</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}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { useBulkUploadUsers } from 'libs/shared/apps/user-manager/hooks/useBulkUploadUsers';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'userManager.userDuplicatesEmptyState';\n\ninterface UserDuplicatesEmptyStateProps {\n imageUrl: string;\n onClickConfirm: () => void;\n}\n\nexport function UserDuplicatesEmptyState(props: UserDuplicatesEmptyStateProps): JSX.Element {\n const { existingUsersHash } = useBulkUploadUsers();\n\n const goNext = !!Object.keys(existingUsersHash).length;\n\n return (\n <EmptyState>\n <EmptyState.Image src={props.imageUrl} />\n <EmptyState.Heading>\n <Text namespace={namespace} phrase='heading' />\n </EmptyState.Heading>\n <EmptyState.Cta\n text={LanguageService.getPhrase(namespace, goNext ? 'next' : 'create')}\n onClick={props.onClickConfirm}\n className='btn btn-dark'\n />\n </EmptyState>\n );\n}","import React from 'react';\nimport { CellProps, Column } from 'react-table';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { UserValidationCode } from 'libs/shared/apps/user-manager/enums/UserValidationCode';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'userManager.userDuplicateSet';\n\ninterface UserDuplicateData {\n lookupId: string;\n firstName: string;\n surname: string;\n email: string;\n username: string;\n errorCodes: UserValidationCode[];\n}\n\nexport const getColumns = (\n onClickEdit: (id: string) => void,\n onClickDelete: (id: string) => void\n): Column<UserDuplicateData>[] => ([\n {\n Header: LanguageService.getPhrase(namespace, 'firstName'),\n id: 'firstName',\n accessor: 'firstName',\n Cell: ({ value }) => (\n <div className='w-100'>\n {value}\n </div>\n ),\n width: 12.5\n },\n {\n Header: LanguageService.getPhrase(namespace, 'lastName'),\n id: 'surname',\n accessor: 'surname',\n Cell: ({ value }) => (\n <div className='w-100'>\n {value}\n </div>\n ),\n width: 12.5\n },\n {\n Header: LanguageService.getPhrase(namespace, 'email'),\n id: 'email',\n Cell: (cell: CellProps<UserDuplicateData>) => {\n const data = cell.row.original;\n const hasError = data.errorCodes.find(e => e === UserValidationCode.EmailAlreadyExisted);\n\n return (\n <div className={`w-100 ${hasError ? 'text-danger' : ''}`}>\n {data.email}\n </div>\n );\n },\n width: 39\n },\n {\n Header: LanguageService.getPhrase(namespace, 'username'),\n id: 'username',\n Cell: (cell: CellProps<UserDuplicateData>) => {\n const data = cell.row.original;\n const hasError = data.errorCodes.find(e => e === UserValidationCode.UsernameAlreadyExisted);\n\n return (\n <div className={`w-100 ${hasError ? 'text-danger' : ''}`}>\n {data.username}\n </div>\n );\n },\n width: 29\n },\n {\n Header: '',\n id: 'actions',\n accessor: 'lookupId',\n Cell: ({ value: lookupId }) => (\n <div className='w-100 d-flex align-items-center'>\n <DivButton className='me-2 cursor-pointer' onClick={() => onClickEdit(lookupId)}>\n <SvgContainer\n svgName={cvSvgLibrary.Edit}\n title={LanguageService.getPhrase(namespace, 'editTooltip')}\n tooltipPlacement='top'\n tooltipSpanHack\n />\n </DivButton>\n <DivButton className='cursor-pointer' onClick={() => onClickDelete(lookupId)}>\n <SvgContainer\n svgName={cvSvgLibrary.Close}\n title={LanguageService.getPhrase(namespace, 'deleteTooltip')}\n tooltipPlacement='top'\n tooltipSpanHack\n />\n </DivButton>\n </div>\n ),\n width: 7\n }\n]);","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { UserValidationCode } from 'libs/shared/apps/user-manager/enums/UserValidationCode';\nimport { EditUserRequest } from 'libs/shared/apps/user-manager/interfaces';\nimport { DuplicateUserSet } from 'libs/shared/apps/user-manager/interfaces/viewmodels/BulkUserUploadViewModel';\nimport { Table, TableTheme } from 'libs/shared/components/table/Table';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\n\nimport { getColumns } from './UserDuplicateSetUtils';\n\nconst namespace = 'userManager.userDuplicateSet';\n\nconst TABLE_THEME: TableTheme = {\n header: 'fw-semibold pb-1',\n headerCell: 'px-2 py-1',\n cell: 'px-2 py-1'\n};\n\nfunction getErrorMessage(errorCodes: UserValidationCode[], userType: UserGroup): string {\n const isStudent = userType === UserGroup.Learner;\n\n if (errorCodes.length === 2)\n return LanguageService.getPhrase(namespace, isStudent ? 'duplicateUsernameAndEmailStudents' : 'duplicateUsernameAndEmailStaff');\n\n if (errorCodes.find(c => c === UserValidationCode.UsernameAlreadyExisted))\n return LanguageService.getPhrase(namespace, isStudent ? 'duplicateUsernamesStudents' : 'duplicateUsernamesStaff');\n\n if (errorCodes.find(c => c === UserValidationCode.EmailAlreadyExisted))\n return LanguageService.getPhrase(namespace, isStudent ? 'duplicateEmailsStudents' : 'duplicateEmailsStaff');\n\n return '';\n}\n\ninterface UserDuplicateSetProps {\n index: number;\n set: DuplicateUserSet;\n userType: UserGroup;\n\n onClickEdit: (user: EditUserRequest) => void;\n onClickDelete: (users: string[]) => void;\n}\n\nexport function UserDuplicateSet(props: UserDuplicateSetProps): JSX.Element {\n const errorMessage = getErrorMessage(props.set.errorCodes, props.userType);\n\n const onClickEdit = (id: string) => props.onClickEdit(props.set.users.find(u => u.lookupId === id));\n const onClickDelete = (id: string) => props.onClickDelete([id]);\n\n if (!errorMessage)\n return <></>;\n\n return (\n <div className='pb-4'>\n <h3 className='h5'>\n <Text namespace={namespace} phrase='heading' options={{ counter: props.index + 1 }} />\n </h3>\n <p className='text-danger mb-1'>\n {errorMessage}\n </p>\n\n <div className='p-2 border rounded-3'>\n <Table\n columns={getColumns(onClickEdit, onClickDelete)}\n data={props.set.users.map(u => ({\n lookupId: u.lookupId,\n firstName: u.firstName,\n surname: u.surname,\n email: u.email,\n username: u.username,\n errorCodes: props.set.errorCodes\n }))}\n theme={TABLE_THEME}\n />\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { onCloseDeletePopup, onCloseEditPopup } from 'libs/shared/apps/user-manager/components/bulk-upload/BulkUserUploadEvents';\nimport { DeleteUploadedUserPopup } from 'libs/shared/apps/user-manager/components/delete-uploaded-user-popup/DeleteUploadedUserPopup';\nimport { EditUploadedUserPopup } from 'libs/shared/apps/user-manager/components/edit-uploaded-user-popup/EditUploadedUserPopup';\nimport { useBulkUploadUsers } from 'libs/shared/apps/user-manager/hooks/useBulkUploadUsers';\nimport { BulkUserEmailCheckResponse, EditUserRequest, ErroredUsers, UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { SecuritySettingsResponse } from 'libs/shared/apps/user-manager/interfaces/SecuritySettingsResponse';\nimport { DuplicateUserSet } from 'libs/shared/apps/user-manager/interfaces/viewmodels/BulkUserUploadViewModel';\nimport { BulkUserUploadHelper } from 'libs/shared/apps/user-manager/utils/BulkUserUploadHelper';\nimport { FormSize } from 'libs/shared/components/forms/form-field/FormField';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardLayoutContext } from 'libs/shared/context/WizardLayoutContext';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { CurrentUser, PropsWithPopupViewProps, YearGroup } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { UserDuplicatesEmptyState } from './empty-state/UserDuplicatesEmptyState';\nimport { UserDuplicateSet } from './user-duplicate-set/UserDuplicateSet';\n\ntype UserDuplicatesProps = PropsWithPopupViewProps<{\n userType: UserGroup;\n appLinks: UserManagerAppLinks;\n currentUser: CurrentUser;\n yearGroups: YearGroup[];\n validateUser: (user: EditUserRequest) => Promise<ErroredUsers>;\n validateEmail?: (email: string) => Promise<BulkUserEmailCheckResponse>;\n emailRequired: boolean;\n passwordPolicy: SecuritySettingsResponse;\n emptyStateImageUrl: string;\n onClickConfirm: () => void;\n formSize?: FormSize;\n localErrorMessage?: HashObject;\n}>;\n\nexport function UserDuplicates(props: UserDuplicatesProps): JSX.Element {\n const { users, duplicateSets } = useBulkUploadUsers();\n\n const { setDisableNext, setOnClickConfirm } = React.useContext(WizardLayoutContext);\n\n const namespace = props.userType === UserGroup.Learner\n ? 'userManager.studentDuplicates'\n : 'userManager.staffDuplicates';\n\n const getPhrase = LanguageService.encloseNamespace(namespace);\n\n const [ deletingUsers, setDeletingUsers ] = React.useState<string[]>([]);\n const [ editingUser, setEditingUser ] = React.useState<EditUserRequest>();\n\n const [initialSets] = React.useState<DuplicateUserSet[]>(duplicateSets);\n\n React.useEffect(() => {\n setDisableNext(!!duplicateSets?.length);\n }, [duplicateSets?.length]);\n\n React.useEffect(() => {\n setOnClickConfirm(() => props.onClickConfirm);\n }, [props.onClickConfirm]);\n\n if (!users?.length)\n return <></>;\n\n return (\n <>\n <h2 className='h4'><Text namespace={namespace} phrase='heading' /></h2>\n\n <main className='pb-3'>\n {duplicateSets?.length ? (\n <>\n <p className='mb-3 fw-semibold'>\n <Text namespace={namespace} phrase='subheading' />\n </p>\n\n <div className='pb-3'>\n <IconButton svgName={cvSvgLibrary.Upload} appLink={props.appLinks.userUploadPopup} className='btn btn-outline-dark me-2'>\n <Text namespace={namespace} phrase='reupload' />\n </IconButton>\n </div>\n\n {initialSets.map((initialSet, index) => {\n const initialSetIds = initialSet.users.map(u => u.lookupId);\n\n const updatedSet = duplicateSets.find(updatedSet => {\n const updatedSetIds = updatedSet.users.map(u => u.lookupId);\n\n return ObjectHelper.isEqual(initialSetIds, updatedSetIds);\n });\n\n const isResolved = !updatedSet.errorCodes.length;\n\n if (isResolved)\n return <React.Fragment key={index}></React.Fragment>;\n\n return (\n <UserDuplicateSet\n key={index}\n index={index}\n set={updatedSet}\n userType={props.userType}\n onClickEdit={setEditingUser}\n onClickDelete={setDeletingUsers}\n />\n );\n })}\n </>\n ) : (\n <>\n <p className='mb-3'>\n <Text namespace={namespace} phrase='emptyStateSubheading' />\n </p>\n <UserDuplicatesEmptyState imageUrl={props.emptyStateImageUrl} onClickConfirm={props.onClickConfirm} />\n </>\n )}\n \n </main>\n\n {!!editingUser && (\n <EditUploadedUserPopup\n key={editingUser.lookupId}\n user={editingUser}\n setUser={setEditingUser}\n closePopup={() => onCloseEditPopup(setEditingUser, props.closePopup)}\n title={getPhrase('editUser')}\n userType={props.userType}\n analyticsOptions={BulkUserUploadHelper.getAnalyticsOptions(props.userType)}\n currentUser={props.currentUser}\n yearGroups={props.yearGroups}\n validateUser={props.validateUser}\n formSize={props.formSize}\n emailRequired={props.emailRequired}\n passwordPolicy={props.passwordPolicy}\n appLinks={props.appLinks}\n localErrorMessage={props.localErrorMessage}\n validateEmail={props.validateEmail}\n />\n )}\n\n {!!deletingUsers.length && (\n <DeleteUploadedUserPopup\n users={deletingUsers}\n userType={props.userType}\n closePopup={() => onCloseDeletePopup(setDeletingUsers, props.closePopup)}\n analyticsOptions={BulkUserUploadHelper.getAnalyticsOptions(props.userType)}\n />\n )}\n </>\n );\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 { BulkUserUploadWizardLayout } from 'libs/shared/apps/user-manager/components/bulk-upload/layout/BulkUserUploadWizardLayout';\nimport { UserDuplicates } from 'libs/shared/apps/user-manager/components/bulk-upload/user-duplicates/UserDuplicates';\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 { BulkUserEmailCheckRequest, BulkUserEmailCheckResponse, EditUserRequest, ErroredUsers } from 'libs/shared/apps/user-manager/interfaces';\nimport { UserWizardParams } from 'libs/shared/apps/user-manager/interfaces/query-params/UserWizardParams';\nimport { SecuritySettingsResponse } from 'libs/shared/apps/user-manager/interfaces/SecuritySettingsResponse';\nimport { BulkUserActionsHelper } from 'libs/shared/apps/user-manager/utils/BulkUserActionsHelper';\nimport { BulkUserUploadHelper } from 'libs/shared/apps/user-manager/utils/BulkUserUploadHelper';\nimport { UserManagerHelper } from 'libs/shared/apps/user-manager/utils/UserManagerHelper';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { BatchJob, CurrentUser, PropsWithPopupViewProps, YearGroup } from 'libs/shared/interfaces';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { JobRequests } from 'shared/flight-requests/JobRequests';\n\nimport { SecuritySettingsRequests } from 'apps/settings/flight-requests/SecuritySettingsRequests';\nimport { UserManagerRequests } from 'apps/user-manager/flight-requests/UserManagerRequests';\nimport { getUserManagerAppLinks } from 'apps/user-manager/utils/LiteUserManagerAppLinks';\n\nconst namespace = 'userManager.bulkUploadFixDuplicates';\n\nexport function BulkUserUploadFixDuplicatesView(props: PropsWithPopupViewProps<UserWizardParams>): JSX.Element {\n const { users, existingUsersHash } = useBulkUploadUsers();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data && UserManagerRequests.yearGroups(currentUser.data.customerId)\n );\n const passwordPolicy = Flight.useBasicFetch<SecuritySettingsResponse>(currentUser.data &&\n SecuritySettingsRequests.getCustomerSecuritySettings(currentUser.data.customerId));\n\n const dispatch = useDispatch();\n const fetchAsync = Flight.useGetFetchAsync();\n const appLinks = getUserManagerAppLinks(props.userType);\n useSetPageMetadata({ title: LanguageService.getPhrase(namespace, 'pageTitle') });\n\n function validateUser(_user: EditUserRequest): Promise<ErroredUsers> {\n const data = UserManagerHelper.formatCreateOrValidateUserRequest(\n [_user],\n props.userType,\n currentUser.data.customerId\n );\n\n return fetchAsync(UserManagerRequests.bulkValidate(data));\n }\n\n function validateEmail(email: string): Promise<BulkUserEmailCheckResponse> {\n const body: BulkUserEmailCheckRequest = {\n userEmails: [{ email, userType: props.userType }]\n };\n\n return fetchAsync(UserManagerRequests.bulkCheckEmail(body, currentUser.data.customerId));\n }\n\n const onCreateJobError = BulkUserActionsHelper.useCreateJobErrorAlert();\n\n function onClickConfirm() {\n if (Object.keys(existingUsersHash).length) {\n goToNextStep();\n return;\n }\n startBulkUpload();\n }\n\n function goToNextStep() {\n Core.AppLinkHelper.trigger(appLinks.userUploadReviewExistingAccounts);\n return;\n }\n\n function startBulkUpload(): void {\n const jobData = BulkUserUploadHelper.getJobData({\n users, customerId: currentUser.data.customerId, userType: props.userType\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\n if (!currentUser.data || !yearGroups.data)\n return <></>;\n \n return (\n <UserManagerClientContext.Provider value={UserManagerClient.Primary}>\n <BulkUserUploadWizardLayout\n appLinks={appLinks}\n userType={props.userType}\n currentStep='fix-duplicates'\n canAddExistingUsers\n >\n <div className='px-3'>\n <UserDuplicates\n onClickConfirm={onClickConfirm}\n closePopup={props.closePopup}\n appLinks={appLinks}\n userType={props.userType}\n currentUser={currentUser.data}\n yearGroups={yearGroups.data}\n validateUser={validateUser}\n validateEmail={validateEmail}\n emailRequired={props.userType === UserGroup.Staff}\n passwordPolicy={passwordPolicy.data}\n emptyStateImageUrl={ImageUrls.EmptyStates.UserManager.DUPLICATES}\n localErrorMessage={BulkUserUploadHelper.getErrorMessageOverride(props.userType)}\n />\n </div>\n </BulkUserUploadWizardLayout>\n </UserManagerClientContext.Provider>\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","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","DragOverlayStyles","opacity","cursor","calculateScrollState","ref","canScrollLeft","current","scrollLeft","canScrollRight","scrollWidth","clientWidth","SortIndicator","column","canSort","isSorted","theme","sortIndicator","SvgContainer","svgName","isSortedDesc","size","S","BaseTable","ids","idHash","tableOptions","columns","data","disableSortBy","enableSort","manualSortBy","manualSort","autoResetHiddenColumns","autoResetSortBy","initialState","sortBy","initialSortBy","initialSelectedRowIds","selectedRowIds","forEach","getRowId","useTable","plugins","useSortBy","useRowSelect","layout","useFlexLayout","useBlockLayout","allowFiltering","useFilters","allowGlobalFiltering","useGlobalFilter","getPlugins","getTableProps","getTableBodyProps","headerGroups","rows","prepareRow","toggleAllRowsSelected","setGlobalFilter","setHiddenColumns","state","renderTableRows","emptyState","row","FunctionHelper","isSelected","selectedRow","onSelectRow","enableSortableRows","getTableRowsClass","rowAppLink","getRowAppLink","onClickRow","allowSelectMultipleRows","toggleRowSelected","renderRow","sortableProps","dragAttributes","dragListeners","getSortableProps","role","key","renderCells","rowProps","getRowProps","SortableItemWrapper","original","childProps","childComponent","cells","cell","cellClassName","onSelectCell","getCellClassName","getCellProps","render","onSort","globalFilter","hiddenColumns","table","header","headerGroup","getHeaderGroupProps","headerRow","headers","getHeaderProps","getSortByToggleProps","headerCell","renderSortIndicator","hideSortIndicator","body","SortableContainerWrapper","getDragOverlay","rowIndex","findIndex","item","style","onSortEnd","onSortingRowsEnd","Table","enableSlider","scrollIncrement","scrollable","tableProps","elRef","scrollState","setScrollState","throttledOnScroll","el","removeEventListener","addEventListener","scroll","scrollBy","left","top","behavior","useTableScroll","renderTrackHorizontal","autoHeightMax","autoHeight","onClickScroll","direction","WidgetButton","W","hide","scrollContainerClassName","defaultProps","showButtons","hideHeader","getPhrase","WizardStepListItem","content","hideStepNumber","index","subText","isSelectedOverride","isCompleted","isCompletedOverride","itemContent","currentStepNumber","acc","step","i","totalSteps","itemsContainer","disableAppLinks","UserDuplicatesEmptyState","goNext","EmptyState","src","imageUrl","getColumns","onClickEdit","onClickDelete","Header","accessor","Cell","value","width","hasError","errorCodes","find","e","UserValidationCode","email","username","DivButton","tooltipPlacement","tooltipSpanHack","TABLE_THEME","UserDuplicateSet","isStudent","errorMessage","set","c","options","counter","firstName","surname","UserDuplicates","setDisableNext","setOnClickConfirm","deletingUsers","setDeletingUsers","editingUser","setEditingUser","initialSets","IconButton","initialSet","initialSetIds","updatedSet","updatedSetIds","ObjectHelper","emptyStateImageUrl","EditUploadedUserPopup","setUser","closePopup","analyticsOptions","currentUser","yearGroups","validateUser","formSize","emailRequired","passwordPolicy","localErrorMessage","validateEmail","DeleteUploadedUserPopup","BulkUserUploadFixDuplicatesView","UserRequests","UserManagerRequests","customerId","SecuritySettingsRequests","dispatch","fetchAsync","useSetPageMetadata","onCreateJobError","BulkUserActionsHelper","onCreateJob","job","params","jobId","UserManagerClientContext","UserManagerClient","jobData","JobRequests","_user","UserManagerHelper","userEmails","ImageUrls"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[8856],{41196:(e,t,a)=>{a.d(t,{W:()=>o});var r=a(20354),n=a(93479),i=a(20768),s=a(31949);function o(e,t,a){var o,l=r.a.useBasicFetch(s.N.currentUser()),c=r.a.useBasicFetch(!!e&&i.b.interactiveMetadata(e)),u=r.a.useBasicFetch(!!(null===(o=c.data)||void 0===o?void 0:o.interactiveId)&&i.b.interactive(c.data.interactiveId)),d=!!l.data&&!!u.data;return r.a.useBasicFetch(d&&n.I.interactiveResultSet(c.data.interactiveId,c.data.id,l.data,t,a))}},18488:(e,t,a)=>{a.d(t,{o:()=>s});var r=a(99940),n=a(97395),i={namespace:"share-v2"},s={createShare:function(e){return{url:"{gateway}/v2/shares",key:"create:share-v2",type:r.k.POST,data:e,normalizeOptions:i,invalidationKeys:["sent:share-v2","get:share-v2:shares:object"]}},updateShare:function(e,t){return{url:"{gateway}/v2/shares/".concat(e),key:"update:share-v2",type:r.k.PUT,data:t,normalizeOptions:i,invalidationKeys:["share-v2:permanent-link:object","share-v2:".concat(e),"get:share-v2:shares:object"]}},deleteShare:function(e){return{type:r.k.DELETE,url:"{gateway}/v2/shares/".concat(e),key:"delete:share-v2",normalizeOptions:i,invalidationKeys:["share-v2:permanent-link:object","sent:share-v2","share-v2:".concat(e),"get:share-v2:shares:object"]}},getShare:function(e){return{url:"{gateway}/v2/shares/".concat(e),key:"share-v2:".concat(e),bootstrapName:"share-v2:".concat(e),type:r.k.GET,normalizeOptions:i}},getSentShares:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=Object.values(e).sort().join(":");return{url:n._.urlBuilder("{gateway}/v2/shares/sent",e),key:"sent:share-v2:".concat(t),type:r.k.GET,normalize:!1}},getShareLink:function(e){return{url:n._.urlBuilder("{gateway}/v2/shares/permanent-link",{objectId:e}),key:"share-v2:permanent-link:object:".concat(e),normalizeOptions:i}},createShareLink:function(e){return{type:r.k.POST,url:n._.urlBuilder("{gateway}/v2/shares/permanent-link",Object.assign({},e)),key:"create:share-v2:permanent-link:object:".concat(e.objectId),invalidationKeys:["share-v2:permanent-link:object:".concat(e.objectId),"sent:share-v2","get:share-v2:shares:object:".concat(e.objectId)],normalizeOptions:i}},getPrivacy:function(e){return{url:"{gateway}/v1/objects/".concat(e,"/access"),key:"privacy:".concat(e),normalize:!1}},getSharesByObjectId:function(e){return{url:"{gateway}/v2/shares/objects/".concat(e),key:"get:share-v2:shares:object:".concat(e),type:r.k.GET,normalizeOptions:i}},createSharePincode:function(e){return{url:"{gateway}/v2/shares/".concat(e,"/pincode"),key:"create:share-v2:".concat(e,":pincode"),type:r.k.POST}},getPincodeByShareId:function(e){return{url:"{gateway}/v2/shares/".concat(e,"/pincode"),key:"get:share-v2:".concat(e,":pincode")}},getPincodeByCode:function(e){return{url:"{gateway}/v2/shares/pincode?code=".concat(e),key:"get:share-v2:pincode:".concat(e)}}}},94644:(e,t,a)=>{a.d(t,{r:()=>u});var r=a(50242),n=a(81886),i=a(67058),s=a(14553),o=a(49267),l=a(49075),c={notFound:i.d,forbidden:{rating:s.q,yearLevel:s.q,region:o.a,privacy:s.q},badRequest:l._,internalServerError:l._};function u(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e){var i;i="number"==typeof e?e:e.status;var s=Object.assign(Object.assign({},c),t);i&&n.Q.Ry.isStatusCodeError(i)&&(i!==r.o.InternalServer?i!==r.o.NotFound?i!==r.o.Forbidden?a.badRequest||n.Q.Ry.throw(new s.badRequest):a.forbidden||n.Q.Ry.throw(new s.forbidden.privacy):a.notFound||n.Q.Ry.throw(new s.notFound):a.internalServerError||n.Q.Ry.throw(new l._))}}},39902:(e,t,a)=>{a.d(t,{FN:()=>v,SW:()=>f,fh:()=>h});var r=a(32735),n=a(20354),i=a(75896);function s(e){return function(e){if(Array.isArray(e))return l(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||o(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function o(e,t){if(e){if("string"==typeof e)return l(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?l(e,t):void 0}}function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,r=Array(t);a<t;a++)r[a]=e[a];return r}function c(e){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},c(e)}function u(e,t,a){return(t=function(e){var t=function(e){if("object"!=c(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var a=t.call(e,"string");if("object"!=c(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==c(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}var d=function(e,t){var a={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(a[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(r=Object.getOwnPropertySymbols(e);n<r.length;n++)t.indexOf(r[n])<0&&Object.prototype.propertyIsEnumerable.call(e,r[n])&&(a[r[n]]=e[r[n]])}return a},m=50;function h(e,t){var a=i.m.chunk(e,m).map(function(e){return t(i.m.uniq(e))}),r=n.a.useBasicFetchAll(a),s=i.m.flatten(r.data),o=r.data.length?s.reduce(function(e,t){return Object.assign(Object.assign({},e),u({},t.id,t))},{}):null;return{itemsArr:s,items:o,isFetching:r.isFetching,hasCompleted:r.hasCompleted}}function v(e,t,a){var n=null!=a?a:function(e){return"object"===c(e)?e.id:e},i=f({getRequest:t,_getKey:a}),s=i.fetchItems,o=d(i,["fetchItems"]);return r.useEffect(function(){(null==e?void 0:e.length)&&s(e)},[null==e?void 0:e.map(n).join(",")]),o}function f(e){var t,a,l,d,h,v=null!==(t=e._getKey)&&void 0!==t?t:function(e){return"object"===c(e)?e.id:e},f=r.useRef(new Set),g=(d=r.useState([]),h=2,function(e){if(Array.isArray(e))return e}(d)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var r,n,i,s,o=[],l=!0,c=!1;try{if(i=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;l=!1}else for(;!(l=(r=i.call(a)).done)&&(o.push(r.value),o.length!==t);l=!0);}catch(e){c=!0,n=e}finally{try{if(!l&&null!=a.return&&(s=a.return(),Object(s)!==s))return}finally{if(c)throw n}}return o}}(d,h)||o(d,h)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),p=g[0],y=g[1],b=n.a.useBasicFetchAll(p),I=i.m.flatten(b.data),E=b.data.length?I.reduce(function(e,t){return Object.assign(Object.assign({},e),u({},v(t),t))},{}):null;return{hasFirstRequestCompleted:!!(null===(l=null===(a=b.responses)||void 0===a?void 0:a[0])||void 0===l?void 0:l.hasCompleted),itemsArr:I,items:E,isFetching:b.isFetching,fetchItems:function(t){if(null==t?void 0:t.length){var a=[];t.forEach(function(e){var t=v(e);f.current.has(t)||(a.push(e),f.current.add(t))}),a.length&&y(function(t){return[].concat(s(t),s(i.m.chunk(a,m).map(e.getRequest)))})}}}}},91286:(e,t,a)=>{a.d(t,{v:()=>s});var r=a(32735),n=a(94644);function i(e){return e.map(function(e){return e.statusCode}).join(":")}function s(e,t,a){var s=Array.isArray(e)?e:[e];(0,r.useEffect)(function(){s.forEach(function(e){(0,n.r)(e.statusCode,t,a)})},[i(s),t,a])}},78057:(e,t,a)=>{a.d(t,{R:()=>C});var r=a(32735),n=a(75896),i=a(23481),s=a(97958),o=i.T.encloseNamespace("shared.studentResultsTable");function l(e){return"not_completed"===e.filter?r.createElement(s.u,{className:"bg-white rounded-bottom py-5"},r.createElement(s.u.Image,{src:e.notCompletedImageUrl,size:"small"}),r.createElement(s.u.Info,null,o("notCompletedDescription"))):"marking_required"===e.filter?r.createElement(s.u,{className:"bg-white rounded-bottom py-5"},r.createElement(s.u.Image,{src:e.markingRequiredImageUrl,size:"small"}),r.createElement(s.u.Info,null,o("markingRequiredDescription"))):"helping_hand"===e.filter?r.createElement(s.u,{className:"bg-white rounded-bottom py-5"},r.createElement(s.u.Image,{src:e.helpingHandImageUrl,size:"small"}),r.createElement(s.u.Info,null,o("helpingHandDescription"))):r.createElement(s.u,{className:"bg-white rounded-bottom py-5"},r.createElement(s.u.Image,{src:e.emptyStateImageUrl,size:"small"}),r.createElement(s.u.Heading,null,o("emptyStateHeading")),r.createElement(s.u.Info,null,o("emptyStateDescription")))}var c=a(83345),u="shared.studentResultsTable";function d(e){function t(t){var a=e.filter===t?null:t;e.setFilter(a)}function a(t){return"btn btn-outline-dark ".concat(function(t){return e.filter===t}(t)?"bg-dark text-white":"")}return r.createElement("div",{className:"d-flex align-items-center mb-3"},r.createElement("p",{className:"h6 mb-0"},r.createElement(c.x,{namespace:u,phrase:"filters"})),r.createElement("div",{className:"d-flex border-start ps-3 ms-3 gap-2"},r.createElement("button",{className:a("not_completed"),onClick:function(){return t("not_completed")}},r.createElement(c.x,{namespace:u,phrase:"notCompletedFilter"})),r.createElement("button",{className:a("marking_required"),onClick:function(){return t("marking_required")}},r.createElement(c.x,{namespace:u,phrase:"markingRequiredFilter"})),r.createElement("button",{className:a("helping_hand"),onClick:function(){return t("helping_hand")}},r.createElement(c.x,{namespace:u,phrase:"helpingHandFilter"}))))}var m=a(97364),h=a(6748),v=a(84806),f=a(19912);function g(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var r,n,i,s,o=[],l=!0,c=!1;try{if(i=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;l=!1}else for(;!(l=(r=i.call(a)).done)&&(o.push(r.value),o.length!==t);l=!0);}catch(e){c=!0,n=e}finally{try{if(!l&&null!=a.return&&(s=a.return(),Object(s)!==s))return}finally{if(c)throw n}}return o}}(e,t)||function(e,t){if(e){if("string"==typeof e)return p(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?p(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function p(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,r=Array(t);a<t;a++)r[a]=e[a];return r}var y={table:"".concat(f.Z.fixedTable," bg-white rounded-start border border-end-0"),header:"".concat(f.Z.header," border-bottom"),headerRow:"h-100",headerCell:"d-flex align-items-center justify-content-start",row:f.Z.row},b={header:"".concat(f.Z.header," fw-bold"),headerRow:"h-100",headerCell:"".concat(f.Z.interactionHeaderCellOuter," bg-white border-bottom"),row:"".concat(f.Z.row," ").concat(f.Z.resultsRow),cell:f.Z.resultsCellOuter};function I(e){var t,a=g(r.useState((0,m.P)(e.sortBy,"score")),2),i=a[0],s=a[1],o=g(r.useState(e.filterBy),2),c=o[0],u=o[1],p=r.useRef(null),I=(0,v.R7)(e.results,e.anonymiseUsers,null===(t=e.config)||void 0===t?void 0:t.imageCdnUrl),E=(0,v.lE)(e.interactive,e.interactiveMetadata,e.results,function(e){(0,v.bB)(p.current,e)},e.refreshTable),S=(0,v.Fx)(e.interactive,e.results,e.refreshTable,e.anonymiseUsers,n.m.first(i),c);function w(e){(0,v.l8)(p.current,e)}return r.createElement("div",null,!!e.results.students.length&&r.createElement(d,{filter:c,setFilter:u}),!S.length&&r.createElement(l,{emptyStateImageUrl:e.emptyStateImageUrl,helpingHandImageUrl:e.helpingHandImageUrl,markingRequiredImageUrl:e.markingRequiredImageUrl,notCompletedImageUrl:e.notCompletedImageUrl,filter:c}),!!S.length&&r.createElement("div",{ref:p,className:"d-flex".concat(S.length?" ".concat(f.Z.hasResults):"")},r.createElement(h.i,{columns:I,data:S,theme:y,onSelectRow:function(t){var a=t.original;e.viewStudentResults(a.user,e.interactiveMetadata.id)},onRowMouseOver:function(e){return w(e.index)},onRowMouseLeave:function(){return w()},enableSort:!0,manualSort:!0,onSort:s,initialSortBy:i}),r.createElement(h.i,{columns:E,data:S,theme:b,enableSlider:!0,scrollIncrement:8*v.Ju,onSelectCell:function(t){e.viewStudentResults(t.row.original.user,e.interactiveMetadata.id,t.column.id)},scrollContainerClassName:"rounded-end border border-start-0 border"})))}var E=a(99742);const S={partialInsights:"qSeTe"};function w(){return r.createElement("div",null,r.createElement("div",{className:"d-flex align-items-center mb-3"},r.createElement("p",{className:"h6 px-4 mb-0 me-4 partial-loading-background"}," "),r.createElement("div",{className:"row g-2 w-50"},r.createElement("div",{className:"col-3"},r.createElement("div",{className:"p-2 rounded-1 partial-loading-background"}," ")),r.createElement("div",{className:"col-3"},r.createElement("div",{className:"p-2 rounded-1 partial-loading-background"}," ")),r.createElement("div",{className:"col-3"},r.createElement("div",{className:"p-2 rounded-1 partial-loading-background"}," ")))),r.createElement("div",{className:"row g-3 mb-5"},r.createElement("div",{className:"col-12"},r.createElement("div",{className:"".concat(S.partialInsights," rounded partial-loading-background")}))))}function C(e){return r.createElement(r.Fragment,null,!e.hasDataLoaded&&r.createElement(w,null),e.hasDataLoaded&&r.createElement(I,{interactive:e.interactive,interactiveMetadata:e.interactiveMetadata,results:e.results,refreshTable:e.isFetching,viewStudentResults:e.viewStudentResults,emptyStateImageUrl:E.W.Insights.NO_RESPONSES,sortBy:e.sortBy,filterBy:e.filterBy,anonymiseUsers:e.anonymiseUsers,notCompletedImageUrl:E.W.Insights.JIGSAW,markingRequiredImageUrl:E.W.Insights.CLIPBOARD,helpingHandImageUrl:E.W.Insights.SPEECH_BUBBLE_HEART,config:e.config}))}},9447:(e,t,a)=>{a.d(t,{Y:()=>s});var r=a(20354),n=a(30439);function i(e){return i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i(e)}function s(e){var t,a=r.a.useBasicFetch(n.o.getAnonSessions(e));return{items:(null===(t=a.data)||void 0===t?void 0:t.reduce(function(e,t){return Object.assign(Object.assign({},e),(a={},r=t.sessionId,n={sessionId:(s=t).sessionId,name:s.sessionName},(r=function(e){var t=function(e){if("object"!=i(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var a=t.call(e,"string");if("object"!=i(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==i(t)?t:t+""}(r))in a?Object.defineProperty(a,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):a[r]=n,a));var a,r,n,s},{}))||{},hasCompleted:a.hasCompleted}}},5780:(e,t,a)=>{a.d(t,{p:()=>c});var r=a(20354),n=a(2510),i=a(18488),s=a(4594),o=a(3010),l=a(88630);function c(e){var t,a,c,u,d=r.a.useGetFetch(),m=r.a.useBasicFetch(i.o.getShare(e)),h=(null===(t=m.data)||void 0===t?void 0:t.type)===n.y.Classroom&&(null===(u=null===(c=null===(a=m.data)||void 0===a?void 0:a.recipients)||void 0===c?void 0:c.find(function(e){return e.recipientTypeId===s.E.Classroom}))||void 0===u?void 0:u.recipientId),v=function(e){return l.F.getClassroomStudents(h,e)},f=(0,o.i)(h&&v,function(e){return d(v(e))});return Object.assign(Object.assign({},f),{hasCompleted:!h||f.hasCompleted})}},52389:(e,t,a)=>{a.d(t,{_:()=>d});var r=a(20354),n=a(41196),i=a(18488),s=a(91286),o=a(9447),l=a(5780);function c(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,r=Array(t);a<t;a++)r[a]=e[a];return r}var u=[{id:"0",attempts:[{id:"0",answeredAt:0,answers:[]}]}];function d(e){var t,a,d=r.a.useBasicFetch(i.o.getShare(e)),m=(0,n.W)(null===(t=d.data)||void 0===t?void 0:t.objectId,null,e),h=(0,o.Y)(e),v=(0,l.p)(e);(0,s.v)(m);var f=m.hasCompleted&&h.hasCompleted&&v.hasCompleted;if(!f)return{data:null,hasCompleted:!1};var g,p=new Set,y=m.data.students.map(function(e){return e.user?(p.add(e.user.id),e):Object.assign(Object.assign({},e),{user:h.items[e.sessionId]||{sessionId:e.sessionId}})});return(null===(a=null==v?void 0:v.items)||void 0===a?void 0:a.length)&&y.push.apply(y,function(e){if(Array.isArray(e))return c(e)}(g=v.items.filter(function(e){return!p.has(e.id)}).map(function(e){return{user:e,results:u}}))||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(g)||function(e,t){if(e){if("string"==typeof e)return c(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?c(e,t):void 0}}(g)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),{hasCompleted:f,data:Object.assign(Object.assign({},m.data),{students:y})}}},50808:(e,t,a)=>{a.r(t),a.d(t,{BaseInsightsView:()=>ke});var r=a(32735),n=a(81886),i=a(20354),s=a(18488),o=a(86099),l=a(4594),c=a(23481),u=a(2948),d=a(93479),m=a(21789),h=a(60051),v=a(16714),f=a(39151),g=a(1666),p=a(47812),y=a(31949),b=a(91286),I=a(93322),E=a(22902),S=a(79612),w=a(31908),C=a(86702),j=a(88630),A=a(63619),F=a(17132),k=function(e,t){return{url:"{gateway}/v2/analytics/streams/shares/".concat(e,"/aggregation/").concat(t),key:"video:views:v2:share:aggregation:".concat(e,":").concat(t),normalize:!1}},B=function(e){return{url:"{gateway}/v2/analytics/streams/shares/".concat(e,"/heat-map"),key:"video:views:v2:share:heatmap:".concat(e),normalize:!1}},N=function(e){return{url:"{gateway}/v2/analytics/streams/shares/".concat(e,"/aggregation/heat-map"),key:"video:views:v2:share:heatmap:aggregation:".concat(e),normalize:!1}},O=a(39902),U=a(9447);function R(e){var t,a,r=i.a.useBasicFetch(B(e)),n=(0,U.Y)(e),s=(null===(t=r.data)||void 0===t?void 0:t.map(function(e){return e.userId}).filter(function(e){return!!e}))||[],o=(0,O.fh)(s,y.N.getById),l=Object.assign(Object.assign({},n.items),o.items),c=null===(a=r.data)||void 0===a?void 0:a.map(function(e){var t=l[e.userId||e.sessionId]||{sessionId:e.sessionId};return Object.assign(Object.assign({},t),{percentage:e.engagementRate})});return{engagement:r.data,users:c,hasCompleted:r.hasCompleted&&n.hasCompleted&&(!(null==s?void 0:s.length)||o.hasCompleted)}}var T=a(5780),L=a(10447);function x(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,r=Array(t);a<t;a++)r[a]=e[a];return r}var _=c.T.encloseNamespace("shared.insightsHeatmap");function M(e){var t,a,n,o,c,B,O,U=(B=(0,u.D)(C.y.ANONYMISE_USERS),O=1,function(e){if(Array.isArray(e))return e}(B)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var r,n,i,s,o=[],l=!0,c=!1;try{if(i=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;l=!1}else for(;!(l=(r=i.call(a)).done)&&(o.push(r.value),o.length!==t);l=!0);}catch(e){c=!0,n=e}finally{try{if(!l&&null!=a.return&&(s=a.return(),Object(s)!==s))return}finally{if(c)throw n}}return o}}(B,O)||function(e,t){if(e){if("string"==typeof e)return x(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?x(e,t):void 0}}(B,O)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];(0,I.F)();var M=(0,E.T)().hasPermissions,q=i.a.useBasicFetch(s.o.getShare(e.shareId)),P=m.x.getClassroomIdFromShare(q.data),D=i.a.useBasicFetch(P&&j.F.getClassroom(P)),W=(0,T.p)(e.shareId),z=q.data&&w.M.getVideoRequest(q.data.objectId,q.data.objectTypeId),V=i.a.useBasicFetch(z),G=i.a.useBasicFetch(f.L.config()),H=i.a.useBasicFetch(y.N.currentUser()),$=i.a.useBasicFetch(H.data&&g.h.yearGroups(H.data.customerId)),Z=w.M.isInteractive(V.data)&&d.I.pendingReviews({interactives:[V.data].map(function(t){return{interactiveId:t.interactiveId,metadataId:t.id,shareId:e.shareId}}),filters:{currentCustomerId:H.data.customerId,currentUserId:H.data.id}}),Q=(null===(a=null===(t=i.a.useBasicFetch(Z).data)||void 0===t?void 0:t[0])||void 0===a?void 0:a.pendingReviewCount)>0,Y=i.a.useBasicFetch(N(e.shareId)),K=R(e.shareId),J=K.users,X=K.engagement,ee=K.hasCompleted,te=i.a.useBasicFetch(k(e.shareId,"year_group")),ae=i.a.useBasicFetch((null===(n=q.data)||void 0===n?void 0:n.objectId)&&p.k.createViewKey(q.data.objectId,h.f.MasterObject));(0,S.M)({title:V.data?_("pageTitle",{video:null===(o=V.data)||void 0===o?void 0:o.name}):null}),(0,b.v)([q,V]);var re=q.hasCompleted&&V.hasCompleted&&G.hasCompleted&&Y.hasCompleted&&te.hasCompleted&&ae.hasCompleted&&$.hasCompleted;return r.createElement("div",{className:"px-3"},r.createElement(A.j,{video:V.data,tabs:function(){var e;return(null===(e=q.data)||void 0===e?void 0:e.objectTypeId)===l.E.Interactive?(0,L.kj)(q.data,"heatmap"):(0,L.$6)(q.data,"heatmap")}(),hasAnalytics:M(v.C.ViewCustomerAnalytics),analyticsWebUrl:null===(c=G.data)||void 0===c?void 0:c.analyticsWebUrl,share:q.data,yearGroups:$.data,classroom:D.data,markingRequired:Q}),r.createElement(F.w,{aggregateEngagement:Y.data,individualEngagement:X,yearGroups:te.data,config:G.data,users:J,viewKey:ae.data,hasDataLoaded:re,tableDataLoaded:ee,anonymiseUsers:U,classroomStudents:W.items}))}var q=a(39157),P=a(94892),D=a(38143),W=a(20768),z=a(54948),V=a(52389);function G(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,r=Array(t);a<t;a++)r[a]=e[a];return r}var H=c.T.encloseNamespace("insights.interactiveInsightsOverviewView");function $(e){var t,a,n,l,c,d,h=(c=(0,u.D)(D.g.ANONYMISE_USERS),d=1,function(e){if(Array.isArray(e))return e}(c)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var r,n,i,s,o=[],l=!0,c=!1;try{if(i=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;l=!1}else for(;!(l=(r=i.call(a)).done)&&(o.push(r.value),o.length!==t);l=!0);}catch(e){c=!0,n=e}finally{try{if(!l&&null!=a.return&&(s=a.return(),Object(s)!==s))return}finally{if(c)throw n}}return o}}(c,d)||function(e,t){if(e){if("string"==typeof e)return G(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?G(e,t):void 0}}(c,d)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];(0,I.F)();var p=(0,E.T)().hasPermissions,w=i.a.useBasicFetch(f.L.config()),C=i.a.useBasicFetch(y.N.currentUser()),F=i.a.useBasicFetch(C.data&&g.h.yearGroups(C.data.customerId)),O=i.a.useBasicFetch(s.o.getShare(e.shareId)),U=m.x.getClassroomIdFromShare(O.data),R=i.a.useBasicFetch(U&&j.F.getClassroom(U)),x=(0,T.p)(e.shareId),_=i.a.useBasicFetch((null===(t=O.data)||void 0===t?void 0:t.objectId)&&W.b.interactiveMetadata(O.data.objectId)),M=i.a.useBasicFetch((null===(a=_.data)||void 0===a?void 0:a.interactiveId)&&W.b.interactive(_.data.interactiveId)),$=(0,V._)(e.shareId),Z=i.a.useBasicFetch(B(e.shareId)),Q=i.a.useBasicFetch(N(e.shareId)),Y=i.a.useBasicFetch(k(e.shareId,"os_name"));(0,S.M)({title:_.data?H("pageTitle",{video:null===(n=_.data)||void 0===n?void 0:n.name}):null}),(0,b.v)([O,M,_]);var K=w.hasCompleted&&_.hasCompleted&&M.data&&Q.hasCompleted&&Z.hasCompleted&&Y.hasCompleted&&$.hasCompleted&&F.hasCompleted,J=function(e,t){return{resultsAppLink:(0,o.rq)(e,t),questionsAppLink:(0,o.Sj)(e,t),heatmapAppLink:(0,o.Rv)(e,t)}}(O.data),X=K&&(0,q.R6)(M.data,$.data,P.T),ee=X&&X.markingRequired.length>0;return r.createElement("div",{className:"px-3"},r.createElement(A.j,{video:_.data,tabs:(0,L.kj)(O.data,"insights"),hasAnalytics:p(v.C.ViewCustomerAnalytics),analyticsWebUrl:null===(l=w.data)||void 0===l?void 0:l.analyticsWebUrl,share:O.data,yearGroups:F.data,classroom:R.data,markingRequired:ee}),r.createElement(z.m,{aggregateEngagement:Q.data,individualEngagement:Z.data,interactive:M.data,interactiveMetadata:_.data,interactiveInsightsAppLinks:J,classroomStudents:x.items,results:$.data,osCount:Y.data,config:w.data,anonymiseUsers:h,hasDataLoaded:K,share:O.data}))}var Z=a(48705);function Q(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,r=Array(t);a<t;a++)r[a]=e[a];return r}var Y=c.T.encloseNamespace("shared.interactiveInsightsQuestionsView");function K(e){var t,a,n,o,l,c,d,h=(c=(0,u.D)(D.g.ANONYMISE_USERS),d=1,function(e){if(Array.isArray(e))return e}(c)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var r,n,i,s,o=[],l=!0,c=!1;try{if(i=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;l=!1}else for(;!(l=(r=i.call(a)).done)&&(o.push(r.value),o.length!==t);l=!0);}catch(e){c=!0,n=e}finally{try{if(!l&&null!=a.return&&(s=a.return(),Object(s)!==s))return}finally{if(c)throw n}}return o}}(c,d)||function(e,t){if(e){if("string"==typeof e)return Q(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?Q(e,t):void 0}}(c,d)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];(0,I.F)();var p=(0,E.T)().hasPermissions,w=i.a.useBasicFetch(y.N.currentUser()),C=i.a.useBasicFetch(f.L.config()),F=i.a.useBasicFetch(w.data&&g.h.yearGroups(w.data.customerId)),k=i.a.useBasicFetch(s.o.getShare(e.shareId)),B=m.x.getClassroomIdFromShare(k.data),N=i.a.useBasicFetch(B&&j.F.getClassroom(B)),O=i.a.useBasicFetch((null===(t=k.data)||void 0===t?void 0:t.objectId)&&W.b.interactiveMetadata(null===(a=k.data)||void 0===a?void 0:a.objectId)),U=i.a.useBasicFetch((null===(n=O.data)||void 0===n?void 0:n.interactiveId)&&W.b.interactive(O.data.interactiveId)),R=(0,V._)(e.shareId);(0,S.M)({title:O.data?Y("pageTitle",{video:null===(o=O.data)||void 0===o?void 0:o.name}):null}),(0,b.v)([k,U,O]);var T=U.data&&O.data&&!!R.data&&!!F.data,x=T&&(0,q.R6)(U.data,R.data,P.T),_=x&&x.markingRequired.length>0;return r.createElement("div",{className:"px-3"},r.createElement(A.j,{tabs:(0,L.kj)(k.data,"questions"),video:O.data,hasAnalytics:p(v.C.ViewCustomerAnalytics),analyticsWebUrl:null===(l=C.data)||void 0===l?void 0:l.analyticsWebUrl,share:k.data,yearGroups:F.data,classroom:N.data,markingRequired:_}),r.createElement(Z.x,{interactive:U.data,interactiveMetadata:O.data,interactionId:e.interactionId,config:C.data,sortBy:e.sortBy,isFetching:!R.hasCompleted||U.isFetching,anonymiseUsers:h,results:R.data,hasDataLoaded:T}))}var J=a(14070),X=a(97291),ee=a(78057);function te(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,r=Array(t);a<t;a++)r[a]=e[a];return r}var ae=c.T.encloseNamespace("insights.interactiveInsightsStudents");function re(e){var t,a,o,l,c,d,h=(c=(0,u.D)(D.g.ANONYMISE_USERS),d=1,function(e){if(Array.isArray(e))return e}(c)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var r,n,i,s,o=[],l=!0,c=!1;try{if(i=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;l=!1}else for(;!(l=(r=i.call(a)).done)&&(o.push(r.value),o.length!==t);l=!0);}catch(e){c=!0,n=e}finally{try{if(!l&&null!=a.return&&(s=a.return(),Object(s)!==s))return}finally{if(c)throw n}}return o}}(c,d)||function(e,t){if(e){if("string"==typeof e)return te(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?te(e,t):void 0}}(c,d)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0],p=(0,E.T)().hasPermissions,I=i.a.useBasicFetch(y.N.currentUser()),w=i.a.useBasicFetch(f.L.config()),C=i.a.useBasicFetch(I.data&&g.h.yearGroups(I.data.customerId)),F=i.a.useBasicFetch(s.o.getShare(e.shareId)),k=m.x.getClassroomIdFromShare(F.data),B=i.a.useBasicFetch(k&&j.F.getClassroom(k)),N=i.a.useBasicFetch((null===(t=F.data)||void 0===t?void 0:t.objectId)&&W.b.interactiveMetadata(F.data.objectId)),O=i.a.useBasicFetch((null===(a=N.data)||void 0===a?void 0:a.interactiveId)&&W.b.interactive(N.data.interactiveId)),U=(0,V._)(e.shareId),R=O.data&&N.data&&!!U.data&&!!C.data,T=R&&(0,q.R6)(O.data,U.data,P.T),x=T&&T.markingRequired.length>0;return(0,S.M)({title:N.data?ae("pageTitle",{video:null===(o=N.data)||void 0===o?void 0:o.name}):null}),(0,b.v)([F,O,N]),r.createElement("div",{className:"px-3"},r.createElement(A.j,{tabs:(0,L.kj)(F.data,"results"),video:N.data,hasAnalytics:p(v.C.ViewCustomerAnalytics),analyticsWebUrl:null===(l=w.data)||void 0===l?void 0:l.analyticsWebUrl,share:F.data,yearGroups:C.data,classroom:B.data,markingRequired:x}),r.createElement(ee.R,{interactiveMetadata:N.data,viewStudentResults:function(t,a,r){n.Q.C$.trigger({application:X.O.MY_SHARES,action:J.e.MyShares.INTERACTIVE_STUDENT_RESULTS,params:{studentId:t.id,shareId:e.shareId,interactionId:r,sessionId:t.sessionId}})},interactive:O.data,results:U.data,filterBy:e.filterBy,sortBy:e.sortBy,isFetching:!U.hasCompleted,anonymiseUsers:h,hasDataLoaded:R,config:w.data}))}var ne=a(37802),ie=a(51870),se=a(50916),oe=a(84621),le=a(98551),ce=a(35223),ue=c.T.encloseNamespace("shared.insightStudentsNotWatched");function de(e){var t,a=(null===(t=e.students)||void 0===t?void 0:t.filter(function(t){var a;return!(null===(a=e.watchedIds)||void 0===a?void 0:a.includes(t.id))}))||[];return r.createElement(oe.L,{title:ue("title"),svgName:ce.vn.Puzzle,svgClassName:"bg-light-teal text-teal"},r.createElement(le.y,{students:a,imageCdnUrl:e.imageCdnUrl,imageUrl:e.imageUrl,description:ue("studentsDisplay"),anonymiseUsers:e.anonymiseUsers}))}var me=c.T.encloseNamespace("shared.insightStudentsWatched");function he(e){return r.createElement(oe.L,{title:me("title"),svgName:ce.vn.Flag,svgClassName:"bg-light-indigo text-indigo",count:e.students.length},r.createElement(le.y,{students:e.students,imageCdnUrl:e.imageCdnUrl,imageUrl:e.imageUrl,description:me("studentsDisplay"),appLink:e.heatmapAppLink,appLinkText:me("viewAll"),anonymiseUsers:e.anonymiseUsers}))}var ve=a(8604),fe=a(83345),ge=a(99742),pe=a(53214);const ye="oHwkx";function be(){return r.createElement("div",null,r.createElement("h2",{className:"h4 w-25 partial-loading-background"}," "),r.createElement("div",{className:"row g-3 mb-5"},r.createElement("div",{className:"col-12"},r.createElement("div",{className:"".concat(ye," rounded partial-loading-background")}))),r.createElement("h2",{className:"h4 w-25 partial-loading-background"}," "),r.createElement("div",{className:"row g-3 mb-5"},r.createElement("div",{className:"col-6"},r.createElement("div",{className:"".concat(ye," rounded partial-loading-background")})),r.createElement("div",{className:"col-6"},r.createElement("div",{className:"".concat(ye," rounded partial-loading-background")}))))}var Ie="insights.videoInsightsOverview";function Ee(e){var t,a,n,i=e.hasDataLoaded&&!!(null===(t=e.viewers)||void 0===t?void 0:t.length);function s(){return e.viewers?Object.values(e.viewers):[]}return r.createElement(r.Fragment,null,!e.hasDataLoaded&&r.createElement(be,null),e.hasDataLoaded&&r.createElement(pe.u,{video:e.video,hasData:i,share:e.share},r.createElement("section",{className:"mb-5"},r.createElement("h2",{className:"h4"},r.createElement(fe.x,{namespace:Ie,phrase:"studentViewing"}),r.createElement("span",null,": ",s().length,e.classroomStudents?"/".concat(e.classroomStudents.length):"")),r.createElement("div",{className:"row g-3"},!!(null===(a=e.classroomStudents)||void 0===a?void 0:a.length)&&r.createElement("div",{className:"col-12 col-md"},r.createElement(de,{students:e.classroomStudents,watchedIds:null===(n=e.viewers)||void 0===n?void 0:n.map(function(e){return e.id}),imageCdnUrl:e.config.imageCdnUrl,heatmapAppLink:e.videoInsightsAppLinks.heatmapAppLink,imageUrl:ge.W.Insights.AVATAR,anonymiseUsers:e.anonymiseUsers})),r.createElement("div",{className:"col-12 col-md"},r.createElement(he,{students:s(),imageCdnUrl:e.config.imageCdnUrl,heatmapAppLink:e.videoInsightsAppLinks.heatmapAppLink,imageUrl:ge.W.Insights.AVATAR,anonymiseUsers:e.anonymiseUsers})))),r.createElement("section",{className:"mb-5"},r.createElement("h2",{className:"h4"},r.createElement(fe.x,{namespace:Ie,phrase:e.hasClassrooms?"classEngagement":"engagement"})),r.createElement("div",{className:"row g-3"},r.createElement("div",{className:"col-12 col-md-6"},r.createElement(ie.i,{osCount:e.osCount})),r.createElement("div",{className:"col-12 col-md-6"},r.createElement(se.b,{engagement:e.aggregateEngagement,heatmapAppLink:e.videoInsightsAppLinks.heatmapAppLink,engagementRate:(0,ve.Q)(e.individualEngagement)}))))))}function Se(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,r=Array(t);a<t;a++)r[a]=e[a];return r}var we=c.T.encloseNamespace("insights.videoInsightsOverviewView");function Ce(e){var t,a,n,l,c=(n=(0,u.D)(D.g.ANONYMISE_USERS),l=1,function(e){if(Array.isArray(e))return e}(n)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var r,n,i,s,o=[],l=!0,c=!1;try{if(i=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;l=!1}else for(;!(l=(r=i.call(a)).done)&&(o.push(r.value),o.length!==t);l=!0);}catch(e){c=!0,n=e}finally{try{if(!l&&null!=a.return&&(s=a.return(),Object(s)!==s))return}finally{if(c)throw n}}return o}}(n,l)||function(e,t){if(e){if("string"==typeof e)return Se(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?Se(e,t):void 0}}(n,l)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];(0,I.F)();var d=(0,ne.r)(null).hasClassrooms,h=(0,E.T)().hasPermissions,p=i.a.useBasicFetch(f.L.config()),C=i.a.useBasicFetch(y.N.currentUser()),F=i.a.useBasicFetch(C.data&&g.h.yearGroups(C.data.customerId)),O=i.a.useBasicFetch(s.o.getShare(e.shareId)),U=m.x.getClassroomIdFromShare(O.data),x=i.a.useBasicFetch(U&&j.F.getClassroom(U)),_=(0,T.p)(e.shareId),M=O.data&&w.M.getVideoRequest(O.data.objectId,O.data.objectTypeId),q=i.a.useBasicFetch(M);(0,S.M)({title:q.data?we("pageTitle",{video:null===(t=q.data)||void 0===t?void 0:t.name}):null}),(0,b.v)([O,q]);var P=i.a.useBasicFetch(B(e.shareId)),W=i.a.useBasicFetch(N(e.shareId)),z=i.a.useBasicFetch(k(e.shareId,"os_name")),V=R(e.shareId),G=V.users,H=V.hasCompleted,$=p.hasCompleted&&q.hasCompleted&&P.hasCompleted&&W.hasCompleted&&z.hasCompleted&&F.data&&H,Z=function(e){return{heatmapAppLink:(0,o.Rv)(e,void 0)}}(O.data);return r.createElement("div",{className:"px-3"},r.createElement(A.j,{video:q.data,classroom:x.data,tabs:(0,L.$6)(O.data,"insights"),hasAnalytics:h(v.C.ViewCustomerAnalytics),analyticsWebUrl:null===(a=p.data)||void 0===a?void 0:a.analyticsWebUrl,share:O.data,yearGroups:F.data}),r.createElement(Ee,{hasDataLoaded:!!$,hasClassrooms:d,anonymiseUsers:c,videoInsightsAppLinks:Z,config:p.data,video:q.data,classroomStudents:_.items,viewers:G,individualEngagement:P.data,aggregateEngagement:W.data,share:O.data,osCount:z.data}))}function je(e){return je="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},je(e)}function Ae(e,t,a){return(t=function(e){var t=function(e){if("object"!=je(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var a=t.call(e,"string");if("object"!=je(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==je(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}var Fe=Ae(Ae(Ae({},l.E.Video,{insights:function(e){return r.createElement(Ce,{shareId:e.share.shareId})},heatmap:function(e){return r.createElement(M,{shareId:e.share.shareId})}}),l.E.Clip,{insights:function(e){return r.createElement(Ce,{shareId:e.share.shareId})},heatmap:function(e){return r.createElement(M,{shareId:e.share.shareId})}}),l.E.Interactive,{insights:function(e){return r.createElement($,{shareId:e.share.shareId})},heatmap:function(e){return r.createElement(M,{shareId:e.share.shareId})},questions:function(e){return r.createElement(K,{interactionId:e.interactionId,sortBy:e.sortBy,shareId:e.share.shareId})},results:function(e){return r.createElement(re,{filterBy:e.filterBy,sortBy:e.sortBy,shareId:e.share.shareId})}});function ke(e){var t=i.a.useBasicFetch(s.o.getShare(e.shareId)),a=function(e){var t,a=e.share,n=e.tab,i=null===(t=Fe[null==a?void 0:a.objectTypeId])||void 0===t?void 0:t[n];return i?i(e):r.createElement(r.Fragment,null)}({share:t.data,tab:e.tab,interactionId:e.interactionId,sortBy:e.sortBy,filterBy:e.filterBy});return r.useEffect(function(){if(e.showShareOptions&&t.data){var a=(0,o.Zm)(t.data);a&&n.Q.C$.trigger(a)}},[t.data,e.showShareOptions]),r.createElement(r.Fragment,null,a)}}}]);
2
+ //# sourceMappingURL=8856-08061bbec5-lite.chunk.js.map