fix: align company data with machines

This commit is contained in:
Esdras Renan 2025-10-18 21:57:13 -03:00
parent 40e92cf2b9
commit 5de8b2bf7f
3 changed files with 124 additions and 22 deletions

View file

@ -119,22 +119,59 @@ export function AdminCompaniesManager({ initialCompanies }: { initialCompanies:
const machinesByCompanyId = useMemo(() => {
const map = new Map<string, MachineSummary[]>()
;(machinesQuery ?? []).forEach((machine) => {
if (!machine.companyId) return
const list = map.get(machine.companyId) ?? []
list.push(machine)
map.set(machine.companyId, list)
const keys = [
machine.companyId ?? undefined,
machine.companySlug ?? undefined,
].filter((key): key is string => Boolean(key))
if (keys.length === 0) {
return
}
keys.forEach((key) => {
const list = map.get(key)
if (list) {
list.push(machine)
} else {
map.set(key, [machine])
}
})
})
return map
}, [machinesQuery])
const editingCompanyMachines = useMemo(() => {
if (!editingId) return []
return machinesByCompanyId.get(editingId) ?? []
}, [machinesByCompanyId, editingId])
const machinesDialogList = useMemo(() => {
if (!machinesDialog) return []
return machinesByCompanyId.get(machinesDialog.companyId) ?? []
}, [machinesByCompanyId, machinesDialog])
const getMachinesForCompany = useCallback(
(company: Company | null | undefined) => {
if (!company) return []
const keys = [company.id, company.slug].filter(Boolean)
for (const key of keys) {
const list = machinesByCompanyId.get(key)
if (list && list.length > 0) {
return list
}
}
return []
},
[machinesByCompanyId]
)
const editingCompany = useMemo(
() => (editingId ? companies.find((company) => company.id === editingId) ?? null : null),
[companies, editingId]
)
const editingCompanyMachines = useMemo(
() => getMachinesForCompany(editingCompany),
[getMachinesForCompany, editingCompany]
)
const machinesDialogCompany = useMemo(
() => (machinesDialog ? companies.find((company) => company.id === machinesDialog.companyId) ?? null : null),
[companies, machinesDialog]
)
const machinesDialogList = useMemo(
() => getMachinesForCompany(machinesDialogCompany),
[getMachinesForCompany, machinesDialogCompany]
)
const resetForm = () => setForm({})
@ -525,7 +562,7 @@ export function AdminCompaniesManager({ initialCompanies }: { initialCompanies:
<div className="space-y-4 rounded-xl border border-slate-200 bg-white p-4 shadow-sm">
{hasCompanies ? (
filteredCompanies.map((company) => {
const companyMachines = machinesByCompanyId.get(company.id) ?? []
const companyMachines = getMachinesForCompany(company)
const formattedPhone = formatPhoneDisplay(company.phone)
const alertInfo = lastAlerts[company.slug] ?? null
const usagePct = alertInfo?.usagePct ?? 0
@ -714,7 +751,7 @@ export function AdminCompaniesManager({ initialCompanies }: { initialCompanies:
? formatDistanceToNow(alertInfo.createdAt, { addSuffix: true, locale: ptBR })
: null
const formattedPhone = formatPhoneDisplay(company.phone)
const companyMachines = machinesByCompanyId.get(company.id) ?? []
const companyMachines = getMachinesForCompany(company)
const machineCount = companyMachines.length
return (
<TableRow

View file

@ -38,23 +38,23 @@ function TicketRow({ ticket, entering }: { ticket: Ticket; entering: boolean })
<Link
href={`/tickets/${ticket.id}`}
className={cn(
"group block rounded-2xl border border-slate-200 bg-white/70 px-6 py-5 transition-all duration-300 hover:border-slate-300 hover:bg-white",
"group relative block rounded-2xl border border-slate-200 bg-white/70 px-6 py-5 transition-all duration-300 hover:border-slate-300 hover:bg-white",
entering ? "recent-ticket-enter" : ""
)}
>
<div className="absolute right-6 top-5 flex flex-col items-end gap-2 sm:flex-row sm:items-center">
<TicketStatusBadge status={ticket.status} className="h-8 px-3.5 text-sm" />
<TicketPriorityPill priority={ticket.priority} className="h-8 px-3.5 text-sm" />
</div>
<div className="flex flex-col gap-4 md:flex-row md:items-start md:justify-between">
<div className="min-w-0 space-y-3">
<div className="flex items-start justify-between gap-3">
<div className="flex flex-wrap items-center gap-2 text-sm font-medium text-neutral-500">
<div className="flex items-start gap-3 pr-28 text-sm font-medium text-neutral-500 sm:pr-32">
<div className="flex flex-wrap items-center gap-2">
<span className="text-xl font-bold text-neutral-900">#{ticket.reference}</span>
<span className="truncate text-neutral-500">{queueLabel}</span>
</div>
<div className="ml-auto flex items-start gap-2 text-right">
<TicketStatusBadge status={ticket.status} className="h-8 px-3.5 text-sm" />
<TicketPriorityPill priority={ticket.priority} className="h-8 px-3.5 text-sm" />
</div>
</div>
<div className="space-y-1.5">
<div className="space-y-1.5 pr-12 sm:pr-20">
<span className="line-clamp-1 text-[20px] font-semibold text-neutral-900 transition-colors group-hover:text-neutral-700">
{ticket.subject}
</span>