Josh-Dev-Quest 942de8c297
feat: add marker list ordering in sidebar with clickable zoom
Co-authored-by: aider (ollama/qwen2.5-coder:32b) <aider@aider.chat>
2026-03-01 18:05:16 +01:00

192 lines
5.8 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Simple Map Project</title>
<!-- Leaflet CSS -->
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
height: 100vh;
display: flex;
}
#map {
flex: 1;
height: 100%;
}
.sidebar {
width: 300px;
background: #f8f9fa;
padding: 20px;
box-shadow: 2px 0 5px rgba(0,0,0,0.1);
overflow-y: auto;
}
.map-controls {
position: absolute;
top: 20px;
right: 20px;
display: flex;
gap: 10px;
z-index: 1000;
}
.btn {
padding: 8px 12px;
border: none;
border-radius: 4px;
background: #3887be;
color: white;
cursor: pointer;
font-family: Arial, sans-serif;
}
.btn:hover {
background: #2c6d95;
}
</style>
</head>
<body>
<div class="sidebar">
<div class="journey-panel">
<h3><i class="fas fa-route"></i> Journey Manager</h3>
<!-- Journey Form -->
<div class="journey-form">
<div class="form-group">
<label for="journey-name"><i class="fas fa-heading"></i> Journey Name:</label>
<input type="text" id="journey-name" required>
</div>
<div class="form-group">
<label for="journey-desc"><i class="fas fa-align-left"></i> Description:</label>
<textarea id="journey-desc"></textarea>
</div>
</div>
<!-- Markers List -->
<h4><i class="fas fa-map-marker-alt"></i> Journey Markers</h4>
<div id="markers-list" class="markers-container">
<!-- Markers will be added here -->
</div>
<!-- Buttons -->
<div class="button-group">
<button id="add-marker" class="btn btn-primary"><i class="fas fa-plus"></i> Add Marker</button>
<button id="save-journey" class="btn btn-success"><i class="fas fa-save"></i> Save Journey</button>
<button id="clear-markers" class="btn btn-danger"><i class="fas fa-trash"></i> Clear Markers</button>
</div>
</div>
</div>
<div id="map"></div>
<!-- Leaflet JS -->
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<script>
// Initialize the map
const map = L.map('map').setView([8.5, 47.3], 10);
// Add tile layer
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© OpenStreetMap contributors'
}).addTo(map);
updateMarkersList(); // Call the new function to update the list
// Add controls
const controls = document.createElement('div');
controls.className = 'map-controls';
// Zoom controls
const zoomInBtn = document.createElement('button');
zoomInBtn.className = 'btn';
zoomInBtn.innerHTML = '+';
zoomInBtn.addEventListener('click', () => map.zoomIn());
const zoomOutBtn = document.createElement('button');
zoomOutBtn.className = 'btn';
zoomOutBtn.innerHTML = '-';
zoomOutBtn.addEventListener('click', () => map.zoomOut());
controls.appendChild(zoomInBtn);
controls.appendChild(zoomOutBtn);
document.body.appendChild(controls);
// Add geolocation control
const locateBtn = document.createElement('button');
locateBtn.className = 'btn';
locateBtn.innerHTML = '📍';
locateBtn.addEventListener('click', () => {
map.locate({setView: true});
});
controls.appendChild(locateBtn);
// Marker functionality
let markers = [];
document.getElementById('add-marker').addEventListener('click', () => {
map.on('click', function(e) {
const marker = L.marker(e.latlng, {draggable: true}).addTo(map);
marker.bindPopup('<input type="text" placeholder="Enter title">');
markers.push(marker);
updateMarkerList();
});
});
document.getElementById('clear-markers').addEventListener('click', () => {
map.eachLayer(function(layer) {
if (layer instanceof L.Marker) {
map.removeLayer(layer);
}
});
markers = [];
updateMarkerList();
});
function updateMarkerList() {
const list = document.getElementById('marker-list');
list.innerHTML = '';
markers.forEach((marker, index) => {
const li = document.createElement('div');
li.textContent = `Marker ${index + 1}: ${marker.getLatLng().lat.toFixed(4)}, ${marker.getLngLat().lng.toFixed(4)}`;
list.appendChild(li);
});
}
// Initialize with some basic markers
map.on('ready', () => {
const initialMarkers = [
[8.5, 47.3],
[48.8566, 2.3522]
];
initialMarkers.forEach(lngLat => {
const marker = L.marker(lngLat).addTo(map);
markers.push(marker);
});
updateMarkerList();
});
</script>
</body>
</html>