// src/components/crm/ClientsSection.jsx // Prikaz liste klijenata i njihovih dizalica unutar dashboard sekcije. import { useStore } from '@nanostores/preact'; import { useEffect, useState } from 'preact/hooks'; import { animated, useTransition } from '@react-spring/web'; import { $clients, $clientsLoading, fetchClients } from '../../stores/clientStore'; import { $cranes } from '../../stores/fleetDashboardStore'; import AnimatedDataTable from '../ui/AnimatedDataTable'; import ServiceRecordCreateButton from '../fleet/ServiceRecordCreateButton'; import { showToast } from '../../stores/toastStore'; export default function ClientsSection({ onSetServiceContext = null }) { const clients = useStore($clients); const loading = useStore($clientsLoading); const cranes = useStore($cranes); const [expandedId, setExpandedId] = useState(null); const [hasMounted, setHasMounted] = useState(false); const [selectedClientCraneId, setSelectedClientCraneId] = useState(null); useEffect(() => { setHasMounted(true); }, []); useEffect(() => { if (!hasMounted) return; if (clients.length === 0) fetchClients(); }, [hasMounted, clients.length]); function cranesForClient(clientId) { return cranes.filter((item) => String(item.client) === String(clientId)); } const clientTransitions = useTransition(clients, { keys: (client) => client.id, from: { opacity: 0, transform: 'translate3d(0,8px,0)' }, enter: { opacity: 1, transform: 'translate3d(0,0,0)' }, leave: { opacity: 0, transform: 'translate3d(0,-8px,0)' }, trail: 30, config: { tension: 230, friction: 26 }, }); function handleSetServiceContext() { if (!selectedClientCraneId) { showToast('Prvo označite redak dizalice.', 'warning'); return; } onSetServiceContext?.(selectedClientCraneId); } return (

Klijenti

{!hasMounted && (

Učitavanje…

)} {hasMounted && loading && (

Učitavanje…

)} {hasMounted && !loading && clients.length === 0 && (

Nema klijenata. Dodajte klijente u Django admin ili koristite CRM API.

)} {hasMounted && !loading && clients.length > 0 && (
{clientTransitions((style, client) => { const cvs = cranesForClient(client.id); const isOpen = expandedId === client.id; const craneColumns = [ { key: 'registration', label: 'Oznaka', className: 'py-2 pr-4 text-left' }, { key: 'model', label: 'Make / Model', className: 'py-2 pr-4 text-left' }, { key: 'km', label: 'Km', className: 'py-2 pr-4 text-left' }, { key: 'nextService', label: 'Sljedeći servis', className: 'py-2 pr-4 text-left' }, { key: 'type', label: 'Vrsta', className: 'py-2 text-left' }, ]; return ( {isOpen && (
{cvs.length === 0 ? (

Nema dizalica dodijeljenih ovom klijentu. Dodajte dizalicu u Django admin i povežite je s klijentom.

) : ( item.id} headClassName="text-xs uppercase tracking-wide text-text-muted" bodyClassName="divide-y divide-border-hairline" rowClassName="hover:bg-canvas-deep" isRowSelected={(item) => String(item.id) === String(selectedClientCraneId)} tableClassName="min-w-full text-sm" wrapperClassName="overflow-x-auto" renderRow={(item) => ( <> setSelectedClientCraneId(item.id)}>{item.registration_number} setSelectedClientCraneId(item.id)}>{item.make} {item.model} {item.year ? `(${item.year})` : ''} setSelectedClientCraneId(item.id)}>{item.current_mileage?.toLocaleString('hr-HR')} km setSelectedClientCraneId(item.id)}> {item.service_interval_km ? `${(Math.floor(item.current_mileage / item.service_interval_km) + 1) * item.service_interval_km} km` : '—'} setSelectedClientCraneId(item.id)}> {item.is_company_vehicle ? 'Fleet' : 'Kupac'} )} /> )}
)}
); })}
)}
); }