From 85b1758950e54e33d7f1c2c0728ce1cbf84d04ec Mon Sep 17 00:00:00 2001 From: Bivekich Date: Mon, 21 Jul 2025 15:52:09 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=B2=D1=85=D0=BE=D0=B4=D1=8F=D1=89=D0=B8=D1=85=20?= =?UTF-8?q?=D0=B7=D0=B0=D1=8F=D0=B2=D0=BE=D0=BA=20=D0=B2=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5=D0=BD=D1=82=D1=8B=20=D0=BF=D0=B0?= =?UTF-8?q?=D0=BD=D0=B5=D0=BB=D0=B8=20=D0=B8=20=D0=BC=D0=B5=D1=81=D1=81?= =?UTF-8?q?=D0=B5=D0=BD=D0=B4=D0=B6=D0=B5=D1=80=D0=B0.=20=D0=9E=D0=B1?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=B7=D0=B0=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D1=81=D1=8B=20GraphQL=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B4?= =?UTF-8?q?=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20=D0=BE=20=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D1=8B=D1=85=20=D0=B7=D0=B0=D1=8F=D0=B2=D0=BA=D0=B0=D1=85,=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=B8?= =?UTF-8?q?=D0=BD=D0=B4=D0=B8=D0=BA=D0=B0=D1=82=D0=BE=D1=80=D1=8B=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=BE=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=BA=D0=BE=D0=BB=D0=B8=D1=87=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D0=B2=D0=B0=20=D0=B2=D1=85=D0=BE=D0=B4=D1=8F=D1=89=D0=B8?= =?UTF-8?q?=D1=85=20=D0=B7=D0=B0=D1=8F=D0=B2=D0=BE=D0=BA=20=D0=B2=20=D0=B8?= =?UTF-8?q?=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9=D1=81=D0=B5.=20?= =?UTF-8?q?=D0=9E=D0=BF=D1=82=D0=B8=D0=BC=D0=B8=D0=B7=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=20=D0=BA=D0=BE=D0=B4=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D1=83=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=87?= =?UTF-8?q?=D0=B8=D1=82=D0=B0=D0=B5=D0=BC=D0=BE=D1=81=D1=82=D0=B8=20=D0=B8?= =?UTF-8?q?=20=D0=B2=D0=B7=D0=B0=D0=B8=D0=BC=D0=BE=D0=B4=D0=B5=D0=B9=D1=81?= =?UTF-8?q?=D1=82=D0=B2=D0=B8=D1=8F=20=D1=81=20=D0=BF=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D0=B5=D0=BC.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/employees/new/page.tsx | 57 +++++++++++++++++++ src/components/dashboard/sidebar.tsx | 24 +++++++- .../market/market-counterparties.tsx | 5 +- src/components/messenger/messenger-chat.tsx | 12 ++-- .../partners/partners-dashboard.tsx | 20 ++++++- 5 files changed, 107 insertions(+), 11 deletions(-) create mode 100644 src/app/employees/new/page.tsx diff --git a/src/app/employees/new/page.tsx b/src/app/employees/new/page.tsx new file mode 100644 index 0000000..2e30f9e --- /dev/null +++ b/src/app/employees/new/page.tsx @@ -0,0 +1,57 @@ +"use client" + +import { AuthGuard } from '@/components/auth-guard' +import { EmployeeForm } from '@/components/employees/employee-form' +import { Card } from '@/components/ui/card' +import { Sidebar } from '@/components/dashboard/sidebar' +import { useSidebar } from '@/hooks/useSidebar' +import { UserPlus, ArrowLeft } from 'lucide-react' +import { Button } from '@/components/ui/button' +import { useRouter } from 'next/navigation' + +export default function NewEmployeePage() { + const { getSidebarMargin } = useSidebar() + const router = useRouter() + + return ( + +
+ +
+
+ {/* Заголовок */} +
+ +
+ +
+

Добавить сотрудника

+

Создание нового сотрудника организации

+
+
+
+ + {/* Форма */} + + { + // TODO: Добавить создание сотрудника + console.log('Создание сотрудника:', employeeData) + router.push('/employees') + }} + onCancel={() => router.push('/employees')} + /> + +
+
+
+
+ ) +} \ No newline at end of file diff --git a/src/components/dashboard/sidebar.tsx b/src/components/dashboard/sidebar.tsx index 69001b9..8eaaafe 100644 --- a/src/components/dashboard/sidebar.tsx +++ b/src/components/dashboard/sidebar.tsx @@ -7,7 +7,7 @@ import { Card } from '@/components/ui/card' import { Avatar, AvatarImage, AvatarFallback } from '@/components/ui/avatar' import { useRouter, usePathname } from 'next/navigation' import { useQuery } from '@apollo/client' -import { GET_CONVERSATIONS } from '@/graphql/queries' +import { GET_CONVERSATIONS, GET_INCOMING_REQUESTS } from '@/graphql/queries' import { Settings, LogOut, @@ -36,8 +36,18 @@ export function Sidebar() { notifyOnNetworkStatusChange: false, // Плавные обновления без мерцания }) + // Загружаем входящие заявки для подсчета новых запросов + const { data: incomingRequestsData } = useQuery(GET_INCOMING_REQUESTS, { + pollInterval: 60000, // Обновляем каждую минуту + fetchPolicy: 'cache-first', + errorPolicy: 'ignore', + notifyOnNetworkStatusChange: false, + }) + const conversations = conversationsData?.conversations || [] + const incomingRequests = incomingRequestsData?.incomingRequests || [] const totalUnreadCount = conversations.reduce((sum: number, conv: { unreadCount?: number }) => sum + (conv.unreadCount || 0), 0) + const incomingRequestsCount = incomingRequests.length const getInitials = () => { const orgName = getOrganizationName() @@ -258,7 +268,7 @@ export function Sidebar() { {/* Услуги - только для фулфилмент центров */} diff --git a/src/components/market/market-counterparties.tsx b/src/components/market/market-counterparties.tsx index 81d2ce5..0fb6eed 100644 --- a/src/components/market/market-counterparties.tsx +++ b/src/components/market/market-counterparties.tsx @@ -167,9 +167,12 @@ export function MarketCounterparties() { Контрагенты ({counterparties.length}) - + 0 ? 'ring-2 ring-green-400/50 animate-pulse' : ''}`}> Входящие ({incomingRequests.length}) + {incomingRequests.length > 0 && ( +
+ )}
diff --git a/src/components/messenger/messenger-chat.tsx b/src/components/messenger/messenger-chat.tsx index 741165d..fed823f 100644 --- a/src/components/messenger/messenger-chat.tsx +++ b/src/components/messenger/messenger-chat.tsx @@ -338,17 +338,17 @@ export function MessengerChat({ counterparty, onMessagesRead }: MessengerChatPro
-

- {getOrganizationName(counterparty)} -

+

+ {getOrganizationName(counterparty)} +

{getTypeLabel(counterparty.type)} -

- {getShortCompanyName(counterparty.fullName || '')} -

+

+ {getShortCompanyName(counterparty.fullName || '')} +

diff --git a/src/components/partners/partners-dashboard.tsx b/src/components/partners/partners-dashboard.tsx index 5321459..e2c570d 100644 --- a/src/components/partners/partners-dashboard.tsx +++ b/src/components/partners/partners-dashboard.tsx @@ -4,6 +4,8 @@ import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' import { Card } from '@/components/ui/card' import { Sidebar } from '@/components/dashboard/sidebar' import { useSidebar } from '@/hooks/useSidebar' +import { useQuery } from '@apollo/client' +import { GET_INCOMING_REQUESTS } from '@/graphql/queries' import { MarketCounterparties } from '../market/market-counterparties' import { MarketFulfillment } from '../market/market-fulfillment' import { MarketSellers } from '../market/market-sellers' @@ -12,6 +14,17 @@ import { MarketWholesale } from '../market/market-wholesale' export function PartnersDashboard() { const { getSidebarMargin } = useSidebar() + + // Загружаем входящие заявки для подсветки + const { data: incomingRequestsData } = useQuery(GET_INCOMING_REQUESTS, { + pollInterval: 30000, // Обновляем каждые 30 секунд + fetchPolicy: 'cache-first', + errorPolicy: 'ignore', + }) + + const incomingRequests = incomingRequestsData?.incomingRequests || [] + const hasIncomingRequests = incomingRequests.length > 0 + return (
@@ -20,12 +33,15 @@ export function PartnersDashboard() { {/* Основной контент с табами */}
- + Мои контрагенты + {hasIncomingRequests && ( +
+ )}