From 8e7c398b951db27c63097cd0154f8e787a80c46b Mon Sep 17 00:00:00 2001 From: Bivekich Date: Mon, 30 Jun 2025 17:42:36 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D1=8B=20=D0=B4=D0=BB=D1=8F=20=D0=BE=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=BA=D0=B8=20=D0=BD=D0=B5=D0=BE=D0=B1=D1=8F?= =?UTF-8?q?=D0=B7=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D1=85=20=D1=81?= =?UTF-8?q?=D0=B2=D0=BE=D0=B9=D1=81=D1=82=D0=B2=20=D0=B8=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=B7=D0=B0=D0=B3?= =?UTF-8?q?=D0=BB=D1=83=D1=88=D0=BA=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D1=81?= =?UTF-8?q?=D0=BB=D1=83=D1=87=D0=B0=D0=B5=D0=B2=20=D0=BE=D1=82=D1=81=D1=83?= =?UTF-8?q?=D1=82=D1=81=D1=82=D0=B2=D0=B8=D1=8F=20=D0=B4=D0=B0=D0=BD=D0=BD?= =?UTF-8?q?=D1=8B=D1=85=20=D0=BE=20=D1=82=D1=80=D0=B0=D0=BD=D1=81=D0=BF?= =?UTF-8?q?=D0=BE=D1=80=D1=82=D0=BD=D0=BE=D0=BC=20=D1=81=D1=80=D0=B5=D0=B4?= =?UTF-8?q?=D1=81=D1=82=D0=B2=D0=B5=20=D0=B8=20=D0=B4=D0=B5=D1=82=D0=B0?= =?UTF-8?q?=D0=BB=D1=8F=D1=85.=20=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D1=83=D1=81=D0=BB=D0=BE=D0=B2=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=BF=D1=83=D1=81=D0=BA=D0=B0=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D1=81=D0=BE=D0=B2=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=D0=B0=D1=85=20InfoVi?= =?UTF-8?q?n,=20KnotIn,=20KnotParts,=20VinCategory=20=D0=B8=20VinLeftbar.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/vin/InfoVin.tsx | 9 ++++--- src/components/vin/KnotIn.tsx | 24 ++++++++++++----- src/components/vin/KnotParts.tsx | 16 ++++++++++-- src/components/vin/VinCategory.tsx | 41 ++++++++++++++++++++++-------- src/components/vin/VinLeftbar.tsx | 20 ++++++++++++--- 5 files changed, 83 insertions(+), 27 deletions(-) diff --git a/src/components/vin/InfoVin.tsx b/src/components/vin/InfoVin.tsx index 6e84a34..97d3cd4 100644 --- a/src/components/vin/InfoVin.tsx +++ b/src/components/vin/InfoVin.tsx @@ -1,11 +1,14 @@ import React from "react"; interface InfoVinProps { - vehicleName: string; - vehicleInfo: string; + vehicleName?: string; + vehicleInfo?: string; } -const InfoVin: React.FC = ({ vehicleName, vehicleInfo }) => ( +const InfoVin: React.FC = ({ + vehicleName = "VIN декодирование", + vehicleInfo = "Поиск запчастей по VIN номеру автомобиля" +}) => (
diff --git a/src/components/vin/KnotIn.tsx b/src/components/vin/KnotIn.tsx index f7e1e5f..2e2a783 100644 --- a/src/components/vin/KnotIn.tsx +++ b/src/components/vin/KnotIn.tsx @@ -5,10 +5,10 @@ import { GET_LAXIMO_UNIT_INFO, GET_LAXIMO_UNIT_IMAGE_MAP } from '@/lib/graphql'; import BrandSelectionModal from '../BrandSelectionModal'; interface KnotInProps { - catalogCode: string; - vehicleId: string; + catalogCode?: string; + vehicleId?: string; ssd?: string; - unitId: string; + unitId?: string; unitName?: string; parts?: Array<{ detailid?: string; @@ -46,8 +46,8 @@ const KnotIn: React.FC = ({ catalogCode, vehicleId, ssd, unitId, un const { data: unitInfoData, loading: unitInfoLoading, error: unitInfoError } = useQuery( GET_LAXIMO_UNIT_INFO, { - variables: { catalogCode, vehicleId, unitId, ssd: ssd || '' }, - skip: !catalogCode || vehicleId === undefined || vehicleId === null || !unitId, + variables: { catalogCode: catalogCode || '', vehicleId: vehicleId || '', unitId: unitId || '', ssd: ssd || '' }, + skip: !catalogCode || !vehicleId || !unitId, errorPolicy: 'all', } ); @@ -55,12 +55,22 @@ const KnotIn: React.FC = ({ catalogCode, vehicleId, ssd, unitId, un const { data: imageMapData, loading: imageMapLoading, error: imageMapError } = useQuery( GET_LAXIMO_UNIT_IMAGE_MAP, { - variables: { catalogCode, vehicleId, unitId, ssd: ssd || '' }, - skip: !catalogCode || vehicleId === undefined || vehicleId === null || !unitId, + variables: { catalogCode: catalogCode || '', vehicleId: vehicleId || '', unitId: unitId || '', ssd: ssd || '' }, + skip: !catalogCode || !vehicleId || !unitId, errorPolicy: 'all', } ); + // Если нет необходимых данных, показываем заглушку + if (!catalogCode || !vehicleId || !unitId) { + return ( +
+
Схема узла
+
Выберите узел для отображения схемы
+
+ ); + } + const unitInfo = unitInfoData?.laximoUnitInfo; const coordinates = imageMapData?.laximoUnitImageMap?.coordinates || []; const imageUrl = unitInfo?.imageurl ? getImageUrl(unitInfo.imageurl, selectedImageSize) : ''; diff --git a/src/components/vin/KnotParts.tsx b/src/components/vin/KnotParts.tsx index 52b1f29..6e11cb0 100644 --- a/src/components/vin/KnotParts.tsx +++ b/src/components/vin/KnotParts.tsx @@ -3,7 +3,7 @@ import { useRouter } from "next/router"; import BrandSelectionModal from '../BrandSelectionModal'; interface KnotPartsProps { - parts: Array<{ + parts?: Array<{ detailid?: string; codeonimage?: string | number; oem?: string; @@ -17,7 +17,7 @@ interface KnotPartsProps { selectedCodeOnImage?: string | number; } -const KnotParts: React.FC = ({ parts, selectedCodeOnImage }) => { +const KnotParts: React.FC = ({ parts = [], selectedCodeOnImage }) => { const [isBrandModalOpen, setIsBrandModalOpen] = useState(false); const [selectedDetail, setSelectedDetail] = useState<{ oem: string; name: string } | null>(null); @@ -28,6 +28,18 @@ const KnotParts: React.FC = ({ parts, selectedCodeOnImage }) => } }; + // Если нет деталей, показываем заглушку + if (!parts || parts.length === 0) { + return ( +
+
+
Список деталей
+
Выберите узел для отображения деталей
+
+
+ ); + } + return ( <>
diff --git a/src/components/vin/VinCategory.tsx b/src/components/vin/VinCategory.tsx index e2f4e37..6635411 100644 --- a/src/components/vin/VinCategory.tsx +++ b/src/components/vin/VinCategory.tsx @@ -3,15 +3,16 @@ import { useQuery, useLazyQuery } from '@apollo/client'; import { GET_LAXIMO_CATEGORIES, GET_LAXIMO_QUICK_GROUPS, GET_LAXIMO_UNITS } from '@/lib/graphql/laximo'; interface VinCategoryProps { - catalogCode: string; - vehicleId: string; - ssd: string; + catalogCode?: string; + vehicleId?: string; + ssd?: string; onNodeSelect?: (node: any) => void; - activeTab: 'uzly' | 'manufacturer'; + activeTab?: 'uzly' | 'manufacturer'; onQuickGroupSelect?: (group: any) => void; + onCategoryClick?: (e?: React.MouseEvent) => void; } -const VinCategory: React.FC = ({ catalogCode, vehicleId, ssd, onNodeSelect, activeTab, onQuickGroupSelect }) => { +const VinCategory: React.FC = ({ catalogCode, vehicleId, ssd, onNodeSelect, activeTab = 'uzly', onQuickGroupSelect, onCategoryClick }) => { const [selectedCategory, setSelectedCategory] = useState(null); const [unitsByCategory, setUnitsByCategory] = useState<{ [key: string]: any[] }>({}); const lastCategoryIdRef = useRef(null); @@ -23,8 +24,8 @@ const VinCategory: React.FC = ({ catalogCode, vehicleId, ssd, // Запрос для "Узлы" const { data: categoriesData, loading: categoriesLoading, error: categoriesError } = useQuery(GET_LAXIMO_CATEGORIES, { - variables: { catalogCode, vehicleId, ssd }, - skip: !catalogCode || vehicleId === undefined || vehicleId === null || activeTab !== 'uzly', + variables: { catalogCode: catalogCode || '', vehicleId: vehicleId || '', ssd: ssd || '' }, + skip: !catalogCode || !vehicleId || activeTab !== 'uzly', errorPolicy: 'all' }); @@ -47,8 +48,8 @@ const VinCategory: React.FC = ({ catalogCode, vehicleId, ssd, // Запрос для "От производителя" const { data: quickGroupsData, loading: quickGroupsLoading, error: quickGroupsError } = useQuery(GET_LAXIMO_QUICK_GROUPS, { - variables: { catalogCode, vehicleId, ssd }, - skip: !catalogCode || vehicleId === undefined || vehicleId === null || activeTab !== 'manufacturer', + variables: { catalogCode: catalogCode || '', vehicleId: vehicleId || '', ssd: ssd || '' }, + skip: !catalogCode || !vehicleId || activeTab !== 'manufacturer', errorPolicy: 'all' }); @@ -61,6 +62,12 @@ const VinCategory: React.FC = ({ catalogCode, vehicleId, ssd, }; const handleCategoryClick = (category: any) => { + // Если передан onCategoryClick, используем его + if (onCategoryClick) { + onCategoryClick(); + return; + } + if (activeTab === 'manufacturer') { if (category.children && category.children.length > 0) { setSelectedCategory(category); @@ -76,14 +83,14 @@ const VinCategory: React.FC = ({ catalogCode, vehicleId, ssd, } else { // Если нет children, грузим units (подкатегории) const categoryId = category.categoryid || category.quickgroupid || category.id; - if (!unitsByCategory[categoryId]) { + if (!unitsByCategory[categoryId] && catalogCode && vehicleId) { lastCategoryIdRef.current = categoryId; console.log('Loading units for category:', { categoryId, category }); getUnits({ variables: { catalogCode, vehicleId, - ssd, + ssd: ssd || '', categoryId } }); @@ -105,6 +112,18 @@ const VinCategory: React.FC = ({ catalogCode, vehicleId, ssd, } }; + // Если нет данных о транспортном средстве, показываем заглушку + if (!catalogCode || !vehicleId) { + return ( +
+
+
Каталог запчастей
+
Выберите автомобиль для просмотра каталога
+
+
+ ); + } + if (loading) return
Загрузка категорий...
; if (error) return
Ошибка: {error.message}
; diff --git a/src/components/vin/VinLeftbar.tsx b/src/components/vin/VinLeftbar.tsx index 9429b1e..5b20582 100644 --- a/src/components/vin/VinLeftbar.tsx +++ b/src/components/vin/VinLeftbar.tsx @@ -4,7 +4,7 @@ import { GET_LAXIMO_FULLTEXT_SEARCH, GET_LAXIMO_CATEGORIES, GET_LAXIMO_UNITS, GE import VinPartCard from './VinPartCard'; interface VinLeftbarProps { - vehicleInfo: { + vehicleInfo?: { catalog: string; vehicleid: string; ssd: string; @@ -30,9 +30,9 @@ interface QuickGroup { } const VinLeftbar: React.FC = ({ vehicleInfo, onSearchResults, onNodeSelect, onActiveTabChange, onQuickGroupSelect }) => { - const catalogCode = vehicleInfo.catalog; - const vehicleId = vehicleInfo.vehicleid; - const ssd = vehicleInfo.ssd; + const catalogCode = vehicleInfo?.catalog || ''; + const vehicleId = vehicleInfo?.vehicleid || ''; + const ssd = vehicleInfo?.ssd || ''; const [openIndex, setOpenIndex] = useState(null); const [searchQuery, setSearchQuery] = useState(''); const [activeTab, setActiveTab] = useState<'uzly' | 'manufacturer'>('uzly'); @@ -260,6 +260,18 @@ const VinLeftbar: React.FC = ({ vehicleInfo, onSearchResults, o } }, [activeTab, onActiveTabChange]); + // Если нет данных о транспортном средстве, показываем заглушку + if (!vehicleInfo) { + return ( +
+
+
Поиск запчастей
+
Выберите автомобиль для поиска запчастей
+
+
+ ); + } + return (
{/* === Форма полнотекстового поиска === */}