[英]How merge events in fullcalendar on select/drag?
I have fullcalendar with agendaweek view. 我对日历周的观点充满信心。 I have events in table coming from server.
我表中的事件来自服务器。 I want to do the next thing: user can select few events in the table with
select
event and when he do it, I want to add green border over selected area. 我想做下一件事:用户可以在表中
select
事件数很少的事件,当他这样做时,我想在选定区域上方添加绿色边框。 http://prntscr.com/lhkp9y http://prntscr.com/lhkp9y
I found one way - it is to merge selected events into one, but it is not so easy if starting point is over existing event. 我发现了一种方法-将选定的事件合并为一个,但是如果起点在现有事件之上则不是那么容易。 On the screen starting point - is empty timeslot.
在屏幕的起点-空时隙。
What I have now: If events are editable:false
in the table, and I start to select and starting point is over existing event, nothing happens. 我现在拥有的:如果事件是
editable:false
表中的editable:false
,并且我开始选择并且起点在现有事件之上,那么什么也不会发生。 If starting point is - empty timeslot, it works 如果起点是-空时隙,则可以正常工作
If events are editable:true
in the table, and I start to select and starting point - is existing event, this event stick to cursor and start to move which is not good. 如果事件是
editable:true
在表中为editable:true
,并且我开始选择并且起点-是现有事件,则此事件会停留在光标上并开始移动,这不好。 I want existing event stay on the same place. 我希望现有活动保留在同一位置。
Here is my calendar code 这是我的日历代码
$('#calendar').fullCalendar({
defaultView: 'agendaWeek',
firstDay: 1,
navLinks: false,
header: false,
selectable: true,
eventOverlap: true,
selectOverlap: function (event) {
// check is allowed to select next timeslot ot not
return !event.closed;
},
selectHelper: true,
allDaySlot: true,
minTime: self.minTime,
maxTime: self.maxTime,
slotLabelInterval: '00:30:00',
viewSubSlotLabel: true,
slotLabelFormat: 'h:mm a',
editable: true,
events: events,
select: function (start, end, jsEvent, view) {
// merge selected events into one
self.mergeEvents();
},
eventDragStart: function (event, jsEvent, ui, view) {
// I WANT TO CANCEL DRAG, BUT IT DOESNT WORK
return false;
}
});
Try it, hope it's fine for you. 尝试一下,希望对您有好处。
select: function (start, end, jsEvent, view)
{
var diffmin = (new Date(end).getTime()/1000 - new Date(start).getTime()/1000)/60;
var title = diffmin+' min';
var eventData;
// some users click 1 slot, then the following, so we have 2 events each 30 min instead of 60 min
// merge both events into one
var eventmerge = false;
$.each(allevents, function( index, eventitem )
{
if(eventitem!==null && typeof eventitem != 'undefined')
{
// if start time of new event (2nd slot) is end time of existing event (1st slot)
if( moment(start).format('YYYY-MM-DD HH:mm') == moment(eventitem.end).format('YYYY-MM-DD HH:mm') )
{
eventmerge = true;
// existing event gets end data of new merging event
eventitem.end = end;
}
// if end time of new event (1st slot) is start time of existing event (2nd slot)
else if( moment(end).format('YYYY-MM-DD HH:mm') == moment(eventitem.start).format('YYYY-MM-DD HH:mm') )
{
eventmerge = true;
// existing event gets start data of new merging event
eventitem.start = start;
}
if(eventmerge)
{
// recalculate
var diffmin = (new Date(eventitem.end).getTime()/1000 - new Date(eventitem.start).getTime()/1000)/60;
eventitem.title = diffmin+' min';
// copy to eventData
eventData = eventitem;
// find event object in calendar
var eventsarr = $('#calendar').fullCalendar('clientEvents');
$.each(eventsarr, function(key, eventobj) {
if(eventobj._id == eventitem.id) {
console.log('merging events');
eventobj.start = eventitem.start;
eventobj.end = eventitem.end;
eventobj.title = eventitem.title;
$('#calendar').fullCalendar('updateEvent', eventobj);
}
});
// break each loop
return false;
}
}
});
if(!eventmerge)
{
// console.log('adding event id: '+eventcount);
eventData = {
id: eventcount, // identifier
title: title,
start: start,
end: end,
color: '#00AA00',
editable: true,
eventDurationEditable: true,
};
// register event in array
allevents[eventcount] = eventData;
eventcount++;
$('#calendar').fullCalendar('renderEvent', eventData, true);
}
// console.log(start, end);
setTimePrice(eventData);
$('#calendar').fullCalendar('unselect');
},
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.