When the user opens the DateTimePicker(Time step) or the TimePicker, which are bound to some value, and clicks directly the "Set" button, the pickers don't bind the displayed time value (pre-selected value). This behavior can be seen when the pickers have configured steps (e.g. Minute: "15", Year="10" etc.)
Steps To Reproduce
In <TelerikTimePicker>, how can I enable format in the dropdown for minutes in two digits like 01, 02, 03, 04? Currently, I found these formats for Blazor Timepicker - https://demos.telerik.com/blazor-ui/timepicker/formats. All formats are showing single-digit minutes like 1, 2, 3, and 4.
I want to set the format in the dropdown for minutes to be two digits. Same as here https://demos.telerik.com/aspnet-mvc/timepicker/component-type.
I would like a clockpicker something like screenshot below.
It´s easy and fast to use
The NOW button in the TimePicker's TimeView sets the time value, according to the server's time zone. Instead, it should use the client-side (user) time zone.
===
Telerik edit:
In the meantime, you can subscribe to the TimePicker's ValueChanged event and detect when the user clicks on Now. In such cases, the event handler will receive the current server time with a small margin of error, that depends on the latency.
<TelerikTimePicker Value="@TimePickerValue"
ValueChanged="@( (DateTime? d) => TimePickerValueChanged(d) )">
</TelerikTimePicker>
@code {
private DateTime? TimePickerValue { get; set; }
private void TimePickerValueChanged(DateTime? newValue)
{
if (newValue.HasValue && newValue - DateTime.Now < new TimeSpan(0, 0, 1))
{
// Retrieve and set the correct user's local time. The dummy code below is just for testing.
TimePickerValue = DateTime.Now.AddMinutes(2);
}
else
{
TimePickerValue = newValue;
}
}
}
We are noticing that scrolling and dropping the minutes in the selection box is quite jumpy\jittery. We need to get close and then manually click on the desired minute to select it.
The behavior can be reproduced in the live demo if opened on a mobile device.
Since version 4.0.0, when you initialize a time picker to start with the value of 12:00AM it will display the format instead of the actual value (for example hh:mm:ss AM, where 12:00:00 AM should have been displayed).
When you type the time in the time picker, it changes the date to the current date, while it should change only the time portion.
---
ADMIN EDIT
A workaround is to use the original year, month and date portions of the view-model field and capture the time portion from the ValueChanged event:
@selectedTime?.ToString("F")
<TelerikTimePicker Min="@Min" Max="@Max" Format="hh:mm:ss tt"
Value="@selectedTime" ValueChanged="@( (DateTime? v) => ValueChangedHandler(v) )">
</TelerikTimePicker>
@code {
public DateTime Min = new DateTime(1900, 1, 1, 10, 0, 0);
public DateTime Max = new DateTime(1900, 1, 1, 20, 0, 0);
public DateTime? selectedTime { get; set; } = new DateTime(1900, 1, 1, 12, 0, 0);
void ValueChangedHandler(DateTime? updatedTime)
{
selectedTime = new DateTime(
selectedTime.Value.Year,
selectedTime.Value.Month,
selectedTime.Value.Day,
updatedTime.Value.Hour,
updatedTime.Value.Minute,
updatedTime.Value.Second
);
}
}
---
The "SET" button is not visible when we open it and we are on the middle of the page: the button appears outside of the bottom of the page. So I have to close it, put the field to the top of the page, then open it again.
---
ADMIN EDIT
Some workaround, especially if most of your user base is on the same small form factor, is to use a bit of CSS to change the position of the dropdown to stick to the top of the viewport - this could potentially make it fit into screens as small as about 350x400px.
CSS
/*you can tweak the media query to target only the resolutions you want*/
@media(max-width: 500px) {
.top-aligned {
position: fixed;
top: 0;
left: 50%;
transform: translate(-50%, 0%);
/* you can also try translate(-50%, 50%) for a centered effect which may be better suited for laptop/tablet size */
}
}
Component
Selected time: @selectedTime
<br />
<TelerikDateTimePicker Min="@Min" Max="@Max" @bind-Value="@selectedTime"
Format="dd MMM yyyy HH:mm:ss" Width="250px"
PopupClass="top-aligned">
</TelerikDateTimePicker>
@code {
private DateTime? selectedTime = DateTime.Now;
public DateTime Min = new DateTime(1990, 1, 1, 8, 15, 0);
public DateTime Max = new DateTime(2025, 1, 1, 19, 30, 45);
}
---
The TimePicker scroll wheels are janky and difficult to use on mobile. They tend to jump around while scrolling with touch input.
Is this on the roadmap for improvement? We are working on a project and need to decide whether to roll our own TimePicker in the meantime.
(Note: this is an issue on both client/server side, but I am forced to choose one.)
Hello,
For the most part, I think Telerik has the best library of Blazor controls and my team is happy with it. That said, the Time Picker control in particular falls short in terms of look/feel/user experience to some other libraries. In doing research for a project, most apps are using a clock-based standard. This results in less clicks and is more familiar and intuitive (especially on mobile). We would like to see a clock-based version of the time picker or an option to use this. Material also has a way to combine this with the date picker (to handle date time fields).
Is this (by chance) already in the works? I've included some examples below.
Material example: https://material-ui-pickers.dev/demo/timepicker
MudBlazor example: https://mudblazor.com/components/timepicker#basic-usage
Thanks!
- Joe
On the DateTimePicker, when the "Set" button is clicked, the focus is given to the DateTimePicker field, so when the user clicked outside the component, the OnChange event is fired.
But the behaviour of the TimePicker is different. Indeed, after clicking on the "Set" button the TimePicker field does not get the focus, so the user can't click outside of it to fire the OnChange event.
The following code allows to manually set the focus on each ValueChanged event, but because of it the two-way binding can't be used. This code allows the TimePicker to have the same behaviour than the DateTimePicker :
<TelerikTimePicker @ref="@timepicker" Value="MyDate" OnChange="MyDateChanged"
ValueChanged="@((DateTime d) => { MyDate = d; timepicker.FocusAsync(); })"></TelerikTimePicker>
@code {
private DateTime MyDate { get; set; }
private TelerikTimePicker<DateTime> timepicker;
public void MyDateChanged(object theUserInput)
{
Console.WriteLine("Event OnChange fired");
}
}
---
ADMIN EDIT
Reproducible
1. Go to the TimePicker demo https://demos.telerik.com/blazor-ui/timepicker/overview
2. open the popup
3. set a time with the Set button
**Note**: same goes for the Cancel button
### Current
focus goes somewhere (maybe on the body)
### Expected
focus goes to the input of the time picker
---
The TimePicker OnChange event fires to confirm a complete user action. From this point of view, the Set button in the component's dropdown should fire the event as well.
https://docs.telerik.com/blazor-ui/components/timepicker/eventsWhen setting time from AM/PM vice-versa (after setting hour and minute), the time is reset.
Observed in the demo also;
https://demos.telerik.com/blazor-ui/timepicker/overview
This means that the user needs to set AM/PM first, which doesn't follow, as the AM/PM is the right-most UI element.
---
ADMIN EDIT
This is a configuration setup, and not a bug - see the discussion below on the Min and Max features.
---