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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clickview/lite",
3
- "version": "0.78.0-rc.1",
3
+ "version": "0.78.0-rc.2",
4
4
  "description": "ClickView Lite",
5
5
  "main": "dist/scripts/bundle.js",
6
6
  "types": "dist/projects/lite/src/index.d.ts",
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/147-65ed8eb667-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/search/components/search-filters/PartialSearchFilters.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-list/empty-state/UserManagerSearchEmptyState.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-list/partial-loading/partial-user-list.scss","file:///app/packages/libs/shared/src/apps/user-manager/components/user-list/partial-loading/PartialUserList.tsx","file:///app/packages/libs/shared/src/components/bulk-selection-summary/bulk-selection-summary.scss","file:///app/packages/libs/shared/src/components/bulk-selection-summary/BulkSelectionSummary.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-list-items/components/JobTitle.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-list-items/components/LastActive.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-list-items/components/UserAuthenticationMethods.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/manage-users-table/ManageUsersTable.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/manage-users-table/ManageUsersTableUtils.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/manage-users-table/manage-users-table.scss","file:///app/packages/libs/shared/src/apps/user-manager/components/select-with-spreadsheet/select-with-spreadsheet.scss","file:///app/packages/libs/shared/src/apps/user-manager/components/select-with-spreadsheet/SelectWithSpreadsheet.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/manage-users/components/select-with-spreadsheet/select-with-spreadsheet-popup.scss","file:///app/packages/libs/shared/src/apps/user-manager/components/manage-users/components/select-with-spreadsheet/SelectWithSpreadsheetPopup.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/manage-users/useManageUsersCheckboxHelper.ts","file:///app/packages/libs/shared/src/apps/user-manager/components/manage-users/ManageUsers.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/manage-users/useGetActions.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-manager-entries/user-manager-entries.scss","file:///app/packages/libs/shared/src/apps/user-manager/components/user-manager-entries/UserManagerEntries.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-manager-header/UserManagerHeader.tsx","file:///app/packages/libs/shared/src/apps/user-manager/errors/cannot-year-group-rollover/CannotYearGroupRolloverError.ts","file:///app/packages/libs/shared/src/apps/user-manager/hooks/useFetchUserCount.ts","file:///app/packages/libs/shared/src/apps/user-manager/interfaces/viewmodels/BulkUserActionsViewModel.ts","file:///app/packages/libs/shared/src/apps/user-manager/utils/BulkUserActionsAnalyticsHelper.ts","file:///app/packages/libs/shared/src/components/tags/PartialTagItem.tsx","file:///app/packages/libs/shared/src/components/widgets/items/tag-widget-item/TagWidgetItem.tsx","file:///app/packages/libs/shared/src/enums/SupportArticle.ts","file:///app/packages/libs/shared/src/hooks/useBulkCheckboxManager.ts","file:///app/packages/projects/lite/src/apps/user-manager/constants/SelectWithSpreadsheetTemplate.ts","file:///app/packages/projects/lite/src/apps/user-manager/hooks/useFetchUsers.ts"],"sourcesContent":["import * as React from 'react';\n\nimport styles from './search-filters.scss';\n\ninterface PartialSearchFiltersProps {\n count?: number;\n}\n\nexport function PartialSearchFilters({ count = 6 }: PartialSearchFiltersProps): JSX.Element {\n return (\n <div className='d-flex'>\n <div className='d-flex ps-1'>\n {Array(count).fill(null).map((item, index) => (\n <div key={index} className={`${styles.partialButton} partial-loading-background mx-1`} />\n ))}\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'userManager.userManagerSearchEmptyState';\n\ninterface UserManagerSearchEmptyStateProps {\n imageUrl: string;\n}\n\nexport function UserManagerSearchEmptyState(props: UserManagerSearchEmptyStateProps): JSX.Element {\n return (\n <EmptyState>\n <EmptyState.Image src={props.imageUrl} />\n <EmptyState.Heading><Text namespace={namespace} phrase='heading' /></EmptyState.Heading>\n <EmptyState.Info><Text namespace={namespace} phrase='info' /></EmptyState.Info>\n </EmptyState>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialEntries\":\"TOmcn\",\"partialCreateUser\":\"Yf4Wx\",\"partialBulkUpload\":\"sp3ux\",\"partialCheckbox\":\"REK11\",\"partialYearGroup\":\"d2NEw\",\"partialName\":\"qmSU8\",\"partialEmail\":\"uHYQO\",\"partialAvatar\":\"Y796I\",\"lastActiveLabel\":\"aItB8\",\"lastActiveDate\":\"RMdcx\",\"partialAction\":\"jn0FO\"};","import React from 'react';\n\nimport styles from './partial-user-list.scss';\n\nfunction PartialUserItem(): JSX.Element {\n return (\n <li className='d-flex align-items-center py-2'>\n <div className={`ms-4 me-3 partial-loading-background ${styles.partialCheckbox}`} />\n\n <div className={`me-2 ms-n1 rounded-circle partial-loading-background ${styles.partialAvatar}`} />\n\n <div className='d-flex flex-column justify-content-center me-auto'>\n <div className='pb-1 d-flex align-items-center'>\n <div>\n <div className={`partial-loading-background align-middle d-inline-block ${styles.partialName}`} />\n </div>\n </div>\n\n <div className={`partial-loading-background me-1 align-middle d-inline-block ${styles.partialEmail}`} />\n </div>\n\n <div className='d-flex ps-1 me-3 d-flex justify-content-end'>\n <div className={`partial-loading-background ${styles.partialYearGroup}`} />\n </div>\n\n <span className='d-flex flex-column me-3'>\n <div className={`partial-loading-background mb-1 ${styles.lastActiveLabel}`} />\n <div className={`partial-loading-background ${styles.lastActiveDate}`} />\n </span>\n\n <div className='d-flex align-items-center'>\n <div className={`partial-loading-background ${styles.partialAction}`} />\n <div className={`partial-loading-background ${styles.partialAction}`} />\n </div>\n </li>\n );\n}\n\nexport function PartialUserList(): JSX.Element {\n return (\n <ul className='m-0 list-unstyled striped-list'>\n {Array(20).fill(null).map((item, index) => <PartialUserItem key={index} />)}\n </ul>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"iconContainer\":\"lUFJg\",\"loadingContainer\":\"b0Mz5\"};","import React from 'react';\nimport { Spinner } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { UserManagerConstants } from 'libs/shared/apps/user-manager/constants/UserManagerConstants';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './bulk-selection-summary.scss';\n\nconst namespace = 'shared.bulkSelectionSummary';\n\ninterface BulkSelectionSummaryProps {\n selectedCount: number;\n onClickDeselectAll: () => void;\n onClickSelectBulk: () => void;\n getTypeText: (count: number) => string;\n \n selectAllCount?: number;\n allSelected?: boolean;\n showSelectingSpinner?: boolean;\n onClickSelectAll?: (success: () => void) => void;\n\n hasRostering?: boolean;\n}\n\nexport function BulkSelectionSummary(props: BulkSelectionSummaryProps): JSX.Element {\n const [ selectAllSpinner, setSelectAllSpinner ] = React.useState(false);\n\n function onClickSelectAll(): void {\n setSelectAllSpinner(true);\n props.onClickSelectAll(() => {\n setSelectAllSpinner(false);\n });\n }\n\n if (!props.selectedCount && !props.showSelectingSpinner)\n return <></>;\n\n const showSelectAll = (\n !!props.onClickSelectAll &&\n !props.allSelected &&\n props.selectAllCount !== 0 &&\n props.selectAllCount > UserManagerConstants.USER_PAGE_LIMIT\n );\n\n return (\n <div className='border border-dark rounded-3 d-flex justify-content-between align-items-center p-2 mb-3'>\n {props.showSelectingSpinner ? (\n <div className={`px-2 d-flex align-items-center ${styles.loadingContainer}`}>\n <Spinner as='div' size='sm' animation='border' role='status' />\n </div>\n ) : (\n <>\n <div className='d-flex align-items-center'>\n <div className={`${styles.iconContainer} text-white rounded-circle bg-dark me-3 ms-2 d-flex justify-content-center align-items-center`}>\n <SvgContainer svgName={cvSvgLibrary.Group} />\n </div>\n\n <Text\n namespace={namespace}\n phrase='selectedCount'\n options={{ smartCount: props.selectedCount, type: props.getTypeText(props.selectedCount) }}\n />\n\n {(() => {\n if (!showSelectAll)\n return <></>;\n\n if (selectAllSpinner || props.selectAllCount === undefined)\n return (\n <div className='px-2 py-1'>\n <Spinner as='div' size='sm' animation='border' role='status' />\n </div>\n );\n\n return (\n <DivButton className='info-link px-2' onClick={onClickSelectAll}>\n <Text\n namespace={namespace}\n phrase='selectAll'\n options={{ smartCount: props.selectAllCount, type: props.getTypeText(props.selectAllCount) }}\n />\n </DivButton>\n );\n })()}\n </div>\n <div className='d-flex'>\n <button className='btn btn-link me-2' onClick={props.onClickDeselectAll}>\n <Text namespace={namespace} phrase='deselectAll' />\n </button>\n <Tooltip\n spanHack\n title={props.hasRostering ? LanguageService.getPhrase(namespace, 'disabled') : ''}\n >\n <button\n className={props.hasRostering ? 'btn btn-outline-dark cursor-default disabled' : 'btn btn-outline-dark'}\n onClick={props.onClickSelectBulk}\n disabled={props.hasRostering}\n >\n <Text namespace={namespace} phrase='selectBulkAction' />\n </button>\n </Tooltip>\n </div>\n </>\n )}\n \n </div>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { User } from 'libs/shared/interfaces';\n\nconst namespace = 'userManager.userList';\n\ninterface JobTitleProps {\n user: Partial<User>;\n}\n\nexport function JobTitle(props: JobTitleProps): JSX.Element {\n const jobTitle = props.user.userProfile?.metadata?.jobTitle || '-';\n\n return (\n <span className='d-flex flex-column'>\n <small>\n <Text namespace={namespace} phrase='jobTitle' />\n </small>\n <span className={jobTitle === '-' ? 'ms-3' : ''}>\n {jobTitle}\n </span>\n </span>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ObjectStatus } from 'libs/shared/enums/ObjectStatus';\nimport { CurrentUser, User } from 'libs/shared/interfaces';\n\nimport styles from './user-item-components.scss';\n\nconst namespace = 'userManager.userList';\n\nfunction isDateValid(date: string, status: ObjectStatus): boolean {\n return !!date && status === ObjectStatus.Active && DateHelper.get(date, 'year') >= 2000;\n}\n\nfunction getLastActiveDate(date: string, status: ObjectStatus): string {\n if (!isDateValid(date, status))\n return '-';\n\n const lastSignedIn = DateHelper.fromNow(date);\n\n if (lastSignedIn === 'a day ago')\n return LanguageService.getPhrase(namespace, 'yesterday');\n\n if (lastSignedIn.includes('hour'))\n return LanguageService.getPhrase(namespace, 'today');\n\n // If the string starts with a char that's not a number, convert it to uppercase. E.g. \"a year ago\"\n if (Number.isNaN(+lastSignedIn.substr(0, 1)))\n return lastSignedIn.substr(0, 1).toUpperCase() + lastSignedIn.substr(1);\n\n return lastSignedIn;\n}\n\ninterface LastActiveProps {\n user: User;\n currentUser?: CurrentUser;\n}\n\nexport function LastActive(props: LastActiveProps): JSX.Element {\n const date = getLastActiveDate(props.user.metadata?.lastSignInTime, props.user.status);\n\n const isCurrentUser = props.user.id.toString() === props.currentUser?.id.toString();\n\n return (\n <span className={`${styles.lastActiveContainer} ${isCurrentUser ? styles.isCurrentUser : ''}`}>\n <span className='d-flex flex-column'>\n <small>\n <Text namespace={namespace} phrase='lastActive' />\n </small>\n <span className={date === '-' ? 'ms-3' : ''}>\n {date}\n </span>\n </span>\n </span>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { User } from 'libs/shared/interfaces';\n\nimport styles from './user-item-components.scss';\n\nconst namespace = 'userManager.userList';\n\ninterface UserAuthenticationMethodsProps {\n user: User;\n}\n\nexport function UserAuthenticationMethods(props: UserAuthenticationMethodsProps): JSX.Element {\n /**\n * Sort the authentication methods so that SSO always appear on top of ClickView\n */\n const sortedAuthMethods = React.useMemo(() => {\n return props.user.authenticationMethods?.sort(method => {\n return method.local ? 1 : -1;\n });\n }, [props.user.authenticationMethods]);\n \n if (!props.user.authenticationMethods?.length)\n return <></>;\n\n const hasSSO = props.user.authenticationMethods?.find(am => !am.local);\n\n return (\n <div className={`${styles.authMethodContainer} d-flex flex-row-reverse justify-content-center ms-n3`}>\n <Tooltip\n title={LanguageService.getPhrase(namespace, hasSSO ? 'ssoTooltip' : 'noSsoTooltip')}\n spanHack\n >\n {sortedAuthMethods.map((authMethod, i) => {\n const backgroundColor = authMethod.backgroundColour ? `#${authMethod.backgroundColour}` : '#fff';\n\n return (\n <div\n key={authMethod.displayName}\n className={`${styles.authMethodLogo} rounded-circle border`}\n style={{\n zIndex: props.user.authenticationMethods.length - i,\n backgroundImage: `url(${authMethod.logoUrl})`,\n backgroundColor\n }}\n />\n );\n })}\n </Tooltip>\n </div>\n );\n}","import React from 'react';\n\nimport { UserManagerClientContext } from 'libs/shared/apps/user-manager/context/UserManagerClientContext';\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { Table, TableTheme } from 'libs/shared/components/table/Table';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { CurrentUser, User } from 'libs/shared/interfaces';\n\nimport { getColumns, useGetData } from './ManageUsersTableUtils';\n\nconst TABLE_THEME: TableTheme = {\n table: 'striped-list no-full-width pb-3',\n row: 'striped-row rounded',\n cell: 'd-flex align-items-center py-2'\n};\n\ninterface ManageUsersTableProps {\n users: User[];\n countryCode?: string;\n currentUser: CurrentUser;\n isChecked: (id: string) => boolean;\n onToggleCheckbox: (id: string) => void;\n imageCdnUrl: string;\n appLinks: UserManagerAppLinks;\n products?: ProductId[];\n onClickResendActivationEmail?: (user: User) => void;\n onClickSendResetEmail?: (user: User) => void;\n onClickSendVerificationEmail?: (user: User) => void;\n shouldDisplayAuthenticationMethods: boolean;\n ssoHelpArticle?: string;\n hasRostering?: boolean;\n}\n\nexport const ManageUsersTable = React.memo(function (props: ManageUsersTableProps): JSX.Element {\n const client = React.useContext<UserManagerClient>(UserManagerClientContext);\n const data = useGetData(props.users, props.isChecked);\n\n const columns = getColumns({\n ...props,\n products: props.products ?? [],\n client\n });\n\n return (\n <Table\n columns={columns}\n data={data}\n theme={TABLE_THEME}\n />\n );\n});","import React from 'react';\nimport { CellProps, Column } from 'react-table';\n\nimport { JobTitle } from 'libs/shared/apps/user-manager/components/user-list-items/components/JobTitle';\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { IconCircle } from 'libs/shared/components/icon-circle/IconCircle';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { CurrentUser, User } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { UserManagerAppLinks } from '../../interfaces';\nimport { BasicUserDetails } from '../user-list-items/components/BasicUserDetails';\nimport { LastActive } from '../user-list-items/components/LastActive';\nimport { RoleOrYearGroup } from '../user-list-items/components/RoleOrYearGroup';\nimport { UserAuthenticationMethods } from '../user-list-items/components/UserAuthenticationMethods';\nimport { UserItemActions } from '../user-list-items/components/UserItemActions';\nimport { UserItemAvatar } from '../user-list-items/components/UserItemAvatar';\n\nimport styles from './manage-users-table.scss';\n\ninterface ManageUsersTableData {\n user: User;\n checked: boolean;\n}\n\ninterface GetUsersTableColumnsProps {\n onToggleCheckbox: (id: string) => void;\n imageCdnUrl: string;\n currentUser: CurrentUser;\n appLinks: UserManagerAppLinks;\n products: ProductId[];\n onClickResendActivationEmail?: (user: User) => void;\n onClickSendResetEmail?: (user: User) => void;\n onClickSendVerificationEmail?: (user: User) => void;\n shouldDisplayAuthenticationMethods?: boolean;\n ssoHelpArticle?: string;\n hasRostering?: boolean;\n client?: UserManagerClient;\n countryCode?: string;\n}\n\nexport function getColumns({\n onToggleCheckbox,\n imageCdnUrl,\n currentUser,\n appLinks,\n products,\n onClickResendActivationEmail,\n onClickSendResetEmail,\n onClickSendVerificationEmail,\n shouldDisplayAuthenticationMethods,\n ssoHelpArticle,\n hasRostering,\n client,\n countryCode\n}: GetUsersTableColumnsProps): Column<ManageUsersTableData>[] {\n const columns: Column<ManageUsersTableData>[] = [\n {\n id: 'checkboxes',\n accessor: (data: ManageUsersTableData) => ({ id: data.user.id, checked: data.checked }),\n Cell: (cell: CellProps<ManageUsersTableData, { id: string; checked: boolean; }>) => React.useMemo(() => (\n <div className='w-100 text-center ms-3 ps-2'>\n <Checkbox\n id={cell.value.id}\n checked={cell.value.checked}\n onChange={() => onToggleCheckbox(cell.value.id)}\n />\n </div>\n ), []),\n width: 5\n },\n {\n accessor: 'user',\n id: 'avatar',\n Cell: ({ value }) => React.useMemo(\n () => {\n return (\n value.name ? (\n <div className='w-100'>\n <UserItemAvatar user={value} imageCdnUrl={imageCdnUrl} />\n </div>\n ) : (\n <div className={`${styles.avatarContainer} mx-2`}>\n <IconCircle\n svgName={cvSvgLibrary.User}\n variant='blue'\n svgSize={SvgContainerSize.ExtraLarge}\n svgWrapperClassName='p-1'\n />\n </div>\n ));\n }\n , []\n ),\n width: 5\n },\n {\n accessor: 'user',\n id: 'basicDetails',\n Cell: ({ value }) => React.useMemo(() => {\n return (\n <div className='w-100'>\n <BasicUserDetails user={value} currentUser={currentUser} />\n </div>\n );\n }, []),\n width: 50\n },\n {\n accessor: 'user',\n id: 'roleOrYearGroup',\n Cell: ({ value }) => React.useMemo(() => (\n <div className='w-100 text-end'>\n <RoleOrYearGroup userType={value.userType} user={value} countryCode={countryCode} />\n </div>\n ), []),\n width: 11\n }\n ];\n\n if (client === UserManagerClient.Curator) {\n columns.push({\n accessor: 'user',\n id: 'jobTitle',\n Cell: ({ value }) => React.useMemo(() => (\n <div className='w-100'>\n <JobTitle user={value} />\n </div>\n ), []),\n width: 8\n });\n }\n\n columns.push({\n accessor: 'user',\n id: 'lastActive',\n Cell: ({ value }) => React.useMemo(() => (\n <div className='w-100'>\n <LastActive user={value} currentUser={currentUser} />\n </div>\n ), []),\n width: 8\n });\n \n if (shouldDisplayAuthenticationMethods) {\n columns.push({\n accessor: 'user',\n id: 'authMethods',\n Cell: ({ value }) => React.useMemo(() => (\n <div className='w-100 d-flex justify-content-center'>\n <UserAuthenticationMethods user={value} />\n </div>\n ), []),\n width: 6\n });\n }\n\n columns.push({\n accessor: 'user',\n id: 'actions',\n Cell: ({ value }) => React.useMemo(() => (\n <div className='w-100'>\n <UserItemActions\n user={value}\n userType={value.userType}\n appLinks={appLinks}\n onClickSendResetEmail={onClickSendResetEmail}\n onClickResendActivationEmail={onClickResendActivationEmail}\n onClickSendVerificationEmail={onClickSendVerificationEmail}\n currentUser={currentUser}\n ssoHelpArticle={ssoHelpArticle}\n products={products}\n hasRostering={hasRostering}\n />\n </div>\n ), []),\n width: 8\n });\n\n return columns;\n}\n\nexport function useGetData(users: User[], isChecked: (id: string) => boolean): ManageUsersTableData[] {\n return users.map(user => {\n return {\n user,\n checked: isChecked(user.id),\n isCurrentUser: false\n };\n });\n}","// extracted by mini-css-extract-plugin\nexport default {\"avatarContainer\":\"kq2Bn\"};","// extracted by mini-css-extract-plugin\nexport default {\"cell\":\"Vsgxg\"};","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { BulkUploadFileSelect } from 'libs/shared/apps/user-manager/components/bulk-upload/bulk-upload-file-select/BulkUploadFileSelect';\nimport { InvalidSpreadsheetError } from 'libs/shared/apps/user-manager/errors/invalid-spreadsheet/InvalidSpreadsheetError';\nimport { BulkUserUploadHelper } from 'libs/shared/apps/user-manager/utils/BulkUserUploadHelper';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './select-with-spreadsheet.scss';\n\nconst namespaces = {\n [UserGroup.Learner]: 'userManager.selectStudentWithSpreadsheet',\n [UserGroup.Staff]: 'userManager.selectStaffWithSpreadsheet',\n [UserGroup.Unknown]: ''\n};\n\ninterface SelectWithSpreadsheetProps {\n onSelectSpreadsheet: (userQuery: string[], spreadsheetRowCount: number) => void;\n onClickCancel: () => void;\n userType: UserGroup;\n templateLink: string;\n}\n\nexport function SelectWithSpreadsheet(props: SelectWithSpreadsheetProps): JSX.Element {\n const namespace = namespaces[props.userType];\n\n function onSelectSpreadsheet(data: string[][]): void {\n const isEmpty = BulkUserUploadHelper.validateEmptySpreadsheetData(data);\n if (isEmpty) {\n props.onClickCancel();\n return;\n }\n\n const clone = [...data];\n const headings = clone.shift();\n\n const { isValid, errorMessage } = BulkUserUploadHelper.validateSelectWithSpreadsheet(\n headings,\n [ 'Email', 'Username' ]\n );\n\n if (!isValid) {\n Core.ErrorHelper.throw(new InvalidSpreadsheetError(errorMessage));\n props.onClickCancel();\n return;\n }\n\n const requests = BulkUserUploadHelper.buildUserQueryFromSpreadsheet(headings, clone, props.userType);\n\n props.onSelectSpreadsheet(requests, data.length);\n }\n\n const ExampleSpreadSheet = () => {\n return (\n <LanguageNamespaceContext.Provider value={namespaces[props.userType]}>\n <table cellPadding={5}>\n <tbody>\n\n <tr className='text-center bg-light'>\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='a' /></td>\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='b' /></td>\n </tr>\n\n <tr className='fw-semibold'>\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='email' /></td>\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='username' /></td>\n </tr>\n\n <tr>\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='exampleEmail' /></td>\n <td className={`text-nowrap border border-dark ${styles.cell}`}></td>\n </tr>\n <tr>\n <td className={`text-nowrap border border-dark ${styles.cell}`}></td>\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='exampleUsername' /></td>\n </tr>\n </tbody>\n </table>\n </LanguageNamespaceContext.Provider>\n );\n };\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n {/* Step 1 */}\n <div className='pb-3'>\n <div className='h6'><Text phrase='downloadTemplateHeading' /></div>\n <p className='ms-n1 ps-3'><Text phrase='downloadTemplateInfo' /></p>\n <div className='ms-n1 ps-3'>\n <a className='btn btn-outline-dark mx-auto' download href={props.templateLink}>\n <SvgContainer svgName={cvSvgLibrary.Download} className='svg-container std me-1 ms-n1 align-middle' />\n <div className='align-middle d-inline-block'><Text phrase='downloadBtn' /></div>\n </a>\n </div>\n </div>\n\n {/* Step 2 */}\n <div className='pb-3'>\n <div className='h6'><Text phrase='addUsersHeading' /></div>\n <p className='ms-n1 ps-3'><Text phrase='addUsersInfo' /></p>\n <div className='mx-n1 px-3'>\n <ExampleSpreadSheet/>\n </div>\n </div>\n\n {/* Step 3 */}\n <div className='pb-3'>\n <div className='h6'><Text phrase='uploadHeading' /></div>\n <div className='d-inline-block ms-n1 ps-3 mt-1'>\n <div className='d-inline-block'>\n <BulkUploadFileSelect onSelectSpreadsheet={onSelectSpreadsheet} />\n </div>\n </div>\n </div>\n\n {/* Step 4 */}\n <div>\n <div className='h6'><Text phrase='matchesHeading' /></div>\n <p className='ms-n1 ps-3'><Text phrase='matchesInfo' /></p>\n </div>\n </LanguageNamespaceContext.Provider>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"modalWidth\":\"KYu7Y\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, OperationDescriptor, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { useManageUsersCheckboxHelper } from 'libs/shared/apps/user-manager/components/manage-users/useManageUsersCheckboxHelper';\nimport { SelectWithSpreadsheet } from 'libs/shared/apps/user-manager/components/select-with-spreadsheet/SelectWithSpreadsheet';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { User } from 'libs/shared/interfaces';\n\nimport styles from './select-with-spreadsheet-popup.scss';\n\nconst namespaces = 'userManager.selectWithSpreadsheetPopup';\n\ntype ICheckboxHelper = ReturnType<typeof useManageUsersCheckboxHelper>\n\ntype SelectWithSpreadsheetPopupProps = {\n userType: UserGroup;\n users: User[];\n template: string;\n closePopup: () => void;\n checkboxHelper: ICheckboxHelper;\n setShowSelectingSpinner: (arg: boolean) => void;\n userRequest: (query: string) => Flight.Request;\n};\n\nexport function SelectWithSpreadsheetPopup(props: SelectWithSpreadsheetPopupProps): JSX.Element {\n const CheckboxHelper = props.checkboxHelper;\n const fetchAsync = Flight.useGetFetchAsync();\n let ids: string[] = [];\n\n function onSelectSpreadsheet(queries: string[], spreadsheetRowCount: number) {\n props.setShowSelectingSpinner(true);\n\n const requests = queries.map(q => {\n return fetchAsync<string[]>(props.userRequest(q));\n });\n\n Promise.all(requests).then(res => {\n res.forEach(r => {\n ids = ids.concat(r);\n });\n\n CheckboxHelper.selectAll(ids.map(id => id.toString()));\n\n AnalyticsHelper.logUserAction({\n userType: props.userType,\n spreadsheetRowCount: spreadsheetRowCount,\n totalUsersFound: ids.length\n }, {\n workflowPhase: WorkflowPhase.Complete,\n actionType: UserAction.Select,\n entity: EntityType.User,\n descriptor: OperationDescriptor.Bulk,\n location: LocationContext.Popup\n });\n\n props.setShowSelectingSpinner(false);\n });\n\n props.closePopup();\n }\n\n const dataLoaded = props.users.length;\n\n return (\n <Popup\n closePopup={props.closePopup}\n title={LanguageService.getPhrase(namespaces, 'heading')}\n showLoadingSpinner={!dataLoaded}\n dialogClassName={styles.modalWidth}\n >\n {dataLoaded && (\n <SelectWithSpreadsheet\n userType={props.userType}\n onSelectSpreadsheet={onSelectSpreadsheet}\n onClickCancel={props.closePopup}\n templateLink={props.template}\n />\n )}\n </Popup>\n );\n}","import React from 'react';\n\nimport { UserManagerQueryParams } from 'libs/shared/apps/user-manager/interfaces/query-params/UserManagerQueryParams';\nimport { BulkCheckboxManagerOptions, useBulkCheckboxManager } from 'libs/shared/hooks/useBulkCheckboxManager';\nimport { User } from 'libs/shared/interfaces';\n\ntype UsedParamNames = keyof Omit<UserManagerQueryParams, 'cursor' | 'sort'>;\n\ninterface ManagerUsersCheckboxHelper extends BulkCheckboxManagerOptions {\n queryParams: UserManagerQueryParams;\n}\n\n/**\n * Used by ManageUsers to determine if we should show the \"Select all X users\"\n * button or not, based on which filters we've previously selected all on\n */\nexport const useManageUsersCheckboxHelper = (\n users: User[],\n options: ManagerUsersCheckboxHelper\n) => {\n const CheckboxHelper = useBulkCheckboxManager(users, options);\n\n const [ bulkSelections, setBulkSelections ] = React.useState<any>({});\n\n function getSelectionKey(): string {\n // Need to disable linting complaining about our params\n // eslint-disable-next-line\n const { cursor, sort, ...queryParams } = options.queryParams;\n return Object.keys(queryParams)\n .sort()\n .map((key: UsedParamNames) => {\n const param = queryParams[key];\n return Array.isArray(param) ?\n param.sort().join(',') :\n param;\n })\n .join(':');\n }\n\n function selectAll(userIds: string[]): void {\n CheckboxHelper.setSelected(userIds);\n\n setBulkSelections({\n ...bulkSelections,\n [getSelectionKey()]: true\n });\n }\n\n function onToggleItem(id: string): void {\n if (CheckboxHelper.isChecked(id))\n setBulkSelections({});\n\n CheckboxHelper.onToggleItem(id);\n }\n\n function onToggleBulk(): void {\n if (CheckboxHelper.bulkChecked)\n setBulkSelections({});\n\n if (!users?.length)\n return;\n\n CheckboxHelper.onToggleBulk();\n }\n\n function reset(): void {\n setBulkSelections({});\n CheckboxHelper.reset();\n }\n\n function allSelected(): boolean {\n if (!Object.keys(bulkSelections).length)\n return false;\n\n /**\n * This will be our selection key if they click select all\n * with no filters or queries\n */\n if (bulkSelections[''])\n return true;\n\n return bulkSelections[getSelectionKey()];\n }\n\n return {\n ...CheckboxHelper,\n selectAll,\n onToggleItem,\n onToggleBulk,\n reset,\n allSelected: allSelected()\n };\n};","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { ClickDescriptor, EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { ScopedSearchBar } from 'libs/shared/apps/search/components/scoped-search-bar/ScopedSearchBar';\nimport { PartialSearchFilters } from 'libs/shared/apps/search/components/search-filters/PartialSearchFilters';\nimport { SearchFilters } from 'libs/shared/apps/search/components/search-filters/SearchFilters';\nimport { UserManagerSearchEmptyState } from 'libs/shared/apps/user-manager/components/user-list/empty-state/UserManagerSearchEmptyState';\nimport { PartialUserList } from 'libs/shared/apps/user-manager/components/user-list/partial-loading/PartialUserList';\nimport { UserManagerQueryParams } from 'libs/shared/apps/user-manager/interfaces/query-params/UserManagerQueryParams';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces/UserManagerAppLinks';\nimport { BulkUserActionsViewModel } from 'libs/shared/apps/user-manager/interfaces/viewmodels/BulkUserActionsViewModel';\nimport { YearGroupRolloverStatus } from 'libs/shared/apps/user-manager/interfaces/YearGroupRolloverStatus';\nimport { BulkUserActionsHelper } from 'libs/shared/apps/user-manager/utils/BulkUserActionsHelper';\nimport { UserManagerHelper } from 'libs/shared/apps/user-manager/utils/UserManagerHelper';\nimport { ActionsDropdown } from 'libs/shared/components/actions/ActionsDropdown';\nimport { BulkSelectionSummary } from 'libs/shared/components/bulk-selection-summary/BulkSelectionSummary';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { FormSize } from 'libs/shared/components/forms/form-field/FormField';\nimport { RosteringAlert } from 'libs/shared/components/rostering/rostering-alert/RosteringAlert';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { Config, CurrentUser, Customer, User, YearGroup } from 'libs/shared/interfaces';\n\nimport { ManageUsersTable } from '../manage-users-table/ManageUsersTable';\n\nimport { SelectWithSpreadsheetPopup } from './components/select-with-spreadsheet/SelectWithSpreadsheetPopup';\nimport { useGetActions } from './useGetActions';\nimport { useManageUsersCheckboxHelper } from './useManageUsersCheckboxHelper';\n\nconst namespace = 'userManager.manageUsers';\n\nconst subNamespaces = {\n [UserGroup.Learner]: 'userManager.manageStudents',\n [UserGroup.Staff]: 'userManager.manageStaff',\n [UserGroup.Unknown]: ''\n};\n\ninterface ManageUsersListProps {\n users: User[];\n customer?: Customer;\n userType: UserGroup;\n config: Config;\n currentUser: CurrentUser;\n countryCode?: string;\n searchEmptyState: string;\n appLinks: UserManagerAppLinks;\n totalUsers: number;\n queryParams: UserManagerQueryParams;\n hasSso: boolean;\n hasRostering?: boolean;\n searchInputSize?: FormSize;\n onClickResendActivationEmail?: (user: User) => void;\n fetchUserIds: (success: (userIds: string[]) => void) => void;\n onClickSendResetEmail?: (user: User) => void;\n onClickSendVerificationEmail?: (user: User) => void;\n ssoHelpArticle?: string;\n selectWithSpreadsheetTemplate: string;\n userRequest: (query: string, success?: (ids: string[]) => void) => Flight.Request;\n products?: ProductId[];\n}\n\ntype StudentProps = ManageUsersListProps & {\n userType: UserGroup.Learner;\n yearGroups: YearGroup[];\n yearGroupRolloverStatus?: YearGroupRolloverStatus;\n}\n\ntype StaffProps = ManageUsersListProps & {\n userType: UserGroup.Staff;\n yearGroups?: never;\n};\n\nexport function ManageUsers(props: StudentProps | StaffProps): JSX.Element {\n const analyticsLocation = LocationContext[props.userType === UserGroup.Learner ? 'StudentManager' : 'StaffManager'];\n const subNamespace = subNamespaces[props.userType];\n\n const locationContext = props.userType === UserGroup.Learner\n ? LocationContext.StudentManager\n : LocationContext.StaffManager;\n\n const [ viewModel, setBulkActionViewModel ] = useViewModel<BulkUserActionsViewModel>(\n SharedViewModelKeys.BULK_USER_ACTIONS\n );\n\n const [ isSelectingWithSpreadsheet, setIsSelectingWithSpreadsheet ] = React.useState<boolean>(false);\n const [ showSpinner, setShowSpinner ] = React.useState(false);\n\n const CheckboxHelper = useManageUsersCheckboxHelper(props.users, {\n persistNamespace: `manage:users:${props.userType}`,\n initialState: viewModel?.userIdMap,\n queryParams: props.queryParams\n });\n\n const extraActions = useGetActions({\n ...props,\n onSelectWithSpreadsheetSelect: () => setIsSelectingWithSpreadsheet(true),\n namespace: subNamespace,\n yearGroups: props.userType === UserGroup.Learner ? props.yearGroups : []\n });\n\n /**\n * We use this to unset our userIdMap when the user is leaving user manager.\n * When the user is going to bulk actions, we set clearOnExit to false\n * so that this hook cleanup doesn't unset our userIdMap.\n */\n const clearOnExit = React.useRef(true);\n React.useEffect(() => {\n return () => {\n if (clearOnExit.current)\n setBulkActionViewModel('userIdMap', undefined);\n };\n }, []);\n\n React.useEffect(() => {\n if (!CheckboxHelper.bulkChecked)\n return;\n\n if (props.totalUsers !== CheckboxHelper.getSelectedCount())\n return;\n\n setBulkActionViewModel('allUsersSelected', true);\n setBulkActionViewModel('allUsersCount', props.totalUsers);\n }, [CheckboxHelper.bulkChecked]);\n\n function onClickSelectBulkAction(): void {\n if (!CheckboxHelper.getSelectedCount())\n return;\n\n AnalyticsHelper.logUserAction({\n userCount: CheckboxHelper.getSelectedCount()\n }, {\n location: locationContext,\n entity: EntityType.User,\n actionType: UserAction.BulkAction,\n workflowPhase: WorkflowPhase.Start\n });\n\n clearOnExit.current = false;\n setBulkActionViewModel('userIdMap', CheckboxHelper.getMap());\n Core.AppLinkHelper.trigger(props.appLinks.bulkActionsReviewAccounts);\n }\n \n function onToggleSelectAll(success: () => void): void {\n AnalyticsHelper.logUserAction({\n userCount: CheckboxHelper.getSelectedCount()\n }, {\n location: locationContext,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.SelectAllUsers,\n entity: EntityType.User\n });\n\n props.fetchUserIds(userIds => {\n CheckboxHelper.selectAll(userIds);\n\n /**\n * Used for determining if the user can use year level rollover\n */\n const allUsersSelected = !BulkUserActionsHelper.hasFilterOrQuery(props.queryParams);\n setBulkActionViewModel('allUsersSelected', allUsersSelected);\n\n if (allUsersSelected)\n setBulkActionViewModel('allUsersCount', userIds.length);\n\n success();\n });\n }\n\n function unsetAllUsersSelected(): void {\n setBulkActionViewModel('allUsersSelected', false);\n setBulkActionViewModel('allUsersCount', undefined);\n }\n\n function onToggleBulk(): void {\n if (CheckboxHelper.bulkChecked)\n unsetAllUsersSelected();\n CheckboxHelper.onToggleBulk();\n }\n\n function onToggleItem(id: string): void {\n if (CheckboxHelper.isChecked(id))\n unsetAllUsersSelected();\n CheckboxHelper.onToggleItem(id);\n }\n\n function onClickDeselectAll(): void {\n unsetAllUsersSelected();\n CheckboxHelper.reset();\n }\n\n const mainFilters = React.useMemo(() => {\n return UserManagerHelper.getFilters(\n props.customer,\n props.userType,\n props.userType === UserGroup.Learner ? props.yearGroups : [],\n props.countryCode\n );\n }, [ props.yearGroups?.length, props.customer?.id, props.countryCode ]);\n\n const showFiltersPartialLoading = (\n !props.currentUser?.id ||\n (props.userType === UserGroup.Learner && !props.yearGroups?.length)\n );\n\n return (\n <>\n {props.hasRostering && (\n <RosteringAlert />\n )}\n <div className='d-flex align-items-center pb-3'>\n <div className='ps-4 pe-1'>\n <Checkbox\n id='user-manager'\n name='user-manager'\n checked={CheckboxHelper.bulkChecked}\n onChange={onToggleBulk}\n indeterminate={CheckboxHelper.hasSomeSelections()}\n />\n </div>\n <div className='me-auto'>\n {!showFiltersPartialLoading ? (\n <SearchFilters\n queryParams={props.queryParams}\n mainFilters={mainFilters}\n appLink={props.appLinks.userManager}\n analyticsOptions={{\n entity: EntityType.User,\n location: analyticsLocation\n }}\n hideHeading\n hideDivider\n constantIndices={['user']}\n />\n ) : (\n <PartialSearchFilters count={3} />\n )}\n </div>\n\n <div className='w-25'>\n <ScopedSearchBar\n id={`user-manager-search-${props.userType}`}\n name={`user-manager-search-${props.userType}`}\n placeholder={LanguageService.getPhrase(namespace, 'searchBarPlaceholder')}\n searchAppLink={props.appLinks.search}\n size={props.searchInputSize}\n searchIndices={['user']}\n analyticsOptions={{ entity: EntityType.User, location: analyticsLocation }}\n />\n </div>\n <ActionsDropdown\n actions={extraActions}\n dropdownToggleClassName='btn btn-outline-dark ms-2'\n />\n </div>\n\n <BulkSelectionSummary\n getTypeText={count => LanguageService.getPhrase(subNamespace, 'bulkSelectLabel', { smartCount: count })}\n selectedCount={CheckboxHelper.getSelectedCount()}\n onClickSelectAll={onToggleSelectAll}\n selectAllCount={props.totalUsers}\n onClickDeselectAll={onClickDeselectAll}\n onClickSelectBulk={onClickSelectBulkAction}\n allSelected={CheckboxHelper.allSelected}\n showSelectingSpinner={showSpinner}\n hasRostering={props.hasRostering}\n />\n\n {(() => {\n if (!props.users)\n return <PartialUserList />;\n \n if (!props.users.length)\n return <UserManagerSearchEmptyState imageUrl={props.searchEmptyState} />;\n\n return (\n <ManageUsersTable\n users={props.users}\n currentUser={props.currentUser}\n imageCdnUrl={props.config.imageCdnUrl}\n appLinks={props.appLinks}\n onClickResendActivationEmail={props.onClickResendActivationEmail}\n onClickSendResetEmail={props.onClickSendResetEmail}\n onClickSendVerificationEmail={props.onClickSendVerificationEmail}\n isChecked={CheckboxHelper.isChecked}\n onToggleCheckbox={onToggleItem}\n ssoHelpArticle={props.ssoHelpArticle}\n shouldDisplayAuthenticationMethods={props.hasSso}\n products={props.products}\n hasRostering={props.hasRostering}\n countryCode={props.countryCode}\n />\n );\n })()}\n\n {isSelectingWithSpreadsheet && (\n <SelectWithSpreadsheetPopup\n users={props.users}\n template={props.selectWithSpreadsheetTemplate}\n userType={props.userType}\n checkboxHelper={CheckboxHelper}\n closePopup={() => {\n setIsSelectingWithSpreadsheet(false);\n }}\n setShowSelectingSpinner={setShowSpinner}\n userRequest={props.userRequest}\n />\n )}\n </>\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { LocalStorageHelper } from 'libs/common/backbone/utils/LocalStorageHelper';\nimport { Core } from 'libs/common/core';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { EntityType, LocationContext, OperationDescriptor, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { CannotYearGroupRolloverError } from 'libs/shared/apps/user-manager/errors/cannot-year-group-rollover/CannotYearGroupRolloverError';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { BulkUserActionsViewModel } from 'libs/shared/apps/user-manager/interfaces/viewmodels/BulkUserActionsViewModel';\nimport { YearGroupRolloverStatus } from 'libs/shared/apps/user-manager/interfaces/YearGroupRolloverStatus';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { YearGroup } from 'libs/shared/interfaces';\n\nimport { UserManagerConstants } from '../../constants/UserManagerConstants';\nimport { BulkUserActionsAnalyticsHelper } from '../../utils/BulkUserActionsAnalyticsHelper';\n\ntype UserGetActionProps = {\n userType: UserGroup;\n namespace: string;\n appLinks: UserManagerAppLinks;\n yearGroupRolloverStatus?: YearGroupRolloverStatus;\n onSelectWithSpreadsheetSelect: () => void;\n hasRostering?: boolean;\n yearGroups: YearGroup[];\n};\n\nexport function useGetActions(props: UserGetActionProps): ActionOptions[] {\n const [ , setWizardViewModel ] = useViewModel<BulkUserActionsViewModel>(\n SharedViewModelKeys.BULK_USER_ACTIONS\n );\n\n const analyticsLocation = LocationContext[props.userType === UserGroup.Learner ? 'StudentManager' : 'StaffManager'];\n\n const actions: ActionOptions[] = [{\n label: LanguageService.getPhrase(props.namespace, 'export'),\n appLink: props.appLinks.exportUserList,\n analyticsOptions: {\n workflowPhase: WorkflowPhase.Start,\n actionType: UserAction.Export,\n entity: EntityType.User,\n location: analyticsLocation\n },\n analyticsData: {\n userType: props.userType\n }\n }];\n\n actions.push({\n label: LanguageService.getPhrase(props.namespace, 'auditLog'),\n appLink: props.appLinks.auditLog,\n onClick: () => {\n LocalStorageHelper.set(UserManagerConstants.AUDIT_LOG_REFERRER_KEY, props.userType);\n }\n });\n\n actions.push({\n label: LanguageService.getPhrase(props.namespace, 'selectWithSpreadsheet'),\n onClick: props.onSelectWithSpreadsheetSelect,\n analyticsOptions: {\n workflowPhase: WorkflowPhase.Start,\n actionType: UserAction.Select,\n entity: EntityType.User,\n descriptor: OperationDescriptor.Bulk,\n location: analyticsLocation\n },\n analyticsData: {\n userType: props.userType\n }\n });\n\n if (props.userType === UserGroup.Learner && props.yearGroupRolloverStatus && props.yearGroups?.length > 1) {\n const canRollover = !!props.yearGroupRolloverStatus?.canRollover && !props.hasRostering;\n\n actions.push({\n label: LanguageService.getPhrase(props.namespace, 'rollover'),\n appLink: canRollover && !props.hasRostering && props.appLinks.bulkActionsActionDetails.yearGroupRollover,\n disabled: !!props.hasRostering,\n className: props.hasRostering ? 'cursor-default disabled' : '',\n tooltip: props.hasRostering ? LanguageService.getPhrase(props.namespace, 'editControlledByRostering') : '',\n onClick: () => {\n if (canRollover) {\n setWizardViewModel({\n action: 'yearGroupRollover',\n subAction: 'yearGroupRollover'\n });\n\n const locationContext = props.userType === UserGroup.Learner\n ? LocationContext.StudentManager\n : LocationContext.StaffManager;\n\n BulkUserActionsAnalyticsHelper.logYearGroupRolloverEntry(locationContext);\n return;\n }\n\n const error = new CannotYearGroupRolloverError(\n props.yearGroupRolloverStatus?.previousRolloverDate\n );\n\n Core.ErrorHelper.throw(error);\n }\n });\n }\n\n return actions;\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"partialLoading\":\"mXgLg\"};","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport styles from './user-manager-entries.scss';\n\nconst namespace = 'userManager.userManagerEntries';\n\ninterface UserManagerEntriesProps {\n totalShowing: number;\n totalUsers: number;\n}\n\nexport function UserManagerEntries(props: UserManagerEntriesProps): JSX.Element {\n return (\n <p className='mb-0 fw-semibold'>\n <Text\n namespace={namespace}\n phrase='users'\n options={{\n totalShowing: props.totalShowing ?? 0,\n totalUsers: props.totalUsers ?? 0,\n smartCount: props.totalUsers ?? 0\n }}\n />\n </p>\n );\n}\n\nexport function PartialUserManagerEntries(): JSX.Element {\n return <div className={`partial-loading-background ${styles.partialLoading} d-inline-block`} />;\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { PartialUserManagerEntries, UserManagerEntries } from 'libs/shared/apps/user-manager/components/user-manager-entries/UserManagerEntries';\nimport { GetUserCountResponse } from 'libs/shared/apps/user-manager/interfaces/GetUserCountResponse';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces/UserManagerAppLinks';\nimport { Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { User } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'userManager.userManagerHeader';\nconst subNamespaces = {\n [UserGroup.Learner]: 'userManager.studentManagerHeader',\n [UserGroup.Staff]: 'userManager.staffManagerHeader',\n [UserGroup.Unknown]: ''\n};\n\ninterface UserManagerHeaderProps {\n userType: UserGroup;\n appLinks: UserManagerAppLinks;\n users: User[];\n userCount: GetUserCountResponse;\n hasSso?: boolean;\n hasRostering?: boolean;\n /**\n * Allows curator to specify a different heading component\n */\n headingComponent?: JSX.Element\n}\n\nexport function UserManagerHeader(props: UserManagerHeaderProps): JSX.Element {\n const subNamespace = subNamespaces[props.userType];\n\n const hasNumbers = props.users && typeof (props.userCount?.count) === 'number';\n const totalShowing = hasNumbers && props.users.length;\n\n return (\n <>\n <div className='d-flex justify-content-between'>\n {props.headingComponent ?\n <>{props.headingComponent}</> :\n <span>\n <h1 className='h2'><Text namespace={subNamespace} phrase='heading' /></h1>\n\n <div className='pb-3'>\n <Breadcrumbs\n breadcrumbs={[\n { name: LanguageService.getPhrase(namespace, 'settingsBreadcrumb'), appLink: props.appLinks.settings },\n { name: LanguageService.getPhrase(subNamespace, 'managerBreadcrumb'), active: true }\n ]}\n />\n </div>\n </span>\n }\n <span>\n <Tooltip\n spanHack\n title={props.hasRostering ? LanguageService.getPhrase(namespace, 'disabled') : ''}\n placement='left'\n >\n <IconButton\n className='btn btn-outline-dark'\n svgName={cvSvgLibrary.Plus}\n appLink={!props.hasSso ? props.appLinks.addNewUsers : props.appLinks.ssoAddUserConfirm}\n disabled={props.hasRostering}\n >\n <Text namespace={subNamespace} phrase='addNew' />\n </IconButton>\n </Tooltip>\n <div className='text-end mt-1'>\n {hasNumbers ? (\n <UserManagerEntries\n totalShowing={totalShowing}\n totalUsers={props.userCount.count}\n />\n ) : <PartialUserManagerEntries />}\n </div>\n </span>\n </div>\n </>\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { DialogError } from 'libs/shared/errors/primitives/DialogError';\nimport { DialogOptions } from 'libs/shared/interfaces';\nimport { ArticleHelper } from 'libs/shared/utils/ArticleHelper';\n\nconst lang = 'userManager.cannotYearGroupRolloverError';\n\nexport class CannotYearGroupRolloverError extends DialogError {\n private previousRolloverDate: string;\n\n constructor(previousRolloverDate: string) {\n super('CannotYearGroupRolloverError');\n\n const localDate = DateHelper.convertUTCToLocal(previousRolloverDate);\n this.previousRolloverDate = DateHelper.format(localDate, 'MMMM Do YYYY');\n }\n\n // @ts-ignore\n public get name(): string {\n return 'CannotYearGroupRolloverError';\n }\n\n // @ts-ignore\n public get dialogOptions(): DialogOptions {\n return {\n title: LanguageService.getPhrase(lang, 'heading'),\n text: LanguageService.getPhrase(lang, 'text', {\n previousRolloverDate: this.previousRolloverDate,\n supportUrl: ArticleHelper.getSupportRequestUrl(),\n linkClass: 'info-link'\n }),\n buttons: [{\n text: LanguageService.getPhrase(lang, 'okay'),\n className: 'btn btn-dark',\n success: true\n }]\n };\n }\n}","import { Flight } from 'libs/common/flight';\n\nimport { GetUserCountResponse } from 'libs/shared/apps/user-manager/interfaces/GetUserCountResponse';\nimport { UserManagerQueryParams } from 'libs/shared/apps/user-manager/interfaces/query-params/UserManagerQueryParams';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { CurrentUser } from 'libs/shared/interfaces';\n\ninterface Options {\n userType: UserGroup,\n queryParams: UserManagerQueryParams,\n getUserCountRequest: (\n customerId: string,\n userId: string,\n userType: UserGroup,\n queryParams: UserManagerQueryParams,\n ) => Flight.Request\n}\n\nexport const useFetchUserCount = (options: Options) => {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const userCount = Flight.useBasicFetch<GetUserCountResponse>(\n currentUser.data &&\n options.getUserCountRequest(currentUser.data.customerId, currentUser.data.id, options.userType, options.queryParams)\n );\n\n return userCount;\n};","import { Classroom, YearGroup } from 'libs/shared/interfaces';\n\nimport { BulkUserActionOptions, BulkUserSubAction } from '../../components/bulk-actions-wizard/layout/BulkUserActionsWizardLayout';\nimport { UserManagerQueryParams } from '../query-params/UserManagerQueryParams';\n\n// Please keep this array up to date with the interface below, so that the data we log to analytics remains accurate\nexport const BaseBulkUserActionsViewModelKeys: Array<keyof BulkUserActionsViewModel> = [\n 'userIdMap', 'params', 'action', 'subAction', 'allUsersSelected', 'allUsersCount', 'scrollContainer'\n];\n\nexport interface BulkUserActionsViewModel {\n userIdMap?: Map<string, boolean>;\n params?: UserManagerQueryParams;\n\n action?: BulkUserActionOptions; // TODO: Rename this to \"actionCategory\"\n subAction?: BulkUserSubAction; // TODO: Rename this to \"action\"\n\n // Used to determine if we can show year level rollover\n allUsersSelected?: boolean;\n allUsersCount?: number;\n scrollContainer?: HTMLElement;\n}\n\nexport interface BulkUserActionsYearGroupRolloverViewModel extends BulkUserActionsViewModel {\n yearGroup: YearGroup;\n}\n\nexport interface BulkUserActionsAddToClassroomViewModel extends BulkUserActionsViewModel {\n classroom: Classroom;\n}\n\nexport interface BulkUserActionsResetPasswordViewModel extends BulkUserActionsViewModel {\n password: string;\n changeOnNextLogin: boolean;\n}","import { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { BatchJobStatus } from 'libs/shared/enums/BatchJobStatus';\n\nimport { BulkUserActionStepId } from '../components/bulk-actions-wizard/layout/BulkUserActionsWizardLayout';\nimport { BaseBulkUserActionsViewModelKeys, BulkUserActionsViewModel } from '../interfaces/viewmodels/BulkUserActionsViewModel';\n\nexport const BulkUserActionsAnalyticsHelper = {\n getAnalyticsActionName(viewModel: BulkUserActionsViewModel): string | null {\n if (!viewModel?.action)\n return null;\n\n switch (viewModel.action) {\n case 'activation': {\n if (!viewModel?.subAction)\n return 'Deactivate / reactivate';\n\n if (viewModel.subAction === 'deactivate')\n return 'Deactivate';\n\n return 'Reactivate';\n }\n case 'addToClassroom':\n return 'Add to classroom';\n case 'changeYearGroup':\n return 'Change year level';\n case 'delete':\n return 'Delete user';\n case 'resetEmail':\n return 'Send password reset email';\n case 'activationEmail':\n return 'Send account activation email';\n case 'resetPassword':\n return 'Reset password';\n case 'yearGroupRollover':\n return 'Annual year level rollover';\n case 'removeFromSchool':\n return 'Remove user';\n default:\n return null;\n }\n },\n\n onClickNext(viewModel: BulkUserActionsViewModel, currentStep: BulkUserActionStepId): void {\n if (!viewModel)\n return;\n\n const analyticsData: HashObject = {\n userCount: viewModel.userIdMap.size,\n step: currentStep\n };\n\n const actionName = BulkUserActionsAnalyticsHelper.getAnalyticsActionName(viewModel);\n\n if (actionName)\n analyticsData.action = actionName;\n\n const actionData = ObjectHelper.omit(viewModel, BaseBulkUserActionsViewModelKeys);\n\n // Adds extra items like the `yearGroup` on year level actions or `password` on the reset pw action\n if (Object.keys(actionData).length)\n analyticsData.actionData = actionData;\n\n AnalyticsHelper.logUserAction(analyticsData, {\n location: LocationContext.BulkUserActionsWizard,\n workflowPhase: WorkflowPhase.Next,\n actionType: UserAction.BulkAction,\n entity: EntityType.User\n });\n },\n\n logYearGroupRolloverEntry(location: LocationContext): void {\n AnalyticsHelper.logUserAction({\n action: BulkUserActionsAnalyticsHelper.getAnalyticsActionName({ action: 'yearGroupRollover' })\n }, {\n entity: EntityType.User,\n actionType: UserAction.BulkAction,\n workflowPhase: WorkflowPhase.Start,\n location\n });\n },\n\n getJobStatus(status: BatchJobStatus): string | null {\n switch (status) {\n case BatchJobStatus.Completed:\n return 'Success';\n case BatchJobStatus.CompletedWithError:\n return 'Completed with some errors';\n case BatchJobStatus.Failed:\n return 'Failed';\n default:\n return null;\n }\n }\n};","import React from 'react';\n\nimport styles from './tags.scss';\n\ninterface PartialTagItemProps {\n tagClass?: string;\n}\n\nexport const PartialTagItem = React.memo(function({ tagClass = '' }: PartialTagItemProps): JSX.Element {\n const classNames = `partial-loading-background d-inline-block rounded-pill py-1 px-2 mb-1 me-1 text-nowrap ${tagClass} ${styles.partialTag}`;\n\n return (\n <div className='mt-1'>\n <span className={classNames}>&nbsp;</span>\n </div>\n );\n});","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { FilterOption } from 'libs/shared/apps/search/interfaces';\nimport { TagItem } from 'libs/shared/components/tags/TagItem';\nimport { BaseObject, Tag } from 'libs/shared/interfaces';\n\nexport interface TagWidgetItemProps {\n appLink: Core.AppLink;\n data: Tag;\n selectedItems?: BaseObject[];\n onClick?: (data: Tag | FilterOption) => void;\n}\n\nexport function TagWidgetItem(props: TagWidgetItemProps): JSX.Element {\n const isSelected = props.selectedItems.find(selection => selection.id === props.data.id);\n\n const colorClass = isSelected ? `bg-gray-900 text-white` : 'bg-light';\n\n return (\n <TagItem\n tag={props.data}\n appLink={props.appLink}\n tagClass={`no-decoration ${colorClass} lh-1`}\n onClick={() => props.onClick(props.data)}\n />\n );\n}","// Article name mapped to article ID on support site. Used by `ArticleHelper`\n\nexport enum OnlineSupportArticle {\n AddToPlaylist = '115005679748',\n EditSsoAccounts = '8202508040345',\n\n // LE\n LibraryEditor = '360001974533',\n VideoAccess = '360000153947',\n AddFromOnline = '360011718234',\n UploadToLibraryEditor = '360012069334',\n PBTErrorCodes = '360012421153',\n ManuelReview = '360020004534',\n LibraryReview = '360000163788',\n}\n\nexport enum LiteSupportArticle {\n Integrations = '4407268725529',\n Classrooms = '4405362551833',\n MakeInteractive = '4405370510873',\n EditSsoAccounts = '8202605666073',\n UploadToLibraryEditor = '10672936659865',\n AddFromLite = '10671345281561',\n ManageSsoYearGroups = '14691130889241',\n ContentReview = '18525199576601',\n ContentPermissions = '14692125209497',\n AccessSettings = '27927466562201',\n ContentGuidelines = '24133696186009',\n FoxtelFaq = '24133519542169',\n ViviIntegration = '23826297956377',\n AppleTvIntegration = '25832373739929',\n RssFeed = '32567445635097',\n ManageGroupPermissions = '35407217335705',\n MarcFormatDifferences = '48276917260441',\n ExportLibraries = '17684275853465'\n}\n","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { useForceUpdate } from 'libs/shared/hooks/useForceUpdate';\nimport { usePrevious } from 'libs/shared/hooks/usePrevious';\n\ntype CheckboxItemsState = Map<string, boolean>;\n\nexport interface BulkCheckboxManager {\n onToggleBulk: () => void;\n onToggleItem: (id: string) => void;\n getSelected: () => string[];\n isChecked: (item: string | number | HashObject<string>) => boolean;\n bulkChecked: boolean;\n deselectAll: () => void;\n hasSomeSelections: () => boolean;\n setSelected: (ids: string[]) => void;\n getSelectedCount: () => number;\n reset: () => void;\n getMap: () => Map<string, boolean>;\n}\n\nexport interface BulkCheckboxManagerOptions {\n idField?: string; // For objects like `PresentationAudiences` that don't use `id` as their identifier field\n persistNamespace?: string;\n preselectedIds?: string[];\n initialState?: CheckboxItemsState;\n}\n\n/**\n * @param collection - The collection you are keeping track of with checkboxes\n * @param options - See interface above\n */\nexport const useBulkCheckboxManager = (collection: HashObject[], options: BulkCheckboxManagerOptions = {}) => {\n const { idField = 'id', persistNamespace } = options;\n\n const initial = options.initialState ? options.initialState : new Map<string, boolean>();\n\n const items = React.useRef<CheckboxItemsState>(initial);\n \n const forceUpdate = useForceUpdate();\n\n const prevCollection = usePrevious(collection);\n const prevNamespace = usePrevious(persistNamespace);\n\n /**\n * This hook will clear the state of this hook when a user navigates between pages\n * if a persistNamespace was not provided\n */\n React.useEffect(() => {\n /**\n * If we're being passed initial state, we don't want to clear the state\n */\n if (options.initialState)\n return;\n\n /**\n * If we've been given a persist namespace, we don't want to clear our\n * selections while the namespace stays the same\n */\n if (persistNamespace && prevNamespace === persistNamespace)\n return;\n\n /**\n * Don't reinitialize if the ids of the new and old collection\n * are identical\n */\n const prevIds = prevCollection?.map(i => i[idField]).join();\n const ids = collection?.map(i => i[idField]).join();\n\n if (prevIds === ids)\n return;\n\n reset();\n }, [ prevCollection, prevNamespace, collection, options.initialState ]);\n\n React.useEffect(() => {\n if (!options.preselectedIds?.length)\n return;\n\n setSelected(options.preselectedIds);\n }, []);\n\n function reset(): void {\n items.current.clear();\n forceUpdate();\n }\n\n // When toggled on, all checkbox items will be enabled. Vice versa if toggled off\n function onToggleBulk(): void {\n const setValue = !isBulkChecked();\n\n collection.forEach(item => {\n if (setValue)\n items.current.set(item[idField].toString(), true);\n else\n items.current.delete(item[idField].toString());\n });\n\n forceUpdate();\n }\n\n // Toggles a single item\n function onToggleItem(id: string): void {\n const nextItemState = !items.current.get(id.toString());\n\n if (nextItemState)\n items.current.set(id.toString(), nextItemState);\n else\n items.current.delete(id.toString());\n \n forceUpdate();\n }\n\n // Returns the state of the item passed in\n function isChecked(item: string | number | HashObject<string>): boolean {\n if (typeof item === 'number')\n item = item.toString();\n else if (typeof item !== 'string')\n item = item[idField].toString();\n\n return items.current.get(item);\n }\n\n function getSelected(): string[] {\n return Array.from(items.current.keys());\n }\n\n function deselectAll(): void {\n if (!collection?.length) return;\n\n collection.forEach(item => {\n items.current.delete(item[idField].toString());\n });\n forceUpdate();\n }\n\n // Returns true if at least 1 item is checked\n function hasSomeSelections(): boolean {\n if (!collection?.length)\n return false;\n\n return !!collection.find(item => isChecked(item));\n }\n\n function isBulkChecked(): boolean {\n if (!collection?.length)\n return false;\n\n return collection.every(isChecked);\n }\n\n function setSelected(ids: string[]): void {\n ids.forEach(id => {\n items.current.set(id, true);\n });\n forceUpdate();\n }\n\n function getSelectedCount(): number {\n return items.current.size;\n }\n\n function getMap(): Map<string, boolean> {\n return items.current;\n }\n\n return {\n onToggleBulk,\n onToggleItem,\n getSelected,\n isChecked,\n bulkChecked: isBulkChecked(),\n deselectAll,\n hasSomeSelections,\n setSelected,\n getSelectedCount,\n reset,\n getMap\n };\n};","export const SelectWithSpreadsheetTemplates = '/templates/Template_Select_With_Spreadsheet.csv';\n","import { Flight } from 'libs/common/flight';\n\nimport { SearchResults } from 'libs/shared/apps/search/interfaces';\nimport { UserManagerQueryParams } from 'libs/shared/apps/user-manager/interfaces/query-params/UserManagerQueryParams';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { CurrentUser, User, UserCollection } from 'libs/shared/interfaces';\n\nimport { UserManagerRequests } from 'apps/user-manager/flight-requests/UserManagerRequests';\n\ntype Response = UserCollection | SearchResults<User>;\n\nexport function useFetchUsers(\n currentUser: CurrentUser,\n queryParams: UserManagerQueryParams,\n userType: UserGroup\n): Flight.Response<Response> {\n function getFetchRequest(): Flight.Request {\n if (!currentUser)\n return null;\n const queryParamsKeys = Object.keys(queryParams);\n\n const onlyPagination = queryParamsKeys.length === 1 && !!queryParams.cursor\n || queryParamsKeys.length === 2 && queryParamsKeys.includes('cursor') && queryParamsKeys.includes('previous');\n\n const onlyHasSort = queryParamsKeys.length === 1 && !!queryParams.sort;\n\n // If we have a search query or filter, we want to use it to limit our search. If not, we want to search all students.\n if (Object.keys(queryParams).length && !onlyPagination && !onlyHasSort)\n return UserManagerRequests.searchUsers(\n currentUser.customerId,\n currentUser.id,\n userType,\n queryParams,\n queryParams?.cursor\n );\n\n return UserManagerRequests.getUsers(currentUser.customerId, userType, queryParams, queryParams?.cursor);\n }\n\n return Flight.useBasicFetch<Response>(getFetchRequest());\n}"],"names":["PartialSearchFilters","count","className","Array","fill","map","item","index","key","namespace","UserManagerSearchEmptyState","props","EmptyState","src","imageUrl","Text","phrase","PartialUserItem","PartialUserList","BulkSelectionSummary","selectAllSpinner","setSelectAllSpinner","selectedCount","showSelectingSpinner","showSelectAll","onClickSelectAll","allSelected","selectAllCount","UserManagerConstants","Spinner","as","size","animation","role","SvgContainer","svgName","options","smartCount","type","getTypeText","undefined","DivButton","onClick","onClickDeselectAll","Tooltip","spanHack","title","hasRostering","LanguageService","onClickSelectBulk","disabled","JobTitle","jobTitle","user","userProfile","metadata","LastActive","date","status","ObjectStatus","DateHelper","isDateValid","lastSignedIn","includes","Number","isNaN","substr","toUpperCase","getLastActiveDate","lastSignInTime","isCurrentUser","id","toString","currentUser","UserAuthenticationMethods","sortedAuthMethods","authenticationMethods","sort","method","local","length","hasSSO","find","am","authMethod","i","backgroundColor","backgroundColour","displayName","style","zIndex","backgroundImage","logoUrl","TABLE_THEME","table","row","cell","ManageUsersTable","users","isChecked","client","UserManagerClientContext","data","checked","columns","onToggleCheckbox","imageCdnUrl","appLinks","products","onClickResendActivationEmail","onClickSendResetEmail","onClickSendVerificationEmail","shouldDisplayAuthenticationMethods","ssoHelpArticle","countryCode","accessor","Cell","Checkbox","value","onChange","width","name","UserItemAvatar","IconCircle","variant","svgSize","S","svgWrapperClassName","BasicUserDetails","RoleOrYearGroup","userType","UserManagerClient","push","UserItemActions","getColumns","Table","theme","namespaces","UserGroup","SelectWithSpreadsheet","download","href","templateLink","cellPadding","BulkUploadFileSelect","onSelectSpreadsheet","BulkUserUploadHelper","onClickCancel","clone","headings","shift","isValid","errorMessage","InvalidSpreadsheetError","requests","SelectWithSpreadsheetPopup","CheckboxHelper","checkboxHelper","fetchAsync","ids","dataLoaded","Popup","closePopup","showLoadingSpinner","dialogClassName","queries","spreadsheetRowCount","setShowSelectingSpinner","q","userRequest","Promise","all","then","res","forEach","r","concat","selectAll","AnalyticsHelper","totalUsersFound","workflowPhase","actionType","entity","descriptor","location","template","useManageUsersCheckboxHelper","useBulkCheckboxManager","bulkSelections","setBulkSelections","getSelectionKey","queryParams","cursor","Object","keys","param","isArray","join","userIds","setSelected","onToggleItem","onToggleBulk","bulkChecked","reset","subNamespaces","ManageUsers","analyticsLocation","subNamespace","locationContext","SharedViewModelKeys","viewModel","setBulkActionViewModel","isSelectingWithSpreadsheet","setIsSelectingWithSpreadsheet","showSpinner","setShowSpinner","persistNamespace","initialState","userIdMap","extraActions","setWizardViewModel","actions","label","appLink","exportUserList","analyticsOptions","analyticsData","auditLog","LocalStorageHelper","onSelectWithSpreadsheetSelect","yearGroupRolloverStatus","yearGroups","canRollover","bulkActionsActionDetails","yearGroupRollover","tooltip","action","subAction","BulkUserActionsAnalyticsHelper","error","CannotYearGroupRolloverError","previousRolloverDate","useGetActions","clearOnExit","unsetAllUsersSelected","current","totalUsers","getSelectedCount","mainFilters","UserManagerHelper","customer","showFiltersPartialLoading","RosteringAlert","indeterminate","hasSomeSelections","SearchFilters","userManager","hideHeading","hideDivider","constantIndices","ScopedSearchBar","placeholder","searchAppLink","search","searchInputSize","searchIndices","ActionsDropdown","dropdownToggleClassName","success","userCount","fetchUserIds","allUsersSelected","BulkUserActionsHelper","getMap","bulkActionsReviewAccounts","config","hasSso","searchEmptyState","selectWithSpreadsheetTemplate","UserManagerEntries","totalShowing","PartialUserManagerEntries","UserManagerHeader","hasNumbers","headingComponent","Breadcrumbs","breadcrumbs","settings","active","placement","IconButton","ssoAddUserConfirm","addNewUsers","lang","localDate","text","this","supportUrl","linkClass","buttons","useFetchUserCount","getUserCountRequest","customerId","BaseBulkUserActionsViewModelKeys","getAnalyticsActionName","onClickNext","currentStep","step","actionName","actionData","ObjectHelper","logYearGroupRolloverEntry","getJobStatus","BatchJobStatus","PartialTagItem","tagClass","classNames","TagWidgetItem","colorClass","selectedItems","selection","tag","OnlineSupportArticle","LiteSupportArticle","collection","idField","initial","Map","items","forceUpdate","prevCollection","prevNamespace","clear","get","isBulkChecked","every","set","preselectedIds","setValue","nextItemState","getSelected","from","deselectAll","SelectWithSpreadsheetTemplates","useFetchUsers","queryParamsKeys","onlyPagination","onlyHasSort","getFetchRequest"],"sourceRoot":""}
@@ -1,3 +0,0 @@
1
- /*! For license information please see 8933-3d366deae2-lite.chunk.js.LICENSE.txt */
2
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[8933],{58859:(e,t,n)=>{n.d(t,{H:()=>le});var a=n(32735),r=n(92802),i=n(23481),l=n(75896),s=n(70226),o=n(98461),c=n(66122),u=n(12778),m=i.T.encloseNamespace("userManager.userEmailContactSupport");function d(e){var t=e.error.validationCode===s.x.Rostered;return a.createElement(c.A,{name:e.name},a.createElement("span",null,m(t?"rostering":"alreadyExists")," "),e.isInBulkEditing?a.createElement("span",null,m("contactSupport")):a.createElement(o.d,{className:"info-link",href:u.o.getSupportRequestUrl(),newTab:!0},m("contactSupport")),a.createElement("span",null," ",m("forAssistance")))}var f=i.T.encloseNamespace("userManager.editingUserExists");function p(e){return a.createElement(c.A,{name:e.name},a.createElement("span",null,f("alreadyExists")," "))}var v=n(15611),b=n(82644),h=n(76881),g=i.T.encloseNamespace("userManager.userExistsInSchool");function y(e){var t=(0,b.b)(),n=e.appLinks.studentManager.params||{};return e.error.user.userType===h.Y.Learner?a.createElement(c.A,{name:e.name},a.createElement("span",null,g("emailExistsSameSchoolStudent")," "),e.isInBulkEditing?a.createElement("span",null,g("studentManager")):a.createElement(v.F,{appLink:Object.assign(Object.assign({},e.appLinks.studentManager),{params:Object.assign(Object.assign({},n),{query:t.values.email})}),className:"info-link",onClick:e.onClickCancel},g("studentManager"))):a.createElement(c.A,{name:e.name},a.createElement("span",null,g("emailExistsSameSchoolStaff")," "),e.isInBulkEditing?a.createElement("span",null,g("staffManager")):a.createElement(v.F,{appLink:Object.assign(Object.assign({},e.appLinks.staffManager),{params:Object.assign(Object.assign({},n),{query:t.values.email})}),className:"info-link",onClick:e.onClickCancel},g("staffManager")))}var E=i.T.encloseNamespace("userManager.userTypeMismatch");function S(e){return e.error.user.userType===h.Y.Learner?a.createElement(c.A,{name:e.name},a.createElement("span",null,E("alreadyExistsStudent")," "),e.isInBulkEditing?a.createElement("span",null,E("studentManager")):a.createElement(v.F,{appLink:e.appLinks.studentManager,className:"info-link",onClick:e.onClickCancel},E("studentManager"))):a.createElement(c.A,{name:e.name},a.createElement("span",null,E("alreadyExistsStaff")," "),e.isInBulkEditing?a.createElement("span",null,E("staffManager")):a.createElement(v.F,{appLink:e.appLinks.staffManager,className:"info-link",onClick:e.onClickCancel},E("staffManager")))}function k(e){if(!e.isNew)return a.createElement(p,Object.assign({},e));switch(e.error.validationCode){case s.x.UserAlreadyExistsInCustomer:return a.createElement(y,Object.assign({},e));case s.x.UserTypeMismatch:return a.createElement(S,Object.assign({},e));case s.x.UserInCustomerWithOnline:case s.x.CustomerFoundInOnline:case s.x.InvalidUserStatus:case s.x.Rostered:return a.createElement(d,Object.assign({},e))}return a.createElement(a.Fragment,null)}var w=n(69843),C=n(80130),x=n(11607),N=n(29057),O=n(83523),T=n(36532),A=n(86613),j=n(64818);const I={checkWrapper:"OzB20"};var F=i.T.encloseNamespace("userManager.userRoleField");function R(e){var t=[{value:A.i.Admin,label:F("admin")},{value:A.i.SuperAdmin,label:"US"===e.countryCode?F("superAdminUs"):F("superAdmin")}],n=(0,r.u6)(),i=!e.hasOrg||!e.canEditSuperAdmin;if(e.userType===h.Y.Learner||e.isEditingCurrentUser)return null;var l=e.isDisabled||e.isValidatingEmail||j.l.hasNonLegacySso(e.user)&&!e.editSsoFields;return n.values.masterRole!==A.i.SuperAdmin||e.canEditSuperAdmin?i?a.createElement("div",{className:"d-flex justify-content-between align-items-center"},a.createElement(N.W,{id:"masterRole",name:"masterRole",disabled:l},function(){return a.createElement("div",{className:"d-flex align-items-center"},a.createElement(O.Z,{onClick:function(){return n.setFieldValue("masterRole",n.values.masterRole===A.i.User?A.i.Admin:A.i.User)},on:n.values.masterRole===A.i.Admin,disabled:l,showStateWhenDisabled:!0}),a.createElement("span",{className:"fw-semibold ms-2"},F("admin")))})):a.createElement("div",null,a.createElement(N.W,{id:"masterRole",name:"masterRole",disabled:l,label:"Role"},function(){return t.map(function(e){return a.createElement("div",{className:"".concat(I.checkWrapper," mb-2"),key:e.value},a.createElement(C.Z.Check,{className:"form-check",id:e.value,type:"radio",name:"masterRole",label:e.label,checked:n.values.masterRole===e.value,onChange:function(t){t.target.checked&&n.setFieldValue("masterRole",e.value)},disabled:l}))})}),(n.values.masterRole===A.i.Admin||n.values.masterRole===A.i.SuperAdmin)&&a.createElement(x.L,{className:"text-info mb-2 mt-n2",onClick:function(){return n.setFieldValue("masterRole",A.i.User)}},F("clear"))):a.createElement("div",{className:"mb-3"},a.createElement("label",null,F("role")),a.createElement(T.u,{title:F("superAdminTooltip"),spanHack:!0},a.createElement("div",{className:"border rounded-pill border-dark"},F("superAdmin"))))}var L=n(26055),P=n(43820),V=n(13876),U=n(40424);function G(){var e,t,n="function"==typeof Symbol?Symbol:{},a=n.iterator||"@@iterator",r=n.toStringTag||"@@toStringTag";function i(n,a,r,i){var o=a&&a.prototype instanceof s?a:s,c=Object.create(o.prototype);return z(c,"_invoke",function(n,a,r){var i,s,o,c=0,u=r||[],m=!1,d={p:0,n:0,v:e,a:f,f:f.bind(e,4),d:function(t,n){return i=t,s=0,o=e,d.n=n,l}};function f(n,a){for(s=n,o=a,t=0;!m&&c&&!r&&t<u.length;t++){var r,i=u[t],f=d.p,p=i[2];n>3?(r=p===a)&&(o=i[(s=i[4])?5:(s=3,3)],i[4]=i[5]=e):i[0]<=f&&((r=n<2&&f<i[1])?(s=0,d.v=a,d.n=i[1]):f<p&&(r=n<3||i[0]>a||a>p)&&(i[4]=n,i[5]=a,d.n=p,s=0))}if(r||n>1)return l;throw m=!0,a}return function(r,u,p){if(c>1)throw TypeError("Generator is already running");for(m&&1===u&&f(u,p),s=u,o=p;(t=s<2?e:o)||!m;){i||(s?s<3?(s>1&&(d.n=-1),f(s,o)):d.n=o:d.v=o);try{if(c=2,i){if(s||(r="next"),t=i[r]){if(!(t=t.call(i,o)))throw TypeError("iterator result is not an object");if(!t.done)return t;o=t.value,s<2&&(s=0)}else 1===s&&(t=i.return)&&t.call(i),s<2&&(o=TypeError("The iterator does not provide a '"+r+"' method"),s=1);i=e}else if((t=(m=d.n<0)?o:n.call(a,d))!==l)break}catch(t){i=e,s=1,o=t}finally{c=1}}return{value:t,done:m}}}(n,r,i),!0),c}var l={};function s(){}function o(){}function c(){}t=Object.getPrototypeOf;var u=[][a]?t(t([][a]())):(z(t={},a,function(){return this}),t),m=c.prototype=s.prototype=Object.create(u);function d(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,c):(e.__proto__=c,z(e,r,"GeneratorFunction")),e.prototype=Object.create(m),e}return o.prototype=c,z(m,"constructor",c),z(c,"constructor",o),o.displayName="GeneratorFunction",z(c,r,"GeneratorFunction"),z(m),z(m,r,"Generator"),z(m,a,function(){return this}),z(m,"toString",function(){return"[object Generator]"}),(G=function(){return{w:i,m:d}})()}function z(e,t,n,a){var r=Object.defineProperty;try{r({},"",{})}catch(e){r=0}z=function(e,t,n,a){if(t)r?r(e,t,{value:n,enumerable:!a,configurable:!a,writable:!a}):e[t]=n;else{var i=function(t,n){z(e,t,function(e){return this._invoke(t,n,e)})};i("next",0),i("throw",1),i("return",2)}},z(e,t,n,a)}function M(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,i,l,s=[],o=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;o=!1}else for(;!(o=(a=i.call(n)).done)&&(s.push(a.value),s.length!==t);o=!0);}catch(e){c=!0,r=e}finally{try{if(!o&&null!=n.return&&(l=n.return(),Object(l)!==l))return}finally{if(c)throw r}}return s}}(e,t)||function(e,t){if(e){if("string"==typeof e)return q(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?q(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 q(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var _=function(e,t,n,a){return new(n||(n=Promise))(function(r,i){function l(e){try{o(a.next(e))}catch(e){i(e)}}function s(e){try{o(a.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n(function(e){e(t)})).then(l,s)}o((a=a.apply(e,t||[])).next())})},W="userManager.userDetailsForm",B=i.T.encloseNamespace(W),Y=[s.x.UserAlreadyExistsInCustomer,s.x.CustomerFoundInOnline,s.x.UserInCustomerWithOnline,s.x.UserTypeMismatch,s.x.InvalidUserStatus,s.x.UserCanBeAddedInCustomer,s.x.Rostered],Z="firstName";function D(e){var t,n,o,c,u,m,d=e.onClickCancel,f=e.isNew,p=e.userType,v=e.yearGroups,g=e.submitText,y=e.currentUser,E=j.l.getValidYearGroups(v),S=M(a.useState(null),2),C=S[0],x=S[1],O=M(a.useState(!1),2),T=O[0],A=O[1],I=M(a.useState(!1),2),F=I[0],z=I[1],q=a.useRef({}),D=a.useContext(L.A),$=(0,b.b)();a.useEffect(function(){$.values.password&&$.values.email&&$.setFieldValue("password","")},[$.values.email,$.values.password]),a.useEffect(function(){if($.touched.email&&!T){var e=document.getElementById(Z);e&&e.focus()}},[T]);var H=(null===(t=e.user)||void 0===t?void 0:t.status)===U.w.Disabled,J=!e.isNew&&y.id.toString()===(null===(n=$.values.userId)||void 0===n?void 0:n.toString());return a.createElement(r.l0,null,a.createElement(N.W,{label:B("emailAddress"),type:"text",name:"email",id:"email",placeholder:B("emailAddressPlaceholder"),value:$.values.email,showRequiredStar:e.emailRequired,disabled:!e.canEditEmail||H,formSize:e.formSize,infoText:function(){if(D===P.a.Curator&&!e.isNew&&$.initialValues.email)return B(e.canEditEmail?"emailNotVerified":"cannotEditVerifiedEmail")}(),onBlur:function(t){return _(this,void 0,void 0,G().m(function n(){var a,r,i,o;return G().w(function(n){for(;;)switch(n.n){case 0:if((a=t.currentTarget.value)!==$.initialValues.email){n.n=1;break}return n.a(2);case 1:if($.setFieldTouched("email",!0),D===P.a.Primary&&e.validateEmail){n.n=2;break}return n.a(2);case 2:return n.n=3,$.validateForm();case 3:if(!n.v.email&&a){n.n=4;break}return C&&x(null),n.a(2);case 4:if(A(!0),n.p=5,r=q.current[a]){n.n=7;break}return i=l.m,n.n=6,e.validateEmail(a);case 6:o=n.v,r=i.first.call(i,o);case 7:if(q.current[a]=r,!e.isNew||r.validationCode!==s.x.UserCanBeAddedInCustomer){n.n=8;break}return e.onDetectValidUser(r.user),n.a(2);case 8:if(Y.includes(r.validationCode)){n.n=9;break}return C&&x(null),A(!1),n.a(2);case 9:x(r),A(!1),n.n=11;break;case 10:n.p=10,n.v,A(!1);case 11:return n.a(2)}},n,null,[[5,10]])}))},onChange:function(e){var t=e.currentTarget.value;$.setFieldValue("email",t),C&&x(null)},showLoadingSpinner:T,className:C?"is-invalid":"",autoFocus:!0}),!!C&&a.createElement("div",{className:"mt-n2 mb-2"},a.createElement(k,{name:"email",isNew:e.isNew,error:C,appLinks:e.appLinks,emailRequired:e.emailRequired,onClickCancel:e.onClickCancel,isInBulkEditing:e.isInBulkEditing})),a.createElement(N.W,{label:B("firstName"),type:"text",name:"firstName",id:Z,placeholder:B("firstNamePlaceholder"),value:$.values.firstName,showRequiredStar:!0,formSize:e.formSize,disabled:H||T||j.l.hasLegacySso(e.user)&&!F}),a.createElement(N.W,{label:B("lastName"),type:"text",name:"surname",id:"surname",placeholder:B("lastNamePlaceholder"),value:$.values.surname,showRequiredStar:!0,formSize:e.formSize,disabled:H||T||j.l.hasLegacySso(e.user)&&!F}),e.showDisplayNameField&&a.createElement(N.W,{label:B("displayName"),type:"text",name:"displayName",id:"displayName",placeholder:B("displayNamePlaceholder"),formSize:e.formSize,disabled:H||T,infoText:B("displayNameInfo")}),a.createElement(N.W,{label:B("username"),type:"text",name:"username",id:"username",placeholder:B("usernamePlaceholder"),value:$.values.username,infoTooltip:f?B("usernameInfo"):null,formSize:e.formSize,disabled:!f||H||T}),e.showPasswordField&&a.createElement(N.W,{label:B("password"),type:"password",name:"password",id:"password",placeholder:B("passwordPlaceholder"),value:$.values.password,disabled:!!$.values.email||T,infoTooltip:$.values.email?B("passwordDisabledInfo"):B("passwordGenerateInfo"),formSize:e.formSize}),p===h.Y.Learner&&a.createElement(N.W,{as:"select",label:B("yearGroup"),name:"masterYearGroup",value:null!==(c=null===(o=$.values.masterYearGroup)||void 0===o?void 0:o.id)&&void 0!==c?c:"",className:(null===(u=$.values.masterYearGroup)||void 0===u?void 0:u.id)?"":"text-secondary",showRequiredStar:!0,disabled:H||T||j.l.hasSso(e.user)&&!F&&0!==(null===(m=$.initialValues.masterYearGroup)||void 0===m?void 0:m.value),onChange:function(e){var t=e.target.value,n=v.find(function(e){return e.id.toString()===(null==t?void 0:t.toString())});n?$.setFieldValue("masterYearGroup",{id:n.id,name:n.name,description:n.description,value:n.value}):$.setFieldValue("masterYearGroup",null)}},a.createElement("option",{className:"text-secondary",value:""},i.T.getPhrase(W,"selectYearGroup")),E.map(function(e){return a.createElement("option",{key:e.id,value:e.id,className:"text-dark"},e.name)})),a.createElement("div",{className:"d-flex justify-content-between align-items-center"},a.createElement(R,{user:e.user,userType:p,countryCode:e.countryCode,isEditingCurrentUser:J,isDisabled:H,isValidatingEmail:T,editSsoFields:F,hasOrg:e.hasOrg,canEditSuperAdmin:e.canEditSuperAdmin}),function(e){return!(e.isNew||!e.showActions||!e.appLinks||!e.user||!e.onClickResendActivationEmail)}(e)&&a.createElement(w.c,{user:e.user,userType:p,appLinks:e.appLinks,onClickSendResetEmail:e.onClickSendResetEmail,onClickResendActivationEmail:e.onClickResendActivationEmail,onClickSendVerificationEmail:e.onClickSendVerificationEmail,currentUser:y,products:e.products,isEditUserForm:!0,hasUserCredit:e.hasUserCredit})),a.createElement(V.u,null,!!e.onToggleNextCheckbox&&a.createElement(V.u.Checkbox,{id:"edit-next-user",onToggle:e.onToggleNextCheckbox,label:e.goToNextText||B("goToNext"),checked:e.shouldGoToNext}),!!e.canEditSsoFields&&a.createElement(V.u.Toggle,{on:F,onClick:function(){return z(function(e){return!e})},label:B("editSsoFields"),disabled:!j.l.hasSso(e.user),tooltip:j.l.hasSso(e.user)?"":"This user doesn't sign in with SSO"}),a.createElement(V.u.Cancel,{onClick:d}),a.createElement(V.u.Submit,{isNew:f,text:g,variant:"dark",disabled:!!C||void 0})))}var $=n(39739),H=n(5173),J=/^(?![._])(?!.*[._]$)(?!.*?\.\.)(?!.*?__)[a-zA-Z0-9_.]+$/,K=/^[\w0-9'\-,.():;&][^_!¡?÷¿/\\+=@#$%ˆ*{}|~<>[\]]{0,}$/,Q=i.T.encloseNamespace("userManager.validation"),X=function(e){return(0,H.Z_)().max(255,function(){return Q("nameExceeds")}).required(function(){return Q("nameRequired")}).default("").test({name:"name-invalid",message:Q("nameInvalid"),test:function(t){return!(!(null==e?void 0:e.userId)||e.firstName!==t)||K.test(t)}})},ee=function(e){return(0,H.Z_)().max(255,function(){return Q("surnameExceeds")}).required(function(){return Q("surnameRequired")}).default("").test({name:"surname-invalid",message:Q("surnameInvalid"),test:function(t){return!(!(null==e?void 0:e.userId)||e.surname!==t)||K.test(t)}})},te=function(e,t){var n=(0,H.Z_)().max(255,function(){return Q("emailExceeds")}).email(function(){return Q("emailInvalidLong")}).default("");return e!==h.Y.Staff||(null==t?void 0:t.userId)&&!t.email||(n=n.required(function(){return Q("emailRequired")})),n},ne=function(e){var t=!(null==e?void 0:e.userId);return(0,H.Z_)().default("").test({name:"username-too-long",message:Q("usernameExceeds"),test:function(n){return!t&&e.username===n||n.length<=200}}).test({name:"username-too-short",message:Q("usernameTooShort"),test:function(n){return!t&&e.username===n||!(!t||n)||n.length>=5}}).test({name:"username-invalid",message:Q("usernameInvalidLong"),test:function(n){return!(!t||n)||!t&&e.username===n||J.test(n)}})},ae=function(e,t){var n=(0,H.Z_)().default("");return(null==t?void 0:t.userId)||(n=n.test({name:"password-short",message:Q("passwordTooShort",{minLength:e}),test:function(t){return!t||t.length>=e}})),n},re=function(e){if(e!==h.Y.Staff)return(0,H.Ry)().required(function(){return Q("yearGroupRequired")}).nullable()},ie=function(e,t,n){return(0,H.Ry)().shape({firstName:X(n),surname:ee(n),email:te(e,n),username:ne(n),password:ae(t,n),displayName:(0,H.Z_)().max(70,function(){return Q("displayNameExceeds")}).notRequired().nullable().default("").test({name:"display-name-short",message:Q("displayNameTooShort"),test:function(e){return!e||e.length>=2}}),masterYearGroup:re(e)})};function le(e){var t={};Object.keys(e.initialErrors||{}).forEach(function(e){t[e]=!0});var n,r,i=!e.initialValues.userId,l=!!i||!(null===(r=null===(n=e.user)||void 0===n?void 0:n.metadata)||void 0===r?void 0:r.isEmailVerified),s=$.P.getMinimumPasswordLength(e.passwordPolicy,e.userType,A.i.User),o=j.l.getValidYearGroups(e.yearGroups);return a.createElement("div",null,a.createElement(b.n,{initialValues:e.initialValues,initialErrors:e.initialErrors,initialTouched:t,onSubmit:e.onSubmit,validationSchema:ie(e.userType,s,e.initialValues)},a.createElement(D,{isNew:i,user:e.user,userType:e.userType,yearGroups:o,onClickCancel:e.onClickCancel,submitText:e.submitText,shouldGoToNext:e.shouldGoToNext,onToggleNextCheckbox:e.onToggleNextCheckbox,goToNextText:e.goToNextText,currentUser:e.currentUser,formSize:e.formSize,showPasswordField:e.showPasswordField,canEditEmail:l,showActions:e.showActions,appLinks:e.appLinks,onClickResendActivationEmail:e.onClickResendActivationEmail,onClickSendResetEmail:e.onClickSendResetEmail,onClickSendVerificationEmail:e.onClickSendVerificationEmail,emailRequired:e.emailRequired,showDisplayNameField:e.showDisplayNameField,canEditSsoFields:e.canEditSsoFields,validateEmail:e.validateEmail,onDetectValidUser:e.onDetectValidUser,isInBulkEditing:e.isInBulkEditing,products:e.products,hasUserCredit:e.hasUserCredit,hasOrg:e.hasOrg,countryCode:e.countryCode,canEditSuperAdmin:e.canEditSuperAdmin})))}},66122:(e,t,n)=>{n.d(t,{A:()=>r});var a=n(32735);function r(e){return a.createElement("span",{id:"".concat(e.name,"Error"),className:"".concat(e.className," invalid-feedback d-block"),role:"status"},e.children)}},29057:(e,t,n)=>{n.d(t,{n:()=>S,W:()=>k});var a=n(32735),r=n(80247),i=n(80130),l=n(92802),s=n(91967),o=n(1048),c=n(15611),u=function(e,t){var n={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&t.indexOf(a)<0&&(n[a]=e[a]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(a=Object.getOwnPropertySymbols(e);r<a.length;r++)t.indexOf(a[r])<0&&Object.prototype.propertyIsEnumerable.call(e,a[r])&&(n[a[r]]=e[a[r]])}return n};function m(e){var t=e.label,n=e.checkboxLabelClassName,r=e.checkboxLabelFontWeight,l=e.className,s=u(e,["label","checkboxLabelClassName","checkboxLabelFontWeight","className"]);return a.createElement(i.Z.Group,{className:"form-group"},a.createElement("div",{className:"form-check ".concat(l||"")},a.createElement(S,Object.assign({className:"form-check-input"},s)),a.createElement(i.Z.Label,{className:"form-check-label cursor-pointer ".concat("normal"===r?"fw-normal":""," \n ").concat(n),htmlFor:s.id},t),e.checkboxAppLink&&e.checkboxAppLinkText&&a.createElement(a.Fragment,null,a.createElement("span",null," "),a.createElement(c.F,{appLink:e.checkboxAppLink,className:"info-link"},e.checkboxAppLinkText))))}var d=n(83914),f=n(83345),p=n(73814),v=n(35223);function b(e){var t=(0,l.u6)().values,n=o.t.get(t,e.fieldName);return"string"!=typeof n?a.createElement(a.Fragment,null):a.createElement("div",{className:"float-end text-secondary fw-normal"},n.length,"/",e.limit," characters")}const h={revealPassword:"jCfI0",passwordInput:"RBJnf",passwordContainer:"d78lK",passwordContainerDisabled:"asbVo",infoTooltip:"wzyOG",spinner:"CycFx"};function g(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var y=function(e,t){var n={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&t.indexOf(a)<0&&(n[a]=e[a]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(a=Object.getOwnPropertySymbols(e);r<a.length;r++)t.indexOf(a[r])<0&&Object.prototype.propertyIsEnumerable.call(e,a[r])&&(n[a[r]]=e[a[r]])}return n},E="shared.formField";function S(e){var t,n,i=e.children,c=e.showLoadingSpinner,u=y(e,["children","showLoadingSpinner"]),m=(t=a.useState(e.type),n=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,i,l,s=[],o=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;o=!1}else for(;!(o=(a=i.call(n)).done)&&(s.push(a.value),s.length!==t);o=!0);}catch(e){c=!0,r=e}finally{try{if(!o&&null!=n.return&&(l=n.return(),Object(l)!==l))return}finally{if(c)throw r}}return s}}(t,n)||function(e,t){if(e){if("string"==typeof e)return g(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?g(e,t):void 0}}(t,n)||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.")}()),f=m[0],p=m[1],b=s.q.isFunction(i)?function(e){return i(e)}:a.Children.count(i)?i:null;if("password"!==u.type)return c?a.createElement("div",{className:"position-relative"},a.createElement(l.gN,Object.assign({},o.t.omit(u,["formSize"])),b),a.createElement("div",{className:h.spinner},a.createElement(r.Z,{animation:"border",size:"sm"}))):a.createElement(l.gN,Object.assign({},o.t.omit(u,["formSize"])),b);var E="position-relative ".concat(h.passwordContainer);return u.className&&(E+=" ".concat(u.className)),u.disabled&&(E+=" ".concat(h.passwordContainerDisabled)),a.createElement("div",{className:E},a.createElement(l.gN,Object.assign({},o.t.omit(u,["formSize","type","className"]),{type:f,className:"".concat(h.passwordInput," border-0 w-100 h-100 outline-none rounded")}),b),"password"===u.type&&a.createElement(d.x,{svgName:"password"===f?v.vn.VisibleOn:v.vn.VisibleOff,className:"svg-container cursor-pointer ".concat(h.revealPassword),onClick:function(){p("password"===f?"text":"password")}}))}function k(e){var t=e.label,n=e.className,r=e.showCharacterCounter,s=e.showRequiredStar,c=e.infoTooltip,u=e.infoTooltipPlacement,g=e.infoText,k=e.formSize,w=e.showOptionalLabel,C=e.formGroupClassname,x=e.labelClassName,N=y(e,["label","className","showCharacterCounter","showRequiredStar","infoTooltip","infoTooltipPlacement","infoText","formSize","showOptionalLabel","formGroupClassname","labelClassName"]),O=(0,l.u6)(),T=O.errors,A=O.touched,j=function(){};if("checkbox"===N.type){var I=o.t.omit(e,["formSize","infoTooltipPlacement"]);return e.disabled&&(I.onChange=j),a.createElement(m,Object.assign({},I))}var F=Object.assign(Object.assign({},N),{className:p.w.getCustomFormControlClassName(T,A,N.name,k,n,"string"==typeof e.as?e.as:null)});return e.disabled&&(F.onChange=j),a.createElement(i.Z.Group,{className:"form-group ".concat(C)},!!t&&a.createElement(i.Z.Label,{htmlFor:N.id,className:"d-flex align-items-center ".concat(x)},t,s&&a.createElement("span",{className:"text-danger"},"*"),c&&a.createElement(d.x,{className:"svg-container text-secondary ".concat(h.infoTooltip),svgName:v.vn.Info,title:c,tooltipPlacement:u,tooltipSpanHack:!0}),w&&a.createElement("span",{className:"text-secondary"}," ",a.createElement(f.x,{namespace:E,phrase:"optional"})),!!r&&!!N.maxLength&&a.createElement("div",{className:"ms-auto"},a.createElement(b,{fieldName:N.name,limit:N.maxLength}))),e.description&&a.createElement("p",null,e.description),a.createElement(S,Object.assign({},F,{"aria-errormessage":"".concat(N.name,"Error")})),!!g&&a.createElement(i.Z.Text,{className:"text-secondary"},g),a.createElement(l.Bc,{name:N.name},function(e){return a.createElement(i.Z.Control.Feedback,{id:"".concat(N.name,"Error"),type:"invalid",role:"status"},e)}))}S.defaultProps={autoComplete:"off"},k.defaultProps={autoComplete:"off",infoTooltipPlacement:"top"}},82644:(e,t,n)=>{n.d(t,{b:()=>m,n:()=>u});var a=n(32735),r=n(92802),i=n(91967),l=n(1048);function s(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,i,l,s=[],o=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;o=!1}else for(;!(o=(a=i.call(n)).done)&&(s.push(a.value),s.length!==t);o=!0);}catch(e){c=!0,r=e}finally{try{if(!o&&null!=n.return&&(l=n.return(),Object(l)!==l))return}finally{if(c)throw r}}return s}}(e,t)||function(e,t){if(e){if("string"==typeof e)return o(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?o(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 o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var c=function(e,t){var n={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&t.indexOf(a)<0&&(n[a]=e[a]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(a=Object.getOwnPropertySymbols(e);r<a.length;r++)t.indexOf(a[r])<0&&Object.prototype.propertyIsEnumerable.call(e,a[r])&&(n[a[r]]=e[a[r]])}return n};function u(e){var t=e.castInitialValues,n=e.castValuesOnSubmit,o=e.initialValues,u=e.onSubmit,m=c(e,["castInitialValues","castValuesOnSubmit","initialValues","onSubmit"]),d=t&&e.validationSchema?e.validationSchema.cast(function(e){if(!e)return{};var t=l.t.deepClone(e);return function e(n){Object.keys(t).forEach(function(a){t.hasOwnProperty(a)&&(l.t.isObject(n[a])?e(n[a]):null===t[a]&&delete t[a])})}(t),t}(o)):o,f={allowInitialSubmit:e.allowInitialSubmit};return a.createElement(r.J9,Object.assign({enableReinitialize:!0},m,{initialValues:d,onSubmit:function(t,a){var r=a.setSubmitting,i=a.resetForm,l=a.setFieldError,o=n&&e.validationSchema?e.validationSchema.cast(t):t;u(o,function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(e.reset&&i(),e.errors)for(var t=0,n=Object.entries(e.errors);t<n.length;t++){var a=s(n[t],2),o=a[0],c=a[1];l(o,c)}r(!1)})},initialStatus:f}),i.q.isFunction(e.children)?function(t){return e.children(t)}:a.Children.count(e.children)?e.children:null)}function m(){return(0,r.u6)()}u.defaultProps={castInitialValues:!0,castValuesOnSubmit:!0}},73814:(e,t,n)=>{n.d(t,{w:()=>r});var a=n(92802),r={getCustomFormControlClassName:function(e,t,n,r,i,l){var s="";return s=function(e,t){var n="";return n="select"===e?"form-select":"form-control","sm"===t&&(n+=" ".concat(n,"-sm")),"lg"===t&&(n+=" ".concat(n,"-lg")),n}(l,r),(0,a.u9)(t,n)&&(0,a.u9)(e,n)&&(s+=" is-invalid"),i&&(s+=" ".concat(i)),s}}},80658:(e,t,n)=>{n.d(t,{F:()=>r});var a=n(99940),r={getCustomerSecuritySettings:function(e,t,n){return{url:"{gateway}/v1/customers/".concat(e,"/settings/security"),key:"customers:security:settings",normalize:!1,success:t,error:n}},setCustomerSecuritySettings:function(e,t,n,r){return{url:"{gateway}/v1/customers/".concat(e,"/settings/security"),key:"update:security:settings",invalidationKeys:"customers:security:settings",type:a.k.PUT,normalize:!1,data:t,success:n,error:r}}}}}]);
3
- //# sourceMappingURL=8933-3d366deae2-lite.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/8933-3d366deae2-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/user-manager/components/user-details-form/email-error-messages/contact-support/UserEmailContactSupportMessage.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-details-form/email-error-messages/editing-user-exists/EditingUserExistsErrorMessage.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-details-form/email-error-messages/exists-in-school/UserExistsInSchoolErrorMessage.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-details-form/email-error-messages/user-type-mismatch/UserTypeMismatchErrorMessage.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-details-form/UserEmailExistsError.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-role/user-role-field.scss","file:///app/packages/libs/shared/src/apps/user-manager/components/user-role/UserRoleField.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-details-form/UserDetailsForm.tsx","file:///app/packages/libs/shared/src/apps/user-manager/validation/UserValidationHelper.ts","file:///app/packages/libs/shared/src/apps/user-manager/validation/UserValidationSchema.ts","file:///app/packages/libs/shared/src/apps/user-manager/components/edit-user-details/EditUserDetails.tsx","file:///app/packages/libs/shared/src/components/forms/form-feedback/FormFeedback.tsx","file:///app/packages/libs/shared/src/components/forms/form-checkbox/FormCheckbox.tsx","file:///app/packages/libs/shared/src/components/forms/form-field/CharacterCounter.tsx","file:///app/packages/libs/shared/src/components/forms/form-field/form-field.scss","file:///app/packages/libs/shared/src/components/forms/form-field/FormField.tsx","file:///app/packages/libs/shared/src/components/forms/form-wrapper/FormWrapper.tsx","file:///app/packages/libs/shared/src/utils/FormHelper.ts","file:///app/packages/projects/lite/src/apps/settings/flight-requests/SecuritySettingsRequests.ts"],"sourcesContent":["import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { UserEmailExistsErrorProps } from 'libs/shared/apps/user-manager/components/user-details-form/UserEmailExistsError';\nimport { UserValidationCode } from 'libs/shared/apps/user-manager/enums/UserValidationCode';\nimport { ExternalLink } from 'libs/shared/components/external-link/ExternalLink';\nimport { FormFeedback } from 'libs/shared/components/forms/form-feedback/FormFeedback';\nimport { ArticleHelper } from 'libs/shared/utils/ArticleHelper';\n\nconst namespace = 'userManager.userEmailContactSupport';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function UserEmailContactSupportMessage(props: UserEmailExistsErrorProps): JSX.Element {\n const isRostered = props.error.validationCode === UserValidationCode.Rostered;\n\n return (\n <FormFeedback name={props.name}>\n <span>\n {getPhrase(isRostered ? 'rostering' : 'alreadyExists')}&nbsp;\n </span>\n\n\n {!props.isInBulkEditing ? (\n <ExternalLink className='info-link' href={ArticleHelper.getSupportRequestUrl()} newTab>\n {getPhrase('contactSupport')}\n </ExternalLink>\n ) : (\n <span>{getPhrase('contactSupport')}</span>\n )}\n\n <span>\n &nbsp;{getPhrase('forAssistance')}\n </span>\n </FormFeedback>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { UserEmailExistsErrorProps } from 'libs/shared/apps/user-manager/components/user-details-form/UserEmailExistsError';\nimport { FormFeedback } from 'libs/shared/components/forms/form-feedback/FormFeedback';\n\nconst namespace = 'userManager.editingUserExists';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function EditingUserExistsErrorMessage(props: UserEmailExistsErrorProps): JSX.Element {\n return (\n <FormFeedback name={props.name}>\n <span>\n {getPhrase('alreadyExists')}&nbsp;\n </span>\n </FormFeedback>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { UserEmailExistsErrorProps } from 'libs/shared/apps/user-manager/components/user-details-form/UserEmailExistsError';\nimport { EditUserRequest } from 'libs/shared/apps/user-manager/interfaces';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { FormFeedback } from 'libs/shared/components/forms/form-feedback/FormFeedback';\nimport { useFormikContextWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\n\nconst namespace = 'userManager.userExistsInSchool';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function UserExistsInSchoolErrorMessage(props: UserEmailExistsErrorProps): JSX.Element {\n const formikProps = useFormikContextWrapper<EditUserRequest>();\n\n const appLinkParams = (props.appLinks.studentManager.params || {}) as HashObject;\n\n /**\n * If the existing user is a student\n */\n if (props.error.user.userType === UserGroup.Learner) {\n return (\n <FormFeedback name={props.name}>\n <span>{getPhrase('emailExistsSameSchoolStudent')}&nbsp;</span>\n {!props.isInBulkEditing ? (\n <AppLink\n appLink={{\n ...props.appLinks.studentManager,\n params: {\n ...appLinkParams,\n query: formikProps.values.email\n }\n }}\n className={'info-link'}\n onClick={props.onClickCancel}\n >\n {getPhrase('studentManager')}\n </AppLink>\n ) : (\n <span>{getPhrase('studentManager')}</span>\n )}\n </FormFeedback>\n );\n }\n\n return (\n <FormFeedback name={props.name}>\n <span>{getPhrase('emailExistsSameSchoolStaff')}&nbsp;</span>\n {!props.isInBulkEditing ? (\n <AppLink\n appLink={{\n ...props.appLinks.staffManager,\n params: {\n ...appLinkParams,\n query: formikProps.values.email\n }\n }}\n className={'info-link'}\n onClick={props.onClickCancel}\n >\n {getPhrase('staffManager')}\n </AppLink>\n ) : (\n <span>{getPhrase('staffManager')}</span>\n )}\n </FormFeedback>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { UserEmailExistsErrorProps } from 'libs/shared/apps/user-manager/components/user-details-form/UserEmailExistsError';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { FormFeedback } from 'libs/shared/components/forms/form-feedback/FormFeedback';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\n\nconst namespace = 'userManager.userTypeMismatch';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function UserTypeMismatchErrorMessage(props: UserEmailExistsErrorProps): JSX.Element {\n if (props.error.user.userType === UserGroup.Learner) {\n return (\n <FormFeedback name={props.name}>\n <span>\n {getPhrase('alreadyExistsStudent')}&nbsp;\n </span>\n {!props.isInBulkEditing ? (\n <AppLink\n appLink={props.appLinks.studentManager}\n className='info-link'\n onClick={props.onClickCancel}\n >\n {getPhrase('studentManager')}\n </AppLink>\n ) : (\n <span>{getPhrase('studentManager')}</span>\n )}\n </FormFeedback>\n );\n }\n\n return (\n <FormFeedback name={props.name}>\n <span>\n {getPhrase('alreadyExistsStaff')}&nbsp;\n </span>\n {!props.isInBulkEditing ? (<AppLink\n appLink={props.appLinks.staffManager}\n className='info-link'\n onClick={props.onClickCancel}\n >\n {getPhrase('staffManager')}\n </AppLink>\n ) : (\n <span>{getPhrase('staffManager')}</span>\n )}\n </FormFeedback>\n );\n}","import React from 'react';\n\nimport { UserEmailContactSupportMessage } from 'libs/shared/apps/user-manager/components/user-details-form/email-error-messages/contact-support/UserEmailContactSupportMessage';\nimport { EditingUserExistsErrorMessage } from 'libs/shared/apps/user-manager/components/user-details-form/email-error-messages/editing-user-exists/EditingUserExistsErrorMessage';\nimport { UserExistsInSchoolErrorMessage } from 'libs/shared/apps/user-manager/components/user-details-form/email-error-messages/exists-in-school/UserExistsInSchoolErrorMessage';\nimport { UserTypeMismatchErrorMessage } from 'libs/shared/apps/user-manager/components/user-details-form/email-error-messages/user-type-mismatch/UserTypeMismatchErrorMessage';\nimport { UserValidationCode } from 'libs/shared/apps/user-manager/enums/UserValidationCode';\nimport { UserEmailCheckResponse, UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\n\nexport interface UserEmailExistsErrorProps {\n isNew: boolean;\n error: UserEmailCheckResponse;\n name: string;\n appLinks: UserManagerAppLinks;\n emailRequired: boolean;\n onClickCancel: () => void;\n isInBulkEditing?: boolean;\n}\n\nexport function UserEmailExistsError(props: UserEmailExistsErrorProps): JSX.Element {\n // When editing a user, if the email is already taken, we just display a generic error message\n if (!props.isNew) {\n return <EditingUserExistsErrorMessage {...props} />;\n }\n\n switch (props.error.validationCode) {\n // This means the user exists already in the current school\n case UserValidationCode.UserAlreadyExistsInCustomer:\n return <UserExistsInSchoolErrorMessage {...props} />;\n\n // This means the user exists in another school, but the user type is dfiferent\n case UserValidationCode.UserTypeMismatch:\n return <UserTypeMismatchErrorMessage {...props} />;\n \n // This means the user is in an Online school, and cannot be invited\n case UserValidationCode.UserInCustomerWithOnline:\n // This means the user is in multiple schools, and one of them has online, so they cannot be invited\n case UserValidationCode.CustomerFoundInOnline:\n // This means the user is disabled\n case UserValidationCode.InvalidUserStatus:\n // This means the user is crated by rostering\n case UserValidationCode.Rostered:\n return <UserEmailContactSupportMessage {...props}/>;\n }\n\n return <></>;\n}","// extracted by mini-css-extract-plugin\nexport default {\"checkWrapper\":\"OzB20\"};","import React from 'react';\nimport { Form } from 'react-bootstrap';\nimport { useFormikContext } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EditUserRequest } from 'libs/shared/apps/user-manager/interfaces/EditUserRequest';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { FormField } from 'libs/shared/components/forms/form-field/FormField';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { User } from 'libs/shared/interfaces/models/User';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from './user-role-field.scss';\n\nconst namespace = 'userManager.userRoleField';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface UserRoleProps {\n user: User;\n userType: UserGroup;\n isEditingCurrentUser: boolean;\n isDisabled: boolean;\n isValidatingEmail: boolean;\n editSsoFields: boolean;\n hasOrg: boolean;\n countryCode: string;\n canEditSuperAdmin: boolean;\n}\n\nexport function UserRoleField(props: UserRoleProps) {\n const ROLE_OPTIONS = [\n { value: UserRole.Admin, label: getPhrase('admin') },\n { value: UserRole.SuperAdmin, label: props.countryCode === 'US' ? getPhrase('superAdminUs') : getPhrase('superAdmin') }\n ];\n\n const formikProps = useFormikContext<EditUserRequest>();\n // for customer don't have org OR the current user cannot edit super admin role,\n const showAdminToggle = !props.hasOrg || !props.canEditSuperAdmin;\n\n if (props.userType === UserGroup.Learner || props.isEditingCurrentUser) {\n return null;\n }\n\n const isDisabled = props.isDisabled\n || props.isValidatingEmail\n || (UserHelper.hasNonLegacySso(props.user) && !props.editSsoFields);\n\n const showReadOnlySuperAdmin = formikProps.values.masterRole === UserRole.SuperAdmin\n && !props.canEditSuperAdmin;\n\n if (showReadOnlySuperAdmin) {\n return (\n <div className='mb-3'>\n <label>{getPhrase('role')}</label>\n <Tooltip title={getPhrase('superAdminTooltip')} spanHack>\n <div className='border rounded-pill border-dark'>{getPhrase('superAdmin')}</div>\n </Tooltip>\n </div>\n );\n }\n\n if (showAdminToggle) {\n return (\n <div className='d-flex justify-content-between align-items-center'>\n <FormField\n id='masterRole'\n name='masterRole'\n disabled={isDisabled}\n >\n {() => (\n <div className='d-flex align-items-center'>\n <ToggleSwitch\n onClick={() => formikProps.setFieldValue(\n 'masterRole',\n formikProps.values.masterRole === UserRole.User ? UserRole.Admin : UserRole.User\n )}\n on={formikProps.values.masterRole === UserRole.Admin}\n disabled={isDisabled}\n showStateWhenDisabled\n />\n <span className='fw-semibold ms-2'>{getPhrase('admin')}</span>\n </div>\n )}\n </FormField>\n </div>\n );\n }\n\n return (\n <div>\n <FormField\n id='masterRole'\n name='masterRole'\n disabled={isDisabled}\n label='Role'\n >\n {() => ROLE_OPTIONS.map(option => (\n <div className={`${styles.checkWrapper} mb-2`} key={option.value}>\n <Form.Check\n className='form-check'\n id={option.value}\n type='radio'\n name='masterRole'\n label={option.label}\n checked={formikProps.values.masterRole === option.value}\n onChange={e => {\n if (e.target.checked) {\n formikProps.setFieldValue('masterRole', option.value);\n }\n }}\n disabled={isDisabled}\n />\n </div>\n ))}\n </FormField>\n {(formikProps.values.masterRole === UserRole.Admin || formikProps.values.masterRole === UserRole.SuperAdmin) && (\n <DivButton\n className='text-info mb-2 mt-n2'\n onClick={() => formikProps.setFieldValue('masterRole', UserRole.User)}\n >\n {getPhrase('clear')}\n </DivButton>\n )}\n </div>\n );\n}","import React from 'react';\nimport { Form } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { UserEmailExistsError } from 'libs/shared/apps/user-manager/components/user-details-form/UserEmailExistsError';\nimport { UserItemActions } from 'libs/shared/apps/user-manager/components/user-list-items/components/UserItemActions';\nimport { UserRoleField } from 'libs/shared/apps/user-manager/components/user-role/UserRoleField';\nimport { UserManagerClientContext } from 'libs/shared/apps/user-manager/context/UserManagerClientContext';\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\nimport { UserValidationCode } from 'libs/shared/apps/user-manager/enums/UserValidationCode';\nimport { BulkUserEmailCheckResponse, EditUserRequest, UserEmailCheckResponse, UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { FormField, FormSize } from 'libs/shared/components/forms/form-field/FormField';\nimport { useFormikContextWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { ObjectStatus } from 'libs/shared/enums/ObjectStatus';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { CurrentUser, User, YearGroup } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nconst namespace = 'userManager.userDetailsForm';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst EMAIL_ERROR_CODES = [\n UserValidationCode.UserAlreadyExistsInCustomer,\n UserValidationCode.CustomerFoundInOnline,\n UserValidationCode.UserInCustomerWithOnline,\n UserValidationCode.UserTypeMismatch,\n UserValidationCode.InvalidUserStatus,\n UserValidationCode.UserCanBeAddedInCustomer,\n UserValidationCode.Rostered\n];\n\nconst FIRST_NAME_FIELD_ID = 'firstName';\n\nfunction shouldShowActions(props: UserDetailsFormProps): boolean {\n return !props.isNew\n && !!props.showActions\n && !!props.appLinks\n && !!props.user\n && !!props.onClickResendActivationEmail;\n}\n\ninterface UserDetailsFormProps {\n user?: User;\n onClickCancel: () => void;\n userType: UserGroup;\n countryCode?: string;\n yearGroups: YearGroup[];\n products?: ProductId[];\n isNew?: boolean;\n submitText?: string;\n currentUser: CurrentUser;\n formSize?: FormSize;\n canEditEmail?: boolean;\n emailRequired: boolean;\n showPasswordField?: boolean;\n showDisplayNameField?: boolean;\n canEditSsoFields?: boolean;\n isInBulkEditing?: boolean;\n hasUserCredit?: boolean;\n hasOrg: boolean;\n canEditSuperAdmin: boolean;\n\n shouldGoToNext?: boolean;\n onToggleNextCheckbox?: () => void;\n goToNextText?: string;\n\n // All of the below props are required for the actions to be shown\n showActions?: boolean;\n appLinks?: UserManagerAppLinks;\n onClickResendActivationEmail?: (user: User) => void;\n onClickSendResetEmail?: (user: User) => void;\n onClickSendVerificationEmail?: (user: User) => void;\n validateEmail?: (email: string) => Promise<BulkUserEmailCheckResponse>;\n onDetectValidUser?: (detectedUser: UserEmailCheckResponse['user']) => void;\n}\n\nexport function UserDetailsForm(props: UserDetailsFormProps): React.ReactElement {\n const { onClickCancel, isNew, userType, yearGroups, submitText, currentUser } = props;\n\n const validYearGroups = UserHelper.getValidYearGroups(yearGroups);\n\n const [ emailError, setEmailError ] = React.useState<UserEmailCheckResponse>(null);\n const [ isValidatingEmail, setIsValidatingEmail ] = React.useState(false);\n\n const [ editSsoFields, setEditSsoFields ] = React.useState(false);\n\n const emailValidationCache = React.useRef<Record<string, UserEmailCheckResponse>>({});\n\n const client = React.useContext(UserManagerClientContext);\n const formikProps = useFormikContextWrapper<EditUserRequest>();\n\n React.useEffect(() => {\n if (formikProps.values.password && formikProps.values.email)\n formikProps.setFieldValue('password', '');\n }, [ formikProps.values.email, formikProps.values.password ]);\n\n function getEmailFieldInfoText(): string {\n /**\n * Return message to explain that the email address is either unverified (and hence can be edited)\n * or that it is verified and can't be edited.\n * \n * Only show this when:\n * 1. The user is being edited in Curator\n * 2. The user has an existing email address\n */\n if (client === UserManagerClient.Curator && !props.isNew && !!formikProps.initialValues.email)\n return getPhrase(props.canEditEmail ? 'emailNotVerified' : 'cannotEditVerifiedEmail');\n }\n\n async function onBlurEmail(e: React.FormEvent<HTMLInputElement>): Promise<void> {\n const email = e.currentTarget.value;\n\n /**\n * Email has not been changed. No need to validate it.\n */\n if (email === formikProps.initialValues.email)\n return;\n\n formikProps.setFieldTouched('email', true);\n\n if (client !== UserManagerClient.Primary || !props.validateEmail)\n return;\n\n const formErrors = await formikProps.validateForm();\n\n if (formErrors.email || !email) {\n if (emailError)\n setEmailError(null);\n\n return;\n }\n\n setIsValidatingEmail(true);\n\n try {\n let emailValidation = emailValidationCache.current[email];\n\n if (!emailValidation)\n emailValidation = ArrayHelper.first(await props.validateEmail(email));\n\n emailValidationCache.current[email] = emailValidation;\n\n if (props.isNew && emailValidation.validationCode === UserValidationCode.UserCanBeAddedInCustomer) {\n props.onDetectValidUser(emailValidation.user);\n return;\n }\n \n if (!EMAIL_ERROR_CODES.includes(emailValidation.validationCode)) {\n if (emailError)\n setEmailError(null);\n\n setIsValidatingEmail(false);\n \n return;\n }\n \n setEmailError(emailValidation);\n setIsValidatingEmail(false);\n } catch {\n setIsValidatingEmail(false);\n }\n }\n\n /**\n * This addresses a UX issue where if you enter an email, then\n * that email is validated, all inputs are unfocused as all fields are\n * set to \"disabled\". Once validation completed, the first name\n * input should be focused\n */\n React.useEffect(() => {\n if (!formikProps.touched.email || isValidatingEmail)\n return;\n\n const firstNameEl = document.getElementById(FIRST_NAME_FIELD_ID);\n\n if (!firstNameEl)\n return;\n\n firstNameEl.focus();\n }, [isValidatingEmail]);\n\n function onChangeEmail(e: React.FormEvent<HTMLInputElement>): void {\n const email = e.currentTarget.value;\n\n formikProps.setFieldValue('email', email);\n\n if (emailError)\n setEmailError(null);\n }\n\n const isDisabled = props.user?.status === ObjectStatus.Disabled;\n const isEditingCurrentUser = !props.isNew && (currentUser.id.toString() === formikProps.values.userId?.toString());\n\n return (\n <Form>\n <FormField\n label={getPhrase('emailAddress')}\n type='text'\n name='email'\n id='email'\n placeholder={getPhrase('emailAddressPlaceholder')}\n value={formikProps.values.email}\n showRequiredStar={props.emailRequired}\n disabled={!props.canEditEmail || isDisabled}\n formSize={props.formSize}\n infoText={getEmailFieldInfoText()}\n onBlur={onBlurEmail}\n onChange={onChangeEmail}\n showLoadingSpinner={isValidatingEmail}\n className={emailError ? 'is-invalid' : ''}\n autoFocus\n />\n {!!emailError && (\n <div className='mt-n2 mb-2'>\n <UserEmailExistsError\n name='email'\n isNew={props.isNew}\n error={emailError}\n appLinks={props.appLinks}\n emailRequired={props.emailRequired}\n onClickCancel={props.onClickCancel}\n isInBulkEditing={props.isInBulkEditing}\n />\n </div>\n )}\n\n <FormField\n label={getPhrase('firstName')}\n type='text'\n name='firstName'\n id={FIRST_NAME_FIELD_ID}\n placeholder={getPhrase('firstNamePlaceholder')}\n value={formikProps.values.firstName}\n showRequiredStar\n formSize={props.formSize}\n disabled={isDisabled || isValidatingEmail || (UserHelper.hasLegacySso(props.user) && !editSsoFields)}\n />\n\n <FormField\n label={getPhrase('lastName')}\n type='text'\n name='surname'\n id='surname'\n placeholder={getPhrase('lastNamePlaceholder')}\n value={formikProps.values.surname}\n showRequiredStar\n formSize={props.formSize}\n disabled={isDisabled || isValidatingEmail || (UserHelper.hasLegacySso(props.user) && !editSsoFields)}\n />\n\n {props.showDisplayNameField && (\n <FormField\n label={getPhrase('displayName')}\n type='text'\n name='displayName'\n id='displayName'\n placeholder={getPhrase('displayNamePlaceholder')}\n formSize={props.formSize}\n disabled={isDisabled || isValidatingEmail}\n infoText={getPhrase('displayNameInfo')}\n />\n )}\n\n <FormField\n label={getPhrase('username')}\n type='text'\n name='username'\n id='username'\n placeholder={getPhrase('usernamePlaceholder')}\n value={formikProps.values.username}\n infoTooltip={isNew ? getPhrase('usernameInfo') : null}\n formSize={props.formSize}\n disabled={!isNew || isDisabled || isValidatingEmail}\n />\n\n {/* Only primary students can have a custom password. Other users must set their own during activation */}\n {props.showPasswordField && (\n <FormField\n label={getPhrase('password')}\n type='password'\n name='password'\n id='password'\n placeholder={getPhrase('passwordPlaceholder')}\n value={formikProps.values.password}\n disabled={!!formikProps.values.email || isValidatingEmail}\n infoTooltip={formikProps.values.email ? getPhrase('passwordDisabledInfo') : getPhrase('passwordGenerateInfo')}\n formSize={props.formSize}\n />\n )}\n\n {userType === UserGroup.Learner && (\n <FormField\n as='select'\n label={getPhrase('yearGroup')}\n name='masterYearGroup'\n value={formikProps.values.masterYearGroup?.id ?? ''}\n className={!formikProps.values.masterYearGroup?.id ? 'text-secondary' : ''}\n showRequiredStar\n disabled={\n isDisabled ||\n isValidatingEmail ||\n // For SSO users, we only allow setting the year group if they have the \"Unknown\" year group. I.e. value is 0\n (UserHelper.hasSso(props.user) && !editSsoFields && formikProps.initialValues.masterYearGroup?.value !== 0)\n }\n onChange={(e: any) => {\n const yearGroupId = e.target.value;\n const yearGroup = yearGroups.find(y => y.id.toString() === yearGroupId?.toString());\n\n if (!yearGroup) {\n formikProps.setFieldValue('masterYearGroup', null);\n return;\n }\n\n formikProps.setFieldValue('masterYearGroup', {\n id: yearGroup.id,\n name: yearGroup.name,\n description: yearGroup.description,\n value: yearGroup.value\n });\n }}\n >\n <option className='text-secondary' value=''>{LanguageService.getPhrase(namespace, 'selectYearGroup')}</option>\n {validYearGroups.map(yearGroup =>\n <option key={yearGroup.id} value={yearGroup.id} className='text-dark'>{yearGroup.name}</option>)}\n </FormField>\n )}\n\n <div className='d-flex justify-content-between align-items-center'>\n <UserRoleField\n user={props.user}\n userType={userType}\n countryCode={props.countryCode}\n isEditingCurrentUser={isEditingCurrentUser}\n isDisabled={isDisabled}\n isValidatingEmail={isValidatingEmail}\n editSsoFields={editSsoFields}\n hasOrg={props.hasOrg}\n canEditSuperAdmin={props.canEditSuperAdmin}\n />\n\n {shouldShowActions(props) && (\n <UserItemActions\n user={props.user}\n userType={userType}\n appLinks={props.appLinks}\n onClickSendResetEmail={props.onClickSendResetEmail}\n onClickResendActivationEmail={props.onClickResendActivationEmail}\n onClickSendVerificationEmail={props.onClickSendVerificationEmail}\n currentUser={currentUser}\n products={props.products}\n isEditUserForm\n hasUserCredit={props.hasUserCredit}\n />\n )}\n </div>\n\n <PopupButtons>\n {!!props.onToggleNextCheckbox && (\n <PopupButtons.Checkbox\n id='edit-next-user'\n onToggle={props.onToggleNextCheckbox}\n label={props.goToNextText || getPhrase('goToNext')}\n checked={props.shouldGoToNext}\n />\n )}\n\n {!!props.canEditSsoFields && (\n <PopupButtons.Toggle\n on={editSsoFields}\n onClick={() => setEditSsoFields(v => !v)}\n label={getPhrase('editSsoFields')}\n disabled={!UserHelper.hasSso(props.user)}\n tooltip={!UserHelper.hasSso(props.user) ? 'This user doesn\\'t sign in with SSO' : ''}\n />\n )}\n\n <PopupButtons.Cancel onClick={onClickCancel} />\n <PopupButtons.Submit\n isNew={isNew}\n text={submitText}\n variant='dark'\n disabled={emailError ? true : undefined}\n />\n </PopupButtons>\n </Form>\n );\n}\n","import { object, string } from 'yup';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\n\nimport { EditUserRequest } from '../interfaces';\n\n/**\n * Regex's here are copied directly from User API. These are used to do the same validation on the backend.\n */\nconst USERNAME_REGEX = /^(?![._])(?!.*[._]$)(?!.*?\\.\\.)(?!.*?__)[a-zA-Z0-9_.]+$/;\nconst NAME_REGEX = /^[\\w0-9'\\-,.():;&][^_!¡?÷¿/\\\\+=@#$%ˆ*{}|~<>[\\]]{0,}$/;\n\nconst getPhrase = LanguageService.encloseNamespace('userManager.validation');\n\nexport const UserValidationHelper = {\n getFirstNameSchema: (existingUser?: EditUserRequest) => {\n return string()\n .max(255, () => getPhrase('nameExceeds'))\n .required(() => getPhrase('nameRequired'))\n .default('')\n .test({\n name: 'name-invalid',\n message: getPhrase('nameInvalid'),\n test: (val: string) => {\n if (existingUser?.userId && existingUser.firstName === val)\n return true;\n\n return NAME_REGEX.test(val);\n }\n });\n },\n\n getSurnameSchema: (existingUser?: EditUserRequest) => {\n return string()\n .max(255, () => getPhrase('surnameExceeds'))\n .required(() => getPhrase('surnameRequired'))\n .default('')\n .test({\n name: 'surname-invalid',\n message: getPhrase('surnameInvalid'),\n test: (val: string) => {\n if (existingUser?.userId && existingUser.surname === val)\n return true;\n\n return NAME_REGEX.test(val);\n }\n });\n },\n\n getEmailSchema: (userType: UserGroup, existingUser?: EditUserRequest) => {\n let schema = string()\n .max(255, () => getPhrase('emailExceeds'))\n .email(() => getPhrase('emailInvalidLong'))\n .default('');\n\n // New staff and old staff who have an email are required to have an email set.\n // Learners and old staff who don't have an email are not required.\n if (userType === UserGroup.Staff && (!existingUser?.userId || existingUser.email))\n schema = schema.required(() => getPhrase('emailRequired'));\n\n return schema;\n },\n\n getUsernameSchema: (existingUser?: EditUserRequest) => {\n const isNewUser = !existingUser?.userId;\n\n return string()\n .default('')\n .test({\n name: 'username-too-long',\n message: getPhrase('usernameExceeds'),\n test: (val: string) => {\n if (!isNewUser && existingUser.username === val)\n return true;\n \n return val.length <= 200;\n }\n })\n .test({\n name: 'username-too-short',\n message: getPhrase('usernameTooShort'),\n test: (val: string) => {\n if (!isNewUser && existingUser.username === val)\n return true;\n \n if (isNewUser && !val)\n return true;\n \n return val.length >= 5;\n }\n })\n .test({\n name: 'username-invalid',\n message: getPhrase('usernameInvalidLong'),\n test: (val: string) => {\n if (isNewUser && !val)\n return true;\n\n if (!isNewUser && existingUser.username === val)\n return true;\n\n return USERNAME_REGEX.test(val);\n }\n });\n },\n\n getPasswordSchema: (minPasswordLength: number, existingUser?: EditUserRequest) => {\n let schema = string().default('');\n\n if (!existingUser?.userId) {\n schema = schema.test({\n name: 'password-short',\n message: getPhrase('passwordTooShort', { minLength: minPasswordLength }),\n test: (val: string) => {\n if (!val)\n return true;\n \n return val.length >= minPasswordLength;\n }\n });\n }\n\n return schema;\n },\n\n getDisplayNameSchema: () => {\n return string()\n .max(70, () => getPhrase('displayNameExceeds'))\n .notRequired()\n .nullable()\n .default('')\n .test({\n name: 'display-name-short',\n message: getPhrase('displayNameTooShort'),\n test: (val: string) => {\n if (!val)\n return true;\n\n return val.length >= 2;\n }\n });\n },\n\n getYearGroupSchema: (userType: UserGroup) => {\n if (userType === UserGroup.Staff)\n return;\n\n return object()\n .required(() => getPhrase('yearGroupRequired'))\n .nullable();\n }\n};","import { object } from 'yup';\n\nimport { EditUserRequest } from 'libs/shared/apps/user-manager/interfaces';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\n\nimport { UserValidationHelper } from './UserValidationHelper';\n\nexport const getUserValidationSchema = (\n userType: UserGroup,\n minPasswordLength: number,\n existingUser?: EditUserRequest\n) => {\n return object().shape({\n firstName: UserValidationHelper.getFirstNameSchema(existingUser),\n\n surname: UserValidationHelper.getSurnameSchema(existingUser),\n\n email: UserValidationHelper.getEmailSchema(userType, existingUser),\n\n username: UserValidationHelper.getUsernameSchema(existingUser),\n\n password: UserValidationHelper.getPasswordSchema(minPasswordLength, existingUser),\n\n displayName: UserValidationHelper.getDisplayNameSchema(),\n\n masterYearGroup: UserValidationHelper.getYearGroupSchema(userType)\n });\n};","import React from 'react';\nimport { FormikErrors, FormikTouched } from 'formik';\n\nimport { UserDetailsForm } from 'libs/shared/apps/user-manager/components/user-details-form/UserDetailsForm';\nimport { BulkUserEmailCheckResponse, EditUserRequest, UserEmailCheckResponse, UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { UserManagerHelper } from 'libs/shared/apps/user-manager/utils/UserManagerHelper';\nimport { getUserValidationSchema } from 'libs/shared/apps/user-manager/validation/UserValidationSchema';\nimport { FormSize } from 'libs/shared/components/forms/form-field/FormField';\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { CurrentUser, User, YearGroup } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport { SecuritySettingsResponse } from '../../interfaces/SecuritySettingsResponse';\n\nexport interface EditUserDetailsProps {\n user?: User;\n userType: UserGroup;\n yearGroups: YearGroup[];\n countryCode?: string;\n currentUser: CurrentUser;\n initialValues: EditUserRequest;\n initialErrors?: FormikErrors<EditUserRequest>;\n onSubmit: (data: EditUserRequest, callback?: () => void) => void;\n onClickCancel: () => void;\n passwordPolicy: SecuritySettingsResponse;\n products?: ProductId[];\n\n editSsoUserHelpArticle?: string;\n canEditSsoFields?: boolean;\n\n submitText?: string;\n formSize?: FormSize;\n showPasswordField?: boolean;\n showDisplayNameField?: boolean;\n emailRequired: boolean;\n\n shouldGoToNext?: boolean;\n onToggleNextCheckbox?: () => void;\n goToNextText?: string;\n isInBulkEditing?: boolean;\n hasUserCredit?: boolean;\n hasOrg?: boolean;\n canEditSuperAdmin?: boolean;\n\n // All of the below props are required for the actions to be shown\n showActions?: boolean;\n appLinks?: UserManagerAppLinks;\n onClickResendActivationEmail?: (user: User) => void;\n onClickSendResetEmail?: (user: User) => void;\n onClickSendVerificationEmail?: (user: User) => void;\n validateEmail?: (email: string) => Promise<BulkUserEmailCheckResponse>;\n onDetectValidUser?: (detectedUser: UserEmailCheckResponse['user']) => void;\n}\n\nexport function EditUserDetails(props: EditUserDetailsProps): React.ReactElement {\n const initialTouched: FormikTouched<EditUserRequest> = {};\n Object.keys(props.initialErrors || {}).forEach((err: keyof EditUserRequest) => {\n initialTouched[err] = true;\n });\n\n const isNew = !props.initialValues.userId;\n\n const canEditEmail = (() => {\n if (isNew)\n return true;\n\n /**\n * If a user's email address is not verified, allow it to be edited.\n */\n if (!props.user?.metadata?.isEmailVerified)\n return true;\n\n return false;\n })();\n\n const minPasswordLength = UserManagerHelper.getMinimumPasswordLength(\n props.passwordPolicy,\n props.userType,\n UserRole.User\n );\n\n const validYearGroups = UserHelper.getValidYearGroups(props.yearGroups);\n\n return (\n <div>\n <FormWrapper<EditUserRequest>\n initialValues={props.initialValues}\n initialErrors={props.initialErrors}\n initialTouched={initialTouched}\n onSubmit={props.onSubmit}\n validationSchema={getUserValidationSchema(props.userType, minPasswordLength, props.initialValues)}\n >\n <UserDetailsForm\n isNew={isNew}\n user={props.user}\n userType={props.userType}\n yearGroups={validYearGroups}\n onClickCancel={props.onClickCancel}\n submitText={props.submitText}\n shouldGoToNext={props.shouldGoToNext}\n onToggleNextCheckbox={props.onToggleNextCheckbox}\n goToNextText={props.goToNextText}\n currentUser={props.currentUser}\n formSize={props.formSize}\n showPasswordField={props.showPasswordField}\n canEditEmail={canEditEmail}\n showActions={props.showActions}\n appLinks={props.appLinks}\n onClickResendActivationEmail={props.onClickResendActivationEmail}\n onClickSendResetEmail={props.onClickSendResetEmail}\n onClickSendVerificationEmail={props.onClickSendVerificationEmail}\n emailRequired={props.emailRequired}\n showDisplayNameField={props.showDisplayNameField}\n canEditSsoFields={props.canEditSsoFields}\n validateEmail={props.validateEmail}\n onDetectValidUser={props.onDetectValidUser}\n isInBulkEditing={props.isInBulkEditing}\n products={props.products}\n hasUserCredit={props.hasUserCredit}\n hasOrg={props.hasOrg}\n countryCode={props.countryCode}\n canEditSuperAdmin={props.canEditSuperAdmin}\n />\n </FormWrapper>\n </div>\n );\n}","import React from 'react';\n\ninterface FormFeedbackProps extends React.PropsWithChildren {\n name: string;\n className?: string;\n}\n\nexport function FormFeedback(props: FormFeedbackProps) {\n return (\n <span id={`${props.name}Error`} className={`${props.className} invalid-feedback d-block`} role='status'>{props.children}</span>\n );\n}","import * as React from 'react';\nimport { Form } from 'react-bootstrap';\nimport { FieldAttributes } from 'formik';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\n\nimport { FieldWrapper, FormFieldProps } from '../form-field/FormField';\n\n/**\n * Use this checkbox within Formik contexts\n */\nexport function FormCheckbox(props: FieldAttributes<FormFieldProps>): JSX.Element {\n const { label, checkboxLabelClassName, checkboxLabelFontWeight, className, ...fieldProps } = props;\n\n return (\n <Form.Group className='form-group'>\n <div className={`form-check ${className || ''}`}>\n <FieldWrapper className='form-check-input' {...fieldProps} />\n <Form.Label\n className={`form-check-label cursor-pointer ${checkboxLabelFontWeight === 'normal' ? 'fw-normal' : ''} \n ${checkboxLabelClassName}`}\n htmlFor={fieldProps.id}\n >\n {label}\n </Form.Label>\n {props.checkboxAppLink && props.checkboxAppLinkText && (\n <>\n <span>&nbsp;</span>\n <AppLink appLink={props.checkboxAppLink} className='info-link'>\n {props.checkboxAppLinkText}\n </AppLink>\n </>\n )}\n </div>\n </Form.Group>\n );\n}\n\n","import * as React from 'react';\nimport { useFormikContext } from 'formik';\n\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\ninterface CharacterCounterProps<Values extends HashObject> {\n fieldName: keyof Values;\n limit: number;\n}\n\nexport function CharacterCounter<Values extends HashObject>(props: CharacterCounterProps<Values>): JSX.Element {\n const { values } = useFormikContext<Values>();\n\n const field = ObjectHelper.get(values, props.fieldName as string);\n\n if (typeof field !== 'string')\n return <></>;\n\n return (\n <div className='float-end text-secondary fw-normal'>\n {field.length}/{props.limit} characters\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"revealPassword\":\"jCfI0\",\"passwordInput\":\"RBJnf\",\"passwordContainer\":\"d78lK\",\"passwordContainerDisabled\":\"asbVo\",\"infoTooltip\":\"wzyOG\",\"spinner\":\"CycFx\"};","import * as React from 'react';\nimport { Form, Spinner } from 'react-bootstrap';\nimport { Placement } from 'react-bootstrap/esm/types';\nimport { ErrorMessage, Field, FieldAttributes, FieldProps, useFormikContext } from 'formik';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { FormCheckbox } from 'libs/shared/components/forms/form-checkbox/FormCheckbox';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { FormHelper } from 'libs/shared/utils/FormHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { CharacterCounter } from './CharacterCounter';\n\nimport styles from './form-field.scss';\n\nconst namespace = 'shared.formField';\n\nexport type FormSize = 'lg' | 'sm';\n\n// If checkboxLabelFontWeight is not specified, it will be bold by default\nexport type CheckboxLabelFontWeight = 'normal' | 'bold'\n\nexport interface FormFieldProps {\n /**\n * The name prop MUST be the same as the attribute\n * name of the value that the field is bound to.\n */\n name: string;\n label?: string;\n description?: string;\n children?: any;\n showCharacterCounter?: boolean;\n showRequiredStar?: boolean;\n checkboxAppLink?: Core.AppLink;\n checkboxAppLinkText?: string;\n checkboxLabelClassName?: string;\n checkboxLabelFontWeight?: CheckboxLabelFontWeight\n infoTooltip?: string;\n infoTooltipPlacement?: Placement;\n infoText?: string;\n formSize?: FormSize;\n showOptionalLabel?: boolean;\n showLoadingSpinner?: boolean;\n formGroupClassname?: string;\n labelClassName?: string;\n}\n\nFieldWrapper.defaultProps = {\n autoComplete: 'off'\n};\n\nexport function FieldWrapper(\n props: FieldAttributes<FormFieldProps> & { className: string }\n): React.ReactElement {\n const { children, showLoadingSpinner, ...fieldProps } = props;\n\n const [ type, setType ] = React.useState(props.type);\n\n function onClickTogglePassword(): void {\n if (type === 'password')\n setType('text');\n else\n setType('password');\n }\n\n const resolvedChildren = FunctionHelper.isFunction(children)\n ? (f: FieldProps) => children(f)\n : React.Children.count(children) ? children : null;\n\n if (fieldProps.type !== 'password') {\n if (showLoadingSpinner) {\n return (\n <div className='position-relative'>\n <Field {...(ObjectHelper.omit(fieldProps, ['formSize']))}>\n {resolvedChildren}\n </Field>\n\n <div className={styles.spinner}>\n <Spinner animation='border' size='sm' />\n </div>\n </div>\n );\n }\n\n return (\n <Field {...(ObjectHelper.omit(fieldProps, ['formSize']))}>\n {resolvedChildren}\n </Field>\n );\n }\n\n let containerClassName = `position-relative ${styles.passwordContainer}`;\n\n if (fieldProps.className)\n containerClassName += ` ${fieldProps.className}`;\n\n if (fieldProps.disabled)\n containerClassName += ` ${styles.passwordContainerDisabled}`;\n\n /**\n * We need to wrap out input with a relatively positioned element in order to absolutely\n * position our visibility icon to reveal the password - Sha\n */\n return (\n <div className={containerClassName}>\n <Field\n {...(ObjectHelper.omit(fieldProps, [ 'formSize', 'type', 'className' ]))}\n type={type}\n className={`${styles.passwordInput} border-0 w-100 h-100 outline-none rounded`}\n >\n {resolvedChildren}\n </Field>\n {fieldProps.type === 'password' &&\n <SvgContainer\n svgName={type === 'password' ? cvSvgLibrary.VisibleOn : cvSvgLibrary.VisibleOff}\n className={`svg-container cursor-pointer ${styles.revealPassword}`}\n onClick={onClickTogglePassword}\n />\n }\n </div>\n );\n}\n\nFormField.defaultProps = {\n autoComplete: 'off',\n infoTooltipPlacement: 'top'\n};\n\nexport function FormField<Values extends HashObject>(props: FieldAttributes<FormFieldProps>): React.ReactElement {\n const {\n label,\n className,\n showCharacterCounter,\n showRequiredStar,\n infoTooltip,\n infoTooltipPlacement,\n infoText,\n formSize,\n showOptionalLabel,\n formGroupClassname,\n labelClassName: labelGlassName,\n ...fieldProps\n } = props;\n\n const { errors, touched } = useFormikContext<Values>();\n\n // This function overwrites the default `onChange` function whenever `props.disabled` is set.\n // This prevents users from \"undisabling\" form fields via inspect element, then editing the field.\n const disabledOnChange = () => {};\n\n if (fieldProps.type === 'checkbox') {\n const _props = ObjectHelper.omit(props, [ 'formSize', 'infoTooltipPlacement' ]);\n\n if (props.disabled)\n _props.onChange = disabledOnChange;\n\n return <FormCheckbox {..._props} />;\n }\n\n const fieldWrapperProps = {\n ...fieldProps,\n className: FormHelper.getCustomFormControlClassName(\n errors,\n touched,\n fieldProps.name,\n formSize,\n className,\n typeof props.as === 'string' ? props.as : null\n )\n };\n\n if (props.disabled)\n fieldWrapperProps.onChange = disabledOnChange;\n\n return (\n <Form.Group className={`form-group ${formGroupClassname}`}>\n {!!label && (\n <Form.Label htmlFor={fieldProps.id} className={`d-flex align-items-center ${labelGlassName}`}>\n {label}\n {showRequiredStar && <span className='text-danger'>*</span>}\n {infoTooltip && (\n <SvgContainer\n className={`svg-container text-secondary ${styles.infoTooltip}`}\n svgName={cvSvgLibrary.Info}\n title={infoTooltip}\n tooltipPlacement={infoTooltipPlacement}\n tooltipSpanHack\n />\n )}\n {showOptionalLabel && <span className='text-secondary'>&nbsp;<Text namespace={namespace} phrase='optional' /></span>}\n \n {!!showCharacterCounter && !!(fieldProps as React.HTMLProps<HTMLInputElement>).maxLength &&\n <div className='ms-auto'>\n <CharacterCounter\n fieldName={(fieldProps.name as keyof Values)}\n limit={(fieldProps as React.HTMLProps<HTMLInputElement>).maxLength}\n />\n </div>\n }\n </Form.Label>\n )}\n {props.description &&\n <p>\n {props.description}\n </p>\n }\n\n <FieldWrapper {...fieldWrapperProps} aria-errormessage={`${fieldProps.name}Error`} />\n\n {!!infoText &&\n <Form.Text className='text-secondary'>\n {infoText}\n </Form.Text>\n }\n\n <ErrorMessage name={fieldProps.name}>\n {(errorMessage: string) => <Form.Control.Feedback id={`${fieldProps.name}Error`} type='invalid' role='status'>{errorMessage}</Form.Control.Feedback>}\n </ErrorMessage>\n </Form.Group>\n );\n}","import * as React from 'react';\nimport { Formik, FormikConfig, FormikContextType, FormikErrors, FormikHelpers, FormikProps, FormikValues, useFormikContext } from 'formik';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\n/**\n * Note: This currently doesn't support arrays, but the need for arrays as initial\n * form data has not yet come up\n */\nfunction omitNullInitialValues<Values extends FormikValues>(initialValues: Values): Values {\n if (!initialValues)\n return {} as Values;\n\n const values = ObjectHelper.deepClone(initialValues);\n\n function omitChildValues(child: Values): void {\n Object.keys(values).forEach((key: keyof Values) => {\n if (!values.hasOwnProperty(key))\n return;\n \n if (ObjectHelper.isObject(child[key]))\n omitChildValues(child[key]);\n else if (values[key] === null)\n delete values[key];\n });\n }\n\n omitChildValues(values);\n return values;\n}\n\n// Omit attributes from FormikConfig that are defined in FormWrapperProps.\ntype ModifiedFormikConfig<Values extends FormikValues> = Omit<FormikConfig<Values>, 'initialValues' | 'onSubmit'>;\n\ninterface InitialStatus {\n allowInitialSubmit: boolean;\n}\n\nexport type FormSubmissionOptions<FormValues = FormikValues> = {\n reset?: boolean;\n errors?: FormikErrors<FormValues>;\n};\n\ninterface FormWrapperProps<FormValues extends FormikValues, ApiValues extends FormikValues> {\n initialValues: Partial<FormValues | ApiValues>;\n onSubmit: (data: FormValues, onDone: (options?: FormSubmissionOptions<FormValues>) => void) => void;\n castInitialValues?: boolean; // cast to validationSchema\n castValuesOnSubmit?: boolean; // cast to validationSchema\n allowInitialSubmit?: boolean; // if true, useCanSubmitForm will allow submit without any user changes.\n}\n\nFormWrapper.defaultProps = {\n castInitialValues: true,\n castValuesOnSubmit: true\n};\n\nexport function FormWrapper<\n FormValues extends FormikValues = FormikValues,\n ApiValues extends FormikValues = FormValues,\n ExtraProps = HashObject\n>(props: ModifiedFormikConfig<FormValues> & ExtraProps & FormWrapperProps<FormValues, ApiValues>): JSX.Element {\n const { castInitialValues, castValuesOnSubmit, initialValues, onSubmit, ...formikProps } = props;\n\n /**\n * If castInitialValues is true, cast initialValues to the validationSchema.\n * This will ensure that any data fetched from the api conforms to the expected form data shape.\n */\n const formattedInitialValues: FormValues = castInitialValues && props.validationSchema\n ? props.validationSchema.cast(omitNullInitialValues(initialValues))\n : initialValues;\n\n const onSubmitHandler = (\n values: FormValues,\n { setSubmitting, resetForm, setFieldError }: FormikHelpers<FormValues>\n ) => {\n /**\n * validationSchema.cast will coerce the values to the types defined in validationSchema.\n * This is useful for trimming inputs:\n * e.g. if a value field has type Yup.string().trim(), it will be automatically trimmed.\n */\n const formattedData = castValuesOnSubmit && props.validationSchema\n ? props.validationSchema.cast(values)\n : values;\n\n onSubmit(formattedData, (options: FormSubmissionOptions<FormValues> = {}) => {\n options.reset && resetForm();\n\n if (options.errors) {\n for (const [ key, value ] of Object.entries(options.errors)) {\n setFieldError(key, value);\n }\n }\n\n setSubmitting(false);\n });\n };\n\n const initialStatus: InitialStatus = {\n allowInitialSubmit: props.allowInitialSubmit\n };\n\n return (\n <Formik<FormValues, ExtraProps>\n enableReinitialize\n {...(formikProps as ModifiedFormikConfig<FormValues> & ExtraProps)}\n initialValues={formattedInitialValues}\n onSubmit={onSubmitHandler}\n initialStatus={initialStatus}\n >\n {FunctionHelper.isFunction(props.children)\n ? (f: FormikProps<FormValues>) => (props.children as (f: FormikProps<FormValues>) => React.ReactNode)(f)\n : React.Children.count(props.children) ? props.children : null\n }\n </Formik>\n );\n}\n\nexport function useFormikContextWrapper<T>(): FormikContextType<T> {\n return useFormikContext<T>();\n}","import { FormikErrors, FormikTouched, getIn } from 'formik';\n\nimport { FormSize } from 'libs/shared/components/forms/form-field/FormField';\n\nfunction getTypeSize(type: string, size: FormSize) {\n let className = '';\n\n switch (type) {\n case 'select':\n className = 'form-select';\n break;\n default:\n className = 'form-control';\n }\n\n if (size === 'sm')\n className += ` ${className}-sm`;\n\n if (size === 'lg')\n className += ` ${className}-lg`;\n\n return className;\n}\n\nexport const FormHelper = {\n getCustomFormControlClassName<T>(\n errors: FormikErrors<T>,\n touched: FormikTouched<T>,\n attribute: string,\n size?: FormSize,\n additionalClassName?: string,\n type?: string\n ): string {\n let className = '';\n\n className = getTypeSize(type, size);\n\n // Using getIn as it supports dot notation\n if (getIn(touched, attribute) && getIn(errors, attribute))\n className += ' is-invalid';\n\n if (additionalClassName)\n className += ` ${additionalClassName}`;\n\n return className;\n }\n};","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Flight } from 'libs/common/flight';\n\nimport { UpdateSecuritySettingsRequest } from 'apps/settings/interfaces/security/requests/UpdateSecuritySettingsRequest';\n\nexport const SecuritySettingsRequests = {\n getCustomerSecuritySettings(\n customerId: string,\n success?: () => void,\n error?: () => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/customers/${customerId}/settings/security`,\n key: `customers:security:settings`,\n normalize: false,\n success,\n error\n };\n },\n\n setCustomerSecuritySettings(\n customerId: string,\n data: UpdateSecuritySettingsRequest,\n success?: () => void,\n error?: () => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/customers/${customerId}/settings/security`,\n key: `update:security:settings`,\n invalidationKeys: `customers:security:settings`,\n type: HttpVerbs.PUT,\n normalize: false,\n data,\n success,\n error\n };\n }\n};"],"names":["getPhrase","LanguageService","UserEmailContactSupportMessage","props","isRostered","error","validationCode","UserValidationCode","FormFeedback","name","isInBulkEditing","ExternalLink","className","href","ArticleHelper","newTab","EditingUserExistsErrorMessage","UserExistsInSchoolErrorMessage","formikProps","appLinkParams","appLinks","studentManager","params","user","userType","UserGroup","AppLink","appLink","query","values","email","onClick","onClickCancel","staffManager","UserTypeMismatchErrorMessage","UserEmailExistsError","isNew","UserRoleField","ROLE_OPTIONS","value","UserRole","label","countryCode","showAdminToggle","hasOrg","canEditSuperAdmin","isEditingCurrentUser","isDisabled","isValidatingEmail","UserHelper","editSsoFields","masterRole","FormField","id","disabled","ToggleSwitch","setFieldValue","User","on","showStateWhenDisabled","map","option","key","Form","type","checked","onChange","e","target","DivButton","Tooltip","title","spanHack","EMAIL_ERROR_CODES","FIRST_NAME_FIELD_ID","UserDetailsForm","yearGroups","submitText","currentUser","validYearGroups","emailError","setEmailError","setIsValidatingEmail","setEditSsoFields","emailValidationCache","client","UserManagerClientContext","password","touched","firstNameEl","document","getElementById","focus","status","ObjectStatus","toString","userId","placeholder","showRequiredStar","emailRequired","canEditEmail","formSize","infoText","UserManagerClient","initialValues","getEmailFieldInfoText","onBlur","currentTarget","setFieldTouched","validateEmail","validateForm","emailValidation","current","ArrayHelper","first","onDetectValidUser","includes","showLoadingSpinner","autoFocus","firstName","surname","showDisplayNameField","username","infoTooltip","showPasswordField","as","masterYearGroup","yearGroupId","yearGroup","find","y","description","showActions","onClickResendActivationEmail","shouldShowActions","UserItemActions","onClickSendResetEmail","onClickSendVerificationEmail","products","isEditUserForm","hasUserCredit","PopupButtons","onToggleNextCheckbox","onToggle","goToNextText","shouldGoToNext","canEditSsoFields","v","tooltip","text","variant","undefined","USERNAME_REGEX","NAME_REGEX","UserValidationHelper","existingUser","max","required","test","message","val","schema","isNewUser","length","minPasswordLength","minLength","nullable","getUserValidationSchema","shape","displayName","notRequired","EditUserDetails","initialTouched","Object","keys","initialErrors","forEach","err","metadata","isEmailVerified","UserManagerHelper","passwordPolicy","FormWrapper","onSubmit","validationSchema","role","children","FormCheckbox","checkboxLabelClassName","checkboxLabelFontWeight","fieldProps","FieldWrapper","htmlFor","checkboxAppLink","checkboxAppLinkText","CharacterCounter","field","ObjectHelper","fieldName","limit","namespace","setType","resolvedChildren","FunctionHelper","f","Spinner","animation","size","containerClassName","SvgContainer","svgName","showCharacterCounter","infoTooltipPlacement","showOptionalLabel","formGroupClassname","labelGlassName","labelClassName","errors","disabledOnChange","_props","fieldWrapperProps","FormHelper","tooltipPlacement","tooltipSpanHack","Text","phrase","maxLength","errorMessage","defaultProps","autoComplete","castInitialValues","castValuesOnSubmit","formattedInitialValues","cast","omitChildValues","child","hasOwnProperty","omitNullInitialValues","initialStatus","allowInitialSubmit","enableReinitialize","setSubmitting","resetForm","setFieldError","formattedData","options","reset","entries","useFormikContextWrapper","getCustomFormControlClassName","attribute","additionalClassName","getTypeSize","SecuritySettingsRequests","getCustomerSecuritySettings","customerId","success","url","normalize","setCustomerSecuritySettings","data","invalidationKeys"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[9843],{69843:(e,r,n)=>{n.d(r,{c:()=>N});var t=n(32735),a=n(23481),s=n(81886),i=n(2948),o=n(49985),l=n(65858),d=n(26055),c=n(43820),u=n(14604),p=n(83345),g="userManager.ssoPasswordResetEmailNotAllowedError";function m(e){return t.createElement(u.W,null,t.createElement("p",{className:"mb-1 fw-semibold"},t.createElement(p.x,{namespace:g,phrase:"warning"})),e.helpArticle&&t.createElement("a",{href:e.helpArticle,target:"_blank",className:"info-link"},t.createElement(p.x,{namespace:g,phrase:"findMore"})))}var b=n(83657),h=n(38143),f=n(40424),v=n(12754),R=n(76881),k=n(86613),y=n(42617);function C(e){return e&&e.groups?e.groups.map(function(e){return e.name}):[]}var O={isDev:function(e){return C(e).includes(y.j.Developer)},hasSubjectsAccess:function(e){return[y.j.Developer,y.j.Content,y.j.Curator,y.j.StreamableCurator].some(function(r){return C(e).includes(r)})}},w=n(89961),A=n(35223),E=n(64818);function L(e){return function(e){if(Array.isArray(e))return j(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||S(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 S(e,r){if(e){if("string"==typeof e)return j(e,r);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?j(e,r):void 0}}function j(e,r){(null==r||r>e.length)&&(r=e.length);for(var n=0,t=Array(r);n<r;n++)t[n]=e[n];return t}var U=a.T.encloseNamespace("userManager.userList");function N(e){var r=function(e){var r,n,a,u,p,g,b,y,C,j,N,T=t.useContext(d.A),V=function(r){return r===e.user.status},x=V(f.w.Active),I=null===(r=e.user.metadata)||void 0===r?void 0:r.isEmailVerified,D=e.user.id==(null===(n=e.currentUser)||void 0===n?void 0:n.id),P=T!==c.a.Curator&&e.currentUser.role!==k.i.SuperAdmin&&(null===(a=e.user.userProfile)||void 0===a?void 0:a.role)===k.i.SuperAdmin,M=(j=(0,i.D)(h.g.BULK_REMOVE_USERS),N=2,function(e){if(Array.isArray(e))return e}(j)||function(e,r){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var t,a,s,i,o=[],l=!0,d=!1;try{if(s=(n=n.call(e)).next,0===r){if(Object(n)!==n)return;l=!1}else for(;!(l=(t=s.call(n)).done)&&(o.push(t.value),o.length!==r);l=!0);}catch(e){d=!0,a=e}finally{try{if(!l&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(d)throw a}}return o}}(j,N)||S(j,N)||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.")}())[1];function _(r){o.k.logUserAction({id:e.user.id},o.k.mergeOptions({entity:l.py.User,workflowPhase:l.eu.Start,location:l.LZ[e.userType===R.Y.Learner?"StaffManagerListItem":"StudentManagerListItem"]},r))}var W=[];if(!e.isEditUserForm){var $=function(){return!(P||e.hasRostering||!x&&(!V(f.w.Inactive)||T!==c.a.Curator))};W.push({order:0,onClick:function(){var r;if($()){_({actionType:l.Vw.Edit});var n=Object.assign(Object.assign({},e.appLinks.editUser),{args:[].concat(L(null!==(r=e.appLinks.editUser.args)&&void 0!==r?r:[]),[e.user.id])});s.Q.C$.trigger(n)}},svgName:A.vn.Edit,className:"btn btn-link svg-container ".concat($()?"":"disabled"),tooltip:P?U("superAdminReadOnly"):e.hasRostering?U("editControlledByRostering"):V(f.w.Disabled)?U("editUserDisabled"):V(f.w.Inactive)&&T!==c.a.Curator?U("editUserPending"):U("editUser"),button:!0})}var Q=function(e){var r=e.hasRostering,n=e.isActive,t=e.superAdminReadOnly;return r?U("editControlledByRostering"):n?U("deleteDisabledTooltip"):t?U("superAdminReadOnly"):null};return e.user.email&&V(f.w.Inactive)&&e.onClickResendActivationEmail&&W.push({order:5,disabled:e.hasRostering||P,tooltip:Q({hasRostering:e.hasRostering,superAdminReadOnly:P}),label:U("resendActivationEmail"),onClick:function(){_({actionType:l.Vw.SendEmail,descriptor:l.on.ActivateUser}),e.onClickResendActivationEmail(e.user)},className:e.hasRostering||P?"cursor-default disabled":"btn btn-link"}),e.user.email&&x&&!I&&W.push({order:5,label:U("sendVerificationEmail"),disabled:e.hasRostering||P,tooltip:Q({hasRostering:e.hasRostering,superAdminReadOnly:P}),onClick:function(){_({actionType:l.Vw.SendEmail,descriptor:l.on.VerifyEmail}),e.onClickSendVerificationEmail(e.user)},className:e.hasRostering?"cursor-default disabled":"btn btn-link"}),D||(I&&x&&e.onClickSendResetEmail&&W.push({order:5,label:U("sendResetEmail"),disabled:e.hasRostering||P,tooltip:Q({hasRostering:e.hasRostering,superAdminReadOnly:P}),onClick:function(){E.l.hasSso(e.user)?w.M.render(t.createElement(m,{helpArticle:e.ssoHelpArticle}),{title:U("sendResetEmail"),cancelButtonProps:{text:U("close"),variant:"dark"}}):(_({actionType:l.Vw.SendEmail,descriptor:l.on.ResetPasswordEmail}),e.onClickSendResetEmail(e.user))},className:e.hasRostering||P?"cursor-default disabled":"btn btn-link"}),V(f.w.Inactive)||W.push({order:10,label:U(x?"deactivate":"activate"),disabled:e.hasRostering||P,tooltip:Q({hasRostering:e.hasRostering,superAdminReadOnly:P}),className:e.hasRostering||P?"cursor-default disabled":"",onClick:function(){var r;_({actionType:l.Vw.Activate,descriptor:x?l.DL.Off:l.DL.On});var n=Object.assign(Object.assign({},e.appLinks.toggleStatus),{args:[].concat(L(null!==(r=e.appLinks.toggleStatus.args)&&void 0!==r?r:[]),[e.user.id])});s.Q.C$.trigger(n)}}),(T!==c.a.Primary||(null===(u=e.products)||void 0===u?void 0:u.includes(v.x.Online)))&&W.push({order:25,disabled:e.hasRostering||P,onClick:function(){x||(_({actionType:l.Vw.Delete,descriptor:l.yh.Single}),M({users:[e.user],totalUsers:1}),s.Q.C$.trigger(e.appLinks.deleteUser))},label:U("delete"),className:"btn btn-link text-danger ".concat(x||e.hasRostering||P?"cursor-default disabled":""),button:!1,tooltip:Q({superAdminReadOnly:P,hasRostering:e.hasRostering,isActive:x})}),T!==c.a.Online&&!(null===(p=e.products)||void 0===p?void 0:p.includes(v.x.Online))&&W.push({order:25,disabled:e.hasRostering||P,onClick:function(){var r;if(!x){_({actionType:l.Vw.Remove,descriptor:l.yh.Single});var n=Object.assign(Object.assign({},e.appLinks.removeUser),{args:[].concat(L(null!==(r=e.appLinks.editUser.args)&&void 0!==r?r:[]),[e.user.id])});s.Q.C$.trigger(n)}},label:U("remove"),className:"btn btn-link text-danger ".concat(x||e.hasRostering||P?"cursor-default disabled":""),button:!1,tooltip:Q({hasRostering:e.hasRostering,superAdminReadOnly:P})})),T===c.a.Online&&e.userType===R.Y.Learner&&x&&W.push({order:15,label:U("viewWorkspace"),onClick:function(){return _({actionType:l.Vw.Click,descriptor:l._S.ViewStudentWorkspace})},appLink:Object.assign(Object.assign({},e.appLinks.viewStudentWorkspace),{params:{username:e.user.username}}),className:e.hasRostering||P?"cursor-default disabled":"btn btn-link",button:!1}),T!==c.a.Primary||e.userType!==R.Y.Learner||V(f.w.Inactive)||W.push({order:15,label:U("viewStudentsVideos"),onClick:function(){return _({actionType:l.Vw.Click,descriptor:l._S.ViewStudentWorkspace})},appLink:Object.assign(Object.assign({},e.appLinks.viewStudentWorkspace),{args:[e.user.id]}),className:"btn btn-link",button:!1}),x&&(e.userType===R.Y.Staff&&!I||e.userType===R.Y.Learner)&&W.push({order:20,disabled:e.hasRostering||P,label:U("changePassword"),className:e.hasRostering||P?"cursor-default disabled":"",onClick:function(){var r;_({actionType:l.Vw.ChangePassword});var n=Object.assign(Object.assign({},e.appLinks.changePassword),{args:[].concat(L(null!==(r=e.appLinks.changePassword.args)&&void 0!==r?r:[]),[e.user.id])});s.Q.C$.trigger(n)}}),T===c.a.Curator&&O.isDev(e.currentUser)&&W.push.apply(W,[{order:2,label:U("manageCuratorGroups"),disabled:e.hasRostering||P,tooltip:Q({hasRostering:e.hasRostering,superAdminReadOnly:P}),className:e.hasRostering||P?"cursor-default disabled":"",onClick:function(){_({actionType:l.Vw.ManageGroup}),s.Q.C$.trigger(Object.assign(Object.assign({},e.appLinks.manageUserCuratorGroups),{args:[e.user.id]}))}},{order:3,label:U("editUserOptions"),disabled:e.hasRostering||P,tooltip:Q({hasRostering:e.hasRostering,superAdminReadOnly:P}),className:e.hasRostering||P?"cursor-default disabled":"",appLink:Object.assign(Object.assign({},e.appLinks.editUserOptions),{args:[].concat(L(null!==(g=e.appLinks.editUserOptions.args)&&void 0!==g?g:[]),[e.user.id])})}]),T===c.a.Curator&&e.hasUserCredit&&W.push({order:4,label:U("editUserCredits"),appLink:Object.assign(Object.assign({},e.appLinks.userCredit),{args:[].concat(L(null!==(b=e.appLinks.userCredit.args)&&void 0!==b?b:[]),[e.user.id])})}),T===c.a.Curator&&(null===(y=e.user.metadata)||void 0===y?void 0:y.isEmailVerified)&&!V(f.w.Inactive)&&W.push({order:5,label:U("unverifyEmail"),disabled:e.hasRostering||P,tooltip:Q({hasRostering:e.hasRostering,superAdminReadOnly:P}),className:e.hasRostering||P?"cursor-default disabled":"",onClick:function(){var r;_({actionType:l.Vw.VerifyEmail,descriptor:l.hY.Remove}),s.Q.C$.trigger(Object.assign(Object.assign({},e.appLinks.deleteUserEmail),{args:[].concat(L(null!==(r=e.appLinks.deleteUserEmail.args)&&void 0!==r?r:[]),[e.user.id])}))}}),T===c.a.Curator&&e.isEditUserForm&&W.push({order:6,label:U("addToAnotherCustomer"),disabled:e.hasRostering||P,tooltip:Q({hasRostering:e.hasRostering,superAdminReadOnly:P}),className:e.hasRostering||P?"cursor-default disabled":"",appLink:Object.assign(Object.assign({},e.appLinks.addToAnotherCustomer),{args:[].concat(L(null!==(C=e.appLinks.addToAnotherCustomer.args)&&void 0!==C?C:[]),[e.user.id])})}),W}(e);return t.createElement(b.e,{actions:r,className:e.isEditUserForm?"mb-2":"pe-4",actionsDropdownClassName:e.isEditUserForm?"btn btn-outline-dark":"btn btn-link ms-1"})}},14604:(e,r,n)=>{n.d(r,{W:()=>o});var t=n(32735),a=n(83914),s=n(35223);const i={icon:"eCi4v"};function o(e){return t.createElement("div",{className:"alert alert-warning d-flex align-items-center px-2 mb-3 ".concat(e.className||"")},t.createElement(a.x,{svgName:s.vn.WarningOutline,className:"svg-container me-2 ".concat(i.icon)}),t.createElement("div",null,e.children))}},26055:(e,r,n)=>{n.d(r,{A:()=>t});var t=n(32735).createContext(null)}}]);
2
- //# sourceMappingURL=9843-e750603a26-lite.chunk.js.map