'use client' import { useQuery } from '@apollo/client' import { Wrench, Plus, Calendar, TrendingUp, AlertCircle, Search, Filter } from 'lucide-react' import { useState } from 'react' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' import { Card } from '@/components/ui/card' import { Input } from '@/components/ui/input' import { GET_MY_SUPPLIES } from '@/graphql/queries' interface MaterialSupply { id: string name: string description?: string price: number quantity: number unit?: string category?: string status?: string date: string supplier?: string minStock?: number currentStock?: number imageUrl?: string createdAt: string updatedAt: string } export function MaterialsSuppliesTab() { const [searchTerm, setSearchTerm] = useState('') const [categoryFilter, setCategoryFilter] = useState('all') const [statusFilter, setStatusFilter] = useState('all') // Загружаем расходники из GraphQL const { data, loading, error, refetch } = useQuery(GET_MY_SUPPLIES, { fetchPolicy: 'cache-and-network', // Всегда проверяем сервер errorPolicy: 'all', // Показываем ошибки }) const formatCurrency = (amount: number) => { return new Intl.NumberFormat('ru-RU', { style: 'currency', currency: 'RUB', minimumFractionDigits: 0, }).format(amount) } const formatDate = (dateString: string) => { return new Date(dateString).toLocaleDateString('ru-RU', { day: '2-digit', month: '2-digit', year: 'numeric', }) } const getStatusBadge = (status: string) => { const statusConfig = { planned: { variant: 'outline' as const, color: 'text-blue-300 border-blue-400/30', label: 'Запланировано' }, 'in-transit': { variant: 'outline' as const, color: 'text-yellow-300 border-yellow-400/30', label: 'В пути' }, delivered: { variant: 'outline' as const, color: 'text-green-300 border-green-400/30', label: 'Доставлено' }, 'in-stock': { variant: 'outline' as const, color: 'text-purple-300 border-purple-400/30', label: 'На складе' }, } const config = statusConfig[status as keyof typeof statusConfig] || statusConfig.planned return ( {config.label} ) } const getStockStatusBadge = (currentStock: number, minStock: number) => { if (currentStock <= minStock) { return ( Низкий остаток ) } else if (currentStock <= minStock * 1.5) { return ( Требует заказа ) } return ( В норме ) } // Обрабатываем данные из GraphQL const supplies: MaterialSupply[] = data?.mySupplies || [] const filteredSupplies = supplies.filter((supply: MaterialSupply) => { const matchesSearch = supply.name.toLowerCase().includes(searchTerm.toLowerCase()) || (supply.category || '').toLowerCase().includes(searchTerm.toLowerCase()) || (supply.supplier || '').toLowerCase().includes(searchTerm.toLowerCase()) const matchesCategory = categoryFilter === 'all' || supply.category === categoryFilter const matchesStatus = statusFilter === 'all' || supply.status === statusFilter return matchesSearch && matchesCategory && matchesStatus }) const getTotalAmount = () => { return filteredSupplies.reduce((sum: number, supply: MaterialSupply) => sum + supply.price * supply.quantity, 0) } const getTotalQuantity = () => { return filteredSupplies.reduce((sum: number, supply: MaterialSupply) => sum + supply.quantity, 0) } const getLowStockCount = () => { return supplies.filter((supply: MaterialSupply) => (supply.currentStock || 0) <= (supply.minStock || 0)).length } const categories = Array.from(new Set(supplies.map((supply: MaterialSupply) => supply.category))) // Показываем индикатор загрузки if (loading) { return (

Загрузка расходников...

) } // Показываем ошибку if (error) { return (

Ошибка загрузки данных

{error.message}

) } return (
{/* Статистика с кнопкой заказа */}

Поставок

{filteredSupplies.length}

Сумма

{formatCurrency(getTotalAmount())}

Единиц

{getTotalQuantity()}

Низкий остаток

{getLowStockCount()}

{/* Кнопка заказа */}
{/* Компактный поиск и фильтры */}
setSearchTerm(e.target.value)} className="pl-7 h-8 text-sm glass-input text-white placeholder:text-white/40" />
{/* Компактная таблица расходников */}
{filteredSupplies.map((supply) => ( ))}
Наименование Категория Кол-во Остаток Поставщик Дата Сумма Статус
{supply.name} {supply.description &&

{supply.description}

}
{supply.category || 'Не указано'} {supply.quantity} {supply.unit || 'шт'}
{supply.currentStock || 0} {supply.unit || 'шт'} {getStockStatusBadge(supply.currentStock || 0, supply.minStock || 0)}
{supply.supplier || 'Не указан'} {supply.date ? formatDate(supply.date) : 'Не указано'} {formatCurrency(supply.price * supply.quantity)} {getStatusBadge(supply.status || 'planned')}
{filteredSupplies.length === 0 && (

Расходники не найдены

Попробуйте изменить параметры поиска или создать новый заказ

)}
) }