customerMembers.tsx 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import styled from '@emotion/styled';
  2. import moment from 'moment-timezone';
  3. import {UserAvatar} from 'sentry/components/core/avatar/userAvatar';
  4. import {Tag} from 'sentry/components/core/badge/tag';
  5. import {LinkButton} from 'sentry/components/core/button';
  6. import Link from 'sentry/components/links/link';
  7. import {IconMail} from 'sentry/icons';
  8. import {t} from 'sentry/locale';
  9. import {space} from 'sentry/styles/space';
  10. import ResultGrid from 'admin/components/resultGrid';
  11. type Props = {
  12. orgId: string;
  13. };
  14. const getRow = (row: any) => [
  15. <td key="name">
  16. <UserName>
  17. <UserAvatar user={row} size={18} />
  18. <LinkButton
  19. external
  20. priority="link"
  21. href={`mailto:${row.email}`}
  22. icon={<IconMail size="xs" />}
  23. title="Send email"
  24. aria-label={t('Send email')}
  25. />
  26. {row.user ? (
  27. <Link to={`/_admin/users/${row.user.id}/`}>{row.email}</Link>
  28. ) : (
  29. <span>{row.email}</span>
  30. )}
  31. {row.pending && <Tag type="warning">Invite Pending</Tag>}
  32. </UserName>
  33. </td>,
  34. <td key="role" style={{textAlign: 'center'}}>
  35. {row.roleName}
  36. </td>,
  37. <td key="lastLogin" style={{textAlign: 'right'}}>
  38. {row.user ? moment(row.user.lastLogin).fromNow() : null}
  39. </td>,
  40. <td key="lastActive" style={{textAlign: 'right'}}>
  41. {row.user?.lastActive ? moment(row.user.lastActive).fromNow() : null}
  42. </td>,
  43. <td key="created" style={{textAlign: 'right'}}>
  44. {moment(row.dateCreated).fromNow()}
  45. </td>,
  46. ];
  47. function CustomerMembers({orgId}: Props) {
  48. return (
  49. <ResultGrid
  50. inPanel
  51. panelTitle="Members"
  52. path={`/_admin/customers/${orgId}/`}
  53. endpoint={`/organizations/${orgId}/members/`}
  54. method="GET"
  55. defaultParams={{per_page: 10}}
  56. hasSearch
  57. columns={[
  58. <th key="name">Member</th>,
  59. <th key="role" style={{width: 150, textAlign: 'center'}}>
  60. Role
  61. </th>,
  62. <th key="lastLogin" style={{width: 150, textAlign: 'right'}}>
  63. Last Login
  64. </th>,
  65. <th key="lastActive" style={{width: 150, textAlign: 'right'}}>
  66. Last Active
  67. </th>,
  68. <th key="created" style={{width: 150, textAlign: 'right'}}>
  69. Created
  70. </th>,
  71. ]}
  72. columnsForRow={getRow}
  73. />
  74. );
  75. }
  76. const UserName = styled('div')`
  77. display: flex;
  78. gap: ${space(1)};
  79. align-items: center;
  80. `;
  81. export default CustomerMembers;