<TelerikScheduler AllowCreate="@Editing" AllowDelete="@Editing" AllowUpdate="@Editing" OnDelete="@AppointmentDelete" OnEdit="@AppointmentEdit" OnUpdate="AppointmentUpdate" Data=…
The above line breaks only with AllowUpdate.
I default Editing false, then toggle it true in the hosting component and do a InvokeAsync(StateHasChanged).
The result is I can create and delete, but while the appointment hover cursor changes to the hand or arrows and I can see the handlebars to resize the appointment, I'm not able to update the appointment until I switch the SchedulerView. After switching SchedulerView updating works as expected.
Thanks Marin,
Yes, the popup editor does work also, I forgot to mention that. Thanks for the workaround, I'll implement that.
Best,
Rob
Hello Rob,
Double clicking to get the popup editor works for me. Does it work for you?
That said, here's a workaround that also seems to work for me (yes, I do toggle the view programmatically):
<TelerikButton OnClick="@ToggleEditability">Toggle scheduler editability</TelerikButton>
<TelerikScheduler Data="@Appointments"
OnUpdate="@UpdateAppointment"
OnCreate="@AddAppointment"
OnDelete="@DeleteAppointment"
AllowCreate="@IsSchedulerEditable"
AllowDelete="@IsSchedulerEditable"
AllowUpdate="@IsSchedulerEditable"
@bind-Date="@StartDate" Height="600px" @bind-View="@CurrView">
<SchedulerViews>
<SchedulerDayView StartTime="@DayStart" />
<SchedulerWeekView StartTime="@DayStart" />
<SchedulerMultiDayView StartTime="@DayStart" NumberOfDays="10" />
</SchedulerViews>
</TelerikScheduler>
@code {
bool IsSchedulerEditable { get; set; } = false;
public SchedulerView CurrView { get; set; } = SchedulerView.Week;//used for the workaround
async Task ToggleEditability()
{
IsSchedulerEditable = !IsSchedulerEditable;
//workaround
SchedulerView theViewToReturn = CurrView;
CurrView = theViewToReturn != SchedulerView.Day ? SchedulerView.Day : SchedulerView.Month;
await InvokeAsync(StateHasChanged);
await Task.Delay(20);
CurrView = theViewToReturn;
//end workaround
await InvokeAsync(StateHasChanged);
}
// Sample CUD operations over the local data
// In a real case, carry the information over to the actual data source
void UpdateAppointment(SchedulerUpdateEventArgs args)
{
SchedulerAppointment item = (SchedulerAppointment)args.Item;
var matchingItem = Appointments.FirstOrDefault(a => a.Id == item.Id);
if (matchingItem != null)
{
matchingItem.Title = item.Title;
matchingItem.Description = item.Description;
matchingItem.Start = item.Start;
matchingItem.End = item.End;
matchingItem.IsAllDay = item.IsAllDay;
matchingItem.RecurrenceExceptions = item.RecurrenceExceptions;
matchingItem.RecurrenceRule = item.RecurrenceRule;
}
// save to the actual data source here
}
void AddAppointment(SchedulerCreateEventArgs args)
{
SchedulerAppointment item = args.Item as SchedulerAppointment;
Appointments.Add(item);
// save to the actual data source here
}
void DeleteAppointment(SchedulerDeleteEventArgs args)
{
SchedulerAppointment item = (SchedulerAppointment)args.Item;
Appointments.Remove(item);
if (item.RecurrenceId != null)
{
// a recurrence exception was deleted, you may want to update
// the actual data source - an item where theItem.Id == item.RecurrenceId
// and remove the current exception date from the list of its RecurrenceExceptions
}
if (!string.IsNullOrEmpty(item.RecurrenceRule) && item.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 == item.Id
}
// save to the actual data source here
}
// sample data and scheduler settings
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 = 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 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();
}
}
}
Regards,
Marin Bratanov
Progress Telerik