Unplanned
Last Updated: 02 Aug 2021 13:31 by ADMIN
Created by: Sherrie
Comments: 0
Category: Scheduler
Type: Feature Request
10
Please add support for Editor Template, so I can customize the default appointment editors.
Unplanned
Last Updated: 02 Aug 2021 13:25 by ADMIN
Created by: Sherrie
Comments: 0
Category: Scheduler
Type: Feature Request
5
Please add Work Week View for the Scheduler.
Completed
Last Updated: 14 Nov 2024 09:26 by ADMIN
Release 7.0.0
Created by: Sherrie
Comments: 0
Category: Scheduler
Type: Feature Request
24
Please add support for Toolbar Template, so I can control what is rendered in the Scheduler Toolbar.
Unplanned
Last Updated: 24 Jul 2021 09:07 by ADMIN

The following date in the Scheduler RecurrenceRule cannot be parsed and is ignored:

RecurrenceRule = "FREQ=DAILY;UNTIL=20210722T000000"

According to the RFC5545 specification, this should be a valid date format.

These formats will work:

RecurrenceRule = "FREQ=DAILY;UNTIL=2021-07-22T00:00:00"
RecurrenceRule = "FREQ=DAILY;UNTIL=2021-07-22T00:00:00.000Z"

 

EDIT:

This is my work-around. It captures the date portion of the UNTIL clause, converts it into the date string style that Telerik can understand, then reassembles the rule string

private string TransformRecurrenceRule()
        {
            const string untilSeparator = "UNTIL=";
            var ruleParts = RecurrenceRule.Split(untilSeparator, StringSplitOptions.RemoveEmptyEntries);
            if (ruleParts.Length <= 1)
            {
                // There was no Until clause to worry about
                return RecurrenceRule;
            }

            // Save the first part of the rule
            var ruleBeginning = ruleParts[0];

            // Split the date part of the until clause from any following clauses
            var remainingClauses = ruleParts[1].Split(';', 2, StringSplitOptions.RemoveEmptyEntries);

            //Save the date part of the until clause
            var untilDate = remainingClauses[0];

            // Save any following clauses with the `;` replaced
            var ruleEnding = "";
            if (remainingClauses.Length == 2)
            {
                ruleEnding = $";{remainingClauses[1]}";

            }

            // Convert the until date into .net parsable format
            const string format = "yyyyMMddTHHmmss";
            var date = DateTime.ParseExact(untilDate, format, CultureInfo.InvariantCulture);
            var dateStr = date.ToString("yyyy-MM-ddTHH:mm:ss");

            // recombine rule components
            var newRuleParts = new[] {ruleBeginning, untilSeparator, dateStr, ruleEnding};
            var newRule = string.Join("",newRuleParts);

            return newRule;
        }

Unplanned
Last Updated: 27 Jan 2023 21:12 by Michael
Created by: Thomas Schicker
Comments: 3
Category: Scheduler
Type: Feature Request
9

If the Scheduler is placed in a parent container (for example Telerik Splitter or any other container) its appointments are not resized when resizing the pane. The Scheduler itself resizes accordingly, but the appointments don't.

If the Scheduler is used as a standalone component, the appointments are properly resized and repositionŠµd on browser resize.
Completed
Last Updated: 16 Oct 2023 22:27 by Paul
Release 3.7.0 (09 Nov 2022)
I need some help with my question about how to know what grouping resource was clicked on. I'm using a custom editing screen that is triggered when the OnEdit event fires. I can't figure out how to get resource ID when the event fires. How do I get the resource group information on an event that fires with IsNew=true?
Completed
Last Updated: 18 Apr 2024 13:19 by ADMIN
Release 2024 Q2 (May)
The month view only shows two events per day. I would like to be able to show more, either by increasing the height of the cell or by creating columns within the cell.
Completed
Last Updated: 27 Oct 2021 08:49 by ADMIN
Release 2.28.0
When you try to group by resource with a type different of string (long, int, etc.), an "Error: System.ArgumentException: Arg_ObjObjEx" appears.
Completed
Last Updated: 17 Dec 2021 10:59 by ADMIN
Release 3.0.0
Created by: Edwin
Comments: 4
Category: Scheduler
Type: Bug Report
3

I have located an issue with the scheduler in Firefox

It currently is not possible to edit an appointment in Firefox when visiting the following demo page:

https://demos.telerik.com/blazor-ui/scheduler/appointment-editing

Edge and Chrome work as expected.

I noticed this issue in my local project and referred to the demo's to see if I was doing something stupid :-).

I am assuming that the demo's are running in .net 5 and that the demo's are blazor server applications.

Unplanned
Last Updated: 15 Mar 2022 16:26 by Lewis

I have a scheduler, and am using a custom Edit handler. I need to support recurrence, and editing recurring events. When the use double-clicks on a recurring event, there is a dialog that asks whether they would like to edit the occurrence or the entire series.

I want to be able to capture the results of this dialog. `SchedulerEditEventArgs` doesn't include any attributes that track this.

 

===========

ADMIN EDIT

===========

The implementation of this enhancement could be covered by either including the corresponding attributes in the SchedulerEditEventArgs or by exposing a Template for the RecurrenceDialog.

Note: You may also check the Ability to directly edit an occurence or the series, without the prompt asking you to choose feature request as the implementation of both features will most likely be covered in one release.

Completed
Last Updated: 07 Nov 2022 12:58 by ADMIN
Release 3.7.0 (09 Nov 2022)
Created by: Paul
Comments: 0
Category: Scheduler
Type: Feature Request
12
I would like to have an OnRenderCell event for the Scheduler, so I can conditionally add color and text to the cells.
Unplanned
Last Updated: 25 May 2021 09:13 by ADMIN
Created by: Marco
Comments: 3
Category: Scheduler
Type: Bug Report
1

That's pretty weird but nevertheless very specific: if the Scheduler is loaded with POCO objects from EntityFramework with LazyLoading enabled (Castle.Proxies objects) them the k-event-drag-hint box is not shown (!)

 

It took me some time to figure it out...
Completed
Last Updated: 14 Nov 2024 09:28 by ADMIN
Release 7.0.0
Created by: Greg
Comments: 7
Category: Scheduler
Type: Feature Request
15

Other schedule controls have an 'agenda' view that has a chronological list of appointments back to back stacked vertically colored by resource.

It would be great for the telerik scheduler to have a view like this.

 

Unplanned
Last Updated: 24 Mar 2021 16:30 by ADMIN
Created by: Samuel
Comments: 0
Category: Scheduler
Type: Feature Request
6

is it possible to drag between hours to create a new appointment like in the attached recording? 

 

Unplanned
Last Updated: 08 Mar 2021 08:06 by ADMIN
Created by: Wes
Comments: 0
Category: Scheduler
Type: Feature Request
2

I don't want to allow reoccurring appointments.  Is there a way to hide the reoccurring part of the editor so they can't create one?  I think a simple way to shut off reoccurring appointments on the entire scheduler would be great.

---

ADMIN EDIT

At the moment, a custom edit form is the only option: https://github.com/telerik/blazor-ui/tree/master/scheduler/custom-edit-form

---

Unplanned
Last Updated: 08 Mar 2021 08:04 by ADMIN
Created by: Wes
Comments: 0
Category: Scheduler
Type: Feature Request
1

I am using resources in the scheduler and I need to require the user to select a resource from the list when adding an appointment. Maybe a "Required" option when you declare the resource?

---

ADMIN EDIT

At the moment, a custom edit form is the only option: https://github.com/telerik/blazor-ui/tree/master/scheduler/custom-edit-form

If you need to add resources only in one mode (edit or insert), please provide an example of how you would expect that to be controller through data annotations since they would be in effect in both modes if used.

---

Unplanned
Last Updated: 03 Mar 2021 11:36 by ADMIN
Created by: Saad
Comments: 0
Category: Scheduler
Type: Feature Request
5

I could have a case where the work week starts on Sunday and ends on Thursday, and I want to be able to denote this in the scheduler.

---

ADMIN EDIT

For the time being, you can consider two options (separately or together):

  • use the Multi-day view to make only the desired days visible in the scheduler (its NumberOfDays parameter combined with the scheduler's Date parameter control the start date and how many days will render)
  • use CSS like this to remove the darker coloring for non-working slots so that there isn't a visual distinction that is wrong:
        div.k-scheduler .k-scheduler-nonwork,
        div.k-scheduler .k-nonwork-hour {
            background-color: inherit;
        }

 

---

Completed
Last Updated: 10 Sep 2021 12:58 by ADMIN
Release 2.27.0
Created by: Rob
Comments: 3
Category: Scheduler
Type: Feature Request
2

A context menu event similar to the grid context menu would be useful for editing functions like cut/copy and paste.

---

ADMIN EDIT

You can use the item template to integrate context menus in the scheduler: https://github.com/telerik/blazor-ui/tree/master/scheduler/appointment-context-menu. This also allows you a lot of other customization options like adding tooltips and changing the appearance/information users see at first glance.

For a context menu on the slots - probably this item will expose a template for them so the same approach would apply.

---

Unplanned
Last Updated: 24 Oct 2024 12:32 by ADMIN

I'm in the same situation as the OP in this post: https://www.telerik.com/forums/how-do-you-always-edit-series-when-editing-a-recurring-appointment


In my case, I'm working with with the Blazor Scheduler Component. How can I disable the prompt and automatically select "Edit the series"? Or at least "disable" the "Edit this occurrence" button when updating/deleting an appointment? 

---

ADMIN EDIT

Note: You may also check the Differentiate "edit current occurrence" and "edit the series" in the RecurrenceDialog feature request as the implementation of both features will most likely be covered in one release.

Please comment with suggestions on how you would like to see this feature exposed. Ideally it might have to be dynamic so you can toggle it based on conditions, so perhaps it could be a parameter (not flexible), an event argument to OnEdit, or a separate event/setting.

Here is a sample code you can try to achieve this - comments in the code explain how the templates are used to capture the edit action and some JS is used to fake-click the button to simulate a user choice:

 

@inject IJSRuntime _jsInterop
@* this errors suppression is a hack to make this sample succinct
    move this script to a proper place for a real app*@
<script suppress-error="BL9992">
    function clickSchedulerPromptButton(btnIndex) {
        setTimeout(function () {
            var buttons = document.querySelectorAll(".k-window-content .text-right button");
            if (buttons && buttons.length >= btnIndex) {
                var chosenButton = buttons[btnIndex];
                chosenButton.click();
            }
        }, 50);
    }
</script>

@* appearance setting for the template - make the custom template tall as the appointment to capture all clicks *@
<style>
    .tallAppt {
        height: 100%;
    }
</style>

<TelerikScheduler Data="@Appointments"
                  OnUpdate="@UpdateAppointment"
                  OnCreate="@AddAppointment"
                  OnDelete="@DeleteAppointment"
                  AllowCreate="true" AllowDelete="true" AllowUpdate="true"
                  @bind-Date="@StartDate" Height="600px" @bind-View="@CurrView">
    <ItemTemplate>
        @{
            SchedulerAppointment appt = context as SchedulerAppointment;
        }
        <div title="@appt.Start - @appt.End" class="tallAppt" @ondblclick="@( () => ChooseEditMode(appt) )"><div class="k-event-template">@appt.Title</div></div>
    </ItemTemplate>
    <AllDayItemTemplate>
        @{
            SchedulerAppointment appt = context as SchedulerAppointment;
        }
        <div title="@appt.Start.ToShortDateString() - @appt.Title" class="tallAppt" @ondblclick="@( () => ChooseEditMode(appt) )"><div class="k-event-template">@appt.Title</div></div>
    </AllDayItemTemplate>
    <SchedulerViews>
        <SchedulerDayView StartTime="@DayStart" />
        <SchedulerWeekView StartTime="@DayStart" />
        <SchedulerMultiDayView StartTime="@DayStart" NumberOfDays="10" />
    </SchedulerViews>
</TelerikScheduler>

@code {
    //async void so we don't block the execution
    //we will have a small timeout in the script to let it wait for the popup
    async void ChooseEditMode(SchedulerAppointment appt)
    {
        // check if we have a recurring appointment or a member of one
        if (appt.RecurrenceId != null || !string.IsNullOrEmpty(appt.RecurrenceRule))
        {
            int btnIndexToClick = 0;//the first button - edit instance
                                    // make it 1 for the second button - the series

            await _jsInterop.InvokeVoidAsync("clickSchedulerPromptButton", btnIndexToClick);
        }

    }

    //the rest is sample data and sample CUD operations handling



    // sample data and scheduler settings
    public SchedulerView CurrView { get; set; } = SchedulerView.Week;
    public DateTime StartDate { get; set; } = new DateTime(2019, 12, 2);
    public DateTime DayStart { get; set; } = new DateTime(2000, 1, 1, 8, 0, 0); //the time portion is important

    List<SchedulerAppointment> Appointments { get; set; }

    async Task UpdateAppointment(SchedulerUpdateEventArgs args)
    {
        SchedulerAppointment item = (SchedulerAppointment)args.Item;

        await MyService.Update(item);
        await GetSchedulerData();
    }

    async Task AddAppointment(SchedulerCreateEventArgs args)
    {
        SchedulerAppointment item = args.Item as SchedulerAppointment;

        await MyService.Create(item);
        await GetSchedulerData();
    }

    async Task DeleteAppointment(SchedulerDeleteEventArgs args)
    {
        SchedulerAppointment item = (SchedulerAppointment)args.Item;

        await MyService.Delete(item);
        await GetSchedulerData();
    }






    public class SchedulerAppointment
    {
        public Guid Id { get; set; }
        public string Title { get; set; }
        public string Description { get; set; }
        public DateTime Start { get; set; }
        public DateTime End { get; set; }
        public bool IsAllDay { get; set; }
        public string RecurrenceRule { get; set; }
        public List<DateTime> RecurrenceExceptions { get; set; }
        public Guid? RecurrenceId { get; set; }

        public SchedulerAppointment()
        {
            Id = Guid.NewGuid();
        }
    }

    async Task GetSchedulerData()
    {
        Appointments = await MyService.Read();
    }

    protected override async Task OnInitializedAsync()
    {
        await GetSchedulerData();
    }

    // the following static class mimics an actual data service that handles the actual data source
    // replace it with your actual service through the DI, this only mimics how the API can look like and works for this standalone page
    public static class MyService
    {
        private static List<SchedulerAppointment> _data { get; set; } = new List<SchedulerAppointment>()
{
            new SchedulerAppointment
            {
                Title = "Board meeting",
                Description = "Q4 is coming to a close, review the details.",
                Start = new DateTime(2019, 12, 5, 10, 00, 0),
                End = new DateTime(2019, 12, 5, 11, 30, 0)
            },

            new SchedulerAppointment
            {
                Title = "Vet visit",
                Description = "The cat needs vaccinations and her teeth checked.",
                Start = new DateTime(2019, 12, 2, 11, 30, 0),
                End = new DateTime(2019, 12, 2, 12, 0, 0)
            },

            new SchedulerAppointment
            {
                Title = "Planning meeting",
                Description = "Kick off the new project.",
                Start = new DateTime(2019, 12, 6, 9, 30, 0),
                End = new DateTime(2019, 12, 6, 12, 45, 0)
            },

            new SchedulerAppointment
            {
                Title = "Trip to Hawaii",
                Description = "An unforgettable holiday!",
                IsAllDay = true,
                Start = new DateTime(2019, 11, 27),
                End = new DateTime(2019, 12, 05)
            },

            new SchedulerAppointment
            {
                Title = "Morning run",
                Description = "Some time to clear the head and exercise.",
                Start = new DateTime(2019, 11, 27, 9, 0, 0),
                End = new DateTime(2019, 11, 27, 9, 30, 0),
                RecurrenceRule = "FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR"
            }
        };

        public static async Task Create(SchedulerAppointment itemToInsert)
        {
            itemToInsert.Id = Guid.NewGuid();
            _data.Insert(0, itemToInsert);
        }

        public static async Task<List<SchedulerAppointment>> Read()
        {
            return await Task.FromResult(_data);
        }

        public static async Task Update(SchedulerAppointment itemToUpdate)
        {
            var index = _data.FindIndex(i => i.Id == itemToUpdate.Id);
            if (index != -1)
            {
                _data[index] = itemToUpdate;
            }
        }

        public static async Task Delete(SchedulerAppointment itemToDelete)
        {
            if (itemToDelete.RecurrenceId != null)
            {
                // a recurrence exception was deleted, you may want to update
                // the rest of the data source - find an item where theItem.Id == itemToDelete.RecurrenceId
                // and remove the current exception date from the list of its RecurrenceExceptions
            }

            if (!string.IsNullOrEmpty(itemToDelete.RecurrenceRule) && itemToDelete.RecurrenceExceptions?.Count > 0)
            {
                // a recurring appointment was deleted that had exceptions, you may want to
                // delete or update any exceptions from the data source - look for
                // items where theItem.RecurrenceId == itemToDelete.Id
            }

            _data.Remove(itemToDelete);
        }
    }
}

 

---

Unplanned
Last Updated: 20 Jan 2021 09:34 by ADMIN
Created by: Durga
Comments: 3
Category: Scheduler
Type: Feature Request
31

I have a requirement to design our own custom add/edit template form for scheduler control.

I looked at  custom edit form example and found very helpful, However this example does not demonstrate how to use RecurrenceEditor and use them in custom template.