Skip to content

Commit ab5e317

Browse files
authored
kb(Scheduler): Add KB for Timeline scrolling and slot styling (#2809)
1 parent b116c3c commit ab5e317

File tree

1 file changed

+123
-0
lines changed

1 file changed

+123
-0
lines changed
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
---
2+
title: Scroll to a Slot in the Scheduler Timeline View
3+
description: Learn how to scroll to a specific slot in the Timeline View of the Telerik Scheduler for Blazor.
4+
type: how-to
5+
page_title: How to Scroll to a Slot in the Scheduler Timeline View
6+
slug: scheduler-kb-scroll-to-timeline-slot
7+
tags: blazor, scheduler, timeline
8+
ticketid: 1680788
9+
res_type: kb
10+
---
11+
12+
## Environment
13+
14+
<table>
15+
<tbody>
16+
<tr>
17+
<td>Product</td>
18+
<td>Scheduler for Blazor</td>
19+
</tr>
20+
</tbody>
21+
</table>
22+
23+
## Description
24+
25+
This KB article answers the following questions:
26+
27+
* How to focus and highlight the current time slot on load?
28+
* How to auto scroll horizontally the Scheduler Timeline to the current time slot?
29+
* How to style the current time slot in the Scheduler Timeline?
30+
31+
## Solution
32+
33+
1. Set the [Scheduler `View` parameter](slug:scheduler-views-overview) with two-way binding or with a [`ViewChanged` handler](slug:scheduler-events#viewchanged). Thus the app will know which is the current view.
34+
1. Define the [Scheduler `OnCellRender` event](slug:scheduler-events#oncellrender). Set a custom CSS class with `args.Class` if `args.Start` matches the current or desired time.
35+
1. Use the custom CSS class to apply custom styles.
36+
1. Use [`querySelectorAll()`](https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll) and the custom CSS class to find the slot element in the HTML DOM.
37+
1. Use [`scrollIntoView()`](https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView) to scroll to the slot.
38+
39+
>caption Scrolling to a styled Scheduler Timeline slot
40+
41+
````RAZOR
42+
@inject IJSRuntime js
43+
44+
<TelerikScheduler Data="@SchedulerData"
45+
@bind-Date="@SchedulerDate"
46+
@bind-View="@SchedulerView"
47+
OnCellRender="@OnSchedulerCellRender"
48+
Width="80vw"
49+
Height="80vh">
50+
<SchedulerViews>
51+
<SchedulerDayView />
52+
<SchedulerWeekView />
53+
<SchedulerMonthView />
54+
<SchedulerTimelineView />
55+
</SchedulerViews>
56+
</TelerikScheduler>
57+
58+
@* Move JavaScript to separate JS file *@
59+
<script suppress-error="BL9992">
60+
function scrollToSlot() {
61+
var slotsAfterCurrent = document.querySelectorAll(".current-slot + .k-slot-cell");
62+
if (slotsAfterCurrent.length > 0) {
63+
slotsAfterCurrent[slotsAfterCurrent.length - 1].scrollIntoView({ behavior: "smooth" });
64+
}
65+
}
66+
</script>
67+
68+
<style>
69+
.current-slot {
70+
background-color: var(--kendo-color-primary-subtle);
71+
}
72+
</style>
73+
74+
@code {
75+
private List<Appointment> SchedulerData { get; set; } = new();
76+
private DateTime SchedulerDate { get; set; } = DateTime.Today;
77+
78+
private SchedulerView SchedulerView { get; set; } = SchedulerView.Timeline;
79+
80+
private bool ShouldScrollTimeline { get; set; }
81+
82+
private void OnSchedulerCellRender(SchedulerCellRenderEventArgs args)
83+
{
84+
if (SchedulerView == SchedulerView.Timeline && args.Start.Hour == DateTime.Now.Hour)
85+
{
86+
args.Class = "current-slot";
87+
ShouldScrollTimeline = true;
88+
}
89+
}
90+
91+
protected override async Task OnAfterRenderAsync(bool firstRender)
92+
{
93+
if (firstRender || ShouldScrollTimeline)
94+
{
95+
await Task.Delay(1); // Wait for HTML to render
96+
ShouldScrollTimeline = false;
97+
98+
await js.InvokeVoidAsync("scrollToSlot");
99+
}
100+
101+
await base.OnAfterRenderAsync(firstRender);
102+
}
103+
104+
public class Appointment
105+
{
106+
public Guid Id { get; set; }
107+
public string Title { get; set; } = string.Empty;
108+
public DateTime Start { get; set; }
109+
public DateTime End { get; set; }
110+
public bool IsAllDay { get; set; }
111+
public string Description { get; set; } = string.Empty;
112+
113+
public Appointment()
114+
{
115+
Id = Guid.NewGuid();
116+
}
117+
}
118+
}
119+
````
120+
121+
## See Also
122+
123+
* [Scheduler Events](slug:scheduler-events)

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy