This commit is contained in:
michael committed 2026-09-16 06:20:58 +00:00
1 parent 4f4fb0baf2
commit c5495ddffa
2 files changed
+9 -17

No files matched your search

+4 -10
View File
@@ -28,6 +28,7 @@ import {
Trash2, Trash2,
UserCog, UserCog,
UserCircle, UserCircle,
FolderGit,
X, X,
} from "lucide-react"; } from "lucide-react";
import { FormEvent, MouseEvent, useCallback, useEffect, useMemo, useRef, useState } from "react"; import { FormEvent, MouseEvent, useCallback, useEffect, useMemo, useRef, useState } from "react";
@@ -1245,7 +1246,7 @@ export function App() {
<SidebarMenuButton asChild> <SidebarMenuButton asChild>
<a href={isAdmin ? "/admin/users" : "/timer"} onClick={navHandler(isAdmin ? "/admin/users" : "/timer")}> <a href={isAdmin ? "/admin/users" : "/timer"} onClick={navHandler(isAdmin ? "/admin/users" : "/timer")}>
<Command /> <Command />
<span className="font-semibold text-base">TicketTracker </span><span className="font-medium text-muted-foreground">v1.0.0-rc1</span> <span className="font-semibold text-base">TicketTracker </span>
</a> </a>
</SidebarMenuButton> </SidebarMenuButton>
</SidebarMenuItem> </SidebarMenuItem>
@@ -1373,18 +1374,11 @@ export function App() {
</SidebarContent> </SidebarContent>
<SidebarFooter> <SidebarFooter>
{!isAdmin ? <div className="mx-2 rounded-lg border bg-card p-3 text-sm shadow-xs group-data-[collapsible=icon]:hidden">
<div className="mb-2 flex items-center gap-2 font-medium">
<CheckCircle2 className="size-4 text-muted-foreground" />
Abschluss
</div>
<p className="text-muted-foreground">Offene Bewertungen findest du im Monatsabschluss.</p>
</div> : null}
<SidebarMenu> <SidebarMenu>
<SidebarMenuItem> <SidebarMenuItem>
<SidebarMenuButton tooltip="Worklog"> <SidebarMenuButton tooltip="Worklog">
<UserCircle /> <FolderGit />
<span>Worklog lokal</span> <span className="text-xs text-muted-foreground">v1.0.0-rc1</span>
</SidebarMenuButton> </SidebarMenuButton>
</SidebarMenuItem> </SidebarMenuItem>
</SidebarMenu> </SidebarMenu>
+5 -7
View File
@@ -670,12 +670,12 @@ export function AnalysisPage({ onNavigate }: AnalysisPageProps) {
<Card> <Card>
<CardHeader className="gap-3 p-4 sm:flex-row sm:items-center sm:justify-between sm:space-y-0"> <CardHeader className="gap-3 p-4 sm:flex-row sm:items-center sm:justify-between sm:space-y-0">
<div> <div>
<CardTitle>Tickets im Zeitraum</CardTitle> <CardTitle>Sessions im Zeitraum</CardTitle>
<CardDescription> <CardDescription>
{periodType === "month" ? "Sessions prüfen, bewerten und bei Bedarf Tickets öffnen." : "Tagesansicht ohne eigenen Abschluss."} {periodType === "month" ? "Sessions prüfen, bewerten und bei Bedarf Tickets öffnen." : "Tagesansicht ohne eigenen Abschluss."}
</CardDescription> </CardDescription>
</div> </div>
<HelpLink anchor="auswertung" label="Hilfe zu Tickets im Zeitraum" /> <HelpLink anchor="auswertung" label="Hilfe zu Sessions im Zeitraum" />
</CardHeader> </CardHeader>
<CardContent className="px-4 pb-4"> <CardContent className="px-4 pb-4">
<div className="hidden md:block"> <div className="hidden md:block">
@@ -687,7 +687,6 @@ export function AnalysisPage({ onNavigate }: AnalysisPageProps) {
<TableHead>Art</TableHead> <TableHead>Art</TableHead>
<TableHead>Sessions</TableHead> <TableHead>Sessions</TableHead>
<TableHead>Zeit abgerechnet</TableHead> <TableHead>Zeit abgerechnet</TableHead>
<TableHead>Sessions abgerechnet</TableHead>
<TableHead>Status</TableHead> <TableHead>Status</TableHead>
<TableHead /> <TableHead />
</TableRow> </TableRow>
@@ -704,7 +703,7 @@ export function AnalysisPage({ onNavigate }: AnalysisPageProps) {
<span className="truncate text-base font-semibold">{section.label}</span> <span className="truncate text-base font-semibold">{section.label}</span>
</div> </div>
<div className="flex flex-wrap items-center gap-2"> <div className="flex flex-wrap items-center gap-2">
<Badge variant="outline">{section.ticketCount} Ticket(s)</Badge> <Badge variant="outline">{section.ticketCount} Session(s)</Badge>
<Badge variant="outline">{formatMinutes(section.totalMinutes)}</Badge> <Badge variant="outline">{formatMinutes(section.totalMinutes)}</Badge>
{section.openCount > 0 ? <Badge variant="warning">{section.openCount} offen</Badge> : <Badge variant="success">bewertet</Badge>} {section.openCount > 0 ? <Badge variant="warning">{section.openCount} offen</Badge> : <Badge variant="success">bewertet</Badge>}
</div> </div>
@@ -728,7 +727,6 @@ export function AnalysisPage({ onNavigate }: AnalysisPageProps) {
<TableCell>{workTypeLabel(ticket.work_type)}</TableCell> <TableCell>{workTypeLabel(ticket.work_type)}</TableCell>
<TableCell>{ticket.session_count}</TableCell> <TableCell>{ticket.session_count}</TableCell>
<TableCell>{formatMinutes(ticket.total_minutes)}</TableCell> <TableCell>{formatMinutes(ticket.total_minutes)}</TableCell>
<TableCell>{ticket.billed_count}</TableCell>
<TableCell> <TableCell>
<TicketStatus ticket={ticket} /> <TicketStatus ticket={ticket} />
</TableCell> </TableCell>
@@ -760,7 +758,7 @@ export function AnalysisPage({ onNavigate }: AnalysisPageProps) {
<span className="truncate text-base font-semibold">{section.label}</span> <span className="truncate text-base font-semibold">{section.label}</span>
</div> </div>
<div className="flex flex-wrap items-center gap-2"> <div className="flex flex-wrap items-center gap-2">
<Badge variant="outline">{section.ticketCount} Ticket(s)</Badge> <Badge variant="outline">{section.ticketCount} Session(s)</Badge>
<Badge variant="outline">{formatMinutes(section.totalMinutes)}</Badge> <Badge variant="outline">{formatMinutes(section.totalMinutes)}</Badge>
{section.openCount > 0 ? <Badge variant="warning">{section.openCount} offen</Badge> : <Badge variant="success">bewertet</Badge>} {section.openCount > 0 ? <Badge variant="warning">{section.openCount} offen</Badge> : <Badge variant="success">bewertet</Badge>}
</div> </div>
@@ -810,7 +808,7 @@ export function AnalysisPage({ onNavigate }: AnalysisPageProps) {
{tickets.length === 0 ? ( {tickets.length === 0 ? (
<p className="py-8 text-center text-sm text-muted-foreground">Für diesen Zeitraum sind noch keine Sessions vorhanden.</p> <p className="py-8 text-center text-sm text-muted-foreground">Für diesen Zeitraum sind noch keine Sessions vorhanden.</p>
) : visibleTickets.length === 0 ? ( ) : visibleTickets.length === 0 ? (
<p className="py-8 text-center text-sm text-muted-foreground">Keine Tickets passend zu den aktuellen Filtern.</p> <p className="py-8 text-center text-sm text-muted-foreground">Keine Sessions passend zu den aktuellen Filtern.</p>
) : null} ) : null}
</CardContent> </CardContent>
</Card> </Card>