2026-07-09 11:14:33 +02:00
|
|
|
|
import { Link, useLocation } from 'react-router-dom'
|
2026-07-08 12:55:37 +02:00
|
|
|
|
import { useProgramScope } from '../context/ProgramScopeContext.jsx'
|
2026-07-09 11:14:33 +02:00
|
|
|
|
import { initiativeCatalogPath, projectPath, scopedPath } from '../utils/routes.js'
|
|
|
|
|
|
import {
|
|
|
|
|
|
resolveInitiativeHub,
|
|
|
|
|
|
resolvePortfolioHub,
|
|
|
|
|
|
} from '../utils/scopeNavigation.js'
|
2026-07-08 12:55:37 +02:00
|
|
|
|
|
|
|
|
|
|
export function ProgramScopeBar() {
|
2026-07-09 11:14:33 +02:00
|
|
|
|
const location = useLocation()
|
2026-07-08 12:55:37 +02:00
|
|
|
|
const {
|
|
|
|
|
|
initiativeId,
|
|
|
|
|
|
projectId,
|
|
|
|
|
|
initiativeTitle,
|
|
|
|
|
|
projectTitle,
|
|
|
|
|
|
clearScope,
|
|
|
|
|
|
setScope,
|
|
|
|
|
|
} = useProgramScope()
|
|
|
|
|
|
|
2026-07-09 11:14:33 +02:00
|
|
|
|
const portfolioTo = resolvePortfolioHub(location.pathname)
|
|
|
|
|
|
const initiativeTo = initiativeId
|
|
|
|
|
|
? resolveInitiativeHub(location.pathname, initiativeId, scopedPath)
|
|
|
|
|
|
: null
|
|
|
|
|
|
|
2026-07-08 12:55:37 +02:00
|
|
|
|
return (
|
|
|
|
|
|
<div className="program-scope-bar" aria-label="Programm-Scope">
|
|
|
|
|
|
<span className="program-scope-bar__label">Scope</span>
|
|
|
|
|
|
<nav className="program-scope-bar__trail">
|
|
|
|
|
|
<Link
|
2026-07-09 11:14:33 +02:00
|
|
|
|
to={portfolioTo}
|
2026-07-08 12:55:37 +02:00
|
|
|
|
className={
|
|
|
|
|
|
'program-scope-bar__crumb' +
|
|
|
|
|
|
(!initiativeId ? ' program-scope-bar__crumb--active' : '')
|
|
|
|
|
|
}
|
|
|
|
|
|
onClick={() => clearScope()}
|
|
|
|
|
|
>
|
|
|
|
|
|
Portfolio
|
|
|
|
|
|
</Link>
|
2026-07-09 11:14:33 +02:00
|
|
|
|
{initiativeId && initiativeTo && (
|
2026-07-08 12:55:37 +02:00
|
|
|
|
<>
|
|
|
|
|
|
<span className="program-scope-bar__sep" aria-hidden="true">
|
|
|
|
|
|
›
|
|
|
|
|
|
</span>
|
|
|
|
|
|
<Link
|
2026-07-09 11:14:33 +02:00
|
|
|
|
to={initiativeTo}
|
2026-07-08 12:55:37 +02:00
|
|
|
|
className={
|
|
|
|
|
|
'program-scope-bar__crumb' +
|
|
|
|
|
|
(!projectId ? ' program-scope-bar__crumb--active' : '')
|
|
|
|
|
|
}
|
|
|
|
|
|
onClick={() => setScope({ projectId: '', clearProject: true })}
|
|
|
|
|
|
>
|
|
|
|
|
|
{initiativeTitle || 'Vorhaben'}
|
|
|
|
|
|
</Link>
|
|
|
|
|
|
</>
|
|
|
|
|
|
)}
|
|
|
|
|
|
{projectId && (
|
|
|
|
|
|
<>
|
|
|
|
|
|
<span className="program-scope-bar__sep" aria-hidden="true">
|
|
|
|
|
|
›
|
|
|
|
|
|
</span>
|
2026-07-09 11:14:33 +02:00
|
|
|
|
<Link
|
|
|
|
|
|
to={projectPath(projectId)}
|
|
|
|
|
|
className="program-scope-bar__crumb program-scope-bar__crumb--active"
|
|
|
|
|
|
>
|
2026-07-08 12:55:37 +02:00
|
|
|
|
{projectTitle || 'Projekt'}
|
2026-07-09 11:14:33 +02:00
|
|
|
|
</Link>
|
2026-07-08 12:55:37 +02:00
|
|
|
|
</>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</nav>
|
|
|
|
|
|
<Link to={initiativeCatalogPath()} className="program-scope-bar__catalog link-inline">
|
|
|
|
|
|
Vorhaben-Katalog
|
|
|
|
|
|
</Link>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
)
|
|
|
|
|
|
}
|