| Low | Upstream PR to PrimeVue — fix VirtualScroller + row grouping (3-year-old bug) | PrimeVue 4's DataTable with `groupRowsBy="<field>"` + `rowGroupMode="subheader"` + `virtualScrollerOptions` is broken: when groups are collapsed (only headers visible, no data rows), the VirtualScroller spacer (`.p-datatable-virtualscroller-spacer`) emits a 0 px size and doesn't absorb the unused vertical space. PrimeVue's `.p-datatable-flex-scrollable { flex: 1; height: 100% }` rule combined with `tbody { min-height: 100% }` then forces the few visible rows to stretch to fill the table's `scrollHeight="flex"` container — DVR Finished with a collapsed-group view renders rows at ~145 px each instead of the configured `itemSize: 36`. Symptom: visible flicker + row-height jitter during scroll. **Existing tickets** (all open, no upstream fix after three years): [primevue#4109](https://github.com/primefaces/primevue/issues/4109) (open since 2023-07, 17 reactions, still seen on 4.3.6), [primevue#7339](https://github.com/primefaces/primevue/issues/7339) (open 2025-02), [primevue#6222](https://github.com/primefaces/primevue/issues/6222) (Tailwind preset variant), [primevue#3491](https://github.com/primefaces/primevue/issues/3491) (Expand + VirtualScroll), [primereact#4577](https://github.com/primefaces/primereact/issues/4577) (closed stale), [primereact#5036](https://github.com/primefaces/primereact/issues/5036). Same family of bugs in PrimeNG too. **Workaround we've adopted**: gate `virtualScrollerOptions` to `undefined` when `groupField` is set (DataGrid.vue's `effectiveVirtualScrollerOptions` computed). For EPG Table specifically the bug no longer matters at scale — grouped mode uses stub-rows + per-cluster on-expand fetches so the DOM only ever holds ~100 cluster headers + the events of the currently-expanded clusters, well within unvirtualised render budget. Demoted to Low because the perf hazard is bounded by user behaviour (must expand many large clusters to feel it). For DVR / Channels grouped views (smaller datasets) the workaround is invisible. Filed for the day we either revisit virtual scroll for a specific use case or the upstream lands. **Status 2026-05-18**: precise diagnosis posted as a comment on [primevue#4109](https://github.com/primefaces/primevue/issues/4109#issuecomment-4478388445) — identifies the bug as TWO independent spacer-drift sources (collapsed body rows occupying `items[]` slots without rendering + auto-injected subheader rows rendering without being in `items[]`), supplies a minimal repro on v4.5.5, and proposes two fix directions. Empirically confirmed via isolated spike (`~/primevue-bug-spike/`): a downstream items-reshape fixes Source 1 only — Source 2 (header height 39.75 px vs itemSize 36 px, plus header count not in spacer math) is structural to the subheader render path and not fixable downstream. Spike kept behind `ENABLE_GROUPED_VIRTUAL_SCROLL` flag (currently `false`) in TableView.vue so flipping is trivial the day a fix lands. **Upstream PR submitted**: [primevue#8579](https://github.com/primefaces/primevue/pull/8579) ("Fixed #4109 - DataTable + VirtualScroller spacer drift with rowGroupMode subheader") — adds a `getItemSize(index)` callback to VirtualScroller; DataTable supplies a function that returns `itemSize + measured group-header height` at cluster boundaries and `0` for hidden rows in collapsed clusters. Corrects both drift sources via one mechanism, ~373 LOC additions, 14 new unit specs. State: OPEN, awaiting maintainer review. When merged + we bump PrimeVue, the spike flag flips to `true` and the `effectiveVirtualScrollerOptions` workaround at `DataGrid.vue:1071-1080` can retire. |
0 commit comments