Add full-text search

Add a search box with a quick results popover, as well full results in
the sidebar on pressing enter.
This commit is contained in:
2026-02-20 12:39:04 +04:00
parent 2734f08608
commit bf12305600
15 changed files with 878 additions and 68 deletions

View File

@@ -110,6 +110,10 @@ export default class MapComponent extends Component {
}),
});
// Initialize the UI service with the map center
const initialCenter = toLonLat(view.getCenter());
this.mapUi.updateCenter(initialCenter[1], initialCenter[0]);
apply(this.mapInstance, 'https://tiles.openfreemap.org/styles/liberty');
this.searchOverlayElement = document.createElement('div');
@@ -645,12 +649,18 @@ export default class MapComponent extends Component {
handleMapMove = async () => {
if (!this.mapInstance) return;
const view = this.mapInstance.getView();
const center = toLonLat(view.getCenter());
this.mapUi.updateCenter(center[1], center[0]);
// If in creation mode, update the coordinates in the service AND the URL
if (this.mapUi.isCreating) {
// Calculate coordinates under the crosshair element
// We need the pixel position of the crosshair relative to the map viewport
// The crosshair is positioned via CSS, so we can use getBoundingClientRect
const mapRect = this.mapInstance.getTargetElement().getBoundingClientRect();
const mapRect = this.mapInstance
.getTargetElement()
.getBoundingClientRect();
const crosshairRect = this.crosshairElement.getBoundingClientRect();
const centerX =
@@ -786,10 +796,9 @@ export default class MapComponent extends Component {
const queryParams = {
lat: lat.toFixed(6),
lon: lon.toFixed(6),
q: null, // Clear q to force spatial search
selected: selectedFeatureName || null,
};
if (selectedFeatureName) {
queryParams.q = selectedFeatureName;
}
this.router.transitionTo('search', { queryParams });
};