mirror of
https://github.com/Freika/dawarich.git
synced 2026-01-09 08:47:11 -05:00
* fix: move foreman to global gems to fix startup crash (#1971) * Update exporting code to stream points data to file in batches to red… (#1980) * Update exporting code to stream points data to file in batches to reduce memory usage * Update changelog * Update changelog * Feature/maplibre frontend (#1953) * Add a plan to use MapLibre GL JS for the frontend map rendering, replacing Leaflet * Implement phase 1 * Phases 1-3 + part of 4 * Fix e2e tests * Phase 6 * Implement fog of war * Phase 7 * Next step: fix specs, phase 7 done * Use our own map tiles * Extract v2 map logic to separate manager classes * Update settings panel on v2 map * Update v2 e2e tests structure * Reimplement location search in maps v2 * Update speed routes * Implement visits and places creation in v2 * Fix last failing test * Implement visits merging * Fix a routes e2e test and simplify the routes layer styling. * Extract js to modules from maps_v2_controller.js * Implement area creation * Fix spec problem * Fix some e2e tests * Implement live mode in v2 map * Update icons and panel * Extract some styles * Remove unused file * Start adding dark theme to popups on MapLibre maps * Make popups respect dark theme * Move v2 maps to maplibre namespace * Update v2 references to maplibre * Put place, area and visit info into side panel * Update API to use safe settings config method * Fix specs * Fix method name to config in SafeSettings and update usages accordingly * Add missing public files * Add handling for real time points * Fix remembering enabled/disabled layers of the v2 map * Fix lots of e2e tests * Add settings to select map version * Use maps/v2 as main path for MapLibre maps * Update routing * Update live mode * Update maplibre controller * Update changelog * Remove some console.log statements --------- Co-authored-by: Robin Tuszik <mail@robin.gg>
153 lines
4.5 KiB
JavaScript
153 lines
4.5 KiB
JavaScript
import { SettingsManager } from 'maps_maplibre/utils/settings_manager'
|
|
import { Toast } from 'maps_maplibre/components/toast'
|
|
|
|
/**
|
|
* Manages visits-related operations for Maps V2
|
|
* Including visit creation, filtering, and layer management
|
|
*/
|
|
export class VisitsManager {
|
|
constructor(controller) {
|
|
this.controller = controller
|
|
this.layerManager = controller.layerManager
|
|
this.filterManager = controller.filterManager
|
|
this.api = controller.api
|
|
this.dataLoader = controller.dataLoader
|
|
}
|
|
|
|
/**
|
|
* Toggle visits layer
|
|
*/
|
|
toggleVisits(event) {
|
|
const enabled = event.target.checked
|
|
SettingsManager.updateSetting('visitsEnabled', enabled)
|
|
|
|
const visitsLayer = this.layerManager.getLayer('visits')
|
|
if (visitsLayer) {
|
|
if (enabled) {
|
|
visitsLayer.show()
|
|
if (this.controller.hasVisitsSearchTarget) {
|
|
this.controller.visitsSearchTarget.style.display = 'block'
|
|
}
|
|
} else {
|
|
visitsLayer.hide()
|
|
if (this.controller.hasVisitsSearchTarget) {
|
|
this.controller.visitsSearchTarget.style.display = 'none'
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Search visits
|
|
*/
|
|
searchVisits(event) {
|
|
const searchTerm = event.target.value.toLowerCase()
|
|
const visitsLayer = this.layerManager.getLayer('visits')
|
|
this.filterManager.filterAndUpdateVisits(
|
|
searchTerm,
|
|
this.filterManager.getCurrentVisitFilter(),
|
|
visitsLayer
|
|
)
|
|
}
|
|
|
|
/**
|
|
* Filter visits by status
|
|
*/
|
|
filterVisits(event) {
|
|
const filter = event.target.value
|
|
this.filterManager.setCurrentVisitFilter(filter)
|
|
const searchTerm = document.getElementById('visits-search')?.value.toLowerCase() || ''
|
|
const visitsLayer = this.layerManager.getLayer('visits')
|
|
this.filterManager.filterAndUpdateVisits(searchTerm, filter, visitsLayer)
|
|
}
|
|
|
|
/**
|
|
* Start create visit mode
|
|
*/
|
|
startCreateVisit() {
|
|
console.log('[Maps V2] Starting create visit mode')
|
|
|
|
if (this.controller.hasSettingsPanelTarget && this.controller.settingsPanelTarget.classList.contains('open')) {
|
|
this.controller.toggleSettings()
|
|
}
|
|
|
|
this.controller.map.getCanvas().style.cursor = 'crosshair'
|
|
Toast.info('Click on the map to place a visit')
|
|
|
|
this.handleCreateVisitClick = (e) => {
|
|
const { lng, lat } = e.lngLat
|
|
this.openVisitCreationModal(lat, lng)
|
|
this.controller.map.getCanvas().style.cursor = ''
|
|
}
|
|
|
|
this.controller.map.once('click', this.handleCreateVisitClick)
|
|
}
|
|
|
|
/**
|
|
* Open visit creation modal
|
|
*/
|
|
openVisitCreationModal(lat, lng) {
|
|
console.log('[Maps V2] Opening visit creation modal', { lat, lng })
|
|
|
|
const modalElement = document.querySelector('[data-controller="visit-creation-v2"]')
|
|
|
|
if (!modalElement) {
|
|
console.error('[Maps V2] Visit creation modal not found')
|
|
Toast.error('Visit creation modal not available')
|
|
return
|
|
}
|
|
|
|
const controller = this.controller.application.getControllerForElementAndIdentifier(
|
|
modalElement,
|
|
'visit-creation-v2'
|
|
)
|
|
|
|
if (controller) {
|
|
controller.open(lat, lng, this.controller)
|
|
} else {
|
|
console.error('[Maps V2] Visit creation controller not found')
|
|
Toast.error('Visit creation controller not available')
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Handle visit creation event - reload visits and update layer
|
|
*/
|
|
async handleVisitCreated(event) {
|
|
console.log('[Maps V2] Visit created, reloading visits...', event.detail)
|
|
|
|
try {
|
|
const visits = await this.api.fetchVisits({
|
|
start_at: this.controller.startDateValue,
|
|
end_at: this.controller.endDateValue
|
|
})
|
|
|
|
console.log('[Maps V2] Fetched visits:', visits.length)
|
|
|
|
this.filterManager.setAllVisits(visits)
|
|
const visitsGeoJSON = this.dataLoader.visitsToGeoJSON(visits)
|
|
|
|
console.log('[Maps V2] Converted to GeoJSON:', visitsGeoJSON.features.length, 'features')
|
|
|
|
const visitsLayer = this.layerManager.getLayer('visits')
|
|
if (visitsLayer) {
|
|
visitsLayer.update(visitsGeoJSON)
|
|
console.log('[Maps V2] Visits layer updated successfully')
|
|
} else {
|
|
console.warn('[Maps V2] Visits layer not found, cannot update')
|
|
}
|
|
} catch (error) {
|
|
console.error('[Maps V2] Failed to reload visits:', error)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Handle visit update event - reload visits and update layer
|
|
*/
|
|
async handleVisitUpdated(event) {
|
|
console.log('[Maps V2] Visit updated, reloading visits...', event.detail)
|
|
|
|
// Reuse the same logic as creation
|
|
await this.handleVisitCreated(event)
|
|
}
|
|
}
|