Skip to content

fix: hide already-filtered values from other spreadsheet column filters#9386

Open
vursen wants to merge 5 commits into
mainfrom
fix/spreadsheet-cross-column-filter-9329
Open

fix: hide already-filtered values from other spreadsheet column filters#9386
vursen wants to merge 5 commits into
mainfrom
fix/spreadsheet-cross-column-filter-9329

Conversation

@vursen
Copy link
Copy Markdown
Contributor

@vursen vursen commented May 28, 2026

Description

In a SpreadsheetFilterTable with filters on multiple columns, opening any column's filter dropdown showed values from rows already hidden by other columns as unchecked, suggesting they were filtered by this column. Re-checking them did nothing because another column still hid the row.

Applying a second filter then implicitly added those already-hidden rows to the second column's filteredRows, so clearing the first filter did not bring the rows back — the second column now also filtered them.

Root cause: ItemFilter read spreadsheet.isRowHidden(r) for both building option lists and deciding which rows belong in its own filteredRows. That property reflects the union of all column filters, so each filter could not tell its own work from a sibling's.

Each ItemFilter now operates only on its own filteredRows. The dropdown option list omits values whose rows are all hidden by other columns via a new SpreadsheetFilterTable.getRowsHiddenByOtherFilters(self) helper. clearAllFilters does a second pass to refresh option lists so cleared siblings are reflected immediately.

Fixes #9329

Reproduction

@Route("spreadsheet-filter-cross-column")
public class SpreadsheetFilterCrossColumnPage extends VerticalLayout {

    public SpreadsheetFilterCrossColumnPage() {
        Spreadsheet spreadsheet = new Spreadsheet();
        spreadsheet.setTheme(SpreadsheetTheme.LUMO);
        spreadsheet.setHeight("400px");

        spreadsheet.createCell(0, 0, "Column A");
        spreadsheet.createCell(0, 1, "Column B");
        spreadsheet.createCell(0, 2, "Column C");

        spreadsheet.createCell(1, 0, "Alpha");
        spreadsheet.createCell(1, 1, "Foo");
        spreadsheet.createCell(1, 2, "Alice");

        spreadsheet.createCell(2, 0, "Beta");
        spreadsheet.createCell(2, 1, "Bar");
        spreadsheet.createCell(2, 2, "Bob");

        spreadsheet.createCell(3, 0, "Gamma");
        spreadsheet.createCell(3, 1, "Baz");
        spreadsheet.createCell(3, 2, "Carol");

        CellRangeAddress range = new CellRangeAddress(0, 3, 0, 2);
        SpreadsheetFilterTable table = new SpreadsheetFilterTable(spreadsheet,
                range);
        spreadsheet.registerTable(table);
        spreadsheet.refreshAllCellValues();

        add(spreadsheet);
    }
}
Column A Column B Column C
Alpha Foo Alice
Beta Bar Bob
Gamma Baz Carol

Steps to reproduce:

  • Filter Beta in column A.
  • Open the filter dropdown in column B → Bar shows up unchecked (before the fix), suggesting column B filtered it.
  • Filter Foo in column B.
  • Re-check Beta in column A → the row does not reappear (before the fix), because column B now also filters it.

🤖 Generated with Claude Code

Each ItemFilter previously read spreadsheet.isRowHidden, which reflects
the union of all column filters. Two consequences:

- Filter dropdowns showed values from rows hidden by other columns as
  unchecked, suggesting this column was filtering them.
- Applying a filter then absorbed those rows into this column's
  filteredRows, so clearing the other column did not bring them back.

Each filter now operates only on its own filteredRows. Dropdown option
lists omit values whose rows are all hidden by other columns (cosmetic).
clearAllFilters refreshes option lists in a second pass so cleared
siblings are reflected.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@vursen vursen changed the title fix: decouple spreadsheet column filters fix: hide already-filtered values from other spreadsheet column filters Jun 1, 2026
getVisibleValues now builds on getAllValues, so a column's option
list no longer shows values whose rows are already hidden by other
columns' filters.

Refs #9329
@vaadin vaadin deleted a comment from github-actions Bot Jun 2, 2026
vursen and others added 3 commits June 2, 2026 14:39
Reuses the cross-column repro page (renamed to a general
SpreadsheetFilterPage) and adds an IT that filters one column, then
asserts another column's filter dropdown omits values whose rows are
hidden by the first column.

Refs #9329

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Drive popups via SpreadsheetElement and read values via
CheckboxGroupElement, and extend AbstractComponentIT directly since
AbstractSpreadsheetIT's getSpreadsheet() only works with the shared
demo page.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@sonarqubecloud
Copy link
Copy Markdown

sonarqubecloud Bot commented Jun 2, 2026

@vursen vursen marked this pull request as ready for review June 2, 2026 16:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Spreadsheet: Inclusion of hidden values in filter dropdown is confusing

1 participant