"use client"; import React, { useState } from "react"; import { useQuery } from "@apollo/client"; import { Card } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { Sidebar } from "@/components/dashboard/sidebar"; import { useSidebar } from "@/hooks/useSidebar"; import { ProductForm } from "./product-form"; import { ProductCard } from "./product-card"; import { WarehouseStatistics } from "./warehouse-statistics"; import { GET_MY_PRODUCTS } from "@/graphql/queries"; import { Plus, Package, Grid3X3, List, Edit3, Trash2 } from "lucide-react"; import { Input } from "@/components/ui/input"; 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}
))}
)}
)}
); }