import logging
from typing import Dict, Optional, Tuple, Union
from nicegui import ui
from nicegui.events import ValueChangeEventArguments
class map(ui.card):
def __init__(self):
super().__init__()
self.classes('osm-map').style('width:100%;height:300px;transition:opacity 1s;opacity:0.1')
self.add_leaflet_js()
async def set_location(self, location: Union[Optional[Tuple[float, float]], Dict[str, Tuple[float, float]], ValueChangeEventArguments]):
try:
if isinstance(location, ValueChangeEventArguments):
location = location.value
if isinstance(location, dict):
location = location.get('location', location.get('value', None))
if not isinstance(location, tuple) or len(location) != 2 or not all(
isinstance(x, float) or isinstance(x, int) for x in location):
self.style('opacity: 0.1;')
logging.warning(f'Invalid location: {location}')
return
self.style('opacity: 1;')
await ui.run_javascript(f'''
target = L.latLng("{location[0]}", "{location[1]}")
map.setView(target, 9);
if (marker != undefined) map.removeLayer(marker);
marker = L.marker(target);
marker.addTo(map);
0 // return something so we do net get a js error
''')
except:
logging.exception(f'could not update {location}')
@staticmethod
def add_leaflet_js():
ui.add_head_html(r'''
''')