/**
* Kendo UI v2016.1.112 (http://www.telerik.com/kendo-ui)
* Copyright 2016 Telerik AD. All rights reserved.
*
* Kendo UI commercial licenses may be obtained at
* http://www.telerik.com/purchase/license-agreement/kendo-ui-complete
* If you do not own a commercial license, this file shall be governed by the trial license terms.
*/
(function (f, define) {
define('kendo.scheduler.agendaview', ['kendo.scheduler.view'], f);
}(function () {
var __meta__ = {
id: 'scheduler.agendaview',
name: 'Scheduler Agenda View',
category: 'web',
description: 'The Scheduler Agenda View',
depends: ['scheduler.view'],
hidden: true
};
(function ($) {
var kendo = window.kendo, ui = kendo.ui, NS = '.kendoAgendaView';
var EVENT_WRAPPER_FORMAT = '
' + '# if (resources[0]) {#' + '
' + '# } #' + '# if (data.isException()) { #' + '
' + '# } else if (data.isRecurring()) {#' + '
' + '# } #' + '{0}' + '#if (showDelete) {#' + '
' + '#}#' + '
';
ui.AgendaView = ui.SchedulerView.extend({
init: function (element, options) {
ui.SchedulerView.fn.init.call(this, element, options);
options = this.options;
if (options.editable) {
options.editable = $.extend({ 'delete': true }, options.editable, {
create: false,
update: false
});
}
this.title = options.title;
this._eventTemplate = this._eventTmpl(options.eventTemplate, EVENT_WRAPPER_FORMAT);
this._dateTemplate = kendo.template(options.eventDateTemplate);
this._groupTemplate = kendo.template(options.eventGroupTemplate);
this._timeTemplate = kendo.template(options.eventTimeTemplate);
this.element.on('mouseenter' + NS, '.k-scheduler-agenda .k-scheduler-content tr', '_mouseenter').on('mouseleave' + NS, '.k-scheduler-agenda .k-scheduler-content tr', '_mouseleave').on('click' + NS, '.k-scheduler-agenda .k-scheduler-content .k-link:has(.k-si-close)', '_remove');
this._renderLayout(options.date);
},
name: 'agenda',
_mouseenter: function (e) {
$(e.currentTarget).addClass('k-state-hover');
},
_mouseleave: function (e) {
$(e.currentTarget).removeClass('k-state-hover');
},
_remove: function (e) {
e.preventDefault();
this.trigger('remove', { uid: $(e.currentTarget).closest('.k-task').attr(kendo.attr('uid')) });
},
nextDate: function () {
return kendo.date.nextDay(this.startDate());
},
startDate: function () {
return this._startDate;
},
endDate: function () {
return this._endDate;
},
previousDate: function () {
return kendo.date.previousDay(this.startDate());
},
_renderLayout: function (date) {
this._startDate = date;
this._endDate = kendo.date.addDays(date, 7);
this.createLayout(this._layout());
this.table.addClass('k-scheduler-agenda');
},
_layout: function () {
var columns = [
{
text: this.options.messages.time,
className: 'k-scheduler-timecolumn'
},
{ text: this.options.messages.event }
];
if (!this._isMobilePhoneView()) {
columns.splice(0, 0, {
text: this.options.messages.date,
className: 'k-scheduler-datecolumn'
});
}
var resources = this.groupedResources;
if (resources.length) {
var groupHeaders = [];
for (var idx = 0; idx < resources.length; idx++) {
groupHeaders.push({
text: '',
className: 'k-scheduler-groupcolumn'
});
}
columns = groupHeaders.concat(columns);
}
return { columns: columns };
},
_tasks: function (events) {
var tasks = [];
for (var idx = 0; idx < events.length; idx++) {
var event = events[idx];
var start = event.start;
var end = event.end;
var eventDurationInDays = (kendo.date.getDate(end) - kendo.date.getDate(start)) / kendo.date.MS_PER_DAY + 1;
var task = event.clone();
task.startDate = kendo.date.getDate(start);
if (task.startDate >= this.startDate()) {
tasks.push(task);
}
if (eventDurationInDays > 1) {
task.end = kendo.date.nextDay(start);
task.head = true;
for (var day = 1; day < eventDurationInDays; day++) {
start = task.end;
task = event.clone();
task.start = start;
task.startDate = kendo.date.getDate(start);
task.end = kendo.date.nextDay(start);
if (day == eventDurationInDays - 1) {
task.end = new Date(task.start.getFullYear(), task.start.getMonth(), task.start.getDate(), end.getHours(), end.getMinutes(), end.getSeconds(), end.getMilliseconds());
task.tail = true;
} else {
task.isAllDay = true;
task.middle = true;
}
if (kendo.date.getDate(task.end) <= this.endDate() && task.start >= this.startDate() || kendo.date.getDate(task.start).getTime() == this.endDate().getTime()) {
tasks.push(task);
}
}
}
}
return new kendo.data.Query(tasks).sort([
{
field: 'start',
dir: 'asc'
},
{
field: 'end',
dir: 'asc'
}
]).groupBy({ field: 'startDate' }).toArray();
},
_renderTaskGroups: function (tasksGroups, groups) {
var tableRows = [];
var editable = this.options.editable;
var showDelete = editable && editable.destroy !== false && !this._isMobile();
var isPhoneView = this._isMobilePhoneView();
for (var taskGroupIndex = 0; taskGroupIndex < tasksGroups.length; taskGroupIndex++) {
var date = tasksGroups[taskGroupIndex].value;
var tasks = tasksGroups[taskGroupIndex].items;
var today = kendo.date.isToday(date);
for (var taskIndex = 0; taskIndex < tasks.length; taskIndex++) {
var task = tasks[taskIndex];
var tableRow = [];
var headerCells = !isPhoneView ? tableRow : [];
if (taskGroupIndex === 0 && taskIndex === 0 && groups.length) {
for (var idx = 0; idx < groups.length; idx++) {
headerCells.push(kendo.format('{1} | ', groups[idx].rowSpan, this._groupTemplate({ value: groups[idx].text }), groups[idx].className));
}
}
if (taskIndex === 0) {
if (isPhoneView) {
headerCells.push(kendo.format('{0} | ', this._dateTemplate({ date: date })));
tableRows.push('' : '>') + headerCells.join('') + '
');
} else {
tableRow.push(kendo.format('{1} | ', tasks.length, this._dateTemplate({ date: date }), taskGroupIndex == tasksGroups.length - 1 && !groups.length ? ' k-last' : '', !groups.length ? ' k-first' : ''));
}
}
if (task.head) {
task.format = '{0:t}';
} else if (task.tail) {
task.format = '{1:t}';
} else {
task.format = '{0:t}-{1:t}';
}
task.resources = this.eventResources(task);
tableRow.push(kendo.format('{0}{1}{2} | {3} | ', task.tail || task.middle ? '' : '', this._timeTemplate(task.clone({
start: task._startTime || task.start,
end: task.endTime || task.end
})), task.head || task.middle ? '' : '', this._eventTemplate(task.clone({ showDelete: showDelete }))));
tableRows.push('' : '>') + tableRow.join('') + '
');
}
}
return tableRows.join('');
},
render: function (events) {
var table = this.content.find('table').empty();
var groups = [];
if (events.length > 0) {
var resources = this.groupedResources;
if (resources.length) {
groups = this._createGroupConfiguration(events, resources, null);
this._renderGroups(groups, table, []);
} else {
groups = this._tasks(events);
table.append(this._renderTaskGroups(groups, []));
}
}
var items = this._eventsList = flattenTaskGroups(groups);
this._angularItems(table, items);
this.refreshLayout();
this.trigger('activate');
},
_angularItems: function (table, items) {
this.angular('compile', function () {
var data = [], elements = items.map(function (item) {
data.push({ dataItem: item });
return table.find('.k-task[' + kendo.attr('uid') + '=' + item.uid + ']');
});
return {
elements: elements,
data: data
};
});
},
_renderGroups: function (groups, table, parentGroups) {
for (var idx = 0, length = groups.length; idx < length; idx++) {
var parents = parentGroups.splice(0);
parents.push(groups[idx]);
if (groups[idx].groups) {
this._renderGroups(groups[idx].groups, table, parents);
} else {
table.append(this._renderTaskGroups(groups[idx].items, parents));
}
}
},
_createGroupConfiguration: function (events, resources, parent) {
var resource = resources[0];
var configuration = [];
var data = resource.dataSource.view();
var isPhoneView = this._isMobilePhoneView();
for (var dataIndex = 0; dataIndex < data.length; dataIndex++) {
var value = resourceValue(resource, data[dataIndex]);
var tmp = new kendo.data.Query(events).filter({
field: resource.field,
operator: ui.SchedulerView.groupEqFilter(value)
}).toArray();
if (tmp.length) {
var tasks = this._tasks(tmp);
var className = parent ? '' : ' k-first';
if (dataIndex === data.length - 1 && (!parent || parent.className.indexOf('k-last') > -1)) {
className += ' k-last';
}
var obj = {
text: kendo.getter(resource.dataTextField)(data[dataIndex]),
value: value,
rowSpan: 0,
className: className
};
if (resources.length > 1) {
obj.groups = this._createGroupConfiguration(tmp, resources.slice(1), obj);
if (parent) {
parent.rowSpan += obj.rowSpan;
}
} else {
obj.items = tasks;
var span = rowSpan(obj.items);
if (isPhoneView) {
span += obj.items.length;
}
obj.rowSpan = span;
if (parent) {
parent.rowSpan += span;
}
}
configuration.push(obj);
}
}
return configuration;
},
selectionByElement: function (cell) {
var index, event;
cell = $(cell);
if (cell.hasClass('k-scheduler-datecolumn') || !this._eventsList.length) {
return;
}
if (cell.is('.k-task')) {
cell = cell.closest('td');
}
if (this._isMobile()) {
var parent = cell.parent();
index = parent.parent().children().filter(function () {
return $(this).children(':not(.k-scheduler-datecolumn)').length;
}).index(parent);
} else {
index = cell.parent().index();
}
event = this._eventsList[index];
return {
index: index,
start: event.start,
end: event.end,
isAllDay: event.isAllDay,
uid: event.uid
};
},
select: function (selection) {
this.clearSelection();
var row = this.table.find('.k-task').eq(selection.index).closest('tr').addClass('k-state-selected').attr('aria-selected', true)[0];
this.current(row);
},
move: function (selection, key) {
var handled = false;
var index = selection.index;
if (key == kendo.keys.UP) {
index--;
handled = true;
} else if (key == kendo.keys.DOWN) {
index++;
handled = true;
}
if (handled) {
var event = this._eventsList[index];
if (event) {
selection.start = event.start;
selection.end = event.end;
selection.isAllDay = event.isAllDay;
selection.events = [event.uid];
selection.index = index;
}
}
return handled;
},
moveToEvent: function () {
return false;
},
constrainSelection: function (selection) {
var event = this._eventsList[0];
if (event) {
selection.start = event.start;
selection.end = event.end;
selection.isAllDay = event.isAllDay;
selection.events = [event.uid];
selection.index = 0;
}
},
isInRange: function () {
return true;
},
destroy: function () {
if (this.element) {
this.element.off(NS);
}
ui.SchedulerView.fn.destroy.call(this);
},
options: {
title: 'Agenda',
name: 'agenda',
editable: true,
selectedDateFormat: '{0:D}-{1:D}',
selectedShortDateFormat: '{0:d} - {1:d}',
eventTemplate: '#:title#',
eventTimeTemplate: '#if(data.isAllDay) {#' + '#=this.options.messages.allDay#' + '#} else { #' + '#=kendo.format(format, start, end)#' + '# } #',
eventDateTemplate: '' + '#=kendo.toString(date, "dd")#' + '' + '' + '#=kendo.toString(date,"dddd")#' + '' + '' + '#=kendo.toString(date, "y")#' + '',
eventGroupTemplate: '' + '#=value#' + '',
messages: {
event: 'Event',
date: 'Date',
time: 'Time',
allDay: 'all day'
}
}
});
function rowSpan(tasks) {
var result = 0;
for (var idx = 0, length = tasks.length; idx < length; idx++) {
result += tasks[idx].items.length;
}
return result;
}
function resourceValue(resource, item) {
if (resource.valuePrimitive) {
item = kendo.getter(resource.dataValueField)(item);
}
return item;
}
function flattenTaskGroups(groups) {
var idx = 0, length = groups.length, item, result = [];
for (; idx < length; idx++) {
item = groups[idx];
if (item.groups) {
item = flattenGroup(item.groups);
result = result.concat(item);
} else {
result = result.concat(flattenGroup(item.items));
}
}
return result;
}
function flattenGroup(groups) {
var items = [].concat(groups), item = items.shift(), result = [], push = [].push;
while (item) {
if (item.groups) {
push.apply(items, item.groups);
} else if (item.items) {
push.apply(items, item.items);
} else {
push.call(result, item);
}
item = items.shift();
}
return result;
}
}(window.kendo.jQuery));
return window.kendo;
}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {
(a3 || a2)();
}));