chore(types): remove explicit any, fix hook deps, and unused vars across admin/api/tickets; tighten zod server schemas; adjust UI types; fix pdf export expression; minor cleanup
This commit is contained in:
parent
0556502685
commit
6ffd6c6392
17 changed files with 104 additions and 59 deletions
|
|
@ -84,6 +84,7 @@ type MachineInventory = {
|
|||
// Dados enviados pelo agente desktop (inventário básico/estendido)
|
||||
disks?: Array<{ name?: string; mountPoint?: string; fs?: string; totalBytes?: number; availableBytes?: number }>
|
||||
extended?: { linux?: LinuxExtended; windows?: WindowsExtended; macos?: MacExtended }
|
||||
services?: Array<{ name?: string; status?: string; displayName?: string }>
|
||||
}
|
||||
|
||||
type MachinesQueryItem = {
|
||||
|
|
@ -352,8 +353,8 @@ export function AdminMachinesOverview({ tenantId }: { tenantId: string }) {
|
|||
{Array.isArray(machine.inventory?.disks) ? (
|
||||
<Badge variant="outline">{machine.inventory?.disks?.length ?? 0} discos</Badge>
|
||||
) : null}
|
||||
{Array.isArray((machine.inventory as any)?.services) ? (
|
||||
<Badge variant="outline">{(machine.inventory as any).services.length} serviços</Badge>
|
||||
{Array.isArray(machine.inventory?.services) ? (
|
||||
<Badge variant="outline">{machine.inventory?.services?.length ?? 0} serviços</Badge>
|
||||
) : null}
|
||||
</div>
|
||||
</TableCell>
|
||||
|
|
@ -617,7 +618,7 @@ function MachineDetails({ machine }: MachineDetailsProps) {
|
|||
</TableRow>
|
||||
</TableHeader>
|
||||
<TableBody>
|
||||
{(network as any[]).map((iface, idx) => (
|
||||
{(network as Array<{ name?: string; mac?: string; ip?: string }>).map((iface, idx) => (
|
||||
<TableRow key={`iface-${idx}`} className="border-slate-100">
|
||||
<TableCell className="text-sm">{iface?.name ?? "—"}</TableCell>
|
||||
<TableCell className="text-sm text-muted-foreground">{iface?.mac ?? "—"}</TableCell>
|
||||
|
|
@ -711,7 +712,7 @@ function MachineDetails({ machine }: MachineDetailsProps) {
|
|||
<div className="rounded-md border border-slate-200 bg-emerald-50/40 p-3 dark:bg-emerald-900/10">
|
||||
<p className="text-xs font-semibold uppercase text-slate-500">SMART</p>
|
||||
<div className="mt-2 grid gap-2">
|
||||
{linuxExt.smart.map((s: any, idx: number) => {
|
||||
{linuxExt.smart.map((s: { smart_status?: { passed?: boolean }; model_name?: string; model_family?: string; serial_number?: string; device?: { name?: string } }, idx: number) => {
|
||||
const ok = s?.smart_status?.passed !== false
|
||||
const model = s?.model_name ?? s?.model_family ?? "Disco"
|
||||
const serial = s?.serial_number ?? s?.device?.name ?? "—"
|
||||
|
|
@ -758,7 +759,7 @@ function MachineDetails({ machine }: MachineDetailsProps) {
|
|||
</TableRow>
|
||||
</TableHeader>
|
||||
<TableBody>
|
||||
{(windowsExt.services as any[]).slice(0, 10).map((svc: any, i: number) => (
|
||||
{(windowsExt.services as Array<{ Name?: string; DisplayName?: string; Status?: string }>).slice(0, 10).map((svc, i: number) => (
|
||||
<TableRow key={`svc-${i}`} className="border-slate-100">
|
||||
<TableCell className="text-sm">{svc?.Name ?? "—"}</TableCell>
|
||||
<TableCell className="text-sm text-muted-foreground">{svc?.DisplayName ?? "—"}</TableCell>
|
||||
|
|
@ -775,7 +776,7 @@ function MachineDetails({ machine }: MachineDetailsProps) {
|
|||
<div className="rounded-md border border-slate-200 bg-slate-50/60 p-3">
|
||||
<p className="text-xs font-semibold uppercase text-slate-500">Softwares (amostra)</p>
|
||||
<ul className="mt-2 grid gap-1 text-xs text-muted-foreground">
|
||||
{(windowsExt.software as any[]).slice(0, 8).map((s: any, i: number) => (
|
||||
{(windowsExt.software as Array<{ DisplayName?: string; name?: string; DisplayVersion?: string; Publisher?: string }>).slice(0, 8).map((s, i: number) => (
|
||||
<li key={`sw-${i}`}>
|
||||
<span className="font-medium text-foreground">{s?.DisplayName ?? s?.name ?? "—"}</span>
|
||||
{s?.DisplayVersion ? <span className="ml-1">{s.DisplayVersion}</span> : null}
|
||||
|
|
@ -823,7 +824,7 @@ function MachineDetails({ machine }: MachineDetailsProps) {
|
|||
<section className="space-y-2">
|
||||
<h4 className="text-sm font-semibold">Alertas de postura</h4>
|
||||
<div className="space-y-2">
|
||||
{machine?.postureAlerts?.map((a: any, i: number) => (
|
||||
{machine?.postureAlerts?.map((a: { kind?: string; message?: string; severity?: string }, i: number) => (
|
||||
<div key={`alert-${i}`} className={cn("flex items-center justify-between rounded-md border px-3 py-2 text-sm",
|
||||
(a?.severity ?? "warning").toLowerCase() === "critical" ? "border-rose-500/20 bg-rose-500/10" : "border-amber-500/20 bg-amber-500/10")
|
||||
}>
|
||||
|
|
@ -844,8 +845,8 @@ function MachineDetails({ machine }: MachineDetailsProps) {
|
|||
{Array.isArray(software) && software.length > 0 ? (
|
||||
<Button size="sm" variant="outline" onClick={() => exportCsv(software, "softwares.csv")}>Softwares CSV</Button>
|
||||
) : null}
|
||||
{Array.isArray((metadata as any)?.services) && (metadata as any).services.length > 0 ? (
|
||||
<Button size="sm" variant="outline" onClick={() => exportCsv((metadata as any).services, "servicos.csv")}>Serviços CSV</Button>
|
||||
{Array.isArray(metadata?.services) && metadata.services.length > 0 ? (
|
||||
<Button size="sm" variant="outline" onClick={() => exportCsv(metadata.services as Array<Record<string, unknown>>, "servicos.csv")}>Serviços CSV</Button>
|
||||
) : null}
|
||||
</div>
|
||||
{fleet ? (
|
||||
|
|
@ -979,7 +980,7 @@ function exportCsv(items: Array<Record<string, unknown>>, filename: string) {
|
|||
for (const it of items) {
|
||||
const row = headers
|
||||
.map((h) => {
|
||||
const v = (it as any)?.[h]
|
||||
const v = (it as Record<string, unknown>)[h]
|
||||
if (v === undefined || v === null) return ""
|
||||
const s = typeof v === "string" ? v : JSON.stringify(v)
|
||||
return `"${s.replace(/"/g, '""')}"`
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue