2010-09-15 5 views
2

J'ai besoin de détecter d'autres événements dans la même journée. Ce que j'espère pouvoir faire, c'est trouver si un événement de eventClass X existe le même jour qu'un événement droppé de eventClass Y. Sinon, il avertirait l'utilisateur, qu'une eventclass X n'existe pas, sinon autoriser l'utilisateur abandonner l'événement.fullCalendar trouver des événements supplémentaires dans la même journée?

Est-ce possible?

Répondre

4

bien après le sondage autour de la documentation et un peu expérimentant, je suis arrivé à une solution utilisant la méthode clientEvents:

eventDrop: function(event, dayDelta, minuteDelta, allDay, 
         revertFunc, jsEvent, ui, view) 
     { 
      // see if its a concept class event 
      if (event.className == 'conceptclass'){ 
       // create a new date object from the start of the event 
       var eventDate = new Date(event.start); 
       // zero its time 
       eventDate.setHours(0); 
       eventDate.setMinutes(0); 
       eventDate.setSeconds(0); 
       eventDate.setMilliseconds(0); 

       // now find all the events currently displayed in the calendar 
       var pulledEvents = $('#calendar').fullCalendar('clientEvents'); 
       var meetingDay = false; // until a meeting is found 

       for(var i = 0; i < pulledEvents.length; i++){ 
        // if the pulled event is of the meeting class 
        if(pulledEvents[i].className == 'meetingclass'){ 
         // create a new date object from the start of the pulled event 
         var testEventDate = new Date(pulledEvents[i].start); 
         // zero its time for comparison 
         testEventDate.setHours(0); 
         testEventDate.setMinutes(0); 
         testEventDate.setSeconds(0); 
         testEventDate.setMilliseconds(0); 

         // if meeting event found in the day 
         // OK a little wierdness here, even though the dates were equal 
         // they would not return a valid comparison. So I get the time value. 
         if(testEventDate.getTime() == eventDate.getTime()){ 
          meetingDay = true; 
          break; 
         } 
        } 
      } 
      if(!meetingDay){ 
       alert("Tried to drop a Concept into Day without Scheduled Review Meeting!"); 
       revertFunc(); // back to where it came! 
      }  
     } 
1

Une autre option est de résoudre ce côté serveur puisque vous devriez vérifier qu'il est valide là aussi . Lorsque l'événement "concept" est déplacé sur le jour, envoyez la requête Ajax au serveur pour mettre à jour la date de l'événement "concept", si elle n'est pas valide, appelez revertFunc() pour remettre l'événement à zéro.

eventDrop: function(event, dayDelta, minuteDelta, allDay, 
        revertFunc, jsEvent, ui, view) { 
    $.post("/concep_update/", { id: event.id, delta: dayDelta }, 
     function(data) { 
      if(data!="true") { 
      revertFunc(); 
      } 
     }, "text"}); 
} 

Sur le serveur, vérifiez qu'il ya un événement « réunion » le même jour, et le cas échéant, mettre à jour l'événement « concept » et le retour « true », sinon, le retour « false ».

@require_POST @login_required 
def concept_update(request): 
    concept = get_object_or_404(Concept.objects.all(), 
           id=int(request.POST.get("id","0"))) 
    concept.date = concept.date + timedelta(days=int(request.POST.get("delta","0"))) 
    meetings = Meeting.objects.filter(date=concept.date) 
    if meetings.count() > 0: 
     concept.save() 
     return HttpResponse("true", status=200, content_type="text/plain") 
    else: 
     return HttpResponse("false", status=200, content_type="text/plain") 
+0

Belle de un Vous m'a aidé à comprendre comment appeler la 'revertFunc' après un appel ajax. J'ai stocké 'revertFunc' dans une variable et quand j'en ai eu besoin plus tard, j'ai juste fait' variablename() 'Merci pour l'inspiration :) – ppumkin

0
var e1start = new Date(startDate); 
    var e1end = endDate == null ? e1start : new Date(endDate); 

     for (var d = e1start; d <= e1end; d.setDate(d.getDate() + 1)) { 
      var eventsInDay = getEventsInDay(d); 
      // ... 
     } 


    function getEventsInDay(date){ 
     return $('#fr-calendar').fullCalendar('clientEvents', function(event){ 
      if(date >= event.start && date <= event.end){ 
       return true; 
      } 
     }); 
    }