Summary
The provider filter and service multi-select filters in layouts/index.html are purely in-memory state. Applying filters then sharing the URL or using the browser back button loses all filter context. URL state sync would enable deep-linking, bookmarking, and sharing a filtered view.
Desired behaviour
- Selecting provider filter →
?provider=Azure appended to URL
- Selecting one or more services →
?services=vdc_vault,vdc_m365 appended
- On page load, read query params and pre-apply filters before first
renderMap() call
- Clearing all filters removes params from URL (clean URL)
- Browser back/forward navigates filter history
Implementation notes
- Use
history.replaceState() (not pushState) on filter change to avoid polluting history on every keystroke
- Parse params on load with
new URLSearchParams(location.search)
- No router library needed — the page is a single-file SPA
- Search input state should not be synced (transient UI, no value in persisting)
Acceptance criteria
Summary
The provider filter and service multi-select filters in
layouts/index.htmlare purely in-memory state. Applying filters then sharing the URL or using the browser back button loses all filter context. URL state sync would enable deep-linking, bookmarking, and sharing a filtered view.Desired behaviour
?provider=Azureappended to URL?services=vdc_vault,vdc_m365appendedrenderMap()callImplementation notes
history.replaceState()(notpushState) on filter change to avoid polluting history on every keystrokenew URLSearchParams(location.search)Acceptance criteria
?provider=<value>in URL (omitted whenall)?services=<comma-separated-ids>in URL (omitted when none)npm run test:uipasses (add a test that verifies URL updates on filter change)