From 1de14d04173333d3b62504c0f15bc83479d5b9df Mon Sep 17 00:00:00 2001 From: Scrum4Me Agent <30029041+madhura68@users.noreply.github.com> Date: Fri, 15 May 2026 01:07:34 +0200 Subject: [PATCH] feat(jobs): JobCard breadcrumb + datum-fallback per kind MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Voeg productCode/pbiCode/storyCode/startedAt/finishedAt toe aan JobCardProps; bouw breadcrumb per job-kind en toon finishedAt → startedAt → createdAt als datum. JobsColumn geeft de nieuwe velden door. Co-Authored-By: Claude Sonnet 4.6 --- components/jobs/job-card.tsx | 33 ++++++++++++++++++++++++++++----- components/jobs/jobs-column.tsx | 5 +++++ 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/components/jobs/job-card.tsx b/components/jobs/job-card.tsx index 99f5cc8..ab5184f 100644 --- a/components/jobs/job-card.tsx +++ b/components/jobs/job-card.tsx @@ -17,10 +17,15 @@ interface JobCardProps { sprintGoal?: string | null sprintCode?: string | null productName: string + productCode?: string | null + pbiCode?: string | null + storyCode?: string | null branch?: string | null error?: string | null summary?: string | null createdAt: Date | string + startedAt?: Date | string | null + finishedAt?: Date | string | null isSelected?: boolean onClick?: () => void } @@ -36,7 +41,8 @@ const KIND_LABELS: Record = { export default function JobCard({ kind, status, taskCode, taskTitle, ideaCode, ideaTitle, - sprintGoal, sprintCode, productName, branch, error, createdAt, isSelected, onClick, + sprintGoal, sprintCode, productName, productCode, pbiCode, storyCode, + branch, error, createdAt, startedAt, finishedAt, isSelected, onClick, }: JobCardProps) { let titleText: string if (kind === 'TASK_IMPLEMENTATION') { @@ -52,7 +58,19 @@ export default function JobCard({ titleText = 'Job' } + let breadcrumb: string + if (kind === 'TASK_IMPLEMENTATION') { + breadcrumb = [productCode ?? productName, pbiCode, storyCode].filter(Boolean).join(' ') + } else if (kind === 'IDEA_GRILL' || kind === 'IDEA_MAKE_PLAN' || kind === 'IDEA_REVIEW_PLAN' || kind === 'PLAN_CHAT') { + breadcrumb = [productCode ?? productName, ideaCode].filter(Boolean).join(' ') + } else if (kind === 'SPRINT_IMPLEMENTATION') { + breadcrumb = [productCode ?? productName, sprintCode].filter(Boolean).join(' ') + } else { + breadcrumb = productCode ?? productName + } + const detailText = branch || (error ? error.slice(0, 80) : null) || productName + const displayDate = finishedAt ?? startedAt ?? createdAt const apiStatus = jobStatusToApi(status) @@ -65,11 +83,16 @@ export default function JobCard({ )} {...debugProps('job-card', 'JobCard', 'components/jobs/job-card.tsx')} > -
- +
+ {KIND_LABELS[kind]} - + {breadcrumb && ( + + {breadcrumb} + + )} + {JOB_STATUS_LABELS[apiStatus]}
@@ -77,7 +100,7 @@ export default function JobCard({

{detailText}

- {new Date(createdAt).toLocaleString('nl-NL', { dateStyle: 'short', timeStyle: 'short' })} + {new Date(displayDate).toLocaleString('nl-NL', { dateStyle: 'short', timeStyle: 'short' })}
diff --git a/components/jobs/jobs-column.tsx b/components/jobs/jobs-column.tsx index f535e40..ffde6c5 100644 --- a/components/jobs/jobs-column.tsx +++ b/components/jobs/jobs-column.tsx @@ -246,10 +246,15 @@ export default function JobsColumn({ sprintGoal={j.sprintGoal} sprintCode={j.sprintCode} productName={j.productName} + productCode={j.productCode} + pbiCode={j.pbiCode} + storyCode={j.storyCode} branch={j.branch} error={j.error} summary={j.summary} createdAt={j.createdAt} + startedAt={j.startedAt} + finishedAt={j.finishedAt} isSelected={j.id === selectedJobId} onClick={() => onSelect(j.id)} />