From 8c3335fa452ebc1b4bf823b6c621700de09be01f Mon Sep 17 00:00:00 2001 From: Darian Gill Date: Mon, 21 Sep 2026 13:56:20 -1000 Subject: [PATCH] Change default visiblity for unconfigured layers to true Also updates the logic in normalizeLayerVisibility with intermediate values and comments for better readability and updates the test assumptions to reflect the new default. Issue: #2905 --- src/js/models/maps/Map.js | 32 ++++++++++++---------- test/js/specs/unit/models/maps/Map.spec.js | 12 ++++---- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/js/models/maps/Map.js b/src/js/models/maps/Map.js index b4a6f92c5..62b34c8c2 100644 --- a/src/js/models/maps/Map.js +++ b/src/js/models/maps/Map.js @@ -79,8 +79,9 @@ define([ * Normalize configured and runtime visibility for a layer model/object. * configuredVisibility tracks the portal-configured value, while visible * tracks the current runtime value (which may be overridden from URL state). - * - * If both values are missing in config, default to hidden. + * The function is idempotent to protect against calls where both visible + * and configuredVisibility are already set. If only one of the two is set, + * the other is inferred from it. If neither is set, the default is visible. * @param {object} layer A layer config object. * @param {{enabledLayerIds: string[], enabledLayerStateProvided: boolean}} [visibilityState] * Parsed URL visibility state used to override runtime visible state. @@ -88,21 +89,24 @@ define([ * @since 2.38.0 */ function normalizeLayerVisibility(layer, visibilityState) { - const { visible } = layer; - const configuredVisibility = - layer.configuredVisibility == null - ? visible === true - : layer.configuredVisibility === true; - const urlVisible = getUrlVisibilityOverride(layer, visibilityState); - let runtimeVisibility; - if (urlVisible != null) { - runtimeVisibility = urlVisible; - } else if (visible == null) { - runtimeVisibility = configuredVisibility; + const hasConfiguredVisibility = layer.configuredVisibility != null; + const hasVisible = layer.visible != null; + const configuredVisibilityIsTrue = layer.configuredVisibility === true; + const visibleIsTrue = layer.visible === true; + + let configuredVisibility; + if (hasConfiguredVisibility) { + configuredVisibility = configuredVisibilityIsTrue; + } else if (hasVisible) { + configuredVisibility = visibleIsTrue; } else { - runtimeVisibility = visible === true; + configuredVisibility = true; // neither is configured: default to shown } + const urlVisible = getUrlVisibilityOverride(layer, visibilityState); + const runtimeVisibility = + urlVisible ?? (hasVisible ? visibleIsTrue : configuredVisibility); + return { ...layer, configuredVisibility, diff --git a/test/js/specs/unit/models/maps/Map.spec.js b/test/js/specs/unit/models/maps/Map.spec.js index 9c5416e86..4b9f512b1 100644 --- a/test/js/specs/unit/models/maps/Map.spec.js +++ b/test/js/specs/unit/models/maps/Map.spec.js @@ -124,16 +124,16 @@ define([ expect(map.getAllLayers()[1].get("visible")).to.be.true; }); - it("defaults flat layers with undefined visibility to hidden", () => { + it("defaults flat layers with undefined visibility to visible", () => { const map = new Map({ layers: [{ layerId: "layer-1" }, { layerId: "layer-2" }], }); - expect(map.get("layers").at(0).get("visible")).to.be.false; - expect(map.get("layers").at(1).get("visible")).to.be.false; + expect(map.get("layers").at(0).get("visible")).to.be.true; + expect(map.get("layers").at(1).get("visible")).to.be.true; }); - it("defaults categorized layers with undefined visibility to hidden", () => { + it("defaults categorized layers with undefined visibility to visible", () => { const map = new Map({ layerCategories: [ { @@ -142,8 +142,8 @@ define([ ], }); - expect(map.getAllLayers()[0].get("visible")).to.be.false; - expect(map.getAllLayers()[1].get("visible")).to.be.false; + expect(map.getAllLayers()[0].get("visible")).to.be.true; + expect(map.getAllLayers()[1].get("visible")).to.be.true; }); it("uses configuredVisibility when visible is omitted for flat layers", () => {