'use client'; import { useState, useEffect } from 'react'; import Link from 'next/link'; import { filamentService, productService } from '@/src/services/api'; import { Filament } from '@/src/types/filament'; import { Product } from '@/src/types/product'; interface StatsCard { label: string; value: number | string; colorHex: string; href?: string; } export default function AdminOverview() { const [filaments, setFilaments] = useState<(Filament & { id: string })[]>([]); const [products, setProducts] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { const fetchData = async () => { try { const [filamentData, productData] = await Promise.all([ filamentService.getAll(), productService.getAll().catch(() => []), ]); setFilaments(filamentData); setProducts(productData); } catch (error) { console.error('Error loading overview data:', error); } finally { setLoading(false); } }; fetchData(); }, []); const lowStockFilaments = filaments.filter(f => f.kolicina <= 2 && f.kolicina > 0); const outOfStockFilaments = filaments.filter(f => f.kolicina === 0); const lowStockProducts = products.filter(p => p.stock <= 2 && p.stock > 0); const outOfStockProducts = products.filter(p => p.stock === 0); const activeSales = filaments.filter(f => f.sale_active).length + products.filter(p => p.sale_active).length; const statsCards: StatsCard[] = [ { label: 'Ukupno filamenata', value: filaments.length, colorHex: '#3b82f6', href: '/upadaj/dashboard/filamenti' }, { label: 'Ukupno proizvoda', value: products.length, colorHex: '#22c55e', href: '/upadaj/dashboard/stampaci' }, { label: 'Nisko stanje', value: lowStockFilaments.length + lowStockProducts.length, colorHex: '#f59e0b' }, { label: 'Aktivni popusti', value: activeSales, colorHex: '#a855f7', href: '/upadaj/dashboard/prodaja' }, ]; if (loading) { return (

Ucitavanje...

); } return (
{/* Page title */}

Pregled

Brzi pregled stanja inventara

{/* Stats Cards */}
{statsCards.map((card) => { const content = (

{card.label}

{card.value}

); return card.href ? ( {content} ) : (
{content}
); })}
{/* Low Stock Alerts */} {(lowStockFilaments.length > 0 || outOfStockFilaments.length > 0 || lowStockProducts.length > 0 || outOfStockProducts.length > 0) && (

Upozorenja o stanju

{/* Out of stock */} {(outOfStockFilaments.length > 0 || outOfStockProducts.length > 0) && (

Nema na stanju ({outOfStockFilaments.length + outOfStockProducts.length})

{outOfStockFilaments.slice(0, 5).map(f => (
{f.tip} {f.finish} - {f.boja}
))} {outOfStockProducts.slice(0, 5).map(p => (
{p.name}
))} {(outOfStockFilaments.length + outOfStockProducts.length) > 10 && (

...i jos {outOfStockFilaments.length + outOfStockProducts.length - 10}

)}
)} {/* Low stock */} {(lowStockFilaments.length > 0 || lowStockProducts.length > 0) && (

Nisko stanje ({lowStockFilaments.length + lowStockProducts.length})

{lowStockFilaments.slice(0, 5).map(f => (
{f.tip} {f.finish} - {f.boja} (kolicina: {f.kolicina})
))} {lowStockProducts.slice(0, 5).map(p => (
{p.name} (stanje: {p.stock})
))} {(lowStockFilaments.length + lowStockProducts.length) > 10 && (

...i jos {lowStockFilaments.length + lowStockProducts.length - 10}

)}
)}
)} {/* Recent Activity */}

Poslednje dodano

{[...filaments] .sort((a, b) => { const dateA = a.updated_at || a.created_at || ''; const dateB = b.updated_at || b.created_at || ''; return new Date(dateB).getTime() - new Date(dateA).getTime(); }) .slice(0, 5) .map(f => (
{f.boja_hex && (
)} {f.tip} {f.finish} - {f.boja}
{f.updated_at ? new Date(f.updated_at).toLocaleDateString('sr-RS') : f.created_at ? new Date(f.created_at).toLocaleDateString('sr-RS') : '-'}
))} {filaments.length === 0 && (

Nema filamenata

)}
{/* Quick Actions */}

Brze akcije

{[ { href: '/upadaj/dashboard/filamenti', label: 'Dodaj filament', color: '#3b82f6' }, { href: '/upadaj/dashboard/stampaci', label: 'Dodaj proizvod', color: '#22c55e' }, { href: '/upadaj/dashboard/prodaja', label: 'Upravljaj popustima', color: '#a855f7' }, { href: '/upadaj/dashboard/boje', label: 'Upravljaj bojama', color: '#ec4899' }, { href: '/upadaj/dashboard/analitika', label: 'Analitika', color: '#14b8a6' }, ].map(action => ( {action.label} ))}
); }