import { Search, Plus, X, Upload, ChevronDown, Check, MapPin } from 'lucide-react' import { getCategoryIcon } from '../shared/categoryIcons' import Tooltip from '../shared/Tooltip' import type { SidebarState } from './usePlacesSidebar' export function PlacesDropOverlay({ t }: SidebarState) { return (
{t('places.sidebarDrop')}
) } export function PlacesHeader(S: SidebarState) { const { canEditPlaces, onAddPlace, t, setFileImportOpen, setListImportOpen, hasMultipleListImportProviders, places, categories, categoryFilters, search, setSearch, plannedIds, hasTracks, filter, setFilter, onPlacesFilterChange, setSelectedIds, selectMode, setSelectMode, catDropOpen, setCatDropOpen, toggleCategoryFilter, setCategoryFiltersLocal, onCategoryFilterChange, } = S return (
{canEditPlaces && } {canEditPlaces && <>
} {/* Filter-Tabs */} {(() => { const baseFiltered = places.filter(p => { if (categoryFilters.size > 0) { if (p.category_id == null) { if (!categoryFilters.has('uncategorized')) return false } else if (!categoryFilters.has(String(p.category_id))) return false } if (search && !p.name.toLowerCase().includes(search.toLowerCase()) && !(p.address || '').toLowerCase().includes(search.toLowerCase())) return false return true }) const counts = { all: baseFiltered.length, unplanned: baseFiltered.filter(p => !plannedIds.has(p.id)).length, tracks: baseFiltered.filter(p => p.route_geometry).length, } const tabs = ([ { id: 'all', label: t('places.all') }, { id: 'unplanned', label: t('places.unplanned') }, hasTracks ? { id: 'tracks', label: t('places.filterTracks') } : null, ] as const).filter(Boolean) as Array<{ id: 'all' | 'unplanned' | 'tracks'; label: string }> return (
{tabs.map(f => { const active = filter === f.id return ( ) })}
) })()} {/* Suchfeld */}
{ setSearch(e.target.value); if (selectMode) setSelectedIds(new Set()) }} placeholder={t('places.search')} className="bg-surface-tertiary text-content" style={{ width: '100%', padding: '7px 30px 7px 30px', borderRadius: 10, border: 'none', fontSize: 12, outline: 'none', fontFamily: 'inherit', boxSizing: 'border-box', }} /> {search && ( )}
{/* Category multi-select dropdown */} {categories.length > 0 && (() => { const label = categoryFilters.size === 0 ? t('places.allCategories') : categoryFilters.size === 1 ? (categoryFilters.has('uncategorized') ? t('places.noCategory') : categories.find(c => categoryFilters.has(String(c.id)))?.name || t('places.allCategories')) : `${categoryFilters.size} ${t('places.categoriesSelected')}` return (
{canEditPlaces && ( )} {catDropOpen && (
{categories.map(c => { const active = categoryFilters.has(String(c.id)) const CatIcon = getCategoryIcon(c.icon) return ( ) })} {places.some(p => p.category_id == null) && (() => { const active = categoryFilters.has('uncategorized') return ( ) })()} {categoryFilters.size > 0 && ( )}
)}
) })()}
) }