Подтвердить что ты не робот

Есть ли способ предотвратить совпадение событий в jQuery FullCalendar?

Есть ли способ предотвратить перекрывающиеся события в jQuery FullCalendar?

4b9b3361

Ответ 1

Я сделал функцию, которая проверяет, перекрывает ли данное событие другое или нет. Возвращает true, если событие перекрывает другие и false в противном случае.

function isOverlapping(event){
    var array = calendar.fullCalendar('clientEvents');
    for(i in array){
        if(array[i].id != event.id){
            if(!(Date(array[i].start) >= Date(event.end) || Date(array[i].end) <= Date(event.start))){
                return true;
            }
        }
    }
    return false;
}

Вы можете использовать его при удалении или изменении размера и событии, а если совпадение событий с другим, используйте revertFunc, который получен в обратных вызовах eventDrop и eventResize, или отмените создание события в выбранном обратном вызове. Чтобы использовать его в выбранном обратном вызове, создайте событие dummie:

var event = new Object();
event.start = start;
event.end = end;

Ответ 3

То же, что и ответ ecruz, но с логикой, которая лучше работала для меня.

function isOverlapping(event){
    // "calendar" on line below should ref the element on which fc has been called 
    var array = calendar.fullCalendar('clientEvents');
    for(i in array){
        if (event.end >= array[i].start && event.start <= array[i].end){
           return true;
        }
    }
    return false;
}

Ответ 4

То же, что и Мэтью Уэбб, но после работал у меня, так как иногда моя дата окончания была нулевой, когда я перетаскивал событие из allDay в некоторый временной интервал

function isOverlapping(event) {
    var arrCalEvents = $('#' + g_str_FullCalenderID).fullCalendar('clientEvents');
    for (i in arrCalEvents) {
        if (arrCalEvents[i].id != event.id) {
            if ((event.end >= arrCalEvents[i].start && event.start <= arrCalEvents[i].end) || (event.end == null && (event.start >= arrCalEvents[i].start && event.start <= arrCalEvents[i].end))) {//!(Date(arrCalEvents[i].start) >= Date(event.end) || Date(arrCalEvents[i].end) <= Date(event.start))
                return true;
            }
        }
    }
    return false;
}

Ответ 5

Просто добавьте

eventOverlap: false

как один из ваших параметров вне элемента событий.

Вы также можете добавить опцию

overlap

для одного события, которое переопределит eventOverlap в этом единственном событии.

events: [
                        {
                            title  : 'event1',
                            start  : '2017-05-27'
                        },
                        {
                            title  : 'event2',
                            start  : '2017-05-28',
                            end    : '2017-05-29'
                        },
                        {
                            title  : 'event3',
                            start  : '2017-05-30T12:30:00',
                            allDay : false, // will make the time show
                            draggable: true,
                            editable: true,
                            overlap: true,
                        },
                        {
                            title  : 'event3',
                            start  : '2017-05-30T09:30:00',
                            allDay : false, // will make the time show
                            draggable: true,
                            editable: true,
                        }
                    ],
                    eventOverlap: false

Ответ 6

    eventResize: function (event, dayDelta, minuteDelta, revertFunc, jsEvent, ui, view) {

        var start = new Date(event.start);
        var end = new Date(event.end);

        var events = event.source.events;
        for (var i = 0; i < events.length; i++) {
            var someEvent = events[i];

            if (someEvent._id == event._id)
            {
                continue;
            }

            var seStart = new Date(someEvent.start);
            var seEnd = new Date(someEvent.end);

            if ((start < seEnd) && (seStart < end)) {// dates overlap
                revertFunc();
            }
        }
    },

Ответ 7

Я использую версию 2.11 Fullcalendar, и я внесла некоторые изменения в код, отправленный ecruz:

function isOverlapping(event){
   var array = calendar.fullCalendar('clientEvents');
   for(i in array){
       if(array[i]._id != event._id){
           if(!(array[i].start.format() >= event.end.format() || array[i].end.format() <= event.start.format())){
               return true;
           }
       }
    }
        return false;
}

и это я использую для предотвращения перекрытия:

    $('#calendar').fullCalendar({
        ...
        eventDrop: function(event, delta, revertFunc) {
                        if (isOverlapping(event)) {
                            revertFunc();
                        }
        },
        ...
    });

Ответ 8

просто попробуйте это, отлично работает для меня.... https://fullcalendar.io/docs/event_ui/eventOverlap/

eventOverlap: function(stillEvent, movingEvent) {
    return stillEvent.allDay && movingEvent.allDay;
    }

Ответ 9

allowCalEventOverlap: [boolean | default: false] - может ли календарь перекрывать события. События будут перемещаться или изменяться по мере необходимости, если они перетаскиваются или изменяются по размеру до места, которое перекрывает другое событие календаря.

это то, что вы искали?

Ответ 10

Попробуйте следующее:

$('#calendar').fullCalendar({slotEventOverlap : false});

В соответствии с документацией.