'use client' import { useState, useEffect } from 'react' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { Switch } from '@/components/ui/switch' import { Textarea } from '@/components/ui/textarea' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Badge } from '@/components/ui/badge' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' import { useQuery } from '@apollo/client' import { GET_PARTSINDEX_CATEGORIES } from '@/lib/graphql/queries' import { Loader2, Upload, X, Image as ImageIcon, Folder, FolderOpen } from 'lucide-react' interface PartsIndexCategory { id: string name: string image?: string groups?: PartsIndexGroup[] } interface PartsIndexGroup { id: string name: string image?: string subgroups?: PartsIndexGroup[] } interface NavigationCategory { id?: string partsIndexCatalogId: string partsIndexGroupId?: string icon?: string isHidden: boolean sortOrder: number } interface NavigationCategoryFormProps { category?: NavigationCategory | null onSubmit: (data: any) => void onCancel: () => void isLoading?: boolean } export default function NavigationCategoryForm({ category, onSubmit, onCancel, isLoading = false }: NavigationCategoryFormProps) { const [formData, setFormData] = useState({ partsIndexCatalogId: '', partsIndexGroupId: '', icon: '', isHidden: false, sortOrder: 0 }) const [selectedCatalog, setSelectedCatalog] = useState(null) const [selectedGroup, setSelectedGroup] = useState(null) // Загрузка категорий PartsIndex const { data: categoriesData, loading: categoriesLoading, error: categoriesError } = useQuery( GET_PARTSINDEX_CATEGORIES, { variables: { lang: 'ru' }, errorPolicy: 'all' } ) const categories = categoriesData?.partsIndexCategoriesWithGroups || [] // Заполнение формы при редактировании useEffect(() => { if (category) { setFormData({ partsIndexCatalogId: category.partsIndexCatalogId || '', partsIndexGroupId: category.partsIndexGroupId || '', icon: category.icon || '', isHidden: category.isHidden || false, sortOrder: category.sortOrder || 0 }) // Находим выбранный каталог и группу const catalog = categories.find(c => c.id === category.partsIndexCatalogId) if (catalog) { setSelectedCatalog(catalog) if (category.partsIndexGroupId && catalog.groups) { const group = findGroupById(catalog.groups, category.partsIndexGroupId) setSelectedGroup(group || null) } } } }, [category, categories]) // Рекурсивный поиск группы по ID const findGroupById = (groups: PartsIndexGroup[], groupId: string): PartsIndexGroup | null => { for (const group of groups) { if (group.id === groupId) { return group } if (group.subgroups && group.subgroups.length > 0) { const found = findGroupById(group.subgroups, groupId) if (found) return found } } return null } // Получение всех групп из каталога (включая подгруппы) const getAllGroups = (groups: PartsIndexGroup[], level = 0): Array => { const result: Array = [] groups.forEach(group => { result.push({ ...group, level }) if (group.subgroups && group.subgroups.length > 0) { result.push(...getAllGroups(group.subgroups, level + 1)) } }) return result } const handleInputChange = (field: string, value: any) => { setFormData(prev => ({ ...prev, [field]: value })) } const handleCatalogSelect = (catalogId: string) => { const catalog = categories.find(c => c.id === catalogId) setSelectedCatalog(catalog || null) setSelectedGroup(null) handleInputChange('partsIndexCatalogId', catalogId) handleInputChange('partsIndexGroupId', '') } const handleGroupSelect = (groupId: string) => { if (groupId === '__CATALOG_ROOT__') { setSelectedGroup(null) handleInputChange('partsIndexGroupId', '') } else if (selectedCatalog?.groups) { const group = findGroupById(selectedCatalog.groups, groupId) setSelectedGroup(group || null) handleInputChange('partsIndexGroupId', groupId) } } const handleImageUpload = (e: React.ChangeEvent) => { const file = e.target.files?.[0] if (file) { const reader = new FileReader() reader.onload = (e) => { const result = e.target?.result as string handleInputChange('icon', result) } reader.readAsDataURL(file) } } const handleSubmit = (e: React.FormEvent) => { e.preventDefault() if (!formData.partsIndexCatalogId) { alert('Выберите каталог') return } onSubmit(formData) } const getDisplayName = () => { if (selectedGroup) { return `${selectedCatalog?.name} → ${selectedGroup.name}` } return selectedCatalog?.name || 'Выберите категорию' } if (categoriesLoading) { return ( Загрузка категорий PartsIndex... ) } if (categoriesError) { return (
Ошибка загрузки категорий PartsIndex: {categoriesError.message}
) } return ( {category ? 'Редактировать иконку категории' : 'Добавить иконку для категории'}

Выберите категорию из PartsIndex и загрузите иконку для отображения в навигации сайта

{/* Выбор каталога */}
{/* Выбор группы (если есть группы в каталоге) */} {selectedCatalog?.groups && selectedCatalog.groups.length > 0 && (

Оставьте пустым для добавления иконки всему каталогу

)} {/* Предварительный просмотр выбранной категории */} {formData.partsIndexCatalogId && (
Выбранная категория:
{getDisplayName()}
)} {/* Загрузка иконки */}

Небольшая иконка для отображения в навигационном меню (рекомендуется 32x32 пикселя)

{formData.icon && (
Превью иконки
)}
{/* Настройки отображения */}
handleInputChange('isHidden', checked)} />
handleInputChange('sortOrder', parseInt(e.target.value) || 0)} className="mt-1" placeholder="0" />

Меньшее число = выше в списке

{/* Кнопки */}
) }