{"version":3,"file":"AddUser.mjs","names":["useSnackbar","React","useCallback","useEffect","useRef","useState","useMemo","useTranslation","UserFormFields","Field","Form","FluentTextField","UdpStepper","UdpTextInput","USER_EMAIL_STEP","USER_INFO_STEP","AddUser","props","getUserByEmail","handleCreateUser","handleUpdateAndAddToTenant","rolesData","setSidesheetLoading","sidesheetLoading","altFieldMapping","userMapping","userId","firstName","lastName","email","roles","t","enqueueSnackbar","activeStep","setActiveStep","completed","setCompleted","existingUser","setExistingUser","setEmail","passwordType","setPasswordType","creationMethod","setCreationMethod","handleSubmitRef","emailFieldRef","isValidEmail","setIsValidEmail","handlePasswordTypeChange","event","target","value","handleCreationMethodChange","steps","setSteps","stepDisplay","inProcessIcon","completeIcon","title","defaultValue","subTitle","stepTitle","showTitle","buttons","goToEmailStep","prev","goToInfoStep","trim","existingUserResponse","user","data","onSubmit","values","isInvite","passwordProfile","toLowerCase","accountEnabled","locked","err","message","variant","anchorOrigin","vertical","horizontal","submitForm","current","updated","action","disabled","customAction","handleSubmit","test","split","length","e","key","preventDefault"],"sources":["../../../../src/shell/ui/user/AddUser.jsx"],"sourcesContent":["import { useSnackbar } from 'notistack';\nimport React, { useCallback, useEffect, useRef, useState, useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { UserFormFields } from './form/UserFormFields';\nimport { Field, Form } from '../../../utilities/form';\nimport { FluentTextField } from '../../../UI/inputs/textField';\nimport { UdpStepper } from '../../../UI';\nimport { UdpTextInput } from '../../../UI/fluent-web-components';\n\n\nconst USER_EMAIL_STEP = 0;\nconst USER_INFO_STEP = 1;\n\nexport const AddUser = props => {\n  const {\n    getUserByEmail,\n    handleCreateUser,\n    handleUpdateAndAddToTenant,\n    rolesData,\n    setSidesheetLoading,\n    sidesheetLoading,\n    altFieldMapping,\n  } = props;\n\n  const userMapping = useMemo(() => {\n    if (altFieldMapping) {\n      return altFieldMapping;\n    } else {\n      // Default mapping for code generated User object\n      return {\n        userId: 'userId',\n        firstName: 'firstName',\n        lastName: 'lastName',\n        email: 'email',\n        roles: 'systemWideSecurityRoles',\n      }\n    }\n  }, [altFieldMapping]);\n\n  const { t } = useTranslation();\n\n  const { enqueueSnackbar } = useSnackbar();\n\n  const [activeStep, setActiveStep] = useState(USER_EMAIL_STEP);\n  const [completed, setCompleted] = useState({});\n  const [existingUser, setExistingUser] = useState(null);\n  const [email, setEmail] = useState('');\n\n  const [passwordType, setPasswordType] = useState('autoGeneratePassword'); // 'autoGeneratePassword' | 'createPassword'\n  const [creationMethod, setCreationMethod] = useState('standard'); // 'standard' | 'invite'\n\n  const handleSubmitRef = useRef(null);\n  const emailFieldRef = useRef(null);\n  const [isValidEmail, setIsValidEmail] = useState(false);\n\n  const handlePasswordTypeChange = useCallback(event => {\n    setPasswordType(event.target.value);\n  }, []);\n\n  const handleCreationMethodChange = useCallback(event => {\n    setCreationMethod(event.target.value);\n  }, []);\n\n  const [steps, setSteps] = useState([\n    {\n      stepDisplay: {\n        inProcessIcon: '1',\n        completeIcon: '✓',\n        title: t('shell.user.steps.enterEmail', { defaultValue: 'Enter Email' }),\n        subTitle: t('shell.user.steps.enterEmailSubtitle', {\n          defaultValue: 'Enter the email you will use to log in',\n        }),\n      },\n      stepTitle: t('shell.user.steps.step1', { defaultValue: 'Step 1' }),\n      showTitle: 'true',\n      buttons: [],\n    },\n    {\n      stepDisplay: {\n        inProcessIcon: '2',\n        completeIcon: '✓',\n        title: t('shell.user.steps.userInfo', { defaultValue: 'User Info' }),\n        subTitle: t('shell.user.steps.userInfoSubtitle', {\n          defaultValue: 'Fill in additional info for the new user',\n        }),\n      },\n      stepTitle: t('shell.user.steps.step2', { defaultValue: 'Step 2' }),\n      showTitle: 'true',\n      buttons: [],\n    },\n  ]);\n\n  const goToEmailStep = useCallback(() => {\n    setExistingUser(null);\n    setCompleted(prev => ({ ...prev, [USER_INFO_STEP]: false }));\n    setActiveStep(USER_EMAIL_STEP);\n  }, []);\n\n  const goToInfoStep = useCallback(async () => {\n    setExistingUser(null);\n    setSidesheetLoading(true);\n    if (!email?.trim()) {\n      return\n    }\n    const existingUserResponse = await getUserByEmail(email);\n    const user = existingUserResponse.data;\n    if (user) {\n      setExistingUser(user);\n    }\n\n    setSidesheetLoading(false);\n\n    setCompleted(prev => ({ ...prev, [USER_EMAIL_STEP]: true }));\n    setActiveStep(USER_INFO_STEP);\n  }, [getUserByEmail, setSidesheetLoading, email]);\n\n  const onSubmit = useCallback(\n    async values => {\n      setSidesheetLoading(true);\n\n      if (creationMethod === 'invite') {\n        values.isInvite = true;\n      } else {\n        values.isInvite = false;\n      }\n\n      if (passwordType === 'autoGeneratePassword') {\n        values.passwordProfile = null;\n      }\n\n      if (values.email) {\n        values.email = values.email.toLowerCase().trim();\n      }\n      values = { ...values, accountEnabled: !values.locked };\n      try {\n        if (existingUser) {\n          // Set the new values onto the existing user values\n          // eslint-disable-next-line react-hooks/immutability\n          existingUser[userMapping.firstName] = values[userMapping.firstName];\n          existingUser[userMapping.lastName] = values[userMapping.lastName];\n          existingUser[userMapping.roles] = values[userMapping.roles];\n\n          await handleUpdateAndAddToTenant(existingUser[userMapping.userId], existingUser);\n        } else {\n          await handleCreateUser(values);\n        }\n      } catch (err) {\n        enqueueSnackbar(err.message, {\n          variant: 'error',\n          anchorOrigin: {\n            vertical: 'top',\n            horizontal: 'center',\n          },\n        });\n      }\n\n      setSidesheetLoading(false);\n    },\n    [\n      existingUser,\n      enqueueSnackbar,\n      handleCreateUser,\n      handleUpdateAndAddToTenant,\n      setSidesheetLoading,\n      creationMethod,\n      passwordType,\n      userMapping\n    ]\n  );\n\n  const submitForm = useCallback(() => {\n    if (handleSubmitRef.current) {\n      handleSubmitRef.current();\n    }\n  }, []);\n\n  // Inject the button definitions to prevent constant re-creation of customAction callbacks\n  useEffect(() => {\n    setSteps(prev => {\n      const updated = [...prev];\n      updated[USER_EMAIL_STEP].buttons = [\n        {\n          title: t('common.next', { defaultValue: 'Next' }),\n          action: 2,\n          variant: 'outline',\n          disabled: !isValidEmail,\n          customAction: goToInfoStep,\n        },\n      ];\n      updated[USER_INFO_STEP].buttons = [\n        {\n          title: t('common.back', { defaultValue: 'Back' }),\n          action: 1,\n          variant: 'outline',\n          customAction: goToEmailStep,\n          disabled: sidesheetLoading\n        },\n        {\n          title: t('shell.user.createUser', { defaultValue: 'Create user' }),\n          action: 3,\n          variant: 'outline',\n          customAction: submitForm,\n          disabled: sidesheetLoading,\n        },\n      ];\n      return updated;\n    });\n  }, [goToInfoStep, goToEmailStep, submitForm, t, sidesheetLoading, isValidEmail]);\n\n  useEffect(() => {\n    if (existingUser) {\n      setSteps(prev => {\n        const updated = [...prev];\n        updated[USER_INFO_STEP].stepDisplay.subTitle = t(\n          'shell.user.steps.existingUserSubtitle',\n          {\n            defaultValue:\n              'A user with that email already exists. Edit values before adding to the tenant',\n          }\n        );\n        updated[USER_INFO_STEP].buttons[1].title = t(\n          'shell.user.addUserToTenant',\n          { defaultValue: 'Add user to tenant' }\n        );\n        return updated;\n      });\n    } else {\n      setSteps(prev => {\n        const updated = [...prev];\n        updated[USER_INFO_STEP].stepDisplay.subTitle = t(\n          'shell.user.steps.userInfoSubtitle',\n          { defaultValue: 'Fill in additional info for the new user' }\n        );\n        updated[USER_INFO_STEP].buttons[1].title = t('shell.user.createUser', {\n          defaultValue: 'Create user',\n        });\n        return updated;\n      });\n    }\n  }, [existingUser, t]);\n\n  return (\n    <Form\n      onSubmit={onSubmit}\n      render={({ handleSubmit }) => {\n        handleSubmitRef.current = handleSubmit;\n        return (\n          <UdpStepper\n            steps={steps}\n            activeStep={activeStep}\n            completed={completed}\n            orientation=\"vertical\"\n            labelDisplay=\"all\"\n            labelPosition=\"right\"\n          >\n            {activeStep === 0 && (\n              <Field\n                ref={emailFieldRef}\n                component={UdpTextInput}\n                label={t('shell.user.fields.email', { defaultValue: 'Email' })}\n                id=\"email\"\n                name=\"email\"\n                appearance=\"outline\"\n                controlSize=\"medium\"\n                required\n                value={email}\n                validate={value => {\n                  if (\n                    !/^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/.test(\n                      value\n                    ) ||\n                    64 < value.split('@')[0].length\n                  ) {\n                    setIsValidEmail(false);\n                    return t('shell.user.validation.invalidEmail', {\n                      defaultValue: 'Invalid email address',\n                    });\n                  } else {\n                    setIsValidEmail(true)\n                  }\n                }}\n                onChange={e => setEmail(e.target.value)}\n                onKeyDown={e => {\n                  if (e.key === 'Enter') {\n                    e.preventDefault();\n                    goToInfoStep();\n                  }\n                }}\n              />\n            )}\n            {activeStep === 1 && (\n              <UserFormFields\n                rolesData={rolesData}\n                editedUser={existingUser}\n                handlePasswordTypeChange={handlePasswordTypeChange}\n                passwordType={passwordType}\n                handleCreationMethodChange={handleCreationMethodChange}\n                creationMethod={creationMethod}\n                hideEmailField={true}\n                altFieldMapping={altFieldMapping}\n              />\n            )}\n          </UdpStepper>\n        );\n      }}\n    />\n  );\n};\n\nexport default AddUser;\n"],"mappings":";;;;;;;;;AAUA,MAAMc,kBAAkB;AACxB,MAAMC,iBAAiB;AAEvB,MAAaC,WAAUC,UAAS;CAC9B,MAAM,EACJC,gBACAC,kBACAC,4BACAC,WACAC,qBACAC,kBACAC,oBACEP;CAEJ,MAAMQ,cAAcnB,cAAc;AAChC,MAAIkB,gBACF,QAAOA;MAGP,QAAO;GACLE,QAAQ;GACRC,WAAW;GACXC,UAAU;GACVC,OAAO;GACPC,OAAO;GACR;IAEF,CAACN,gBAAgB,CAAC;CAErB,MAAM,EAAEO,MAAMxB,gBAAgB;CAE9B,MAAM,EAAEyB,oBAAoBhC,aAAa;CAEzC,MAAM,CAACiC,YAAYC,iBAAiB7B,SAASS,gBAAgB;CAC7D,MAAM,CAACqB,WAAWC,gBAAgB/B,SAAS,EAAE,CAAC;CAC9C,MAAM,CAACgC,cAAcC,mBAAmBjC,SAAS,KAAK;CACtD,MAAM,CAACwB,OAAOU,YAAYlC,SAAS,GAAG;CAEtC,MAAM,CAACmC,cAAcC,mBAAmBpC,SAAS,uBAAuB;CACxE,MAAM,CAACqC,gBAAgBC,qBAAqBtC,SAAS,WAAW;CAEhE,MAAMuC,kBAAkBxC,OAAO,KAAK;CACpC,MAAMyC,gBAAgBzC,OAAO,KAAK;CAClC,MAAM,CAAC0C,cAAcC,mBAAmB1C,SAAS,MAAM;CAEvD,MAAM2C,2BAA2B9C,aAAY+C,UAAS;AACpDR,kBAAgBQ,MAAMC,OAAOC,MAAM;IAClC,EAAE,CAAC;CAEN,MAAMC,6BAA6BlD,aAAY+C,YAAS;AACtDN,oBAAkBM,QAAMC,OAAOC,MAAM;IACpC,EAAE,CAAC;CAEN,MAAM,CAACE,OAAOC,YAAYjD,SAAS,CACjC;EACEkD,aAAa;GACXC,eAAe;GACfC,cAAc;GACdC,OAAO3B,EAAE,+BAA+B,EAAE4B,cAAc,eAAe,CAAC;GACxEC,UAAU7B,EAAE,uCAAuC,EACjD4B,cAAc,0CACf,CAAA;GACF;EACDE,WAAW9B,EAAE,0BAA0B,EAAE4B,cAAc,UAAU,CAAC;EAClEG,WAAW;EACXC,SAAS,EAAA;EACV,EACD;EACER,aAAa;GACXC,eAAe;GACfC,cAAc;GACdC,OAAO3B,EAAE,6BAA6B,EAAE4B,cAAc,aAAa,CAAC;GACpEC,UAAU7B,EAAE,qCAAqC,EAC/C4B,cAAc,4CACf,CAAA;GACF;EACDE,WAAW9B,EAAE,0BAA0B,EAAE4B,cAAc,UAAU,CAAC;EAClEG,WAAW;EACXC,SAAS,EAAA;EACV,CACF,CAAC;CAEF,MAAMC,gBAAgB9D,kBAAkB;AACtCoC,kBAAgB,KAAK;AACrBF,gBAAa6B,UAAS;GAAE,GAAGA;IAAOlD,iBAAiB;GAAO,EAAE;AAC5DmB,gBAAcpB,gBAAgB;IAC7B,EAAE,CAAC;CAEN,MAAMoD,eAAehE,YAAY,YAAY;AAC3CoC,kBAAgB,KAAK;AACrBhB,sBAAoB,KAAK;AACzB,MAAI,CAACO,OAAOsC,MAAM,CAChB;EAGF,MAAME,QADuB,MAAMnD,eAAeW,MAAM,EACtByC;AAClC,MAAID,KACF/B,iBAAgB+B,KAAK;AAGvB/C,sBAAoB,MAAM;AAE1Bc,gBAAa6B,YAAS;GAAE,GAAGA;IAAOnD,kBAAkB;GAAM,EAAE;AAC5DoB,gBAAcnB,eAAe;IAC5B;EAACG;EAAgBI;EAAqBO;EAAM,CAAC;CAEhD,MAAM0C,WAAWrE,YACf,OAAMsE,WAAU;AACdlD,sBAAoB,KAAK;AAEzB,MAAIoB,mBAAmB,SACrB8B,QAAOC,WAAW;MAElBD,QAAOC,WAAW;AAGpB,MAAIjC,iBAAiB,uBACnBgC,QAAOE,kBAAkB;AAG3B,MAAIF,OAAO3C,MACT2C,QAAO3C,QAAQ2C,OAAO3C,MAAM8C,aAAa,CAACR,MAAM;AAElDK,WAAS;GAAE,GAAGA;GAAQI,gBAAgB,CAACJ,OAAOK;GAAQ;AACtD,MAAI;AACF,OAAIxC,cAAc;AAGhBA,iBAAaZ,YAAYE,aAAa6C,OAAO/C,YAAYE;AACzDU,iBAAaZ,YAAYG,YAAY4C,OAAO/C,YAAYG;AACxDS,iBAAaZ,YAAYK,SAAS0C,OAAO/C,YAAYK;AAErD,UAAMV,2BAA2BiB,aAAaZ,YAAYC,SAASW,aAAa;SAEhF,OAAMlB,iBAAiBqD,OAAO;WAEzBM,KAAK;AACZ9C,mBAAgB8C,IAAIC,SAAS;IAC3BC,SAAS;IACTC,cAAc;KACZC,UAAU;KACVC,YAAY;KACd;IACD,CAAC;;AAGJ7D,sBAAoB,MAAM;IAE5B;EACEe;EACAL;EACAb;EACAC;EACAE;EACAoB;EACAF;EACAf;EAEJ,CAAC;CAED,MAAM2D,aAAalF,kBAAkB;AACnC,MAAI0C,gBAAgByC,QAClBzC,iBAAgByC,SAAS;IAE1B,EAAE,CAAC;AAGNlF,iBAAgB;AACdmD,YAASW,WAAQ;GACf,MAAMqB,UAAU,CAAC,GAAGrB,OAAK;AACzBqB,WAAQxE,iBAAiBiD,UAAU,CACjC;IACEL,OAAO3B,EAAE,eAAe,EAAE4B,cAAc,QAAQ,CAAC;IACjD4B,QAAQ;IACRP,SAAS;IACTQ,UAAU,CAAC1C;IACX2C,cAAcvB;IACf,CACF;AACDoB,WAAQvE,gBAAgBgD,UAAU,CAChC;IACEL,OAAO3B,EAAE,eAAe,EAAE4B,cAAc,QAAQ,CAAC;IACjD4B,QAAQ;IACRP,SAAS;IACTS,cAAczB;IACdwB,UAAUjE;IACX,EACD;IACEmC,OAAO3B,EAAE,yBAAyB,EAAE4B,cAAc,eAAe,CAAC;IAClE4B,QAAQ;IACRP,SAAS;IACTS,cAAcL;IACdI,UAAUjE;IACX,CACF;AACD,UAAO+D;IACP;IACD;EAACpB;EAAcF;EAAeoB;EAAYrD;EAAGR;EAAkBuB;EAAa,CAAC;AAEhF3C,iBAAgB;AACd,MAAIkC,aACFiB,WAASW,WAAQ;GACf,MAAMqB,YAAU,CAAC,GAAGrB,OAAK;AACzBqB,aAAQvE,gBAAgBwC,YAAYK,WAAW7B,EAC7C,yCACA,EACE4B,cACE,kFAEN,CAAC;AACD2B,aAAQvE,gBAAgBgD,QAAQ,GAAGL,QAAQ3B,EACzC,8BACA,EAAE4B,cAAc,sBAClB,CAAC;AACD,UAAO2B;IACP;MAEFhC,WAASW,WAAQ;GACf,MAAMqB,YAAU,CAAC,GAAGrB,OAAK;AACzBqB,aAAQvE,gBAAgBwC,YAAYK,WAAW7B,EAC7C,qCACA,EAAE4B,cAAc,4CAClB,CAAC;AACD2B,aAAQvE,gBAAgBgD,QAAQ,GAAGL,QAAQ3B,EAAE,yBAAyB,EACpE4B,cAAc,eACf,CAAC;AACF,UAAO2B;IACP;IAEH,CAACjD,cAAcN,EAAE,CAAC;AAErB,QACE,sBAAA,cAAC,MAAD;EACYwC;EACV,SAAS,EAAEmB,mBAAmB;AAC5B9C,mBAAgByC,UAAUK;AAC1B,UACE,sBAAA,cAAC,YAAD;IACSrC;IACKpB;IACDE;IACX,aAAY;IACZ,cAAa;IACb,eAAc;IAiDH,EA/CVF,eAAe,KACd,sBAAA,cAAC,OAAD;IACE,KAAKY;IACL,WAAWhC;IACX,OAAOkB,EAAE,2BAA2B,EAAE4B,cAAc,SAAS,CAAC;IAC9D,IAAG;IACH,MAAK;IACL,YAAW;IACX,aAAY;IACZ,UAAA;IACA,OAAO9B;IACP,WAAUsB,UAAS;AACjB,SACE,CAAC,wJAAwJwC,KACvJxC,MACD,IACD,KAAKA,MAAMyC,MAAM,IAAI,CAAC,GAAGC,QACzB;AACA9C,sBAAgB,MAAM;AACtB,aAAOhB,EAAE,sCAAsC,EAC7C4B,cAAc,yBACf,CAAC;WAEFZ,iBAAgB,KAAK;;IAGzB,WAAU+C,MAAKvD,SAASuD,EAAE5C,OAAOC,MAAM;IACvC,YAAW2C,QAAK;AACd,SAAIA,IAAEC,QAAQ,SAAS;AACrBD,UAAEE,gBAAgB;AAClB9B,oBAAc;;;IAIrB,CAAA,EACAjC,eAAe,KACd,sBAAA,cAAC,gBAAD;IACaZ;IACX,YAAYgB;IACcW;IACZR;IACcY;IACZV;IAChB,gBAAgB;IACClB;IAEpB,CAAA,CACU;;EAGjB,CAAA"}