fix: Restore all files lost during destructive rebase
A previous `git pull --rebase origin main` dropped 177 local commits,
losing 3400+ files across admin-v2, backend, studio-v2, website,
klausur-service, and many other services. The partial restore attempt
(660295e2) only recovered some files.
This commit restores all missing files from pre-rebase ref 98933f5e
while preserving post-rebase additions (night-scheduler, night-mode UI,
NightModeWidget dashboard integration).
Restored features include:
- AI Module Sidebar (FAB), OCR Labeling, OCR Compare
- GPU Dashboard, RAG Pipeline, Magic Help
- Klausur-Korrektur (8 files), Abitur-Archiv (5+ files)
- Companion, Zeugnisse-Crawler, Screen Flow
- Full backend, studio-v2, website, klausur-service
- All compliance SDKs, agent-core, voice-service
- CI/CD configs, documentation, scripts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
77
studio-v2/components/CityMapLeaflet.tsx
Normal file
77
studio-v2/components/CityMapLeaflet.tsx
Normal file
@@ -0,0 +1,77 @@
|
||||
'use client'
|
||||
|
||||
import { useEffect } from 'react'
|
||||
import { MapContainer, TileLayer, Marker, useMapEvents, useMap } from 'react-leaflet'
|
||||
import L from 'leaflet'
|
||||
import 'leaflet/dist/leaflet.css'
|
||||
|
||||
// Fix für Leaflet Marker Icons in Next.js
|
||||
const DefaultIcon = L.icon({
|
||||
iconUrl: 'https://unpkg.com/leaflet@1.9.4/dist/images/marker-icon.png',
|
||||
iconRetinaUrl: 'https://unpkg.com/leaflet@1.9.4/dist/images/marker-icon-2x.png',
|
||||
shadowUrl: 'https://unpkg.com/leaflet@1.9.4/dist/images/marker-shadow.png',
|
||||
iconSize: [25, 41],
|
||||
iconAnchor: [12, 41],
|
||||
popupAnchor: [1, -34],
|
||||
shadowSize: [41, 41]
|
||||
})
|
||||
|
||||
L.Marker.prototype.options.icon = DefaultIcon
|
||||
|
||||
interface CityMapLeafletProps {
|
||||
center: { lat: number; lng: number }
|
||||
zoom: number
|
||||
markerPosition: [number, number] | null
|
||||
onMapClick: (lat: number, lng: number) => void
|
||||
isDark: boolean
|
||||
}
|
||||
|
||||
// Komponente für Klick-Events
|
||||
function MapClickHandler({ onMapClick }: { onMapClick: (lat: number, lng: number) => void }) {
|
||||
useMapEvents({
|
||||
click: (e) => {
|
||||
onMapClick(e.latlng.lat, e.latlng.lng)
|
||||
},
|
||||
})
|
||||
return null
|
||||
}
|
||||
|
||||
// Komponente um Karte neu zu zentrieren
|
||||
function MapCenterUpdater({ center, zoom }: { center: { lat: number; lng: number }; zoom: number }) {
|
||||
const map = useMap()
|
||||
|
||||
useEffect(() => {
|
||||
map.setView([center.lat, center.lng], zoom)
|
||||
}, [map, center.lat, center.lng, zoom])
|
||||
|
||||
return null
|
||||
}
|
||||
|
||||
export default function CityMapLeaflet({
|
||||
center,
|
||||
zoom,
|
||||
markerPosition,
|
||||
onMapClick,
|
||||
isDark
|
||||
}: CityMapLeafletProps) {
|
||||
return (
|
||||
<MapContainer
|
||||
center={[center.lat, center.lng]}
|
||||
zoom={zoom}
|
||||
style={{ height: '100%', width: '100%' }}
|
||||
>
|
||||
<TileLayer
|
||||
attribution='© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>'
|
||||
url={isDark
|
||||
? 'https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png'
|
||||
: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png'
|
||||
}
|
||||
/>
|
||||
{markerPosition && (
|
||||
<Marker position={markerPosition} icon={DefaultIcon} />
|
||||
)}
|
||||
<MapClickHandler onMapClick={onMapClick} />
|
||||
<MapCenterUpdater center={center} zoom={zoom} />
|
||||
</MapContainer>
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user