Skip to content

feat(webui): virtualize data tables to handle thousands of rows - #360

Merged
ngosang merged 1 commit into
amule-org:masterfrom
ngosang:feat/webui-virtual-tables
Jul 9, 2026
Merged

feat(webui): virtualize data tables to handle thousands of rows#360
ngosang merged 1 commit into
amule-org:masterfrom
ngosang:feat/webui-virtual-tables

Conversation

@ngosang

@ngosang ngosang commented Jul 9, 2026

Copy link
Copy Markdown
Member

List views rendered every row into the DOM, so a shared-files list with thousands of entries put thousands of (with selects/progress bars) through Preact's diff on each SSE update, locking the main thread.

Add a shared, column-config-driven VirtualTable (js/table.js) that windows the visible rows plus overscan with spacer rows, using table-layout:fixed for stable column widths (with a computed min-width so narrow screens scroll horizontally instead of collapsing), a fixed row height, sticky thead, and keyed rows. It also owns sortable headers, deduplicating the Th/cmp/sortVal helpers that were copy-pasted across four views.

Migrate shared, downloads, search, servers and peers to it. Make the peers table sortable (default: busiest first) and add a text filter to the downloads, shared and peers tables, mirroring the search filter via a shared textMatcher helper.

Fix multi-select so it stays consistent with the active filter: select-all now acts only on the filtered rows, the selection is pruned to the visible set when the filter changes (never keeps hidden rows selected), and a "Selected N" count is shown next to the bulk actions.

List views rendered every row into the DOM, so a shared-files list with
thousands of entries put thousands of <tr> (with selects/progress bars)
through Preact's diff on each SSE update, locking the main thread.

Add a shared, column-config-driven VirtualTable (js/table.js) that windows
the visible rows plus overscan with spacer rows, using table-layout:fixed
for stable column widths (with a computed min-width so narrow screens scroll
horizontally instead of collapsing), a fixed row height, sticky thead, and
keyed rows. It also owns sortable headers, deduplicating the Th/cmp/sortVal
helpers that were copy-pasted across four views.

Migrate shared, downloads, search, servers and peers to it. Make the peers
table sortable (default: busiest first) and add a text filter to the
downloads, shared and peers tables, mirroring the search filter via a shared
textMatcher helper.

Fix multi-select so it stays consistent with the active filter: select-all
now acts only on the filtered rows, the selection is pruned to the visible
set when the filter changes (never keeps hidden rows selected), and a
"Selected N" count is shown next to the bulk actions.
@ngosang
ngosang merged commit b807001 into amule-org:master Jul 9, 2026
13 checks passed
@ngosang
ngosang deleted the feat/webui-virtual-tables branch July 9, 2026 07:51
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.

1 participant