Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(console): admin can not disable itself #849

Merged
merged 1 commit into from
Aug 2, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 22 additions & 44 deletions console/src/pages/Admin/UserManagement.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import React, { useState, useEffect } from 'react'
import { Button, SIZE as ButtonSize, SIZE } from 'baseui/button'
import { StyledLink } from 'baseui/link'
import Card from '@/components/Card'
import IconFont from '@/components/IconFont'
import Table from '@/components/Table'
import Button from '@/components/Button'
import { usePage } from '@/hooks/usePage'
import useTranslation from '@/hooks/useTranslation'
import { formatTimestampDateTime } from '@/utils/datetime'
Expand All @@ -19,32 +18,14 @@ import generatePassword from '@/utils/passwordGenerator'
import Input from '@/components/Input'
import CopyToClipboard from 'react-copy-to-clipboard'
import PasswordForm from '@user/components/PasswordForm'

interface IActionProps {
title: string
marginRight?: boolean
onClick: () => Promise<void>
}
import { useCurrentUser } from '@/hooks/useCurrentUser'

interface IPasswordResultProps {
title: string
longTips: string
password: string
}

const ActionButton: React.FC<IActionProps> = ({ title, marginRight = false, onClick }: IActionProps) => {
const style = {
textDecoration: 'none',
marginRight: marginRight ? '10px' : '0px',
}

return (
<StyledLink style={style} onClick={onClick}>
{title}
</StyledLink>
)
}

export default function UserManagement() {
const [page] = usePage()
const [t] = useTranslation()
Expand All @@ -54,7 +35,9 @@ export default function UserManagement() {
const [filter, updateFilter] = useState('')
const [showAddUser, setShowAddUser] = useState(false)
const [passwordResult, setPasswordResult] = useState<IPasswordResultProps | undefined>()
const [currentUser, setCurrentUser] = useState<IUserSchema | undefined>(undefined)
const [modifyingUser, setModifyingUser] = useState<IUserSchema | undefined>(undefined)
// eslint-disable-next-line react-hooks/exhaustive-deps
const { currentUser } = useCurrentUser()

useEffect(() => {
const items = users.data?.list ?? []
Expand All @@ -80,7 +63,7 @@ export default function UserManagement() {
setShowAddUser(false)
} else {
await changeUserPasswd(userName, originPwd, pass)
setCurrentUser(undefined)
setModifyingUser(undefined)
}

if (useRandom) {
Expand All @@ -105,11 +88,7 @@ export default function UserManagement() {
<Card
title={t('Manage Users')}
extra={
<Button
startEnhancer={<IconFont type='add' kind='white' />}
size={ButtonSize.compact}
onClick={() => setShowAddUser(true)}
>
<Button startEnhancer={<IconFont type='add' kind='white' />} onClick={() => setShowAddUser(true)}>
{t('Add User')}
</Button>
}
Expand All @@ -130,18 +109,17 @@ export default function UserManagement() {
user.isEnabled ? t('Enabled User') : t('Disabled User'),
user.createdTime && formatTimestampDateTime(user.createdTime),
<div key={user.id}>
<ActionButton
marginRight
title={user.isEnabled ? t('Disable User') : t('Enable User')}
<Button
as='link'
onClick={() => changUserState(user.id, !user.isEnabled)}
/>
&nbsp; {/* make segmenter works well when double click */}
<ActionButton
title={t('Change Password')}
onClick={async () => {
setCurrentUser(user)
}}
/>
disabled={user.id === currentUser?.id}
>
{user.isEnabled ? t('Disable User') : t('Enable User')}
</Button>
&nbsp; &nbsp;
<Button as='link' onClick={() => setModifyingUser(user)}>
{t('Change Password')}
</Button>
</div>,
]) ?? []
}
Expand All @@ -168,24 +146,24 @@ export default function UserManagement() {
toaster.positive(t('Copied'), { autoHideDuration: 1000 })
}}
>
<Button size={SIZE.compact}>copy</Button>
<Button>copy</Button>
</CopyToClipboard>
</div>
</ModalBody>
</Modal>
<Modal isOpen={!!currentUser} onClose={() => setCurrentUser(undefined)} closeable animate autoFocus>
<Modal isOpen={!!modifyingUser} onClose={() => setModifyingUser(undefined)} closeable animate autoFocus>
<ModalHeader>{t('Change Password')}</ModalHeader>
<hr />
<ModalBody>
<PasswordForm
admin
currentUser={currentUser}
currentUser={modifyingUser}
onSubmit={async ({ userPwd, originPwd }) => {
if (!currentUser) {
if (!modifyingUser) {
// unreachable, make eslint happy
return
}
await submitPasswd(false, currentUser.id, userPwd, originPwd)
await submitPasswd(false, modifyingUser.id, userPwd, originPwd)
}}
/>
</ModalBody>
Expand Down