wulf-pulse/components/kiosk/service-desk-card.tsx
lorentz 3c13defacb feat: kiosk UI updates - new cards, gauge chart, performance improvements
- Updated kiosk stats API with expanded metrics
- New components: company-tickets-card, gauge-chart, service-desk-card, ticket-leaders-card
- Updated cycling-display, kpi-card, and ticker components
- Added performance.css for kiosk optimizations
- Added Wulf logo asset
2026-02-19 15:31:23 -05:00

104 lines
3.2 KiB
TypeScript

'use client';
import { GaugeChart } from './gauge-chart';
interface IssueType {
issueType: string;
subIssueType: string;
count: number;
}
interface ServiceDeskStats {
managedCount: number;
tmCount: number;
vendorCount: number;
topManagedIssueTypes?: IssueType[];
}
interface ServiceDeskCardProps {
stats: ServiceDeskStats;
}
export function ServiceDeskCard({ stats }: ServiceDeskCardProps) {
return (
<div className="flex h-full w-full bg-blue-500/10 border-4 border-blue-500 rounded-3xl overflow-hidden">
{/* Left side - Gauges */}
<div className="w-1/2 flex flex-col items-center justify-center p-8 border-r border-blue-500/30">
<div className="text-3xl font-bold text-blue-500 mb-6">
Service Delivery | Service Desk
</div>
<div className="grid grid-cols-1 gap-6 w-full max-w-md">
<GaugeChart
value={stats.managedCount}
max={125}
label="Service Desk (Managed)"
breakpoints={{
green: 75,
yellow: 100,
red: 125,
}}
/>
<GaugeChart
value={stats.tmCount}
max={40}
label="Service Desk (T&M)"
breakpoints={{
green: 25,
yellow: 35,
red: 40,
}}
/>
<GaugeChart
value={stats.vendorCount}
max={40}
label="Vendor Service Desk (All)"
breakpoints={{
green: 25,
yellow: 35,
red: 40,
}}
/>
</div>
</div>
{/* Right side - Top Issue Types */}
<div className="w-1/2 p-8 flex flex-col">
<h3 className="text-2xl font-semibold text-blue-400 mb-4">Top Issue Types (Managed)</h3>
{stats.topManagedIssueTypes && stats.topManagedIssueTypes.length > 0 ? (
<div className="space-y-2 flex-1 overflow-y-auto">
{stats.topManagedIssueTypes.map((item, index) => (
<div key={index} className="bg-black/30 rounded-lg p-3 border border-blue-500/30">
<div className="flex items-center justify-between">
<div className="flex-1 min-w-0">
<div className="text-base font-semibold text-gray-300 truncate">
{item.issueType}
</div>
<div className="text-sm text-gray-400 truncate">
{item.subIssueType}
</div>
</div>
<div className="ml-4 flex items-center gap-2">
<span className="text-2xl font-bold text-blue-400">
{item.count}
</span>
<span className="text-xs text-gray-500">tickets</span>
</div>
</div>
</div>
))}
</div>
) : (
<div className="flex-1 flex items-center justify-center">
<div className="text-gray-500 text-center">
<div className="text-lg mb-2">No issue type data available</div>
<div className="text-sm">Check back later for updates</div>
</div>
</div>
)}
</div>
</div>
);
}