Make the map editor accept a click, and unclutter its panel

This commit is contained in:
2026-08-17 15:21:34 -04:00
parent 4c3d5746e8
commit 3af77bdb5b
2 changed files with 38 additions and 11 deletions

View File

@@ -45,7 +45,7 @@
</div>
<!-- Legend for asset type mode - shows subtypes when a type is selected -->
<div class="map-legend" v-if="!pickerMode && assetTypeMode">
<div class="map-legend" v-if="!pickerMode && assetTypeMode && hasLegendEntries">
<!-- Show subtype legend when a specific type is selected -->
<template v-if="selectedAssetType && Object.keys(visibleSubtypes).length">
<span
@@ -120,6 +120,14 @@ const props = defineProps({
const emit = defineEmits(['markerClick', 'positionPicked'])
// An empty legend still drew its bar and border, which looked like a stray input
// box under the toolbar. It renders only when it has something in it.
const hasLegendEntries = computed(() => {
if (props.selectedAssetType && Object.keys(visibleSubtypes.value).length) return true
if (Object.keys(visibleAssetTypes.value).length) return true
return overlayLegend.value.length > 0
})
const mapContainer = ref(null)
let map = null
let imageOverlay = null
@@ -296,17 +304,22 @@ function initMap() {
map.setView([MAP_HEIGHT / 2, MAP_WIDTH / 2], initialZoom)
map.setMaxBounds(bounds)
// Picker mode: click to set position
if (props.pickerMode) {
map.on('click', handleMapClick)
// Bound UNCONDITIONALLY, and handleMapClick ignores the click when picker mode
// is off. Binding it only when pickerMode was true AT MOUNT meant a map that
// becomes a picker later never got a click handler at all: the map editor
// opens with nothing selected, so clicking to place a marker did nothing, for
// the whole life of the page. The asset forms only worked because their picker
// is mounted inside a modal that is already in picker mode.
map.on('click', handleMapClick)
// Show initial position if provided
if (props.initialPosition) {
setPickerPosition(props.initialPosition.left, props.initialPosition.top)
}
} else {
renderMarkers()
if (props.pickerMode && props.initialPosition) {
setPickerPosition(props.initialPosition.left, props.initialPosition.top)
}
// Existing markers are drawn in picker mode too: placing a marker relative to
// the ones already on the floor is the whole task. The forms pass no markers,
// so this costs them nothing.
renderMarkers()
}
function handleMapClick(e) {