diff --git a/frontend/src/views/TicketDetailPage.tsx b/frontend/src/views/TicketDetailPage.tsx
index a38b660..461ae50 100644
--- a/frontend/src/views/TicketDetailPage.tsx
+++ b/frontend/src/views/TicketDetailPage.tsx
@@ -305,6 +305,18 @@ function projectConsumptionPercent(consumptionMinutes: number, budgetMinutes?: n
return Math.round((consumptionMinutes / budgetMinutes) * 100);
}
+function projectRemainingLabel(remainingMinutes: number | null) {
+ if (remainingMinutes === null) {
+ return "Rest offen";
+ }
+
+ if (remainingMinutes < 0) {
+ return `Überzogen ${formatMinutes(Math.abs(remainingMinutes))}`;
+ }
+
+ return `Rest ${formatMinutes(remainingMinutes)}`;
+}
+
function isPartialHoursInput(value: string) {
return /^\d*(?:[,.]\d*)?$/.test(value.trim());
}
@@ -562,6 +574,7 @@ export function TicketDetailPage({ periodType, period, ticketId, onNavigate, onO
const projectConsumptionMinutes = project?.consumption_minutes ?? 0;
const projectBudgetMinutes = project?.hour_budget_minutes ?? null;
const projectConsumptionUsagePercent = project ? projectConsumptionPercent(projectConsumptionMinutes, projectBudgetMinutes) : null;
+ const projectRemainingMinutes = projectBudgetMinutes && projectBudgetMinutes > 0 ? projectBudgetMinutes - projectConsumptionMinutes : null;
const canEditProject = project?.can_edit !== false;
const canEditTicketData = !project || canEditProject;
const isProject = Boolean(project);
@@ -1396,16 +1409,24 @@ export function TicketDetailPage({ periodType, period, ticketId, onNavigate, onO