Skip to content

Commit d1fa379

Browse files
committed
feat: integrate Sidebar component into Layout and enhance SidebarNav with new structure; add tests for SidebarNav
1 parent 8ae0ff2 commit d1fa379

File tree

3 files changed

+73
-24
lines changed

3 files changed

+73
-24
lines changed

examples/crm-app/src/App.tsx

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { useEffect } from 'react';
22
import { BrowserRouter, Routes, Route, Outlet, Link, useLocation } from 'react-router-dom';
3+
import { SidebarProvider, SidebarInset, SidebarTrigger } from '@object-ui/components';
34
import { SchemaRendererProvider, SchemaRenderer, useRenderer } from '@object-ui/react';
45
import { registerFields } from '@object-ui/fields';
56
import { registerLayout } from '@object-ui/layout';
@@ -100,12 +101,19 @@ const contactsSchema = {
100101
// Layout Shell Component
101102
const Layout = () => {
102103
return (
103-
<div className="flex h-screen bg-gray-50 dark:bg-gray-900">
104-
<SidebarNav />
105-
<main className="flex-1 overflow-y-auto p-8">
106-
<Outlet />
107-
</main>
108-
</div>
104+
<SidebarProvider>
105+
<div className="flex min-h-screen w-full bg-gray-50 dark:bg-gray-900">
106+
<SidebarNav />
107+
<SidebarInset>
108+
<div className="p-4">
109+
<SidebarTrigger className="md:hidden" />
110+
</div>
111+
<main className="flex-1 overflow-y-auto p-4 md:p-8">
112+
<Outlet />
113+
</main>
114+
</SidebarInset>
115+
</div>
116+
</SidebarProvider>
109117
);
110118
};
111119

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { render, screen } from '@testing-library/react';
2+
import { BrowserRouter } from 'react-router-dom';
3+
import { SidebarNav } from './SidebarNav';
4+
import { describe, it, expect } from 'vitest';
5+
import { SidebarProvider } from '@object-ui/components';
6+
import React from 'react';
7+
8+
describe('SidebarNav', () => {
9+
it('renders without crashing using default items', () => {
10+
render(
11+
<SidebarProvider>
12+
<BrowserRouter>
13+
<SidebarNav />
14+
</BrowserRouter>
15+
</SidebarProvider>
16+
);
17+
expect(screen.getByText('Dashboard')).toBeDefined();
18+
});
19+
20+
it('renders custom items if provided', () => {
21+
const customItems = [
22+
{ title: 'Custom Link', href: '/custom' }
23+
];
24+
render(
25+
<SidebarProvider>
26+
<BrowserRouter>
27+
<SidebarNav items={customItems} />
28+
</BrowserRouter>
29+
</SidebarProvider>
30+
);
31+
expect(screen.getByText('Custom Link')).toBeDefined();
32+
});
33+
});
34+

examples/crm-app/src/components/SidebarNav.tsx

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import {
99
FileText
1010
} from 'lucide-react';
1111
import {
12+
Sidebar,
13+
SidebarContent,
1214
SidebarGroup,
1315
SidebarGroupLabel,
1416
SidebarGroupContent,
@@ -51,26 +53,31 @@ export const mainNavItems: NavItem[] = [
5153
},
5254
];
5355

54-
export function SidebarNav({ items }: { items: NavItem[] }) {
56+
export function SidebarNav({ items = mainNavItems }: { items?: NavItem[] }) {
5557
const location = useLocation();
5658

5759
return (
58-
<SidebarGroup>
59-
<SidebarGroupLabel>Application</SidebarGroupLabel>
60-
<SidebarGroupContent>
61-
<SidebarMenu>
62-
{items.map((item) => (
63-
<SidebarMenuItem key={item.href}>
64-
<SidebarMenuButton asChild isActive={location.pathname === item.href}>
65-
<NavLink to={item.href}>
66-
{item.icon && <item.icon />}
67-
<span>{item.title}</span>
68-
</NavLink>
69-
</SidebarMenuButton>
70-
</SidebarMenuItem>
71-
))}
72-
</SidebarMenu>
73-
</SidebarGroupContent>
74-
</SidebarGroup>
60+
<Sidebar>
61+
<SidebarContent>
62+
<SidebarGroup>
63+
<SidebarGroupLabel>Application</SidebarGroupLabel>
64+
<SidebarGroupContent>
65+
<SidebarMenu>
66+
{items.map((item) => (
67+
<SidebarMenuItem key={item.href}>
68+
<SidebarMenuButton asChild isActive={location.pathname === item.href}>
69+
<NavLink to={item.href}>
70+
{item.icon && <item.icon />}
71+
<span>{item.title}</span>
72+
</NavLink>
73+
</SidebarMenuButton>
74+
</SidebarMenuItem>
75+
))}
76+
</SidebarMenu>
77+
</SidebarGroupContent>
78+
</SidebarGroup>
79+
</SidebarContent>
80+
</Sidebar>
7581
);
7682
}
83+

0 commit comments

Comments
 (0)