Geogussr / static /admin.js
Jofthomas's picture
Upload 24 files
1ac84c3 verified
let map;
let drawingManager;
let lastDrawnShape = null;
let displayedShapes = [];
const difficultyColors = {
easy: '#34A853', // Green
medium: '#F9AB00', // Yellow
hard: '#EA4335' // Red
};
function initAdminMap() {
map = new google.maps.Map(document.getElementById('map'), {
center: { lat: 20, lng: 0 },
zoom: 2,
});
drawingManager = new google.maps.drawing.DrawingManager({
drawingMode: google.maps.drawing.OverlayType.RECTANGLE,
drawingControl: true,
drawingControlOptions: {
position: google.maps.ControlPosition.TOP_CENTER,
drawingModes: [google.maps.drawing.OverlayType.RECTANGLE],
},
rectangleOptions: {
fillColor: '#F97316',
fillOpacity: 0.3,
strokeWeight: 1,
clickable: true,
editable: true,
zIndex: 1,
},
});
drawingManager.setMap(map);
google.maps.event.addListener(drawingManager, 'overlaycomplete', function(event) {
if (lastDrawnShape) {
lastDrawnShape.setMap(null);
}
lastDrawnShape = event.overlay;
drawingManager.setDrawingMode(null); // Exit drawing mode
document.getElementById('save-zone').disabled = false;
});
document.getElementById('save-zone').addEventListener('click', saveLastZone);
document.getElementById('new-zone-btn').addEventListener('click', () => {
drawingManager.setDrawingMode(google.maps.drawing.OverlayType.RECTANGLE);
document.getElementById('save-zone').disabled = true;
});
loadExistingZones();
}
function saveLastZone() {
if (!lastDrawnShape) {
alert('Please draw a zone first.');
return;
}
const difficulty = document.getElementById('difficulty-select').value;
const bounds = lastDrawnShape.getBounds().toJSON();
const zoneData = {
type: 'rectangle',
bounds: bounds,
};
fetch('/api/zones', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ difficulty: difficulty, zone: zoneData }),
})
.then(response => response.json())
.then(data => {
const statusMsg = document.getElementById('status-message');
statusMsg.textContent = data.message || `Error: ${data.error}`;
setTimeout(() => statusMsg.textContent = '', 3000);
// Clean up the drawn shape and reload all zones to get the new one with its listener
if (lastDrawnShape) {
lastDrawnShape.setMap(null);
lastDrawnShape = null;
}
document.getElementById('save-zone').disabled = true;
loadExistingZones();
});
}
function loadExistingZones() {
// Clear existing shapes from the map
displayedShapes.forEach(shape => shape.setMap(null));
displayedShapes = [];
fetch('/api/zones')
.then(response => response.json())
.then(zones => {
for (const difficulty in zones) {
zones[difficulty].forEach(zone => {
if (zone.type === 'rectangle') {
const rectangle = new google.maps.Rectangle({
bounds: zone.bounds,
map: map,
fillColor: difficultyColors[difficulty],
fillOpacity: 0.35,
strokeColor: difficultyColors[difficulty],
strokeWeight: 2,
editable: false,
clickable: true,
});
rectangle.zoneId = zone.id;
google.maps.event.addListener(rectangle, 'click', function() {
if (confirm('Are you sure you want to delete this zone?')) {
deleteZone(this.zoneId, this);
}
});
displayedShapes.push(rectangle);
}
});
}
});
}
function deleteZone(zoneId, shape) {
fetch('/api/zones', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ zone_id: zoneId })
})
.then(response => response.json())
.then(data => {
const statusMsg = document.getElementById('status-message');
statusMsg.textContent = data.message || `Error: ${data.error}`;
setTimeout(() => statusMsg.textContent = '', 3000);
if (data.message) {
shape.setMap(null);
}
});
}