9 Commits

Author SHA1 Message Date
vcoppe
72578b00bd New translations map-controls.mdx (Spanish) 2026-04-17 12:36:31 +02:00
vcoppe
4ef49632f7 New translations integration.mdx (Spanish) 2026-04-17 12:36:30 +02:00
vcoppe
e3d45ebde7 New translations merge.mdx (Spanish) 2026-04-17 11:24:55 +02:00
vcoppe
d96fadf261 New translations integration.mdx (Spanish) 2026-04-17 11:24:54 +02:00
vcoppe
8dc20cbec7 New translations en.json (Spanish) 2026-04-17 11:24:53 +02:00
vcoppe
a3853c724f New translations en.json (Chinese Traditional, Hong Kong) 2026-04-17 05:11:14 +02:00
vcoppe
8ceaf2c8bd New translations elevation.mdx (Spanish) 2026-04-12 13:21:16 +02:00
vcoppe
1de15f702a New translations merge.mdx (Spanish) 2026-04-12 13:21:15 +02:00
vcoppe
0d1f1e9b23 New translations en.json (Spanish) 2026-04-12 13:21:14 +02:00
4 changed files with 61 additions and 98 deletions

View File

@@ -142,7 +142,6 @@ export class MapLayerEventManager {
} }
private _handleMouseMove(e: maplibregl.MapMouseEvent) { private _handleMouseMove(e: maplibregl.MapMouseEvent) {
if (e.originalEvent.buttons > 0) return;
const featuresByLayer = this._getRenderedFeaturesByLayer(e); const featuresByLayer = this._getRenderedFeaturesByLayer(e);
Object.keys(this._listeners).forEach((layerId) => { Object.keys(this._listeners).forEach((layerId) => {
const features = featuresByLayer[layerId] || []; const features = featuresByLayer[layerId] || [];

View File

@@ -81,13 +81,8 @@ export class StyleManager {
let basemap = get(currentBasemap); let basemap = get(currentBasemap);
const basemapInfo = basemaps[basemap] ?? custom[basemap]?.value ?? basemaps[defaultBasemap]; const basemapInfo = basemaps[basemap] ?? custom[basemap]?.value ?? basemaps[defaultBasemap];
const basemapStyle = await this.get(basemapInfo);
let basemapStyle = basemaps.openStreetMap as maplibregl.StyleSpecification;
try {
basemapStyle = await this.get(basemapInfo);
} catch (e) {
console.error(e.message);
}
this.merge(style, basemapStyle); this.merge(style, basemapStyle);
if (this._maptilerKey !== '') { if (this._maptilerKey !== '') {
@@ -114,52 +109,45 @@ export class StyleManager {
if (!layers[overlay]) { if (!layers[overlay]) {
if (this._pastOverlays.has(overlay)) { if (this._pastOverlays.has(overlay)) {
const overlayInfo = custom[overlay]?.value ?? overlays[overlay]; const overlayInfo = custom[overlay]?.value ?? overlays[overlay];
try { const overlayStyle = await this.get(overlayInfo);
const overlayStyle = await this.get(overlayInfo); for (let layer of overlayStyle.layers ?? []) {
for (let layer of overlayStyle.layers ?? []) { if (map_.getLayer(layer.id)) {
if (map_.getLayer(layer.id)) { map_.removeLayer(layer.id);
map_.removeLayer(layer.id);
}
} }
} catch (e) {
// Should not happen
} }
this._pastOverlays.delete(overlay); this._pastOverlays.delete(overlay);
} }
} else { } else {
const overlayInfo = custom[overlay]?.value ?? overlays[overlay]; const overlayInfo = custom[overlay]?.value ?? overlays[overlay];
try { const overlayStyle = await this.get(overlayInfo);
const overlayStyle = await this.get(overlayInfo); const opacity = overlayOpacities[overlay];
const opacity = overlayOpacities[overlay];
for (let sourceId in overlayStyle.sources) { for (let sourceId in overlayStyle.sources) {
if (!map_.getSource(sourceId)) { if (!map_.getSource(sourceId)) {
map_.addSource(sourceId, overlayStyle.sources[sourceId]); map_.addSource(sourceId, overlayStyle.sources[sourceId]);
}
} }
for (let layer of overlayStyle.layers ?? []) {
if (!map_.getLayer(layer.id)) {
if (opacity !== undefined) {
if (layer.type === 'raster') {
if (!layer.paint) {
layer.paint = {};
}
layer.paint['raster-opacity'] = opacity;
} else if (layer.type === 'hillshade') {
if (!layer.paint) {
layer.paint = {};
}
layer.paint['hillshade-exaggeration'] = opacity / 2;
}
}
map_.addLayer(layer, ANCHOR_LAYER_KEY.overlays);
}
}
this._pastOverlays.add(overlay);
} catch (e) {
console.error(e.message);
} }
for (let layer of overlayStyle.layers ?? []) {
if (!map_.getLayer(layer.id)) {
if (opacity !== undefined) {
if (layer.type === 'raster') {
if (!layer.paint) {
layer.paint = {};
}
layer.paint['raster-opacity'] = opacity;
} else if (layer.type === 'hillshade') {
if (!layer.paint) {
layer.paint = {};
}
layer.paint['hillshade-exaggeration'] = opacity / 2;
}
}
map_.addLayer(layer, ANCHOR_LAYER_KEY.overlays);
}
}
this._pastOverlays.add(overlay);
} }
} }
} catch (e) {} } catch (e) {}
@@ -193,9 +181,6 @@ export class StyleManager {
styleUrl = styleUrl.replace(maptilerKeyPlaceHolder, this._maptilerKey); styleUrl = styleUrl.replace(maptilerKeyPlaceHolder, this._maptilerKey);
} }
const response = await fetch(styleUrl, { cache: 'force-cache' }); const response = await fetch(styleUrl, { cache: 'force-cache' });
if (!response.ok) {
throw new Error(`HTTP error fetching style "${styleInfo}": ${response.status}`);
}
const style = await response.json(); const style = await response.json();
return style; return style;
} else { } else {

View File

@@ -57,10 +57,8 @@ export class RoutingControls {
updateControlsBinded: () => void = this.updateControls.bind(this); updateControlsBinded: () => void = this.updateControls.bind(this);
appendAnchorBinded: (e: MapMouseEvent) => void = this.appendAnchor.bind(this); appendAnchorBinded: (e: MapMouseEvent) => void = this.appendAnchor.bind(this);
addIntermediateAnchorBinded: (e: MapMouseEvent) => void = this.addIntermediateAnchor.bind(this);
draggedAnchorIndex: number | null = null; draggedAnchorIndex: number | null = null;
lastDraggedAnchorEventTime: number = 0;
draggingStartingPosition: maplibregl.Point = new maplibregl.Point(0, 0); draggingStartingPosition: maplibregl.Point = new maplibregl.Point(0, 0);
onMouseEnterBinded: () => void = this.onMouseEnter.bind(this); onMouseEnterBinded: () => void = this.onMouseEnter.bind(this);
onMouseLeaveBinded: () => void = this.onMouseLeave.bind(this); onMouseLeaveBinded: () => void = this.onMouseLeave.bind(this);
@@ -135,7 +133,6 @@ export class RoutingControls {
map_.on('style.load', this.updateControlsBinded); map_.on('style.load', this.updateControlsBinded);
map_.on('click', this.appendAnchorBinded); map_.on('click', this.appendAnchorBinded);
layerEventManager.on('mousemove', this.fileId, this.showTemporaryAnchorBinded); layerEventManager.on('mousemove', this.fileId, this.showTemporaryAnchorBinded);
layerEventManager.on('click', this.fileId, this.addIntermediateAnchorBinded);
this.fileUnsubscribe = this.file.subscribe(this.updateControlsBinded); this.fileUnsubscribe = this.file.subscribe(this.updateControlsBinded);
} }
@@ -240,7 +237,6 @@ export class RoutingControls {
map_?.off('style.load', this.updateControlsBinded); map_?.off('style.load', this.updateControlsBinded);
map_?.off('click', this.appendAnchorBinded); map_?.off('click', this.appendAnchorBinded);
layerEventManager?.off('mousemove', this.fileId, this.showTemporaryAnchorBinded); layerEventManager?.off('mousemove', this.fileId, this.showTemporaryAnchorBinded);
layerEventManager?.off('click', this.fileId, this.addIntermediateAnchorBinded);
map_?.off('mousemove', this.updateTemporaryAnchorBinded); map_?.off('mousemove', this.updateTemporaryAnchorBinded);
this.layers.forEach((layer) => { this.layers.forEach((layer) => {
@@ -525,19 +521,12 @@ export class RoutingControls {
if (get(streetViewEnabled) && get(streetViewSource) === 'google') { if (get(streetViewEnabled) && get(streetViewSource) === 'google') {
return; return;
} }
if (
this.draggedAnchorIndex !== null ||
Date.now() - this.lastDraggedAnchorEventTime < 100
) {
// Exit if anchor is being dragged
return;
}
if ( if (
e.target.queryRenderedFeatures(e.point, { e.target.queryRenderedFeatures(e.point, {
layers: [this.fileId, ...[...this.layers.values()].map((layer) => layer.id)], layers: [...this.layers.values()].map((layer) => layer.id),
}).length }).length
) { ) {
// Clicked on routing control or layer, ignoring // Clicked on routing control, ignoring
return; return;
} }
this.appendAnchorWithCoordinates({ this.appendAnchorWithCoordinates({
@@ -609,15 +598,6 @@ export class RoutingControls {
await this.routeBetweenAnchors([lastAnchor, newAnchor], [lastAnchorPoint, newAnchorPoint]); await this.routeBetweenAnchors([lastAnchor, newAnchor], [lastAnchorPoint, newAnchorPoint]);
} }
addIntermediateAnchor(e: maplibregl.MapMouseEvent) {
e.preventDefault();
if (this.temporaryAnchor !== null) {
this.turnIntoPermanentAnchor();
return;
}
}
getNeighbouringAnchors(anchor: Anchor): [Anchor | null, Anchor | null] { getNeighbouringAnchors(anchor: Anchor): [Anchor | null, Anchor | null] {
let previousAnchor: Anchor | null = null; let previousAnchor: Anchor | null = null;
let nextAnchor: Anchor | null = null; let nextAnchor: Anchor | null = null;
@@ -838,11 +818,8 @@ export class RoutingControls {
onClick(e: MapLayerMouseEvent) { onClick(e: MapLayerMouseEvent) {
e.preventDefault(); e.preventDefault();
if ( if (this.temporaryAnchor !== null) {
this.draggedAnchorIndex !== null || this.turnIntoPermanentAnchor();
Date.now() - this.lastDraggedAnchorEventTime < 100
) {
// Exit if anchor is being dragged
return; return;
} }
@@ -931,8 +908,6 @@ export class RoutingControls {
lat: e.lngLat.lat, lat: e.lngLat.lat,
lon: e.lngLat.lng, lon: e.lngLat.lng,
}); });
this.lastDraggedAnchorEventTime = Date.now();
} }
onMouseUp(e: MapLayerMouseEvent | MapLayerTouchEvent) { onMouseUp(e: MapLayerMouseEvent | MapLayerTouchEvent) {
@@ -971,7 +946,6 @@ export class RoutingControls {
} }
this.draggedAnchorIndex = null; this.draggedAnchorIndex = null;
this.lastDraggedAnchorEventTime = Date.now();
} }
showTemporaryAnchor(e: MapLayerMouseEvent) { showTemporaryAnchor(e: MapLayerMouseEvent) {

View File

@@ -162,33 +162,38 @@ function getLayerValidator(allowed: Record<string, any>, fallback: string) {
function filterLayerTree(t: LayerTreeType, allowed: LayerTreeType | undefined): LayerTreeType { function filterLayerTree(t: LayerTreeType, allowed: LayerTreeType | undefined): LayerTreeType {
const filtered: LayerTreeType = {}; const filtered: LayerTreeType = {};
if (allowed) { const values = Object.values(t);
Object.entries(allowed).forEach(([key, value]) => { if (values.length == 0) return filtered;
if (Object.hasOwn(t, key)) { if (typeof values[0] === 'boolean') {
if (typeof value === 'boolean') { if (allowed) {
Object.keys(allowed).forEach((key) => {
if (Object.hasOwn(t, key)) {
filtered[key] = t[key]; filtered[key] = t[key];
} else if (typeof value === 'object') { } else {
filtered[key] = filterLayerTree( filtered[key] = allowed[key];
typeof t[key] === 'object' ? t[key] : {},
value
);
} }
} else { });
}
Object.entries(t).forEach(([key, value]) => {
if (
!Object.hasOwn(filtered, key) &&
(key.startsWith('custom-') || key.startsWith('extension-'))
) {
filtered[key] = value; filtered[key] = value;
} }
}); });
} } else {
Object.entries(t).forEach(([key, value]) => { Object.entries(t).forEach(([key, value]) => {
if (!Object.hasOwn(filtered, key)) { if (typeof value === 'object') {
if (typeof value === 'boolean') { filtered[key] = filterLayerTree(
if (key.startsWith('custom-') || key.startsWith('extension-')) { value,
filtered[key] = value; typeof allowed === 'object' && typeof allowed[key] === 'object'
} ? allowed[key]
} else if (typeof value === 'object') { : undefined
filtered[key] = filterLayerTree(value, undefined); );
} }
} });
}); }
return filtered; return filtered;
} }