The RecurrenceRule does not have the correct Exceptions when modifying the series. The behavior in Outlook is to clear all exceptions when modifying the series. The behavior in Google Calendar is to consider the exception and modify the recurrence rule accordingly. Create a recurrence appointment (starts on 20th Feb at 8:00 am, recurring daily), whose recurrence rule will be stored in the database as (Picture 1): DTSTART:20180220T080000Z DTEND:20180220T083000Z RRULE:FREQ=DAILY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR,SA,SU Further, I create an exception on 23rd Feb, which changes the start time to 8:15 am. This now, in Addition to inserting a new record for the exception, updates the master's recurrence rule to (Picture 2): DTSTART:20180220T080000Z DTEND:20180220T083000Z RRULE:FREQ=DAILY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR,SA,SU EXDATE:20180223T080000Z So far, so good. Now I edit the master and change its start date to 19th Feb. I expect, that the master keeps the exception for 23rd, but the result is another one. The exception record is kept unchanged as expected! BUT the EXDATE in the master is wrong (Picture 3): DTSTART:20180219T080000Z DTEND:20180219T083000Z RRULE:FREQ=DAILY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR,SA,SU EXDATE:20180222T080000Z
https://www.screencast.com/t/KlQtYDOxl Workaround: var $ = $ || $telerik.$; var $T = Telerik.Web.UI; var $TS = $T.Scheduler, $TSR = $TS.Rendering, $DateTime = $TS.DateTime; var $SB = Telerik.Web.StringBuilder, timePerMinute = 60000, timePerHour = timePerMinute * 60, timePerDay = timePerHour * 24, daysInWeek = 7, roundedCornersHeight, anchorDateFormat = "yyyy-MM-dd"; $TSVM = Telerik.Web.UI.Scheduler.Views.Month; $TSVM.Model.prototype._createTimeSlot = function (rawIndex, startTime, element) { if (startTime.getHours() == 23) { startTime = $DateTime.add(startTime, 2 * timePerHour); } return new $TSVM.TimeSlot(rawIndex, startTime, element); } $TSVM.Model.prototype.getTimeSlotFromDomElement = function (domElement) { var rawIndex = this._getRawIndexFromDomElement(domElement), startTime = this._getTimeFromDomElement(domElement); if (startTime.getHours() == 23) { startTime = $DateTime.add(startTime, 2 * timePerHour); } return new $TSVM.TimeSlot(rawIndex, startTime, domElement); } Telerik.Web.UI.Scheduler.Rendering.MonthViewRenderer.prototype._updateColumnHeaders = function () { var renderer = this, dayHeaderDateFormat = this._model.get_dayHeaderDateFormat(), firstDayHeaderDateFormat = this._model.get_firstDayHeaderDateFormat(), currentMonth = renderer._owner.get_selectedDate().getMonth(), visibleRangeStart = renderer._model.get_visibleRangeStart(); $.each(this._contentTables, function () { var dateLabels = $("td div.rsDateWrap div.rsDateBox a", this), dayStart = visibleRangeStart, weekDayIndex = 0, weekStart = new Date(dayStart.getTime()); dateLabels.each(function () { var isFirstVisibleDateOfMonth = $DateTime.subtract(dayStart, visibleRangeStart) == 0 && dayStart.getMonth() == currentMonth; var dateHeaderText; if (renderer._owner._renderMode == $T.RenderMode.Mobile) { dateHeaderText = dayStart.getDate().toString(); } else if (dayStart.getDate() == 1 || isFirstVisibleDateOfMonth) { dateHeaderText = dayStart.localeFormat(firstDayHeaderDateFormat); } else { dateHeaderText = renderer._getFormattedDateText(dayStart, dayHeaderDateFormat); } this.href = "#" + dayStart.format(anchorDateFormat); this.innerHTML = dateHeaderText; this.title = dayStart.localeFormat(Sys.CultureInfo.CurrentCulture.dateTimeFormat.ShortDatePattern); var otherMonthCell = currentMonth != dayStart.getMonth(), dateWrapElement = this.parentNode.parentNode.parentNode; $(dateWrapElement).toggleClass('rsOtherMonth', otherMonthCell); if (weekDayIndex == renderer._weekLength - 1) { // Move to the next week, skipping invisible days. weekStart = $DateTime.add(weekStart, 7 * timePerDay); dayStart = new Date(weekStart.getTime()); weekDayIndex = 0; } else { dayStart = $DateTime.add(dayStart, timePerDay); weekDayIndex++; } if (dayStart.getHours() == 23) { dayStart = $DateTime.add(dayStart, 2 * timePerHour); } else if (dayStart.getHours() == 1) { dayStart = $DateTime.add(dayStart, -timePerHour); } if (weekStart.getHours() == 23) { weekStart = $DateTime.add(weekStart, 2 * timePerHour); } else if (weekStart.getHours() == 1) { weekStart = $DateTime.add(dayStart, -timePerHour); } // Wrappers are cleared here to avoid second // traversal of the cells. renderer._clearExtraWraps(dateWrapElement); }); }); }
I will be working on a project that need to show appointments for 20+ resources. I looked at your demos/documentation for the scheduler and don't see any support for horizontal scrolling. I would be great to have the scheduler scroll the resources horizontally while maintaining the same width for each resource column. Thanks for your time.
Something prevents the timeslotcreated event from firing when the advanced form is shown and therefore all the customizations that are done within timeslotcreated event are not in effect until advanced form is closed. For example you can see different background color/image on January 1st on the attached "Capture1.png" picture, but as soon as I open the advanced form, for create/edit, those css settings are gone (see attached "Capture2.png" picture) until I close the form. You would think that this is a pretty big bug that needs to be resolved. Thanks.
There is a display issue when using the agenda view - if there are fewer than 4 events displayed then clicking on the date range in the header shows a calendar which is clipped at the bottom. Presumably this is due to it being constrained by the height of the events area. This occurs even though there is plenty of height available to the control. Please see the attached screenshot which is taken from your demo site: http://demos.telerik.com/aspnet-ajax/scheduler/examples/overview/defaultcs.aspx
When working with All-day appointments, it would be really nice to be able to resize them in the week view. In some cases when only working with All-day appointments, we were able to hide the time part of the Scheduler control entirely, but in this case the week view is almost pointless since our end users want to resize appointments a lot!
The Button text initially shows "Never", even though the appointment has a different recurrence. https://www.screencast.com/t/55Rl1CSa7F7y
When the timezone of the client is before UTC (e.g. UTC -1 or UTC -3) if you use the calendar for navigation, you will be navigated to the day before the selected one.
In a RadScheduler with a custom provider (inheriting from SchedulerProviderBase), there is no way to get "expanded" appointments (i.e. masters plus occurrences minus exceptions). I devised a solution (as suggested in http://www.telerik.com/forums/scheduler-exporting-a-range-of-appointments), using the Occurrences property of RecurrenceRule: public IEnumerable<Appointment> GetExpandedAppointments(RadScheduler owner, DateTime start, DateTime end) { var result = new List<Appointment>(); foreach (Appointment a in this.GetAppointments(owner)) { // see http://www.telerik.com/forums/scheduler-exporting-a-range-of-appointments if (a.RecurrenceState == RecurrenceState.Master) { RecurrenceRule parsedRule; RecurrenceRule.TryParse(a.RecurrenceRule, out parsedRule); parsedRule.SetEffectiveRange(start, end); int nc = 0; foreach (DateTime occurrence in parsedRule.Occurrences) { Appointment app = a.Clone(); app.ID = a.ID + "_" + ++nc; app.Start = occurrence; app.End = occurrence.Add(a.Duration); app.RecurrenceRule = null; app.RecurrenceParentID = a.ID; app.RecurrenceState = RecurrenceState.Occurrence; result.Add(app); } } else if (a.RecurrenceState != RecurrenceState.Occurrence) { result.Add(a); } } return result; } } I think this functionality can be part of SchedulerProviderBase, there is no custom logic. Thanks Regards Mauro
Dear Sir, I used telerik:RadScheduler with Exchange Scheduler Provider. I am successfully connected to Exchange server and also I able to display data on scheduler form exchange But problem is how can i refresh scheduler data real time? My requirement is if meeting cancel or new Meeting at the same time scheduler update the information on display. Below code ios for your reference. ExchangeSchedulerProvider provider1 = new ExchangeSchedulerProvider(@"https://owa.xyz.com/EWS/Exchange.asmx", "user name", "Password", "Domain", "tejas_k_lodha@milacron.com"); Thanks,