diff --git a/RadzenBlazorDemos/Pages/PivotDataGridDynamicDataPage.razor b/RadzenBlazorDemos/Pages/PivotDataGridDynamicDataPage.razor index 769b80b0c..4f2e60f4f 100644 --- a/RadzenBlazorDemos/Pages/PivotDataGridDynamicDataPage.razor +++ b/RadzenBlazorDemos/Pages/PivotDataGridDynamicDataPage.razor @@ -4,8 +4,7 @@ PivotDataGrid dynamic data support - Schema-less datasets are common when data comes from external APIs. This demo shows how to build a pivot table on top of - IDictionary<string, object> records without defining C# models. + Build a Blazor pivot table over schema-less IDictionary<string, object> records from external APIs, configuring pivot fields at runtime without C# models. diff --git a/RadzenBlazorDemos/Pages/PivotDataGridLoadDataPage.razor b/RadzenBlazorDemos/Pages/PivotDataGridLoadDataPage.razor index 8d3618b6e..ae5a440e5 100644 --- a/RadzenBlazorDemos/Pages/PivotDataGridLoadDataPage.razor +++ b/RadzenBlazorDemos/Pages/PivotDataGridLoadDataPage.razor @@ -6,7 +6,7 @@ PivotDataGrid LoadData - The LoadData event allows you to perform custom paging, sorting and filtering. + Bind the Blazor Pivot DataGrid to remote data with the LoadData event, fetching aggregated cross-tab results on demand. diff --git a/RadzenBlazorDemos/Pages/PivotDataGridODataPage.razor b/RadzenBlazorDemos/Pages/PivotDataGridODataPage.razor index 5a2ba068c..7492fd55e 100644 --- a/RadzenBlazorDemos/Pages/PivotDataGridODataPage.razor +++ b/RadzenBlazorDemos/Pages/PivotDataGridODataPage.razor @@ -6,7 +6,7 @@ PivotDataGrid OData - Use the LoadData event to get data from a REST service. + Bind the Blazor Pivot DataGrid to an OData service and build cross-tabulation reports from the remote query. diff --git a/RadzenBlazorDemos/Pages/PivotDataGridPage.razor b/RadzenBlazorDemos/Pages/PivotDataGridPage.razor index d0dbfad73..4f4cec287 100644 --- a/RadzenBlazorDemos/Pages/PivotDataGridPage.razor +++ b/RadzenBlazorDemos/Pages/PivotDataGridPage.razor @@ -6,7 +6,7 @@ Blazor PivotDataGrid - Create cross-tabulation tables for analyzing large datasets with aggregation, drill-down, and grouping. + The Blazor Pivot DataGrid builds cross-tabulation reports - rows, columns, and aggregated values - from your data, with drill-down and grouping. This example demonstrates full pivot table functionality with columns, rows, and aggregates. diff --git a/RadzenBlazorDemos/Services/ExampleService.cs b/RadzenBlazorDemos/Services/ExampleService.cs index 9d0c79443..e5bd8eecf 100644 --- a/RadzenBlazorDemos/Services/ExampleService.cs +++ b/RadzenBlazorDemos/Services/ExampleService.cs @@ -1578,33 +1578,54 @@ namespace RadzenBlazorDemos { Name = "IQueryable", Path = "/pivot-data-grid", - Title = "Blazor Pivot DataGrid - IQueryable | Free UI Components by Radzen", - Description = "The RadzenPivotDataGrid component allows you to create cross-tabulation aggregates from IQueryable.", - Tags = new [] { "pivot", "crosstab", "analysis", "aggregation", "drill-down", "datagrid", "table", "query", "IQueryable" } + Title = "Blazor Pivot Table - Pivot DataGrid (IQueryable) | Free UI Components by Radzen", + Description = "The Blazor Pivot DataGrid (RadzenPivotDataGrid) creates cross-tabulation reports - rows, columns, and aggregated values - from an IQueryable data source.", + Tags = new [] { "pivot", "pivot table", "crosstab", "analysis", "aggregation", "drill-down", "datagrid", "table", "query", "IQueryable" }, + Related = new [] { "pivot-data-grid-load-data", "pivot-data-grid-dynamic", "pivot-data-grid-odata", "datagrid" }, + Faq = new [] + { + new FaqItem { Question = "What is the Blazor Pivot DataGrid?", Answer = "It is a pivot table (cross-tab) component that groups data into rows and columns and shows aggregated values, with drill-down." }, + new FaqItem { Question = "How do I bind the Pivot DataGrid to data?", Answer = "Set Data to an IQueryable (or use the LoadData event for remote data) and define the row, column, and value fields to aggregate." } + } }, new Example { Name = "LoadData", Path = "/pivot-data-grid-load-data", Title = "Blazor Pivot DataGrid - LoadData Binding | Free UI Components by Radzen", - Description = "The RadzenPivotDataGrid component allows you to create cross-tabulation aggregates from IQueryable.", - Tags = new [] { "pivot", "crosstab", "analysis", "aggregation", "drill-down", "datagrid", "table", "query", "IQueryable" } + Description = "Bind the Blazor Pivot DataGrid to remote data with the LoadData event, fetching aggregated cross-tab results on demand.", + Tags = new [] { "pivot", "crosstab", "analysis", "aggregation", "drill-down", "datagrid", "table", "loaddata", "remote" }, + Related = new [] { "pivot-data-grid", "pivot-data-grid-odata", "datagrid-loaddata" }, + Faq = new [] + { + new FaqItem { Question = "How do I load Pivot DataGrid data on demand?", Answer = "Handle the LoadData event to fetch and aggregate data from the server as the grid needs it." } + } }, new Example { Name = "Dynamic data", Path = "/pivot-data-grid-dynamic", Title = "Blazor Pivot DataGrid - Dynamic Data | Free UI Components by Radzen", - Description = "Bind RadzenPivotDataGrid to schema-less IDictionary records and configure fields dynamically.", - Tags = new [] { "pivot", "dynamic", "dictionary", "analysis", "aggregation", "drill-down", "datagrid", "table" } + Description = "Bind the Blazor Pivot DataGrid to schema-less IDictionary records and configure pivot fields dynamically.", + Tags = new [] { "pivot", "dynamic", "dictionary", "analysis", "aggregation", "drill-down", "datagrid", "table" }, + Related = new [] { "pivot-data-grid", "pivot-data-grid-load-data", "datagrid-dynamic" }, + Faq = new [] + { + new FaqItem { Question = "How do I bind the Pivot DataGrid to dynamic data?", Answer = "Bind Data to records of IDictionary and configure the row, column, and value fields at runtime, without a fixed model." } + } }, new Example { Name = "OData", Path = "/pivot-data-grid-odata", Title = "Blazor Pivot DataGrid - OData Binding | Free UI Components by Radzen", - Description = "The RadzenPivotDataGrid component allows you to create cross-tabulation aggregates from IQueryable.", - Tags = new [] { "odata", "pivot", "crosstab", "analysis", "aggregation", "drill-down", "datagrid", "table", "query", "IQueryable" } + Description = "Bind the Blazor Pivot DataGrid to an OData service and build cross-tabulation reports from the remote query.", + Tags = new [] { "odata", "pivot", "crosstab", "analysis", "aggregation", "drill-down", "datagrid", "table", "query", "remote" }, + Related = new [] { "pivot-data-grid", "pivot-data-grid-load-data", "datagrid-odata" }, + Faq = new [] + { + new FaqItem { Question = "How do I bind the Pivot DataGrid to OData?", Answer = "Point the grid at an OData endpoint via the LoadData event; it builds the cross-tabulation from the remote query results." } + } } } }, @@ -4470,6 +4491,13 @@ namespace RadzenBlazorDemos return dataGrid?.Children != null ? CollectLeaves(dataGrid.Children).ToList() : Enumerable.Empty(); } + // Every leaf page under the "PivotDataGrid" category. Article-eligible for schema. + public IEnumerable GetPivotDataGridPages() + { + var pivot = Examples.FirstOrDefault(c => c.Name == "PivotDataGrid"); + return pivot?.Children != null ? CollectLeaves(pivot.Children).ToList() : Enumerable.Empty(); + } + // Maps each Forms page path to its component hub (display label + primary page path). Unlike // charts or DataGrid, Forms has no single landing page; every component (DropDown, Button, ...) // is its own hub. Single-page components hub on themselves; grouped ones (DropDown, HtmlEditor) diff --git a/RadzenBlazorDemos/Services/SeoSchema.cs b/RadzenBlazorDemos/Services/SeoSchema.cs index 2fcc15dbd..01a812003 100644 --- a/RadzenBlazorDemos/Services/SeoSchema.cs +++ b/RadzenBlazorDemos/Services/SeoSchema.cs @@ -79,6 +79,11 @@ namespace RadzenBlazorDemos return ArticleGraph(example, url, exampleService, "DataGrid", "datagrid"); } + if (InCluster(exampleService.GetPivotDataGridPages(), path)) + { + return ArticleGraph(example, url, exampleService, "Pivot DataGrid", "pivot-data-grid"); + } + // Forms has no single hub; each component is its own breadcrumb root. if (path != null && exampleService.GetFormsComponentHubs().TryGetValue(path, out var formsHub)) {