'use client'; import React, { useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import { colorRequestService } from '@/src/services/api'; import Link from 'next/link'; interface ColorRequest { id: string; color_name: string; material_type: string; finish_type: string; user_email: string; user_name: string; description: string; reference_url: string; status: 'pending' | 'approved' | 'rejected' | 'completed'; admin_notes: string; request_count: number; created_at: string; updated_at: string; processed_at: string; processed_by: string; } export default function ColorRequestsAdmin() { const [requests, setRequests] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const [editingId, setEditingId] = useState(null); const [editForm, setEditForm] = useState({ status: '', admin_notes: '' }); const router = useRouter(); useEffect(() => { checkAuth(); fetchRequests(); }, []); const checkAuth = () => { const token = localStorage.getItem('authToken'); const expiry = localStorage.getItem('tokenExpiry'); if (!token || !expiry || new Date().getTime() > parseInt(expiry)) { router.push('/upadaj'); } }; const fetchRequests = async () => { try { const data = await colorRequestService.getAll(); setRequests(data); } catch (error) { setError('Failed to fetch color requests'); console.error('Error:', error); } finally { setLoading(false); } }; const handleStatusUpdate = async (id: string) => { try { await colorRequestService.updateStatus(id, editForm.status, editForm.admin_notes); await fetchRequests(); setEditingId(null); setEditForm({ status: '', admin_notes: '' }); } catch (error) { setError('Failed to update request'); console.error('Error:', error); } }; const handleDelete = async (id: string) => { if (!confirm('Are you sure you want to delete this request?')) return; try { await colorRequestService.delete(id); await fetchRequests(); } catch (error) { setError('Failed to delete request'); console.error('Error:', error); } }; const getStatusBadge = (status: string) => { const colors = { pending: 'bg-yellow-100 dark:bg-yellow-900/30 text-yellow-800 dark:text-yellow-300', approved: 'bg-green-100 dark:bg-green-900/30 text-green-800 dark:text-green-300', rejected: 'bg-red-100 dark:bg-red-900/30 text-red-800 dark:text-red-300', completed: 'bg-blue-100 dark:bg-blue-900/30 text-blue-800 dark:text-blue-300' }; return colors[status as keyof typeof colors] || 'bg-gray-100 dark:bg-gray-700 text-gray-800 dark:text-gray-300'; }; const formatDate = (dateString: string) => { if (!dateString) return '-'; return new Date(dateString).toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' }); }; if (loading) { return (
Učitavanje zahteva za boje...
); } return (

Zahtevi za Boje

Inventar Boje
{error && (
{error}
)}
{requests.map((request) => (
Boja Materijal/Finiš Broj Zahteva Korisnik Status Datum Akcije
{request.color_name}
{request.description && (
{request.description}
)} {request.reference_url && ( Pogledaj referencu )}
{request.material_type}
{request.finish_type && (
{request.finish_type}
)}
{request.request_count} {request.request_count === 1 ? 'zahtev' : 'zahteva'}
{request.user_name &&
{request.user_name}
} {request.user_email && ( {request.user_email} )} {!request.user_name && !request.user_email && ( Anonimno )}
{editingId === request.id ? (