import React, { useState } from 'react'; import { MagnifyingGlassIcon, FunnelIcon, XMarkIcon, } from '@heroicons/react/24/outline'; import {CustomMultiSelect, CustomSelect} from '../CustomSelect'; interface SearchFilters { categories?: string[]; styles?: string[]; occasions?: string[]; seasons?: string[]; colors?: string[]; minScore?: number; confidenceLevel?: string; matchingTypes?: string[]; } interface OutfitSearchPanelProps { filters: SearchFilters; onFiltersChange: (filters: SearchFilters) => void; onSearch: () => void; } const OutfitSearchPanel: React.FC = ({ filters, onFiltersChange, onSearch }) => { const [isExpanded, setIsExpanded] = useState(false); const [searchText, setSearchText] = useState(''); // 预定义选项 const categoryOptions = [ { value: 'Top', label: '上装' }, { value: 'Bottom', label: '下装' }, { value: 'Dress', label: '连衣裙' }, { value: 'Outerwear', label: '外套' }, { value: 'Footwear', label: '鞋类' }, { value: 'Accessory', label: '配饰' } ]; const styleOptions = [ { value: 'Casual', label: '休闲' }, { value: 'Formal', label: '正式' }, { value: 'Business', label: '商务' }, { value: 'Sporty', label: '运动' }, { value: 'Vintage', label: '复古' }, { value: 'Bohemian', label: '波西米亚' }, { value: 'Minimalist', label: '极简' }, { value: 'Streetwear', label: '街头' }, { value: 'Elegant', label: '优雅' }, { value: 'Trendy', label: '时尚' } ]; const occasionOptions = [ { value: 'work', label: '工作' }, { value: 'casual', label: '日常' }, { value: 'party', label: '聚会' }, { value: 'date', label: '约会' }, { value: 'travel', label: '旅行' }, { value: 'sport', label: '运动' }, { value: 'formal', label: '正式场合' } ]; const seasonOptions = [ { value: 'spring', label: '春季' }, { value: 'summer', label: '夏季' }, { value: 'autumn', label: '秋季' }, { value: 'winter', label: '冬季' } ]; const colorOptions = [ { value: 'red', label: '红色' }, { value: 'blue', label: '蓝色' }, { value: 'green', label: '绿色' }, { value: 'yellow', label: '黄色' }, { value: 'purple', label: '紫色' }, { value: 'orange', label: '橙色' }, { value: 'pink', label: '粉色' }, { value: 'brown', label: '棕色' }, { value: 'black', label: '黑色' }, { value: 'white', label: '白色' }, { value: 'gray', label: '灰色' } ]; const confidenceLevelOptions = [ { value: 'Low', label: '低' }, { value: 'Medium', label: '中' }, { value: 'High', label: '高' }, { value: 'Excellent', label: '极佳' } ]; const matchingTypeOptions = [ { value: 'ColorHarmony', label: '颜色和谐' }, { value: 'StyleConsistent', label: '风格一致' }, { value: 'Complementary', label: '互补搭配' }, { value: 'Seasonal', label: '季节搭配' }, { value: 'Occasion', label: '场合搭配' }, { value: 'Trendy', label: '时尚搭配' } ]; const handleFilterChange = (key: keyof SearchFilters, value: any) => { onFiltersChange({ ...filters, [key]: value }); }; const clearFilters = () => { onFiltersChange({}); setSearchText(''); }; const hasActiveFilters = () => { return Object.keys(filters).some(key => { const value = filters[key as keyof SearchFilters]; return Array.isArray(value) ? value.length > 0 : value !== undefined && value !== null; }); }; const getActiveFilterCount = () => { let count = 0; Object.keys(filters).forEach(key => { const value = filters[key as keyof SearchFilters]; if (Array.isArray(value) && value.length > 0) { count += value.length; } else if (value !== undefined && value !== null) { count += 1; } }); return count; }; return (
{/* 搜索栏和展开按钮 */}
setSearchText(e.target.value)} placeholder="搜索搭配..." className="block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-md leading-5 bg-white placeholder-gray-500 focus:outline-none focus:placeholder-gray-400 focus:ring-1 focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" />
{/* 展开的筛选面板 */} {isExpanded && (
{/* 服装类别 */}
handleFilterChange('categories', value)} placeholder="选择类别" />
{/* 风格 */}
handleFilterChange('styles', value)} placeholder="选择风格" />
{/* 场合 */}
handleFilterChange('occasions', value)} placeholder="选择场合" />
{/* 季节 */}
handleFilterChange('seasons', value)} placeholder="选择季节" />
{/* 颜色 */}
handleFilterChange('colors', value)} placeholder="选择颜色" />
{/* 搭配类型 */}
handleFilterChange('matchingTypes', value)} placeholder="选择搭配类型" />
{/* 评分和置信度 */}
{/* 最低评分 */}
handleFilterChange('minScore', parseFloat(e.target.value))} className="w-full h-2 bg-gray-200 rounded-lg appearance-none cursor-pointer" />
0.0 {(filters.minScore || 0).toFixed(1)} 1.0
{/* 置信度等级 */}
handleFilterChange('confidenceLevel', value)} placeholder="选择置信度等级" />
{/* 操作按钮 */}
)}
); }; export default OutfitSearchPanel;