Existe-t-il un moyen d'éviter le chevauchement des événements dans jQuery FullCalendar?
J'ai créé une fonction qui vérifie si l'événement donné se chevauche ou non. Renvoie true si l'événement chevauche l'autre et false sinon.
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;
}
Vous pouvez l'utiliser lors de la suppression ou du redimensionnement et d'un événement. Si l'événement se chevauche, utilisez le revertFunc reçu dans les rappels eventDrop et eventResize ou annulez la création d'un événement dans le rappel sélectionné. Pour pouvoir l'utiliser dans le rappel sélectionné, créez un événement factice:
var event = new Object();
event.start = start;
event.end = end;
A partir de la version 2.20, cette modification a été intégrée par défaut ...
utilisation
eventOverlap: false
Identique à la réponse de ecruz mais avec une logique qui a mieux fonctionné pour moi.
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;
}
Il suffit d'ajouter
eventOverlap: false
comme une de vos options en dehors de l'élément events.
Vous pouvez également ajouter l'option
overlap
à un seul événement, qui remplacera eventOverlap sur cet événement unique.
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
Identique à Matthew Webb mais la suite a fonctionné pour moi car parfois ma date de fin était nulle lorsque je traînais l'événement de tous les jours vers une certaine plage horaire
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;
}
J'utilise la version 2.11 de Fullcalendar et j'ai apporté quelques modifications au code envoyé par 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;
}
et voici comment j'utilise pour éviter le chevauchement:
$('#calendar').fullCalendar({
...
eventDrop: function(event, delta, revertFunc) {
if (isOverlapping(event)) {
revertFunc();
}
},
...
});
essayez ceci, ça fonctionne très bien pour moi .... https://fullcalendar.io/docs/event_ui/eventOverlap/
eventOverlap: function(stillEvent, movingEvent) {
return stillEvent.allDay && movingEvent.allDay;
}
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();
}
}
},