(bug report only)
Run the following examples and click the Export button to export the Diagram:
https://blazorrepl.telerik.com/wUutGREi32uWDUbR56
https://blazorrepl.telerik.com/GgODmnEj48uNeygS34
(optional)
The generated PDF document contains only one page and some of the Diagram shapes are not exported.
The generated PDF document contains multiple pages and all the Diagram shapes are exported.
The DropDownList is supposed to open the popup element when Alt-Down is pressed. This doesn't work if the page itself scrolls. Pressing alt-down scrolls the page instead. This is on macOS Safari and Chrome on a MacBook.
https://demos.telerik.com/blazor-ui/dropdownlist/keyboard-navigation
The data order displayed in the PivotGrid does not follow the field order shown in the Rows configuration. Similar issue: #12989
Run the example posted below:
From the Fields list, check ContractNumber. It is added to the Columns section by default.
Drag ContractNumber from Columns to the Rows section.
Verify in the PivotGrid settings that the Rows area now shows:
View the data the table.
@using Telerik.Blazor.Components.PivotGrid
<TelerikButton OnClick="@OnRefresh">Refresh</TelerikButton>
<TelerikLoaderContainer Visible="@_isLoading" Text="Please wait..." />
<div class="pivot-main-container">
<TelerikPivotGridContainer>
<TelerikPivotGridConfiguratorButton></TelerikPivotGridConfiguratorButton>
<TelerikPivotGridConfigurator></TelerikPivotGridConfigurator>
<div class="pivot-grid-container">
<TelerikPivotGrid Data="@PivotData" DataProviderType="@PivotGridDataProviderType.Local"
@ref="_PivotGridRef" ColumnHeadersWidth="100px" RowHeadersWidth="130px">
<ColumnHeaderTemplate>
@{
var ctx = (PivotGridColumnHeaderTemplateContext)context;
int underscoreIndex = ctx.Text.IndexOf("-");
string text = ctx.Text;
if (underscoreIndex > 0)
{
text = text.Replace(text.Substring(0, underscoreIndex + 1), "");
<span>@text</span>
}
else
{
<span>@ctx.Text</span>
}
}
</ColumnHeaderTemplate>
<RowHeaderTemplate>
@{
var ctx = (PivotGridRowHeaderTemplateContext)context;
int underscoreIndex = ctx.Text.IndexOf("-");
if (underscoreIndex == 1)
{
string text = ctx.Text;
text = text.Replace(text.Substring(0, underscoreIndex + 1), "");
<span>@text</span>
}
else
{
<span>@ctx.Text</span>
}
}
</RowHeaderTemplate>
<DataCellTemplate Context="dataCellContext">
@{
var c = (PivotGridDataCellTemplateContext)dataCellContext;
string amt;
if (c.Value is AggregateException || c.Value?.GetType().Name == "AggregateError")
{
amt = "-";
}
else if (c.Value == null)
{
amt = (0m).ToString("C2");
}
else if (c.Value is IConvertible)
{
// Safe convert for numbers
amt = Convert.ToDecimal(c.Value).ToString("C2");
}
else
{
amt = c.Value?.ToString() ?? string.Empty;
}
}
<div style="text-align: right;">
@amt
</div>
</DataCellTemplate>
<PivotGridRows>
<PivotGridRow Name="@nameof(RptContractSalesSummaryModel.Station)" Title="Station" />
</PivotGridRows>
<PivotGridColumns>
<PivotGridColumn Name="@nameof(RptContractSalesSummaryModel.Year)" Title="Year" HeaderClass="year-header" />
<PivotGridColumn Name="@nameof(RptContractSalesSummaryModel.Month)" Title="Month" />
</PivotGridColumns>
<PivotGridMeasures>
<PivotGridMeasure Name="@nameof(RptContractSalesSummaryModel.Rate)" Title="Total"
Aggregate="@PivotGridAggregateType.Sum" />
</PivotGridMeasures>
</TelerikPivotGrid>
</div>
</TelerikPivotGridContainer>
</div>
@code
{
private List<RptContractSalesSummaryModel> PivotData { get; set; } = [];
public TelerikNotification NotificationReference { get; set; } = default!;
public TelerikPivotGrid<RptContractSalesSummaryModel> _PivotGridRef { get; set; } = default!;
private CancellationTokenSource cancelToken = new CancellationTokenSource();
private bool _isDisposed { get; set; } = default!;
private bool _isLoading { get; set; } = default!;
protected override async Task OnInitializedAsync()
{
await LoadReportData(cancelToken.Token);
await base.OnInitializedAsync();
}
private async Task LoadReportData(CancellationToken token)
{
_isLoading = true;
await Task.Delay(1000);
var dataItemCount = 10000;
var stationCount = 30;
var rnd = Random.Shared;
for (int i = 1; i <= dataItemCount; i++)
{
var stationNumber = rnd.Next(1, stationCount);
if (token.IsCancellationRequested || _isDisposed) { return; }
;
PivotData.Add(new RptContractSalesSummaryModel()
{
Station = $"Station {stationNumber}",
ContractMonth = DateTime.Today.AddMonths(-rnd.Next(0, 13)),
Rate = rnd.Next(123, 987) * 1.23m,
ContractNumber = i,
InternetOrderID = i * 10
});
}
PivotData = PivotData
.OrderBy(x => x.Station)
.ThenBy(x => x.Year)
.ThenBy(x => x.Month).ToList();
if (_PivotGridRef != null && !_isDisposed)
{
_PivotGridRef?.Rebind();
}
_isLoading = false;
}
public async Task OnRefresh()
{
await LoadReportData(cancelToken.Token);
await Task.CompletedTask;
}
public async ValueTask DisposeAsync()
{
PivotData = [];
await Task.CompletedTask;
}
public class RptContractSalesSummaryModel
{
public DateTime ContractMonth { get; set; }
public int Year => ContractMonth.Year;
public string Month => $"{MapMonthToLetter(ContractMonth.Month)}-{ContractMonth:MMMM}";
public string Station { get; set; } = string.Empty;
public string? SalesPerson { get; set; }
public string? AdvertiserName { get; set; }
public string? AgencyName { get; set; }
public string? Product_Description { get; set; }
public string? Brand { get; set; }
public string AccountType1 { get; set; } = string.Empty;
public string AccountType2 { get; set; } = string.Empty;
public decimal? Rate { get; set; }
//public int? RptUserKey { get; set; }
public string? Demographics { get; set; }
public string? OrderType { get; set; }
public string? SalesOffice { get; set; }
public int? ContractNumber { get; set; }
public string? SectionLevel { get; set; }
public string? AgencyGroup { get; set; }
public string? AdvertiserGroup { get; set; }
public string? ProductGroup { get; set; }
public string? LineNumber { get; set; }
public string? RevenueClassDescription { get; set; }
public string? InternetIntegrationType { get; set; }
public string? LineType { get; set; }
public string? RateType { get; set; }
public string? InternetAdType { get; set; }
public string? InternetSubAdType { get; set; }
public DateTime? LineStartDate { get; set; }
public DateTime? LineEndDate { get; set; }
public long? InternetOrderID { get; set; }
public DateTime? InitialDelivery { get; set; }
public string? QuantityType { get; set; }
public long? QuantityOrdered { get; set; }
public long? ImpressionsDelivered { get; set; }
public long? ClicksDelivered { get; set; }
public long? Goal { get; set; }
public string? Limit { get; set; }
public string? BillingType { get; set; }
public decimal? DeliveredRevenue { get; set; }
public string? PerformanceStatus { get; set; }
public DateTime? LastSuccessfulJobRun { get; set; }
public string? InternetEnvironment { get; set; }
public string? UserField1 { get; set; }
public string? ExternalID { get; set; }
// to sort the months correctly in the pivot grid
private static string MapMonthToLetter(int month)
{
return month switch
{
1 => "A",
2 => "B",
3 => "C",
4 => "D",
5 => "E",
6 => "F",
7 => "G",
8 => "H",
9 => "I",
10 => "J",
11 => "K",
12 => "L",
_ => "?"
};
}
}
}
The data order displayed in the PivotGrid does not follow the field order shown in the Rows configuration.
The rendered PivotGrid data should strictly follow the order of fields as defined in the Rows (or Columns) area settings.
All
No response
===
ADMIN EDIT
===
For the time being, a possible option is to use the DropDownList component that exposes such events. Customize it so it can look and behave similarly to the DropDownButton.
Example implementation: https://blazorrepl.telerik.com/mekbkTPE21kwyMBU05.
I am using the InsertHTML command to insert some HTML content. However, it looks like it inserts only the first element from the value I am providing.
==========
ADMIN EDIT
==========
Workaround: you can wrap the HTML content you want to insert in a container, so the InsertHTML command reads it as one element. The following sample demonstrates how to achieve that.
@using Telerik.Blazor.Components.Editor
<TelerikButton OnClick="@( () => WindowIsVisible = !WindowIsVisible )">Insert Html</TelerikButton>
<TelerikEditor @ref="@TheEditor" @bind-Value="@TheContent"></TelerikEditor>
<TelerikWindow @bind-Visible="@WindowIsVisible">
<WindowTitle>
<strong>Insert Html</strong>
</WindowTitle>
<WindowContent>
<TelerikTextArea @bind-Value="@HtmlToInsert"></TelerikTextArea>
<TelerikButton OnClick="@InsertHtml">Insert</TelerikButton>
</WindowContent>
</TelerikWindow>
@code{
public string HtmlToInsert { get; set; }
bool WindowIsVisible { get; set; }
TelerikEditor TheEditor { get; set; }
string TheContent { get; set; } = "<p>Lorem ipsum.</p><p>Dolor sit amet.</p>";
async Task InsertHtml()
{
await TheEditor.ExecuteAsync(new HtmlCommandArgs("insertHtml", $"<div>{HtmlToInsert}</div>"));
WindowIsVisible = !WindowIsVisible;
HtmlToInsert = "";
}
}
Hello,
When a Grid is using multi column headers, and I add one more column in the OnBeforeExport event, this new column has no title in the exported file.
A possible workaround might be to use a column with zero Width and change the width in OnBeforeExport.
@using Telerik.Blazor.Common.Export.Excel
@using Telerik.Blazor.Components.Grid
<TelerikGrid TItem="@FlowRun"
Pageable="true"
OnRead="@GetData">
<GridToolBar>
<GridCommandButton Command="ExcelExport" Icon="file-excel">Export to Excel</GridCommandButton>
<GridCommandButton Command="CsvExport" Icon="file-csv">Export to CSV</GridCommandButton>
<label class="k-checkbox-label"><TelerikCheckBox @bind-Value="@ExportAllPages" />Export All Pages</label>
</GridToolBar>
<GridExport>
<GridExcelExport FileName="telerik-grid-export" AllPages="@ExportAllPages" OnBeforeExport="@BeforeExcelExport" />
<GridCsvExport FileName="telerik-grid-export" AllPages="@ExportAllPages" OnBeforeExport="@BeforeCsvExport" />
</GridExport>
<GridColumns>
<GridColumn Field="@nameof(FlowRun.FileName)" Title="File Name" Width="300px" />
<GridColumn Field="@nameof(FlowRun.Type)" Title="Type" Width="100px" />
<GridColumn Field="@nameof(FlowRun.FileSize)" Title="File Size" Width="200px" />
<GridColumn Title="Source">
<Columns>
<GridColumn Field="@(nameof(FlowRun.Source))" Title="MPID"/>
<GridColumn Field="@(nameof(FlowRun.SourceFileProtocol))" Title="Type" />
</Columns>
</GridColumn>
<GridColumn Field="@nameof(FlowRun.ErrorMessage)"
Title = "Error"
Width="0" />
</GridColumns>
</TelerikGrid>
@code {
bool ExportAllPages { get; set; }
private async Task GetData(GridReadEventArgs args)
{
args.Data = Enumerable.Range(1, 10).Select(x => new FlowRun
{
FileName = $"File {x}",
Type = $"Type {x}",
FileSize = x * 2,
Source = $"Source {x}",
SourceFileProtocol = FileProtocol.CIX,
ErrorMessage = $"Error {x}"
}).ToList();
args.Total = 100;
}
private void BeforeCsvExport(GridBeforeCsvExportEventArgs obj)
{
AddErrorMessageColumn(obj);
}
private void BeforeExcelExport(GridBeforeExcelExportEventArgs obj)
{
AddErrorMessageColumn(obj);
}
private void AddErrorMessageColumn(GridBeforeSpreadsheetExportEventArgs args)
{
args.Columns.Find(x => x.Field == nameof(FlowRun.ErrorMessage)).Width = "100px";
//args.Columns.Add(new ExcelExportableColumn
//{
// Field = nameof(FlowRun.ErrorMessage),
// Title = "Error"
//});
}
public class FlowRun
{
public string FileName { get; set; }
public string Type { get; set; }
public long? FileSize { get; set; }
public string Source { get; set; }
public FileProtocol SourceFileProtocol { get; set; }
public string ErrorMessage { get; set; }
}
public enum FileProtocol
{
Unknown,
PIX,
CIX,
SS
}
}
I have a Telerik Pager within a Telerik Grid. If I select a larger page size within the pager, then select a smaller size and do not scroll, the next time I open the pager, the dropdown portion opens in the wrong place. When I view the inspect tool, it appears that the CSS top value is not being updated when changing page sizes from bigger to smaller. Is this a Telerik limitation with the pager?
In the images, we select items per page from 10 to 25, and then we go immediately from 25 to 10 items per page. Without scrolling, we click into the drop down list again and we are able to replicate this issue.
Before: Items per page: 10 -> 25
After:
Thank you in advance.
When the Grid is grouped and aggregate functions are enabled, paging performance degrades significantly because grouping and aggregate calculations are executed on every page change. This results in noticeable delays and UI stutter, especially in WebAssembly applications and larger datasets.
This enhancement optimizes page navigation for grouped Grid scenarios with aggregates by avoiding repeated processing when the underlying data has not changed, resulting in substantially faster paging performance while preserving existing functionality and first-load behavior.
The Editor converts new lines in the HTML content to empty paragraphs if the Value is set after the component is initialized and rendered.
Here is a test page with the possible workarounds. The app can either display the Editor after its Value becomes available, or strip the new lines before setting the component Value.
(bug report only)
Reproducible in the demos: https://demos.telerik.com/blazor-ui/dropdowntree/overview
(optional)
For a brief moment the filter input in the dropdown appears focused, but then the focus moves to the first item in the list. If the user clicks the “down arrow” icon to open the dropdown, the filter input is focused as expected.
The filter input is focused regardless where in the component the user clicks.
(Also applies to AutoComplete, DropDownList, MultiSelect, MultiColumnComboBox).
When using Height="auto" in the popup settings and filtering with a dropdown above the component, the dropdown detaches from the main component.
<ComboBoxPopupSettings Height="auto"></ComboBoxPopupSettings>https://blazorrepl.telerik.com/cKkSQGFO50ovCpr829
A possible workaround is to use a MaxHeight that is less than half the browser viewport.
<ComboBoxPopupSettings Height="auto" MaxHeight="45vh"></ComboBoxPopupSettings>
Once a user has clicked an appointment to select it, I'd like the ability to clear this selection. For example, if you show one set of appointments, then click a radio button on the page to switch to a different set of appointments, I'd like to clear the selection so that no appointment is selected. The way it works now, the component appears to store the index of the selected appointment and then re-apply that when it's rendered with new appointments.
More context here: https://www.telerik.com/forums/how-to-clear-the-selected-slot-in-the-scheduler
Steps to reproduce
Reproducible with UI for Blazor, as well as UI for ASP.NET Core (PDF.js and DPL processing)
Actual Behavior
The content is visualized distorted, large parts of it are missing, layout is messed up.
Expected Behavior
The document content is visualized properly, as it is with: https://mozilla.github.io/pdf.js/web/viewer.html