fix(map): preserve empty facet selection

This commit is contained in:
Codex
2026-08-05 18:29:19 +03:00
parent 07a42b8832
commit 2cd3b33141
2 changed files with 68 additions and 12 deletions
+44 -4
View File
@@ -49,13 +49,53 @@ test("deselecting the last chip remains empty and never normalizes to all", () =
assert.equal(mapFactMatchesFilters(onlineMoving, profile, filters, "fleet"), false);
});
test("interactive deselect of the last chip removes the facet constraint", () => {
test("interactive deselect of the last chip preserves the zero-match state", () => {
const selected = toggleMapPresentationFacetSelection({}, "signal_state", "active");
assert.deepEqual(selected, { signal_state: ["active"] });
const unconstrained = toggleMapPresentationFacetSelection(selected, "signal_state", "active");
assert.deepEqual(unconstrained, {});
assert.equal(mapPresentationBindingIsAll("fleet", { fleet: { visible: true, facets: unconstrained } }), true);
const empty = toggleMapPresentationFacetSelection(selected, "signal_state", "active");
const filters = { fleet: { visible: true, facets: empty } };
assert.deepEqual(empty, { signal_state: [] });
assert.equal(mapPresentationBindingIsAll("fleet", filters), false);
assert.equal(mapFactMatchesFilters(onlineMoving, profile, filters, "fleet"), false);
});
test("the first chip selected after a saved empty view removes every empty sentinel", () => {
const selected = toggleMapPresentationFacetSelection({
signal_state: [],
movement_state: [],
}, "signal_state", "active");
assert.deepEqual(selected, { signal_state: ["active"] });
assert.equal(mapFactMatchesFilters(onlineMoving, profile, {
fleet: { visible: true, facets: selected },
}, "fleet"), true);
});
test("a complete interactive toggle cycle returns to zero matches instead of all", () => {
let facets = { signal_state: [], movement_state: [] };
const toggle = (field, value) => {
facets = toggleMapPresentationFacetSelection(facets, field, value);
};
toggle("signal_state", "active");
toggle("signal_state", "inactive");
toggle("movement_state", "moving");
toggle("movement_state", "stopped");
assert.deepEqual(facets, {
signal_state: ["active", "inactive"],
movement_state: ["moving", "stopped"],
});
toggle("signal_state", "active");
toggle("signal_state", "inactive");
toggle("movement_state", "moving");
toggle("movement_state", "stopped");
const filters = { fleet: { visible: true, facets } };
assert.deepEqual(facets, { movement_state: [] });
assert.equal(mapPresentationBindingIsAll("fleet", filters), false);
assert.equal(mapFactMatchesFilters(onlineMoving, profile, filters, "fleet"), false);
});
test("interactive deselect preserves other values and facet constraints", () => {