diff --git a/rules2.md b/rules2.md index dc3de2c..c94925c 100644 --- a/rules2.md +++ b/rules2.md @@ -520,7 +520,82 @@ const handleSuppliesClick = () => { 4. **В пути** - товар отгружен 5. **Доставлена/Принято** - получена фулфилментом -### 9.3 Экономика +### 9.3 Правила кнопки "Создать поставку" в разделе "Мои поставки" + +#### **9.3.1 Общие принципы** + +- **КОНТЕКСТНОСТЬ**: Кнопка создания появляется только в активном табе +- **РАСПОЛОЖЕНИЕ**: Правая часть строки таба, на том же уровне что и название +- **СТИЛИСТИКА**: В том же стиле что и сами табы (соответствует уровню иерархии) +- **ФУНКЦИОНАЛЬНОСТЬ**: Кнопка ведет на страницу создания поставки соответствующего типа + +#### **9.3.2 Размещение кнопок по табам** + +**УРОВЕНЬ 2 (Подтабы фулфилмента):** + +- **📦 Товар → Карточки**: Кнопка "Создать поставку" → `/supplies/create-cards` +- **📦 Товар → Поставщики**: Кнопка "Создать поставку" → `/supplies/create-suppliers` +- **🔧 Расходники селлера**: Кнопка "Создать поставку" → `/supplies/create-consumables` + +**УРОВЕНЬ 2 (Подтабы маркетплейсов):** + +- **🟣 Wildberries**: Кнопка "Создать поставку" → `/supplies/create-wildberries` +- **🔵 Ozon**: Кнопка "Создать поставку" → `/supplies/create-ozon` + +#### **9.3.3 Стили кнопок** + +**ДЛЯ УРОВНЯ 2 (h-9):** + +```css +/* Размер и отступы */ +h-9 px-3 py-1 ml-auto + +/* Фон и границы */ +bg-white/8 border border-white/20 hover:bg-white/12 + +/* Текст и иконки */ +text-xs font-medium text-white/80 hover:text-white + +/* Скругления */ +rounded-lg + +/* Переходы */ +transition-all duration-150 +``` + +**ДЛЯ УРОВНЯ 3 (h-8):** + +```css +/* Размер и отступы */ +h-8 px-2 py-1 ml-auto + +/* Фон и границы */ +bg-white/5 border border-white/15 hover:bg-white/8 + +/* Текст и иконки */ +text-xs font-normal text-white/60 hover:text-white/80 + +/* Скругления */ +rounded-md + +/* Переходы */ +transition-all duration-150 +``` + +#### **9.3.4 Поведение кнопок** + +- **ВИДИМОСТЬ**: Кнопка показывается только в активном табе +- **ИКОНКА**: `Plus` размером `h-3 w-3` слева от текста +- **ТЕКСТ**: "Создать" на мобильных, "Создать поставку" на десктопах +- **АДАПТИВНОСТЬ**: Скрытие текста на маленьких экранах (`hidden sm:inline`) + +#### **9.3.5 Удаление старой кнопки** + +- **УБРАТЬ**: Текущий dropdown "Создать поставку" из верхней части +- **ПРИЧИНА**: Заменяется контекстными кнопками в табах +- **СОХРАНИТЬ**: Стили и логику навигации, но адаптировать под новые роуты + +### 9.4 Экономика _Раздел находится в разработке. Будет добавлен позже._ diff --git a/src/app/supplies/create-cards/page.tsx b/src/app/supplies/create-cards/page.tsx new file mode 100644 index 0000000..b601106 --- /dev/null +++ b/src/app/supplies/create-cards/page.tsx @@ -0,0 +1,19 @@ +import { AuthGuard } from "@/components/auth-guard"; + +export default function CreateCardsSupplyPageRoute() { + return ( + + + + + Создание поставки карточек + + + Поставка товаров через WB API с рецептурой + + Раздел находится в разработке + + + + ); +} diff --git a/src/app/supplies/create-ozon/page.tsx b/src/app/supplies/create-ozon/page.tsx new file mode 100644 index 0000000..2048696 --- /dev/null +++ b/src/app/supplies/create-ozon/page.tsx @@ -0,0 +1,17 @@ +import { AuthGuard } from "@/components/auth-guard"; + +export default function CreateOzonSupplyPageRoute() { + return ( + + + + Создание поставки на Ozon + + Прямые поставки товаров на маркетплейс Ozon + + Раздел находится в разработке + + + + ); +} diff --git a/src/app/supplies/create-suppliers/page.tsx b/src/app/supplies/create-suppliers/page.tsx new file mode 100644 index 0000000..e62a887 --- /dev/null +++ b/src/app/supplies/create-suppliers/page.tsx @@ -0,0 +1,19 @@ +import { AuthGuard } from "@/components/auth-guard"; + +export default function CreateSuppliersSupplyPageRoute() { + return ( + + + + + Создание поставки поставщиков + + + Заказ товаров у поставщиков с рецептурой + + Раздел находится в разработке + + + + ); +} diff --git a/src/app/supplies/create-wildberries/page.tsx b/src/app/supplies/create-wildberries/page.tsx new file mode 100644 index 0000000..949bf45 --- /dev/null +++ b/src/app/supplies/create-wildberries/page.tsx @@ -0,0 +1,19 @@ +import { AuthGuard } from "@/components/auth-guard"; + +export default function CreateWildberriesSupplyPageRoute() { + return ( + + + + + Создание поставки на Wildberries + + + Прямые поставки товаров на маркетплейс Wildberries + + Раздел находится в разработке + + + + ); +} diff --git a/src/components/fulfillment-warehouse/fulfillment-warehouse-dashboard.tsx b/src/components/fulfillment-warehouse/fulfillment-warehouse-dashboard.tsx index 9b4f3f7..a3778e0 100644 --- a/src/components/fulfillment-warehouse/fulfillment-warehouse-dashboard.tsx +++ b/src/components/fulfillment-warehouse/fulfillment-warehouse-dashboard.tsx @@ -46,6 +46,8 @@ import { Layers, Truck, Clock, + CheckCircle, + Settings, } from "lucide-react"; // Типы данных @@ -444,6 +446,7 @@ export function FulfillmentWarehouseDashboard() { // Используем данные из GraphQL резолвера const stats = warehouseStatsData.fulfillmentWarehouseStats; + return { products: { current: stats.products.current, @@ -1328,7 +1331,7 @@ export function FulfillmentWarehouseDashboard() { warehouseStatsData?.fulfillmentWarehouseStats?.goods ?.percentChange } - description="В обработке" + description="На складе и в обработке" /> - router.push("/fulfillment-warehouse/supplies")} - /> + router.push("/fulfillment-warehouse/supplies")} + /> diff --git a/src/components/supplies/marketplace-supplies/marketplace-supplies-tab.tsx b/src/components/supplies/marketplace-supplies/marketplace-supplies-tab.tsx index e1cb132..e0f562a 100644 --- a/src/components/supplies/marketplace-supplies/marketplace-supplies-tab.tsx +++ b/src/components/supplies/marketplace-supplies/marketplace-supplies-tab.tsx @@ -15,21 +15,23 @@ export function MarketplaceSuppliesTab() { onValueChange={setActiveSubTab} className="w-full h-full flex flex-col" > - {/* Подвкладки для Маркетплейсов */} - - - Поставки на Wildberries - - - Поставки на Ozon - - + {/* Подвкладки для Маркетплейсов - Уровень 2 иерархии */} + + + + Поставки на Wildberries + + + Поставки на Ozon + + + diff --git a/src/components/supplies/supplies-dashboard.tsx b/src/components/supplies/supplies-dashboard.tsx index 5afab20..6053ae4 100644 --- a/src/components/supplies/supplies-dashboard.tsx +++ b/src/components/supplies/supplies-dashboard.tsx @@ -1,7 +1,7 @@ "use client"; import React, { useState, useEffect } from "react"; -import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; +// Убираем Tabs - используем кнопочную логику как в fulfillment-supplies import { Button } from "@/components/ui/button"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { Sidebar } from "@/components/dashboard/sidebar"; @@ -12,8 +12,10 @@ import { Plus, Package, Wrench, - ChevronDown, AlertTriangle, + Building2, + ShoppingCart, + FileText, } from "lucide-react"; import { GET_PENDING_SUPPLIES_COUNT } from "@/graphql/queries"; import { FulfillmentGoodsTab } from "./fulfillment-supplies/fulfillment-goods-tab"; @@ -21,17 +23,25 @@ import { RealSupplyOrdersTab } from "./fulfillment-supplies/real-supply-orders-t import { SellerSupplyOrdersTab } from "./fulfillment-supplies/seller-supply-orders-tab"; import { AllSuppliesTab } from "./fulfillment-supplies/all-supplies-tab"; import { useAuth } from "@/hooks/useAuth"; -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuTrigger, -} from "@/components/ui/dropdown-menu"; +// Убираем DropdownMenu - больше не используется + +// Компонент для отображения бейджа с уведомлениями +function NotificationBadge({ count }: { count: number }) { + if (count === 0) return null; + + return ( + + {count > 99 ? "99+" : count} + + ); +} export function SuppliesDashboard() { const { getSidebarMargin } = useSidebar(); const searchParams = useSearchParams(); - const [activeTab, setActiveTab] = useState("all"); + const [activeTab, setActiveTab] = useState("fulfillment"); + const [activeSubTab, setActiveSubTab] = useState("goods"); + const [activeThirdTab, setActiveThirdTab] = useState("cards"); const { user } = useAuth(); // Загружаем счетчик поставок, требующих одобрения @@ -120,104 +130,291 @@ export function SuppliesDashboard() { )} - {/* Основные вкладки с кнопкой создания */} - - - - - Все - - - Товар - - 0 ? "animate-pulse" : "" + {/* БЛОК ВСЕХ ТАБОВ */} + + {/* УРОВЕНЬ 1: Главные табы */} + + + { + setActiveTab("fulfillment"); + setActiveSubTab("goods"); + setActiveThirdTab("cards"); + }} + className={`flex items-center gap-2 text-sm font-semibold transition-all duration-200 rounded-lg px-3 ${ + activeTab === "fulfillment" + ? "bg-gradient-to-r from-purple-500/40 to-pink-500/40 text-white shadow-lg" + : "text-white/80 hover:text-white" }`} > - Расходники - {pendingCount?.supplyOrders > 0 && ( - - {pendingCount.supplyOrders} - - )} - - - - - - - - Создать поставку - Создать - - - - + + Поставки на фулфилмент + + Фулфилмент + + + { + setActiveTab("marketplace"); + setActiveSubTab("wildberries"); + }} + className={`flex items-center gap-2 text-sm font-semibold transition-all duration-200 rounded-lg px-3 ${ + activeTab === "marketplace" + ? "bg-gradient-to-r from-purple-500/40 to-pink-500/40 text-white shadow-lg" + : "text-white/80 hover:text-white" + }`} > - { - window.location.href = "/supplies/create"; - }} - className="text-white hover:bg-white/10 cursor-pointer" - > - - Поставка товаров - - { - window.location.href = "/supplies/create-consumables"; - }} - className="text-white hover:bg-white/10 cursor-pointer" - > - - Поставка расходников - - - + + + Поставки на маркетплейсы + + Маркетплейсы + + - - - + {/* УРОВЕНЬ 2: Подтабы для фулфилмента - ТОЛЬКО когда активен фулфилмент */} + {activeTab === "fulfillment" && ( + + + {/* Табы товар и расходники */} + + setActiveSubTab("goods")} + className={`flex items-center gap-1 text-xs font-medium transition-all duration-150 rounded-md px-2 ${ + activeSubTab === "goods" + ? "bg-white/15 text-white border-white/20" + : "text-white/60 hover:text-white/80" + }`} + > + + Товар + Т + + setActiveSubTab("consumables")} + className={`flex items-center gap-1 text-xs font-medium transition-all duration-150 rounded-md px-2 relative ${ + activeSubTab === "consumables" + ? "bg-white/15 text-white border-white/20" + : "text-white/60 hover:text-white/80" + }`} + > + + + Расходники селлера + + Р + + + - - - + {/* Кнопка создания для расходников селлера */} + {activeSubTab === "consumables" && ( + { + window.location.href = "/supplies/create-consumables"; + }} + className="h-7 px-3 py-1 ml-2 bg-white/8 border border-white/20 hover:bg-white/12 text-xs font-medium text-white/80 hover:text-white rounded-lg transition-all duration-150 flex items-center gap-1" + > + + Создать поставку + Создать + + )} + + + )} - - {isWholesale ? ( - - ) : ( - - )} - - + {/* УРОВЕНЬ 2: Подтабы для маркетплейсов - ТОЛЬКО когда активны маркетплейсы */} + {activeTab === "marketplace" && ( + + + {/* Табы маркетплейсов */} + + setActiveSubTab("wildberries")} + className={`flex items-center gap-1 text-xs font-medium transition-all duration-150 rounded-md px-2 ${ + activeSubTab === "wildberries" + ? "bg-white/15 text-white border-white/20" + : "text-white/60 hover:text-white/80" + }`} + > + + Wildberries + W + + setActiveSubTab("ozon")} + className={`flex items-center gap-1 text-xs font-medium transition-all duration-150 rounded-md px-2 ${ + activeSubTab === "ozon" + ? "bg-white/15 text-white border-white/20" + : "text-white/60 hover:text-white/80" + }`} + > + + Ozon + O + + + + {/* Кнопка создания для Wildberries */} + {activeSubTab === "wildberries" && ( + { + window.location.href = "/supplies/create-wildberries"; + }} + className="h-7 px-3 py-1 ml-2 bg-white/8 border border-white/20 hover:bg-white/12 text-xs font-medium text-white/80 hover:text-white rounded-lg transition-all duration-150 flex items-center gap-1" + > + + Создать поставку + Создать + + )} + + {/* Кнопка создания для Ozon */} + {activeSubTab === "ozon" && ( + { + window.location.href = "/supplies/create-ozon"; + }} + className="h-7 px-3 py-1 ml-2 bg-white/8 border border-white/20 hover:bg-white/12 text-xs font-medium text-white/80 hover:text-white rounded-lg transition-all duration-150 flex items-center gap-1" + > + + Создать поставку + Создать + + )} + + + )} + + {/* УРОВЕНЬ 3: Подподтабы для товаров - ТОЛЬКО когда активен товар */} + {activeTab === "fulfillment" && activeSubTab === "goods" && ( + + + {/* Табы карточки и поставщики */} + + setActiveThirdTab("cards")} + className={`flex items-center gap-1 text-xs font-normal transition-all duration-150 rounded-sm px-2 ${ + activeThirdTab === "cards" + ? "bg-white/10 text-white" + : "text-white/50 hover:text-white/70" + }`} + > + + Карточки + К + + setActiveThirdTab("suppliers")} + className={`flex items-center gap-1 text-xs font-normal transition-all duration-150 rounded-sm px-2 ${ + activeThirdTab === "suppliers" + ? "bg-white/10 text-white" + : "text-white/50 hover:text-white/70" + }`} + > + + Поставщики + П + + + + {/* Кнопка создания для карточек */} + {activeThirdTab === "cards" && ( + { + window.location.href = "/supplies/create-cards"; + }} + className="h-6 px-2 py-1 ml-2 bg-white/5 border border-white/15 hover:bg-white/8 text-xs font-normal text-white/60 hover:text-white/80 rounded-md transition-all duration-150 flex items-center gap-1" + > + + Создать поставку + Создать + + )} + + {/* Кнопка создания для поставщиков */} + {activeThirdTab === "suppliers" && ( + { + window.location.href = "/supplies/create-suppliers"; + }} + className="h-6 px-2 py-1 ml-2 bg-white/5 border border-white/15 hover:bg-white/8 text-xs font-normal text-white/60 hover:text-white/80 rounded-md transition-all duration-150 flex items-center gap-1" + > + + Создать поставку + Создать + + )} + + + )} + + + {/* РАБОЧЕЕ ПРОСТРАНСТВО */} + + {/* СОДЕРЖИМОЕ ПОСТАВОК НА ФУЛФИЛМЕНТ */} + {activeTab === "fulfillment" && ( + + {/* ТОВАР */} + {activeSubTab === "goods" && ( + + {/* КАРТОЧКИ */} + {activeThirdTab === "cards" && } + + {/* ПОСТАВЩИКИ */} + {activeThirdTab === "suppliers" && ( + + )} + + )} + + {/* РАСХОДНИКИ СЕЛЛЕРА */} + {activeSubTab === "consumables" && ( + + {isWholesale ? ( + + ) : ( + + )} + + )} + + )} + + {/* СОДЕРЖИМОЕ ПОСТАВОК НА МАРКЕТПЛЕЙСЫ */} + {activeTab === "marketplace" && ( + + {/* WILDBERRIES */} + {activeSubTab === "wildberries" && ( + + + + Поставки на Wildberries + + Раздел находится в разработке + + )} + + {/* OZON */} + {activeSubTab === "ozon" && ( + + + + Поставки на Ozon + + Раздел находится в разработке + + )} + + )} +
+ Поставка товаров через WB API с рецептурой +
Раздел находится в разработке
+ Прямые поставки товаров на маркетплейс Ozon +
+ Заказ товаров у поставщиков с рецептурой +
+ Прямые поставки товаров на маркетплейс Wildberries +