@clickview/lite 0.76.0-rc.2 → 0.76.0-rc.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundles.json +1 -1
- package/dist/css/{658-lite-5cb7c60d3b.chunk.css → 3700-lite-2ddbf5e39f.chunk.css} +0 -1
- package/dist/css/{4033-lite-b2fb1fd10e.chunk.css → 5987-lite-dc7e18cd99.chunk.css} +1 -0
- package/dist/css/{3325-lite-6f710728af.chunk.css → 5999-lite-bd05e26c6b.chunk.css} +1 -0
- package/dist/css/{6273-lite-e023522516.chunk.css → 6554-lite-a69c2a69da.chunk.css} +1 -0
- package/dist/languages/en.json +1 -1
- package/dist/scripts/{1518-c916754d35-lite.chunk.js → 1518-7005bfd3c8-lite.chunk.js} +2 -2
- package/dist/scripts/{1518-c916754d35-lite.chunk.js.map → 1518-7005bfd3c8-lite.chunk.js.map} +1 -1
- package/dist/scripts/{1670-823b692de0-lite.chunk.js → 1670-d9ced49962-lite.chunk.js} +2 -2
- package/dist/scripts/{1670-823b692de0-lite.chunk.js.map → 1670-d9ced49962-lite.chunk.js.map} +1 -1
- package/dist/scripts/{1912-f7cadd3e9e-lite.chunk.js → 1912-2271f9d8ee-lite.chunk.js} +2 -2
- package/dist/scripts/{1912-f7cadd3e9e-lite.chunk.js.map → 1912-2271f9d8ee-lite.chunk.js.map} +1 -1
- package/dist/scripts/{3143-f03801138f-lite.chunk.js → 3143-a754e306a5-lite.chunk.js} +3 -3
- package/dist/scripts/{3143-f03801138f-lite.chunk.js.map → 3143-a754e306a5-lite.chunk.js.map} +1 -1
- package/dist/scripts/{3191-6f79256d33-lite.chunk.js → 3191-e387636012-lite.chunk.js} +2 -2
- package/dist/scripts/{3191-6f79256d33-lite.chunk.js.map → 3191-e387636012-lite.chunk.js.map} +1 -1
- package/dist/scripts/3700-201cabeb7a-lite.chunk.js +3 -0
- package/dist/scripts/3700-201cabeb7a-lite.chunk.js.map +1 -0
- package/dist/scripts/{4050-57e2409255-lite.chunk.js → 4050-8852c15f40-lite.chunk.js} +3 -3
- package/dist/scripts/4050-8852c15f40-lite.chunk.js.map +1 -0
- package/dist/scripts/{4802-1b7a767c46-lite.chunk.js → 4802-bc321d7ede-lite.chunk.js} +3 -3
- package/dist/scripts/{4802-1b7a767c46-lite.chunk.js.map → 4802-bc321d7ede-lite.chunk.js.map} +1 -1
- package/dist/scripts/{5877-6c9d90249b-lite.chunk.js → 5877-20ef40af7c-lite.chunk.js} +2 -2
- package/dist/scripts/{5877-6c9d90249b-lite.chunk.js.map → 5877-20ef40af7c-lite.chunk.js.map} +1 -1
- package/dist/scripts/5987-ece2ee4793-lite.chunk.js +3 -0
- package/dist/scripts/5987-ece2ee4793-lite.chunk.js.map +1 -0
- package/dist/scripts/{6273-a71eccd48b-lite.chunk.js → 6554-353cf95001-lite.chunk.js} +2 -2
- package/dist/scripts/{6273-a71eccd48b-lite.chunk.js.map → 6554-353cf95001-lite.chunk.js.map} +1 -1
- package/dist/scripts/{7815-554d031e0a-lite.chunk.js → 7815-05c5e8df47-lite.chunk.js} +2 -2
- package/dist/scripts/{7815-554d031e0a-lite.chunk.js.map → 7815-05c5e8df47-lite.chunk.js.map} +1 -1
- package/dist/scripts/{7835-61d04f9f11-lite.chunk.js → 7835-8d490274c8-lite.chunk.js} +3 -3
- package/dist/scripts/{7835-61d04f9f11-lite.chunk.js.map → 7835-8d490274c8-lite.chunk.js.map} +1 -1
- package/dist/scripts/{8362-5936447d00-lite.chunk.js → 8362-7cac098b34-lite.chunk.js} +3 -3
- package/dist/scripts/{8362-5936447d00-lite.chunk.js.map → 8362-7cac098b34-lite.chunk.js.map} +1 -1
- package/dist/scripts/{8548-4eeb094dbb-lite.chunk.js → 8548-c987128b9f-lite.chunk.js} +3 -3
- package/dist/scripts/{8548-4eeb094dbb-lite.chunk.js.map → 8548-c987128b9f-lite.chunk.js.map} +1 -1
- package/dist/scripts/{8756-a3f84f1b64-lite.chunk.js → 8756-560899a88b-lite.chunk.js} +2 -2
- package/dist/scripts/{8756-a3f84f1b64-lite.chunk.js.map → 8756-560899a88b-lite.chunk.js.map} +1 -1
- package/dist/scripts/{8933-01ed4c4e69-lite.chunk.js → 8933-aa3f547d1e-lite.chunk.js} +3 -3
- package/dist/scripts/{8933-01ed4c4e69-lite.chunk.js.map → 8933-aa3f547d1e-lite.chunk.js.map} +1 -1
- package/dist/scripts/914-4a8424247f-lite.chunk.js +2 -0
- package/dist/scripts/914-4a8424247f-lite.chunk.js.map +1 -0
- package/dist/scripts/{9423-d67a0bb6f3-lite.chunk.js → 9423-3ce35ca995-lite.chunk.js} +2 -2
- package/dist/scripts/{9423-d67a0bb6f3-lite.chunk.js.map → 9423-3ce35ca995-lite.chunk.js.map} +1 -1
- package/dist/scripts/bundle-2ab602ed30.min.js +3 -0
- package/dist/scripts/{bundle-4276667ced.min.js.map → bundle-2ab602ed30.min.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/4033-d8dbb0d208-lite.chunk.js +0 -3
- package/dist/scripts/4033-d8dbb0d208-lite.chunk.js.map +0 -1
- package/dist/scripts/4050-57e2409255-lite.chunk.js.map +0 -1
- package/dist/scripts/5467-3c44100a58-lite.chunk.js +0 -2
- package/dist/scripts/5467-3c44100a58-lite.chunk.js.map +0 -1
- package/dist/scripts/658-f500e8210f-lite.chunk.js +0 -3
- package/dist/scripts/658-f500e8210f-lite.chunk.js.map +0 -1
- package/dist/scripts/bundle-4276667ced.min.js +0 -3
- /package/dist/scripts/{3143-f03801138f-lite.chunk.js.LICENSE.txt → 3143-a754e306a5-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{4033-d8dbb0d208-lite.chunk.js.LICENSE.txt → 3700-201cabeb7a-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{4050-57e2409255-lite.chunk.js.LICENSE.txt → 4050-8852c15f40-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{4802-1b7a767c46-lite.chunk.js.LICENSE.txt → 4802-bc321d7ede-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{658-f500e8210f-lite.chunk.js.LICENSE.txt → 5987-ece2ee4793-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{7835-61d04f9f11-lite.chunk.js.LICENSE.txt → 7835-8d490274c8-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{8362-5936447d00-lite.chunk.js.LICENSE.txt → 8362-7cac098b34-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{8548-4eeb094dbb-lite.chunk.js.LICENSE.txt → 8548-c987128b9f-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{8933-01ed4c4e69-lite.chunk.js.LICENSE.txt → 8933-aa3f547d1e-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{bundle-4276667ced.min.js.LICENSE.txt → bundle-2ab602ed30.min.js.LICENSE.txt} +0 -0
package/dist/scripts/{3143-f03801138f-lite.chunk.js.map → 3143-a754e306a5-lite.chunk.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/3143-f03801138f-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/user-manager/context/UserManagerClientContext.ts","file:///app/packages/libs/shared/src/apps/user-manager/hooks/useBulkUploadUsers.ts","file:///app/packages/libs/shared/src/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/hooks/useScript.ts","file:///app/packages/libs/shared/src/utils/FormHelper.ts","file:///app/packages/projects/lite/src/apps/settings/flight-requests/SecuritySettingsRequests.ts","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-upload/example-user-spreadsheet/example-user-spreadsheet.scss","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-upload/example-user-spreadsheet/ExampleUserSpreadsheet.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/google-sheets-selector/GoogleSheetsIcon.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/google-sheets-selector/GoogleSheetsError.ts","file:///app/packages/libs/shared/src/apps/user-manager/components/google-sheets-selector/GoogleSheetsSelectorForm.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/google-sheets-selector/GoogleSheetsSelectorValidation.ts","file:///app/packages/libs/shared/src/apps/user-manager/components/google-sheets-selector/GoogleSheetsSelector.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-upload/upload-user-spreadsheet/UploadUserSpreadsheet.tsx","file:///app/packages/projects/lite/src/apps/user-manager/constants/UserUploadTemplates.ts","file:///app/packages/projects/lite/src/apps/user-manager/views/bulk-user-upload/popup/bulk-user-upload-popup.scss","file:///app/packages/projects/lite/src/apps/user-manager/views/bulk-user-upload/popup/BulkUserUploadPopupView.tsx"],"sourcesContent":["import React from 'react';\n\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\n\nexport const UserManagerClientContext = React.createContext<UserManagerClient>(null);","import { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\n\nimport { EditUserRequest } from '../interfaces';\nimport { BulkUserUploadViewModel, UserHash } from '../interfaces/viewmodels/BulkUserUploadViewModel';\nimport { UserManagerHelper } from '../utils/UserManagerHelper';\n\nfunction updateUserHash(userHash: UserHash, updatedUserIdsHash: HashObject<boolean>): UserHash {\n const updatedUsers = Object.keys(userHash || {}).reduce((updatedObj: UserHash, lookupId) => {\n if (!updatedUserIdsHash[lookupId])\n updatedObj[lookupId] = userHash[lookupId];\n return updatedObj;\n }, {});\n\n return updatedUsers;\n}\n\nexport const useBulkUploadUsers = () => {\n const [ viewModel, setViewModel ] = useViewModel<BulkUserUploadViewModel>(SharedViewModelKeys.BULK_USER_UPLOAD);\n\n function initializeUsers(users?: EditUserRequest[]): void {\n setViewModel({\n users,\n invalidUsers: null,\n existingUsersHash: null\n });\n\n updateDuplicates(users);\n }\n\n function updateUser(updatedUser: EditUserRequest): void {\n const updatedUsers = viewModel.users.map(user => {\n if (user.lookupId !== updatedUser.lookupId)\n return user;\n\n return updatedUser;\n });\n\n setViewModel({\n users: updatedUsers,\n invalidUsers: updateUserHash(viewModel?.invalidUsers, { [updatedUser.lookupId]: true }),\n existingUsersHash: viewModel?.existingUsersHash\n });\n\n updateDuplicates(updatedUsers);\n }\n\n function deleteUsers(deletedUsers: string[]): void {\n const userIdHash = deletedUsers.reduce((prev: HashObject, curr) => {\n prev[curr] = true;\n return prev;\n }, {});\n\n const updatedUsers = viewModel.users.filter(user => !userIdHash[user.lookupId]);\n\n setViewModel({\n users: updatedUsers,\n invalidUsers: updateUserHash(viewModel?.invalidUsers, userIdHash),\n existingUsersHash: updateUserHash(viewModel?.existingUsersHash, userIdHash),\n existingUserToAdd: viewModel?.existingUserToAdd?.filter(u => !!viewModel?.existingUsersHash[u.lookupId])\n });\n\n updateDuplicates(updatedUsers);\n }\n\n function updateDuplicates(users?: EditUserRequest[]): void {\n const duplicateSets = UserManagerHelper.getNewDuplicates(users);\n setViewModel('duplicateSets', duplicateSets);\n }\n\n return {\n users: viewModel?.users,\n invalidUsers: viewModel?.invalidUsers,\n hasValidatedUsers: !!viewModel?.invalidUsers,\n existingUsersHash: viewModel?.existingUsersHash || {},\n hasExistingUsers: !!Object.keys(viewModel?.existingUsersHash || {}).length,\n existingUserToAdd: viewModel?.existingUserToAdd,\n duplicateSets: viewModel?.duplicateSets,\n newUsers: viewModel?.users?.filter(u => !viewModel?.existingUsersHash?.[u.lookupId]) || [],\n\n setUsers: initializeUsers,\n setInvalidUsers: (invalidUsers: UserHash) => setViewModel('invalidUsers', invalidUsers),\n setExistingUsers: (existingUsers: UserHash) => setViewModel('existingUsersHash', existingUsers),\n updateUser,\n deleteUsers\n };\n};","import * 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> </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}\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 ...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'>\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'> <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 React from 'react';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\n/**\n * We only need to load any script once.\n */\nconst loadedScripts: HashObject<boolean> = {};\n\nexport function useScript(src: string, shouldLoad: boolean): boolean {\n const [ loaded, setLoaded ] = React.useState(false);\n\n React.useEffect(() => {\n if (!src || !shouldLoad || loadedScripts[src])\n return;\n\n const script = document.createElement('script');\n\n script.src = src;\n script.async = true;\n script.onload = () => {\n loadedScripts[src] = true;\n /**\n * Onload event is fired before script content is parsed.\n * By calling set timeout, we ensure setLoaded is called after\n * the script is parsed in the event loop.\n */\n window.setTimeout(() => setLoaded(true), 0);\n };\n\n document.body.appendChild(script);\n\n return () => {\n script.onload = null;\n document.body.removeChild(script);\n };\n }, [ src, shouldLoad ]);\n\n return loadedScripts[src] || loaded;\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};","// extracted by mini-css-extract-plugin\nexport default {\"cell\":\"PZci6\"};","import React from 'react';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { YearGroup } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from './example-user-spreadsheet.scss';\n\ninterface ExampleUserSpreadsheetProps {\n userType: UserGroup;\n yearGroups: YearGroup[];\n showPasswordColumn?: boolean;\n}\n\n/**\n * In this example spreadsheet:\n * - We intentionally leave some fields blank to demonstrate that they are not required.\n * - We pick the year level text from the customers year level set as it can differ based on region.\n * - Year level column only shows for student upload\n * - The email cell in the female example row is empty for student in primary. All other contexts require email.\n */\nexport function ExampleUserSpreadsheet(props: ExampleUserSpreadsheetProps): JSX.Element {\n const validYearGroups = UserHelper.getValidYearGroups(props.yearGroups);\n const maleYearGroup: YearGroup = ArrayHelper.first(validYearGroups);\n\n const femaleYearGroupIndex = Math.floor((validYearGroups.length - 1) / 2);\n const femaleYearGroup = props.yearGroups[femaleYearGroupIndex];\n\n return (\n <LanguageNamespaceContext.Provider value='userManager.exampleUserSpreadsheet'>\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 <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='c' /></td>\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='d' /></td>\n {props.userType === UserGroup.Learner && (\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='e' /></td>\n )}\n {props.showPasswordColumn && (\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='f' /></td>\n )}\n </tr>\n\n <tr className='fw-semibold'>\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='firstName' /></td>\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='lastName' /></td>\n {props.userType === UserGroup.Learner && (\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='yearGroup' /></td>\n )}\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 {props.showPasswordColumn && (\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='password' /></td>\n )}\n </tr>\n\n <tr>\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='maleFirstName' /></td>\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='maleLastName' /></td>\n {props.userType === UserGroup.Learner && (\n <td className={`text-nowrap border border-dark ${styles.cell}`}>{maleYearGroup.name}</td>\n )}\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='maleEmail' /></td>\n <td className={`text-nowrap border border-dark ${styles.cell}`}></td>\n {props.showPasswordColumn && (\n <td className={`text-nowrap border border-dark ${styles.cell}`}></td>\n )}\n </tr>\n\n <tr>\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='femaleFirstName' /></td>\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='femaleLastName' /></td>\n {props.userType === UserGroup.Learner && (\n <td className={`text-nowrap border border-dark ${styles.cell}`}>{femaleYearGroup.name}</td>\n )}\n <td className={`text-nowrap border border-dark ${styles.cell}`}>\n {(props.userType === UserGroup.Staff)\n ? <Text phrase='femaleEmail' />\n : ''\n }\n </td>\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='femaleUsername' /></td>\n {props.showPasswordColumn && (\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='passwordExample' /></td>\n )}\n </tr>\n </tbody>\n </table>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\n\nexport function GoogleSheetsIcon(): JSX.Element {\n return (\n <div className='d-inline-block svg-container'>\n <svg width='49px' height='67px' viewBox='0 0 49 67'>\n <defs>\n <path d='M29.5833333,0 L4.4375,0 C1.996875,0 0,1.996875 0,4.4375 L0,60.6458333 C0,63.0864583 1.996875,65.0833333 4.4375,65.0833333 L42.8958333,65.0833333 C45.3364583,65.0833333 47.3333333,63.0864583 47.3333333,60.6458333 L47.3333333,17.75 L29.5833333,0 Z' id='path-1'></path>\n <path d='M29.5833333,0 L4.4375,0 C1.996875,0 0,1.996875 0,4.4375 L0,60.6458333 C0,63.0864583 1.996875,65.0833333 4.4375,65.0833333 L42.8958333,65.0833333 C45.3364583,65.0833333 47.3333333,63.0864583 47.3333333,60.6458333 L47.3333333,17.75 L29.5833333,0 Z' id='path-3'></path>\n <path d='M29.5833333,0 L4.4375,0 C1.996875,0 0,1.996875 0,4.4375 L0,60.6458333 C0,63.0864583 1.996875,65.0833333 4.4375,65.0833333 L42.8958333,65.0833333 C45.3364583,65.0833333 47.3333333,63.0864583 47.3333333,60.6458333 L47.3333333,17.75 L29.5833333,0 Z' id='path-5'></path>\n <linearGradient x1='50.0053945%' y1='8.58610612%' x2='50.0053945%' y2='100.013939%' id='linearGradient-7'>\n <stop stopColor='#263238' stopOpacity='0.2' offset='0%'></stop>\n <stop stopColor='#263238' stopOpacity='0.02' offset='100%'></stop>\n </linearGradient>\n <path d='M29.5833333,0 L4.4375,0 C1.996875,0 0,1.996875 0,4.4375 L0,60.6458333 C0,63.0864583 1.996875,65.0833333 4.4375,65.0833333 L42.8958333,65.0833333 C45.3364583,65.0833333 47.3333333,63.0864583 47.3333333,60.6458333 L47.3333333,17.75 L29.5833333,0 Z' id='path-8'></path>\n <path d='M29.5833333,0 L4.4375,0 C1.996875,0 0,1.996875 0,4.4375 L0,60.6458333 C0,63.0864583 1.996875,65.0833333 4.4375,65.0833333 L42.8958333,65.0833333 C45.3364583,65.0833333 47.3333333,63.0864583 47.3333333,60.6458333 L47.3333333,17.75 L29.5833333,0 Z' id='path-10'></path>\n <path d='M29.5833333,0 L4.4375,0 C1.996875,0 0,1.996875 0,4.4375 L0,60.6458333 C0,63.0864583 1.996875,65.0833333 4.4375,65.0833333 L42.8958333,65.0833333 C45.3364583,65.0833333 47.3333333,63.0864583 47.3333333,60.6458333 L47.3333333,17.75 L29.5833333,0 Z' id='path-12'></path>\n <path d='M29.5833333,0 L4.4375,0 C1.996875,0 0,1.996875 0,4.4375 L0,60.6458333 C0,63.0864583 1.996875,65.0833333 4.4375,65.0833333 L42.8958333,65.0833333 C45.3364583,65.0833333 47.3333333,63.0864583 47.3333333,60.6458333 L47.3333333,17.75 L29.5833333,0 Z' id='path-14'></path>\n <radialGradient cx='3.16804688%' cy='2.71744318%' fx='3.16804688%' fy='2.71744318%' r='161.248516%' gradientTransform='translate(0.031680,0.027174),scale(1.000000,0.727273),translate(-0.031680,-0.027174)' id='radialGradient-16'>\n <stop stopColor='#FFFFFF' stopOpacity='0.1' offset='0%'></stop>\n <stop stopColor='#FFFFFF' stopOpacity='0' offset='100%'></stop>\n </radialGradient>\n </defs>\n <g id='Page-1' stroke='none' strokeWidth='1' fill='none' fillRule='evenodd'>\n <g id='Consumer-Apps-Sheets-Large-VD-R8-' transform='translate(-451.000000, -451.000000)'>\n <g id='Hero' transform='translate(0.000000, 63.000000)'>\n <g id='Personal' transform='translate(277.000000, 299.000000)'>\n <g id='Sheets-icon' transform='translate(174.833333, 89.958333)'>\n <g id='Group'>\n <g id='Clipped'>\n <mask id='mask-2' fill='white'>\n <use xlinkHref='#path-1'></use>\n </mask>\n <g id='SVGID_1_'></g>\n <path d='M29.5833333,0 L4.4375,0 C1.996875,0 0,1.996875 0,4.4375 L0,60.6458333 C0,63.0864583 1.996875,65.0833333 4.4375,65.0833333 L42.8958333,65.0833333 C45.3364583,65.0833333 47.3333333,63.0864583 47.3333333,60.6458333 L47.3333333,17.75 L36.9791667,10.3541667 L29.5833333,0 Z' id='Path' fill='#0F9D58' fillRule='nonzero' mask='url(#mask-2)'></path>\n </g>\n <g id='Clipped'>\n <mask id='mask-4' fill='white'>\n <use xlinkHref='#path-3'></use>\n </mask>\n <g id='SVGID_1_'></g>\n <path d='M11.8333333,31.8020833 L11.8333333,53.25 L35.5,53.25 L35.5,31.8020833 L11.8333333,31.8020833 Z M22.1875,50.2916667 L14.7916667,50.2916667 L14.7916667,46.59375 L22.1875,46.59375 L22.1875,50.2916667 Z M22.1875,44.375 L14.7916667,44.375 L14.7916667,40.6770833 L22.1875,40.6770833 L22.1875,44.375 Z M22.1875,38.4583333 L14.7916667,38.4583333 L14.7916667,34.7604167 L22.1875,34.7604167 L22.1875,38.4583333 Z M32.5416667,50.2916667 L25.1458333,50.2916667 L25.1458333,46.59375 L32.5416667,46.59375 L32.5416667,50.2916667 Z M32.5416667,44.375 L25.1458333,44.375 L25.1458333,40.6770833 L32.5416667,40.6770833 L32.5416667,44.375 Z M32.5416667,38.4583333 L25.1458333,38.4583333 L25.1458333,34.7604167 L32.5416667,34.7604167 L32.5416667,38.4583333 Z' id='Shape' fill='#F1F1F1' fillRule='nonzero' mask='url(#mask-4)'></path>\n </g>\n <g id='Clipped'>\n <mask id='mask-6' fill='white'>\n <use xlinkHref='#path-5'></use>\n </mask>\n <g id='SVGID_1_'></g>\n <polygon id='Path' fill='url(#linearGradient-7)' fillRule='nonzero' mask='url(#mask-6)' points='30.8813021 16.4520313 47.3333333 32.9003646 47.3333333 17.75'></polygon>\n </g>\n <g id='Clipped'>\n <mask id='mask-9' fill='white'>\n <use xlinkHref='#path-8'></use>\n </mask>\n <g id='SVGID_1_'></g>\n <g id='Group' mask='url(#mask-9)'>\n <g transform='translate(26.625000, -2.958333)'>\n <path d='M2.95833333,2.95833333 L2.95833333,16.2708333 C2.95833333,18.7225521 4.94411458,20.7083333 7.39583333,20.7083333 L20.7083333,20.7083333 L2.95833333,2.95833333 Z' id='Path' fill='#87CEAC' fillRule='nonzero'></path>\n </g>\n </g>\n </g>\n <g id='Clipped'>\n <mask id='mask-11' fill='white'>\n <use xlinkHref='#path-10'></use>\n </mask>\n <g id='SVGID_1_'></g>\n <path d='M4.4375,0 C1.996875,0 0,1.996875 0,4.4375 L0,4.80729167 C0,2.36666667 1.996875,0.369791667 4.4375,0.369791667 L29.5833333,0.369791667 L29.5833333,0 L4.4375,0 Z' id='Path' fillOpacity='0.2' fill='#FFFFFF' fillRule='nonzero' mask='url(#mask-11)'></path>\n </g>\n <g id='Clipped'>\n <mask id='mask-13' fill='white'>\n <use xlinkHref='#path-12'></use>\n </mask>\n <g id='SVGID_1_'></g>\n <path d='M42.8958333,64.7135417 L4.4375,64.7135417 C1.996875,64.7135417 0,62.7166667 0,60.2760417 L0,60.6458333 C0,63.0864583 1.996875,65.0833333 4.4375,65.0833333 L42.8958333,65.0833333 C45.3364583,65.0833333 47.3333333,63.0864583 47.3333333,60.6458333 L47.3333333,60.2760417 C47.3333333,62.7166667 45.3364583,64.7135417 42.8958333,64.7135417 Z' id='Path' fillOpacity='0.2' fill='#263238' fillRule='nonzero' mask='url(#mask-13)'></path>\n </g>\n <g id='Clipped'>\n <mask id='mask-15' fill='white'>\n <use xlinkHref='#path-14'></use>\n </mask>\n <g id='SVGID_1_'></g>\n <path d='M34.0208333,17.75 C31.5691146,17.75 29.5833333,15.7642188 29.5833333,13.3125 L29.5833333,13.6822917 C29.5833333,16.1340104 31.5691146,18.1197917 34.0208333,18.1197917 L47.3333333,18.1197917 L47.3333333,17.75 L34.0208333,17.75 Z' id='Path' fillOpacity='0.1' fill='#263238' fillRule='nonzero' mask='url(#mask-15)'></path>\n </g>\n </g>\n <path d='M29.5833333,0 L4.4375,0 C1.996875,0 0,1.996875 0,4.4375 L0,60.6458333 C0,63.0864583 1.996875,65.0833333 4.4375,65.0833333 L42.8958333,65.0833333 C45.3364583,65.0833333 47.3333333,63.0864583 47.3333333,60.6458333 L47.3333333,17.75 L29.5833333,0 Z' id='Path' fill='url(#radialGradient-16)' fillRule='nonzero'></path>\n </g>\n </g>\n </g>\n </g>\n </g>\n </svg>\n </div>\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { DialogError } from 'libs/shared/errors/primitives/DialogError';\nimport { DialogOptions } from 'libs/shared/interfaces';\n\nconst lang = 'userManager.googleSheetsSelector';\n\nexport class GoogleSheetsError extends DialogError {\n private title: string;\n private body: string;\n\n constructor(title: string, body: string) {\n super(title);\n\n this.title = title;\n this.body = body;\n }\n\n // @ts-ignore\n public get name(): string {\n return 'GoogleSheetsError';\n }\n\n // @ts-ignore\n public get dialogOptions(): DialogOptions {\n return {\n title: this.title,\n text: this.body,\n buttons: [{\n text: LanguageService.getPhrase(lang, 'okay'),\n className: 'btn btn-dark',\n success: true\n }]\n };\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 { FormField } 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';\n\nimport { SpreadsheetData } from './GoogleSheetsSelector';\n\nconst namespace = 'userManager.googleSheetsSelector';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface GoogleSheetsSelectorFormProps {\n onClickCancel: () => void;\n onSelectSpreadsheet: (spreadsheetId: string) => Promise<any>;\n spreadsheets: any[];\n spreadsheetSheets: string[];\n}\n\nexport function GoogleSheetsSelectorForm(props: GoogleSheetsSelectorFormProps): JSX.Element {\n const formikProps = useFormikContextWrapper<SpreadsheetData>();\n\n /**\n * Whenever the list of available sheets on the selected spreadsheet changes,\n * select the first sheet by default IF it is the only sheet available.\n */\n React.useEffect(() => {\n if (!props.spreadsheetSheets)\n return;\n\n if (props.spreadsheetSheets.length === 1)\n formikProps.setFieldValue('spreadsheetRange', ArrayHelper.first(props.spreadsheetSheets));\n }, [props.spreadsheetSheets]);\n\n return (\n <Form>\n <FormField\n as='select'\n label={getPhrase('spreadsheetId')}\n name='spreadsheetId'\n value={formikProps.values.spreadsheetId}\n onChange={(e: React.ChangeEvent<HTMLSelectElement>) => {\n props.onSelectSpreadsheet(e.target.value);\n formikProps.setFieldValue('spreadsheetId', e.target.value);\n }}\n >\n <option value=''>{LanguageService.getPhrase(namespace, 'selectSpreadsheetId')}</option>\n {props.spreadsheets.map(spreadsheet =>\n <option key={spreadsheet.id} value={spreadsheet.id}>{spreadsheet.name}</option>)}\n </FormField>\n\n <FormField\n as='select'\n label={getPhrase('spreadsheetRange')}\n name='spreadsheetRange'\n value={formikProps.values.spreadsheetRange}\n onChange={(e: React.ChangeEvent<HTMLSelectElement>) => formikProps.setFieldValue('spreadsheetRange', e.target.value)}\n disabled={!props.spreadsheetSheets?.length}\n >\n <option value=''>{LanguageService.getPhrase(namespace, 'selectSpreadsheetRange')}</option>\n {props.spreadsheetSheets.map(sheetName =>\n <option key={sheetName} value={sheetName}>{sheetName}</option>)}\n </FormField>\n\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.onClickCancel} />\n <PopupButtons.Submit variant='dark' text={getPhrase('upload')} />\n </PopupButtons>\n </Form>\n );\n}","import { object, string } from 'yup';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst namespace = 'userManager.googleSheetsSelector';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const GoogleSheetsSelectorValidation = object().shape({\n spreadsheetId: string()\n .required(() => getPhrase('spreadsheetIdRequired'))\n .default(''),\n spreadsheetRange: string()\n .required(() => getPhrase('spreadsheetRangeRequired'))\n .default('')\n});","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { PopupLoadingSpinner } from 'libs/shared/components/popup/PopupLoadingSpinner';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useScript } from 'libs/shared/hooks/useScript';\n\nimport { GoogleSheetsError } from './GoogleSheetsError';\nimport { GoogleSheetsSelectorForm } from './GoogleSheetsSelectorForm';\nimport { GoogleSheetsSelectorValidation } from './GoogleSheetsSelectorValidation';\n\nconst namespace = 'userManager.googleSheetsSelector';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\n// `gapi` typings\ninterface Spreadsheet {\n id: string;\n name: string;\n}\n\nexport interface SpreadsheetData {\n spreadsheetId: string;\n spreadsheetRange?: string;\n}\n\nconst initialData = {\n spreadsheetId: '',\n spreadsheetRange: ''\n};\n\nconst GOOGLE_CONSENT_REQUEST = {\n apiKey: 'AIzaSyBqN38T3KYOCte1NGMv2i2Izsr3E5o_uyU',\n clientId: '963556877348-d70e06codundropau356uen98pbq3j7j.apps.googleusercontent.com',\n discoveryDocs: [\n 'https://www.googleapis.com/discovery/v1/apis/drive/v3/rest',\n 'https://sheets.googleapis.com/$discovery/rest?version=v4'\n ],\n scope: 'https://www.googleapis.com/auth/drive.readonly'\n};\n\ninterface GoogleSheetsSelectorProps {\n onSelectSpreadsheet: (data: any[]) => void;\n onClickCancel: () => void;\n}\n\nexport function GoogleSheetsSelector(props: GoogleSheetsSelectorProps): JSX.Element {\n const [ spreadsheets, setSpreadsheets ] = React.useState<Spreadsheet[]>([]);\n const [ spreadsheetRanges, setSpreadsheetRanges ] = React.useState<string[]>([]);\n\n const googleAuthInstance = React.useRef<gapi.AuthInstance>(null);\n const googleSignInListener = React.useRef<gapi.AuthSignInListener>(null);\n\n const gapiLoaded = useScript('https://apis.google.com/js/platform.js', true);\n\n React.useEffect(connectToGoogleApi, [gapiLoaded]);\n\n React.useEffect(() => {\n if (!googleSignInListener.current || !gapiLoaded)\n return;\n\n // Unbind google signin event listener\n return () => {\n googleSignInListener.current?.remove();\n };\n }, [googleSignInListener.current]);\n\n function connectToGoogleApi(): void {\n // Connect to the google auth client\n gapi.load('client:auth2', async () => {\n try {\n await gapi.client.init(GOOGLE_CONSENT_REQUEST);\n\n googleAuthInstance.current = gapi.auth2.getAuthInstance();\n\n const googleUser = googleAuthInstance.current.currentUser.get();\n\n // If the user has not previously signed into their google account with us, sign them in\n if (!googleUser.isSignedIn()) {\n signIn();\n return;\n }\n\n // Listen on their authentication state. If they sign out at any point, throw an error.\n googleSignInListener.current = googleAuthInstance.current.isSignedIn.listen(isSignedIn => {\n if (isSignedIn)\n return;\n\n onError(getPhrase('authErrorTitle'), getPhrase('authErrorMessage'));\n });\n\n // If the user is signed in but has not granted us the Google Drive readonly scope, request access\n if (!googleUser.hasGrantedScopes(GOOGLE_CONSENT_REQUEST.scope)) {\n googleUser.grant(GOOGLE_CONSENT_REQUEST)\n .then(loadSpreadsheets)\n .catch(() => onError(getPhrase('rejectScopeTitle'), getPhrase('rejectScopeMessage')));\n\n return;\n }\n\n // If the user has signed in and has granted us the scopes we need, fetch their spreadsheets.\n loadSpreadsheets();\n } catch {\n onError(getPhrase('authErrorTitle'), getPhrase('authErrorMessage'));\n }\n });\n }\n\n async function signIn(): Promise<void> {\n try {\n await googleAuthInstance.current.signIn();\n const googleUser = googleAuthInstance.current.currentUser.get();\n\n // If the user signs in but doesn't grant the scopes we need, throw an error.\n if (!googleUser.hasGrantedScopes(GOOGLE_CONSENT_REQUEST.scope)) {\n onError(getPhrase('rejectScopeTitle'), getPhrase('rejectScopeMessage'));\n return;\n }\n\n // If the user signs in and grants the scopes we need, fetch their spreadsheets.\n loadSpreadsheets();\n } catch {\n onError(getPhrase('authErrorTitle'), getPhrase('authErrorMessage'));\n props.onClickCancel();\n }\n }\n\n async function loadSpreadsheets(): Promise<void> {\n try {\n // Fetch all google sheets in the user's google drive\n const spreadsheetResponse = await gapi.client.drive.files.list({\n q: `mimeType='application/vnd.google-apps.spreadsheet'`\n });\n\n const spreadsheets = spreadsheetResponse?.result?.files;\n\n if (!Array.isArray(spreadsheets)) {\n onError(getPhrase('spreadsheetFetchErrorTitle'), getPhrase('spreadsheetFetchErrorMessage'));\n return;\n }\n\n if (!spreadsheets.length) {\n onError(getPhrase('noSpreadsheetsErrorTitle'), getPhrase('noSpreadsheetsErrorMessage'));\n return;\n }\n\n setSpreadsheets(spreadsheets);\n } catch {\n onError(getPhrase('spreadsheetFetchErrorTitle'), getPhrase('spreadsheetFetchErrorMessage'));\n }\n }\n\n /**\n * When the user selects a spreadsheet, load all of the available\n * sheets in that spreadsheet.\n */\n async function getSpreadsheetRanges(spreadsheetId: string): Promise<void> {\n if (!spreadsheetId) {\n setSpreadsheetRanges([]);\n return;\n }\n\n try {\n const response = await gapi.client.sheets.spreadsheets.get({ spreadsheetId });\n\n const ranges = response?.result?.sheets?.map((sheet: any) => sheet?.properties?.title);\n\n if (!ranges?.length) {\n onError(getPhrase('spreadsheetFetchErrorTitle'), getPhrase('spreadsheetFetchErrorMessage'));\n return;\n }\n\n setSpreadsheetRanges(ranges);\n } catch {\n onError(getPhrase('spreadsheetFetchErrorTitle'), getPhrase('spreadsheetFetchErrorMessage'));\n }\n }\n\n async function onClickConfirm(data: SpreadsheetData): Promise<void> {\n const { spreadsheetId, spreadsheetRange } = data;\n\n if (!spreadsheetId || !spreadsheetRange) {\n onError(getPhrase('spreadsheetConfirmErrorTitle'), getPhrase('spreadsheetConfirmErrorMessage'));\n return;\n }\n\n try {\n // Get all of the rows in the spreadsheet\n const spreadsheet = await gapi.client.sheets.spreadsheets.values.get({\n spreadsheetId,\n range: spreadsheetRange\n });\n\n if (googleSignInListener.current?.remove)\n googleSignInListener.current.remove();\n\n props.onSelectSpreadsheet(spreadsheet.result.values);\n } catch {\n onError(getPhrase('spreadsheetConfirmErrorTitle'), getPhrase('spreadsheetConfirmErrorMessage'));\n }\n }\n\n function onError(title: string, message: string): void {\n Core.ErrorHelper.throw(new GoogleSheetsError(title, message));\n }\n\n if (!spreadsheets.length) {\n return (\n <>\n <PopupLoadingSpinner />\n <p className='text-center mt-n4 pb-3'><Text namespace={namespace} phrase='authenticating' /></p>\n </>\n );\n }\n\n return (\n <FormWrapper<SpreadsheetData>\n initialValues={initialData}\n validationSchema={GoogleSheetsSelectorValidation}\n onSubmit={onClickConfirm}\n >\n <GoogleSheetsSelectorForm\n onClickCancel={props.onClickCancel}\n onSelectSpreadsheet={getSpreadsheetRanges}\n spreadsheets={spreadsheets}\n spreadsheetSheets={spreadsheetRanges}\n />\n </FormWrapper>\n );\n}","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 { ExampleUserSpreadsheet } from 'libs/shared/apps/user-manager/components/bulk-upload/example-user-spreadsheet/ExampleUserSpreadsheet';\nimport { GoogleSheetsIcon } from 'libs/shared/apps/user-manager/components/google-sheets-selector/GoogleSheetsIcon';\nimport { GoogleSheetsSelector } from 'libs/shared/apps/user-manager/components/google-sheets-selector/GoogleSheetsSelector';\nimport { UserManagerConstants } from 'libs/shared/apps/user-manager/constants/UserManagerConstants';\nimport { InvalidSpreadsheetError } from 'libs/shared/apps/user-manager/errors/invalid-spreadsheet/InvalidSpreadsheetError';\nimport { SpreadsheetTooLargeError } from 'libs/shared/apps/user-manager/errors/spreadsheet-too-large/SpreadsheetTooLargeError';\nimport { EditUserRequest } from 'libs/shared/apps/user-manager/interfaces';\nimport { SecuritySettingsResponse } from 'libs/shared/apps/user-manager/interfaces/SecuritySettingsResponse';\nimport { BulkUserUploadHelper } from 'libs/shared/apps/user-manager/utils/BulkUserUploadHelper';\nimport { UserManagerHelper } from 'libs/shared/apps/user-manager/utils/UserManagerHelper';\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 { UserRole } from 'libs/shared/enums/UserRole';\nimport { CurrentUser, YearGroup } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespaces = {\n [UserGroup.Learner]: 'userManager.uploadStudentSpreadsheet',\n [UserGroup.Staff]: 'userManager.uploadStaffSpreadsheet',\n [UserGroup.Unknown]: ''\n};\n\ninterface UploadUserSpreadsheetProps {\n onSelectSpreadsheet: (users: EditUserRequest[]) => void;\n onClickCancel: () => void;\n userType: UserGroup;\n currentUser: CurrentUser;\n yearGroups: YearGroup[];\n templateLink: string;\n showPasswordColumn?: boolean;\n passwordPolicy?: SecuritySettingsResponse;\n}\n\nexport function UploadUserSpreadsheet(props: UploadUserSpreadsheetProps): JSX.Element {\n // eslint-disable-next-line\n const [ showGoogleSheetsSelector, setShowGoogleSheetsSelector ] = React.useState(false);\n\n const namespace = namespaces[props.userType];\n\n const minPasswordLength = UserManagerHelper.getMinimumPasswordLength(\n props.passwordPolicy,\n props.userType,\n UserRole.User\n );\n\n function onSelectSpreadsheet(data: string[][]): void {\n const isEmpty = BulkUserUploadHelper.validateEmptySpreadsheetData(data);\n\n if (isEmpty)\n return;\n\n const clone = [...data];\n const headings = clone.shift();\n\n const { isValid, errorMessage } = props.userType === UserGroup.Learner\n ? BulkUserUploadHelper.validateUploadedStudentSpreadsheet(\n headings,\n props.currentUser?.countryCode,\n props.templateLink\n )\n : BulkUserUploadHelper.validateUploadedStaffSpreadsheet(\n headings,\n props.templateLink\n );\n\n if (!isValid) {\n Core.ErrorHelper.throw(new InvalidSpreadsheetError(errorMessage));\n return;\n }\n\n const users = BulkUserUploadHelper.buildUsersFromSpreadsheet(\n clone,\n props.userType,\n props.currentUser.customerId,\n props.yearGroups\n );\n\n if (users.length > UserManagerConstants.MAX_USER_SPREADSHEET_ROWS) {\n Core.ErrorHelper.throw(new SpreadsheetTooLargeError(UserManagerConstants.MAX_USER_SPREADSHEET_ROWS));\n return;\n }\n\n props.onSelectSpreadsheet(users);\n }\n\n if (showGoogleSheetsSelector) {\n return (\n <GoogleSheetsSelector\n onSelectSpreadsheet={onSelectSpreadsheet}\n onClickCancel={props.onClickCancel}\n />\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 {props.userType === UserGroup.Learner ? (\n <ul>\n <li><Text phrase='requiredFields' /></li>\n <li><Text phrase='usernamesBlank' /></li>\n <li><Text phrase='passwordsProvided' options={{ minLength: minPasswordLength }}/></li>\n <li><Text phrase='emailsProvided' /></li>\n </ul>\n ) : (\n <p className='ms-n1 ps-3'>\n <Text phrase='addUsersInfo' />\n </p>\n )}\n <div className='mx-n1 px-3'>\n <ExampleUserSpreadsheet\n userType={props.userType}\n yearGroups={props.yearGroups}\n showPasswordColumn={props.showPasswordColumn}\n />\n </div>\n </div>\n\n {/* Step 3 */}\n <div>\n <div className='h6'><Text phrase='uploadHeading' /></div>\n <div className='d-inline-block ms-n1 ps-3 mt-1'>\n {/* TODO: Make available to online and curator once it's approved for production. */}\n {!!(props.currentUser.username === 'joshua.taylor@clickview.com.au') && (\n <div className='d-inline-block me-2'>\n <button\n className='btn btn-outline-dark d-flex align-items-center justify-content-center ps-1 mb-2 w-100'\n onClick={() => setShowGoogleSheetsSelector(true)}\n >\n <div className='me-1'>\n <GoogleSheetsIcon />\n </div>\n <Text phrase='googleSheets' />\n </button>\n </div>\n )}\n\n <div className='d-inline-block'>\n <BulkUploadFileSelect onSelectSpreadsheet={onSelectSpreadsheet} />\n </div>\n </div>\n </div>\n </LanguageNamespaceContext.Provider>\n );\n}","import { CountryCode } from 'libs/shared/enums/CountryCode';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\n\nexport const UserUploadTemplates: Record<string, Partial<Record<UserGroup, string>>> = {\n [CountryCode.US]: {\n [UserGroup.Learner]: '/templates/us/Template_Students.csv',\n [UserGroup.Staff]: '/templates/us/Template_Staff.csv'\n },\n [CountryCode.AU]: {\n [UserGroup.Learner]: '/templates/au/Template_Students.csv',\n [UserGroup.Staff]: '/templates/au/Template_Staff.csv'\n },\n [CountryCode.UK]: {\n [UserGroup.Learner]: '/templates/uk/Template_Students.csv',\n [UserGroup.Staff]: '/templates/uk/Template_Staff.csv'\n },\n [CountryCode.NZ]: {\n [UserGroup.Learner]: '/templates/au/Template_Students.csv',\n [UserGroup.Staff]: '/templates/au/Template_Staff.csv'\n }\n};","// extracted by mini-css-extract-plugin\nexport default {\"modalWidth\":\"olOSv\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\n\nimport { UploadUserSpreadsheet } from 'libs/shared/apps/user-manager/components/bulk-upload/upload-user-spreadsheet/UploadUserSpreadsheet';\nimport { UserManagerClientContext } from 'libs/shared/apps/user-manager/context/UserManagerClientContext';\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\nimport { useBulkUploadUsers } from 'libs/shared/apps/user-manager/hooks/useBulkUploadUsers';\nimport { EditUserRequest } from 'libs/shared/apps/user-manager/interfaces';\nimport { SecuritySettingsResponse } from 'libs/shared/apps/user-manager/interfaces/SecuritySettingsResponse';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { CountryCode } from 'libs/shared/enums/CountryCode';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { CurrentUser, PropsWithPopupViewProps, YearGroup } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { SecuritySettingsRequests } from 'apps/settings/flight-requests/SecuritySettingsRequests';\nimport { UserUploadTemplates } from 'apps/user-manager/constants/UserUploadTemplates';\nimport { UserManagerRequests } from 'apps/user-manager/flight-requests/UserManagerRequests';\n\nimport styles from './bulk-user-upload-popup.scss';\n\nconst namespaces = {\n [UserGroup.Learner]: 'userManager.bulkStudentUploadPopup',\n [UserGroup.Staff]: 'userManager.bulkStaffUploadPopup',\n [UserGroup.Unknown]: ''\n};\n\ntype BulkUserUploadPopupViewProps = PropsWithPopupViewProps<{\n userType: UserGroup;\n}>;\n\nexport function BulkUserUploadPopupView(props: BulkUserUploadPopupViewProps): JSX.Element {\n const { setUsers } = useBulkUploadUsers();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data && UserManagerRequests.yearGroups(currentUser.data.customerId)\n );\n const passwordPolicy = Flight.useBasicFetch<SecuritySettingsResponse>(currentUser.data &&\n SecuritySettingsRequests.getCustomerSecuritySettings(currentUser.data.customerId));\n\n function onSelectSpreadsheet(users: EditUserRequest[]): void {\n setUsers(users);\n\n props.closePopup();\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.USER_MANAGER,\n action: Actions.UserManager.USER_UPLOAD_REVIEW_ACCOUNTS,\n params: { userType: props.userType }\n });\n }\n\n const dataLoaded = !!currentUser.data && !!yearGroups.data && !!passwordPolicy.data;\n\n const countryCode = currentUser.data?.countryCode?.toLowerCase() ?? CountryCode.AU.toLowerCase();\n\n return (\n <UserManagerClientContext.Provider value={UserManagerClient.Primary}>\n <Popup\n closePopup={props.closePopup}\n title={LanguageService.getPhrase(namespaces[props.userType], 'heading')}\n showLoadingSpinner={!dataLoaded}\n dialogClassName={styles.modalWidth}\n >\n {dataLoaded && (\n <UploadUserSpreadsheet\n userType={props.userType}\n onSelectSpreadsheet={onSelectSpreadsheet}\n onClickCancel={props.closePopup}\n templateLink={UserUploadTemplates[countryCode][props.userType]}\n currentUser={currentUser.data}\n yearGroups={yearGroups.data}\n showPasswordColumn={props.userType === UserGroup.Learner}\n passwordPolicy={passwordPolicy.data}\n />\n )}\n </Popup>\n </UserManagerClientContext.Provider>\n );\n}"],"names":["UserManagerClientContext","updateUserHash","userHash","updatedUserIdsHash","Object","keys","reduce","updatedObj","lookupId","useBulkUploadUsers","viewModel","setViewModel","updateDuplicates","users","duplicateSets","invalidUsers","hasValidatedUsers","existingUsersHash","hasExistingUsers","length","existingUserToAdd","newUsers","filter","u","setUsers","setInvalidUsers","setExistingUsers","existingUsers","updateUser","updatedUser","updatedUsers","map","user","deleteUsers","deletedUsers","userIdHash","prev","curr","FormCheckbox","props","label","checkboxLabelClassName","checkboxLabelFontWeight","className","fieldProps","Form","FieldWrapper","htmlFor","id","checkboxAppLink","checkboxAppLinkText","AppLink","appLink","CharacterCounter","values","field","ObjectHelper","fieldName","limit","namespace","children","showLoadingSpinner","type","setType","resolvedChildren","FunctionHelper","f","Spinner","animation","size","containerClassName","disabled","SvgContainer","svgName","onClick","FormField","showCharacterCounter","showRequiredStar","infoTooltip","infoTooltipPlacement","infoText","formSize","showOptionalLabel","formGroupClassname","errors","touched","disabledOnChange","_props","onChange","fieldWrapperProps","FormHelper","name","as","title","tooltipPlacement","tooltipSpanHack","Text","phrase","maxLength","description","errorMessage","role","defaultProps","autoComplete","FormWrapper","castInitialValues","castValuesOnSubmit","initialValues","onSubmit","formikProps","formattedInitialValues","validationSchema","cast","omitChildValues","child","forEach","key","hasOwnProperty","omitNullInitialValues","initialStatus","allowInitialSubmit","enableReinitialize","setSubmitting","resetForm","setFieldError","formattedData","options","reset","entries","value","useFormikContextWrapper","loadedScripts","useScript","src","shouldLoad","loaded","setLoaded","script","document","createElement","async","onload","window","setTimeout","body","appendChild","removeChild","getCustomFormControlClassName","attribute","additionalClassName","getTypeSize","SecuritySettingsRequests","getCustomerSecuritySettings","customerId","success","error","url","normalize","setCustomerSecuritySettings","data","invalidationKeys","ExampleUserSpreadsheet","validYearGroups","UserHelper","yearGroups","maleYearGroup","ArrayHelper","femaleYearGroupIndex","Math","floor","femaleYearGroup","cellPadding","userType","UserGroup","showPasswordColumn","GoogleSheetsIcon","width","height","viewBox","d","x1","y1","x2","y2","stopColor","stopOpacity","offset","cx","cy","fx","fy","r","gradientTransform","stroke","strokeWidth","fill","fillRule","transform","xlinkHref","mask","points","fillOpacity","GoogleSheetsError","this","text","buttons","LanguageService","getPhrase","GoogleSheetsSelectorForm","spreadsheetSheets","setFieldValue","spreadsheetId","e","onSelectSpreadsheet","target","spreadsheets","spreadsheet","spreadsheetRange","sheetName","PopupButtons","onClickCancel","variant","GoogleSheetsSelectorValidation","shape","required","initialData","GOOGLE_CONSENT_REQUEST","apiKey","clientId","discoveryDocs","scope","GoogleSheetsSelector","setSpreadsheets","spreadsheetRanges","setSpreadsheetRanges","googleAuthInstance","googleSignInListener","gapiLoaded","signIn","current","currentUser","get","hasGrantedScopes","onError","loadSpreadsheets","gapi","client","drive","files","list","q","spreadsheetResponse","result","Array","isArray","message","load","init","auth2","getAuthInstance","googleUser","isSignedIn","listen","grant","then","remove","sheets","range","response","ranges","sheet","properties","PopupLoadingSpinner","namespaces","UploadUserSpreadsheet","showGoogleSheetsSelector","setShowGoogleSheetsSelector","minPasswordLength","UserManagerHelper","passwordPolicy","UserRole","User","BulkUserUploadHelper","clone","headings","shift","countryCode","templateLink","isValid","UserManagerConstants","SpreadsheetTooLargeError","InvalidSpreadsheetError","download","href","minLength","username","BulkUploadFileSelect","UserUploadTemplates","CountryCode","C","BulkUserUploadPopupView","UserRequests","UserManagerRequests","dataLoaded","toLowerCase","UserManagerClient","Popup","closePopup","dialogClassName","application","action","params"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"scripts/3143-a754e306a5-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/user-manager/context/UserManagerClientContext.ts","file:///app/packages/libs/shared/src/apps/user-manager/hooks/useBulkUploadUsers.ts","file:///app/packages/libs/shared/src/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/hooks/useScript.ts","file:///app/packages/libs/shared/src/utils/FormHelper.ts","file:///app/packages/projects/lite/src/apps/settings/flight-requests/SecuritySettingsRequests.ts","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-upload/example-user-spreadsheet/example-user-spreadsheet.scss","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-upload/example-user-spreadsheet/ExampleUserSpreadsheet.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/google-sheets-selector/GoogleSheetsIcon.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/google-sheets-selector/GoogleSheetsError.ts","file:///app/packages/libs/shared/src/apps/user-manager/components/google-sheets-selector/GoogleSheetsSelectorForm.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/google-sheets-selector/GoogleSheetsSelectorValidation.ts","file:///app/packages/libs/shared/src/apps/user-manager/components/google-sheets-selector/GoogleSheetsSelector.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-upload/upload-user-spreadsheet/UploadUserSpreadsheet.tsx","file:///app/packages/projects/lite/src/apps/user-manager/constants/UserUploadTemplates.ts","file:///app/packages/projects/lite/src/apps/user-manager/views/bulk-user-upload/popup/bulk-user-upload-popup.scss","file:///app/packages/projects/lite/src/apps/user-manager/views/bulk-user-upload/popup/BulkUserUploadPopupView.tsx"],"sourcesContent":["import React from 'react';\n\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\n\nexport const UserManagerClientContext = React.createContext<UserManagerClient>(null);","import { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\n\nimport { EditUserRequest } from '../interfaces';\nimport { BulkUserUploadViewModel, UserHash } from '../interfaces/viewmodels/BulkUserUploadViewModel';\nimport { UserManagerHelper } from '../utils/UserManagerHelper';\n\nfunction updateUserHash(userHash: UserHash, updatedUserIdsHash: HashObject<boolean>): UserHash {\n const updatedUsers = Object.keys(userHash || {}).reduce((updatedObj: UserHash, lookupId) => {\n if (!updatedUserIdsHash[lookupId])\n updatedObj[lookupId] = userHash[lookupId];\n return updatedObj;\n }, {});\n\n return updatedUsers;\n}\n\nexport const useBulkUploadUsers = () => {\n const [ viewModel, setViewModel ] = useViewModel<BulkUserUploadViewModel>(SharedViewModelKeys.BULK_USER_UPLOAD);\n\n function initializeUsers(users?: EditUserRequest[]): void {\n setViewModel({\n users,\n invalidUsers: null,\n existingUsersHash: null\n });\n\n updateDuplicates(users);\n }\n\n function updateUser(updatedUser: EditUserRequest): void {\n const updatedUsers = viewModel.users.map(user => {\n if (user.lookupId !== updatedUser.lookupId)\n return user;\n\n return updatedUser;\n });\n\n setViewModel({\n users: updatedUsers,\n invalidUsers: updateUserHash(viewModel?.invalidUsers, { [updatedUser.lookupId]: true }),\n existingUsersHash: viewModel?.existingUsersHash\n });\n\n updateDuplicates(updatedUsers);\n }\n\n function deleteUsers(deletedUsers: string[]): void {\n const userIdHash = deletedUsers.reduce((prev: HashObject, curr) => {\n prev[curr] = true;\n return prev;\n }, {});\n\n const updatedUsers = viewModel.users.filter(user => !userIdHash[user.lookupId]);\n\n setViewModel({\n users: updatedUsers,\n invalidUsers: updateUserHash(viewModel?.invalidUsers, userIdHash),\n existingUsersHash: updateUserHash(viewModel?.existingUsersHash, userIdHash),\n existingUserToAdd: viewModel?.existingUserToAdd?.filter(u => !!viewModel?.existingUsersHash[u.lookupId])\n });\n\n updateDuplicates(updatedUsers);\n }\n\n function updateDuplicates(users?: EditUserRequest[]): void {\n const duplicateSets = UserManagerHelper.getNewDuplicates(users);\n setViewModel('duplicateSets', duplicateSets);\n }\n\n return {\n users: viewModel?.users,\n invalidUsers: viewModel?.invalidUsers,\n hasValidatedUsers: !!viewModel?.invalidUsers,\n existingUsersHash: viewModel?.existingUsersHash || {},\n hasExistingUsers: !!Object.keys(viewModel?.existingUsersHash || {}).length,\n existingUserToAdd: viewModel?.existingUserToAdd,\n duplicateSets: viewModel?.duplicateSets,\n newUsers: viewModel?.users?.filter(u => !viewModel?.existingUsersHash?.[u.lookupId]) || [],\n\n setUsers: initializeUsers,\n setInvalidUsers: (invalidUsers: UserHash) => setViewModel('invalidUsers', invalidUsers),\n setExistingUsers: (existingUsers: UserHash) => setViewModel('existingUsersHash', existingUsers),\n updateUser,\n deleteUsers\n };\n};","import * 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> </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}\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 ...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'>\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'> <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 React from 'react';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\n/**\n * We only need to load any script once.\n */\nconst loadedScripts: HashObject<boolean> = {};\n\nexport function useScript(src: string, shouldLoad: boolean): boolean {\n const [ loaded, setLoaded ] = React.useState(false);\n\n React.useEffect(() => {\n if (!src || !shouldLoad || loadedScripts[src])\n return;\n\n const script = document.createElement('script');\n\n script.src = src;\n script.async = true;\n script.onload = () => {\n loadedScripts[src] = true;\n /**\n * Onload event is fired before script content is parsed.\n * By calling set timeout, we ensure setLoaded is called after\n * the script is parsed in the event loop.\n */\n window.setTimeout(() => setLoaded(true), 0);\n };\n\n document.body.appendChild(script);\n\n return () => {\n script.onload = null;\n document.body.removeChild(script);\n };\n }, [ src, shouldLoad ]);\n\n return loadedScripts[src] || loaded;\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};","// extracted by mini-css-extract-plugin\nexport default {\"cell\":\"PZci6\"};","import React from 'react';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { YearGroup } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from './example-user-spreadsheet.scss';\n\ninterface ExampleUserSpreadsheetProps {\n userType: UserGroup;\n yearGroups: YearGroup[];\n showPasswordColumn?: boolean;\n}\n\n/**\n * In this example spreadsheet:\n * - We intentionally leave some fields blank to demonstrate that they are not required.\n * - We pick the year level text from the customers year level set as it can differ based on region.\n * - Year level column only shows for student upload\n * - The email cell in the female example row is empty for student in primary. All other contexts require email.\n */\nexport function ExampleUserSpreadsheet(props: ExampleUserSpreadsheetProps): JSX.Element {\n const validYearGroups = UserHelper.getValidYearGroups(props.yearGroups);\n const maleYearGroup: YearGroup = ArrayHelper.first(validYearGroups);\n\n const femaleYearGroupIndex = Math.floor((validYearGroups.length - 1) / 2);\n const femaleYearGroup = props.yearGroups[femaleYearGroupIndex];\n\n return (\n <LanguageNamespaceContext.Provider value='userManager.exampleUserSpreadsheet'>\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 <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='c' /></td>\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='d' /></td>\n {props.userType === UserGroup.Learner && (\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='e' /></td>\n )}\n {props.showPasswordColumn && (\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='f' /></td>\n )}\n </tr>\n\n <tr className='fw-semibold'>\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='firstName' /></td>\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='lastName' /></td>\n {props.userType === UserGroup.Learner && (\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='yearGroup' /></td>\n )}\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 {props.showPasswordColumn && (\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='password' /></td>\n )}\n </tr>\n\n <tr>\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='maleFirstName' /></td>\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='maleLastName' /></td>\n {props.userType === UserGroup.Learner && (\n <td className={`text-nowrap border border-dark ${styles.cell}`}>{maleYearGroup.name}</td>\n )}\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='maleEmail' /></td>\n <td className={`text-nowrap border border-dark ${styles.cell}`}></td>\n {props.showPasswordColumn && (\n <td className={`text-nowrap border border-dark ${styles.cell}`}></td>\n )}\n </tr>\n\n <tr>\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='femaleFirstName' /></td>\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='femaleLastName' /></td>\n {props.userType === UserGroup.Learner && (\n <td className={`text-nowrap border border-dark ${styles.cell}`}>{femaleYearGroup.name}</td>\n )}\n <td className={`text-nowrap border border-dark ${styles.cell}`}>\n {(props.userType === UserGroup.Staff)\n ? <Text phrase='femaleEmail' />\n : ''\n }\n </td>\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='femaleUsername' /></td>\n {props.showPasswordColumn && (\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='passwordExample' /></td>\n )}\n </tr>\n </tbody>\n </table>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\n\nexport function GoogleSheetsIcon(): JSX.Element {\n return (\n <div className='d-inline-block svg-container'>\n <svg width='49px' height='67px' viewBox='0 0 49 67'>\n <defs>\n <path d='M29.5833333,0 L4.4375,0 C1.996875,0 0,1.996875 0,4.4375 L0,60.6458333 C0,63.0864583 1.996875,65.0833333 4.4375,65.0833333 L42.8958333,65.0833333 C45.3364583,65.0833333 47.3333333,63.0864583 47.3333333,60.6458333 L47.3333333,17.75 L29.5833333,0 Z' id='path-1'></path>\n <path d='M29.5833333,0 L4.4375,0 C1.996875,0 0,1.996875 0,4.4375 L0,60.6458333 C0,63.0864583 1.996875,65.0833333 4.4375,65.0833333 L42.8958333,65.0833333 C45.3364583,65.0833333 47.3333333,63.0864583 47.3333333,60.6458333 L47.3333333,17.75 L29.5833333,0 Z' id='path-3'></path>\n <path d='M29.5833333,0 L4.4375,0 C1.996875,0 0,1.996875 0,4.4375 L0,60.6458333 C0,63.0864583 1.996875,65.0833333 4.4375,65.0833333 L42.8958333,65.0833333 C45.3364583,65.0833333 47.3333333,63.0864583 47.3333333,60.6458333 L47.3333333,17.75 L29.5833333,0 Z' id='path-5'></path>\n <linearGradient x1='50.0053945%' y1='8.58610612%' x2='50.0053945%' y2='100.013939%' id='linearGradient-7'>\n <stop stopColor='#263238' stopOpacity='0.2' offset='0%'></stop>\n <stop stopColor='#263238' stopOpacity='0.02' offset='100%'></stop>\n </linearGradient>\n <path d='M29.5833333,0 L4.4375,0 C1.996875,0 0,1.996875 0,4.4375 L0,60.6458333 C0,63.0864583 1.996875,65.0833333 4.4375,65.0833333 L42.8958333,65.0833333 C45.3364583,65.0833333 47.3333333,63.0864583 47.3333333,60.6458333 L47.3333333,17.75 L29.5833333,0 Z' id='path-8'></path>\n <path d='M29.5833333,0 L4.4375,0 C1.996875,0 0,1.996875 0,4.4375 L0,60.6458333 C0,63.0864583 1.996875,65.0833333 4.4375,65.0833333 L42.8958333,65.0833333 C45.3364583,65.0833333 47.3333333,63.0864583 47.3333333,60.6458333 L47.3333333,17.75 L29.5833333,0 Z' id='path-10'></path>\n <path d='M29.5833333,0 L4.4375,0 C1.996875,0 0,1.996875 0,4.4375 L0,60.6458333 C0,63.0864583 1.996875,65.0833333 4.4375,65.0833333 L42.8958333,65.0833333 C45.3364583,65.0833333 47.3333333,63.0864583 47.3333333,60.6458333 L47.3333333,17.75 L29.5833333,0 Z' id='path-12'></path>\n <path d='M29.5833333,0 L4.4375,0 C1.996875,0 0,1.996875 0,4.4375 L0,60.6458333 C0,63.0864583 1.996875,65.0833333 4.4375,65.0833333 L42.8958333,65.0833333 C45.3364583,65.0833333 47.3333333,63.0864583 47.3333333,60.6458333 L47.3333333,17.75 L29.5833333,0 Z' id='path-14'></path>\n <radialGradient cx='3.16804688%' cy='2.71744318%' fx='3.16804688%' fy='2.71744318%' r='161.248516%' gradientTransform='translate(0.031680,0.027174),scale(1.000000,0.727273),translate(-0.031680,-0.027174)' id='radialGradient-16'>\n <stop stopColor='#FFFFFF' stopOpacity='0.1' offset='0%'></stop>\n <stop stopColor='#FFFFFF' stopOpacity='0' offset='100%'></stop>\n </radialGradient>\n </defs>\n <g id='Page-1' stroke='none' strokeWidth='1' fill='none' fillRule='evenodd'>\n <g id='Consumer-Apps-Sheets-Large-VD-R8-' transform='translate(-451.000000, -451.000000)'>\n <g id='Hero' transform='translate(0.000000, 63.000000)'>\n <g id='Personal' transform='translate(277.000000, 299.000000)'>\n <g id='Sheets-icon' transform='translate(174.833333, 89.958333)'>\n <g id='Group'>\n <g id='Clipped'>\n <mask id='mask-2' fill='white'>\n <use xlinkHref='#path-1'></use>\n </mask>\n <g id='SVGID_1_'></g>\n <path d='M29.5833333,0 L4.4375,0 C1.996875,0 0,1.996875 0,4.4375 L0,60.6458333 C0,63.0864583 1.996875,65.0833333 4.4375,65.0833333 L42.8958333,65.0833333 C45.3364583,65.0833333 47.3333333,63.0864583 47.3333333,60.6458333 L47.3333333,17.75 L36.9791667,10.3541667 L29.5833333,0 Z' id='Path' fill='#0F9D58' fillRule='nonzero' mask='url(#mask-2)'></path>\n </g>\n <g id='Clipped'>\n <mask id='mask-4' fill='white'>\n <use xlinkHref='#path-3'></use>\n </mask>\n <g id='SVGID_1_'></g>\n <path d='M11.8333333,31.8020833 L11.8333333,53.25 L35.5,53.25 L35.5,31.8020833 L11.8333333,31.8020833 Z M22.1875,50.2916667 L14.7916667,50.2916667 L14.7916667,46.59375 L22.1875,46.59375 L22.1875,50.2916667 Z M22.1875,44.375 L14.7916667,44.375 L14.7916667,40.6770833 L22.1875,40.6770833 L22.1875,44.375 Z M22.1875,38.4583333 L14.7916667,38.4583333 L14.7916667,34.7604167 L22.1875,34.7604167 L22.1875,38.4583333 Z M32.5416667,50.2916667 L25.1458333,50.2916667 L25.1458333,46.59375 L32.5416667,46.59375 L32.5416667,50.2916667 Z M32.5416667,44.375 L25.1458333,44.375 L25.1458333,40.6770833 L32.5416667,40.6770833 L32.5416667,44.375 Z M32.5416667,38.4583333 L25.1458333,38.4583333 L25.1458333,34.7604167 L32.5416667,34.7604167 L32.5416667,38.4583333 Z' id='Shape' fill='#F1F1F1' fillRule='nonzero' mask='url(#mask-4)'></path>\n </g>\n <g id='Clipped'>\n <mask id='mask-6' fill='white'>\n <use xlinkHref='#path-5'></use>\n </mask>\n <g id='SVGID_1_'></g>\n <polygon id='Path' fill='url(#linearGradient-7)' fillRule='nonzero' mask='url(#mask-6)' points='30.8813021 16.4520313 47.3333333 32.9003646 47.3333333 17.75'></polygon>\n </g>\n <g id='Clipped'>\n <mask id='mask-9' fill='white'>\n <use xlinkHref='#path-8'></use>\n </mask>\n <g id='SVGID_1_'></g>\n <g id='Group' mask='url(#mask-9)'>\n <g transform='translate(26.625000, -2.958333)'>\n <path d='M2.95833333,2.95833333 L2.95833333,16.2708333 C2.95833333,18.7225521 4.94411458,20.7083333 7.39583333,20.7083333 L20.7083333,20.7083333 L2.95833333,2.95833333 Z' id='Path' fill='#87CEAC' fillRule='nonzero'></path>\n </g>\n </g>\n </g>\n <g id='Clipped'>\n <mask id='mask-11' fill='white'>\n <use xlinkHref='#path-10'></use>\n </mask>\n <g id='SVGID_1_'></g>\n <path d='M4.4375,0 C1.996875,0 0,1.996875 0,4.4375 L0,4.80729167 C0,2.36666667 1.996875,0.369791667 4.4375,0.369791667 L29.5833333,0.369791667 L29.5833333,0 L4.4375,0 Z' id='Path' fillOpacity='0.2' fill='#FFFFFF' fillRule='nonzero' mask='url(#mask-11)'></path>\n </g>\n <g id='Clipped'>\n <mask id='mask-13' fill='white'>\n <use xlinkHref='#path-12'></use>\n </mask>\n <g id='SVGID_1_'></g>\n <path d='M42.8958333,64.7135417 L4.4375,64.7135417 C1.996875,64.7135417 0,62.7166667 0,60.2760417 L0,60.6458333 C0,63.0864583 1.996875,65.0833333 4.4375,65.0833333 L42.8958333,65.0833333 C45.3364583,65.0833333 47.3333333,63.0864583 47.3333333,60.6458333 L47.3333333,60.2760417 C47.3333333,62.7166667 45.3364583,64.7135417 42.8958333,64.7135417 Z' id='Path' fillOpacity='0.2' fill='#263238' fillRule='nonzero' mask='url(#mask-13)'></path>\n </g>\n <g id='Clipped'>\n <mask id='mask-15' fill='white'>\n <use xlinkHref='#path-14'></use>\n </mask>\n <g id='SVGID_1_'></g>\n <path d='M34.0208333,17.75 C31.5691146,17.75 29.5833333,15.7642188 29.5833333,13.3125 L29.5833333,13.6822917 C29.5833333,16.1340104 31.5691146,18.1197917 34.0208333,18.1197917 L47.3333333,18.1197917 L47.3333333,17.75 L34.0208333,17.75 Z' id='Path' fillOpacity='0.1' fill='#263238' fillRule='nonzero' mask='url(#mask-15)'></path>\n </g>\n </g>\n <path d='M29.5833333,0 L4.4375,0 C1.996875,0 0,1.996875 0,4.4375 L0,60.6458333 C0,63.0864583 1.996875,65.0833333 4.4375,65.0833333 L42.8958333,65.0833333 C45.3364583,65.0833333 47.3333333,63.0864583 47.3333333,60.6458333 L47.3333333,17.75 L29.5833333,0 Z' id='Path' fill='url(#radialGradient-16)' fillRule='nonzero'></path>\n </g>\n </g>\n </g>\n </g>\n </g>\n </svg>\n </div>\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { DialogError } from 'libs/shared/errors/primitives/DialogError';\nimport { DialogOptions } from 'libs/shared/interfaces';\n\nconst lang = 'userManager.googleSheetsSelector';\n\nexport class GoogleSheetsError extends DialogError {\n private title: string;\n private body: string;\n\n constructor(title: string, body: string) {\n super(title);\n\n this.title = title;\n this.body = body;\n }\n\n // @ts-ignore\n public get name(): string {\n return 'GoogleSheetsError';\n }\n\n // @ts-ignore\n public get dialogOptions(): DialogOptions {\n return {\n title: this.title,\n text: this.body,\n buttons: [{\n text: LanguageService.getPhrase(lang, 'okay'),\n className: 'btn btn-dark',\n success: true\n }]\n };\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 { FormField } 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';\n\nimport { SpreadsheetData } from './GoogleSheetsSelector';\n\nconst namespace = 'userManager.googleSheetsSelector';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface GoogleSheetsSelectorFormProps {\n onClickCancel: () => void;\n onSelectSpreadsheet: (spreadsheetId: string) => Promise<any>;\n spreadsheets: any[];\n spreadsheetSheets: string[];\n}\n\nexport function GoogleSheetsSelectorForm(props: GoogleSheetsSelectorFormProps): JSX.Element {\n const formikProps = useFormikContextWrapper<SpreadsheetData>();\n\n /**\n * Whenever the list of available sheets on the selected spreadsheet changes,\n * select the first sheet by default IF it is the only sheet available.\n */\n React.useEffect(() => {\n if (!props.spreadsheetSheets)\n return;\n\n if (props.spreadsheetSheets.length === 1)\n formikProps.setFieldValue('spreadsheetRange', ArrayHelper.first(props.spreadsheetSheets));\n }, [props.spreadsheetSheets]);\n\n return (\n <Form>\n <FormField\n as='select'\n label={getPhrase('spreadsheetId')}\n name='spreadsheetId'\n value={formikProps.values.spreadsheetId}\n onChange={(e: React.ChangeEvent<HTMLSelectElement>) => {\n props.onSelectSpreadsheet(e.target.value);\n formikProps.setFieldValue('spreadsheetId', e.target.value);\n }}\n >\n <option value=''>{LanguageService.getPhrase(namespace, 'selectSpreadsheetId')}</option>\n {props.spreadsheets.map(spreadsheet =>\n <option key={spreadsheet.id} value={spreadsheet.id}>{spreadsheet.name}</option>)}\n </FormField>\n\n <FormField\n as='select'\n label={getPhrase('spreadsheetRange')}\n name='spreadsheetRange'\n value={formikProps.values.spreadsheetRange}\n onChange={(e: React.ChangeEvent<HTMLSelectElement>) => formikProps.setFieldValue('spreadsheetRange', e.target.value)}\n disabled={!props.spreadsheetSheets?.length}\n >\n <option value=''>{LanguageService.getPhrase(namespace, 'selectSpreadsheetRange')}</option>\n {props.spreadsheetSheets.map(sheetName =>\n <option key={sheetName} value={sheetName}>{sheetName}</option>)}\n </FormField>\n\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.onClickCancel} />\n <PopupButtons.Submit variant='dark' text={getPhrase('upload')} />\n </PopupButtons>\n </Form>\n );\n}","import { object, string } from 'yup';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst namespace = 'userManager.googleSheetsSelector';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const GoogleSheetsSelectorValidation = object().shape({\n spreadsheetId: string()\n .required(() => getPhrase('spreadsheetIdRequired'))\n .default(''),\n spreadsheetRange: string()\n .required(() => getPhrase('spreadsheetRangeRequired'))\n .default('')\n});","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { PopupLoadingSpinner } from 'libs/shared/components/popup/PopupLoadingSpinner';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useScript } from 'libs/shared/hooks/useScript';\n\nimport { GoogleSheetsError } from './GoogleSheetsError';\nimport { GoogleSheetsSelectorForm } from './GoogleSheetsSelectorForm';\nimport { GoogleSheetsSelectorValidation } from './GoogleSheetsSelectorValidation';\n\nconst namespace = 'userManager.googleSheetsSelector';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\n// `gapi` typings\ninterface Spreadsheet {\n id: string;\n name: string;\n}\n\nexport interface SpreadsheetData {\n spreadsheetId: string;\n spreadsheetRange?: string;\n}\n\nconst initialData = {\n spreadsheetId: '',\n spreadsheetRange: ''\n};\n\nconst GOOGLE_CONSENT_REQUEST = {\n apiKey: 'AIzaSyBqN38T3KYOCte1NGMv2i2Izsr3E5o_uyU',\n clientId: '963556877348-d70e06codundropau356uen98pbq3j7j.apps.googleusercontent.com',\n discoveryDocs: [\n 'https://www.googleapis.com/discovery/v1/apis/drive/v3/rest',\n 'https://sheets.googleapis.com/$discovery/rest?version=v4'\n ],\n scope: 'https://www.googleapis.com/auth/drive.readonly'\n};\n\ninterface GoogleSheetsSelectorProps {\n onSelectSpreadsheet: (data: any[]) => void;\n onClickCancel: () => void;\n}\n\nexport function GoogleSheetsSelector(props: GoogleSheetsSelectorProps): JSX.Element {\n const [ spreadsheets, setSpreadsheets ] = React.useState<Spreadsheet[]>([]);\n const [ spreadsheetRanges, setSpreadsheetRanges ] = React.useState<string[]>([]);\n\n const googleAuthInstance = React.useRef<gapi.AuthInstance>(null);\n const googleSignInListener = React.useRef<gapi.AuthSignInListener>(null);\n\n const gapiLoaded = useScript('https://apis.google.com/js/platform.js', true);\n\n React.useEffect(connectToGoogleApi, [gapiLoaded]);\n\n React.useEffect(() => {\n if (!googleSignInListener.current || !gapiLoaded)\n return;\n\n // Unbind google signin event listener\n return () => {\n googleSignInListener.current?.remove();\n };\n }, [googleSignInListener.current]);\n\n function connectToGoogleApi(): void {\n // Connect to the google auth client\n gapi.load('client:auth2', async () => {\n try {\n await gapi.client.init(GOOGLE_CONSENT_REQUEST);\n\n googleAuthInstance.current = gapi.auth2.getAuthInstance();\n\n const googleUser = googleAuthInstance.current.currentUser.get();\n\n // If the user has not previously signed into their google account with us, sign them in\n if (!googleUser.isSignedIn()) {\n signIn();\n return;\n }\n\n // Listen on their authentication state. If they sign out at any point, throw an error.\n googleSignInListener.current = googleAuthInstance.current.isSignedIn.listen(isSignedIn => {\n if (isSignedIn)\n return;\n\n onError(getPhrase('authErrorTitle'), getPhrase('authErrorMessage'));\n });\n\n // If the user is signed in but has not granted us the Google Drive readonly scope, request access\n if (!googleUser.hasGrantedScopes(GOOGLE_CONSENT_REQUEST.scope)) {\n googleUser.grant(GOOGLE_CONSENT_REQUEST)\n .then(loadSpreadsheets)\n .catch(() => onError(getPhrase('rejectScopeTitle'), getPhrase('rejectScopeMessage')));\n\n return;\n }\n\n // If the user has signed in and has granted us the scopes we need, fetch their spreadsheets.\n loadSpreadsheets();\n } catch {\n onError(getPhrase('authErrorTitle'), getPhrase('authErrorMessage'));\n }\n });\n }\n\n async function signIn(): Promise<void> {\n try {\n await googleAuthInstance.current.signIn();\n const googleUser = googleAuthInstance.current.currentUser.get();\n\n // If the user signs in but doesn't grant the scopes we need, throw an error.\n if (!googleUser.hasGrantedScopes(GOOGLE_CONSENT_REQUEST.scope)) {\n onError(getPhrase('rejectScopeTitle'), getPhrase('rejectScopeMessage'));\n return;\n }\n\n // If the user signs in and grants the scopes we need, fetch their spreadsheets.\n loadSpreadsheets();\n } catch {\n onError(getPhrase('authErrorTitle'), getPhrase('authErrorMessage'));\n props.onClickCancel();\n }\n }\n\n async function loadSpreadsheets(): Promise<void> {\n try {\n // Fetch all google sheets in the user's google drive\n const spreadsheetResponse = await gapi.client.drive.files.list({\n q: `mimeType='application/vnd.google-apps.spreadsheet'`\n });\n\n const spreadsheets = spreadsheetResponse?.result?.files;\n\n if (!Array.isArray(spreadsheets)) {\n onError(getPhrase('spreadsheetFetchErrorTitle'), getPhrase('spreadsheetFetchErrorMessage'));\n return;\n }\n\n if (!spreadsheets.length) {\n onError(getPhrase('noSpreadsheetsErrorTitle'), getPhrase('noSpreadsheetsErrorMessage'));\n return;\n }\n\n setSpreadsheets(spreadsheets);\n } catch {\n onError(getPhrase('spreadsheetFetchErrorTitle'), getPhrase('spreadsheetFetchErrorMessage'));\n }\n }\n\n /**\n * When the user selects a spreadsheet, load all of the available\n * sheets in that spreadsheet.\n */\n async function getSpreadsheetRanges(spreadsheetId: string): Promise<void> {\n if (!spreadsheetId) {\n setSpreadsheetRanges([]);\n return;\n }\n\n try {\n const response = await gapi.client.sheets.spreadsheets.get({ spreadsheetId });\n\n const ranges = response?.result?.sheets?.map((sheet: any) => sheet?.properties?.title);\n\n if (!ranges?.length) {\n onError(getPhrase('spreadsheetFetchErrorTitle'), getPhrase('spreadsheetFetchErrorMessage'));\n return;\n }\n\n setSpreadsheetRanges(ranges);\n } catch {\n onError(getPhrase('spreadsheetFetchErrorTitle'), getPhrase('spreadsheetFetchErrorMessage'));\n }\n }\n\n async function onClickConfirm(data: SpreadsheetData): Promise<void> {\n const { spreadsheetId, spreadsheetRange } = data;\n\n if (!spreadsheetId || !spreadsheetRange) {\n onError(getPhrase('spreadsheetConfirmErrorTitle'), getPhrase('spreadsheetConfirmErrorMessage'));\n return;\n }\n\n try {\n // Get all of the rows in the spreadsheet\n const spreadsheet = await gapi.client.sheets.spreadsheets.values.get({\n spreadsheetId,\n range: spreadsheetRange\n });\n\n if (googleSignInListener.current?.remove)\n googleSignInListener.current.remove();\n\n props.onSelectSpreadsheet(spreadsheet.result.values);\n } catch {\n onError(getPhrase('spreadsheetConfirmErrorTitle'), getPhrase('spreadsheetConfirmErrorMessage'));\n }\n }\n\n function onError(title: string, message: string): void {\n Core.ErrorHelper.throw(new GoogleSheetsError(title, message));\n }\n\n if (!spreadsheets.length) {\n return (\n <>\n <PopupLoadingSpinner />\n <p className='text-center mt-n4 pb-3'><Text namespace={namespace} phrase='authenticating' /></p>\n </>\n );\n }\n\n return (\n <FormWrapper<SpreadsheetData>\n initialValues={initialData}\n validationSchema={GoogleSheetsSelectorValidation}\n onSubmit={onClickConfirm}\n >\n <GoogleSheetsSelectorForm\n onClickCancel={props.onClickCancel}\n onSelectSpreadsheet={getSpreadsheetRanges}\n spreadsheets={spreadsheets}\n spreadsheetSheets={spreadsheetRanges}\n />\n </FormWrapper>\n );\n}","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 { ExampleUserSpreadsheet } from 'libs/shared/apps/user-manager/components/bulk-upload/example-user-spreadsheet/ExampleUserSpreadsheet';\nimport { GoogleSheetsIcon } from 'libs/shared/apps/user-manager/components/google-sheets-selector/GoogleSheetsIcon';\nimport { GoogleSheetsSelector } from 'libs/shared/apps/user-manager/components/google-sheets-selector/GoogleSheetsSelector';\nimport { UserManagerConstants } from 'libs/shared/apps/user-manager/constants/UserManagerConstants';\nimport { InvalidSpreadsheetError } from 'libs/shared/apps/user-manager/errors/invalid-spreadsheet/InvalidSpreadsheetError';\nimport { SpreadsheetTooLargeError } from 'libs/shared/apps/user-manager/errors/spreadsheet-too-large/SpreadsheetTooLargeError';\nimport { EditUserRequest } from 'libs/shared/apps/user-manager/interfaces';\nimport { SecuritySettingsResponse } from 'libs/shared/apps/user-manager/interfaces/SecuritySettingsResponse';\nimport { BulkUserUploadHelper } from 'libs/shared/apps/user-manager/utils/BulkUserUploadHelper';\nimport { UserManagerHelper } from 'libs/shared/apps/user-manager/utils/UserManagerHelper';\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 { UserRole } from 'libs/shared/enums/UserRole';\nimport { CurrentUser, YearGroup } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespaces = {\n [UserGroup.Learner]: 'userManager.uploadStudentSpreadsheet',\n [UserGroup.Staff]: 'userManager.uploadStaffSpreadsheet',\n [UserGroup.Unknown]: ''\n};\n\ninterface UploadUserSpreadsheetProps {\n onSelectSpreadsheet: (users: EditUserRequest[]) => void;\n onClickCancel: () => void;\n userType: UserGroup;\n currentUser: CurrentUser;\n yearGroups: YearGroup[];\n templateLink: string;\n showPasswordColumn?: boolean;\n passwordPolicy?: SecuritySettingsResponse;\n}\n\nexport function UploadUserSpreadsheet(props: UploadUserSpreadsheetProps): JSX.Element {\n // eslint-disable-next-line\n const [ showGoogleSheetsSelector, setShowGoogleSheetsSelector ] = React.useState(false);\n\n const namespace = namespaces[props.userType];\n\n const minPasswordLength = UserManagerHelper.getMinimumPasswordLength(\n props.passwordPolicy,\n props.userType,\n UserRole.User\n );\n\n function onSelectSpreadsheet(data: string[][]): void {\n const isEmpty = BulkUserUploadHelper.validateEmptySpreadsheetData(data);\n\n if (isEmpty)\n return;\n\n const clone = [...data];\n const headings = clone.shift();\n\n const { isValid, errorMessage } = props.userType === UserGroup.Learner\n ? BulkUserUploadHelper.validateUploadedStudentSpreadsheet(\n headings,\n props.currentUser?.countryCode,\n props.templateLink\n )\n : BulkUserUploadHelper.validateUploadedStaffSpreadsheet(\n headings,\n props.templateLink\n );\n\n if (!isValid) {\n Core.ErrorHelper.throw(new InvalidSpreadsheetError(errorMessage));\n return;\n }\n\n const users = BulkUserUploadHelper.buildUsersFromSpreadsheet(\n clone,\n props.userType,\n props.currentUser.customerId,\n props.yearGroups\n );\n\n if (users.length > UserManagerConstants.MAX_USER_SPREADSHEET_ROWS) {\n Core.ErrorHelper.throw(new SpreadsheetTooLargeError(UserManagerConstants.MAX_USER_SPREADSHEET_ROWS));\n return;\n }\n\n props.onSelectSpreadsheet(users);\n }\n\n if (showGoogleSheetsSelector) {\n return (\n <GoogleSheetsSelector\n onSelectSpreadsheet={onSelectSpreadsheet}\n onClickCancel={props.onClickCancel}\n />\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 {props.userType === UserGroup.Learner ? (\n <ul>\n <li><Text phrase='requiredFields' /></li>\n <li><Text phrase='usernamesBlank' /></li>\n <li><Text phrase='passwordsProvided' options={{ minLength: minPasswordLength }}/></li>\n <li><Text phrase='emailsProvided' /></li>\n </ul>\n ) : (\n <p className='ms-n1 ps-3'>\n <Text phrase='addUsersInfo' />\n </p>\n )}\n <div className='mx-n1 px-3'>\n <ExampleUserSpreadsheet\n userType={props.userType}\n yearGroups={props.yearGroups}\n showPasswordColumn={props.showPasswordColumn}\n />\n </div>\n </div>\n\n {/* Step 3 */}\n <div>\n <div className='h6'><Text phrase='uploadHeading' /></div>\n <div className='d-inline-block ms-n1 ps-3 mt-1'>\n {/* TODO: Make available to online and curator once it's approved for production. */}\n {!!(props.currentUser.username === 'joshua.taylor@clickview.com.au') && (\n <div className='d-inline-block me-2'>\n <button\n className='btn btn-outline-dark d-flex align-items-center justify-content-center ps-1 mb-2 w-100'\n onClick={() => setShowGoogleSheetsSelector(true)}\n >\n <div className='me-1'>\n <GoogleSheetsIcon />\n </div>\n <Text phrase='googleSheets' />\n </button>\n </div>\n )}\n\n <div className='d-inline-block'>\n <BulkUploadFileSelect onSelectSpreadsheet={onSelectSpreadsheet} />\n </div>\n </div>\n </div>\n </LanguageNamespaceContext.Provider>\n );\n}","import { CountryCode } from 'libs/shared/enums/CountryCode';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\n\nexport const UserUploadTemplates: Record<string, Partial<Record<UserGroup, string>>> = {\n [CountryCode.US]: {\n [UserGroup.Learner]: '/templates/us/Template_Students.csv',\n [UserGroup.Staff]: '/templates/us/Template_Staff.csv'\n },\n [CountryCode.AU]: {\n [UserGroup.Learner]: '/templates/au/Template_Students.csv',\n [UserGroup.Staff]: '/templates/au/Template_Staff.csv'\n },\n [CountryCode.UK]: {\n [UserGroup.Learner]: '/templates/uk/Template_Students.csv',\n [UserGroup.Staff]: '/templates/uk/Template_Staff.csv'\n },\n [CountryCode.NZ]: {\n [UserGroup.Learner]: '/templates/au/Template_Students.csv',\n [UserGroup.Staff]: '/templates/au/Template_Staff.csv'\n }\n};","// extracted by mini-css-extract-plugin\nexport default {\"modalWidth\":\"olOSv\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\n\nimport { UploadUserSpreadsheet } from 'libs/shared/apps/user-manager/components/bulk-upload/upload-user-spreadsheet/UploadUserSpreadsheet';\nimport { UserManagerClientContext } from 'libs/shared/apps/user-manager/context/UserManagerClientContext';\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\nimport { useBulkUploadUsers } from 'libs/shared/apps/user-manager/hooks/useBulkUploadUsers';\nimport { EditUserRequest } from 'libs/shared/apps/user-manager/interfaces';\nimport { SecuritySettingsResponse } from 'libs/shared/apps/user-manager/interfaces/SecuritySettingsResponse';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { CountryCode } from 'libs/shared/enums/CountryCode';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { CurrentUser, PropsWithPopupViewProps, YearGroup } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { SecuritySettingsRequests } from 'apps/settings/flight-requests/SecuritySettingsRequests';\nimport { UserUploadTemplates } from 'apps/user-manager/constants/UserUploadTemplates';\nimport { UserManagerRequests } from 'apps/user-manager/flight-requests/UserManagerRequests';\n\nimport styles from './bulk-user-upload-popup.scss';\n\nconst namespaces = {\n [UserGroup.Learner]: 'userManager.bulkStudentUploadPopup',\n [UserGroup.Staff]: 'userManager.bulkStaffUploadPopup',\n [UserGroup.Unknown]: ''\n};\n\ntype BulkUserUploadPopupViewProps = PropsWithPopupViewProps<{\n userType: UserGroup;\n}>;\n\nexport function BulkUserUploadPopupView(props: BulkUserUploadPopupViewProps): JSX.Element {\n const { setUsers } = useBulkUploadUsers();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data && UserManagerRequests.yearGroups(currentUser.data.customerId)\n );\n const passwordPolicy = Flight.useBasicFetch<SecuritySettingsResponse>(currentUser.data &&\n SecuritySettingsRequests.getCustomerSecuritySettings(currentUser.data.customerId));\n\n function onSelectSpreadsheet(users: EditUserRequest[]): void {\n setUsers(users);\n\n props.closePopup();\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.USER_MANAGER,\n action: Actions.UserManager.USER_UPLOAD_REVIEW_ACCOUNTS,\n params: { userType: props.userType }\n });\n }\n\n const dataLoaded = !!currentUser.data && !!yearGroups.data && !!passwordPolicy.data;\n\n const countryCode = currentUser.data?.countryCode?.toLowerCase() ?? CountryCode.AU.toLowerCase();\n\n return (\n <UserManagerClientContext.Provider value={UserManagerClient.Primary}>\n <Popup\n closePopup={props.closePopup}\n title={LanguageService.getPhrase(namespaces[props.userType], 'heading')}\n showLoadingSpinner={!dataLoaded}\n dialogClassName={styles.modalWidth}\n >\n {dataLoaded && (\n <UploadUserSpreadsheet\n userType={props.userType}\n onSelectSpreadsheet={onSelectSpreadsheet}\n onClickCancel={props.closePopup}\n templateLink={UserUploadTemplates[countryCode][props.userType]}\n currentUser={currentUser.data}\n yearGroups={yearGroups.data}\n showPasswordColumn={props.userType === UserGroup.Learner}\n passwordPolicy={passwordPolicy.data}\n />\n )}\n </Popup>\n </UserManagerClientContext.Provider>\n );\n}"],"names":["UserManagerClientContext","updateUserHash","userHash","updatedUserIdsHash","Object","keys","reduce","updatedObj","lookupId","useBulkUploadUsers","viewModel","setViewModel","updateDuplicates","users","duplicateSets","invalidUsers","hasValidatedUsers","existingUsersHash","hasExistingUsers","length","existingUserToAdd","newUsers","filter","u","setUsers","setInvalidUsers","setExistingUsers","existingUsers","updateUser","updatedUser","updatedUsers","map","user","deleteUsers","deletedUsers","userIdHash","prev","curr","FormCheckbox","props","label","checkboxLabelClassName","checkboxLabelFontWeight","className","fieldProps","Form","FieldWrapper","htmlFor","id","checkboxAppLink","checkboxAppLinkText","AppLink","appLink","CharacterCounter","values","field","ObjectHelper","fieldName","limit","namespace","children","showLoadingSpinner","type","setType","resolvedChildren","FunctionHelper","f","Spinner","animation","size","containerClassName","disabled","SvgContainer","svgName","onClick","FormField","showCharacterCounter","showRequiredStar","infoTooltip","infoTooltipPlacement","infoText","formSize","showOptionalLabel","formGroupClassname","errors","touched","disabledOnChange","_props","onChange","fieldWrapperProps","FormHelper","name","as","title","tooltipPlacement","tooltipSpanHack","Text","phrase","maxLength","description","errorMessage","role","defaultProps","autoComplete","FormWrapper","castInitialValues","castValuesOnSubmit","initialValues","onSubmit","formikProps","formattedInitialValues","validationSchema","cast","omitChildValues","child","forEach","key","hasOwnProperty","omitNullInitialValues","initialStatus","allowInitialSubmit","enableReinitialize","setSubmitting","resetForm","setFieldError","formattedData","options","reset","entries","value","useFormikContextWrapper","loadedScripts","useScript","src","shouldLoad","loaded","setLoaded","script","document","createElement","async","onload","window","setTimeout","body","appendChild","removeChild","getCustomFormControlClassName","attribute","additionalClassName","getTypeSize","SecuritySettingsRequests","getCustomerSecuritySettings","customerId","success","error","url","normalize","setCustomerSecuritySettings","data","invalidationKeys","ExampleUserSpreadsheet","validYearGroups","UserHelper","yearGroups","maleYearGroup","ArrayHelper","femaleYearGroupIndex","Math","floor","femaleYearGroup","cellPadding","userType","UserGroup","showPasswordColumn","GoogleSheetsIcon","width","height","viewBox","d","x1","y1","x2","y2","stopColor","stopOpacity","offset","cx","cy","fx","fy","r","gradientTransform","stroke","strokeWidth","fill","fillRule","transform","xlinkHref","mask","points","fillOpacity","GoogleSheetsError","this","text","buttons","LanguageService","getPhrase","GoogleSheetsSelectorForm","spreadsheetSheets","setFieldValue","spreadsheetId","e","onSelectSpreadsheet","target","spreadsheets","spreadsheet","spreadsheetRange","sheetName","PopupButtons","onClickCancel","variant","GoogleSheetsSelectorValidation","shape","required","initialData","GOOGLE_CONSENT_REQUEST","apiKey","clientId","discoveryDocs","scope","GoogleSheetsSelector","setSpreadsheets","spreadsheetRanges","setSpreadsheetRanges","googleAuthInstance","googleSignInListener","gapiLoaded","signIn","current","currentUser","get","hasGrantedScopes","onError","loadSpreadsheets","gapi","client","drive","files","list","q","spreadsheetResponse","result","Array","isArray","message","load","init","auth2","getAuthInstance","googleUser","isSignedIn","listen","grant","then","remove","sheets","range","response","ranges","sheet","properties","PopupLoadingSpinner","namespaces","UploadUserSpreadsheet","showGoogleSheetsSelector","setShowGoogleSheetsSelector","minPasswordLength","UserManagerHelper","passwordPolicy","UserRole","User","BulkUserUploadHelper","clone","headings","shift","countryCode","templateLink","isValid","UserManagerConstants","SpreadsheetTooLargeError","InvalidSpreadsheetError","download","href","minLength","username","BulkUploadFileSelect","UserUploadTemplates","CountryCode","C","BulkUserUploadPopupView","UserRequests","UserManagerRequests","dataLoaded","toLowerCase","UserManagerClient","Popup","closePopup","dialogClassName","application","action","params"],"sourceRoot":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[3191],{16715:(e,t,n)=>{n.d(t,{U:()=>s});var r=n(5173),a=n(23481).T.encloseNamespace("userManager.validation"),s=function(e){return(0,r.Ry)().shape({newPassword:(0,r.Z_)().required(function(){return a("newPasswordRequired")}).min(e,function(){return a("newPasswordMinLength",{minLen:e})}).trim().default(""),confirmPassword:(0,r.Z_)().required(function(){return a("confirmPasswordRequired")}).oneOf([(0,r.iH)("newPassword"),null],function(){return a("passwordsDontMatch")}).trim().default("")})}},64767:(e,t,n)=>{n.r(t),n.d(t,{BulkUserActionsResetPasswordActionDetailsView:()=>S});var r=n(32735),a=n(23481),s=n(20354),i=n(92802),o=n(2948),u=n(68670),l=n(16715),c=n(82644),d=n(83345),m=n(38143),f=n(96728);function p(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var h="userManager.bulkUserActionsResetPasswordActionDetails",w={newPassword:"",confirmPassword:"",changeOnNextLogin:!0};function g(e){var t=(0,i.u6)();return r.useEffect(function(){var n,r;e.onUpdate(null===(n=t.values)||void 0===n?void 0:n.newPassword,null===(r=t.values)||void 0===r?void 0:r.changeOnNextLogin,t.isValid&&t.dirty)},[t.isValid,t.values]),r.createElement(u.p,{inputWidthClass:"w-50",hideButtons:!0,hideCurrentPassword:!0,showChangeOnNextLogin:!0})}function v(e){var t,n,a=(t=(0,o.D)(m.g.BULK_USER_ACTIONS),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 r,a,s,i,o=[],u=!0,l=!1;try{if(s=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;u=!1}else for(;!(u=(r=s.call(n)).done)&&(o.push(r.value),o.length!==t);u=!0);}catch(e){l=!0,a=e}finally{try{if(!u&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(l)throw a}}return o}}(t,n)||function(e,t){if(e){if("string"==typeof e)return p(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)?p(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.")}())[1],s=r.useContext(f.e),i=s.disableNext,u=s.setDisableNext;return r.useEffect(function(){u(!0)},[]),r.useEffect(function(){a("subAction","resetPassword")},[]),r.createElement(r.Fragment,null,r.createElement("h2",{className:"h4 mb-3"},r.createElement(d.x,{namespace:h,phrase:"heading"})),r.createElement("p",null,r.createElement(d.x,{namespace:h,phrase:"info",options:{smartCount:e.totalUsers}})),r.createElement("div",{className:"px-2 pt-2 border rounded mb-2 pb-0"},r.createElement("ul",{className:"mt-2 ps-3 ms-1"},r.createElement("li",null,r.createElement(d.x,{namespace:h,phrase:"ssoWarning"}))),r.createElement(c.n,{initialValues:w,onSubmit:function(){},validationSchema:(0,l.U)(e.minPasswordLength)},r.createElement(g,{onUpdate:function(e,t,n){n&&i&&u(!1),n||i||u(!0),a("password",e),a("changeOnNextLogin",t)}}))))}var y=n(90417),b=n(39739),E=n(86613),P=n(31949),U=n(79612),x=n(
|
|
2
|
-
//# sourceMappingURL=3191-
|
|
1
|
+
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[3191],{16715:(e,t,n)=>{n.d(t,{U:()=>s});var r=n(5173),a=n(23481).T.encloseNamespace("userManager.validation"),s=function(e){return(0,r.Ry)().shape({newPassword:(0,r.Z_)().required(function(){return a("newPasswordRequired")}).min(e,function(){return a("newPasswordMinLength",{minLen:e})}).trim().default(""),confirmPassword:(0,r.Z_)().required(function(){return a("confirmPasswordRequired")}).oneOf([(0,r.iH)("newPassword"),null],function(){return a("passwordsDontMatch")}).trim().default("")})}},64767:(e,t,n)=>{n.r(t),n.d(t,{BulkUserActionsResetPasswordActionDetailsView:()=>S});var r=n(32735),a=n(23481),s=n(20354),i=n(92802),o=n(2948),u=n(68670),l=n(16715),c=n(82644),d=n(83345),m=n(38143),f=n(96728);function p(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var h="userManager.bulkUserActionsResetPasswordActionDetails",w={newPassword:"",confirmPassword:"",changeOnNextLogin:!0};function g(e){var t=(0,i.u6)();return r.useEffect(function(){var n,r;e.onUpdate(null===(n=t.values)||void 0===n?void 0:n.newPassword,null===(r=t.values)||void 0===r?void 0:r.changeOnNextLogin,t.isValid&&t.dirty)},[t.isValid,t.values]),r.createElement(u.p,{inputWidthClass:"w-50",hideButtons:!0,hideCurrentPassword:!0,showChangeOnNextLogin:!0})}function v(e){var t,n,a=(t=(0,o.D)(m.g.BULK_USER_ACTIONS),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 r,a,s,i,o=[],u=!0,l=!1;try{if(s=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;u=!1}else for(;!(u=(r=s.call(n)).done)&&(o.push(r.value),o.length!==t);u=!0);}catch(e){l=!0,a=e}finally{try{if(!u&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(l)throw a}}return o}}(t,n)||function(e,t){if(e){if("string"==typeof e)return p(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)?p(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.")}())[1],s=r.useContext(f.e),i=s.disableNext,u=s.setDisableNext;return r.useEffect(function(){u(!0)},[]),r.useEffect(function(){a("subAction","resetPassword")},[]),r.createElement(r.Fragment,null,r.createElement("h2",{className:"h4 mb-3"},r.createElement(d.x,{namespace:h,phrase:"heading"})),r.createElement("p",null,r.createElement(d.x,{namespace:h,phrase:"info",options:{smartCount:e.totalUsers}})),r.createElement("div",{className:"px-2 pt-2 border rounded mb-2 pb-0"},r.createElement("ul",{className:"mt-2 ps-3 ms-1"},r.createElement("li",null,r.createElement(d.x,{namespace:h,phrase:"ssoWarning"}))),r.createElement(c.n,{initialValues:w,onSubmit:function(){},validationSchema:(0,l.U)(e.minPasswordLength)},r.createElement(g,{onUpdate:function(e,t,n){n&&i&&u(!1),n||i||u(!0),a("password",e),a("changeOnNextLogin",t)}}))))}var y=n(90417),b=n(39739),E=n(86613),P=n(31949),U=n(79612),x=n(80658),A=n(88323),L=n(18087),N="userManager.bulkResetPasswordDetails";function S(e){var t=(0,A.h)(e.userType),n=t.users,i=t.count,o=(0,L.Y)(e.userType);(0,U.M)({title:a.T.getPhrase(N,"pageTitle")});var u=s.a.useBasicFetch(P.N.currentUser()),l=s.a.useBasicFetch(u.data&&x.F.getCustomerSecuritySettings(u.data.customerId)),c=b.P.getMinimumPasswordLength(l.data,e.userType,E.i.User);return r.createElement(y.d,{appLinks:o,userType:e.userType,users:n,currentStep:"action-details",userCount:i,loaded:!0},r.createElement(v,{minPasswordLength:c,totalUsers:i,appLinks:o}))}}}]);
|
|
2
|
+
//# sourceMappingURL=3191-e387636012-lite.chunk.js.map
|
package/dist/scripts/{3191-6f79256d33-lite.chunk.js.map → 3191-e387636012-lite.chunk.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/3191-6f79256d33-lite.chunk.js","mappings":"kJAKMA,E,SAAY,mBADA,0BAGLC,EAAoC,SAACC,GAAc,OAAK,UAASC,MAAM,CAClFC,aAAa,UACVC,SAAS,kBAAML,EAAU,sBAAsB,GAC/CM,IAAIJ,EAAQ,kBAAMF,EAAU,uBAAwB,CAAEE,OAAAA,GAAS,GAC/DK,OAAM,QACE,IACXC,iBAAiB,UACdH,SAAS,kBAAML,EAAU,0BAA0B,GACnDS,MAAM,EAAE,QAAI,eAAgB,MAAQ,kBAAMT,EAAU,qBAAqB,GACzEO,OAAM,QACE,KACX,C,wTCJF,IAAMG,EAAY,wDAEZC,EAAuC,CAC3CP,YAAa,GACbI,gBAAiB,GACjBI,mBAAmB,GAOrB,SAASC,EAAeC,GACtB,IAAMC,GAAgB,UAUtB,OARA,YAAgB,W,QACdD,EAAME,SACgB,QAApB,EAAAD,EAAcE,cAAM,eAAEb,YACF,QAApB,EAAAW,EAAcE,cAAM,eAAEL,kBACtBG,EAAcG,SAAWH,EAAcI,MAE3C,EAAG,CAAEJ,EAAcG,QAASH,EAAcE,SAGxC,gBAACG,EAAA,EAAkB,CACjBC,gBAAgB,OAChBC,aAAW,EACXC,qBAAmB,EACnBC,uBAAqB,GAG3B,CAQM,SAAUC,EACdX,GAEA,I,IAAUY,G,GAAiB,OACzBC,EAAA,qB,EACD,E,o4BAFqB,GAItB,EAAwC,aAAiBC,EAAA,GAAjDC,EAAW,EAAXA,YAAaC,EAAc,EAAdA,eAqBrB,OAnBA,YAAgB,WACdA,GAAe,EACjB,EAAG,IAEH,YAAgB,WACdJ,EAAa,YAAa,gBAC5B,EAAG,IAcD,gCACE,sBAAIK,UAAU,WACZ,gBAACC,EAAA,EAAI,CAACtB,UAAWA,EAAWuB,OAAO,aAGrC,yBACE,gBAACD,EAAA,EAAI,CAACtB,UAAWA,EAAWuB,OAAO,OAAOC,QAAS,CAAEC,WAAYrB,EAAMsB,eAGzE,uBAAKL,UAAU,sCACb,sBAAIA,UAAU,kBACZ,0BACE,gBAACC,EAAA,EAAI,CAACtB,UAAWA,EAAWuB,OAAO,iBAGvC,gBAACI,EAAA,EAAW,CACV1B,cAAeA,EACf2B,SAAU,WAAO,EACjBC,kBAAkB,OAAkCzB,EAAM0B,oBAE1D,gBAAC3B,EAAc,CAACG,SAhCxB,SAAsBZ,EAAqBQ,EAA4BM,GACjEA,GAAWW,GACbC,GAAe,GAEZZ,GAAYW,GACfC,GAAe,GAEjBJ,EAAa,WAAYtB,GACzBsB,EAAa,oBAAqBd,EACpC,MA4BF,C,4FCxFM,EAAY,uCAEZ,SAAU6B,EAA8C3B,GAC5D,OAAyB,EAAA4B,EAAA,GAA2B5B,EAAM6B,UAAlDC,EAAK,EAALA,MAAOC,EAAK,EAALA,MACTC,GAAW,OAAuBhC,EAAM6B,WAC9C,EAAAI,EAAA,GAAmB,CAAEC,MAAOC,EAAA,YAA0B,EAAW,eAEjE,IAAMC,EAAc,kBAAkCC,EAAA,iBAChDC,EAAiB,kBAA+CF,EAAYG,MAChFC,EAAA,8BAAqDJ,EAAYG,KAAKE,aAElEC,EAAiBC,EAAA,2BAA2CL,EAAeC,KAAMvC,EAAM6B,SAAUe,EAAA,EAAAC,MAEvG,OACE,gBAACC,EAAA,EAA2B,CAC1Bd,SAAUA,EACVH,SAAU7B,EAAM6B,SAChBC,MAAOA,EACPiB,YAAY,iBACZC,UAAWjB,EACXkB,QAAM,GAEN,gBAACtC,EAAyC,CACxCe,kBAAmBgB,EACnBpB,WAAYS,EACZC,SAAUA,IAIlB,C","sources":["file:///app/packages/libs/shared/src/apps/user-manager/validation/ChangePasswordValidationSchema.ts","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-actions-wizard/action-details/reset-password-action-details/BulkUserActionsResetPasswordActionDetails.tsx","file:///app/packages/projects/lite/src/apps/user-manager/views/wizard/action-details/reset-password/BulkUserActionsResetPasswordActionDetailsView.tsx"],"sourcesContent":["import { object, ref, string } from 'yup';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst namespace = 'userManager.validation';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const getChangePasswordValidationSchema = (minLen: number) => object().shape({\n newPassword: string()\n .required(() => getPhrase('newPasswordRequired'))\n .min(minLen, () => getPhrase('newPasswordMinLength', { minLen }))\n .trim()\n .default(''),\n confirmPassword: string()\n .required(() => getPhrase('confirmPasswordRequired'))\n .oneOf([ ref('newPassword'), null ], () => getPhrase('passwordsDontMatch'))\n .trim()\n .default('')\n});","import React from 'react';\nimport { useFormikContext } from 'formik';\n\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { ChangePasswordForm } from 'libs/shared/apps/user-manager/components/change-password-form/ChangePasswordForm';\nimport { ChangePasswordRequest, UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { BulkUserActionsResetPasswordViewModel } from 'libs/shared/apps/user-manager/interfaces/viewmodels/BulkUserActionsViewModel';\nimport { getChangePasswordValidationSchema } from 'libs/shared/apps/user-manager/validation/ChangePasswordValidationSchema';\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { WizardLayoutContext } from 'libs/shared/context/WizardLayoutContext';\n\nconst namespace = 'userManager.bulkUserActionsResetPasswordActionDetails';\n\nconst initialValues: ChangePasswordRequest = {\n newPassword: '',\n confirmPassword: '',\n changeOnNextLogin: true\n};\n\ninterface ChangePasswordProps {\n onUpdate: (val: string, changeOnNextLogin: boolean, isValid: boolean) => void;\n}\n\nfunction ChangePassword(props: ChangePasswordProps): JSX.Element {\n const formikContext = useFormikContext<ChangePasswordRequest>();\n\n React.useEffect(() => {\n props.onUpdate(\n formikContext.values?.newPassword,\n formikContext.values?.changeOnNextLogin,\n formikContext.isValid && formikContext.dirty\n );\n }, [ formikContext.isValid, formikContext.values ]);\n\n return (\n <ChangePasswordForm\n inputWidthClass='w-50'\n hideButtons\n hideCurrentPassword\n showChangeOnNextLogin\n />\n );\n}\n\ninterface BulkUserActionsResetPasswordActionDetailsProps {\n appLinks: UserManagerAppLinks;\n minPasswordLength: number;\n totalUsers: number;\n}\n\nexport function BulkUserActionsResetPasswordActionDetails(\n props: BulkUserActionsResetPasswordActionDetailsProps\n): JSX.Element {\n const [ , setViewModel ] = useViewModel<BulkUserActionsResetPasswordViewModel>(\n SharedViewModelKeys.BULK_USER_ACTIONS\n );\n\n const { disableNext, setDisableNext } = React.useContext(WizardLayoutContext);\n\n React.useEffect(() => {\n setDisableNext(true);\n }, []);\n\n React.useEffect(() => {\n setViewModel('subAction', 'resetPassword');\n }, []);\n\n function onUpdateForm(newPassword: string, changeOnNextLogin: boolean, isValid: boolean) {\n if (isValid && disableNext)\n setDisableNext(false);\n\n if (!isValid && !disableNext)\n setDisableNext(true);\n\n setViewModel('password', newPassword);\n setViewModel('changeOnNextLogin', changeOnNextLogin);\n }\n\n return (\n <>\n <h2 className='h4 mb-3'>\n <Text namespace={namespace} phrase='heading' />\n </h2>\n\n <p>\n <Text namespace={namespace} phrase='info' options={{ smartCount: props.totalUsers }} />\n </p>\n\n <div className='px-2 pt-2 border rounded mb-2 pb-0'>\n <ul className='mt-2 ps-3 ms-1'>\n <li>\n <Text namespace={namespace} phrase='ssoWarning' />\n </li>\n </ul>\n <FormWrapper<ChangePasswordRequest>\n initialValues={initialValues}\n onSubmit={() => {}}\n validationSchema={getChangePasswordValidationSchema(props.minPasswordLength)}\n >\n <ChangePassword onUpdate={onUpdateForm} />\n </FormWrapper>\n </div>\n </>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { BulkUserActionsResetPasswordActionDetails } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/action-details/reset-password-action-details/BulkUserActionsResetPasswordActionDetails';\nimport { BulkUserActionsWizardLayout } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/layout/BulkUserActionsWizardLayout';\nimport { UserWizardParams } from 'libs/shared/apps/user-manager/interfaces/query-params/UserWizardParams';\nimport { SecuritySettingsResponse } from 'libs/shared/apps/user-manager/interfaces/SecuritySettingsResponse';\nimport { UserManagerHelper } from 'libs/shared/apps/user-manager/utils/UserManagerHelper';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { CurrentUser } from 'libs/shared/interfaces';\n\nimport { SecuritySettingsRequests } from 'apps/settings/flight-requests/SecuritySettingsRequests';\nimport { useBulkActionsUsersWrapper } from 'apps/user-manager/hooks/useBulkActionsUsersWrapper';\nimport { getUserManagerAppLinks } from 'apps/user-manager/utils/LiteUserManagerAppLinks';\n\nconst namespace = 'userManager.bulkResetPasswordDetails';\n\nexport function BulkUserActionsResetPasswordActionDetailsView(props: UserWizardParams): JSX.Element {\n const { users, count } = useBulkActionsUsersWrapper(props.userType);\n const appLinks = getUserManagerAppLinks(props.userType);\n useSetPageMetadata({ title: LanguageService.getPhrase(namespace, 'pageTitle') });\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const passwordPolicy = Flight.useBasicFetch<SecuritySettingsResponse>(currentUser.data &&\n SecuritySettingsRequests.getCustomerSecuritySettings(currentUser.data.customerId));\n\n const minPasswordLen = UserManagerHelper.getMinimumPasswordLength(passwordPolicy.data, props.userType, UserRole.User);\n\n return (\n <BulkUserActionsWizardLayout\n appLinks={appLinks}\n userType={props.userType}\n users={users}\n currentStep='action-details'\n userCount={count}\n loaded\n >\n <BulkUserActionsResetPasswordActionDetails\n minPasswordLength={minPasswordLen}\n totalUsers={count}\n appLinks={appLinks}\n />\n </BulkUserActionsWizardLayout>\n );\n}"],"names":["getPhrase","getChangePasswordValidationSchema","minLen","shape","newPassword","required","min","trim","confirmPassword","oneOf","namespace","initialValues","changeOnNextLogin","ChangePassword","props","formikContext","onUpdate","values","isValid","dirty","ChangePasswordForm","inputWidthClass","hideButtons","hideCurrentPassword","showChangeOnNextLogin","BulkUserActionsResetPasswordActionDetails","setViewModel","SharedViewModelKeys","WizardLayoutContext","disableNext","setDisableNext","className","Text","phrase","options","smartCount","totalUsers","FormWrapper","onSubmit","validationSchema","minPasswordLength","BulkUserActionsResetPasswordActionDetailsView","useBulkActionsUsersWrapper","userType","users","count","appLinks","useSetPageMetadata","title","LanguageService","currentUser","UserRequests","passwordPolicy","data","SecuritySettingsRequests","customerId","minPasswordLen","UserManagerHelper","UserRole","User","BulkUserActionsWizardLayout","currentStep","userCount","loaded"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"scripts/3191-e387636012-lite.chunk.js","mappings":"kJAKMA,E,SAAY,mBADA,0BAGLC,EAAoC,SAACC,GAAc,OAAK,UAASC,MAAM,CAClFC,aAAa,UACVC,SAAS,kBAAML,EAAU,sBAAsB,GAC/CM,IAAIJ,EAAQ,kBAAMF,EAAU,uBAAwB,CAAEE,OAAAA,GAAS,GAC/DK,OAAM,QACE,IACXC,iBAAiB,UACdH,SAAS,kBAAML,EAAU,0BAA0B,GACnDS,MAAM,EAAE,QAAI,eAAgB,MAAQ,kBAAMT,EAAU,qBAAqB,GACzEO,OAAM,QACE,KACX,C,wTCJF,IAAMG,EAAY,wDAEZC,EAAuC,CAC3CP,YAAa,GACbI,gBAAiB,GACjBI,mBAAmB,GAOrB,SAASC,EAAeC,GACtB,IAAMC,GAAgB,UAUtB,OARA,YAAgB,W,QACdD,EAAME,SACgB,QAApB,EAAAD,EAAcE,cAAM,eAAEb,YACF,QAApB,EAAAW,EAAcE,cAAM,eAAEL,kBACtBG,EAAcG,SAAWH,EAAcI,MAE3C,EAAG,CAAEJ,EAAcG,QAASH,EAAcE,SAGxC,gBAACG,EAAA,EAAkB,CACjBC,gBAAgB,OAChBC,aAAW,EACXC,qBAAmB,EACnBC,uBAAqB,GAG3B,CAQM,SAAUC,EACdX,GAEA,I,IAAUY,G,GAAiB,OACzBC,EAAA,qB,EACD,E,o4BAFqB,GAItB,EAAwC,aAAiBC,EAAA,GAAjDC,EAAW,EAAXA,YAAaC,EAAc,EAAdA,eAqBrB,OAnBA,YAAgB,WACdA,GAAe,EACjB,EAAG,IAEH,YAAgB,WACdJ,EAAa,YAAa,gBAC5B,EAAG,IAcD,gCACE,sBAAIK,UAAU,WACZ,gBAACC,EAAA,EAAI,CAACtB,UAAWA,EAAWuB,OAAO,aAGrC,yBACE,gBAACD,EAAA,EAAI,CAACtB,UAAWA,EAAWuB,OAAO,OAAOC,QAAS,CAAEC,WAAYrB,EAAMsB,eAGzE,uBAAKL,UAAU,sCACb,sBAAIA,UAAU,kBACZ,0BACE,gBAACC,EAAA,EAAI,CAACtB,UAAWA,EAAWuB,OAAO,iBAGvC,gBAACI,EAAA,EAAW,CACV1B,cAAeA,EACf2B,SAAU,WAAO,EACjBC,kBAAkB,OAAkCzB,EAAM0B,oBAE1D,gBAAC3B,EAAc,CAACG,SAhCxB,SAAsBZ,EAAqBQ,EAA4BM,GACjEA,GAAWW,GACbC,GAAe,GAEZZ,GAAYW,GACfC,GAAe,GAEjBJ,EAAa,WAAYtB,GACzBsB,EAAa,oBAAqBd,EACpC,MA4BF,C,4FCxFM,EAAY,uCAEZ,SAAU6B,EAA8C3B,GAC5D,OAAyB,EAAA4B,EAAA,GAA2B5B,EAAM6B,UAAlDC,EAAK,EAALA,MAAOC,EAAK,EAALA,MACTC,GAAW,OAAuBhC,EAAM6B,WAC9C,EAAAI,EAAA,GAAmB,CAAEC,MAAOC,EAAA,YAA0B,EAAW,eAEjE,IAAMC,EAAc,kBAAkCC,EAAA,iBAChDC,EAAiB,kBAA+CF,EAAYG,MAChFC,EAAA,8BAAqDJ,EAAYG,KAAKE,aAElEC,EAAiBC,EAAA,2BAA2CL,EAAeC,KAAMvC,EAAM6B,SAAUe,EAAA,EAAAC,MAEvG,OACE,gBAACC,EAAA,EAA2B,CAC1Bd,SAAUA,EACVH,SAAU7B,EAAM6B,SAChBC,MAAOA,EACPiB,YAAY,iBACZC,UAAWjB,EACXkB,QAAM,GAEN,gBAACtC,EAAyC,CACxCe,kBAAmBgB,EACnBpB,WAAYS,EACZC,SAAUA,IAIlB,C","sources":["file:///app/packages/libs/shared/src/apps/user-manager/validation/ChangePasswordValidationSchema.ts","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-actions-wizard/action-details/reset-password-action-details/BulkUserActionsResetPasswordActionDetails.tsx","file:///app/packages/projects/lite/src/apps/user-manager/views/wizard/action-details/reset-password/BulkUserActionsResetPasswordActionDetailsView.tsx"],"sourcesContent":["import { object, ref, string } from 'yup';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst namespace = 'userManager.validation';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const getChangePasswordValidationSchema = (minLen: number) => object().shape({\n newPassword: string()\n .required(() => getPhrase('newPasswordRequired'))\n .min(minLen, () => getPhrase('newPasswordMinLength', { minLen }))\n .trim()\n .default(''),\n confirmPassword: string()\n .required(() => getPhrase('confirmPasswordRequired'))\n .oneOf([ ref('newPassword'), null ], () => getPhrase('passwordsDontMatch'))\n .trim()\n .default('')\n});","import React from 'react';\nimport { useFormikContext } from 'formik';\n\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { ChangePasswordForm } from 'libs/shared/apps/user-manager/components/change-password-form/ChangePasswordForm';\nimport { ChangePasswordRequest, UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { BulkUserActionsResetPasswordViewModel } from 'libs/shared/apps/user-manager/interfaces/viewmodels/BulkUserActionsViewModel';\nimport { getChangePasswordValidationSchema } from 'libs/shared/apps/user-manager/validation/ChangePasswordValidationSchema';\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { WizardLayoutContext } from 'libs/shared/context/WizardLayoutContext';\n\nconst namespace = 'userManager.bulkUserActionsResetPasswordActionDetails';\n\nconst initialValues: ChangePasswordRequest = {\n newPassword: '',\n confirmPassword: '',\n changeOnNextLogin: true\n};\n\ninterface ChangePasswordProps {\n onUpdate: (val: string, changeOnNextLogin: boolean, isValid: boolean) => void;\n}\n\nfunction ChangePassword(props: ChangePasswordProps): JSX.Element {\n const formikContext = useFormikContext<ChangePasswordRequest>();\n\n React.useEffect(() => {\n props.onUpdate(\n formikContext.values?.newPassword,\n formikContext.values?.changeOnNextLogin,\n formikContext.isValid && formikContext.dirty\n );\n }, [ formikContext.isValid, formikContext.values ]);\n\n return (\n <ChangePasswordForm\n inputWidthClass='w-50'\n hideButtons\n hideCurrentPassword\n showChangeOnNextLogin\n />\n );\n}\n\ninterface BulkUserActionsResetPasswordActionDetailsProps {\n appLinks: UserManagerAppLinks;\n minPasswordLength: number;\n totalUsers: number;\n}\n\nexport function BulkUserActionsResetPasswordActionDetails(\n props: BulkUserActionsResetPasswordActionDetailsProps\n): JSX.Element {\n const [ , setViewModel ] = useViewModel<BulkUserActionsResetPasswordViewModel>(\n SharedViewModelKeys.BULK_USER_ACTIONS\n );\n\n const { disableNext, setDisableNext } = React.useContext(WizardLayoutContext);\n\n React.useEffect(() => {\n setDisableNext(true);\n }, []);\n\n React.useEffect(() => {\n setViewModel('subAction', 'resetPassword');\n }, []);\n\n function onUpdateForm(newPassword: string, changeOnNextLogin: boolean, isValid: boolean) {\n if (isValid && disableNext)\n setDisableNext(false);\n\n if (!isValid && !disableNext)\n setDisableNext(true);\n\n setViewModel('password', newPassword);\n setViewModel('changeOnNextLogin', changeOnNextLogin);\n }\n\n return (\n <>\n <h2 className='h4 mb-3'>\n <Text namespace={namespace} phrase='heading' />\n </h2>\n\n <p>\n <Text namespace={namespace} phrase='info' options={{ smartCount: props.totalUsers }} />\n </p>\n\n <div className='px-2 pt-2 border rounded mb-2 pb-0'>\n <ul className='mt-2 ps-3 ms-1'>\n <li>\n <Text namespace={namespace} phrase='ssoWarning' />\n </li>\n </ul>\n <FormWrapper<ChangePasswordRequest>\n initialValues={initialValues}\n onSubmit={() => {}}\n validationSchema={getChangePasswordValidationSchema(props.minPasswordLength)}\n >\n <ChangePassword onUpdate={onUpdateForm} />\n </FormWrapper>\n </div>\n </>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { BulkUserActionsResetPasswordActionDetails } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/action-details/reset-password-action-details/BulkUserActionsResetPasswordActionDetails';\nimport { BulkUserActionsWizardLayout } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/layout/BulkUserActionsWizardLayout';\nimport { UserWizardParams } from 'libs/shared/apps/user-manager/interfaces/query-params/UserWizardParams';\nimport { SecuritySettingsResponse } from 'libs/shared/apps/user-manager/interfaces/SecuritySettingsResponse';\nimport { UserManagerHelper } from 'libs/shared/apps/user-manager/utils/UserManagerHelper';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { CurrentUser } from 'libs/shared/interfaces';\n\nimport { SecuritySettingsRequests } from 'apps/settings/flight-requests/SecuritySettingsRequests';\nimport { useBulkActionsUsersWrapper } from 'apps/user-manager/hooks/useBulkActionsUsersWrapper';\nimport { getUserManagerAppLinks } from 'apps/user-manager/utils/LiteUserManagerAppLinks';\n\nconst namespace = 'userManager.bulkResetPasswordDetails';\n\nexport function BulkUserActionsResetPasswordActionDetailsView(props: UserWizardParams): JSX.Element {\n const { users, count } = useBulkActionsUsersWrapper(props.userType);\n const appLinks = getUserManagerAppLinks(props.userType);\n useSetPageMetadata({ title: LanguageService.getPhrase(namespace, 'pageTitle') });\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const passwordPolicy = Flight.useBasicFetch<SecuritySettingsResponse>(currentUser.data &&\n SecuritySettingsRequests.getCustomerSecuritySettings(currentUser.data.customerId));\n\n const minPasswordLen = UserManagerHelper.getMinimumPasswordLength(passwordPolicy.data, props.userType, UserRole.User);\n\n return (\n <BulkUserActionsWizardLayout\n appLinks={appLinks}\n userType={props.userType}\n users={users}\n currentStep='action-details'\n userCount={count}\n loaded\n >\n <BulkUserActionsResetPasswordActionDetails\n minPasswordLength={minPasswordLen}\n totalUsers={count}\n appLinks={appLinks}\n />\n </BulkUserActionsWizardLayout>\n );\n}"],"names":["getPhrase","getChangePasswordValidationSchema","minLen","shape","newPassword","required","min","trim","confirmPassword","oneOf","namespace","initialValues","changeOnNextLogin","ChangePassword","props","formikContext","onUpdate","values","isValid","dirty","ChangePasswordForm","inputWidthClass","hideButtons","hideCurrentPassword","showChangeOnNextLogin","BulkUserActionsResetPasswordActionDetails","setViewModel","SharedViewModelKeys","WizardLayoutContext","disableNext","setDisableNext","className","Text","phrase","options","smartCount","totalUsers","FormWrapper","onSubmit","validationSchema","minPasswordLength","BulkUserActionsResetPasswordActionDetailsView","useBulkActionsUsersWrapper","userType","users","count","appLinks","useSetPageMetadata","title","LanguageService","currentUser","UserRequests","passwordPolicy","data","SecuritySettingsRequests","customerId","minPasswordLen","UserManagerHelper","UserRole","User","BulkUserActionsWizardLayout","currentStep","userCount","loaded"],"sourceRoot":""}
|