feat: [CODE-649]: Users Dropdown in Add New Member Dialog (#248)

This commit is contained in:
rajarshee.chatterjee@harness.io 2023-07-27 12:32:13 +00:00 committed by Harness
parent 43c8ee125d
commit 25031d113a

View File

@ -11,10 +11,11 @@ import {
MembershipAddRequestBody, MembershipAddRequestBody,
TypesMembership, TypesMembership,
TypesPrincipalInfo, TypesPrincipalInfo,
useListPrincipals,
useMembershipAdd, useMembershipAdd,
useMembershipUpdate useMembershipUpdate
} from 'services/code' } from 'services/code'
import { getErrorMessage } from 'utils/Utils' import { getErrorMessage, LIST_FETCHING_LIMIT } from 'utils/Utils'
import { roleStringKeyMap } from '../SpaceAccessControl' import { roleStringKeyMap } from '../SpaceAccessControl'
@ -23,6 +24,7 @@ const roles = ['reader', 'executor', 'contributor', 'space_owner'] as const
const useAddNewMember = ({ onClose }: { onClose: () => void }) => { const useAddNewMember = ({ onClose }: { onClose: () => void }) => {
const [isEditFlow, setIsEditFlow] = useState(false) const [isEditFlow, setIsEditFlow] = useState(false)
const [membershipDetails, setMembershipDetails] = useState<TypesMembership>() const [membershipDetails, setMembershipDetails] = useState<TypesMembership>()
const [searchTerm, setSearchTerm] = useState('')
const space = useGetSpaceParam() const space = useGetSpaceParam()
const { getString } = useStrings() const { getString } = useStrings()
@ -34,6 +36,16 @@ const useAddNewMember = ({ onClose }: { onClose: () => void }) => {
user_uid: membershipDetails?.principal?.uid || '' user_uid: membershipDetails?.principal?.uid || ''
}) })
const { data: users, loading: fetchingUsers } = useListPrincipals({
queryParams: {
query: searchTerm,
page: 1,
limit: LIST_FETCHING_LIMIT,
type: ['user']
},
debounce: 500
})
const roleOptions: SelectOption[] = useMemo( const roleOptions: SelectOption[] = useMemo(
() => () =>
roles.map(role => ({ roles.map(role => ({
@ -43,12 +55,26 @@ const useAddNewMember = ({ onClose }: { onClose: () => void }) => {
[] []
) )
const userOptions: SelectOption[] = useMemo(
() =>
users?.map(user => ({
value: user.uid as string,
label: (user.display_name || user.email) as string
})) || [],
[users]
)
const handleClose = () => {
setSearchTerm('')
hideModal()
}
const [openModal, hideModal] = useModalHook(() => { const [openModal, hideModal] = useModalHook(() => {
return ( return (
<Dialog <Dialog
isOpen isOpen
enforceFocus={false} enforceFocus={false}
onClose={hideModal} onClose={handleClose}
title={isEditFlow ? getString('changeRole') : getString('spaceMemberships.addMember')}> title={isEditFlow ? getString('changeRole') : getString('spaceMemberships.addMember')}>
<Formik<MembershipAddRequestBody> <Formik<MembershipAddRequestBody>
initialValues={{ initialValues={{
@ -68,18 +94,29 @@ const useAddNewMember = ({ onClose }: { onClose: () => void }) => {
showSuccess(getString('spaceMemberships.memberAdded')) showSuccess(getString('spaceMemberships.memberAdded'))
} }
hideModal() handleClose()
onClose() onClose()
} catch (error) { } catch (error) {
showError(getErrorMessage(error)) showError(getErrorMessage(error))
} }
}}> }}>
<FormikForm> <FormikForm>
<FormInput.Text <FormInput.Select
usePortal
name="user_uid" name="user_uid"
label={getString('userId')} label={getString('user')}
placeholder={getString('newUserModal.uidPlaceholder')} items={userOptions}
value={
isEditFlow
? {
label: membershipDetails?.principal?.display_name as string,
value: membershipDetails?.principal?.uid as string
}
: undefined
}
disabled={isEditFlow} disabled={isEditFlow}
onQueryChange={setSearchTerm}
selectProps={{ loadingItems: fetchingUsers }}
/> />
<FormInput.Select name="role" label={getString('role')} items={roleOptions} usePortal /> <FormInput.Select name="role" label={getString('role')} items={roleOptions} usePortal />
<Button <Button
@ -92,7 +129,7 @@ const useAddNewMember = ({ onClose }: { onClose: () => void }) => {
</Formik> </Formik>
</Dialog> </Dialog>
) )
}, [isEditFlow, membershipDetails]) }, [isEditFlow, membershipDetails, userOptions])
return { return {
openModal: (isEditing?: boolean, memberInfo?: TypesPrincipalInfo) => { openModal: (isEditing?: boolean, memberInfo?: TypesPrincipalInfo) => {