Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .claude/metrics/review-metrics.jsonl
Original file line number Diff line number Diff line change
Expand Up @@ -186,3 +186,4 @@
{"pr":1116,"issues":[1115],"epic":null,"type":"feat","createdAt":"2026-03-21T10:49:31Z","mergedAt":null,"filesChanged":5,"linesChanged":2679,"touchesClient":true,"touchesServer":false,"fixLoopCount":0,"internalFixLoopCount":0,"fixLoopTriggers":[],"reviews":[{"agent":"product-architect","verdict":"approve","findings":{"critical":0,"high":0,"medium":0,"low":0,"informational":0},"round":1},{"agent":"ux-designer","verdict":"approve","findings":{"critical":0,"high":0,"medium":0,"low":0,"informational":0},"round":1},{"agent":"product-owner","verdict":"approve","findings":{"critical":0,"high":0,"medium":0,"low":0,"informational":0},"round":1}],"totalFindings":{"critical":0,"high":0,"medium":0,"low":0,"informational":0}}
{"pr":1119,"issues":[1118],"epic":null,"type":"feat","createdAt":"2026-03-21T11:21:00Z","mergedAt":null,"filesChanged":5,"linesChanged":2315,"touchesClient":true,"touchesServer":false,"fixLoopCount":0,"internalFixLoopCount":0,"fixLoopTriggers":[],"reviews":[{"agent":"product-architect","verdict":"approve","findings":{"critical":0,"high":0,"medium":0,"low":0,"informational":0},"round":1},{"agent":"ux-designer","verdict":"approve","findings":{"critical":0,"high":0,"medium":0,"low":0,"informational":0},"round":1},{"agent":"product-owner","verdict":"approve","findings":{"critical":0,"high":0,"medium":0,"low":0,"informational":0},"round":1}],"totalFindings":{"critical":0,"high":0,"medium":0,"low":0,"informational":0}}
{"pr":1141,"issues":[1135,1136,1137,1138,1139,1140],"epic":null,"type":"fix","createdAt":"2026-03-22T10:59:20Z","mergedAt":"2026-03-22T12:30:00Z","filesChanged":17,"linesChanged":865,"touchesClient":true,"touchesServer":false,"fixLoopCount":0,"internalFixLoopCount":1,"fixLoopTriggers":[{"round":1,"agents":["frontend-developer"]}],"reviews":[{"agent":"product-architect","verdict":"approve","findings":{"critical":0,"high":0,"medium":0,"low":0,"informational":2},"round":1},{"agent":"ux-designer","verdict":"approve","findings":{"critical":0,"high":0,"medium":0,"low":2,"informational":1},"round":1}],"totalFindings":{"critical":0,"high":0,"medium":0,"low":2,"informational":3}}
{"pr":1144,"issues":[1142],"epic":null,"type":"feat","createdAt":"2026-03-22T11:13:49Z","mergedAt":"2026-03-22T13:00:00Z","filesChanged":30,"linesChanged":1788,"touchesClient":true,"touchesServer":false,"fixLoopCount":0,"internalFixLoopCount":1,"fixLoopTriggers":[{"round":1,"agents":["frontend-developer","translator","e2e-test-engineer"]}],"reviews":[{"agent":"product-architect","verdict":"approve","findings":{"critical":0,"high":0,"medium":0,"low":0,"informational":0},"round":1},{"agent":"ux-designer","verdict":"approve","findings":{"critical":0,"high":0,"medium":0,"low":0,"informational":0},"round":1},{"agent":"product-owner","verdict":"approve","findings":{"critical":0,"high":0,"medium":0,"low":0,"informational":2},"round":1}],"totalFindings":{"critical":0,"high":0,"medium":0,"low":0,"informational":2}}
25 changes: 15 additions & 10 deletions client/src/i18n/de/budget.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
"emptyStateTitle": "Noch keine Budgetdaten",
"emptyStateDescription": "Beginnen Sie mit dem Hinzufügen von Budgekategorien, Arbeitspaketen mit geplanten Kosten und Finanzierungsquellen. Ihre Projektbudget-Übersicht wird hier angezeigt, sobald Daten eingegeben werden.",
"actions": {
"addButton": "Hinzufügen",
"addInvoice": "Rechnung Hinzufügen",
"addVendor": "Auftragnehmer Hinzufügen"
"addButton": "Neu",
"addInvoice": "Neue Rechnung",
"addVendor": "Neuer Auftragnehmer"
},
"availableFunds": "Verfügbare Mittel",
"projectedCostRange": "Geplanter Kostenbereich",
Expand Down Expand Up @@ -65,7 +65,7 @@
"sources": {
"title": "Budget",
"sectionTitle": "Quellen",
"addSource": "Quelle Hinzufügen",
"addSource": "Neue Quelle",
"loading": "Budgetquellen werden geladen...",
"error": "Fehler",
"errorMessage": "Budgetquellen konnten nicht geladen werden. Bitte versuchen Sie es später erneut.",
Expand Down Expand Up @@ -152,7 +152,7 @@
"vendors": {
"title": "Budget",
"sectionTitle": "Auftragnehmer",
"addVendor": "Auftragnehmer Hinzufügen",
"addVendor": "Neuer Auftragnehmer",
"addFirstVendor": "Ersten Auftragnehmer Hinzufügen",
"loading": "Auftragnehmer werden geladen...",
"error": "Fehler",
Expand Down Expand Up @@ -196,7 +196,7 @@
"nameTooLong": "Name des Auftragnehmers darf maximal 200 Zeichen lang sein."
},
"buttons": {
"create": "Auftragnehmer Hinzufügen",
"create": "Neuer Auftragnehmer",
"creating": "Wird hinzugefügt...",
"save": "Änderungen Speichern",
"saving": "Wird gespeichert...",
Expand Down Expand Up @@ -415,8 +415,9 @@
},
"subsidies": {
"title": "Förderprogramme",
"pageTitle": "Budget",
"sectionTitle": "Förderprogramme",
"addProgram": "Programm Hinzufügen",
"addProgram": "Neues Förderprogramm",
"loading": "Förderprogramme werden geladen...",
"error": "Fehler",
"errorMessage": "Förderprogramme konnten nicht geladen werden. Bitte versuchen Sie es später erneut.",
Expand Down Expand Up @@ -533,7 +534,7 @@
"invoices": {
"title": "Budget",
"sectionTitle": "Rechnungen",
"addInvoice": "Rechnung Hinzufügen",
"addInvoice": "Neue Rechnung",
"addFirstInvoice": "Erste Rechnung Hinzufügen",
"loading": "Rechnungen werden geladen...",
"error": "Fehler",
Expand Down Expand Up @@ -596,12 +597,16 @@
"dateRequired": "Rechnungsdatum ist erforderlich."
},
"buttons": {
"create": "Rechnung Hinzufügen",
"create": "Neue Rechnung",
"creating": "Wird hinzugefügt...",
"save": "Änderungen Speichern",
"saving": "Wird gespeichert...",
"cancel": "Abbrechen",
"view": "Anzeigen"
"view": "Anzeigen",
"delete": "Löschen"
},
"actions": {
"menuAriaLabel": "Aktionen für Rechnung {{number}}"
},
"statusLabels": {
"pending": "Ausstehend",
Expand Down
17 changes: 9 additions & 8 deletions client/src/i18n/en/budget.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
"emptyStateTitle": "No budget data yet",
"emptyStateDescription": "Start by adding budget categories, work items with planned costs, and financing sources. Your project budget overview will appear here once data is entered.",
"actions": {
"addButton": "Add",
"addInvoice": "Add Invoice",
"addVendor": "Add Vendor"
"addButton": "New",
"addInvoice": "New Invoice",
"addVendor": "New Vendor"
},
"availableFunds": "Available Funds",
"projectedCostRange": "Projected Cost Range",
Expand Down Expand Up @@ -65,7 +65,7 @@
"sources": {
"title": "Budget",
"sectionTitle": "Sources",
"addSource": "Add Source",
"addSource": "New Source",
"loading": "Loading budget sources...",
"error": "Error",
"errorMessage": "Failed to load budget sources. Please try again.",
Expand Down Expand Up @@ -152,7 +152,7 @@
"vendors": {
"title": "Budget",
"sectionTitle": "Vendors",
"addVendor": "Add Vendor",
"addVendor": "New Vendor",
"addFirstVendor": "Add First Vendor",
"loading": "Loading vendors...",
"error": "Error",
Expand Down Expand Up @@ -353,7 +353,7 @@
"invoices": {
"title": "Budget",
"sectionTitle": "Invoices",
"addInvoice": "Add Invoice",
"addInvoice": "New Invoice",
"addFirstInvoice": "Add First Invoice",
"loading": "Loading invoices...",
"error": "Error",
Expand Down Expand Up @@ -416,7 +416,7 @@
"dateRequired": "Invoice date is required."
},
"buttons": {
"create": "Add Invoice",
"create": "New Invoice",
"creating": "Adding...",
"save": "Save Changes",
"saving": "Saving...",
Expand Down Expand Up @@ -524,8 +524,9 @@
},
"subsidies": {
"title": "Subsidy Programs",
"pageTitle": "Budget",
"sectionTitle": "Subsidy Programs",
"addProgram": "Add Program",
"addProgram": "New Subsidy Program",
"loading": "Loading subsidy programs...",
"error": "Error",
"errorMessage": "Failed to load subsidy programs. Please try again.",
Expand Down
35 changes: 4 additions & 31 deletions client/src/pages/BudgetOverviewPage/BudgetOverviewPage.module.css
Original file line number Diff line number Diff line change
Expand Up @@ -3,31 +3,21 @@
* ============================================================ */

.container {
padding: var(--spacing-8);
max-width: 1200px;
margin: 0 auto;
composes: pageContainer from '../../styles/shared.module.css';
}

.content {
display: flex;
flex-direction: column;
gap: var(--spacing-6);
composes: pageContent from '../../styles/shared.module.css';
}

/* ---- Page header ---- */

.pageHeader {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--spacing-4);
composes: pageHeader from '../../styles/shared.module.css';
}

.pageTitle {
font-size: var(--font-size-4xl);
font-weight: var(--font-weight-bold);
color: var(--color-text-primary);
margin: 0;
composes: pageTitle from '../../styles/shared.module.css';
}

/* ---- Add dropdown button ---- */
Expand Down Expand Up @@ -619,10 +609,6 @@
* ============================================================ */

@media (min-width: 768px) and (max-width: 1024px) {
.container {
padding: var(--spacing-6);
}

.retryButton {
min-height: 44px;
}
Expand All @@ -649,19 +635,6 @@
* ============================================================ */

@media (max-width: 767px) {
.container {
padding: var(--spacing-4);
}

.pageHeader {
flex-direction: column;
align-items: stretch;
justify-content: flex-start;
}

.pageTitle {
font-size: var(--font-size-2xl);
}

.addButton {
min-height: 44px;
Expand Down
25 changes: 25 additions & 0 deletions client/src/pages/BudgetOverviewPage/BudgetOverviewPage.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -397,6 +397,31 @@ describe('BudgetOverviewPage', () => {
expect(screen.getByRole('heading', { name: /^budget$/i, level: 1 })).toBeInTheDocument();
});
});

it('renders a "New" dropdown trigger button accessible by role', async () => {
mockFetchBudgetOverview.mockResolvedValueOnce(richOverview);
renderPage();

await waitFor(() => {
const btn = screen.getByRole('button', { name: /^new$/i });
expect(btn).toBeInTheDocument();
});
});

it('"New" button shows "New Invoice" and "New Vendor" menu items when clicked', async () => {
const user = userEvent.setup();
mockFetchBudgetOverview.mockResolvedValueOnce(richOverview);
renderPage();

await waitFor(() => {
expect(screen.getByRole('button', { name: /^new$/i })).toBeInTheDocument();
});

await user.click(screen.getByRole('button', { name: /^new$/i }));

expect(screen.getByRole('menuitem', { name: /new invoice/i })).toBeInTheDocument();
expect(screen.getByRole('menuitem', { name: /new vendor/i })).toBeInTheDocument();
});
});

// ─── Key metrics row ─────────────────────────────────────────────────────────
Expand Down
25 changes: 4 additions & 21 deletions client/src/pages/BudgetSourcesPage/BudgetSourcesPage.module.css
Original file line number Diff line number Diff line change
@@ -1,29 +1,19 @@
.container {
padding: var(--spacing-8);
max-width: 1200px;
margin: 0 auto;
composes: pageContainer from '../../styles/shared.module.css';
}

.content {
display: flex;
flex-direction: column;
gap: var(--spacing-6);
composes: pageContent from '../../styles/shared.module.css';
}

/* ---- Page header ---- */

.pageHeader {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--spacing-4);
composes: pageHeader from '../../styles/shared.module.css';
}

.pageTitle {
font-size: var(--font-size-4xl);
font-weight: var(--font-weight-bold);
color: var(--color-text-primary);
margin: 0;
composes: pageTitle from '../../styles/shared.module.css';
}

/* ---- Section header (below sub-nav) ---- */
Expand Down Expand Up @@ -774,13 +764,6 @@
* ============================================================ */

@media (max-width: 767px) {
.container {
padding: var(--spacing-4);
}

.pageTitle {
font-size: var(--font-size-2xl);
}

.card {
padding: var(--spacing-4);
Expand Down
Loading
Loading