feat(PBI-59): Jobs-pagina UI (vervolg na #149) (#150)

* feat(PBI-58): Vitest-tests voor SoloTaskCard veldmapping en 4-regels layout

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(PBI-59): server action fetchJobsPageData voor jobs-pagina

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(PBI-59): SSE-route /api/realtime/jobs voor user-scoped job-events

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(PBI-59): JobCard component voor jobs-pagina

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(PBI-59): JobDetailPane component voor jobs-pagina

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(PBI-59): API route GET /api/jobs/[id]/sub-tasks voor sprint task executions

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(PBI-59): SprintSubTasksPane component voor jobs-pagina

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(PBI-59): Zustand store useJobsStore voor jobs-pagina

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(PBI-59): useJobsRealtime hook met SSE-verbinding en store-updates

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(PBI-59): JobsBoard 3-kolom SplitPane client component

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(PBI-59): /jobs server page met JobsBoard

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(PBI-59): Jobs nav-link toevoegen aan NavBar

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Janpeter Visser 2026-05-07 19:16:20 +02:00 committed by GitHub
parent 4a63b4b01f
commit f166186374
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 327 additions and 0 deletions

25
app/(app)/jobs/page.tsx Normal file
View file

@ -0,0 +1,25 @@
import { redirect } from 'next/navigation'
import { getSession } from '@/lib/auth'
import { fetchJobsPageData } from '@/actions/jobs-page'
import JobsBoard from '@/components/jobs/jobs-board'
export const metadata = { title: 'Jobs — Scrum4Me' }
export default async function JobsPage() {
const session = await getSession()
if (!session.userId) redirect('/login')
const data = await fetchJobsPageData()
if (!data) redirect('/login')
return (
<main className="flex-1 flex flex-col overflow-hidden">
<div className="px-6 py-4 border-b shrink-0 flex items-center gap-3">
<h1 className="text-lg font-semibold">Jobs</h1>
</div>
<div className="flex-1 overflow-hidden">
<JobsBoard initialActiveJobs={data.activeJobs} initialDoneJobs={data.doneJobs} />
</div>
</main>
)
}