Disconnect the resize observer before disposing the DotNetObjectReference and use async interop in Dispose so a teardown-time exception cannot abort base.Dispose. Also swallow the async rejection from the resize handler's invokeMethodAsync so a post-disposal Resize call no longer surfaces as an uncaught 'no tracked object' error.
RadzenSpiderChart registered a resize observer via Radzen.createResizable
but never tore it down on dispose. After navigation the orphaned observer
invoked Resize on the disposed DotNetObjectReference, throwing
'There is no tracked object with id ...'. Disconnect it in Dispose.
Cleanup was bound only to pointerup, so a drag ending in pointercancel
or a missed pointerup left Radzen drag state and the rz-splitter-mask
permanently active, locking panes and making the bar follow the cursor.
Handle pointercancel and finalize the resize when a pointermove arrives
with no button pressed.
Fixes#2568
Move it above the commercial banner on demo pages and to the
free-to-paid seam on the homepage. Give it a subtle band background,
simplify the copy and solve the Altcha challenge on focus instead of
on every page load.
Element.FocusAsync throws JSException ("Unable to focus an invalid
element") when the change handler navigates away or otherwise removes
the tabs root from the DOM before focus runs. The previous fix only
caught JSDisconnectedException, so the underlying race still surfaced
to users in 10.4.7.
Fixes forum report https://forum.radzen.com/t/radzen-tab-focus-error/21570
They already send X-Robots-Tag: noindex, which keeps them out of search results while staying readable by AI agents. A robots.txt Disallow blocks fetching entirely (so the noindex is never seen) and blocks agents from llms.txt, defeating its purpose.
Follow-up to the #2558 fix. In SelectTab the StateHasChanged call was skipped
if Change/SelectedIndexChanged threw, leaving the component stale (multiple
tabs visually active); in SelectTabOnClient a throw left shouldRender stuck at
false, blocking all further renders. Wrap both in finally so the render state
is always restored. Addresses review feedback on commit df1dfa713.
Fixes#2558
The keydown guard handler added for conditional ESC propagation forced a
StateHasChanged on every keypress within a tab panel, re-rendering the whole
tabs subtree. Suppress the render when the propagation flag is unchanged so
only an actual ESC toggle triggers a render.
Wrap the JS interop calls in SelectTab, SelectTabOnClient and
OnAfterRenderAsync with try/catch (JSDisconnectedException) so a
dropping SignalR circuit no longer throws an uncaught exception and
leaves multiple tabs visually active. Matches the existing pattern
used by RadzenToc/RadzenChart.
Fixes#2558
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The pivot table also has the rz-grid-table class, so the shared
".rz-grid-table tfoot td { position: sticky; z-index: 2 }" rule makes the
scrolling footer value cells tie/beat the frozen footer header (2) and total
(1) cells, so they painted over the frozen columns while scrolling. Raise the
frozen footer cells above the value cells (z-index 4).
Replace the per-cell dynamic-LINQ re-filtering with one grouping pass per row:
items are bucketed by their column leaf and each bucket is aggregated, instead of
rebuilding a parsed Where expression for every (row, column, aggregate) cell. Also
build the column header tree once, cache aggregate property type/IsNumeric, reuse
stored row items for row totals, bucket the page once for column totals, and drop
the O(C^2) IndexOf lookups during render. All pivot math still runs on the
materialized PagedView, so IQueryable/OData/LoadData support is unchanged.
Add IQueryable support tests (cell values, totals/grand total, filter, sort) plus
a test proving the source is enumerated lazily and not re-queried per cell.
Guard the Monaco updateOptions eval against a disposed editor so running
edited code no longer throws when the tab switch removes the editor.
Add worker-src 'self' blob: to the CSP so Monaco's web worker can load.
* Add SortComparer parameter to RadzenDataGridColumn
* Sort DataGrid by column SortComparer for in-memory data
* Test multi-column, default-path, and missing-key SortComparer cases
* Add Custom Sort Comparer DataGrid demo
* Clarify SortComparer docs and harden demo comparer
* Document that a SortComparer column forces multi-column sort in memory
The demos panel menu built href values by concatenating navigationManager.Uri's
raw query onto each Example.Path. When an inbound URL happened to contain a
literal & (from a shared link, search-engine cache, or any earlier
encoding round-trip), Razor's attribute encoder added another layer on every
render, producing /datagrid?theme=dark&amp;amp;...wcag=false in the wild.
Rebuild the suffix from canonical ThemeService state via
QueryStringThemeService.GetUriWithStateQueryParameters, which goes through
NavigationManager.GetUriWithQueryParameters and produces a cleanly URL-encoded
query regardless of what the inbound URL contained. Make the helper public so
the demo can reuse it.
RadzenLinearGaugeScale.razor wrapped its child content in
<CascadingValue Value=@this IsFixed=true>. With IsFixed=true Blazor
freezes the cascading parameter at initialization and does not re-pass
it to child components on subsequent renders. As a result, when the
gauge resizes and RadzenLinearGaugeScale re-renders, Blazor sees no
changed parameters for RadzenLinearGaugeScaleRange (the Scale reference
is the same fixed object; From/To/Fill etc. are unchanged) and skips
its re-render entirely. The range band therefore keeps stale SVG
coordinates and does not respond to any page resize.
Fix: remove IsFixed=true from the CascadingValue, matching the pattern
already used by RadzenRadialGaugeScale.razor. The cascading value now
participates in the normal render cycle so child ranges re-render and
read the updated CurrentStart/CurrentEnd whenever the parent scale
re-renders.
A regression test (LinearGauge_Range_UpdatesOnResize) is added to
verify that the band coordinates change after a Resize() call.
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
The LoadData callback received only OrderBy when the user sorted or
filtered, dropping the structured Sorts and Filters collections
populated by the inner RadzenDataGrid.
Closes#2546