mirror of
https://github.com/Freika/dawarich.git
synced 2026-01-10 17:21:38 -05:00
141 lines
3.9 KiB
JavaScript
141 lines
3.9 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() {
|
|
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) {
|
|
const modalElement = document.querySelector('[data-controller="visit-creation-v2"]')
|
|
|
|
if (!modalElement) {
|
|
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 {
|
|
Toast.error('Visit creation controller not available')
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Handle visit creation event - reload visits and update layer
|
|
*/
|
|
async handleVisitCreated(event) {
|
|
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)
|
|
} 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) {
|
|
await this.handleVisitCreated(event)
|
|
}
|
|
}
|