"use client"; import { useState } from "react"; import { trpc } from "~/lib/trpc/client.js"; import { InfoTooltip } from "~/components/ui/InfoTooltip.js"; export function EntitlementManager() { const [year, setYear] = useState(new Date().getFullYear()); const [bulkDays, setBulkDays] = useState(28); const [bulkResult, setBulkResult] = useState(null); const utils = trpc.useUtils(); const bulkSetMutation = trpc.entitlement.bulkSet.useMutation({ onSuccess: async (data) => { setBulkResult(data.updated); await utils.entitlement.getBalance.invalidate(); }, }); const { data: summary, isLoading } = trpc.entitlement.getYearSummary.useQuery( { year }, { staleTime: 30_000 }, ); return (

Vacation Entitlement Manager

{/* Controls */}
setYear(parseInt(e.target.value, 10))} min={2020} max={2030} className="w-24 px-3 py-2 border border-gray-200 dark:border-gray-600 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-brand-500 dark:bg-gray-900 dark:text-gray-100" />
setBulkDays(parseInt(e.target.value, 10))} min={0} max={365} className="w-24 px-3 py-2 border border-gray-200 dark:border-gray-600 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-brand-500 dark:bg-gray-900 dark:text-gray-100" />
{bulkResult !== null && ( Updated {bulkResult} resources )}
{/* Year summary table */}
{isLoading ? (
Loading…
) : !summary?.length ? (
No resources found.
) : ( {summary.map((row) => ( ))}
Resource Chapter Entitled Carryover Used Pending Remaining
{row.displayName} ({row.eid}) {row.chapter ?? "—"} {row.entitledDays} {row.carryoverDays} {row.usedDays} {row.pendingDays} {row.remainingDays}
)}
); }