Skip to content

Commit 3686aea

Browse files
authored
Sidebar should only show parent resources (#27)
* move resource type list over to a different file * added first test * test is working * filter out child resources * PR comments
1 parent 224351d commit 3686aea

File tree

10 files changed

+1881
-1012
lines changed

10 files changed

+1881
-1012
lines changed

package-lock.json

Lines changed: 827 additions & 990 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
"dev": "vite",
88
"build": "vite build",
99
"lint": "eslint .",
10-
"preview": "vite preview"
10+
"preview": "vite preview",
11+
"test": "vitest"
1112
},
1213
"dependencies": {
1314
"@hookform/resolvers": "^3.9.1",
@@ -39,6 +40,8 @@
3940
},
4041
"devDependencies": {
4142
"@eslint/js": "^9.13.0",
43+
"@testing-library/jest-dom": "^6.6.3",
44+
"@testing-library/react": "^16.2.0",
4245
"@types/node": "^22.8.7",
4346
"@types/react": "^18.3.12",
4447
"@types/react-dom": "^18.3.1",
@@ -48,6 +51,7 @@
4851
"eslint-plugin-react-hooks": "^5.0.0",
4952
"eslint-plugin-react-refresh": "^0.4.14",
5053
"globals": "^15.11.0",
54+
"jsdom": "^26.0.0",
5155
"postcss": "^8.4.47",
5256
"prettier": "3.3.3",
5357
"tailwindcss": "^3.4.17",
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { render, screen } from '@testing-library/react';
2+
import { ResourceTypeList } from './resource_type_list';
3+
import { describe, expect, it } from 'vitest';
4+
import fs from 'fs';
5+
import { parseOpenAPI } from '../../state/openapi'
6+
import { Sidebar, SidebarProvider } from '@/components/ui/sidebar';
7+
import { BrowserRouter } from 'react-router-dom';
8+
9+
describe('ResourceTypeList', () => {
10+
it("should render the correct number of links", () => {
11+
const fileContents = fs.readFileSync('src/example_oas.json', 'utf8');
12+
const openAPI = parseOpenAPI(fileContents);
13+
render(
14+
<BrowserRouter>
15+
<SidebarProvider>
16+
<ResourceTypeList resources={openAPI.resources()} />
17+
</SidebarProvider>
18+
</BrowserRouter>
19+
);
20+
21+
expect(screen.getByText('publishers')).toBeInTheDocument();
22+
expect(screen.getByText('books')).toBeInTheDocument();
23+
expect(screen.getByText('book-editions')).toBeInTheDocument();
24+
expect(screen.getByText('isbns')).toBeInTheDocument();
25+
26+
})
27+
});
28+
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { SidebarGroup, SidebarGroupLabel, SidebarMenu, SidebarMenuButton, SidebarMenuItem } from "@/components/ui/sidebar";
2+
import { ResourceSchema } from "@/state/openapi";
3+
import { Link } from "react-router-dom";
4+
5+
type ResourceTypeListProps = {
6+
resources: ResourceSchema[];
7+
};
8+
9+
export function ResourceTypeList(props: ResourceTypeListProps) {
10+
return (
11+
<SidebarGroup>
12+
<SidebarGroupLabel>Resources</SidebarGroupLabel>
13+
<SidebarMenu>
14+
{props.resources.map((resource: ResourceSchema) => (
15+
<ResourceMenuItem resource={resource} />
16+
))}
17+
</SidebarMenu>
18+
</SidebarGroup>
19+
);
20+
}
21+
22+
type ResourceMenuItemProps = {
23+
resource: ResourceSchema
24+
};
25+
26+
function ResourceMenuItem(props: ResourceMenuItemProps) {
27+
return (
28+
<SidebarMenuItem key={props.resource.singular_name}>
29+
<SidebarMenuButton asChild>
30+
<Link to={`${props.resource.base_url()}`}>
31+
<span>{props.resource.plural_name}</span>
32+
</Link>
33+
</SidebarMenuButton>
34+
</SidebarMenuItem>
35+
)
36+
}

src/components/app-sidebar.tsx

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,42 +4,25 @@ import {
44
SidebarContent,
55
SidebarGroup,
66
SidebarGroupContent,
7-
SidebarGroupLabel,
87
SidebarHeader,
98
SidebarInput,
10-
SidebarMenu,
11-
SidebarMenuButton,
12-
SidebarMenuItem,
139
SidebarRail,
1410
} from "@/components/ui/sidebar";
15-
import { Link } from "react-router-dom";
1611
import { useAppDispatch, useAppSelector } from "@/hooks/store";
17-
import { selectHeaders, selectResources, setHeaders } from "@/state/store";
12+
import { selectHeaders, selectRootResources, setHeaders } from "@/state/store";
1813
import { Label } from "./ui/label";
14+
import { ResourceTypeList } from "@/app/sidebar/resource_type_list";
1915

2016
export function AppSidebar({ ...props }: React.ComponentProps<typeof Sidebar>) {
21-
const resources = useAppSelector(selectResources);
17+
const resources = useAppSelector(selectRootResources);
2218

2319
return (
2420
<Sidebar {...props}>
2521
<SidebarHeader>
2622
<HeadersInput />
2723
</SidebarHeader>
2824
<SidebarContent>
29-
<SidebarGroup>
30-
<SidebarGroupLabel>Resources</SidebarGroupLabel>
31-
<SidebarMenu>
32-
{resources.map((resource) => (
33-
<SidebarMenuItem key={resource.singular_name}>
34-
<SidebarMenuButton asChild>
35-
<Link to={`${resource.base_url()}`}>
36-
<span>{resource.plural_name}</span>
37-
</Link>
38-
</SidebarMenuButton>
39-
</SidebarMenuItem>
40-
))}
41-
</SidebarMenu>
42-
</SidebarGroup>
25+
<ResourceTypeList resources={resources} />
4326
</SidebarContent>
4427
<SidebarRail />
4528
</Sidebar>

0 commit comments

Comments
 (0)