Some checks failed
Tests / Go Tests (push) Has been cancelled
Tests / Python Tests (push) Has been cancelled
Tests / Integration Tests (push) Has been cancelled
Tests / Go Lint (push) Has been cancelled
Tests / Python Lint (push) Has been cancelled
Tests / Security Scan (push) Has been cancelled
Tests / All Checks Passed (push) Has been cancelled
Security Scanning / Secret Scanning (push) Has been cancelled
Security Scanning / Dependency Vulnerability Scan (push) Has been cancelled
Security Scanning / Go Security Scan (push) Has been cancelled
Security Scanning / Python Security Scan (push) Has been cancelled
Security Scanning / Node.js Security Scan (push) Has been cancelled
Security Scanning / Docker Image Security (push) Has been cancelled
Security Scanning / Security Summary (push) Has been cancelled
CI/CD Pipeline / Go Tests (push) Has been cancelled
CI/CD Pipeline / Python Tests (push) Has been cancelled
CI/CD Pipeline / Website Tests (push) Has been cancelled
CI/CD Pipeline / Linting (push) Has been cancelled
CI/CD Pipeline / Security Scan (push) Has been cancelled
CI/CD Pipeline / Docker Build & Push (push) Has been cancelled
CI/CD Pipeline / Integration Tests (push) Has been cancelled
CI/CD Pipeline / Deploy to Staging (push) Has been cancelled
CI/CD Pipeline / Deploy to Production (push) Has been cancelled
CI/CD Pipeline / CI Summary (push) Has been cancelled
ci/woodpecker/manual/build-ci-image Pipeline was successful
ci/woodpecker/manual/main Pipeline failed
All services: admin-v2, studio-v2, website, ai-compliance-sdk, consent-service, klausur-service, voice-service, and infrastructure. Large PDFs and compiled binaries excluded via .gitignore.
74 lines
2.3 KiB
TypeScript
74 lines
2.3 KiB
TypeScript
'use client'
|
|
|
|
import Link from 'next/link'
|
|
import { usePathname } from 'next/navigation'
|
|
import { navigation, metaModules, getModuleByHref, getCategoryById, CategoryId } from '@/lib/navigation'
|
|
|
|
export function Breadcrumbs() {
|
|
const pathname = usePathname()
|
|
|
|
// Build breadcrumb items from path
|
|
const items: Array<{ label: string; href: string }> = []
|
|
|
|
// Always start with Dashboard (Home)
|
|
items.push({ label: 'Dashboard', href: '/dashboard' })
|
|
|
|
// Parse the path
|
|
const pathParts = pathname.split('/').filter(Boolean)
|
|
|
|
if (pathParts.length > 0) {
|
|
// Check if it's a category
|
|
const categoryId = pathParts[0] as CategoryId
|
|
const category = getCategoryById(categoryId)
|
|
|
|
if (category) {
|
|
// Add category
|
|
items.push({ label: category.name, href: `/${category.id}` })
|
|
|
|
// Check if there's a module
|
|
if (pathParts.length > 1) {
|
|
const moduleHref = `/${pathParts[0]}/${pathParts[1]}`
|
|
const result = getModuleByHref(moduleHref)
|
|
if (result) {
|
|
items.push({ label: result.module.name, href: moduleHref })
|
|
}
|
|
}
|
|
} else {
|
|
// Check meta modules (but skip dashboard as it's already added)
|
|
const metaModule = metaModules.find(m => m.href === `/${pathParts[0]}`)
|
|
if (metaModule && metaModule.href !== '/dashboard') {
|
|
items.push({ label: metaModule.name, href: metaModule.href })
|
|
}
|
|
}
|
|
}
|
|
|
|
// Don't show breadcrumbs for just dashboard
|
|
if (items.length <= 1) {
|
|
return null
|
|
}
|
|
|
|
return (
|
|
<nav className="flex items-center gap-2 text-sm text-slate-500 mb-4">
|
|
{items.map((item, index) => (
|
|
<span key={`${index}-${item.href}`} className="flex items-center gap-2">
|
|
{index > 0 && (
|
|
<svg className="w-4 h-4 text-slate-300" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5l7 7-7 7" />
|
|
</svg>
|
|
)}
|
|
{index === items.length - 1 ? (
|
|
<span className="text-slate-900 font-medium">{item.label}</span>
|
|
) : (
|
|
<Link
|
|
href={item.href}
|
|
className="hover:text-primary-600 transition-colors"
|
|
>
|
|
{item.label}
|
|
</Link>
|
|
)}
|
|
</span>
|
|
))}
|
|
</nav>
|
|
)
|
|
}
|