import React, { useCallback } from 'react'; import type { IUserHasId } from '@growi/core'; import { UserPicture } from '@growi/ui/dist/components'; import { format as dateFnsFormat } from 'date-fns/format'; import { useTranslation } from 'next-i18next'; import AdminUsersContainer from '~/client/services/AdminUsersContainer'; import { UserStatus } from '~/server/models/user/conts'; import { withUnstatedContainers } from '../../UnstatedUtils'; import { SortIcons } from './SortIcons'; import UserMenu from './UserMenu'; type UserTableExternalProps = Record; type UserTableProps = UserTableExternalProps & { adminUsersContainer: AdminUsersContainer; }; const UserTable = (props: UserTableProps) => { const { t } = useTranslation('admin'); const { adminUsersContainer } = props; const getUserStatusLabel = (userStatus: number) => { let additionalClassName = 'text-bg-info'; let text = 'Approval Pending'; switch (userStatus) { case 1: additionalClassName = 'text-bg-info'; text = 'Approval Pending'; break; case 2: additionalClassName = 'text-bg-success'; text = 'Active'; break; case 3: additionalClassName = 'text-bg-warning'; text = 'Suspended'; break; case 4: additionalClassName = 'text-bg-danger'; text = 'Deleted'; break; case 5: additionalClassName = 'text-bg-secondary'; text = 'Invited'; break; } return {text}; }; const sortIconsClickedHandler = useCallback( async (sort: string, sortOrder: string) => { const isAsc = sortOrder === 'asc'; await adminUsersContainer.sort(sort, isAsc); }, [adminUsersContainer], ); const isCurrentSortOrderAsc = adminUsersContainer.state.sortOrder === 'asc'; return (
{adminUsersContainer.state.users.map((user: IUserHasId) => { return ( ); })}
#
{t('user_management.status')}
sortIconsClickedHandler('status', sortOrder) } />
username
sortIconsClickedHandler('username', sortOrder) } />
{t('Name')}
sortIconsClickedHandler('name', sortOrder) } />
{t('Email')}
sortIconsClickedHandler('email', sortOrder) } />
{t('Created')}
sortIconsClickedHandler('createdAt', sortOrder) } />
{t('last_login')}
sortIconsClickedHandler('lastLoginAt', sortOrder) } />
{getUserStatusLabel(user.status)} {user.admin && ( {t('admin:user_management.user_table.administrator')} )} {user.readOnly && ( {t('admin:user_management.user_table.read_only')} )} {user.status === UserStatus.STATUS_DELETED ? (

{t('admin:user_management.user_table.deleted_user')}

) : ( {user.username} )}
{user.name} {user.email} {dateFnsFormat(user.createdAt, 'yyyy-MM-dd')} {user.lastLoginAt && ( {dateFnsFormat( new Date(user.lastLoginAt), 'yyyy-MM-dd HH:mm', )} )}
); }; const UserTableWrapper = withUnstatedContainers< UserTableExternalProps, UserTableProps >(UserTable, [AdminUsersContainer]); export default UserTableWrapper;