On a canvas with more than one metrics view, the same dimension filter can end up applying to every metrics view or to just one, depending on how it was created. The filter bar renders the same single chip in both cases, so there is no way to tell which one you have.
- Setting the filter from the filter bar writes
f.<view>=... for every metrics view that declares the dimension.
- Clicking a value inside a table writes
f.<view>=... for that component's metrics view only.
To Reproduce
Using the demo, https://ui.rilldata.com/demo/rill-github-analytics/canvas/repo_compare_canvas. It has two metrics views, duckdb_commits_metrics and rill_commits_metrics, and both declare a username dimension.
Case A, from the filter bar:
- Open the canvas with
?tr=inf
- Click
+, choose Username, select Aditya Hegde
- The URL becomes
?tr=inf&f.duckdb_commits_metrics=username IN ('Aditya Hegde')&f.rill_commits_metrics=username IN ('Aditya Hegde')
- Both halves filter. DuckDB "Number of commits" shows 0, Rill shows 754
Case B, clicking a table:
- Open the canvas with
?tr=inf
- In the table on the Rill side, click
Aditya Hegde
- The URL becomes
?tr=inf&f.rill_commits_metrics=username IN ('Aditya Hegde')
- Only the Rill half filters. DuckDB "Number of commits" stays at 46,569 and its table still lists Mark Raasveldt, Mark, Tishj, Laurens Kuiper and the rest
In both cases the bar shows one chip, Username: Aditya Hegde, next to Clear filters, with nothing to distinguish them.
Expected behavior
We are not sure which scope should be the default, and per component scope may well be deliberate. What looks wrong to us is that the two paths disagree while looking identical on screen. A few directions, in case any is useful:
- Make both paths use the same scope
- Indicate in the chip which components a filter actually reaches, when it does not reach all of them
- Let the canvas author decide, for example a
filters: scope: shared | per_metrics_view option in the YAML
Screenshots
Case A, filter set from the bar, DuckDB at 0:
Case B, same filter set by clicking the table, DuckDB unchanged at 46,569:
Desktop:
- OS: macOS 15
- Browser: Chrome
- Version: Rill Cloud demo, as of 2026-08-31
Additional context
Where this came from: we have a canvas that mixes a sales metrics view and a receivables one, both with a salesperson dimension. Someone filtered by salesperson by clicking a table and the sales KPIs above did not move, then did the same from the bar and they did. It took us a while to work out why, and nothing on the screen explained it.
The two code paths, as far as we could follow them:
web-common/src/features/canvas/filters/filter-manager.ts, resolveFilterKey resolves a dimension against every metrics view that declares it
web-common/src/components/pivot/pivot-click-to-filter.ts calls applyFiltersToUrl(new Map([[metricsViewName, filterString]])) with only the component's own metrics view
Happy to send a PR if you tell us which direction you would prefer.
On a canvas with more than one metrics view, the same dimension filter can end up applying to every metrics view or to just one, depending on how it was created. The filter bar renders the same single chip in both cases, so there is no way to tell which one you have.
f.<view>=...for every metrics view that declares the dimension.f.<view>=...for that component's metrics view only.To Reproduce
Using the demo, https://ui.rilldata.com/demo/rill-github-analytics/canvas/repo_compare_canvas. It has two metrics views,
duckdb_commits_metricsandrill_commits_metrics, and both declare ausernamedimension.Case A, from the filter bar:
?tr=inf+, chooseUsername, selectAditya Hegde?tr=inf&f.duckdb_commits_metrics=username IN ('Aditya Hegde')&f.rill_commits_metrics=username IN ('Aditya Hegde')Case B, clicking a table:
?tr=infAditya Hegde?tr=inf&f.rill_commits_metrics=username IN ('Aditya Hegde')In both cases the bar shows one chip,
Username: Aditya Hegde, next toClear filters, with nothing to distinguish them.Expected behavior
We are not sure which scope should be the default, and per component scope may well be deliberate. What looks wrong to us is that the two paths disagree while looking identical on screen. A few directions, in case any is useful:
filters: scope: shared | per_metrics_viewoption in the YAMLScreenshots
Case A, filter set from the bar, DuckDB at 0:
Case B, same filter set by clicking the table, DuckDB unchanged at 46,569:
Desktop:
Additional context
Where this came from: we have a canvas that mixes a sales metrics view and a receivables one, both with a
salespersondimension. Someone filtered by salesperson by clicking a table and the sales KPIs above did not move, then did the same from the bar and they did. It took us a while to work out why, and nothing on the screen explained it.The two code paths, as far as we could follow them:
web-common/src/features/canvas/filters/filter-manager.ts,resolveFilterKeyresolves a dimension against every metrics view that declares itweb-common/src/components/pivot/pivot-click-to-filter.tscallsapplyFiltersToUrl(new Map([[metricsViewName, filterString]]))with only the component's own metrics viewHappy to send a PR if you tell us which direction you would prefer.