Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 18 additions & 14 deletions src/js/models/maps/Map.js
Original file line number Diff line number Diff line change
Expand Up @@ -79,30 +79,34 @@ 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.
* @returns {object} The normalized layer config.
* @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,
Expand Down
12 changes: 6 additions & 6 deletions test/js/specs/unit/models/maps/Map.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -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: [
{
Expand All @@ -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", () => {
Expand Down