简体   繁体   English

如何在选择/拖动时以全日历合并事件?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM