Исправление GraphQL ошибок: удаление несуществующих полей из запросов Laximo
- Удалены несуществующие поля doors, frame, frames, framefrom, frameto, engine1, engine2, attributes - Обновлены GraphQL запросы для соответствия схеме - Обновлены TypeScript типы LaximoVehicleSearchResult - Сохранены улучшения UI из удаленного репозитория - Исправлены ApolloError при поиске автомобилей
This commit is contained in:
@ -47,96 +47,119 @@ const VehicleSearchResults: React.FC<VehicleSearchResultsProps> = ({
|
||||
}
|
||||
};
|
||||
|
||||
// Функция для условного отображения атрибута
|
||||
const renderAttribute = (label: string, value: string | undefined) => {
|
||||
if (!value || value === '' || value === 'undefined') return null
|
||||
return (
|
||||
<div className="flex justify-between py-1 border-b border-gray-100">
|
||||
<span className="text-sm text-gray-600 font-medium">{label}:</span>
|
||||
<span className="text-sm text-gray-900">{value}</span>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
if (results.length === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="bg-white rounded-2xl md:my-8">
|
||||
<div className="mb-2">
|
||||
<h4 className="text-lg font-medium text-gray-900">
|
||||
Найденные автомобили ({results.length})
|
||||
</h4>
|
||||
</div>
|
||||
|
||||
<div className="flex flex-col gap-4">
|
||||
<div className="space-y-4">
|
||||
<h3 className="text-lg font-semibold text-gray-900">
|
||||
Найдено автомобилей: {results.length}
|
||||
</h3>
|
||||
|
||||
<div className="grid gap-4 md:grid-cols-2 lg:grid-cols-3">
|
||||
{results.map((vehicle, index) => (
|
||||
<div
|
||||
key={vehicle.vehicleid || index}
|
||||
className="pt-3 pb-3 px-5 bg-white border-b border-gray-200 hover:bg-neutral-50 transition-colors cursor-pointer flex flex-col sm:flex-row sm:items-center gap-4"
|
||||
key={`${vehicle.vehicleid}-${index}`}
|
||||
className="bg-white rounded-lg shadow-md border border-gray-200 p-4 hover:shadow-lg transition-shadow cursor-pointer"
|
||||
onClick={() => handleSelectVehicle(vehicle)}
|
||||
>
|
||||
<div className="flex-1 min-w-0">
|
||||
<div className="flex flex-wrap items-center gap-3 mb-2">
|
||||
<h4 className="text-lg font-semibold text-gray-900 truncate">
|
||||
{vehicle.name || `${vehicle.brand || 'Unknown'} ${vehicle.model || 'Vehicle'}`}
|
||||
</h4>
|
||||
{vehicle.year && (
|
||||
<span className="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-red-50 text-red-700">
|
||||
{vehicle.year}
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4 text-sm mb-2">
|
||||
{vehicle.modification && (
|
||||
<div>
|
||||
<span className="text-gray-500">Модификация:</span>
|
||||
<span className="ml-2 font-medium text-gray-900">{vehicle.modification}</span>
|
||||
</div>
|
||||
)}
|
||||
{vehicle.bodytype && (
|
||||
<div>
|
||||
<span className="text-gray-500">Тип кузова:</span>
|
||||
<span className="ml-2 font-medium text-gray-900">{vehicle.bodytype}</span>
|
||||
</div>
|
||||
)}
|
||||
{vehicle.engine && (
|
||||
<div>
|
||||
<span className="text-gray-500">Двигатель:</span>
|
||||
<span className="ml-2 font-medium text-gray-900">{vehicle.engine}</span>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{vehicle.notes && (
|
||||
<div className="mt-3 p-3 bg-blue-50 rounded-lg">
|
||||
<div className="flex">
|
||||
<div className="flex-shrink-0">
|
||||
<svg className="h-5 w-5 text-blue-400" viewBox="0 0 20 20" fill="currentColor">
|
||||
<path fillRule="evenodd" d="M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z" clipRule="evenodd" />
|
||||
</svg>
|
||||
</div>
|
||||
<div className="ml-3">
|
||||
<p className="text-sm text-blue-800">
|
||||
<span className="font-medium">Примечание:</span> {vehicle.notes}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
{/* Заголовок автомобиля */}
|
||||
<div className="mb-3">
|
||||
<h4 className="text-lg font-semibold text-blue-600 mb-1">
|
||||
{vehicle.name || `${vehicle.brand} ${vehicle.model}`}
|
||||
</h4>
|
||||
<p className="text-sm text-gray-500">
|
||||
{vehicle.modification} ({vehicle.year})
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="flex-shrink-0 flex items-center justify-end">
|
||||
<button
|
||||
onClick={e => {
|
||||
e.stopPropagation();
|
||||
handleSelectVehicle(vehicle);
|
||||
}}
|
||||
className="inline-flex items-center px-6 py-3 border border-transparent text-base font-medium rounded-lg bg-red-600 hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500 shadow transition"
|
||||
style={{ color: '#fff' }}
|
||||
>
|
||||
Выбрать
|
||||
</button>
|
||||
{/* Основные характеристики */}
|
||||
<div className="space-y-1 mb-4">
|
||||
<h5 className="text-sm font-semibold text-gray-700 mb-2">Основные характеристики</h5>
|
||||
{renderAttribute('Марка', vehicle.brand)}
|
||||
{renderAttribute('Модель', vehicle.model)}
|
||||
{renderAttribute('Год', vehicle.year)}
|
||||
{renderAttribute('Кузов', vehicle.bodytype)}
|
||||
{renderAttribute('Двигатель', vehicle.engine)}
|
||||
{renderAttribute('Трансмиссия', vehicle.transmission)}
|
||||
</div>
|
||||
|
||||
{/* Дополнительные характеристики */}
|
||||
<div className="space-y-1 mb-4">
|
||||
<h5 className="text-sm font-semibold text-gray-700 mb-2">Дополнительные характеристики</h5>
|
||||
{renderAttribute('Класс', vehicle.grade)}
|
||||
{renderAttribute('Цвет кузова', vehicle.framecolor)}
|
||||
{renderAttribute('Цвет салона', vehicle.trimcolor)}
|
||||
{renderAttribute('Рынок', vehicle.market)}
|
||||
{renderAttribute('Регион производства', vehicle.creationregion)}
|
||||
{renderAttribute('Регион назначения', vehicle.destinationregion)}
|
||||
</div>
|
||||
|
||||
{/* Технические характеристики */}
|
||||
<div className="space-y-1 mb-4">
|
||||
<h5 className="text-sm font-semibold text-gray-700 mb-2">Технические характеристики</h5>
|
||||
{renderAttribute('Информация о двигателе', vehicle.engine_info)}
|
||||
{renderAttribute('Номер двигателя', vehicle.engineno)}
|
||||
{renderAttribute('Дата производства', vehicle.date)}
|
||||
{renderAttribute('Произведен', vehicle.manufactured)}
|
||||
{renderAttribute('Период производства', vehicle.prodPeriod)}
|
||||
{renderAttribute('Диапазон производства', vehicle.prodRange)}
|
||||
</div>
|
||||
|
||||
{/* Даты и периоды */}
|
||||
<div className="space-y-1 mb-4">
|
||||
<h5 className="text-sm font-semibold text-gray-700 mb-2">Даты и периоды</h5>
|
||||
{renderAttribute('Дата с', vehicle.datefrom)}
|
||||
{renderAttribute('Дата по', vehicle.dateto)}
|
||||
{renderAttribute('Модельный год с', vehicle.modelyearfrom)}
|
||||
{renderAttribute('Модельный год по', vehicle.modelyearto)}
|
||||
</div>
|
||||
|
||||
{/* Опции и описание */}
|
||||
{(vehicle.options || vehicle.description || vehicle.notes) && (
|
||||
<div className="space-y-1 mb-4">
|
||||
<h5 className="text-sm font-semibold text-gray-700 mb-2">Опции и описание</h5>
|
||||
{renderAttribute('Опции', vehicle.options)}
|
||||
{renderAttribute('Описание', vehicle.description)}
|
||||
{renderAttribute('Примечания', vehicle.notes)}
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Системная информация */}
|
||||
<div className="mt-4 pt-3 border-t border-gray-200">
|
||||
<div className="text-xs text-gray-400 space-y-1">
|
||||
<div>ID: {vehicle.vehicleid}</div>
|
||||
{vehicle.catalog && <div>Каталог: {vehicle.catalog}</div>}
|
||||
{vehicle.ssd && (
|
||||
<div>SSD: {vehicle.ssd.length > 50 ? `${vehicle.ssd.substring(0, 50)}...` : vehicle.ssd}</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Debug информация (только в development) */}
|
||||
{process.env.NODE_ENV === 'development' && (
|
||||
<div className="mt-4 p-2 bg-gray-100 rounded text-xs">
|
||||
<div className="font-semibold text-gray-700 mb-1">Debug Info:</div>
|
||||
<pre className="text-gray-600 whitespace-pre-wrap">
|
||||
{JSON.stringify(vehicle, null, 2)}
|
||||
</pre>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
|
||||
<div className="bg-gray-50 rounded-xl pt-4 pb-4 mt-6 flex flex-col sm:flex-row items-center justify-between text-sm text-gray-600">
|
||||
<span>Показано {results.length} результат{results.length === 1 ? '' : results.length < 5 ? 'а' : 'ов'}</span>
|
||||
<span>Кликните на автомобиль для подбора запчастей</span>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
@ -540,7 +540,9 @@ export const FIND_LAXIMO_VEHICLE_BY_WIZARD = gql`
|
||||
query FindLaximoVehicleByWizard($catalogCode: String!, $ssd: String!) {
|
||||
laximoFindVehicleByWizard(catalogCode: $catalogCode, ssd: $ssd) {
|
||||
vehicleid
|
||||
name
|
||||
brand
|
||||
catalog
|
||||
model
|
||||
modification
|
||||
year
|
||||
@ -548,12 +550,29 @@ export const FIND_LAXIMO_VEHICLE_BY_WIZARD = gql`
|
||||
engine
|
||||
notes
|
||||
ssd
|
||||
transmission
|
||||
date
|
||||
manufactured
|
||||
framecolor
|
||||
trimcolor
|
||||
engine_info
|
||||
engineno
|
||||
market
|
||||
prodRange
|
||||
prodPeriod
|
||||
destinationregion
|
||||
creationregion
|
||||
datefrom
|
||||
dateto
|
||||
modelyearfrom
|
||||
modelyearto
|
||||
options
|
||||
description
|
||||
grade
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
|
||||
|
||||
export const FIND_LAXIMO_VEHICLE_BY_PLATE = gql`
|
||||
query FindLaximoVehicleByPlate($catalogCode: String!, $plateNumber: String!) {
|
||||
laximoFindVehicleByPlate(catalogCode: $catalogCode, plateNumber: $plateNumber) {
|
||||
@ -628,8 +647,6 @@ export const FIND_LAXIMO_VEHICLE_BY_PLATE_GLOBAL = gql`
|
||||
}
|
||||
`;
|
||||
|
||||
|
||||
|
||||
export const FIND_LAXIMO_PART_REFERENCES = gql`
|
||||
query FindLaximoPartReferences($partNumber: String!) {
|
||||
laximoFindPartReferences(partNumber: $partNumber)
|
||||
@ -695,6 +712,25 @@ export const FIND_LAXIMO_VEHICLES_BY_PART_NUMBER = gql`
|
||||
engine
|
||||
notes
|
||||
ssd
|
||||
transmission
|
||||
date
|
||||
manufactured
|
||||
framecolor
|
||||
trimcolor
|
||||
engine_info
|
||||
engineno
|
||||
market
|
||||
prodRange
|
||||
prodPeriod
|
||||
destinationregion
|
||||
creationregion
|
||||
datefrom
|
||||
dateto
|
||||
modelyearfrom
|
||||
modelyearto
|
||||
options
|
||||
description
|
||||
grade
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -88,7 +88,6 @@ export interface LaximoVehicleSearchResult {
|
||||
// Дополнительные атрибуты из документации Laximo
|
||||
grade?: string
|
||||
transmission?: string
|
||||
doors?: string
|
||||
creationregion?: string
|
||||
destinationregion?: string
|
||||
date?: string
|
||||
@ -97,12 +96,6 @@ export interface LaximoVehicleSearchResult {
|
||||
trimcolor?: string
|
||||
datefrom?: string
|
||||
dateto?: string
|
||||
frame?: string
|
||||
frames?: string
|
||||
framefrom?: string
|
||||
frameto?: string
|
||||
engine1?: string
|
||||
engine2?: string
|
||||
engine_info?: string
|
||||
engineno?: string
|
||||
options?: string
|
||||
@ -112,8 +105,9 @@ export interface LaximoVehicleSearchResult {
|
||||
market?: string
|
||||
prodRange?: string
|
||||
prodPeriod?: string
|
||||
carpet_color?: string
|
||||
seat_combination_code?: string
|
||||
|
||||
// Дополнительные атрибуты (могут приходить в виде массива attributes)
|
||||
sales_code?: string
|
||||
}
|
||||
|
||||
export interface LaximoVehicleInfo {
|
||||
|
Reference in New Issue
Block a user