Hello,
In scheduler's day view, when I create an event that starts for example at 10:00 AM and ends at 10:00 AM the next day, the event is created, but I can't see this event in the scheduler. You can try this behavior also in this scheduler demo: http://demos.telerik.com/kendo-ui/scheduler/restriction
I know that I can set allDaySlot field to true and see the event at the top row of the scheduler, but I want to see the event inside the scheduler, between the other events.
I have read that it's possible to achieve this by creating a custom view, but I haven't found any source code with a custom view that would solve my problem. Could anybody send me a code that would help me with this?
Thanks for replies,
Boris
7 Answers, 1 is accepted
Currently we have no such example which we can provide where the day, week and work week views shows events longer than 24 hours as regular event. That why I would suggest to instead start using the "Timeline" views where this behavior is build-in. Please check the example below:
Regards,
Vladimir Iliev
Telerik
Dear Vladimir.
In my use case the timeline view is not accepted as solution. My users want the (multi-)day view with long running events being shown as normal events spanning more than 24 hours.
I had a look at the scheduler day view source and opened a suggestion in your portal. Unfortunately I got a call today, my customer told me he really needs to see those events as normal events. Especially the start and the end. To be able to schedule events seamlessly.
In other words: I can't wait till this feature might make it into the product.
So what is the easiest way to achieve this?
Kind regards
Bernd
To achieve the desired behavior you should extend the desired view and override the methods that are responsible for rendering the events. Currently we have no such example which we can provide - that why I could only suggest to check the following demo which shows how to extend the Scheduler views:
Also you can check our professional services for more options.
Regards,
Vladimir Iliev
Telerik by Progress
Hello Vladimir.
Thank you for the link to your professional service portal. But it seems your professional service team needs no money. After two weeks trying to get a quote on this modification I ended up doing it myself. This is my custom view:
001.(function (f, define) {002. define('kendo.dispatcher.dayview', ['kendo.scheduler.dayview'], f);003.}(function () {004. var __meta__ = {005. id: 'dispatcher.dayview',006. name: 'Dispatcher Day View',007. category: 'web',008. description: 'The Dispatcher Day View',009. depends: ['scheduler.dayview'],010. hidden: true011. };012. (function ($, undefined) {013. var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, getDate = kendo.date.getDate, extend = $.extend;014. function addContinuousEvent(group, range, element, isAllDay) {015. var events = group._continuousEvents;016. var lastEvent = events[events.length - 1];017. var startDate = getDate(range.start.startDate()).getTime();018. if (isAllDay && lastEvent && getDate(lastEvent.start.startDate()).getTime() == startDate) {019. var idx = events.length - 1;020. for (; idx > -1; idx--) {021. if (events[idx].isAllDay || getDate(events[idx].start.startDate()).getTime() < startDate) {022. break;023. }024. }025. events.splice(idx + 1, 0, {026. element: element,027. isAllDay: true,028. uid: element.attr(kendo.attr('uid')),029. start: range.start,030. end: range.end031. });032. } else {033. events.push({034. element: element,035. isAllDay: isAllDay,036. uid: element.attr(kendo.attr('uid')),037. start: range.start,038. end: range.end039. });040. }041. }042. var DispatcherMultiDayView = ui.MultiDayView.extend({043. _renderEvents: function (events, groupIndex) {044. var allDayEventContainer = this.datesHeader.find('.k-scheduler-header-wrap > div');045. var byDate = this._isGroupedByDate();046. var event;047. var idx;048. var length;049. for (idx = 0, length = events.length; idx < length; idx++) {050. event = events[idx];051. if (this._isInDateSlot(event)) {052. var isMultiDayEvent = event.isAllDay;// || event.end.getTime() - event.start.getTime() >= MS_PER_DAY;053. var container = isMultiDayEvent && !this._isVerticallyGrouped() ? allDayEventContainer : this.content;054. var element, ranges, range, start, end, group;055. if (!isMultiDayEvent) {056. if (this._isInTimeSlot(event)) {057. group = this.groups[groupIndex];058. if (!group._continuousEvents) {059. group._continuousEvents = [];060. }061. ranges = group.slotRanges(event, false);062. var rangeCount = ranges.length;063. for (var rangeIndex = 0; rangeIndex < rangeCount; rangeIndex++) {064. range = ranges[rangeIndex];065. start = event.start;066. end = event.end;067. if (rangeCount > 1) {068. if (rangeIndex === 0) {069. end = range.end.endDate();070. } else if (rangeIndex == rangeCount - 1) {071. start = range.start.startDate();072. } else {073. start = range.start.startDate();074. end = range.end.endDate();075. }076. }077. var occurrence = event.clone({078. start: start,079. end: end,080. _startTime: event._startTime,081. _endTime: event.endTime082. });083. if (this._isInTimeSlot(occurrence)) {084. var head = range.head;085. element = this._createEventElement(event, !isMultiDayEvent, head, range.tail);086. element.appendTo(container);087. this._positionEvent(occurrence, element, range);088. addContinuousEvent(group, range, element, false);089. }090. }091. }092. } else if (this.options.allDaySlot) {093. group = this.groups[groupIndex];094. if (!group._continuousEvents) {095. group._continuousEvents = [];096. }097. ranges = group.slotRanges(event);098. if (ranges.length) {099. range = ranges[0];100. var startIndex = range.start.index;101. var endIndex = range.end.index;102. if (byDate && startIndex !== endIndex) {103. start = range.start.start;104. end = range.end.end;105. var newStart = new Date(start);106. var newEnd = new Date(start);107. for (var i = range.start.index; i <= range.end.index; i++) {108. element = this._createEventElement(event, !isMultiDayEvent, i !== endIndex, i !== startIndex);109. var dateRange = group.daySlotRanges(newStart, newEnd, true)[0];110. newEnd.setDate(newEnd.getDate() + 1);111. newStart.setDate(newStart.getDate() + 1);112. this._positionAllDayEvent(element, dateRange);113. addContinuousEvent(group, dateRange, element, true);114. element.appendTo(container);115. }116. } else {117. element = this._createEventElement(event, !isMultiDayEvent);118. this._positionAllDayEvent(element, ranges[0]);119. addContinuousEvent(group, ranges[0], element, true);120. element.appendTo(container);121. }122. }123. }124. }125. }126. },127. });128. extend(true, ui, {129. DispatcherMultiDayView: DispatcherMultiDayView,130. DispatcherDayView: DispatcherMultiDayView.extend({131. options: {132. name: 'DayView',133. title: 'Day'134. },135. name: 'dispatcherDay'136. }),137. DispatcherWeekView: DispatcherMultiDayView.extend({138. options: {139. name: 'WeekView',140. title: 'Week',141. selectedDateFormat: '{0:D} - {1:D}',142. selectedShortDateFormat: '{0:d} - {1:d}'143. },144. name: 'dispatcherWeek',145. calculateDateRange: function () {146. var selectedDate = this.options.date, start = kendo.date.dayOfWeek(selectedDate, this.calendarInfo().firstDay, -1), idx, length, dates = [];147. for (idx = 0, length = 7; idx < length; idx++) {148. dates.push(start);149. start = kendo.date.nextDay(start);150. }151. this._render(dates);152. }153. }),154. DispatcherWorkWeekView: DispatcherMultiDayView.extend({155. options: {156. name: 'WorkWeekView',157. title: 'Work Week',158. selectedDateFormat: '{0:D} - {1:D}',159. selectedShortDateFormat: '{0:d} - {1:d}'160. },161. name: 'dispatcherWorkWeek',162. nextDate: function () {163. var weekStart = kendo.date.dayOfWeek(kendo.date.nextDay(this.startDate()), this.calendarInfo().firstDay, 1);164. return kendo.date.addDays(weekStart, this._workDays[0]);165. },166. previousDate: function () {167. var weekStart = kendo.date.dayOfWeek(this.startDate(), this.calendarInfo().firstDay, -1);168. var workDays = this._workDays;169. return kendo.date.addDays(weekStart, workDays[workDays.length - 1] - 7);170. },171. calculateDateRange: function () {172. var selectedDate = this.options.date, dayOfWeek = kendo.date.dayOfWeek, weekStart = dayOfWeek(selectedDate, this.calendarInfo().firstDay, -1), start = dayOfWeek(weekStart, this.options.workWeekStart, 1), end = dayOfWeek(start, this.options.workWeekEnd, 1), dates = [];173. while (start <= end) {174. dates.push(start);175. start = kendo.date.nextDay(start);176. }177. this._render(dates);178. }179. })180. });181. }(window.kendo.jQuery));182. return window.kendo;183.}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {184. (a3 || a2)();185.}));Anything I could have done smarter/better here?
Kind regards
Bernd
We are glad you have found a way to achieve the desired behavior by extending the view. We cannot guarantee this solution will work in all possible scenarios since it hasn't undergone our internal testing procedures.
With regard to the issues with getting in touch with Professional Services, I received information that the team has already gotten into contact with you and the reasons behind the delay in establishing communication are currently under investigation.
Regards,
Ivan Danchev
Telerik by Progress
Well. It doesn't work in all scenarios.
I have a drop down to change the tick count. this change event function works with the standard views. With my inherited one it reloads the data, but it doesn't change layout.
function minorTickChange(e) { scheduler.setOptions({ minorTickCount: Number(this.value()) }) scheduler.view(scheduler.view().name);}Any ideas what's wrong with my custom view?
Thanks in advance
Bernd
I am afraid providing advice on custom implementations that modify the default behavior of the components falls outside the scope of the support service (Soruce Code Explanation section). Consulting and assistance on the customization of the default behavior are provided by the Professional Services team. Let us know in case you have questions on the built-in Scheduler functionality and its API.
Regards,
Ivan Danchev
Telerik by Progress
