When the Scheduler is in an initially hidden container, the appearance is broken.
Solution: call the .repaint() method of the control as soon as the parent becomes visible
For our product we are using Telerik RadScheduler to display user calendar information, which we make extensive use of the Telerik.Web.UI.RecurrenceRule implementation. Additionally we are now integrating with Google Calendar to display and edit external events within our application. There have been several recurrence rules returned from Google that follow the iCalendar standard but RecurrenceRule has failed to parse correctly. Below are some examples of rules that have issues: 1. EXDATE value is ignored: DTSTART:20160405T120000Z DTEND:20160405T130000Z RRULE:FREQ=DAILY;INTERVAL=4;BYDAY=MO,TU,WE,TH,FR,SA,SU EXDATE;VALUE=DATE-TIME:20160413T120000Z 2. INTERVAL is ignored (interval of 1 is assigned when parsed by Telerik) DTSTART:20160404T120000Z DTEND:20160404T130000Z RRULE:FREQ=DAILY;COUNT=10;INTERVAL=4 3. Parse fails completely: DTSTART:20160404Z DTEND:20160405Z RRULE:FREQ=WEEKLY;UNTIL=20160509Z;BYDAY=MO;INTERVAL=1
WORKAROUND approved by ADMIN: Set the LocalizationPath in the code behind, e.g. in Page_Load event
Event log stack trace:
Anwendung: devenv.exe
Frameworkversion: v4.0.30319
Beschreibung: Der Prozess wurde aufgrund einer unbehandelten Ausnahme beendet.
Ausnahmeinformationen: System.NullReferenceException
bei Telerik.Web.LocalizationProvider+XmlResourceLocator.LoadResources(System.Globalization.CultureInfo)
bei Telerik.Web.LocalizationProvider+XmlResourceLocator..ctor(System.String, Telerik.Web.ILocalizableControl, System.String)
bei Telerik.Web.LocalizationProvider..ctor(System.String, Telerik.Web.ILocalizableControl, System.String)
bei Telerik.Web.UI.RadScheduler.get_Localization()
bei Telerik.Web.Design.RadSchedulerLocalization.Initialize()
bei Telerik.Web.Design.WizardTabControl.WizardForm_Load(System.Object, System.EventArgs)
bei System.Windows.Forms.Form.OnLoad(System.EventArgs)
bei System.Windows.Forms.Form.OnCreateControl()
bei System.Windows.Forms.Control.CreateControl(Boolean)
bei System.Windows.Forms.Control.CreateControl()
bei System.Windows.Forms.Control.WmShowWindow(System.Windows.Forms.Message ByRef)
bei System.Windows.Forms.Control.WndProc(System.Windows.Forms.Message ByRef)
bei System.Windows.Forms.ScrollableControl.WndProc(System.Windows.Forms.Message ByRef)
bei System.Windows.Forms.Form.WmShowWindow(System.Windows.Forms.Message ByRef)
bei System.Windows.Forms.Form.WndProc(System.Windows.Forms.Message ByRef)
bei System.Windows.Forms.Control+ControlNativeWindow.OnMessage(System.Windows.Forms.Message ByRef)
bei System.Windows.Forms.Control+ControlNativeWindow.WndProc(System.Windows.Forms.Message ByRef)
bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr, Int32, IntPtr, IntPtr)
When trying to drag and drop an appointment over the All Day slot, the ghost element is not positioned properly. This is easily observed when the browser is zoomed.
Replicated on the Overview demo
Hover over the command arrows on the radScheduler when the view is set to month view. The Tooltip will display "next day" and "previous day" instead of "next month" and "previous month".
The same happens for week view.
Temporary workaround:
<telerik:RadCodeBlock runat="server">
<script>
function pageLoadHandler() {
var scheduler = $find("<%= RadScheduler1.ClientID %>");
var $scheduler = $telerik.$(scheduler.get_element());
var viewType = "Day";
if (scheduler.get_selectedView() == Telerik.Web.UI.SchedulerViewType.WeekView) {
viewType = "Week";
} else if (scheduler.get_selectedView() == Telerik.Web.UI.SchedulerViewType.MonthView) {
viewType = "Month";
}
$scheduler.find(".rsPrevDay").attr("title", "Previous " + viewType)
$scheduler.find(".rsNextDay").attr("title", "Next " + viewType)
// Sys.Application.remove_load(pageLoadHandler);
}
Sys.Application.add_load(pageLoadHandler);
</script>
</telerik:RadCodeBlock>
<
telerik:RadScheduler
RenderMode
=
"Lightweight"
Font-Size
=
"14px"
runat
=
"server"
ID
=
"RadScheduler1"
SelectedDate
=
"2012-04-16"
OnClientAppointmentClick
=
"OnClientAppointmentClick"
OnClientAppointmentResizeEnd
=
"OnClientAppointmentResizeEnd"
>
</
telerik:RadScheduler
>
<script>
function
OnClientAppointmentResizeEnd(sender, args) {
}
function
OnClientAppointmentClick(sender, args) {
alert(
"OnClientAppointmentClick"
)
}
</script>
private
const
string
ProviderSessionKey =
"Telerik.Web.Examples.Scheduler.XmlSchedulerProvider.DefaultCS"
;
// You can safely ignore this method.
// Its purpose is to limit the changes to the underlying data only to the active user session.
protected
void
Page_Init(
object
sender, EventArgs e)
{
Telerik.Web.UI.XmlSchedulerProvider provider;
if
((Session[ProviderSessionKey] ==
null
) || (!IsPostBack))
{
provider =
new
Telerik.Web.UI.XmlSchedulerProvider(Server.MapPath(
"~/App_Data/Appointments.xml"
),
true
);
Session[ProviderSessionKey] = provider;
}
else
{
provider = (Telerik.Web.UI.XmlSchedulerProvider)Session[ProviderSessionKey];
}
RadScheduler1.Provider = provider;
}
https://www.screencast.com/t/OQyCn2jM
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.
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); }); }); }
The Button text initially shows "Never", even though the appointment has a different recurrence. https://www.screencast.com/t/55Rl1CSa7F7y