add dashboard filtering to analytics
All checks were successful
deploy / deploy (push) Successful in 1m19s

Click any row in pages, sources, countries, or devices tables to
filter the entire dashboard by that dimension. Active filters show
as dismissible chips. Filters thread through all queries including
previous-period deltas. 1050 tests.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
jamey
2026-02-23 13:46:34 +00:00
parent 6eda1de1bc
commit 7ceee9c814
6 changed files with 328 additions and 61 deletions

View File

@@ -102,5 +102,63 @@ defmodule BerrypodWeb.Admin.AnalyticsTest do
html = render_click(view, "change_tab", %{"tab" => "funnel"})
assert html =~ "Conversion funnel"
end
test "clicking a source adds a filter chip", %{conn: conn} do
now = DateTime.utc_now() |> DateTime.truncate(:second)
Repo.insert_all(Event, [
[
id: Ecto.UUID.generate(),
name: "pageview",
pathname: "/",
visitor_hash: :crypto.strong_rand_bytes(8),
session_hash: :crypto.strong_rand_bytes(8),
referrer_source: "Google",
inserted_at: now
]
])
{:ok, view, _html} = live(conn, ~p"/admin/analytics")
# Switch to sources tab and click the source
render_click(view, "change_tab", %{"tab" => "sources"})
html =
render_click(view, "add_filter", %{"dimension" => "referrer_source", "value" => "Google"})
assert html =~ "Source: Google"
assert has_element?(view, "#analytics-filters")
end
test "removing a filter chip clears it", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/admin/analytics")
render_click(view, "add_filter", %{"dimension" => "country_code", "value" => "GB"})
assert render(view) =~ "Country: United Kingdom"
html = render_click(view, "remove_filter", %{"dimension" => "country_code"})
refute html =~ "Country: United Kingdom"
end
test "clear all removes all filters", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/admin/analytics")
render_click(view, "add_filter", %{"dimension" => "country_code", "value" => "GB"})
render_click(view, "add_filter", %{"dimension" => "browser", "value" => "Chrome"})
assert render(view) =~ "Clear all"
html = render_click(view, "clear_filters", %{})
refute html =~ "Country: United Kingdom"
refute html =~ "Browser: Chrome"
end
test "changing period preserves filters", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/admin/analytics")
render_click(view, "add_filter", %{"dimension" => "country_code", "value" => "GB"})
html = render_click(view, "change_period", %{"period" => "7d"})
assert html =~ "Country: United Kingdom"
end
end
end