mirror of
https://github.com/Freika/dawarich.git
synced 2026-01-09 08:47:11 -05:00
142 lines
3.7 KiB
JavaScript
142 lines
3.7 KiB
JavaScript
// This controller is being used on:
|
|
// - trips/index
|
|
|
|
import BaseController from "./base_controller"
|
|
import L from "leaflet"
|
|
import { createAllMapLayers } from "../maps/layers"
|
|
|
|
export default class extends BaseController {
|
|
static values = {
|
|
tripId: Number,
|
|
path: String,
|
|
apiKey: String,
|
|
userSettings: Object,
|
|
timezone: String,
|
|
distanceUnit: String
|
|
}
|
|
|
|
connect() {
|
|
console.log("TripMap controller connected")
|
|
|
|
setTimeout(() => {
|
|
this.initializeMap()
|
|
}, 100)
|
|
}
|
|
|
|
initializeMap() {
|
|
// Initialize map with basic configuration
|
|
this.map = L.map(this.element, {
|
|
zoomControl: false,
|
|
dragging: false,
|
|
scrollWheelZoom: false,
|
|
attributionControl: true
|
|
})
|
|
|
|
// Add base map layer
|
|
const selectedLayerName = this.hasUserSettingsValue ?
|
|
this.userSettingsValue.preferred_map_layer || "OpenStreetMap" :
|
|
"OpenStreetMap";
|
|
const maps = this.baseMaps();
|
|
const defaultLayer = maps[selectedLayerName] || Object.values(maps)[0];
|
|
defaultLayer.addTo(this.map);
|
|
|
|
// If we have coordinates, show the route
|
|
if (this.hasPathValue && this.pathValue) {
|
|
this.showRoute()
|
|
} else {
|
|
console.log("No path value available")
|
|
}
|
|
}
|
|
|
|
baseMaps() {
|
|
const selectedLayerName = this.hasUserSettingsValue ?
|
|
this.userSettingsValue.preferred_map_layer || "OpenStreetMap" :
|
|
"OpenStreetMap";
|
|
|
|
let maps = createAllMapLayers(this.map, selectedLayerName, "false", 'dark');
|
|
|
|
// Add custom map if it exists in settings
|
|
if (this.hasUserSettingsValue && this.userSettingsValue.maps && this.userSettingsValue.maps.url) {
|
|
const customLayer = L.tileLayer(this.userSettingsValue.maps.url, {
|
|
maxZoom: 19,
|
|
attribution: "© OpenStreetMap contributors"
|
|
});
|
|
|
|
// If this is the preferred layer, add it to the map immediately
|
|
if (selectedLayerName === this.userSettingsValue.maps.name) {
|
|
customLayer.addTo(this.map);
|
|
// Remove any other base layers that might be active
|
|
Object.values(maps).forEach(layer => {
|
|
if (this.map.hasLayer(layer)) {
|
|
this.map.removeLayer(layer);
|
|
}
|
|
});
|
|
}
|
|
|
|
maps[this.userSettingsValue.maps.name] = customLayer;
|
|
}
|
|
|
|
return maps;
|
|
}
|
|
|
|
showRoute() {
|
|
const points = this.getCoordinates(this.pathValue)
|
|
|
|
// Only create polyline if we have points
|
|
if (points.length > 0) {
|
|
const polyline = L.polyline(points, {
|
|
color: 'blue',
|
|
opacity: 0.8,
|
|
weight: 3,
|
|
zIndexOffset: 400
|
|
})
|
|
|
|
// Add the polyline to the map
|
|
polyline.addTo(this.map)
|
|
|
|
// Fit the map bounds
|
|
this.map.fitBounds(polyline.getBounds(), {
|
|
padding: [20, 20]
|
|
})
|
|
} else {
|
|
console.error("No valid points to create polyline")
|
|
}
|
|
}
|
|
|
|
getCoordinates(pathData) {
|
|
try {
|
|
// Parse the path data if it's a string
|
|
let coordinates = pathData;
|
|
if (typeof pathData === 'string') {
|
|
try {
|
|
coordinates = JSON.parse(pathData);
|
|
} catch (e) {
|
|
console.error("Error parsing path data as JSON:", e);
|
|
return [];
|
|
}
|
|
}
|
|
|
|
// Handle array format - convert from [lng, lat] to [lat, lng] for Leaflet
|
|
return coordinates.map(coord => {
|
|
const [lng, lat] = coord;
|
|
|
|
// Validate the coordinates
|
|
if (isNaN(lat) || isNaN(lng) || !lat || !lng) {
|
|
console.error("Invalid coordinates:", coord);
|
|
return null;
|
|
}
|
|
|
|
return [lat, lng]; // Leaflet uses [lat, lng] order
|
|
}).filter(point => point !== null);
|
|
} catch (error) {
|
|
console.error("Error processing coordinates:", error);
|
|
return [];
|
|
}
|
|
}
|
|
|
|
disconnect() {
|
|
if (this.map) {
|
|
this.map.remove()
|
|
}
|
|
}
|
|
}
|