'use client' import { useQuery } from '@apollo/client' import { Plus, Package, Grid3X3, List, Edit3, Trash2 } from 'lucide-react' import React, { useState } from 'react' import { Button } from '@/components/ui/button' import { Card } from '@/components/ui/card' import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog' import { Input } from '@/components/ui/input' import { GET_MY_PRODUCTS } from '@/graphql/queries' import { useSidebar } from '@/hooks/useSidebar' import { ProductCard } from './product-card' import { ProductForm } from './product-form' import { WarehouseStatistics } from './warehouse-statistics' interface Product { id: string name: string article: string description: string price: number pricePerSet?: number quantity: number setQuantity?: number ordered?: number inTransit?: number stock?: number sold?: number type: 'PRODUCT' | 'CONSUMABLE' category: { id: string; name: string } | null brand: string color: string size: string weight: number dimensions: string material: string images: string[] mainImage: string isActive: boolean createdAt: string updatedAt: string } export function WarehouseDashboard() { const { getSidebarMargin } = useSidebar() const [isDialogOpen, setIsDialogOpen] = useState(false) const [editingProduct, setEditingProduct] = useState(null) const [searchQuery, setSearchQuery] = useState('') const [viewMode, setViewMode] = useState<'cards' | 'table'>('cards') const { data, loading, error, refetch } = useQuery(GET_MY_PRODUCTS, { errorPolicy: 'all', }) const products: Product[] = data?.myProducts || [] // Фильтрация товаров по поисковому запросу const filteredProducts = products.filter( (product) => product.name.toLowerCase().includes(searchQuery.toLowerCase()) || product.article.toLowerCase().includes(searchQuery.toLowerCase()) || product.category?.name?.toLowerCase().includes(searchQuery.toLowerCase()) || product.brand?.toLowerCase().includes(searchQuery.toLowerCase()), ) const handleCreateProduct = () => { setEditingProduct(null) setIsDialogOpen(true) } const handleEditProduct = (product: Product) => { setEditingProduct(product) setIsDialogOpen(true) } const handleProductSaved = () => { setIsDialogOpen(false) setEditingProduct(null) refetch() } const handleProductDeleted = () => { refetch() } if (error) { return (

Ошибка загрузки

{error.message || 'Не удалось загрузить товары'}

) } return (
{/* Поиск и управление */}
setSearchQuery(e.target.value)} className="glass-input text-white placeholder:text-white/50 h-10" />
{/* Переключатель режимов отображения */}
{editingProduct ? 'Редактировать товар/расходник' : 'Добавить товар/расходник'} setIsDialogOpen(false)} />
{/* Блок статистики */} {/* Основной контент */} {loading ? (

Загрузка товаров...

) : filteredProducts.length === 0 ? (

{searchQuery ? 'Товары не найдены' : 'Склад пуст'}

{searchQuery ? 'Попробуйте изменить критерии поиска' : 'Добавьте ваш первый товар на склад'}

{!searchQuery && ( )}
) : (
{viewMode === 'cards' ? (
{filteredProducts.map((product) => ( ))}
) : (
Фото
Название
Артикул
Тип
Категория
Цена
Остаток
Заказано
В пути
Продано
Действия
{filteredProducts.map((product) => (
{product.mainImage || product.images[0] ? ( {product.name} ) : (
)}
{product.name}
{product.brand}
{product.article}
{product.type === 'PRODUCT' ? 'Товар' : 'Расходник'}
{product.category?.name || 'Нет'}
{new Intl.NumberFormat('ru-RU', { style: 'currency', currency: 'RUB', minimumFractionDigits: 0, }).format(product.price)}
{product.stock || product.quantity || 0}
{product.ordered || 0}
{product.inTransit || 0}
{product.sold || 0}
))}
)}
)}
) }