From 3621cb46fbd86550985c52cf6db2953f8eb00132 Mon Sep 17 00:00:00 2001 From: tariqksoliman Date: Wed, 25 Feb 2026 16:52:58 -0800 Subject: [PATCH 1/2] #871 Bug: DyanmicExtent+Threshold Layers do not properly update --- src/essence/Basics/Map_/Map_.js | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/src/essence/Basics/Map_/Map_.js b/src/essence/Basics/Map_/Map_.js index 5f5d8a91a..a5029da66 100644 --- a/src/essence/Basics/Map_/Map_.js +++ b/src/essence/Basics/Map_/Map_.js @@ -395,15 +395,26 @@ let Map_ = { }, refreshLayer: async function (layerObj, cb) { // If it's a dynamic extent layer, just re-call its function - if ( - L_._onSpecificLayerToggleSubscriptions[ - `dynamicextent_${layerObj.name}` - ] != null - ) { - if (L_.layers.on[layerObj.name]) - L_._onSpecificLayerToggleSubscriptions[ - `dynamicextent_${layerObj.name}` - ].func(layerObj.name) + const dynamicExtentKey = `dynamicextent_${layerObj.name}` + const dynamicGeodatasetKey = `dynamicgeodataset_${layerObj.name}` // For velocity layers + + const subscription = L_._onSpecificLayerToggleSubscriptions[dynamicExtentKey] + || L_._onSpecificLayerToggleSubscriptions[dynamicGeodatasetKey] + + if (subscription != null) { + if (L_.layers.on[layerObj.name]) { + const layerData = L_.layers.data[layerObj.name] + + // Always bypass threshold for explicit refreshLayer() calls + // (refresh intervals, time changes, manual API calls) + // Pan/zoom events call the callback directly, not via refreshLayer + if (layerData) { + layerData._ignoreDynamicExtentMoveThreshold = true + } + + subscription.func(layerObj.name) + } + if (typeof cb === 'function') cb() return true } From c733f0fabaa617f22de6cab87214b9bcaad1ffaa Mon Sep 17 00:00:00 2001 From: tariqksoliman Date: Wed, 4 Mar 2026 14:37:51 -0800 Subject: [PATCH 2/2] #871 Bug: DyanmicExtent+Threshold Layers do not properly update 2 --- src/essence/Basics/Layers_/LayerCapturer.js | 9 +++++ .../Basics/Layers_/LayerConstructors.js | 36 +++++++++---------- src/essence/Basics/Layers_/Layers_.js | 4 +-- src/essence/Basics/Map_/Map_.js | 12 +++---- 4 files changed, 35 insertions(+), 26 deletions(-) diff --git a/src/essence/Basics/Layers_/LayerCapturer.js b/src/essence/Basics/Layers_/LayerCapturer.js index ec7259ee6..60d89da33 100644 --- a/src/essence/Basics/Layers_/LayerCapturer.js +++ b/src/essence/Basics/Layers_/LayerCapturer.js @@ -145,6 +145,11 @@ export const captureVector = (layerObj, options, cb, dynamicCb) => { layerData?.variables ?.dynamicExtentMoveThreshold == null || + layerData?.variables + ?.dynamicExtentMoveThreshold === + '' || + layerData._ignoreDynamicExtentMoveThreshold === + true || F_.lngLatDistBetween( lastLoc.lng, lastLoc.lat, @@ -166,6 +171,7 @@ export const captureVector = (layerObj, options, cb, dynamicCb) => { ) : 1)) ) { + layerData._ignoreDynamicExtentMoveThreshold = false L_.clearVectorLayer(layerObj.name) L_.updateVectorLayer(layerObj.name, data) _geodatasetRequestLastLoc[layerObj.name] = @@ -288,6 +294,8 @@ export const captureVector = (layerObj, options, cb, dynamicCb) => { (lastLoc == null || layerData?.variables ?.dynamicExtentMoveThreshold == null || + layerData._ignoreDynamicExtentMoveThreshold === + true || F_.lngLatDistBetween( lastLoc.lng, lastLoc.lat, @@ -309,6 +317,7 @@ export const captureVector = (layerObj, options, cb, dynamicCb) => { ) : 1)) ) { + layerData._ignoreDynamicExtentMoveThreshold = false L_.clearVectorLayer(layerObj.name) L_.updateVectorLayer(layerObj.name, data) _layerRequestLastLoc[layerObj.name] = nowLoc diff --git a/src/essence/Basics/Layers_/LayerConstructors.js b/src/essence/Basics/Layers_/LayerConstructors.js index c135b055a..3575148ba 100644 --- a/src/essence/Basics/Layers_/LayerConstructors.js +++ b/src/essence/Basics/Layers_/LayerConstructors.js @@ -82,34 +82,34 @@ export const constructVectorLayer = ( ? F_.parseColor(feature.properties[col.substring(5)]) || '#FFF' : feature.style && feature.style.stroke != null - ? feature.style.stroke - : col + ? feature.style.stroke + : col var finalOpa = opa.toLowerCase().substring(0, 4) === 'prop' ? feature.properties[opa.substring(5)] || '1' : feature.style && feature.style.opacity != null - ? feature.style.opacity - : opa + ? feature.style.opacity + : opa var finalWei = wei.toLowerCase().substring(0, 4) === 'prop' ? feature.properties[wei.substring(5)] || '1' : feature.style && feature.style.weight != null - ? feature.style.weight - : wei + ? feature.style.weight + : wei if (!isNaN(parseInt(finalWei))) finalWei = parseInt(finalWei) var finalFiC = fiC.toLowerCase().substring(0, 4) === 'prop' ? F_.parseColor(feature.properties[fiC.substring(5)]) || '#000' : feature.style && feature.style.fill != null - ? feature.style.fill - : fiC + ? feature.style.fill + : fiC var finalFiO = fiO.toLowerCase().substring(0, 4) === 'prop' ? feature.properties[fiO.substring(5)] || '1' : feature.style && feature.style.fillopacity != null - ? feature.style.fillopacity - : fiO + ? feature.style.fillopacity + : fiO // Check for radius property if radius=1 (default/prop:radius) layerObj.style.radius = @@ -765,8 +765,8 @@ const labels = (geojson, layerObj, leafletLayerObject, layer, sublayers) => { on: L_.layers.attachments[layerObj.name]?.labels ? L_.layers.attachments[layerObj.name]?.labels.on : labelsVar.initialVisibility != null - ? labelsVar.initialVisibility - : true, + ? labelsVar.initialVisibility + : true, type: 'labels', geojson: geojson, layer: layer, @@ -936,8 +936,8 @@ const pairings = (geojson, layerObj, leafletLayerObject) => { on: L_.layers.attachments[layerObj.name]?.pairings ? L_.layers.attachments[layerObj.name]?.pairings.on : pairingsVar.initialVisibility != null - ? pairingsVar.initialVisibility - : true, + ? pairingsVar.initialVisibility + : true, pairedLayers: layers, pairProp: pairProp, layersAzProp: layersAzProp, @@ -983,8 +983,8 @@ const uncertaintyEllipses = (geojson, layerObj, leafletLayerObject) => { existingOn != null ? existingOn : uncertaintyVar.initialVisibility != null - ? uncertaintyVar.initialVisibility - : true + ? uncertaintyVar.initialVisibility + : true uncertaintyStyle = { fillOpacity: uncertaintyVar.fillOpacity || 0.25, @@ -1157,8 +1157,8 @@ const imageOverlays = (geojson, layerObj, leafletLayerObject) => { existingOn != null ? existingOn : imageVar.initialVisibility != null - ? imageVar.initialVisibility - : true + ? imageVar.initialVisibility + : true if (imageVar && imageShow === 'always') leafletLayerObjectImageOverlay = { diff --git a/src/essence/Basics/Layers_/Layers_.js b/src/essence/Basics/Layers_/Layers_.js index 292f122a2..b7d639b3f 100644 --- a/src/essence/Basics/Layers_/Layers_.js +++ b/src/essence/Basics/Layers_/Layers_.js @@ -931,8 +931,8 @@ const L_ = { geojson.features ? geojson.features : geojson.length > 0 && geojson[0].type === 'Feature' - ? geojson - : null + ? geojson + : null ) if (keepLastN && keepLastN > 0) { layer._sourceGeoJSON.features = diff --git a/src/essence/Basics/Map_/Map_.js b/src/essence/Basics/Map_/Map_.js index a5029da66..f991d01ee 100644 --- a/src/essence/Basics/Map_/Map_.js +++ b/src/essence/Basics/Map_/Map_.js @@ -396,10 +396,11 @@ let Map_ = { refreshLayer: async function (layerObj, cb) { // If it's a dynamic extent layer, just re-call its function const dynamicExtentKey = `dynamicextent_${layerObj.name}` - const dynamicGeodatasetKey = `dynamicgeodataset_${layerObj.name}` // For velocity layers + const dynamicGeodatasetKey = `dynamicgeodataset_${layerObj.name}` // For velocity layers - const subscription = L_._onSpecificLayerToggleSubscriptions[dynamicExtentKey] - || L_._onSpecificLayerToggleSubscriptions[dynamicGeodatasetKey] + const subscription = + L_._onSpecificLayerToggleSubscriptions[dynamicExtentKey] || + L_._onSpecificLayerToggleSubscriptions[dynamicGeodatasetKey] if (subscription != null) { if (L_.layers.on[layerObj.name]) { @@ -853,9 +854,8 @@ async function makeVectorLayer( `ERROR: ${layerObj.display_name} has invalid GeoJSON!` ) } - L_._layersLoaded[ - L_._layersOrdered.indexOf(layerObj.name) - ] = true + L_._layersLoaded[L_._layersOrdered.indexOf(layerObj.name)] = + true L_.layers.layer[layerObj.name] = data == null ? null : false allLayersLoaded() resolve()