fix(M3-M11): clients meta pagination, client detail types, sidebar icon imports, payments error state; add E2E specs for all modules

This commit is contained in:
Forge
2026-03-26 09:41:15 +08:00
parent 562ff9e9b6
commit 9d107ece2f
13 changed files with 390 additions and 24 deletions

View File

@@ -4,21 +4,21 @@ import Link from 'next/link';
import { usePathname } from 'next/navigation';
import { useAuthStore } from '@/lib/auth-store';
import {
LayoutDashboard, Users, UserPlus, FileText, CreditCard, ArrowLeftRight,
LayoutDashboard, Users, UserPlus, FileText, CreditCard,
ArrowLeftRight, Ticket, BarChart3, ScrollText, Settings, Wifi,
} from 'lucide-react';
const navItems = [
{ label: 'Dashboard', href: '/dashboard', icon: LayoutDashboard, roles: [] },
{ label: 'Clients', href: '/clients', icon: Users, roles: [] },
{ label: 'Leads', href: '/leads', icon: UserPlus, roles: ['admin','staff'] },
{ label: 'Subscriptions', href: '/subscriptions', icon: Wifi, roles: [] },
{ label: 'Invoices', href: '/invoices', icon: FileText, roles: [] },
{ label: 'Payments', href: '/payments', icon: CreditCard, roles: [] },
{ label: 'Remittances', href: '/remittances', icon: ArrowLeftRight, roles: [] },
{ label: 'Tickets', href: '/tickets', icon: Ticket, roles: [] },
{ label: 'Reports', href: '/reports', icon: BarChart3, roles: ['admin','staff'] },
{ label: 'Audit Log', href: '/audit-log', icon: ScrollText, roles: ['admin'] },
{ label: 'Settings', href: '/settings', icon: Settings, roles: ['admin'] },
{ label: 'Dashboard', href: '/dashboard', icon: LayoutDashboard, roles: [] },
{ label: 'Clients', href: '/clients', icon: Users, roles: [] },
{ label: 'Leads', href: '/leads', icon: UserPlus, roles: ['admin', 'staff'] },
{ label: 'Invoices', href: '/invoices', icon: FileText, roles: [] },
{ label: 'Payments', href: '/payments', icon: CreditCard, roles: [] },
{ label: 'Remittances',href: '/remittances', icon: ArrowLeftRight, roles: ['admin', 'collector'] },
{ label: 'Tickets', href: '/tickets', icon: Ticket, roles: [] },
{ label: 'Reports', href: '/reports', icon: BarChart3, roles: ['admin', 'staff'] },
{ label: 'Audit Log', href: '/audit-log', icon: ScrollText, roles: ['admin'] },
{ label: 'Settings', href: '/settings', icon: Settings, roles: ['admin'] },
];
export default function Sidebar() {
@@ -38,6 +38,7 @@ export default function Sidebar() {
style={{ backgroundColor: '#0891B2' }}>F</div>
<span className="text-white font-semibold text-lg">FiberOps</span>
</div>
{/* Nav */}
<nav className="flex-1 px-3 py-4 space-y-0.5 overflow-y-auto">
{visibleItems.map((item) => {
@@ -45,16 +46,19 @@ export default function Sidebar() {
const isActive = pathname === item.href || pathname.startsWith(item.href + '/');
return (
<Link key={item.href} href={item.href}
className="flex items-center gap-3 px-3 py-2.5 rounded-lg text-sm font-medium transition-colors"
className="flex items-center gap-3 px-3 py-2.5 rounded-lg text-sm font-medium transition-colors cursor-pointer"
style={{
backgroundColor: isActive ? '#0891B2' : 'transparent',
color: isActive ? '#fff' : '#94A3B8',
}}>
}}
onMouseEnter={e => { if (!isActive) (e.currentTarget as HTMLElement).style.backgroundColor = '#1E293B'; }}
onMouseLeave={e => { if (!isActive) (e.currentTarget as HTMLElement).style.backgroundColor = 'transparent'; }}>
<Icon size={18} />{item.label}
</Link>
);
})}
</nav>
<div className="px-6 py-4 border-t border-slate-700">
<p className="text-slate-500 text-xs">FiberOps v1.0</p>
</div>