import { Element } from '../../classes/classes'
import { App } from '../../gogocarto'
declare let $, L: any
export class Marker {
element: Element
private isAnimating = false
// we use leaflet markers to display marker on map. Marker is just a extension of leafletMarker
private leafletMarker: L.Marker
constructor(element: Element) {
this.element = element
this.leafletMarker = L.marker(this.element.position, { riseOnHover: true })
this.leafletMarker.on('click', (ev) => {
App.mapManager.handleMarkerClick(this)
})
this.leafletMarker.on('mouseover', (ev) => {
if (!this.isAnimating) this.element.showBigSize()
})
this.leafletMarker.on('mouseout', (ev) => {
if (!this.isAnimating) this.element.showNormalSize()
})
this.leafletMarker.setIcon(
L.divIcon({
className: 'leaflet-marker-container',
html: '',
}),
)
}
update() {
const htmlMarker = App.templateModule.render('marker', {
element: this.element,
config: App.config,
popup: App.templateModule.elementTemplate.renderMarkerPopup(this.element.toDisplay()),
})
// save the class because it has been modified by marker cluster adding or
// removing the "rotate" class
const oldClassName = (this.leafletMarker)._icon
? (this.leafletMarker)._icon.className
: 'leaflet-marker-container'
oldClassName.replace('leaflet-marker-icon', '')
this.leafletMarker.setIcon(L.divIcon({ className: oldClassName, html: htmlMarker }))
}
animateDrop() {
this.isAnimating = true
this.domMarker().animate({ top: '-=25px' }, 300, 'easeInOutCubic')
this.domMarker().animate({ top: '+=25px' }, 250, 'easeInOutCubic', () => {
this.isAnimating = false
this.domMarker().css('top', 'auto')
})
}
showBigSize() {
this.addClassToLeafletMarker_('big-size')
const domMarker = this.domMarker()
domMarker.parent().find('.marker-popup').show()
domMarker.parent().find('.other-icons-wrapper').css('display', 'flex')
domMarker.find('.gogo-icon-plus-circle').hide()
}
showNormalSize() {
const domMarker = this.domMarker()
this.removeClassToLeafletMarker_('big-size')
if (!App.config.marker.popupAlwaysVisible) domMarker.parent().find('.marker-popup').hide()
domMarker.parent().find('.other-icons-wrapper').hide()
domMarker.find('.gogo-icon-plus-circle').show()
}
private addClassToLeafletMarker_(classToAdd) {
this.domMarker().find('.marker-wrapper').addClass(classToAdd)
this.domMarker().siblings('.marker-popup').addClass(classToAdd)
}
private removeClassToLeafletMarker_(classToRemove) {
this.domMarker().find('.marker-wrapper').removeClass(classToRemove)
this.domMarker().siblings('.marker-popup').removeClass(classToRemove)
}
domMarker() {
return $('#marker-' + this.element.id)
}
getLeafletMarker(): L.Marker {
return this.leafletMarker
}
getPosition(): L.LatLng {
return this.leafletMarker.getLatLng()
}
}