grafana/public/app/features/users/UsersTable.tsx

71 lines
2.1 KiB
TypeScript
Raw Normal View History

import React, { FC, useState } from 'react';
2018-10-03 02:43:10 -05:00
import { OrgUser } from 'app/types';
import { OrgRolePicker } from '../admin/OrgRolePicker';
import { Button, ConfirmModal } from '@grafana/ui';
import { OrgRole } from '@grafana/data';
2018-10-03 02:43:10 -05:00
export interface Props {
users: OrgUser[];
onRoleChange: (role: OrgRole, user: OrgUser) => void;
2018-10-03 02:43:10 -05:00
onRemoveUser: (user: OrgUser) => void;
}
const UsersTable: FC<Props> = props => {
2018-10-03 02:43:10 -05:00
const { users, onRoleChange, onRemoveUser } = props;
const [showRemoveModal, setShowRemoveModal] = useState<string | boolean>(false);
2018-10-03 02:43:10 -05:00
return (
<table className="filter-table form-inline">
<thead>
<tr>
<th />
<th>Login</th>
<th>Email</th>
<th>Name</th>
2018-10-03 02:43:10 -05:00
<th>Seen</th>
<th>Role</th>
<th style={{ width: '34px' }} />
</tr>
</thead>
<tbody>
{users.map((user, index) => {
return (
<tr key={`${user.userId}-${index}`}>
<td className="width-4 text-center">
<img className="filter-table__avatar" src={user.avatarUrl} />
</td>
<td>{user.login}</td>
2018-10-03 02:43:10 -05:00
<td>
<span className="ellipsis">{user.email}</span>
</td>
<td>{user.name}</td>
2018-10-03 02:43:10 -05:00
<td>{user.lastSeenAtAge}</td>
<td className="width-8">
<OrgRolePicker value={user.role} onChange={newRole => onRoleChange(newRole, user)} />
2018-10-03 02:43:10 -05:00
</td>
2018-10-03 02:43:10 -05:00
<td>
<Button size="sm" variant="destructive" onClick={() => setShowRemoveModal(user.login)} icon="times" />
<ConfirmModal
body={`Are you sure you want to delete user ${user.login}?`}
confirmText="Delete"
title="Delete"
onDismiss={() => setShowRemoveModal(false)}
isOpen={user.login === showRemoveModal}
onConfirm={() => {
onRemoveUser(user);
}}
/>
2018-10-03 02:43:10 -05:00
</td>
</tr>
);
})}
</tbody>
</table>
);
};
export default UsersTable;