Skip to content

Commit efdae99

Browse files
committed
Extract tabs from users layout
1 parent 1ad998e commit efdae99

File tree

2 files changed

+77
-75
lines changed

2 files changed

+77
-75
lines changed

site/src/components/Tabs/Tabs.tsx

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import { ReactNode } from "react";
2+
import { NavLink, NavLinkProps } from "react-router-dom";
3+
import { combineClasses } from "utils/combineClasses";
4+
import { Margins } from "components/Margins/Margins";
5+
import { css } from "@emotion/css";
6+
import { useTheme } from "@mui/material/styles";
7+
8+
export const Tabs = ({ children }: { children: ReactNode }) => {
9+
return (
10+
<div
11+
css={(theme) => ({
12+
borderBottom: `1px solid ${theme.palette.divider}`,
13+
marginBottom: theme.spacing(5),
14+
})}
15+
>
16+
<Margins
17+
css={(theme) => ({
18+
display: "flex",
19+
alignItems: "center",
20+
gap: theme.spacing(0.25),
21+
})}
22+
>
23+
{children}
24+
</Margins>
25+
</div>
26+
);
27+
};
28+
29+
export const TabLink = (props: NavLinkProps) => {
30+
const theme = useTheme();
31+
32+
const baseTabLink = css`
33+
text-decoration: none;
34+
color: ${theme.palette.text.secondary};
35+
font-size: 14px;
36+
display: block;
37+
padding: ${theme.spacing(0, 2, 2)};
38+
39+
&:hover {
40+
color: ${theme.palette.text.primary};
41+
}
42+
`;
43+
44+
const activeTabLink = css`
45+
color: ${theme.palette.text.primary};
46+
position: relative;
47+
48+
&:before {
49+
content: "";
50+
left: 0;
51+
bottom: 0;
52+
height: 2px;
53+
width: 100%;
54+
background: ${theme.palette.secondary.dark};
55+
position: absolute;
56+
}
57+
`;
58+
59+
return (
60+
<NavLink
61+
className={({ isActive }) =>
62+
combineClasses([
63+
baseTabLink,
64+
isActive ? activeTabLink : undefined,
65+
props.className as string,
66+
])
67+
}
68+
{...props}
69+
/>
70+
);
71+
};
Lines changed: 6 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,17 @@
11
import Button from "@mui/material/Button";
22
import Link from "@mui/material/Link";
3-
import { makeStyles } from "@mui/styles";
43
import GroupAdd from "@mui/icons-material/GroupAddOutlined";
54
import PersonAdd from "@mui/icons-material/PersonAddOutlined";
65
import { USERS_LINK } from "components/Dashboard/Navbar/NavbarView";
76
import { PageHeader, PageHeaderTitle } from "components/PageHeader/PageHeader";
87
import { useFeatureVisibility } from "hooks/useFeatureVisibility";
98
import { usePermissions } from "hooks/usePermissions";
109
import { FC } from "react";
11-
import {
12-
Link as RouterLink,
13-
NavLink,
14-
Outlet,
15-
useNavigate,
16-
} from "react-router-dom";
17-
import { combineClasses } from "utils/combineClasses";
10+
import { Link as RouterLink, Outlet, useNavigate } from "react-router-dom";
1811
import { Margins } from "components/Margins/Margins";
19-
import { Stack } from "components/Stack/Stack";
12+
import { TabLink, Tabs } from "components/Tabs/Tabs";
2013

2114
export const UsersLayout: FC = () => {
22-
const styles = useStyles();
2315
const { createUser: canCreateUser, createGroup: canCreateGroup } =
2416
usePermissions();
2517
const navigate = useNavigate();
@@ -53,75 +45,14 @@ export const UsersLayout: FC = () => {
5345
</PageHeader>
5446
</Margins>
5547

56-
<div className={styles.tabs}>
57-
<Margins>
58-
<Stack direction="row" spacing={0.25}>
59-
<NavLink
60-
end
61-
to={USERS_LINK}
62-
className={({ isActive }) =>
63-
combineClasses([
64-
styles.tabItem,
65-
isActive ? styles.tabItemActive : undefined,
66-
])
67-
}
68-
>
69-
Users
70-
</NavLink>
71-
<NavLink
72-
to="/groups"
73-
className={({ isActive }) =>
74-
combineClasses([
75-
styles.tabItem,
76-
isActive ? styles.tabItemActive : undefined,
77-
])
78-
}
79-
>
80-
Groups
81-
</NavLink>
82-
</Stack>
83-
</Margins>
84-
</div>
48+
<Tabs>
49+
<TabLink to={USERS_LINK}>Users</TabLink>
50+
<TabLink to="/groups">Groups</TabLink>
51+
</Tabs>
8552

8653
<Margins>
8754
<Outlet />
8855
</Margins>
8956
</>
9057
);
9158
};
92-
93-
export const useStyles = makeStyles((theme) => {
94-
return {
95-
tabs: {
96-
borderBottom: `1px solid ${theme.palette.divider}`,
97-
marginBottom: theme.spacing(5),
98-
},
99-
100-
tabItem: {
101-
textDecoration: "none",
102-
color: theme.palette.text.secondary,
103-
fontSize: 14,
104-
display: "block",
105-
padding: theme.spacing(0, 2, 2),
106-
107-
"&:hover": {
108-
color: theme.palette.text.primary,
109-
},
110-
},
111-
112-
tabItemActive: {
113-
color: theme.palette.text.primary,
114-
position: "relative",
115-
116-
"&:before": {
117-
content: `""`,
118-
left: 0,
119-
bottom: 0,
120-
height: 2,
121-
width: "100%",
122-
background: theme.palette.secondary.dark,
123-
position: "absolute",
124-
},
125-
},
126-
};
127-
});

0 commit comments

Comments
 (0)