Обновлены модели и компоненты для управления поставками и расходниками. Добавлены новые поля в модели SupplyOrder и соответствующие резолверы для поддержки логистики. Реализованы компоненты уведомлений для отображения статуса логистических заявок и поставок. Оптимизирован интерфейс для улучшения пользовательского опыта, добавлены логи для диагностики запросов. Обновлены GraphQL схемы и мутации для поддержки новых функциональных возможностей.
This commit is contained in:
@ -48,6 +48,65 @@ function PendingSuppliesNotification() {
|
||||
);
|
||||
}
|
||||
|
||||
// Компонент для отображения логистических заявок (только для логистики)
|
||||
function LogisticsOrdersNotification() {
|
||||
const { data: pendingData } = useQuery(GET_PENDING_SUPPLIES_COUNT, {
|
||||
pollInterval: 30000, // Обновляем каждые 30 секунд
|
||||
fetchPolicy: "cache-first",
|
||||
errorPolicy: "ignore",
|
||||
});
|
||||
|
||||
const logisticsCount =
|
||||
pendingData?.pendingSuppliesCount?.logisticsOrders || 0;
|
||||
|
||||
if (logisticsCount === 0) return null;
|
||||
|
||||
return (
|
||||
<div className="absolute -top-1 -right-1 bg-red-500 text-white text-xs rounded-full min-w-[18px] h-[18px] flex items-center justify-center font-bold animate-pulse">
|
||||
{logisticsCount > 99 ? "99+" : logisticsCount}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
// Компонент для отображения поставок фулфилмента (только поставки, не заявки на партнерство)
|
||||
function FulfillmentSuppliesNotification() {
|
||||
const { data: pendingData } = useQuery(GET_PENDING_SUPPLIES_COUNT, {
|
||||
pollInterval: 30000, // Обновляем каждые 30 секунд
|
||||
fetchPolicy: "cache-first",
|
||||
errorPolicy: "ignore",
|
||||
});
|
||||
|
||||
const suppliesCount = pendingData?.pendingSuppliesCount?.supplyOrders || 0;
|
||||
|
||||
if (suppliesCount === 0) return null;
|
||||
|
||||
return (
|
||||
<div className="absolute -top-1 -right-1 bg-red-500 text-white text-xs rounded-full min-w-[18px] h-[18px] flex items-center justify-center font-bold animate-pulse">
|
||||
{suppliesCount > 99 ? "99+" : suppliesCount}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
// Компонент для отображения входящих заказов поставщика (только входящие заказы, не заявки на партнерство)
|
||||
function WholesaleOrdersNotification() {
|
||||
const { data: pendingData } = useQuery(GET_PENDING_SUPPLIES_COUNT, {
|
||||
pollInterval: 30000, // Обновляем каждые 30 секунд
|
||||
fetchPolicy: "cache-first",
|
||||
errorPolicy: "ignore",
|
||||
});
|
||||
|
||||
const ordersCount =
|
||||
pendingData?.pendingSuppliesCount?.incomingSupplierOrders || 0;
|
||||
|
||||
if (ordersCount === 0) return null;
|
||||
|
||||
return (
|
||||
<div className="absolute -top-1 -right-1 bg-red-500 text-white text-xs rounded-full min-w-[18px] h-[18px] flex items-center justify-center font-bold animate-pulse">
|
||||
{ordersCount > 99 ? "99+" : ordersCount}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export function Sidebar() {
|
||||
const { user, logout } = useAuth();
|
||||
const router = useRouter();
|
||||
@ -149,7 +208,7 @@ export function Sidebar() {
|
||||
router.push("/supplies");
|
||||
break;
|
||||
case "WHOLESALE":
|
||||
router.push("/supplies");
|
||||
router.push("/supplier-orders");
|
||||
break;
|
||||
case "LOGIST":
|
||||
router.push("/logistics-orders");
|
||||
@ -202,7 +261,8 @@ export function Sidebar() {
|
||||
const isSuppliesActive =
|
||||
pathname.startsWith("/supplies") ||
|
||||
pathname.startsWith("/fulfillment-supplies") ||
|
||||
pathname.startsWith("/logistics");
|
||||
pathname.startsWith("/logistics") ||
|
||||
pathname.startsWith("/supplier-orders");
|
||||
const isPartnersActive = pathname.startsWith("/partners");
|
||||
|
||||
return (
|
||||
@ -475,8 +535,7 @@ export function Sidebar() {
|
||||
>
|
||||
<Truck className="h-4 w-4 flex-shrink-0" />
|
||||
{!isCollapsed && <span className="ml-3">Мои поставки</span>}
|
||||
{/* Уведомление о непринятых поставках */}
|
||||
<PendingSuppliesNotification />
|
||||
{/* Селлеры не получают уведомления о поставках - только отслеживают статус */}
|
||||
</Button>
|
||||
)}
|
||||
|
||||
@ -536,8 +595,8 @@ export function Sidebar() {
|
||||
{!isCollapsed && (
|
||||
<span className="ml-3">Входящие поставки</span>
|
||||
)}
|
||||
{/* Уведомление о непринятых поставках */}
|
||||
<PendingSuppliesNotification />
|
||||
{/* Уведомление только о поставках, не о заявках на партнерство */}
|
||||
<FulfillmentSuppliesNotification />
|
||||
</Button>
|
||||
)}
|
||||
|
||||
@ -595,8 +654,8 @@ export function Sidebar() {
|
||||
>
|
||||
<Truck className="h-4 w-4 flex-shrink-0" />
|
||||
{!isCollapsed && <span className="ml-3">Заявки</span>}
|
||||
{/* Уведомление о непринятых поставках */}
|
||||
<PendingSuppliesNotification />
|
||||
{/* Уведомление только о входящих заказах поставок, не о заявках на партнерство */}
|
||||
<WholesaleOrdersNotification />
|
||||
</Button>
|
||||
)}
|
||||
|
||||
@ -616,8 +675,8 @@ export function Sidebar() {
|
||||
>
|
||||
<Truck className="h-4 w-4 flex-shrink-0" />
|
||||
{!isCollapsed && <span className="ml-3">Перевозки</span>}
|
||||
{/* Уведомление о непринятых поставках */}
|
||||
<PendingSuppliesNotification />
|
||||
{/* Уведомление только о логистических заявках */}
|
||||
<LogisticsOrdersNotification />
|
||||
</Button>
|
||||
)}
|
||||
|
||||
|
Reference in New Issue
Block a user