Skip to content

Commit 1f562a3

Browse files
committed
refactor: extract user menu to be TableRowMenu
1 parent ef73ad9 commit 1f562a3

File tree

3 files changed

+59
-5
lines changed

3 files changed

+59
-5
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { ComponentMeta, Story } from "@storybook/react"
2+
import React from "react"
3+
import { TableRowMenu, TableRowMenuProps } from "./TableRowMenu"
4+
5+
export default {
6+
title: "components/TableRowMenu",
7+
component: TableRowMenu,
8+
} as ComponentMeta<typeof TableRowMenu>
9+
10+
type DataType = {
11+
id: string
12+
}
13+
14+
const Template: Story<TableRowMenuProps<DataType>> = (args) => <TableRowMenu {...args} />
15+
16+
export const Example = Template.bind({})
17+
Example.args = {
18+
data: { id: "123" },
19+
menuItems: [
20+
{ label: "Suspend", onClick: (data) => alert(data.id) },
21+
{ label: "Update", onClick: (data) => alert(data.id) },
22+
{ label: "Delete", onClick: (data) => alert(data.id) },
23+
],
24+
}

site/src/components/UsersTable/UserMenu.tsx renamed to site/src/components/TableRowMenu/TableRowMenu.tsx

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,16 @@ import Menu, { MenuProps } from "@material-ui/core/Menu"
33
import MenuItem from "@material-ui/core/MenuItem"
44
import MoreVertIcon from "@material-ui/icons/MoreVert"
55
import React from "react"
6-
import { UserResponse } from "../../api/types"
76

8-
export const UserMenu: React.FC<{ user: UserResponse }> = () => {
7+
export interface TableRowMenuProps<TData> {
8+
data: TData
9+
menuItems: Array<{
10+
label: string
11+
onClick: (data: TData) => void
12+
}>
13+
}
14+
15+
export const TableRowMenu = <T,>({ data, menuItems }: TableRowMenuProps<T>): JSX.Element => {
916
const [anchorEl, setAnchorEl] = React.useState<MenuProps["anchorEl"]>(null)
1017

1118
const handleClick = (event: React.MouseEvent) => {
@@ -22,7 +29,17 @@ export const UserMenu: React.FC<{ user: UserResponse }> = () => {
2229
<MoreVertIcon />
2330
</IconButton>
2431
<Menu id="simple-menu" anchorEl={anchorEl} keepMounted open={Boolean(anchorEl)} onClose={handleClose}>
25-
<MenuItem onClick={handleClose}>Suspend</MenuItem>
32+
{menuItems.map((item) => (
33+
<MenuItem
34+
key={item.label}
35+
onClick={() => {
36+
handleClose()
37+
item.onClick(data)
38+
}}
39+
>
40+
{item.label}
41+
</MenuItem>
42+
))}
2643
</Menu>
2744
</>
2845
)

site/src/components/UsersTable/UsersTable.tsx

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@ import React from "react"
22
import { UserResponse } from "../../api/types"
33
import { EmptyState } from "../EmptyState/EmptyState"
44
import { Column, Table } from "../Table/Table"
5+
import { TableRowMenu } from "../TableRowMenu/TableRowMenu"
56
import { UserCell } from "../UserCell/UserCell"
6-
import { UserMenu } from "./UserMenu"
77

88
const Language = {
99
pageTitle: "Users",
1010
usersTitle: "All users",
1111
emptyMessage: "No users found",
1212
usernameLabel: "User",
13+
suspendMenuItem: "Suspend",
1314
}
1415

1516
const emptyState = <EmptyState message={Language.emptyMessage} />
@@ -35,7 +36,19 @@ export const UsersTable: React.FC<UsersTableProps> = ({ users }) => {
3536
data={users}
3637
title={Language.usersTitle}
3738
emptyState={emptyState}
38-
rowMenu={(user) => <UserMenu user={user} />}
39+
rowMenu={(user) => (
40+
<TableRowMenu
41+
data={user}
42+
menuItems={[
43+
{
44+
label: Language.suspendMenuItem,
45+
onClick: () => {
46+
// TO-DO: Add suspend action here
47+
},
48+
},
49+
]}
50+
/>
51+
)}
3952
/>
4053
)
4154
}

0 commit comments

Comments
 (0)