I have a DropDownList where each element has a button to open a TelerikContextMenu as such:
The problem is that sometimes the dropdown is closed and the menu not, like so:
Here is my code:
@namespace Appia.UiKit
@using Telerik.Extensions;
@using Appia.Entidades;
@using static Appia.Tests.Victor.TestWidget;
@inject IViewRepository ViewRepository
<TelerikDropDownList @ref="DropDownRef" TItem="ValueWrapper<string>" TValue="string" Data="ListOfViews" Filterable="true" FilterOperator="@StringFilterOperator.Contains"
FillMode="@ThemeConstants.DropDownList.FillMode.Flat" Class="" Width="min-content" ItemHeight="38"
Value="@ActiveViewId" ValueChanged="OnChange" OnClose="OnClose" AdaptiveMode="@AdaptiveMode.Auto">
<ValueTemplate>@context.Text</ValueTemplate>
<NoDataTemplate>No hay ninguna vista disponible</NoDataTemplate>
<ItemTemplate>
<div class="k-hbox w-100 k-border-bottom k-border-dark" >
<div class="k-flex-grow k-align-self-center">@context.Text</div>
<div @onclick:stopPropagation="true">
<TelerikButton Icon="@(AppiaIcons.Stack)" OnClick="@HandleContextMenuButton" FillMode="@ThemeConstants.Button.FillMode.Flat"></TelerikButton>
</div>
</div>
</ItemTemplate>
<FooterTemplate>
<div class="k-border-t-only" @onclick:stopPropagation="true">
<TelerikButton Icon="@AppiaIcons.Favourite" Class="w-100 k-text-start" FillMode="@ThemeConstants.Button.FillMode.Flat">Establecer como predeterminada</TelerikButton>
<TelerikButton Icon="@AppiaIcons.Compose" Class="w-100 k-text-start" FillMode="@ThemeConstants.Button.FillMode.Flat">Editar vista</TelerikButton>
<TelerikButton Icon="@AppiaIcons.Globe" Class="w-100 k-text-start" FillMode="@ThemeConstants.Button.FillMode.Flat">Renombrar vista</TelerikButton>
<TelerikButton Icon="@AppiaIcons.Duplicate" Class="w-100 k-text-start" FillMode="@ThemeConstants.Button.FillMode.Flat">Duplicar vista</TelerikButton>
</div>
</FooterTemplate>
<DropDownListSettings>
<DropDownListPopupSettings Height="430px" Width="min-content" Class="shadow-5" AnimationDuration="0" />
</DropDownListSettings>
</TelerikDropDownList>
<TelerikContextMenu @ref="@ViewItemMenuRef" Data="@ActionItems"></TelerikContextMenu>
@code {
[Parameter] public ViewInstance ViewInstance { get; set; }
public TelerikContextMenu<ActionItem>? ViewItemMenuRef { get; set; }
public TelerikDropDownList<ValueWrapper<string>, string> DropDownRef { get; set; }
public List<ValueWrapper<string>> ListOfViews { get; set; } = new();
public bool IsCancelled = false;
public string? ActiveViewId;
public List<ActionItem> ActionItems { get; set; } = new()
{
new () { Text = "Activar", Icon = AppiaIcons.Eye },
new () { Text = "Establecer como predeterminada", Icon = AppiaIcons.Favourite },
new () { Text = "Editar", Icon = AppiaIcons.Compose },
new () { Text = "Renombrar", Icon = AppiaIcons.Information },
new () { Text = "Eliminar", Icon = AppiaIcons.Delete },
new () { Text = "Duplicar", Icon = AppiaIcons.Duplicate }
};
protected override async Task OnInitializedAsync()
{
ActiveViewId = this.ViewInstance.ActiveView.Id;
this.ListOfViews = await ViewRepository
.ListAvailableAsync(this.ViewInstance.ActiveView.TipoDeVista, this.ViewInstance.ActiveView.EntityType)
.ThenSelect(x => new ValueWrapper<string>(x.Id, x.Nombre))
.Then( x => x.ToList() );
await base.OnInitializedAsync();
}
public async Task OnRead(DropDownListReadEventArgs args) => await ViewRepository.ListAvailableAsync(ViewInstance.ActiveView.TipoDeVista, ViewInstance.ActiveView.EntityType, async db => await db.ToDataSourceReadEvent(args));
public async Task HandleContextMenuButton( MouseEventArgs args )
{
IsCancelled = true;
await ViewItemMenuRef?.ShowAsync( args.ClientX, args.ClientY );
}
public void OnClose( DropDownListCloseEventArgs args )
{
args.IsCancelled = IsCancelled;
IsCancelled = false;
}
public void Close()
{
IsCancelled = false;
DropDownRef.Close();
IsCancelled = true;
}
public void OnChange( string args )
{
this.ActiveViewId = args;
Close();
}
}
Therefore I need a way to close the menu programaticlly that I will fire when the dropdown list is closed.
I would als like to have listeners on the TelerikContextMenu to know when it's closed, this way I could close the dropdown.
How could I do that?
Thanks
Are there any examples or suggested methods of modifying the way FormAutoGeneratedItems renders? I understand that I can do individual fields with templates - but for the most part we only need a minor tweak (add red * for required fields).
There may be an obvious approach, but I don't yet see it - looking to see if anyone has done anything similar
Hi,
I'm using the TK UI for Blazor Grid.
This is the table:
First Name | Last Name | Height | Position | Points per game |
Stephen | Curry | 191 | Point Guard | 28 |
Klay | Thompson | 201 | Shooting Guard | 21 |
I have created an add new item method which allows me to enter all fields manually. Is there a way in TK to copy e.g the first row and paste it to the open form?
Of course, we have around 50 columns in real world and our Users find it exhausting to manually enter all fields.
Thanks for any hint
Hi All
In order to keep axis labels readable when a chart is resized, one can change the rotation Angle, or simply reduce the # of labels using the Step property. I do have a nifty routine for this,
But, In order to do this my method would have to know the dimensions (e.g. width/heigth in px) of the targeted chart area.
How can I obtain these dimensions?
Regards,
Hans
Hello all,
In my app I use tile layout to let the user manage a bunch of charts and other things. when in "edit mode" I want the headers of the tiles to be displayed, but in "browse" mode I want the headers of the tiles to be invisible as the title of the tile et all is already in the chart displayed in the tiles content.
Using an empty <HeaderTemplate> I still get an empty one line header for each tile.
Is there a way around this,? Otherwise, please see this as a FR.
Regards,
Hans
I have a datepicker on my page and on load I want to set its initial value to a date I get from a DB table.
I also want the user to be able to pick a date to set it to and it auto updates the page objects base don that new picked date.
I have the auto refresh working on the OnChange event but for some reason I cant set the objects first initial date!
REPL:
//want to do something like:
DTR11.value = DTR11_selectedDate;
I only want my users to be able to add one level of groups to their filters.
For example:
Color = blue
AND
(
height > 3
OR
height < 1
)
OR
foo = bar
I don't want them to add sub-groups to groups (adding an AND group inside of the height block in the above). Is there a way to prevent that from happening in the control?
Hi all,
I want to remove the word "Sum", and only keep the number at the footer of the Excel file when I export data from the grid as pictures below. Is there anyone know? Please help me.
Thank you
I have two Telerik Grid (Summary & Detail Grid). Detail Grid also have child rows. I need to export to excel for both the grid together in a single file with keeping all the formatting (filtering, freezing, sorting etc). Please provide the solution for this implementation with proper example.
My goal is to have a multi column combo box such that the list changes as the user types in the combo box (by hitting an API) and then when the user clicks one of the items in the drop down I'd like to show the value from one of the columns. I've gotten the first part working but the issue arises when the user clicks on an item.
With the code below what I'm observing is that when the user types in the combo box, the ValueChanged handler fires and gets sent the text the user has typed which allows me to call the API with that value. The drop down displays the data as I expect. So far so good. Then when the user clicks on an item in the drop down, the ValueChanged handler fires not with the text but with the Id from my model since the ValueField is set to the Id. But I'm also getting an invalid cast error in the browser console. If I change the ValueField to a string, say OrderNumber, the ValueChanged and OnChange handlers fire with the OrderNumber value and I no longer get the error, but the problem is that OrderNumber is not unique so I can't find the distinct item in the collection. So the question is, how do I send the typed text into the ValueChanged handler and send the Id into the OnChange handler? Thanks in advance for your help.
<TelerikMultiColumnComboBox Data="_orders"
AllowCustom="true"
Value="_selectedOrder"
ValueExpression="(() => _selectedOrder)"
ValueChanged="@(async (string order) => await OrderValueChangedAsync(order))"
OnChange="OrderChangedHandler"
ValueField="@nameof(OrderDto.Id)"
TextField="@nameof(OrderDto.OrderNumber)">
<MultiColumnComboBoxColumns>
<MultiColumnComboBoxColumn Field="@nameof(OrderDto.Source)" Title="Source"></MultiColumnComboBoxColumn>
<MultiColumnComboBoxColumn Field="@nameof(OrderDto.DeliverOn)" Title="Deliver On"></MultiColumnComboBoxColumn>
<MultiColumnComboBoxColumn Field="@nameof(OrderDto.OrderNumber)" Title="Order Number"></MultiColumnComboBoxColumn>
<MultiColumnComboBoxColumn Field="@nameof(OrderDto.Suffix)" Title="Suffix"></MultiColumnComboBoxColumn>
</MultiColumnComboBoxColumns>
<MultiColumnComboBoxSettings>
<MultiColumnComboBoxPopupSettings Width="600px" />
</MultiColumnComboBoxSettings>
</TelerikMultiColumnComboBox>
private string _selectedOrder;
private async Task OrderValueChangedAsync(string orderNumber)
{
try
{
Console.WriteLine($"ValueChanged fired with value {orderNumber}");
if (orderNumber == null || orderNumber.Length < 5)
{
_orders = new(); // Don't load orders until the user has typed in at least 4 characters so we don't bring back too many orders
return;
}
if (_activity.Type == "C")
{
_orders = await APIService.CallAPIAsync<List<OrderDto>>($"RMOActivity/GetSalesOrders?orgCode={AppState.SelectedDivision.OrgCode}&orderNumber={orderNumber}", null, HttpMethod.Get);
}
else
{
_orders = await APIService.CallAPIAsync<List<OrderDto>>($"RMOActivity/GetPurchaseOrders?orgCode={AppState.SelectedDivision.OrgCode}&purchaseOrderNumber={orderNumber}", null, HttpMethod.Get);
}
}
catch (Exception e)
{
LogError("Error loading orders", e);
}
finally
{
Console.WriteLine($"ValueChanged finished with value {orderNumber}");
}
}
private void OrderChangedHandler(object order)
{
try
{
Console.WriteLine($"OnChange fired with value {(order == null ? "null" : order.ToString())}");
if (order != null)
{
_selectedOrder = (string)order;
}
Console.WriteLine($"OnChange finished with value {(order == null ? "null" : order.ToString())}");
}
catch (Exception e)
{
LogError("Error loading order", e);
}
}
public class OrderDto
{
public int Id { get; set; }
public string Source { get; set; }
public DateOnly? DeliverOn { get; set; }
public string OrderNumber { get; set; }
public string Suffix { get; set; }
public string CustomerOrVendorNumber { get; set; }
public string ShipToOrVendorCode { get; set; }
}